<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerTemplates</Name>
    <Version>11.1.2</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-26 12:45:03" Version="11.1.2">Update to OTOBO 11.1.1.</ChangeLog>
    <ChangeLog Date="2026-06-26 16:00:28" Version="11.1.1">Initial release for OTOBO 11.1.</ChangeLog>
    <Description Lang="en">Provides the Customer interface with the standard templates feature.</Description>
    <Framework>11.1.x</Framework>
    <BuildCommitID>c058425aba5c8245bd7ba942c1f70d93cacf16fa</BuildCommitID>
    <BuildDate>2026-10-26 12:45:07</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Kernel/Config/Files/XML/CustomerTemplate.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KCiAgICA8U2V0dGluZyBOYW1lPSJTdGFuZGFyZFRlbXBsYXRlOjpDdXN0b21lclR5cGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGxpc3Qgb2YgY3VzdG9tZXIgdHlwZXMgZm9yIHRlbXBsYXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlRpY2tldDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lckFuc3dlciIgVHJhbnNsYXRhYmxlPSIxIj5DdXN0b21lciBBbnN3ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbWVyQ3JlYXRlIiBUcmFuc2xhdGFibGU9IjEiPkN1c3RvbWVyIENyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSMjIzAwMy1TdGFuZGFyZFRlbXBsYXRlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuRmllbGRFeHBsYW5hdGlvblJvdy5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkN1c3RvbWVyLlRpY2tldEFjdGlvbi5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6Q3VzdG9tZXJUaWNrZXRab29tIyMjMDAzLVN0YW5kYXJkVGVtcGxhdGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pblNlcnZpY2VUZW1wbGF0ZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5UaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBhZG1pbiBhcmVhIG9mIE9UT0JPLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlRlbXBsYXRlcyDihpQgU2VydmljZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5BZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWRtaW5TZXJ2aWNlVGVtcGxhdGVzIyMjMDAyLVRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkFkbWluLlNlcnZpY2VUZW1wbGF0ZXMuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FkbWluU2VydmljZVRlbXBsYXRlcyMjIzAwMi1UaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbk1vZHVsZSMjI0FkbWluU2VydmljZVRlbXBsYXRlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BZG1pbiBhcmVhIG5hdmlnYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6QWRtaW5PdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyOjpNb2R1bGVBZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZXMg4oaUIFNlcnZpY2VzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5MaW5rIHRlbXBsYXRlcyB0byBzZXJ2aWNlcy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25CaWciPmZhLWZpbGUtdGV4dC1vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uU21hbGwiPmZhLWZvbGRlcjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lclRlbXBsYXRlOjpSZWZlcmVuY2VBdHRyaWJ1dGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgc3RhbmRhcmQgdGVtcGxhdGVzIGRlcGVuZHMgb24gdGhlIHF1ZXVlIG9yIG9uIHRoZSBzZXJ2aWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6VGlja2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlF1ZXVlIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUXVldWUiIFRyYW5zbGF0YWJsZT0iMSI+UXVldWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlNlcnZpY2UiIFRyYW5zbGF0YWJsZT0iMSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lclRlbXBsYXRlOjpBdXRvc2VsZWN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgYSBzdGFuZGFyZCB0ZW1wbGF0ZSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBzZWxlY3RlZCB3aGVuIGl0IGlzIHRoZSBvbmx5IG9uZSBhdmFpbGFibGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpUaWNrZXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Modules/AdminServiceTemplates.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5TZXJ2aWNlVGVtcGxhdGVzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBpZiAoICEkUGFyYW17QWNjZXNzUnd9ICYmICRQYXJhbXtBY2Nlc3NSb30gKSB7CiAgICAgICAgJFNlbGYtPntMaWdodEFkbWlufSA9IDE7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRTZXJ2aWNlT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIDwtPiBzZXJ2aWNlcyAxOm4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICBteSAkSUQgICAgICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVEYXRhID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVHZXQoIElEID0+ICRJRCApOwoKICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXNzaWduZWQgc2VydmljZXMKICAgICAgICBteSAlTWVtYmVyID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRJRCwKICAgICAgICApOwoKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICRTdGFuZGFyZFRlbXBsYXRlRGF0YXtUZW1wbGF0ZVR5cGV9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKCiAgICAgICAgICAgICMgRmlsdGVyIG91dCBzZXJ2aWNlcyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgICAgIG15ICVSd1NlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPkdldEFsbFNlcnZpY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlRGF0YSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VydmljZURhdGF7JFNlcnZpY2VJRH0gaWYgISRSd1NlcnZpY2VzeyRTZXJ2aWNlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIHRoZSBwZXJtaXNzaW9uLgogICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQgKTsKICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERlZmF1bHQgICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgIHVuZGVmICVTdGFuZGFyZFRlbXBsYXRlRGF0YTsKICAgICAgICAgICAgICAgIHVuZGVmICVNZW1iZXI7CiAgICAgICAgICAgICAgICAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9DaGFuZ2UoCiAgICAgICAgICAgIFNlbGVjdGVkID0+IFwlTWVtYmVyLAogICAgICAgICAgICBEYXRhICAgICA9PiBcJVNlcnZpY2VEYXRhLAogICAgICAgICAgICBJRCAgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZURhdGF7SUR9LAogICAgICAgICAgICBOYW1lICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgLiAnIC0gJyAuICRTdGFuZGFyZFRlbXBsYXRlRGF0YXtOYW1lfSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ1RlbXBsYXRlJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZXMgPC0+IFNlcnZpY2UgbjoxCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZScgKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgIG15ICRJRCAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZXMKICAgICAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+X0N1c3RvbWVyU3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIFR5cGUgID0+IFsgIkN1c3RvbWVyQ3JlYXRlIiwgIkN1c3RvbWVyQW5zd2VyIiBdLAogICAgICAgICk7CgogICAgICAgIGlmICglU3RhbmRhcmRUZW1wbGF0ZURhdGEpIHsKICAgICAgICAgICAgZm9yIG15ICRTdGFuZGFyZFRlbXBsYXRlSUQgKCBzb3J0IGtleXMgJVN0YW5kYXJkVGVtcGxhdGVEYXRhICkgewogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlECiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRTdGFuZGFyZFRlbXBsYXRlSUR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRGF0YXtUZW1wbGF0ZVR5cGV9ICkKICAgICAgICAgICAgICAgICAgICAuICcgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkRGF0YXtOYW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXNzaWduZWQgdGVtcGxhdGVzCiAgICAgICAgbXkgJU1lbWJlciA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkSUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewoKICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IHRlbXBsYXRlcyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICgga2V5cyAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgKSB7CiAgICAgICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlEICk7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgICA9PiAncncnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRTdGFuZGFyZFRlbXBsYXRlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIHRoZSBwZXJtaXNzaW9uLgogICAgICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSd1NlcnZpY2VzeyRJRH0gKSB7CiAgICAgICAgICAgICAgICB1bmRlZiAlU2VydmljZURhdGE7CiAgICAgICAgICAgICAgICB1bmRlZiAlTWVtYmVyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0NoYW5nZSgKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gXCVNZW1iZXIsCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlU3RhbmRhcmRUZW1wbGF0ZURhdGEsCiAgICAgICAgICAgIElEICAgICAgID0+ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZURhdGF7TmFtZX0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgdGVtcGxhdGVzIHRvIHNlcnZpY2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2VTZXJ2aWNlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgbmV3IHRlbXBsYXRlcwogICAgICAgIG15IEBUZW1wbGF0ZXNTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc1NlbGVjdGVkJyApOwogICAgICAgIG15IEBUZW1wbGF0ZXNBbGwgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc0FsbCcgKTsKCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgIyBjcmVhdGUgaGFzaCB3aXRoIHNlbGVjdGVkIHRlbXBsYXRlcwogICAgICAgIG15ICVUZW1wbGF0ZXNTZWxlY3RlZCA9IG1hcCB7ICRfID0+IDEgfSBAVGVtcGxhdGVzU2VsZWN0ZWQ7CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICgga2V5cyAlVGVtcGxhdGVzU2VsZWN0ZWQgKSB7CiAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkU3RhbmRhcmRUZW1wbGF0ZUlEOyAgICAjIENhbiBjb250YWluIGVtcHR5IHN0cmluZy4KCiAgICAgICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlEICk7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgICA9PiAncncnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYWxsIHVzZWQgdGVtcGxhdGVzCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUlEIChAVGVtcGxhdGVzQWxsKSB7CiAgICAgICAgICAgIG15ICRBY3RpdmUgPSAkVGVtcGxhdGVzU2VsZWN0ZWR7JFRlbXBsYXRlSUR9ID8gMSA6IDA7CgogICAgICAgICAgICAjIHNldCBjdXN0b21lciB1c2VyIHNlcnZpY2UgbWVtYmVyCiAgICAgICAgICAgICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckFkZCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgID0+ICRBY3RpdmUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHRlbXBsYXRlcyAtIHNlcnZpY2UgcmVsYXRpb24ganVzdCByZWRpcmVjdCB0byB0aGUgZWRpdCBzY3JlZW4KICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gdG8gcmVsYXRpb25zIG92ZXJ2aWV3CiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKQogICAgICAgICAgICAmJiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSBlcSAnMScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249U2VydmljZTtJRD0kU2VydmljZUlEIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIHNlcnZpY2VzIHRvIHRlbXBsYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlVGVtcGxhdGUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBuZXcgc2VydmljZXMKICAgICAgICBteSBAU2VydmljZXNTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc1NlbGVjdGVkJyApOwogICAgICAgIG15IEBTZXJ2aWNlc0FsbCAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0l0ZW1zQWxsJyApOwoKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgIyBjcmVhdGUgaGFzaCB3aXRoIHNlbGVjdGVkIHNlcnZpY2VzCiAgICAgICAgbXkgJVNlcnZpY2VzU2VsZWN0ZWQgPSBtYXAgeyAkXyA9PiAxIH0gQFNlcnZpY2VzU2VsZWN0ZWQ7CgogICAgICAgICMgYmFja2VuZCBjaGVjayB0byBwcmV2ZW50IHNhdmluZyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICgga2V5cyAlU2VydmljZXNTZWxlY3RlZCApIHsKICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRTZXJ2aWNlSUQ7ICAgICMgQ2FuIGNvbnRhaW4gZW1wdHkgc3RyaW5nLgogICAgICAgICAgICAgICAgaWYgKCAhJFJ3U2VydmljZXN7JFNlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGFsbCB1c2VkIHNlcnZpY2VzCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKEBTZXJ2aWNlc0FsbCkgewogICAgICAgICAgICBteSAkQWN0aXZlID0gJFNlcnZpY2VzU2VsZWN0ZWR7JFNlcnZpY2VJRH0gPyAxIDogMDsKCiAgICAgICAgICAgICMgc2V0IGN1c3RvbWVyIHVzZXIgc2VydmljZSBtZW1iZXIKICAgICAgICAgICAgJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICAgPT4gJEFjdGl2ZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZSB1c2VyIHdvdWxkIGxpa2UgdG8gY29udGludWUgZWRpdGluZyB0aGUgc2VydmljZSAtIHRlbXBsYXRlcyByZWxhdGlvbiBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICMgb3RoZXJ3aXNlIHJldHVybiB0byByZWxhdGlvbnMgb3ZlcnZpZXcKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApCiAgICAgICAgICAgICYmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApIGVxICcxJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZTtJRD0kVGVtcGxhdGVJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9PdmVydmlldygpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0NoYW5nZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgPSAleyAkUGFyYW17RGF0YX0gfTsKICAgIG15ICRUeXBlICAgPSAkUGFyYW17VHlwZX0gfHwgJ1RlbXBsYXRlJzsKICAgIG15ICROZVR5cGUgPSAkVHlwZSBlcSAnU2VydmljZScgPyAnVGVtcGxhdGUnIDogJ1NlcnZpY2UnOwoKICAgIG15ICVWaXNpYmxlVHlwZSA9ICgKICAgICAgICBUZW1wbGF0ZSA9PiAnVGVtcGxhdGUnLAogICAgICAgIFNlcnZpY2UgID0+ICdTZXJ2aWNlJywKICAgICk7CgogICAgbXkgJE15VHlwZSAgICAgICA9ICRWaXNpYmxlVHlwZXskVHlwZX07CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRCcmVhZGNydW1iVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NoYW5nZSBTZXJ2aWNlIFJlbGF0aW9ucyBmb3IgVGVtcGxhdGUnKTsKCiAgICBpZiAoICRWaXNpYmxlVHlwZXskVHlwZX0gZXEgJ1NlcnZpY2UnICkgewogICAgICAgICRCcmVhZGNydW1iVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NoYW5nZSBUZW1wbGF0ZSBSZWxhdGlvbnMgZm9yIFNlcnZpY2UnKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIEJyZWFkY3J1bWJUaXRsZSA9PiAkQnJlYWRjcnVtYlRpdGxlLAogICAgICAgIH0sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmlsdGVyJyApOwoKICAgICNmaXhlZCBsaW5rCiAgICBteSAkU2VydmljZVRhZzsKCiAgICAkU2VydmljZVRhZyA9ICRUeXBlIGVxICdTZXJ2aWNlJyA/ICdTZXJ2aWNlJyA6ICcnOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NoYW5nZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uSG9tZSAgICAgID0+ICdBZG1pbicgLiAkVHlwZSwKICAgICAgICAgICAgTmVUeXBlICAgICAgICAgID0+ICROZVR5cGUsCiAgICAgICAgICAgIFZpc2libGVUeXBlICAgICA9PiAkVmlzaWJsZVR5cGV7JFR5cGV9LAogICAgICAgICAgICBWaXNpYmxlTmVUeXBlICAgPT4gJFZpc2libGVUeXBleyROZVR5cGV9LAogICAgICAgICAgICBTZXJ2aWNlICAgICAgICAgPT4gJFNlcnZpY2VUYWcsCiAgICAgICAgICAgIEJyZWFkY3J1bWJUaXRsZSA9PiAkQnJlYWRjcnVtYlRpdGxlLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHNlcnZpY2UvdGVtcGxhdGUKICAgIGlmICggISVEYXRhICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZ0xpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbFNwYW4gPT4gMiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NoYW5nZUhlYWRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgTmVUeXBlICAgICAgICA9PiAkTmVUeXBlLAogICAgICAgICAgICBWaXNpYmxlVHlwZSAgID0+ICRWaXNpYmxlVHlwZXskVHlwZX0sCiAgICAgICAgICAgIFZpc2libGVOZVR5cGUgPT4gJFZpc2libGVUeXBleyROZVR5cGV9LAogICAgICAgIH0sCiAgICApOwoKICAgIGZvciBteSAkSUQgKCBzb3J0IHsgdWMoICREYXRheyRhfSApIGNtcCB1YyggJERhdGF7JGJ9ICkgfSBrZXlzICVEYXRhICkgewoKICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICBteSAkU2VsZWN0ZWQgPSAkUGFyYW17U2VsZWN0ZWR9LT57JElEfSA/ICcgY2hlY2tlZCAnIDogJyc7CgogICAgICAgICRTZXJ2aWNlVGFnID0gJFR5cGUgbmUgJ1NlcnZpY2UnID8gJ1NlcnZpY2UnIDogJyc7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57JElEfSwKICAgICAgICAgICAgICAgIE5lVHlwZSAgICAgICAgPT4gJE5lVHlwZSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICAgID0+ICRJRCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkICAgICAgPT4gJFNlbGVjdGVkLAogICAgICAgICAgICAgICAgVmlzaWJsZVR5cGUgICA9PiAkVmlzaWJsZVR5cGV7JFR5cGV9LAogICAgICAgICAgICAgICAgVmlzaWJsZU5lVHlwZSA9PiAkVmlzaWJsZVR5cGV7JE5lVHlwZX0sCiAgICAgICAgICAgICAgICBTZXJ2aWNlICAgICAgID0+ICRTZXJ2aWNlVGFnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VydmljZVRlbXBsYXRlcycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgVmlzaWJsZVR5cGUgID0+ICRNeVR5cGUsCiAgICApOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwoKICAgICMgbm8gYWN0aW9ucyBpbiBhY3Rpb24gbGlzdAogICAgIyAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayhOYW1lPT4nQWN0aW9uTGlzdCcpOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0ZpbHRlclRlbXBsYXRlJyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0ZpbHRlclNlcnZpY2UnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnICk7CgogICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpOwoKICAgICMgZ2V0IHN0ZCB0ZW1wbGF0ZSBsaXN0CiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+X0N1c3RvbWVyU3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiBbICJDdXN0b21lckNyZWF0ZSIsICJDdXN0b21lckFuc3dlciIgXSwKCiAgICApOwoKICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgaWYgKCVTdGFuZGFyZFRlbXBsYXRlRGF0YSkgewogICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICggc29ydCBrZXlzICVTdGFuZGFyZFRlbXBsYXRlRGF0YSApIHsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRTdGFuZGFyZFRlbXBsYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdGFuZGFyZFRlbXBsYXRlRGF0YXskU3RhbmRhcmRUZW1wbGF0ZUlEfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJERhdGF7VGVtcGxhdGVUeXBlfSApCiAgICAgICAgICAgICAgICAuICcgLSAnCiAgICAgICAgICAgICAgICAuICREYXRhe05hbWV9OwogICAgICAgIH0KICAgICAgICBJRDoKICAgICAgICBmb3IgbXkgJFN0YW5kYXJkVGVtcGxhdGVJRCAoCiAgICAgICAgICAgIHNvcnQgeyB1YyggJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRhfSApIGNtcCB1YyggJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRifSApIH0KICAgICAgICAgICAga2V5cyAlU3RhbmRhcmRUZW1wbGF0ZURhdGEKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICAgICAgbXkgJVNlcnZpY2VzICAgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KCBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJFN0YW5kYXJkVGVtcGxhdGVJRCApOwogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gWyBrZXlzICVTZXJ2aWNlcyBdLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICAgPT4gJ3J3JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIG5lICdydycgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlzdDFuJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZURhdGF7JFN0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vVGVtcGxhdGVzRm91bmRNc2cnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICBteSAlU2VydmljZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKCiAgICAgICAgIyBGaWx0ZXIgb3V0IHNlcnZpY2VzIHdpdGhvdXQgcGVybWlzc2lvbi4KICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlRGF0YSApIHsKICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXskU2VydmljZUlEfSBpZiAhJFJ3U2VydmljZXN7JFNlcnZpY2VJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgaWYgKCVTZXJ2aWNlRGF0YSkgewogICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCB7IHVjKCAkU2VydmljZURhdGF7JGF9ICkgY21wIHVjKCAkU2VydmljZURhdGF7JGJ9ICkgfSBrZXlzICVTZXJ2aWNlRGF0YSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpc3RuMScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VEYXRheyRTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VydmljZXNGb3VuZE1zZycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblNlcnZpY2VUZW1wbGF0ZXMnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIF9DdXN0b21lclN0YW5kYXJkVGVtcGxhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRlbXBsYXRlVHlwZXMgPSAiJyIgLiAoIGpvaW4gJywnLCBAeyAkUGFyYW17VHlwZX0gfSApIC4gIiciOwogICAgJFRlbXBsYXRlVHlwZXMgPX4gcy8sLycsJy9nOwoKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbGlkfSAmJiAkUGFyYW17VmFsaWR9IGVxICcwJyApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBuYW1lCiAgICAgICAgRlJPTSBzdGFuZGFyZF90ZW1wbGF0ZSc7CgogICAgaWYgKCRWYWxpZCkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB2YWxpZF9pZCBJTiAoJyAuIGpvaW4gJywgJywKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkgLiAnKSc7CiAgICB9CgogICAgbXkgQEJpbmQ7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1R5cGV9ICYmICRQYXJhbXtUeXBlfSBuZSAnJyApIHsKICAgICAgICBpZiAoJFZhbGlkKSB7CiAgICAgICAgICAgICRTUUwgLj0gJyBBTkQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNRTCAuPSAnIFdIRVJFJzsKICAgICAgICB9CiAgICAgICAgJFNRTCAuPSAiIHRlbXBsYXRlX3R5cGUgSU4gKCRUZW1wbGF0ZVR5cGVzKSI7CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/CustomerTicketMessage.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiZDYzOGNlZWEzZjE0ZjQwMzkzZmU0Y2M2YWVhNzA5MWViNTliODg5IC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRNZXNzYWdlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldE1lc3NhZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgIG15ICREZWZpbml0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6TWFzaycpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIE1hc2sgPT4gJFNlbGYtPntBY3Rpb259LAogICAgKSB8fCB7fTsKCiAgICAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57TWFza307CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gICA9IHt9OwoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIEkKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHsgJER5bmFtaWNGaWVsZExpc3QgLy8gW10gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CgogICAgICAgICMgcmVkdWNlIHRoZSBkeW5hbWljIGZpZWxkcyB0byBvbmx5IHRoZSBvbmVzIHRoYXQgYXJlIGRlc2lnbmVkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBpZiAoIGV4aXN0cyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSBkZWxldGUgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gLy8ge307CgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJFBhcmFtZXRlcnMtPiUqICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+eyRBdHRyaWJ1dGV9ID0gJFBhcmFtZXRlcnMtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCAkU2VsZi0+e01hc2tEZWZpbml0aW9ufS0+QCosIHsKICAgICAgICAgICAgICAgIERGICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgPyAxIDogMCwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIElJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc30tPiUqICkgewogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX0gPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyREeW5hbWljRmllbGROYW1lfSAvLyB7fTsKCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgIyBtZXRob2RzIHdoaWNoIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICRTZWxmLT57RmllbGRNZXRob2RzfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ0Rlc3QnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFRvcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRQcmlvcml0aWVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U2VydmljZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU0xBSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFNMQXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnVHlwZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRUeXBlcwogICAgICAgIH0sCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U3RhbmRhcmRUZW1wbGF0ZXMKICAgICAgICB9LAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgIF07CgogICAgIyBkZXBlbmRlbmNpZXMgb2Ygc3RhbmRhcmQgZmllbGRzIHdoaWNoIGFyZSBub3QgZGVmaW5lZCB2aWEgQUNMcwogICAgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9ID0gewogICAgICAgIFNlcnZpY2VJRCA9PiB7CiAgICAgICAgICAgIFNMQUlEID0+IDEsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEsCiAgICAgICAgfSwKICAgICAgICBEZXN0ID0+IHsKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEsCiAgICAgICAgfSwKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQojICAgIGZvciBteSAkS2V5IChxdyggU3ViamVjdCBCb2R5IFByaW9yaXR5SUQgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBEZXN0IEZyb21DaGF0SUQpKSB7CgogICAgZm9yIG15ICRLZXkgKHF3KCBTdWJqZWN0IEJvZHkgUHJpb3JpdHlJRCBUeXBlSUQgU2VydmljZUlEIFNMQUlEIERlc3QgRnJvbUNoYXRJRCBTdGFuZGFyZFRlbXBsYXRlSUQpKSB7CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZnJvbSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQmFja2VuZE9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoYXRFbmdpbmU6OkFjdGl2ZScpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDaGF0IGlzIG5vdCBhY3RpdmUuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGNoYXQgcGFydGljaXBhbnQKICAgICAgICBteSAlQ2hhdFBhcnRpY2lwYW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdFBhcnRpY2lwYW50Q2hlY2soCiAgICAgICAgICAgIENoYXRJRCAgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgQ2hhdHRlclR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgQ2hhdHRlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISVDaGF0UGFydGljaXBhbnQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24uJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgIyBHZXQgZGVmYXVsdCBRdWV1ZSBJRCBpZiBub25lIGlzIHNldAogICAgICAgIG15ICRRdWV1ZURlZmF1bHRJRDsKICAgICAgICBpZiAoICEkR2V0UGFyYW17RGVzdH0gKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnLT57J1F1ZXVlRGVmYXVsdCd9IHx8ICcnOwogICAgICAgICAgICBpZiAoJFF1ZXVlRGVmYXVsdCkgewogICAgICAgICAgICAgICAgJFF1ZXVlRGVmYXVsdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlRGVmYXVsdCApOwogICAgICAgICAgICAgICAgaWYgKCRRdWV1ZURlZmF1bHRJRCkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZXN0fSA9ICRRdWV1ZURlZmF1bHRJRCAuICd8fCcgLiAkUXVldWVEZWZhdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlRGVmYXVsdElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdhcm4gaWYgdGhlcmUgaXMgbm8gKHZhbGlkKSBkZWZhdWx0IHF1ZXVlIGFuZCB0aGUgY3VzdG9tZXIgY2FuJ3Qgc2VsZWN0IG9uZQogICAgICAgICAgICBlbHNpZiAoICEkQ29uZmlnLT57J1F1ZXVlJ30gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDaGVjayBTeXNDb25maWcgc2V0dGluZyBmb3IgJXM6OlF1ZXVlRGVmYXVsdC4nLCAkU2VsZi0+e0FjdGlvbn0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEdldFBhcmFte0Rlc3R9ICkgewogICAgICAgICAgICBteSAoICRRdWV1ZUlEUGFyYW0sICRRdWV1ZVBhcmFtICkgPSBzcGxpdCggL1x8XHwvLCAkR2V0UGFyYW17RGVzdH0gKTsKICAgICAgICAgICAgbXkgJFF1ZXVlSURMb29rdXAgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWVQYXJhbSApOwogICAgICAgICAgICBpZiAoICRRdWV1ZUlETG9va3VwICYmICRRdWV1ZUlETG9va3VwIGVxICRRdWV1ZUlEUGFyYW0gKSB7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbicpOwogICAgICAgICAgICAgICAgaWYgKCAleyAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiAvLyB7fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZXN0fSA9ICRRdWV1ZUlEUGFyYW0gLiAnfHwnIC4gJEN1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb24tPnskUXVldWVQYXJhbX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVJRExvb2t1cDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwcmUtZmlsbGluZyBjYWNoZSBmb3IgcmVmZXJlbmNlIGZpZWxkIC0gbmVjZXNzYXJ5IGZvciBBQ0wgY2FsY3VsYXRpb24gb2YgbGVucyBmaWVsZHMKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKCiAgICAgICAgICAgIG15ICRJc1JlZmVyZW5jZUZpZWxkID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc1JlZmVyZW5jZUZpZWxkJywKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRJc1JlZmVyZW5jZUZpZWxkOwoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPlNldEZvcm1EYXRhKAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgID0+ICdQb3NzaWJsZVZhbHVlc19EeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OkF1dG9zZWxlY3QnKSApIHsKICAgICAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIGdhdGhlciBmaWVsZHMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIGhpZGRlbiB3aGVuIGF1dG9zZWxlY3RlZAogICAgICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgICAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICAgICAgbXkgQEhpZGVBdXRvc2VsZWN0ZWQgPSBncmVwIHsgIXJlZiggJEF1dG9zZWxlY3QtPnskX30gKSAmJiAkQXV0b3NlbGVjdC0+eyRffSA9PSAyIH0ga2V5cyAleyRBdXRvc2VsZWN0fTsKICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIG1hcCB7ICJEeW5hbWljRmllbGRfIiAuICRfIH0KICAgICAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChASGlkZUF1dG9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAgICAgJEhpZGVBdXRvc2VsZWN0ZWRKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxASGlkZUF1dG9zZWxlY3RlZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Vzc2FyeSBmb3IgRGVzdCkKICAgICAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgICAgICBEZXN0ICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICAgID0+ICdUeXBlSUQnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRBQ0xQcmVzZWxlY3Rpb24gJiYgISRJbml0aWFsUnVuICkgewogICAgICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRGaWVsZElEIG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyRGaWVsZElEfSAmJiAkQ2hhbmdlZEVsZW1lbnRzeyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggc29ydCBrZXlzICVDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbi0+e1J1bGVzfXtUaWNrZXR9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEVsZW1lbnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEVsZW1lbnQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJENoZWNreyRGaWVsZElEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgICAgICAgICAgTUVUSE9EOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgTUVUSE9EIGlmICEkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH07CgogICAgICAgICAgICAgICAgICAgICMgdXNlICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSBmb3IgRGVzdD0+UXVldWVJRAogICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJEdldFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7U2VydmljZUlEfSB8fCB1bmRlZiwgICAgIyBuZWVkZWQgZm9yIFNMQUlECiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9IGVxICctJyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyIkUXVldWVJRHx8JFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyAkUXVldWVJRCB9In0gPSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gJiYgISRTdGRGaWVsZFZhbHVlc3tEZXN0fXsgJEdldFBhcmFte0Rlc3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICAgICAgICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJU5ld0NoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gJU5ld0NoYW5nZWRFbGVtZW50czsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCwKICAgICAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRMb29wUHJvdGVjdGlvbi0tIDwgMSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJhbiBpbnRvIHVucmVzb2x2YWJsZSBsb29wISIsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBpcyByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCByZWFzb25hYmxlPwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICAgICAgaWYgKCAlQ2hhbmdlZEVsZW1lbnRzIHx8ICRJbml0aWFsUnVuICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIyBzdG9yZSBuZXcgdmFsdWVzCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGR5bmFtaWMgZmllbGRzIGNoYW5nZWQsIGNoZWNrIHN0YW5kYXJkIGZpZWxkcyBhZ2FpbgogICAgICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMDsKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle0ZpZWxkc30gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkSW5pdGlhbFJ1biA9IDA7CiAgICAgICAgfQoKICAgICAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMgPSBtYXAgewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiBkZWZpbmVkICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRffQogICAgICAgICAgICAgICAgPyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskX317UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICA6IHVuZGVmCiAgICAgICAgfSAoIGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApOwoKICAgICAgICBteSAkQUNMUmVzdWx0U3RkID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnRm9ybVN0ZCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICctJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVZpc2liaWxpdHlTdGQ7CgogICAgICAgIGlmICgkQUNMUmVzdWx0U3RkKSB7CiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7JEZpZWxkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVmlzaWJpbGl0eVN0ZHtBcnRpY2xlfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgVG9TZWxlY3RlZCAgICAgICA9PiAkR2V0UGFyYW17RGVzdH0sCiAgICAgICAgICAgIEZyb21DaGF0SUQgICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9IHx8ICcnLAogICAgICAgICAgICBIaWRlQXV0b3NlbGVjdGVkID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIFZpc2liaWxpdHlTdGQgICAgPT4gXCVWaXNpYmlsaXR5U3RkLAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZU5ldycgKSB7CgogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdJbnRlcm5hbCcgKTsKCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkQ29uZmlnLT57TmV4dFNjcmVlbkFmdGVyTmV3VGlja2V0fTsKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgZ2V0IGRlc3RpbmF0aW9uIHF1ZXVlCiAgICAgICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkVG8gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgaWYgKCAhJFRvICkgewogICAgICAgICAgICAkTmV3UXVldWVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdRdWV1ZUlEJyApIHx8ICcnOwogICAgICAgICAgICAkVG8gICAgICAgICA9ICdTeXN0ZW0nOwogICAgICAgIH0KCiAgICAgICAgIyBmYWxsYmFjaywgaWYgbm8gZGVzdGluYXRpb24gaXMgZ2l2ZW4KICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgbXkgJFF1ZXVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1F1ZXVlJyApCiAgICAgICAgICAgICAgICB8fCAkQ29uZmlnLT57J1F1ZXVlRGVmYXVsdCd9CiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgaWYgKCRRdWV1ZSkgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWUgKTsKICAgICAgICAgICAgICAgICROZXdRdWV1ZUlEID0gJFF1ZXVlSUQ7CiAgICAgICAgICAgICAgICAkVG8gICAgICAgICA9ICRRdWV1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte05ld1F1ZXVlSUR9ID0gJE5ld1F1ZXVlSUQ7CgogICAgICAgICMgdXNlIGRlZmF1bHQgaWYgdGlja2V0IHR5cGUgaXMgbm90IGF2YWlsYWJsZSBpbiBzY3JlZW4gYnV0IGFjdGl2YXRlZCBvbiBzeXN0ZW0KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgISRDb25maWctPnsnVGlja2V0VHlwZSd9ICkgewogICAgICAgICAgICBteSAlVHlwZUxpc3QgPSByZXZlcnNlICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17VHlwZUlEfSA9ICRUeXBlTGlzdHsgJENvbmZpZy0+eydUaWNrZXRUeXBlRGVmYXVsdCd9IH07CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2hlY2sgU3lzQ29uZmlnIHNldHRpbmcgZm9yICVzOjpUaWNrZXRUeXBlRGVmYXVsdC4nLCAkU2VsZi0+e0FjdGlvbn0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIHZhbGlkYXRpb24gb2YgaGlkZGVuIGZpZWxkcwogICAgICAgIG15ICVWaXNpYmlsaXR5OwoKICAgICAgICAjIHRyYW5zZm9ybSBkeW5hbWljIGZpZWxkIGRhdGEgaW50byBERk5hbWUgPT4gREZOYW1lIHBhaXIKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQWNsID0gbWFwIHsgJF8gPT4gJF8gfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CgogICAgICAgICMgY2FsbCB0aWNrZXQgQUNMcyBmb3IgRHluYW1pY0ZpZWxkcyB0byBjaGVjayBmaWVsZCB2aXNpYmlsaXR5CiAgICAgICAgbXkgJEFDTFJlc3VsdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdGb3JtJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICApOwogICAgICAgIGlmICgkQUNMUmVzdWx0KSB7CiAgICAgICAgICAgICVWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gMCB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJUFjbERhdGEgKSB7CiAgICAgICAgICAgICAgICAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkIH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDEgfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHRzIGlmIGVycm9uZW91cwogICAgICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgaW52aXNpYmxlIGZpZWxkcwogICAgICAgICAgICBpZiAoICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICAgICAgICAgIyBNYW5kYXRvcnkgaXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgYnkgJFNlbGYtPm5ldwogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgbm8gcmljaCB0ZXh0IGlzIHVzZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgICAgICAgICBNYXhDaGFyYWN0ZXJzID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyksCiAgICAgICAgICAgICAgICBQbGFpblRleHQgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgaXMgRnJvbUNoYXRJRCwgZ2V0IHJlbGF0ZWQgbWVzc2FnZXMgYW5kIHByZXBlbmQgdGhlbSB0byBib2R5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgICAgIG15IEBDaGF0TWVzc2FnZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcXVldWUKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgJEVycm9ye1F1ZXVlSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBwcmV2ZW50IHRhbXBlciB3aXRoIChRdWV1ZS9EZXN0KSwgc2VlIGJ1ZyM5NDA4CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgb3JpZ2luYWwgbGlzdCBvZiBxdWV1ZXMgdG8gZGlzcGxheQogICAgICAgICAgICBteSAkVG9zID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IHNlbGVjdGVkIFF1ZXVlSUQgZXhpc3RzIGluIHRoZSBsaXN0IG9mIHF1ZXVlcyxcCiAgICAgICAgICAgICMgb3RoZXJ3aXNlIHJpc2UgYW4gZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFRvcy0+eyROZXdRdWV1ZUlEfSApIHsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIHF1ZXVlIGlzIGFjY2Vzc2libGUgYnkgY3VzdG9tZXIgdXNlciAoc2VlIGJ1ZyMxNDg4NikuCiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlJyktPntRdWV1ZX0gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7UXVldWVEaXNhYmxlZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9ye1F1ZXVlSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCB0aGUgY29ycmVjdCBxdWV1ZSBuYW1lIGluICRUbyBpZiBpdCB3YXMgYWx0ZXJlZAogICAgICAgICAgICBpZiAoICRUbyBuZSAkVG9zLT57JE5ld1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFRvID0gJFRvcy0+eyROZXdRdWV1ZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEFDTFJlc3VsdFN0ZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0Zvcm1TdGQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIG15ICVWaXNpYmlsaXR5U3RkOwoKICAgICAgICBpZiAoJEFDTFJlc3VsdFN0ZCkgewogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQWNsRGF0YSApIHsKICAgICAgICAgICAgICAgICRWaXNpYmlsaXR5U3RkeyRGaWVsZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7QXJ0aWNsZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVmlzaWJpbGl0eVN0ZHtBcnRpY2xlfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7U3ViamVjdEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntCb2R5SW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntTZXJ2aWNlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUlESW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNsYQogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NMQUlESW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdHlwZQogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAhJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICRFcnJvcntUeXBlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigpOwoKICAgICAgICAgICAgaWYgKCAkRXJyb3J7UXVldWVEaXNhYmxlZH0gKSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgiWW91IGRvbid0IGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9ucyBmb3IgdGlja2V0IGNyZWF0aW9uIGluIGRlZmF1bHQgcXVldWUuIiksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBUb1NlbGVjdGVkICAgICAgID0+ICREZXN0LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIFZpc2liaWxpdHkgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eVN0ZCAgICA9PiBcJVZpc2liaWxpdHlTdGQsCiAgICAgICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBERkVycm9ycyAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjayggVHlwZSA9PiAnQ3VzdG9tZXInICk7CgogICAgICAgICMgaWYgY3VzdG9tZXIgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHByaW9yaXR5LCBzZXQgaXQgdG8gZGVmYXVsdAogICAgICAgIGlmICggISRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHl9ICAgPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRTZWxmLT57VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGFydGljbGUgaGFzIHRvIGJlIGNyZWF0ZWQgY2xlYW4gdXAgYW5kIHJldHVybgogICAgICAgIGlmICggISRWaXNpYmlsaXR5U3Rke0FydGljbGV9ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGZvcm0gZGF0YQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBoaWRkZW4gZmllbGRzIGNhY2hlCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdIaWRkZW5GaWVsZHMnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRQbGFpbkJvZHkgPSAkR2V0UGFyYW17Qm9keX07CgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRQbGFpbkJvZHkgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dDJBc2NpaSggU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgYXJ0aWNsZQogICAgICAgIG15ICRGdWxsTmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICk7CiAgICAgICAgbXkgJEZyb20gICAgICA9ICJcIiRGdWxsTmFtZVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICRDb25maWctPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRUbywKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICRDb25maWctPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCiAgICAgICAgICAgID8gJ2F1dG8gcmVwbHknCiAgICAgICAgICAgIDogJycsCiAgICAgICAgICAgIE9yaWdIZWFkZXIgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRQbGFpbkJvZHksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFF1ZXVlID0+ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmlzaWJpbGl0eXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUGVybWlzc2lvbnMgY2hlY2sgd2VyZSBkb25lIGVhcmxpZXIKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICAgICAgbXkgJENoYXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0Jyk7CiAgICAgICAgICAgIG15IEBDaGF0TWVzc2FnZUxpc3QgPSAkQ2hhdE9iamVjdC0+Q2hhdE1lc3NhZ2VMaXN0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJENoYXRBcnRpY2xlSUQ7CgogICAgICAgICAgICBpZiAoQENoYXRNZXNzYWdlTGlzdCkgewogICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICA9PiAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSwKICAgICAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRBcnRpY2xlQ2hhdEJhY2tlbmQgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdDaGF0JyApOwoKICAgICAgICAgICAgICAgICRDaGF0QXJ0aWNsZUlEID0gJEFydGljbGVDaGF0QmFja2VuZC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlTGlzdCAgICAgID0+IFxAQ2hhdE1lc3NhZ2VMaXN0LAogICAgICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQ2hhdEFydGljbGVJRCkgewogICAgICAgICAgICAgICAgJENoYXRPYmplY3QtPkNoYXREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdHRlZCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgICAgIH0KCiAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKCiAgICAgICAgICAgICMgc2tpcCwgZGVsZXRlZCBub3QgdXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBkZWxldGUgaGlkZGVuIGZpZWxkcyBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJ0hpZGRlbkZpZWxkcycsCiAgICAgICAgICAgIEtleSAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57J1F1ZXVlJ30gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZXN0fSA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXNlIFF1ZXVlRGVmYXVsdCBhcyBmYWxsYmFjayBpZiBRdWV1ZSBzZWxlY3Rpb24gaXMgZGlzYWJsZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFF1ZXVlRGVmYXVsdCA9ICRDb25maWctPnsnUXVldWVEZWZhdWx0J30gfHwgJyc7CiAgICAgICAgICAgIGlmICgkUXVldWVEZWZhdWx0KSB7CiAgICAgICAgICAgICAgICBteSAkUXVldWVEZWZhdWx0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWVEZWZhdWx0ICk7CiAgICAgICAgICAgICAgICBpZiAoJFF1ZXVlRGVmYXVsdElEKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Rlc3R9ID0gJFF1ZXVlRGVmYXVsdElEIC4gJ3x8JyAuICRRdWV1ZURlZmF1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVEZWZhdWx0SUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OkF1dG9zZWxlY3QnKSApIHsKICAgICAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIHRyYWNrIGNoYW5naW5nIHN0YW5kYXJkIGZpZWxkcwogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb252ZXJnZW5jZSA9ICgKICAgICAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50cyA9ICRFbGVtZW50Q2hhbmdlZCA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIGlmICggJENoYW5nZWRFbGVtZW50c3tTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVyVXNlcklEfSA9IDE7CiAgICAgICAgICAgICRDaGFuZ2VkRWxlbWVudHN7Q3VzdG9tZXJJRH0gICAgID0gMTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lcklEfSAgICAgPSAkU2VsZi0+e1VzZXJDdXN0b21lcklEfTsKICAgICAgICB9CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzICAgICAgID0gJEVsZW1lbnRDaGFuZ2VkICYmICRFbGVtZW50Q2hhbmdlZCAhfiAvXkR5bmFtaWNGaWVsZF8vID8gJUNoYW5nZWRFbGVtZW50cyA6ICgpOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICAgICAgU2V0cyAgICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSApIHsKCiAgICAgICAgICAgICAgICBteSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwoKICAgICAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgRGVzdCAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgICA9PiAnVHlwZUlEJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAjIG5lZWRlZCBmb3IgU0xBSUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17IiRRdWV1ZUlEfHwkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17ICRRdWV1ZUlEIH0ifSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyAkR2V0UGFyYW17RGVzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1F1ZXVlSUR9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57RGVzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH17ICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGVtcHR5IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICVOZXdDaGFuZ2VkRWxlbWVudHMsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIFRPRE86IGlzIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IHJlYXNvbmFibGU/CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7U2V0c30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYID0gJEJhY2tlbmRPYmplY3QtPkJ1aWxkQUpBWFJldHVybigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlncyA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgRHluRmllbGRTdGF0ZXMgICAgICA9PiBcJUR5bkZpZWxkU3RhdGVzLAogICAgICAgICk7CgogICAgICAgIG15ICRBQ0xSZXN1bHRTdGQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdGb3JtU3RkJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBBcnRpY2xlID0+ICdBcnRpY2xlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAlVmlzaWJpbGl0eVN0ZCA9ICgKICAgICAgICAgICAgQXJ0aWNsZSA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgkQUNMUmVzdWx0U3RkKSB7CiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7JEZpZWxkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVmlzaWJpbGl0eVN0ZHtBcnRpY2xlfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3RyaWN0aW9uc19WaXNpYmlsaXR5X1N0ZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVWaXNpYmlsaXR5U3RkLAogICAgICAgIH07CgogICAgICAgICMgYnVpbGQgQUpBWCByZXR1cm4gZm9yIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSBAU3RkRmllbGRBSkFYOwogICAgICAgIG15ICVBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBEZXN0ID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcmlvcml0eUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU0xBSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFR5cGVJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICk7CiAgICAgICAgZGVsZXRlICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVTdGRGaWVsZFZhbHVlcyApIHsKICAgICAgICAgICAgcHVzaCBAU3RkRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVzeyRGaWVsZH0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXskRmllbGR9LAogICAgICAgICAgICAgICAgJXsgJEF0dHJpYnV0ZXN7JEZpZWxkfSB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwogICAgICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2hlbWVudHMgaWYgbmVlZGVkLgoKICAgICAgICBpZiAoICRDaGFuZ2VkU3RkRmllbGRze1N0YW5kYXJkVGVtcGxhdGVJRH0gKSB7CgogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKCiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0ZW1wbGF0ZSB0ZXh0LCByZXBsYWNlIHNtYXJ0IHRhZ3MgKGxpbWl0ZWQgYXMgdGlja2V0IGlzIG5vdCBjcmVhdGVkKQogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnRzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAVGlja2V0QXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9ICRMYXlvdXRPYmplY3QtPkh1bWFuUmVhZGFibGVEYXRhU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBAVGVtcGxhdGVBSkFYID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlQ3JlYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1RpY2tldEF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQFRpY2tldEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBAU3RkRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFN1YmFjdGlvbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVNlcnZpY2UgaWYgISRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9IHx8ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciApIHsKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgc2VydmljZXMgaWYgdGhleSB3ZXJlIG5vdCBkZXRlcm1pbmVkIGluIGFuIEFKQVggY2FsbAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17U2VydmljZXN9ICkgewogICAgICAgICRQYXJhbXtTZXJ2aWNlc30gPSAkU2VsZi0+X0dldFNlcnZpY2VzKCVQYXJhbSk7CiAgICB9CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zID0gKCAnJywgJy0nICk7CiAgICBteSAkTW9kdWxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDdXN0b21lclBhbmVsOjpOZXdUaWNrZXRRdWV1ZVNlbGVjdGlvbk1vZHVsZScpCiAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpDdXN0b21lck5ld1RpY2tldDo6UXVldWVTZWxlY3Rpb25HZW5lcmljJzsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzcyA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLAogICAgICAgICAgICBEZWJ1ZyAgICAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICk7CgogICAgICAgICMgbG9nIGxvYWRlZCBtb2R1bGUKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICYmICRTZWxmLT57RGVidWd9ID4gMSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1vZHVsZTogJE1vZHVsZSBsb2FkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJU5ld1RvcyA9ICgKICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgRW52ICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICAgICAgQUNMUGFyYW1zID0+IFwlUGFyYW0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgKCAnJywgPT4gJy0nICkKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+RmF0YWxEaWUoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBsb2FkICRNb2R1bGUhIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBcJU5ld1RvczsKfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQpzdWIgX0dldFN0YW5kYXJkVGVtcGxhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkUXVldWVJRCAgICAgICA9ICRQYXJhbXtRdWV1ZUlEfSAgIHx8ICcnOwogICAgbXkgJFNlcnZpY2VJRCAgICAgPSAkUGFyYW17U2VydmljZUlEfSB8fCAnJzsKICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzOwogICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJUZW1wbGF0ZTo6UmVmZXJlbmNlQXR0cmlidXRlJykgfHwgJ1F1ZXVlJzsKICAgIGlmICggJFJlZmVyZW5jZUF0dHJpYnV0ZSBlcSAnUXVldWUnICkgewoKICAgICAgICAjIGNoZWNrIG5lZWRlZAogICAgICAgIHJldHVybiB7fSBpZiAhJFF1ZXVlSUQ7CgogICAgICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFJlZmVyZW5jZUF0dHJpYnV0ZSBlcSAnU2VydmljZScgKSB7CgogICAgICAgICMgY2hlY2sgbmVlZGVkCiAgICAgICAgcmV0dXJuIHt9IGlmICEkU2VydmljZUlEOwoKICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgICAgICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZldGNoIHN0YW5kYXJkIHRlbXBsYXRlcyBsaXN0ISBJbnZhbGlkIHJlZmVyZW5jZSBhdHRyaWJ1dGUgJyRSZWZlcmVuY2VBdHRyaWJ1dGUnIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4ge30gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3VzdG9tZXJDcmVhdGV9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tDdXN0b21lckNyZWF0ZX07Cn0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgpzdWIgX01hc2tOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKICAgICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSA9ICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSB8fCAnJzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZyAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgaWYgKCAkQ29uZmlnLT57UXVldWV9ICkgewoKICAgICAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgICAgICBteSAlTmV3VG9zID0gKCAnJywgJy0nICk7CiAgICAgICAgbXkgJE1vZHVsZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbDo6TmV3VGlja2V0UXVldWVTZWxlY3Rpb25Nb2R1bGUnKQogICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkN1c3RvbWVyTmV3VGlja2V0OjpRdWV1ZVNlbGVjdGlvbkdlbmVyaWMnOwogICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgU3lzdGVtQWRkcmVzcyA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLAogICAgICAgICAgICAgICAgRGVidWcgICAgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9nIGxvYWRlZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSAmJiAkU2VsZi0+e0RlYnVnfSA+IDEgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJNb2R1bGU6ICRNb2R1bGUgbG9hZGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICVOZXdUb3MgPSAoCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgRW52ICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICAgICAgICAgIEFDTFBhcmFtcyA9PiBcJVBhcmFtCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKCAnJywgPT4gJy0nICkKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHRvIHN0cmluZwogICAgICAgIGlmICglTmV3VG9zKSB7CiAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlTmV3VG9zICkgewogICAgICAgICAgICAgICAgJE5ld1Rvc3siJF98fCROZXdUb3N7JF99In0gPSAkTmV3VG9zeyRffTsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTmV3VG9zeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RvU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU5ld1RvcywKICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgID0+IDAsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICJWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgRm9ybVVwZGF0ZSAiIC4gJFBhcmFte0Vycm9yc30tPntRdWV1ZUludmFsaWR9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtUb1NlbGVjdGVkfSB8fCAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgIFRyZWVWaWV3ICAgPT4gJFRyZWVWaWV3LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWV1ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJbnZhbGlkID0+ICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgIH0KCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgbXkgJVByaW9yaXRpZXMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBwcmlvcml0eSBzdHJpbmcKICAgICAgICBteSAlUHJpb3JpdHlTZWxlY3RlZDsKICAgICAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFByaW9yaXR5U2VsZWN0ZWR7U2VsZWN0ZWRJRH0gPSAkUGFyYW17UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHlTZWxlY3RlZHtTZWxlY3RlZFZhbHVlfSA9ICRDb25maWctPntQcmlvcml0eURlZmF1bHR9IHx8ICczIG5vcm1hbCc7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgID0+IFwlUHJpb3JpdGllcywKICAgICAgICAgICAgTmFtZSAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUnLAogICAgICAgICAgICAlUHJpb3JpdHlTZWxlY3RlZCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57J1RpY2tldFR5cGUnfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJENvbmZpZy0+eydUaWNrZXRUeXBlRGVmYXVsdCd9ICYmICEkUGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgbXkgJVJldmVyc2VUeXBlID0gcmV2ZXJzZSAlVHlwZTsKICAgICAgICAgICAgJFBhcmFte1R5cGVJRH0gPSAkUmV2ZXJzZVR5cGV7ICRDb25maWctPnsnVGlja2V0VHlwZURlZmF1bHQnfSB9OwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICJWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgRm9ybVVwZGF0ZSAiIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9IHx8ICcnICksCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZUlESW52YWxpZCA9PiAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9LAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJENvbmZpZy0+e1NlcnZpY2V9ICkgewoKICAgICAgICAjIHVzZSBlaXRoZXIgdGhlIHJlYWwgUXVldWVJRCwgb3IgdGhlIFRpY2tldElELCBvciAxIGFzIFF1ZXVlSUQKICAgICAgICBteSAkVG1wUXVldWVJRCA9ICRQYXJhbXtRdWV1ZUlEfSA/ICRQYXJhbXtRdWV1ZUlEfSA6CiAgICAgICAgICAgICRQYXJhbXtUaWNrZXRJRH0gPyB1bmRlZiA6IDE7CgogICAgICAgIG15ICVTZXJ2aWNlcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRUbXBRdWV1ZUlELAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTZXJ2aWNlcywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUgJwogICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtFcnJvcnN9LT57U2VydmljZUlESW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5kYXRvcnkgPT4gJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICggISRTZXJ2aWNlc3sgJFBhcmFte1NlcnZpY2VJRH0gfHwgJycgfSApIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICB9CiAgICAgICAgbXkgJVNMQTsKICAgICAgICBpZiAoICRDb25maWctPntTTEF9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgJVNMQSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAxLCAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlSUQgaWYgbm9uZSBpcyBwcm92aWRlZCBpbiAlUGFyYW0KICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlICcKICAgICAgICAgICAgICAgICAgICAuICggJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTTEFJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU0xBTWFuZGF0b3J5ID0+ICRDb25maWctPntTTEFNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFBhcmFte0Vycm9yc30tPnskX307CiAgICAgICAgfQogICAgfQoKICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RHluYW1pY0ZpZWxkOjpNYXNrJyktPkVkaXRTZWN0aW9uUmVuZGVyKAogICAgICAgIENvbnRlbnQgICAgICAgICAgICAgID0+ICRTZWxmLT57TWFza0RlZmluaXRpb259LAogICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgICA9PiAkUGFyYW17RHluYW1pY0ZpZWxkfSwKICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUGFyYW17REZQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgRXJyb3JzICAgICAgICAgICAgICAgPT4gJFBhcmFte0RGRXJyb3JzfSwKICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgICA9PiAkUGFyYW17VmlzaWJpbGl0eX0sCiAgICAgICAgQ3VzdG9tZXJJbnRlcmZhY2UgICAgPT4gMSwKICAgICAgICBPYmplY3QgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRTZWxmLT57VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGR9LT4lKiwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkUGFyYW17VmlzaWJpbGl0eVN0ZH17QXJ0aWNsZX0gKSB7CiAgICAgICAgJFBhcmFte1N1YmplY3RWYWxpZGF0ZX0gICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkX0lmVmlzaWJsZSc7CiAgICAgICAgJFBhcmFte0JvZHlWYWxpZGF0ZX0gICAgICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkX0lmVmlzaWJsZSc7CiAgICAgICAgJFBhcmFte1N1YmplY3RIaWRkZW5DbGFzc30gICAgID0gJyBvb29BQ0xIaWRkZW4nOwogICAgICAgICRQYXJhbXtCb2R5SGlkZGVuQ2xhc3N9ICAgICAgICA9ICcgb29vQUNMSGlkZGVuJzsKICAgICAgICAkUGFyYW17QXR0YWNobWVudHNIaWRkZW5DbGFzc30gPSAnIG9vb0FDTEhpZGRlbic7CiAgICB9CgogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1N1YmplY3RWYWxpZGF0ZX0gPSAnVmFsaWRhdGVfUmVxdWlyZWRfSWZWaXNpYmxlJzsKICAgICAgICAkUGFyYW17Qm9keVZhbGlkYXRlfSAgICA9ICdWYWxpZGF0ZV9SZXF1aXJlZF9JZlZpc2libGUnOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgIyBjaGVjayBpZiBleGlzdHMgY3VzdG9tZXIgY3JlYXRlIHRlbXBsYXRlcyByZWdhcmRsZXNzIHRoZSBxdWV1ZSBhbmQgdGhlIHNlcnZpY2UKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyktPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgVHlwZSAgPT4gJ0N1c3RvbWVyQ3JlYXRlJywKICAgICk7CgogICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkgewoKICAgICAgICAjIGZldGNoIGFsbCBhdmFpbGFibGUgc3RkLiB0ZW1wbGF0ZXMKICAgICAgICBteSAkQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXMgfHwge30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IHx8ICcnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgY3VzdG9tZXIgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyU2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFBlcm1pc3Npb25zIGhhdmUgYmVlbiBjaGVja2VkIGJlZm9yZSBpbiBSdW4oKQogICAgaWYgKCAkUGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgbXkgQENoYXRNZXNzYWdlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgQ2hhdElEID0+ICRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1lc3NhZ2UgKEBDaGF0TWVzc2FnZXMpIHsKICAgICAgICAgICAgJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYXRBcnRpY2xlUHJldmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhdE1lc3NhZ2VzID0+IFxAQ2hhdE1lc3NhZ2VzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17SGlkZUF1dG9zZWxlY3RlZH0gKSB7CgogICAgICAgICMgYWRkIEF1dG9zZWxlY3QgSlMKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU09uRG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgQ29kZSA9PiAiQ29yZS5Gb3JtLkluaXRIaWRlQXV0b3NlbGVjdGVkKHsgRmllbGRJRHM6ICRQYXJhbXtIaWRlQXV0b3NlbGVjdGVkfSB9KTsiLAogICAgICAgICk7CiAgICB9CgogICAgIyBleHBsYW5hdG9yeSBtZXNzYWdlIGFib3V0IGFzdGVyaXNrCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXN0ZXJpc2tFeHBsYW5hdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJUaWNrZXRNZXNzYWdlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/CustomerTicketZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhNjMyZWE3MzM1MjM0NTMxMjNmZDA1MGQ0YzY3YTRjODdkZDc0MzllIC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRab29tLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFpvb207Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6Ok1ENSBxdyhtZDVfaGV4KTsKdXNlIExpc3Q6OlV0aWwgIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgbXkgJERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpNYXNrJyktPkRlZmluaXRpb25HZXQoCiAgICAgICAgTWFzayA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICApIHx8IHt9OwoKICAgICRTZWxmLT57TWFza0RlZmluaXRpb259ICAgICAgID0gJERlZmluaXRpb24tPntNYXNrfTsKICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9ID0ge307CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSQogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkKTsKCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaWduZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgIGlmICggZXhpc3RzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9ICkgewogICAgICAgICAgICBteSAkUGFyYW1ldGVycyA9IGRlbGV0ZSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSAvLyB7fTsKCiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoICRTZWxmLT57TWFza0RlZmluaXRpb259LT5AKiwgewogICAgICAgICAgICAgICAgREYgICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkQ29uZmlnLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyID8gMSA6IDAsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoICRDb25maWctPntGb2xsb3dVcER5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSUkKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfS0+JSogKSB7CiAgICAgICAgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH17JER5bmFtaWNGaWVsZE5hbWV9ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICk7CgogICAgICAgIG15ICRQYXJhbWV0ZXJzID0gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXskRHluYW1pY0ZpZWxkTmFtZX0gLy8ge307CgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgIyBtZXRob2RzIHdoaWNoIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICRTZWxmLT57RmllbGRNZXRob2RzfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFByaW9yaXRpZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldE5leHRTdGF0ZXMKICAgICAgICB9LAojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFN0YW5kYXJkVGVtcGxhdGVzCiAgICAgICAgfSwKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICBdOwoKICAgICMgZGVwZW5kZW5jaWVzIG9mIHN0YW5kYXJkIGZpZWxkcyB3aGljaCBhcmUgbm90IGRlZmluZWQgdmlhIEFDTHMgLSBoZXJlIGZvciBjb25zaXN0ZW5jeQogICAgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9ID0ge307CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgJFRpY2tldE51bWJlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXROdW1iZXInICk7CgogICAgIyB0aWNrZXQgaWQgbG9va3VwCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSAmJiAkVGlja2V0TnVtYmVyICkgewogICAgICAgICRTZWxmLT57VGlja2V0SUR9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0TnVtYmVyJyApLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGN1c3RvbWVycyBzaG91bGQgbm90IGdldCB0byBrbm93IHRoYXQgd2hldGhlciBhbiB0aWNrZXQgZXhpc3RzIG9yIG5vdAogICAgIyBpZiBhIHRpY2tldCBkb2VzIG5vdCBleGlzdCwgc2hvdyBhICJubyBwZXJtaXNzaW9uIiBzY3JlZW4KICAgIGlmICggJFRpY2tldE51bWJlciAmJiAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZCBUaWNrZXRJRCEnKSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgcHJvY2VzcyBtYW5hZ2VtZW50CiAgICBteSAlQWN0aXZpdHlFcnJvckhUTUw7CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmVBY3Rpdml0eURpYWxvZycgKSB7CiAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByb2Nlc3MiKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGQgbm90IGxvYWQgcHJvY2VzcyBtb2R1bGUuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkUHJvY2Vzc01vZHVsZSA9ICgnS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByb2Nlc3MnKS0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdDdXN0b21lclRpY2tldFByb2Nlc3MnLAogICAgICAgICAgICBTdWJhY3Rpb24gPT4gJFNlbGYtPntTdWJhY3Rpb259LAogICAgICAgICAgICBNb2R1bGVSZWcgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eydDdXN0b21lclRpY2tldFByb2Nlc3MnfSwKICAgICAgICApOwoKICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJyApOwogICAgICAgICRBY3Rpdml0eUVycm9ySFRNTHskQWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0gPSAkUHJvY2Vzc01vZHVsZS0+UnVuKCVQYXJhbSk7CgogICAgICAgICMgcmV0dXJuIGRpcmVjdGx5IGluIGNhc2Ugb2YgYW4gZXJyb3IgZGlhbG9nCiAgICAgICAgcmV0dXJuICRBY3Rpdml0eUVycm9ySFRNTHskQWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0gaWYgJEFjdGl2aXR5RXJyb3JIVE1MeyRBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSA9fiAvXjwhRE9DVFlQRSBodG1sPi87CiAgICB9CgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICYmICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJyApICkgewogICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoIktlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJUaWNrZXRQcm9jZXNzIikgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgbG9hZCBwcm9jZXNzIG1vZHVsZS4iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRQcm9jZXNzTW9kdWxlID0gKCdLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0UHJvY2VzcycpLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0N1c3RvbWVyVGlja2V0UHJvY2VzcycsCiAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAkU2VsZi0+e1N1YmFjdGlvbn0sCiAgICAgICAgICAgIE1vZHVsZVJlZyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57J0N1c3RvbWVyVGlja2V0UHJvY2Vzcyd9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkUHJvY2Vzc01vZHVsZS0+UnVuKCVQYXJhbSk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyBnZXQgYWxsIHJlZ2lzdGVyZWQgQWN0aW9ucwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgIG15ICVBY3Rpb25zID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKSB9OwoKICAgICAgICAjIG9ubHkgdXNlIHRob3NlIEFjdGlvbnMgdGhhdCBzdGFydHMgd2l0aCBDdXN0b21lcgogICAgICAgICVQb3NzaWJsZUFjdGlvbnMgPSBtYXAgeyArKyRDb3VudGVyID0+ICRfIH0KICAgICAgICAgICAgZ3JlcCB7IHN1YnN0ciggJF8sIDAsIGxlbmd0aCAnQ3VzdG9tZXInICkgZXEgJ0N1c3RvbWVyJyB9CiAgICAgICAgICAgIHNvcnQga2V5cyAlQWN0aW9uczsKICAgIH0KICAgICRQb3NzaWJsZUFjdGlvbnN7ICsrJENvdW50ZXIgfSA9ICdDdXN0b21lclRpY2tldFpvb21SZXBseSc7CgogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CiAgICB9CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICMgZ2V0IGFsbCBhcnRpY2xlcyBvZiB0aGlzIHRpY2tldCwgdGhhdCBhcmUgdmlzaWJsZSBmb3IgdGhlIGN1c3RvbWVyCiAgICBteSBAQXJ0aWNsZUxpc3QgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICA9PiAwLAogICAgKTsKCiAgICBteSBAQXJ0aWNsZUJveDsKICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdDsKCiAgICBBUlRJQ0xFTUVUQURBVEE6CiAgICBmb3IgbXkgJEFydGljbGVNZXRhRGF0YSAoQEFydGljbGVMaXN0KSB7CgogICAgICAgIG5leHQgQVJUSUNMRU1FVEFEQVRBIGlmICEkQXJ0aWNsZU1ldGFEYXRhOwogICAgICAgIG5leHQgQVJUSUNMRU1FVEFEQVRBIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkQXJ0aWNsZU1ldGFEYXRhKTsKCiAgICAgICAgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRBcnRpY2xlTWV0YURhdGF9ICk7CgogICAgICAgIG15ICVBcnRpY2xlRGF0YSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVNZXRhRGF0YS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFJlYWxOYW1lcyA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGNoYW5uZWwgc3BlY2lmaWMgZmllbGRzCiAgICAgICAgbXkgJUFydGljbGVGaWVsZHMgPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlRmllbGRzKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZU1ldGFEYXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICAkQXJ0aWNsZURhdGF7U3ViamVjdH0gICAgICA9ICRBcnRpY2xlRmllbGRze1N1YmplY3R9OwogICAgICAgICRBcnRpY2xlRGF0YXtGcm9tUmVhbG5hbWV9ID0gJEFydGljbGVGaWVsZHN7U2VuZGVyfTsKCiAgICAgICAgIyBHZXQgYXR0YWNobWVudCBpbmRleC4KICAgICAgICBteSAlQXRtSW5kZXggPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVBdHRhY2htZW50SW5kZXgoCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgPT4gJEFydGljbGVNZXRhRGF0YS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIEV4Y2x1ZGVQbGFpblRleHQgPT4gMSwKICAgICAgICAgICAgRXhjbHVkZUhUTUxCb2R5ICA9PiAxLAogICAgICAgICAgICBFeGNsdWRlSW5saW5lICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVBdG1JbmRleCApICkgewogICAgICAgICAgICAkQXJ0aWNsZURhdGF7QXR0YWNobWVudH0gPSBcJUF0bUluZGV4OwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQXJ0aWNsZUJveCwgXCVBcnRpY2xlRGF0YTsKICAgIH0KCiAgICBteSAlR2V0UGFyYW07CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKIyAgICBmb3IgbXkgJEtleSAocXcoU3ViamVjdCBCb2R5IFN0YXRlSUQgUHJpb3JpdHlJRCBGcm9tQ2hhdElEIEZyb21DaGF0KSkgewogICAgZm9yIG15ICRLZXkgKHF3KFN1YmplY3QgQm9keSBTdGF0ZUlEIFByaW9yaXR5SUQgRnJvbUNoYXRJRCBGcm9tQ2hhdCBTdGFuZGFyZFRlbXBsYXRlSUQpKSB7CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZnJvbSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoYXRFbmdpbmU6OkFjdGl2ZScpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDaGF0IGlzIG5vdCBhY3RpdmUuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGNoYXQgcGFydGljaXBhbnQKICAgICAgICBteSAlQ2hhdFBhcnRpY2lwYW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdFBhcnRpY2lwYW50Q2hlY2soCiAgICAgICAgICAgIENoYXRJRCAgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgQ2hhdHRlclR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgQ2hhdHRlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISVDaGF0UGFydGljaXBhbnQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24uJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGQgfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICMgZ2V0IFRpY2tldElECiAgICAgICAgaWYgKCAhJEdldFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldElEfSA9CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldElEfSB8fAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRTZWxmLT57VXNlcklEfTsKCiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApOwoKICAgICAgICAjIHVzZSB0aGUgRmllbGRJRHMsIHdoaWNoIGFyZSBmb3VuZCBpbiBBZ2VudFRpY2tldFBob25lL0VtYWlsLCBhbmQgQ3VzdG9tZXJUaWNrZXRNZXNzYWdlCiAgICAgICAgbXkgJVVuaWZvcm1pdHkgPSAoCiAgICAgICAgICAgIFN0YXRlSUQgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICApOwogICAgICAgIGlmICggJEVsZW1lbnRDaGFuZ2VkICYmICRVbmlmb3JtaXR5eyRFbGVtZW50Q2hhbmdlZH0gKSB7CiAgICAgICAgICAgICRFbGVtZW50Q2hhbmdlZCA9ICRVbmlmb3JtaXR5eyRFbGVtZW50Q2hhbmdlZH07CiAgICAgICAgfQogICAgICAgIGZvciBteSAkRGl2ZXJzSUQgKCBrZXlzICVVbmlmb3JtaXR5ICkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRVbmlmb3JtaXR5eyREaXZlcnNJRH0gfSA9ICRHZXRQYXJhbXskRGl2ZXJzSUR9OwogICAgICAgIH0KCiAgICAgICAgbXkgJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RmllbGRSZXN0cmljdGlvbnMnKTsKICAgICAgICBteSAkQXV0b3NlbGVjdCAgICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OkF1dG9zZWxlY3QnKSApIHsKICAgICAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIHRyYWNrIGNoYW5naW5nIHN0YW5kYXJkIGZpZWxkcwogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb252ZXJnZW5jZSA9ICgKICAgICAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50cyA9ICRFbGVtZW50Q2hhbmdlZCA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIGlmICggJENoYW5nZWRFbGVtZW50c3tTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVyVXNlcklEfSA9IDE7CiAgICAgICAgICAgICRDaGFuZ2VkRWxlbWVudHN7Q3VzdG9tZXJJRH0gICAgID0gMTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lcklEfSAgICAgPSAkU2VsZi0+e1VzZXJDdXN0b21lcklEfTsKICAgICAgICB9CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzICAgICAgID0gJEVsZW1lbnRDaGFuZ2VkICYmICRFbGVtZW50Q2hhbmdlZCAhfiAvXkR5bmFtaWNGaWVsZF8vID8gJUNoYW5nZWRFbGVtZW50cyA6ICgpOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICAgICAgU2V0cyAgICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSApIHsKCiAgICAgICAgICAgICAgICBteSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwoKICAgICAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlSUQgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eUlEICA9PiAnUHJpb3JpdHlJRCcsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkQUNMUHJlc2VsZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZElEICggc29ydCBrZXlzICVDaGVjayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEZpZWxkSUQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57JEZpZWxkSUR9ICYmICRDaGFuZ2VkRWxlbWVudHN7JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBzb3J0IGtleXMgJUNoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uLT57UnVsZXN9e1RpY2tldH17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57SW50ZXJuYWxEZXBlbmRhbmN5fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRWxlbWVudCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHVuYWZmZWN0ZWQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQ2hlY2t7JEZpZWxkSUR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZvciBlYWNoIHN0YW5kYXJkIGZpZWxkIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkLCBydW4gdGhlIGRlZmluZWQgbWV0aG9kCiAgICAgICAgICAgICAgICBNRVRIT0Q6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggQHsgJFNlbGYtPntGaWVsZE1ldGhvZHN9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBNRVRIT0QgaWYgISRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfTsKCiAgICAgICAgICAgICAgICAgICAgIyB1c2UgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IGZvciBEZXN0PT5RdWV1ZUlECiAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVzeyAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfSA9ICRGaWVsZC0+e01ldGhvZH0tPigKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9IGVxICctJyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyIkUXVldWVJRHx8JFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyAkUXVldWVJRCB9In0gPSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gJiYgISRTdGRGaWVsZFZhbHVlc3tEZXN0fXsgJEdldFBhcmFte0Rlc3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICAgICAgICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJU5ld0NoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gJU5ld0NoYW5nZWRFbGVtZW50czsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCwKICAgICAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRMb29wUHJvdGVjdGlvbi0tIDwgMSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJhbiBpbnRvIHVucmVzb2x2YWJsZSBsb29wISIsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBpcyByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCByZWFzb25hYmxlPwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIENoYW5nZWRFbGVtZW50cyAgICAgICAgICAgPT4gXCVDaGFuZ2VkRWxlbWVudHMsICAgICAgICAgICAgICAgIyBvcHRpb25hbCB0byByZWR1Y2UgQUNMIGV2YWx1YXRpb24KICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4geyVHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICAgICAgQXV0b3NlbGVjdCAgICAgICAgICAgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gICAgICAgICAgID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gICAgICAgICAgICA9PiBcJExvb3BQcm90ZWN0aW9uLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNvbWJpbmUgRmllbGRTdGF0ZXMKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1NldHN9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tTZXRzfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tTZXRzfSB9LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgZHluYW1pYyBmaWVsZHMgY2hhbmdlZCwgY2hlY2sgc3RhbmRhcmQgZmllbGRzIGFnYWluCiAgICAgICAgICAgIGlmICggJUN1ckZpZWxkU3RhdGVzICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSApICkgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAwOwogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9IG1hcCB7ICRfID0+IDEgfSBrZXlzICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7RmllbGRzfSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBEeW5hbWljIEZpZWxkcyBQb3NzaWJsZSBWYWx1ZXMgdmlhIEFKQVgKICAgICAgICBteSBARHluYW1pY0ZpZWxkQUpBWCA9ICRCYWNrZW5kT2JqZWN0LT5CdWlsZEFKQVhSZXR1cm4oCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZ3MgPT4gJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgRHluRmllbGRTdGF0ZXMgICAgICA9PiBcJUR5bkZpZWxkU3RhdGVzLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgQUpBWCByZXR1cm4gZm9yIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSBAU3RkRmllbGRBSkFYOwogICAgICAgIG15ICVBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBQcmlvcml0eUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICk7CiAgICAgICAgbXkgJURpdmVyc2l0eSA9IHJldmVyc2UgJVVuaWZvcm1pdHk7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlU3RkRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgICAgIHB1c2ggQFN0ZEZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRGl2ZXJzaXR5eyRGaWVsZH0gfHwgJEZpZWxkLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7JEZpZWxkfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFteyRGaWVsZH0sCiAgICAgICAgICAgICAgICAleyAkQXR0cmlidXRlc3skRmllbGR9IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgIG15IEBUZW1wbGF0ZUFKQVg7CiAgICAgICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAgICAgIyB1cGRhdGUgdGlja2V0IGJvZHkgYW5kIGF0dGFjaGVtZW50cyBpZiBuZWVkZWQuCgogICAgICAgIGlmICggJENoYW5nZWRTdGRGaWVsZHN7U3RhbmRhcmRUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgICAgICBteSAkVGVtcGxhdGVUZXh0OwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIFVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBTdGRBdHRhY2htZW50T2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CgogICAgICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlbmQgYSBsaXN0IG9mIGF0dGFjaG1lbnRzIGluIHRoZSB1cGxvYWQgY2FjaGUgYmFjayB0byB0aGUgY2xpZW50c2lkZSBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAjIHdoaWNoIHJlbmRlcnMgdGhlbiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgdXBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEBUaWNrZXRBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQFRpY2tldEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0gPSAkTGF5b3V0T2JqZWN0LT5IdW1hblJlYWRhYmxlRGF0YVNpemUoCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPT4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZUNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgQFN0ZEZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjICAgZW5kIEFKQVggVXBkYXRlCgogICAgIyBzYXZlLCBpZiBicm93c2VyIGxpbmsgbWVzc2FnZSB3YXMgY2xvc2VkCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQnJvd3NlckxpbmtNZXNzYWdlJyApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyQ3VzdG9tZXJEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2UnLAogICAgICAgICAgICBWYWx1ZSAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+IDEsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBmb2xsb3cgdXAKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7Q3VzdG9tZXJUaWNrZXRab29tUmVwbHl9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCBUeXBlID0+ICdDdXN0b21lcicgKTsKCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e05leHRTY3JlZW59IHx8ICRDb25maWctPntOZXh0U2NyZWVuQWZ0ZXJGb2xsb3dVcH07CiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIGdldCBmb2xsb3cgdXAgb3B0aW9uIChwb3NzaWJsZSBvciBub3QpCiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgICAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBPcHRpb24oCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsb2NrIG9wdGlvbiAoc2hvdWxkIGJlIHRoZSB0aWNrZXQgbG9ja2VkIC0gaWYgY2xvc2VkIC0gYWZ0ZXIgdGhlIGZvbGxvdyB1cCkKICAgICAgICBteSAkTG9jayA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBMb2NrT3B0aW9uKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFN0YXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7CgogICAgICAgICMgZ2V0IHRpY2tldCBzdGF0ZSBkZXRhaWxzCiAgICAgICAgbXkgJVN0YXRlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJFRpY2tldHtTdGF0ZUlEfSwKICAgICAgICApOwogICAgICAgIGlmICggJEZvbGxvd1VwUG9zc2libGUgPX4gLyhuZXcgdGlja2V0fHJlamVjdCkvaSAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyV2FybmluZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3QgcmVvcGVuIHRpY2tldCwgbm90IHBvc3NpYmxlIGluIHRoaXMgcXVldWUhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnQ3JlYXRlIGEgbmV3IHRpY2tldCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIG5vIHJpY2ggdGV4dCBpcyB1c2VkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5XcmFwUGxhaW5UZXh0KAogICAgICAgICAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpLAogICAgICAgICAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdH0gKSB7CiAgICAgICAgICAgICRFcnJvcntGcm9tQ2hhdH0gICAgICAgICAgID0gMTsKICAgICAgICAgICAgJEdldFBhcmFte0ZvbGxvd1VwVmlzaWJsZX0gPSAnVmlzaWJsZSc7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgICAgICAgICAgbXkgQENoYXRNZXNzYWdlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlLT57TWVzc2FnZVRleHR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgID0+ICRNZXNzYWdlLT57TWVzc2FnZVRleHR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NoYXRNZXNzYWdlc30gPSBcQENoYXRNZXNzYWdlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0Zyb21DaGF0fSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9IHx8ICRHZXRQYXJhbXtCb2R5fSBlcSAnPGJyIC8+JyApIHsKICAgICAgICAgICAgICAgICRFcnJvcntSaWNoVGV4dEludmFsaWR9ICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGb2xsb3dVcFZpc2libGV9ID0gJ1Zpc2libGUnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNraXAgdmFsaWRhdGlvbiBvZiBoaWRkZW4gZmllbGRzCiAgICAgICAgbXkgJVZpc2liaWxpdHk7CgogICAgICAgICMgdHJhbnNmb3JtIGR5bmFtaWMgZmllbGQgZGF0YSBpbnRvIERGTmFtZSA9PiBERk5hbWUgcGFpcgogICAgICAgIG15ICVEeW5hbWljRmllbGRBY2wgPSBtYXAgeyAkXyA9PiAkXyB9IGtleXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqOwoKICAgICAgICAjIGNhbGwgdGlja2V0IEFDTHMgZm9yIER5bmFtaWNGaWVsZHMgdG8gY2hlY2sgZmllbGQgdmlzaWJpbGl0eQogICAgICAgIG15ICRBQ0xSZXN1bHQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdGb3JtJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTFJlc3VsdCkgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDAgfSBrZXlzICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJUFjbERhdGEgKSB7CiAgICAgICAgICAgICAgICAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkIH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDEgfSBrZXlzICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICB9CgogICAgICAgICMgcmVtZW1iZXIgZHluYW1pYyBmaWVsZCB2YWxpZGF0aW9uIHJlc3VsdCBpZiBlcnJvbmVvdXMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQ7CgogICAgICAgICAgICAjIGRvIG5vdCB2YWxpZGF0ZSBpbnZpc2libGUgZmllbGRzCiAgICAgICAgICAgIGlmICggJFZpc2liaWxpdHl7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAgICAgICAgICMgTWFuZGF0b3J5IGlzIGFkZGVkIHRvIHRoZSBjb25maWdzIGJ5ICRTZWxmLT5uZXcKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e01hbmRhdG9yeX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICMgbWFrZSBGb2xsb3dVcCB2aXNpYmxlIHRvIGNvcnJlY3RseSBzaG93IHRoZSBlcnJvcgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGb2xsb3dVcFZpc2libGV9ID0gJ1Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGVkaXQgYWdhaW4KICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlQm94ID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICBUaWNrZXRTdGF0ZSAgID0+ICRUaWNrZXR7U3RhdGV9LAogICAgICAgICAgICAgICAgVGlja2V0U3RhdGVJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICA9PiBcJVZpc2liaWxpdHksCiAgICAgICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBERkVycm9ycyAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgICAgIFJlcGx5ICAgICAgICAgICAgPT4gJEFjbEFjdGlvbkxvb2t1cHtDdXN0b21lclRpY2tldFpvb21SZXBseX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyB1bmxvY2sgdGlja2V0IGlmIGFnZW50IGlzIG9uIHZhY2F0aW9uIG9yIGludmFsaWQKICAgICAgICBteSAkTG9ja0FjdGlvbjsKICAgICAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gKSB7CiAgICAgICAgICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFRpY2tldHtPd25lcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAlVXNlciAmJiAoICRVc2Vye091dE9mT2ZmaWNlTWVzc2FnZX0gfHwgJFVzZXJ7VmFsaWRJRH0gbmUgJzEnICkgKSB7CiAgICAgICAgICAgICAgICAkTG9ja0FjdGlvbiA9ICd1bmxvY2snOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBsb2NrIGlmIHRpY2tldCB3YXMgY2xvc2VkCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJExvY2tBY3Rpb24KICAgICAgICAgICAgJiYgJExvY2sKICAgICAgICAgICAgJiYgJFN0YXRle1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgJiYgJFRpY2tldHtPd25lcklEfSBuZSAnMScKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICRMb2NrQWN0aW9uID0gJ2xvY2snOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRMb2NrQWN0aW9uKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICRMb2NrQWN0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRnJvbSAgICAgPSAiXCIkU2VsZi0+e1VzZXJGdWxsbmFtZX1cIiA8JFNlbGYtPntVc2VyRW1haWx9PiI7CiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICBteSAkTmV4dFN0YXRlID0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gfHwgJ29wZW4nOwogICAgICAgIGlmICggJEdldFBhcmFte1N0YXRlSUR9ICYmICRDb25maWctPntTdGF0ZX0gKSB7CiAgICAgICAgICAgIG15ICVOZXh0U3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte1N0YXRlSUR9ICk7CiAgICAgICAgICAgICROZXh0U3RhdGUgPSAkTmV4dFN0YXRlRGF0YXtOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgY2hhbmdlIHN0YXRlIGlmCiAgICAgICAgIyBjdXN0b21lciBzZXQgYW5vdGhlciBzdGF0ZQogICAgICAgICMgb3IgdGhlIHRpY2tldCBpcyBub3QgbmV3CiAgICAgICAgaWYgKCAkVGlja2V0e1N0YXRlVHlwZX0gIX4gL15uZXcvIHx8ICRHZXRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFN0YXRlICAgID0+ICROZXh0U3RhdGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZSBzdGF0ZQogICAgICAgICAgICBpZiAoICROZXh0U3RhdGUgPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGU6OkJhY2tlbmQ6OkludGVybmFsJyktPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAkQ29uZmlnLT57U2VuZGVyVHlwZX0sCiAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgT3JpZ0hlYWRlciAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJ1N5c3RlbScsCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJExheW91dE9iamVjdC0+UmljaFRleHQyQXNjaWkoIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSA9PiAoICRDb25maWdPYmplY3QtPkdldCgnQXV0b1Jlc3BvbnNlRm9yV2ViVGlja2V0cycpICkgPyAnYXV0byBmb2xsb3cgdXAnIDogJycsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9CiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewoKICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdyaXRlIGV4aXN0aW5nIGZpbGUgdG8gYmFja2VuZAogICAgICAgICAgICAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdBcnRpY2xlJzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB1c2VyIGNsaWNrZWQgc3VibWl0IG9uIHRoZSBtYWluIHNjcmVlbgogICAgICAgICMgc3RvcmUgYWxzbyBjaGF0IHByb3RvY29sCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0Zyb21DaGF0fSAmJiAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgICAgIG15ICRDaGF0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpOwogICAgICAgICAgICBteSBAQ2hhdE1lc3NhZ2VMaXN0ID0gJENoYXRPYmplY3QtPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgICAgIENoYXRJRCA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDaGF0QXJ0aWNsZUlEOwoKICAgICAgICAgICAgaWYgKEBDaGF0TWVzc2FnZUxpc3QpIHsKICAgICAgICAgICAgICAgIGZvciBteSAkTWVzc2FnZSAoQENoYXRNZXNzYWdlTGlzdCkgewogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlLT57TWVzc2FnZVRleHR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtGZWF0dXJlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUNoYXRCYWNrZW5kID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnQ2hhdCcgKTsKCiAgICAgICAgICAgICAgICAkQ2hhdEFydGljbGVJRCA9ICRBcnRpY2xlQ2hhdEJhY2tlbmQtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlTGlzdCAgICAgID0+IFxAQ2hhdE1lc3NhZ2VMaXN0LAogICAgICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQ2hhdEFydGljbGVJRCkgewogICAgICAgICAgICAgICAgJENoYXRPYmplY3QtPkNoYXREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXR0ZWQgYXR0YWNobWVudHMKICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIGRlbGV0ZSBoaWRkZW4gZmllbGRzIGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAnSGlkZGVuRmllbGRzJywKICAgICAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIHZpZXcKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0iLAogICAgICAgICk7CiAgICB9CgogICAgJFRpY2tldHtUbXBDb3VudGVyfSAgICAgID0gMDsKICAgICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICApOwoKICAgICMgc2V0IHByaW9yaXR5IGZyb20gdGlja2V0IGFzIGZhbGxiYWNrCiAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gfHw9ICRUaWNrZXR7UHJpb3JpdHlJRH07CgogICAgIyBzZXQgaW5pdGlhbCBzdGF0ZQogICAgaWYgKCAkQ29uZmlnLT57U3RhdGV9ICYmICRDb25maWctPntTdGF0ZVByZXNldH0gKSB7CiAgICAgICAgbXkgJU5leHRTdGF0ZXMgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmV4dFN0YXRlc3sgJENvbmZpZy0+e1N0YXRlUHJlc2V0fSB9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ID0gJE5leHRTdGF0ZXN7ICRDb25maWctPntTdGF0ZVByZXNldH0gfTsKICAgICAgICB9CiAgICB9CiAgICAkR2V0UGFyYW17TmV4dFN0YXRlSUR9IHx8PSAkR2V0UGFyYW17U3RhdGVJRH0gfHwgJFRpY2tldHtTdGF0ZUlEfTsKCiAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntVc2VySUR9OwoKICAgICMgR2V0IHZhbHVlcyBmb3IgVGlja2V0IGZpZWxkcyBhbmQgdXNlIGRlZmF1bHQgdmFsdWUgZm9yIEFydGljbGUgZmllbGRzLCBpZiBnaXZlbiAodGhpcwogICAgIyBzY3JlZW4gZ2VuZXJhdGVzIGEgbmV3IGFydGljbGUsIHRoZW4gYXJ0aWNsZSBmaWVsZHMgd2lsbCBiZSBhbHdheXMgZGVmYXVsdCB2YWx1ZSBvcgogICAgIyBlbXB0eSBhdCB0aGUgYmVnaW5uaW5nKS4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKCiAgICAgICAgICAgICMgVmFsdWUgaXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSBmcm9tIFRpY2tldC4KICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBwcmUtZmlsbGluZyBjYWNoZSBmb3IgcmVmZXJlbmNlIGZpZWxkIC0gbmVjZXNzYXJ5IGZvciBBQ0wgY2FsY3VsYXRpb24gb2YgbGVucyBmaWVsZHMKICAgICAgICBteSAkSXNSZWZlcmVuY2VGaWVsZCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc1JlZmVyZW5jZUZpZWxkJywKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRJc1JlZmVyZW5jZUZpZWxkOwoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+U2V0Rm9ybURhdGEoCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBGb3JtSUQgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ1Bvc3NpYmxlVmFsdWVzX0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkZpZWxkUmVzdHJpY3Rpb25zJyk7CiAgICBteSAkQXV0b3NlbGVjdCAgICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgIyBpZiB0ZW1wbGF0ZXMgc2hvdWxkIGJlIGF1dG9zZWxlY3RlZCwgYXV0b21hdGljYWxseSBoaWRlIHRoZW0KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclRlbXBsYXRlOjpBdXRvc2VsZWN0JykgKSB7CiAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgIyBnYXRoZXIgZmllbGRzIHdoaWNoIGFyZSBzdXBwb3NlZCB0byBiZSBoaWRkZW4gd2hlbiBhdXRvc2VsZWN0ZWQKICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgIGlmICgkQXV0b3NlbGVjdCkgewogICAgICAgIG15IEBIaWRlQXV0b3NlbGVjdGVkID0gZ3JlcCB7ICFyZWYoICRBdXRvc2VsZWN0LT57JF99ICkgJiYgJEF1dG9zZWxlY3QtPnskX30gPT0gMiB9IGtleXMgJXskQXV0b3NlbGVjdH07CiAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEhpZGVBdXRvc2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBtYXAgeyAiRHluYW1pY0ZpZWxkXyIgLiAkXyB9CiAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQEhpZGVBdXRvc2VsZWN0ZWQpIHsKICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAkSGlkZUF1dG9zZWxlY3RlZEpTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcQEhpZGVBdXRvc2VsZWN0ZWQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQ29udmVyZ2VuY2UgPSAoCiAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICApOwogICAgbXkgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAoKTsKICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CiAgICBteSAlQ2hhbmdlZFN0ZEZpZWxkczsKCiAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICBteSAlU3RkRmllbGRWYWx1ZXM7CiAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICBGaWVsZHMgICAgID0+IHt9LAogICAgKTsKCiAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICA9PiAnUHJpb3JpdHlJRCcsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEFDTFByZXNlbGVjdGlvbiAmJiAhJEluaXRpYWxSdW4gKSB7CiAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEZpZWxkSUQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uLT57UnVsZXN9e1RpY2tldH17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRWxlbWVudCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQ2hlY2t7JEZpZWxkSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciBlYWNoIHN0YW5kYXJkIGZpZWxkIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkLCBydW4gdGhlIGRlZmluZWQgbWV0aG9kCiAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBNRVRIT0QgaWYgISRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfTsKCiAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgJFNlbGYsCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICBUT3M6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3tEZXN0fXsiJFF1ZXVlSUR8fCRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXsgJFF1ZXVlSUQgfSJ9ID0gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyRRdWV1ZUlEfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1F1ZXVlSUR9ICYmICEkU3RkRmllbGRWYWx1ZXN7RGVzdH17ICRHZXRQYXJhbXtEZXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFRPRE86IGlzIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IHJlYXNvbmFibGU/CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICBpZiAoICVDaGFuZ2VkRWxlbWVudHMgfHwgJEluaXRpYWxSdW4gKSB7CgogICAgICAgICAgICAjIGdldCB2YWx1ZXMgYW5kIHZpc2liaWxpdHkgb2YgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICAgICAgICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gICAgICAgICAgID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgICAgICAgICAgID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbWJpbmUgRmllbGRTdGF0ZXMKICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAwOwogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICB9CgogICAgICAgICRJbml0aWFsUnVuID0gMDsKICAgIH0KCiAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHQgaWYgZXJyb25lb3VzCiAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMgPSBtYXAgewogICAgICAgICdEeW5hbWljRmllbGRfJyAuICRfID0+IGRlZmluZWQgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99CiAgICAgICAgICAgID8gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICA6IHVuZGVmCiAgICB9ICgga2V5cyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKTsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiBqb2luICcnLAogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKSwKICAgICAgICAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVCb3ggPT4gXEBBcnRpY2xlQm94LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICBUaWNrZXRTdGF0ZSAgID0+ICRUaWNrZXR7U3RhdGV9LAogICAgICAgICAgICBUaWNrZXRTdGF0ZUlEID0+ICRUaWNrZXR7U3RhdGVJRH0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgVGlja2V0U3RhdGVJRCAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwgICAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBjaGVjayB3aGV0aGVyIHRoaXMgcmlnaHQKICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgIEhpZGVBdXRvc2VsZWN0ZWQgID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgPT4gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LAogICAgICAgICAgICBBY3Rpdml0eUVycm9ySFRNTCA9PiBcJUFjdGl2aXR5RXJyb3JIVE1MLAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzICA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBSZXBseSAgICAgICAgICAgICA9PiAkQWNsQWN0aW9uTG9va3Vwe0N1c3RvbWVyVGlja2V0Wm9vbVJlcGx5fSwKICAgICAgICApLAogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTmF2aWdhdGlvbkJhciwKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcjsKfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKCiAgICAgICAgICAgICMgJVBhcmFtIGNvdWxkIGNvbnRhaW4gVGlja2V0IFR5cGUgYXMgb25seSBUeXBlLCBpdCBzaG91bGQgbm90IGJlIHNlbnQKICAgICAgICAgICAgVHlwZSA9PiB1bmRlZiwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgbXkgJUFjbEFjdGlvbkxvb2t1cDsKICAgIGlmICggJFBhcmFte0FjbEFjdGlvbn0gKSB7CiAgICAgICAgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJXsgJFBhcmFte0FjbEFjdGlvbn0gfTsKICAgIH0KCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2hvdyBiYWNrIGxpbmsKICAgIGlmICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBhcnRpY2xlIHN0dWZmCiAgICBteSAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApIHx8ICcnOwogICAgbXkgQEFydGljbGVCb3ggICAgICAgID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yIG15ICRLZXlFcnJvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEtleUVycm9yfSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskS2V5RXJyb3J9ICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBcnRpY2xlSUQgICAgICAgICAgID0gJyc7CiAgICBteSAkTGFzdEN1c3RvbWVyQXJ0aWNsZSA9ICcnOwogICAgaWYgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgICAgIG15ICRDb3VudGVyQXJyYXkgPSAwOwogICAgICAgIG15ICRMYXN0Q3VzdG9tZXJBcnRpY2xlSUQ7CiAgICAgICAgJExhc3RDdXN0b21lckFydGljbGUgPSAkI0FydGljbGVCb3g7CgogICAgICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgICAgICMgaWYgaXQgaXMgYSBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgICAgIGlmICggJEFydGljbGV7U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyApIHsKICAgICAgICAgICAgICAgICRMYXN0Q3VzdG9tZXJBcnRpY2xlSUQgPSAkQXJ0aWNsZXtBcnRpY2xlSUR9OwogICAgICAgICAgICAgICAgJExhc3RDdXN0b21lckFydGljbGUgICA9ICRDb3VudGVyQXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENvdW50ZXJBcnJheSsrOwogICAgICAgICAgICBpZiAoICgkU2VsZWN0ZWRBcnRpY2xlSUQpICYmICggJFNlbGVjdGVkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gKSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZXtBcnRpY2xlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHRyeSB0byB1c2UgdGhlIGxhdGVzdCBub24gaW50ZXJuYWwgYWdlbnQgYXJ0aWNsZQogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICRBcnRpY2xlSUQgICAgICAgICA9ICRBcnRpY2xlQm94Wy0xXS0+e0FydGljbGVJRH07CiAgICAgICAgICAgICRTZWxlY3RlZEFydGljbGVJRCA9ICRBcnRpY2xlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHRyeSB0byB1c2UgdGhlIGxhdGVzdCBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgaWYgKCAhJEFydGljbGVJRCAmJiAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEICkgewogICAgICAgICAgICAkQXJ0aWNsZUlEICAgICAgICAgPSAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEOwogICAgICAgICAgICAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkQXJ0aWNsZUlEOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNldCBkaXNwbGF5IG9wdGlvbnMKICAgICRQYXJhbXtIb29rfSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJykgfHwgJ1RpY2tldCMnOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgdGlja2V0IGFjY291bnRlZCB0aW1lCiAgICBpZiAoICRDb25maWctPntab29tVGltZURpc3BsYXl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBwcmlvcml0eSBmbGFnCiAgICBpZiAoICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5RmxhZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVuZGVyIHRpY2tldCBpbmZvIGhlYWQgZGVwZW5kaW5nIG9uIHN5c2NvbmZpZyBzZXR0aW5nCiAgICBpZiAoICRDb25maWctPntUaWNrZXRJbmZvRGlzcGxheVR5cGV9IGVxICdIZWFkZXInICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJJbmZvJywKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHR5cGUKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57VHlwZX0gKSB7CgogICAgICAgIG15ICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFZhbGlkID0+ICRUeXBle1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoCiAgICAgICAgJFBhcmFte1NlcnZpY2V9CiAgICAgICAgJiYKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgJiYgJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e1NlcnZpY2V9CiAgICAgICAgKQogICAgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17U0xBfQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntTTEF9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgc3RhdGUKICAgIGlmICggJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e1N0YXRlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBwcmlvcml0eQogICAgaWYgKCAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHF1ZXVlCiAgICBpZiAoICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntRdWV1ZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFnZW50VXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyB0aWNrZXQgb3duZXIKICAgIGlmICggJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e093bmVyfSApIHsKICAgICAgICBteSAkT3duZXJOYW1lID0gJEFnZW50VXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17T3duZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICBEYXRhID0+IHsgT3duZXJOYW1lID0+ICRPd25lck5hbWUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHJlc3BvbnNpYmxlCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJgogICAgICAgICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntSZXNwb25zaWJsZX0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlTmFtZSA9ICRBZ2VudFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZU5hbWUgPT4gJFJlc3BvbnNpYmxlTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBjaGVjayBpZiB0aWNrZXQgaXMgbm9ybWFsIG9yIHByb2Nlc3MgdGlja2V0CiAgICBteSAkSXNQcm9jZXNzVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q2hlY2tGb3JQcm9jZXNzVHlwZSgKICAgICAgICAnVGlja2V0SUQnID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgKTsKCiAgICAjIHNob3cgcHJvY2VzcyB3aWRnZXQgIGFuZCBhY3Rpdml0eSBkaWFsb2dzIG9uIHByb2Nlc3MgdGlja2V0cwogICAgaWYgKCRJc1Byb2Nlc3NUaWNrZXQpIHsKCiAgICAgICAgIyBnZXQgdGhlIERGIHdoZXJlIHRoZSBQcm9jZXNzRW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJFByb2Nlc3NFbnRpdHlJREZpZWxkID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCJQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCIpOwoKICAgICAgICAjIGdldCB0aGUgREYgd2hlcmUgdGhlIEFjdGl2aXR5RW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJEFjdGl2aXR5RW50aXR5SURGaWVsZCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEIik7CgogICAgICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cyBmb3IgcHJvY2VzcyBtYW5hZ2VtZW50CiAgICAgICAgbXkgJEFjdGl2aXR5T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpOwogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKICAgICAgICBteSAkQWN0aXZpdHlEYXRhICAgICAgICAgPSAkQWN0aXZpdHlPYmplY3QtPkFjdGl2aXR5R2V0KAogICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJFBhcmFteyRBY3Rpdml0eUVudGl0eUlERmllbGR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRoZSBwcm9jZXNzIHdpZGdldCBvbiB0aGUgbWFpbiBzY3JlZW4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgV2lkZ2V0VGl0bGUgPT4gJFBhcmFte1dpZGdldFRpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBuZXh0IGFjdGl2aXR5IGRpYWxvZ3MKICAgICAgICBteSAkTmV4dEFjdGl2aXR5RGlhbG9nczsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRQYXJhbXskQWN0aXZpdHlFbnRpdHlJREZpZWxkfQogICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEYXRhKQogICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEFjdGl2aXR5RGF0YS0+e0FjdGl2aXR5RGlhbG9nfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICROZXh0QWN0aXZpdHlEaWFsb2dzID0gJEFjdGl2aXR5RGF0YS0+e0FjdGl2aXR5RGlhbG9nfSB8fCB7fTsKICAgICAgICB9CgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJE5leHRBY3Rpdml0eURpYWxvZ3MpICkgewoKICAgICAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByb2Nlc3MiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgbG9hZCBwcm9jZXNzIG1vZHVsZS4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJFByb2Nlc3NNb2R1bGUgPSAoJ0tlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJUaWNrZXRQcm9jZXNzJyktPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgID0+ICdDdXN0b21lclRpY2tldFByb2Nlc3MnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdEaXNwbGF5QWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgTW9kdWxlUmVnID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsnQ3VzdG9tZXJUaWNrZXRQcm9jZXNzJ30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgdGhlIG5lZWRlZCBwZXJtaXNzaW9ucyB0byB2aWV3IHRoZQogICAgICAgICAgICAjIGRpZmZlcmVudCBhY3Rpdml0eSBkaWFsb2dzLCBzbyB3ZSBsb29wIG92ZXIgZXZlcnkgYWN0aXZpdHkgZGlhbG9nIGFuZCBjaGVjayBpZiB0aGVyZQogICAgICAgICAgICAjIGlzIGEgcGVybWlzc2lvbiBjb25maWd1cmVkLiBJZiB0aGVyZSBpcyBhIHBlcm1pc3Npb24gY29uZmlndXJlZCB3ZSBjaGVjayB0aGlzCiAgICAgICAgICAgICMgYW5kIGRpc3BsYXkvaGlkZSB0aGUgYWN0aXZpdHkgZGlhbG9nIGxpbmsKICAgICAgICAgICAgbXkgJVBlcm1pc3Npb25SaWdodHM7CiAgICAgICAgICAgIG15ICVQZXJtaXNzaW9uQWN0aXZpdHlEaWFsb2dMaXN0OwogICAgICAgICAgICBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT046CiAgICAgICAgICAgIGZvciBteSAkSW5kZXggKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyROZXh0QWN0aXZpdHlEaWFsb2dzfSApIHsKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50QWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JEluZGV4fTsKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50QWN0aXZpdHlEaWFsb2cgICAgICAgICA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQ3VycmVudEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhbiBpbnRlcmZhY2UgbG9va3VwLWxpc3QKICAgICAgICAgICAgICAgIG15ICVJbnRlcmZhY2VMb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e0ludGVyZmFjZX0gfTsKCiAgICAgICAgICAgICAgICBuZXh0IEFDVElWSVRZRElBTE9HUEVSTUlTU0lPTiBpZiAhJEludGVyZmFjZUxvb2t1cHtDdXN0b21lckludGVyZmFjZX07CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgcGVyZm9ybWFuY2UtYm9vc3QvY2FjaGUKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRQZXJtaXNzaW9uUmlnaHRzeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBlcm1pc3Npb25SaWdodHN7ICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntQZXJtaXNzaW9ufSB9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggISRQZXJtaXNzaW9uUmlnaHRzeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT047CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uQWN0aXZpdHlEaWFsb2dMaXN0eyRJbmRleH0gPSAkQ3VycmVudEFjdGl2aXR5RGlhbG9nRW50aXR5SUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkdWNlIG5leHQgYWN0aXZpdHkgZGlhbG9ncyB0byB0aGUgb25lcyB0aGF0IGhhdmUgcGVybWlzc2lvbnMKICAgICAgICAgICAgJE5leHRBY3Rpdml0eURpYWxvZ3MgPSBcJVBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3Q7CgogICAgICAgICAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJVBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3QsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICctJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAleyROZXh0QWN0aXZpdHlEaWFsb2dzfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOZXh0QWN0aXZpdGllcycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17QWN0aXZpdHlFcnJvckhUTUx9IC8vPSB7fTsKCiAgICAgICAgICAgIGZvciBteSAkTmV4dEFjdGl2aXR5RGlhbG9nS2V5ICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJXskTmV4dEFjdGl2aXR5RGlhbG9nc30gKSB7CiAgICAgICAgICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dEYXRhID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRlY2lkZSB3aGV0aGVyIHRvIG91dHB1dCBkaXJlY3Qgc3VibWl0IG9yIGxpbmsgdG8gbmV3IHdpbmRvdwogICAgICAgICAgICAgICAgbXkgJERpcmVjdFN1Ym1pdCA9ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntEaXJlY3RTdWJtaXR9OwogICAgICAgICAgICAgICAgaWYgKCBhbnkgeyAkQWN0aXZpdHlEaWFsb2dEYXRhLT57RmllbGRzfXskX317RGlzcGxheX0gfSBrZXlzICRBY3Rpdml0eURpYWxvZ0RhdGEtPntGaWVsZHN9LT4lKiApIHsKICAgICAgICAgICAgICAgICAgICAkRGlyZWN0U3VibWl0ID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJERpcmVjdFN1Ym1pdCkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpdml0eURpYWxvZ0RpcmVjdFN1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e1N1Ym1pdEJ1dHRvblRleHR9IHx8ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17JFByb2Nlc3NFbnRpdHlJREZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkTmV4dEFjdGl2aXR5RGlhbG9ncy0+eyROZXh0QWN0aXZpdHlEaWFsb2dLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17JFByb2Nlc3NFbnRpdHlJREZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEFjdGl2aXR5SFRNTCA9ICRQYXJhbXtBY3Rpdml0eUVycm9ySFRNTH17ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0gfSAvLyAkUHJvY2Vzc01vZHVsZS0+UnVuKAogICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJE5leHRBY3Rpdml0eURpYWxvZ3MtPnskTmV4dEFjdGl2aXR5RGlhbG9nS2V5fSwKICAgICAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgICAgICAgID0+ICRQYXJhbXskUHJvY2Vzc0VudGl0eUlERmllbGR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NBY3Rpdml0eScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5SFRNTCAgICAgICAgICAgPT4gJEFjdGl2aXR5SFRNTCwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkTmV4dEFjdGl2aXR5RGlhbG9ncy0+eyROZXh0QWN0aXZpdHlEaWFsb2dLZXl9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkTmV4dEFjdGl2aXR5RGlhbG9ncykgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkRHluYW1pY0ZpZWxkRmlsdGVyID0gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH07CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGdhdGhlciBjYXRlZ29yaWVzIHRvIGJlIHNob3duCiAgICBteSAlQ2F0ZWdvcmllczsKICAgIG15ICRDYXRlZ29yeUNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRDYXRlZ29yaWVzIik7CgogICAgIyBzdGFuZGFyZCB0aWNrZXQgY2F0ZWdvcmllcwogICAgQ0FUOgogICAgZm9yIG15ICRDYXROYW1lIChxdy9Qcmlvcml0eSBUeXBlIFF1ZXVlIFNlcnZpY2UgU3RhdGUgT3duZXIvKSB7CiAgICAgICAgbmV4dCBDQVQgaWYgISRQYXJhbXskQ2F0TmFtZX07CiAgICAgICAgaWYgKCAkQ2F0ZWdvcnlDb25maWctPnskQ2F0TmFtZX0gKSB7CiAgICAgICAgICAgIG15ICRDb25mID0gJENhdGVnb3J5Q29uZmlnLT57JENhdE5hbWV9OwogICAgICAgICAgICBteSAkVGV4dCA9ICRDb25mLT57VGV4dH0gLy8gJFBhcmFteyRDYXROYW1lfTsKCiAgICAgICAgICAgICRDb25mLT57Q29sb3JTZWxlY3Rpb259IC8vPSB7fTsKICAgICAgICAgICAgbXkgJENvbG9yID0gJENvbmYtPntDb2xvclNlbGVjdGlvbn17ICRQYXJhbXskQ2F0TmFtZX0gfSAvLyAkQ29uZi0+e0NvbG9yRGVmYXVsdH07CgogICAgICAgICAgICBwdXNoIEB7ICRDYXRlZ29yaWVzeyAkQ29uZi0+e09yZGVyfSB9IH0sIHsKICAgICAgICAgICAgICAgIFRleHQgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgIENvbG9yICA9PiAkQ29sb3IsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFBhcmFteyRDYXROYW1lfSwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkQ29uZiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUR5bmFtaWNGaWVsZENhdGVnb3JpZXMgPSAkQ2F0ZWdvcnlDb25maWctPntEeW5hbWljRmllbGR9CiAgICAgICAgPwogICAgICAgIG1hcCB7ICRDYXRlZ29yeUNvbmZpZy0+e0R5bmFtaWNGaWVsZH17JF99e0R5bmFtaWNGaWVsZH0gPT4gJF8gfSBrZXlzICV7ICRDYXRlZ29yeUNvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfQogICAgICAgIDogKCk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJER5bmFtaWNGaWVsZEZpbHRlciB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIHRoZSBkeW5hbWljIGZpZWxkIGlmIGlzIG5vdCBkZXNpZ25lZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkVmFsdWU7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICIiOwoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDI1LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgTXVsdGlMaW5rICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFZhbHVlU3RyZy0+e0xpbmt9ICkgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRMaW5rJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAkI3sgJFZhbHVlU3RyZy0+e0xpbmt9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZhbHVlSXRlbUxpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9WyRJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfVskSW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfVskSW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1ByZXZpZXcgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rUHJldmlld31bJEluZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9WyRJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSW5kZXggIT0gJCN7ICRWYWx1ZVN0cmctPntMaW5rfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ011bHRpdmFsdWVTZXBhcmF0b3JMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRMaW5rJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdWYWx1ZUl0ZW1MaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rUHJldmlldyAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmtQcmV2aWV3fSwKICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkICVDYXRlZ29yaWVzIGFzICRDYXRlZ29yaWVzezxPcmRlcj59ID0gWyB7VGV4dCA9PiAnJywgQ29sb3IgPT4gJyd9LCAuLi4gXQogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENhdGVnb3JpZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICBteSAkQ29uZiA9ICRDYXRlZ29yeUNvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDYXRlZ29yaWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSB9OwogICAgICAgICAgICBteSAkVGV4dCA9ICRDb25mLT57VGV4dH0gLy8gJFZhbHVlU3RyZy0+e1ZhbHVlfTsKCiAgICAgICAgICAgICRDb25mLT57Q29sb3JTZWxlY3Rpb259IC8vPSB7fTsKICAgICAgICAgICAgbXkgJENvbG9yID0gJENvbmYtPntDb2xvclNlbGVjdGlvbn17ICRWYWx1ZVN0cmctPntWYWx1ZX0gfSAvLyAkQ29uZi0+e0NvbG9yRGVmYXVsdH07CgogICAgICAgICAgICBwdXNoIEB7ICRDYXRlZ29yaWVzeyAkQ29uZi0+e09yZGVyfSB9IH0sIHsKICAgICAgICAgICAgICAgIFRleHQgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgIENvbG9yICA9PiAkQ29sb3IsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkQ29uZiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIGNhdGVnb3JpZXMgZm9yIGhlYWRlciBhbmQgaW5mbyBibG9jawogICAgaWYgKCVDYXRlZ29yaWVzKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0luZm9DYXRlZ29yaWVzJyApOwogICAgICAgIGZvciBteSAkT3JkZXIgKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAlQ2F0ZWdvcmllcyApIHsKICAgICAgICAgICAgZm9yIG15ICRDYXRlZ29yeSAoIEB7ICRDYXRlZ29yaWVzeyRPcmRlcn0gfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3JpZXMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJENhdGVnb3J5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3JpZXNJJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRDYXRlZ29yeSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpcyBjaGF0IGF2YWlsYWJsZSBhbmQgaXMgc3RhcnRpbmcgYSBjaGF0IGZyb20gdGlja2V0IHpvb20gYXZhaWxhYmxlCiAgICBteSAkQ2hhdENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpDdXN0b21lcjo6U3RhcnRDaGF0RnJvbVRpY2tldCcpOwogICAgaWYgKAogICAgICAgICRDaGF0Q29uZmlnLT57QWxsb3dlZH0KICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoYXRFbmdpbmU6OkFjdGl2ZScpCiAgICAgICAgKQogICAgewogICAgICAgICMgZ2V0IGFsbCBxdWV1ZXMgdG8gdGlja2V0cyByZWxhdGlvbnMKICAgICAgICBteSAlUXVldWVDaGF0Q2hhbm5lbFJlbGF0aW9ucyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0Q2hhbm5lbCcpLT5DaGF0Q2hhbm5lbFF1ZXVlc0dldCgKICAgICAgICAgICAgQ3VzdG9tZXJJbnRlcmZhY2UgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGlmIGEgc3VwcG9ydCBjaGF0IGNoYW5uZWwgaXMgc2V0IGZvciB0aGlzIHF1ZXVlCiAgICAgICAgaWYgKCAkUXVldWVDaGF0Q2hhbm5lbFJlbGF0aW9uc3sgJFBhcmFte1F1ZXVlSUR9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlzIHN0YXJ0aW5nIGEgY2hhdCBmcm9tIHRpY2tldCB6b29tIGFsbG93ZWQgdG8gYWxsIHVzZXIgb3Igb25seSB0byB0aWNrZXQgY3VzdG9tZXIgdXNlcl9hZ2VudAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJENoYXRDb25maWctPntQZXJtaXNzaW9uc30KICAgICAgICAgICAgICAgIHx8ICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSBlcSAkU2VsZi0+e1VzZXJJRH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIGFkZCBjaGF0IGNoYW5uZWxJRCB0byBQYXJhbQogICAgICAgICAgICAgICAgJFBhcmFte0NoYXRDaGFubmVsSUR9ID0gJFF1ZXVlQ2hhdENoYW5uZWxSZWxhdGlvbnN7ICRQYXJhbXtRdWV1ZUlEfSB9OwoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0NoYXRDaGFubmVsSUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHNob3VsZCBjaGF0IGJlIGF2YWlsYWJsZSBvbmx5IGlmIHRoZXJlIGFyZSBhdmFpbGFibGUgYWdlbnRzIGluIHRoaXMgY2hhdCBjaGFubmVsSUQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hhdENvbmZpZy0+e0FsbG93Q2hhdE9ubHlJZkFnZW50c0F2YWlsYWJsZX0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgc3RhcnQgYSBjaGF0IGljb24KICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGF0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAjIEdldCBjaGFubmVscyBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVDaGF0Q2hhbm5lbERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdENoYW5uZWwnKS0+Q2hhdENoYW5uZWxHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGF0Q2hhbm5lbElEID0+ICRQYXJhbXtDaGF0Q2hhbm5lbElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgR2V0IGFsbCBvbmxpbmUgdXNlcnMKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEF2YWlsYWJpbGl0eUNoZWNrID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJDaGF0RW5naW5lOjpDdXN0b21lckZyb250ZW5kOjpBdmFpbGFiaWxpdHlDaGVjayIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICBteSAlQXZhaWxhYmxlVXNlcnM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQXZhaWxhYmlsaXR5Q2hlY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVBdmFpbGFibGVVc2VycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkF2YWlsYWJsZVVzZXJzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRXh0ZXJuYWxDaGFubmVscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIFJlbmFtZSBoYXNoIGtleTogQ2hhdENoYW5uZWxJRCA9PiBLZXkKICAgICAgICAgICAgICAgICAgICAgICAgJENoYXRDaGFubmVsRGF0YXtLZXl9ID0gZGVsZXRlICRDaGF0Q2hhbm5lbERhdGF7Q2hhdENoYW5uZWxJRH07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEF2YWlsYWJpbGl0eUNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVXNlckF2YWlsYWJsZSA9IDA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZBSUxBQkxFX1VTRVI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEF2YWlsYWJsZVVzZXIgKCBzb3J0IGtleXMgJUF2YWlsYWJsZVVzZXJzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYW55IHsvXiRDaGF0Q2hhbm5lbERhdGF7S2V5fSQvfSBAeyAkQXZhaWxhYmxlVXNlcnN7JEF2YWlsYWJsZVVzZXJ9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyQXZhaWxhYmxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBBVkFJTEFCTEVfVVNFUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRVc2VyQXZhaWxhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgcHJpbnQgb3B0aW9uCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+e0N1c3RvbWVyVGlja2V0UHJpbnR9CiAgICAgICAgJiYgJEFjbEFjdGlvbkxvb2t1cHtDdXN0b21lclRpY2tldFByaW50fQogICAgICAgICkKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpbnQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRab29tRXhwYW5kID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1pvb21FeHBhbmQnICk7CiAgICBpZiAoICFkZWZpbmVkICRab29tRXhwYW5kICkgewogICAgICAgICRab29tRXhwYW5kID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldFpvb20nKS0+e0N1c3RvbWVyWm9vbUV4cGFuZH0gfHwgJyc7CiAgICB9CgogICAgIyBFeHBhbmQgb3B0aW9uCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdFeHBhbmQnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBab29tRXhwYW5kICAgPT4gISRab29tRXhwYW5kLAogICAgICAgICAgICBFeHBhbmRPcHRpb24gPT4gKCAkWm9vbUV4cGFuZCA/ICdPbmUnICAgICAgICAgICAgICA6ICdBbGwnICksCiAgICAgICAgICAgIEV4cGFuZFRleHQgICA9PiAoICRab29tRXhwYW5kID8gJ1Nob3cgb25lIGFydGljbGUnIDogJ1Nob3cgYWxsIGFydGljbGVzJyApLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIG15ICRTaG93bkFydGljbGVzOwogICAgbXkgJExhc3RTZW5kZXJUeXBlID0gJyc7CiAgICBteSAkQXJ0aWNsZUhUTUwgICAgPSAnJzsKCiAgICBmb3IgbXkgJEFydGljbGVUbXAgKCByZXZlcnNlIEBBcnRpY2xlQm94ICkgewogICAgICAgIG15ICVBcnRpY2xlID0gJEFydGljbGVUbXAtPiUqOwoKICAgICAgICAjIGNoZWNrIGlmIGFydGljbGUgc2hvdWxkIGJlIGV4cGFuZGVkICh2aXNpYmxlKQogICAgICAgIGlmICggJFNlbGVjdGVkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gfHwgJFpvb21FeHBhbmQgKSB7CiAgICAgICAgICAgICRBcnRpY2xle0NsYXNzfSA9ICdWaXNpYmxlJzsKICAgICAgICAgICAgJFNob3duQXJ0aWNsZXMrKzsKICAgICAgICB9CgogICAgICAgICMgQ2FsY3VsYXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBhcnRpY2xlIGNyZWF0ZSB0aW1lIGFuZCBub3cgaW4gc2Vjb25kcy4KICAgICAgICBteSAkQXJ0aWNsZUNyZWF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXJ0aWNsZXtDcmVhdGVUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICREZWx0YSA9ICRBcnRpY2xlQ3JlYXRlVGltZU9iamVjdC0+RGVsdGEoCiAgICAgICAgICAgIERhdGVUaW1lT2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLAogICAgICAgICk7CgogICAgICAgICMgZG8gc29tZSBodG1sIHF1b3RpbmcKICAgICAgICAkQXJ0aWNsZXtBZ2V9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgID0+ICREZWx0YS0+e0Fic29sdXRlU2Vjb25kc30sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICAgICAgRGF0ZSAgPT4gJEFydGljbGV7Q3JlYXRlVGltZX0sCiAgICAgICAgKTsKCiAgICAgICAgJEFydGljbGV7U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDE1MCwKICAgICAgICApOwoKICAgICAgICAkTGFzdFNlbmRlclR5cGUgPSAkQXJ0aWNsZXtTZW5kZXJUeXBlfTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1Nob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7VXNlckN1c3RvbWVyRG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntTaG93QnJvd3NlckxpbmtNZXNzYWdlfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ2hhbm5lbE5hbWUgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkNoYW5uZWxOYW1lR2V0KCk7CgogICAgICAgICRBcnRpY2xlSFRNTCAuPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0Wm9vbTo6Q3VzdG9tZXI6OiRDaGFubmVsTmFtZSIpLT5BcnRpY2xlUmVuZGVyKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXtDbGFzc30sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBTaG93QnJvd3NlckxpbmtNZXNzYWdlID0+ICRTZWxmLT57U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0sCiAgICAgICAgICAgIEFydGljbGVFeHBhbmRlZCAgICAgICAgPT4gJFNlbGVjdGVkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gfHwgJFpvb21FeHBhbmQsCiAgICAgICAgICAgIEFydGljbGVBZ2UgICAgICAgICAgICAgPT4gJEFydGljbGV7QWdlfSwKICAgICAgICApOwogICAgfQoKICAgICMgVE9ETzogUmVmYWN0b3IKICAgICMgaWYgdGhlcmUgYXJlIG5vIHZpZXdhYmxlIGFydGljbGVzIHNob3cgTm9BcnRpY2xlcyBtZXNzYWdlCiAgICBpZiAoICFAQXJ0aWNsZUJveCApIHsKICAgICAgICAkUGFyYW17Tm9BcnRpY2xlc30gPSAxOwogICAgfQoKICAgIG15ICVBcnRpY2xlOwogICAgaWYgKEBBcnRpY2xlQm94KSB7CgogICAgICAgIG15ICRBcnRpY2xlT0IgPSB7fTsKICAgICAgICBpZiAoJExhc3RDdXN0b21lckFydGljbGUpIHsKICAgICAgICAgICAgJEFydGljbGVPQiA9ICRBcnRpY2xlQm94WyRMYXN0Q3VzdG9tZXJBcnRpY2xlXTsKICAgICAgICB9CgogICAgICAgICVBcnRpY2xlID0gJEFydGljbGVPQi0+JSo7CgogICAgICAgICMgaWYgbm8gY3VzdG9tZXIgYXJ0aWNsZXMgZm91bmQgdXNlIHRpY2tldCB2YWx1ZXMKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVBcnRpY2xlICkgKSB7CiAgICAgICAgICAgICVBcnRpY2xlID0gJVBhcmFtOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle1N0YXRlSUR9ID0gJFBhcmFte1RpY2tldFN0YXRlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIG15ICVBcnRpY2xlVG1wMSA9ICRBcnRpY2xlVG1wLT4lKjsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xlVG1wMXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgJUFydGljbGUgPSAlQXJ0aWNsZVRtcDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBmYWxsYmFjayB0byB0aWNrZXQgaW5mbyBpZiB0aGVyZSBpcyBubyBhcnRpY2xlCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVBcnRpY2xlICkgKSB7CiAgICAgICAgJUFydGljbGUgPSAlUGFyYW07CiAgICAgICAgaWYgKCAhJEFydGljbGV7U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1N0YXRlSUR9ID0gJFBhcmFte1RpY2tldFN0YXRlSUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvbGxvdyB1cCBwZXJtaXNzaW9ucwogICAgbXkgJEZvbGxvd1VwUG9zc2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0Rm9sbG93VXBPcHRpb24oCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgKTsKICAgIG15ICVTdGF0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICBJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICd1cGRhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICkKICAgICAgICAmJiAoCiAgICAgICAgICAgICggJEZvbGxvd1VwUG9zc2libGUgIX4gLyhuZXcgdGlja2V0fHJlamVjdCkvaSAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApCiAgICAgICAgICAgIHx8ICRTdGF0ZXtUeXBlTmFtZX0gIX4gL15jbG9zZXxtZXJnZWQvaQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgIGlmICggJFBhcmFte0hpZGVBdXRvc2VsZWN0ZWR9ICkgewoKICAgICAgICAgICAgIyBhZGQgQXV0b3NlbGVjdCBKUwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU09uRG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIENvZGUgPT4gIkNvcmUuRm9ybS5Jbml0SGlkZUF1dG9zZWxlY3RlZCh7IEZpZWxkSURzOiAkUGFyYW17SGlkZUF1dG9zZWxlY3RlZH0gfSk7IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGluZm9ybWF0aW9uIHdoZXRoZXIgYWN0aXZhdGVkIGFjdGl2aXR5IGRpYWxvZyBidXR0b24gc2hvdWxkIGJlIGhpZGRlbgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0hpZGVBY3RpdmF0ZWRBY3Rpdml0eURpYWxvZ0J1dHRvbicsCiAgICAgICAgICAgIFZhbHVlID0+ICRDb25maWctPnsnSGlkZUFjdGl2YXRlZEFjdGl2aXR5RGlhbG9nQnV0dG9uJ30gLy8gMCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICBpZiAoICEkUGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTdWJqZWN0fSA9ICJSZTogIiAuICggJFBhcmFte1RpdGxlfSAvLyAnJyApOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtSZXBseX0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVwbHlCdXR0b24nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRm9sbG93VXAnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAjIGNoZWNrIGlmIGV4aXN0cyBjdXN0b21lciBhbnN3ZXIgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlIGFuZCB0aGUgc2VydmljZQogICAgICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyktPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBUeXBlICA9PiAnQ3VzdG9tZXJBbnN3ZXInLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgdGV4dCB0ZW1wbGF0ZSBzdHJpbmcKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CgogICAgICAgICAgICAjIGZldGNoIGFsbCBhdmFpbGFibGUgc3RkLiB0ZW1wbGF0ZXMKICAgICAgICAgICAgbXkgJEF2YWlsYWJsZVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlcyB8fCB7fSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSB8fCAnJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAjIHNldCB1cCBjdXN0b21lciByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyU2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICBpZiAoICRDb25maWctPntTdGF0ZX0gKSB7CiAgICAgICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVTdGF0ZVNlbGVjdGVkOwogICAgICAgICAgICBpZiAoICRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZVNlbGVjdGVke1NlbGVjdGVkSUR9ID0gJFBhcmFte1N0YXRlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFN0YXRlU2VsZWN0ZWR7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgICAgICAlU3RhdGVTZWxlY3RlZCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZvbGxvd1VwU3RhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVQcmlvcml0eVNlbGVjdGVkOwogICAgICAgICAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eVNlbGVjdGVke1NlbGVjdGVkSUR9ID0gJFBhcmFte1ByaW9yaXR5SUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFByaW9yaXR5U2VsZWN0ZWR7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fQogICAgICAgICAgICAgICAgICAgIHx8ICczIG5vcm1hbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICVQcmlvcml0eVNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGb2xsb3dVcFByaW9yaXR5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTZXBhcmF0ZUR5bmFtaWNGaWVsZHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6Q3VzdG9tZXJGcm9udGVuZDo6U2VwYXJhdGVEeW5hbWljRmllbGRzJyk7CgogICAgICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICAgICAgaWYgKCAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKSB7CgogICAgICAgICAgICAjIGdyZXAgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlcyA9IG1hcCB7ICRfID0+ICRQYXJhbXskX30gfSBncmVwIHsvXkR5bmFtaWNGaWVsZF8vfSBrZXlzICVQYXJhbTsKCiAgICAgICAgICAgICMgVE9ETyByZW5kZXJpbmcgdGhyb3dzIGVycm9yICdOZWVkIElEIGluIER5bmFtaWNGaWVsZENvbmZpZyEnIGluIHByb2Nlc3MgY2FzZSBiZWNhdXNlIGlkcyBpbiAlRHluYW1pY0ZpZWxkQ29uZmlnIGFyZSBjb25jYXRlbmF0ZWQgd2l0aCBhY3Rpdml0eWRpYWxvZ2lkCiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpEeW5hbWljRmllbGQ6Ok1hc2snKS0+RWRpdFNlY3Rpb25SZW5kZXIoCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgPT4gJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgPT4gJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgICAgPT4gXCVEeW5hbWljRmllbGRWYWx1ZXMsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciAgPT4gJFBhcmFte0RGUG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgICAgPT4gJFBhcmFte1Zpc2liaWxpdHl9LAogICAgICAgICAgICAgICAgU2VwYXJhdGVEeW5hbWljRmllbGRzID0+ICRTZXBhcmF0ZUR5bmFtaWNGaWVsZHMsCiAgICAgICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFNlbGYtPntDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICAgICAgfQogICAgfQoKICAgICMgbmFtZSBhbmQgYXZhdGFyCiAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9IHx8ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgKTsKICAgIG15ICggJEF2YXRhciwgJFVzZXJJbml0aWFscyApOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpBdmF0YXJFbmdpbmUnKSBlcSAnR3JhdmF0YXInICYmICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSApIHsKICAgICAgICBteSAkRGVmYXVsdEljb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpHcmF2YXRhcjo6RGVmYXVsdEltYWdlJykgfHwgJ21tJzsKICAgICAgICAkQXZhdGFyID0gJy8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvJyAuIG1kNV9oZXgoIGxjICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSApIC4gJz9zPTEwMCZkPScgLiAkRGVmYXVsdEljb247CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVXNlckluaXRpYWxzID0gc3Vic3RyKCAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9LCAwLCAxICkgLiBzdWJzdHIoICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSwgMCwgMSApOwogICAgfQoKICAgICMgZXhwbGFuYXRvcnkgbWVzc2FnZSBhYm91dCBhc3RlcmlzawogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXN0ZXJpc2tFeHBsYW5hdGlvbicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlbGVjdCB0aGUgb3V0cHV0IHRlbXBsYXRlCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJUaWNrZXRab29tJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUaWNrZXRJbmZvRGlzcGxheVR5cGUgPT4gJENvbmZpZy0+e1RpY2tldEluZm9EaXNwbGF5VHlwZX0gfHwgJ0hlYWRlcicsCiAgICAgICAgICAgIEFydGljbGVzICAgICAgICAgICAgICA9PiAkQXJ0aWNsZUhUTUwsCiAgICAgICAgICAgIEF2YXRhciAgICAgICAgICAgICAgICA9PiAkQXZhdGFyLAogICAgICAgICAgICBVc2VySW5pdGlhbHMgICAgICAgICAgPT4gJFVzZXJJbml0aWFscywKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSAgICAgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgICAgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgfSwKICAgICk7Cn0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJFF1ZXVlSUQgICAgICAgPSAkUGFyYW17UXVldWVJRH0gICB8fCAnJzsKICAgIG15ICRTZXJ2aWNlSUQgICAgID0gJFBhcmFte1NlcnZpY2VJRH0gfHwgJyc7CiAgICBteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUXVldWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKICAgIG15ICVBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlczsKICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OlJlZmVyZW5jZUF0dHJpYnV0ZScpIHx8ICdRdWV1ZSc7CiAgICBpZiAoICRSZWZlcmVuY2VBdHRyaWJ1dGUgZXEgJ1F1ZXVlJyApIHsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQKICAgICAgICByZXR1cm4ge30gaWYgISRRdWV1ZUlEICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICAgICBpZiAoICEkUXVldWVJRCAmJiAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgUXVldWVJRCBmcm9tIHRoZSB0aWNrZXQKICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFRpY2tldHtRdWV1ZUlEfSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7fSBpZiAhJFF1ZXVlSUQ7CgogICAgICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgJUF2YWlsYWJsZVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFJlZmVyZW5jZUF0dHJpYnV0ZSBlcSAnU2VydmljZScgKSB7CgogICAgICAgICMgY2hlY2sgbmVlZGVkCiAgICAgICAgcmV0dXJuIHt9IGlmICEkU2VydmljZUlEICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICAgICBpZiAoICEkU2VydmljZUlEICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBTZXJ2aWNlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VydmljZUlEID0gJFRpY2tldHtTZXJ2aWNlSUR9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHt9IGlmICEkU2VydmljZUlEOwoKICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgICAgICVBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZldGNoIHN0YW5kYXJkIHRlbXBsYXRlcyBsaXN0ISBJbnZhbGlkIHJlZmVyZW5jZSBhdHRyaWJ1dGUgJyRSZWZlcmVuY2VBdHRyaWJ1dGUnIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4ge30gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXN7Q3VzdG9tZXJBbnN3ZXJ9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlc3tDdXN0b21lckFuc3dlcn07Cn0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AdminTemplate.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA3MGFjNjJjOWZjNzIyODQyMWUyNzQyOTZjOGNkNzgyZDNiODI4MjA4IC0gS2VybmVsL01vZHVsZXMvQWRtaW5UZW1wbGF0ZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5UZW1wbGF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGlmICggISRQYXJhbXtBY2Nlc3NSd30gJiYgJFBhcmFte0FjY2Vzc1JvfSApIHsKICAgICAgICAkU2VsZi0+e0xpZ2h0QWRtaW59ID0gMTsKICAgIH0KCiAgICAjIHNldCBwcmVmIGZvciBjb2x1bW5zIGtleQogICAgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9ID0gJ0luY2x1ZGVJbnZhbGlkJyAuICctJyAuICRTZWxmLT57QWN0aW9ufTsKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRQcmVmZXJlbmNlc3sgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9IH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKTsKICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CgogICAgJFBhcmFte0luY2x1ZGVJbnZhbGlkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbmNsdWRlSW52YWxpZCcgKTsKCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0luY2x1ZGVJbnZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRQYXJhbXtJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPSAkUGFyYW17SW5jbHVkZUludmFsaWR9OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICBteSAkSUQgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKICAgICAgICBteSAlRGF0YSA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFNlbGVjdGVkQXR0YWNobWVudDsKICAgICAgICBteSAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgcHVzaCBAU2VsZWN0ZWRBdHRhY2htZW50LCAkS2V5OwogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBpZiAoICRTZWxmLT57TGlnaHRBZG1pbn0gKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQgKTsKICAgICAgICAgICAgJERhdGF7UGVybWlzc2lvbn0gPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiBbIGtleXMgJVF1ZXVlcyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGVmYXVsdCAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTm8gcGVybWlzc2lvbiBmb3IgdGhlIHRlbXBsYXRlLgogICAgICAgICAgICBpZiAoICEkRGF0YXtQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICVEYXRhID0gKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXtQZXJtaXNzaW9ufSBlcSAncm8nICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9uIHRvIGVkaXQgdGhpcyB0ZW1wbGF0ZS4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgU2VsZWN0ZWRBdHRhY2htZW50cyA9PiBcQFNlbGVjdGVkQXR0YWNobWVudCwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluVGVtcGxhdGUnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgQE5ld0lEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJRHMnICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSBAQ2hlY2tlZElEczsKICAgICAgICAgICAgZm9yIG15ICRJRCAoQE5ld0lEcykgewogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIElEICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIGVxICdydycgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQ2hlY2tlZElEcywgJElEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIEBOZXdJRHMgPSBAQ2hlY2tlZElEczsKICAgICAgICB9CgogICAgICAgIG15ICggJUdldFBhcmFtLCAlRXJyb3JzICk7CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KElEIE5hbWUgQ29tbWVudCBWYWxpZElEIFRlbXBsYXRlVHlwZSBQcmVTZWxlY3RlZFRpY2tldFN0YXRlSUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXsnVGVtcGxhdGUnfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgIFJhdyAgID0+IDEKICAgICAgICApIHx8ICcnOwoKICAgICAgICAjIGdldCBjb21wb3NlZCBjb250ZW50IHR5cGUKICAgICAgICAkR2V0UGFyYW17Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBWYWxpZElEIFRlbXBsYXRlVHlwZSkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3sgJE5lZWRlZCAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBhIHN0YW5kYXJkIHRlbXBsYXRlIGV4aXN0IHdpdGggdGhpcyBuYW1lCiAgICAgICAgbXkgJE5hbWVFeGlzdHMgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+TmFtZUV4aXN0c0NoZWNrKAogICAgICAgICAgICBOYW1lID0+ICRHZXRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgSUQgICA9PiAkR2V0UGFyYW17SUR9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCROYW1lRXhpc3RzKSB7CiAgICAgICAgICAgICRFcnJvcnN7TmFtZUV4aXN0c30gICAgPSAxOwogICAgICAgICAgICAkRXJyb3JzeydOYW1lSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICAgICAgbXkgJVF1ZXVlcyAgICAgPSAkUXVldWVPYmplY3QtPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17SUR9ICk7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3RQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgUXVldWVJRHMgPT4gWyBrZXlzICVRdWV1ZXMgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERlZmF1bHQgID0+ICdydycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIE5vIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZS4KICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbiBuZSAncncnICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tOb1Blcm1pc3Npb259ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgZ3JvdXAKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c0FsbCA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50TGlzdCgpOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGhhc2ggd2l0aCBzZWxlY3RlZCBxdWV1ZXMKICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c1NlbGVjdGVkID0gbWFwIHsgJF8gPT4gMSB9IEBOZXdJRHM7CgogICAgICAgICAgICAgICAgIyBjaGVjayBhbGwgdXNlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50SUQgKCBzb3J0IGtleXMgJUF0dGFjaG1lbnRzQWxsICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBY3RpdmUgPSAkQXR0YWNobWVudHNTZWxlY3RlZHskQXR0YWNobWVudElEfSA/IDEgOiAwOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBhdHRhY2htZW50IHRvIHN0YW5kYXJkIHRlbXBsYXRlIHJlbGF0aW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRJRCAgICAgICA9PiAkQXR0YWNobWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgID0+ICRBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGlmIHRoZSB1c2VyIHdvdWxkIGxpa2UgdG8gY29udGludWUgZWRpdGluZyB0aGUgdGVtcGxhdGUsIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSBlcSAnMScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249Q2hhbmdlO0lEPSRJRDtOb3RpZmljYXRpb249VXBkYXRlIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9ycywKICAgICAgICAgICAgU2VsZWN0ZWRBdHRhY2htZW50cyA9PiBcQE5ld0lEcywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICRHZXRQYXJhbXtOYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOYW1lJyApOwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWRkJywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSBATmV3SURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0lEcycgKTsKICAgICAgICBpZiAoICRTZWxmLT57TGlnaHRBZG1pbn0gKSB7CiAgICAgICAgICAgIG15IEBDaGVja2VkSURzOwogICAgICAgICAgICBmb3IgbXkgJElEIChATmV3SURzKSB7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZVBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgSUQgICAgID0+ICRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gZXEgJ3J3JyApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBDaGVja2VkSURzLCAkSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQE5ld0lEcyA9IEBDaGVja2VkSURzOwogICAgICAgIH0KCiAgICAgICAgbXkgKCAlR2V0UGFyYW0sICVFcnJvcnMgKTsKCiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KElEIE5hbWUgQ29tbWVudCBWYWxpZElEIFRlbXBsYXRlVHlwZSBQcmVTZWxlY3RlZFRpY2tldFN0YXRlSUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXsnVGVtcGxhdGUnfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgIFJhdyAgID0+IDEKICAgICAgICApIHx8ICcnOwoKICAgICAgICAjIGdldCBjb21wb3NlZCBjb250ZW50IHR5cGUKICAgICAgICAkR2V0UGFyYW17Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBWYWxpZElEIFRlbXBsYXRlVHlwZSkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3sgJE5lZWRlZCAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBhIHN0YW5kYXJkIHRlbXBsYXRlIGV4aXN0cyB3aXRoIHRoaXMgbmFtZQogICAgICAgIG15ICROYW1lRXhpc3RzID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPk5hbWVFeGlzdHNDaGVjayggTmFtZSA9PiAkR2V0UGFyYW17TmFtZX0gKTsKICAgICAgICBpZiAoJE5hbWVFeGlzdHMpIHsKICAgICAgICAgICAgJEVycm9yc3tOYW1lRXhpc3RzfSAgICA9IDE7CiAgICAgICAgICAgICRFcnJvcnN7J05hbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgdGVtcGxhdGUKICAgICAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVJRCA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlQWRkKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTdGFuZGFyZFRlbXBsYXRlSUQpIHsKCiAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNBbGwgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudExpc3QoKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBoYXNoIHdpdGggc2VsZWN0ZWQgcXVldWVzCiAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNTZWxlY3RlZCA9IG1hcCB7ICRfID0+IDEgfSBATmV3SURzOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgYWxsIHVzZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudElEICggc29ydCBrZXlzICVBdHRhY2htZW50c0FsbCApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWN0aXZlID0gJEF0dGFjaG1lbnRzU2VsZWN0ZWR7JEF0dGFjaG1lbnRJRH0gPyAxIDogMDsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgYXR0YWNobWVudCB0byBzdGFuZGFyZCB0ZW1wbGF0ZSByZWxhdGlvbgogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50SUQgICAgICAgPT4gJEF0dGFjaG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRTdGFuZGFyZFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZSAgICAgICAgICAgICA9PiAkQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPl9PdmVydmlldygpOwogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBJbmZvID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgYWRkZWQhJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblRlbXBsYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29tZXRoaW5nIGhhcyBnb25lIHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgID0+ICdBZGQnLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3JzLAogICAgICAgICAgICBTZWxlY3RlZEF0dGFjaG1lbnRzID0+IFxATmV3SURzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSAlUXVldWVzICAgICA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCggU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRJRCApOwogICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFF1ZXVlSURzID0+IFsga2V5cyAlUXVldWVzIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEZWZhdWx0ICA9PiAncncnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBObyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgdGVtcGxhdGUuCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICApOwogICAgICAgIGlmICggISREZWxldGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRGVsZXRlLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPl9PdmVydmlldygpOwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIHVwZGF0ZWQhJykgKQogICAgICAgICAgICBpZiAoICROb3RpZmljYXRpb24gJiYgJE5vdGlmaWNhdGlvbiBlcSAnVXBkYXRlJyApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX0VkaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgJFBhcmFte1ZhbGlkT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17RXJyb3JzfS0+eydWYWxpZElESW52YWxpZCd9IHx8ICcnICksCiAgICApOwoKICAgIG15ICRUZW1wbGF0ZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTdGFuZGFyZFRlbXBsYXRlOjpUeXBlcycpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgIyByZXRyaWV2ZSBhbmQgYWRkIGN1c3RvbWVyIHNwZWNpZmljIHR5cGVzCiAgICBteSAkVGVtcGxhdGVDdXN0b21lclR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTdGFuZGFyZFRlbXBsYXRlOjpDdXN0b21lclR5cGVzJyk7CiAgICAkVGVtcGxhdGVUeXBlTGlzdCA9IHsKICAgICAgICAleyAkVGVtcGxhdGVUeXBlTGlzdCAvLyB7fSB9LAogICAgICAgICV7ICRUZW1wbGF0ZUN1c3RvbWVyVHlwZUxpc3QgLy8ge30gfSwKICAgIH07CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICRQYXJhbXtUZW1wbGF0ZVR5cGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkVGVtcGxhdGVUeXBlTGlzdCwKICAgICAgICBOYW1lICAgICAgID0+ICdUZW1wbGF0ZVR5cGUnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1RlbXBsYXRlVHlwZX0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcgLiAoICRQYXJhbXtFcnJvcnN9LT57J1RlbXBsYXRlVHlwZUludmFsaWQnfSB8fCAnJyApLAogICAgKTsKCiAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CiAgICBteSAlQXR0YWNobWVudERhdGEgICAgICA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50TGlzdCggVmFsaWQgPT4gMSApOwoKICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlQXR0YWNobWVudERhdGEgKSB7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIElEICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbiBuZSAncncnICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBdHRhY2htZW50RGF0YXskS2V5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17QXR0YWNobWVudE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVBdHRhY2htZW50RGF0YSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0lEcycsCiAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICAgID0+IDYsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZWxlY3RlZEF0dGFjaG1lbnRzfSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgIG15ICRIVE1MVXRpbHNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyk7CgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyByZWZvcm1hdCBmcm9tIHBsYWluIHRvIGh0bWwKICAgICAgICBpZiAoICRQYXJhbXtDb250ZW50VHlwZX0gJiYgJFBhcmFte0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAgICAgJFBhcmFte1RlbXBsYXRlfSA9ICRIVE1MVXRpbHNPYmplY3QtPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17VGVtcGxhdGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHJlZm9ybWF0IGZyb20gaHRtbCB0byBwbGFpbgogICAgICAgIGlmICggJFBhcmFte0NvbnRlbnRUeXBlfSAmJiAkUGFyYW17Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kgKSB7CiAgICAgICAgICAgICRQYXJhbXtUZW1wbGF0ZX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtUZW1wbGF0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZGlzcGxheSB0ZW1wbGF0ZSBzdGF0ZSBwcmVzZWxlY3Rpb24KICAgICMgICBOT1RFOiB2aXNpYmlsaXR5IG9ubHkgZm9yIGZvcndhcmQgYW5kIHJlc3BvbnNlIGhhbmRsZWQgdmlhIEpTCiAgICBteSAlU3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRQYXJhbXtTdGF0ZXN9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU3RhdGVzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnUHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1ByZVNlbGVjdGVkVGlja2V0U3RhdGVJRH0sCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte0Vycm9yc30gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgYXBwcm9wcmlhdGUgbWVzc2FnZXMgZm9yIFNlcnZlckVycm9yCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Vycm9yc30tPntOYW1lRXhpc3RzfSAmJiAkUGFyYW17RXJyb3JzfS0+e05hbWVFeGlzdHN9ID09IDEgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0V4aXN0TmFtZVNlcnZlckVycm9yJyApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ05hbWVTZXJ2ZXJFcnJvcicgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25BZGQnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmlsdGVyJyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0ltcG9ydEV4cG9ydFdpZGdldCcgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyk7CiAgICBteSAlTGlzdCAgICAgICAgICAgICAgICAgICA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBWYWxpZCAgPT4gJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPyAwIDogMSwKICAgICk7CgogICAgIyBpZiB0aGVyZSBhcmUgYW55IHJlc3VsdHMsIHRoZXkgYXJlIHNob3duCiAgICBpZiAoJUxpc3QpIHsKCiAgICAgICAgbXkgJUxpc3RHZXQ7CiAgICAgICAgZm9yIG15ICRJRCAoIHNvcnQga2V5cyAlTGlzdCApIHsKICAgICAgICAgICAgJXsgJExpc3RHZXR7JElEfSB9ID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMaXN0R2V0eyRJRH0tPntTb3J0TmFtZX0gPSAkTGlzdEdldHskSUR9LT57VGVtcGxhdGVUeXBlfSAuICRMaXN0R2V0eyRJRH0tPntOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgICAgIElEOgogICAgICAgIGZvciBteSAkSUQgKCBzb3J0IHsgJExpc3RHZXR7JGF9LT57U29ydE5hbWV9IGNtcCAkTGlzdEdldHskYn0tPntTb3J0TmFtZX0gfSBrZXlzICVMaXN0R2V0ICkKICAgICAgICB7CgogICAgICAgICAgICBteSAlRGF0YSA9ICV7ICRMaXN0R2V0eyRJRH0gfTsKCiAgICAgICAgICAgICMgY2hlY2sgcXVldWUgcGVybWlzc2lvbnMgb2YgbGlua2VkIHRlbXBsYXRlcy4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICAgICAgbXkgJVF1ZXVlcyA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCggU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICREYXRhe0lEfSApOwogICAgICAgICAgICAgICAgJERhdGF7UGVybWlzc2lvbn0gPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRHMgPT4gWyBrZXlzICVRdWV1ZXMgXSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgPT4gJ3J3JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkRGF0YXtQZXJtaXNzaW9ufTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQFNlbGVjdGVkQXR0YWNobWVudDsKICAgICAgICAgICAgbXkgJVNlbGVjdGVkQXR0YWNobWVudERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpLT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJElELAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNlbGVjdGVkQXR0YWNobWVudCwgJEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb252ZXJ0IFByZVNlbGVjdGVkVGlja2V0U3RhdGVJRCB0byBzdHJpbmcKICAgICAgICAgICAgbXkgJFByZVNlbGVjdGVkVGlja2V0U3RhdGUgPSAnLSc7CiAgICAgICAgICAgIGlmICggJERhdGF7UHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVTZWxlY3RlZFRpY2tldFN0YXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJERhdGF7UHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgICAgICAgICAgICAgICA9PiAkVmFsaWRMaXN0eyAkRGF0YXtWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgIFByZVNlbGVjdGVkVGlja2V0U3RhdGUgPT4gJFByZVNlbGVjdGVkVGlja2V0U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gc2NhbGFyIEBTZWxlY3RlZEF0dGFjaG1lbnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Kernel/Output/HTML/Templates/Standard/AdminServiceTemplates.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIk1hbmFnZSBUZW1wbGF0ZS1TZXJ2aWNlIFJlbGF0aW9ucyIpIHwgaHRtbCAlXTwvaDE+CgogICAgWyUgQnJlYWRjcnVtYlBhdGggPSBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRlKCdNYW5hZ2UgVGVtcGxhdGUtU2VydmljZSBSZWxhdGlvbnMnKSwKICAgICAgICAgICAgICAgIExpbmsgPT4gRW52KCJBY3Rpb24iKSwKICAgICAgICAgICAgfSwKICAgICAgICBdCiAgICAlXQoKICAgIFslIElGIERhdGEuQnJlYWRjcnVtYlRpdGxlICVdCiAgICAgICAgICAgIFslIFVTRSBFZGl0VGl0bGUgPSBTdHJpbmcoRGF0YS5CcmVhZGNydW1iVGl0bGUpICVdCiAgICAgICAgICAgIFslIEJyZWFkY3J1bWJQYXRoLnB1c2goeyBOYW1lID0+IEVkaXRUaXRsZS5hcHBlbmQoICIgJyIsIERhdGEuTmFtZSwgIiciICkgfSkgJV0KICAgIFslIEVORCAlXQoKICAgIFslIElOQ0xVREUgIkJyZWFkY3J1bWIudHQiIFBhdGggPSBCcmVhZGNydW1iUGF0aCAlXQoKICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWw+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9sYWJlbD48L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlsdGVyIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPjxsYWJlbCBmb3I9IkZpbHRlciI+WyUgVHJhbnNsYXRlKCJGaWx0ZXIiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlciIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIikgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpbHRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWx0ZXJUZW1wbGF0ZSIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWwgZm9yPSJGaWx0ZXJUZW1wbGF0ZXMiPlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBUZW1wbGF0ZXMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyVGVtcGxhdGVzIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlclRlbXBsYXRlcyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciB0ZW1wbGF0ZXMiKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlsdGVyVGVtcGxhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWx0ZXJTZXJ2aWNlIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPjxsYWJlbCBmb3I9IkZpbHRlclNlcnZpY2VzIj5bJSBUcmFuc2xhdGUoIkZpbHRlciBmb3IgU2VydmljZXMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyU2VydmljZXMiIGNsYXNzPSJGaWx0ZXJCb3giIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIkp1c3Qgc3RhcnQgdHlwaW5nIHRvIGZpbHRlci4uLiIpIHwgaHRtbCAlXSIgbmFtZT0iRmlsdGVyU2VydmljZXMiIHZhbHVlPSIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZpbHRlciBmb3Igc2VydmljZXMiKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlsdGVyU2VydmljZSIpICVdCgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk92ZXJ2aWV3IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgTGF5b3V0R3JpZCBDb2x1bW5zV2l0aFNwYWNpbmciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2l6ZTFvZjIiPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iVGFibGVsaWtlIiBpZD0iVGVtcGxhdGVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJIZWFkZXIiPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGVzIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vVGVtcGxhdGVzRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+WyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJOb1RlbXBsYXRlc0ZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlzdDFuIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1bJSBEYXRhLlN1YmFjdGlvbiB8IHVyaSAlXTtJRD1bJSBEYXRhLklEIHwgdXJpICVdIiBjbGFzcz0iQXNCbG9jayI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlzdDFuIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTaXplMW9mMiI+CiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJsZWxpa2UiIGlkPSJTZXJ2aWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2VzIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vU2VydmljZXNGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vU2VydmljZXNGb3VuZE1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxpc3RuMSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249WyUgRGF0YS5TdWJhY3Rpb24gfCB1cmkgJV07SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSIgY2xhc3M9IkFzQmxvY2siPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkxpc3RuMSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYW5nZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5CcmVhZGNydW1iVGl0bGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIERhdGEuQWN0aW9uSG9tZSB8IHVyaSAlXTtTdWJhY3Rpb249Q2hhbmdlO1slIERhdGEuU2VydmljZSB8IHVyaSAlXUlEPVslIERhdGEuSUQgfCB1cmkgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCAiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9Im1hdHJpeCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNoYW5nZVslIERhdGEuVHlwZSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJRCIgdmFsdWU9IlslIERhdGEuSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29udGludWVBZnRlclNhdmUiIGlkPSJDb250aW51ZUFmdGVyU2F2ZSIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIFZhcmlhYmxlV2lkdGgiIGlkPSJJdGVtc1RhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoRGF0YS5WaXNpYmxlTmVUeXBlKSB8IGh0bWwgJV08L3RoPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaGFuZ2VIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iWyUgRGF0YS5NYXJrIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlNlbGVjdEFsbEl0ZW1zU2VsZWN0ZWQiIG5hbWU9Ikl0ZW1zU2VsZWN0ZWQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSBhY3RpdmUgc3RhdGUgZm9yIGFsbCIpIHwgaHRtbCAlXSIgdmFsdWU9IiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBY3RpdmUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hhbmdlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2dMaXN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iWyUgRGF0YS5Db2xTcGFuIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnTGlzdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYW5nZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblslIERhdGEuTmVUeXBlIHwgdXJpICVdO1N1YmFjdGlvbj1DaGFuZ2U7WyUgRGF0YS5TZXJ2aWNlIHwgdXJpICVdSUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iWyUgRGF0YS5NYXJrIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iSXRlbXNTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIGFjdGl2ZSBzdGF0ZSBmb3IgJXMiLCBEYXRhLk5hbWUpIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuSUQgfCBodG1sICVdIiBbJSBEYXRhLlNlbGVjdGVkICVdLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbXNBbGwiIHZhbHVlPSJbJSBEYXRhLklEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNoYW5nZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkZpbHRlck1lc3NhZ2UgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9IlN1Ym1pdEFuZENvbnRpbnVlIiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkiIGlkPSJTdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIGFuZCBmaW5pc2giKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDaGFuZ2UiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3IikgJV0K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerTicketMessage.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAyYzFkYmIyYzZjMjg1ZGNjMTRlYjdmMmMzYTdjZjQzZDVmOTkzYWMyIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9DdXN0b21lclRpY2tldE1lc3NhZ2UudHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQo8ZGl2IGlkPSJvb29Db250ZW50IiBjbGFzcz0iQVJJQVJvbGVNYWluIFRpY2tldENvbXBvc2UiPgogICAgPGRpdiBpZD0ib29vSGVhZGVyIj4KICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJDcmVhdGUgYSBuZXcgVGlja2V0IikgfCBodG1sICVdPC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ib29vTWFpbkJveCIgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIiBpZD0iTmV3Q3VzdG9tZXJUaWNrZXQiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZCIgaWQ9IkV4cGFuZCIgdmFsdWU9IiIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGcm9tQ2hhdElEIiB2YWx1ZT0iWyUgRGF0YS5Gcm9tQ2hhdElEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJNb2R1bGFyRm9ybSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBc3Rlcmlza0V4cGxhbmF0aW9uIikgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfVGl0bGVDYXRlZ29yeSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdWyUgRGF0YS5IaWRkZW5DbGFzcyB8IGh0bWwgJV0iIFslIERhdGEuSGlkZGVuU3R5bGUgfCBodG1sICVdPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICBbJSBJRiBEYXRhLlRvb2x0aXAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVG9vbHRpcCBvb29Ub29sdGlwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1oZWxwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBEYXRhLlRvb2x0aXAgfCBodG1sIHwgaHRtbF9saW5lX2JyZWFrICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlQ2F0ZWdvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0VHlwZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlR5cGVJRCIgY2xhc3M9Ik1hbmRhdG9yeSI+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2VbJSBEYXRhLlR5cGVJREludmFsaWQgfCBodG1sICVdIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0VHlwZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgIFslIElGIERhdGEuU2VydmljZU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiIGNsYXNzPSJNYW5kYXRvcnkiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPjwvbGFiZWw+CiAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICBbJSBFTkQgJV0KICAgIFslIElGIERhdGEuU2VydmljZU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNlcnZpY2UiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0U0xBIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgSUYgRGF0YS5TTEFNYW5kYXRvcnkgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU0xBSUQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgbGV2ZWwgYWdyZWVtZW50IikgfCBodG1sICVdIiBjbGFzcz0iTWFuZGF0b3J5Ij5bJSBUcmFuc2xhdGUoIlNMQSIpIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiA8L2xhYmVsPgogICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBsZXZlbCBhZ3JlZW1lbnQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICBbJSBFTkQgJV0KICAgIFslIElGIERhdGEuU0xBTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNMQSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJRdWV1ZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVG9TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZXN0IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVG8iKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuUXVldWVJbnZhbGlkIHwgaHRtbCAlXSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlF1ZXVlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZUR5bmFtaWNGaWVsZHMiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgSUYgRGF0YS5Ub29sdGlwICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlRvb2x0aXAgb29vVG9vbHRpcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0ib29vZm8gb29vZm8taGVscCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKERhdGEuVG9vbHRpcCkgfCBodG1sIHwgaHRtbF9saW5lX2JyZWFrICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlRHluYW1pY0ZpZWxkcyIpICVdCgpbJSBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZU1lc3NhZ2UiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgSUYgRGF0YS5Ub29sdGlwICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlRvb2x0aXAgb29vVG9vbHRpcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0ib29vZm8gb29vZm8taGVscCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKERhdGEuVG9vbHRpcCkgfCBodG1sIHwgaHRtbF9saW5lX2JyZWFrICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlTWVzc2FnZSIpICVdCgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFslIERhdGEuU3ViamVjdEhpZGRlbkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV0iIHR5cGU9InRleHQiIGlkPSJTdWJqZWN0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuU3ViamVjdFZhbGlkYXRlIHwgaHRtbCAlXSBbJSBEYXRhLlN1YmplY3RJbnZhbGlkIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN1YmplY3QiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2VbJSBEYXRhLlN1YmplY3RJbnZhbGlkIHwgaHRtbCAlXSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhbmRhcmRUZW1wbGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YW5kYXJkVGVtcGxhdGVJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTmV3IHRpY2tldCB0ZW1wbGF0ZSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJUZXh0IFRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlNldHRpbmcgYSB0ZW1wbGF0ZSB3aWxsIG92ZXJ3cml0ZSBhbnkgdGV4dCBvciBhdHRhY2htZW50LiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBbJSBEYXRhLkJvZHlIaWRkZW5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFJpY2hUZXh0RmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRIb2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIGNsYXNzPSJSaWNoVGV4dCBbJSBEYXRhLkJvZHlWYWxpZGF0ZSB8IGh0bWwgJV0gWyUgRGF0YS5Cb2R5SW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IkJvZHkiIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuQm9keUludmFsaWQgfCBodG1sICVdIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJpY2hUZXh0IiBjbGFzcz0iTWFuZGF0b3J5Ij5bJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFslIERhdGEuQXR0YWNobWVudHNIaWRkZW5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im9vb0F0dGFjaG1lbnRzIiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRG5EVXBsb2FkQm94Ij4KWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0N1c3RvbWVyQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlByaW9yaXR5SUQiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQcmlvcml0eSIpICVdCgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8ZGl2IGlkPSJCb3R0b21BY3Rpb25Sb3ciIGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0ic3VibWl0UmljaFRleHQiIGNsYXNzPSJvb29MIiBhY2Nlc3NrZXk9ImciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerTicketZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiNDhiYzU5MWMwYjllNjM0NzFmM2Q1YzQ1NTRiM2ZmNDkwNzViNWJhIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9DdXN0b21lclRpY2tldFpvb20udHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBpZD0nb29vQ29udGVudCcgY2xhc3M9IlRpY2tldFpvb20gQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgaWQ9J29vb0hlYWRlcidbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXSBjbGFzcz0ib29vVGlja2V0SW5mb1Blcm1hbmVudCJbJSBFTkQgJV0+CiAgICAgICAgPGRpdiBjbGFzcz0nb29vV2l0aFN1Yic+CiAgICAgICAgICAgIDxoMiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPHAgY2xhc3M9Im9vbzEyZyIgdGl0bGU9IlslIENvbmZpZygnVGlja2V0OjpIb29rJykgJV1bJSBDb25maWcoJ1RpY2tldDo6SG9va0RpdmlkZXInKSAlXVslIERhdGEuVGlja2V0TnVtYmVyIHwgaHRtbCAlXSI+WyUgRGF0YS5Ib29rICVdWyUgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgJV1bJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV08L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0nb29vQXZhdGFyJz4KICAgICAgICAgICAgWyUgSUYgRGF0YS5BdmF0YXIgJV0KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJbJSBEYXRhLkF2YXRhciAlXSIgLz4KICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkluaXRpYWxzIj5bJSBEYXRhLlVzZXJJbml0aWFscyB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwIGNsYXNzPSdvb28xMic+WyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV08L3A+ClslIElGIERhdGEuVGlja2V0SW5mb0Rpc3BsYXlUeXBlID09ICdIZWFkZXInICVdCiAgICAgICAgPGRpdiBjbGFzcz0nb29vSW5mb0Jsb2NrJz4KICAgICAgICAgICAgPHAgY2xhc3M9J29vb0luZm8gb29vMTInPjxpIGNsYXNzPSJvb29mbyBvb29mby1pbmZvIj48L2k+IDxzcGFuPlslIFRyYW5zbGF0ZSgnSW5mb3JtYXRpb24nKSB8IGh0bWwgJV08L3NwYW4+PC9wPgogICAgICAgICAgICBbJSBJTkNMVURFICJDdXN0b21lclRpY2tldFpvb20vVGlja2V0SW5mby50dCIgJV0KICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgPGRpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVwbHlCdXR0b24iKSAlXQogICAgICAgIDxidXR0b24gaWQ9IlJlcGx5QnV0dG9uIiBjbGFzcz0iRG9udFByaW50IG9vb00iPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVwbHkiKSB8IGh0bWwgJV0gPC9zcGFuPjxpIGNsYXNzPSJvb29mbyBvb29mby1hcnJvd19yMiI+PC9pPjwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVwbHlCdXR0b24iKSAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1tb3JlX3YiPjwvaT4KICAgICAgICA8ZGl2IGlkPSdvb29DYXRlZ29yaWVzJz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2F0ZWdvcmllcyIpICVdCiAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLkxpbmsgJV0KICAgICAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLlRyYW5zbGF0ZSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJvb29DYXRlZ29yeSBvb28xMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6WyUgRGF0YS5Db2xvciB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuQ29uZmlnLkxpbmsgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBJRiBEYXRhLkNvbmZpZy5QcmVmaXggJV1bJSBEYXRhLkNvbmZpZy5QcmVmaXggfCBodG1sICVdWyUgRU5EICVdWyUgRGF0YS5UZXh0IHwgSW50ZXJwb2xhdGUgfCBUcmFuc2xhdGUgfCBodG1sICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgSUYgRGF0YS5Db25maWcuUHJlZml4ICVdWyUgRGF0YS5Db25maWcuUHJlZml4IHwgaHRtbCAlXVslIEVORCAlXVslIERhdGEuVGV4dCB8IEludGVycG9sYXRlIHwgVHJhbnNsYXRlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ib29vQ2F0ZWdvcnkgb29vMTAiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOlslIERhdGEuQ29sb3IgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkNvbmZpZy5MaW5rIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdIiB0aXRsZT0iWyUgSUYgRGF0YS5Db25maWcuUHJlZml4ICVdWyUgRGF0YS5Db25maWcuUHJlZml4IHwgaHRtbCAlXVslIEVORCAlXVslIERhdGEuVGV4dCB8IEludGVycG9sYXRlIHwgaHRtbCAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db25maWcuVHJhbnNsYXRlICVdCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Im9vb0NhdGVnb3J5IG9vbzEwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXSIgdGl0bGU9IlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IFRyYW5zbGF0ZSB8IGh0bWwgJV0iPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IFRyYW5zbGF0ZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Im9vb0NhdGVnb3J5IG9vbzEwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXSIgdGl0bGU9IlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDYXRlZ29yaWVzIikgJV0KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0nb29vTWFpbkJveCcgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9IlByb2Nlc3NBY3Rpdml0aWVzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTmV4dEFjdGl2aXRpZXMiKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJOZXh0QWN0aXZpdGllcyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGl2aXR5RGlhbG9nRGlyZWN0U3VibWl0IikgJV0KICAgICAgICAgICAgICAgIDxmb3JtIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSB8IGh0bWwgJV0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQ3VzdG9tZXJUaWNrZXRab29tIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVBY3Rpdml0eURpYWxvZyIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcm9jZXNzRW50aXR5SUQiIHZhbHVlPSJbJSBEYXRhLlByb2Nlc3NFbnRpdHlJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpdml0eURpYWxvZ0VudGl0eUlEIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IkJ1dHRvbl9bJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iIGNsYXNzPSJvb29NIEFjdGl2aXR5U3VibWl0QnV0dG9uIiB0eXBlPSJzdWJtaXQiPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9mb3JtPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aXZpdHlEaWFsb2dEaXJlY3RTdWJtaXQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJCdXR0b25fWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIiBjbGFzcz0ib29vTSBBY3Rpdml0eVN0YXJ0QnV0dG9uIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGl2aXR5RGlhbG9nIikgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOZXh0QWN0aXZpdGllcyIpICVdCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHVsIGlkPSdvb29BcnRpY2xlTGlzdCdbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXSBjbGFzcz0ib29vVGlja2V0SW5mb1Blcm1hbmVudCJbJSBFTkQgJV0+CiAgICAgICAgPC91bD4KICAgICAgICA8dWwgaWQ9J29vb0FydGljbGVMaXN0RXhwYW5kZWQnWyUgSUYgRGF0YS5UaWNrZXRJbmZvRGlzcGxheVR5cGUgPT0gJ1Blcm1hbmVudCcgJV0gY2xhc3M9Im9vb1RpY2tldEluZm9QZXJtYW5lbnQiWyUgRU5EICVdPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzQWN0aXZpdHkiKSAlXQogICAgICAgICAgICA8bGkgaWQ9IlByb2Nlc3NfWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgdXJpICVdIiBjbGFzcz0iQWN0aXZpdHkiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5BY3Rpdml0eUhUTUwgJV0KICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NBY3Rpdml0eSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwIikgJV0KPGxpIGlkPSJGb2xsb3dVcCIgY2xhc3M9IlslIERhdGEuRm9sbG93VXBWaXNpYmxlIHwgaHRtbCAlXSBBY3Rpdml0eSI+CiAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0jRm9sbG93VXAiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9IlJlcGx5Q3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lclRpY2tldFpvb20iIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIiAvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZyb21DaGF0SUQiIHZhbHVlPSJbJSBEYXRhLkZyb21DaGF0SUQgfCBodG1sICVdIiAvPgoKICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzZW5nZXIiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCiAgICAgICAgICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9Ik1vZHVsYXJGb3JtIERvbnRQcmludCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZU1lc3NhZ2UiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlRvb2x0aXAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlRvb2x0aXAgb29vVG9vbHRpcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLWhlbHAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKERhdGEuVG9vbHRpcCkgfCBodG1sIHwgaHRtbF9saW5lX2JyZWFrICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9UaXRsZU1lc3NhZ2UiKSAlXQoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJEb250UHJpbnQiIHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIGlkPSJTdWJqZWN0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN1YmplY3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YW5kYXJkVGVtcGxhdGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGFuZGFyZFRlbXBsYXRlSUQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk5ldyB0aWNrZXQgdGVtcGxhdGUiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiVGV4dCBUZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJTZXR0aW5nIGEgdGVtcGxhdGUgd2lsbCBvdmVyd3JpdGUgYW55IHRleHQgb3IgYXR0YWNobWVudC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQojIEVPIEN1c3RvbWVyVGVtcGxhdGUKCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFJpY2hUZXh0RmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRIb2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZXBseSIpIHwgaHRtbCAlXSIgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgRG9udFByaW50IFZhbGlkYXRlX1JlcXVpcmVkUmljaFRleHQgWyUgRGF0YS5SaWNoVGV4dEludmFsaWQgfCBodG1sICVdIiBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSB8IGh0bWwgJV0iPlslIERhdGEuQm9keSB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJpY2hUZXh0IiBjbGFzcz0iTWFuZGF0b3J5Ij5bJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJvb29BdHRhY2htZW50cyIgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkRuRFVwbG9hZEJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0N1c3RvbWVyQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZUNhdGVnb3J5IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV1bJSBEYXRhLkhpZGRlbkNsYXNzIHwgaHRtbCAlXSIgWyUgRGF0YS5IaWRkZW5TdHlsZSB8IGh0bWwgJV0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Ub29sdGlwICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJUb29sdGlwIG9vb1Rvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1oZWxwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZShEYXRhLlRvb2x0aXApIHwgaHRtbCB8IGh0bWxfbGluZV9icmVhayAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfVGl0bGVDYXRlZ29yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcFN0YXRlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OZXh0U3RhdGVzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhdGVJRCI+WyUgVHJhbnNsYXRlKCJOZXh0IHN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwU3RhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcFByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlByaW9yaXR5SUQiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBQcmlvcml0eSIpICVdCgpbJSBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KCiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IkNsb3NlQnV0dG9uIG9vb1hTIj5bJSBUcmFuc2xhdGUoIkRpc2NhcmQiKSB8IGh0bWwgJV08L2J1dHRvbj48YnV0dG9uIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIiBjbGFzcz0ib29vWFMiPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9mb3JtPgo8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXAiKSAlXQpbJSBJRiBEYXRhLk5vQXJ0aWNsZXMgJV0KICAgICAgICAgICAgPGxpIGNsYXNzPSdFbXB0eU1lc3NhZ2UnPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGl0ZW0gaGFzIG5vIGFydGljbGVzIHlldC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9saT4KWyUgRUxTRSAlXQogICAgICAgICAgICBbJSBEYXRhLkFydGljbGVzICVdClslIEVORCAlXQogICAgICAgIDwvdWw+ClslIElGIERhdGEuVGlja2V0SW5mb0Rpc3BsYXlUeXBlID09ICdQZXJtYW5lbnQnICVdCiAgICAgICAgICAgIFslIElOQ0xVREUgIkN1c3RvbWVyVGlja2V0Wm9vbS9UaWNrZXRJbmZvLnR0IiAlXQpbJSBFTkQgJV0KICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/System/Service.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA1YWE0ODUyNzEzZWU0YjM4NDU4OTE2ODJmNDM4NTkzOWZkMDg2NTQ2IC0gS2VybmVsL1N5c3RlbS9TZXJ2aWNlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgKHF3KDphbGwpKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUcmFuc2xhdGlvbnMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UgLSBzZXJ2aWNlIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgc2VydmljZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnU2VydmljZSc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKCiAgICAjIGxvYWQgZ2VuZXJhdG9yIHByZWZlcmVuY2VzIG1vZHVsZQogICAgbXkgJEdlbmVyYXRvck1vZHVsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2VydmljZTo6UHJlZmVyZW5jZXNNb2R1bGUnKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZTo6UHJlZmVyZW5jZXNEQic7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJEdlbmVyYXRvck1vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0gPSAkR2VuZXJhdG9yTW9kdWxlLT5uZXcoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBTZXJ2aWNlTGlzdCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2Ygc2VydmljZXMKCiAgICBteSAlU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3QoCiAgICAgICAgVmFsaWQgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgcmVhZCBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ1NlcnZpY2VMaXN0OjpWYWxpZDo6JyAuICRQYXJhbXtWYWxpZH07CgogICAgaWYgKCAkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQgJFBhcmFte0tlZXBDaGlsZHJlbn0gJiYgJFBhcmFte0tlZXBDaGlsZHJlbn0gZXEgJzEnICkgewogICAgICAgICRDYWNoZUtleSAuPSAnOjpLZWVwQ2hpbGRyZW46OicgLiAkUGFyYW17S2VlcENoaWxkcmVufTsKICAgIH0KCiAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCB2YWxpZF9pZCBGUk9NIHNlcnZpY2UnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZXJ2aWNlTGlzdDsKICAgIG15ICVTZXJ2aWNlVmFsaWRMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlcnZpY2VMaXN0eyAkUm93WzBdIH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VWYWxpZExpc3R7ICRSb3dbMF0gfSA9ICRSb3dbMl07CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlU2VydmljZUxpc3QsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJVNlcnZpY2VMaXN0IGlmICEkUGFyYW17VmFsaWR9OwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGlkcwogICAgbXkgQFZhbGlkSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgIyBkdXBsaWNhdGUgc2VydmljZSBsaXN0CiAgICBteSAlU2VydmljZUxpc3RUbXAgPSAlU2VydmljZUxpc3Q7CgogICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlTGlzdFRtcCApIHsKICAgICAgICAkU2VydmljZUxpc3RUbXB7JFNlcnZpY2VJRH0gLj0gJzo6JzsKICAgIH0KCiAgICBteSAlU2VydmljZUludmFsaWRMaXN0OwogICAgU0VSVklDRUlEOgogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IHsgJFNlcnZpY2VMaXN0VG1weyRhfSBjbXAgJFNlcnZpY2VMaXN0VG1weyRifSB9IGtleXMgJVNlcnZpY2VMaXN0VG1wICkKICAgIHsKCiAgICAgICAgbXkgJFZhbGlkID0gc2NhbGFyIGdyZXAgeyAkXyBlcSAkU2VydmljZVZhbGlkTGlzdHskU2VydmljZUlEfSB9IEBWYWxpZElEczsKCiAgICAgICAgbmV4dCBTRVJWSUNFSUQgaWYgJFZhbGlkOwoKICAgICAgICAkU2VydmljZUludmFsaWRMaXN0eyAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0gfSA9IDE7CiAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfTsKICAgIH0KCiAgICAjIGRlbGV0ZSBpbnZhbGlkIHNlcnZpY2VzIGFuZCBjaGlsZHJlbgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17S2VlcENoaWxkcmVufSB8fCAhJFBhcmFte0tlZXBDaGlsZHJlbn0gKSB7CiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJVNlcnZpY2VMaXN0ICkgewoKICAgICAgICAgICAgSU5WQUxJRE5BTUU6CiAgICAgICAgICAgIGZvciBteSAkSW52YWxpZE5hbWUgKCBzb3J0IGtleXMgJVNlcnZpY2VJbnZhbGlkTGlzdCApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSA9fiBteyBcQSBcUSRJbnZhbGlkTmFtZVxFIDo6IH14bXMgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IElOVkFMSUROQU1FOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICk7CgogICAgcmV0dXJuICVTZXJ2aWNlTGlzdDsKfQoKPWhlYWQyIFNlcnZpY2VMaXN0R2V0KCkKCnJldHVybiBhIGxpc3Qgb2Ygc2VydmljZXMgd2l0aCB0aGUgY29tcGxldGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciBlYWNoIHNlcnZpY2UKCiAgICBteSAkU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RHZXQoCiAgICAgICAgVmFsaWQgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm5zCgogICAgJFNlcnZpY2VMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgU2VydmljZUlEICA9PiAxLAogICAgICAgICAgICBQYXJlbnRJRCAgID0+IDAsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ015U2VydmljZScsCiAgICAgICAgICAgIE5hbWVTaG9ydCAgPT4gJ015U2VydmljZScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnU29tZSBDb21tZW50JwogICAgICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDExLTAyLTA4IDE1OjA4OjAwJywKICAgICAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAxMS0wNi0xMSAxNzoyMjowMCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBTZXJ2aWNlSUQgID0+IDIsCiAgICAgICAgICAgIFBhcmVudElEICAgPT4gMSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTXlTZXJ2aWNlOjpNeVN1YlNlcnZpY2UnLAogICAgICAgICAgICBOYW1lU2hvcnQgID0+ICdNeVN1YlNlcnZpY2UnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ1NvbWUgQ29tbWVudCcKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAxMS0wMi0wOCAxNTowODowMCcsCiAgICAgICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMTEtMDYtMTEgMTc6MjI6MDAnLAogICAgICAgICAgICBDcmVhdGVCeSAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgPT4gMSwKICAgICAgICB9LAogICAgICAgICMgLi4uCiAgICBdOwoKPWN1dAoKc3ViIFNlcnZpY2VMaXN0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIHBhcmFtCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZWQgcmVzdWx0cwogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTGlzdEdldDo6VmFsaWQ6OicgLiAkUGFyYW17VmFsaWR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmIGRlZmluZWQgJENhY2hlOwoKICAgICMgY3JlYXRlIFNRTCBxdWVyeQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiAgICAgICAgLiAnRlJPTSBzZXJ2aWNlJzsKCiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFNRTCAuPSAnIFdIRVJFIHZhbGlkX2lkIElOICgnIC4gam9pbiAnLCAnLAogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSAuICcpJzsKICAgIH0KCiAgICAkU1FMIC49ICcgT1JERVIgQlkgbmFtZSc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAkU1FMLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBTZXJ2aWNlTGlzdDsKICAgIG15ICVTZXJ2aWNlTmFtZTJJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVTZXJ2aWNlRGF0YTsKICAgICAgICAkU2VydmljZURhdGF7U2VydmljZUlEfSAgPSAkUm93WzBdOwogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1syXTsKICAgICAgICAkU2VydmljZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s1XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbN107CgogICAgICAgICMgYWRkIHNlcnZpY2UgZGF0YSB0byBzZXJ2aWNlIGxpc3QKICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgXCVTZXJ2aWNlRGF0YTsKCiAgICAgICAgIyBidWlsZCBzZXJ2aWNlIGlkIGxvb2t1cCBoYXNoCiAgICAgICAgJFNlcnZpY2VOYW1lMklEeyAkU2VydmljZURhdGF7TmFtZX0gfSA9ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9OwogICAgfQoKICAgIGZvciBteSAkU2VydmljZURhdGEgKEBTZXJ2aWNlTGlzdCkgewoKICAgICAgICAjIGNyZWF0ZSBzaG9ydCBuYW1lIGFuZCBwYXJlbnQgaWQKICAgICAgICAkU2VydmljZURhdGEtPntOYW1lU2hvcnR9ID0gJFNlcnZpY2VEYXRhLT57TmFtZX07CiAgICAgICAgaWYgKCAkU2VydmljZURhdGEtPntOYW1lfSA9fiBteyBcQSAoLiopIDo6ICguKz8pIFx6IH14bXMgKSB7CiAgICAgICAgICAgIG15ICRQYXJlbnROYW1lID0gJDE7CiAgICAgICAgICAgICRTZXJ2aWNlRGF0YS0+e05hbWVTaG9ydH0gPSAkMjsKICAgICAgICAgICAgJFNlcnZpY2VEYXRhLT57UGFyZW50SUR9ICA9ICRTZXJ2aWNlTmFtZTJJRHskUGFyZW50TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZXJ2aWNlIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPlNlcnZpY2VQcmVmZXJlbmNlc0dldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlRGF0YS0+e1NlcnZpY2VJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBtZXJnZSBoYXNoCiAgICAgICAgaWYgKCVQcmVmZXJlbmNlcykgewogICAgICAgICAgICAleyRTZXJ2aWNlRGF0YX0gPSAoICV7JFNlcnZpY2VEYXRhfSwgJVByZWZlcmVuY2VzICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChAU2VydmljZUxpc3QpIHsKCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFxAU2VydmljZUxpc3QsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXEBTZXJ2aWNlTGlzdDsKfQoKPWhlYWQyIFNlcnZpY2VHZXQoKQoKcmV0dXJuIGEgc2VydmljZSBhcyBoYXNoCgpSZXR1cm4KICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9CiAgICAkU2VydmljZURhdGF7UGFyZW50SUR9CiAgICAkU2VydmljZURhdGF7TmFtZX0KICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9CiAgICAkU2VydmljZURhdGF7VmFsaWRJRH0KICAgICRTZXJ2aWNlRGF0YXtDb21tZW50fQogICAgJFNlcnZpY2VEYXRhe0NyZWF0ZVRpbWV9CiAgICAkU2VydmljZURhdGF7Q3JlYXRlQnl9CiAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0KICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0KCiAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICBOYW1lICAgID0+ICdTZXJ2aWNlOjpTdWJTZXJ2aWNlJywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZWl0aGVyIFNlcnZpY2VJRCBvciBOYW1lIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17U2VydmljZUlEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTZXJ2aWNlSUQgb3IgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBTZXJ2aWNlSUQgYW5kIE5hbWUgYXJlIGdpdmVuCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICYmICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFNlcnZpY2VJRCBPUiBOYW1lIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB0aGUgU2VydmljZUlECiAgICBpZiAoICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkUGFyYW17U2VydmljZUlEfSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGVkIHJlc3VsdHMKICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6U2VydmljZUdldDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJXskQ2FjaGV9IGlmIHJlZiAkQ2FjaGUgZXEgJ0hBU0gnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgc2VydmljZSBmcm9tIGRiCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiAgICAgICAgICAgIC4gJ0ZST00gc2VydmljZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU2VydmljZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VydmljZURhdGF7U2VydmljZUlEfSAgPSAkUm93WzBdOwogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1syXTsKICAgICAgICAkU2VydmljZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s1XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbN107CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlCiAgICBpZiAoICEkU2VydmljZURhdGF7U2VydmljZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggU2VydmljZUlEICgkUGFyYW17U2VydmljZUlEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzaG9ydCBuYW1lIGFuZCBwYXJlbnQgaWQKICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9ID0gJFNlcnZpY2VEYXRhe05hbWV9OwogICAgaWYgKCAkU2VydmljZURhdGF7TmFtZX0gPX4gbXsgXEEgKC4qKSA6OiAoLis/KSBceiB9eG1zICkgewogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9ID0gJDI7CgogICAgICAgICMgbG9va3VwIHBhcmVudAogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkMSwKICAgICAgICApOwogICAgICAgICRTZXJ2aWNlRGF0YXtQYXJlbnRJRH0gPSAkU2VydmljZUlEOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT5TZXJ2aWNlUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgKTsKCiAgICAjIG1lcmdlIGhhc2gKICAgIGlmICglUHJlZmVyZW5jZXMpIHsKICAgICAgICAlU2VydmljZURhdGEgPSAoICVTZXJ2aWNlRGF0YSwgJVByZWZlcmVuY2VzICk7CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJVNlcnZpY2VEYXRhLAogICAgKTsKCiAgICByZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZDIgU2VydmljZUxvb2t1cCgpCgpyZXR1cm4gYSBzZXJ2aWNlIG5hbWUgYW5kIGlkCgogICAgbXkgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICBteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgTmFtZSA9PiAnU2VydmljZTo6U3ViU2VydmljZScsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2VydmljZUlEIG9yIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTG9va3VwOjpJRDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgZGVmaW5lZCAkQ2FjaGU7CgogICAgICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGxvb2t1cAogICAgICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBuYW1lIEZST00gc2VydmljZSBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17U2VydmljZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRSZXN1bHQgPSAnJzsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFJlc3VsdCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+ICRSZXN1bHQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRSZXN1bHQ7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6U2VydmljZUxvb2t1cDo6TmFtZTo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmIGRlZmluZWQgJENhY2hlOwoKICAgICAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBsb29rdXAKICAgICAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlc3VsdCA9ICcnOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkUmVzdWx0ID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gJFJlc3VsdCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFJlc3VsdDsKICAgIH0KfQoKPWhlYWQyIFNlcnZpY2VBZGQoKQoKYWRkIGEgc2VydmljZQoKICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICBOYW1lICAgICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICBQYXJlbnRJRCA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBDb21tZW50ICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgY29tbWVudAogICAgJFBhcmFte0NvbW1lbnR9IHx8PSAnJzsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIG5hbWUKICAgIGlmICggJFBhcmFte05hbWV9ID1+IG17IDo6IH14bXMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBhZGQgc2VydmljZSEgSW52YWxpZCBTZXJ2aWNlIG5hbWUgJyRQYXJhbXtOYW1lfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBmdWxsIG5hbWUKICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyYW17TmFtZX07CgogICAgIyBnZXQgcGFyZW50IG5hbWUKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAkUGFyZW50TmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICApOwogICAgICAgIGlmICgkUGFyZW50TmFtZSkgewogICAgICAgICAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFBhcmVudE5hbWUgLiAnOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZmluZCBleGlzdGluZyBzZXJ2aWNlCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtGdWxsTmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkRXhpc3RzOwogICAgd2hpbGUgKCAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRXhpc3RzID0gMTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIHRvIGRhdGFiYXNlCiAgICBpZiAoJEV4aXN0cykgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQSBzZXJ2aWNlIHdpdGggdGhlIG5hbWUgYW5kIHBhcmVudCAnJFBhcmFte0Z1bGxOYW1lfScgYWxyZWFkeSBleGlzdHMuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlICcKICAgICAgICAgICAgLiAnKG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0Z1bGxOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBzZXJ2aWNlIGlkCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtGdWxsTmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIG15ICRTZXJ2aWNlSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VydmljZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgbXkgJVNlcnZpY2VzID0gJFNlbGYtPlNlcnZpY2VMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBjaGFpbmVkIHRyYW5zbGF0aW9ucyBhdXRvbWF0aWNhbGx5CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHJhbnNsYXRpb25zJyktPlRyYW5zbGF0ZVBhcmVudENoaWxkRWxlbWVudHMoCiAgICAgICAgU3RyaW5ncyA9PiBbIHZhbHVlcyAlU2VydmljZXMgXSwKICAgICk7CgogICAgcmV0dXJuICRTZXJ2aWNlSUQ7Cn0KCj1oZWFkMiBTZXJ2aWNlVXBkYXRlKCkKCnVwZGF0ZSBhbiBleGlzdGluZyBzZXJ2aWNlCgogICAgbXkgJFRydWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVVwZGF0ZSgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFBhcmVudElEICA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSAgICAgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgIENvbW1lbnQgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNlcnZpY2VJRCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGNvbW1lbnQKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgc2VydmljZSBuYW1lCiAgICBpZiAoICRQYXJhbXtOYW1lfSA9fiBteyA6OiB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIHNlcnZpY2UhIEludmFsaWQgU2VydmljZSBuYW1lICckUGFyYW17TmFtZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2xkIG5hbWUgb2Ygc2VydmljZQogICAgbXkgJE9sZFNlcnZpY2VOYW1lID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgKTsKCiAgICBpZiAoICEkT2xkU2VydmljZU5hbWUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgc2VydmljZSEgU2VydmljZSAnJFBhcmFte1NlcnZpY2VJRH0nIGRvZXMgbm90IGV4aXN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgZnVsbCBuYW1lCiAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFBhcmFte05hbWV9OwoKICAgICMgZ2V0IHBhcmVudCBuYW1lCiAgICBpZiAoICRQYXJhbXtQYXJlbnRJRH0gKSB7CgogICAgICAgICMgbG9va3VwIHNlcnZpY2UKICAgICAgICBteSAkUGFyZW50TmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFBhcmVudE5hbWUpIHsKICAgICAgICAgICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJlbnROYW1lIC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2ssIGlmIHNlbGVjdGVkIHBhcmVudCB3YXMgYSBjaGlsZCBvZiB0aGlzIHNlcnZpY2UKICAgICAgICBpZiAoICRQYXJhbXtGdWxsTmFtZX0gPX4gbXsgXEEgKCBcUSRPbGRTZXJ2aWNlTmFtZVxFICkgOjogfXhtcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NhblwndCB1cGRhdGUgc2VydmljZSEgSW52YWxpZCBwYXJlbnQgd2FzIHNlbGVjdGVkLicKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZmluZCBleGlzdHMgc2VydmljZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17RnVsbE5hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICBteSAkRXhpc3RzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkRXhpc3RzID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyB1cGRhdGUgc2VydmljZQogICAgaWYgKCRFeGlzdHMpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgc2VydmljZSB3aXRoIHRoZSBuYW1lIGFuZCBwYXJlbnQgJyRQYXJhbXtGdWxsTmFtZX0nIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CgogICAgfQoKICAgICMgdXBkYXRlIHNlcnZpY2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBzZXJ2aWNlIFNFVCBuYW1lID0gPywgdmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sICcKICAgICAgICAgICAgLiAnIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtGdWxsTmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgICBcJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgbXkgJExpa2VTZXJ2aWNlID0gJERCT2JqZWN0LT5RdW90ZSggJE9sZFNlcnZpY2VOYW1lLCAnTGlrZScgKSAuICc6OiUnOwoKICAgICMgZmluZCBhbGwgY2hpbGRyZW4KICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgTElLRSA/IiwKICAgICAgICBCaW5kID0+IFsgXCRMaWtlU2VydmljZSBdLAogICAgKTsKCiAgICBteSBAQ2hpbGRzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJUNoaWxkOwogICAgICAgICRDaGlsZHtTZXJ2aWNlSUR9ID0gJFJvd1swXTsKICAgICAgICAkQ2hpbGR7TmFtZX0gICAgICA9ICRSb3dbMV07CiAgICAgICAgcHVzaCBAQ2hpbGRzLCBcJUNoaWxkOwogICAgfQoKICAgICMgdXBkYXRlIGNoaWxkcmVuCiAgICBmb3IgbXkgJENoaWxkIChAQ2hpbGRzKSB7CiAgICAgICAgJENoaWxkLT57TmFtZX0gPX4gc3sgXEEgKCBcUSRPbGRTZXJ2aWNlTmFtZVxFICkgOjogfXskUGFyYW17RnVsbE5hbWV9Ojp9eG1zOwogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ1VQREFURSBzZXJ2aWNlIFNFVCBuYW1lID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDaGlsZC0+e05hbWV9LCBcJENoaWxkLT57U2VydmljZUlEfSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIG15ICVTZXJ2aWNlcyA9ICRTZWxmLT5TZXJ2aWNlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2VuZXJhdGUgY2hhaW5lZCB0cmFuc2xhdGlvbnMgYXV0b21hdGljYWxseQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRyYW5zbGF0aW9ucycpLT5UcmFuc2xhdGVQYXJlbnRDaGlsZEVsZW1lbnRzKAogICAgICAgIFN0cmluZ3MgPT4gWyB2YWx1ZXMgJVNlcnZpY2VzIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU2VydmljZVNlYXJjaCgpCgpyZXR1cm4gc2VydmljZSBpZHMgYXMgYW4gYXJyYXkKCiAgICBteSBAU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVNlYXJjaCgKICAgICAgICBOYW1lICAgPT4gJ1NlcnZpY2UgTmFtZScsICMgKG9wdGlvbmFsKQogICAgICAgIExpbWl0ICA9PiAxMjIsICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMTAwMAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGxpbWl0CiAgICAkUGFyYW17TGltaXR9IHx8PSAxMDAwOwoKICAgICMgY3JlYXRlIHNxbCBxdWVyeQogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIHZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkpfSApIjsKICAgIG15IEBCaW5kOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TmFtZX0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17TmFtZX0sICdMaWtlJyApOwoKICAgICAgICAjIHJlcGxhY2UgKiB3aXRoICUgYW5kIGNsZWFuIHRoZSBzdHJpbmcKICAgICAgICAkUGFyYW17TmFtZX0gPX4gc3sgXCorIH17JX14bXNnOwogICAgICAgICRQYXJhbXtOYW1lfSA9fiBzeyAlKyB9eyV9eG1zZzsKICAgICAgICBteSAkTGlrZVN0cmluZyA9ICclJyAuICRQYXJhbXtOYW1lfSAuICclJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJExpa2VTdHJpbmc7CgogICAgICAgICRTUUwgLj0gIiBBTkQgbmFtZSBMSUtFID8iOwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBuYW1lJzsKCiAgICAjIHNlYXJjaCBzZXJ2aWNlIGluIGRiCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSBAU2VydmljZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gQFNlcnZpY2VMaXN0Owp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoKQoKcmV0dXJucyBhIGxpc3Qgb2YgY3VzdG9tZXJ1c2VyL3NlcnZpY2UgbWVtYmVycwoKICAgIFNlcnZpY2VJRDogc2VydmljZSBpZAogICAgQ3VzdG9tZXJVc2VyTG9naW46IGN1c3RvbWVyIHVzZXIgbG9naW4KICAgIERlZmF1bHRTZXJ2aWNlczogYWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSBkZWZhdWx0IHNlcnZpY2VzCgogICAgUmVzdWx0OiBIQVNIIC0+IHJldHVybnMgYSBoYXNoIG9mIGtleSA9PiBzZXJ2aWNlIGlkLCB2YWx1ZSA9PiBzZXJ2aWNlIG5hbWUKICAgICAgICAgICAgTmFtZSAtPiByZXR1cm5zIGFuIGFycmF5IG9mIHVzZXIgbmFtZXMKICAgICAgICAgICAgSUQgICAtPiByZXR1cm5zIGFuIGFycmF5IG9mIHVzZXIgaWRzCgogICAgRXhhbXBsZSAoZ2V0IHNlcnZpY2VzIG9mIGN1c3RvbWVyIHVzZXIpOgoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnVGVzdCcsCiAgICAgICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCiAgICApOwoKICAgIEV4YW1wbGUgKGdldCBjdXN0b21lciB1c2VyIG9mIHNlcnZpY2UpOgoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJElELAogICAgICAgIFJlc3VsdCAgICA9PiAnSEFTSCcsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtSZXN1bHR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBSZXN1bHQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IChvbmx5IDEgb3IgMCBpcyBhbGxvd2VkIHRvIGNvcnJlY3RseSBzZXQgdGhlIGNhY2hlIGtleSkKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gfHwgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gKSB7CiAgICAgICAgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gPSAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gPSAwOwogICAgfQoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZTo6RGVmYXVsdDo6VW5rbm93bkN1c3RvbWVyJyk7CiAgICBpZiAoCiAgICAgICAgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyCiAgICAgICAgJiYgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30KICAgICAgICAmJiAhJFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAmJiAhJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ID0gJzxERUZBVUxUPic7CiAgICB9CgogICAgIyBjaGVjayBtb3JlIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlcnZpY2VJRCBvciBDdXN0b21lclVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIGNhY2hlIGtleQogICAgbXkgJENhY2hlS2V5ID0gJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0OjonIC4gJFBhcmFte1Jlc3VsdH0gLiAnOjonCiAgICAgICAgLiAnRGVmYXVsdFNlcnZpY2VzOjonIC4gJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gLiAnOjonOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJ1NlcnZpY2VJRDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRDYWNoZUtleSAuPSAnQ3VzdG9tZXJVc2VyTG9naW46OicgLiAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59OwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICV7JENhY2hlfSBpZiByZWYgJENhY2hlIGVxICdIQVNIJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBAeyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnQVJSQVknOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdW90ZQogICAgZm9yICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFteyRffSApOwogICAgfQogICAgZm9yIChxdyhTZXJ2aWNlSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXskX30sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgc3FsCiAgICBteSAlRGF0YTsKICAgIG15IEBEYXRhOwogICAgbXkgJFNRTCA9ICdTRUxFQ1Qgc2N1LnNlcnZpY2VfaWQsIHNjdS5jdXN0b21lcl91c2VyX2xvZ2luLCBzLm5hbWUgJwogICAgICAgIC4gJyBGUk9NICcKICAgICAgICAuICcgc2VydmljZV9jdXN0b21lcl91c2VyIHNjdSwgc2VydmljZSBzJwogICAgICAgIC4gJyBXSEVSRSAnCiAgICAgICAgLiAiIHMudmFsaWRfaWQgSU4gKCAke1woam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSl9ICkgQU5EICIKICAgICAgICAuICcgcy5pZCA9IHNjdS5zZXJ2aWNlX2lkIEFORCAnOwoKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAiIHNjdS5zZXJ2aWNlX2lkID0gJFBhcmFte1NlcnZpY2VJRH0iOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRTUUwgLj0gIiBzY3UuY3VzdG9tZXJfdXNlcl9sb2dpbiA9ICckUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59JyI7CiAgICB9CgogICAgJERCT2JqZWN0LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkVmFsdWUgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkRGF0YXsgJFJvd1sxXSB9ID0gJFJvd1swXTsKICAgICAgICAgICAgJFZhbHVlID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzJdOwogICAgICAgIH0KICAgIH0KICAgIGlmICgKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59CiAgICAgICAgJiYgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSBuZSAnPERFRkFVTFQ+JwogICAgICAgICYmICRQYXJhbXtEZWZhdWx0U2VydmljZXN9CiAgICAgICAgJiYgIWtleXMoJURhdGEpCiAgICAgICAgKQogICAgewogICAgICAgICVEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXR1cm4gcmVzdWx0CiAgICBpZiAoICRQYXJhbXtSZXN1bHR9IGVxICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICAgICApOwogICAgICAgIHJldHVybiAlRGF0YTsKICAgIH0KICAgIGlmICggJFBhcmFte1Jlc3VsdH0gZXEgJ05hbWUnICkgewogICAgICAgIEBEYXRhID0gdmFsdWVzICVEYXRhOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQERhdGEgPSBrZXlzICVEYXRhOwogICAgfQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxARGF0YSwKICAgICk7CiAgICByZXR1cm4gQERhdGE7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKCkKCnRvIGFkZCBhIG1lbWJlciB0byBhIHNlcnZpY2UKCmlmICdBY3RpdmUnIGlzIDAsIHRoZSBjdXN0b21lciBpcyByZW1vdmVkIGZyb20gdGhlIHNlcnZpY2UKCiAgICAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnVGVzdDEnLAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+IDYsCiAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3VzdG9tZXJVc2VyTG9naW4gU2VydmljZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyByZWxhdGlvbgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBXSEVSRSBjdXN0b21lcl91c2VyX2xvZ2luID0gPyBBTkQgc2VydmljZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSwgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIHJlbGF0aW9uIGlzIG5vdCBhY3RpdmUKICAgIGlmICggISRQYXJhbXtBY3RpdmV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGluc2VydCBuZXcgcmVsYXRpb24KICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2VfY3VzdG9tZXJfdXNlciAnCiAgICAgICAgICAgIC4gJyhjdXN0b21lcl91c2VyX2xvZ2luLCBzZXJ2aWNlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0sIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtVc2VySUR9IF0KICAgICk7CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWhlYWQyIFNlcnZpY2VQcmVmZXJlbmNlc1NldCgpCgpzZXQgc2VydmljZSBwcmVmZXJlbmNlcwoKICAgICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgICAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlcnZpY2VQcmVmZXJlbmNlc1NldCglUGFyYW0pOwoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU2VydmljZVByZWZlcmVuY2VzR2V0KCkKCmdldCBzZXJ2aWNlIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VQcmVmZXJlbmNlc0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VQcmVmZXJlbmNlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2VydmljZVByZWZlcmVuY2VzR2V0KCVQYXJhbSk7Cn0KCj1oZWFkMiBTZXJ2aWNlUGFyZW50c0dldCgpCgpyZXR1cm4gYW4gb3JkZXJlZCBsaXN0IGFsbCBwYXJlbnQgc2VydmljZSBJRHMgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIGZyb20gdGhlIHJvb3QgcGFyZW50IHRvIHRoZQpjdXJyZW50IHNlcnZpY2UgcGFyZW50CgogICAgbXkgJFNlcnZpY2VQYXJlbnRzTGlzdCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUGFyZW50c0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm5zCgogICAgJFNlcnZpY2VQYXJlbnRzTGlzdCA9IFsgMSwgMiwgLi4uXTsKCj1jdXQKCnN1YiBTZXJ2aWNlUGFyZW50c0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIFNlcnZpY2VJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkICROZWVkZWQhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlYWQgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdTZXJ2aWNlUGFyZW50c0dldDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmIHJlZiAkQ2FjaGU7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZXMKICAgIG15ICRTZXJ2aWNlTGlzdCA9ICRTZWxmLT5TZXJ2aWNlTGlzdEdldCgKICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgYSBzZXJ2aWNlIGxvb2t1cCB0YWJsZQogICAgbXkgJVNlcnZpY2VMb29rdXA7CiAgICBTRVJWSUNFOgogICAgZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKICAgICAgICBuZXh0IFNFUlZJQ0UgaWYgISRTZXJ2aWNlRGF0YTsKICAgICAgICBuZXh0IFNFUlZJQ0UgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRTZXJ2aWNlRGF0YSk7CiAgICAgICAgbmV4dCBTRVJWSUNFIGlmICEkU2VydmljZURhdGEtPntTZXJ2aWNlSUR9OwoKICAgICAgICAkU2VydmljZUxvb2t1cHsgJFNlcnZpY2VEYXRhLT57U2VydmljZUlEfSB9ID0gJFNlcnZpY2VEYXRhOwogICAgfQoKICAgICMgZXhpdCBpZiBTZXJ2aWNlSUQgaXMgaW52YWxpZAogICAgcmV0dXJuIGlmICEkU2VydmljZUxvb2t1cHsgJFBhcmFte1NlcnZpY2VJRH0gfTsKCiAgICAjIHRvIHN0b3JlIHRoZSByZXR1cm4gc3RydWN0dXJlCiAgICBteSBAU2VydmljZVBhcmVudHM7CgogICAgIyBnZXQgdGhlIFNlcnZpY2VQYXJlbnRJRCBmcm9tIHRoZSByZXF1ZXN0ZWQgc2VydmljZQogICAgbXkgJFNlcnZpY2VQYXJlbnRJRCA9ICRTZXJ2aWNlTG9va3VweyAkUGFyYW17U2VydmljZUlEfSB9LT57UGFyZW50SUR9OwoKICAgICMgZ2V0IGFsbCBwYXJlbnRzIGZvciB0aGUgcmVxdWVzdGVkIHNlcnZpY2UKICAgIHdoaWxlICgkU2VydmljZVBhcmVudElEKSB7CgogICAgICAgICMgYWRkIHNlcnZpY2UgcGFyZW50IElEIHRvIHRoZSByZXR1cm4gc3RydWN0dXJlCiAgICAgICAgcHVzaCBAU2VydmljZVBhcmVudHMsICRTZXJ2aWNlUGFyZW50SUQ7CgogICAgICAgICMgc2V0IG5leHQgU2VydmljZVBhcmVudElEICh0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IHBhcmVudCkKICAgICAgICAkU2VydmljZVBhcmVudElEID0gJFNlcnZpY2VMb29rdXB7JFNlcnZpY2VQYXJlbnRJRH0tPntQYXJlbnRJRH0gfHwgMDsKCiAgICB9CgogICAgIyByZXZlcnNlIHRoZSByZXR1cm4gYXJyYXkgdG8gZ2V0IHRoZSBsaXN0IG9yZGVyZWQgZnJvbSBvbGQgdG8geW91bmcgKGluIHBhcmVudCBjb250ZXh0KQogICAgbXkgQERhdGEgPSByZXZlcnNlIEBTZXJ2aWNlUGFyZW50czsKCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxARGF0YSwKICAgICk7CgogICAgcmV0dXJuIFxARGF0YTsKfQoKPWhlYWQyIEdldEFsbEN1c3RvbVNlcnZpY2VzKCkKCmdldCBhbGwgY3VzdG9tIHNlcnZpY2VzIG9mIG9uZSB1c2VyCgogICAgbXkgQFNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPkdldEFsbEN1c3RvbVNlcnZpY2VzKCBVc2VySUQgPT4gMTIzICk7Cgo9Y3V0CgpzdWIgR2V0QWxsQ3VzdG9tU2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdHZXRBbGxDdXN0b21TZXJ2aWNlczo6JyAuICRQYXJhbXtVc2VySUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgcmV0dXJuIEB7JENhY2hlfSBpZiAkQ2FjaGU7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHNlYXJjaCBhbGwgY3VzdG9tIHNlcnZpY2VzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1Qgc2VydmljZV9pZAogICAgICAgICAgICBGUk9NIHBlcnNvbmFsX3NlcnZpY2VzCiAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFNlcnZpY2VJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBTZXJ2aWNlSURzLCAkUm93WzBdOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBTZXJ2aWNlSURzLAogICAgKTsKCiAgICByZXR1cm4gQFNlcnZpY2VJRHM7Cn0KCnN1YiBFeHBvcnRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRVc2VySUQgPSAkU2VsZi0+e1VzZXJJRH0gfHwgJFBhcmFte1VzZXJJRH07CgogICAgbXkgJVNlcnZpY2VGaWx0ZXI7CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte1NlcnZpY2VzfSApICkgewogICAgICAgICVTZXJ2aWNlRmlsdGVyID0gbWFwIHsgJF8gPT4gMSB9ICRQYXJhbXtTZXJ2aWNlc30tPkAqOwogICAgfQoKICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZWxmLT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CgogICAgbXkgJUV4cG9ydERhdGE7CiAgICBTRVJWSUNFSUQ6CiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIHNvcnQga2V5cyAlU2VydmljZUxpc3QgKSB7CgogICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZWxmLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCVTZXJ2aWNlRmlsdGVyKSB7CiAgICAgICAgICAgIG5leHQgU0VSVklDRUlEIHVubGVzcyAkU2VydmljZUZpbHRlcnsgJFNlcnZpY2VEYXRhe05hbWV9IH07CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zbGF0ZSBJRHMgaW50byBuYW1lcyBvciBuYW1lLWxpa2UgaWRlbnRpZmllcnMKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgQVRUUklCVVRFOgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAlU2VydmljZURhdGEgKSB7CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSB1bmxlc3MgJEF0dHJpYnV0ZSA9fiAvSUQvOwoKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlIGVxICdQYXJlbnRJRCcgKSB7CiAgICAgICAgICAgICAgICBteSAkUGFyZW50U2VydmljZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZURhdGF7UGFyZW50SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtQYXJlbnR9ID0gJFBhcmVudFNlcnZpY2U7CiAgICAgICAgICAgICAgICBkZWxldGUgJFNlcnZpY2VEYXRhe1BhcmVudElEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ1ZhbGlkSUQnICkgewogICAgICAgICAgICAgICAgbXkgJFZhbGlkID0gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBWYWxpZElEID0+ICRTZXJ2aWNlRGF0YXtWYWxpZElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VydmljZURhdGF7VmFsaWR9ID0gJFZhbGlkOwogICAgICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXtWYWxpZElEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX07CiAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXtDaGFuZ2VUaW1lfTsKICAgICAgICBkZWxldGUgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fTsKICAgICAgICBkZWxldGUgJFNlcnZpY2VEYXRhe0NyZWF0ZVRpbWV9OwogICAgICAgIGRlbGV0ZSAkU2VydmljZURhdGF7U2VydmljZUlEfTsKCiAgICAgICAgJEV4cG9ydERhdGF7ICRTZXJ2aWNlRGF0YXtOYW1lfSB9ID0gXCVTZXJ2aWNlRGF0YTsKICAgIH0KCiAgICByZXR1cm4gXCVFeHBvcnREYXRhOwp9CgpzdWIgSW1wb3J0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VySUR9IHx8ICRQYXJhbXtVc2VySUR9OwoKICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwogICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPlNlcnZpY2VMaXN0KAogICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKICAgIG15ICVTZXJ2aWNlTG9va3VwID0gcmV2ZXJzZSAlU2VydmljZUxpc3Q7CgogICAgIyBzb3J0IHNlcnZpY2VzIGJ5IHBhcmVudCBhdHRyaWJ1dGUKICAgIG15IEBGaXJzdExldmVsU2VydmljZXM7CiAgICBteSBAQ2hpbGRTZXJ2aWNlczsKICAgIGZvciBteSAkU2VydmljZU5hbWUgKCBrZXlzICRQYXJhbXtTZXJ2aWNlc30tPiUqICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VzfXskU2VydmljZU5hbWV9e1BhcmVudH0gKSB7CiAgICAgICAgICAgIHB1c2ggQENoaWxkU2VydmljZXMsICRTZXJ2aWNlTmFtZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2ggQEZpcnN0TGV2ZWxTZXJ2aWNlcywgJFNlcnZpY2VOYW1lOwogICAgICAgIH0KICAgIH0KICAgIG15IEBDaGlsZFNlcnZpY2VzU29ydGVkID0gc29ydCB7CiAgICAgICAgaWYgKCAoICRQYXJhbXtTZXJ2aWNlc317JGF9e1BhcmVudH0gLy8gJycgKSBlcSAkUGFyYW17U2VydmljZXN9eyRifXtOYW1lfSApIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggKCAkUGFyYW17U2VydmljZXN9eyRifXtQYXJlbnR9IC8vICcnICkgZXEgJFBhcmFte1NlcnZpY2VzfXskYX17TmFtZX0gKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gQENoaWxkU2VydmljZXM7CgogICAgU0VSVklDRU5BTUU6CiAgICBmb3IgbXkgJFNlcnZpY2VOYW1lICggQEZpcnN0TGV2ZWxTZXJ2aWNlcywgQENoaWxkU2VydmljZXNTb3J0ZWQgKSB7CiAgICAgICAgbXkgJFNlcnZpY2VEYXRhID0gJFBhcmFte1NlcnZpY2VzfXskU2VydmljZU5hbWV9OwoKICAgICAgICAjIHNraXAgaWYgcGFyZW50IGF0dHJpYnV0ZSBwcmVzZW50IGJ1dCBubyBjb3JyZXNwb25kaW5nIHNlcnZpY2UKICAgICAgICBpZiAoICRTZXJ2aWNlRGF0YS0+e1BhcmVudH0gKSB7CiAgICAgICAgICAgIG15ICRQYXJlbnRTZXJ2aWNlSUQgPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNlcnZpY2VEYXRhLT57UGFyZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgU0VSVklDRU5BTUUgdW5sZXNzICRQYXJlbnRTZXJ2aWNlSUQ7CgogICAgICAgICAgICAkU2VydmljZURhdGEtPntQYXJlbnRJRH0gPSAkUGFyZW50U2VydmljZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBpbiBjYXNlIG9mIGNoaWxkIHNlcnZpY2UsIGNoZWNrIGlmIGFsbCBwYXJlbnQgc2VydmljZXMgYXJlIHByZXNlbnQKICAgICAgICAjICAgZWl0aGVyIGluIHRoZSBzeXN0ZW0gb3IgaW4gdGhlIGltcG9ydCBkYXRhCiAgICAgICAgbXkgQE5hbWVFbGVtZW50cyA9IHNwbGl0KCAvOjovLCAkU2VydmljZURhdGEtPntOYW1lfSApOwogICAgICAgIGlmICggc2NhbGFyIEBOYW1lRWxlbWVudHMgPiAxICkgewogICAgICAgICAgICBteSAkTmFtZVN0cmcgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJCNOYW1lRWxlbWVudHMgLSAxICkgewogICAgICAgICAgICAgICAgaWYgKCROYW1lU3RyZykgewogICAgICAgICAgICAgICAgICAgICROYW1lU3RyZyAuPSAnOjonIC4gJE5hbWVFbGVtZW50c1skSW5kZXhdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE5hbWVTdHJnIC49ICROYW1lRWxlbWVudHNbJEluZGV4XTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEkU2VydmljZUxvb2t1cHskTmFtZVN0cmd9ICYmICEkUGFyYW17U2VydmljZXN9eyROYW1lU3RyZ30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgcGFyZW50IGVsZW1lbnQgbm90IGZvdW5kLCBza2lwcGluZwogICAgICAgICAgICAgICAgICAgIG5leHQgU0VSVklDRU5BTUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZUxvb2t1cHsgJFNlcnZpY2VEYXRhLT57TmFtZX0gfTsKCiAgICAgICAgIyBza2lwIGlmIHNlcnZpY2Ugd2l0aCBzYW1lIG5hbWUgZXhpc3RzIGFuZCBvdmVyd3JpdGUgaXMgbm90IHNldAogICAgICAgIG5leHQgU0VSVklDRU5BTUUgaWYgKCAhJFBhcmFte092ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXN9ICYmICRTZXJ2aWNlSUQgKTsKCiAgICAgICAgIyB0cmFuc2xhdGUgbmFtZWQgZGF0YSBiYWNrIHRvIElEcwogICAgICAgICRTZXJ2aWNlRGF0YS0+e1ZhbGlkSUR9ID0gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWQgPT4gJFNlcnZpY2VEYXRhLT57VmFsaWR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkU2VydmljZUlEKSB7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5TZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VEYXRhLT4lKiwKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZURhdGEtPntOYW1lU2hvcnR9LAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuIHVubGVzcyAkU3VjY2VzczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VsZi0+U2VydmljZUFkZCgKICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YS0+JSosCiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJFNlcnZpY2VEYXRhLT57TmFtZVNob3J0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRTZXJ2aWNlSUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCgo9aGVhZDIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KCkKCmdldCBzdGFuZGFyZCB0ZW1wbGF0ZXMgYXNzb2NpYXRlZCB0byBhIHNlcnZpY2UKCiAgICBteSAlVGVtcGxhdGVzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzCiAgICApOwoKICAgIFJldHVybnM6CiAgICAgICAgJVRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgMSA9PiAnU29tZSBOYW1lJywKICAgICAgICAgICAgMiA9PiAnU29tZSBOYW1lJywKICAgICAgICApOwoKCiAgICBteSAlVGVtcGxhdGVzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgICAgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgIFJldHVybnM6CiAgICAgICAgJVJlc3BvbnNlcyA9ICgKICAgICAgICAgICAgQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ1NvbWUgTmFtZScsCiAgICAgICAgICAgICAgICAyID0+ICdTb21lIE5hbWUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBbnN3ZXIgPT4gewogICAgICAgICAgICAgICAgMyA9PiAnU29tZSBOYW1lJywKICAgICAgICAgICAgICAgIDQgPT4gJ1NvbWUgTmFtZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICMgLi4uCiAgICAgICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnR290IG5vIFN0YW5kYXJkVGVtcGxhdGVJRCBvciBTZXJ2aWNlSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSAkVGVtcGxhdGVUeXBlcyA9ICRQYXJhbXtUZW1wbGF0ZVR5cGVzfSB8fCAnMCc7CgogICAgbXkgJENhY2hlS2V5OwoKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcHJlc2VudCAoaW4gY2FjaGUpCiAgICAgICAgJENhY2hlS2V5ID0gIlN0YW5kYXJkVGVtcGxhdGVzOjokUGFyYW17U2VydmljZUlEfTo6JFRlbXBsYXRlVHlwZXMiOwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgICAgICMgZ2V0IHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1Qgc3QuaWQsIHN0Lm5hbWUsIHN0LnRlbXBsYXRlX3R5cGUgIgogICAgICAgICAgICAuICIgRlJPTSBzdGFuZGFyZF90ZW1wbGF0ZSBzdCwgc2VydmljZV9zdGFuZGFyZF90ZW1wbGF0ZSBxc3QgV0hFUkUgIgogICAgICAgICAgICAuICIgcXN0LnNlcnZpY2VfaWQgSU4gKCIKICAgICAgICAgICAgLiAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17U2VydmljZUlEfSwgJ0ludGVnZXInICkKICAgICAgICAgICAgLiAiKSBBTkQgIgogICAgICAgICAgICAuICIgcXN0LnN0YW5kYXJkX3RlbXBsYXRlX2lkID0gc3QuaWQgQU5EICIKICAgICAgICAgICAgLiAiIHN0LnZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSIKICAgICAgICAgICAgLiAiIE9SREVSIEJZIHN0Lm5hbWUiOwoKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlc30gKSB7CiAgICAgICAgICAgICAgICAkU3RhbmRhcmRUZW1wbGF0ZXN7ICRSb3dbMl0gfS0+eyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFN0YW5kYXJkVGVtcGxhdGVzeyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIHN0ZCB0ZW1wbGF0ZXMgKGluIGNhY2hlKQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVTdGFuZGFyZFRlbXBsYXRlcywKCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJVN0YW5kYXJkVGVtcGxhdGVzOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHByZXNlbnQgKGluIGNhY2hlKQogICAgICAgICRDYWNoZUtleSA9ICJTZXJ2aWNlczo6JFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0iOwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgICAgICMgZ2V0IHNlcnZpY2VzCiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1QgcS5pZCwgcS5uYW1lICIKICAgICAgICAgICAgLiAiIEZST00gc2VydmljZSBxLCBzZXJ2aWNlX3N0YW5kYXJkX3RlbXBsYXRlIHFzdCBXSEVSRSAiCiAgICAgICAgICAgIC4gIiBxc3Quc3RhbmRhcmRfdGVtcGxhdGVfaWQgSU4gKCIKICAgICAgICAgICAgLiAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwgJ0ludGVnZXInICkKICAgICAgICAgICAgLiAiKSBBTkQgIgogICAgICAgICAgICAuICIgcXN0LnNlcnZpY2VfaWQgPSBxLmlkIEFORCAiCiAgICAgICAgICAgIC4gIiBxLnZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSIKICAgICAgICAgICAgLiAiIE9SREVSIEJZIHEubmFtZSI7CgogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlU2VydmljZXM7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRTZXJ2aWNlc3sgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgc2VydmljZXMgKGluIGNhY2hlKQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVTZXJ2aWNlcywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJVNlcnZpY2VzOwogICAgfQp9Cgo9aGVhZDIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJBZGQoKQoKdG8gYXNzb2NpYXRlIGEgbmV3IHRlbXBsYXRlIHRvIGEgc2VydmljZQoKICAgIG15ICRTdWNjZXNzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyQWRkKAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBBY3RpdmUgICAgICAgICAgICAgPT4gMSwgICAgICAgICMgdG8gc2V0L2NvbmZpcm0gKDEpIG9yIHJlbW92ZSAoMCkgdGhlIHJlbGF0aW9uCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VydmljZUlEIFN0YW5kYXJkVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIHNlcnZpY2Vfc3RhbmRhcmRfdGVtcGxhdGUKICAgICAgICAgICAgV0hFUkUgc2VydmljZV9pZCA9ID8KICAgICAgICAgICAgQU5EIHN0YW5kYXJkX3RlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIHJlbGF0aW9uIGlzIG5vdCBhY3RpdmUKICAgIGlmICggISRQYXJhbXtBY3RpdmV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyByZWxhdGlvbgogICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIHNlcnZpY2Vfc3RhbmRhcmRfdGVtcGxhdGUgKHNlcnZpY2VfaWQsIHN0YW5kYXJkX3RlbXBsYXRlX2lkLCBjcmVhdGVfdGltZSwKICAgICAgICAgICAgICAgIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkKICAgICAgICAgICAgVkFMVUVTICg/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKICAgIHJldHVybiAkU3VjY2VzczsKfQoKIyBFTyBDdXN0b21lclRlbXBsYXRlCgoxOwo=</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.Admin.ServiceTemplates.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwpDb3JlLkFnZW50LkFkbWluID0gQ29yZS5BZ2VudC5BZG1pbiB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQWRtaW4uU2VydmljZVRlbXBsYXRlcwogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbgogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbiBmb3IgU2VydmljZVRlbXBsYXRlcyBzZWxlY3Rpb24uCiAqLwogQ29yZS5BZ2VudC5BZG1pbi5TZXJ2aWNlVGVtcGxhdGVzID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qCiAgICAqIEBuYW1lIEluaXQKICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uU2VydmljZVRlbXBsYXRlcwogICAgKiBAZnVuY3Rpb24KICAgICogQGRlc2NyaXB0aW9uCiAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBmaWx0ZXIgYW5kICJTZWxlY3RBbGwiIGFjdGlvbnMuCiAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLy8gaW5pdGlhbGl6ZSAiU2VsZWN0QWxsIiBjaGVja2JveCBhbmQgYmluZCBjbGljayBldmVudCBvbiAiU2VsZWN0QWxsIiBmb3IgZWFjaCByZWxhdGlvbiBpdGVtCiAgICAgICAgQ29yZS5Gb3JtLkluaXRTZWxlY3RBbGxDaGVja2JveGVzKCQoJ3RhYmxlIHRkIGlucHV0W3R5cGU9ImNoZWNrYm94Il1bbmFtZT1JdGVtc1NlbGVjdGVkXScpLCAkKCcjU2VsZWN0QWxsSXRlbXNTZWxlY3RlZCcpKTsKCiAgICAgICAgJCgnaW5wdXRbdHlwZT0iY2hlY2tib3giXVtuYW1lPUl0ZW1zU2VsZWN0ZWRdJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkZvcm0uU2VsZWN0QWxsQ2hlY2tib3hlcygkKHRoaXMpLCAkKCcjU2VsZWN0QWxsSXRlbXNTZWxlY3RlZCcpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0YWJsZSBmaWx0ZXJzCiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgiI0ZpbHRlciIpLCAkKCIjSXRlbXNUYWJsZSIpKTsKICAgICAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCIjRmlsdGVyVGVtcGxhdGVzIiksICQoIiNUZW1wbGF0ZXMiKSk7CiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgiI0ZpbHRlclNlcnZpY2VzIiksICQoIiNTZXJ2aWNlcyIpKTsKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkFkbWluLlNlcnZpY2VUZW1wbGF0ZXMgfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/js/Core.Customer.TicketAction.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQ3VzdG9tZXIgPSBDb3JlLkN1c3RvbWVyIHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5DdXN0b21lci5UaWNrZXRBY3Rpb24KICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGFsbCB0aWNrZXQgYWN0aW9uIHBvcHVwcy4KICovCkNvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgY3VzdG9tZXIgdGVtcGxhdGUgcmVsYXRlZCBldmVudHMuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gY2hhbmdlIHN0YW5kYXJkIHRlbXBsYXRlCiAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVJRCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUoJ1JpY2hUZXh0JywgJCh0aGlzKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnZm9ybVtuYW1lPSJjb21wb3NlIicpLmZpcnN0KCksICdBSkFYVXBkYXRlJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBpZiAoICQoJyNTdGFuZGFyZFRlbXBsYXRlSUQnKS5jaGlsZHJlbigpLmxlbmd0aCA9PSAyICkgewogICAgICAgICAgICAkKCIjU3RhbmRhcmRUZW1wbGF0ZUlEIikudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIENvbmZpcm1UZW1wbGF0ZU92ZXJ3cml0ZQogICAgICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBGaWVsZE5hbWUgLSBUaGUgSUQgb2YgdGhlIGNvbnRlbnQgZmllbGQgKHRleHRhcmVhIG9yIFJURSkuIElEIHdpdGhvdXQgc2VsZWN0b3IgKCMpLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZW1wbGF0ZVNlbGVjdCAtIFNlbGVjdG9yIG9mIHRoZSBkcm9wZG93biBlbGVtZW50IGZvciB0aGUgdGVtcGxhdGUgc2VsZWN0aW9uLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIGlmIG92ZXJ3cml0aW5nIGlzIGNvbmZpcm1lZC4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBBZnRlciBhIHRlbXBsYXRlIHdhcyBzZWxlY3RlZCwgdGhpcyBmdW5jdGlvbiBsZXRzIHRoZSB1c2VyIGNvbmZpcm0gdGhhdCBhbGwgYWxyZWFkeSBleGlzdGluZyBjb250ZW50CiAgICAgKiAgICAgIGluIHRoZSB0ZXh0YXJlYSBvciBSVEUgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSB0ZW1wbGF0ZSBjb250ZW50LgogICAgICovCiAgICBUYXJnZXROUy5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUgPSBmdW5jdGlvbiAoRmllbGROYW1lLCAkVGVtcGxhdGVTZWxlY3QsIENhbGxiYWNrKSB7CiAgICAgICAgdmFyIENvbnRlbnQgPSAnJywKICAgICAgICAgICAgTGFzdFZhbHVlID0gJFRlbXBsYXRlU2VsZWN0LmRhdGEoJ0xhc3RWYWx1ZScpIHx8ICcnOwogICAgICAgIC8vIEZhbGxiYWNrIGZvciBub24tcmljaHRleHQgY29udGVudAogICAgICAgIENvbnRlbnQgPSAkKCcjJyArIEZpZWxkTmFtZSkudmFsKCk7CgogICAgICAgIC8vIGdldCBSVEUgY29udGVudAogICAgICAgIGlmICh0eXBlb2YgQ0tFZGl0b3JJbnN0YW5jZXMgIT09ICd1bmRlZmluZWQnICYmIENLRWRpdG9ySW5zdGFuY2VzW0ZpZWxkTmFtZV0pIHsKICAgICAgICAgICAgQ29udGVudCA9IENLRWRpdG9ySW5zdGFuY2VzW0ZpZWxkTmFtZV0uZ2V0RGF0YSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gaWYgY29udGVudCBhbHJlYWR5IGV4aXN0cyBsZXQgdXNlciBjb25maXJtIHRvIHJlYWxseSBvdmVyd3JpdGUgdGhhdCBjb250ZW50IHdpdGggYSB0ZW1wbGF0ZQogICAgICAgIGlmICgKICAgICAgICAgICAgQ29udGVudC5sZW5ndGggJiYKICAgICAgICAgICAgIXdpbmRvdy5jb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXR0aW5nIGEgdGVtcGxhdGUgd2lsbCBvdmVyd3JpdGUgYW55IHRleHQgb3IgYXR0YWNobWVudC4nKSArICcgJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWU/JykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIGNhbmNlbHMgY29uZmlybWF0aW9uLCByZXNldCB0ZW1wbGF0ZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICRUZW1wbGF0ZVNlbGVjdC52YWwoTGFzdFZhbHVlKS50cmlnZ2VyKCdyZWRyYXcnKTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCQuaXNGdW5jdGlvbihDYWxsYmFjaykpIHsKICAgICAgICAgICAgQ2FsbGJhY2soKTsKICAgICAgICAgICAgJFRlbXBsYXRlU2VsZWN0LmRhdGEoJ0xhc3RWYWx1ZScsICRUZW1wbGF0ZVNlbGVjdC52YWwoKSk7CiAgICAgICAgfQogICAgfQoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5DdXN0b21lci5UaWNrZXRBY3Rpb24gfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/Core.FieldExplanationRow.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi5GaWVsZEV4cGxhbmF0aW9uIHsKICAgIHBhZGRpbmctbGVmdDogMjRweDsKICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBtYXJnaW4tYm90dG9tOiAtMjJweDsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogICAgLkZpZWxkRXhwbGFuYXRpb24gewogICAgICAgIG1hcmdpbi1sZWZ0OiAxNyU7CiAgICB9Cn0K</File>
        <File Location="doc/en/CustomerTemplates.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableCreate Type="post" Name="service_standard_template">
            <Column Name="service_id" Required="true" Type="INTEGER"></Column>
            <Column Name="standard_template_id" Required="true" Type="INTEGER"></Column>
            <Column Name="create_time" Required="true" Type="DATE"></Column>
            <Column Name="create_by" Required="true" Type="INTEGER"></Column>
            <Column Name="change_time" Required="true" Type="DATE"></Column>
            <Column Name="change_by" Required="true" Type="INTEGER"></Column>
            <Unique>
                                <UniqueColumn Name="service_id"></UniqueColumn>
                <UniqueColumn Name="standard_template_id"></UniqueColumn>
</Unique>
            <Index Name="service_standard_template_service_id">
                <IndexColumn Name="service_id">
                </IndexColumn>
            </Index>
            <Index Name="service_standard_template_standard_template_id">
                <IndexColumn Name="standard_template_id">
                </IndexColumn>
            </Index>
            <ForeignKey ForeignTable="service">
                <Reference Foreign="id" Local="service_id">
                </Reference>
            </ForeignKey>
            <ForeignKey ForeignTable="standard_template">
                <Reference Foreign="id" Local="standard_template_id">
                </Reference>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Foreign="id" Local="create_by">
                </Reference>
                <Reference Foreign="id" Local="change_by">
                </Reference>
            </ForeignKey>
        </TableCreate>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableDrop Type="pre" Name="service_standard_template">
        </TableDrop>
    </DatabaseUninstall>
</otrs_package>