<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerMultitenancy</Name>
    <Version>11.0.5</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-10-29 15:37:54" Version="11.0.5">Updated with core changes; improved documentation; updated translations.</ChangeLog>
    <ChangeLog Date="2026-04-27 14:07:58" Version="11.0.4">Update to OTOBO 11.0.16.</ChangeLog>
    <ChangeLog Date="2025-02-26 13:48:09" Version="11.0.3">Updated to OTOBO 11.0.8.</ChangeLog>
    <ChangeLog Date="2024-10-07 08:38:09" Version="11.0.2">Updated to OTOBO 11.0.6.</ChangeLog>
    <ChangeLog Date="2024-04-02 13:45:01" Version="11.0.1">Initial Release on OTOBO 11.</ChangeLog>
    <Description Lang="en">Group-based multitenancy for customer and customer user.</Description>
    <Description Lang="de">Gruppenbasierte Mandantenfähigkeit für Kunden und Kundenbenutzer.</Description>
    <Framework>11.0.x</Framework>
    <BuildCommitID>f87cf993d110f1716c6556afe337cf3de0a02a4f</BuildCommitID>
    <BuildDate>2026-10-29 15:37:57</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AdminCustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJDb21wYW55OwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICAjIHNldCBwcmVmIGZvciBjb2x1bW5zIGtleQogICAgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9ID0gJ0luY2x1ZGVJbnZhbGlkJyAuICctJyAuICRTZWxmLT57QWN0aW9ufTsKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRQcmVmZXJlbmNlc3sgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9IH07CgogICAgJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9ID0geyBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc30gfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJE5hdiAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hdicgKSB8fCAwOwogICAgbXkgJE5hdmlnYXRpb25CYXJUeXBlID0gJE5hdiBlcSAnQWdlbnQnID8gJ0N1c3RvbWVycycgOiAnQWRtaW4nOwogICAgbXkgJFNlYXJjaCAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlYXJjaCcgKTsKICAgICRTZWFyY2gKICAgICAgICB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdBZG1pbkN1c3RvbWVyQ29tcGFueTo6UnVuSW5pdGlhbFdpbGRjYXJkU2VhcmNoJykgPyAnKicgOiAnJzsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwoKICAgIG15ICVHZXRQYXJhbTsKICAgICRHZXRQYXJhbXtTb3VyY2V9ICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU291cmNlJyApIHx8ICdDdXN0b21lckNvbXBhbnknOwogICAgJEdldFBhcmFte0luY2x1ZGVJbnZhbGlkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbmNsdWRlSW52YWxpZCcgKTsKCiAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte0luY2x1ZGVJbnZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRHZXRQYXJhbXtJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPSAkR2V0UGFyYW17SW5jbHVkZUludmFsaWR9OwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gc2V0IG11bHRpdGVuYW5jeS4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICAgICAgbXkgJE11bHRpdGVuYW5jeUdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwID0+ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSwKICAgICAgICApOwoKICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cHN7JE11bHRpdGVuYW5jeUdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeVBlcm1pc3Npb259ID0gMTsKICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgIG15ICVEYXRhICAgICAgICAgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtDdXN0b21lckNvbXBhbnlJRH0gPSAkQ3VzdG9tZXJJRDsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgY29tcGFueSB1cGRhdGVkIScpICkKICAgICAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb24gZXEgJ1VwZGF0ZScgKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICVEYXRhLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUVycm9yczsKICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJDb21wYW55SUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyQ29tcGFueUlEJyApOwoKICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55TWFwID0gJENvbmZpZ09iamVjdC0+R2V0KCAkR2V0UGFyYW17U291cmNlfSApLT57TWFwfS0+QCo7CgogICAgICAgICMgVGhlIHJlYWRvbmx5IGZpZWxkcyBzaG91bGQgbm90IGJlIHNldHRhYmxlIGZyb20gdGhlIFdlYkFwcC4KICAgICAgICAjIFNvIHVwZGF0ZSB3aXRoIHRoZSBvbGQgdmFsdWVzLCByZWdhcmRsZXNzIHdoYXQgd2FzIHBhc3NlZCBmcm9tIHRoZSBjbGllbnQuCiAgICAgICAgIyBUaGUgb2xkIGRhdGEgaXMgb25seSBuZWVkZWQgd2hlbiB0aGVyZSBhcmUgYW55IHJlYWRvbmx5IGZpZWxkcy4KICAgICAgICBteSAlT2xkRGF0YTsKICAgICAgICBpZiAoIGFueSB7ICRfLT5bN10gfSBAQ3VzdG9tZXJDb21wYW55TWFwICkgewogICAgICAgICAgICAlT2xkRGF0YSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckNvbXBhbnlNYXApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmV1c2UgdGhlIG9sZCBkYXRhIGZvciByZWFkb25seSBmaWVsZAogICAgICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzddICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJE9sZERhdGF7ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGUgZW50cmllcwogICAgICAgIGlmICggJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSBuZSAkR2V0UGFyYW17Q3VzdG9tZXJJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBDdXN0b21lckNvbXBhbnkgbGlzdAogICAgICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgICAgIGlmICggJUxpc3QgJiYgJExpc3R7ICRHZXRQYXJhbXtDdXN0b21lcklEfSB9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tEdXBsaWNhdGV9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgZ3JvdXAKICAgICAgICAgICAgbXkgJFVwZGF0ZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSggJUdldFBhcmFtLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9ICk7CgogICAgICAgICAgICBpZiAoJFVwZGF0ZSkgewoKICAgICAgICAgICAgICAgIG15ICRTZXRERkVycm9yOwoKICAgICAgICAgICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckNvbXBhbnlNYXApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNldERGRXJyb3IgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWMgZmllbGQgJXMgbm90IGZvdW5kIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlU2V0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2V0REZFcnJvciAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDb250aW51ZUFmdGVyU2F2ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSB8fCAwOwoKICAgICAgICAgICAgICAgICMgaWYgc2V0IERGIGVycm9yIGV4aXN0cywgY3JlYXRlIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgaWYgKCRTZXRERkVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgd291bGQgbGlrZSB0byBjb250aW51ZSBlZGl0aW5nIHRoZSBjdXN0b21lciBjb21wYW55LCBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICAgICAgICAgICAgIGlmICggJENvbnRpbnVlQWZ0ZXJTYXZlIGVxICcxJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMgPT4gXCVFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIGNvbXBhbnkgdXBkYXRlZCEnKSApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNldERGRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIGN1c3RvbWVyIGNvbXBhbnksIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICBpZiAoICRDb250aW51ZUFmdGVyU2F2ZSBlcSAnMScgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249Q2hhbmdlO0N1c3RvbWVySUQ9IiAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJEN1c3RvbWVySUQpIC4gIjtOYXY9JE5hdjtOb3RpZmljYXRpb249VXBkYXRlIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKCiAgICAgICAgIyBzZXQgbm90aWZpY2F0aW9uIGZvciBkdXBsaWNhdGUgZW50cnkKICAgICAgICBpZiAoICRFcnJvcnN7RHVwbGljYXRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciBDb21wYW55ICVzIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgJEdldFBhcmFte05hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWRkJywKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVFcnJvcnM7CgogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlLZXkgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRHZXRQYXJhbXtTb3VyY2V9ICktPntDdXN0b21lckNvbXBhbnlLZXl9OwogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlJRDsKCiAgICAgICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgY3VzdG9tZXIgY29tcGFueSBrZXkgZm9yIGNoZWNraW5nIGR1cGxpY2F0ZQogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzJdIGVxICRDdXN0b21lckNvbXBhbnlLZXkgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55SUQgPSAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IEN1c3RvbWVyQ29tcGFueSBsaXN0CiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgaWYgKCAlTGlzdCAmJiAkTGlzdHskQ3VzdG9tZXJDb21wYW55SUR9ICkgewogICAgICAgICAgICAkRXJyb3Jze0R1cGxpY2F0ZX0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgY29tcGFueQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlBZGQoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gam9pbiAnJywKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciBjb21wYW55IGFkZGVkIScpLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pYyBmaWVsZCAlcyBub3QgZm91bmQhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU2V0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRHZXRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWVTZXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKCiAgICAgICAgIyBzZXQgbm90aWZpY2F0aW9uIGZvciBkdXBsaWNhdGUgZW50cnkKICAgICAgICBpZiAoICRFcnJvcnN7RHVwbGljYXRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciBDb21wYW55ICVzIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgbXkgJE91dHB1dCAgICAgICA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIGNvbXBhbnkgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9FZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBzZW5kIHBhcmFtZXRlciBSZWFkT25seSB0byBKUyBvYmplY3QKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmVhZE9ubHknLAogICAgICAgIFZhbHVlID0+ICRDb25maWdPYmplY3QtPnsgJFBhcmFte1NvdXJjZX0gfS0+e1JlYWRPbmx5fSwKICAgICk7CgogICAgIyBHZXQgdmFsaWQgb2JqZWN0LgogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgJFBhcmFteydWYWxpZE9wdGlvbid9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSwKICAgICk7CgogICAgIyBHZXQgbmVlZGVkIG9iamVjdHMuCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzBdICkgewoKICAgICAgICAgICAgIyBIYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICMgR2V0IEhUTUwgZm9yIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9ID8gJFBhcmFteyAkRW50cnktPlswXSB9IDogdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAgICAgICAgICMgU2VydmVyIGVycm9yLCBpZiBhbnkKICAgICAgICAgICAgICAgICAgICAleyAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSB9IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgZm9yIHdoaWNoIEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZEhUTUwpOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzR2VuZXJpYycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEJsb2NrID0gJ0lucHV0JzsKCiAgICAgICAgICAgICMgYnVpbGQgc2VsZWN0aW9ucyBvciBpbnB1dCBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25SZXF1aXJlZCA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBidWlsZCBWYWxpZElEIHN0cmluZwogICAgICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57U2VsZWN0aW9uc30KICAgICAgICAgICAgICAgICAgICAgICAgLT57ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY0tleScsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDM1LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiBtL15DdXN0b21lckNvbXBhbnlDb3VudHJ5L2kgKSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCBDb3VudHJ5IHNlbGVjdGlvbiB3aXRoIEVuZ2xpc2ggbmFtZXMKICAgICAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJEVudHJ5LT5bNF0gPyAnVmFsaWRhdGVfUmVxdWlyZWQnIDogJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRyeUxpc3Q7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnUmVmZXJlbmNlRGF0YTo6VHJhbnNsYXRlZENvdW50cnlOYW1lcycpICkgewoKICAgICAgICAgICAgICAgICAgICAjIEZsYWcrTmFtZSA9PiBjb2RlCiAgICAgICAgICAgICAgICAgICAgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q0xEUkNvdW50cnlMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcmV2aW91cyB2YWx1ZSBleGlzdHMgaW4gdGhlIHNlbGVjdGlvbiBsaXN0IGV2ZW4gaWYgaXQgaXNuJ3QgYSBjb3VudHJ5IGNvZGUuCiAgICAgICAgICAgICAgICAgICAgbXkgJFByZXZpb3VzQ291bnRyeSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgICAgICAgICBpZiAoJFByZXZpb3VzQ291bnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRyeUxpc3QtPnskUHJldmlvdXNDb3VudHJ5fSAvLz0gJFByZXZpb3VzQ291bnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBFbmdsaXNoIG5hbWUgPT4gRW5nbGlzaCBuYW1lCiAgICAgICAgICAgICAgICAgICAgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q291bnRyeUxpc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvdW50cnlMaXN0LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gLy8gMSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzBdID1+IG0vXlZhbGlkSUQvaSApIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgIG15ICRPcHRpb25SZXF1aXJlZCA9ICRFbnRyeS0+WzRdID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJyA6ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gZGVmaW5lZCggJFBhcmFteyAkRW50cnktPlswXSB9ICkgPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICAgICAjIEJ1aWxkIHRoZSBncm91cCBmaWVsZC4KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJHcm91cElEJC9pICkgewogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgdGhlIHBlcm1pc3Npb24gdG8gc2VlL2NoYW5nZSB0aGUgbXVsdGl0ZW5hbmN5IGZpZWxkLgogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNdWx0aXRlbmFuY3lQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAjIEJ1aWxkIHRoZSBmaWVsZC4KICAgICAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyByZXF1aXJlZCBmbGFnCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWFuZGF0b3J5Q2xhc3N9ID0gJ2NsYXNzPSJNYW5kYXRvcnkiJzsKICAgICAgICAgICAgICAgICRQYXJhbXtTdGFyTGFiZWx9ICAgICAgPSAnPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4nOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWFuZGF0b3J5Q2xhc3N9ID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17U3RhckxhYmVsfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyByZWFkb25seSBmbGFnCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bN10gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICdyZWFkb25seSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBmb3JtIG9wdGlvbgogICAgICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSAmJiAkUGFyYW17VHlwZX0gZXEgJ2hpZGRlbicgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9IC49ICRQYXJhbXtWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc0dlbmVyaWMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJdGVtID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpYyRCbG9jayIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRGaWVsZCA9PiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljJHtCbG9ja31SZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvblNlYXJjaCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwoKICAgICMgZ2V0IHdyaXRhYmxlIGRhdGEgc291cmNlcwogICAgbXkgJUN1c3RvbWVyQ29tcGFueVNvdXJjZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCwKICAgICk7CgogICAgIyBvbmx5IHNob3cgQWRkIG9wdGlvbiBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB3cml0YWJsZSBiYWNrZW5kCiAgICBpZiAoIHNjYWxhciBrZXlzICVDdXN0b21lckNvbXBhbnlTb3VyY2UgKSB7CiAgICAgICAgJFBhcmFte1NvdXJjZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICVDdXN0b21lckNvbXBhbnlTb3VyY2UsIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NvdXJjZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NvdXJjZX0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgYXJlIGFueSByZWdpc3RyaWVzIHRvIHNlYXJjaCwgdGhlIHRhYmxlIGlzIGZpbGxlZCBhbmQgc2hvd24KICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBzYW1lIExpbWl0IGFzICRTZWxmLT57Q3VzdG9tZXJDb21wYW55fS0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH0KICAgICAgICAjIHNtYWxsZXN0IExpbWl0IGZyb20gYWxsIHNvdXJjZXMKICAgICAgICBteSAkTGltaXQ7CiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJNYXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpOwogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJExpbWl0IHx8ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0TGltaXR9IDwgJExpbWl0ICkgewogICAgICAgICAgICAgICAgJExpbWl0ID0gJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXMgZmFsbGJhY2sgdGFrZSB0aGUgaGFyZGNvZGVkIGxpbWl0IG9mIEtlcm5lbC9TeXN0ZW0vQ3VzdG9tZXJDb21wYW55L0RCLnBtCiAgICAgICAgJExpbWl0IC8vPSA1MDAwMDsKCiAgICAgICAgbXkgJUxpc3RBbGxJdGVtcyA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCArIDEsCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zIDw9ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyA9IGtleXMgJUxpc3RBbGxJdGVtczsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsID0+ICRMaXN0QWxsSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/IDAgOiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zID4gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zICAgPSBrZXlzICVMaXN0QWxsSXRlbXM7CiAgICAgICAgICAgIG15ICRTZWFyY2hMaXN0U2l6ZSA9IGtleXMgJUxpc3Q7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNlYXJjaExpc3RTaXplID0+ICRTZWFyY2hMaXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsICAgICAgICA9PiAkTGlzdEFsbEl0ZW1zLAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CgogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1BhcmFtc30tPntGb3JlaWduREJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTG9jYWxEQicgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgICAgIGlmICglTGlzdCkgewogICAgICAgICAgICBmb3IgbXkgJExpc3RLZXkgKCBzb3J0IHsgJExpc3R7JGF9IGNtcCAkTGlzdHskYn0gfSBrZXlzICVMaXN0ICkgewoKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRMaXN0S2V5ICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hdiAgICA9PiAkUGFyYW17TmF2fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntQYXJhbXN9LT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9jYWxEQlJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBzZWFyY2ggaXQgc2hvd3MgYSBtZXNzYWdlCiAgICBlbHNlCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VhcmNoVGVybXMnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AdminCustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJVc2VyOwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IHByZWYgZm9yIGNvbHVtbnMga2V5CiAgICAkU2VsZi0+e1ByZWZLZXlJbmNsdWRlSW52YWxpZH0gPSAnSW5jbHVkZUludmFsaWQnIC4gJy0nIC4gJFNlbGYtPntBY3Rpb259OwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID0gJFByZWZlcmVuY2VzeyAkU2VsZi0+e1ByZWZLZXlJbmNsdWRlSW52YWxpZH0gfTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgKTsKCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0gPSB7IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfSB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkTmF2ICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmF2JyApICAgIHx8ICcnOwogICAgbXkgJFNvdXJjZSAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvdXJjZScgKSB8fCAnQ3VzdG9tZXJVc2VyJzsKICAgIG15ICRTZWFyY2ggICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWFyY2gnICk7CiAgICBteSAkSW5jbHVkZUludmFsaWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSW5jbHVkZUludmFsaWQnICk7CgogICAgaWYgKCBkZWZpbmVkICRJbmNsdWRlSW52YWxpZCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRJbmNsdWRlSW52YWxpZCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRJbmNsdWRlSW52YWxpZDsKICAgIH0KICAgICRTZWFyY2gKICAgICAgICB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdBZG1pbkN1c3RvbWVyVXNlcjo6UnVuSW5pdGlhbFdpbGRjYXJkU2VhcmNoJykgPyAnKicgOiAnJzsKCiAgICAjIGNyZWF0ZSBsb2NhbCBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgbXkgJE5hdkJhciAgICAgICA9ICcnOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgJE5hdkJhciA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTmF2QmFyID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE5hdkJhciAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXYgZXEgJ0FnZW50JyA/ICdDdXN0b21lcnMnIDogJ0FkbWluJywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IGxpc3Qgb2YgdmFsaWQgSURzLgogICAgbXkgQFZhbGlkSURMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgIyBjaGVjayB0aGUgcGVybWlzc2lvbiBmb3IgdGhlIFN3aXRjaFRvQ3VzdG9tZXIgZmVhdHVyZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKSApIHsKCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICMgZ2V0IHRoZSBncm91cCBpZCB3aGljaCBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgc3dpdGNoIHRvIGN1c3RvbWVyIGZlYXR1cmUKICAgICAgICBteSAkU3dpdGNoVG9DdXN0b21lckdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwTG9va3VwKAogICAgICAgICAgICBHcm91cCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXI6OlBlcm1pc3Npb25Hcm91cCcpLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHVzZXIgZ3JvdXBzLCB3aGVyZSB0aGUgdXNlciBoYXMgdGhlIHJ3IHByaXZpbGVnZQogICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICAjIGlmIHRoZSB1c2VyIGlzIGEgbWVtYmVyIGluIHRoaXMgZ3JvdXAgaGUgY2FuIGFjY2VzcyB0aGUgZmVhdHVyZQogICAgICAgIGlmICggJEdyb3Vwc3skU3dpdGNoVG9DdXN0b21lckdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNldCBtdWx0aXRlbmFuY3kuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgIG15ICRNdWx0aXRlbmFuY3lHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICBHcm91cCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJyksCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkR3JvdXBzeyRNdWx0aXRlbmFuY3lHcm91cElEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3lQZXJtaXNzaW9ufSA9IDE7CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyAgc3dpdGNoIHRvIGN1c3RvbWVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntTdWJhY3Rpb259IGVxICdTd2l0Y2gnCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdTd2l0Y2hUb0N1c3RvbWVyJykKICAgICAgICAmJiAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJFVzZXJJRCAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICVVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHNlc3Npb24gaWQKICAgICAgICBteSAkTmV3U2Vzc2lvbklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPkNyZWF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICBVc2VyTGFzdFJlcXVlc3QgPT4gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvRXBvY2goKSwKICAgICAgICAgICAgVXNlclR5cGUgICAgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIFNlc3Npb25Tb3VyY2UgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGludGVyZmFjZSBzZXNzaW9uIG5hbWUKICAgICAgICBteSAkU2Vzc2lvbk5hbWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpIHx8ICdDU0lEJzsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgTGF5b3V0T2JqZWN0IHdpdGggU2Vzc2lvbklEQ29va2llCiAgICAgICAgbXkgJEV4cGlyZXMgPSAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncyc7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKSApIHsKICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICB9CgogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBTZXNzaW9uSUQgICA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgICAgICBTZXNzaW9uTmFtZSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25OYW1lJyksCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgICAgIEtleSAgICAgPT4gJ1Nlc3Npb25JRENvb2tpZScsCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlc3Npb25OYW1lLAogICAgICAgICAgICBWYWx1ZSAgID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICAgICAgIEV4cGlyZXMgPT4gJEV4cGlyZXMsCiAgICAgICAgKTsKCiAgICAgICAgIyBsb2cgZXZlbnQKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAiU3dpdGNoZWQgZnJvbSBBZ2VudCB0byBDdXN0b21lciAoJFNlbGYtPntVc2VyTG9naW59IC09PiAkVXNlckRhdGF7VXNlckxvZ2lufSkiLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgVVJMIHRvIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG15ICRVUkwgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJykKICAgICAgICAgICAgLiAnOi8vJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnRlFETicpCiAgICAgICAgICAgIC4gJy8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpCiAgICAgICAgICAgIC4gJ2N1c3RvbWVyLnBsJzsKCiAgICAgICAgIyBpZiBubyBzZXNzaW9ucyBhcmUgdXNlZCB3ZSBhdHRhY2ggdGhlIHNlc3Npb24gYXMgVVJMIHBhcmFtZXRlcgogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewogICAgICAgICAgICAkVVJMIC49ICI/JFNlc3Npb25OYW1lPSROZXdTZXNzaW9uSUQiOwogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdCB0byBjdXN0b21lciBpbnRlcmZhY2Ugd2l0aCBuZXcgc2Vzc2lvbiBpZAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICRVUkwgKTsKICAgIH0KCiAgICAjIHNlYXJjaCB1c2VyIGxpc3QKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZWFyY2gnICkgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZG93bmxvYWQgZmlsZSBwcmVmZXJlbmNlcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkJyApIHsKICAgICAgICBteSAkR3JvdXAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnR3JvdXAnICkgfHwgJyc7CiAgICAgICAgbXkgJFVzZXIgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApICAgIHx8ICcnOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlckRhdGEgICAgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRVc2VyICk7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKICAgICAgICBteSAkTW9kdWxlICAgICAgPSAkUHJlZmVyZW5jZXN7JEdyb3VwfS0+e01vZHVsZX07CiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skR3JvdXB9LAogICAgICAgICAgICBVc2VyT2JqZWN0ID0+ICRDdXN0b21lclVzZXJPYmplY3QsCiAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgKTsKICAgICAgICBteSAlRmlsZSA9ICRPYmplY3QtPkRvd25sb2FkKCBVc2VyRGF0YSA9PiBcJVVzZXJEYXRhICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KCVGaWxlKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgbXkgJFVzZXIgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFVzZXIgKTsKCiAgICAgICAgbXkgJE91dHB1dCA9ICROYXZCYXI7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciB1cGRhdGVkIScpICkKICAgICAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb24gZXEgJ1VwZGF0ZScgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgU291cmNlID0+ICRTb3VyY2UsCiAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICBJRCAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICApOwoKICAgICAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyB1cGRhdGUgb25seSB0aGUgcHJlZmVyZW5jZXMgYW5kIGR5bmFtaWMgZmllbGRzLCBpZiB0aGUgc291cmNlIGlzIHJlYWRvbmx5IG9yIGEgbGRhcCBiYWNrZW5kCiAgICAgICAgbXkgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlczsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntSZWFkT25seX0gfHwgJENvbmZpZ09iamVjdC0+R2V0KCRTb3VyY2UpLT57TW9kdWxlfSA9fiAvTERBUC9pICkgewogICAgICAgICAgICAkVXBkYXRlT25seVByZWZlcmVuY2VzID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICROb3RlID0gJyc7CiAgICAgICAgbXkgKCAlR2V0UGFyYW0sICVFcnJvcnMgKTsKCiAgICAgICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIHx8ICcnOwoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlczsKCiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gJiYgJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJEdldFBhcmFte0lEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcwogICAgICAgICAgICAmJiAkR2V0UGFyYW17VXNlckVtYWlsfQogICAgICAgICAgICAmJiAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkR2V0UGFyYW17VXNlckVtYWlsfSApCiAgICAgICAgICAgICYmIGdyZXAgeyAkXyBlcSAkR2V0UGFyYW17VmFsaWRJRH0gfSBAVmFsaWRJRExpc3QKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yc3tVc2VyRW1haWxJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7RXJyb3JUeXBlfSAgICAgICAgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBjdXJyZW50IHVzZXIgZGF0YSBmb3Igc29tZSBjaGVja3MuCiAgICAgICAgbXkgJUN1cnJlbnRVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIEN1c3RvbWVySUQsIGlmIEN1c3RvbWVyQ29tcGFueVN1cHBvcnQgaXMgZW5hYmxlZCBhbmQgdGhlIFVzZXJDdXN0b21lcklEIHdhcyBjaGFuZ2VkLgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCRTb3VyY2UpLT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0KICAgICAgICAgICAgJiYgJEdldFBhcmFte1VzZXJDdXN0b21lcklEfQogICAgICAgICAgICAmJiAkQ3VycmVudFVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSBuZSAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBteSAlQ29tcGFueSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJUNvbXBhbnkgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3Jze1VzZXJDdXN0b21lcklESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGVycm9ycyBvY2N1cnJlZAogICAgICAgIGlmICggISVFcnJvcnMgKSB7CgogICAgICAgICAgICBteSAkVXBkYXRlU3VjY2VzczsKICAgICAgICAgICAgaWYgKCAhJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNjZXNzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VXNlclBhc3N3b3JkfSAmJiAoICRDdXJyZW50VXNlckRhdGF7VXNlclBhc3N3b3JkfSAvLyAnJyApIG5lICRHZXRQYXJhbXtVc2VyUGFzc3dvcmR9ICkgewoKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNjZXNzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+RGVsZXRlT25lUHJlZmVyZW5jZSgKICAgICAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJMYXN0UHdDaGFuZ2VUaW1lJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRVcGRhdGVTdWNjZXNzIHx8ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWMgZmllbGQgJXMgbm90IGZvdW5kIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU2V0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRHZXRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEdldFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRWYWx1ZVNldCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKSB9OwogICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICRHcm91cCBlcSAnUGFzc3dvcmQnOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRHZXRQYXJhbXtVc2VyTG9naW59CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRHcm91cH0tPntNb2R1bGV9OwogICAgICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEdyb3VwfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlck9iamVjdCA9PiAkQ3VzdG9tZXJVc2VyT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YSA9PiBcJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQYXJhbUl0ZW0tPntOYW1lfSB9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGEgPT4gXCVVc2VyRGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gJE9iamVjdC0+RXJyb3IoKSApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2xlYXIgY3VzdG9tZXIgdXNlciBjYWNoZQogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ2FjaGVDbGVhcigKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEdldFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YSBhbmQgc2hvdyBzY3JlZW4gYWdhaW4KICAgICAgICAgICAgICAgIGlmICggISROb3RlICkgewoKICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSB1c2VyIHdvdWxkIGxpa2UgdG8gY29udGludWUgZWRpdGluZyB0aGUgcHJpb3JpdHksIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSBlcSAnMScgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPUNoYW5nZTtJRD0kSUQ7U2VhcmNoPSRTZWFyY2g7TmF2PSROYXY7Tm90aWZpY2F0aW9uPVVwZGF0ZSIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gdG8gb3ZlcnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZwogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyOwogICAgICAgICRPdXRwdXQgLj0gJE5vdGU7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlLAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkJyApIHsKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgJEdldFBhcmFte1VzZXJMb2dpbn0gID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VzZXJMb2dpbicgKSAgfHwgJyc7CiAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJE91dHB1dCA9ICROYXZCYXI7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FkZCcsCiAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlLAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkTm90ZSA9ICcnOwogICAgICAgIG15ICggJUdldFBhcmFtLCAlRXJyb3JzICk7CgogICAgICAgIG15ICRBdXRvTG9naW5DcmVhdGlvbiA9ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e0F1dG9Mb2dpbkNyZWF0aW9ufTsKCiAgICAgICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgICMgZG9uJ3QgdmFsaWRhdGUgVXNlckxvZ2luIGlmIEF1dG9Mb2dpbkNyZWF0aW9uIGlzIGNvbmZpZ3VyZWQKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAoICRBdXRvTG9naW5DcmVhdGlvbiAmJiAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyApOwoKICAgICAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyApIHsKCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9LT57ICRFbnRyeS0+WzJdIH07CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEeW5hbWljRmllbGQgJEVudHJ5LT5bMl0gbm90IGZvdW5kISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgPT4gJEVudHJ5LT5bNF0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgc3RvcmFibGUgdmFsdWUgb2YgZHluYW1pYyBmaWVsZCBlZGl0IGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayByZW1haW5pbmcgbm9uLWR5bmFtaWMtZmllbGQgbWFuZGF0b3J5IGZpZWxkcwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRFbnRyeS0+WzBdICkgfHwgJyc7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gJiYgJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte1VzZXJFbWFpbH0KICAgICAgICAgICAgJiYgISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEdldFBhcmFte1VzZXJFbWFpbH0gKQogICAgICAgICAgICAmJiBncmVwIHsgJF8gZXEgJEdldFBhcmFte1ZhbGlkSUR9IH0gQFZhbGlkSURMaXN0CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnN7VXNlckVtYWlsSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze0Vycm9yVHlwZX0gICAgICAgID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIEN1c3RvbWVySUQsIGlmIEN1c3RvbWVyQ29tcGFueVN1cHBvcnQgaXMgZW5hYmxlZC4KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9ICYmICRHZXRQYXJhbXtVc2VyQ3VzdG9tZXJJRH0gKSB7CgogICAgICAgICAgICBteSAlQ29tcGFueSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJUNvbXBhbnkgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3Jze1VzZXJDdXN0b21lcklESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGVycm9ycyBvY2N1cnJlZAogICAgICAgIGlmICggISVFcnJvcnMgKSB7CgogICAgICAgICAgICAjIGFkZCB1c2VyCiAgICAgICAgICAgIG15ICRVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkVXNlcikgewoKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIHVubGVzcyAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljIGZpZWxkICVzIG5vdCBmb3VuZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkVmFsdWVTZXQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlU2V0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKSB9OwogICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICRHcm91cCBlcSAnUGFzc3dvcmQnOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRVc2VyLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skR3JvdXB9LT57TW9kdWxlfTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRHcm91cH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRHcm91cH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGEgPT4gXCVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbUl0ZW0tPntOYW1lfSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhID0+IFwlVXNlckRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+ICRPYmplY3QtPkVycm9yKCkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEgYW5kIHNob3cgc2NyZWVuIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICEkTm90ZSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBpbiBib3Jyb3dlZCB2aWV3LCB0YWtlIHRoZSBuZXcgY3JlYXRlZCBjdXN0b21lciBvdmVyIGludG8gdGhlIG5ldyB0aWNrZXQKICAgICAgICAgICAgICAgICAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhcjsKCiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ05hdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTmF2LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCAgICAgICAgPSAkTmF2QmFyIC4gJE5vdGU7CiAgICAgICAgICAgICAgICAgICAgbXkgJFVSTCAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICBteSAkVXNlckhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFVzZXIpOwogICAgICAgICAgICAgICAgICAgIG15ICRVc2VyUXVvdGUgICAgID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkVXNlciApOwogICAgICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVSTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gIjxhIGhyZWY9XCIkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9QWN0aW9uPUFnZW50VGlja2V0UGhvbmU7U3ViYWN0aW9uPVN0b3JlTmV3O0V4cGFuZEN1c3RvbWVyTmFtZT0yO0N1c3RvbWVyVXNlcj0kVXNlckhUTUxRdW90ZTskTGF5b3V0T2JqZWN0LT57Q2hhbGxlbmdlVG9rZW5QYXJhbX1cIj4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTmV3IHBob25lIHRpY2tldCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8L2E+IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0RW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFVSTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVSTCAuPSAiIC0gIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkVVJMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAiPGEgaHJlZj1cIiRMYXlvdXRPYmplY3QtPntCYXNlbGlua31BY3Rpb249QWdlbnRUaWNrZXRFbWFpbDtTdWJhY3Rpb249U3RvcmVOZXc7RXhwYW5kQ3VzdG9tZXJOYW1lPTI7Q3VzdG9tZXJVc2VyPSRVc2VySFRNTFF1b3RlOyRMYXlvdXRPYmplY3QtPntDaGFsbGVuZ2VUb2tlblBhcmFtfVwiPiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdOZXcgZW1haWwgdGlja2V0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIjwvYT4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJFVSTCkgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDdXN0b21lciAlcyBhZGRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyUXVvdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAoICRVUkwgKSEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyICVzIGFkZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJRdW90ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiISIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZwogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyIC4gJE5vdGU7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FkZCcsCiAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlLAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICApOwoKICAgICAgICBteSAkTm90aWZpY2F0aW9uID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05vdGlmaWNhdGlvbicgKSB8fCAnJzsKICAgICAgICBteSAkT3V0cHV0ICAgICAgID0gJE5hdkJhcjsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIHVzZXIgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvblNlYXJjaCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgZ2V0IHdyaXRhYmxlIGRhdGEgc291cmNlcwogICAgbXkgJUN1c3RvbWVyU291cmNlID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTb3VyY2VMaXN0KAogICAgICAgIFJlYWRPbmx5ID0+IDAsCiAgICApOwoKICAgICMgb25seSBzaG93IEFkZCBvcHRpb24gaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgd3JpdGFibGUgYmFja2VuZAogICAgaWYgKCBzY2FsYXIga2V5cyAlQ3VzdG9tZXJTb3VyY2UgKSB7CiAgICAgICAgJFBhcmFte1NvdXJjZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICVDdXN0b21lclNvdXJjZSwgfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU291cmNlJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U291cmNlfSB8fCAnJywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uQWRkJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAjIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSB0byBzaG93LCBhIG1lc3NhZ2UgaXMgZGlzcGxheWVkIG9uIHRoZSB0YWJsZSB3aXRoIHRoaXMgY29sc3BhbgogICAgICAgIG15ICRDb2xTcGFuID0gNjsKCiAgICAgICAgIyBzYW1lIExpbWl0IGFzICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0KICAgICAgICAjIHNtYWxsZXN0IExpbWl0IGZyb20gYWxsIHNvdXJjZXMKICAgICAgICBteSAkTGltaXQ7CiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50Iik7CiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJNYXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJExpbWl0IHx8ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9IDwgJExpbWl0ICkgewogICAgICAgICAgICAgICAgJExpbWl0ID0gJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXMgZmFsbGJhY2sgdGFrZSB0aGUgaGFyZGNvZGVkIGxpbWl0IG9mIEtlcm5lbC9TeXN0ZW0vQ3VzdG9tZXJVc2VyL0RCLnBtCiAgICAgICAgJExpbWl0IC8vPSAyNTA7CgogICAgICAgIG15ICVMaXN0QWxsSXRlbXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICBMaW1pdCAgPT4gJExpbWl0ICsgMSwKICAgICAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBrZXlzICVMaXN0QWxsSXRlbXMgPD0gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zID0ga2V5cyAlTGlzdEFsbEl0ZW1zOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExpc3RBbGwgPT4gJExpc3RBbGxJdGVtcywKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/IDAgOiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zID4gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zICAgPSBrZXlzICVMaXN0QWxsSXRlbXM7CiAgICAgICAgICAgIG15ICRTZWFyY2hMaXN0U2l6ZSA9IGtleXMgJUxpc3Q7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNlYXJjaExpc3RTaXplID0+ICRTZWFyY2hMaXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsICAgICAgICA9PiAkTGlzdEFsbEl0ZW1zLAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKSAmJiAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufSAmJiAkUGFyYW17TmF2fSBuZSAnTm9uZScgKQogICAgICAgIHsKICAgICAgICAgICAgJENvbFNwYW4gPSA3OwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0U3dpdGNoVG9DdXN0b21lcicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZXJlIGFyZSByZXN1bHRzIHRvIHNob3cKICAgICAgICBpZiAoJUxpc3QpIHsKCiAgICAgICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgICAgICAgICAgZm9yIG15ICRMaXN0S2V5ICggc29ydCB7IGxjKCRhKSBjbXAgbGMoJGIpIH0ga2V5cyAlTGlzdCApIHsKCiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRMaXN0S2V5ICk7CiAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckZ1bGxuYW1lfSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyTmFtZSgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gJFZhbGlkTGlzdHsgJFVzZXJEYXRhe1ZhbGlkSUR9IHx8ICcnIH0gfHwgJy0nLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgICA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgPT4gJExpc3RLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte05hdn0gZXEgJ05vbmUnICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvd0xpbmtOb25lJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgICA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRMaXN0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3dMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgICA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdiAgICAgICAgID0+ICRQYXJhbXtOYXZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgPT4gJExpc3RLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdTd2l0Y2hUb0N1c3RvbWVyJykKICAgICAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufQogICAgICAgICAgICAgICAgICAgICYmICRQYXJhbXtOYXZ9IG5lICdOb25lJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3dTd2l0Y2hUb0N1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgaXQgZGlzcGxheXMgYSBubyBkYXRhIGZvdW5kIG1lc3NhZ2UKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb2xTcGFuID0+ICRDb2xTcGFuLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHNlYXJjaCBpdCBzaG93cyBhIG1lc3NhZ2UKICAgIGVsc2UKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9TZWFyY2hUZXJtcycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ05hdicsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte05hdn0sCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIF9FZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBHZXQgbGF5b3V0IG9iamVjdC4KICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZScsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtBY3Rpb259IGVxICdDaGFuZ2UnICkgewoKICAgICAgICAjIHNob3dzIGVkaXQgaGVhZGVyCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0hlYWRlckVkaXQnICk7CgogICAgICAgICMgc2hvd3MgZWZmZWN0aXZlIHBlcm1pc3Npb25zIG1hdHJpeAogICAgICAgICRTZWxmLT5fRWZmZWN0aXZlUGVybWlzc2lvbnMoJVBhcmFtKTsKICAgIH0KCiAgICAjIHNob3dzIGFkZCBoZWFkZXIKICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdIZWFkZXJBZGQnICk7CiAgICB9CgogICAgbXkgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlczsKCiAgICAjIEdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHVwZGF0ZSB1c2VyCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57UmVhZE9ubHl9CiAgICAgICAgfHwKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntNb2R1bGV9ID1+IC9MREFQL2kKICAgICAgICApCiAgICB7CiAgICAgICAgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA9IDE7CiAgICB9CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgISRFbnRyeS0+WzBdOwoKICAgICAgICAjIEhhbmRsZSBkeW5hbWljIGZpZWxkcwogICAgICAgIGlmICggJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnICkgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIEdldCBIVE1MIGZvciBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSA/ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSA6IHVuZGVmLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAoKICAgICAgICAgICAgICAgICMgU2VydmVyIGVycm9yLCBpZiBhbnkKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIH0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgZm9yIHdoaWNoIEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkSFRNTCk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgIH0KCiAgICAgICAgbXkgJEJsb2NrID0gJ0lucHV0JzsKCiAgICAgICAgIyBjaGVjayBpbnB1dCB0eXBlCiAgICAgICAgaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJQYXNzd29yL2kgKSB7CiAgICAgICAgICAgICRCbG9jayA9ICdQYXNzd29yZCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGxvZ2luIGF1dG8gY3JlYXRpb24KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e0F1dG9Mb2dpbkNyZWF0aW9ufSAmJiAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyApIHsKICAgICAgICAgICAgJEJsb2NrID0gJ0lucHV0SGlkZGVuJzsKICAgICAgICB9CgogICAgICAgIGlmICggJEVudHJ5LT5bN10gfHwgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5fSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVhZE9ubHl9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgc2hvdyByZXF1aXJlZCBmbGFnCiAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICAgICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkTGFiZWxDbGFzc30gICAgID0gJ01hbmRhdG9yeSc7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZExhYmVsQ2hhcmFjdGVyfSA9ICcqJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSAgICAgICAgICA9ICcnOwogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRMYWJlbENsYXNzfSAgICAgPSAnJzsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkTGFiZWxDaGFyYWN0ZXJ9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBlbXB0eSBzdHJpbmcKICAgICAgICAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8PSAnJzsKCiAgICAgICAgIyBhZGQgY2xhc3MgdG8gdmFsaWRhdGUgZW1haWxzCiAgICAgICAgaWYgKCAkRW50cnktPlswXSBlcSAnVXNlckVtYWlsJyApIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9IC49ICcgVmFsaWRhdGVfRW1haWwnOwogICAgICAgIH0KCiAgICAgICAgIyBCdWlsZCBzZWxlY3Rpb25zIG9yIGlucHV0IGZpZWxkcy4KICAgICAgICAjIEFuIGV4cGxpY2l0IHNlbGVjdGlvbiBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKCiAgICAgICAgICAgICMgQ2hhbmdlIHRoZSB2YWxpZGF0aW9uIGNsYXNzCiAgICAgICAgICAgIGlmICggJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIGRhdGEgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1NlbGVjdGlvbnN9LT57ICRFbnRyeS0+WzBdIH07CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZW5jb2Rpbmcgc3RhbXAgaXMgc2V0CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFNlbGVjdGlvbnNEYXRhfSApIHsKICAgICAgICAgICAgICAgICRTZWxlY3Rpb25zRGF0YS0+eyRLZXl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVJbnB1dCggJFNlbGVjdGlvbnNEYXRhLT57JEtleX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBvcHRpb24gc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkU2VsZWN0aW9uc0RhdGEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPyAxIDogMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkRW50cnktPlswXSA9fiBtL15Vc2VyQ291bnRyeS9pCiAgICAgICAgICAgICYmCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnUmVmZXJlbmNlRGF0YTo6VHJhbnNsYXRlZENvdW50cnlOYW1lcycpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwoKICAgICAgICAgICAgbXkgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q0xEUkNvdW50cnlMaXN0KAogICAgICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExheW91dE9iamVjdC0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcmV2aW91cyB2YWx1ZSBleGlzdHMgaW4gdGhlIHNlbGVjdGlvbiBsaXN0IGV2ZW4gaWYgaXNuJ3QgYSBjb3VudHJ5IGNvZGUuCiAgICAgICAgICAgIG15ICRQcmV2aW91c0NvdW50cnkgPSAkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIGlmICgkUHJldmlvdXNDb3VudHJ5KSB7CiAgICAgICAgICAgICAgICAkQ291bnRyeUxpc3QtPnskUHJldmlvdXNDb3VudHJ5fSAvLz0gJFByZXZpb3VzQ291bnRyeTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ291bnRyeUxpc3QsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICIkUGFyYW17UmVxdWlyZWRDbGFzc30gTW9kZXJuaXplICIgLiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICggJFBhcmFteyAkRW50cnktPlswXSB9IC8vIDEgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiBtL15WYWxpZElEL2kgKSB7CgogICAgICAgICAgICAjIENoYW5nZSB0aGUgdmFsaWRhdGlvbiBjbGFzcwogICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZENsYXNzfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgVmFsaWRJRCBzdHJpbmcKICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IHsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpLCB9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gZGVmaW5lZCggJFBhcmFteyAkRW50cnktPlswXSB9ICkgPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgIERpc2FibGVkICAgPT4gJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA/IDEgOiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRFbnRyeS0+WzBdID1+IG0vXlVzZXJDdXN0b21lcklEJC9pCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55Jyk7CiAgICAgICAgICAgIG15ICVDb21wYW55TGlzdCAgICAgICAgICAgPSAoCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KCBMaW1pdCA9PiAwICksCiAgICAgICAgICAgICAgICAnJyA9PiAnLScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJUNvbXBhbnkgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbXBhbnlMaXN0eyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSAuICcgKC0pJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKCiAgICAgICAgICAgICMgQ2hhbmdlIHRoZSB2YWxpZGF0aW9uIGNsYXNzCiAgICAgICAgICAgIGlmICggJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFVzZUF1dG9Db21wbGV0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQWRtaW5DdXN0b21lclVzZXI6OlVzZUF1dG9Db21wbGV0ZScpOwoKICAgICAgICAgICAgaWYgKCRVc2VBdXRvQ29tcGxldGUpIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJFBhcmFte0N1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgJFZhbHVlID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICJbJSBEYXRhLlZhbHVlIHwgaHRtbCAlXSIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlVzZXJDdXN0b21lcklEIiBuYW1lPSJVc2VyQ3VzdG9tZXJJRCIgdmFsdWU9IicgLiAkVmFsdWUgLiAnIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJXNTBwYyBDdXN0b21lckF1dG9Db21wbGV0ZVNpbXBsZSAnCiAgICAgICAgICAgICAgICAgICAgLiAkUGFyYW17UmVxdWlyZWRDbGFzc30gLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0KICAgICAgICAgICAgICAgICAgICAuICciIGRhdGEtY3VzdG9tZXItc2VhcmNoLXR5cGU9IkN1c3RvbWVySUQiIC8+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJUNvbXBhbnlMaXN0LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICA9PiA4MCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB8fCAkUGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZCAgID0+ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPyAxIDogMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnQWRkJyAmJiAkRW50cnktPlswXSA9fiAvXlVzZXJDdXN0b21lcklEJC9pICkgewoKICAgICAgICAgICAgIyBVc2UgQ3VzdG9tZXJJRCBwYXJhbSBpZiBjYWxsZWQgZnJvbSBDSUMuCiAgICAgICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJFBhcmFte0N1c3RvbWVySUR9IHx8ICcnOwogICAgICAgIH0KIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIEJ1aWxkIHRoZSBncm91cCBmaWVsZC4KICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzBdID1+IC9eVXNlckdyb3VwSUQkL2kgKSB7CiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHRoZSBwZXJtaXNzaW9uIHRvIHNlZS9jaGFuZ2UgdGhlIG11bHRpdGVuYW5jeSBmaWVsZC4KICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNdWx0aXRlbmFuY3lQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAjIEJ1aWxkIHRoZSBmaWVsZC4KICAgICAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnICksCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZCAgICAgPT4gJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA/IDEgOiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgZm9ybSBvcHRpb24KICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSAmJiAkUGFyYW17VHlwZX0gZXEgJ2hpZGRlbicgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcmVmZXJlbmNlc30gLj0gJFBhcmFte1ZhbHVlfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJlZmVyZW5jZXNHZW5lcmljJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpYyRCbG9jayIsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBJdGVtICAgICAgICAgPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgIEludmFsaWRGaWVsZCA9PiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCB0aGUgY29ycmVjdCBjbGllbnQgc2lkZSBlcnJvciBtc2cKICAgICAgICAgICAgaWYgKCAkQmxvY2sgZXEgJ0lucHV0JyAmJiAkRW50cnktPlswXSBlcSAnVXNlckVtYWlsJyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzVXNlckVtYWlsRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBOYW1lID0+ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljRXJyb3JNc2ciLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBOYW1lID0+ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCB0aGUgY29ycmVjdCBzZXJ2ZXIgZXJyb3IgbXNnCiAgICAgICAgICAgIGlmICggJEJsb2NrIGVxICdJbnB1dCcgJiYgJFBhcmFte1VzZXJFbWFpbH0gJiYgJEVudHJ5LT5bMF0gZXEgJ1VzZXJFbWFpbCcgKSB7CgogICAgICAgICAgICAgICAgIyBkaXNwbGF5IHNlcnZlciBlcnJvciBtc2cgYWNjb3JkaW5nIHdpdGggdGhlIG9jY3VycmVkIGVtYWlsIGVycm9yIHR5cGUKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzVXNlckVtYWlsJyAuICggJFBhcmFte0Vycm9yc30tPntFcnJvclR5cGV9IHx8ICcnICksCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IE5hbWUgPT4gJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJQcmVmZXJlbmNlc0dlbmVyaWNTZXJ2ZXJFcnJvck1zZyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IE5hbWUgPT4gJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFByZWZlcmVuY2VzVXNlZCA9ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e0FkbWluU2V0UHJlZmVyZW5jZXN9OwogICAgaWYgKCAoIGRlZmluZWQgJFByZWZlcmVuY2VzVXNlZCAmJiAkUHJlZmVyZW5jZXNVc2VkICE9IDAgKSB8fCAhZGVmaW5lZCAkUHJlZmVyZW5jZXNVc2VkICkgewoKICAgICAgICBteSAlRGF0YTsKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKSB9OwoKICAgICAgICBHUk9VUDoKICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKCiAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKCiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlc0dyb3VwID0gJFByZWZlcmVuY2VzeyRHcm91cH07CgogICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkUHJlZmVyZW5jZXNHcm91cDsKICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiByZWYgJFByZWZlcmVuY2VzR3JvdXAgbmUgJ0hBU0gnOwoKICAgICAgICAgICAgaWYgKCAkRGF0YXsgJFByZWZlcmVuY2VzR3JvdXAtPntQcmlvfSB9ICkgewoKICAgICAgICAgICAgICAgIENPVU5UOgogICAgICAgICAgICAgICAgZm9yICggMSAuLiAxNTEgKSB7CgogICAgICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30rKzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJERhdGF7ICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7ICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30gfSA9ICRHcm91cDsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREYXRheyAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99IH0gPSAkR3JvdXA7CiAgICAgICAgfQoKICAgICAgICAjIHNvcnQKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgJERhdGF7IHNwcmludGYgIiUwN2QiLCAkS2V5IH0gPSAkRGF0YXskS2V5fTsKICAgICAgICAgICAgZGVsZXRlICREYXRheyRLZXl9OwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGVhY2ggcHJlZmVyZW5jZXMgc2V0dGluZwogICAgICAgIFBSSU86CiAgICAgICAgZm9yIG15ICRQcmlvICggc29ydCBrZXlzICVEYXRhICkgewoKICAgICAgICAgICAgbXkgJEdyb3VwID0gJERhdGF7JFByaW99OwogICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT57Q3VzdG9tZXJQcmVmZXJlbmNlc0dyb3Vwc30tPnskR3JvdXB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBQUklPOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlUHJlZmVyZW5jZSA9ICV7ICRDb25maWdPYmplY3QtPntDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzfS0+eyRHcm91cH0gfTsKICAgICAgICAgICAgaWYgKCAkR3JvdXAgZXEgJ1Bhc3N3b3JkJyApIHsKICAgICAgICAgICAgICAgIG5leHQgUFJJTzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNle01vZHVsZX0gfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpDdXN0b21lclByZWZlcmVuY2VzR2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiBcJVByZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgICAgVXNlck9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyksCiAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgVXNlckRhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkUGFyYW1JdGVtLT57RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByZWYgJFByZWZlcmVuY2V7RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVCdWlsZFNlbGVjdGlvblBhcmFtcyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHJlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRCdWlsZFNlbGVjdGlvblBhcmFtc3tDbGFzc30gPSBqb2luKCAnICcsICRCdWlsZFNlbGVjdGlvblBhcmFtc3tDbGFzc30gLy8gJycsICdNb2Rlcm5pemUnICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtSXRlbS0+e09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQnVpbGRTZWxlY3Rpb25QYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXtCbG9ja30gfHwgJ09wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQcmVmZXJlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXYnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtOYXZ9LAogICAgKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lclVzZXInLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIF9FZmZlY3RpdmVQZXJtaXNzaW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb25seSBpZiBjdXN0b21lciBncm91cCBmZWF0dXJlIGlzIGFjdGl2ZQogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDdXN0b21lckdyb3VwU3VwcG9ydCcpICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDdXN0b21lckdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKCiAgICAjIHNob3cgdGFibGVzCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdFZmZlY3RpdmVQZXJtaXNzaW9ucycsCiAgICApOwoKICAgIG15ICVHcm91cHM7CiAgICBteSAlUGVybWlzc2lvbnM7CgogICAgIyBnbyB0aHJvdWdoIHBlcm1pc3Npb24gdHlwZXMKICAgIG15IEBUeXBlcyA9IEB7ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtOjpDdXN0b21lcjo6UGVybWlzc2lvbicpIH07CiAgICBmb3IgbXkgJFR5cGUgKEBUeXBlcykgewoKICAgICAgICAjIHNob3cgaGVhZGVyCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gIkhlYWRlckdyb3VwUGVybWlzc2lvblR5cGUiLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZ3JvdXBzIG9mIHRoZSB1c2VyCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkUGFyYW17SUR9LAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICBSYXdQZXJtaXNzaW9ucyA9PiAwLCAgICAgICAgICAgICMgZ2V0IGVmZmVjdGl2ZSBwZXJtaXNzaW9ucwogICAgICAgICk7CgogICAgICAgICMgc3RvcmUgZGF0YSBpbiBsb29rdXAgaGFzaGVzCiAgICAgICAgZm9yIG15ICRHcm91cElEICggc29ydCBrZXlzICVVc2VyR3JvdXBzICkgewogICAgICAgICAgICAkR3JvdXBzeyRHcm91cElEfSA9ICRVc2VyR3JvdXBzeyRHcm91cElEfTsKICAgICAgICAgICAgJFBlcm1pc3Npb25zeyRHcm91cElEfXskVHlwZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgbWVzc2FnZSBpZiBubyBwZXJtaXNzaW9ucyBmb3VuZAogICAgaWYgKCAhJVBlcm1pc3Npb25zICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0dyb3VwUGVybWlzc2lvbnNGb3VuZE1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdvIHRocm91Z2ggZ3JvdXBzLCBzb3J0IGJ5IG5hbWUKICAgIGVsc2UgewogICAgICAgIGZvciBteSAkR3JvdXBJRCAoIHNvcnQgeyB1YyggJEdyb3Vwc3skYX0gKSBjbXAgdWMoICRHcm91cHN7JGJ9ICkgfSBrZXlzICVHcm91cHMgKSB7CgogICAgICAgICAgICAjIHNob3cgdGFibGUgcm93cwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwUGVybWlzc2lvblRhYmxlUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIElEICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkR3JvdXBzeyRHcm91cElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgcGVybWlzc2lvbiBtYXJrcwogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKEBUeXBlcykgewogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25NYXJrID0gJFBlcm1pc3Npb25zeyRHcm91cElEfXskVHlwZX0gPyAnT24nICAgICAgICA6ICdPZmYnOwogICAgICAgICAgICAgICAgbXkgJEhpZ2hsaWdodE1hcmsgID0gJFR5cGUgZXEgJ3J3JyAgICAgICAgICAgICAgICAgPyAnSGlnaGxpZ2h0JyA6ICcnOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnR3JvdXBQZXJtaXNzaW9uTWFyaycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnR3JvdXBQZXJtaXNzaW9uTWFyaycgLiAkUGVybWlzc2lvbk1hcmssCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCA9PiAkSGlnaGxpZ2h0TWFyaywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhbGwgYWNjZXNzaWJsZSBjdXN0b21lcnMgb2YgdGhlIHVzZXIKICAgIG15ICVDdXN0b21lcnMgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDb250ZXh0Q3VzdG9tZXJzKAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtJRH0sCiAgICApOwoKICAgICMgc2hvdyBtZXNzYWdlIGlmIG5vIGN1c3RvbWVycyBmb3VuZAogICAgaWYgKCAhJUN1c3RvbWVycyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9DdXN0b21lckFjY2Vzc0ZvdW5kTXNnJywKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IHBlcm1pc3Npb24gY29udGV4dHMKICAgIG15ICRDb250ZXh0Q29uZmlnICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyR3JvdXBQZXJtaXNzaW9uQ29udGV4dCcpOwogICAgbXkgJERpcmVjdEFjY2Vzc0NvbnRleHRLZXkgICA9ICcwMDEtQ3VzdG9tZXJJRC1zYW1lJzsKICAgIG15ICRJbmRpcmVjdEFjY2Vzc0NvbnRleHRLZXkgPSAnMTAwLUN1c3RvbWVySUQtb3RoZXInOwoKICAgICMgdXNlIGRlZmF1bHQgY29udGV4dCBpZiBub25lIGFyZSBmb3VuZAogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJENvbnRleHRDb25maWcpICkgewogICAgICAgICRDb250ZXh0Q29uZmlnID0gewogICAgICAgICAgICAkRGlyZWN0QWNjZXNzQ29udGV4dEtleSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnU2FtZSBDdXN0b21lcicpLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGRlZmF1bHQgYW5kIGV4dHJhIGNvbnRleHQgaGVhZGVycyBpZiBhdmFpbGFibGUKICAgIGlmICggJENvbnRleHRDb25maWctPnskRGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckN1c3RvbWVyQWNjZXNzQ29udGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0RpcmVjdCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JEluZGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckN1c3RvbWVyQWNjZXNzQ29udGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0luZGlyZWN0JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRldGVybWluZSBjdXN0b21lcnMgZm9yIGRpcmVjdCBhbmQgaW5kaXJlY3QgYWNjZXNzCiAgICBteSBAVXNlckN1c3RvbWVySURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lcklEcygKICAgICAgICBVc2VyID0+ICRQYXJhbXtJRH0sCiAgICApOwogICAgbXkgJUV4dHJhQ3VzdG9tZXJJRHM7CiAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JEluZGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgbXkgJEV4dHJhQ29udGV4dE5hbWUgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDb250ZXh0TmFtZUdldCgKICAgICAgICAgICAgU3lzQ29uZmlnTmFtZSA9PiAkSW5kaXJlY3RBY2Nlc3NDb250ZXh0S2V5LAogICAgICAgICk7CgogICAgICAgICMgZm9yIGFsbCBDdXN0b21lcklEcyBnZXQgZ3JvdXBzIHdpdGggZXh0cmEgYWNjZXNzCiAgICAgICAgbXkgJUV4dHJhUGVybWlzc2lvbkdyb3VwczsKICAgICAgICBDVVNUT01FUklEOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoQFVzZXJDdXN0b21lcklEcykgewogICAgICAgICAgICBteSAlR3JvdXBMaXN0ID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ3VzdG9tZXJMaXN0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIENvbnRleHQgICAgPT4gJEV4dHJhQ29udGV4dE5hbWUsCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBDVVNUT01FUklEIGlmICElR3JvdXBMaXN0OwoKICAgICAgICAgICAgIyBhZGQgdG8gZ3JvdXBzCiAgICAgICAgICAgICVFeHRyYVBlcm1pc3Npb25Hcm91cHMgPSAoCiAgICAgICAgICAgICAgICAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzLAogICAgICAgICAgICAgICAgJUdyb3VwTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGFsbCB1bmlxdWUgYWNjZXNzaWJsZSBHcm91cDwtPkN1c3RvbWVyIGNvbWJpbmF0aW9ucwogICAgICAgIEdST1VQSUQ6CiAgICAgICAgZm9yIG15ICRHcm91cElEICggc29ydCBrZXlzICVFeHRyYVBlcm1pc3Npb25Hcm91cHMgKSB7CiAgICAgICAgICAgIG15IEBHcm91cEN1c3RvbWVySURzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ3VzdG9tZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0lEJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBHUk9VUElEIGlmICFAR3JvdXBDdXN0b21lcklEczsKCiAgICAgICAgICAgICMgYWRkIHRvIEV4dHJhQ3VzdG9tZXJJRHMKICAgICAgICAgICAgJUV4dHJhQ3VzdG9tZXJJRHMgPSAoCiAgICAgICAgICAgICAgICAlRXh0cmFDdXN0b21lcklEcywKICAgICAgICAgICAgICAgIG1hcCB7ICRfID0+IDEgfSBAR3JvdXBDdXN0b21lcklEcywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnbyB0aHJvdWdoIGN1c3RvbWVycwogICAgQ1VTVE9NRVJJRDoKICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJzICkgewoKICAgICAgICAjIHNob3cgdGFibGUgcm93cwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckFjY2Vzc1RhYmxlUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBJRCAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICAgICAgTmFtZSA9PiAkQ3VzdG9tZXJzeyRDdXN0b21lcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjICdTYW1lIEN1c3RvbWVyJwogICAgICAgIGlmICggJENvbnRleHRDb25maWctPnskRGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHdlIHNob3VsZCBzaG93IGNoZWNrIG1hcmsgZm9yICdTYW1lIEN1c3RvbWVyJwogICAgICAgICAgICBteSAkQWNjZXNzTWFyayA9ICggZ3JlcCB7ICRfIGVxICRDdXN0b21lcklEIH0gQFVzZXJDdXN0b21lcklEcyApID8gJ09uJyA6ICdPZmYnOwoKICAgICAgICAgICAgIyBzaG93IGJsb2NrcwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJBY2Nlc3NNYXJrJyAuICRBY2Nlc3NNYXJrLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyAnT3RoZXIgQ3VzdG9tZXJzJwogICAgICAgIG5leHQgQ1VTVE9NRVJJRCBpZiAhJENvbnRleHRDb25maWctPnskSW5kaXJlY3RBY2Nlc3NDb250ZXh0S2V5fTsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBzaG91bGQgc2hvdyBjaGVjayBtYXJrIGZvciAnT3RoZXIgQ3VzdG9tZXJzJwogICAgICAgIG15ICRBY2Nlc3NNYXJrID0gJEV4dHJhQ3VzdG9tZXJJRHN7JEN1c3RvbWVySUR9ID8gJ09uJyA6ICdPZmYnOwoKICAgICAgICAjIHNob3cgYmxvY2tzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJBY2Nlc3NNYXJrJyAuICRBY2Nlc3NNYXJrLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/CustomerCompany/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhYjc4ZTcwMDdjMzI3Y2I3MDcwMmVmZjJmYTNiNjY1YWQ5ZTcxZmMyIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OjpEQjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OkNvbmZpZycsCiMgRU8gUm90aGVyIE9TUwogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IGN1c3RvbWVyIGNvbXBhbnkgbWFwCiAgICAjIGFjdHVhbGx5IHRoZSBwYXJhbWV0ZXIgQ3VzdG9tZXJDb21wYW55TWFwIGluY2x1ZGVzIHRoZSBjb21wbGV0ZSBjb25maWcgb2YgdGhlIGJhY2tlbmQKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfSA9ICRQYXJhbXtDdXN0b21lckNvbXBhbnlNYXB9IHx8IGRpZSAiR290IG5vIEN1c3RvbWVyQ29tcGFueU1hcCEiOwoKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e1RhYmxlfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPlBhcmFtcy0+VGFibGUgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPkN1c3RvbWVyQ29tcGFueUtleSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVZhbGlkfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlWYWxpZCd9OwogICAgJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9ICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPnsnQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdExpbWl0J30gfHwgNTAwMDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hQcmVmaXgnfTsKCiAgICBpZiAoICFkZWZpbmVkKCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gPSAnJzsKICAgIH0KICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hTdWZmaXgnfTsKICAgIGlmICggIWRlZmluZWQoICRTZWxmLT57U2VhcmNoU3VmZml4fSApICkgewogICAgICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICcqJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgJFNlbGYtPntDYWNoZVR5cGV9ICAgPSAnQ3VzdG9tZXJDb21wYW55JyAuICRQYXJhbXtDb3VudH07CiAgICAgICAgJFNlbGYtPntDYWNoZVRUTH0gICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0gfHwgMDsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgZGIgY29ubmVjdCBpZiBEU04gaXMgZ2l2ZW4KICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e0RTTn0gKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICAgICAgRGF0YWJhc2VEU04gICAgICAgICAgICAgPT4gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e0RTTn0sCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntBdHRyaWJ1dGV9LAogICAgICAgICAgICBEYXRhYmFzZVVzZXIgICAgICAgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57VXNlcn0sCiAgICAgICAgICAgIERhdGFiYXNlUHcgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntQYXNzd29yZH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntUeXBlfSB8fCAnJywKICAgICAgICAgICAgRGlzY29ubmVjdE9uRGVzdHJ1Y3Rpb24gPT4gMSwKICAgICAgICApIHx8IGRpZSgnQ2FuXCd0IGNvbm5lY3QgdG8gZGF0YWJhc2UhJyk7CgogICAgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHRoZSBEQk9iamVjdCBub3QgZnJvbSBwYXJlbnQgY2FsbAogICAgICAgICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ID0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICB9CgogICAgIyB0aGlzIHNldHRpbmcgc3BlY2lmaWVzIGlmIHRoZSB0YWJsZSBoYXMgdGhlIGNyZWF0ZV90aW1lLAogICAgIyBjcmVhdGVfYnksIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkgZmllbGRzIG9mIE9UT0JPCiAgICAkU2VsZi0+e0ZvcmVpZ25EQn0gPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57Rm9yZWlnbkRCfSA/IDEgOiAwOwoKICAgICMgZGVmaW5lcyBpZiB0aGUgZGF0YWJhc2Ugc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVuZCBjYXNlIHNlbnNpdGl2ZSAoMSkgb3Igbm90ICgwKQogICAgJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntTZWFyY2hDYXNlU2Vuc2l0aXZlfQogICAgICAgIC8vICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntDYXNlU2Vuc2l0aXZlfSB8fCAwOwoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIHNvcnQga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoICEkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQoICRQYXJhbXtWYWxpZH0gKSApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gLy8gJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9OwoKICAgIG15ICRDYWNoZVR5cGU7CiAgICBteSAkQ2FjaGVLZXk7CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgJENhY2hlVHlwZSA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJDb21wYW55TGlzdCc7CiAgICAgICAgJENhY2hlS2V5ICA9ICJDdXN0b21lckNvbXBhbnlMaXN0Ojoke1ZhbGlkfTo6JHtMaW1pdH06OiIgLiAoICRQYXJhbXtTZWFyY2h9IHx8ICcnICk7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBVc2UgY2FjaGUgZm9yIG11bHRpdGVuYW5jeS4KICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JERhdGF9IGlmIHJlZiAkRGF0YSBlcSAnSEFTSCc7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHMgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkcykgKSB7CiAgICAgICAgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHMgPSBbICdjdXN0b21lcl9pZCcsICduYW1lJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKCiAgICAjIHdoYXQgaXMgdGhlIHJlc3VsdAogICAgbXkgJFdoYXQgPSBqb2luKAogICAgICAgICcsICcsCiAgICAgICAgQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcwogICAgKTsKCiAgICAjIGFkZCB2YWxpZCBvcHRpb24gaWYgcmVxdWlyZWQKICAgIG15ICRTUUw7CiAgICBteSBAQmluZDsKICAgIG15IEBDb25kaXRpb25zOwoKICAgIGlmICggJFZhbGlkICYmICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VmFsaWR9ICkgewoKICAgICAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55VmFsaWR9IElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSI7CiAgICB9CgogICAgIyB3aGVyZQogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcwogICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBteSAlUXVlcnlDb25kaXRpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gXEBDdXN0b21lckNvbXBhbnlTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFNlYXJjaFByZWZpeCAgPT4gJFNlbGYtPntTZWFyY2hQcmVmaXh9LAogICAgICAgICAgICBTZWFyY2hTdWZmaXggID0+ICRTZWxmLT57U2VhcmNoU3VmZml4fSwKICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZSA9PiAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9LAogICAgICAgICAgICBCaW5kTW9kZSAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUXVlcnlDb25kaXRpb257U1FMfSApIHsKICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAkUXVlcnlDb25kaXRpb257U1FMfSI7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsICAgICAgIEB7ICRRdWVyeUNvbmRpdGlvbntWYWx1ZXN9IH07CiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIERvbid0IHNlYXJjaCBmb3IgY3VzdG9tZXIgd2l0aG91dCBncm91cCBwZXJtaXNzaW9uLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICAgICAjIEdldCB0aGUgY29sdW1uIG5hbWUgd2hlcmUgdGhlIGdyb3VwIElEIGlzIHN0b3JlZC4KICAgICAgICAgICAgbXkgJEdyb3VwSURDb2w7CiAgICAgICAgICAgIGZvciBteSAkTWFwICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTWFwLT5bMF0gZXEgJ1VzZXJHcm91cElEJyApIHsKICAgICAgICAgICAgICAgICAgICAkR3JvdXBJRENvbCA9ICRNYXAtPlsyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRHcm91cElEQ29sKSB7CiAgICAgICAgICAgICAgICBteSBAVXNlckdyb3VwSURzID0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07ICAjIE5vdCBzYXZpbmcgdGhpcyBpbiBhbiBhcnJheSBjYW4gY2F1c2UgYW4gdW5rb3duIGVycm9yIGluIGEgbGF0ZXIgaXRlcmF0aW9uLgogICAgICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSURzIG9yIG5hbWVzIHNob3VsZCBiZSBjaGVja2VkLgogICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cE5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkVXNlckdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJHcm91cElEID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb2NhbEdyb3VwID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSUQgZXEgJExvY2FsR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlckdyb3VwSUQgPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEluQ29uZGl0aW9uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdyb3VwSURDb2wsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVzICAgPT4gXEBVc2VyR3JvdXBJRHMsCiAgICAgICAgICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEluQ29uZGl0aW9uIC49ICIgT1IgKCRHcm91cElEQ29sIElTIE5VTEwgT1IgJEdyb3VwSURDb2wgPSAnJykiOwogICAgICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAoJEluQ29uZGl0aW9uKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFuZGxpbmcKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwogICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgbXkgQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNEeW5hbWljRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKCiAgICAjIHNxbAogICAgbXkgJENvbXBsZXRlU1FMID0gIlNFTEVDVCAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0sICRXaGF0IEZST00gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0iOwoKICAgIGlmIChAQ29uZGl0aW9ucykgewogICAgICAgICRTUUwgPSBqb2luKCAnIEFORCAnLCBAQ29uZGl0aW9ucyApOwogICAgICAgICRDb21wbGV0ZVNRTCAuPSAiIFdIRVJFICRTUUwiOwogICAgfQoKICAgICMgZ2V0IGRhdGEgZnJvbSBjdXN0b21lciBjb21wYW55IHRhYmxlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkQ29tcGxldGVTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+ICRMaW1pdCwKICAgICk7CgogICAgbXkgQEN1c3RvbWVyQ29tcGFueURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVyQ29tcGFueURhdGEsIFtAUm93XTsKICAgIH0KCiAgICBteSAlTGlzdDsKCiAgICBDVVNUT01FUkNPTVBBTllEQVRBOgogICAgZm9yIG15ICRDdXN0b21lckNvbXBhbnlEYXRhIChAQ3VzdG9tZXJDb21wYW55RGF0YSkgewogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlJRCA9IHNoaWZ0IEB7JEN1c3RvbWVyQ29tcGFueURhdGF9OwogICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZREFUQSBpZiAkTGlzdHskQ3VzdG9tZXJDb21wYW55SUR9OwoKICAgICAgICBteSAlQ29tcGFueVN0cmluZ1BhcnRzOwoKICAgICAgICBteSAkRmllbGRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJDb21wYW55RGF0YX0gKSB7CiAgICAgICAgICAgICRDb21wYW55U3RyaW5nUGFydHN7ICRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHNbJEZpZWxkQ291bnRlcl0gfSA9ICRGaWVsZDsKICAgICAgICAgICAgJEZpZWxkQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgICAgIGlmIChAQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxETkFNRToKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lIChAQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhZXhpc3RzICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgICAgICAgICAgVkFMVUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBteSAkUmVhZGFibGVWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkUmVhZGFibGVWYWx1ZSkgfHwgIWRlZmluZWQgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9ID0gJFBvc3NpYmxlVmFsdWVzLT57ICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJENvbXBhbnlTdHJpbmdQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhc3NlbWJsZSBjb21wYW55IHN0cmluZwogICAgICAgIG15IEBDb21wYW55U3RyaW5nUGFydHM7CiAgICAgICAgQ1VTVE9NRVJDT01QQU5ZTElTVEZJRUxEOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkICggQHskQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc30gKSB7CiAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZTElTVEZJRUxECiAgICAgICAgICAgICAgICBpZiAhZXhpc3RzICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFkZWZpbmVkICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFsZW5ndGggJENvbXBhbnlTdHJpbmdQYXJ0c3skQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkfTsKICAgICAgICAgICAgcHVzaCBAQ29tcGFueVN0cmluZ1BhcnRzLCAkQ29tcGFueVN0cmluZ1BhcnRzeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGR9OwogICAgICAgIH0KCiAgICAgICAgJExpc3R7JEN1c3RvbWVyQ29tcGFueUlEfSA9IGpvaW4gJyAnLCBAQ29tcGFueVN0cmluZ1BhcnRzOwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlTGlzdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJUxpc3Q7Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRmllbGRzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFZhbGlkID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CgogICAgJFBhcmFte0xpbWl0fSAvLz0gJyc7CgogICAgIyBTcGxpdCB0aGUgc2VhcmNoIGZpZWxkcyBpbiBzY2FsYXIgYW5kIGFycmF5IGZpZWxkcy4KICAgIG15IEBTY2FsYXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgJ0lucHV0JyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKICAgIG15IEBBcnJheVNlYXJjaEZpZWxkcyAgPSBncmVwIHsgJ1NlbGVjdGlvbicgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgIyBWZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZi4KICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQtPntOYW1lfSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgbXkgJFJlc3VsdCA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CgogICAgIyBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgICMgSWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICcnOwoKICAgICAgICAjIERlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbXTsKICAgIH0KCiAgICAjIERlZmluZSBvcmRlciB0YWJsZSBmcm9tIHRoZSBzZWFyY2ggZmllbGRzLgogICAgbXkgJU9yZGVyQnlUYWJsZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntEYXRhYmFzZUZpZWxkfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgZm9yIG15ICRGaWVsZCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CgogICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRGaWVsZC0+e1NlbGVjdGlvbnNEYXRhfTsKCiAgICAgICAgZm9yIG15ICRTZWxlY3RlZFZhbHVlICggQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBzZWxlY3RlZCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICAgIGlmICggISRTZWxlY3Rpb25zRGF0YS0+eyRTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzZWxlY3RlZCB2YWx1ZSAkRmllbGQtPntOYW1lfSBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJFNlbGYtPntEQk9iamVjdH07CgogICAgIyBBc3NlbWJsZSB0aGUgY29uZGl0aW9ucyB1c2VkIGluIHRoZSBXSEVSRSBjbGF1c2UuCiAgICBteSBAU1FMV2hlcmU7CgogICAgZm9yIG15ICRGaWVsZCAoQFNjYWxhclNlYXJjaEZpZWxkcykgewoKICAgICAgICAjIFNlYXJjaCBmb3Igc2NhbGFyIGZpZWxkcyAod2lsZGNhcmRzIGFyZSBhbGxvd2VkKS4KICAgICAgICBpZiAoICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICMgR2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkuCiAgICAgICAgICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0sICdMaWtlJyApOwoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICAgICAgICAgICMgSWYgdGhlIGZpZWxkIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmx5ICclJy4KICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gIX4gbXsgXEEgJSogXHogfXhtcyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgICAgICJMT1dFUigkRmllbGQtPntEYXRhYmFzZUZpZWxkfSkgTElLRSBMT1dFUignJFBhcmFteyAkRmllbGQtPntOYW1lfSB9JykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZHluYW1pYyBmaWVsZCBoYW5kbGluZwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICBteSAkU1FMRHluYW1pY0ZpZWxkRnJvbSAgICAgPSAnJzsKICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZSAgICA9ICcnOwogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyID0gMTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9ICkgewoKICAgICAgICBteSAkU2VhcmNoUGFyYW0gPSAkUGFyYW17ICJEeW5hbWljRmllbGRfIiAuICREeW5hbWljRmllbGQtPntOYW1lfSB9OwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoIHJlZiAkU2VhcmNoUGFyYW0gbmUgJ0hBU0gnICk7CgogICAgICAgIG15ICROZWVkSm9pbjsKCiAgICAgICAgZm9yIG15ICRPcGVyYXRvciAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbX0gKSB7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyc7CiAgICAgICAgICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgQU5EICgnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyAoJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBURVhUOgogICAgICAgICAgICBmb3IgbXkgJFRleHQgKEBTZWFyY2hQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0IGVxICcnICk7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAnKicuCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0gfHwgMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsaWRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB2YWx1ZSAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkVGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyBvbiBmaWVsZCAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVGFibGVBbGlhcyAgICAgICAgID0+ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybSAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnKSAnOwoKICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgLj0gJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkRnJvbSAuPSAiCiAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGRmX29ial9pZF9uYW1lLm9iamVjdF9pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIKICAgICAgICAgICAgICAgIC4gJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKQogICAgICAgICAgICAiOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgRXhlY3V0ZSBhIGR5bmFtaWMgZmllbGQgc2VhcmNoLCBpZiBhIGR5bmFtaWMgZmllbGQgd2hlcmUgc3RhdGVtZW50IGV4aXN0cy4KICAgIGlmICggJFNRTER5bmFtaWNGaWVsZEZyb20gJiYgJFNRTER5bmFtaWNGaWVsZFdoZXJlICkgewoKICAgICAgICBteSBARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHM7CgogICAgICAgICMgU3FsIHVlcnkgZm9yIHRoZSBkeW5hbWljIGZpZWxkcy4KICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkID0gIlNFTEVDVCBESVNUSU5DVChkZl9vYmpfaWRfbmFtZS5vYmplY3RfbmFtZSkgRlJPTSBkeW5hbWljX2ZpZWxkX29ial9pZF9uYW1lIGRmX29ial9pZF9uYW1lICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkRnJvbQogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKCiAgICAgICAgbXkgJFVzZWRDYWNoZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMgPSBAeyREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGF9OwoKICAgICAgICAgICAgICAgICAgICAjIFNldCB0aGUgdXNlZCBjYWNoZSBmbGFnLgogICAgICAgICAgICAgICAgICAgICRVc2VkQ2FjaGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBkYXRhIG9ubHkgZnJvbSBkYXRhYmFzZSwgaWYgbm8gY2FjaGUgZW50cnkgZXhpc3RzLgogICAgICAgIGlmICggISRVc2VkQ2FjaGUgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRDdXN0b21lcklEcywgJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBEeW5hbWljRmllbGRDdXN0b21lcklEcywKICAgICAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFkZCB0aGUgdXNlciBsb2dpbnMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZHMsIGlmIGEgc2VhcmNoIHJlc3VsdCBleGlzdHMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZCBzZWFyY2gKICAgICAgICAjICAgb3Igc2tpcCB0aGUgc2VhcmNoIGFuZCByZXR1cm4gYSBlbXB0cnkgYXJyYXkgcmVmIChvciB6ZXJvIGZvciB0aGUgcmVzdWx0ICdDT1VOVCcsIGlmIG5vIHVzZXIgbG9naW5zIGV4aXN0cwogICAgICAgICMgICBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaC4KICAgICAgICBpZiAoQER5bmFtaWNGaWVsZEN1c3RvbWVySURzKSB7CgogICAgICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlcyAgID0+IFxARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRSZXN1bHQgZXEgJ0NPVU5UJyA/IDAgOiBbXTsKICAgICAgICB9CiAgICB9CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH07CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICA9PiAkRmllbGQtPntEYXRhYmFzZUZpZWxkfSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFteyAkRmllbGQtPntOYW1lfSB9LAogICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAkU1FMUXVlcnlJbkNvbmRpdGlvbjsKICAgIH0KCiAgICAjIEFkZCB0aGUgdmFsaWQgb3B0aW9uIGlmIG5lZWRlZC4KICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJWYWxpZH0gJiYgJFZhbGlkICkgewoKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICIkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lclZhbGlkfSBJTiAoIiAuIGpvaW4oICcsICcsICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKSApIC4gIikgIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnkgY29udGFpbnMgb25seSB1bmlxdWUgdmFsaWQgdmFsdWVzLgogICAgbXkgJU9yZGVyQnlTZWVuOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIGlmICggISRPcmRlckJ5IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeSBjb250YWlucyBpbnZhbGlkIHZhbHVlICckT3JkZXJCeScgIgogICAgICAgICAgICAgICAgICAgIC4gJ29yIHRoZSB2YWx1ZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgUmVtZW1iZXIgdGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0IGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UuCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBDaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicuCiAgICBESVJFQ1RJT046CiAgICBmb3IgbXkgJERpcmVjdGlvbiAoIEB7ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAjIE9ubHkgJ1VwJyBvciAnRG93bicgYWxsb3dlZC4KICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQnVpbGQgdGhlIHNxbCBzdGF0ZW1lbnQgZm9yIHRoZSBzZWFyY2guCiAgICBteSAkU1FMID0gIlNFTEVDVCBESVNUSU5DVCgkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0pIjsKCiAgICAjIE1vZGlmeSBTUUwgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRTUUwgPSAiU0VMRUNUIENPVU5UKERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSkpIjsKICAgIH0KCiAgICBteSBAU1FMT3JkZXJCeTsKCiAgICAjIFRoZSBPcmRlciBieSBjbGF1c2UgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHJlc3VsdCB0eXBlICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgbmUgJ0NPVU5UJyApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKCiAgICAgICAgT1JERVJCWToKICAgICAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgICAgICMgU2V0IHRoZSBkZWZhdWx0IG9yZGVyIGRpcmVjdGlvbi4KICAgICAgICAgICAgbXkgJERpcmVjdGlvbiA9ICdERVNDJzsKCiAgICAgICAgICAgICMgQWRkIHRoZSBnaXZlbiBvcmRlciBkaXJlY3Rpb24uCiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnQVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdERVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENvdW50Kys7CgogICAgICAgICAgICBuZXh0IE9SREVSQlkgaWYgISRPcmRlckJ5VGFibGV7JE9yZGVyQnl9OwoKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7JE9yZGVyQnl9ICREaXJlY3Rpb24iOwoKICAgICAgICAgICAgbmV4dCBPUkRFUkJZIGlmICRPcmRlckJ5IGVxICdDdXN0b21lcklEJzsKCiAgICAgICAgICAgICRTUUwgLj0gIiwgJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0iOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAgICAgIyAgIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkLgogICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAnQ3VzdG9tZXJJRCcgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0gREVTQyI7CiAgICAgICAgfQogICAgfQoKICAgICMgQWRkIGZvcm0gdG8gdGhlIFNRTCBhZnRlciB0aGUgb3JkZXIgYnkgY3JlYXRpb24uCiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSAiOwoKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICBteSAkU1FMV2hlcmVTdHJpbmcgPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxXaGVyZTsKICAgICAgICAkU1FMIC49ICJXSEVSRSAkU1FMV2hlcmVTdHJpbmcgIjsKICAgIH0KCiAgICBpZiAoQFNRTE9yZGVyQnkpIHsKICAgICAgICBteSAkT3JkZXJCeVN0cmluZyA9IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAiT1JERVIgQlkgJE9yZGVyQnlTdHJpbmciOwogICAgfQoKICAgICMgQ2hlY2sgaWYgYSBjYWNoZSBleGlzdHMgYmVmb3JlIHdlIGFzayB0aGUgZGF0YWJhc2UuCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICBteSAkQ2FjaGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgIEtleSAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZURhdGEgKSB7CiAgICAgICAgICAgIGlmICggcmVmICRDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRDYWNoZURhdGEgZXEgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIEhhbmRsZSB0aGUgZGlmZnJlbnQgcmVzdWx0IHR5cGVzLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRJRHNbMF0sCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkSURzWzBdOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQElEcywKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9CgpzdWIgQ3VzdG9tZXJDb21wYW55R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskRGF0YX0gaWYgcmVmICREYXRhIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGJ1aWxkIHNlbGVjdAogICAgbXkgQEZpZWxkczsKICAgIG15ICVGaWVsZHNNYXA7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgIHB1c2ggQEZpZWxkcywgJEVudHJ5LT5bMl07CiAgICAgICAgJEZpZWxkc01hcHsgJEVudHJ5LT5bMl0gfSA9ICRFbnRyeS0+WzBdOwogICAgfQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgJyAuIGpvaW4oICcsICcsIEBGaWVsZHMgKTsKCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAiLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IjsKICAgIH0KCiAgICAjIHRoaXMgc2VlbXMgdG8gYmUgbGVnYWN5LCBpZiBOYW1lIGlzIHBhc3NlZCBpdCBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgQ3VzdG9tZXJJRAogICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW17TmFtZX0gfHwgJFBhcmFte0N1c3RvbWVySUR9OwoKICAgICRTUUwgLj0gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9IFdIRVJFICI7CgogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSA9IExPV0VSKCA/ICkiOwogICAgfQoKICAgICMgZ2V0IGluaXRpYWwgZGF0YQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkQ3VzdG9tZXJJRCBdCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkTWFwQ291bnRlciA9IDA7CgogICAgICAgIGZvciBteSAkRmllbGQgKEBGaWVsZHMpIHsKICAgICAgICAgICAgJERhdGF7ICRGaWVsZHNNYXB7JEZpZWxkfSB9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBuZXh0IFJPVyBpZiAkU2VsZi0+e0ZvcmVpZ25EQn07CgogICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpKSB7CiAgICAgICAgICAgICREYXRheyRLZXl9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICAgICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJldHVybiBkYXRhCiAgICByZXR1cm4gKCVEYXRhKTsKfQoKc3ViIEN1c3RvbWVyQ29tcGFueUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lckNvbXBhbnkgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBGaWVsZHM7CiAgICBteSBAUGxhY2Vob2xkZXJzOwogICAgbXkgQFZhbHVlczsKCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgICMgaWdub3JlIGR5bmFtaWMgZmllbGRzIGhlcmUKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgcHVzaCBARmllbGRzLCAgICAgICAkRW50cnktPlsyXTsKICAgICAgICBwdXNoIEBQbGFjZWhvbGRlcnMsICc/JzsKICAgICAgICBwdXNoIEBWYWx1ZXMsICAgICAgIFwkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICB9CiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgcHVzaCBARmllbGRzLCAgICAgICBxdyhjcmVhdGVfdGltZSBjcmVhdGVfYnkgY2hhbmdlX3RpbWUgY2hhbmdlX2J5KTsKICAgICAgICBwdXNoIEBQbGFjZWhvbGRlcnMsIHF3KGN1cnJlbnRfdGltZXN0YW1wID8gY3VycmVudF90aW1lc3RhbXAgPyk7CiAgICAgICAgcHVzaCBAVmFsdWVzLCAoIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9ICk7CiAgICB9CgogICAgIyBidWlsZCBpbnNlcnQKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0gKCI7CiAgICAkU1FMIC49IGpvaW4oICcsICcsIEBGaWVsZHMgKSAuICIgKSBWQUxVRVMgKCAiIC4gam9pbiggJywgJywgQFBsYWNlaG9sZGVycyApIC4gIiApIjsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQFZhbHVlcywKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgIkN1c3RvbWVyQ29tcGFueTogJyRQYXJhbXtDdXN0b21lckNvbXBhbnlOYW1lfS8kUGFyYW17Q3VzdG9tZXJJRH0nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgJFNlbGYtPl9DdXN0b21lckNvbXBhbnlDYWNoZUNsZWFyKCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lcklEfSApOwoKICAgIHJldHVybiAkUGFyYW17Q3VzdG9tZXJJRH07Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBGSUVMRDoKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkUGFyYW17ICRFbnRyeS0+WzBdIH07ICAgICAgICAgICAgICMgd29ycnkgb25seSBhYm91dCBlbXB0eSBmaWVsZHMsICcwJyBpcyBjb25zaWRlcmVkIGFzIGJlaW5nIGVtcHR5CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7ICAgICMgZG8gbm90IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZHluYW1pYyBmaWVsZHMKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRW50cnktPls0XTsgICAgICAgICAgICAgICAgICAgICAgIyBjb21wbGFpbiBvbmx5IGFib3V0IG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPlswXSBlcSAnVXNlclBhc3N3b3JkJzsgICAgICMgZG8gbm90IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgcGFzc3dvcmQgZmllbGQKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRFbnRyeS0+WzBdISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDb2xsZWN0IHRoZSBpbmZvIG5lZWRlZCBmb3IgdGhlIFNRTCBVUERBVEUgc3RhdGVtZW50CiAgICAjIFRoZSByZWFkb25seSBmbGFnIGlzIG5vdCBob25vcmVkIGhlcmUuCiAgICBteSAoIEBGaWVsZHMsIEBWYWx1ZXMgKTsKICAgIEZJRUxEOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICRFbnRyeS0+WzBdID1+IG0vXlVzZXJQYXNzd29yZCQvaTsgICAgIyBza2lwIHRoZSBwYXNzd29yZCBmaWVsZAogICAgICAgIG5leHQgRklFTEQgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAjIHNraXAgZHluYW1pYyBmaWVsZHMKICAgICAgICBwdXNoIEBGaWVsZHMsICRFbnRyeS0+WzJdIC4gJyA9ID8nOwogICAgICAgIHB1c2ggQFZhbHVlcywgXCRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgIH0KICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICBwdXNoIEBGaWVsZHMsICggJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAnLCAnY2hhbmdlX2J5ID0gPycgKTsKICAgICAgICBwdXNoIEBWYWx1ZXMsIFwkUGFyYW17VXNlcklEfTsKICAgIH0KCiAgICAjIGNyZWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gIlVQREFURSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSBTRVQgIjsKICAgICRTUUwgLj0gam9pbiggJywgJywgQEZpZWxkcyApOwoKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIgV0hFUkUgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICIgV0hFUkUgTE9XRVIoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSA9IExPV0VSKCA/ICkiOwogICAgfQogICAgcHVzaCBAVmFsdWVzLCBcJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfTsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQFZhbHVlcywKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgIkN1c3RvbWVyQ29tcGFueTogJyRQYXJhbXtDdXN0b21lckNvbXBhbnlOYW1lfS8kUGFyYW17Q3VzdG9tZXJJRH0nIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgJFNlbGYtPl9DdXN0b21lckNvbXBhbnlDYWNoZUNsZWFyKCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lcklEfSApOwogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9IG5lICRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkU2VsZi0+X0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIoIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q2FjaGVPYmplY3R9OwoKICAgIGlmICggISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggY2FjaGUgZW50cmllcwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueUxpc3QnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uIChxdyhDdXN0b21lckNvbXBhbnlMaXN0KSkgewogICAgICAgIGZvciBteSAkVmFsaWQgKCAwIC4uIDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gIiR7RnVuY3Rpb259Ojoke1ZhbGlkfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGlzY29ubmVjdCBpZiBpdCdzIG5vdCBhIHBhcmVudCBEQk9iamVjdAogICAgaWYgKCAkU2VsZi0+e05vdFBhcmVudERCT2JqZWN0fSApIHsKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RGlzY29ubmVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/CustomerUser/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAxYjgxMThiZmQ0NTBmOTc0NWI5N2YzZGQ0ZWE5Nzk0MjQ5YWFmMGEwIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOjpEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6OlNIQSAoKTsKCiMgQ1BBTiBtb2R1bGVzCnVzZSBDcnlwdDo6UGFzc3dkTUQ1IHF3KGFwYWNoZV9tZDVfY3J5cHQgdW5peF9tZDVfY3J5cHQpOwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIFJvdGhlciBPU1MKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWVPYmplY3ROYW1lJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkTmVlZGVkIChxdyggUHJlZmVyZW5jZXNPYmplY3QgQ3VzdG9tZXJVc2VyTWFwICkpIHsKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9IHx8IGRpZSAiR290IG5vICROZWVkZWQhIjsKICAgIH0KCiAgICAjIG1heCBzaG93biB1c2VyIHBlciBzZWFyY2ggbGlzdAogICAgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0gfHwgMjUwOwoKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57VGFibGV9CiAgICAgICAgfHwgZGllICJOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5UYWJsZSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fQogICAgICAgIHx8ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0tleX0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJVc2VyLT5DdXN0b21lcktleSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVySUR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJJRH0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJVc2VyLT5DdXN0b21lcklEIGluIEtlcm5lbC9Db25maWcucG0hIjsKICAgICRTZWxmLT57UmVhZE9ubHl9ICAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1JlYWRPbmx5fTsKICAgICRTZWxmLT57RXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckV4Y2x1ZGVQcmltYXJ5Q3VzdG9tZXJJRH0gfHwgMDsKICAgICRTZWxmLT57U2VhcmNoUHJlZml4fSAgICAgICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaFByZWZpeH07CgogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ID0gJyc7CiAgICB9CiAgICAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hTdWZmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hTdWZmaXh9ID0gJyonOwogICAgfQoKICAgICMgY2hlY2sgaWYgQ3VzdG9tZXJLZXkgaXMgdmFyIG9yIGludAogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICggJEVudHJ5LT5bMF0gZXEgJ1VzZXJMb2dpbicgJiYgJEVudHJ5LT5bNV0gPX4gL15pbnQkL2kgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q3VzdG9tZXJLZXlJbnRlZ2VyfSA9IDE7CiAgICAgICAgICAgIGxhc3QgRU5UUlk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNhY2hlIHR5cGUKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdDdXN0b21lclVzZXInIC4gJFBhcmFte0NvdW50fTsKCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGRiIGNvbm5lY3QgaWYgRFNOIGlzIGdpdmVuCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntEU059ICkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgICAgIERhdGFiYXNlRFNOICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57RFNOfSwKICAgICAgICAgICAgRGF0YWJhc2VVc2VyID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntVc2VyfSwKICAgICAgICAgICAgRGF0YWJhc2VQdyAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntQYXNzd29yZH0sCiAgICAgICAgICAgICV7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30gfSwKICAgICAgICAgICAgRGlzY29ubmVjdE9uRGVzdHJ1Y3Rpb24gPT4gMSwKICAgICAgICApIHx8IGRpZSgnQ2FuXCd0IGNvbm5lY3QgdG8gZGF0YWJhc2UhJyk7CgogICAgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHRoZSBEQk9iamVjdCBub3QgZnJvbSBwYXJlbnQgY2FsbAogICAgICAgICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ID0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICB9CgogICAgIyB0aGlzIHNldHRpbmcgc3BlY2lmaWVzIGlmIHRoZSB0YWJsZSBoYXMgdGhlIGNyZWF0ZV90aW1lLAogICAgIyBjcmVhdGVfYnksIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkgZmllbGRzIG9mIE9UT0JPCiAgICAkU2VsZi0+e0ZvcmVpZ25EQn0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57Rm9yZWlnbkRCfSA/IDEgOiAwOwoKICAgICMgZGVmaW5lcyBpZiB0aGUgZGF0YWJhc2Ugc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVuZCBjYXNlIHNlbnNpdGl2ZSAoMSkgb3Igbm90ICgwKQogICAgJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTZWFyY2hDYXNlU2Vuc2l0aXZlfQogICAgICAgIC8vICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntDYXNlU2Vuc2l0aXZlfSB8fCAwOwoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIHNvcnQga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBDdXN0b21lck5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJE5hbWUgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJOYW1lOjokUGFyYW17VXNlckxvZ2lufSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE5hbWUgaWYgZGVmaW5lZCAkTmFtZTsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHN9OwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRDdXN0b21lclVzZXJOYW1lRmllbGRzKSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcyA9IFsgJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lclVzZXJOYW1lRmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJOYW1lRmllbGRzfTsKCiAgICAjIGJ1aWxkIFNRTCBzdHJpbmcgMS8yCiAgICBteSAkU1FMID0gIlNFTEVDVCAiOwoKICAgICRTUUwgLj0gam9pbiggIiwgIiwgQEN1c3RvbWVyVXNlck5hbWVGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyApOwogICAgJFNRTCAuPSAiIEZST00gJFNlbGYtPntDdXN0b21lclRhYmxlfSBXSEVSRSAiOwoKICAgICMgY2hlY2sgQ3VzdG9tZXJLZXkgdHlwZQogICAgbXkgJFVzZXJMb2dpbiA9ICRQYXJhbXtVc2VyTG9naW59OwogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVyS2V5fSkgPSBMT1dFUig/KSI7CiAgICB9CgogICAgbXkgJU5hbWVQYXJ0czsKCiAgICAjIGdldCBkYXRhIGZyb20gY3VzdG9tZXIgdXNlciB0YWJsZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtVc2VyTG9naW59IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJEZpZWxkQ291bnRlciA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGZvciBteSAkRmllbGQgKEBSb3cpIHsKICAgICAgICAgICAgJE5hbWVQYXJ0c3sgJEN1c3RvbWVyVXNlck5hbWVGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkc1skRmllbGRDb3VudGVyXSB9ID0gJEZpZWxkOwogICAgICAgICAgICAkRmllbGRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgIG15IEBEeW5hbWljRmllbGRDdXN0b21lclVzZXJOYW1lRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJOYW1lRmllbGRzfTsKICAgIGlmIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgewogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBEWU5BTUlDRklFTEROQU1FOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gWyRWYWx1ZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBSZW5kZXJlZFZhbHVlczsKCiAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIWRlZmluZWQgJEN1cnJlbnRWYWx1ZSB8fCAhbGVuZ3RoICRDdXJyZW50VmFsdWU7CgogICAgICAgICAgICAgICAgbXkgJFJlbmRlcmVkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlbmRlcmVkVmFsdWUpIHx8ICFkZWZpbmVkICRSZW5kZXJlZFZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlbmRlcmVkVmFsdWVzLCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE5hbWVQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFJlbmRlcmVkVmFsdWVzOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzc2VtYmxlIG5hbWUKICAgIG15IEBOYW1lUGFydHM7CiAgICBDVVNUT01FUlVTRVJOQU1FRklFTEQ6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlck5hbWVGaWVsZCAoIEB7JEN1c3RvbWVyVXNlck5hbWVGaWVsZHN9ICkgewogICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSTkFNRUZJRUxECiAgICAgICAgICAgIGlmICFleGlzdHMgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfQogICAgICAgICAgICB8fCAhZGVmaW5lZCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFsZW5ndGggJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgICAgICBwdXNoIEBOYW1lUGFydHMsICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH07CiAgICB9CgogICAgbXkgJEpvaW5DaGFyYWN0ZXIgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzSm9pbn0gLy8gJyAnOwogICAgbXkgJE5hbWUgICAgICAgICAgPSBqb2luICRKb2luQ2hhcmFjdGVyLCBATmFtZVBhcnRzOwoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lck5hbWU6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICAgICAgICAgVmFsdWUgPT4gJE5hbWUsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICROYW1lOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVXNlcnM7CiAgICBteSAkVmFsaWQgPSAkUGFyYW17VmFsaWR9IC8vIDE7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte1NlYXJjaH0KICAgICAgICAmJiAhJFBhcmFte1VzZXJMb2dpbn0KICAgICAgICAmJiAhJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9CiAgICAgICAgJiYgISRQYXJhbXtDdXN0b21lcklEfQogICAgICAgICYmICEkUGFyYW17Q3VzdG9tZXJJRFJhd30KICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlYXJjaCwgVXNlckxvZ2luLCBQb3N0TWFzdGVyU2VhcmNoLCBDdXN0b21lcklEUmF3IG9yIEN1c3RvbWVySUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gam9pbiAnOjonLCBtYXAgeyAkXyAuICc9JyAuICRQYXJhbXskX30gfSBzb3J0IGtleXMgJVBhcmFtOwojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBVc2UgY2FjaGUgZm9yIG11bHRpdGVuYW5jeS4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICRDYWNoZUtleSAuPSBqb2luICcnLCBtYXAgeyAnOjpHcm91cElEPScgLiAkXyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9OwogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkVXNlcnMgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyRVc2Vyc30gaWYgcmVmICRVc2VycyBlcSAnSEFTSCc7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHMgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcykgKSB7CiAgICAgICAgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHMgPSBbICdmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdlbWFpbCcsIF07CiAgICB9CgogICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlckxpc3RGaWVsZHMKICAgICMgYXMgdGhleSBjYW5ub3QgYmUgaGFuZGxlZCBoZXJlCiAgICBteSBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0gQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CgogICAgIyBidWlsZCBTUUwgc3RyaW5nIDEvMgogICAgbXkgJFNRTCA9ICJTRUxFQ1QgJFNlbGYtPntDdXN0b21lcktleX0gIjsKICAgIG15IEBCaW5kOwogICAgJFNRTCAuPSAnLCAnIC4gKCBqb2luICcsICcsIEBDdXN0b21lclVzZXJMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgKTsKCiAgICAjIGdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpCiAgICBteSAkTGlrZUVzY2FwZVN0cmluZyA9ICRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgIyBidWlsZCBTUUwgc3RyaW5nIDIvMgogICAgJFNRTCAuPSAiIEZST00gJFNlbGYtPntDdXN0b21lclRhYmxlfSBXSEVSRSAiOwogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hGaWVsZHN9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICJOZWVkIEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcyBpbiBDdXN0b21lclVzZXIgY29uZmlnLCB1bmFibGUgdG8gc2VhcmNoIGZvciAnJFBhcmFte1NlYXJjaH0nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRTZWFyY2ggPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlTdHJpbmdFc2NhcGUoIFF1ZXJ5U3RyaW5nID0+ICRQYXJhbXtTZWFyY2h9ICk7CgogICAgICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMKICAgICAgICAjIGFzIHRoZXkgY2Fubm90IGJlIHJldHJpZXZlZCBoZXJlCiAgICAgICAgbXkgQEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAhZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9CiAgICAgICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc30gfTsKCiAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyT25seX0gKSB7CiAgICAgICAgICAgIEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgJF8gbmUgJ2N1c3RvbWVyX2lkJyB9IEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHM7CiAgICAgICAgfQoKICAgICAgICBteSAlUXVlcnlDb25kaXRpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gXEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMsICAgICMkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hGaWVsZHN9LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICRTZWFyY2gsCiAgICAgICAgICAgIFNlYXJjaFByZWZpeCAgPT4gJFNlbGYtPntTZWFyY2hQcmVmaXh9LAogICAgICAgICAgICBTZWFyY2hTdWZmaXggID0+ICRTZWxmLT57U2VhcmNoU3VmZml4fSwKICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZSA9PiAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9LAogICAgICAgICAgICBCaW5kTW9kZSAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNRTCAuPSAkUXVlcnlDb25kaXRpb257U1FMfTsKICAgICAgICBwdXNoIEBCaW5kLCBAeyAkUXVlcnlDb25kaXRpb257VmFsdWVzfSB9OwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIERvbid0IHNlYXJjaCBmb3IgY3VzdG9tZXIgdXNlcnMgd2l0aG91dCBncm91cCBwZXJtaXNzaW9uLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9ICkgewogICAgICAgICAgICAgICAgIyBUT0RPOiBXb3JrYXJvdW5kIHVudGlsIHRoZSBzZWFyY2ggZ2V0cyBjaGFuZ2VkLgogICAgICAgICAgICAgICAgJFBhcmFte0xpbWl0fSA9IDEwMDAwMDsKICAgICAgICAgICAgICAgICMgTm9ybWFsbHksIHdlIHNob3VsZCBpbm5lciBqb2luIGFsbCBjdXN0b21lciBjb21wYW5pZXMgdG8gc2VlIGlmIHRoZSBhZ2VudCBoYXMgcGVybWlzc2lvbiB0byBzZWUgdGhlIGN1c3RvbWVyIChjdXJyZW50bHkgd29ya2luZykgb3IgdGhlIGN1c3RvbWVyIGNvbXBhbnkgKGl0ZXJhdGUgdGhyb3VnaCBhbGwgREIgYmFjay1lbmRzKS4KICAgICAgICAgICAgICAgICMgSWYgdGhlIGFnZW50IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiBvbiB0aGUgY3VzdG9tZXIgY29tcGFueSBidXQgdGhlIGN1c3RvbWVyIHVzZXIsIHRoZSBxdWVyeSBzaG91bGRuJ3QgcmV0dXJuIHRoZSBjdXN0b21lciB1c2VyLgogICAgICAgICAgICAgICAgIyBDdXJyZW50bHksIHdlIGFyZSBsb29raW5nIGZvciBldmVyeXRoaW5nIGFuZCBmaWx0ZXJpbmcgdGhlIHJlc3VsdCwgd2hpY2ggaXMgbm90IG9wdGltYWwuIFRoZSByZWFsIGxpbWl0IHNob3VsZCBzdGlsbCBiZSBhcHBsaWVkIGluIHRoZSBTeXN0ZW0vQ3VzdG9tZXJVc2VyLnBtLgogICAgICAgICAgICAgICAgIyBUaGUgc2FtZSBhcHBsaWVzIGZvciB0aGUgQ3VzdG9tZXJVc2VyL0xEQVAucG0KICAgICAgICAgICAgICAgICMgU0VMRUNUICogRlJPTSBjdXN0b21lcl91c2VyIGN1CiAgICAgICAgICAgICAgICAjIEpPSU4gY3VzdG9tZXJfY29tcGFueSBjcCBPTiBjdS5jdXN0b21lcl9pZCA9IGNwLmN1c3RvbWVyX2lkCiAgICAgICAgICAgICAgICAjIFdIRVJFICgoY3AuZ3JvdXBfaWQgSU4gKDEpIE9SIGNwLmdyb3VwX2lkIElTIE5VTEwgT1IgY3AuZ3JvdXBfaWQgPSAnJykKICAgICAgICAgICAgICAgICMgICAgIEFORCAoY3UuZ3JvdXBfaWQgSVMgTlVMTCBPUiBjdS5ncm91cF9pZCA9ICcnKSkKICAgICAgICAgICAgICAgICMgT1IgKGN1Lmdyb3VwX2lkIElOICgxKSkKICAgICAgICAgICAgICAgICMgVU5JT04KICAgICAgICAgICAgICAgICMgU0VMRUNUICogRlJPTSBjdXN0b21lcl91c2VyIGN1CiAgICAgICAgICAgICAgICAjIEpPSU4gY3VzdG9tZXJfY29tcGFueV8yIGNwIE9OIGN1LmN1c3RvbWVyX2lkID0gY3AuY3VzdG9tZXJfaWQKICAgICAgICAgICAgICAgICMgV0hFUkUgKChjcC5ncm91cF9pZCBJTiAoMSkgT1IgY3AuZ3JvdXBfaWQgSVMgTlVMTCBPUiBjcC5ncm91cF9pZCA9ICcnKQogICAgICAgICAgICAgICAgIyAgICAgQU5EIChjdS5ncm91cF9pZCBJUyBOVUxMIE9SIGN1Lmdyb3VwX2lkID0gJycpKQogICAgICAgICAgICAgICAgIyBPUiAoY3UuZ3JvdXBfaWQgSU4gKDEpKQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCB0aGUgY29sdW1uIG5hbWUgd2hlcmUgdGhlIGdyb3VwIElEIGlzIHN0b3JlZC4KICAgICAgICAgICAgbXkgJEdyb3VwSURDb2w7CiAgICAgICAgICAgIGZvciBteSAkTWFwICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTWFwLT5bMF0gZXEgJ1VzZXJHcm91cElEJyApIHsKICAgICAgICAgICAgICAgICAgICAkR3JvdXBJRENvbCA9ICRNYXAtPlsyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBUaGUgc291cmNlIHN1cHBvcnRzIG11bHRpdGVuYW5jeS4KICAgICAgICAgICAgaWYgKCRHcm91cElEQ29sKSB7CiAgICAgICAgICAgICAgICBteSAkVXNlckdyb3VwSURTeW5jID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UgbWF0Y2ggZm9yIGdyb3VwIElEcyBvciBncm91cCBuYW1lcy4KICAgICAgICAgICAgICAgIG15IEBVc2VyR3JvdXBzID0gJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ID8gQHsgJFNlbGYtPntVc2VyR3JvdXBzfSB9IDogQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CgogICAgICAgICAgICAgICAgIyBSZW1hcCBsb2NhbCBncm91cHMgdG8gcmVtb3RlIGdyb3Vwcy4KICAgICAgICAgICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkTG9jYWxHcm91cCA9ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH17JFJlbW90ZUdyb3VwfTsKCiAgICAgICAgICAgICAgICAgICAgQFVzZXJHcm91cHMgPSBtYXAgeyAkXyBlcSAkTG9jYWxHcm91cCA/ICRSZW1vdGVHcm91cCA6ICRfIH0gQFVzZXJHcm91cHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEluQ29uZGl0aW9uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdyb3VwSURDb2wsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVzICAgPT4gXEBVc2VyR3JvdXBzLAogICAgICAgICAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgdGhlIGZpZWxkIGlzIGVtcHR5LCB3ZSBoYXZlIGFjY2VzcyBieSBkZWZhdWx0LgogICAgICAgICAgICAgICAgJEluQ29uZGl0aW9uIC49ICIgT1IgKCRHcm91cElEQ29sIElTIE5VTEwgT1IgJEdyb3VwSURDb2wgPSAnJykiOwogICAgICAgICAgICAgICAgJFNRTCAuPSAiIEFORCAoJEluQ29uZGl0aW9uKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMKICAgICAgICAgICAgIyBhcyB0aGV5IGNhbm5vdCBiZSByZXRyaWV2ZWQgaGVyZQogICAgICAgICAgICBteSBAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAhZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9CiAgICAgICAgICAgICAgICBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzfSB9OwoKICAgICAgICAgICAgbXkgJFNRTEV4dCA9ICcnOwoKICAgICAgICAgICAgIyBmb3IgbXkgJEZpZWxkICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkc30gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMpIHsKICAgICAgICAgICAgICAgIGlmICgkU1FMRXh0KSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTEV4dCAuPSAnIE9SICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkUG9zdE1hc3RlclNlYXJjaCA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICk7CiAgICAgICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFBvc3RNYXN0ZXJTZWFyY2g7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gIiAkRmllbGQgPSA/ICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICIgTE9XRVIoJEZpZWxkKSA9IExPV0VSKD8pICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNRTCAuPSAkU1FMRXh0OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte1VzZXJMb2dpbn0gKSB7CgogICAgICAgIG15ICRVc2VyTG9naW4gPSAkUGFyYW17VXNlckxvZ2lufTsKCiAgICAgICAgIyBjaGVjayBDdXN0b21lcktleSB0eXBlCiAgICAgICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyS2V5SW50ZWdlcn0gKSB7CgogICAgICAgICAgICAjIHJldHVybiBpZiBsb2dpbiBpcyBubyBpbnRlZ2VyCiAgICAgICAgICAgIHJldHVybiBpZiAkUGFyYW17VXNlckxvZ2lufSAhfiAvXihcK3xcLXwpXGR7MSwxNn0kLzsKCiAgICAgICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJLZXl9ID0gPyI7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkVXNlckxvZ2luOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFVzZXJMb2dpbiA9ICclJyAuICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFVzZXJMb2dpbiwgJ0xpa2UnICkgLiAnJSc7CiAgICAgICAgICAgICRVc2VyTG9naW4gPX4gcy9cKi8lL2c7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkVXNlckxvZ2luOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSBMSUtFID8gJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lcktleX0pIExJS0UgTE9XRVIoPykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJJRH0gKSB7CgogICAgICAgIG15ICRDdXN0b21lcklEID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q3VzdG9tZXJJRH0sICdMaWtlJyApOwogICAgICAgICRDdXN0b21lcklEID1+IHMvXCovJS9nOwogICAgICAgIHB1c2ggQEJpbmQsIFwkQ3VzdG9tZXJJRDsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVySUR9IExJS0UgPyAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVySUR9KSBMSUtFIExPV0VSKD8pICRMaWtlRXNjYXBlU3RyaW5nIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtDdXN0b21lcklEUmF3fSApIHsKCiAgICAgICAgIyB0aGVyZSBpcyBubyAnKicgd2lsZGNhcmQgZXhwYW5zaW9uIHdoZW4gc2VhcmNoaW5nIGZvciBDdXN0b21lcklEUmF3CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDdXN0b21lcklEUmF3fTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVySUR9ID0gPyAiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lcklEfSkgPSBMT1dFUig/KSAiOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCB2YWxpZCBvcHRpb24KICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJWYWxpZH0gJiYgJFZhbGlkICkgewoKICAgICAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgJFNRTCAuPSAnIEFORCAnCiAgICAgICAgICAgIC4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJWYWxpZH0KICAgICAgICAgICAgLiAnIElOICgnIC4gam9pbiggJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpICkgLiAnKSAnOwogICAgfQoKICAgICMgZHluYW1pYyBmaWVsZCBoYW5kbGluZwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwogICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgbXkgQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKCiAgICAjIGdldCBkYXRhIGZyb20gY3VzdG9tZXIgdXNlciB0YWJsZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9IHx8ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICApOwoKICAgIG15IEBDdXN0b21lclVzZXJEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDdXN0b21lclVzZXJEYXRhLCBbQFJvd107CiAgICB9CgogICAgQ1VTVE9NRVJVU0VSREFUQToKICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyRGF0YSAoQEN1c3RvbWVyVXNlckRhdGEpIHsKICAgICAgICBteSAkQ3VzdG9tZXJLZXkgPSBzaGlmdCBAeyRDdXN0b21lclVzZXJEYXRhfTsKICAgICAgICBuZXh0IENVU1RPTUVSVVNFUkRBVEEgaWYgJFVzZXJzeyRDdXN0b21lcktleX07CgogICAgICAgIG15ICVVc2VyU3RyaW5nUGFydHM7CgogICAgICAgIG15ICRGaWVsZENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyRDdXN0b21lclVzZXJEYXRhfSApIHsKICAgICAgICAgICAgJFVzZXJTdHJpbmdQYXJ0c3sgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkc1skRmllbGRDb3VudGVyXSB9ID0gJEZpZWxkOwogICAgICAgICAgICAkRmllbGRDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgdmFsdWVzLCBpZiBjb25maWd1cmVkCiAgICAgICAgaWYgKEBDdXN0b21lclVzZXJMaXN0RmllbGRzRHluYW1pY0ZpZWxkcykgewogICAgICAgICAgICBEWU5BTUlDRklFTEROQU1FOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKEBDdXN0b21lclVzZXJMaXN0RmllbGRzRHluYW1pY0ZpZWxkcykgewogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFleGlzdHMgJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9OwoKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhZGVmaW5lZCAkVmFsdWU7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRWYWx1ZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gWyRWYWx1ZV07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgQFZhbHVlczsKCiAgICAgICAgICAgICAgICBWQUxVRToKICAgICAgICAgICAgICAgIGZvciBteSAkQ3VycmVudFZhbHVlICggQHskVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIWRlZmluZWQgJEN1cnJlbnRWYWx1ZSB8fCAhbGVuZ3RoICRDdXJyZW50VmFsdWU7CgogICAgICAgICAgICAgICAgICAgIG15ICRSZWFkYWJsZVZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlJlYWRhYmxlVmFsdWVSZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkQ3VycmVudFZhbHVlLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRSZWFkYWJsZVZhbHVlKSB8fCAhZGVmaW5lZCAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBvc3NpYmxlVmFsdWVzLT57ICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX0gPSAkUG9zc2libGVWYWx1ZXMtPnsgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX0gfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcHVzaCBAVmFsdWVzLCAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkVXNlclN0cmluZ1BhcnRzeyREeW5hbWljRmllbGROYW1lfSA9IGpvaW4gJyAnLCBAVmFsdWVzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFzc2VtYmxlIHVzZXIgc3RyaW5nCiAgICAgICAgbXkgQFVzZXJTdHJpbmdQYXJ0czsKICAgICAgICBDVVNUT01FUlVTRVJMSVNURklFTEQ6CiAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJMaXN0RmllbGQgKCBAeyRDdXN0b21lclVzZXJMaXN0RmllbGRzfSApIHsKICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJMSVNURklFTEQKICAgICAgICAgICAgICAgIGlmICFleGlzdHMgJFVzZXJTdHJpbmdQYXJ0c3skQ3VzdG9tZXJVc2VyTGlzdEZpZWxkfQogICAgICAgICAgICAgICAgfHwgIWRlZmluZWQgJFVzZXJTdHJpbmdQYXJ0c3skQ3VzdG9tZXJVc2VyTGlzdEZpZWxkfQogICAgICAgICAgICAgICAgfHwgIWxlbmd0aCAkVXNlclN0cmluZ1BhcnRzeyRDdXN0b21lclVzZXJMaXN0RmllbGR9OwogICAgICAgICAgICBwdXNoIEBVc2VyU3RyaW5nUGFydHMsICRVc2VyU3RyaW5nUGFydHN7JEN1c3RvbWVyVXNlckxpc3RGaWVsZH07CiAgICAgICAgfQoKICAgICAgICAkVXNlcnN7JEN1c3RvbWVyS2V5fSA9IGpvaW4gJyAnLCBAVXNlclN0cmluZ1BhcnRzOwogICAgICAgICRVc2Vyc3skQ3VzdG9tZXJLZXl9ID1+IHMvXiguKilccyguKz9cQC4rP1wuLis/KShcc3wpJC8iJDEiIDwkMj4vOwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJVVzZXJzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAlVXNlcnM7Cn0KCnN1YiBDdXN0b21lclNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggcmVmICRQYXJhbXtTZWFyY2hGaWVsZHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZWFyY2hGaWVsZHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFJldHVybiBvbmx5IHZhbGlkIHVzZXJzIHBlciBkZWZhdWx0CiAgICBteSAkVmFsaWQgPSAkUGFyYW17VmFsaWR9IC8vIDE7CgogICAgJFBhcmFte0xpbWl0fSAvLz0gJyc7CgogICAgIyBTcGxpdCB0aGUgc2VhcmNoIGZpZWxkcyBpbiBzY2FsYXIgYW5kIGFycmF5IGZpZWxkcywgYmVmb3JlIHRoZSBkaWZmcmVudCBoYW5kbGluZy4KICAgIG15IEBTY2FsYXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgJ0lucHV0JyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKICAgIG15IEBBcnJheVNlYXJjaEZpZWxkcyAgPSBncmVwIHsgJ1NlbGVjdGlvbicgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgIyBWZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZi4KICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQtPntOYW1lfSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgbXkgJFJlc3VsdCA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CgogICAgIyBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgICMgSWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICcnOwoKICAgICAgICAjIERlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbXTsKICAgIH0KCiAgICAjIERlZmluZSBvcmRlciB0YWJsZSBmcm9tIHRoZSBzZWFyY2ggZmllbGRzLgogICAgbXkgJU9yZGVyQnlUYWJsZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntEYXRhYmFzZUZpZWxkfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgZm9yIG15ICRGaWVsZCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CgogICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRGaWVsZC0+e1NlbGVjdGlvbnNEYXRhfTsKCiAgICAgICAgZm9yIG15ICRTZWxlY3RlZFZhbHVlICggQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBzZWxlY3RlZCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICAgIGlmICggISRTZWxlY3Rpb25zRGF0YS0+eyRTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzZWxlY3RlZCB2YWx1ZSAkRmllbGQtPntOYW1lfSBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJFNlbGYtPntEQk9iamVjdH07CgogICAgIyBBc3NlbWJsZSB0aGUgY29uZGl0aW9ucyB1c2VkIGluIHRoZSBXSEVSRSBjbGF1c2UuCiAgICBteSBAU1FMV2hlcmU7CgogICAgZm9yIG15ICRGaWVsZCAoQFNjYWxhclNlYXJjaEZpZWxkcykgewoKICAgICAgICAjIFNlYXJjaCBmb3Igc2NhbGFyIGZpZWxkcyAod2lsZGNhcmRzIGFyZSBhbGxvd2VkKS4KICAgICAgICBpZiAoICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICMgR2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkuCiAgICAgICAgICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0sICdMaWtlJyApOwoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICAgICAgICAgICMgSWYgdGhlIGZpZWxkIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmx5ICUuCiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ICF+IG17IFxBICUqIFx6IH14bXMgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICAgICAiTE9XRVIoJEZpZWxkLT57RGF0YWJhc2VGaWVsZH0pIExJS0UgTE9XRVIoJyRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfScpICRMaWtlRXNjYXBlU3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgQ2hlY2sgYWxsIGNvbmZpZ3VyZWQgY2hhbmdlIGR5bmFtaWMgZmllbGRzLCBidWlsZCBsb29rdXAgaGFzaCBieSBuYW1lLgogICAgbXkgJUN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZE5hbWUyQ29uZmlnOwogICAgbXkgJEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZHMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICApOwogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyRDdXN0b21lclVzZXJEeW5hbWljRmllbGRzfSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkTmFtZTJDb25maWd7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZDsKICAgIH0KCiAgICBteSAkU1FMRHluYW1pY0ZpZWxkRnJvbSAgICAgPSAnJzsKICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZSAgICA9ICcnOwogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyID0gMTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZHN9ICkgewoKICAgICAgICBteSAkU2VhcmNoUGFyYW0gPSAkUGFyYW17ICJEeW5hbWljRmllbGRfIiAuICREeW5hbWljRmllbGQtPntOYW1lfSB9OwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoIHJlZiAkU2VhcmNoUGFyYW0gbmUgJ0hBU0gnICk7CgogICAgICAgIG15ICROZWVkSm9pbjsKCiAgICAgICAgZm9yIG15ICRPcGVyYXRvciAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbX0gKSB7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyc7CiAgICAgICAgICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgQU5EICgnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyAoJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBURVhUOgogICAgICAgICAgICBmb3IgbXkgJFRleHQgKEBTZWFyY2hQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0IGVxICcnICk7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAnKicuCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0gfHwgMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsaWRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB2YWx1ZSAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkVGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyBvbiBmaWVsZCAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnIE9SICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlNlYXJjaFNRTEdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBUYWJsZUFsaWFzICAgICAgICAgPT4gImRmdiREeW5hbWljRmllbGRKb2luQ291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgICAgICAgICAgID0+ICRPcGVyYXRvciwKICAgICAgICAgICAgICAgICAgICBTZWFyY2hUZXJtICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICcpICc7CgogICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZSAuPSAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWI7CiAgICAgICAgICAgICAgICAkTmVlZEpvaW4gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJE5lZWRKb2luKSB7CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRGcm9tIC49ICIKICAgICAgICAgICAgICAgIElOTkVSIEpPSU4gZHluYW1pY19maWVsZF92YWx1ZSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIKICAgICAgICAgICAgICAgICAgICBPTiAoZGZfb2JqX2lkX25hbWUub2JqZWN0X2lkID0gZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLm9iamVjdF9pZAogICAgICAgICAgICAgICAgICAgICAgICBBTkQgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLmZpZWxkX2lkID0gIgogICAgICAgICAgICAgICAgLiAkREJPYmplY3QtPlF1b3RlKCAkRHluYW1pY0ZpZWxkLT57SUR9LCAnSW50ZWdlcicgKSAuICIpCiAgICAgICAgICAgICI7CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBFeGVjdXRlIGEgZHluYW1pYyBmaWVsZCBzZWFyY2gsIGlmIGEgZHluYW1pYyBmaWVsZCB3aGVyZSBzdGF0ZW1lbnQgZXhpc3RzLgogICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewoKICAgICAgICBteSBARHluYW1pY0ZpZWxkVXNlckxvZ2luczsKCiAgICAgICAgbXkgJFNRTER5bmFtaWNGaWVsZCA9ICJTRUxFQ1QgRElTVElOQ1QoZGZfb2JqX2lkX25hbWUub2JqZWN0X25hbWUpIEZST00gZHluYW1pY19maWVsZF9vYmpfaWRfbmFtZSBkZl9vYmpfaWRfbmFtZSAiCiAgICAgICAgICAgIC4gJFNRTER5bmFtaWNGaWVsZEZyb20KICAgICAgICAgICAgLiAiIFdIRVJFICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkV2hlcmU7CgogICAgICAgIG15ICRVc2VkQ2FjaGU7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMgPSBAeyREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGF9OwoKICAgICAgICAgICAgICAgICAgICAkVXNlZENhY2hlID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEdldCB0aGUgZGF0YSBvbmx5IGZyb20gZGF0YWJhc2UsIGlmIG5vIGNhY2hlIGVudHJ5IGV4aXN0cy4KICAgICAgICBpZiAoICEkVXNlZENhY2hlICkgewoKICAgICAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgICAgICBTUUwgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkVXNlckxvZ2lucywgJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBEeW5hbWljRmllbGRVc2VyTG9naW5zLAogICAgICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWRkIHRoZSB1c2VyIGxvZ2lucyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkcywgaWYgYSBzZWFyY2ggcmVzdWx0IGV4aXN0cyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaAogICAgICAgICMgICBvciBza2lwIHRoZSBzZWFyY2ggYW5kIHJldHVybiBhIGVtcHRyeSBhcnJheSByZWYsIGlmIG5vIHVzZXIgbG9naW5zIGV4aXN0cyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaC4KICAgICAgICBpZiAoQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMpIHsKCiAgICAgICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntDdXN0b21lcktleX0sCiAgICAgICAgICAgICAgICBWYWx1ZXMgICA9PiBcQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMsCiAgICAgICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRSZXN1bHQgZXEgJ0NPVU5UJyA/IDAgOiBbXTsKICAgICAgICB9CiAgICB9CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH07CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICA9PiAkRmllbGQtPntEYXRhYmFzZUZpZWxkfSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFteyAkRmllbGQtPntOYW1lfSB9LAogICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAkU1FMUXVlcnlJbkNvbmRpdGlvbjsKICAgIH0KCiAgICAjIFNwZWNpYWwgcGFyYW1ldGVyIGZvciBDdXN0b21lcklEcyBmcm9tIGEgY3VzdG9tZXIgY29tcGFueSBzZWFyY2ggcmVzdWx0LgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtDdXN0b21lckNvbXBhbnlTZWFyY2hDdXN0b21lcklEc30gKSApIHsKCiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkREJPYmplY3QtPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIFZhbHVlcyAgID0+ICRQYXJhbXtDdXN0b21lckNvbXBhbnlTZWFyY2hDdXN0b21lcklEc30sCiAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgfQoKICAgICMgU3BlY2lhbCBwYXJhbWV0ZXIgdG8gZXhjbHVkZSBzb21lIHVzZXIgbG9naW5zIGZyb20gdGhlIHNlYXJjaCByZXN1bHQuCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0V4Y2x1ZGVVc2VyTG9naW5zfSApICkgewoKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntDdXN0b21lcktleX0sCiAgICAgICAgICAgIFZhbHVlcyAgID0+ICRQYXJhbXtFeGNsdWRlVXNlckxvZ2luc30sCiAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgICAgIE5lZ2F0ZSAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgfQoKICAgICMgQWRkIHRoZSB2YWxpZCBvcHRpb24gaWYgbmVlZGVkLgogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfSAmJiAkVmFsaWQgKSB7CgogICAgICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgIiRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVmFsaWR9IElOICgiIC4gam9pbiggJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpICkgLiAiKSAiOwogICAgfQoKICAgICMgQ2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMuCiAgICBteSAlT3JkZXJCeVNlZW47CiAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgaWYgKCAhJE9yZGVyQnkgfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5IGNvbnRhaW5zIGludmFsaWQgdmFsdWUgJyRPcmRlckJ5JyBvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIFJlbWVtYmVyIHRoZSB2YWx1ZSB0byBjaGVjayBpZiBpdCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gPSAxOwogICAgfQoKICAgICMgQ2hlY2sgaWYgT3JkZXJCeURpcmVjdGlvbiBhcnJheSBjb250YWlucyBvbmx5ICdVcCcgb3IgJ0Rvd24nLgogICAgRElSRUNUSU9OOgogICAgZm9yIG15ICREaXJlY3Rpb24gKCBAeyAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgIyBPbmx5ICdVcCcgb3IgJ0Rvd24nIGFsbG93ZWQuCiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnVXAnOwogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ0Rvd24nOwoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQnVpbGQgdGhlIHNxbCBzdGF0ZW1lbnQgZm9yIHRoZSBzZWFyY2guCiAgICBteSAkU1FMID0gIlNFTEVDVCBESVNUSU5DVCgkU2VsZi0+e0N1c3RvbWVyS2V5fSkiOwoKICAgICMgTW9kaWZ5IFNRTCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFNRTCA9ICJTRUxFQ1QgQ09VTlQoRElTVElOQ1QoJFNlbGYtPntDdXN0b21lcktleX0pKSI7CiAgICB9CgogICAgIyBBc3NlbWJsZSB0aGUgT1JERVIgQlkgY2xhdXNlLgogICAgbXkgQFNRTE9yZGVyQnk7CgogICAgIyBUaGUgT3JkZXIgYnkgY2xhdXNlIGlzIG5vdCBuZWVkZWQgZm9yIHRoZSByZXN1bHQgdHlwZSAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IG5lICdDT1VOVCcgKSB7CgogICAgICAgIG15ICRDb3VudCA9IDA7CgogICAgICAgIE9SREVSQlk6CiAgICAgICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgICAgICBteSAkRGlyZWN0aW9uID0gJ0RFU0MnOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdICkgewogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdBU0MnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdEb3duJyApIHsKICAgICAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0RFU0MnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgICAgIG5leHQgT1JERVJCWSBpZiAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX07CgogICAgICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gJERpcmVjdGlvbiI7CgogICAgICAgICAgICBuZXh0IE9SREVSQlkgaWYgJE9yZGVyQnkgZXEgJ1VzZXJMb2dpbic7CgogICAgICAgICAgICAkU1FMIC49ICIsICRPcmRlckJ5VGFibGV7JE9yZGVyQnl9IjsKICAgICAgICB9CgogICAgICAgICMgSWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBvcmRlcmluZyBpcyBub3QgZGV0ZXJtaW5lZAogICAgICAgICMgICB3ZSBhZGQgYW4gZGVzY2VuZGluZyBvcmRlcmluZyBieSBpZC4KICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJ1VzZXJMb2dpbicgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkU2VsZi0+e0N1c3RvbWVyS2V5fSBERVNDIjsKICAgICAgICB9CiAgICB9CgogICAgJFNRTCAuPSAiIEZST00gJFNlbGYtPntDdXN0b21lclRhYmxlfSAiOwoKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICBteSAkU1FMV2hlcmVTdHJpbmcgPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxXaGVyZTsKICAgICAgICAkU1FMIC49ICJXSEVSRSAkU1FMV2hlcmVTdHJpbmcgIjsKICAgIH0KICAgIGlmIChAU1FMT3JkZXJCeSkgewogICAgICAgIG15ICRPcmRlckJ5U3RyaW5nID0gam9pbiAnLCAnLCBAU1FMT3JkZXJCeTsKICAgICAgICAkU1FMIC49ICJPUkRFUiBCWSAkT3JkZXJCeVN0cmluZyI7CiAgICB9CgogICAgIyBDaGVjayBpZiBhIGNhY2hlIGV4aXN0cyBiZWZvcmUgd2UgYXNrIHRoZSBkYXRhYmFzZS4KICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CgogICAgICAgIG15ICRDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWwnLAogICAgICAgICAgICBLZXkgID0+ICRTUUwgLiAkUGFyYW17TGltaXR9LAogICAgICAgICk7CgogICAgICAgIGlmICggZGVmaW5lZCAkQ2FjaGVEYXRhICkgewogICAgICAgICAgICBpZiAoIHJlZiAkQ2FjaGVEYXRhIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiAkQ2FjaGVEYXRhIGVxICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRDYWNoZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgcmVmICcgLiByZWYoJENhY2hlRGF0YSkgLiAnIScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0sCiAgICApOwoKICAgIG15IEBJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBJRHMsICRSb3dbMF07CiAgICB9CgogICAgIyBIYW5kbGUgdGhlIGRpZmZyZW50IHJlc3VsdCB0eXBlcy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRJRHNbMF0sCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJElEc1swXTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+IFxASURzLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9CgpzdWIgQ3VzdG9tZXJJRExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsaWQgICAgICA9IGRlZmluZWQgJFBhcmFte1ZhbGlkfSA/ICRQYXJhbXtWYWxpZH0gOiAxOwogICAgbXkgJFNlYXJjaFRlcm0gPSAkUGFyYW17U2VhcmNoVGVybX0gfHwgJyc7CgogICAgbXkgJENhY2hlVHlwZSA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJJRExpc3QnOwogICAgbXkgJENhY2hlS2V5ICA9ICJDdXN0b21lcklETGlzdDo6JHtWYWxpZH06OiRTZWFyY2hUZXJtIjsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JFJlc3VsdH0gaWYgcmVmICRSZXN1bHQgZXEgJ0FSUkFZJzsKICAgIH0KCiAgICBteSAkU1FMID0gIgogICAgICAgIFNFTEVDVCBESVNUSU5DVCgkU2VsZi0+e0N1c3RvbWVySUR9KQogICAgICAgIEZST00gJFNlbGYtPntDdXN0b21lclRhYmxlfQogICAgICAgIFdIRVJFIDEgPSAxICI7CiAgICBteSBAQmluZDsKCiAgICAjIGFkZCB2YWxpZCBvcHRpb24KICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJWYWxpZH0gJiYgJFZhbGlkICkgewoKICAgICAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgbXkgJFZhbGlkSURzID0gam9pbiggJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpICk7CiAgICAgICAgJFNRTCAuPSAiCiAgICAgICAgICAgIEFORCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfSBJTiAoJFZhbGlkSURzKSAiOwogICAgfQoKICAgICMgYWRkIHNlYXJjaCB0ZXJtCiAgICBpZiAoJFNlYXJjaFRlcm0pIHsKICAgICAgICBteSAkU2VhcmNoVGVybUVzY2FwZWQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlTdHJpbmdFc2NhcGUoIFF1ZXJ5U3RyaW5nID0+ICRTZWFyY2hUZXJtICk7CgogICAgICAgICRTUUwgLj0gJyBBTkQgJzsKICAgICAgICBteSAlUXVlcnlDb25kaXRpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJFNlbGYtPntDdXN0b21lcklEfSwKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAkU2VhcmNoVGVybUVzY2FwZWQsCiAgICAgICAgICAgIFNlYXJjaFByZWZpeCAgPT4gJFNlbGYtPntTZWFyY2hQcmVmaXh9LAogICAgICAgICAgICBTZWFyY2hTdWZmaXggID0+ICRTZWxmLT57U2VhcmNoU3VmZml4fSwKICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZSA9PiAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9LAogICAgICAgICAgICBCaW5kTW9kZSAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU1FMIC49ICRRdWVyeUNvbmRpdGlvbntTUUx9OwogICAgICAgIHB1c2ggQEJpbmQsIEB7ICRRdWVyeUNvbmRpdGlvbntWYWx1ZXN9IH07CgogICAgICAgICRTUUwgLj0gJyAnOwogICAgfQoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSBAUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAUmVzdWx0LCAkUm93WzBdOwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFxAUmVzdWx0LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBAUmVzdWx0Owp9CgpzdWIgQ3VzdG9tZXJJRHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRDdXN0b21lcklEcyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lcklEczo6JFBhcmFte1VzZXJ9IiwKICAgICAgICApOwogICAgICAgIHJldHVybiBAeyRDdXN0b21lcklEc30gaWYgcmVmICRDdXN0b21lcklEcyBlcSAnQVJSQVknOwogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEKICAgIG15ICVEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkUGFyYW17VXNlcn0sCiAgICApOwoKICAgICMgdGhlcmUgYXJlIG11bHRpIGN1c3RvbWVyIGlkcwogICAgbXkgQEN1c3RvbWVySURzOwogICAgaWYgKCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ICkgewoKICAgICAgICAjIHVzZWQgc2VwYXJhdG9ycwogICAgICAgIFNFUEFSQVRPUjoKICAgICAgICBmb3IgbXkgJFNlcGFyYXRvciAoICc7JywgJywnLCAnfCcgKSB7CgogICAgICAgICAgICBuZXh0IFNFUEFSQVRPUiBpZiAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ICF+IC9cUSRTZXBhcmF0b3JcRS87CgogICAgICAgICAgICAjIHNwbGl0IGl0CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvXFEkU2VwYXJhdG9yXEUvLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9OwoKICAgICAgICAgICAgZm9yIG15ICRJRCAoQElEcykgewogICAgICAgICAgICAgICAgJElEID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgICAgICRJRCA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsYXN0IFNFUEFSQVRPUjsKICAgICAgICB9CgogICAgICAgICMgZmFsbGJhY2sgaWYgbm8gc2VwYXJhdG9yIGdvdCBmb3VuZAogICAgICAgIGlmICggIUBDdXN0b21lcklEcyApIHsKICAgICAgICAgICAgJERhdGF7VXNlckN1c3RvbWVySURzfSA9fiBzL15ccysvL2c7CiAgICAgICAgICAgICREYXRhe1VzZXJDdXN0b21lcklEc30gPX4gcy9ccyskLy9nOwogICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJERhdGF7VXNlckN1c3RvbWVySURzfTsKICAgICAgICB9CiAgICB9CgogICAgIyB1c2UgYWxzbyB0aGUgcHJpbWFyeSBjdXN0b21lciBpZAogICAgaWYgKCAkRGF0YXtVc2VyQ3VzdG9tZXJJRH0gJiYgISRTZWxmLT57RXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSApIHsKICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJERhdGF7VXNlckN1c3RvbWVySUR9OwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lcklEczo6JyAuICRQYXJhbXtVc2VyfSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBDdXN0b21lcklEcywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIEBDdXN0b21lcklEczsKfQoKc3ViIEN1c3RvbWVyVXNlckRhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBidWlsZCBzZWxlY3QKICAgIG15ICRTUUwgPSAnU0VMRUNUICc7CiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICAkU1FMIC49ICIgJEVudHJ5LT5bMl0sICI7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntGb3JlaWduREJ9ICkgewogICAgICAgICRTUUwgLj0gImNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksICI7CiAgICB9CgogICAgJFNRTCAuPSAkU2VsZi0+e0N1c3RvbWVyS2V5fSAuICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9IFdIRVJFICI7CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlcn0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JERhdGF9IGlmIHJlZiAkRGF0YSBlcSAnSEFTSCc7CiAgICB9CgogICAgIyBjaGVjayBjdXN0b21lciBrZXkgdHlwZQogICAgbXkgJFVzZXIgPSAkUGFyYW17VXNlcn07CgogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVyS2V5fSkgPSBMT1dFUig/KSI7CiAgICB9CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gWyBcJFVzZXIgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVEYXRhOwogICAgUk9XOgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJE1hcENvdW50ZXIgPSAwOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewoKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICAgICAkRGF0YXsgJEVudHJ5LT5bMF0gfSA9ICRSb3dbJE1hcENvdW50ZXJdOwogICAgICAgICAgICAkTWFwQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBST1cgaWYgJFNlbGYtPntGb3JlaWduREJ9OwoKICAgICAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlVGltZSBDcmVhdGVCeSBDaGFuZ2VUaW1lIENoYW5nZUJ5KSkgewogICAgICAgICAgICAkRGF0YXskS2V5fSA9ICRSb3dbJE1hcENvdW50ZXJdOwogICAgICAgICAgICAkTWFwQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGRhdGEKICAgIGlmICggISREYXRhe1VzZXJMb2dpbn0gKSB7CgogICAgICAgICMgY2FjaGUgcmVxdWVzdAogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICBLZXkgICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJ9IiwKICAgICAgICAgICAgICAgIFZhbHVlID0+IHt9LAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXAgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCkgKSB7CiAgICAgICAgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXAgPSBbICdmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdlbWFpbCcsIF07CiAgICB9CgogICAgIyBPcmRlciBmaWVsZHMgYnkgQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyAoc2VlIGJ1ZyMxMzgyMSkuCiAgICBteSBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkczsKICAgIGZvciBteSAkRmllbGQgKCBAeyRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwfSApIHsKICAgICAgICBteSBARmllbGROYW1lcyA9IG1hcCB7ICRfLT5bMF0gfSBncmVwIHsgJF8tPlsyXSBlcSAkRmllbGQgfSBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH07CiAgICAgICAgcHVzaCBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcywgJEZpZWxkTmFtZXNbMF07CiAgICB9CgogICAgbXkgJFVzZXJNYWlsU3RyaW5nID0gJyc7CiAgICBteSBAVXNlck1haWxTdHJpbmdQYXJ0czsKCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKEBDdXN0b21lclVzZXJMaXN0RmllbGRzKSB7CiAgICAgICAgbmV4dCBGSUVMRCBpZiAhJERhdGF7JEZpZWxkfTsKCiAgICAgICAgcHVzaCBAVXNlck1haWxTdHJpbmdQYXJ0cywgJERhdGF7JEZpZWxkfTsKICAgIH0KICAgICRVc2VyTWFpbFN0cmluZyA9IGpvaW4gJyAnLCBAVXNlck1haWxTdHJpbmdQYXJ0czsKICAgICRVc2VyTWFpbFN0cmluZyA9fiBzL14oLiopXHMoLis/XEAuKz9cLi4rPykoXHN8KSQvIiQxIiA8JDI+LzsKCiAgICAjIGFkZCB0aGUgVXNlck1haWxTdHJpbmcgdG8gdGhlIGRhdGEgaGFzaAogICAgJERhdGF7VXNlck1haWxTdHJpbmd9ID0gJFVzZXJNYWlsU3RyaW5nOwoKICAgICMgY29tcGF0IQogICAgJERhdGF7VXNlcklEfSA9ICREYXRhe1VzZXJMb2dpbn07CgogICAgIyBnZXQgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT5HZXRQcmVmZXJlbmNlcyggVXNlcklEID0+ICREYXRhe1VzZXJJRH0gKTsKCiAgICAjIGFkZCBsYXN0IGxvZ2luIHRpbWVzdGFtcAogICAgaWYgKCAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpbn0gKSB7CgogICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgRXBvY2ggPT4gJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW59LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2luVGltZXN0YW1wfSA9ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gIkN1c3RvbWVyVXNlckRhdGFHZXQ6OiRQYXJhbXtVc2VyfSIsCiAgICAgICAgICAgIFZhbHVlID0+IHsgJURhdGEsICVQcmVmZXJlbmNlcyB9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gKCAlRGF0YSwgJVByZWZlcmVuY2VzICk7Cn0KCnN1YiBDdXN0b21lclVzZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICggISRQYXJhbXsgJEVudHJ5LT5bMF0gfSAmJiAkRW50cnktPls0XSApIHsKCiAgICAgICAgICAgICMgc2tpcCBVc2VyTG9naW4sIHdpbGwgYmUgY2hlY2tlZCBsYXRlcgogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICggJEVudHJ5LT5bMF0gZXEgJ1VzZXJMb2dpbicgKTsKCiAgICAgICAgICAgICMgaWdub3JlIGR5bmFtaWMgZmllbGRzIGhlcmUKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkRW50cnktPlswXSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgbm8gVXNlckxvZ2luIGlzIGdpdmVuCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSAmJiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntBdXRvTG9naW5DcmVhdGlvbn0gKSB7CgogICAgICAgICMgZ2V0IHRpbWUgb2JqZWN0CiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgbXkgJERhdGVUaW1lU3RyaW5nID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoIEZvcm1hdCA9PiAnJVklbSVkJUglTScgKTsKCiAgICAgICAgbXkgJFByZWZpeCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0F1dG9Mb2dpbkNyZWF0aW9uUHJlZml4fSB8fCAnYXV0byc7CiAgICAgICAgJFBhcmFte1VzZXJMb2dpbn0gPSAiJFByZWZpeC0kRGF0ZVRpbWVTdHJpbmciIC4gaW50KCByYW5kKDk5KSApOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBsb2dpbiBleGlzdHMKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyTG9naW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MgaWYgYWxyZWFkeSBleGlzdHMKICAgIGlmICggJFBhcmFte1VzZXJFbWFpbH0gJiYgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyRW1haWxVbmlxQ2hlY2t9ICkgewogICAgICAgIG15ICVSZXN1bHQgPSAkU2VsZi0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFZhbGlkICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkUGFyYW17VXNlckVtYWlsfSwKICAgICAgICApOwogICAgICAgIGlmICglUmVzdWx0KSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCdUaGlzIGVtYWlsIGFkZHJlc3MgaXMgYWxyZWFkeSBpbiB1c2UgZm9yIGFub3RoZXIgY3VzdG9tZXIgdXNlci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MgbXgKICAgIGlmICgKICAgICAgICAkUGFyYW17VXNlckVtYWlsfQogICAgICAgICYmICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRQYXJhbXtVc2VyRW1haWx9ICkKICAgICAgICAmJiBncmVwIHsgJF8gZXEgJFBhcmFte1ZhbGlkSUR9IH0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbWFpbCBhZGRyZXNzICgkUGFyYW17VXNlckVtYWlsfSkgbm90IHZhbGlkICgiCiAgICAgICAgICAgICAgICAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3IoKSAuICIpISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZSB2YWx1ZXMKICAgIG15ICVWYWx1ZTsKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAkRW50cnktPls1XSA9fiAvXmludCQvaSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgaW5zZXJ0CiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gKCI7CiAgICBteSBAQmluZDsKICAgIG15ICVTZWVuS2V5OyAgICAjIElmIHRoZSBtYXAgY29udGFpbnMgZHVwbGljYXRlZCBmaWVsZCBuYW1lcywgaW5zZXJ0IG9ubHkgb25jZS4KICAgIG15IEBDb2x1bW5OYW1lczsKCiAgICBNQVBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBNQVBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7ICAgICAgICAgICAgIyBza2lwIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbmV4dCBNQVBFTlRSWSBpZiAoIGxjKCAkRW50cnktPlswXSApIGVxICJ1c2VycGFzc3dvcmQiICk7CiAgICAgICAgbmV4dCBNQVBFTlRSWSBpZiAkU2VlbktleXsgJEVudHJ5LT5bMl0gfSsrOwogICAgICAgIHB1c2ggQENvbHVtbk5hbWVzLCAkRW50cnktPlsyXTsKICAgIH0KCiAgICAkU1FMIC49IGpvaW4gJywgJywgQENvbHVtbk5hbWVzOwoKICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAkU1FMIC49ICcsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnknOwogICAgfQoKICAgICRTUUwgLj0gJykgVkFMVUVTICgnOwoKICAgIG15ICVTZWVuVmFsdWU7CiAgICBteSAkQmluZENvbHVtbnMgPSAwOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsgICAgICAgICAgICAjIHNraXAgZHluYW1pYyBmaWVsZHMKICAgICAgICBuZXh0IEVOVFJZIGlmICggbGMoICRFbnRyeS0+WzBdICkgZXEgInVzZXJwYXNzd29yZCIgKTsKICAgICAgICBuZXh0IEVOVFJZIGlmICRTZWVuVmFsdWV7ICRFbnRyeS0+WzJdIH0rKzsKICAgICAgICAkQmluZENvbHVtbnMrKzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFZhbHVleyAkRW50cnktPlswXSB9OwogICAgfQoKICAgICRTUUwgLj0gam9pbiAnLCAnLCAoJz8nKSB4ICRCaW5kQ29sdW1uczsKCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAnLCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8nOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VXNlcklEfTsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CiAgICB9CgogICAgJFNRTCAuPSAnKSc7CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kCiAgICApOwoKICAgICMgbG9nIG5vdGljZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICJDdXN0b21lclVzZXI6ICckUGFyYW17VXNlckxvZ2lufScgY3JlYXRlZCBzdWNjZXNzZnVsbHkgKCRQYXJhbXtVc2VySUR9KSEiLAogICAgKTsKCiAgICAjIHNldCBwYXNzd29yZAogICAgaWYgKCAkUGFyYW17VXNlclBhc3N3b3JkfSApIHsKICAgICAgICAkU2VsZi0+U2V0UGFzc3dvcmQoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgUFcgICAgICAgID0+ICRQYXJhbXtVc2VyUGFzc3dvcmR9CiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSApOwoKICAgIHJldHVybiAkUGFyYW17VXNlckxvZ2lufTsKfQoKc3ViIEN1c3RvbWVyVXNlclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgISRQYXJhbXsgJEVudHJ5LT5bMF0gfQogICAgICAgICAgICAmJiAkRW50cnktPls1XSBuZSAnZHluYW1pY19maWVsZCcgICAgIyBpZ25vcmUgZHluYW1pYyBmaWVsZHMgaGVyZQogICAgICAgICAgICAmJiAkRW50cnktPls0XSAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGNoZWNrIHJlcXVpcmVkIGZpZWxkcwogICAgICAgICAgICAmJiAkRW50cnktPlswXSBuZSAnVXNlclBhc3N3b3JkJyAgICAgIyBpZ25vcmUgVXNlclBhc3N3b3JkIGZpZWxkCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRFbnRyeS0+WzBdISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICBpZiAoCiAgICAgICAgJFBhcmFte1VzZXJFbWFpbH0KICAgICAgICAmJiAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkUGFyYW17VXNlckVtYWlsfSApCiAgICAgICAgJiYgZ3JlcCB7ICRfIGVxICRQYXJhbXtWYWxpZElEfSB9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRW1haWwgYWRkcmVzcyAoJFBhcmFte1VzZXJFbWFpbH0pIG5vdCB2YWxpZCAoIgogICAgICAgICAgICAgICAgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yKCkgLiAiKSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG9sZCB1c2VyIGRhdGEgKHB3KQogICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte0lEfSApOwoKICAgICMgaWYgd2UgdXBkYXRlIHRoZSBlbWFpbCBhZGRyZXNzLCBjaGVjayBpZiBpdCBhbHJlYWR5IGV4aXN0cwogICAgaWYgKAogICAgICAgICRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgJiYgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyRW1haWxVbmlxQ2hlY2t9CiAgICAgICAgJiYgbGMgJFBhcmFte1VzZXJFbWFpbH0gbmUgbGMgJFVzZXJEYXRhe1VzZXJFbWFpbH0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJVJlc3VsdCA9ICRTZWxmLT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRQYXJhbXtVc2VyRW1haWx9LAogICAgICAgICk7CiAgICAgICAgaWYgKCVSZXN1bHQpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoJ1RoaXMgZW1haWwgYWRkcmVzcyBpcyBhbHJlYWR5IGluIHVzZSBmb3IgYW5vdGhlciBjdXN0b21lciB1c2VyLicpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcXVvdGUgdmFsdWVzCiAgICBteSAlVmFsdWU7CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICggJEVudHJ5LT5bNV0gPX4gL15pbnQkL2kgKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gJFBhcmFteyAkRW50cnktPlswXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHVwZGF0ZSBkYgogICAgbXkgJFNRTCA9ICJVUERBVEUgJFNlbGYtPntDdXN0b21lclRhYmxlfSBTRVQgIjsKICAgIG15IEBCaW5kOwoKICAgIG15ICVTZWVuS2V5OyAgICAjIElmIHRoZSBtYXAgY29udGFpbnMgZHVwbGljYXRlZCBmaWVsZCBuYW1lcywgaW5zZXJ0IG9ubHkgb25jZS4KICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsgICAgICAgICAgICAjIHNraXAgZHluYW1pYyBmaWVsZHMKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgbmV4dCBFTlRSWSBpZiAoIGxjKCAkRW50cnktPlswXSApIGVxICJ1c2VycGFzc3dvcmQiICk7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkU2VlbktleXsgJEVudHJ5LT5bMl0gfSsrOwogICAgICAgICRTUUwgLj0gIiAkRW50cnktPlsyXSA9ID8sICI7CiAgICAgICAgcHVzaCBAQmluZCwgXCRWYWx1ZXsgJEVudHJ5LT5bMF0gfTsKICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAnY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtVc2VySUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgY2hvcCAkU1FMOwogICAgICAgIGNob3AgJFNRTDsKICAgIH0KCiAgICAkU1FMIC49ICcgV0hFUkUgJzsKCiAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcktleX0gPSA/IjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gIkxPV0VSKCRTZWxmLT57Q3VzdG9tZXJLZXl9KSA9IExPV0VSKD8pIjsKICAgIH0KICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17SUR9OwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZAogICAgKTsKCiAgICAjIGNoZWNrIGlmIHdlIG5lZWQgdG8gdXBkYXRlIEN1c3RvbWVyIFByZWZlcmVuY2VzCiAgICBpZiAoICRQYXJhbXtVc2VyTG9naW59IG5lICRVc2VyRGF0YXtVc2VyTG9naW59ICkgewoKICAgICAgICAjIHVwZGF0ZSB0aGUgcHJlZmVyZW5jZXMKICAgICAgICAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+UmVuYW1lUHJlZmVyZW5jZXMoCiAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgT2xkVXNlcklEID0+ICRVc2VyRGF0YXtVc2VyTG9naW59LAogICAgICAgICk7CiAgICB9CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlcjogJyRQYXJhbXtVc2VyTG9naW59JyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSAoJFBhcmFte1VzZXJJRH0pISIsCiAgICApOwoKICAgICMgY2hlY2sgcHcKICAgIGlmICggJFBhcmFte1VzZXJQYXNzd29yZH0gKSB7CiAgICAgICAgJFNlbGYtPlNldFBhc3N3b3JkKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgIFBXICAgICAgICA9PiAkUGFyYW17VXNlclBhc3N3b3JkfQogICAgICAgICk7CiAgICB9CgogICAgJFNlbGYtPl9DdXN0b21lclVzZXJDYWNoZUNsZWFyKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKICAgIGlmICggJFBhcmFte1VzZXJMb2dpbn0gbmUgJFVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJFNlbGYtPl9DdXN0b21lclVzZXJDYWNoZUNsZWFyKCBVc2VyTG9naW4gPT4gJFVzZXJEYXRhe1VzZXJMb2dpbn0gKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIFNldFBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIEtlcm5lbDo6U3lzdGVtOjpVc2VyOjpTZXRQYXNzd29yZCgpCgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRMb2dpbiA9ICRQYXJhbXtVc2VyTG9naW59OwogICAgbXkgJFB3ICAgID0gJFBhcmFte1BXfSB8fCAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJExvZ2luICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyTG9naW4hJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBUT0RPOiBhZGQgY2hlY2sgd2hldGhlciB0aGUgQ3VzdG9tZXJVc2VyIGV4aXN0cwoKICAgIG15ICRDcnlwdGVkUHcgPSAnJzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ29uZmlnU2VjdGlvbiA9ICdDdXN0b21lcjo6QXV0aE1vZHVsZTo6REInOwoKICAgIG15ICRDcnlwdFR5cGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIiR7Q29uZmlnU2VjdGlvbn06OkNyeXB0VHlwZSIpIHx8ICdzaGEyJzsKCiAgICBteSAkRW5jb2RlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpOwoKICAgICMgY3J5cHQgcGxhaW4gKG5vIGNyeXB0IGF0IGFsbCkKICAgIGlmICggJENyeXB0VHlwZSBlcSAncGxhaW4nICkgewogICAgICAgICRDcnlwdGVkUHcgPSAkUHc7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIFVOSVggY3J5cHQKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnY3J5cHQnICkgewoKICAgICAgICAjIGVuY29kZSBvdXRwdXQsIG5lZWRlZCBieSBjcnlwdCgpIG9ubHkgbm9uIHV0Zjggc2lnbnMKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkTG9naW4gKTsKCiAgICAgICAgJENyeXB0ZWRQdyA9IGNyeXB0KCAkUHcsICRMb2dpbiApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZUlucHV0KCBcJENyeXB0ZWRQdyApOwogICAgfQoKICAgICMgY3J5cHQgd2l0aCB1bml4X21kNV9jcnlwdAogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdtZDUnICkgewoKICAgICAgICAjIGVuY29kZSBvdXRwdXQsIG5lZWRlZCBieSB1bml4X21kNV9jcnlwdCgpIG9ubHkgbm9uIHV0Zjggc2lnbnMKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkTG9naW4gKTsKCiAgICAgICAgJENyeXB0ZWRQdyA9IHVuaXhfbWQ1X2NyeXB0KCAkUHcsICRMb2dpbiApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZUlucHV0KCBcJENyeXB0ZWRQdyApOwogICAgfQoKICAgICMgY3J5cHQgd2l0aCBtZDUgKGNvbXBhdGlibGUgd2l0aCBBcGFjaGUncyAuaHRwYXNzd2QgZmlsZXMpCiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ2FwcjEnICkgewoKICAgICAgICAjIGVuY29kZSBvdXRwdXQsIG5lZWRlZCBieSBhcGFjaGVfbWQ1X2NyeXB0KCkgb25seSBub24gdXRmOCBzaWducwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRMb2dpbiApOwoKICAgICAgICAkQ3J5cHRlZFB3ID0gYXBhY2hlX21kNV9jcnlwdCggJFB3LCAkTG9naW4gKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVJbnB1dCggXCRDcnlwdGVkUHcgKTsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggc2hhMQogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdzaGExJyApIHsKCiAgICAgICAgbXkgJFNIQU9iamVjdCA9IERpZ2VzdDo6U0hBLT5uZXcoJ3NoYTEnKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKICAgICAgICAkU0hBT2JqZWN0LT5hZGQoJFB3KTsKICAgICAgICAkQ3J5cHRlZFB3ID0gJFNIQU9iamVjdC0+aGV4ZGlnZXN0KCk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIHNoYTUxMgogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdzaGE1MTInICkgewoKICAgICAgICBteSAkU0hBT2JqZWN0ID0gRGlnZXN0OjpTSEEtPm5ldygnc2hhNTEyJyk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CiAgICAgICAgJFNIQU9iamVjdC0+YWRkKCRQdyk7CiAgICAgICAgJENyeXB0ZWRQdyA9ICRTSEFPYmplY3QtPmhleGRpZ2VzdCgpOwogICAgfQoKICAgICMgYmNyeXB0CiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ2JjcnlwdCcgKSB7CgogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJ0NyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0JykgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDdXN0b21lclVzZXI6ICckTG9naW4nIHRyaWVkIHRvIHN0b3JlIHBhc3N3b3JkIHdpdGggYmNyeXB0IGJ1dCAnQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQnIGlzIG5vdCBpbnN0YWxsZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJENvc3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIiR7Q29uZmlnU2VjdGlvbn06OmJjcnlwdENvc3QiKSAvLyAxMjsKCiAgICAgICAgIyBEb24ndCBhbGxvdyB2YWx1ZXMgc21hbGxlciB0aGFuIDkgZm9yIHNlY3VyaXR5LgogICAgICAgICRDb3N0ID0gOSBpZiAkQ29zdCA8IDk7CgogICAgICAgICMgQ3VycmVudCBDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdCBsaW1pdCBpcyAzMS4KICAgICAgICAkQ29zdCA9IDMxIGlmICRDb3N0ID4gMzE7CgogICAgICAgIG15ICRTYWx0ID0gJE1haW5PYmplY3QtPkdlbmVyYXRlUmFuZG9tU3RyaW5nKCBMZW5ndGggPT4gMTYgKTsKCiAgICAgICAgIyByZW1vdmUgVVRGOCBmbGFnLCByZXF1aXJlZCBieSBDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdAogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwoKICAgICAgICAjIGNhbGN1bGF0ZSBwYXNzd29yZCBoYXNoCiAgICAgICAgbXkgJE9jdGV0cyA9IENyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0OjpiY3J5cHRfaGFzaCgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5X251bCA9PiAxLAogICAgICAgICAgICAgICAgY29zdCAgICA9PiAkQ29zdCwKICAgICAgICAgICAgICAgIHNhbHQgICAgPT4gJFNhbHQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICRQdwogICAgICAgICk7CgogICAgICAgICMgV2Ugd2lsbCBzdG9yZSBjb3N0IGFuZCBzYWx0IGluIHRoZSBwYXNzd29yZCBzdHJpbmcgc28gdGhhdCBpdCBjYW4gYmUgZGVjb2RlZAogICAgICAgICMgICBpbiBmdXR1cmUgZXZlbiBpZiB3ZSB1c2UgYSBoaWdoZXIgY29zdCBieSBkZWZhdWx0LgogICAgICAgICRDcnlwdGVkUHcgPSAiQkNSWVBUOiRDb3N0OiRTYWx0OiIgLiBDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdDo6ZW5fYmFzZTY0KCRPY3RldHMpOwogICAgfQoKICAgICMgY3J5cHQgd2l0aCBzaGEyNTYgYXMgZmFsbGJhY2sKICAgIGVsc2UgewoKICAgICAgICBteSAkU0hBT2JqZWN0ID0gRGlnZXN0OjpTSEEtPm5ldygnc2hhMjU2Jyk7CgogICAgICAgICMgZW5jb2RlIG91dHB1dCwgbmVlZGVkIGJ5IHNoYTI1Nl9oZXgoKSBvbmx5IG5vbiB1dGY4IHNpZ25zCiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CgogICAgICAgICRTSEFPYmplY3QtPmFkZCgkUHcpOwogICAgICAgICRDcnlwdGVkUHcgPSAkU0hBT2JqZWN0LT5oZXhkaWdlc3QoKTsKICAgIH0KCiAgICAjIHVwZGF0ZSBkYgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzBdID1+IC9eVXNlclBhc3N3b3JkJC9pICkgewogICAgICAgICAgICAkUGFyYW17UGFzc3dvcmRDb2x9ID0gJEVudHJ5LT5bMl07CiAgICAgICAgfQogICAgICAgIGlmICggJEVudHJ5LT5bMF0gPX4gL15Vc2VyTG9naW4kL2kgKSB7CiAgICAgICAgICAgICRQYXJhbXtMb2dpbkNvbH0gPSAkRW50cnktPlsyXTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBuZWVkZWQgcHcgY29sLiBleGlzdHMgKGVsc2UgdGhlcmUgaXMgbm8gcHcgY29sLikKICAgIGlmICggJFBhcmFte1Bhc3N3b3JkQ29sfSAmJiAkUGFyYW17TG9naW5Db2x9ICkgewogICAgICAgIG15ICRTUUwgPSAiVVBEQVRFICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gU0VUICIKICAgICAgICAgICAgLiAiICRQYXJhbXtQYXNzd29yZENvbH0gPSA/ICIKICAgICAgICAgICAgLiAiIFdIRVJFICI7CgogICAgICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAgICAgJFNRTCAuPSAiJFBhcmFte0xvZ2luQ29sfSA9ID8iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFBhcmFte0xvZ2luQ29sfSkgPSBMT1dFUig/KSI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDcnlwdGVkUHcsIFwkUGFyYW17VXNlckxvZ2lufSBdLAogICAgICAgICk7CgogICAgICAgICMgbG9nIG5vdGljZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlcjogJyRQYXJhbXtVc2VyTG9naW59JyBjaGFuZ2VkIHBhc3N3b3JkIHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5fQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgbmVlZCBubyBwdyB0byBzZXQKICAgIHJldHVybiAxOwp9CgpzdWIgR2VuZXJhdGVSYW5kb21QYXNzd29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2VuZXJhdGVkIHBhc3N3b3JkcyBhcmUgZWlnaHQgY2hhcmFjdGVycyBsb25nIGJ5IGRlZmF1bHQKICAgIG15ICRTaXplID0gJFBhcmFte1NpemV9IHx8IDg7CgogICAgbXkgJFBhc3N3b3JkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoID0+ICRTaXplLAogICAgKTsKCiAgICByZXR1cm4gJFBhc3N3b3JkOwp9CgpzdWIgU2V0UHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlcklEfSApOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKc3ViIEdldFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgU2VhcmNoUHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlYXJjaFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBfQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntDYWNoZU9iamVjdH07CgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJMb2dpbn0iLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJOYW1lOjokUGFyYW17VXNlckxvZ2lufSIsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lcklEczo6JFBhcmFte1VzZXJMb2dpbn0iLAogICAgKTsKCiAgICAjIGRlbGV0ZSBhbGwgc2VhcmNoIGNhY2hlIGVudHJpZXMKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lcklETGlzdCcsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICk7CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWwnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgKTsKCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICdDdXN0b21lckdyb3VwJywKICAgICk7CgogICAgZm9yIG15ICRGdW5jdGlvbiAocXcoQ3VzdG9tZXJVc2VyTGlzdCkpIHsKICAgICAgICBmb3IgbXkgJFZhbGlkICggMCAuLiAxICkgewogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICBLZXkgID0+ICIke0Z1bmN0aW9ufTo6JHtWYWxpZH0iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIERFU1RST1kgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGRpc2Nvbm5lY3QgaWYgaXQncyBub3QgYSBwYXJlbnQgREJPYmplY3QKICAgIGlmICggJFNlbGYtPntOb3RQYXJlbnREQk9iamVjdH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0RCT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRpc2Nvbm5lY3QoKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/CustomerUser/LDAP.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAxYjgxMThiZmQ0NTBmOTc0NWI5N2YzZGQ0ZWE5Nzk0MjQ5YWFmMGEwIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvTERBUC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OkxEQVA7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTmV0OjpMREFQOwp1c2UgTmV0OjpMREFQOjpVdGlsIHF3KGVzY2FwZV9maWx0ZXJfdmFsdWUpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiMgRU8gUm90aGVyIE9TUwogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgZm9yIG15ICROZWVkZWQgKHF3KCBQcmVmZXJlbmNlc09iamVjdCBDdXN0b21lclVzZXJNYXAgKSkgewogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH0gfHwgZGllICJHb3Qgbm8gJE5lZWRlZCEiOwogICAgfQoKICAgICMgbWF4IHNob3duIHVzZXIgYSBzZWFyY2ggbGlzdAogICAgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0gfHwgMjAwOwoKICAgICMgZ2V0IGxkYXAgcHJlZmVyZW5jZXMKICAgICRTZWxmLT57RGllfSA9IDA7CiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0RpZX0gKSB7CiAgICAgICAgJFNlbGYtPntEaWV9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0RpZX07CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBwYXJhbXMKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1BhcmFtc30gKSB7CiAgICAgICAgJFNlbGYtPntQYXJhbXN9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1BhcmFtc307CiAgICB9CgogICAgIyBOZXQ6OkxEQVAgbmV3IHBhcmFtcwogICAgZWxzaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICdBdXRoTW9kdWxlOjpMREFQOjpQYXJhbXMnIC4gJFBhcmFte0NvdW50fSApICkgewogICAgICAgICRTZWxmLT57UGFyYW1zfSA9ICRDb25maWdPYmplY3QtPkdldCggJ0F1dGhNb2R1bGU6OkxEQVA6OlBhcmFtcycgLiAkUGFyYW17Q291bnR9ICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e1BhcmFtc30gPSB7fTsKICAgIH0KCiAgICAkU2VsZi0+e1N0YXJ0VExTfSA9ICRDb25maWdPYmplY3QtPkdldCggJ0F1dGhNb2R1bGU6OkxEQVA6OlN0YXJ0VExTJyAuICRQYXJhbXtDb3VudH0gKSB8fCAnJzsKCiAgICAjIGhvc3QKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0hvc3R9ICkgewogICAgICAgICRTZWxmLT57SG9zdH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57SG9zdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPkhvc3QgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBiYXNlIGRuCiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Jhc2VETn0gKSB7CiAgICAgICAgJFNlbGYtPntCYXNlRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Jhc2VETn07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPkJhc2VETiBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNjb3BlCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTU0NPUEV9ICkgewogICAgICAgICRTZWxmLT57U1Njb3BlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTU0NPUEV9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5TU0NPUEUgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZWFyY2ggdXNlcgogICAgJFNlbGYtPntTZWFyY2hVc2VyRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1VzZXJETn0gfHwgJyc7CiAgICAkU2VsZi0+e1NlYXJjaFVzZXJQd30gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57VXNlclB3fSB8fCAnJzsKCiAgICAjIGdyb3VwIGRuCiAgICAkU2VsZi0+e0dyb3VwRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0dyb3VwRE59IHx8ICcnOwoKICAgICMgY3VzdG9tZXIga2V5CiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fSApIHsKICAgICAgICAkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVyS2V5IGluIEtlcm5lbC9Db25maWcucG0nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3VzdG9tZXIgaWQKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntDdXN0b21lcklEfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVySUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+Q3VzdG9tZXJJRCBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxkYXAgZmlsdGVyIGFsd2F5cyB1c2VkCiAgICAkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57QWx3YXlzRmlsdGVyfSB8fCAnJzsKCiAgICAkU2VsZi0+e0V4Y2x1ZGVQcmltYXJ5Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9IHx8IDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hQcmVmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ID0gJyc7CiAgICB9CiAgICAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hTdWZmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hTdWZmaXh9ID0gJyonOwogICAgfQoKICAgICMgY2hhcnNldCBzZXR0aW5ncwogICAgJFNlbGYtPntTb3VyY2VDaGFyc2V0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTb3VyY2VDaGFyc2V0fSB8fCAnJzsKCiAgICAjIHNldCBjYWNoZSB0eXBlCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQ3VzdG9tZXJVc2VyJyAuICRQYXJhbXtDb3VudH07CgogICAgIyBjcmVhdGUgY2FjaGUgb2JqZWN0LCBidXQgb25seSBpZiBDYWNoZVRUTCBpcyBzZXQgaW4gY3VzdG9tZXIgY29uZmlnCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGZpbHRlciBpZiB1c2VkCiAgICAkU2VsZi0+e1ZhbGlkRmlsdGVyfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclZhbGlkRmlsdGVyfSB8fCAnJzsKCiAgICAjIGNvbm5lY3QgZmlyc3QgaWYgRGllIGlzIGVuYWJsZWQsIG1ha2Ugc3VyZSB0aGF0IGNvbm5lY3Rpb24gaXMgcG9zc2libGUsIGVsc2UgZGllCiAgICBpZiAoICRTZWxmLT57RGllfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwogICAgfQoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwoKICAgICMgQ2hlY2sgaWYgbXVsdGl0ZW5hbmN5IGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIGEgdXNlci4KICAgIGlmICggJExheW91dFBhcmFtLT57VXNlclR5cGV9ICYmICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSBlcSAnVXNlcicgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKCiAgICAgICAgIyBTYXZlIHRoZSBVc2VySUQgYW5kIGFsbCBncm91cHMgdGhlIHVzZXIgaGFzICdybycgcGVybWlzc2lvbiBvbi4KICAgICAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICMgT25seSBnZXQgdGhlIGdyb3VwIGxpc3Qgb25jZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkTGF5b3V0UGFyYW0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRoZSBsaW1pdCBkb2VzIG5vdCBjb3VudCBmb3IgbWVtYmVycyBvZiBhIHNwZWNpZmljIGdyb3VwLgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpIHx8ICcnOwogICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSAgID0gcmV2ZXJzZSAlR3JvdXBzOwoKICAgICAgICAgICAgaWYgKCAhJEdyb3Vwc1JldmVyc2V7JFBlcm1pc3Npb25Hcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeX0gPSAkTGF5b3V0UGFyYW0tPntVc2VySUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBJRHN9ID0gWyBzb3J0IGtleXMgJUdyb3VwcyBdOwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBzfSAgID0gWyB2YWx1ZXMgJUdyb3VwcyBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgX0Nvbm5lY3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHJldHVybiBpZiBjb25uZWN0aW9uIGlzIGFscmVhZHkgb3BlbgogICAgcmV0dXJuIDEgaWYgJFNlbGYtPntMREFQfTsKCiAgICAjIGxkYXAgY29ubmVjdCBhbmQgYmluZCAobWF5YmUgd2l0aCBTZWFyY2hVc2VyRE4gYW5kIFNlYXJjaFVzZXJQdykKICAgICRTZWxmLT57TERBUH0gPSBOZXQ6OkxEQVAtPm5ldyggJFNlbGYtPntIb3N0fSwgJXsgJFNlbGYtPntQYXJhbXN9IH0gKTsKCiAgICBpZiAoICEkU2VsZi0+e0xEQVB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgICAgICBkaWUgIkNhbid0IGNvbm5lY3QgdG8gJFNlbGYtPntIb3N0fTogJEAiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbm5lY3QgdG8gJFNlbGYtPntIb3N0fTogJEAiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkU2VsZi0+e1N0YXJ0VExTfSApIHsKICAgICAgICBteSAkU3RhcnRlZCA9ICRTZWxmLT57TERBUH0tPnN0YXJ0X3RscyggdmVyaWZ5ID0+ICRTZWxmLT57U3RhcnRUTFN9ICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0ZWQgKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgICAgICAgICAgZGllICJzdGFydF90bHMgb24gJFNlbGYtPntIb3N0fSBmYWlsZWQ6ICRAIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gInN0YXJ0X3RsczogJyRTZWxmLT57U3RhcnRUTFN9JyBvbiAkU2VsZi0+e0hvc3R9IGZhaWxlZDogJEAiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TERBUH0tPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUmVzdWx0OwogICAgaWYgKCAkU2VsZi0+e1NlYXJjaFVzZXJETn0gJiYgJFNlbGYtPntTZWFyY2hVc2VyUHd9ICkgewogICAgICAgICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5iaW5kKAogICAgICAgICAgICBkbiAgICAgICA9PiAkU2VsZi0+e1NlYXJjaFVzZXJETn0sCiAgICAgICAgICAgIHBhc3N3b3JkID0+ICRTZWxmLT57U2VhcmNoVXNlclB3fSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPmJpbmQoKTsKICAgIH0KCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ZpcnN0IGJpbmQgZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TERBUH0tPmRpc2Nvbm5lY3QoKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBDdXN0b21lck5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBidWlsZCBmaWx0ZXIKICAgIG15ICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkUGFyYW17VXNlckxvZ2lufSApIC4gJyknOwoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdDdXN0b21lck5hbWU6OicgLiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTmFtZSBpZiBkZWZpbmVkICROYW1lOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciAgICA9PiAkRmlsdGVyLAogICAgICAgIHNpemVsaW1pdCA9PiAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSwKICAgICk7CgogICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgKSB7CiAgICAgICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgPT0gNCApIHsKCiAgICAgICAgICAgICMgUmVzdWx0IGNvZGUgNCAoTERBUF9TSVpFTElNSVRfRVhDRUVERUQpIGlzIG5vcm1hbCBpZiB0aGVyZQogICAgICAgICAgICAjIGFyZSBtb3JlIGl0ZW1zIGluIExEQVAgdGhhbiBzZWFyY2ggbGltaXQgZGVmaW5lZCBpbiBPVE9CTyBvcgogICAgICAgICAgICAjIGluIExEQVAgc2VydmVyLiBBdm9pZCBzcGFtbWluZyBsb2dzIHdpdGggc3VjaCBlcnJvcnMuCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMREFQIHNpemUgbGltaXQgZXhjZWVkZWQgKCcgLiAkUmVzdWx0LT5lcnJvcigpIC4gJykuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2ggZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVOYW1lUGFydHM7CgogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHQtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRFbnRyeS0+Z2V0X3ZhbHVlKCRGaWVsZCkgKSB7CiAgICAgICAgICAgICAgICAkTmFtZVBhcnRzeyRGaWVsZH0gPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkRW50cnktPmdldF92YWx1ZSgkRmllbGQpICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgbXkgQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9CiAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTmFtZUZpZWxkc30gfTsKICAgIGlmIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgewogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBEWU5BTUlDRklFTEROQU1FOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gWyRWYWx1ZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBSZW5kZXJlZFZhbHVlczsKCiAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIWRlZmluZWQgJEN1cnJlbnRWYWx1ZSB8fCAhbGVuZ3RoICRDdXJyZW50VmFsdWU7CgogICAgICAgICAgICAgICAgbXkgJFJlbmRlcmVkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlbmRlcmVkVmFsdWUpIHx8ICFkZWZpbmVkICRSZW5kZXJlZFZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlbmRlcmVkVmFsdWVzLCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE5hbWVQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFJlbmRlcmVkVmFsdWVzOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzc2VtYmxlIG5hbWUKICAgIG15IEBOYW1lUGFydHM7CiAgICBDVVNUT01FUlVTRVJOQU1FRklFTEQ6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlck5hbWVGaWVsZCAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHN9IH0gKSB7CiAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJOQU1FRklFTEQKICAgICAgICAgICAgaWYgIWV4aXN0cyAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFkZWZpbmVkICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH0KICAgICAgICAgICAgfHwgIWxlbmd0aCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9OwogICAgICAgIHB1c2ggQE5hbWVQYXJ0cywgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgIH0KCiAgICBteSAkSm9pbkNoYXJhY3RlciA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHNKb2lufSAvLyAnICc7CiAgICBteSAkTmFtZSAgICAgICAgICA9IGpvaW4gJEpvaW5DaGFyYWN0ZXIsIEBOYW1lUGFydHM7CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVyTmFtZTo6JyAuICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBWYWx1ZSA9PiAkTmFtZSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICROYW1lOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRQYXJhbXtDdXN0b21lcklEUmF3fSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJJRH0gPSAkUGFyYW17Q3VzdG9tZXJJRFJhd307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte1NlYXJjaH0KICAgICAgICAmJiAhJFBhcmFte1VzZXJMb2dpbn0KICAgICAgICAmJiAhJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9CiAgICAgICAgJiYgISRQYXJhbXtDdXN0b21lcklEfQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2VhcmNoLCBVc2VyTG9naW4sIFBvc3RNYXN0ZXJTZWFyY2gsIEN1c3RvbWVySURSYXcgb3IgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYnVpbGQgZmlsdGVyCiAgICBteSAkRmlsdGVyID0gJyc7CiAgICBpZiAoICRQYXJhbXtTZWFyY2h9ICkgewoKICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgIG15IEBQYXJ0cyA9IHNwbGl0KCAvXCsvLCAkUGFyYW17U2VhcmNofSwgNiApOwogICAgICAgIGZvciBteSAkUGFydCAoQFBhcnRzKSB7CgogICAgICAgICAgICAkUGFydCA9ICRTZWxmLT57U2VhcmNoUHJlZml4fSAuICRQYXJ0IC4gJFNlbGYtPntTZWFyY2hTdWZmaXh9OwogICAgICAgICAgICAkUGFydCA9fiBzLyhcJSspL1wlL2c7CiAgICAgICAgICAgICRQYXJ0ID1+IHMvKFwqKylcKi8qL2c7CiAgICAgICAgICAgICRDb3VudCsrOwoKICAgICAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcwogICAgICAgICAgICAjIGFzIHRoZXkgY2Fubm90IGJlIHJldHJpZXZlZCBoZXJlCiAgICAgICAgICAgIG15IEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfQogICAgICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzfSB9OwoKICAgICAgICAgICAgaWYgKEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgICAgICAgICAjIHF1b3RlIExEQVAgZmlsdGVyIHZhbHVlIGJ1dCBrZWVwIGFzdGVyaXNrcyB1bmVzY2FwZWQgKHdpbGRjYXJkKQogICAgICAgICAgICAgICAgJFBhcnQgPX4gcy9cKi9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC9nOwogICAgICAgICAgICAgICAgJFBhcnQgPSBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkU2VsZi0+X0NvbnZlcnRUbygkUGFydCkgKTsKICAgICAgICAgICAgICAgICRQYXJ0ID1+IHMvZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvKi9nOwoKICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gJyh8JzsKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMpIHsKICAgICAgICAgICAgICAgICAgICAkRmlsdGVyIC49ICIoJEZpZWxkPSIgLiAkUGFydCAuICcpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gJyknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgcXVvdGUgTERBUCBmaWx0ZXIgdmFsdWUgYnV0IGtlZXAgYXN0ZXJpc2tzIHVuZXNjYXBlZCAod2lsZGNhcmQpCiAgICAgICAgICAgICAgICAkUGFydCA9fiBzL1wqL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwL2c7CiAgICAgICAgICAgICAgICAkUGFydCA9IGVzY2FwZV9maWx0ZXJfdmFsdWUoJFBhcnQpOwogICAgICAgICAgICAgICAgJFBhcnQgPX4gcy9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC8qL2c7CgogICAgICAgICAgICAgICAgJEZpbHRlciAuPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiAkUGFydCAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ291bnQgPiAxICkgewogICAgICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlcikiOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICkgewoKICAgICAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcwogICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICBteSBAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAhZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9CiAgICAgICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHN9IH07CgogICAgICAgIGlmIChAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcykgewoKICAgICAgICAgICAgIyBxdW90ZSBMREFQIGZpbHRlciB2YWx1ZSBidXQga2VlcCBhc3Rlcmlza3MgdW5lc2NhcGVkICh3aWxkY2FyZCkKICAgICAgICAgICAgJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ID1+IHMvXCovZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvZzsKICAgICAgICAgICAgJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ID0gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICk7CiAgICAgICAgICAgICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSA9fiBzL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwLyovZzsKCiAgICAgICAgICAgICRGaWx0ZXIgPSAnKHwnOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcykgewogICAgICAgICAgICAgICAgJEZpbHRlciAuPSAiKCRGaWVsZD0kUGFyYW17UG9zdE1hc3RlclNlYXJjaH0pIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRmlsdGVyIC49ICcpJzsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkUGFyYW17VXNlckxvZ2lufSApIC4gJyknOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJJRH0gKSB7CgogICAgICAgICMgJFBhcmFte0N1c3RvbWVySURSYXd9IGlzIGFsc28gaGFuZGxlZCBpbiB0aGUgdGhpcyBibG9jawogICAgICAgICMgdGhlcmUgaXMgbm8gJyonIHdpbGRjYXJkIGV4cGFuc2lvbiB3aGVuIHNlYXJjaGluZyBmb3IgQ3VzdG9tZXJJRAogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09IiAuIGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtDdXN0b21lcklEfSApIC4gJyknOwogICAgfQoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBhZGQgdmFsaWQgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57VmFsaWRGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntWYWxpZEZpbHRlcn0pIjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSBqb2luICc6OicsIG1hcCB7ICRfIC4gJz0nIC4gJFBhcmFteyRffSB9IHNvcnQga2V5cyAlUGFyYW07CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIFVzZSBjYWNoZSBmb3IgbXVsdGl0ZW5hbmN5LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JFVzZXJzfSBpZiByZWYgJFVzZXJzIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBsZGFwIGNvbm5lY3QKICAgIHJldHVybiBpZiAhJFNlbGYtPl9Db25uZWN0KCk7CgogICAgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHMgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKCiAgICAjIGNvbWJpbmUgbmVlZGVkIGF0dHJzCiAgICBteSBAQXR0cmlidXRlcyA9ICggQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcywgJFNlbGYtPntDdXN0b21lcktleX0gKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIERvbid0IHNlYXJjaCBmb3IgY3VzdG9tZXIgdXNlcnMgd2l0aG91dCBncm91cCBwZXJtaXNzaW9uLgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgbXkgJEdyb3VwSURBdHRyOwogICAgICAgIGZvciBteSAkTWFwICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICBpZiAoICRNYXAtPlswXSBlcSAnVXNlckdyb3VwSUQnICkgewogICAgICAgICAgICAgICAgJEdyb3VwSURBdHRyID0gJE1hcC0+WzJdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFRoZSBzb3VyY2Ugc3VwcG9ydHMgbXVsdGl0ZW5hbmN5LgogICAgICAgIGlmICgkR3JvdXBJREF0dHIpIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICAgICAgICAgICMgVE9ETzogV29ya2Fyb3VuZCB1bnRpbCB0aGUgc2VhcmNoIGdldHMgY2hhbmdlZC4gU2VlIEN1c3RvbWVyVXNlci9MREFQLnBtIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgJFBhcmFte0xpbWl0fSA9IDEwMDAwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UgbWF0Y2ggZm9yIGdyb3VwIElEcyBvciBncm91cCBuYW1lcy4KICAgICAgICAgICAgbXkgQFVzZXJHcm91cHMgPSAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gPyBAeyAkU2VsZi0+e1VzZXJHcm91cHN9IH0gOiBAeyAkU2VsZi0+e1VzZXJHcm91cElEc30gfTsKCiAgICAgICAgICAgICMgUmVtYXAgbG9jYWwgZ3JvdXBzIHRvIHJlbW90ZSBncm91cHMuCiAgICAgICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NhbEdyb3VwID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgIEBVc2VyR3JvdXBzID0gbWFwIHsgJF8gZXEgJExvY2FsR3JvdXAgPyAkUmVtb3RlR3JvdXAgOiAkXyB9IEBVc2VyR3JvdXBzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEJ1aWxkIGZpbHRlciBzdHJpbmcuIElmIHRoZSBmaWVsZCBpcyBlbXB0eSwgd2UgaGF2ZSBhY2Nlc3MgYnkgZGVmYXVsdC4KICAgICAgICAgICAgbXkgJEFkZGl0aW9uYWxGaWx0ZXIgPSAiKHwoISgkR3JvdXBJREF0dHI9KikpIjsKICAgICAgICAgICAgZm9yIG15ICRVc2VyR3JvdXAgKEBVc2VyR3JvdXBzKSB7CiAgICAgICAgICAgICAgICAkQWRkaXRpb25hbEZpbHRlciAuPSAiKCRHcm91cElEQXR0cj0kVXNlckdyb3VwKSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEFkZGl0aW9uYWxGaWx0ZXIgLj0gJykpJzsKCiAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBsYXN0IGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGFkZCB0aGUgY3VzdG9tIGZpbHRlciB0byB0aGUgc2VhcmNoLgogICAgICAgICAgICAkRmlsdGVyID0gc3Vic3RyICRGaWx0ZXIsIDAsIC0xOwogICAgICAgICAgICAkRmlsdGVyIC49ICRBZGRpdGlvbmFsRmlsdGVyOwogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgcGVyZm9ybSB1c2VyIHNlYXJjaAogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntCYXNlRE59LAogICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgZmlsdGVyICAgID0+ICRGaWx0ZXIsCiAgICAgICAgc2l6ZWxpbWl0ID0+ICRQYXJhbXtMaW1pdH0gfHwgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICBhdHRycyAgICAgPT4gXEBBdHRyaWJ1dGVzLAogICAgKTsKCiAgICAjIGxvZyBsZGFwIGVycm9ycwogICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgKSB7CiAgICAgICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgPT0gNCApIHsKCiAgICAgICAgICAgICMgUmVzdWx0IGNvZGUgNCAoTERBUF9TSVpFTElNSVRfRVhDRUVERUQpIGlzIG5vcm1hbCBpZiB0aGVyZQogICAgICAgICAgICAjIGFyZSBtb3JlIGl0ZW1zIGluIExEQVAgdGhhbiBzZWFyY2ggbGltaXQgZGVmaW5lZCBpbiBPVE9CTyBvcgogICAgICAgICAgICAjIGluIExEQVAgc2VydmVyLiBBdm9pZCBzcGFtbWluZyBsb2dzIHdpdGggc3VjaCBlcnJvcnMuCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMREFQIHNpemUgbGltaXQgZXhjZWVkZWQgKCcgLiAkUmVzdWx0LT5lcnJvcigpIC4gJykuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2ggZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBkeW5hbWljIGZpZWxkIGhhbmRsaW5nCiAgICBteSBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwogICAgbXkgJUN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzID0gbWFwICB7ICRfID0+IDEgfSBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHM7CgogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwogICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgbXkgJVVzZXJzOwogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHQtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIG15ICRDdXN0b21lclN0cmluZyA9ICcnOwoKICAgICAgICBteSAkQ3VzdG9tZXJLZXk7CiAgICAgICAgaWYgKCBkZWZpbmVkICRFbnRyeS0+Z2V0X3ZhbHVlKCAkU2VsZi0+e0N1c3RvbWVyS2V5fSApICkgewogICAgICAgICAgICAkQ3VzdG9tZXJLZXkgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkRW50cnktPmdldF92YWx1ZSggJFNlbGYtPntDdXN0b21lcktleX0gKSApOwogICAgICAgIH0KCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyBkeW5hbWljIGZpZWxkIHZhbHVlCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzeyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICFkZWZpbmVkICRDdXN0b21lcktleTsKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgIWV4aXN0cyAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRmllbGR9OwoKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSBbJFZhbHVlXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBAVmFsdWVzOwoKICAgICAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50VmFsdWUgKCBAeyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhZGVmaW5lZCAkQ3VycmVudFZhbHVlIHx8ICFsZW5ndGggJEN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlYWRhYmxlVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkQ3VycmVudFZhbHVlLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRSZWFkYWJsZVZhbHVlKSB8fCAhZGVmaW5lZCAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUG9zc2libGVWYWx1ZXMtPnsgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSA9ICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWx1ZXMsICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDdXN0b21lclN0cmluZyAuPSAoIGpvaW4gJyAnLCBAVmFsdWVzICkgLiAnICc7CgogICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPl9Db252ZXJ0RnJvbSggJEVudHJ5LT5nZXRfdmFsdWUoJEZpZWxkKSApOwoKICAgICAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgPX4gL150YXJnZXRhZGRyZXNzJC9pICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9fiBzL1NNVFA6KC4qKS8kMS87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJTdHJpbmcgLj0gJFZhbHVlIC4gJyAnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkQ3VzdG9tZXJTdHJpbmcgPX4gcy9eKC4qKVxzKC4rP1xALis/XC4uKz8pKFxzfCkkLyIkMSIgPCQyPi87CgogICAgICAgIGlmICggZGVmaW5lZCAkQ3VzdG9tZXJLZXkgKSB7CiAgICAgICAgICAgICRVc2Vyc3skQ3VzdG9tZXJLZXl9ID0gJEN1c3RvbWVyU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgbmVlZCB0byBiZSBpbiBhIGdyb3VwIQogICAgaWYgKCAkU2VsZi0+e0dyb3VwRE59ICkgewoKICAgICAgICBmb3IgbXkgJEZpbHRlcjIgKCBzb3J0IGtleXMgJVVzZXJzICkgewoKICAgICAgICAgICAgbXkgJFJlc3VsdDIgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntHcm91cEROfSwKICAgICAgICAgICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgICAgICAgICBmaWx0ZXIgICAgPT4gJ21lbWJlclVpZD0nIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSgkRmlsdGVyMiksCiAgICAgICAgICAgICAgICBzaXplbGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgICAgICAgICAgYXR0cnMgICAgID0+IFsnMS4xJ10sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzdWx0Mi0+YWxsX2VudHJpZXMoKSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkVXNlcnN7JEZpbHRlcjJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJVVzZXJzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJVVzZXJzOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2hEZXRhaWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRmllbGRzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBSZXR1cm4gb25seSB2YWxpZCB1c2VycyBwZXIgZGVmYXVsdAogICAgbXkgJFZhbGlkID0gJFBhcmFte1ZhbGlkfSAvLyAxOwoKICAgICRQYXJhbXtMaW1pdH0gLy89ICcnOwoKICAgICMgU3BsaXQgdGhlIHNlYXJjaCBmaWVsZHMgaW4gc2NhbGFyIGFuZCBhcnJheSBmaWVsZHMsIGJlZm9yZSB0aGUgZGlmZnJlbnQgaGFuZGxpbmcuCiAgICBteSBAU2NhbGFyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICdJbnB1dCcgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CiAgICBteSBAQXJyYXlTZWFyY2hGaWVsZHMgID0gZ3JlcCB7ICdTZWxlY3Rpb24nIGVxICRfLT57VHlwZX0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgICMgVmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXlyZWYuCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKEBBcnJheVNlYXJjaEZpZWxkcykgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9ICkgewogICAgICAgICAgICAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gfHw9IFtdOwoKICAgICAgICAgICAgbmV4dCBBUkdVTUVOVDsKICAgICAgICB9CgogICAgICAgIGlmICggcmVmICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50LT57TmFtZX0gbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNldCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHRoZSByZXR1cm4gdHlwZS4KICAgIG15ICRSZXN1bHQgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwoKICAgICMgU3BlY2lhbCBoYW5kbGluZyBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewoKICAgICAgICAjIElnbm9yZSB0aGUgcGFyYW1ldGVyICdMaW1pdCcgd2hlbiByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgICAgICRQYXJhbXtMaW1pdH0gPSAnJzsKCiAgICAgICAgIyBEZWxldGUgdGhlIE9yZGVyQnkgcGFyYW1ldGVyIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte09yZGVyQnl9ID0gW107CiAgICB9CgogICAgIyBEZWZpbmUgb3JkZXIgdGFibGUgZnJvbSB0aGUgc2VhcmNoIGZpZWxkcy4KICAgIG15ICVPcmRlckJ5VGFibGUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfLT57RGF0YWJhc2VGaWVsZH0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICBteSAkU2VsZWN0aW9uc0RhdGEgPSAkRmllbGQtPntTZWxlY3Rpb25zRGF0YX07CgogICAgICAgIGZvciBteSAkU2VsZWN0ZWRWYWx1ZSAoIEB7ICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSB9ICkgewoKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAgICBpZiAoICEkU2VsZWN0aW9uc0RhdGEtPnskU2VsZWN0ZWRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgc2VsZWN0ZWQgdmFsdWUgJEZpZWxkLT57TmFtZX0gaXMgbm90IHZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgQnVpbGQgdGhlIGxkYXAgZmlsdGVyIGZvciB0aGUgZGlmZnJlbnQgc2VhcmNoIHBhcmFtcy4KICAgIG15ICRGaWx0ZXIgPSAnJzsKCiAgICBmb3IgbXkgJEZpZWxkIChAU2NhbGFyU2VhcmNoRmllbGRzKSB7CgogICAgICAgICMgU2VhcmNoIGZvciBzY2FsYXIgZmllbGRzICh3aWxkY2FyZHMgYXJlIGFsbG93ZWQpLgogICAgICAgIGlmICggJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ICkgewoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHMvKFwlKykvXCUvZzsKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHMvKFwqKylcKi8qL2c7CgogICAgICAgICAgICAkRmlsdGVyIC49ICIoJEZpZWxkLT57RGF0YWJhc2VGaWVsZH09IiAuICRTZWxmLT5fQ29udmVydFRvKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gKSAuICIpIjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRGaWx0ZXIpIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlcikiOwogICAgfQoKICAgIG15ICRBcnJheUZpbHRlciA9ICcnOwoKICAgICMgU3BlY2lhbCBwYXJhbWV0ZXIgZm9yIEN1c3RvbWVySURzIGZyb20gYSBjdXN0b21lciBjb21wYW55IHNlYXJjaCByZXN1bHQuCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0N1c3RvbWVyQ29tcGFueVNlYXJjaEN1c3RvbWVySURzfSApICkgewogICAgICAgICRBcnJheUZpbHRlciAuPSAnKHwnOwogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17Q3VzdG9tZXJDb21wYW55U2VhcmNoQ3VzdG9tZXJJRHN9IH0gKSB7CiAgICAgICAgICAgICRBcnJheUZpbHRlciAuPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09IiAuICRTZWxmLT5fQ29udmVydFRvKCRPbmVQYXJhbSkgLiAiKSI7CiAgICAgICAgfQogICAgICAgICRBcnJheUZpbHRlciAuPSAnKSc7CiAgICB9CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgIyBJZ25vcmUgZW1wdHkgbGlzdHMuCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH07CgogICAgICAgICRBcnJheUZpbHRlciAuPSAnKHwnOwogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfSApIHsKICAgICAgICAgICAgJEFycmF5RmlsdGVyIC49ICIoJEZpZWxkLT57RGF0YWJhc2VGaWVsZH09IiAuICRTZWxmLT5fQ29udmVydFRvKCRPbmVQYXJhbSkgLiAiKSI7CiAgICAgICAgfQogICAgICAgICRBcnJheUZpbHRlciAuPSAnKSc7CiAgICB9CgogICAgIyBBZGQgdGhlIGFycmF5IGZpbHRlciBmaWVsZHMgdG8gdGhlIGxkYXAgZmlsdGVyLgogICAgaWYgKCRBcnJheUZpbHRlcikgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJEFycmF5RmlsdGVyKSI7CiAgICB9CgogICAgbXkgJERCT2JqZWN0ICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBDaGVjayBhbGwgY29uZmlndXJlZCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMsIGJ1aWxkIGxvb2t1cCBoYXNoIGJ5IG5hbWUuCiAgICBteSAlQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkTmFtZTJDb25maWc7CiAgICBteSAkQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICk7CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgICRDdXN0b21lclVzZXJEeW5hbWljRmllbGROYW1lMkNvbmZpZ3sgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgIG15ICRTUUxEeW5hbWljRmllbGRGcm9tICAgICA9ICcnOwogICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlICAgID0gJyc7CiAgICBteSAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIgPSAxOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkc30gKSB7CgogICAgICAgIG15ICRTZWFyY2hQYXJhbSA9ICRQYXJhbXsgIkR5bmFtaWNGaWVsZF8iIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH07CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggISRTZWFyY2hQYXJhbSApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggcmVmICRTZWFyY2hQYXJhbSBuZSAnSEFTSCcgKTsKCiAgICAgICAgbXkgJE5lZWRKb2luOwoKICAgICAgICBmb3IgbXkgJE9wZXJhdG9yICggc29ydCBrZXlzICV7JFNlYXJjaFBhcmFtfSApIHsKCiAgICAgICAgICAgIG15IEBTZWFyY2hQYXJhbXMgPSAoIHJlZiAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IGVxICdBUlJBWScgKQogICAgICAgICAgICAgICAgPyBAeyAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IH0KICAgICAgICAgICAgICAgIDogKCAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9ICk7CgogICAgICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnJzsKICAgICAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyBBTkQgKCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnICgnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIFRFWFQ6CiAgICAgICAgICAgIGZvciBteSAkVGV4dCAoQFNlYXJjaFBhcmFtcykgewogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICggIWRlZmluZWQgJFRleHQgfHwgJFRleHQgZXEgJycgKTsKCiAgICAgICAgICAgICAgICAkVGV4dCA9fiBzL1wqLyUvZ2k7CgogICAgICAgICAgICAgICAgIyBDaGVjayBzZWFyY2ggYXR0cmlidXRlLCB3ZSBkbyBub3QgbmVlZCB0byBzZWFyY2ggZm9yICcqJy4KICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAkVGV4dCA9fiAvXlwlezEsM30kLzsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGVTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSB8fCAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRWYWxpZGF0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHZhbHVlICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRUZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICInIG9uIGZpZWxkICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGQtPntOYW1lfSAuICInISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoU1FMR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIiwKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciAgICAgICAgICAgPT4gJE9wZXJhdG9yLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFRlcm0gICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJykgJzsKCiAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlIC49ICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YjsKICAgICAgICAgICAgICAgICROZWVkSm9pbiA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkTmVlZEpvaW4pIHsKICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZEZyb20gLj0gIgogICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBkeW5hbWljX2ZpZWxkX3ZhbHVlIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlcgogICAgICAgICAgICAgICAgICAgIE9OIChkZl9vYmpfaWRfbmFtZS5vYmplY3RfaWQgPSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIub2JqZWN0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIuZmllbGRfaWQgPSAiCiAgICAgICAgICAgICAgICAuICREQk9iamVjdC0+UXVvdGUoICREeW5hbWljRmllbGQtPntJRH0sICdJbnRlZ2VyJyApIC4gIikKICAgICAgICAgICAgIjsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRKb2luQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIEV4ZWN1dGUgYSBkeW5hbWljIGZpZWxkIHNlYXJjaCwgaWYgYSBkeW5hbWljIGZpZWxkIHdoZXJlIHN0YXRlbWVudCBleGlzdHMuCiAgICBpZiAoJFNRTER5bmFtaWNGaWVsZFdoZXJlKSB7CgogICAgICAgIG15IEBEeW5hbWljRmllbGRVc2VyTG9naW5zOwoKICAgICAgICAjIHNxbCB1ZXJ5IGZvciB0aGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkID0gIlNFTEVDVCBESVNUSU5DVChkZl9vYmpfaWRfbmFtZS5vYmplY3RfbmFtZSkgRlJPTSBkeW5hbWljX2ZpZWxkX29ial9pZF9uYW1lIGRmX29ial9pZF9uYW1lICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkRnJvbQogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKCiAgICAgICAgbXkgJFVzZWRDYWNoZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkVXNlckxvZ2lucyA9IEB7JER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YX07CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHRoZSB1c2VkIGNhY2hlIGZsYWcKICAgICAgICAgICAgICAgICAgICAkVXNlZENhY2hlID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEdldCB0aGUgZGF0YSBvbmx5IGZyb20gZGF0YWJhc2UsIGlmIG5vIGNhY2hlIGVudHJ5IGV4aXN0cy4KICAgICAgICBpZiAoICEkVXNlZENhY2hlICkgewoKICAgICAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgICAgICBTUUwgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkVXNlckxvZ2lucywgJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBEeW5hbWljRmllbGRVc2VyTG9naW5zLAogICAgICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWRkIHRoZSB1c2VyIGxvZ2lucyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkcywgaWYgYSBzZWFyY2ggcmVzdWx0IGV4aXN0cyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaAogICAgICAgICMgICBvciBza2lwIHRoZSBzZWFyY2ggYW5kIHJldHVybiBhIGVtcHRyeSBhcnJheSByZWYsIGlmIG5vIHVzZXIgbG9naW5zIGV4aXN0cyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaC4KICAgICAgICBpZiAoQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMpIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRVc2VyTG9naW5zRmlsdGVyID0gJyh8JzsKICAgICAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMpIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRVc2VyTG9naW5zRmlsdGVyIC49ICIoJFNlbGYtPntDdXN0b21lcktleX09IiAuICRTZWxmLT5fQ29udmVydFRvKCRPbmVQYXJhbSkgLiAiKSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZFVzZXJMb2dpbnNGaWx0ZXIgLj0gJyknOwoKICAgICAgICAgICAgIyBBZGQgdGhlIGR5bmFtaWMgZmllbGQgdXNlciBsb2dpbnMgZmlsdGVyIHRvIHRoZSBsZGFwIGZpbHRlci4KICAgICAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkRHluYW1pY0ZpZWxkVXNlckxvZ2luc0ZpbHRlcikiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRSZXN1bHQgZXEgJ0NPVU5UJyA/IDAgOiBbXTsKICAgICAgICB9CiAgICB9CgogICAgIyBTcGVjaWFsIHBhcmFtZXRlciB0byBleGNsdWRlIHNvbWUgdXNlciBsb2dpbnMgZnJvbSB0aGUgc2VhcmNoIHJlc3VsdC4KICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RXhjbHVkZVVzZXJMb2dpbnN9ICkgKSB7CiAgICAgICAgbXkgJEV4Y2x1ZGVVc2VyTG9naW5zRmlsdGVyID0gJygmJzsKICAgICAgICBmb3IgbXkgJE9uZVBhcmFtICggQHsgJFBhcmFte0V4Y2x1ZGVVc2VyTG9naW5zfSB9ICkgewogICAgICAgICAgICAkRXhjbHVkZVVzZXJMb2dpbnNGaWx0ZXIgLj0gIighKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiAkU2VsZi0+X0NvbnZlcnRUbygkT25lUGFyYW0pIC4gIikpIjsKICAgICAgICB9CiAgICAgICAgJEV4Y2x1ZGVVc2VyTG9naW5zRmlsdGVyIC49ICcpJzsKCiAgICAgICAgIyBBZGQgdGhlIGV4Y2x1ZGUgdXNlciBsb2dpbnMgZmlsdGVyIHRvIHRoZSBsZGFwIGZpbHRlci4KICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRFeGNsdWRlVXNlckxvZ2luc0ZpbHRlcikiOwogICAgfQoKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1ZhbGlkRmlsdGVyfSAmJiAkVmFsaWQgKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkU2VsZi0+e1ZhbGlkRmlsdGVyfSkiOwogICAgfQoKICAgICMgRGVmYXVsdCBmaWx0ZXIgZm9yIHRoZSBzZWFyY2gsIGlmIG5vIGZpbHRlciBleGlzdHMuCiAgICBpZiAoICEkRmlsdGVyICkgewogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSopIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnkgY29udGFpbnMgb25seSB1bmlxdWUgdmFsaWQgdmFsdWVzLgogICAgbXkgJU9yZGVyQnlTZWVuOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIGlmICggISRPcmRlckJ5IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeSBjb250YWlucyBpbnZhbGlkIHZhbHVlICckT3JkZXJCeScgb3IgdGhlIHZhbHVlIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBSZW1lbWJlciB0aGUgdmFsdWUgdG8gY2hlY2sgaWYgaXQgYXBwZWFycyBtb3JlIHRoYW4gb25jZS4KICAgICAgICAkT3JkZXJCeVNlZW57JE9yZGVyQnl9ID0gMTsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnlEaXJlY3Rpb24gYXJyYXkgY29udGFpbnMgb25seSAnVXAnIG9yICdEb3duJy4KICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgT25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkLgogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ1VwJzsKICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdEb3duJzsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5RGlyZWN0aW9uIGNhbiBvbmx5IGNvbnRhaW4gJ1VwJyBvciAnRG93bichIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEFzc2VtYmxlIHRoZSBPUkRFUiBCWSBjbGF1c2UuCiAgICBteSBAT3JkZXJCeUZpZWxkczsKICAgIG15ICRPcmRlckJ5U3RyaW5nID0gJyc7CiAgICBteSAkQ291bnQgICAgICAgICA9IDA7CgogICAgT1JERVJCWToKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewogICAgICAgIG5leHQgT1JERVJCWSBpZiAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX07CgogICAgICAgIG15ICREaXJlY3Rpb24gPSAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIHx8ICdEb3duJzsKCiAgICAgICAgJE9yZGVyQnlTdHJpbmcgLj0gJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gLiAkRGlyZWN0aW9uOwoKICAgICAgICBwdXNoIEBPcmRlckJ5RmllbGRzLCB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJE9yZGVyQnksCiAgICAgICAgICAgIERhdGFiYXNlRmllbGQgPT4gJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0sCiAgICAgICAgICAgIERpcmVjdGlvbiAgICAgPT4gJERpcmVjdGlvbiwKICAgICAgICB9OwogICAgfQogICAgY29udGludWUgewogICAgICAgICRDb3VudCsrOwogICAgfQoKICAgICMgSWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBvcmRlcmluZyBpcyBub3QgZGV0ZXJtaW5lZAogICAgIyAgIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkLgogICAgaWYgKCAhZ3JlcCB7ICRfIGVxICdVc2VyTG9naW4nIH0gKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApICkgewogICAgICAgIHB1c2ggQE9yZGVyQnlGaWVsZHMsIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVXNlckxvZ2luJywKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAiJFNlbGYtPntDdXN0b21lcktleX0iLAogICAgICAgICAgICBEaXJlY3Rpb24gICAgID0+ICdEb3duJywKICAgICAgICB9OwogICAgfQoKICAgIG15ICRDYWNoZUtleSA9ICdDdXN0b21lclNlYXJjaERldGFpbDo6JyAuICRSZXN1bHQgLiAkRmlsdGVyIC4gJFBhcmFte0xpbWl0fSAuICRPcmRlckJ5U3RyaW5nOwoKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJENhY2hlRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGRlZmluZWQgJENhY2hlRGF0YSApIHsKICAgICAgICAgICAgaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRDYWNoZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCRDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIGNDbWJpbmUgbmVlZGVkIGF0dHJpYnV0ZXMuCiAgICBteSBAQXR0cmlidXRlcyA9IG1hcCB7ICRfLT57RGF0YWJhc2VGaWVsZH0gfSBAT3JkZXJCeUZpZWxkczsKCiAgICAjIFBlcmZvcm0gdGhlIGxkYXAgdXNlciBzZWFyY2guCiAgICBteSAkUmVzdWx0U2VhcmNoID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0Jhc2VETn0sCiAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICBmaWx0ZXIgICAgPT4gJEZpbHRlciwKICAgICAgICBzaXplbGltaXQgPT4gJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICBhdHRycyAgICAgPT4gXEBBdHRyaWJ1dGVzLAogICAgKTsKCiAgICBpZiAoICRSZXN1bHRTZWFyY2gtPmNvZGUoKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFJlc3VsdFNlYXJjaC0+ZXJyb3IoKSwKICAgICAgICApOwogICAgfQoKICAgIG15IEBUbXBDdXN0b21lclVzZXJzOwogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHRTZWFyY2gtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIG15ICVEYXRhOwogICAgICAgIGZvciBteSAkT3JkZXJCeSAoQE9yZGVyQnlGaWVsZHMpIHsKCiAgICAgICAgICAgIG15ICRGaWVsZFZhbHVlID0gJEVudHJ5LT5nZXRfdmFsdWUoICRPcmRlckJ5LT57RGF0YWJhc2VGaWVsZH0gKTsKICAgICAgICAgICAgJEZpZWxkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCRGaWVsZFZhbHVlKTsKCiAgICAgICAgICAgICREYXRheyAkT3JkZXJCeS0+e05hbWV9IH0gPSAkRmllbGRWYWx1ZTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQFRtcEN1c3RvbWVyVXNlcnMsIFwlRGF0YTsKICAgIH0KCiAgICAjIFNvcnQgdGhlIGN1c3RvbWVyIHVzZXJzLgogICAgQFRtcEN1c3RvbWVyVXNlcnMgPSBzb3J0IHsgJFNlbGYtPl9TZWFyY2hSZXN1bHRTb3J0KEBPcmRlckJ5RmllbGRzKSB9IEBUbXBDdXN0b21lclVzZXJzOwoKICAgIG15IEBJRHM7CgogICAgIyBDaGVjayBpZiB1c2VyIG5lZWQgdG8gYmUgaW4gYSBncm91cCEKICAgIGlmICggJFNlbGYtPntHcm91cEROfSApIHsKCiAgICAgICAgRklMVEVSSUQ6CiAgICAgICAgZm9yIG15ICREYXRhIChAVG1wQ3VzdG9tZXJVc2VycykgewoKICAgICAgICAgICAgbXkgJFJlc3VsdEdyb3VwRE4gPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntHcm91cEROfSwKICAgICAgICAgICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgICAgICAgICBmaWx0ZXIgICAgPT4gJ21lbWJlclVpZD0nIC4gJERhdGEtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgc2l6ZWxpbWl0ID0+ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICAgICAgICAgICAgICBhdHRycyAgICAgPT4gWycxLjEnXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRklMVEVSSUQgaWYgISRSZXN1bHRHcm91cEROLT5hbGxfZW50cmllcygpOwoKICAgICAgICAgICAgcHVzaCBASURzLCAkRGF0YS0+e1VzZXJMb2dpbn07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgQElEcyA9IG1hcCB7ICRfLT57VXNlckxvZ2lufSB9IEBUbXBDdXN0b21lclVzZXJzOwogICAgfQoKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICBzcGxpY2UgQElEcywgJFBhcmFte0xpbWl0fTsKICAgIH0KCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+IHNjYWxhciBASURzLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2NhbGFyIEBJRHM7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+IFxASURzLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gXEBJRHM7CiAgICB9Cn0KCnN1YiBDdXN0b21lcklETGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZCAgICAgID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CiAgICBteSAkU2VhcmNoVGVybSA9ICRQYXJhbXtTZWFyY2hUZXJtfSB8fCAnJzsKCiAgICBteSAkQ2FjaGVLZXkgPSAiQ3VzdG9tZXJJRExpc3Q6OiR7VmFsaWR9OjokU2VhcmNoVGVybSI7CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JFJlc3VsdH0gaWYgcmVmICRSZXN1bHQgZXEgJ0FSUkFZJzsKICAgIH0KCiAgICAjIHByZXBhcmUgZmlsdGVyCiAgICBteSAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVySUR9PSopIjsKICAgIGlmICgkU2VhcmNoVGVybSkgewoKICAgICAgICBteSAkU2VhcmNoRmlsdGVyID0gJFNlbGYtPntTZWFyY2hQcmVmaXh9IC4gJFNlYXJjaFRlcm0gLiAkU2VsZi0+e1NlYXJjaFN1ZmZpeH07CiAgICAgICAgJFNlYXJjaEZpbHRlciA9fiBzLyhcJSspL1wlL2c7CiAgICAgICAgJFNlYXJjaEZpbHRlciA9fiBzLyhcKispXCovKi9nOwoKICAgICAgICAjIHF1b3RlIExEQVAgZmlsdGVyIHZhbHVlIGJ1dCBrZWVwIGFzdGVyaXNrcyB1bmVzY2FwZWQgKHdpbGRjYXJkKQogICAgICAgICRTZWFyY2hGaWx0ZXIgPX4gcy9cKi9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC9nOwogICAgICAgICRTZWFyY2hGaWx0ZXIgPSBlc2NhcGVfZmlsdGVyX3ZhbHVlKCRTZWFyY2hGaWx0ZXIpOwogICAgICAgICRTZWFyY2hGaWx0ZXIgPX4gcy9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC8qL2c7CgogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09JFNlYXJjaEZpbHRlcikiOwoKICAgIH0KCiAgICBpZiAoICRTZWxmLT57QWx3YXlzRmlsdGVyfSApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57QWx3YXlzRmlsdGVyfSkiOwogICAgfQoKICAgICMgYWRkIHZhbGlkIGZpbHRlcgogICAgaWYgKCAkU2VsZi0+e1ZhbGlkRmlsdGVyfSAmJiAkVmFsaWQgKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkU2VsZi0+e1ZhbGlkRmlsdGVyfSkiOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIGNvbWJpbmUgbmVlZGVkIGF0dHJzCiAgICBteSBAQXR0cmlidXRlcyA9ICggJFNlbGYtPntDdXN0b21lcktleX0sICRTZWxmLT57Q3VzdG9tZXJJRH0gKTsKCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciAgICA9PiAkRmlsdGVyLAogICAgICAgIHNpemVsaW1pdCA9PiAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiBcQEF0dHJpYnV0ZXMsCiAgICApOwoKICAgICMgbG9nIGxkYXAgZXJyb3JzCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKCiAgICAgICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgPT0gNCApIHsKCiAgICAgICAgICAgICMgUmVzdWx0IGNvZGUgNCAoTERBUF9TSVpFTElNSVRfRVhDRUVERUQpIGlzIG5vcm1hbCBpZiB0aGVyZQogICAgICAgICAgICAjIGFyZSBtb3JlIGl0ZW1zIGluIExEQVAgdGhhbiBzZWFyY2ggbGltaXQgZGVmaW5lZCBpbiBPVE9CTyBvcgogICAgICAgICAgICAjIGluIExEQVAgc2VydmVyLiBBdm9pZCBzcGFtbWluZyBsb2dzIHdpdGggc3VjaCBlcnJvcnMuCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMREFQIHNpemUgbGltaXQgZXhjZWVkZWQgKCcgLiAkUmVzdWx0LT5lcnJvcigpIC4gJykuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2ggZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVVzZXJzOwogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHQtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIG15ICRGaWVsZFZhbHVlID0gJEVudHJ5LT5nZXRfdmFsdWUoICRTZWxmLT57Q3VzdG9tZXJJRH0gKTsKICAgICAgICAkRmllbGRWYWx1ZSA9IGRlZmluZWQgJEZpZWxkVmFsdWUgPyAkRmllbGRWYWx1ZSA6ICcnOwoKICAgICAgICBteSAkS2V5VmFsdWUgPSAkRW50cnktPmdldF92YWx1ZSggJFNlbGYtPntDdXN0b21lcktleX0gKTsKICAgICAgICAkS2V5VmFsdWUgPSBkZWZpbmVkICRLZXlWYWx1ZSA/ICRLZXlWYWx1ZSA6ICcnOwogICAgICAgICRVc2Vyc3sgJFNlbGYtPl9Db252ZXJ0RnJvbSgkS2V5VmFsdWUpIH0gPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCRGaWVsZFZhbHVlKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgbmVlZCB0byBiZSBpbiBhIGdyb3VwIQogICAgaWYgKCAkU2VsZi0+e0dyb3VwRE59ICkgewogICAgICAgIGZvciBteSAkRmlsdGVyMiAoIHNvcnQga2V5cyAlVXNlcnMgKSB7CiAgICAgICAgICAgIG15ICRSZXN1bHQyID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgICAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57R3JvdXBETn0sCiAgICAgICAgICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgICAgICAgICAgZmlsdGVyICAgID0+ICdtZW1iZXJVaWQ9JyAuIGVzY2FwZV9maWx0ZXJfdmFsdWUoJEZpbHRlcjIpLAogICAgICAgICAgICAgICAgc2l6ZWxpbWl0ID0+ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICAgICAgICAgICAgICBhdHRycyAgICAgPT4gWycxLjEnXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlc3VsdDItPmFsbF9lbnRyaWVzKCkgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJFVzZXJzeyRGaWx0ZXIyfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG1ha2UgQ3VzdG9tZXJJRHMgdW5pcXVlCiAgICBteSAlVG1wOwogICAgQFRtcHsgdmFsdWVzICVVc2VycyB9ID0gdW5kZWY7CiAgICBteSBAUmVzdWx0ID0ga2V5cyAlVG1wOwoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBAUmVzdWx0Owp9CgpzdWIgQ3VzdG9tZXJJRHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRDdXN0b21lcklEcyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lcklEczo6JFBhcmFte1VzZXJ9IiwKICAgICAgICApOwogICAgICAgIHJldHVybiBAeyRDdXN0b21lcklEc30gaWYgcmVmICRDdXN0b21lcklEcyBlcSAnQVJSQVknOwogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEKICAgIG15ICVEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkUGFyYW17VXNlcn0sCiAgICApOwoKICAgICMgdGhlcmUgYXJlIG11bHRpIGN1c3RvbWVyIGlkcwogICAgbXkgQEN1c3RvbWVySURzOwogICAgaWYgKCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ICkgewoKICAgICAgICAjIHVzZWQgc2VwYXJhdG9ycwogICAgICAgIFNFUEFSQVRPUjoKICAgICAgICBmb3IgbXkgJFNlcGFyYXRvciAoICc7JywgJywnLCAnfCcgKSB7CgogICAgICAgICAgICBuZXh0IFNFUEFSQVRPUiBpZiAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ICF+IC9cUSRTZXBhcmF0b3JcRS87CgogICAgICAgICAgICAjIHNwbGl0IGl0CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvXFEkU2VwYXJhdG9yXEUvLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9OwoKICAgICAgICAgICAgZm9yIG15ICRJRCAoQElEcykgewogICAgICAgICAgICAgICAgJElEID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgICAgICRJRCA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsYXN0IFNFUEFSQVRPUjsKICAgICAgICB9CgogICAgICAgICMgZmFsbGJhY2sgaWYgbm8gc2VwYXJhdG9yIGdvdCBmb3VuZAogICAgICAgIGlmICggIUBDdXN0b21lcklEcyApIHsKICAgICAgICAgICAgJERhdGF7VXNlckN1c3RvbWVySURzfSA9fiBzL15ccysvL2c7CiAgICAgICAgICAgICREYXRhe1VzZXJDdXN0b21lcklEc30gPX4gcy9ccyskLy9nOwogICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJERhdGF7VXNlckN1c3RvbWVySURzfTsKICAgICAgICB9CiAgICB9CgogICAgIyB1c2UgYWxzbyB0aGUgcHJpbWFyeSBjdXN0b21lciBpZAogICAgaWYgKCAkRGF0YXtVc2VyQ3VzdG9tZXJJRH0gJiYgISRTZWxmLT57RXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSApIHsKICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJERhdGF7VXNlckN1c3RvbWVySUR9OwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lcklEczo6JyAuICRQYXJhbXtVc2VyfSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBDdXN0b21lcklEcywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIEBDdXN0b21lcklEczsKfQoKc3ViIEN1c3RvbWVyVXNlckRhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15IEBBdHRyaWJ1dGVzOwogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgIHB1c2goIEBBdHRyaWJ1dGVzLCAkRW50cnktPlsyXSApOwogICAgfQogICAgbXkgJEZpbHRlciA9ICIoJFNlbGYtPntDdXN0b21lcktleX09IiAuIGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtVc2VyfSApIC4gJyknOwoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdDdXN0b21lclVzZXJEYXRhR2V0OjonIC4gJFBhcmFte1VzZXJ9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JERhdGF9IGlmIHJlZiAkRGF0YSBlcSAnSEFTSCc7CiAgICB9CgogICAgIyBjcmVhdGUgbGRhcCBjb25uZWN0CiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwoKICAgICMgcGVyZm9ybSBzZWFyY2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgIGF0dHJzICA9PiBcQEF0dHJpYnV0ZXMsCiAgICApOwoKICAgICMgbG9nIGxkYXAgZXJyb3JzCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmaXJzdCBlbnRyeQogICAgbXkgJFJlc3VsdDIgPSAkUmVzdWx0LT5lbnRyeSgwKTsKICAgIGlmICggISRSZXN1bHQyICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjdXN0b21lciB1c2VyIGluZm8KICAgIG15ICVEYXRhOwogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkUmVzdWx0Mi0+Z2V0X3ZhbHVlKCAkRW50cnktPlsyXSApICkgfHwgJyc7CgogICAgICAgIGlmICggJFZhbHVlICYmICRFbnRyeS0+WzJdID1+IC9edGFyZ2V0YWRkcmVzcyQvaSApIHsKICAgICAgICAgICAgJFZhbHVlID1+IHMvU01UUDooLiopLyQxLzsKICAgICAgICB9CgogICAgICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57VHJhbnNsYXRlTWFuYWdlclRvfSApICkgewogICAgICAgICAgICBpZiAoICRWYWx1ZSAmJiAkRW50cnktPlsyXSA9fiAvXm1hbmFnZXIkL2kgKSB7CgogICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoZSBtYW5hZ2VyIGZsYWcKICAgICAgICAgICAgICAgIG15ICRUcmFuc2xhdGVUbyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1RyYW5zbGF0ZU1hbmFnZXJUb307CgogICAgICAgICAgICAgICAgIyBwZXJmb3JtIHNlYXJjaAogICAgICAgICAgICAgICAgbXkgJFJlc3VsdE1hbmFnZXIgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgICAgICAgICAgICAgYmFzZSAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBzY29wZSAgPT4gJ2Jhc2UnLAogICAgICAgICAgICAgICAgICAgIGZpbHRlciA9PiAiKG9iamVjdENsYXNzPSopIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgZmlyc3QgZW50cnkKICAgICAgICAgICAgICAgIG15ICRSZXN1bHRNYW5hZ2VyMiA9ICRSZXN1bHRNYW5hZ2VyLT5lbnRyeSgwKTsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT5fQ29udmVydEZyb20oICRSZXN1bHRNYW5hZ2VyMi0+Z2V0X3ZhbHVlKCRUcmFuc2xhdGVUbykgKSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJERhdGF7ICRFbnRyeS0+WzBdIH0gPSAkVmFsdWU7CiAgICB9CgogICAgcmV0dXJuIGlmICEkRGF0YXtVc2VyTG9naW59OwoKICAgICMgdG8gYnVpbGQgdGhlIFVzZXJNYWlsU3RyaW5nCiAgICBteSAkVXNlck1haWxTdHJpbmcgPSAnJzsKICAgIG15IEBVc2VyTWFpbFN0cmluZ1BhcnRzOwoKICAgIG15ICRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXApICkgewogICAgICAgICRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwID0gWyAnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnZW1haWwnLCBdOwogICAgfQoKICAgIGZvciBteSAkRmllbGQgKCBAeyRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwfSApIHsKCiAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPl9Db252ZXJ0RnJvbSggJFJlc3VsdDItPmdldF92YWx1ZSgkRmllbGQpICkgfHwgJyc7CgogICAgICAgIGlmICgkVmFsdWUpIHsKICAgICAgICAgICAgaWYgKCAkRmllbGQgPX4gL150YXJnZXRhZGRyZXNzJC9pICkgewogICAgICAgICAgICAgICAgJFZhbHVlID1+IHMvU01UUDooLiopLyQxLzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBVc2VyTWFpbFN0cmluZ1BhcnRzLCAkVmFsdWU7CiAgICAgICAgfQogICAgfQogICAgJFVzZXJNYWlsU3RyaW5nID0gam9pbiAnICcsIEBVc2VyTWFpbFN0cmluZ1BhcnRzOwogICAgJFVzZXJNYWlsU3RyaW5nID1+IHMvXiguKilccyguKz9cQC4rP1wuLis/KShcc3wpJC8iJDEiIDwkMj4vOwoKICAgICMgYWRkIHRoZSBVc2VyTWFpbFN0cmluZyB0byB0aGUgZGF0YSBoYXNoCiAgICAkRGF0YXtVc2VyTWFpbFN0cmluZ30gPSAkVXNlck1haWxTdHJpbmc7CgogICAgIyBjb21wYXQhCiAgICAkRGF0YXtVc2VySUR9ID0gJERhdGF7VXNlckxvZ2lufTsKCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPkdldFByZWZlcmVuY2VzKCBVc2VySUQgPT4gJERhdGF7VXNlckxvZ2lufSApOwoKICAgICMgYWRkIGxhc3QgbG9naW4gdGltZXN0YW1wCiAgICBpZiAoICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2lufSApIHsKCiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBFcG9jaCA9PiAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpbn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW5UaW1lc3RhbXB9ID0gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwoKICAgIH0KCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJVc2VyRGF0YUdldDo6JyAuICRQYXJhbXtVc2VyfSwKICAgICAgICAgICAgVmFsdWUgPT4geyAlRGF0YSwgJVByZWZlcmVuY2VzIH0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAoICVEYXRhLCAlUHJlZmVyZW5jZXMgKTsKfQoKc3ViIEN1c3RvbWVyVXNlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAnTm90IHN1cHBvcnRlZCBmb3IgdGhpcyBtb2R1bGUhJwogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBDdXN0b21lclVzZXJVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gJ05vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kdWxlIScKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgU2V0UGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUHcgPSAkUGFyYW17UFd9IHx8ICcnOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAnTm90IHN1cHBvcnRlZCBmb3IgdGhpcyBtb2R1bGUhJwogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBHZW5lcmF0ZVJhbmRvbVBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgIExlbmd0aCAgICAgPT4gJFBhcmFte1NpemV9IHx8IDgsCiAgICAgICAgRGljdGlvbmFyeSA9PiBbIDAgLi4gOSwgJ0EnIC4uICdaJywgJ2EnIC4uICd6JywgJy0nLCAnXycsICchJywgJ0AnLCAnIycsICckJywgJyUnLCAnXicsICcmJywgJyonIF0sCiAgICApOwp9CgpzdWIgU2V0UHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgcmVzZXQKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVyVXNlckRhdGFHZXQ6OiRQYXJhbXtVc2VySUR9IiwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgR2V0UHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKc3ViIFNlYXJjaFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZWFyY2hQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgX0NvbnZlcnRGcm9tIHsKICAgIG15ICggJFNlbGYsICRUZXh0ICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFRleHQ7CgogICAgaWYgKCAhJFNlbGYtPntTb3VyY2VDaGFyc2V0fSApIHsKICAgICAgICByZXR1cm4gJFRleHQ7CiAgICB9CgogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+Q29udmVydCgKICAgICAgICBUZXh0ID0+ICRUZXh0LAogICAgICAgIEZyb20gPT4gJFNlbGYtPntTb3VyY2VDaGFyc2V0fSwKICAgICAgICBUbyAgID0+ICd1dGYtOCcsCiAgICApOwp9CgpzdWIgX0NvbnZlcnRUbyB7CiAgICBteSAoICRTZWxmLCAkVGV4dCApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRUZXh0OwoKICAgICMgZ2V0IGVuY29kZSBvYmplY3QKICAgIG15ICRFbmNvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyk7CgogICAgaWYgKCAhJFNlbGYtPntTb3VyY2VDaGFyc2V0fSApIHsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVJbnB1dCggXCRUZXh0ICk7CiAgICAgICAgcmV0dXJuICRUZXh0OwogICAgfQoKICAgIHJldHVybiAkRW5jb2RlT2JqZWN0LT5Db252ZXJ0KAogICAgICAgIFRleHQgPT4gJFRleHQsCiAgICAgICAgVG8gICA9PiAkU2VsZi0+e1NvdXJjZUNoYXJzZXR9LAogICAgICAgIEZyb20gPT4gJ3V0Zi04JywKICAgICk7Cn0KCnN1YiBfQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntDYWNoZU9iamVjdH07CgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJMb2dpbn0iLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJOYW1lOjokUGFyYW17VXNlckxvZ2lufSIsCiAgICApOwoKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICApOwoKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyR3JvdXAnLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9TZWFyY2hSZXN1bHRTb3J0IHsKICAgIG15ICggJFNlbGYsIEBPcmRlckJ5RmllbGRzICkgPSBAXzsKCiAgICBmb3IgbXkgJE9yZGVyQnkgKEBPcmRlckJ5RmllbGRzKSB7CiAgICAgICAgbXkgJENvbXBhcmU7CgogICAgICAgIGlmICggJE9yZGVyQnktPntEaXJlY3Rpb259ICYmICRPcmRlckJ5LT57RGlyZWN0aW9ufSBlcSAnVXAnICkgewogICAgICAgICAgICAkQ29tcGFyZSA9IGxjKCAkYS0+eyAkT3JkZXJCeS0+e05hbWV9IH0gKSBjbXAgbGMoICRiLT57ICRPcmRlckJ5LT57TmFtZX0gfSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENvbXBhcmUgPSBsYyggJGItPnsgJE9yZGVyQnktPntOYW1lfSB9ICkgY21wIGxjKCAkYS0+eyAkT3JkZXJCeS0+e05hbWV9IH0gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRDb21wYXJlIGlmICRDb21wYXJlOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0YWtlIGRvd24gc2Vzc2lvbgogICAgaWYgKCAkU2VsZi0+e0xEQVB9ICkgewogICAgICAgICRTZWxmLT57TERBUH0tPnVuYmluZCgpOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIFJvdGhlciBPU1MKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueSAtIGN1c3RvbWVyIGNvbXBhbnkgbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBDdXN0b21lciBmdW5jdGlvbnMuIEUuZy4gdG8gYWRkIGFuZCB1cGRhdGUgY3VzdG9tZXIgY29tcGFuaWVzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKRG9uJ3QgdXNlIHRoZSBjb25zdHJ1Y3RvciBkaXJlY3RseSwgdXNlIHRoZSBPYmplY3RNYW5hZ2VyIGluc3RlYWQ6CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIG15ICRMYXlvdXRQYXJhbSA9ICRLZXJuZWw6Ok9NLT57UGFyYW19LT57J0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnfTsKCiAgICAjIENoZWNrIGlmIG11bHRpdGVuYW5jeSBpcyBlbmFibGVkIGFuZCB0aGUgcmVxdWVzdCBpcyBjb21pbmcgZnJvbSBhIHVzZXIuCiAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSAmJiAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gZXEgJ1VzZXInICYmICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CgogICAgICAgICMgU2F2ZSB0aGUgVXNlcklEIGFuZCBhbGwgZ3JvdXBzIHRoZSB1c2VyIGhhcyAncm8nIHBlcm1pc3Npb24gb24uCiAgICAgICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VySUR9ICkgewogICAgICAgICAgICAjIE9ubHkgZ2V0IHRoZSBncm91cCBsaXN0IG9uY2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgICAgICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJExheW91dFBhcmFtLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBUaGUgbGltaXQgZG9lcyBub3QgY291bnQgZm9yIG1lbWJlcnMgb2YgYSBzcGVjaWZpYyBncm91cC4KICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25Hcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSB8fCAnJzsKICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgICA9IHJldmVyc2UgJUdyb3VwczsKCiAgICAgICAgICAgIGlmICggISRHcm91cHNSZXZlcnNleyRQZXJtaXNzaW9uR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3l9ID0gJExheW91dFBhcmFtLT57VXNlcklEfTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3VwSURzfSA9IFsga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIGxvYWQgY3VzdG9tZXIgY29tcGFueSBiYWNrZW5kIG1vZHVsZXMKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHNvdXJjZS4KICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55VXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e0N1c3RvbWVyQ29tcGFueVVzZXJHcm91cH07CgogICAgICAgICMgVGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgc291cmNlLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAgKSB7CiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyA9fiAvXiRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e01vZHVsZX0KICAgICAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnk6OkRCJzsKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55TWFwID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdDdXN0b21lckNvbXBhbnk6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUFkZCgpCgphZGQgYSBuZXcgY3VzdG9tZXIgY29tcGFueQoKICAgIG15ICRJRCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICA9PiAnZXhhbXBsZS5jb20nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgICAgID0+ICdOZXcgQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55U3RyZWV0ICAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVpJUCAgICAgID0+ICczMzEyNicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q2l0eSAgICAgPT4gJ01pYW1pJywKICAgICAgICBDdXN0b21lckNvbXBhbnlDb3VudHJ5ICA9PiAnVVNBJywKICAgICAgICBDdXN0b21lckNvbXBhbnlVUkwgICAgICA9PiAnaHR0cDovL3d3dy5leGFtcGxlLm9yZycsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyBhY2NlcHRlZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBkZWZhdWx0cwogICAgJFBhcmFte1NvdXJjZX0gfHw9ICdDdXN0b21lckNvbXBhbnknOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEN1c3RvbWVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHN0b3JlIGN1c3RvbWVyIGNvbXBhbnkgZGF0YQogICAgbXkgJEN1c3RvbWVySUQgPSAkU2VsZi0+eyAkUGFyYW17U291cmNlfSB9LT5DdXN0b21lckNvbXBhbnlBZGQoJVBhcmFtKTsKCiAgICByZXR1cm4gdW5sZXNzICRDdXN0b21lcklEOwoKICAgICMgdHJpZ2dlciBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ3VzdG9tZXJDb21wYW55QWRkJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBOZXdEYXRhICAgID0+IFwlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQ3VzdG9tZXJJRDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUdldCgpCgpnZXQgY3VzdG9tZXIgY29tcGFueSBhdHRyaWJ1dGVzCgogICAgbXkgJUN1c3RvbWVyQ29tcGFueSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICBDdXN0b21lcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgoKICAgICVDdXN0b21lckNvbXBhbnkgPSAoCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueU5hbWUnICAgID0+ICdDdXN0b21lciBJbmMuJywKICAgICAgICAnQ3VzdG9tZXJJRCcgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICAnQ3VzdG9tZXJDb21wYW55U3RyZWV0JyAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgICdDdXN0b21lckNvbXBhbnlaSVAnICAgICA9PiAnMzMxMjYnLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDaXR5JyAgICA9PiAnTWlhbWknLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDb3VudHJ5JyA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueVVSTCcgICAgID0+ICdodHRwOi8vZXhhbXBsZS5jb20nLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDb21tZW50JyA9PiAnU29tZSBDb21tZW50cycsCiAgICAgICAgJ1ZhbGlkSUQnICAgICAgICAgICAgICAgID0+ICcxJywKICAgICAgICAnQ3JlYXRlVGltZScgICAgICAgICAgICAgPT4gJzIwMTAtMTAtMDQgMTY6MzU6NDknLAogICAgICAgICdDaGFuZ2VUaW1lJyAgICAgICAgICAgICA9PiAnMjAxMC0xMC0wNCAxNjozNjoxMicsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyByZXR1cm5lZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBDdXN0b21lcklEISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBGZXRjaCBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb25zIGZvciBDdXN0b21lckNvbXBhbnkuCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSAkRHluYW1pY0ZpZWxkQ29uZmlncy0+QCo7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgc2VhcmNoIGZvciB0aGUgY29tcGFueSBpbiB0aGUgY29uZmlndXJlZCBzb3VyY2VzCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKCiAgICAgICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+Q3VzdG9tZXJDb21wYW55R2V0KCAlUGFyYW0sICk7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAlQ29tcGFueTsKCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9ICkgKSB7CiAgICAgICAgICAgIENVU1RPTUVSQ09NUEFOWUZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyQ29tcGFueUZpZWxkICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCB1bmxlc3MgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMl0gfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRMb29rdXB7ICRDdXN0b21lckNvbXBhbnlGaWVsZC0+WzJdIH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDb21wYW55e0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ29tcGFueXsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMF0gfSA9ICRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uLgogICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwoKICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSAmJiAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9ICkgewogICAgICAgICAgICAjIFJlcGxhY2UgdGhlIHJlbW90ZSBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIGxvY2FsIGdyb3VwLgogICAgICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSBlcSAkUmVtb3RlR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2FsR3JvdXAgPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CiAgICAgICAgICAgICAgICAgICAgJENvbXBhbnl7VXNlckdyb3VwSUR9ID0gJExvY2FsR3JvdXA7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJExvY2FsR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkQ29tcGFueXtVc2VyR3JvdXBJRH0gPSAkR3JvdXBJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDb21wYW55e1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIGluZm9ybWF0aW9uLgogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gPX4gL14kQ29tcGFueXtVc2VyR3JvdXBJRH0kLyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgICMgcmV0dXJuIGRhdGEgZm9yIHRoZSBmaXJzdCBmb3VuZCBjb21wYW55CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJUNvbXBhbnksCiAgICAgICAgICAgIFNvdXJjZSA9PiAiQ3VzdG9tZXJDb21wYW55JENvdW50IiwKICAgICAgICAgICAgQ29uZmlnID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbXBhbnkgd2FzIG5vdCBmb3VuZAogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55VXBkYXRlKCkKCnVwZGF0ZSBjdXN0b21lciBjb21wYW55IGF0dHJpYnV0ZXMKCiAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlVcGRhdGUoCiAgICAgICAgQ3VzdG9tZXJDb21wYW55SUQgICAgICAgPT4gJ29sZGV4YW1wbGUuY29tJywgIyByZXF1aXJlZCBmb3IgQ3VzdG9tZXJDb21wYW55SUQtdXBkYXRlCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICBDdXN0b21lckNvbXBhbnlOYW1lICAgICA9PiAnTmV3IEN1c3RvbWVyIEluYy4nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVN0cmVldCAgID0+ICc1MjAxIEJsdWUgTGFnb29uIERyaXZlJywKICAgICAgICBDdXN0b21lckNvbXBhbnlaSVAgICAgICA9PiAnMzMxMjYnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueUxvY2F0aW9uID0+ICdNaWFtaScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q291bnRyeSAgPT4gJ1VTQScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55VVJMICAgICAgPT4gJ2h0dHA6Ly9leGFtcGxlLmNvbScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gfHw9ICRQYXJhbXtDdXN0b21lcklEfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ3VzdG9tZXJDb21wYW55SUQgb3IgQ3VzdG9tZXJJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBjb21wYW55IGV4aXN0cwogICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gKTsKICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBjb21wYW55ICckUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9JyEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNoYW5nZSB0aGUgVXNlckdyb3VwSUQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAjIFNldCB0aGUgVXNlckdyb3VwSUQgdG8gdGhlIGN1cnJlbnQgVXNlckdyb3VwSUQuCiAgICAgICAgaWYgKCAkQ29tcGFueXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkQ29tcGFueXtVc2VyR3JvdXBJRH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyRDb21wYW55e1NvdXJjZX19LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgIyBDaGVjayBpZiBncm91cCBJRCBvciBncm91cCBuYW1lcyBzaG91bGQgYmUgdXNlZC4KICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJFBhcmFte1VzZXJHcm91cElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUmVwbGFjZSB0aGUgbG9jYWwgZ3JvdXAgd2l0aCB0aGUgYXNzb2NpYXRlZCByZW1vdGUgZ3JvdXAuCiAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gZXEgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRSZW1vdGVHcm91cDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+eyAkQ29tcGFueXtTb3VyY2V9IH0tPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSglUGFyYW0pOwoKICAgIHJldHVybiB1bmxlc3MgJFJlc3VsdDsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0N1c3RvbWVyQ29tcGFueVVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDdXN0b21lcklEICAgID0+ICRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgT2xkQ3VzdG9tZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9LAogICAgICAgICAgICBOZXdEYXRhICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIE9sZERhdGEgICAgICAgPT4gXCVDb21wYW55LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlIGxpc3QKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAlRGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CgogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17UmVhZE9ubHl9ICkgewogICAgICAgICAgICBteSAkQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQmFja2VuZENvbmZpZy0+e1JlYWRPbmx5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICRCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRGF0YXsiQ3VzdG9tZXJDb21wYW55JENvdW50In0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpLT57TmFtZX0KICAgICAgICAgICAgfHwgIk5vIE5hbWUgJENvdW50IjsKICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lckNvbXBhbnlMaXN0KCkKCmdldCBsaXN0IG9mIGN1c3RvbWVyIGNvbXBhbmllcy4KCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoKTsKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICBMaW1pdCA9PiAwLCAgICAgIyBvcHRpb25hbCwgb3ZlcnJpZGUgY29uZmlndXJlZCBzZWFyY2ggcmVzdWx0IGxpbWl0ICgwIG1lYW5zIHVubGltaXRlZCkKICAgICk7CgogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgIFNlYXJjaCA9PiAnc29tZWNvbXBhbnknLAogICAgKTsKClJldHVybnM6CgogICAgJUxpc3QgPSB7CiAgICAgICAgJ2V4YW1wbGUuY29tJyA9PiAnZXhhbXBsZS5jb20gQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgJ2FjbWUuY29tJyAgICA9PiAnYWNtZS5jb20gQWNtZSwgSW5jLicKICAgIH07Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJDb21wYW55TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0LgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In07CgogICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzLCBpZiBjb25maWd1cmVkCiAgICAgICAgbXkgJE1hcCA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH07CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1hcCkgKSB7CgogICAgICAgICAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBNYXAKICAgICAgICAgICAgIyBvbmx5IHRoZXNlIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgYW55IG90aGVyIHNlYXJjaCBjb25maWcKICAgICAgICAgICAgIyBbICdEeW5hbWljRmllbGRfTmFtZV9ZJywgdW5kZWYsICdOYW1lX1knLCAwLCAwLCAnZHluYW1pY19maWVsZCcsIHVuZGVmLCAwLF0sCiAgICAgICAgICAgIG15ICVEeW5hbWljRmllbGROYW1lcyA9IG1hcCB7ICRfLT5bMl0gPT4gMSB9IGdyZXAgeyAkXy0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyB9IEB7JE1hcH07CgogICAgICAgICAgICBpZiAoJUR5bmFtaWNGaWVsZE5hbWVzKSB7CiAgICAgICAgICAgICAgICBteSAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICBteSAkU2VhcmNoRmllbGRzOwogICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2hpY2ggb2YgdGhlIGR5bmFtaWMgZmllbGRzIGNvbmZpZ3VyZWQgaW4gTWFwIGFyZSBhbHNvCiAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZWQgaW4gU2VhcmNoRmllbGRzCgogICAgICAgICAgICAgICAgIyBwYXJhbSBTZWFyY2gKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17U2VhcmNofSAmJiBsZW5ndGggJFBhcmFte1NlYXJjaH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkcyA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkc307CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtICA9ICRQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRzKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMgPSBncmVwIHsgZXhpc3RzICREeW5hbWljRmllbGROYW1lc3skX30gfSBAeyRTZWFyY2hGaWVsZHN9OwoKICAgICAgICAgICAgICAgICAgICBteSAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICAgICAgRklFTEROQU1FOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGROYW1lIChAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkTG9va3VweyRGaWVsZE5hbWV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRE5BTUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgICAgICAgID0+ICRTZWFyY2hQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGRWYWx1ZXMpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRWYWx1ZSAoIEB7JER5bmFtaWNGaWVsZFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzeyAkRHluYW1pY0ZpZWxkVmFsdWUtPntPYmplY3RJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcyA9IFsga2V5cyAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMgXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgYmFja2VuZCBzZWFyY2ggZm9yIGZvdW5kIG9iamVjdCBJRHMKICAgICAgICAgICAgICAgICMgdGhpcyBkYXRhIGlzIGJlaW5nIG1lcmdlZCB3aXRoIHRoZSBmb2xsb3dpbmcgQ3VzdG9tZXJDb21wYW55TGlzdCBjYWxsCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMpICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0TmFtZXMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5PYmplY3RNYXBwaW5nR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAlU2VhcmNoUGFyYW0gPSAlUGFyYW07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZWFyY2hQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgICAgIG15ICVDb21wYW55TGlzdCA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT5DdXN0b21lckNvbXBhbnlMaXN0KCVTZWFyY2hQYXJhbSk7CgogICAgICAgICAgICAgICAgICAgIE9CSkVDVE5BTUU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3ROYW1lICggdmFsdWVzICV7JE9iamVjdE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1ROQU1FIGlmIGV4aXN0cyAkRGF0YXskT2JqZWN0TmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUNvbXBhbnlMaXN0ICkgJiYgZXhpc3RzICRDb21wYW55TGlzdHskT2JqZWN0TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSA9PiAkQ29tcGFueUxpc3R7JE9iamVjdE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb21wYW55IGxpc3QgcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgbXkgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+Q3VzdG9tZXJDb21wYW55TGlzdCglUGFyYW0pOwogICAgICAgICVEYXRhID0gKCAlRGF0YSwgJVN1YkRhdGEgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNlZSB0aGUgY3VzdG9tZXIgdXNlciBkYXRhLgogICAgIyBJbXByb3ZlOiBDaGVjayBldmVyeSBjb21wYW55IG9uZSBieSBvbmUgYXMgQ3VzdG9tZXJDb21wYW55TGlzdCBkb2VzIHNvbWV0aW1lcyByZXR1cm4gYSBub24gZmlsdGVyZWQgbGlzdCAoQ3VzdG9tZXJDb21wYW55IGFkZCkKICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICElQ29tcGFueSB8fCAhJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JEN1c3RvbWVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKCkKClRvIGZpbmQgY3VzdG9tZXIgY29tcGFuaWVzIGluIHRoZSBzeXN0ZW0uCgpUaGUgc2VhcmNoIGNyaXRlcmlhIGFyZSBsb2dpY2FsbHkgQU5EIGNvbm5lY3RlZC4KV2hlbiBhIGxpc3QgaXMgcGFzc2VkIGFzIGNyaXRlcmlhLCB0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBPUiBjb25uZWN0ZWQuCldoZW4gYW4gdW5kZWYgb3IgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBzZWFyY2ggY3JpdGVyaWEKaXMgaWdub3JlZC4KClJldHVybnMgZWl0aGVyIGEgbGlzdCwgYXMgYW4gYXJyYXlyZWYsIG9yIGEgY291bnQgb2YgZm91bmQgY3VzdG9tZXIgY29tcGFueSBpZHMuClRoZSBjb3VudCBvZiByZXN1bHRzIGlzIHJldHVybmVkIHdoZW4gdGhlIHBhcmFtZXRlciBDPFJlc3VsdCA9ICdDT1VOVCc+IGlzIHBhc3NlZC4KCiAgICBteSAkQ3VzdG9tZXJDb21wYW55SURzUmVmID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKAoKICAgICAgICAjIGFsbCBmaWVsZHMgaW4gYSBDdXN0b21lckNvbXBhbnlNYXAgYXJlIHNlYXJjaGFibGUKICAgICAgICBDdXN0b21lcklEICAgICAgICAgID0+ICdleGFtcGxlKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgPT4gJ05hbWUqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgYXJyYXkgcGFyYW1ldGVycyBhcmUgdXNlZCB3aXRoIGxvZ2ljYWwgT1Igb3BlcmF0b3IgKGFsbCB2YWx1ZXMgYXJlIHBvc3NpYmxlIHdoaWNoCiAgICAgICAgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZyBzZWxlY3Rpb24gaGFzaCBmb3IgdGhlIGZpZWxkKQogICAgICAgIEN1c3RvbWVyQ29tcGFueUNvdW50cnkgPT4gWyAnQXVzdHJpYScsICdHZXJtYW55JywgXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgRHluYW1pY0ZpZWxkcwogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbJ3ZhbHVlMScsICd2YWx1ZTInXQogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZE5hbWVYID0+IHsKICAgICAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBMaWtlICAgICAgICAgICAgICA9PiAndmFsdWUqJywgICAgICAgICAgICAgICAgIyAiZXF1YWxzIiBvcGVyYXRvciB3aXRoIHdpbGRjYXJkIHN1cHBvcnQKICAgICAgICAgICAgR3JlYXRlclRoYW4gICAgICAgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBHcmVhdGVyVGhhbkVxdWFscyA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuICAgICAgID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICAgICAgU21hbGxlclRoYW5FcXVhbHMgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgIH0KCiAgICAgICAgT3JkZXJCeSA9PiBbICdDdXN0b21lcklEJywgJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknIF0sICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ0N1c3RvbWVySUQnIF0KICAgICAgICAjIChhbGwgZmllbGRzIHdoaWNoIGFyZSBpbiBhIEN1c3RvbWVyQ29tcGFueU1hcCBjYW4gYmUgdXNlZCBmb3Igb3JkZXJpbmcpCgogICAgICAgICMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgT3JkZXJCeToKICAgICAgICAjIFRoZSBPcmRlckJ5RGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggT3JkZXJCeSBhdHRyaWJ1dGUuCiAgICAgICAgIyBUaGUgcGFpcmluZyBpcyBtYWRlIGJ5IHRoZSBhcnJheSBpbmRpY2VzLgoKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ0Rvd24nLCAnVXAnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgKERvd24gfCBVcCkgRGVmYXVsdDogWyAnRG93bicgXQoKICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJyB8fCAnQ09VTlQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2YgY2hhbmdlIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgY2hhbmdlcwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgKTsKClJldHVybnM6CgpSZXN1bHQ6ICdBUlJBWScKCiAgICBAQ3VzdG9tZXJJRHMgPSAoIDEsIDIsIDMgKTsKClJlc3VsdDogJ0NPVU5UJwoKICAgICRDdXN0b21lcklEcyA9IDEwOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGFsbCBnZW5lcmFsIHNlYXJjaCBmaWVsZHMgKHdpdGhvdXQgYSByZXN0cmljdGlvbiB0byBhIHNvdXJjZSkuCiAgICBteSBAQWxsU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygpOwoKICAgICMgR2VuZXJhdGUgYSBoYXNoIHdpdGggdGhlIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlcyB3aGljaCBtdXN0IGJlIHNlYXJjaGVkLgogICAgbXkgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKCiAgICAgICAgIyBHZXQgdGhlIHNlYXJjaCBmaWVsZHMgZm9yIHRoZSBjdXJyZW50IHNvdXJjZS4KICAgICAgICBteSBAU291cmNlU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygKICAgICAgICAgICAgU291cmNlID0+ICJDdXN0b21lckNvbXBhbnkkQ291bnQiLAogICAgICAgICk7CiAgICAgICAgbXkgJUxvb2t1cFNvdXJjZVNlYXJjaEZpZWxkcyA9IG1hcCB7ICRfLT57TmFtZX0gPT4gMSB9IEBTb3VyY2VTZWFyY2hGaWVsZHM7CgogICAgICAgICMgQ2hlY2sgaWYgYWxsIHNlYXJjaCBwYXJhbSBleGlzdHMgaW4gdGhlIHNlYXJjaCBmaWVsZHMgZnJvbSB0aGUgY3VycmVudCBzb3VyY2UuCiAgICAgICAgU0VBUkNIRklFTEQ6CiAgICAgICAgZm9yIG15ICRTZWFyY2hGaWVsZCAoQEFsbFNlYXJjaEZpZWxkcykgewoKICAgICAgICAgICAgbmV4dCBTRUFSQ0hGSUVMRCBpZiAhJFBhcmFteyAkU2VhcmNoRmllbGQtPntOYW1lfSB9OwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRMb29rdXBTb3VyY2VTZWFyY2hGaWVsZHN7ICRTZWFyY2hGaWVsZC0+e05hbWV9IH07CiAgICAgICAgfQogICAgICAgICRTZWFyY2hDdXN0b21lckNvbXBhbnlTb3VyY2VzeyJDdXN0b21lckNvbXBhbnkkQ291bnQifSA9IFxAU291cmNlU2VhcmNoRmllbGRzOwogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgJFBhcmFte1Jlc3VsdH0gfHw9ICdBUlJBWSc7CgogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQ09VTlQnICkgewoKICAgICAgICBteSAkSURzQ291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEc0NvdW50ID0gJFNlbGYtPnskU291cmNlfS0+Q3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgU2VhcmNoRmllbGRzID0+ICRTZWFyY2hDdXN0b21lckNvbXBhbnlTb3VyY2VzeyRTb3VyY2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRTdWJJRHNDb3VudDsKCiAgICAgICAgICAgICRJRHNDb3VudCArPSAkU3ViSURzQ291bnQgfHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRJRHNDb3VudDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSBASURzOwoKICAgICAgICBteSAkUmVzdWx0Q291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEcyA9ICRTZWxmLT57JFNvdXJjZX0tPkN1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFNlYXJjaEZpZWxkcyA9PiAkU2VhcmNoQ3VzdG9tZXJDb21wYW55U291cmNlc3skU291cmNlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkU3ViSURzOwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU3ViSURzKTsKCiAgICAgICAgICAgIHB1c2ggQElEcywgQHskU3ViSURzfTsKCiAgICAgICAgICAgICRSZXN1bHRDb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYXZlIG1vcmUgdGhlbiBvbmUgc2VhcmNoIHJlc3VsdHMgZnJvbSBkaWZmcmVudCBzb3VyY2VzLCB3ZSBuZWVkIGEgcmVzb3J0aW5nCiAgICAgICAgIyAgIGFuZCBzcGxpY2UgKGZvciB0aGUgbGltaXQpIGJlY2F1c2Ugb2YgdGhlIG1lcmdlZCBzaW5nbGUgcmVzdWx0cy4KICAgICAgICBpZiAoICRSZXN1bHRDb3VudCA+IDEgKSB7CgogICAgICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKCiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJDb21wYW55RGF0YSA9ICRTZWxmLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCwgXCVDdXN0b21lckNvbXBhbnlEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT3JkZXJCeSA9ICdDdXN0b21lcklEJzsKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5fSApICkgewogICAgICAgICAgICAgICAgJE9yZGVyQnkgPSAkUGFyYW17T3JkZXJCeX0tPlswXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSApICYmICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WzBdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCA9IHNvcnQgeyBsYyggJGEtPnskT3JkZXJCeX0gKSBjbXAgbGMoICRiLT57JE9yZGVyQnl9ICkgfSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBDdXN0b21lckNvbXBhbnlhdGFMaXN0ID0gc29ydCB7IGxjKCAkYi0+eyRPcmRlckJ5fSApIGNtcCBsYyggJGEtPnskT3JkZXJCeX0gKSB9IEBDdXN0b21lckNvbXBhbnlhdGFMaXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtMaW1pdH0gJiYgc2NhbGFyIEBDdXN0b21lckNvbXBhbnlhdGFMaXN0ID4gJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAgICAgICAgIHNwbGljZSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCwgJFBhcmFte0xpbWl0fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQElEcyA9IG1hcCB7ICRfLT57Q3VzdG9tZXJJRH0gfSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygpCgpHZXQgYSBsaXN0IG9mIGRlZmluZWQgc2VhcmNoIGZpZWxkcyAob3B0aW9uYWwgb25seSB0aGUgcmVsZXZhbnQgZmllbGRzIGZvciB0aGUgZ2l2ZW4gc291cmNlKS4KCiAgICBteSBAU2VhY2hGaWVsZHMgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlTZWFyY2hGaWVsZHMoCiAgICAgICAgU291cmNlID0+ICdDdXN0b21lckNvbXBhbnknLCAjIG9wdGlvbmFsLCBidXQgaW1wb3J0YW50IGluIHRoZSBDdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwgdG8gZ2V0IHRoZSByaWdodCBkYXRhYmFzZSBmaWVsZHMKICAgICk7CgpSZXR1cm5zIGFuIGFycmF5IG9mIGhhc2ggcmVmZXJlbmNlcy4KCiAgICBAU2VhY2hGaWVsZHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIExhYmVsID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVHlwZSAgPT4gJ0lucHV0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknLAogICAgICAgICAgICBMYWJlbCAgICAgICAgICA9PiAnQ291bnRyeScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBTZWxlY3Rpb25zRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgICAgICdVbml0ZWQgS2luZ2RvbScgPT4gJ1VuaXRlZCBLaW5nZG9tJywKICAgICAgICAgICAgICAgICdVbml0ZWQgU3RhdGVzJyAgPT4gJ1VuaXRlZCBTdGF0ZXMnLAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF9CcmFuY2gnLAogICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdCcmFuY2gnLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IHRoZSBzZWFyY2ggZmllbGRzIGZyb20gYWxsIGN1c3RvbWVyIGNvbXBhbnkgbWFwcyAobWVyZ2UgZnJvbSBhbGwgbWFwcyB0b2dldGhlcikuCiAgICBteSBAU2VhcmNoRmllbGRzOwoKICAgIG15ICVTZWFyY2hGaWVsZHNFeGlzdHM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAkUGFyYW17U291cmNlfSAmJiAkUGFyYW17U291cmNlfSBuZSAiQ3VzdG9tZXJDb21wYW55JENvdW50IjsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZE5hbWUgPSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFNlYXJjaEZpZWxkc0V4aXN0c3skU2VhcmNoRmllbGROYW1lfTsKCiAgICAgICAgICAgICMgUmVtZWJlciB0aGUgYWxyZWFkeSBjb2xsZWN0ZWQgc2VhcmNoIGZpZWxkIG5hbWUuCiAgICAgICAgICAgICRTZWFyY2hGaWVsZHNFeGlzdHN7JFNlYXJjaEZpZWxkTmFtZX0gPSAxOwoKICAgICAgICAgICAgbXkgJUZpZWxkQ29uZmlnID0gJFNlbGYtPkdldEZpZWxkQ29uZmlnKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBTb3VyY2UgICAgPT4gJFBhcmFte1NvdXJjZX0sICAgICAjIHRvIGdldCB0aGUgcmlnaHQgZGF0YWJhc2UgZmllbGQgZm9yIHRoZSBnaXZlbiBzb3VyY2UKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISVGaWVsZENvbmZpZzsKCiAgICAgICAgICAgIG15ICVTZWFyY2hGaWVsZERhdGEgPSAoCiAgICAgICAgICAgICAgICAlRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBOYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkU2VsZi0+R2V0RmllbGRTZWxlY3Rpb25zKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRTZWFyY2hGaWVsZERhdGF7U3RvcmFnZVR5cGV9IGVxICdkeW5hbWljX2ZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gPSAnRHluYW1pY0ZpZWxkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJVNlbGVjdGlvbnNEYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ICAgICAgICAgICA9ICdTZWxlY3Rpb24nOwogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtTZWxlY3Rpb25zRGF0YX0gPSBcJVNlbGVjdGlvbnNEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSA9ICdJbnB1dCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgXCVTZWFyY2hGaWVsZERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAU2VhcmNoRmllbGRzOwp9Cgo9aGVhZDIgR2V0RmllbGRDb25maWcoKQoKVGhpcyBmdW5jdGlvbiBjb2xsZWN0IHNvbWUgZmllbGQgY29uZmlnIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1c3RvbWVyIHVzZXIgbWFwLgoKICAgIG15ICVGaWVsZENvbmZpZyA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkdldEZpZWxkQ29uZmlnKAogICAgICAgIEZpZWxkTmFtZSA9PiAnQ3VzdG9tZXJDb21wYW55TmFtZScsCiAgICAgICAgU291cmNlICAgID0+ICdDdXN0b21lckNvbXBhbnknLCAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJucyBzb21lIGZpZWxkIGNvbmZpZyBpbmZvcm1hdGlvbjoKCiAgICBteSAlRmllbGRDb25maWcgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnbmFtZScsCiAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAndmFyJywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0RmllbGRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICRQYXJhbXtTb3VyY2V9ICYmICRQYXJhbXtTb3VyY2V9IG5lICJDdXN0b21lckNvbXBhbnkkQ291bnQiOwoKICAgICAgICAjIFNlYXJjaCB0aGUgcmlnaHQgZmllbGQgYW5kIHJldHVybiB0aGUgbGFiZWwuCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkUGFyYW17RmllbGROYW1lfSBuZSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG15ICVGaWVsZENvbmZpZyA9ICgKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAkRW50cnktPls1XSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAlRmllbGRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEdldEZpZWxkU2VsZWN0aW9ucygpCgpUaGlzIGZ1bmN0aW9uIGNvbGxlY3QgdGhlIHNlbGVjdGlvbnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLCBpZiB0aGUgZmllbGQgaGFzIHNvbWUgc2VsZWN0aW9ucy4KCiAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5HZXRGaWVsZFNlbGVjdGlvbnMoCiAgICAgICAgRmllbGROYW1lID0+ICdDdXN0b21lckNvbXBhbnlDb3VudHJ5JywKICAgICk7CgpSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIGZvciB0aGUgZ2l2ZW4gZmllbGQgbmFtZSAobWVyZ2VkIGZyb20gYWxsIHNvdXJjZXMpIG9yIGEgZW1wdHkgaGFzaDoKCiAgICBteSAlU2VsZWN0aW9uRGF0YSA9ICgKICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAnVW5pdGVkIEtpbmdkb20nID0+ICdVbml0ZWQgS2luZ2RvbScsCiAgICAgICAgJ1VuaXRlZCBTdGF0ZXMnICA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICApOwoKPWN1dAoKc3ViIEdldEZpZWxkU2VsZWN0aW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlU2VsZWN0aW9uc0RhdGE7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57U2VsZWN0aW9uc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfTsKCiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gKAogICAgICAgICAgICAlU2VsZWN0aW9uc0RhdGEsCiAgICAgICAgICAgICV7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1NlbGVjdGlvbnN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gfQogICAgICAgICk7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldC4KICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTZWxlY3Rpb25zRGF0YSApIHsKICAgICAgICAkU2VsZWN0aW9uc0RhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZUlucHV0KCAkU2VsZWN0aW9uc0RhdGF7JEtleX0gKTsKICAgIH0KCiAgICAjIERlZmF1bHQgaGFuZGxpbmcgZm9yIGZpZWxkICdDdXN0b21lckNvbXBhbnlDb3VudHJ5Jy4KICAgIGlmICggISVTZWxlY3Rpb25zRGF0YSAmJiAkUGFyYW17RmllbGROYW1lfSA9fiAvXkN1c3RvbWVyQ29tcGFueUNvdW50cnkvaSApIHsKICAgICAgICAlU2VsZWN0aW9uc0RhdGEgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVmZXJlbmNlRGF0YScpLT5Db3VudHJ5TGlzdCgpIH07CiAgICB9CgogICAgIyBEZWZhdWx0IGhhbmRsaW5nIGZvciBmaWVsZCAnVmFsaWRJRCcuCiAgICBlbHNpZiAoICElU2VsZWN0aW9uc0RhdGEgJiYgJFBhcmFte0ZpZWxkTmFtZX0gPX4gL15WYWxpZElEL2kgKSB7CiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgfQoKICAgIHJldHVybiAlU2VsZWN0aW9uc0RhdGE7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBleGVjdXRlIGFsbCB0cmFuc2FjdGlvbiBldmVudHMKICAgICRTZWxmLT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpOwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAzODI2M2FjZmYzYTFjZGI1NDE4Mjc3NDUwYjllZmJiODFjYmMyZDI1IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIC0gY3VzdG9tZXIgdXNlciBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGN1c3RvbWVyIHVzZXIgZnVuY3Rpb25zLiBFLiBnLiB0byBhZGQgYW5kIHVwZGF0ZSBjdXN0b21lciB1c2Vycy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHt9LCAkVHlwZTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQ3VzdG9tZXJVc2VyJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgbG9hZCBnZW5lcmF0b3IgY3VzdG9tZXIgcHJlZmVyZW5jZXMgbW9kdWxlCiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzJyktPntNb2R1bGV9CiAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OlByZWZlcmVuY2VzOjpEQic7CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICBpZiAoICRNYWluT2JqZWN0LT5SZXF1aXJlKCRHZW5lcmF0b3JNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9ID0gJEdlbmVyYXRvck1vZHVsZS0+bmV3KCk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwoKICAgICMgQ2hlY2sgaWYgbXVsdGl0ZW5hbmN5IGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIGEgdXNlci4KICAgIGlmICggJExheW91dFBhcmFtLT57VXNlclR5cGV9ICYmICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSBlcSAnVXNlcicgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKCiAgICAgICAgIyBTYXZlIHRoZSBVc2VySUQgYW5kIGFsbCBncm91cHMgdGhlIHVzZXIgaGFzICdybycgcGVybWlzc2lvbiBvbi4KICAgICAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICMgT25seSBnZXQgdGhlIGdyb3VwIGxpc3Qgb25jZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkTGF5b3V0UGFyYW0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRoZSBsaW1pdCBkb2VzIG5vdCBjb3VudCBmb3IgbWVtYmVycyBvZiBhIHNwZWNpZmljIGdyb3VwLgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpIHx8ICcnOwogICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSAgID0gcmV2ZXJzZSAlR3JvdXBzOwoKICAgICAgICAgICAgaWYgKCAhJEdyb3Vwc1JldmVyc2V7JFBlcm1pc3Npb25Hcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeX0gPSAkTGF5b3V0UGFyYW0tPntVc2VySUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBJRHN9ID0gWyBrZXlzICVHcm91cHMgXTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3Vwc30gICA9IFsgdmFsdWVzICVHcm91cHMgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgbG9hZCBjdXN0b21lciB1c2VyIGJhY2tlbmQgbW9kdWxlCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBzb3VyY2UuCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e0N1c3RvbWVyVXNlckdyb3VwfTsKCiAgICAgICAgIyBUaGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhpcyBzb3VyY2UuCiAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gJiYgJEN1c3RvbWVyVXNlckdyb3VwICkgewogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gPX4gL14kQ3VzdG9tZXJVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e01vZHVsZX07CiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRHZW5lcmljTW9kdWxlISAkQCIpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0gPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIFByZWZlcmVuY2VzT2JqZWN0ID0+ICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LAogICAgICAgICAgICBDdXN0b21lclVzZXJNYXAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLAogICAgICAgICk7CiAgICB9CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnQ3VzdG9tZXJVc2VyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDdXN0b21lclNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIHNvdXJjZSBsaXN0CgogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyU291cmNlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKTsKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9IHx8ICRDdXN0b21lckJhY2tlbmRDb25maWctPntNb2R1bGV9ICF+IC9MREFQL2k7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9IHx8ICRDdXN0b21lckJhY2tlbmRDb25maWctPntNb2R1bGV9ID1+IC9MREFQL2k7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGF7IkN1c3RvbWVyVXNlciRDb3VudCJ9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e05hbWV9CiAgICAgICAgICAgIHx8ICJObyBOYW1lICRDb3VudCI7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lclNlYXJjaCgpCgp0byBzZWFyY2ggY3VzdG9tZXIgdXNlcnMuCgogICAgIyB0ZXh0IHNlYXJjaCBpbiB0aGUgY3VzdG9tZXIgc2VhcmNoIGZpZWxkcwogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBTZWFyY2ggPT4gJypzb21lKicsICMgYWxzbyAnaGFucytodWJlcicgcG9zc2libGUKICAgICAgICBWYWxpZCAgPT4gMSwgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICAgICBMaW1pdCAgPT4gMTAwLCAgICAgICMgKG9wdGlvbmFsKSBvdmVycmlkZXMgbGltaXQgb2YgdGhlIGNvbmZpZwogICAgKTsKCiAgICAjIHVzZXJuYW1lIHNlYXJjaAogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBVc2VyTG9naW4gPT4gJypzb21lKicsCiAgICAgICAgVmFsaWQgICAgID0+IDEsICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKCiAgICAjIGVtYWlsIHNlYXJjaAogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICdlbWFpbEBleGFtcGxlLmNvbScsCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKCiAgICAjIHNlYXJjaCBieSBDdXN0b21lcklECiAgICAjIEl0IGRlcGVuZHMgb24gdGhlIGRhdGEgYmFja2VuZCB3aGVuIGFuICcqJyBpcyBjb25zaWRlcmVkIGEgd2lsZGNhcmQuCiAgICAjIFRoZSBEQiBiYWNrZW5kIGNvbnNpZGVycyAnKicgYXMgYW4gd2lsZGNhcmQuCiAgICAjIFRoZSBMREFQIGJhY2tlbmQgZG9lcyBub3QgZG8gc28uCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIEN1c3RvbWVySUQgICAgICAgPT4gJ0N1c3RvbWVySUQxMjMnLAogICAgICAgIFZhbGlkICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKCiAgICAjIFNlYXJjaCBieSBDdXN0b21lcklEIHdpdGhvdXQgd2lsZGNhcmQgZXhwYW5zaW9uLgogICAgIyBTbyBzZWFyY2hpbmcgYnkgJ0Fsb2lzKicgd291bGQgZmluZCBvbmx5ICdBbG9pcyonIGFuZCBub3QgJ0Fsb2lzJyBvciAnQWxvaXNpYScuCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIEN1c3RvbWVySURSYXcgICAgPT4gJ0N1c3RvbWVySUQxMjMnLAogICAgICAgIFZhbGlkICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKClJldHVybnMgYSBoYXNoIGxpa2U6CgogICAgewogICAgICAgICd0aW5hJyA9PiAnIlRpbmEgVGVzdGVyIiA8dGluYUBleGFtcGxlLmNvbT4nLAogICAgICAgICd0b25pJyA9PiAnIlRvbmkgVGVzdGVyIiA8dG9uaUBleGFtcGxlLmNvbT4nLAogICAgfQoKVGhlIG1ldGhvZCBpcyBtaXNuYW1lZCBhcyBDPEN1c3RvbWVyU2VhcmNoPiBzZWFyY2hlcyBmb3IgY3VzdG9tZXIgdXNlcnMsIG5vdCBjdXN0b21lcnMgYWthIGN1c3RvbWVyIGNvbXBhbmllcy4KCj1jdXQKCnN1YiBDdXN0b21lclNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcmVtb3ZlIGxlYWRpbmcgYW5kIGVuZGluZyBzcGFjZXMKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CiAgICAgICAgJFBhcmFte1NlYXJjaH0gPX4gcy9eXHMrLy87CiAgICAgICAgJFBhcmFte1NlYXJjaH0gPX4gcy9ccyskLy87CiAgICB9CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBvYmplY3QuCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgIG15ICREeW5hbWljRmllbGRDb25maWdzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfTsKCiAgICAjIEdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0LgogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJURhdGE7CiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBzZWFyY2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgICAgICBteSAkTWFwID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfTsKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTWFwKSApIHsKCiAgICAgICAgICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIE1hcAogICAgICAgICAgICAjIG9ubHkgdGhlc2Ugd2lsbCBiZSBjb25zaWRlcmVkIGZvciBhbnkgb3RoZXIgc2VhcmNoIGNvbmZpZwogICAgICAgICAgICAjIFsgJ0R5bmFtaWNGaWVsZF9OYW1lX1gnLCB1bmRlZiwgJ05hbWVfWCcsIDAsIDAsICdkeW5hbWljX2ZpZWxkJywgdW5kZWYsIDAsIHVuZGVmLCB1bmRlZiwgXSwKICAgICAgICAgICAgbXkgJUR5bmFtaWNGaWVsZE5hbWVzID0gbWFwIHsgJF8tPlsyXSA9PiAxIH0gZ3JlcCB7ICRfLT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnIH0gQHskTWFwfTsKCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlRHluYW1pY0ZpZWxkTmFtZXMgKSApIHsKICAgICAgICAgICAgICAgIG15ICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEczsKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZHM7CiAgICAgICAgICAgICAgICBteSAkU2VhcmNoUGFyYW07CgogICAgICAgICAgICAgICAgIyBjaGVjayB3aGljaCBvZiB0aGUgZHluYW1pYyBmaWVsZHMgY29uZmlndXJlZCBpbiBNYXAgYXJlIGFsc28KICAgICAgICAgICAgICAgICMgY29uZmlndXJlZCBpbiBTZWFyY2hGaWVsZHMKCiAgICAgICAgICAgICAgICAjIHBhcmFtIFNlYXJjaAogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTZWFyY2h9ICYmIGxlbmd0aCAkUGFyYW17U2VhcmNofSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGRzID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzfTsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW0gID0gJFBhcmFte1NlYXJjaH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBwYXJhbSBQb3N0TWFzdGVyU2VhcmNoCiAgICAgICAgICAgICAgICBlbHNpZiAoIGRlZmluZWQgJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICYmIGxlbmd0aCAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkcyA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHN9OwogICAgICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbSAgPSAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZWFyY2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZHMpICkgewogICAgICAgICAgICAgICAgICAgIG15IEBTZWFyY2hEeW5hbWljRmllbGROYW1lcyA9IGdyZXAgeyBleGlzdHMgJER5bmFtaWNGaWVsZE5hbWVzeyRffSB9IEB7JFNlYXJjaEZpZWxkc307CgogICAgICAgICAgICAgICAgICAgIG15ICVGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEczsKICAgICAgICAgICAgICAgICAgICBGSUVMRE5BTUU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZE5hbWUgKEBTZWFyY2hEeW5hbWljRmllbGROYW1lcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRMb29rdXB7JEZpZWxkTmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxETkFNRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2VhcmNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgICAgICAgICAgPT4gJFNlYXJjaFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZFZhbHVlcykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZFZhbHVlICggQHskRHluYW1pY0ZpZWxkVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHN7ICREeW5hbWljRmllbGRWYWx1ZS0+e09iamVjdElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzID0gWyBrZXlzICVGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcyBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSBiYWNrZW5kIHNlYXJjaCBmb3IgZm91bmQgb2JqZWN0IElEcwogICAgICAgICAgICAgICAgIyB0aGlzIGRhdGEgaXMgYmVpbmcgbWVyZ2VkIHdpdGggdGhlIGZvbGxvd2luZyBDdXN0b21lclNlYXJjaCBjYWxsCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMpICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0TmFtZXMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5PYmplY3RNYXBwaW5nR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBPQkpFQ1ROQU1FOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0TmFtZSAoIHZhbHVlcyAleyRPYmplY3ROYW1lc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgT0JKRUNUTkFNRSBpZiBleGlzdHMgJERhdGF7JE9iamVjdE5hbWV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNlYXJjaFBhcmFtID0gJVBhcmFtOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFNlYXJjaFBhcmFte1NlYXJjaH07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VhcmNoUGFyYW17UG9zdE1hc3RlclNlYXJjaH07CgogICAgICAgICAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW17VXNlckxvZ2lufSA9ICRPYmplY3ROYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJTZWFyY2goJVNlYXJjaFBhcmFtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlckxvZ2luIHNlYXJjaCBkb2VzIGEgd2lsZC1jYXJkIHNlYXJjaCwgYnV0IGluIHRoaXMgY2FzZSBvbmx5IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAjIGV4YWN0IG1hdGNoaW5nIHVzZXIgbG9naW4gaXMgcmVsZXZhbnQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdWJEYXRhICkgJiYgZXhpc3RzICRTdWJEYXRheyRPYmplY3ROYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhID0gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRPYmplY3ROYW1lID0+ICRTdWJEYXRheyRPYmplY3ROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgc2VhcmNoIHJlc3VsdCBvZiBiYWNrZW5kIGFuZCBtZXJnZSBpdAogICAgICAgIG15ICVTdWJEYXRhID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPkN1c3RvbWVyU2VhcmNoKCVQYXJhbSk7CgogICAgICAgICVEYXRhID0gKCAlU3ViRGF0YSwgJURhdGEgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNlZSB0aGlzIGN1c3RvbWVyIHVzZXIuCiAgICAjIFRPRE86IFJlbW92ZSB0aGlzIGlmIHRoZSBEQi9MREFQIGZ1bmN0aW9uIEN1c3RvbWVyU2VhcmNoIGlzIGZ1bGx5IGltcGxlbWVudGVkLgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgQ1VTVE9NRVJMT0dJTjoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlckxvZ2luICgga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISVVc2VyRGF0YSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskQ3VzdG9tZXJVc2VyTG9naW59OwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkxPR0lOOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJTZWFyY2hEZXRhaWwoKQoKVG8gZmluZCBjdXN0b21lciB1c2VycyBpbiB0aGUgc3lzdGVtLgoKVGhlIHNlYXJjaCBjcml0ZXJpYSBhcmUgbG9naWNhbGx5IEFORCBjb25uZWN0ZWQuCldoZW4gYSBsaXN0IGlzIHBhc3NlZCBhcyBjcml0ZXJpYSwgdGhlIGluZGl2aWR1YWwgbWVtYmVycyBhcmUgT1IgY29ubmVjdGVkLgpXaGVuIGFuIHVuZGVmIG9yIGEgcmVmZXJlbmNlIHRvIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZCwgdGhlbiB0aGUgc2VhcmNoIGNyaXRlcmlhCmlzIGlnbm9yZWQuCgpSZXR1cm5zIGVpdGhlciBhIGxpc3QsIGFzIGFuIGFycmF5cmVmLCBvciBhIGNvdW50IG9mIGZvdW5kIGN1c3RvbWVyIHVzZXIgaWRzLgpUaGUgY291bnQgb2YgcmVzdWx0cyBpcyByZXR1cm5lZCB3aGVuIHRoZSBwYXJhbWV0ZXIgQzxSZXN1bHQgPSAnQ09VTlQnPiBpcyBwYXNzZWQuCgogICAgbXkgJEN1c3RvbWVyVXNlcklEc1JlZiA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoRGV0YWlsKAoKICAgICAgICAjIGFsbCBmaWVsZHMgd2hpY2ggYXJlIGRlZmluZWQgaW4gYSBDdXN0b21lclVzZXJNYXAsIGV4Y2VwdCBwYXNzd29yZCBmaWVsZHMsIGFyZSBzZWFyY2hhYmxlCiAgICAgICAgVXNlckxvZ2luICAgICA9PiAnZXhhbXBsZSonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0ZpcnN0bionLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBzZWFyY2ggZm9yIHZhbGlkIHVzZXJzIG9ubHkgcGVyIGRlZmF1bHQsCiAgICAgICAgIyBwYXNzIDAgaW4gb3JkZXIgdG8gYWxzbyBzZWFyY2ggZm9yIGludmFsaWQgdXNlcnMKICAgICAgICBWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQoKICAgICAgICAjIHNwZWNpYWwgcGFyYW1ldGVycwogICAgICAgIEN1c3RvbWVyQ29tcGFueVNlYXJjaEN1c3RvbWVySURzID0+IFsgJ2V4YW1wbGUuY29tJyBdLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBFeGNsdWRlVXNlckxvZ2lucyAgICAgICAgICAgICAgICA9PiBbICdleGFtcGxlJywgJ2RvZWpvaG4nIF0sICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgYXJyYXkgcGFyYW1ldGVycyBhcmUgdXNlZCB3aXRoIGxvZ2ljYWwgT1Igb3BlcmF0b3IgKGFsbCB2YWx1ZXMgYXJlIHBvc3NpYmxlIHdoaWNoCiAgICAgICAgIyBhcmUgZGVmaW5lZCBpbiB0aGUgY29uZmlnIHNlbGVjdGlvbiBoYXNoIGZvciB0aGUgZmllbGQpCiAgICAgICAgVXNlckNvdW50cnkgICAgICAgICAgICAgID0+IFsgJ0F1c3RyaWEnLCAnR2VybWFueScsIF0sICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIER5bmFtaWNGaWVsZHMKICAgICAgICAjICAgQXQgbGVhc3Qgb25lIG9wZXJhdG9yIG11c3QgYmUgc3BlY2lmaWVkLiBPcGVyYXRvcnMgd2lsbCBiZSBjb25uZWN0ZWQgd2l0aCBBTkQsCiAgICAgICAgIyAgICAgICB2YWx1ZXMgaW4gYW4gb3BlcmF0b3Igd2l0aCBPUi4KICAgICAgICAjICAgWW91IGNhbiBhbHNvIHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byBhbiBvcGVyYXRvcjogWyd2YWx1ZTEnLCAndmFsdWUyJ10KICAgICAgICBEeW5hbWljRmllbGRfRmllbGROYW1lWCA9PiB7CiAgICAgICAgICAgIEVxdWFscyAgICAgICAgICAgID0+IDEyMywKICAgICAgICAgICAgTGlrZSAgICAgICAgICAgICAgPT4gJ3ZhbHVlKicsICAgICAgICAgICAgICAgICMgImVxdWFscyIgb3BlcmF0b3Igd2l0aCB3aWxkY2FyZCBzdXBwb3J0CiAgICAgICAgICAgIEdyZWF0ZXJUaGFuICAgICAgID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgR3JlYXRlclRoYW5FcXVhbHMgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBTbWFsbGVyVGhhbiAgICAgICA9PiAnMjAwMi0wMi0wMiAwMjowMjowMicsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuRXF1YWxzID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICB9CgogICAgICAgIE9yZGVyQnkgPT4gWyAnVXNlckxvZ2luJywgJ1VzZXJDdXN0b21lcklEJyBdLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ1VzZXJMb2dpbicgXQogICAgICAgICMgKGFsbCBmaWVsZHMgd2hpY2ggYXJlIGRlZmluZWQgaW4gYSBDdXN0b21lclVzZXJNYXAgY2FuIGJlIHVzZWQgZm9yIG9yZGVyaW5nKQoKICAgICAgICAjIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIE9yZGVyQnk6CiAgICAgICAgIyBUaGUgT3JkZXJCeURpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIE9yZGVyQnkgYXR0cmlidXRlLgogICAgICAgICMgVGhlIHBhaXJpbmcgaXMgbWFkZSBieSB0aGUgYXJyYXkgaW5kaWNlcy4KCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICAgICAgIyAoRG93biB8IFVwKSBEZWZhdWx0OiBbICdEb3duJyBdCgogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknIHx8ICdDT1VOVCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2YgY2hhbmdlIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgY2hhbmdlcwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICk7CgpSZXR1cm5zIGEgbGlzdCBvZiBjdXN0b21lciB1c2VycyB3aGVuICRSZXN1bHQgPT4gJ0FSUkFZJyB3YXMgcGFzc2VkOgoKICAgICRDdXN0b21lclVzZXJJRHMgPSBbICdhZGFsZHJpZGEnLCAnYWRhbWFudGEnLCAnYWRhbGdyaW0gJyBdOwogICAgJEN1c3RvbWVyVXNlcklEcyA9IFtdOyAjIHdoZW4gbm8gY3VzdG9tZXIgdXNlcnMgaGFkIGJlZW4gZm91bmQKClJldHVybnMgYSBjb3VudCBvZiBjdXN0b21lciB1c2VycyB3aGVuICRSZXN1bHQgPT4gJ0NPVU5UJyB3YXMgcGFzc2VkOgoKICAgICRDdXN0b21lclVzZXJJRHMgPSAzOwogICAgJEN1c3RvbWVyVXNlcklEcyA9IDA7ICMgd2hlbiBubyBjdXN0b21lciB1c2VycyBoYWQgYmVlbiBmb3VuZAoKPWN1dAoKc3ViIEN1c3RvbWVyU2VhcmNoRGV0YWlsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYWxsIGdlbmVyYWwgc2VhcmNoIGZpZWxkcyAod2l0aG91dCBhIHJlc3RyaWN0aW9uIHRvIGEgc291cmNlKQogICAgbXkgQEFsbFNlYXJjaEZpZWxkcyA9ICRTZWxmLT5DdXN0b21lclVzZXJTZWFyY2hGaWVsZHMoKTsKCiAgICAjIGdlbmVyYXRlIGEgaGFzaCB3aXRoIHRoZSBjdXN0b21lciB1c2VyIHNvdXJjZXMgd2hpY2ggbXVzdCBiZSBzZWFyY2hlZAogICAgbXkgJVNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBnZXQgdGhlIHNlYXJjaCBmaWVsZHMgZm9yIHRoZSBjdXJyZW50IHNvdXJjZQogICAgICAgIG15IEBTb3VyY2VTZWFyY2hGaWVsZHMgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKAogICAgICAgICAgICBTb3VyY2UgPT4gIkN1c3RvbWVyVXNlciRDb3VudCIsCiAgICAgICAgKTsKICAgICAgICBteSAlTG9va3VwU291cmNlU2VhcmNoRmllbGRzID0gbWFwIHsgJF8tPntOYW1lfSA9PiAxIH0gQFNvdXJjZVNlYXJjaEZpZWxkczsKCiAgICAgICAgIyBjaGVjayBpZiBhbGwgc2VhcmNoIHBhcmFtIGV4aXN0cyBpbiB0aGUgc2VhcmNoIGZpZWxkcyBmcm9tIHRoZSBjdXJyZW50IHNvdXJjZQogICAgICAgIFNFQVJDSEZJRUxEOgogICAgICAgIGZvciBteSAkU2VhcmNoRmllbGQgKEBBbGxTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgICAgIG5leHQgU0VBUkNIRklFTEQgaWYgISRQYXJhbXsgJFNlYXJjaEZpZWxkLT57TmFtZX0gfTsKCiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkTG9va3VwU291cmNlU2VhcmNoRmllbGRzeyAkU2VhcmNoRmllbGQtPntOYW1lfSB9OwogICAgICAgIH0KICAgICAgICAkU2VhcmNoQ3VzdG9tZXJVc2VyU291cmNlc3siQ3VzdG9tZXJVc2VyJENvdW50In0gPSBcQFNvdXJjZVNlYXJjaEZpZWxkczsKICAgIH0KCiAgICAjIHNldCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHRoZSByZXR1cm4gdHlwZQogICAgJFBhcmFte1Jlc3VsdH0gfHw9ICdBUlJBWSc7CgogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQ09VTlQnICkgewoKICAgICAgICBteSAkSURzQ291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEc0NvdW50ID0gJFNlbGYtPnskU291cmNlfS0+Q3VzdG9tZXJTZWFyY2hEZXRhaWwoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBTZWFyY2hGaWVsZHMgPT4gJFNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXN7JFNvdXJjZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gaWYgIWRlZmluZWQgJFN1YklEc0NvdW50OwoKICAgICAgICAgICAgJElEc0NvdW50ICs9ICRTdWJJRHNDb3VudCB8fCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJElEc0NvdW50OwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15IEBJRHM7CgogICAgICAgIG15ICRSZXN1bHRDb3VudCA9IDA7CgogICAgICAgIFNPVVJDRToKICAgICAgICBmb3IgbXkgJFNvdXJjZSAoIHNvcnQga2V5cyAlU2VhcmNoQ3VzdG9tZXJVc2VyU291cmNlcyApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57JFNvdXJjZX07CgogICAgICAgICAgICBteSAkU3ViSURzID0gJFNlbGYtPnskU291cmNlfS0+Q3VzdG9tZXJTZWFyY2hEZXRhaWwoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBTZWFyY2hGaWVsZHMgPT4gJFNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXN7JFNvdXJjZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gaWYgIWRlZmluZWQgJFN1YklEczsKCiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoJFN1YklEcyk7CgogICAgICAgICAgICBwdXNoIEBJRHMsIEB7JFN1YklEc307CgogICAgICAgICAgICAkUmVzdWx0Q291bnQrKzsKICAgICAgICB9CgogICAgICAgICMgaWYgd2UgaGF2ZSBtb3JlIHRoZW4gb25lIHNlYXJjaCByZXN1bHRzIGZyb20gZGlmZnJlbnQgc291cmNlcywgd2UgbmVlZCBhIHJlc29ydGluZwogICAgICAgICMgYmVjYXVzZSBvZiB0aGUgbWVyZ2VkIHNpbmdsZSByZXN1bHRzCiAgICAgICAgaWYgKCAkUmVzdWx0Q291bnQgPiAxICkgewoKICAgICAgICAgICAgbXkgQFVzZXJEYXRhTGlzdDsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKCiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBVc2VyRGF0YUxpc3QsIFwlVXNlckRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRPcmRlckJ5ID0gJ1VzZXJMb2dpbic7CiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17T3JkZXJCeX0gKSApIHsKICAgICAgICAgICAgICAgICRPcmRlckJ5ID0gJFBhcmFte09yZGVyQnl9LT5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0gKSAmJiAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlswXSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgQFVzZXJEYXRhTGlzdCA9IHNvcnQgeyBsYyggJGEtPnskT3JkZXJCeX0gKSBjbXAgbGMoICRiLT57JE9yZGVyQnl9ICkgfSBAVXNlckRhdGFMaXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgQFVzZXJEYXRhTGlzdCA9IHNvcnQgeyBsYyggJGItPnskT3JkZXJCeX0gKSBjbXAgbGMoICRhLT57JE9yZGVyQnl9ICkgfSBAVXNlckRhdGFMaXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtMaW1pdH0gJiYgc2NhbGFyIEBVc2VyRGF0YUxpc3QgPiAkUGFyYW17TGltaXR9ICkgewogICAgICAgICAgICAgICAgc3BsaWNlIEBVc2VyRGF0YUxpc3QsICRQYXJhbXtMaW1pdH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBJRHMgPSBtYXAgeyAkXy0+e1VzZXJMb2dpbn0gfSBAVXNlckRhdGFMaXN0OwogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uIGZvciBldmVyeSBzaW5nbGUgY3VzdG9tZXIgdXNlci4KICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAgICAgbXkgQE5ld0lEUyA9IEBJRHM7CiAgICAgICAgICAgIEBJRHMgPSAoKTsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBOZXdJRFMpIHsKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoJVVzZXJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASURzLCAkSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKCkKCkdldCBhIGxpc3Qgb2YgdGhlIGRlZmluZWQgc2VhcmNoIGZpZWxkcyAob3B0aW9uYWwgb25seSB0aGUgcmVsZXZhbnQgZmllbGRzIGZvciB0aGUgZ2l2ZW4gc291cmNlKS4KCiAgICBteSBAU2VhY2hGaWVsZHMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJTZWFyY2hGaWVsZHMoCiAgICAgICAgU291cmNlID0+ICdDdXN0b21lclVzZXInLCAjIG9wdGlvbmFsLCBidXQgaW1wb3J0YW50IGluIHRoZSBDdXN0b21lclNlYXJjaERldGFpbCB0byBnZXQgdGhlIHJpZ2h0IGRhdGFiYXNlIGZpZWxkcwogICAgKTsKClJldHVybnMgYW4gYXJyYXkgb2YgaGFzaCByZWZlcmVuY2VzLgoKICAgIEBTZWFjaEZpZWxkcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1VzZXJFbWFpbCcsCiAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJ0VtYWlsJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnSW5wdXQnLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdtYWlsJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1VzZXJDb3VudHJ5JywKICAgICAgICAgICAgTGFiZWwgICAgICAgICAgPT4gJ0NvdW50cnknLAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgU2VsZWN0aW9uc0RhdGEgPT4gewogICAgICAgICAgICAgICAgJ0dlcm1hbnknICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgICAgICAnVW5pdGVkIEtpbmdkb20nID0+ICdVbml0ZWQgS2luZ2RvbScsCiAgICAgICAgICAgICAgICAnVW5pdGVkIFN0YXRlcycgID0+ICdVbml0ZWQgU3RhdGVzJywKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICB9LAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdjb3VudHJ5JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnRHluYW1pY0ZpZWxkX1NreXBlQWNjb3VudE5hbWUnLAogICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdTa3lwZUFjY291bnROYW1lJywKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEdldCB0aGUgc2VhcmNoIGZpZWxkcyBmcm9tIGFsbCBjdXN0b21lciB1c2VyIG1hcHMgKG1lcmdlIGZyb20gYWxsIG1hcHMgdG9nZXRoZXIpLgogICAgbXkgQFNlYXJjaEZpZWxkczsKCiAgICBteSAlU2VhcmNoRmllbGRzRXhpc3RzOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgJFBhcmFte1NvdXJjZX0gJiYgJFBhcmFte1NvdXJjZX0gbmUgIkN1c3RvbWVyVXNlciRDb3VudCI7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgICAgICBteSAkU2VhcmNoRmllbGROYW1lID0gJEVudHJ5LT5bMF07CgogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRTZWFyY2hGaWVsZHNFeGlzdHN7JFNlYXJjaEZpZWxkTmFtZX07CiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFNlYXJjaEZpZWxkTmFtZSA9fiBteyhQYXNzd29yZHxQdylcZCokfXNteGk7CgogICAgICAgICAgICAjIFJlbWVtYmVyIHRoZSBhbHJlYWR5IGNvbGxlY3RlZCBzZWFyY2ggZmllbGQgbmFtZS4KICAgICAgICAgICAgJFNlYXJjaEZpZWxkc0V4aXN0c3skU2VhcmNoRmllbGROYW1lfSA9IDE7CgogICAgICAgICAgICBteSAlRmllbGRDb25maWcgPSAkU2VsZi0+R2V0RmllbGRDb25maWcoCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgPT4gJFNlYXJjaEZpZWxkTmFtZSwKICAgICAgICAgICAgICAgIFNvdXJjZSAgICA9PiAkUGFyYW17U291cmNlfSwgICAgICMgdG8gZ2V0IHRoZSByaWdodCBkYXRhYmFzZSBmaWVsZCBmb3IgdGhlIGdpdmVuIHNvdXJjZQogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhJUZpZWxkQ29uZmlnOwoKICAgICAgICAgICAgbXkgJVNlYXJjaEZpZWxkRGF0YSA9ICgKICAgICAgICAgICAgICAgICVGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNlYXJjaEZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICVTZWxlY3Rpb25zRGF0YSA9ICRTZWxmLT5HZXRGaWVsZFNlbGVjdGlvbnMoCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgPT4gJFNlYXJjaEZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFNlYXJjaEZpZWxkRGF0YXtTdG9yYWdlVHlwZX0gZXEgJ2R5bmFtaWNfZmllbGQnICkgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSA9ICdEeW5hbWljRmllbGQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICglU2VsZWN0aW9uc0RhdGEpIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gICAgICAgICAgID0gJ1NlbGVjdGlvbic7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1NlbGVjdGlvbnNEYXRhfSA9IFwlU2VsZWN0aW9uc0RhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ID0gJ0lucHV0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCBcJVNlYXJjaEZpZWxkRGF0YTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBTZWFyY2hGaWVsZHM7Cn0KCj1oZWFkMiBHZXRGaWVsZENvbmZpZygpCgpUaGlzIGZ1bmN0aW9uIGNvbGxlY3Qgc29tZSBmaWVsZCBjb25maWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgY3VzdG9tZXIgdXNlciBtYXAuCgogICAgbXkgJUZpZWxkQ29uZmlnID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2V0RmllbGRDb25maWcoCiAgICAgICAgRmllbGROYW1lID0+ICdVc2VyRW1haWwnLAogICAgICAgIFNvdXJjZSAgICA9PiAnQ3VzdG9tZXJVc2VyJywgIyBvcHRpb25hbAogICAgKTsKClJldHVybnMgc29tZSBmaWVsZCBjb25maWcgaW5mb3JtYXRpb246CgogICAgbXkgJUZpZWxkQ29uZmlnID0gKAogICAgICAgIExhYmVsICAgICAgICAgPT4gJ0VtYWlsJywKICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdlbWFpbCcsCiAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAndmFyJywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0RmllbGRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICRQYXJhbXtTb3VyY2V9ICYmICRQYXJhbXtTb3VyY2V9IG5lICJDdXN0b21lclVzZXIkQ291bnQiOwoKICAgICAgICAjIFNlYXJjaCB0aGUgcmlnaHQgZmllbGQgYW5kIHJldHVybiBzb21lIGNvbmZpZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWVsZC4KICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRQYXJhbXtGaWVsZE5hbWV9IG5lICRFbnRyeS0+WzBdOwoKICAgICAgICAgICAgbXkgJUZpZWxkQ29uZmlnID0gKAogICAgICAgICAgICAgICAgTGFiZWwgICAgICAgICA9PiAkRW50cnktPlsxXSwKICAgICAgICAgICAgICAgIERhdGFiYXNlRmllbGQgPT4gJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSAgID0+ICRFbnRyeS0+WzVdLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICVGaWVsZENvbmZpZzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgR2V0RmllbGRTZWxlY3Rpb25zKCkKClRoaXMgZnVuY3Rpb24gY29sbGVjdCB0aGUgc2VsZWN0aW9ucyBmb3IgdGhlIGdpdmVuIGZpZWxkIG5hbWUsIGlmIHRoZSBmaWVsZCBoYXMgc29tZSBzZWxlY3Rpb25zLgoKICAgIG15ICVTZWxlY3Rpb25zRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdldEZpZWxkU2VsZWN0aW9ucygKICAgICAgICBGaWVsZE5hbWUgPT4gJ1VzZXJUaXRsZScsCiAgICApOwoKUmV0dXJucyB0aGUgc2VsZWN0aW9ucyBmb3IgdGhlIGdpdmVuIGZpZWxkIG5hbWUgKG1lcmdlZCBmcm9tIGFsbCBzb3VyY2VzKSBvciBhIGVtcHR5IGhhc2g6CgogICAgbXkgJVNlbGVjdGlvbkRhdGEgPSAoCiAgICAgICAgJ01yLicgID0+ICdNci4nLAogICAgICAgICdNcnMuJyA9PiAnTXJzLicsCiAgICApOwoKPWN1dAoKc3ViIEdldEZpZWxkU2VsZWN0aW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlU2VsZWN0aW9uc0RhdGE7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57U2VsZWN0aW9uc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfTsKCiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gKAogICAgICAgICAgICAlU2VsZWN0aW9uc0RhdGEsICV7ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1NlbGVjdGlvbnN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gfQogICAgICAgICk7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldC4KICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTZWxlY3Rpb25zRGF0YSApIHsKICAgICAgICAkU2VsZWN0aW9uc0RhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZUlucHV0KCAkU2VsZWN0aW9uc0RhdGF7JEtleX0gKTsKICAgIH0KCiAgICAjIERlZmF1bHQgaGFuZGxpbmcgZm9yIGZpZWxkICdWYWxpZElEJy4KICAgIGlmICggISVTZWxlY3Rpb25zRGF0YSAmJiAkUGFyYW17RmllbGROYW1lfSA9fiAvXlZhbGlkSUQvaSApIHsKICAgICAgICAlU2VsZWN0aW9uc0RhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICB9CgogICAgcmV0dXJuICVTZWxlY3Rpb25zRGF0YTsKfQoKPWhlYWQyIEN1c3RvbWVySURMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2Ygd2l0aCBhbGwga25vd24gdW5pcXVlIEN1c3RvbWVySURzIG9mIHRoZSByZWdpc3RlcmVkIGN1c3RvbWVycyB1c2VycyAobm8gU2VhcmNoVGVybSksCm9yIGEgZmlsdGVyZWQgbGlzdCB3aGVyZSB0aGUgQ3VzdG9tZXJJRHMgbXVzdCBjb250YWluIGEgc2VhcmNoIHRlcm0uCgogICAgbXkgQEN1c3RvbWVySURzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJJRExpc3QoCiAgICAgICAgU2VhcmNoVGVybSAgPT4gJ3NvbWVjdXN0b21lcicsICAgICMgb3B0aW9uYWwKICAgICAgICBWYWxpZCAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lcklETGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGxpc3QgcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgcHVzaCBARGF0YSwgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPkN1c3RvbWVySURMaXN0KCVQYXJhbSk7CiAgICB9CgogICAgIyBtYWtlIGVudHJpZXMgdW5pcXVlCiAgICBteSAlVG1wOwogICAgQFRtcHtARGF0YX0gPSB1bmRlZjsKICAgIEBEYXRhID0gc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJVRtcDsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIERvbid0IHJldHVybiBjdXN0b21lciBJRHMgaWYgdGhlIGFnZW50IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgbXkgQENsZWFuZWRDdXN0b21lcklEczsKCiAgICAgICAgZm9yIG15ICRDdXN0b21lcklEICggQERhdGEgKSB7CiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAlQ29tcGFueSAmJiAkQ29tcGFueXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQENsZWFuZWRDdXN0b21lcklEcywgJEN1c3RvbWVySUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEBEYXRhID0gQENsZWFuZWRDdXN0b21lcklEczsKICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIHJldHVybiBARGF0YTsKfQoKPWhlYWQyIEN1c3RvbWVyTmFtZSgpCgpnZXQgY3VzdG9tZXIgdXNlciBuYW1lCgogICAgbXkgJE5hbWUgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoCiAgICAgICAgVXNlckxvZ2luID0+ICdzb21lLWxvZ2luJywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJOYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgR2V0IGN1c3RvbWVyIG5hbWUgYW5kIHJldHVybiBpdC4KICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lck5hbWUoJVBhcmFtKTsKICAgICAgICBpZiAoJE5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuICROYW1lOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKPWhlYWQyIEN1c3RvbWVySURzKCkKCmdldCBjdXN0b21lciB1c2VyIGN1c3RvbWVyIGlkcwoKICAgIG15IEBDdXN0b21lcklEcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVySURzKAogICAgICAgIFVzZXIgPT4gJ3NvbWUtbG9naW4nLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lcklEcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGlkcyAoc3RvcCBhZnRlciBmaXJzdCBzb3VyY2Ugd2l0aCByZXN1bHRzKQogICAgbXkgQEN1c3RvbWVySURzOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGlkcyBmcm9tIHNvdXJjZQogICAgICAgIG15IEBTb3VyY2VDdXN0b21lcklEcyA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lcklEcyglUGFyYW0pOwogICAgICAgIG5leHQgU09VUkNFIGlmICFAU291cmNlQ3VzdG9tZXJJRHM7CgogICAgICAgIEBDdXN0b21lcklEcyA9IEBTb3VyY2VDdXN0b21lcklEczsKICAgICAgICBsYXN0IFNPVVJDRTsKICAgIH0KCiAgICAjIGNyZWF0ZSBoYXNoIHdpdGggZXhpc3RpbmcgY3VzdG9tZXIgaWRzCiAgICBteSAlQ3VzdG9tZXJJRHMgPSBtYXAgeyAkXyA9PiAxIH0gQEN1c3RvbWVySURzOwoKICAgICMgZ2V0IHJlbGF0ZWQgY3VzdG9tZXIgaWRzCiAgICBteSBAUmVsYXRlZEN1c3RvbWVySURzID0gJFNlbGYtPkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17VXNlcn0sCiAgICApOwoKICAgICMgYWRkIHJlbGF0ZWQgY3VzdG9tZXIgaWRzIGlmIG5vdCBmb3VuZCBpbiBzb3VyY2UKICAgIFJFTEFURURDVVNUT01FUklEOgogICAgZm9yIG15ICRSZWxhdGVkQ3VzdG9tZXJJRCAoQFJlbGF0ZWRDdXN0b21lcklEcykgewogICAgICAgIG5leHQgUkVMQVRFRENVU1RPTUVSSUQgaWYgJEN1c3RvbWVySURzeyRSZWxhdGVkQ3VzdG9tZXJJRH07CgogICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkUmVsYXRlZEN1c3RvbWVySUQ7CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBEb24ndCByZXR1cm4gY3VzdG9tZXIgSURzIGlmIHRoZSBhZ2VudCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldy4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIG15IEBDbGVhbmVkQ3VzdG9tZXJJRHM7CgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIEBDdXN0b21lcklEcyApIHsKICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICVDb21wYW55ICYmICRDb21wYW55e0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQ2xlYW5lZEN1c3RvbWVySURzLCAkQ3VzdG9tZXJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQEN1c3RvbWVySURzID0gQENsZWFuZWRDdXN0b21lcklEczsKICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgcmV0dXJuIGN1c3RvbWVyIGlkcwogICAgcmV0dXJuIEBDdXN0b21lcklEczsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckRhdGFHZXQoKQoKZ2V0IHVzZXIgZGF0YSAoVXNlckxvZ2luLCBVc2VyRmlyc3RuYW1lLCBVc2VyTGFzdG5hbWUsIFVzZXJFbWFpbCwgLi4uKQoKICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICdmcmFueicsCiAgICApOwoKV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgYmFja2VuZHMgdGhlbiBvbmx5IHRoZSBkYXRhIGZyb20gdGhlIGZpcnN0IGJhY2tlbmQgd2hlcmUgdGhlIGN1c3RvbWVyIHVzZXIgaXMgZm91bmQuCkFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQgd2hlbiB0aGUgY3VzdG9tZXIgdXNlciB3YXMndCBmb3VuZCBpbiBhbnkgYmFja2VuZC4KCj1jdXQKCnN1YiBDdXN0b21lclVzZXJEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIHVubGVzcyAkUGFyYW17VXNlcn07CgogICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb25zIGZvciBDdXN0b21lclVzZXIuCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfTsKCiAgICAjIEdldCBuZWVkZWQgb2JqZWN0cy4KICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDdXN0b21lckNvbXBhbnlPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgIG15ICVDdXN0b21lciA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lclVzZXJEYXRhR2V0KCVQYXJhbSk7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISVDdXN0b21lcjsKCiAgICAgICAgIyBnZW5lcmF0ZSB0aGUgZnVsbCBuYW1lIGFuZCBzYXZlIGl0IGluIHRoZSBoYXNoCiAgICAgICAgbXkgJFVzZXJGdWxsbmFtZSA9ICRTZWxmLT5DdXN0b21lck5hbWUoJUN1c3RvbWVyKTsKCiAgICAgICAgIyBzYXZlIHRoZSBnZW5lcmF0ZWQgZnVsbG5hbWUgaW4gdGhlIGhhc2guCiAgICAgICAgJEN1c3RvbWVye1VzZXJGdWxsbmFtZX0gPSAkVXNlckZ1bGxuYW1lOwoKICAgICAgICAjIGFkZCBwcmVmZXJlbmNlcyBkZWZhdWx0cwogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKTsKICAgICAgICBpZiAoJENvbmZpZykgewogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JENvbmZpZ30gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgIWRlZmluZWQgJENvbmZpZy0+eyRLZXl9LT57RGF0YVNlbGVjdGVkfTsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmIGRlZmluZWQgJEN1c3RvbWVyeyAkQ29uZmlnLT57JEtleX0tPntQcmVmS2V5fSB9OwoKICAgICAgICAgICAgICAgICMgc2V0IGRlZmF1bHQgZGF0YQogICAgICAgICAgICAgICAgJEN1c3RvbWVyeyAkQ29uZmlnLT57JEtleX0tPntQcmVmS2V5fSB9ID0gJENvbmZpZy0+eyRLZXl9LT57RGF0YVNlbGVjdGVkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBjdXN0b21lciBjb21wYW55IHN1cHBvcnQgaXMgZW5hYmxlZCBhbmQgZ2V0IGNvbXBhbnkgZGF0YQogICAgICAgIG15ICVDb21wYW55OwogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkiKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJUNvbXBhbnkgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcntVc2VyQ3VzdG9tZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ29tcGFueXtDdXN0b21lckNvbXBhbnlWYWxpZElEfSA9ICRDb21wYW55e1ZhbGlkSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9ICkgKSB7CiAgICAgICAgICAgIENVU1RPTUVSVVNFUkZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlckZpZWxkICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJGSUVMRCBpZiAkQ3VzdG9tZXJVc2VyRmllbGQtPls1XSBuZSAnZHluYW1pY19maWVsZCc7CiAgICAgICAgICAgICAgICBuZXh0IENVU1RPTUVSVVNFUkZJRUxEIGlmICEkRHluYW1pY0ZpZWxkTG9va3VweyAkQ3VzdG9tZXJVc2VyRmllbGQtPlsyXSB9OwoKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyVXNlckZpZWxkLT5bMl0gfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVye1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRDdXN0b21lcnsgJEN1c3RvbWVyVXNlckZpZWxkLT5bMF0gfSA9ICRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uLgogICAgICAgIGlmICggJEN1c3RvbWVye1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1VzZXJHcm91cElEU3luY307CgogICAgICAgICAgICAjIFJlcGxhY2UgdGhlIHJlbW90ZSBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIGxvY2FsIGdyb3VwLgogICAgICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJ7VXNlckdyb3VwSUR9IGVxICRSZW1vdGVHcm91cCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVye1VzZXJHcm91cElEfSA9ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH17JFJlbW90ZUdyb3VwfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIG1hdGNoZWQuCiAgICAgICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVye1VzZXJHcm91cElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBHcm91cCA9PiAkQ3VzdG9tZXJ7VXNlckdyb3VwSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBhbnkgbGltaXRzIGFyZSBzZXQuCiAgICAgICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICFncmVwIHsgJF8gPX4gL14kQ3VzdG9tZXJ7VXNlckdyb3VwSUR9JC8gfSBAeyAkU2VsZi0+e1VzZXJHcm91cElEc30gfSApIHsKICAgICAgICAgICAgICAgICMgVGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhpcyBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIElmIHRoZXJlIGFyZSBubyBncm91cCBzZXR0aW5ncywgY2hlY2sgaWYgcGVybWlzc2lvbiBvbiBjdXN0b21lciBjb21wYW55IGlzIHBlcm1pdHRlZC4KICAgICAgICBlbHNpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSAmJiAhJEN1c3RvbWVye1VzZXJHcm91cElEfSAmJiAoICElQ29tcGFueSB8fCAhJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICAgICAjIHJldHVybiBjdXN0b21lciBkYXRhCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJUNvbXBhbnksCiAgICAgICAgICAgICVDdXN0b21lciwKICAgICAgICAgICAgU291cmNlICAgICAgICA9PiAiQ3VzdG9tZXJVc2VyJENvdW50IiwKICAgICAgICAgICAgQ29uZmlnICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLAogICAgICAgICAgICBDb21wYW55Q29uZmlnID0+ICRDb25maWdPYmplY3QtPkdldCggJENvbXBhbnl7U291cmNlfSAvLyAnQ3VzdG9tZXJDb21wYW55JyApLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyQWRkKCkKCnRvIGFkZCBuZXcgY3VzdG9tZXIgdXNlcnMKCiAgICBteSAkVXNlckxvZ2luID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgIFNvdXJjZSAgICAgICAgID0+ICdDdXN0b21lclVzZXInLCAjIEN1c3RvbWVyVXNlciBzb3VyY2UgY29uZmlnCiAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJ01hbmZyZWQnLAogICAgICAgIFVzZXJMYXN0bmFtZSAgID0+ICdIdWJlcicsCiAgICAgICAgVXNlckN1c3RvbWVySUQgPT4gJ0ExMjQnLAogICAgICAgIFVzZXJMb2dpbiAgICAgID0+ICdtaHViZXInLAogICAgICAgIFVzZXJQYXNzd29yZCAgID0+ICdzb21lLXBhc3MnLCAjIG5vdCByZXF1aXJlZAogICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICdtYW5mcmVkLmh1YmVyQGV4YW1wbGUuY29tJywKICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBkYXRhIHNvdXJjZQogICAgaWYgKCAhJFBhcmFte1NvdXJjZX0gKSB7CiAgICAgICAgJFBhcmFte1NvdXJjZX0gPSAnQ3VzdG9tZXJVc2VyJzsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBpZiAoICRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKICAgICAgICBpZiAoJVVzZXIpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoICdDdXN0b21lciB1c2VyICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJFBhcmFte1VzZXJMb2dpbn0gKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGFkZCB0aGUgVXNlckdyb3VwSUQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBkZWxldGUgJFBhcmFte1VzZXJHcm91cElEfTsKICAgIH0KCiAgICBteSAkVXNlckdyb3VwSURTeW5jID0gJFNlbGYtPnskUGFyYW17U291cmNlfX0tPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSApIHsKICAgICAgICAjIENoZWNrIGlmIGdyb3VwIElEIG9yIGdyb3VwIG5hbWVzIHNob3VsZCBiZSBtYXRjaGVkLgogICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICBteSAkR3JvdXBOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkUGFyYW17VXNlckdyb3VwSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRHcm91cE5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VXNlckdyb3VwSUR9IGVxICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH17JFJlbW90ZUdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIHN0b3JlIGN1c3RvbWVyIHVzZXIgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57ICRQYXJhbXtTb3VyY2V9IH0tPkN1c3RvbWVyVXNlckFkZCglUGFyYW0pOwogICAgcmV0dXJuIGlmICEkUmVzdWx0OwoKICAgICMgdHJpZ2dlciBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ3VzdG9tZXJVc2VyQWRkJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgTmV3RGF0YSAgID0+IFwlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0OwoKfQoKPWhlYWQyIEN1c3RvbWVyVXNlclVwZGF0ZSgpCgp0byB1cGRhdGUgY3VzdG9tZXIgdXNlcnMKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJVcGRhdGUoCiAgICAgICAgU291cmNlICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyJywgIyBDdXN0b21lclVzZXIgc291cmNlIGNvbmZpZwogICAgICAgIElEICAgICAgICAgICAgPT4gJ21oJyAgICAgICAgICAgICMgY3VycmVudCB1c2VyIGxvZ2luCiAgICAgICAgVXNlckxvZ2luICAgICA9PiAnbWh1YmVyJywgICAgICAgIyBuZXcgdXNlciBsb2dpbgogICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0h1YmVyJywKICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdNYW5mcmVkJywKICAgICAgICBVc2VyUGFzc3dvcmQgID0+ICdzb21lLXBhc3MnLCAgICAjIG5vdCByZXF1aXJlZAogICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ2VtYWlsQGV4YW1wbGUuY29tJywKICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlckxvZ2luISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBVc2VyTG9naW4tcmVuYW1pbmcgYW5kIGlmIG5ldyBVc2VyTG9naW4gYWxyZWFkeSBleGlzdHMuLi4KICAgIGlmICggJFBhcmFte0lEfSAmJiAoIGxjICRQYXJhbXtVc2VyTG9naW59IG5lIGxjICRQYXJhbXtJRH0gKSApIHsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CiAgICAgICAgaWYgKCVVc2VyKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCAnQ3VzdG9tZXIgdXNlciAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRQYXJhbXtVc2VyTG9naW59ICksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17SUR9IHx8ICRQYXJhbXtVc2VyTG9naW59ICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggdXNlciAnJFBhcmFte1VzZXJMb2dpbn0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBjaGFuZ2UgdGhlIFVzZXJHcm91cElELgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgIyBTZXQgdGhlIFVzZXJHcm91cElEIHRvIHRoZSBjdXJyZW50IFVzZXJHcm91cElELgogICAgICAgIGlmICggJFVzZXJ7VXNlckdyb3VwSUR9ICkgewogICAgICAgICAgICAkUGFyYW17VXNlckdyb3VwSUR9ID0gJFVzZXJ7VXNlckdyb3VwSUR9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVXNlckdyb3VwSURTeW5jID0gJFNlbGYtPnskVXNlcntTb3VyY2V9fS0+e0N1c3RvbWVyVXNlck1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwogICAgaWYgKCAkUGFyYW17VXNlckdyb3VwSUR9ICkgewogICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIG1hdGNoZWQuCiAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gKSB7CiAgICAgICAgICAgIG15ICRHcm91cE5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRQYXJhbXtVc2VyR3JvdXBJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17VXNlckdyb3VwSUR9ID0gJEdyb3VwTmFtZTsKICAgICAgICB9CgogICAgICAgICMgUmVwbGFjZSB0aGUgbG9jYWwgZ3JvdXAgd2l0aCB0aGUgYXNzb2NpYXRlZCByZW1vdGUgZ3JvdXAuCiAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gZXEgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRSZW1vdGVHcm91cDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPkN1c3RvbWVyVXNlclVwZGF0ZSglUGFyYW0pOwogICAgcmV0dXJuIGlmICEkUmVzdWx0OwoKICAgICMgdHJpZ2dlciBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ3VzdG9tZXJVc2VyVXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17SUR9IHx8ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBOZXdEYXRhICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgT2xkRGF0YSAgID0+IFwlVXNlciwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1oZWFkMiBTZXRQYXNzd29yZCgpCgp0byBzZXQgY3VzdG9tZXIgdXNlcnMgcGFzc3dvcmRzCgogICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UGFzc3dvcmQoCiAgICAgICAgVXNlckxvZ2luID0+ICdzb21lLWxvZ2luJywKICAgICAgICBQVyAgICAgICAgPT4gJ3NvbWUtbmV3LXBhc3N3b3JkJwogICAgKTsKCj1jdXQKCnN1YiBTZXRQYXNzd29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1VzZXIgVXNlckxvZ2luIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggdXNlciAnJFBhcmFte1VzZXJMb2dpbn0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5TZXRQYXNzd29yZCglUGFyYW0pOwp9Cgo9aGVhZDIgR2VuZXJhdGVSYW5kb21QYXNzd29yZCgpCgpnZW5lcmF0ZSBhIHJhbmRvbSBwYXNzd29yZAoKICAgIG15ICRQYXNzd29yZCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdlbmVyYXRlUmFuZG9tUGFzc3dvcmQoKTsKCiAgICBvcgoKICAgIG15ICRQYXNzd29yZCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdlbmVyYXRlUmFuZG9tUGFzc3dvcmQoCiAgICAgICAgU2l6ZSA9PiAxNiwKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhdGVSYW5kb21QYXNzd29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0N1c3RvbWVyVXNlcn0tPkdlbmVyYXRlUmFuZG9tUGFzc3dvcmQoJVBhcmFtKTsKfQoKPWhlYWQyIFNldFByZWZlcmVuY2VzKCkKCnNldCBjdXN0b21lciB1c2VyIHByZWZlcmVuY2VzCgogICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgS2V5ICAgID0+ICdVc2VyQ29tbWVudCcsCiAgICAgICAgVmFsdWUgID0+ICdzb21lIGNvbW1lbnQnLAogICAgICAgIFVzZXJJRCA9PiAnc29tZS1sb2dpbicsCiAgICApOwoKPWN1dAoKc3ViIFNldFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgRG9uJ3QgYWxsb3cgb3ZlcndyaXRpbmcgb2YgbmF0aXZlIHVzZXIgZGF0YS4KICAgIG15ICVCbGFja2xpc3RlZCA9ICgKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJMb2dpbiAgICAgID0+IDEsCiAgICAgICAgVXNlclBhc3N3b3JkICAgPT4gMSwKICAgICAgICBVc2VyRmlyc3RuYW1lICA9PiAxLAogICAgICAgIFVzZXJMYXN0bmFtZSAgID0+IDEsCiAgICAgICAgVXNlckZ1bGxuYW1lICAgPT4gMSwKICAgICAgICBVc2VyU3RyZWV0ICAgICA9PiAxLAogICAgICAgIFVzZXJDaXR5ICAgICAgID0+IDEsCiAgICAgICAgVXNlclppcCAgICAgICAgPT4gMSwKICAgICAgICBVc2VyQ291bnRyeSAgICA9PiAxLAogICAgICAgIFVzZXJDb21tZW50ICAgID0+IDEsCiAgICAgICAgVXNlckN1c3RvbWVySUQgPT4gMSwKICAgICAgICBVc2VyVGl0bGUgICAgICA9PiAxLAogICAgICAgIFVzZXJFbWFpbCAgICAgID0+IDEsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gMSwKICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAxLAogICAgICAgIENyZWF0ZVRpbWUgICAgID0+IDEsCiAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gMSwKICAgICAgICBVc2VyUGhvbmUgICAgICA9PiAxLAogICAgICAgIFVzZXJNb2JpbGUgICAgID0+IDEsCiAgICAgICAgVXNlckZheCAgICAgICAgPT4gMSwKICAgICAgICBVc2VyTWFpbFN0cmluZyA9PiAxLAogICAgICAgIFZhbGlkSUQgICAgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAwIGlmICRCbGFja2xpc3RlZHsgJFBhcmFte0tleX0gfTsKCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VySUR9ICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggdXNlciAnJFBhcmFte1VzZXJJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIG5ldyBhcGkgKDIuNC44IGFuZCBoaWdoZXIpCiAgICBpZiAoICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+Y2FuKCdTZXRQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybiAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPlNldFByZWZlcmVuY2VzKCVQYXJhbSk7CiAgICB9CgogICAgIyBjYWxsIG9sZCBhcGkKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKPWhlYWQyIEdldFByZWZlcmVuY2VzKCkKCmdldCBjdXN0b21lciB1c2VyIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICdzb21lLWxvZ2luJywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0UHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlcklEfSApOwogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIHVzZXIgJyRQYXJhbXtVc2VySUR9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FsbCBuZXcgYXBpICgyLjQuOCBhbmQgaGlnaGVyKQogICAgaWYgKCAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPmNhbignR2V0UHJlZmVyZW5jZXMnKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5HZXRQcmVmZXJlbmNlcyglUGFyYW0pOwogICAgfQoKICAgICMgY2FsbCBvbGQgYXBpCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCj1oZWFkMiBTZWFyY2hQcmVmZXJlbmNlcygpCgpzZWFyY2ggaW4gdXNlciBwcmVmZXJlbmNlcwoKICAgIG15ICVVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPlNlYXJjaFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgID0+ICdVc2VyU29tZUtleScsCiAgICAgICAgVmFsdWUgPT4gJ1NvbWVWYWx1ZScsICAgIyBvcHRpb25hbCwgbGltaXQgdG8gYSBjZXJ0YWluIHZhbHVlL3BhdHRlcm4KICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoUHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIGdldCBjdXN0b21lciBzZWFyY2ggcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgIyBjYWxsIG5ldyBhcGkgKDIuNC44IGFuZCBoaWdoZXIpCiAgICAgICAgbXkgJVN1YkRhdGE7CiAgICAgICAgaWYgKCAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Y2FuKCdTZWFyY2hQcmVmZXJlbmNlcycpICkgewogICAgICAgICAgICAlU3ViRGF0YSA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5TZWFyY2hQcmVmZXJlbmNlcyglUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjYWxsIG9sZCBhcGkKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVN1YkRhdGEgPSAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2VhcmNoUHJlZmVyZW5jZXMoJVBhcmFtKTsKICAgICAgICB9CiAgICAgICAgJURhdGEgPSAoICVTdWJEYXRhLCAlRGF0YSApOwogICAgfQoKICAgIHJldHVybiAlRGF0YTsKfQoKPWhlYWQyIFRva2VuR2VuZXJhdGUoKQoKZ2VuZXJhdGUgYSByYW5kb20gdG9rZW4KCiAgICBteSAkVG9rZW4gPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5Ub2tlbkdlbmVyYXRlKAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFRva2VuR2VuZXJhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFRva2VuID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoID0+IDE0LAogICAgKTsKCiAgICAjIHNhdmUgdG9rZW4gaW4gcHJlZmVyZW5jZXMKICAgICRTZWxmLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICAgPT4gJ1VzZXJUb2tlbicsCiAgICAgICAgVmFsdWUgID0+ICRUb2tlbiwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkVG9rZW47Cn0KCj1oZWFkMiBUb2tlbkNoZWNrKCkKCmNoZWNrIHBhc3N3b3JkIHRva2VuCgogICAgbXkgJFZhbGlkID0gJEN1c3RvbWVyVXNlck9iamVjdD5Ub2tlbkNoZWNrKAogICAgICAgIFRva2VuICA9PiAkVG9rZW4sCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVG9rZW5DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VG9rZW59IHx8ICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVG9rZW4gYW5kIFVzZXJJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgcHJlZmVyZW5jZXMgdG9rZW4KICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgcmVxdWVzdGVkIHZzLiBzdG9yZWQgdG9rZW4KICAgIHJldHVybiBpZiAhJFByZWZlcmVuY2Vze1VzZXJUb2tlbn07CiAgICByZXR1cm4gaWYgJFByZWZlcmVuY2Vze1VzZXJUb2tlbn0gbmUgJFBhcmFte1Rva2VufTsKCiAgICAjIHJlc2V0IHBhc3N3b3JkIHRva2VuCiAgICAkU2VsZi0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgS2V5ICAgID0+ICdVc2VyVG9rZW4nLAogICAgICAgIFZhbHVlICA9PiAnJywKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhcigpCgpjbGVhciBjYWNoZSBvZiBjdXN0b21lciB1c2VyIGRhdGEKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJDYWNoZUNsZWFyKAogICAgICAgIFVzZXJMb2dpbiA9PiAnbWh1YmVyJywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwogICAgICAgICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5fQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhcigKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckFkZCgpCgp0byBhZGQgYSBjdXN0b21lciB1c2VyIHRvIGEgY3VzdG9tZXIKCiAgICBteSAkU3VjY2VzcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyQWRkKAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+IDEyMywKICAgICAgICBDdXN0b21lcklEICAgICA9PiAxMjMsCiAgICAgICAgQWN0aXZlICAgICAgICAgPT4gMSwgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEN1c3RvbWVyVXNlcklEIEN1c3RvbWVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBhZmZlY3RlZCBjYWNoZXMKICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0OjonOwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSAuICdDdXN0b21lclVzZXJJRDo6JyAuICRQYXJhbXtDdXN0b21lclVzZXJJRH0sCiAgICApOwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSAuICdDdXN0b21lcklEOjonIC4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgKTsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHJlbGF0aW9uCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjdXN0b21lcl91c2VyX2N1c3RvbWVyCiAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgIEFORCBjdXN0b21lcl9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVyVXNlcklEfSwgXCRQYXJhbXtDdXN0b21lcklEfSBdLAogICAgKTsKCiAgICAjIHJldHVybiBpZiByZWxhdGlvbiBpcyBub3QgYWN0aXZlCiAgICByZXR1cm4gMSBpZiAhJFBhcmFte0FjdGl2ZX07CgogICAgIyBpbnNlcnQgbmV3IHJlbGF0aW9uCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgSU5TRVJUIElOVE8gY3VzdG9tZXJfdXNlcl9jdXN0b21lciAodXNlcl9pZCwgY3VzdG9tZXJfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksCiAgICAgICAgICAgIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpCiAgICAgICAgICAgIFZBTFVFUyAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3VzdG9tZXJVc2VySUR9LCBcJFBhcmFte0N1c3RvbWVySUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3QoKQoKZ2V0IHJlbGF0ZWQgY3VzdG9tZXIgSURzIG9mIGEgY3VzdG9tZXIgdXNlcgoKICAgIG15IEBDdXN0b21lcklEcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKICAgIEBDdXN0b21lcklEcyA9ICgKICAgICAgICAnMTIzJywKICAgICAgICAnNDU2JywKICAgICk7CgpnZXQgcmVsYXRlZCBjdXN0b21lciB1c2VycyBvZiBhIGN1c3RvbWVyIElECgogICAgbXkgQEN1c3RvbWVyVXNlcnMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3QoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKICAgIEBDdXN0b21lclVzZXJzID0gKAogICAgICAgICcxMjMnLAogICAgICAgICc0NTYnLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAhJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnR290IG5vIEN1c3RvbWVyVXNlcklEIG9yIEN1c3RvbWVySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdDo6JzsKCiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcHJlc2VudCAoaW4gY2FjaGUpCiAgICAgICAgJENhY2hlS2V5IC49ICdDdXN0b21lclVzZXJJRDo6JyAuICRQYXJhbXtDdXN0b21lclVzZXJJRH07CiAgICAgICAgbXkgJENhY2hlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JENhY2hlfSBpZiAkQ2FjaGU7CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGlkcwogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4KICAgICAgICAgICAgICAgICdTRUxFQ1QgY3VzdG9tZXJfaWQKICAgICAgICAgICAgICAgIEZST00gY3VzdG9tZXJfdXNlcl9jdXN0b21lcgogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgIE9SREVSIEJZIGN1c3RvbWVyX2lkJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3VzdG9tZXJVc2VySUR9LCBdLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15IEBDdXN0b21lcklEczsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJJRHMsICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFxAQ3VzdG9tZXJJRHMsCgogICAgICAgICk7CgogICAgICAgIHJldHVybiBAQ3VzdG9tZXJJRHM7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGlzIHJlc3VsdCBpcyBwcmVzZW50IChpbiBjYWNoZSkKICAgICAgICAkQ2FjaGVLZXkgLj0gJ0N1c3RvbWVySUQ6OicgLiAkUGFyYW17Q3VzdG9tZXJJRH07CiAgICAgICAgbXkgJENhY2hlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JENhY2hlfSBpZiAkQ2FjaGU7CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIHVzZXJzCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PgogICAgICAgICAgICAgICAgJ1NFTEVDVCB1c2VyX2lkCiAgICAgICAgICAgICAgICBGUk9NIGN1c3RvbWVyX3VzZXJfY3VzdG9tZXIgV0hFUkUKICAgICAgICAgICAgICAgIGN1c3RvbWVyX2lkID0gPwogICAgICAgICAgICAgICAgT1JERVIgQlkgdXNlcl9pZCcsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVySUR9LCBdLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15IEBDdXN0b21lclVzZXJJRHM7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVyVXNlcklEcywgJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBDdXN0b21lclVzZXJJRHMsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIEBDdXN0b21lclVzZXJJRHM7CiAgICB9Cn0KCj1oZWFkMiBEZWxldGVPbmVQcmVmZXJlbmNlKCkKCmdldCBjdXN0b21lciB1c2VyIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+RGVsZXRlT25lUHJlZmVyZW5jZSgKICAgICAgICBVc2VySUQgPT4gJ3NvbWUtbG9naW4nLAogICAgICAgIEtleSAgICA9PiAnUHJlZmVyZW5jZUtleScsCiAgICApOwoKPWN1dAoKc3ViIERlbGV0ZU9uZVByZWZlcmVuY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlcklEfSApOwogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIHVzZXIgJyRQYXJhbXtVc2VySUR9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FsbCBuZXcgYXBpICgyLjQuOCBhbmQgaGlnaGVyKQogICAgaWYgKCAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPmNhbignRGVsZXRlT25lUHJlZmVyZW5jZScpICkgewogICAgICAgIHJldHVybiAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPkRlbGV0ZU9uZVByZWZlcmVuY2UoJVBhcmFtKTsKICAgIH0KCiAgICAjIGNhbGwgb2xkIGFwaQogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5EZWxldGVPbmVQcmVmZXJlbmNlKCVQYXJhbSk7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBleGVjdXRlIGFsbCB0cmFuc2FjdGlvbiBldmVudHMKICAgICRTZWxmLT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpOwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Kernel/Config/Files/XML/CustomerMultitenancy.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJNdWx0aXRlbmFuY3kiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyB0aGUgbXVsdGl0ZW5hbmN5IGZ1bmN0aW9uIGZvciBjdXN0b21lciBhbmQgY3VzdG9tZXIgdXNlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlBlcm1pc3Npb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TcGVjaWZpZXMgdGhlIGdyb3VwIHRoYXQgY2FuIHNldCBtdWx0aXRlbmFuY3kgZm9yIGN1c3RvbWVyLiBNdWx0aXRlbmFuY3kgZG9lcyBub3QgYXBwbHkgdG8gbWVtYmVycyBvZiB0aGlzIGdyb3VwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6UGVybWlzc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPmFkbWluPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Language/de_CustomerMultitenancy.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0N1c3RvbWVyTXVsdGl0ZW5hbmN5OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIG11bHRpdGVuYW5jeSBmdW5jdGlvbiBmb3IgY3VzdG9tZXIgYW5kIGN1c3RvbWVyIHVzZXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3BlY2lmaWVzIHRoZSBncm91cCB0aGF0IGNhbiBzZXQgbXVsdGl0ZW5hbmN5IGZvciBjdXN0b21lci4gTXVsdGl0ZW5hbmN5IGRvZXMgbm90IGFwcGx5IHRvIG1lbWJlcnMgb2YgdGhpcyBncm91cC4nfSA9CiAgICAgICAgJyc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="doc/en/CustomerMultitenancy.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="customer_user">
            <ColumnAdd Name="group_id" Required="false" Size="100" Type="VARCHAR"></ColumnAdd>
        </TableAlter>
        <TableAlter Type="post" Name="customer_company">
            <ColumnAdd Name="group_id" Required="false" Size="100" Type="VARCHAR"></ColumnAdd>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="customer_user">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
        <TableAlter Type="pre" Name="customer_company">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>