Support
0.1.4
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Improved notifications.
Added init apache checks.
Added init mysql and oracle checks.
Add new admin checks and quote xml input.
Fixed xml and formatting bug.
Init release.
A admin support tool.
Ein Admin Support Tool.
2.1.x
2.2.x
2007-06-13 14:14:26
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogU3VwcG9ydC54bWwsdiAxLjEuMS4xIDIwMDcvMDUvMDcgMTg6NDc6NTUgc3IgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pblN1cHBvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5TeXN0ZW1TdGF0dXMgb2JqZWN0ICBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFkbWluU3lzdGVtU3RhdHVzLU9iamVrdHMgaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1TdGF0dXM8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxUaXRsZT5TdXBwb3J0IEluZm88L1RpdGxlPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbi1TdXBwb3J0IE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlN1cHBvcnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrNDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU3VwcG9ydC5wbSAtIHNob3cgc3VwcG9ydCBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblN1cHBvcnQucG0sdiAxLjIgMjAwNy8wNS8wOCAwNzo1MDoxOSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pblN1cHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoISRTZWxmLT57JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIik7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdXBwb3J0T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJENvbmZpZ0hhc2ggPSB7fTsKCiAgICAjIGNyZWF0ZSBjb25maWcgaGFzaCByZWZlcmVuY2UKICAgICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPlN1cHBvcnRDb25maWdIYXNoR2V0KAogICAgICAgIENvbmZpZ0hhc2ggPT4gJENvbmZpZ0hhc2gsCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IHJlcXVpcmVkIGluZm9ybWF0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnR2V0UmVxdWlyZWRJbmZvJykgewogICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkJywKICAgICAgICApOwogICAgICAgICMgZmlyc3QgbGV2ZWwgSGFzaHJlZiAoZWFjaCBtb2R1bGUgbmFtZSkKICAgICAgICBmb3JlYWNoIG15ICRDb25maWdNb2R1bGUgKHNvcnQga2V5cyAleyRDb25maWdIYXNofSkgewogICAgICAgICAgICBpZiAoISRDb25maWdIYXNoLT57JENvbmZpZ01vZHVsZX0tPlswXSkgewogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWRJbmZvJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbmZpZ01vZHVsZSA9PiAkQ29uZmlnTW9kdWxlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzZWNvbmQgbGV2ZWwgYXJyYXkgcmVmZXJlbmNlIChlYWNoIG1vZHVsZSkKICAgICAgICAgICAgZm9yZWFjaCBteSAkQ29uZmlnSGFzaFJvdyAoQHskQ29uZmlnSGFzaC0+eyRDb25maWdNb2R1bGV9fSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXF1aXJlZEluZm9Sb3cnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICMgY3JlYXRlIGEgbmV3IHRleHRmaWVsZAogICAgICAgICAgICAgICAgaWYgKCRDb25maWdIYXNoUm93LT57SW5wdXR9LT57VHlwZX0gZXEgIlRleHQiKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWRJbmZvUm93VGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICRDb25maWdNb2R1bGUgLiAnOjonIC4gJENvbmZpZ0hhc2hSb3ctPntLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnSGFzaFJvdy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJENvbmZpZ0hhc2hSb3ctPntWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplID0+ICRDb25maWdIYXNoUm93LT57SW5wdXR9LT57U2l6ZX0gfHwgJzQwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRDb25maWdIYXNoUm93LT57RGVzY3JpcHRpb259IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBkcm9wZG93biBmaWVsZAogICAgICAgICAgICAgICAgZWxzaWYgKCRDb25maWdIYXNoUm93LT57SW5wdXR9LT57VHlwZX0gZXEgIlNlbGVjdCIpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2VsZWN0U3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJENvbmZpZ0hhc2hSb3ctPntJbnB1dH0tPntEYXRhfSB8fCB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnTW9kdWxlIC4gJzo6JyAuICRDb25maWdIYXNoUm93LT57S2V5fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkSW5mb1Jvd1NlbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnSGFzaFJvdy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJENvbmZpZ0hhc2hSb3ctPntEZXNjcmlwdGlvbn0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RTdHJnID0+ICRTZWxlY3RTdHJnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENvbmZpZGVudGlhbCBhbmQgU3VwcG9ydElECiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ29uZmlkZW50aWFsJykgewogICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbmZpZGVudGlhbCcsCiAgICAgICAgKTsKICAgICAgICAjIGNyZWF0ZSBoaWRkZW4gZmllbGRzLCBjYXVzZSB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiBhZ2Fpbi4KICAgICAgICBmb3JlYWNoIG15ICRDb25maWdNb2R1bGUgKGtleXMgJXskQ29uZmlnSGFzaH0pIHsKICAgICAgICAgICAgZm9yZWFjaCBteSAkQ29uZmlnSGFzaFJvdyAoQHskQ29uZmlnSGFzaC0+eyRDb25maWdNb2R1bGV9fSkgewogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRDb25maWdNb2R1bGUgLiAnOjonIC4gJENvbmZpZ0hhc2hSb3ctPntLZXl9KTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbmZpZGVudGlhbEhpZGRlbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJENvbmZpZ01vZHVsZSAuICc6OicgLiAkQ29uZmlnSGFzaFJvdy0+e0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFVwbG9hZFN1cHBvcnRJbmZvCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBsb2FkU3VwcG9ydEluZm8nKSB7CiAgICAgICAgbXkgJERhdGFIYXNoID0ge307CiAgICAgICAgbXkgJElucHV0SGFzaCA9IHt9OwoKICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWwnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGhpZGRlbiBmaWVsZHMsIGNhdXNlIHdlIG5lZWQgdGhlIGluZm9ybWF0aW9uIGFnYWluLgogICAgICAgIGZvcmVhY2ggbXkgJENvbmZpZ01vZHVsZSAoa2V5cyAleyRDb25maWdIYXNofSkgewogICAgICAgICAgICBteSAkTW9kdWxlSW5wdXREYXRhID0ge307CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJENvbmZpZ0hhc2hSb3cgKEB7JENvbmZpZ0hhc2gtPnskQ29uZmlnTW9kdWxlfX0pIHsKICAgICAgICAgICAgICAgICRNb2R1bGVJbnB1dERhdGEtPnskQ29uZmlnSGFzaFJvdy0+e0tleX19ID0KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJENvbmZpZ01vZHVsZSAuICc6OicgLiAkQ29uZmlnSGFzaFJvdy0+e0tleX0pIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRJbnB1dEhhc2gtPnskQ29uZmlnTW9kdWxlfSA9ICRNb2R1bGVJbnB1dERhdGE7CiAgICAgICAgfQogICAgICAgICMgY3JlYXRlIGRhdGEgaGFzaCByZWZlcmVuY2UKICAgICAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5TdXBwb3J0SW5mb0dldCgKICAgICAgICAgICAgRGF0YUhhc2ggPT4gJERhdGFIYXNoLAogICAgICAgICAgICBJbnB1dEhhc2ggPT4gJElucHV0SGFzaCwKICAgICAgICApOwoKICAgICAgICBteSAkWE1MU3RyaW5nID0gJFNlbGYtPntTdXBwb3J0T2JqZWN0fS0+WE1MU3RyaW5nQ3JlYXRlKAogICAgICAgICAgICBEYXRhSGFzaCA9PiAkRGF0YUhhc2gsCiAgICAgICAgKTsKICAgICAgICAjIGlmIHRoZSBidXR0b24gc2VuZCBiZWNvbWVzIHRoZSBzdWJtaXQKICAgICAgICBpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTZW5kIikpIHsKICAgICAgICAgICAgbXkgJFNlbmRNZXNzYWdlOwogICAgICAgICAgICBpZiAobGVuZ3RoKCRYTUxTdHJpbmcpIDwgOTk2MTQ3MikgewogICAgICAgICAgICAgICAgIyBzZW5kIGluZm8gdG8gKChvdHJzKSkKICAgICAgICAgICAgICAgICRTZW5kTWVzc2FnZSA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPlN1cHBvcnRTZW5kSW5mbygKICAgICAgICAgICAgICAgICAgICBYTUxTdHJpbmcgPT4gJFhNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTdXBwb3J0SUQgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXBwb3J0SUQiKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRTZW5kTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICdDYW5cJ3Qgc2VuZCBlbWFpbCB0byB0aGUgKChvdHJzKSkgc3VwcG9ydCB0ZWFtIScuIlxuXG4iLgogICAgICAgICAgICAgICAgICAgICAgICAiWW91IHdpbGwgZm91bmQgdGhlIG90cnMgc3lzdGVtIGluZm9ybWF0aW9uIHBhY2thZ2UgYXRcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICJJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgT1RSUyBzdXBwb3J0IHNlcnZpY2VzIHBsZWFzZSBzZW5kIHRoZSBwYWNrYWdlIHRvIHN1cHBvcnRcQG90cnMuY29tIG9yIGNhbGxcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICJvdXIgc3VwcG9ydCB0ZWFtIHBlciBwaG9uZSB0byByZXZpZXcgdGhlIG5leHQgc3RlcFxuXG4iLgogICAgICAgICAgICAgICAgICAgICAgICAiIE1vcmUgYWJvdXQgT1RSUyBzdXBwb3J0IG9yIGZhY2UtdG8tZmFjZSBjb250YWN0IGluZm9ybWF0aW9uIHlvdSB3aWxsIGZvdW5kIGF0XG4iLgogICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3dy5vdHJzLmNvbS8nLiJcblxuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBpZiB0aGUgYnV0dG9uIGRvd25sb2FkIGJlY29tZXMgdGhlIHN1Ym1pdAogICAgICAgIGVsc2lmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkRvd25sb2FkIikpIHsKICAgICAgICAgICAgbXkgKCRzLCRtLCRoLCAkRCwkTSwkWSwgJHdkLCR5ZCwkZHN0KSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRNID0gc3ByaW50ZigiJTAyZCIsICRNKTsKICAgICAgICAgICAgJEQgPSBzcHJpbnRmKCIlMDJkIiwgJEQpOwogICAgICAgICAgICAkaCA9IHNwcmludGYoIiUwMmQiLCAkaCk7CiAgICAgICAgICAgICRtID0gc3ByaW50ZigiJTAyZCIsICRtKTsKICAgICAgICAgICAgIyByZXR1cm4gZmlsZQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRYTUxTdHJpbmcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAiU3VwcG9ydEluZm8iLiJfIi4iJFktJE0tJEQiLiJfJGgtJG0ucG0iLAogICAgICAgICAgICAgICAgVHlwZSA9PiAnYXR0YWNoZWQnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzZSB7CiAgICAgICAgbXkgJERhdGFIYXNoID0ge307CiAgICAgICAgIyBjcmVhdGUgZGF0YSBoYXNoIHJlZmVyZW5jZQogICAgICAgICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPkFkbWluQ2hlY2tzR2V0KAogICAgICAgICAgICBEYXRhSGFzaCA9PiAkRGF0YUhhc2gsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICk7CgogICAgICAgIGZvcmVhY2ggbXkgJE1vZHVsZSAoc29ydCBrZXlzICV7JERhdGFIYXNofSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdNb2R1bGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlID0+ICRNb2R1bGUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIGNoZWNrIGNzcyByb3RhdG9yeQogICAgICAgICAgICBteSAkQ3NzQ2xhc3M7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFJvd0hhc2ggKEB7JERhdGFIYXNoLT57JE1vZHVsZX19KSB7CiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgICAgIGlmICgkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkRm9udENvbG9yID0gInJlZCI7CiAgICAgICAgICAgICAgICBpZiAoJFJvd0hhc2gtPntDaGVja30gZXEgIk9LIikgewogICAgICAgICAgICAgICAgICAgICRGb250Q29sb3IgPSAiZ3JlZW4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRSb3dIYXNoLT57RGVzY3JpcHRpb259KSB7CiAgICAgICAgICAgICAgICAgICAgJFJvd0hhc2gtPntEZXNjcmlwdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJFJvd0hhc2gtPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+ICcxJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRSb3dIYXNoLT57Q29tbWVudH0pIHsKICAgICAgICAgICAgICAgICAgICAkUm93SGFzaC0+e0NvbW1lbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRSb3dIYXNoLT57Q29tbWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+ICcxJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGJsb2NrIHdpdGggcm90YXRvcnkgY3NzCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TW9kdWxlUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXskUm93SGFzaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgRm9udENvbG9yID0+ICRGb250Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTs=
IyAtLQojIEFkbWluU3VwcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3VwcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblN1cHBvcnQuZHRsLHYgMS4zIDIwMDcvMDYvMTIgMTM6MDE6NTkgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPiRFbnZ7IkJveDAifSRUZXh0eyJBZG1pbiBTdXBwb3J0IEluZm8ifSRFbnZ7IkJveDEifTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1HZXRSZXF1aXJlZEluZm8iPkNyZWF0ZSBTdXBwb3J0IFBhY2thZ2U8L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGUgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRRRGF0YXsiTW9kdWxlIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNoZWNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjUwIj4kVGV4dHsiRGVzY3JpcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNTAiPiRUZXh0eyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiREYXRheyJEZXNjcmlwdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kRGF0YXsiQ29tbWVudCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij48Zm9udCBjb2xvcj0iJFFEYXRheyJGb250Q29sb3IifSI+JFFEYXRheyJDaGVjayJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGUgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kRW52eyJCb3gwIn0kVGV4dHsiQWRtaW4gU3VwcG9ydCBJbmZvIn0kRW52eyJCb3gxIn08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ29uZmlkZW50aWFsIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwcHgiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mbyAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50aGVhZCI+JFFEYXRheyJDb25maWdNb2R1bGUifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjgwMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3cgLS0+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mb1Jvd1RleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1JSI+JFFEYXRheyJOYW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSIzNSUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7IktleSJ9IiB2YWx1ZT0iJFFEYXRheyJWYWx1ZSJ9IiBzaXplPSIkUURhdGF7IlNpemUifSI+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4gKCogJFFEYXRheyJEZXNjcmlwdGlvbiJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3dUZXh0IC0tPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3dTZWxlY3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1JSI+JFFEYXRheyJOYW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSIzNSUiPiREYXRheyJTZWxlY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiAoKiAkUURhdGF7IkRlc2NyaXB0aW9uIn08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mb1Jvd1NlbGVjdCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvUm93IC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm8gLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXh0Li4uIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWQgLS0+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JEVudnsiQm94MCJ9JFRleHR7IkFkbWluIFN1cHBvcnQgSW5mbyJ9JEVudnsiQm94MSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlVwbG9hZFN1cHBvcnRJbmZvIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwcHgiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDb25maWRlbnRpYWwgaW5mb3JtYXRpb24ifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KCjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbEhpZGRlbiAtLT4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiVmFsdWUifSI+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbEhpZGRlbiAtLT4KCiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDBweCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiQ29uZmlkZW50aWFsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSIgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJDb25maWRlbnRpYWwiIHJvd3M9IjQiIGNvbHM9Ijc4Ij4KQW55IGFuZCBhbGwgaW5mb3JtYXRpb24gZGlzY2xvc2VkIHRvIE9UUlMgd2lsbCBiZSBrZXB0IHN0cmljdGx5IGNvbmZpZGVudGlhbCBhbmQgYXJlIG9ubHkgdXNlZCBmb3IgcHJvdmlkaW5nIGJldHRlciBzdXBwb3J0IHNlcnZpY2VzIHRvIG91ciBjdXN0b21lcnMuCiAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ29tbWVyY2lhbCBzdXBwb3J0In08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiQ29tbWVyY2lhbCBzdXBwb3J0IElEIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJTdXBwb3J0SUQiIHZhbHVlPSIiIHNpemU9IjQwIj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiAoKiAkVGV4dHsiaWYgeW91IGFyZSBhbHJlYWR5IGEgY29tbWVyY2lhbCBzdXBwb3J0IGN1c3RvbWVyLCBwbGVhc2UgYWRkIHlvdXIgc3VwcG9ydCBpZC4gKG5vdCByZXF1aXJlZCEpIn0pPC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkRvd25sb2FkIiB2YWx1ZT0iJFRleHR7IkRvd25sb2FkIn0iPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlNlbmQiIHZhbHVlPSIkVGV4dHsiU2VuZCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbCAtLT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN1cHBvcnQucG0sdiAxLjUgMjAwNy8wNS8xMCAwNjoxODozMyBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7Cgp1c2Ugc3RyaWN0OwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0IC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN1cHBvcnQgaW5mb3JtYXRpb25zIHRvIGEgcnVubmluZyBPVFJTIHN5c3RlbS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFN1cHBvcnQgb2JqZWN0Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwpteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwpteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCik7CgokU3VwcG9ydE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAopOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KICAgICRTZWxmLT57WE1MT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAoKICAgICk7CiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntFbWFpbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW1haWwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgIERCT2JqZWN0ID0+ICRTZWxmLT57REJPYmplY3R9LAogICAgICAgIFRpbWVPYmplY3QgPT4gJFNlbGYtPntUaW1lT2JqZWN0fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnSGFzaEdldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiAgICAkU3VwcG9ydC0+U3VwcG9ydENvbmZpZ0hhc2hHZXQoCiAgICAgICAgQ29uZmlnSGFzaCA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0hhc2hHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENvbmZpZ0hhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGlmICRDb25maWdIYXNoIG5lIGEgSGFzaFJlZgogICAgaWYgKHJlZigkUGFyYW17Q29uZmlnSGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIkNvbmZpZ0hhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsL1N5c3RlbS9TdXBwb3J0Lyc7CiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoJERpck5hbWUuIi8qLnBtIik7CiAgICBmb3JlYWNoIG15ICRGaWxlIChATGlzdCkgewogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6JEZpbGUiOwogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgICAgICAgICAgICAgIGlmICgkQXJyYXlSZWYgJiYgcmVmKCRBcnJheVJlZikgZXEgJ0FSUkFZJykgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtDb25maWdIYXNofS0+eyRGaWxlfSA9ICRBcnJheVJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgogICAgJFN1cHBvcnQtPlN1cHBvcnRJbmZvR2V0KAogICAgICAgIERhdGFIYXNoID0+ICREYXRhSGFzaCwKICAgICAgICBJbnB1dEhhc2ggPT4gJElucHV0SGFzaCwKICAgICk7Cgo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KERhdGFIYXNoIElucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY2hlY2sgaWYgJERhdGFIYXNoIGFuZCAkSW5wdXRIYXNoIG5lIGEgSGFzaFJlZgogICAgaWYgKHJlZigkUGFyYW17RGF0YUhhc2h9KSBuZSAnSEFTSCcgfHwgcmVmKCRQYXJhbXtJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJEYXRhSGFzaCBhbmQgSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuJy9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvJzsKCiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoJERpck5hbWUuIi8qLnBtIik7CiAgICBmb3JlYWNoIG15ICRGaWxlIChATGlzdCkgewogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6JEZpbGUiOwogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QgJiYgJFBhcmFte0lucHV0SGFzaH0tPnskRmlsZX0pIHsKICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0SW5mb0dldCgKICAgICAgICAgICAgICAgICAgICBNb2R1bGVJbnB1dEhhc2ggPT4gJFBhcmFte0lucHV0SGFzaH0tPnskRmlsZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIyBjaGVjayBpZiByZXR1cm4gdmFsdWUgaXMgdmFsaWQgYSBhcnJheXJlZgogICAgICAgICAgICAgICAgaWYgKEB7JEFycmF5UmVmfSkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdHJ1Y3R1cmVPSyA9IDE7CiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgYXJyYXlyZWYgaW5jbHVkZXMgb25seSB2YWxpZCBoYXNocmVmcwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEVsZW1lbnQgKEB7JEFycmF5UmVmfSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKCRFbGVtZW50KSBuZSAnSEFTSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTdHJ1Y3R1cmVPSyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRTdHJ1Y3R1cmVPSyBlcSAiMSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGFIYXNofS0+eyRGaWxlfSA9ICRBcnJheVJlZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKZ2V0IGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBwb3NzaWJpbGl0eSBjaGVja3MuCgogICAgbXkgJExpc3QgPSAkU3VwcG9ydC0+QWRtaW5DaGVja3NHZXQoRGF0YUhhc2ggPT4gJERhdGFIYXNoKTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoRGF0YUhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGlmICREYXRhSGFzaCBuZSBhIEhhc2hSZWYKICAgIGlmIChyZWYoJFBhcmFte0RhdGFIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiRGF0YUhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsL1N5c3RlbS9TdXBwb3J0Lyc7CgogICAgIyByZWFkIGFsbCBhdmFpbGlibGUgbW9kdWxlcyBpbiBATGlzdAogICAgbXkgQExpc3QgPSBnbG9iKCREaXJOYW1lLiIvKi5wbSIpOwogICAgZm9yZWFjaCBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OiRGaWxlIjsKICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSl7CiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCV7JFNlbGZ9KTsKICAgICAgICAgICAgaWYgKCRTdXBwb3J0T2JqZWN0KSB7CiAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgcmV0dXJuIHZhbHVlIGlzIHZhbGlkIGEgYXJyYXlyZWYKICAgICAgICAgICAgICAgIGlmIChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3RydWN0dXJlT0sgPSAxOwogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGFycmF5cmVmIGluY2x1ZGVzIG9ubHkgdmFsaWQgaGFzaHJlZnMKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRFbGVtZW50IChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZigkRWxlbWVudCkgbmUgJ0hBU0gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RydWN0dXJlT0sgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkU3RydWN0dXJlT0sgZXEgIjEiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhSGFzaH0tPnskRmlsZX0gPSAkQXJyYXlSZWY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFhNTFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm5zIGEgc3RyaW5nIHdpdGggeG1sLgoKICAgIG15ICRMaXN0ID0gJFN1cHBvcnQtPlhNTFN0cmluZ0NyZWF0ZShEYXRhID0+ICREYXRhKTsKCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KPFN1cHBvcnRJbmZvPgogICAgPEhhcmR3YXJlPgogICAgICAgIDxNZW1vcnlTd2FwQ2hlY2s+CiAgICAgICAgICAgIDxDaGVjaz5PSzwvQ2hlY2s+CiAgICAgICAgICAgIDxDb21tZW50PlRoZSBIb3N0IFN5c3RlbSBoYXMgMTAxMSBNQiBNZW1vcnkgdG90YWwuIDEwOCBNQiBNZW1vcnkgZnJlZS4gNjQzIE1CIFN3YXAgdG90YWwuIDY0MyBNQiBTd2FwIGZyZWUuIDwvQ29tbWVudD4KICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgU3dhcEZyZWUgOiBTd2FwVG90YWwgJmx0OyA2MCAlIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgIDxOYW1lPk1lbW9yeSBTd2FwIENoZWNrPC9OYW1lPgogICAgICAgICAgICA8S2V5Pk1lbW9yeVN3YXBDaGVjazwvS2V5PgogICAgICAgIDwvTWVtb3J5U3dhcENoZWNrPgogICAgPC9IYXJkd2FyZT4KPC9TdXBwb3J0SW5mbz4KCj1jdXQKCnN1YiBYTUxTdHJpbmdDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KERhdGFIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17RGF0YUhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJEYXRhSGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRYTUxIYXNoID0gW107CiAgICBmb3JlYWNoIG15ICRNb2R1bGUgKGtleXMgJXskUGFyYW17RGF0YUhhc2h9fSkgewogICAgICAgIGZvcmVhY2ggbXkgJERhdGFIYXNoUm93IChAeyRQYXJhbXtEYXRhSGFzaH0tPnskTW9kdWxlfX0pIHsKICAgICAgICAgICAgbXkgJERhdGEgPSB7fTsKICAgICAgICAgICAgZm9yZWFjaCBteSAkRWxlbWVudCAoa2V5cyAleyREYXRhSGFzaFJvd30pIHsKICAgICAgICAgICAgICAgIGlmICgkRWxlbWVudCBlcSAnS2V5JykgewogICAgICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIHJlbW92ZSBuZXdsaW5lcwogICAgICAgICAgICAgICAgJERhdGFIYXNoUm93LT57JEVsZW1lbnR9ID1+IHMvXDAxNVwwMTJ8XDAxMnxcMDE1Ly9nOwogICAgICAgICAgICAgICAgJERhdGEtPnskRWxlbWVudH0tPlsxXS0+e0NvbnRlbnR9ID0gcXVvdGVtZXRhKCREYXRhSGFzaFJvdy0+eyRFbGVtZW50fSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFhNTEhhc2gtPlsxXS0+e1N1cHBvcnRJbmZvfS0+WzFdLT57JE1vZHVsZX0tPlsxXS0+eyREYXRhSGFzaFJvdy0+e0tleX19LT5bMV0gPSAkRGF0YTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFhNTFN0cmluZyA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaDJYTUwoQHskWE1MSGFzaH0pOwoKICAgIHJldHVybiAkWE1MU3RyaW5nOwp9CgpzdWIgU3VwcG9ydFNlbmRJbmZvIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRNZXNzYWdlID0gIiI7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoWE1MU3RyaW5nKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBzZW5kIG1haWwgdG8gZ2F0ZXdheQogICAgaWYgKCRTZWxmLT57RW1haWxPYmplY3R9LT5TZW5kKAogICAgICAgIEZyb20gPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluRW1haWwnKSwKICAgICAgICBUbyA9PiAnc3JAb3Rycy5jb20nLAogICAgICAgIFN1YmplY3QgPT4gJ0N1c3RvbWVyIFN5c3RlbUluZm8gZnJvbScsCiAgICAgICAgVHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgQ2hhcnNldCA9PiAndXRmLTgnLAogICAgICAgIEJvZHkgPT4gJ0N1c3RvbWVyIFN1cHBvcnRJbmZvJywKICAgICAgICBMb29wID0+IDEsICMgbm90IHJlcXVpcmVkLCByZW1vdmVzIHNtdHAgZnJvbQogICAgICAgIEF0dGFjaG1lbnQgPT4gW3sKICAgICAgICBGaWxlbmFtZSAgICA9PiAiU3VwcG9ydElELSRQYXJhbXtTdXBwb3J0SUR9LnhtbCIsCiAgICAgICAgQ29udGVudCAgICAgPT4gIiRQYXJhbXtYTUxTdHJpbmd9IiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3htbCIsCiAgICAgICAgICAgIH1dLAogICAgICAgICkpIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiRW1haWwgc2VudCB0byB0aGUgKChvdHJzKSkgc3VwcG9ydCB0ZWFtLlxuIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRNZXNzYWdlID0gJ0NhblwndCBzZW5kIGVtYWlsIHRvIHRoZSAoKG90cnMpKSBzdXBwb3J0IHRlYW0hJy4iXG5cbiIuCiAgICAgICAgICAgICJZb3Ugd2lsbCBmb3VuZCB0aGUgb3RycyBzeXN0ZW0gaW5mb3JtYXRpb24gcGFja2FnZSBhdFxuIi4KICAgICAgICAgICAgIklmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBPVFJTIHN1cHBvcnQgc2VydmljZXMgcGxlYXNlIHNlbmQgdGhlIHBhY2thZ2UgdG8gc3VwcG9ydFxAb3Rycy5jb20gb3IgY2FsbFxuIi4KICAgICAgICAgICAgIm91ciBzdXBwb3J0IHRlYW0gcGVyIHBob25lIHRvIHJldmlldyB0aGUgbmV4dCBzdGVwXG5cbiIuCiAgICAgICAgICAgICIgTW9yZSBhYm91dCBPVFJTIHN1cHBvcnQgb3IgZmFjZS10by1mYWNlIGNvbnRhY3QgaW5mb3JtYXRpb24geW91IHdpbGwgZm91bmQgYXRcbiIuCiAgICAgICAgICAgICdodHRwOi8vd3d3Lm90cnMuY29tLycuIlxuXG4iOwogICAgfQogICAgcmV0dXJuICRNZXNzYWdlOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNSAkICREYXRlOiAyMDA3LzA1LzEwIDA2OjE4OjMzICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9Dcm9uLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3Jvbi5wbSx2IDEuMS4xLjEgMjAwNy8wNS8wNyAxODo0Nzo1NSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkNyb247Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpDcm9uIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIENyb24gaW5mbyBvYmplY3QKCiAgdXNlIEtlcm5lbDo6Q29uZmlnOwogIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgKTsKCiAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6Q3Jvbi0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgIAogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKCiAgICBdOwogICAgIyByZXR1cm4gY29uZmlnIGFycmF5CiAgICByZXR1cm4gJENvbmZpZ0FycmF5Owp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggc3VwcG9ydCBpbmZvcm1hdGlvbi4KCiRDcm9uQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgICAgIAo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJENyb25BcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CiAgICAgIAogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGFiYXNlLnBtLHYgMS40IDIwMDcvMDYvMTEgMDk6MjU6MzkgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS40ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIERhdGFiYXNlIGluZm8gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CgogICAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2UtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU3VwcG9ydENvbmZpZ0FycmF5R2V0KCkKCnJldHVybiBhbiBhcnJheSByZWZlcmVuY2Ugd2l0aCByZXF1aXJlZCBjb25maWcgaW5mb3JtYXRpb24uCgogICAgJEFycmF5UmVmID0gJFN1cHBvcnQtPlN1cHBvcnRDb25maWdBcnJheUdldCgpOwoKICAgIG15ICRDb25maWdBcnJheSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnVGlja2V0RHVtcCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ0R1bXAgVGlja2V0cycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSBob3cgbWFueSBsYXRlc3QgVGlja2V0cyB3ZSBzaHV0IGR1bXA/JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFsbCA9PiAnQWxsJywKICAgICAgICAgICAgICAgICAgICAwID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAxMCA9PiAnTGFzdCAxMCcsCiAgICAgICAgICAgICAgICAgICAgMTAwID0+ICdMYXN0IDEwMCcsCiAgICAgICAgICAgICAgICAgICAgMTAwMCA9PiAnTGFzdCAxMDAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnQXBhY2hlSG9tZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FwYWNoZSBIb21lIERpcmVjdG9yeScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSB0aGUgcGF0aCB0byB0aGUgQXBhY2hlIGhvbWUgZGlyZWN0b3J5ICgvZXRjL2FwYWNoZTIpJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBTaXplID0+IDQwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIFN1cHBvcnRDb25maWdBcnJheUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCBkYXRhYmFzZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnVGlja2V0RHVtcCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ0R1bXAgVGlja2V0cycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSBob3cgbWFueSBsYXRlc3QgVGlja2V0cyB3ZSBzaHV0IGR1bXA/JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFsbCA9PiAnQWxsJywKICAgICAgICAgICAgICAgICAgICAwID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAxMCA9PiAnTGFzdCAxMCcsCiAgICAgICAgICAgICAgICAgICAgMTAwID0+ICdMYXN0IDEwMCcsCiAgICAgICAgICAgICAgICAgICAgMTAwMCA9PiAnTGFzdCAxMDAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdXNlZCBkYXRhYmFzZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIHRpY2tldCBkYXRhYmFzZSBpcyBjb25maWd1cmVkCiAgICBteSAkRGF0YWJhc2VUeXBlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RhdGFiYXNlRFNOJyk7CiAgICAkRGF0YWJhc2VUeXBlID1+IHMvXi4qPzooLio/KTouKiQvJDEvOwoKICAgICMgdHJ5IHRvIGdldCBhdmFpbGlibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvRGF0YWJhc2UiOwogICAgIyByZWFkIGFsbCBhdmFpbGlibGUgbW9kdWxlcyBpbiBATGlzdAogICAgbXkgQExpc3QgPSBnbG9iKCREaXJOYW1lLiIvKi5wbSIpOwogICAgZm9yZWFjaCBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgaWYgKCREYXRhYmFzZVR5cGUgPX4gL09EQkMvaSkgewogICAgICAgICAgICAkRGF0YWJhc2VUeXBlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RhdGFiYXNlOjpUeXBlJyk7CiAgICAgICAgfQogICAgICAgIGlmICgkRGF0YWJhc2VUeXBlIGVxICRGaWxlKSB7CiAgICAgICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6JEZpbGUiOwogICAgICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgICAgICBpZiAoJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkpewogICAgICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCV7JFNlbGZ9KTsKICAgICAgICAgICAgICAgIGlmICgkU3VwcG9ydE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFycmF5UmVmICYmIHJlZigkQXJyYXlSZWYpIGVxICdBUlJBWScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCAoQHskQ29uZmlnQXJyYXl9LCBAeyRBcnJheVJlZn0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICMgcmV0dXJuIGNvbmZpZyBhcnJheQogICAgcmV0dXJuICRDb25maWdBcnJheTsKfQoKPWl0ZW0gU3VwcG9ydEluZm9HZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgokRGF0YWJhc2VBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwoKPWN1dAoKc3ViIFN1cHBvcnRJbmZvR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhNb2R1bGVJbnB1dEhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAocmVmKCRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJNb2R1bGVJbnB1dEhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZGF0YWJhc2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKAojICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiMgICAgKTsKIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IHVzZWQgZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHRyeSB0byBmaW5kIG91dCB3aGljaCB0aWNrZXQgZGF0YWJhc2UgaXMgY29uZmlndXJlZAogICAgbXkgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEYXRhYmFzZURTTicpOwogICAgJERhdGFiYXNlVHlwZSA9fiBzL14uKj86KC4qPyk6LiokLyQxLzsKCiAgICAjIHRyeSB0byBnZXQgYXZhaWxpYmxlIG1vZHVsZXMgYW5kIHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiIvS2VybmVsL1N5c3RlbS9TdXBwb3J0L0RhdGFiYXNlIjsKICAgICMgcmVhZCBhbGwgYXZhaWxpYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYigkRGlyTmFtZS4iLyoucG0iKTsKICAgIGZvcmVhY2ggbXkgJEZpbGUgKEBMaXN0KSB7CiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIGlmICgkRGF0YWJhc2VUeXBlID1+IC9PREJDL2kpIHsKICAgICAgICAgICAgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEYXRhYmFzZTo6VHlwZScpOwogICAgICAgIH0KICAgICAgICBpZiAoJERhdGFiYXNlVHlwZSBlcSAkRmlsZSkgewogICAgICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6OiRGaWxlIjsKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygleyRTZWxmfSk7CiAgICAgICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+U3VwcG9ydEluZm9HZXQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFycmF5UmVmICYmIHJlZigkQXJyYXlSZWYpIGVxICdBUlJBWScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgQHskQXJyYXlSZWZ9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiREYXRhYmFzZUFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07Cgo9Y3V0CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZGF0YWJhc2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKCk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIGRhdGFiYXNlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyB0cnkgdG8gZmluZCBvdXQgd2hpY2ggdGlja2V0IGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWQKICAgIG15ICREYXRhYmFzZVR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGF0YWJhc2VEU04nKTsKICAgICREYXRhYmFzZVR5cGUgPX4gcy9eLio/OiguKj8pOi4qJC8kMS87CiAgICAjIHRyeSB0byBnZXQgYXZhaWxpYmxlIG1vZHVsZXMgYW5kIHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiIvS2VybmVsL1N5c3RlbS9TdXBwb3J0L0RhdGFiYXNlIjsKICAgICMgcmVhZCBhbGwgYXZhaWxpYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYigkRGlyTmFtZS4iLyoucG0iKTsKICAgIGZvcmVhY2ggbXkgJEZpbGUgKEBMaXN0KSB7CiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIGlmICgkRGF0YWJhc2VUeXBlID1+IC9PREJDL2kpIHsKICAgICAgICAgICAgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEYXRhYmFzZTo6VHlwZScpOwogICAgICAgIH0KICAgICAgICBpZiAoJERhdGFiYXNlVHlwZSA9fiAvXiRGaWxlL2kpIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjokRmlsZSI7CiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSl7CiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICAgICAgaWYgKCRTdXBwb3J0T2JqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFycmF5UmVmID0gJFN1cHBvcnRPYmplY3QtPkFkbWluQ2hlY2tzR2V0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggKEB7JERhdGFBcnJheX0sIEB7JEFycmF5UmVmfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggQ2hlY2sgaW5mb3JtYXRpb24uCgokQ2hlY2tIYXNoID0+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KCj1jdXQKCnN1YiBDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CgogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCgogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDA3LzA2LzExIDA5OjI1OjM5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9teXNxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG15c3FsLnBtLHYgMS41IDIwMDcvMDYvMTIgMTM6MDA6NDcgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6Om15c3FsOwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjUgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57WE1MT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFN1cHBvcnRDb25maWdBcnJheUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQp9CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBARGF0YUFycmF5ID0gKCk7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdXRmLTggc3VwcG9ydCBjaGVjawogICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpID1+IC91dGYoXC04fDgpL2kpIHsKICAgICAgICBteSAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICdObyB2ZXJzaW9uIGZvdW5kISc7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJzaG93IHZhcmlhYmxlcyIpOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICBpZiAoJFJvd1swXSA9fiAvXnZlcnNpb24kL2kpIHsKICAgICAgICAgICAgICAgIGlmICgkUm93WzFdID1+IC9eKDRcLigxfDJ8Myl8NVwuKS8pIHsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJNeVNRTCAkUm93WzFdIjsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAidXRmOCBub3Qgc3VwcG9ydGVkIChNeVNRTCAkUm93WzFdKSI7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHVzaCAoQERhdGFBcnJheSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICd1dGY4IHN1cHBvcnQnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAndXRmOCBzdXBwb3J0JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBkYXRhYmFzZSB1dGY4IHN1cHBvcnQuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgdXRmLTggY2hlY2sKICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pKSB7CiAgICAgICAgbXkgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnTm8gY2hhcmFjdGVyX3NldF9jbGllbnQgZm91bmQhJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gInNob3cgdmFyaWFibGVzIik7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgIGlmICgkUm93WzBdID1+IC9eY2hhcmFjdGVyX3NldF9jbGllbnQvaSkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiY2hhcmFjdGVyX3NldF9jbGllbnQgZm91bmQgYnV0IGl0J3Mgc2V0IHRvICRSb3dbMV0gKG5lZWQgdG8gYmUgdXRmOCkiOwogICAgICAgICAgICAgICAgaWYgKCRSb3dbMV0gPX4gL3V0ZjgvKSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwdXNoIChARGF0YUFycmF5LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ3V0ZjggY2xpZW50IGNvbm5lY3Rpb24nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAndXRmOCBjbGllbnQgY29ubmVjdGlvbicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgdGhlIHV0ZjggY2xpZW50IGNvbm5lY3Rpb24uIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgbWF4X2FsbG93ZWRfcGFja2V0IGNoZWNrCiAgICBteSAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIG1heF9hbGxvd2VkX3BhY2tldCBmb3VuZCEnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJzaG93IHZhcmlhYmxlcyIpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgIGlmICgkUm93WzBdID1+IC9ebWF4X2FsbG93ZWRfcGFja2V0L2kpIHsKICAgICAgICAgICAgICAgIGlmICgkUm93WzFdIDwgMTAyNCoxMDI0KjcpIHsKICAgICAgICAgICAgICAgICAgICAkUm93WzFdID0gaW50KCRSb3dbMV0vMTAyNCk7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAibWF4X2FsbG93ZWRfcGFja2V0IHNob3VsZCBiZSBoaWdoZXIgdGhlIDcwMDAgS0IgKGl0cyAkUm93WzFdIEtCKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUm93WzFdID0gaW50KCRSb3dbMV0vMTAyNCk7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIEtCIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgcHVzaCAoQERhdGFBcnJheSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnbWF4X2FsbG93ZWRfcGFja2V0JywKICAgICAgICAgICAgTmFtZSA9PiAnbWF4X2FsbG93ZWRfcGFja2V0JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIG1heF9hbGxvd2VkX3BhY2tldCBzZXR0aW5nLiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgIENoZWNrID0+ICRDaGVjaywKICAgICAgICB9LAogICAgKTsKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3NjcmlwdHMvZGF0YWJhc2Uvb3Rycy1zY2hlbWEueG1sIjsKICAgIGlmICgtZiAkRmlsZSkgewogICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgbXkgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgIGlmIChvcGVuKElOLCAiPCAkRmlsZSIpKSB7CiAgICAgICAgICAgIHdoaWxlICg8SU4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSAoSU4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaChTdHJpbmcgPT4gJENvbnRlbnQpOwoKICAgICAgICAgICAgZm9yZWFjaCBteSAkVGFibGUgKEB7JFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfX0pIHsKICAgICAgICAgICAgICAgIGlmICgkVGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJzZWxlY3QgKiBmcm9tICRUYWJsZS0+e05hbWV9IiwgTGltaXQgPT4gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkVGFibGUtPntOYW1lfSwgIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJUYWJsZXMgZG9zbid0IGV4aXN0czogJE1lc3NhZ2UiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRDb3VudCBUYWJsZXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggKEBEYXRhQXJyYXksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUYWJsZScsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGFibGUnLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCAoQERhdGFBcnJheSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RhYmxlJywKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUYWJsZScsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHB1c2ggKEBEYXRhQXJyYXksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVGFibGUnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGFibGUnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIkNhbid0IGZpbmQgZmlsZSAkRmlsZSEiLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ0ZhaWxlZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9vcmFjbGUucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBvcmFjbGUucG0sdiAxLjMgMjAwNy8wNi8xMiAxMzowMDo0NyBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6b3JhY2xlOwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjMgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57WE1MT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFN1cHBvcnRDb25maWdBcnJheUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQp9CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBEYXRhQXJyYXkgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIE9SQUNMRV9IT01FCiAgICBteSAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIE9SQUNMRV9IT01FIGZvdW5kISc7CiAgICBpZiAoJEVOVntPUkFDTEVfSE9NRX0pIHsKICAgICAgICBpZiAoISAtZSAkRU5We09SQUNMRV9IT01FfSkgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJPUkFDTEVfSE9NRSBkb24ndCBleGlzdHMgKCRFTlZ7T1JBQ0xFX0hPTUV9KSI7CiAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJEVOVntPUkFDTEVfSE9NRX0iOwogICAgICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgIH0KICAgIH0KICAgIHB1c2ggKEBEYXRhQXJyYXksCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ09SQUNMRV9IT01FJywKICAgICAgICAgICAgTmFtZSA9PiAnT1JBQ0xFX0hPTUUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgT1JBQ0xFX0hPTUUuIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgICAgIH0sCiAgICApOwogICAgIyBjaGVjayBOTFNfTEFORwogICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAkTWVzc2FnZSA9ICdObyBOTFNfTEFORyBmb3VuZCEnOwogICAgaWYgKCRFTlZ7TkxTX0xBTkd9KSB7CiAgICAgICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpID1+IC91dGYoXC04fDgpL2kpIHsKICAgICAgICAgICAgaWYgKCRFTlZ7TkxTX0xBTkd9ICF+IC91dGYoXC04fDgpLykgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJEVOVntOTFNfTEFOR30sIG5lZWQgLnV0ZjggaW4gTkxTX0xBTkcgKGUuIGcuIGdlcm1hbl9nZXJtYW55LnV0ZjgpIjsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJEVOVntOTFNfTEFOR30iOwogICAgICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJEVOVntOTFNfTEFOR30iOwogICAgICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgIH0KICAgIH0KICAgIHB1c2ggKEBEYXRhQXJyYXksCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ05MU19MQU5HJywKICAgICAgICAgICAgTmFtZSA9PiAnTkxTX0xBTkcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgTkxTX0xBTkcuIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgICAgIH0sCiAgICApOwogICAgIyBjaGVjayBOTFNfREFURV9GT1JNQVQKICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgJE1lc3NhZ2UgPSAnTm8gTkxTX0RBVEVfRk9STUFUIGZvdW5kISc7CiAgICBpZiAoJEVOVntOTFNfREFURV9GT1JNQVR9KSB7CiAgICAgICAgaWYgKCRFTlZ7TkxTX0RBVEVfRk9STUFUfSBuZSAiWVlZWS1NTS1ERCBISDI0Ok1JOlNTIikgewogICAgICAgICAgICAkTWVzc2FnZSA9ICIkRU5We05MU19EQVRFX0ZPUk1BVH0sIG5lZWQgJ1lZWVktTU0tREQgSEgyNDpNSTpTUycgZm9yIE5MU19EQVRFX0ZPUk1BVCAobm90ICRFTlZ7TkxTX0RBVEVfRk9STUFUfSkiOwogICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0RBVEVfRk9STUFUfSI7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgcHVzaCAoQERhdGFBcnJheSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnTkxTX0RBVEVfRk9STUFUJywKICAgICAgICAgICAgTmFtZSA9PiAnTkxTX0RBVEVfRk9STUFUJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIE5MU19EQVRFX0ZPUk1BVC4iLAogICAgICAgICAgICBDb21tZW50ID0+ICRNZXNzYWdlLAogICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgfSwKICAgICk7CiAgICAjIHRhYmxlIGNoZWNrCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi9zY3JpcHRzL2RhdGFiYXNlL290cnMtc2NoZW1hLnhtbCI7CiAgICBpZiAoLWYgJEZpbGUpIHsKICAgICAgICBteSAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgaWYgKG9wZW4oSU4sICI8ICRGaWxlIikpIHsKICAgICAgICAgICAgd2hpbGUgKDxJTj4pIHsKICAgICAgICAgICAgICAgICRDb250ZW50IC49ICRfOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlIChJTik7CiAgICAgICAgICAgIG15IEBYTUxIYXNoID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxQYXJzZTJYTUxIYXNoKFN0cmluZyA9PiAkQ29udGVudCk7CgogICAgICAgICAgICBmb3JlYWNoIG15ICRUYWJsZSAoQHskWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9fSkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gInNlbGVjdCAqIGZyb20gJFRhYmxlLT57TmFtZX0iLCBMaW1pdCA9PiAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlRhYmxlcyBkb3NuJ3QgZXhpc3RzOiAkTWVzc2FnZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggKEBEYXRhQXJyYXksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUYWJsZScsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGFibGUnLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCAoQERhdGFBcnJheSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RhYmxlJywKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUYWJsZScsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9IYXJkd2FyZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEhhcmR3YXJlLnBtLHYgMS41IDIwMDcvMDYvMTMgMTA6MDk6NTMgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6SGFyZHdhcmU7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS41ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkhhcmR3YXJlIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGhhcmR3YXJlIGluZm8gb2JqZWN0Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwpteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwpteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCik7CgokU3lzdGVtSW5mb09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpIYXJkd2FyZS0+bmV3KAogICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU3VwcG9ydENvbmZpZ0FycmF5R2V0KCkKCnJldHVybiBhbiBhcnJheSByZWZlcmVuY2Ugd2l0aCByZXF1aXJlZCBjb25maWcgaW5mb3JtYXRpb24uCgokQXJyYXlSZWYgPSAkU3VwcG9ydC0+U3VwcG9ydENvbmZpZ0FycmF5R2V0KCk7CgpteSAkQ29uZmlnQXJyYXkgPSBbCiAgICB7CiAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICBOYW1lID0+ICdEdW1wIFRpY2tldHMnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSBob3cgbWFueSBsYXRlc3QgVGlja2V0cyB3ZSBzaHV0IGR1bXA/JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEFsbCA9PiAnQWxsJywKICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgMTAgPT4gJ0xhc3QgMTAnLAogICAgICAgICAgICAgICAgMTAwID0+ICdMYXN0IDEwMCcsCiAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnQXBhY2hlSG9tZScsCiAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgdGhlIHBhdGggdG8gdGhlIEFwYWNoZSBob21lIGRpcmVjdG9yeSAoL2V0Yy9hcGFjaGUyKScsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA0MCwKICAgICAgICB9LAogICAgfSwKXTsKCj1jdXQKCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID0gW107CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCj1pdGVtIFN1cHBvcnRJbmZvR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKJEhhcmR3YXJlQXJyYXkgPT4gWwogICAgewogICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgIENoZWNrID0+ICdPSycsCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICBDaGVjayA9PiAnT0snLAogICAgfSwKXTsKCj1jdXQKCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5NZW1vcnlTd2FwQ2hlY2soCiAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAogICAgKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CiAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKICAgICRPbmVDaGVjayA9ICRTZWxmLT5DUFVMb2FkQ2hlY2soCiAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAogICAgKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiRIYXJkd2FyZUFycmF5ID0+IFsKICAgIHsKICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICBDaGVjayA9PiAnT0snLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgIH0sCl07Cgo9Y3V0CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPk1lbW9yeVN3YXBDaGVjaygpOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAkT25lQ2hlY2sgPSAkU2VsZi0+Q1BVTG9hZENoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICRPbmVDaGVjayA9ICRTZWxmLT5EaXNrVXNhZ2VDaGVjaygpOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gTWVtb3J5U3dhcENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIE1lbW9yeVN3YXBDaGVjayBpbmZvcm1hdGlvbi4KCiRNZW1vcnlTd2FwQ2hlY2tIYXNoID0+CiAgICB7CiAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgIH07CgojIGNoZWNrIGlmIGNvbmZpZyB2YWx1ZSBhdmFpbGlibGUKaWYgKCRQYXJhbXtUeXBlfSkgewogICAgcHJpbnQgU1RERVJSICJUWVBFOiAiIC4gJFBhcmFte1R5cGV9Owp9Cgo9Y3V0CgpzdWIgTWVtb3J5U3dhcENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVNZW1UbXBJbmZvID0gKCk7CiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSkgewogICAgICAgIGlmICgtZSAiL3Byb2MvbWVtaW5mbyIpIHsKICAgICAgICAgICAgb3BlbihNRU1JTkZPRklMRSwgIjwvcHJvYy9tZW1pbmZvIik7CiAgICAgICAgICAgIHdoaWxlKDxNRU1JTkZPRklMRT4pIHsKICAgICAgICAgICAgICAgIG15ICRUbXBMaW5lID0gJF87CiAgICAgICAgICAgICAgICBpZiAoJFRtcExpbmUgPX4gL01lbVRvdGFsLykgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbVRvdGFsfSA9ICRUbXBMaW5lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRUbXBMaW5lID1+IC9NZW1GcmVlLykgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbUZyZWV9ID0gJFRtcExpbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJFRtcExpbmUgPX4gL1N3YXBUb3RhbC8pIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87CiAgICAgICAgICAgICAgICAgICAgJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwVG90YWx9ID0gJFRtcExpbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJFRtcExpbmUgPX4gL1N3YXBGcmVlLykgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBGcmVlfSA9ICRUbXBMaW5lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKE1FTUlORk9GSUxFKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJF5PID1+IC93aW4vaSkgeyMgVE9ETyAvIEF1c2dhYmUgdW50ZXIgV2luZG93cyBub2NoIHBydWVmZW4KCiAgICB9CgogICAgIyBidWlsZCByZXR1cm4gaGFzaAogICAgbXkgJERlc2NyaWJ0aW9uID0gIlRoZSBIb3N0IFN5c3RlbSBoYXM6IFxuIgogICAgICAgIC5zcHJpbnRmICgiJS4wZiIsICgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbVRvdGFsfSAvIDEwMjQpKSAuICIgTUIgTWVtb3J5IHRvdGFsIFxuIgogICAgICAgIC5zcHJpbnRmICgiJS4wZiIsICgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbUZyZWV9IC8gMTAyNCkpIC4gIiBNQiBNZW1vcnkgZnJlZSBcbiIKICAgICAgICAuc3ByaW50ZiAoIiUuMGYiLCAoJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwVG90YWx9IC8gMTAyNCkpIC4gIiBNQiBTd2FwIHRvdGFsIFxuIgogICAgICAgIC5zcHJpbnRmICgiJS4wZiIsICgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBGcmVlfSAvIDEwMjQpKSAuICIgTUIgU3dhcCBmcmVlICI7CgogICAgaWYgKCgoJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwRnJlZX0pLygkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0pIDwgNjApIHx8CiAgICAgICAgKCgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0pLSgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBGcmVlfSkgPiAyMDAwMCkKICAgICkgewogICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICBLZXkgPT4gJ01lbW9yeVN3YXBDaGVjaycsCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgXG4iCiAgICAgICAgICAgICAgICAuIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSBcbiIKICAgICAgICAgICAgICAgIC4iIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICBLZXkgPT4gJ01lbW9yeVN3YXBDaGVjaycsCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgXG4iCiAgICAgICAgICAgICAgICAuIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSBcbiIKICAgICAgICAgICAgICAgIC4iIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgIENoZWNrID0+ICdGYWlsZWQnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBDUFVMb2FkQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSBAU3BsaXRBcnJheSA9IHt9OwogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kpIHsKICAgICAgICBpZiAoLWUgIi9wcm9jL2xvYWRhdmciKSB7CiAgICAgICAgICAgIG9wZW4oTE9BREZJTEUsICI8L3Byb2MvbG9hZGF2ZyIpOwogICAgICAgICAgICB3aGlsZSg8TE9BREZJTEU+KSB7CiAgICAgICAgICAgICAgICBAU3BsaXRBcnJheSA9IHNwbGl0ICgiICIsICRfKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZShMT0FERklMRSk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCgogICAgfQogICAgIyBidWlsZCByZXR1cm4gaGFzaAogICAgbXkgJERlc2NyaWJ0aW9uID0gIlRoZSBIb3N0IFN5c3RlbSBoYXMgYSBsb2FkOiBcbiIKICAgICAgICAuICRTcGxpdEFycmF5WzBdIC4gIiBpbiB0aGUgbGFzdCAxIG1pbnV0ZSBcbiIKICAgICAgICAuICRTcGxpdEFycmF5WzFdIC4gIiBpbiB0aGUgbGFzdCA1IG1pbnV0ZXMgXG4iCiAgICAgICAgLiAkU3BsaXRBcnJheVsyXSAuICIgaW4gdGhlIGxhc3QgMTUgbWludXRlcyI7CgogICAgaWYgKCRTcGxpdEFycmF5WzJdIDwgJzEuMDAnKSB7CiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIEtleSA9PiAnQ1BVTG9hZENoZWNrJywKICAgICAgICAgICAgTmFtZSA9PiAnQ1BVIExvYWQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQSBDUFUgbG9hZCBjaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmIFxuIgogICAgICAgICAgICAgICAgLiJ0aGUgc3lzdGVtIGxvYWQgaW4gdGhlIGxhc3QgMTUgbWludXRlcyA+IDEuIFxuIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAiJERlc2NyaWJ0aW9uIiwKICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIEtleSA9PiAnQ1BVTG9hZENoZWNrJywKICAgICAgICAgICAgTmFtZSA9PiAnQ1BVIExvYWQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQSBDUFUgbG9hZCBjaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmIFxuIgogICAgICAgICAgICAgICAgLiJ0aGUgc3lzdGVtIGxvYWQgaW4gdGhlIGxhc3QgMTUgbWludXRlcyA8IDEgXG4iLAogICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpYnRpb24iLAogICAgICAgICAgICBDaGVjayA9PiAnRmFpbGVkJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgRGlza1VzYWdlQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKICAgIG15ICRDaGVjayA9ICdPSyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pKSB7CiAgICAgICAgaWYgKG9wZW4oSU4sICJkZiAtbCB8IikpIHsKICAgICAgICAgICAgd2hpbGUoPElOPikgewogICAgICAgICAgICAgICAgaWYgKCRfID1+IC9eKC4rPylccy4qXHMoXGRcZFxkfFxkXGR8XGQpJS4rPyQvKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQyID4gOTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkQ2hlY2sgbmUgJ0ZhaWxlZCcgJiYgJDIgPiA4NSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiwiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJDFcWyQyJVxdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZShJTik7CiAgICAgICAgICAgIGlmICgkQ2hlY2sgZXEgJ0ZhaWxlZCcpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIkRpc2sgaXN0IGZ1bGwgKCRNZXNzYWdlKS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiRGlzayB1c2FnZSAoJE1lc3NhZ2UpLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIEtleSA9PiAnZGlzayB1c2FnZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ2Rpc2sgdXNhZ2UnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgZGlzayB1c2FnZS4iLAogICAgICAgICAgICBDb21tZW50ID0+ICRNZXNzYWdlLAogICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMDcvMDYvMTMgMTA6MDk6NTMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PVFJTLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogT1RSUy5wbSx2IDEuMS4xLjEgMjAwNy8wNS8wNyAxODo0Nzo1NSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9UUlM7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPVFJTIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIE9UUlMgaW5mbyBvYmplY3QKCiAgdXNlIEtlcm5lbDo6Q29uZmlnOwogIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgKTsKCiAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6T1RSUy0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKCiAgICBteSAkQ29uZmlnQXJyYXkgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1RpY2tldER1bXAnLAogICAgICAgICAgICBOYW1lID0+ICdEdW1wIFRpY2tldHMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgaG93IG1hbnkgbGF0ZXN0IFRpY2tldHMgd2Ugc2h1dCBkdW1wPycsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBbGwgPT4gJ0FsbCcsCiAgICAgICAgICAgICAgICAgICAgMCA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgMTAgPT4gJ0xhc3QgMTAnLAogICAgICAgICAgICAgICAgICAgIDEwMCA9PiAnTGFzdCAxMDAnLAogICAgICAgICAgICAgICAgICAgIDEwMDAgPT4gJ0xhc3QgMTAwMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZUhvbWUnLAogICAgICAgICAgICBOYW1lID0+ICdBcGFjaGUgSG9tZSBEaXJlY3RvcnknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgdGhlIHBhdGggdG8gdGhlIEFwYWNoZSBob21lIGRpcmVjdG9yeSAoL2V0Yy9hcGFjaGUyKScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgU2l6ZSA9PiA0MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID0gWwoKICAgIF07CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCj1pdGVtIFN1cHBvcnRJbmZvR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKJE9UUlNBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKAojICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiMgICAgKTsKIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokT1RSU0FycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKICAgICAgICAKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKCk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggQ2hlY2sgaW5mb3JtYXRpb24uCgokQ2hlY2tIYXNoID0+IAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9OwoKIyBjaGVjayBpZiBjb25maWcgdmFsdWUgYXZhaWxpYmxlCmlmICgkUGFyYW17VHlwZX0pIHsKICAgIHByaW50IFNUREVSUiAiVFlQRTogIiAuICRQYXJhbXtUeXBlfTsKfQogICAgICAgIAo9Y3V0CgpzdWIgQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCReTyA9fiAvbGludXgvIHx8IC91bml4LyB8fCAvbmV0YnNkLyB8fCAvZnJlZWJzZC8gfHwgL0Rhcndpbi8pIHsKICAgICAgCiAgICB9CiAgICBlbHNpZiAoJF5PID1+IC93aW4vaSkgeyMgVE9ETyAvIEF1c2dhYmUgdW50ZXIgV2luZG93cyBub2NoIHBydWVmZW4KICAgICAgICAKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKMTs=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBXZWJzZXJ2ZXIucG0sdiAxLjIgMjAwNy8wNS8yMyAxODowODoyMSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFdlYnNlcnZlciBpbmZvIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKICAgICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnQXJyYXlHZXQoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiAgICAkQXJyYXlSZWYgPSAkU3VwcG9ydC0+U3VwcG9ydENvbmZpZ0FycmF5R2V0KCk7CgogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIFdlYnNlcnZlcnMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnVGlja2V0RHVtcCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ0R1bXAgVGlja2V0cycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSBob3cgbWFueSBsYXRlc3QgVGlja2V0cyB3ZSBzaHV0IGR1bXA/JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFsbCA9PiAnQWxsJywKICAgICAgICAgICAgICAgICAgICAwID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAxMCA9PiAnTGFzdCAxMCcsCiAgICAgICAgICAgICAgICAgICAgMTAwID0+ICdMYXN0IDEwMCcsCiAgICAgICAgICAgICAgICAgICAgMTAwMCA9PiAnTGFzdCAxMDAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdXNlZCBXZWJzZXJ2ZXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHRyeSB0byBmaW5kIG91dCB3aGljaCBXZWJzZXJ2ZXIgaXMgY29uZmlndXJlZAogICAgbXkgJFdlYnNlcnZlclR5cGUgPSAnJzsKICAgIGlmICgkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL14uKkFwYWNoZS4qJC9pKSB7CiAgICAgICAgJFdlYnNlcnZlclR5cGUgPSAnQXBhY2hlLnBtJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRXZWJzZXJ2ZXJUeXBlID0gJ0lJUy5wbSc7CiAgICB9CgogICAgIyB0cnkgdG8gZ2V0IGF2YWlsaWJsZSBtb2R1bGVzIGFuZCB0aGUgZGlyZWN0b3J5IG5hbWUKICAgIG15ICREaXJOYW1lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL0tlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIiOwogICAgIyByZWFkIGFsbCBhdmFpbGlibGUgbW9kdWxlcyBpbiBATGlzdAogICAgbXkgQExpc3QgPSBnbG9iKCREaXJOYW1lLiIvKi5wbSIpOwogICAgZm9yZWFjaCBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgaWYgKCRXZWJzZXJ2ZXJUeXBlIGVxICRGaWxlKSB7CiAgICAgICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI6OiRGaWxlIjsKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygleyRTZWxmfSk7CiAgICAgICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+U3VwcG9ydENvbmZpZ0FycmF5R2V0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggKEB7JENvbmZpZ0FycmF5fSwgQHskQXJyYXlSZWZ9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCj1pdGVtIFN1cHBvcnRJbmZvR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKJFdlYnNlcnZlckFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCBXZWJzZXJ2ZXJzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKAojICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiMgICAgKTsKIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IHVzZWQgV2Vic2VydmVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyB0cnkgdG8gZmluZCBvdXQgd2hpY2ggV2Vic2VydmVyIGlzIGNvbmZpZ3VyZWQKICAgIG15ICRXZWJzZXJ2ZXJUeXBlID0gJyc7CiAgICBpZiAoJEVOVntTRVJWRVJfU09GVFdBUkV9ID1+IC9eLipBcGFjaGUuKiQvaSkgewogICAgICAgICRXZWJzZXJ2ZXJUeXBlID0gJ0FwYWNoZS5wbSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkV2Vic2VydmVyVHlwZSA9ICdJSVMucG0nOwogICAgfQoKICAgICMgdHJ5IHRvIGdldCBhdmFpbGlibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvV2Vic2VydmVyIjsKICAgICMgcmVhZCBhbGwgYXZhaWxpYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYigkRGlyTmFtZS4iLyoucG0iKTsKICAgIGZvcmVhY2ggbXkgJEZpbGUgKEBMaXN0KSB7CiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIGlmICgkV2Vic2VydmVyVHlwZSBlcSAkRmlsZSkgewogICAgICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyOjokRmlsZSI7CiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSl7CiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICAgICAgaWYgKCRTdXBwb3J0T2JqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFycmF5UmVmID0gJFN1cHBvcnRPYmplY3QtPlN1cHBvcnRJbmZvR2V0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggKEB7JERhdGFBcnJheX0sIEB7JEFycmF5UmVmfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokV2Vic2VydmVyQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCBXZWJzZXJ2ZXJzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKCk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIFdlYnNlcnZlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIFdlYnNlcnZlciBpcyBjb25maWd1cmVkCiAgICBteSAkV2Vic2VydmVyVHlwZSA9ICcnOwogICAgaWYgKCRFTlZ7U0VSVkVSX1NPRlRXQVJFfSA9fiAvXi4qQXBhY2hlLiokL2kpIHsKICAgICAgICAkV2Vic2VydmVyVHlwZSA9ICdBcGFjaGUucG0nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFdlYnNlcnZlclR5cGUgPSAnSUlTLnBtJzsKICAgIH0KICAgICMgdHJ5IHRvIGdldCBhdmFpbGlibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvV2Vic2VydmVyIjsKICAgICMgcmVhZCBhbGwgYXZhaWxpYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYigkRGlyTmFtZS4iLyoucG0iKTsKICAgIGZvcmVhY2ggbXkgJEZpbGUgKEBMaXN0KSB7CiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIGlmICgkV2Vic2VydmVyVHlwZSA9fiAvXiRGaWxlL2kpIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6JEZpbGUiOwogICAgICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgICAgICBpZiAoJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkpewogICAgICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCV7JFNlbGZ9KTsKICAgICAgICAgICAgICAgIGlmICgkU3VwcG9ydE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5BZG1pbkNoZWNrc0dldCgpOwogICAgICAgICAgICAgICAgICAgIGlmICgkQXJyYXlSZWYgJiYgcmVmKCRBcnJheVJlZikgZXEgJ0FSUkFZJykgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIChAeyREYXRhQXJyYXl9LCBAeyRBcnJheVJlZn0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH07CgojIGNoZWNrIGlmIGNvbmZpZyB2YWx1ZSBhdmFpbGlibGUKaWYgKCRQYXJhbXtUeXBlfSkgewogICAgcHJpbnQgU1RERVJSICJUWVBFOiAiIC4gJFBhcmFte1R5cGV9Owp9Cgo9Y3V0CgpzdWIgQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoJF5PID1+IC9saW51eC8gfHwgL3VuaXgvIHx8IC9uZXRic2QvIHx8IC9mcmVlYnNkLyB8fCAvRGFyd2luLykgewoKICAgIH0KICAgIGVsc2lmICgkXk8gPX4gL3dpbi9pKSB7IyBUT0RPIC8gQXVzZ2FiZSB1bnRlciBXaW5kb3dzIG5vY2ggcHJ1ZWZlbgoKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAwNy8wNS8yMyAxODowODoyMSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvQXBhY2hlLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQXBhY2hlLnBtLHYgMS4zIDIwMDcvMDYvMTMgMDk6NTc6MTUgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyOjpBcGFjaGU7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KfQoKc3ViIFN1cHBvcnRJbmZvR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhNb2R1bGVJbnB1dEhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAocmVmKCRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJNb2R1bGVJbnB1dEhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KIyAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKIyAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+Q2hlY2soCiMgICAgICAgIFR5cGUgPT4gJFBhcmFte01vZHVsZUlucHV0SGFzaH0tPntUeXBlfSB8fCAnJywKIyAgICApOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBARGF0YUFycmF5ID0gKCk7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBjaGVjayBtb2RfcGVybCB2ZXJzaW9uCiAgICBteSAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoJEVOVntNT0RfUEVSTH0pIHsKICAgICAgICBpZiAoJEVOVntNT0RfUEVSTH0gPX4gL1wvMS45OS8pIHsKICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91IHVzZSBhIGJldGEgdmVyc2lvbiBvZiBtb2RfcGVybCAoJEVOVntNT0RfUEVSTH0pLCB5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gYSBzdGFibGUgdmVyc2lvbi4iOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJEVOVntNT0RfUEVSTH0gPX4gL1wvMS8pIHsKICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91IHNob3VsZCB1cGRhdGUgbW9kX3BlcmwgdG8gMi54ICgkRU5We01PRF9QRVJMfSkuIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TU9EX1BFUkx9IjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBzaG91bGQgdXNlIG1vZF9wZXJsIHRvIGluY3JlYXNlIHlvdXIgcGVyZm9ybWFuY2UuJzsKICAgIH0KICAgIHB1c2ggKEBEYXRhQXJyYXksCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ21vZF9wZXJsIHZlcnNpb24nLAogICAgICAgICAgICBOYW1lID0+ICdtb2RfcGVybCB2ZXJzaW9uJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIHVzZWQgbW9kX3BlcmwgdmVyc2lvbi4iLAogICAgICAgICAgICBDb21tZW50ID0+ICRNZXNzYWdlLAogICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgfSwKICAgICk7CiAgICAjIHJlbG9hZCBjaGVjawogICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCRFTlZ7TU9EX1BFUkx9KSB7CiAgICAgICAgZXZhbCAicmVxdWlyZSBtb2RfcGVybCI7CiAgICAgICAgaWYgKGRlZmluZWQgJG1vZF9wZXJsOjpWRVJTSU9OKSB7CiAgICAgICAgICAgIGlmICgkbW9kX3Blcmw6OlZFUlNJT04gPj0gMS45OSkgewogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBBcGFjaGU6OlJlbG9hZCBpcyBsb2FkZWQKICAgICAgICAgICAgICAgIG15ICRBcGFjaGVSZWxvYWQgPSAwOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkTW9kdWxlIChrZXlzICVJTkMpIHsKICAgICAgICAgICAgICAgICAgICAkTW9kdWxlID1+IHMvXC8vOjovZzsKICAgICAgICAgICAgICAgICAgICAkTW9kdWxlID1+IHMvXC5wbSQvL2c7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRNb2R1bGUgZXEgJ0FwYWNoZTo6UmVsb2FkJyB8fCAkTW9kdWxlIGVxICdBcGFjaGUyOjpSZWxvYWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBcGFjaGVSZWxvYWQgPSAkTW9kdWxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJEFwYWNoZVJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAnQXBhY2hlOjpSZWxvYWQgb3IgQXBhY2hlMjo6UmVsb2FkIHNob3VsZCBiZSB1c2VkIGFzIFBlcmxNb2R1bGUgYW5kIFBlcmxJbml0SGFuZGxlciBpbiBBcGFjaGUgY29uZmlnIGZpbGUuJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJEFwYWNoZVJlbG9hZCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBzaG91bGQgdXNlIG1vZF9wZXJsIHRvIGluY3JlYXNlIHlvdXIgcGVyZm9ybWFuY2UuJzsKICAgIH0KICAgIHB1c2ggKEBEYXRhQXJyYXksCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZTo6UmVsb2FkJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlOjpSZWxvYWQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgdXNlZCBBcGFjaGU6OlJlbG9hZC9BcGFjaGUyOjpSZWxvYWQuIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKMTsK