<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>FAQ-ExtendedNavigation</Name>
    <Version>11.0.1</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-05-28 15:20:01" Version="11.0.1">Initial Release.</ChangeLog>
    <ChangeLog Date="2026-05-12 11:00:00" Version="11.0.0">Initial release for OTOBO 11.0.</ChangeLog>
    <Description Lang="en">Packages for greater experience of use in the FAQ module.</Description>
    <Description Lang="de">Paket für bessere Benutzererfahrung im Modul-FAQ.</Description>
    <Description Lang="es">Paquete para mejorar la experiencia del usuario en el módulo FAQ.</Description>
    <Description Lang="hu">Csomag a GYIK modul felhasználói élményének javítására.</Description>
    <Framework>11.0.x</Framework>
    <IntroInstall Lang="en" Title="Install Information" Type="pre">
        &lt;br&gt;
        WELCOME!&lt;br&gt;
        &lt;br&gt;
        You are about to install the package to improve navigation in the FAQ module.&lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
        Please click continue to proceed!&lt;br&gt;
        &lt;br&gt;
    </IntroInstall>
    <IntroInstall Lang="de" Title="Installationsinformationen" Type="pre">
        &lt;br&gt;
        Herzlich willkommen!&lt;br&gt;
        &lt;br&gt;
        Sie sind im Begriff, das Paket zur Verbesserung der Navigation im FAQ-Modul zu installieren.&lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
        Bitte klicken Sie auf „Weiter“, um fortzufahren!&lt;br&gt;
        &lt;br&gt;
    </IntroInstall>
    <IntroInstall Lang="es" Title="Información de Instalación" Type="pre">
        &lt;br&gt;
        BIENVENIDO!&lt;br&gt;
        &lt;br&gt;
        Está a punto de instalar el paquete para mejorar la navegación en del módulo de las FAQ.&lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
        Haga clic en continuar para proceder!&lt;br&gt;
        &lt;br&gt;
    </IntroInstall>
    <IntroInstall Lang="hu" Title="Telepítési információk" Type="pre">
        &lt;br&gt;
        Üdvözöljük!&lt;br&gt;
        &lt;br&gt;
        A GYIK modul navigációjának javítását célzó csomag telepítésére készülsz.&lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
        A folytatáshoz kérjük kattintson a folytatás gombra!&lt;br&gt;
        &lt;br&gt;
    </IntroInstall>
    <PackageRequired Version="11.0.10">FAQ</PackageRequired>
    <BuildCommitID>1267a96c92cd553bfb56c2febb50731c6718490c</BuildCommitID>
    <BuildDate>2026-05-28 15:20:04</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Kernel/Config/Files/XML/FAQExtendedNavigation.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDb25maWciPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50RkFRQXV0b0NvbXBsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkZBUSBNb2R1bGUgZm9yIGF1dG9jb21wbGV0ZSB0YWdzLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkZBUSBhdXRvY29tcGxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpBZ2VudDo6Q29tbW9uQ1NTIyMjMjEwLUZBUUV4dGVuZGVkTmF2aWdhdGlvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIENTUyBmaWxlcyB0byBhbHdheXMgYmUgbG9hZGVkIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkZBUUV4dGVuZGVkTmF2aWdhdGlvbi5BZ2VudC5EZWZhdWx0LmNzczwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpBZ2VudDo6Q29tbW9uSlMjIyMyMTAtRkFRRXh0ZW5kZWROYXZpZ2F0aW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgSlMgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZSBmb3IgRkFRLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkZBUS5FeHRlbmRlZE5hdmlnYXRpb24uRkFRLmpzPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6OkN1c3RvbWVyOjpDb21tb25KUyMjIzIxMC1GQVFFeHRlbmRlZE5hdmlnYXRpb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TGlzdCBvZiBKUyBmaWxlcyB0byBhbHdheXMgYmUgbG9hZGVkIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlIGZvciBGQVEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+RkFRLkV4dGVuZGVkTmF2aWdhdGlvbi5GQVEuanM8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudEZBUUV4cGxvcmVyIyMjMDAzLUZBUUV4dGVuZGVkTmF2aWdhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkZBUUV4dGVuZGVkTmF2aWdhdGlvbi5BZ2VudC5EZXRhaWwuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50RkFRQWRkIyMjMDAzLUZBUUV4dGVuZGVkTmF2aWdhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkZBUUV4dGVuZGVkTmF2aWdhdGlvbi5BZ2VudC5EZXRhaWwuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50RkFRRWRpdCMjIzAwMy1GQVFFeHRlbmRlZE5hdmlnYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVFFeHRlbmRlZE5hdmlnYXRpb24uQWdlbnQuRGV0YWlsLmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudEZBUVpvb20jIyMwMDMtRkFRRXh0ZW5kZWROYXZpZ2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RkFRRXh0ZW5kZWROYXZpZ2F0aW9uLkFnZW50LkRldGFpbC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6Q3VzdG9tZXJGQVFFeHBsb3JlciMjIzAwMy1GQVFFeHRlbmRlZE5hdmlnYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVFFeHRlbmRlZE5hdmlnYXRpb24uQ3VzdG9tZXIuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkZBUUV4dGVuZGVkTmF2aWdhdGlvbi5DdXN0b21lci5EZXRhaWwuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OlB1YmxpY0ZBUUV4cGxvcmVyIyMjMDAzLUZBUUV4dGVuZGVkTmF2aWdhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RkFRRXh0ZW5kZWROYXZpZ2F0aW9uLkN1c3RvbWVyLkRlZmF1bHQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVFFeHRlbmRlZE5hdmlnYXRpb24uQ3VzdG9tZXIuRGV0YWlsLmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpDdXN0b21lckZBUVpvb20jIyMwMDMtRkFRRXh0ZW5kZWROYXZpZ2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RkFRRXh0ZW5kZWROYXZpZ2F0aW9uLkN1c3RvbWVyLkRlZmF1bHQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVFFeHRlbmRlZE5hdmlnYXRpb24uQ3VzdG9tZXIuRGV0YWlsLmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpQdWJsaWNGQVFab29tIyMjMDAzLUZBUUV4dGVuZGVkTmF2aWdhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RkFRRXh0ZW5kZWROYXZpZ2F0aW9uLkN1c3RvbWVyLkRlZmF1bHQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVFFeHRlbmRlZE5hdmlnYXRpb24uQ3VzdG9tZXIuRGV0YWlsLmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpQdWJsaWNGQVFTZWFyY2gjIyMwMDMtRkFRRXh0ZW5kZWROYXZpZ2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVFFeHRlbmRlZE5hdmlnYXRpb24uQ3VzdG9tZXIuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlIyMjMDAzLUZBUUV4dGVuZGVkTmF2aWdhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkZBUUV4dGVuZGVkTmF2aWdhdGlvbi5DdXN0b21lci5EZWZhdWx0LmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudEZBUVNpZGViYXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+TWFuYWdlIEZBUSBTaWRlYmFyIHNldHRpbmdzLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPkZBUTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlNpZGViYXIgU2V0dGluZ3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50RkFRU2lkZWJhciMjIzAwMi1GQVEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVEuQWdlbnQuU2lkZWJhci5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVEuQWdlbnQuU2lkZWJhci5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWdlbnRGQVFTaWRlYmFyIyMjMDAyLUZBUSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPk1hbmFnZSBGQVEgU2lkZWJhciBzZXR0aW5ncy48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5TaWRlYmFyIFNldHRpbmdzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudEZBUVNpZGViYXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY2Vzc0tleSI+czwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj45ODA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGQVFTaWRlQmFyOjpDdXN0b21lcjo6RW5hYmxlZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZXRlcm1pbmVzIGlmIHRoZSBzaWRlYmFyIGlzIGVuYWJsZWQgZm9yIEN1c3RvbWVyIEludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9Ik5vIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iWWVzIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iTm8iIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRkFRU2lkZUJhcjo6UHVibGljOjpFbmFibGVkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRldGVybWluZXMgaWYgdGhlIHNpZGViYXIgaXMgZW5hYmxlZCBmb3IgUHVibGljIEludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9Ik5vIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iWWVzIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iTm8iIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRkFRU2lkZUJhcjo6QWdlbnQ6OkVuYWJsZWQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyBpZiB0aGUgc2lkZWJhciBpcyBlbmFibGVkIGZvciBBZ2VudCBJbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RkFRU2lkZUJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJObyI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlllcyIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9Ik5vIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZBUVNpZGVCYXI6OkV4cGFuZFN1YmNhdGVnb3JpZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyBpZiB0aGUgc3ViY2F0ZWdvcmllcyBtdXN0IGJlIGV4cGFuZGVzIG9uIFNpZGViYXIgaW5pdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9Ik5vIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iWWVzIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iTm8iIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRkFRVGFibGVPZkNvbnRlbnRzOjpNYXhEZXB0aCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGRlcHRoIGxldmVscyBmb3IgZWFjaCBmaWVsZCBpbiB0aHQgVE9DLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVRhYmxlT2ZDb250ZW50czwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSIzIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIyIiBUcmFuc2xhdGFibGU9IjEiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjMiIFRyYW5zbGF0YWJsZT0iMSI+MzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iNCIgVHJhbnNsYXRhYmxlPSIxIj40PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSI1IiBUcmFuc2xhdGFibGU9IjEiPjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjYiIFRyYW5zbGF0YWJsZT0iMSI+NjwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJBZ2VudEZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDAxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJBZ2VudEZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDAyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJBZ2VudEZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDAzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJBZ2VudEZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDA0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJBZ2VudEZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDA1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lckZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDAxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lckZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDAyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lckZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDAzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lckZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDA0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lckZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDA1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQdWJsaWNGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgcHVibGljIGludGVyZmFjZSBzaWRlYmFyLCBhY2NvcmRpbmcgdG8gdGhlIGxhbmd1YWdlLiBSZWxldmFudCBmaWVsZHM6IExhbmd1YWdlOiBEZWZpbmVzIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgc2lkZWJhciB3aWxsIGJlIGRpc3BsYXllZDsgRGVmYXVsdEl0ZW1JRDogSUQgb2YgdGhlIEZBUSBhcnRpY2xlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgZGVmYXVsdCBpbiB0aGUgWm9vbSB2aWV3OyBDdXN0b21Hcm91cE9yZGVyOiBDdXN0b20gb3JkZXIgZm9yIGRpc3BsYXlpbmcgdGhlIGFydGljbGUgZ3JvdXBpbmcgY2F0ZWdvcmllczsgQXJ0aWNsZXM6IERlZmluaXRpb24gb2YgdGhlIGdyb3VwaW5nIGNhdGVnb3JpZXMgYW5kIHRoZSBhcnRpY2xlcyB0byBkaXNwbGF5LCB1cCB0byAyIGxldmVscyBkZWVwLiBGb3IgZXhhbXBsZTogU2VydmljZSBEZXNrOjoxMCB3aWxsIGRpc3BsYXkgdGhlIGxpbmsgdG8gdGhlIEZBUSBhcnRpY2xlIHdpdGggSUQ9MTAgZm9yIHRoZSAiU2VydmljZSBEZXNrIiBncm91cCwgb3IgU2VydmljZSBEZXNrOjpTZWN1cml0eTo6MjAgd2lsbCBkaXNwbGF5IHRoZSAiU2VydmljZSBEZXNrICZndDsgU2VjdXJpdHkiIGdyb3VwIGFuZCB3aXRoaW4gaXQgdGhlIGxpbmsgdG8gdGhlIEZBUSBhcnRpY2xlIHdpdGggSUQ9MjAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RkFRU2lkZUJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYW5ndWFnZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0SXRlbUlEIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbUdyb3VwT3JkZXIiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlB1YmxpY0ZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDAyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUHVibGljRkFRU2lkZUJhcjo6QXJ0aWNsZXMjIyMwMDMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlndXJlIHRoZSBhcnRpY2xlcyBmb3IgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQdWJsaWNGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgcHVibGljIGludGVyZmFjZSBzaWRlYmFyLCBhY2NvcmRpbmcgdG8gdGhlIGxhbmd1YWdlLiBSZWxldmFudCBmaWVsZHM6IExhbmd1YWdlOiBEZWZpbmVzIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgc2lkZWJhciB3aWxsIGJlIGRpc3BsYXllZDsgRGVmYXVsdEl0ZW1JRDogSUQgb2YgdGhlIEZBUSBhcnRpY2xlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgZGVmYXVsdCBpbiB0aGUgWm9vbSB2aWV3OyBDdXN0b21Hcm91cE9yZGVyOiBDdXN0b20gb3JkZXIgZm9yIGRpc3BsYXlpbmcgdGhlIGFydGljbGUgZ3JvdXBpbmcgY2F0ZWdvcmllczsgQXJ0aWNsZXM6IERlZmluaXRpb24gb2YgdGhlIGdyb3VwaW5nIGNhdGVnb3JpZXMgYW5kIHRoZSBhcnRpY2xlcyB0byBkaXNwbGF5LCB1cCB0byAyIGxldmVscyBkZWVwLiBGb3IgZXhhbXBsZTogU2VydmljZSBEZXNrOjoxMCB3aWxsIGRpc3BsYXkgdGhlIGxpbmsgdG8gdGhlIEZBUSBhcnRpY2xlIHdpdGggSUQ9MTAgZm9yIHRoZSAiU2VydmljZSBEZXNrIiBncm91cCwgb3IgU2VydmljZSBEZXNrOjpTZWN1cml0eTo6MjAgd2lsbCBkaXNwbGF5IHRoZSAiU2VydmljZSBEZXNrICZndDsgU2VjdXJpdHkiIGdyb3VwIGFuZCB3aXRoaW4gaXQgdGhlIGxpbmsgdG8gdGhlIEZBUSBhcnRpY2xlIHdpdGggSUQ9MjAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RkFRU2lkZUJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYW5ndWFnZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0SXRlbUlEIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbUdyb3VwT3JkZXIiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlB1YmxpY0ZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDA1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNBZ2VudEZBUVpvb20jIyMwMDItRkFRIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+RkFRIEhvbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5GQVEgSG9tZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRGQVFab29tPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPcHRpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXIiPkZBUTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2Nlc3NLZXkiPmg8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MDEwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ3VzdG9tZXJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0N1c3RvbWVyRkFRRXhwbG9yZXIjIyMwMDItRkFRIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUN1c3RvbWVyRkFRWm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rT3B0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+TWVudTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY2Vzc0tleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjcwMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzdmdJY29uIj52YXIvaHR0cGQvaHRkb2NzL3NraW5zL0N1c3RvbWVyL2RlZmF1bHQvaW1nL2ZhcS5zdmc8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Language/de_FAQExtendedNavigation.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ZBUUV4dGVuZGVkTmF2aWdhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYmxlIG9mIENvbnRlbnRzJ30gPSAnSW5oYWx0c3ZlcnplaWNobmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2sgdG8gRkFRIEhvbWUnfSA9ICdadXLDvGNrIHp1ciBGQVEtU3RhcnRzZWl0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrIHRvIHRvcCd9ID0gJ1p1csO8Y2sgbmFjaCBvYmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ljb24gKHN2ZyknfSA9ICdJY29uIChzdmcpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBJY29uJ30gPSAnSWNvbiBob2NobGFkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGFuIGljb24gaW4gU1ZHIGZvcm1hdCB0byB1cGxvYWQgaXQuJ30gPSAnV8OkaGxlbiBTaWUgZWluIFN5bWJvbCBpbSBTVkctRm9ybWF0IGF1cywgdW0gZXMgaG9jaHp1bGFkZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaWRlYmFyIFNldHRpbmdzJ30gPSAnU2VpdGVubGVpc3RlbmtvbmZpZ3VyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBTZXR0aW5ncyd9ID0gJ0ZpbHRlciBmw7xyIEVpbnN0ZWxsdW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRkFRIFNpZGViYXIgU2V0dGluZ3MnfSA9ICdGQVEtU2VpdGVubGVpc3RlbmtvbmZpZ3VyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9hZCBTZXR0aW5ncyd9ID0gJ0xhZGUgS29uZmlndXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZhdWx0IEZBUSBJdGVtJ30gPSAnRkFRLVN0YXJ0c2VpdGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tIEdyb3VwIE9yZGVyJ30gPSAnS2F0ZWdvcmllbnNvcnRpZXJ1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBVcCd9ID0gJ05hY2ggb2Jlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIERvd24nfSA9ICdOYWNoIHVudGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1aWNrc3RhcnQgTGlua3MnfSA9ICdTY2huZWxsLUxpbmtzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHRpbmdzIGZvcid9ID0gJ0VpbnN0ZWxsdW5nZW4gZsO8cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNldCBTZXR0aW5nJ30gPSAnRWluc3RlbGx1bmdlbiB6dXLDvGNrc2V0emVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RvcmluZyB0aGVzZSBzZXR0aW5ncyB3aWxsIGVyYXNlIGFsbCBkYXRhLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZD8nfSA9ICdXaWVkZXJoZXJzdGVsbGVuIGRpZXNlciBFaW5zdGVsbHVuZ2VuIHdpcmQgYWxsZSBEYXRlbiBsw7ZzY2hlbi4gVHJvdHpkZW0gZm9ydGZhaHJlbj8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0dGluZ3Mgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQhJ30gPSAnRWluc3RlbGx1bmdlbiBlcmZvbGdyZWljaCBnZXVwZGF0ZWQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHRpbmdzIHN1Y2Nlc3NmdWxseSByZXNldCEnfSA9ICdFaW5zdGVsbHVuZ2VuIGVyZm9sZ3JlaWNoIHp1csO8Y2tnZXNldHp0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYW5ndWFnZSBjb25maWd1cmF0aW9uIGxpbWl0IHJlYWNoZWQgZm9yIHRoZSBpbnRlcmZhY2U6ICVzISd9ID0gJ01heGltYWxlIEFuemFobCBhbiBTcHJhY2hlaW5zdGVsbHVuZ2VuIGbDvHIgZGFzIEludGVyZmFjZSAlcyBlcnJlaWNodCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJlIHRoZSBzaWRlYmFyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHRoZSBPVE9CTyBsYW5ndWFnZSBhbmQgaW50ZXJmYWNlJ30gPSAnS29uZmlndXJpZXJlIGRpZSBTZWl0ZW5sZWlzdGVuLUVpbnN0ZWxsdW5nZW4gYWJow6RuZ2lnIHZvbiBJbnRlcmZhY2UgdW5kIFNwcmFjaGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UT0JPIGludGVyZmFjZSB3aGVyZSB0aGUgc2lkZWJhciB3aWxsIGJlIGRpc3BsYXllZC4nfSA9ICdPVE9CTy1JbnRlcmZhY2UgYXVmIGRlbSBkaWUgU2VpdGVubGVpc3RlIGFuZ2V6ZWlndCB3ZXJkZW4gd2lyZC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlclwncyBsYW5ndWFnZSBpbiB0aGUgT1RPQk8gaW50ZXJmYWNlLid9ID0gJ1NwcmFjaGUgZGVzIE51dHplcnMgaW4gT1RPQk8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCB0aGUgZGVmYXVsdCBhcnRpY2xlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHpvb20gdmlldyB3aGVuIHRoZSBGQVEgbG9hZHMuJ30gPSAnV8OkaGxlIGRlbiBTdGFuZGFyZC1BcnRpa2VsLCBkZXIgaW4gZGVyIEZBUS1ab29tIGFuZ2V6ZWlndCB3aXJkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBxdWljayBsaW5rIGdyb3VwcyBpbiB0aGUgRkFRIHdpbGwgYmUgZGlzcGxheWVkLid9ID0gJ0xlZ2UgZGllIFJlaWhlbmZvbGdlIGZlc3QsIGluIGRlciBkaWUgS2F0ZWdvcmllbiBkZXIgU2NobmVsbC1MaW5rcyBkYXJnZXN0ZWxsdCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIGxpbmtzIHRvIHRoZSBGQVEgYXJ0aWNsZXMuIFRoZXkgbXVzdCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6J30gPSAnRGVmaW5pdGlvbiBkZXIgRkFRLUxpbmtzLiBEaWUgS29uZmlndXJhdGlvbiBpc3Qgd2llIGZvbGd0Oic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbiB0aGUgdGV4dCBmaWVsZDogTmFtZSBvZiB0aGUgZ3JvdXAgdG8gY29uc29saWRhdGUgdGhlIGxpbmtzLiBVcCB0byB0d28gbGV2ZWxzIG9mIGRlcHRoIGNhbiBiZSBkZWZpbmVkLiBVc2UgdGhlIHN5bnRheCAiR3JvdXA6OlN1Ymdyb3VwIiB3aGVuIGRlZmluaW5nIHN1Ymdyb3Vwcy4nfSA9ICdJbSBUZXh0ZmVsZCBkZXIgTmFtZSB1bnRlciBkZW0gQXJ0aWtlbCBncnVwcGllcnQgd2VyZGVuLiBCaXMgenUgendlaSBFYmVuZW4ga8O2bm5lbiBmZXN0ZWdlbGd0IHdlcmRlbiwgZGllIFN5bnRheCBmw7xyIFVudGVyZ3J1cHBlbiBpc3QgIkdydXBwZTo6VW50ZXJncnVwcGUiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGQVEgQXJ0aWNsZTogU2VsZWN0IHRoZSBGQVEgYXJ0aWNsZSBmcm9tIHRoZSBsaXN0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNpZGViYXIuJ30gPSAnRkFRLUFydGlrZWw6IFfDpGhsZSBkZW4gRkFRLUFydGlrZWwgYXVzIGRlciBMaXN0ZSwgZGVyIGluIGRlciBTZWl0ZW5sZWlzdGUgYW5nZXplaWd0IHdpcmQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSAiUmVzZXQgc2V0dGluZ3MiIGJ1dHRvbiBvbmx5IGFwcGxpZXMgdG8gdGhlIHNldHRpbmdzIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuJ30gPSAnRGVyICJFaW5zdGVsbHVuZ2VuIHp1csO8Y2tzZXR6ZW4iLUtub3BmIGJldHJpZmZ0IGF1c3NjaGxpZcOfbGljaCBkaWUgbW9tZW50YW4gYmVhcmJlaXRldGUgRWluc3RlbGx1bmcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhdW5jaCB0aGUgQWRkL0VkaXQgU2lkZWJhciBTZXR0aW5ncyBzY3JlZW4gYnkgc2VsZWN0aW5nOid9ID0gJ8OWZmZuZSBkaWUgU2VpdGUgenVtIFp1ZsO8Z2VuIHVuZCBCZWFyYmVpdGVuIGR1cmNoIEF1c3dhaGw6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmF1bHQgaXRlbSBoYXMgYmVlbiBzZXQgeWV0ISBTdGFydCBicm93c2luZyBhcnRpY2xlcyBpbiB0aGUnfSA9ICdLZWluIEVpbnN0aWVnc2FydGlrZWwgZ2VzZXR6dCEgRHVyY2hzdWNoZSBkaWUgRkFRcyBpbSc7CgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAgICAgJ1Jlc3RvcmluZyB0aGVzZSBzZXR0aW5ncyB3aWxsIGVyYXNlIGFsbCBkYXRhLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZD8nLAogICAgKTsKCgp9CgoxOwo=</File>
        <File Location="Kernel/Language/es_FAQExtendedNavigation.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0ZBUUV4dGVuZGVkTmF2aWdhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYmxlIG9mIENvbnRlbnRzJ30gPSAnVGFibGEgZGUgQ29udGVuaWRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrIHRvIEZBUSBIb21lJ30gPSAnUMOhZ2luYSBpbmljaWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2sgdG8gdG9wJ30gPSAnVm9sdmVyIGFsIGluaWNpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJY29uIChzdmcpJ30gPSAnSWNvbm8gKHN2ZyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIEljb24nfSA9ICdDYXJnYXIgSWNvbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGFuIGljb24gaW4gU1ZHIGZvcm1hdCB0byB1cGxvYWQgaXQuJ30gPSAnU2VsZWNjaW9uZSB1biBpY29ubyBlbiBmb3JtYXRvIFNWRyBwYXJhIGNhcmdhcmxvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaWRlYmFyIFNldHRpbmdzJ30gPSAnR2VzdGnDs24gZGUgbGEgQmFycmEgTGF0ZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIFNldHRpbmdzJ30gPSAnRmlsdHJhciBDb25maWd1cmFjaW9uZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRkFRIFNpZGViYXIgU2V0dGluZ3MnfSA9ICdHZXN0acOzbiBkZSBsYSBCYXJyYSBMYXRlcmFsIGRlbCBGQVEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9hZCBTZXR0aW5ncyd9ID0gJ0NhcmdhciBDb25maWd1cmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZhdWx0IEZBUSBJdGVtJ30gPSAnQXJ0w61jdWxvIGRlbCBGQVEgcG9yIGRlZmVjdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tIEdyb3VwIE9yZGVyJ30gPSAnT3JkZW4gcGVyc29uYWxpemFkbyBkZSBsb3MgZ3J1cG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgVXAnfSA9ICdNb3ZlciBBcnJpYmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBEb3duJ30gPSAnTW92ZXIgQWJham8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVpY2tzdGFydCBMaW5rcyd9ID0gJ0VubGFjZXMgZGUgQWNjZXNvIFLDoXBpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0dGluZ3MgZm9yJ30gPSAnQ29uZmlndXJhY2nDs24gcGFyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNldCBTZXR0aW5nJ30gPSAnUmVzdGFibGVjZXIgY29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdG9yaW5nIHRoZXNlIHNldHRpbmdzIHdpbGwgZXJhc2UgYWxsIGRhdGEuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPyd9ID0gJ0FsIHJlc3RhYmxlY2VyIGVzdGEgY29uZmlndXJhY2nDs24sIHRvZG9zIGxvcyBkYXRvcyBzZSBwZXJkZXJhbi4gRXN0YSBzZWd1cm8gZGUgcHJvY2VkZXI/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHRpbmdzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkISd9ID0gJ0NvbmZpZ3VyYWNpw7NuIGFjdHVhbGl6YWRhIGNvcnJlY3RhbWVudGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHRpbmdzIHN1Y2Nlc3NmdWxseSByZXNldCEnfSA9ICdDb25maWd1cmFjacOzbiByZXN0YWJsZWNpZGEgY29ycmVjdGFtZW50ZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFuZ3VhZ2UgY29uZmlndXJhdGlvbiBsaW1pdCByZWFjaGVkIGZvciB0aGUgaW50ZXJmYWNlOiAlcyEnfSA9ICdMaW1pdGUgZGUgY29uZmlndXJhY2nDs24gZGUgaWRpb21hcyBhbGNhbnphZG8gcGFyYSBsYSBpbnRlcmZhejogJXMhJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmUgdGhlIHNpZGViYXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gdGhlIE9UT0JPIGxhbmd1YWdlIGFuZCBpbnRlcmZhY2UnfSA9ICdDb25maWd1cmUgbG9zIHBhcsOhbWV0cm9zIGRlIGxhIGJhcnJhIGxhdGVyYWwgc2Vnw7puIGVsIGlkaW9tYSB5IGxhIGludGVyZmF6IGRlIE9UT0JPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UT0JPIGludGVyZmFjZSB3aGVyZSB0aGUgc2lkZWJhciB3aWxsIGJlIGRpc3BsYXllZC4nfSA9ICdJbnRlcmZheiBkZSBPVE9CTyBkb25kZSBzZSBtb3N0cmFyw6EgbGEgYmFycmEgbGF0ZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlclwncyBsYW5ndWFnZSBpbiB0aGUgT1RPQk8gaW50ZXJmYWNlLid9ID0gJ0lkaW9tYSBkZWwgdXN1YXJpbyBlbiBsYSBpbnRlcmZheiBkZSBPVE9CTy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IHRoZSBkZWZhdWx0IGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgem9vbSB2aWV3IHdoZW4gdGhlIEZBUSBsb2Fkcy4nfSA9ICdTZWxlY2Npb25lIGVsIGFydMOtY3VsbyBwb3IgZGVmZWN0byBxdWUgc2UgbW9zdHJhcsOhIGVuIGxhIHZpc3RhIGRlIHpvb20gY3VhbmRvIHNlIGNhcmd1ZSBlbCBGQVEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHF1aWNrIGxpbmsgZ3JvdXBzIGluIHRoZSBGQVEgd2lsbCBiZSBkaXNwbGF5ZWQuJ30gPSAnRGVmaW5hIGVsIG9yZGVuIGVuIGVsIHF1ZSBzZSBtb3N0cmFyw6FuIGxvcyBncnVwb3MgZGUgZW5sYWNlcyByw6FwaWRvcyBlbiBlbCBGQVEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIGxpbmtzIHRvIHRoZSBGQVEgYXJ0aWNsZXMuIFRoZXkgbXVzdCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6J30gPSAnRGVmaW5pY2nDs24gZGUgbG9zIGVubGFjZXMgYSBsb3MgYXJ0w61jdWxvcyBkZWwgRkFRLiBEZWJlbiBjb25maWd1cmFyc2UgZGUgbGEgc2lndWllbnRlIG1hbmVyYTonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW4gdGhlIHRleHQgZmllbGQ6IE5hbWUgb2YgdGhlIGdyb3VwIHRvIGNvbnNvbGlkYXRlIHRoZSBsaW5rcy4gVXAgdG8gdHdvIGxldmVscyBvZiBkZXB0aCBjYW4gYmUgZGVmaW5lZC4gVXNlIHRoZSBzeW50YXggIkdyb3VwOjpTdWJncm91cCIgd2hlbiBkZWZpbmluZyBzdWJncm91cHMuJ30gPSAnRW4gZWwgY2FtcG8gZGUgdGV4dG86IE5vbWJyZSBkZWwgZ3J1cG8gcGFyYSBjb25zb2xpZGFyIGxvcyBlbmxhY2VzLiBTZSBwdWVkZW4gZGVmaW5pciBoYXN0YSBkb3Mgbml2ZWxlcyBkZSBwcm9mdW5kaWRhZC4gVXNlIGxhIHNpbnRheGlzICJHcnVwbzo6U3ViZ3J1cG8iIGFsIGRlZmluaXIgc3ViZ3J1cG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGQVEgQXJ0aWNsZTogU2VsZWN0IHRoZSBGQVEgYXJ0aWNsZSBmcm9tIHRoZSBsaXN0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNpZGViYXIuJ30gPSAnQXJ0w61jdWxvIGRlbCBGQVE6IFNlbGVjY2lvbmUgZWwgYXJ0w61jdWxvIGRlbCBGQVEgZGUgbGEgbGlzdGEgcXVlIHNlIG1vc3RyYXLDoSBlbiBsYSBiYXJyYSBsYXRlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgIlJlc2V0IHNldHRpbmdzIiBidXR0b24gb25seSBhcHBsaWVzIHRvIHRoZSBzZXR0aW5ncyBjdXJyZW50bHkgYmVpbmcgZWRpdGVkLid9ID0gJ0VsIGJvdMOzbiAiUmVzdGFibGVjZXIgY29uZmlndXJhY2nDs24iIHNvbG8gYXBsaWNhIGEgbG9zIGFqdXN0ZXMgcXVlIHNlIGVzdMOhbiBlZGl0YW5kby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGF1bmNoIHRoZSBBZGQvRWRpdCBTaWRlYmFyIFNldHRpbmdzIHNjcmVlbiBieSBzZWxlY3Rpbmc6J30gPSAnQ2FyZ3VlIGxhIHBhbnRhbGxhIGRlIEFncmVnYXIvRWRpdGFyIENvbmZpZ3VyYWNpw7NuIGRlIGxhIEJhcnJhIExhdGVyYWwgc2VsZWNjaW9uYW5kbzonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmYXVsdCBpdGVtIGhhcyBiZWVuIHNldCB5ZXQhIFN0YXJ0IGJyb3dzaW5nIGFydGljbGVzIGluIHRoZSd9ID0gJ8KhTm8gc2UgaGEgZXN0YWJsZWNpZG8gdW4gYXJ0w61jdWxvIHBvciBkZWZlY3RvIHRvZGF2w61hISBDb21pZW5jZSBhIG5hdmVnYXIgbG9zIGFydMOtY3Vsb3MgZW4gZWwnOwoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgICAgICdSZXN0b3JpbmcgdGhlc2Ugc2V0dGluZ3Mgd2lsbCBlcmFzZSBhbGwgZGF0YS4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQ/JywKICAgICk7Cgp9CgoxOwo=</File>
        <File Location="Kernel/Modules/AgentFAQAutoComplete.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRGQVFBdXRvQ29tcGxldGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIFVSSTo6RXNjYXBlICAgICAgICAgICAgICAgICAgIHF3KHVyaV9lc2NhcGVfdXRmOCB1cmlfdW5lc2NhcGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRGQVFPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnR2V0RkFRSXRlbXMnICkgewogICAgICAgIG15ICVTZWFyY2hQYXJhbXM7CiAgICAgICAgbXkgQEl0ZW1zOwoKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoUXVlcnkgVXNlcklEIE1hcmtlcikpIHsKICAgICAgICAgICAgaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJE5lZWRlZCApICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZDogJE5lZWRlZCEiCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybiBASXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWFyY2hQYXJhbXN7V2hhdH0gICA9ICcqJyAuIHVyaV91bmVzY2FwZSggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1F1ZXJ5JyApICkgLiAnKic7CiAgICAgICAgJFNlYXJjaFBhcmFtc3tVc2VySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VzZXJJRCcgKTsKICAgICAgICAkU2VhcmNoUGFyYW1ze1ZhbGlkfSAgPSAxOwoKICAgICAgICBteSAkTWFya2VyID0gdXJpX3VuZXNjYXBlKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTWFya2VyJyApICk7CiAgICAgICAgbXkgJEhvb2sgICA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpGQVFIb29rJyk7CgogICAgICAgIG15IEBJRHMgPSAkRkFRT2JqZWN0LT5GQVFTZWFyY2goCiAgICAgICAgICAgICVTZWFyY2hQYXJhbXMKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJElEIChASURzKSB7CiAgICAgICAgICAgIG15ICVGQVEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgICAgICAgID0+ICRJRCwKICAgICAgICAgICAgICAgIEl0ZW1GaWVsZHMgICAgPT4gMSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQEl0ZW1zLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkICAgICAgPT4gJE1hcmtlciAuICIkSG9vayAkRkFRe051bWJlcn0gLSAkRkFRe1RpdGxlfSIsICAgICAgICAgICAgICNJRCBNdXN0IGNvbnRhaW4gbWFya2VyCiAgICAgICAgICAgICAgICAgICAgdGV4dCAgICA9PiAiJEhvb2sgJEZBUXtOdW1iZXJ9IC0gJEZBUXtUaXRsZX0iLAogICAgICAgICAgICAgICAgICAgIGl0ZW1faWQgPT4gJElELAogICAgICAgICAgICAgICAgICAgIGxpbmsgICAgPT4gIi9vdG9iby9pbmRleC5wbD9BY3Rpb249QWdlbnRGQVFab29tO0l0ZW1JRD0kSUQ7TmF2PTsiLAogICAgICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICNDb2RpZmljYSBsYSByZXNwdWVzdGEgYSBkZXZvbHZlciB2aWEgQUpBWAogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcQEl0ZW1zLAogICAgICAgICk7CgogICAgICAgICNSZXRvcm5hIHJlc3B1ZXN0YQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSA9PiAxLAogICAgICAgICk7CiAgICB9Cgp9CgoxOwo=</File>
        <File Location="Kernel/Modules/AgentFAQSidebar.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRGQVFTaWRlYmFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QuCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBQZXJtaXNzaW9uIGNoZWNrLgogICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBuZWVkIHJ3IHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBHZXQgcGFyYW1ldGVycyBmcm9tIHdlYiByZXF1ZXN0LgogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KFNpZGViYXJMYW5ndWFnZSBMYW5ndWFnZSBJbnRlcmZhY2UgRGVmYXVsdEl0ZW1JRCBDdXN0b21Hcm91cE9yZGVyIENvbmZpZ0lEIEFydGljbGVDb3VudCkpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgI0xvYWQgZGVmaW5lZCBMYW5ndWFnZXMgZm9yIHRoZSBzeXN0ZW0KICAgIG15ICVTeXN0ZW1MYW5ndWFnZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRVc2VkTGFuZ3VhZ2VzJykgfTsKCiAgICAjTG9hZCBsYW5ndWFnZSBkZXNjcmlwdGlvbnMKICAgIG15ICVTeXN0ZW1MYW5ndWFnZXNOYXRpdmUgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRVc2VkTGFuZ3VhZ2VzTmF0aXZlJykgfTsKCiAgICAjRmlsbCBoYXNoIGRhdGEgZm9yIGxhbmd1YWdlIERyb3Bkb3duCiAgICBmb3IgbXkgJExhbmd1YWdlICgga2V5cyAlU3lzdGVtTGFuZ3VhZ2VzICkgewogICAgICAgICRTeXN0ZW1MYW5ndWFnZXN7JExhbmd1YWdlfSA9ICIoJExhbmd1YWdlKSAtICRTeXN0ZW1MYW5ndWFnZXNOYXRpdmV7JExhbmd1YWdlfSI7CiAgICB9CgogICAgJEdldFBhcmFte1NpZGViYXJMYW5ndWFnZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVN5c3RlbUxhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NpZGViYXJMYW5ndWFnZScsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTaWRlYmFyTGFuZ3VhZ2V9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcsCiAgICAgICAgVHJhbnNsYXRhYmxlID0+IDAKICAgICk7CgogICAgbXkgJUludGVyZmFjZXMgPSAoCiAgICAgICAgJ0FnZW50JyAgICA9PiAnQWdlbnQnLAogICAgICAgICdDdXN0b21lcicgPT4gJ0N1c3RvbWVyJywKICAgICAgICAnUHVibGljJyAgID0+ICdQdWJsaWMnCiAgICApOwoKICAgICRHZXRQYXJhbXtJbnRlcmZhY2VzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVJbnRlcmZhY2VzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnSW50ZXJmYWNlJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ludGVyZmFjZX0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQgJywKICAgICAgICBUcmFuc2xhdGFibGUgPT4gMAogICAgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIExhbmd1YWdlcyA9PiBcJVN5c3RlbUxhbmd1YWdlcywKICAgICAgICAgICAgJUdldFBhcmFtCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUVNpZGViYXInLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENoYW5nZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2VBY3Rpb24nICkgewoKICAgICAgICAjIENoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uLgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoTGFuZ3VhZ2UgSW50ZXJmYWNlKSkgewogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXskUGFyYW1OYW1lfSApIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05lZWQgJXMhJywgJFBhcmFtTmFtZSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte0NvbmZpZ0lEfSA9IHNwcmludGYoICIlMDNkIiwgJEdldFBhcmFte0NvbmZpZ0lEfSApOwoKICAgICAgICBteSAkU2V0dGluZ05hbWUgPSAiJEdldFBhcmFte0ludGVyZmFjZX1GQVFTaWRlQmFyOjpBcnRpY2xlcyMjIyRHZXRQYXJhbXtDb25maWdJRH0iOwogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBteSBAQXJ0aWNsZXM7CgogICAgICAgIG15ICVDb25maWcgPSAoCiAgICAgICAgICAgIExhbmd1YWdlICAgICAgICAgPT4gJEdldFBhcmFte0xhbmd1YWdlfSwKICAgICAgICAgICAgRGVmYXVsdEl0ZW1JRCAgICA9PiAkR2V0UGFyYW17RGVmYXVsdEl0ZW1JRH0sCiAgICAgICAgICAgIEN1c3RvbUdyb3VwT3JkZXIgPT4gJEdldFBhcmFte0N1c3RvbUdyb3VwT3JkZXJ9CiAgICAgICAgKTsKCiAgICAgICAgZm9yICggbXkgJEFydGljbGVDb3VudCA9IDE7ICRBcnRpY2xlQ291bnQgPD0gJEdldFBhcmFte0FydGljbGVDb3VudH07ICRBcnRpY2xlQ291bnQrKyApIHsKICAgICAgICAgICAgbXkgJEFydGljbGVHcm91cCAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZV8iIC4gJEFydGljbGVDb3VudCApIHx8ICcnOwogICAgICAgICAgICBteSAkQXJ0aWNsZUl0ZW1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJdGVtSURfIiAuICRBcnRpY2xlQ291bnQgKSAgfHwgJyc7CgogICAgICAgICAgICBpZiAoJEFydGljbGVHcm91cCkgewogICAgICAgICAgICAgICAgcHVzaCBAQXJ0aWNsZXMsICRBcnRpY2xlR3JvdXAgLiAiOjoiIC4gJEFydGljbGVJdGVtSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRDb25maWd7QXJ0aWNsZXN9ID0gXEBBcnRpY2xlczsKCiAgICAgICAgbXkgQERlcGxveVNldHRpbmdzOwoKICAgICAgICBteSAkRXhjbHVzaXZlTG9ja0dVSUQgPSAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nTG9jaygKICAgICAgICAgICAgTmFtZSAgID0+ICRTZXR0aW5nTmFtZSwKICAgICAgICAgICAgRm9yY2UgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiB1bmxlc3MgJEV4Y2x1c2l2ZUxvY2tHVUlEOwoKICAgICAgICBteSAlVXBkYXRlUmVzdWx0ID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VwZGF0ZSgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJFNldHRpbmdOYW1lLAogICAgICAgICAgICBJc1ZhbGlkICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBFZmZlY3RpdmVWYWx1ZSAgICA9PiBcJUNvbmZpZywKICAgICAgICAgICAgRXhjbHVzaXZlTG9ja0dVSUQgPT4gJEV4Y2x1c2l2ZUxvY2tHVUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggJFVwZGF0ZVJlc3VsdHtTdWNjZXNzfSApIHsKICAgICAgICAgICAgcHVzaCBARGVwbG95U2V0dGluZ3MsICRTZXR0aW5nTmFtZTsKICAgICAgICB9CgogICAgICAgIG15ICVEZXBsb3ltZW50UmVzdWx0ID0gJFN5c0NvbmZpZ09iamVjdC0+Q29uZmlndXJhdGlvbkRlcGxveSgKICAgICAgICAgICAgQ29tbWVudHMgICAgICA9PiAnU2lkZWJhciBzZXR0aW5nICcgLiAkU2V0dGluZ05hbWUgLiAnIG1vZGlmaWVkIGJ5OiAnIC4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIEZvcmNlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgRGlydHlTZXR0aW5ncyA9PiBcQERlcGxveVNldHRpbmdzLAogICAgICAgICk7CgogICAgICAgIGlmICggISREZXBsb3ltZW50UmVzdWx0e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAkRXJyb3J7ICREZXBsb3ltZW50UmVzdWx0e0Vycm9yfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0NoYW5nZScsCiAgICAgICAgICAgICAgICBMYW5ndWFnZXMgPT4gXCVTeXN0ZW1MYW5ndWFnZXMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUVNpZGViYXInLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07Tm90aWZpY2F0aW9uPVVwZGF0ZSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIERlbGV0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScgKSB7CgogICAgICAgICMgQ2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhMYW5ndWFnZSBJbnRlcmZhY2UpKSB7CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyRQYXJhbU5hbWV9ICkgewoKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnTmVlZCAlcyEnLCAkUGFyYW1OYW1lICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkR2V0UGFyYW17Q29uZmlnSUR9ID0gc3ByaW50ZiggIiUwM2QiLCAkR2V0UGFyYW17Q29uZmlnSUR9ICk7CgogICAgICAgIG15ICRTZXR0aW5nTmFtZSA9ICIkR2V0UGFyYW17SW50ZXJmYWNlfUZBUVNpZGVCYXI6OkFydGljbGVzIyMjJEdldFBhcmFte0NvbmZpZ0lEfSI7CgogICAgICAgIG15IEBEZXBsb3lTZXR0aW5nczsKCiAgICAgICAgbXkgJEV4Y2x1c2l2ZUxvY2tHVUlEID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ0xvY2soCiAgICAgICAgICAgIE5hbWUgICA9PiAkU2V0dGluZ05hbWUsCiAgICAgICAgICAgIEZvcmNlICA9PiAxLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVzdWx0ID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1Jlc2V0KAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAkU2V0dGluZ05hbWUsCiAgICAgICAgICAgIEV4Y2x1c2l2ZUxvY2tHVUlEID0+ICRFeGNsdXNpdmVMb2NrR1VJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFJlc3VsdCkgewogICAgICAgICAgICBwdXNoIEBEZXBsb3lTZXR0aW5ncywgJFNldHRpbmdOYW1lOwogICAgICAgIH0KCiAgICAgICAgbXkgJURlcGxveW1lbnRSZXN1bHQgPSAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWd1cmF0aW9uRGVwbG95KAogICAgICAgICAgICBDb21tZW50cyAgICAgID0+ICdTaWRlYmFyIHNldHRpbmcgJyAuICRTZXR0aW5nTmFtZSAuICcgZGVsZXRlZCBieTogJyAuICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICBGb3JjZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIERpcnR5U2V0dGluZ3MgPT4gXEBEZXBsb3lTZXR0aW5ncywKICAgICAgICApOwoKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgIGlmICggISREZXBsb3ltZW50UmVzdWx0e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAkRXJyb3J7ICREZXBsb3ltZW50UmVzdWx0e0Vycm9yfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0NoYW5nZScsCiAgICAgICAgICAgICAgICBMYW5ndWFnZXMgPT4gXCVTeXN0ZW1MYW5ndWFnZXMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUVNpZGViYXInLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07Tm90aWZpY2F0aW9uPVJlc2V0IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgIG15ICVOb3RpZmljYXRpb25UZXh0ID0gKAogICAgICAgICAgICBVcGRhdGUgPT4gVHJhbnNsYXRhYmxlKCdTZXR0aW5ncyBzdWNjZXNzZnVsbHkgdXBkYXRlZCEnKSwKICAgICAgICAgICAgUmVzZXQgID0+IFRyYW5zbGF0YWJsZSgnU2V0dGluZ3Mgc3VjY2Vzc2Z1bGx5IHJlc2V0IScpLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb25UZXh0eyROb3RpZmljYXRpb259ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiAkTm90aWZpY2F0aW9uVGV4dHskTm90aWZpY2F0aW9ufSApOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPl9PdmVydmlldygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFN5c3RlbUxhbmd1YWdlcyA9PiBcJVN5c3RlbUxhbmd1YWdlcwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRGQVFTaWRlYmFyJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX0VkaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJUFnZW50RGF0YSAgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZBUVNpZGVCYXI6OkFydGljbGVzJykgfTsKICAgIG15ICVQdWJsaWNEYXRhICAgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1B1YmxpY0ZBUVNpZGVCYXI6OkFydGljbGVzJykgfTsKCiAgICBteSAlU2VsZWN0ZWREYXRhID0gJFBhcmFte0ludGVyZmFjZX0gZXEgJ0FnZW50JwogICAgICAgID8gJUFnZW50RGF0YQogICAgICAgIDogJFBhcmFte0ludGVyZmFjZX0gZXEgJ0N1c3RvbWVyJyA/ICVDdXN0b21lckRhdGEKICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHVibGljRGF0YTsKCiAgICBteSAlSW50ZXJmYWNlRGF0YTsKICAgIG15ICRDb25maWdJRDsKICAgIG15ICRDb25maWdMaW1pdCA9IGludCgga2V5cyAlU2VsZWN0ZWREYXRhICk7CiAgICBteSAkQ29uZmlnQ291bnQgPSAwOwogICAgbXkgJE5leHRDb25maWcgID0gMDsKICAgICRQYXJhbXtTaWRlYmFyTGFuZ3VhZ2V9IHx8PSAnJzsKCiAgICBDT05GSUc6CiAgICBmb3IgbXkgJENvbmZpZyAoIHNvcnQga2V5cyAlU2VsZWN0ZWREYXRhICkgewoKICAgICAgICAjIENvbGxlY3QgdGhlIGNvdW50IG9mIGNvbmZpZ3VyYXRpb25zIHdpdGggbGFuZ3VhZ2UgZGVmaW5lZAogICAgICAgIGlmICggJFNlbGVjdGVkRGF0YXskQ29uZmlnfS0+e0xhbmd1YWdlfSApIHsKICAgICAgICAgICAgJENvbmZpZ0NvdW50Kys7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTmV4dENvbmZpZyA9ICROZXh0Q29uZmlnID09IDAgPyBpbnQoJENvbmZpZykgOiAkTmV4dENvbmZpZzsKICAgICAgICB9CgogICAgICAgIG5leHQgQ09ORklHIGlmICRTZWxlY3RlZERhdGF7JENvbmZpZ30tPntMYW5ndWFnZX0gbmUgJFBhcmFte1NpZGViYXJMYW5ndWFnZX07CgogICAgICAgICVJbnRlcmZhY2VEYXRhID0gJXsgJFNlbGVjdGVkRGF0YXskQ29uZmlnfSB9OwogICAgICAgICRJbnRlcmZhY2VEYXRhe0xhbmd1YWdlfSB8fD0gJFBhcmFte1NpZGViYXJMYW5ndWFnZX07CiAgICAgICAgJENvbmZpZ0lEID0gaW50KCRDb25maWcpOwogICAgICAgIGxhc3QgQ09ORklHOwogICAgfQoKICAgIGlmICggJENvbmZpZ0NvdW50ID09ICRDb25maWdMaW1pdCAmJiAhJENvbmZpZ0lEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0xhbmd1YWdlIGNvbmZpZ3VyYXRpb24gbGltaXQgcmVhY2hlZCBmb3IgdGhlIGludGVyZmFjZTogJXMhJywgJFBhcmFte0ludGVyZmFjZX0gKSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkQ29uZmlnQ291bnQgPCAkQ29uZmlnTGltaXQgJiYgISRDb25maWdJRCApIHsKICAgICAgICAkQ29uZmlnSUQgPSAkTmV4dENvbmZpZzsKICAgIH0KCiAgICBteSBAQ3VzdG9tR3JvdXBPcmRlcjsKCiAgICBpZiAoICRJbnRlcmZhY2VEYXRhe0N1c3RvbUdyb3VwT3JkZXJ9ICkgewogICAgICAgIEBDdXN0b21Hcm91cE9yZGVyID0gc3BsaXQgLywvLCAkSW50ZXJmYWNlRGF0YXtDdXN0b21Hcm91cE9yZGVyfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICVPcmRlckl0ZW1zOwoKICAgICAgICBmb3IgbXkgJEFydGljbGUgKCBAeyAkSW50ZXJmYWNlRGF0YXtBcnRpY2xlc30gfSApIHsKICAgICAgICAgICAgbXkgQENvbnRlbnQgPSBzcGxpdCAvOjovLCAkQXJ0aWNsZTsKICAgICAgICAgICAgJE9yZGVySXRlbXN7ICRDb250ZW50WzBdIH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgQEN1c3RvbUdyb3VwT3JkZXIgPSBzb3J0IGtleXMgJU9yZGVySXRlbXM7CiAgICB9CgogICAgQEN1c3RvbUdyb3VwT3JkZXIgPSBtYXAge3MvXlxzK3xccyskLy9ncn0gQEN1c3RvbUdyb3VwT3JkZXI7CiAgICBteSAkQWN0aW9uID0gJ0VkaXQnOwoKICAgIGlmICggISRJbnRlcmZhY2VEYXRhe0xhbmd1YWdlfSApIHsKICAgICAgICAkQWN0aW9uID0gJ0FkZCc7CiAgICAgICAgJEludGVyZmFjZURhdGF7TGFuZ3VhZ2V9ID0gJFBhcmFte1NpZGViYXJMYW5ndWFnZX07CiAgICB9CgogICAgbXkgJUZBUVNlYXJjaFBhcmFtZXRlcjsKICAgIG15ICRTZWFyY2hMaW1pdCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpLZXl3b3JkQXJ0aWNlTGlzdDo6U2VhcmNoTGltaXQnKTsKICAgIG15IEBMYW5ndWFnZXMgICA9IGtleXMgJXsgJFBhcmFte0xhbmd1YWdlc30gfTsKCiAgICBteSBATGFuZ3VhZ2VJRHM7CiAgICBteSAlRkFRQXJ0aWNsZXM7CgogICAgTEFOR1VBR0VOQU1FOgogICAgZm9yIG15ICRMYW5ndWFnZU5hbWUgKEBMYW5ndWFnZXMpIHsKICAgICAgICBuZXh0IExBTkdVQUdFTkFNRSBpZiAhJExhbmd1YWdlTmFtZTsKCiAgICAgICAgbXkgJExhbmd1YWdlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyktPkxhbmd1YWdlTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICRMYW5ndWFnZU5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBMQU5HVUFHRU5BTUUgaWYgISRMYW5ndWFnZUlEOwogICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAkTGFuZ3VhZ2VJRDsKICAgIH0KCiAgICBpZiAoQExhbmd1YWdlcykgewogICAgICAgICRGQVFTZWFyY2hQYXJhbWV0ZXJ7TGFuZ3VhZ2VJRHN9ID0gXEBMYW5ndWFnZUlEczsKICAgIH0KCiAgICAjIEdldCB0aGUgcmVsZXZhbnQgRkFRIGFydGljbGVzLgogICAgbXkgQEZBUUFydGljbGVJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyktPkZBUVNlYXJjaCgKICAgICAgICAlRkFRU2VhcmNoUGFyYW1ldGVyLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydGQVFJRCddLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydEb3duJ10sCiAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAkU2VhcmNoTGltaXQsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBmb3IgbXkgJEl0ZW1JRCAoQEZBUUFydGljbGVJRHMpIHsKICAgICAgICBteSAlRkFRID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpLT5GQVFHZXQoCiAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAwLAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkRkFRQXJ0aWNsZXN7JEl0ZW1JRH0gPSAiWyRGQVF7TGFuZ3VhZ2V9XSAkRkFRe1RpdGxlfSI7CiAgICB9CgogICAgJFBhcmFte0RlZmF1bHRJdGVtSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJUZBUUFydGljbGVzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnRGVmYXVsdEl0ZW1JRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRJbnRlcmZhY2VEYXRhe0RlZmF1bHRJdGVtSUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcsCiAgICAgICAgVHJhbnNsYXRhYmxlID0+IDAKICAgICk7CgogICAgJFBhcmFte0l0ZW1OZXh0SURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJUZBUUFydGljbGVzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnSXRlbUlEX05leHRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+IDAsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQgJywKICAgICAgICBUcmFuc2xhdGFibGUgPT4gMAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvbkxpc3QnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbQogICAgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0hpbnQnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3VXBkYXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlSW50ZXJmYWNlRGF0YSwKICAgICAgICAgICAgQXJ0aWNsZUNvdW50ID0+IGludCggQHsgJEludGVyZmFjZURhdGF7QXJ0aWNsZXN9IH0gKSB8fCAxLAogICAgICAgICAgICBDb25maWdJRCAgICAgPT4gJENvbmZpZ0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICcnCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKEBDdXN0b21Hcm91cE9yZGVyKSB7CiAgICAgICAgbXkgJENvdW50T3JkZXIgPSAxOwoKICAgICAgICBmb3IgbXkgJEdyb3VwTmFtZSAoQEN1c3RvbUdyb3VwT3JkZXIpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21Hcm91cE9yZGVySXRlbXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3JkZXIgICA9PiAkQ291bnRPcmRlciwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRHcm91cE5hbWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDb3VudE9yZGVyKys7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDb3VudCA9IDE7CgogICAgaWYgKCBAeyAkSW50ZXJmYWNlRGF0YXtBcnRpY2xlc30gfSA+IDAgKSB7CiAgICAgICAgZm9yIG15ICRBcnRpY2xlICggQHsgJEludGVyZmFjZURhdGF7QXJ0aWNsZXN9IH0gKSB7CgogICAgICAgICAgICBteSBAQ29udGVudCA9ICRBcnRpY2xlID1+IC9eKC4qKTo6KFxkKykkLzsKCiAgICAgICAgICAgICRQYXJhbXtJdGVtSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRkFRQXJ0aWNsZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0l0ZW1JRF8nIC4gJENvdW50LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDb250ZW50WzFdLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCAnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlID0+IDAKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSb3dBcnRpY2xlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgPT4gJENvbnRlbnRbMF0sCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEU3RyZyA9PiAkUGFyYW17SXRlbUlEU3RyZ30KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAkUGFyYW17SXRlbUlEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRkFRQXJ0aWNsZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnSXRlbUlEXzEnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gMCwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcsCiAgICAgICAgICAgIFRyYW5zbGF0YWJsZSA9PiAwCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Um93QXJ0aWNsZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ291bnQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ29udGVudCAgICA9PiAiIiwKICAgICAgICAgICAgICAgIEl0ZW1JRFN0cmcgPT4gJFBhcmFte0l0ZW1JRFN0cmd9CiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdIZWFkZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBBY3Rpb24gPT4gJEFjdGlvbiB8fCAnJywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9PdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAlQWdlbnREYXRhICAgID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudEZBUVNpZGVCYXI6OkFydGljbGVzJykgfTsKICAgIG15ICVDdXN0b21lckRhdGEgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRkFRU2lkZUJhcjo6QXJ0aWNsZXMnKSB9OwogICAgbXkgJVB1YmxpY0RhdGEgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRkFRU2lkZUJhcjo6QXJ0aWNsZXMnKSB9OwogICAgbXkgQERhdGE7CgogICAgbXkgJVN5c3RlbUxhbmd1YWdlcyA9ICV7ICRQYXJhbXtTeXN0ZW1MYW5ndWFnZXN9IH07CgogICAgQ09ORklHX0FHRU5UOgogICAgZm9yIG15ICRJbnRlcmZhY2UgKHF3KEFnZW50IEN1c3RvbWVyIFB1YmxpYykpIHsKICAgICAgICBteSAlU2VsZWN0ZWREYXRhID0gJEludGVyZmFjZSBlcSAnQWdlbnQnCiAgICAgICAgICAgID8gJUFnZW50RGF0YQogICAgICAgICAgICA6ICRJbnRlcmZhY2UgZXEgJ0N1c3RvbWVyJyA/ICVDdXN0b21lckRhdGEKICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHVibGljRGF0YTsKCiAgICAgICAgQ09ORklHOgogICAgICAgIGZvciBteSAkQ29uZmlnICggc29ydCBrZXlzICVTZWxlY3RlZERhdGEgKSB7CiAgICAgICAgICAgIG5leHQgQ09ORklHIGlmICEkU2VsZWN0ZWREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9OwoKICAgICAgICAgICAgbXkgJUZBUTsKCiAgICAgICAgICAgIGlmICggJFNlbGVjdGVkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9ICkgewogICAgICAgICAgICAgICAgJUZBUSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKS0+RkFRR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJFNlbGVjdGVkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIEl0ZW1GaWVsZHMgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgICAgICAgICAgQ29uZmlnSUQgICAgICAgICAgICA9PiBpbnQoJENvbmZpZyksCiAgICAgICAgICAgICAgICBMYW5ndWFnZSAgICAgICAgICAgID0+ICRTZWxlY3RlZERhdGF7JENvbmZpZ30tPntMYW5ndWFnZX0sCiAgICAgICAgICAgICAgICBMYW5ndWFnZURlc2NyaXB0aW9uID0+ICRTeXN0ZW1MYW5ndWFnZXN7ICRTZWxlY3RlZERhdGF7JENvbmZpZ30tPntMYW5ndWFnZX0gfSwKICAgICAgICAgICAgICAgIERlZmF1bHRJdGVtSUQgICAgICAgPT4gJFNlbGVjdGVkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9LAogICAgICAgICAgICAgICAgRkFRVGl0bGUgICAgICAgICAgICA9PiAkRkFRe1RpdGxlfSB8fCAnJwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7fSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGaWx0ZXInLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uTGlzdCcsCiAgICAgICAgRGF0YSA9PiB7fSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25MYW5ndWFnZScsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnSGludE92ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0KICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtCiAgICApOwoKICAgIGlmIChARGF0YSkgewogICAgICAgIGZvciBteSAkU2V0dGluZyAoQERhdGEpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRTZXR0aW5nfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIE90aGVyd2lzZSBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQuCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/FAQ.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gYTQxZjUwNWY4Y2U2MDBmODgzNWU5MDc4MjI2MDI2Yzk1ODk1MDBiOSAtIEtlcm5lbC9TeXN0ZW0vRkFRLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZBUTsKCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlBlcmw6OlBhcmFtT2JqZWN0KQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIE1JTUU6OkJhc2U2NCBxdygpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIHBhcmVudCBxdygKICAgIEtlcm5lbDo6U3lzdGVtOjpGQVFTZWFyY2gKICAgIEtlcm5lbDo6U3lzdGVtOjpGQVE6Okxhbmd1YWdlCiAgICBLZXJuZWw6OlN5c3RlbTo6RkFROjpDYXRlZ29yeQogICAgS2VybmVsOjpTeXN0ZW06OkZBUTo6U3RhdGUKICAgIEtlcm5lbDo6U3lzdGVtOjpGQVE6OlJlbGF0ZWRBcnRpY2xlCiAgICBLZXJuZWw6OlN5c3RlbTo6RkFROjpWb3RlCiAgICBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyCik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlR5cGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpGQVEgLSAgRkFRIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgRkFRIGZ1bmN0aW9ucy4gRS4gZy4gdG8gYWRkIEZBUXMgb3IgdG8gZ2V0IEZBUXMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkKICAgICRTZWxmLT57TGlrZUVzY2FwZVN0cmluZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+R2V0RGF0YWJhc2VGdW5jdGlvbignTGlrZUVzY2FwZVN0cmluZycpOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGRlZmF1bHQgb3B0aW9ucwogICAgJFNlbGYtPntWb3Rpbmd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlZvdGluZycpOwoKICAgICMgZ2V0IHRoZSBjYWNoZSBUVEwgKGluIHNlY29uZHMpCiAgICAkU2VsZi0+e0NhY2hlVFRMfSA9IGludCggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkNhY2hlVFRMJykgfHwgNjAgKiA2MCAqIDI0ICogMiApOwoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAjIGN1cnJlbnRseSB0aGVyZSBhcmUgbm8gRkFRIGV2ZW50IG1vZHVsZXMgYnV0IGlzIG5lZWRlZCB0byBpbml0aWFsaXplIG90aGVyd2lzZSBlcnJvcnMgYXJlCiAgICAjICAgICBsb2cgZHVlIHRvIHNlYXJjaGluZyB1bmRlZmluZWQgc2V0dGluZyBpbnRvIENvbmZpZ09iamVjdC4KICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnJywKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgRkFRR2V0KCkKCmdldCBhbiBGQVEgaXRlbQoKICAgIG15ICVGQVEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAxMjMsCiAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAwLCAgICAgICAgIyBPcHRpb25hbCwgZGVmYXVsdCAwLiBUbyBpbmNsdWRlIHRoZSBpdGVtIGZpZWxkIGNvbnRlbnQgZm9yIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgRkFRIGl0ZW0gb24gdGhlIHJldHVybiBzdHJ1Y3R1cmUuCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLCAgICAgICAgIyBPcHRpb25hbCwgZGVmYXVsdCAwLiBUbyBpbmNsdWRlIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBGQVEgaXRlbSBvbiB0aGUgcmV0dXJuIHN0cnVjdHVyZS4KICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAlRkFRID0gKAogICAgICAgIElEICAgICAgICAgICAgICAgID0+IDMyLAogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+IDMyLAogICAgICAgIEZBUUlEICAgICAgICAgICAgID0+IDMyLAogICAgICAgIE51bWJlciAgICAgICAgICAgID0+IDEwMDAzMiwKICAgICAgICBDYXRlZ29yeUlEICAgICAgICA9PiAnMicsCiAgICAgICAgQ2F0ZWdvcnlOYW1lJyAgICAgPT4gJ0NhdGVnb3J5QTo6Q2F0ZWdvcnlCJywKICAgICAgICBDYXRlZ29yeVNob3J0TmFtZSA9PiAnQ2F0ZWdvcnlCJywKICAgICAgICBMYW5ndWFnZUlEICAgICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICdlbicsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgPT4gJ0FydGljbGUgVGl0bGUnLAogICAgICAgIEFwcHJvdmVkICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciAwCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZCAgICAgICAgICAgICA9PiAndmFsaWQnLAogICAgICAgIEtleXdvcmRzICAgICAgICAgID0+ICdLZXlXb3JkMSBLZXlXb3JkMicsCiAgICAgICAgVm90ZXMgICAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG51bWJlciBvZiB2b3RlcwogICAgICAgIFZvdGVSZXN1bHQgICAgICAgID0+ICcwLjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBiZXR3ZWVuIDAuMDAgYW5kIDEwMC4wMAogICAgICAgIFN0YXRlSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgU3RhdGUgICAgICAgICAgICAgPT4gJ2ludGVybmFsIChhZ2VudCknLCAgICAgICAgICAgICAjIG9yICdleHRlcm5hbCAoY3VzdG9tZXIpJyBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAncHVibGljIChhbGwpJwogICAgICAgIFN0YXRlVHlwZUlEICAgICAgID0+IDEsCiAgICAgICAgU3RhdGVUeXBlTmFtZSAgICAgPT4gJ2ludGVybmFsJywgICAgICAgICAgICAgICAgICAgICAjIG9yICdleHRlcm5hbCcgb3IgJ3B1YmxpYycKICAgICAgICBDcmVhdGVkQnkgICAgICAgICA9PiAxLAogICAgICAgIENoYW5nZWQnICAgICAgICAgID0+ICcyMDExLTAxLTA1IDIxOjUzOjUwJywKICAgICAgICBDaGFuZ2VkQnkgICAgICAgICA9PiAnMScsCiAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgPT4gJzIwMTEtMDEtMDUgMjE6NTM6NTAnLAogICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICcxMjk0Mjg2MDMwLTMxLjE2OTcyOTcxMDQ3MzInLCAgIyBGQVEgQXJ0aWNsZSBuYW1lIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN5c3RlbXRpbWUgKyAnLScgKyByYW5kb20gbnVtYmVyCiAgICAgICAgU2VydmljZUxpc3QgICAgICAgPT4geyAnMScgPT4gJ0NvbXB1dGVyJyB9LCAgICAgICAgICAgIyBIYXNoIG9mIHJlbGF0ZWQgc2VydmljZXMKICAgICAgICBJY29uICAgICAgICAgICAgICA9PiAnc3ZnIHRleHQnCiAgICApOwoKICAgIG15ICVGQVEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAxMjMsCiAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAxLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAlRkFRID0gKAoKICAgICAgICAjIENvbXBhdGliaWxpdHkgSUQgbmFtZXMuCiAgICAgICAgSUQgICAgICAgICAgICAgICAgPT4gMzIsCiAgICAgICAgRkFRSUQgICAgICAgICAgICAgPT4gMzIsCgogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+IDMyLAogICAgICAgIE51bWJlciAgICAgICAgICAgID0+IDEwMDAzMiwKICAgICAgICBDYXRlZ29yeUlEICAgICAgICA9PiAnMicsCiAgICAgICAgQ2F0ZWdvcnlOYW1lJyAgICAgPT4gJ0NhdGVnb3J5QTo6Q2F0ZWdvcnlCJywKICAgICAgICBDYXRlZ29yeVNob3J0TmFtZSA9PiAnQ2F0ZWdvcnlCJywKICAgICAgICBMYW5ndWFnZUlEICAgICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICdlbicsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgPT4gJ0FydGljbGUgVGl0bGUnLAogICAgICAgIEZpZWxkMSAgICAgICAgICAgID0+ICdUaGUgU3ltcHRvbXMnLAogICAgICAgIEZpZWxkMiAgICAgICAgICAgID0+ICdUaGUgUHJvYmxlbScsCiAgICAgICAgRmllbGQzICAgICAgICAgICAgPT4gJ1RoZSBTb2x1dGlvbicsCiAgICAgICAgRmllbGQ0ICAgICAgICAgICAgPT4gdW5kZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBhY3RpdmUgYnkgZGVmYXVsdAogICAgICAgIEZpZWxkNSAgICAgICAgICAgID0+IHVuZGVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgYWN0aXZlIGJ5IGRlZmF1bHQKICAgICAgICBGaWVsZDYgICAgICAgICAgICA9PiAnQ29tbWVudHMnLAogICAgICAgIEFwcHJvdmVkICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciAwCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gMSwKICAgICAgICBDb250ZW50VHlwZSAgICAgICA9PiAndGV4dC9wbGFpbicsICAgICAgICAgICAgICAgICAgIyBvciAndGV4dC9odG1sJwogICAgICAgIFZhbGlkICAgICAgICAgICAgID0+ICd2YWxpZCcsCiAgICAgICAgS2V5d29yZHMgICAgICAgICAgPT4gJ0tleVdvcmQxIEtleVdvcmQyJywKICAgICAgICBWb3RlcyAgICAgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbnVtYmVyIG9mIHZvdGVzCiAgICAgICAgVm90ZVJlc3VsdCAgICAgICAgPT4gJzAuMDAnLCAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIGJldHdlZW4gMC4wMCBhbmQgMTAwLjAwCiAgICAgICAgU3RhdGVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICBTdGF0ZSAgICAgICAgICAgICA9PiAnaW50ZXJuYWwgKGFnZW50KScsICAgICAgICAgICAgICMgb3IgJ2V4dGVybmFsIChjdXN0b21lciknIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICdwdWJsaWMgKGFsbCknCiAgICAgICAgU3RhdGVUeXBlSUQgICAgICAgPT4gMSwKICAgICAgICBTdGF0ZVR5cGVOYW1lICAgICA9PiAnaW50ZXJuYWwnLCAgICAgICAgICAgICAgICAgICAgICMgb3IgJ2V4dGVybmFsJyBvciAncHVibGljJwogICAgICAgIENyZWF0ZWRCeSAgICAgICAgID0+IDEsCiAgICAgICAgQ2hhbmdlZCcgICAgICAgICAgPT4gJzIwMTEtMDEtMDUgMjE6NTM6NTAnLAogICAgICAgIENoYW5nZWRCeSAgICAgICAgID0+ICcxJywKICAgICAgICBDcmVhdGVkICAgICAgICAgICA9PiAnMjAxMS0wMS0wNSAyMTo1Mzo1MCcsCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJzEyOTQyODYwMzAtMzEuMTY5NzI5NzEwNDczMicsICAjIEZBUSBBcnRpY2xlIG5hbWUgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3lzdGVtdGltZSArICctJyArIHJhbmRvbSBudW1iZXIKICAgICAgICBTZXJ2aWNlTGlzdCAgICAgICA9PiB7ICcxJyA9PiAnQ29tcHV0ZXInIH0sICAgICAgICAgICAjIEhhc2ggb2YgcmVsYXRlZCBzZXJ2aWNlcwogICAgICAgIEljb24gICAgICAgICAgICAgID0+ICdzdmcgdGV4dCcKICAgICk7Cgo9Y3V0CgpzdWIgRkFRR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZW5hbWUgZnJvbSBJdGVtSUQgdG8gRkFRSUQKICAgIGlmICggJFBhcmFte0ZBUUlEfSApIHsKICAgICAgICAkUGFyYW17SXRlbUlEfSA9ICRQYXJhbXtGQVFJRH07CiAgICB9CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIEl0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRGZXRjaEl0ZW1GaWVsZHMgPSAkUGFyYW17SXRlbUZpZWxkc30gPyAxIDogMDsKCiAgICBteSAkQ2FjaGVLZXkgPSAnRkFRR2V0OjpJdGVtSUQ6OicgLiAkUGFyYW17SXRlbUlEfSAuICc6Okl0ZW1GaWVsZHM6OicgLiAkRmV0Y2hJdGVtRmllbGRzOwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJERCT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgc2V0ICVEYXRhIGZyb20gY2FjaGUgaWYgYW55CiAgICBteSAlRGF0YTsKICAgIGlmICggcmVmICRDYWNoZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJURhdGEgPSAleyRDYWNoZX07CiAgICB9CgogICAgIyBvdGhlcndpc2UgZ2V0ICVEYXRhIGZyb20gdGhlIERCCiAgICBlbHNlIHsKCiAgICAgICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgU0VMRUNUIGkuZl9uYW1lLCBpLmZfbGFuZ3VhZ2VfaWQsIGkuZl9zdWJqZWN0LCBpLmNyZWF0ZWQsIGkuY3JlYXRlZF9ieSwgaS5jaGFuZ2VkLAogICAgICAgICAgICAgICAgICAgIGkuY2hhbmdlZF9ieSwgaS5jYXRlZ29yeV9pZCwgaS5zdGF0ZV9pZCwgYy5uYW1lLCBzLm5hbWUsIGwubmFtZSwgaS5mX2tleXdvcmRzLAogICAgICAgICAgICAgICAgICAgIGkuYXBwcm92ZWQsIGkudmFsaWRfaWQsIGkuY29udGVudF90eXBlLCBpLmZfbnVtYmVyLCBzdC5pZCwgc3QubmFtZSwgaS5pY29uCiAgICAgICAgICAgICAgICBGUk9NIGZhcV9pdGVtIGksIGZhcV9jYXRlZ29yeSBjLCBmYXFfc3RhdGUgcywgZmFxX3N0YXRlX3R5cGUgc3QsIGZhcV9sYW5ndWFnZSBsCiAgICAgICAgICAgICAgICBXSEVSRSBpLnN0YXRlX2lkID0gcy5pZAogICAgICAgICAgICAgICAgICAgIEFORCBzLnR5cGVfaWQgPSBzdC5pZAogICAgICAgICAgICAgICAgICAgIEFORCBpLmNhdGVnb3J5X2lkID0gYy5pZAogICAgICAgICAgICAgICAgICAgIEFORCBpLmZfbGFuZ3VhZ2VfaWQgPSBsLmlkCiAgICAgICAgICAgICAgICAgICAgQU5EIGkuaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIEVPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICAgICAlRGF0YSA9ICgKCiAgICAgICAgICAgICAgICAjIENvbXBhdGliaWxpdHkgSUQgbmFtZXMuCiAgICAgICAgICAgICAgICBJRCAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIEZBUUlEID0+ICRQYXJhbXtJdGVtSUR9LAoKICAgICAgICAgICAgICAgICMgR2V0IGRhdGEgYXR0cmlidXRlcy4KICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgICAgICBMYW5ndWFnZUlEICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgICAgICBDcmVhdGVkICAgICAgID0+ICRSb3dbM10sCiAgICAgICAgICAgICAgICBDcmVhdGVkQnkgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VkICAgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgICAgICBDaGFuZ2VkQnkgICAgID0+ICRSb3dbNl0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEICAgID0+ICRSb3dbN10sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRSb3dbOF0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeU5hbWUgID0+ICRSb3dbOV0sCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgID0+ICRSb3dbMTBdLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2UgICAgICA9PiAkUm93WzExXSwKICAgICAgICAgICAgICAgIEtleXdvcmRzICAgICAgPT4gJFJvd1sxMl0sCiAgICAgICAgICAgICAgICBBcHByb3ZlZCAgICAgID0+ICRSb3dbMTNdLAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkUm93WzE0XSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgPT4gJFJvd1sxNV0sCiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgID0+ICRSb3dbMTZdLAogICAgICAgICAgICAgICAgU3RhdGVUeXBlSUQgICA9PiAkUm93WzE3XSwKICAgICAgICAgICAgICAgIFN0YXRlVHlwZU5hbWUgPT4gJFJvd1sxOF0sCgogICAgICAgICAgICAgICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgICAgICAgICAgSWNvbiA9PiAkUm93WzE5XSwKCiAgICAgICAgICAgICAgICAjRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJURhdGEgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIEl0ZW1JRCAkUGFyYW17SXRlbUlEfSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBGQVEgaXRlbSBmaWVsZHMgYXJlIHJlcXVpcmVkCiAgICAgICAgaWYgKCRGZXRjaEl0ZW1GaWVsZHMpIHsKCiAgICAgICAgICAgIGZvciBteSAkRmllbGROdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZmllbGQgbmFtZQogICAgICAgICAgICAgICAgbXkgJEZpZWxkID0gIkZpZWxkJEZpZWxkTnVtYmVyIjsKCiAgICAgICAgICAgICAgICAjIGdldCBlYWNoIGZpZWxkIGNvbnRlbnQKICAgICAgICAgICAgICAgICREYXRheyRGaWVsZH0gPSAkU2VsZi0+SXRlbUZpZWxkR2V0KAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBudW1iZXIKICAgICAgICBpZiAoICEkRGF0YXtOdW1iZXJ9ICkgewoKICAgICAgICAgICAgbXkgJE51bWJlciA9ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtSUQnKSAuICcwMCcgLiAkRGF0YXtJdGVtSUR9OwoKICAgICAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIGZhcV9pdGVtIFNFVCBmX251bWJlciA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJE51bWJlciwgXCREYXRhe0l0ZW1JRH0gXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREYXRhe051bWJlcn0gPSAkTnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGNhdGVnb3J5IGxvbmcgbmFtZXMKICAgICAgICBteSAkQ2F0ZWdvcnlUcmVlID0gJFNlbGYtPkNhdGVnb3J5VHJlZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdGhlIGNhdGVnb3J5IHNob3J0IG5hbWUKICAgICAgICAkRGF0YXtDYXRlZ29yeVNob3J0TmFtZX0gPSAkRGF0YXtDYXRlZ29yeU5hbWV9OwoKICAgICAgICAjIGdldCB0aGUgY2F0ZWdvcnkgbG9uZyBuYW1lCiAgICAgICAgJERhdGF7Q2F0ZWdvcnlOYW1lfSA9ICRDYXRlZ29yeVRyZWUtPnsgJERhdGF7Q2F0ZWdvcnlJRH0gfTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAgICAgJERhdGF7VmFsaWR9ID0gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfTsKCiAgICAgICAgIyBGQVEgU2VydmljZQoKICAgICAgICAjIGdldCByZWxhdGVkIHNlcnZpY2VzCiAgICAgICAgbXkgJFNlcnZpY2VzUmVsYXRlZCA9ICRTZWxmLT5GQVFTZXJ2aWNlR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFNlcnZpY2VzUmVsYXRlZCkgewogICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2UgKEAkU2VydmljZXNSZWxhdGVkKSB7CiAgICAgICAgICAgICAgICAkRGF0YXtTZXJ2aWNlTGlzdH0tPnsgJFNlcnZpY2UtPnsnU2VydmljZUlEJ30gfSA9ICRTZXJ2aWNlLT57J05hbWUnfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBlbyBGQVEgU2VydmljZQoKICAgICAgICAjIGNhY2hlIHJlc3VsdAogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRkFRJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJURhdGEsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFZvdGVEYXRhOwogICAgaWYgKCAkU2VsZi0+e1ZvdGluZ30gKSB7CiAgICAgICAgJFZvdGVEYXRhID0gJFNlbGYtPkl0ZW1Wb3RlRGF0YUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZnJvbSBjb25maWcKICAgIG15ICREZWNpbWFsUGxhY2VzID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkV4cGxvcmVyOjpJdGVtTGlzdDo6Vm90aW5nUmVzdWx0RGVjaW1hbFBsYWNlcycpIHx8IDA7CgogICAgIyBmb3JtYXQgdGhlIHZvdGUgcmVzdWx0CiAgICBteSAkVm90ZVJlc3VsdCA9IHNwcmludGYoICIlMC4iIC4gJERlY2ltYWxQbGFjZXMgLiAiZiIsICRWb3RlRGF0YS0+e1Jlc3VsdH0gfHwgMCApOwoKICAgICMgYWRkIHZvdGluZyBpbmZvcm1hdGlvbiB0byBGQVEgaXRlbQogICAgJERhdGF7Vm90ZVJlc3VsdH0gPSAkVm90ZVJlc3VsdDsKICAgICREYXRhe1ZvdGVzfSAgICAgID0gJFZvdGVEYXRhLT57Vm90ZXN9IHx8IDA7CgogICAgIyBjaGVjayBpZiBuZWVkIHRvIHJldHVybiBEeW5hbWljRmllbGRzCiAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRzfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIGR5bmFtaWMgZmllbGRzIGZvciB0aGUgb2JqZWN0IHR5cGUgRkFRCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ0ZBUScKICAgICAgICApOwoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKCiAgICAgICAgICAgICMgdmFsaWRhdGUgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjdXJyZW50IHZhbHVlIGZvciBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdGhlIGR5bmFtaWMgZmllbGQgbmFtZSBhbmQgdmFsdWUgaW50byB0aGUgZGF0YSBoYXNoCiAgICAgICAgICAgICREYXRheyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9CgpzdWIgSXRlbUZpZWxkR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIEl0ZW1JRCBGaWVsZCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIHZhbGlkIGZpZWxkIG5hbWUKICAgIGlmICggJFBhcmFte0ZpZWxkfSAhfiBteyBcQSBGaWVsZCBbMS02XSBceiB9bXN4aSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZpZWxkICckUGFyYW17RmllbGR9JyBpcyBpbnZhbGlkISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdJdGVtRmllbGRHZXQ6Okl0ZW1JRDo6JyAuICRQYXJhbXtJdGVtSUR9OwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgICMgY2hlY2sgaWYgYSBjYWNoZSBlbnRyeSBleGlzdHMgZm9yIHRoZSBnaXZlbiBGaWVsZAogICAgaWYgKCByZWYgJENhY2hlIGVxICdIQVNIJyAmJiBleGlzdHMgJENhY2hlLT57ICRQYXJhbXtGaWVsZH0gfSApIHsKCiAgICAgICAgcmV0dXJuICRDYWNoZS0+eyAkUGFyYW17RmllbGR9IH07CiAgICB9CgogICAgIyBjcmVhdGUgYSBmaWVsZCBsb29rdXAgdGFibGUKICAgIG15ICVGaWVsZExvb2t1cCA9ICgKICAgICAgICBGaWVsZDEgPT4gJ2ZfZmllbGQxJywKICAgICAgICBGaWVsZDIgPT4gJ2ZfZmllbGQyJywKICAgICAgICBGaWVsZDMgPT4gJ2ZfZmllbGQzJywKICAgICAgICBGaWVsZDQgPT4gJ2ZfZmllbGQ0JywKICAgICAgICBGaWVsZDUgPT4gJ2ZfZmllbGQ1JywKICAgICAgICBGaWVsZDYgPT4gJ2ZfZmllbGQ2JywKICAgICk7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgJyAuICRGaWVsZExvb2t1cHsgJFBhcmFte0ZpZWxkfSB9IC4gJwogICAgICAgICAgICBGUk9NIGZhcV9pdGVtCiAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkRmllbGQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRmllbGQgPSAkUm93WzBdIHx8ICcnOwogICAgfQoKICAgIGlmICggcmVmICRDYWNoZSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgQ2FjaGUgZmlsZSBmb3IgSXRlbUlEIGFscmVhZHkgZXhpc3RzLCBhZGQgZmllbGQgZGF0YS4KICAgICAgICAkQ2FjaGUtPnsgJFBhcmFte0ZpZWxkfSB9ID0gJEZpZWxkOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgQ3JlYXRlIG5ldyBjYWNoZSBmaWxlLgogICAgICAgICRDYWNoZSA9IHsKICAgICAgICAgICAgJFBhcmFte0ZpZWxkfSA9PiAkRmllbGQsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+ICRDYWNoZSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuICRGaWVsZDsKfQoKPWhlYWQyIEZBUUFkZCgpCgphZGQgYW4gYXJ0aWNsZQoKICAgIG15ICRJdGVtSUQgPSAkRkFRT2JqZWN0LT5GQVFBZGQoCiAgICAgICAgVGl0bGUgICAgICAgPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgQ2F0ZWdvcnlJRCAgPT4gMSwKICAgICAgICBTdGF0ZUlEICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlSUQgID0+IDEsCiAgICAgICAgTnVtYmVyICAgICAgPT4gJzEzNDAyJywgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgS2V5d29yZHMgICAgPT4gJ3NvbWUga2V5d29yZHMnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQxICAgICAgPT4gJ1N5bXB0b20uLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQyICAgICAgPT4gJ1Byb2JsZW0uLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQzICAgICAgPT4gJ1NvbHV0aW9uLi4uJywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ0ICAgICAgPT4gJ0ZpZWxkNC4uLicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ1ICAgICAgPT4gJ0ZpZWxkNS4uLicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ2ICAgICAgPT4gJ0NvbW1lbnQuLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQXBwcm92ZWQgICAgPT4gMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsICAgICAjIG9yICd0ZXh0L2h0bWwnCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICBJY29uICAgICAgICA9PiAnc3ZnIHRleHQnLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKUmV0dXJuczoKCiAgICAkSXRlbUlEID0gMzQ7Cgo9Y3V0CgpzdWIgRkFRQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDYXRlZ29yeUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCBUaXRsZSBVc2VySUQgQ29udGVudFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgVmFsaWRJRAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWRJRH0gKSB7CgogICAgICAgICMgZ2V0IHRoZSB2YWxpZCBpZHMKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgJFBhcmFte1ZhbGlkSUR9ID0gJFZhbGlkSURzWzBdOwogICAgfQoKICAgICMgY2hlY2sgbmFtZQogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRQYXJhbXtOYW1lfSA9IHRpbWUoKSAuICctJyAuIHJhbmQoMTAwKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG51bWJlcgogICAgaWYgKCAhJFBhcmFte051bWJlcn0gKSB7CiAgICAgICAgJFBhcmFte051bWJlcn0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbUlEJykgLiByYW5kKDEwMCk7CiAgICB9CgogICAgIyBjaGVjayBpZiBhcHByb3ZhbCBmZWF0dXJlIGlzIHVzZWQKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUmVxdWlyZWQnKSApIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICAgICAgbXkgJUdyb3VwcyA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgYXBwcm92YWwgZ3JvdXAKICAgICAgICBteSAkQXBwcm92YWxHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbEdyb3VwJyk7CgogICAgICAgICMgc2V0IGRlZmF1bHQgdG8gMCBpZiBhcHByb3ZlZCBwYXJhbSBpcyBub3QgZ2l2ZW4KICAgICAgICAjIG9yIGlmIHVzZXIgZG9lcyBub3QgaGF2ZSB0aGUgcmlnaHRzIHRvIGFwcHJvdmUKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtBcHByb3ZlZH0gfHwgISRHcm91cHN7JEFwcHJvdmFsR3JvdXB9ICkgewogICAgICAgICAgICAkUGFyYW17QXBwcm92ZWR9ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBhcHByb3ZhbCBmZWF0dXJlIGlzIG5vdCBhY3RpdmF0ZWQsIGEgbmV3IEZBUSBpdGVtIGlzIGFsd2F5cyBhcHByb3ZlZAogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0FwcHJvdmVkfSA9IDE7CiAgICB9CgogICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgSU5TRVJUIElOVE8gZmFxX2l0ZW0KICAgICAgICAgICAgICAgIChmX251bWJlciwgZl9uYW1lLCBmX2xhbmd1YWdlX2lkLCBmX3N1YmplY3QsCiAgICAgICAgICAgICAgICBjYXRlZ29yeV9pZCwgc3RhdGVfaWQsIGZfa2V5d29yZHMsIGFwcHJvdmVkLCB2YWxpZF9pZCwgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgZl9maWVsZDEsIGZfZmllbGQyLCBmX2ZpZWxkMywgZl9maWVsZDQsIGZfZmllbGQ1LCBmX2ZpZWxkNiwgaWNvbiwKICAgICAgICAgICAgICAgIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpCiAgICAgICAgICAgIFZBTFVFUwogICAgICAgICAgICAgICAgKD8sID8sID8sID8sCiAgICAgICAgICAgICAgICA/LCA/LCA/LCA/LCA/LCA/LAogICAgICAgICAgICAgICAgPywgPywgPywgPywgPywgPywgPywKICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte051bWJlcn0sICAgICBcJFBhcmFte05hbWV9LCAgICBcJFBhcmFte0xhbmd1YWdlSUR9LCBcJFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgXCRQYXJhbXtDYXRlZ29yeUlEfSwgXCRQYXJhbXtTdGF0ZUlEfSwgXCRQYXJhbXtLZXl3b3Jkc30sICAgXCRQYXJhbXtBcHByb3ZlZH0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sICAgIFwkUGFyYW17Q29udGVudFR5cGV9LAogICAgICAgICAgICBcJFBhcmFte0ZpZWxkMX0sICAgICBcJFBhcmFte0ZpZWxkMn0sIFwkUGFyYW17RmllbGQzfSwKICAgICAgICAgICAgXCRQYXJhbXtGaWVsZDR9LCAgICAgXCRQYXJhbXtGaWVsZDV9LCBcJFBhcmFte0ZpZWxkNn0sIFwkUGFyYW17SWNvbn0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgIyBidWlsZCBTUUwgdG8gZ2V0IHRoZSBpZCBvZiB0aGUgbmV3bHkgaW5zZXJ0ZWQgRkFRIGFydGljbGUKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkIEZST00gZmFxX2l0ZW0KICAgICAgICBXSEVSRSBmX251bWJlciA9ID8KICAgICAgICAgICAgQU5EIGZfbmFtZSA9ID8KICAgICAgICAgICAgQU5EIGZfbGFuZ3VhZ2VfaWQgPSA/CiAgICAgICAgICAgIEFORCBjYXRlZ29yeV9pZCA9ID8KICAgICAgICAgICAgQU5EIHN0YXRlX2lkID0gPwogICAgICAgICAgICBBTkQgYXBwcm92ZWQgPSA/CiAgICAgICAgICAgIEFORCB2YWxpZF9pZCA9ID8KICAgICAgICAgICAgQU5EIGNyZWF0ZWRfYnkgPSA/CiAgICAgICAgICAgIEFORCBjaGFuZ2VkX2J5ID0gPyc7CgogICAgIyBoYW5kbGUgdGhlIHRpdGxlCiAgICBpZiAoICRQYXJhbXtUaXRsZX0gKSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCBmX3N1YmplY3QgPSA/ICc7CiAgICB9CgogICAgIyBhZGRpdGlvbmFsIFNRTCBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgdGl0bGUgaXMgYW4gZW1wdHkgc3RyaW5nCiAgICAjIGFuZCB0aGUgZGF0YWJhc2UgaXMgb3JhY2xlLCB3aGljaCB0cmVhdHMgZW1wdHkgc3RyaW5ncyBhcyBOVUxMCiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgQU5EICgoZl9zdWJqZWN0ID0gPykgT1IgKGZfc3ViamVjdCBJUyBOVUxMKSkgJzsKICAgIH0KCiAgICAjIGhhbmRsZSB0aGUga2V5d29yZHMKICAgIGlmICggJFBhcmFte0tleXdvcmRzfSApIHsKICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgQU5EIGZfa2V5d29yZHMgPSA/ICc7CiAgICB9CgogICAgIyBhZGRpdGlvbmFsIFNRTCBmb3IgdGhlIGNhc2UgdGhhdCBrZXl3b3JkcyBpcyBhbiBlbXB0eSBzdHJpbmcKICAgICMgYW5kIHRoZSBkYXRhYmFzZSBpcyBvcmFjbGUsIHdoaWNoIHRyZWF0cyBlbXB0eSBzdHJpbmdzIGFzIE5VTEwKICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICBBTkQgKChmX2tleXdvcmRzID0gPykgT1IgKGZfa2V5d29yZHMgSVMgTlVMTCkpICc7CiAgICB9CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBpZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte051bWJlcn0sCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17TGFuZ3VhZ2VJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIFwkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17QXBwcm92ZWR9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5d29yZHN9LAogICAgICAgIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJElEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHVwZGF0ZSBudW1iZXIKICAgIG15ICROdW1iZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbUlEJykgLiAnMDAnIC4gJElEOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdVUERBVEUgZmFxX2l0ZW0gU0VUIGZfbnVtYmVyID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJE51bWJlciwgXCRJRCBdLAogICAgKTsKCiAgICAjIGFkZCBoaXN0b3J5CiAgICAkU2VsZi0+RkFRSGlzdG9yeUFkZCgKICAgICAgICBOYW1lICAgPT4gJ0NyZWF0ZWQnLAogICAgICAgIEl0ZW1JRCA9PiAkSUQsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIEZBUSBTZXJ2aWNlCgogICAgIyBhZGQgc2VydmljZXMKCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgIGZvciBteSAkU2VydmljZUlEICggQHsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgbXkgJEFkZFN1Y2Nlc3MgPSAkU2VsZi0+RkFRU2VydmljZUFkZCgKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUGFyYW17U2VydmljZUxpc3R9LT57JFNlcnZpY2VJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgRU8gRkFRIFNlcnZpY2UKCiAgICAjIGNoZWNrIGlmIGFwcHJvdmFsIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICYmICEkUGFyYW17QXBwcm92ZWR9ICkgewoKICAgICAgICBteSAkQXBwcm92YWxSZXF1aXJlZCAgICAgICAgPSAxOwogICAgICAgIG15ICRBcHByb3ZhbEluY2x1ZGVJbnRlcm5hbCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbDo6SW5jbHVkZUludGVybmFsJyk7CgogICAgICAgIGlmICggISRBcHByb3ZhbEluY2x1ZGVJbnRlcm5hbCApIHsKICAgICAgICAgICAgbXkgJUludGVybmFsU3RhdGUgPSAkU2VsZi0+U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgVHlwZXMgID0+IFsnaW50ZXJuYWwnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkSW50ZXJuYWxTdGF0ZXsgJFBhcmFte1N0YXRlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkQXBwcm92YWxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyBhcHByb3ZhbCB0aWNrZXQKICAgICAgICBpZiAoJEFwcHJvdmFsUmVxdWlyZWQpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+X0ZBUUFwcHJvdmFsVGlja2V0Q3JlYXRlKAogICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgIExhbmd1YWdlSUQgPT4gJFBhcmFte0xhbmd1YWdlSUR9LAogICAgICAgICAgICAgICAgRkFRTnVtYmVyICA9PiAkTnVtYmVyLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgY3JlYXRlIGFwcHJvdmFsIHRpY2tldCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIENsZWFudXAgdGhlIGNhY2hlIGZvciAnRkFRS2V5d29yZEFydGljbGVMaXN0JyBhbmQgdGhlIHJ1bnRpbWUgY2FjaGUuCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICdGQVFLZXl3b3JkQXJ0aWNsZUxpc3QnLAogICAgKTsKCiAgICAjIENsZWFudXAgdGhlIHJ1bnRpbWUgY2FjaGUgZnJvbSB0aGUgRkFRL0NhdGVnb3J5LnBtLgogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9OwoKICAgIHJldHVybiAkSUQ7Cn0KCj1oZWFkMiBGQVFVcGRhdGUoKQoKdXBkYXRlIGFuIGFydGljbGUKCiAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgICAgID0+IDEyMywKICAgICAgICBDYXRlZ29yeUlEICA9PiAxLAogICAgICAgIFN0YXRlSUQgICAgID0+IDEsCiAgICAgICAgTGFuZ3VhZ2VJRCAgPT4gMSwKICAgICAgICBBcHByb3ZlZCAgICA9PiAxLAogICAgICAgIFZhbGlkSUQgICAgID0+IDEsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhbicsICAgICAjIG9yICd0ZXh0L2h0bWwnCiAgICAgICAgVGl0bGUgICAgICAgPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgRmllbGQxICAgICAgPT4gJ1Byb2JsZW0uLi4nLAogICAgICAgIEZpZWxkMiAgICAgID0+ICdTb2x1dGlvbi4uLicsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICBBcHByb3ZhbE9mZiA9PiAxLCAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIChpZiBzZXQgdG8gMSBhcHByb3ZhbCBpcyBpZ25vcmVkLiBUaGlzIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgaW1wb3J0YW50IHdoZW4gY2FsbGVkIGZyb20gRkFRSW5saW5lQXR0YWNobWVudFVSTFVwZGF0ZSkKICAgICAgICBJY29uICAgICAgICA9PiAnc3ZnIHRleHQnLCAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKClJldHVybnM6CgogICAgJFN1Y2Nlc3MgPSAxIDsgICAgICAgICAgIyBvciB1bmRlZiBpZiBjYW4ndCB1cGRhdGUgdGhlIEZBUSBhcnRpY2xlCgo9Y3V0CgpzdWIgRkFRVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFRpdGxlIFVzZXJJRCBDb250ZW50VHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGQVFEYXRhID0gJFNlbGYtPkZBUUdldCgKICAgICAgICBJdGVtSUQgICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIEl0ZW1GaWVsZHMgPT4gMCwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGlmIG5vIG5hbWUgd2FzIGdpdmVuIHVzZSBvbGQgbmFtZSBmcm9tIEZBUQogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRQYXJhbXtOYW1lfSA9ICRGQVFEYXRhe05hbWV9OwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUgZm9yIFZhbGlkSUQKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkSUR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZElEfSA9ICRGQVFEYXRhe1ZhbGlkSUR9OwogICAgfQoKICAgICMgRkFRIFNlcnZpY2VzCgogICAgbXkgJFNlcnZpY2VzSW5EQiA9ICRTZWxmLT5GQVFTZXJ2aWNlR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICk7CgogICAgbXkgJVNlcnZpY2VzSW5EQjsKICAgIG1hcCB7ICRTZXJ2aWNlc0luREJ7ICRfLT57U2VydmljZUlEfSB9KysgfSBAeyRTZXJ2aWNlc0luREJ9OwoKICAgIG15ICRTZXJ2aWNlc0NoYW5nZWQgPSAwOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICBTRVJWSUNFSUQ6IGZvciBteSAkU2VydmljZUlEICggQHsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgaWYgKCBleGlzdHMgJFNlcnZpY2VzSW5EQnskU2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VydmljZXNJbkRCeyRTZXJ2aWNlSUR9OwogICAgICAgICAgICAgICAgbmV4dCBTRVJWSUNFSUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkQWRkU3VjY2VzcyA9ICRTZWxmLT5GQVFTZXJ2aWNlQWRkKAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJFBhcmFte1NlcnZpY2VMaXN0fS0+eyRTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZXJ2aWNlc0NoYW5nZWQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkU2VydmljZUlEICgga2V5cyAlU2VydmljZXNJbkRCICkgewogICAgICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPkZBUVNlcnZpY2VEZWxldGUoCiAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgKTsKICAgICAgICAkU2VydmljZXNDaGFuZ2VkKys7CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGlmICgkU2VydmljZXNDaGFuZ2VkKSB7CiAgICAgICAgJFNlbGYtPl9EZWxldGVGcm9tRkFRQ2FjaGUoJVBhcmFtKTsKICAgIH0KCiAgICAjIGVvIEZBUSBTZXJ2aWNlcwoKICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgZmFxX2l0ZW0gU0VUCiAgICAgICAgICAgICAgICBmX25hbWUgPSA/LCBmX2xhbmd1YWdlX2lkID0gPywgZl9zdWJqZWN0ID0gPywgY2F0ZWdvcnlfaWQgPSA/LAogICAgICAgICAgICAgICAgc3RhdGVfaWQgPSA/LCBmX2tleXdvcmRzID0gPywgdmFsaWRfaWQgPSA/LCBjb250ZW50X3R5cGUgPSA/LAogICAgICAgICAgICAgICAgZl9maWVsZDEgPSA/LCBmX2ZpZWxkMiA9ID8sCiAgICAgICAgICAgICAgICBmX2ZpZWxkMyA9ID8sIGZfZmllbGQ0ID0gPywKICAgICAgICAgICAgICAgIGZfZmllbGQ1ID0gPywgZl9maWVsZDYgPSA/LCBpY29uID0gPywKICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBjdXJyZW50X3RpbWVzdGFtcCwKICAgICAgICAgICAgICAgIGNoYW5nZWRfYnkgPSA/CiAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgIFwkUGFyYW17TGFuZ3VhZ2VJRH0sIFwkUGFyYW17VGl0bGV9LCAgIFwkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIFwkUGFyYW17U3RhdGVJRH0sIFwkUGFyYW17S2V5d29yZHN9LCAgIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29udGVudFR5cGV9LAogICAgICAgICAgICBcJFBhcmFte0ZpZWxkMX0sICBcJFBhcmFte0ZpZWxkMn0sCiAgICAgICAgICAgIFwkUGFyYW17RmllbGQzfSwgIFwkUGFyYW17RmllbGQ0fSwKICAgICAgICAgICAgXCRQYXJhbXtGaWVsZDV9LCAgXCRQYXJhbXtGaWVsZDZ9LCBcJFBhcmFte0ljb259LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SXRlbUlEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT5fRGVsZXRlRnJvbUZBUUNhY2hlKCVQYXJhbSk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyB1cGRhdGUgYXBwcm92YWwKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUmVxdWlyZWQnKSAmJiAhJFBhcmFte0FwcHJvdmFsT2ZmfSApIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICAgICAgbXkgJUdyb3VwcyA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgYXBwcm92YWwgZ3JvdXAKICAgICAgICBteSAkQXBwcm92YWxHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbEdyb3VwJyk7CgogICAgICAgICMgc2V0IGFwcHJvdmFsIHRvIDAgaWYgdXNlciBkb2VzIG5vdCBoYXZlIHRoZSByaWdodHMgdG8gYXBwcm92ZQogICAgICAgIGlmICggISRHcm91cHN7JEFwcHJvdmFsR3JvdXB9ICkgewogICAgICAgICAgICAkUGFyYW17QXBwcm92ZWR9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBhcHByb3ZhbAogICAgICAgIG15ICRVcGRhdGVTdWNjZXNzID0gJFNlbGYtPl9GQVFBcHByb3ZhbFVwZGF0ZSgKICAgICAgICAgICAgSXRlbUlEICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEFwcHJvdmVkID0+ICRQYXJhbXtBcHByb3ZlZH0gfHwgMCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkVXBkYXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB1cGRhdGUgYXBwcm92YWwgZm9yIEl0ZW1JRCAkUGFyYW17SXRlbUlEfSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgY2FjaGUKICAgICAgICAkU2VsZi0+X0RlbGV0ZUZyb21GQVFDYWNoZSglUGFyYW0pOwogICAgfQoKICAgICMgY2hlY2sgaWYgaGlzdG9yeSBlbnRyeSBzaG91bGQgYmUgYWRkZWQKICAgIHJldHVybiAxIGlmICRQYXJhbXtIaXN0b3J5T2ZmfTsKCiAgICAjIHdyaXRlIGhpc3RvcnkgZW50cnkKICAgICRTZWxmLT5GQVFIaXN0b3J5QWRkKAogICAgICAgIE5hbWUgICA9PiAnVXBkYXRlZCcsCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBBdHRhY2htZW50QWRkKCkKCmFkZCBhcnRpY2xlIGF0dGFjaG1lbnRzLCByZXR1cm5zIHRoZSBhdHRhY2htZW50IGlkCgogICAgbXkgJEF0dGFjaG1lbnRJRCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRBZGQoCiAgICAgICAgSXRlbUlEICAgICAgPT4gMTIzLAogICAgICAgIENvbnRlbnQgICAgID0+ICRDb250ZW50LAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3htbCcsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3NvbWVuYW1lLnhtbCcsCiAgICAgICAgSW5saW5lICAgICAgPT4gMSwgICAoMHwxLCBkZWZhdWx0IDApCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRBdHRhY2htZW50SUQgPSAxMjMgOyAgICAgICAgICAgICAgICMgb3IgdW5kZWYgaWYgY2FuJ3QgYWRkIHRoZSBhdHRhY2htZW50Cgo9Y3V0CgpzdWIgQXR0YWNobWVudEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBDb250ZW50IENvbnRlbnRUeXBlIEZpbGVuYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQKICAgIGlmICggISRQYXJhbXtJbmxpbmV9ICkgewogICAgICAgICRQYXJhbXtJbmxpbmV9ID0gMDsKICAgIH0KCiAgICAjIGdldCBhdHRhY2htZW50IHNpemUKICAgIHsKICAgICAgICB1c2UgYnl0ZXM7CiAgICAgICAgJFBhcmFte0ZpbGVzaXplfSA9IGxlbmd0aCAkUGFyYW17Q29udGVudH07CiAgICAgICAgbm8gYnl0ZXM7CiAgICB9CgogICAgIyBnZXQgYWxsIGV4aXN0aW5nIGF0dGFjaG1lbnRzCiAgICBteSBASW5kZXggPSAkU2VsZi0+QXR0YWNobWVudEluZGV4KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBmaWxlbmFtZQogICAgbXkgJE5ld0ZpbGVOYW1lID0gJFBhcmFte0ZpbGVuYW1lfTsKCiAgICAjIGJ1aWxkIGEgbG9va3VwIGhhc2ggb2YgYWxsIGV4aXN0aW5nIGZpbGUgbmFtZXMKICAgIG15ICVVc2VkRmlsZTsKICAgIGZvciBteSAkRmlsZSAoQEluZGV4KSB7CiAgICAgICAgJFVzZWRGaWxleyAkRmlsZS0+e0ZpbGVuYW1lfSB9ID0gMTsKICAgIH0KCiAgICAjIHRyeSB0byBtb2RpZnkgdGhlIHRoZSBmaWxlIG5hbWUgYnkgYWRkaW5nIGEgbnVtYmVyIGlmIGl0IGV4aXN0cyBhbHJlYWR5CiAgICBteSAkQ291bnQgPSAwOwogICAgd2hpbGUgKCAkQ291bnQgPCA1MCApIHsKCiAgICAgICAgIyBpbmNyZWFzZSBjb3VudGVyCiAgICAgICAgJENvdW50Kys7CgogICAgICAgICMgaWYgdGhlIGZpbGUgbmFtZSBleGlzdHMKICAgICAgICBpZiAoIGV4aXN0cyAkVXNlZEZpbGV7JE5ld0ZpbGVOYW1lfSApIHsKCiAgICAgICAgICAgICMgZmlsZW5hbWUgaGFzIGEgZmlsZSBuYW1lIGV4dGVuc2lvbiAoZS5nLiB0ZXN0LmpwZykKICAgICAgICAgICAgaWYgKCAkUGFyYW17RmlsZW5hbWV9ID1+IG17IFxBICguKikgXC4gKC4rPykgXHogfXhtcyApIHsKICAgICAgICAgICAgICAgICROZXdGaWxlTmFtZSA9ICIkMS0kQ291bnQuJDIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE5ld0ZpbGVOYW1lID0gIiRQYXJhbXtGaWxlbmFtZX0tJENvdW50IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHN0b3JlIHRoZSBuZXcgZmlsZW5hbWUKICAgICRQYXJhbXtGaWxlbmFtZX0gPSAkTmV3RmlsZU5hbWU7CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGVuY29kZSBhdHRhY2htZW50IGlmIGl0J3MgYSBwb3N0Z3Jlc3FsIGJhY2tlbmQhISEKICAgIGlmICggISREQk9iamVjdC0+R2V0RGF0YWJhc2VGdW5jdGlvbignRGlyZWN0QmxvYicpICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCggXCRQYXJhbXtDb250ZW50fSApOwoKICAgICAgICAkUGFyYW17Q29udGVudH0gPSBNSU1FOjpCYXNlNjQ6OmVuY29kZV9iYXNlNjQoICRQYXJhbXtDb250ZW50fSApOwogICAgfQoKICAgICMgd3JpdGUgYXR0YWNobWVudCB0byBkYgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gZmFxX2F0dGFjaG1lbnQgJyAuCiAgICAgICAgICAgICcgKGZhcV9pZCwgZmlsZW5hbWUsIGNvbnRlbnRfdHlwZSwgY29udGVudF9zaXplLCBjb250ZW50LCBpbmxpbmVhdHRhY2htZW50LCAnIC4KICAgICAgICAgICAgJyBjcmVhdGVkLCBjcmVhdGVkX2J5LCBjaGFuZ2VkLCBjaGFuZ2VkX2J5KSBWQUxVRVMgJyAuCiAgICAgICAgICAgICcgKD8sID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sICBcJFBhcmFte0ZpbGVuYW1lfSwgXCRQYXJhbXtDb250ZW50VHlwZX0sIFwkUGFyYW17RmlsZXNpemV9LAogICAgICAgICAgICBcJFBhcmFte0NvbnRlbnR9LCBcJFBhcmFte0lubGluZX0sICAgXCRQYXJhbXtVc2VySUR9LCAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCB0aGUgYXR0YWNobWVudCBpZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgJwogICAgICAgICAgICAuICdGUk9NIGZhcV9hdHRhY2htZW50ICcKICAgICAgICAgICAgLiAnV0hFUkUgZmFxX2lkID0gPyBBTkQgZmlsZW5hbWUgPSA/ICcKICAgICAgICAgICAgLiAnQU5EIGNvbnRlbnRfdHlwZSA9ID8gQU5EIGNvbnRlbnRfc2l6ZSA9ID8gJwogICAgICAgICAgICAuICdBTkQgaW5saW5lYXR0YWNobWVudCA9ID8gJwogICAgICAgICAgICAuICdBTkQgY3JlYXRlZF9ieSA9ID8gQU5EIGNoYW5nZWRfYnkgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtJdGVtSUR9LCBcJFBhcmFte0ZpbGVuYW1lfSwgXCRQYXJhbXtDb250ZW50VHlwZX0sIFwkUGFyYW17RmlsZXNpemV9LAogICAgICAgICAgICBcJFBhcmFte0lubGluZX0sIFwkUGFyYW17VXNlcklEfSwgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkQXR0YWNobWVudElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEF0dGFjaG1lbnRJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRBdHRhY2htZW50SUQ7Cn0KCj1oZWFkMiBBdHRhY2htZW50R2V0KCkKCmdldCBhdHRhY2htZW50IG9mIGFydGljbGUKCiAgICBteSAlRmlsZSA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRHZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICAgICBGaWxlSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICVGaWxlID0gKAogICAgICAgIEZpbGVzaXplICAgID0+ICc1NDAyODYnLCAgICAgICAgICAgICAgICAjIGZpbGUgc2l6ZSBpbiBieXRlcwogICAgICAgIENvbnRlbnRUeXBlID0+ICdpbWFnZS9qcGVnJywKICAgICAgICBGaWxlbmFtZSAgICA9PiAnRXJyb3IuanBnJywKICAgICAgICBDb250ZW50ICAgICA9PiAnLi4uJyAgICAgICAgICAgICAgICAgICAgIyBmaWxlIGJpbmFyeSBjb250ZW50CiAgICApOwoKPWN1dAoKc3ViIEF0dGFjaG1lbnRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgRmlsZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgZmlsZW5hbWUsIGNvbnRlbnRfdHlwZSwgY29udGVudF9zaXplLCBjb250ZW50ICcKICAgICAgICAgICAgLiAnRlJPTSBmYXFfYXR0YWNobWVudCAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPyBBTkQgZmFxX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGNyZWF0ZWQnLAogICAgICAgIEJpbmQgICA9PiBbIFwkUGFyYW17RmlsZUlEfSwgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICAgICAgRW5jb2RlID0+IFsgMSwgMSwgMSwgMCBdLAogICAgICAgIExpbWl0ICA9PiAxLAogICAgKTsKCiAgICBteSAlRmlsZTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIGRlY29kZSBhdHRhY2htZW50IGlmIGl0J3MgYSBwb3N0Z3Jlc3FsIGJhY2tlbmQgYW5kIG5vdCBCTE9CCiAgICAgICAgaWYgKCAhJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykgKSB7CiAgICAgICAgICAgICRSb3dbM10gPSBNSU1FOjpCYXNlNjQ6OmRlY29kZV9iYXNlNjQoICRSb3dbM10gKTsKICAgICAgICB9CgogICAgICAgICRGaWxle0ZpbGVuYW1lfSAgICA9ICRSb3dbMF07CiAgICAgICAgJEZpbGV7Q29udGVudFR5cGV9ID0gJFJvd1sxXTsKICAgICAgICAkRmlsZXtGaWxlc2l6ZX0gICAgPSAkUm93WzJdOwogICAgICAgICRGaWxle0NvbnRlbnR9ICAgICA9ICRSb3dbM107CiAgICB9CgogICAgcmV0dXJuICVGaWxlOwp9Cgo9aGVhZDIgQXR0YWNobWVudERlbGV0ZSgpCgpkZWxldGUgYXR0YWNobWVudCBvZiBhcnRpY2xlCgogICAgbXkgJFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5BdHRhY2htZW50RGVsZXRlKAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICAgICAgRmlsZUlEID0+IDEsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkU3VjY2VzcyA9IDEgOyAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBhdHRhY2htZW50IGNvdWxkIG5vdCBiZSBkZWxldGVkCgo9Y3V0CgpzdWIgQXR0YWNobWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBGaWxlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBmYXFfYXR0YWNobWVudCBXSEVSRSBpZCA9ID8gQU5EIGZhcV9pZCA9ID8gJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtGaWxlSUR9LCBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBBdHRhY2htZW50SW5kZXgoKQoKcmV0dXJuIGFuIGF0dGFjaG1lbnQgaW5kZXggb2YgYW4gYXJ0aWNsZQoKICAgIG15IEBJbmRleCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRJbmRleCgKICAgICAgICBJdGVtSUQgICAgID0+IDEyMywKICAgICAgICBTaG93SW5saW5lID0+IDAsICAgKCAwfDEsIGRlZmF1bHQgMSkKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICBASW5kZXggPSAoCiAgICAgICAgewogICAgICAgICAgICBGaWxlc2l6ZSAgICA9PiAnNTI3LjYgS0J5dGVzJywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnRXJyb3IuanBnJywKICAgICAgICAgICAgRmlsZXNpemVSYXcgPT4gNTQwMjg2LAogICAgICAgICAgICBGaWxlSUQgICAgICA9PiA2LAogICAgICAgICAgICBJbmxpbmUgICAgICA9PiAwLAogICAgICAgIH0sCiAgICAgICAgeywKICAgICAgICAgICAgRmlsZXNpemUgPT4gJzQzMC4wIEtCeXRlcycsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgRmlsZW5hbWUgPT4gJ1NvbHV0aW9uLmpwZycsCiAgICAgICAgICAgIEZpbGVzaXplUmF3ID0+IDQ0MDI4NiwKICAgICAgICAgICAgRmlsZUlEID0+IDUsCiAgICAgICAgICAgIElubGluZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWxlc2l6ZSA9PiAnMjk2IEJ5dGVzJywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBGaWxlbmFtZSA9PiAnQWRkaXRpb25hbENvbW1lbnRzLnR4dCcsCiAgICAgICAgICAgIEZpbGVzaXplUmF3ID0+IDI5NiwKICAgICAgICAgICAgRmlsZUlEID0+IDcsCiAgICAgICAgICAgIElubGluZSA9PiAwLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEF0dGFjaG1lbnRJbmRleCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBmaWxlbmFtZSwgY29udGVudF90eXBlLCBjb250ZW50X3NpemUsIGlubGluZWF0dGFjaG1lbnQgJwogICAgICAgICAgICAuICdGUk9NIGZhcV9hdHRhY2htZW50ICcKICAgICAgICAgICAgLiAnV0hFUkUgZmFxX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGZpbGVuYW1lJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEwMCwKICAgICk7CgogICAgbXkgQEluZGV4OwogICAgQVRUQUNITUVOVDoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkSUQgICAgICAgICAgPSAkUm93WzBdOwogICAgICAgIG15ICRGaWxlbmFtZSAgICA9ICRSb3dbMV07CiAgICAgICAgbXkgJENvbnRlbnRUeXBlID0gJFJvd1syXTsKICAgICAgICBteSAkRmlsZXNpemUgICAgPSAkUm93WzNdOwogICAgICAgIG15ICRJbmxpbmUgICAgICA9ICRSb3dbNF07CgogICAgICAgICMgZG8gbm90IHNob3cgaW5saW5lIGF0dGFjaG1lbnRzCiAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTaG93SW5saW5lfSAmJiAhJFBhcmFte1Nob3dJbmxpbmV9ICYmICRJbmxpbmUgKSB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CgogICAgICAgICMgY29udmVydCB0byBodW1hbiByZWFkYWJsZSBmaWxlIHNpemUKICAgICAgICBteSAkRmlsZVNpemVSYXcgPSAkRmlsZXNpemU7CiAgICAgICAgaWYgKCRGaWxlc2l6ZSkgewogICAgICAgICAgICBpZiAoICRGaWxlc2l6ZSA+ICggMTAyNCAqIDEwMjQgKSApIHsKICAgICAgICAgICAgICAgICRGaWxlc2l6ZSA9IHNwcmludGYgIiUuMWYgTUJ5dGVzIiwgKCAkRmlsZXNpemUgLyAoIDEwMjQgKiAxMDI0ICkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRGaWxlc2l6ZSA+IDEwMjQgKSB7CiAgICAgICAgICAgICAgICAkRmlsZXNpemUgPSBzcHJpbnRmICIlLjFmIEtCeXRlcyIsICggKCAkRmlsZXNpemUgLyAxMDI0ICkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRGaWxlc2l6ZSA9ICRGaWxlc2l6ZSAuICcgQnl0ZXMnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBJbmRleCwgewogICAgICAgICAgICBGaWxlSUQgICAgICA9PiAkSUQsCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICAgICAgICAgICBGaWxlc2l6ZSAgICA9PiAkRmlsZXNpemUsCiAgICAgICAgICAgIEZpbGVzaXplUmF3ID0+ICRGaWxlU2l6ZVJhdywKICAgICAgICAgICAgSW5saW5lICAgICAgPT4gJElubGluZSwKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiBASW5kZXg7Cn0KCj1oZWFkMiBGQVFDb3VudCgpCgpDb3VudCB0aGUgbnVtYmVyIG9mIGFydGljbGVzIGZvciBhIGRlZmluZWQgY2F0ZWdvcnkuIE9ubHkgdmFsaWQgRkFRIGFydGljbGVzIHdpbGwgYmUgY291bnRlZC4KCiAgICBteSAkQXJ0aWNsZUNvdW50ID0gJEZBUU9iamVjdC0+RkFRQ291bnQoCiAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gWzEsMiwzLDRdLAogICAgICAgIEl0ZW1TdGF0ZXMgPT4gIHsKICAgICAgICAgICAgMSA9PiAnaW50ZXJuYWwnLAogICAgICAgICAgICAyID0+ICdleHRlcm5hbCcsCiAgICAgICAgICAgIDMgPT4gJ3B1YmxpYycsCiAgICAgICAgfSwKICAgICAgICBPbmx5QXBwcm92ZWQgPT4gMSwgICAjIG9wdGlvbmFsIChkZWZhdWx0IDApCiAgICAgICAgVmFsaWQgICAgICAgID0+IDEsICAgIyBvcHRpb25hbCAoZGVmYXVsdCAwKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJEFydGljbGVDb3VudCA9IDM7Cgo9Y3V0CgpzdWIgRkFRQ291bnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDYXRlZ29yeUlEcyBJdGVtU3RhdGVzIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgbXkgJFZhbGlkICAgID0gJFBhcmFte1ZhbGlkfSA/IDEgOiAwOwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJENhdGVnb3J5SURTdHJpbmcgPSAnJzsKICAgIGlmICggJFBhcmFte0NhdGVnb3J5SURzfSAmJiByZWYgJFBhcmFte0NhdGVnb3J5SURzfSBlcSAnQVJSQVknICYmIEB7ICRQYXJhbXtDYXRlZ29yeUlEc30gfSApIHsKCiAgICAgICAgIyBpbnRlZ2VyIHF1b3RlIHRoZSBjYXRlZ29yeSBpZHMKICAgICAgICBmb3IgbXkgJENhdGVnb3J5SUQgKCBAeyAkUGFyYW17Q2F0ZWdvcnlJRHN9IH0gKSB7CiAgICAgICAgICAgICRDYXRlZ29yeUlEID0gJERCT2JqZWN0LT5RdW90ZSggJENhdGVnb3J5SUQsICdJbnRlZ2VyJyApOwogICAgICAgIH0KCiAgICAgICAgbXkgQFNvcnRlZElEcyA9IHNvcnQgQHsgJFBhcmFte0NhdGVnb3J5SURzfSB9OwoKICAgICAgICAjIHNwbGl0IElOIHN0YXRlbWVudCB3aXRoIG1vcmUgdGhhbiA5MDAgZWxlbWVudHMgaW4gbW9yZSBzdGF0ZW1lbnRzIGNvbWJpbmVkIHdpdGggT1IKICAgICAgICAjIGJlY2F1c2UgT3JhY2xlIGRvZXNuJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gMTAwMCBlbGVtZW50cyBpbiBvbmUgSU4gc3RhdGVtZW50LgogICAgICAgIG15IEBTUUxTdHJpbmdzOwogICAgICAgIExPT1A6CiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQFNvcnRlZElEcyApIHsKCiAgICAgICAgICAgIG15IEBTb3J0ZWRJRHNQYXJ0ID0gc3BsaWNlIEBTb3J0ZWRJRHMsIDAsIDkwMDsKCiAgICAgICAgICAgIG15ICRJRFN0cmluZyA9IGpvaW4gJywnLCBAU29ydGVkSURzUGFydDsKCiAgICAgICAgICAgIHB1c2ggQFNRTFN0cmluZ3MsICIgaS5jYXRlZ29yeV9pZCBJTiAoJElEU3RyaW5nKSAiOwogICAgICAgIH0KCiAgICAgICAgbXkgJFNRTFN0cmluZyA9IGpvaW4gJyBPUiAnLCBAU1FMU3RyaW5nczsKCiAgICAgICAgJENhdGVnb3J5SURTdHJpbmcgLj0gJ0FORCAoICcgLiAkU1FMU3RyaW5nIC4gJyApICc7CiAgICB9CgogICAgIyBidWlsZCB2YWxpZCBpZCBzdHJpbmcKICAgIG15ICRWYWxpZElEc1N0cmluZzsKICAgIGlmICgkVmFsaWQpIHsKICAgICAgICAkVmFsaWRJRHNTdHJpbmcgPSBqb2luICcsICcsICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgICAgICAkVmFsaWRJRHNTdHJpbmcgPSBqb2luICcsICcsIGtleXMgJVZhbGlkTGlzdDsKICAgIH0KCiAgICBteSAkU1FMID0gJ1NFTEVDVCBDT1VOVCgqKSAnCiAgICAgICAgLiAnRlJPTSBmYXFfaXRlbSBpLCBmYXFfc3RhdGUgcyAnCiAgICAgICAgLiAnV0hFUkUgaS5zdGF0ZV9pZCA9IHMuaWQgJwogICAgICAgIC4gIkFORCBpLnZhbGlkX2lkIElOICgkVmFsaWRJRHNTdHJpbmcpICIKICAgICAgICAuICRDYXRlZ29yeUlEU3RyaW5nOwoKICAgICMgY291bnQgb25seSBhcHByb3ZlZCBhcnRpY2xlcwogICAgaWYgKCAkUGFyYW17T25seUFwcHJvdmVkfSApIHsKICAgICAgICAkU1FMIC49ICcgQU5EIGkuYXBwcm92ZWQgPSAxJzsKICAgIH0KCiAgICBteSAkRXh0ID0gJyc7CiAgICBpZiAoICRQYXJhbXtJdGVtU3RhdGVzfSAmJiByZWYgJFBhcmFte0l0ZW1TdGF0ZXN9IGVxICdIQVNIJyAmJiAleyAkUGFyYW17SXRlbVN0YXRlc30gfSApIHsKICAgICAgICBteSAkU3RhdGVzU3RyaW5nID0gam9pbiAnLCAnLCBrZXlzICV7ICRQYXJhbXtJdGVtU3RhdGVzfSB9OwogICAgICAgICRFeHQgLj0gIiBBTkQgcy50eXBlX2lkIElOICgkU3RhdGVzU3RyaW5nICkiOwogICAgfQogICAgJEV4dCAuPSAnIEdST1VQIEJZIGNhdGVnb3J5X2lkJzsKICAgICRTUUwgLj0gJEV4dDsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+IDIwMCwKICAgICk7CgogICAgbXkgJENvdW50ID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDb3VudCArPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkQ291bnQ7Cn0KCj1oZWFkMiBGQVFEZWxldGUoKQoKRGVsZXRlIGFuIGFydGljbGUuCgogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFEZWxldGUoCiAgICAgICAgSXRlbUlEID0+IDEsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgoKICAgICREZWxldGVTdWNjZXNzID0gMTsgICAgICAgICAgICAgICMgb3IgdW5kZWYgaWYgYXJ0aWNsZSBjb3VsZCBub3QgYmUgZGVsZXRlZAoKPWN1dAoKc3ViIEZBUURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBhdHRhY2htZW50cwogICAgbXkgQEluZGV4ID0gJFNlbGYtPkF0dGFjaG1lbnRJbmRleCgKICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIGZvciBteSAkRmlsZUlEIChASW5kZXgpIHsKICAgICAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRTZWxmLT5BdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEZpbGVJRCA9PiAkRmlsZUlELT57RmlsZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJERlbGV0ZVN1Y2Nlc3M7CiAgICB9CgogICAgIyBkZWxldGUgdm90ZXMKICAgIG15ICRWb3RlSURzUmVmID0gJFNlbGYtPlZvdGVTZWFyY2goCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICBmb3IgbXkgJFZvdGVJRCAoIEB7JFZvdGVJRHNSZWZ9ICkgewogICAgICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPlZvdGVEZWxldGUoCiAgICAgICAgICAgIFZvdGVJRCA9PiAkVm90ZUlELAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICEkRGVsZXRlU3VjY2VzczsKICAgIH0KCiAgICAjIGRlbGV0ZSBhbGwgRkFRIGxpbmtzIG9mIHRoaXMgRkFRIGFydGljbGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtEZWxldGVBbGwoCiAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgIEtleSAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGhpc3RvcnkKICAgIHJldHVybiBpZiAhJFNlbGYtPkZBUUhpc3RvcnlEZWxldGUoCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBGQVEgU2VydmljZQoKICAgICMgZGVsZXRlIGFsbCByZWxhdGVkIHNlcnZpY2VzCiAgICBteSAkU2VydmljZURhdGFBcnJheVJlZiA9ICRTZWxmLT5GQVFTZXJ2aWNlR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICk7CgogICAgZm9yIG15ICRTZXJ2aWNlICggQHskU2VydmljZURhdGFBcnJheVJlZn0gKSB7CiAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+RkFRU2VydmljZURlbGV0ZSgKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2UtPntTZXJ2aWNlSUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJERlbGV0ZVN1Y2Nlc3M7CiAgICB9CgogICAgIyBlbyBGQVEgU2VydmljZQoKICAgICMgZGVsZXRlIGFydGljbGUKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGZhcV9pdGVtIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJFNlbGYtPl9EZWxldGVGcm9tRkFRQ2FjaGUoJVBhcmFtKTsKCiAgICByZXR1cm4gMTsKfQoKIyBGQVEgU2VydmljZQoKPWhlYWQyIEZBUVNlcnZpY2VBZGQoKQoKYWRkIHNlcnZpY2VzIHRvIGFuIGFydGljbGUKCiAgICBteSAkQWRkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUVNlcnZpY2VBZGQoCiAgICAgICAgSXRlbUlEID0+IDEsCiAgICAgICAgU2VydmljZUlEID0+IDEsCiAgICAgICAgTmFtZSAgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgKTsKClJldHVybnM6CgogICAgJEFkZFN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgICMgb3IgdW5kZWYgaWYgYXJ0aWNsZSBzZXJ2aWNlIGNvdWxkIG5vdCBiZSBhZGRlZAoKPWN1dAoKc3ViIEZBUVNlcnZpY2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgTmFtZSBTZXJ2aWNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGZhcV9zZXJ2aWNlIChuYW1lLCBzZXJ2aWNlX2lkLCBpdGVtX2lkKScgLgogICAgICAgICAgICAnIFZBTFVFUyAoID8sID8sID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFTZXJ2aWNlR2V0KCkKCmdldCBhbiBhcnJheSB3aXRoIGhhc2ggcmVmZXJlbmNlIHdpdGggdGhlIHNlcnZpY2VzIG9mIGFuIGFydGljbGUKCiAgICBteSAkU2VydmljZURhdGFBcnJheVJlZiA9ICRGQVFPYmplY3QtPkZBUVNlcnZpY2VHZXQoCiAgICAgICAgSXRlbUlEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkU2VydmljZURhdGFBcnJheVJlZiA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDb21wdXRlcjo6SGFyZHdhcmUnLAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMiwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBGQVFTZXJ2aWNlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIG5hbWUsIHNlcnZpY2VfaWQKICAgICAgICAgICAgRlJPTSBmYXFfc2VydmljZQogICAgICAgICAgICBXSEVSRSBpdGVtX2lkID0gPwogICAgICAgICAgICBPUkRFUiBCWSBuYW1lLCBzZXJ2aWNlX2lkJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICApOwoKICAgICMgJEdldFBhcmFte1NlcnZpY2VMaXN0fSAgICAgICAgID0gXCVTZXJ2aWNlTGlzdDsKCiAgICBteSBARGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVSZWNvcmQgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFJvd1sxXSwKICAgICAgICApOwogICAgICAgIHB1c2ggQERhdGEsIFwlUmVjb3JkOwogICAgfQoKICAgIHJldHVybiBcQERhdGE7Cgp9Cgo9aGVhZDIgRkFRU2VydmljZUFydGljbGVzR2V0KCkKCmdldCBhbiBhcnJheSB3aXRoIGFydGljbGVzIHJlbGF0ZWQgdG8gYSBzZXJ2aWNlCgogICAgbXkgJEZBUVNlcnZpY2VBcnRpY2xlcyA9ICRGQVFPYmplY3QtPkZBUVNlcnZpY2VBcnRpY2xlc0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMSwKICAgICAgICBMaW1pdCAgICAgPT4gMTAsICAgICMgZGVmYXVsdCAxMAogICAgKTsKClJldHVybnM6CgogICAgJEZBUVNlcnZpY2VBcnRpY2xlcyA9IFsgMSwgMiwgMyBdOwoKCj1jdXQKCnN1YiBGQVFTZXJ2aWNlQXJ0aWNsZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkTGltaXQgPSAxMDsKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAkTGltaXQgPSAkUGFyYW17TGltaXR9OwogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpdGVtX2lkCiAgICAgICAgICAgIEZST00gZmFxX3NlcnZpY2UKICAgICAgICAgICAgV0hFUkUgc2VydmljZV9pZCA9ID8KICAgICAgICAgICAgT1JERVIgQlkgaXRlbV9pZCcsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1NlcnZpY2VJRH0gXSwKICAgICAgICBMaW1pdCA9PiAkTGltaXQsCiAgICApOwoKICAgIG15IEBEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBARGF0YSwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhOwoKfQoKPWhlYWQyIEZBUVNlcnZpY2VEZWxldGUoKQoKZGVsZXRlIHRoZSBzZXJ2aWNlIG9mIGFuIGFydGljbGUKCiAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUVNlcnZpY2VEZWxldGUoCiAgICAgICAgSXRlbUlEICAgID0+IDEsCiAgICAgICAgU2VydmljZUlEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkRGVsZXRlU3VjY2VzcyA9IDE7ICAgICAgICAgICAgICAgICMgb3IgdW5kZWYgaWYgc2VydmljZSBjb3VsZCBub3QgYmUgZGVsZXRlZAoKPWN1dAoKc3ViIEZBUVNlcnZpY2VEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgU2VydmljZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBmYXFfc2VydmljZSBXSEVSRSBpdGVtX2lkID0gPyBBTkQgc2VydmljZV9pZCA9ID8gJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJdGVtSUR9LCBcJFBhcmFte1NlcnZpY2VJRH0sIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgojIGVvIEZBUSBTZXJ2aWNlCgo9aGVhZDIgRkFRSGlzdG9yeUFkZCgpCgphZGQgYW4gaGlzdG9yeSB0byBhbiBhcnRpY2xlCgogICAgbXkgJEFkZFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFIaXN0b3J5QWRkKAogICAgICAgIEl0ZW1JRCA9PiAxLAogICAgICAgIE5hbWUgICA9PiAnVXBkYXRlZCBBcnRpY2xlLicsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkQWRkU3VjY2VzcyA9IDE7ICAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBhcnRpY2xlIGhpc3RvcnkgY291bGQgbm90IGJlIGFkZGVkCgo9Y3V0CgpzdWIgRkFRSGlzdG9yeUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBOYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gZmFxX2hpc3RvcnkgKG5hbWUsIGl0ZW1faWQsICcgLgogICAgICAgICAgICAnIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpJyAuCiAgICAgICAgICAgICcgVkFMVUVTICggPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17SXRlbUlEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFIaXN0b3J5R2V0KCkKCmdldCBhbiBhcnJheSB3aXRoIGhhc2ggcmVmZXJlbmNlIHdpdGggdGhlIGhpc3Rvcnkgb2YgYW4gYXJ0aWNsZQoKICAgIG15ICRIaXN0b3J5RGF0YUFycmF5UmVmID0gJEZBUU9iamVjdC0+RkFRSGlzdG9yeUdldCgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRIaXN0b3J5RGF0YUFycmF5UmVmID0gWwogICAgICAgIHsKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+IDEsCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAnMjAxMC0xMS0wMiAwNzo0NToxNScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ3JlYXRlZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIENyZWF0ZWRCeSA9PiAxLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJzIwMTEtMDYtMTQgMTI6NTM6NTUnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1VwZGF0ZWQnLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIEZBUUhpc3RvcnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIG5hbWUsIGNyZWF0ZWQsIGNyZWF0ZWRfYnkKICAgICAgICAgICAgRlJPTSBmYXFfaGlzdG9yeQogICAgICAgICAgICBXSEVSRSBpdGVtX2lkID0gPwogICAgICAgICAgICBPUkRFUiBCWSBjcmVhdGVkLCBpZCcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICBteSBARGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVSZWNvcmQgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRSb3dbMl0sCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBEYXRhLCBcJVJlY29yZDsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhOwp9Cgo9aGVhZDIgRkFRSGlzdG9yeURlbGV0ZSgpCgpkZWxldGUgdGhlIGhpc3Rvcnkgb2YgYW4gYXJ0aWNsZQoKICAgIG15ICREZWxldGVTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRSGlzdG9yeURlbGV0ZSgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICREZWxldGVEdWNjZXNzID0gMTsgICAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBoaXN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkCgo9Y3V0CgpzdWIgRkFRSGlzdG9yeURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGZhcV9oaXN0b3J5IFdIRVJFIGl0ZW1faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRkFRSm91cm5hbEdldCgpCgpnZXQgdGhlIHN5c3RlbSBqb3VybmFsCgogICAgbXkgJEhpc3RvcnlEYXRhQXJyYXlSZWYgPSAkRkFRT2JqZWN0LT5GQVFKb3VybmFsR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJEpvdXJuYWxEYXRhQXJyYXlSZWYgPSBbCiAgICAgICAgewogICAgICAgICAgICBJdGVtSUQgICAgPT4gJzMyJywKICAgICAgICAgICAgTnVtYmVyICAgID0+ICcxMDAwNCcsCiAgICAgICAgICAgIENhdGVnb3J5ICA9PiAnTXkgQ2F0ZWdvcnknLAogICAgICAgICAgICBTdWJqZWN0ICAgPT4gJ05ldyBBcnRpY2xlJywKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdDcmVhdGVkJywKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICcxJywKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICcyMDExLTAxLTA1IDIxOjUzOjUwJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgSXRlbUlEICAgID0+ICc0JywKICAgICAgICAgICAgTnVtYmVyICAgID0+ICcxMDAwNCcsCiAgICAgICAgICAgIENhdGVnb3J5ICA9PiAnTXkgQ2F0ZWdvcnknLAogICAgICAgICAgICBTdWJqZWN0ICAgPT4gIk5ldyBBcnRpY2xlIiwKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdVcGRhdGVkJywKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICcxJywKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICcyMDExLTAxLTA1IDIxOjU1OjMyJywKICAgICAgICB9CiAgICBdOwoKPWN1dAoKc3ViIEZBUUpvdXJuYWxHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICBteSAlR3JvdXBzICAgICAgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuIGlmICElR3JvdXBzOwoKICAgIG15IEBHcm91cElEcyAgICAgICAgICA9IGtleXMgJUdyb3VwczsKICAgIG15ICRHcm91cFBsYWNlaG9sZGVycyA9IGpvaW4gJywgJywgKCc/JykgeCBAR3JvdXBJRHM7CiAgICBteSBAR3JvdXBCaW5kICAgICAgICAgPSBtYXAgeyBcJF8gfSBAR3JvdXBJRHM7CgogICAgbXkgJENhdGVnb3J5U1FMID0KICAgICAgICAiU0VMRUNUIGcuY2F0ZWdvcnlfaWQKICAgICAgICBGUk9NIGZhcV9jYXRlZ29yeV9ncm91cCBnCiAgICAgICAgV0hFUkUgZy5ncm91cF9pZCBJTiAoICRHcm91cFBsYWNlaG9sZGVycyApIjsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJENhdGVnb3J5U1FMLAogICAgICAgIEJpbmQgPT4gXEBHcm91cEJpbmQsCiAgICApOwoKICAgIG15IEBDYXRlZ29yeUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENhdGVnb3J5SURzLCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBpZiAhQENhdGVnb3J5SURzOwoKICAgIG15IEBCaW5kICAgICAgICAgICAgICAgICA9IG1hcCB7IFwkXyB9IEBDYXRlZ29yeUlEczsKICAgIG15ICRDYXRlZ29yeVBsYWNlaG9sZGVycyA9IGpvaW4gJywgJywgKCc/JykgeCBAQ2F0ZWdvcnlJRHM7CgogICAgIyBidWlsZCBTUUwgcXVlcnkKICAgIG15ICRTUUwgPQogICAgICAgICJTRUxFQ1QgaS5pZCwgaC5uYW1lLCBoLmNyZWF0ZWQsIGguY3JlYXRlZF9ieSwgYy5uYW1lLCBpLmZfc3ViamVjdCwgaS5mX251bWJlcgogICAgICAgIEZST00gZmFxX2l0ZW0gaQogICAgICAgICAgICBJTk5FUiBKT0lOIGZhcV9zdGF0ZSBzIE9OIHMuaWQgPSBpLnN0YXRlX2lkCiAgICAgICAgICAgIElOTkVSIEpPSU4gZmFxX2hpc3RvcnkgaCBPTiBoLml0ZW1faWQgPSBpLmlkCiAgICAgICAgICAgIElOTkVSIEpPSU4gZmFxX2NhdGVnb3J5IGMgT04gYy5pZCA9IGkuY2F0ZWdvcnlfaWQKICAgICAgICBXSEVSRSBjLmlkIElOICgkQ2F0ZWdvcnlQbGFjZWhvbGRlcnMpIjsKCiAgICAjIGFkZCBzdGF0ZXMgY29uZGl0aW9uCiAgICBpZiAoICRQYXJhbXtTdGF0ZXN9ICYmIHJlZiAkUGFyYW17U3RhdGVzfSBlcSAnQVJSQVknICYmIEB7ICRQYXJhbXtTdGF0ZXN9IH0gKSB7CiAgICAgICAgcHVzaCBAQmluZCwgbWFwIHsgXCRfIH0gQHsgJFBhcmFte1N0YXRlc30gfTsKICAgICAgICBteSAkU3RhdGVzU3RyaW5nID0gam9pbiAnLCAnLCAoJz8nKSB4IEB7ICRQYXJhbXtTdGF0ZXN9IH07CiAgICAgICAgJFNRTCAuPSAiQU5EIHMubmFtZSBJTiAoJFN0YXRlc1N0cmluZykgIjsKICAgIH0KCiAgICAjIGFkZCBvcmRlciBieSBjbGF1c2UKICAgICRTUUwgLj0gJ09SREVSIEJZIGguY3JlYXRlZCBERVNDJzsKCiAgICAjIGdldCB0aGUgZGF0YSBmcm9tIGRiCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+IDIwMCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15IEBEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJVJlY29yZCA9ICgKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRSb3dbM10sCiAgICAgICAgICAgIENhdGVnb3J5ICA9PiAkUm93WzRdLAogICAgICAgICAgICBTdWJqZWN0ICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgTnVtYmVyICAgID0+ICRSb3dbNl0sCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBEYXRhLCBcJVJlY29yZDsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhOwp9Cgo9aGVhZDIgS2V5d29yZExpc3QoKQoKZ2V0IGEgbGlzdCBvZiBrZXl3b3JkcyBhcyBhIGhhc2gsIHdpdGggdGhlaXIgY291bnQgYXMgdGhlIHZhbHVlOgoKICAgIG15ICVLZXl3b3JkcyA9ICRGQVFPYmplY3QtPktleXdvcmRMaXN0KAogICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJUtleXdvcmRzID0gKAogICAgICAgICAgJ21hY29zeCcgICA9PiA4LAogICAgICAgICAgJ3VidW50dScgICA9PiAxLAogICAgICAgICAgJ291dGxvb2snICA9PiAyLAogICAgICAgICAgJ3dpbmRvd3MnICA9PiAzLAogICAgICAgICAgJ2V4Y2hhbmdlJyA9PiAxLAogICAgKTsKCj1jdXQKCiMgVE9ETzogRnVuY3Rpb24gbm90IHVzZWQ/IEtleXdvcmQgc2VwYXJhdG9yIGlzIGhlcmUgYSBvdGhlciBhcyBhdCBvdGhlciBwbGFjZXMuLi4KIyBUT0RPOiBDbGFyaWZ5IC0gUmVtb3ZlIGZ1bmN0aW9uIG9yIGNoYW5nZSB0aGUgc2VwYXJhdG9yPwpzdWIgS2V5d29yZExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQKICAgIG15ICRWYWxpZCA9IDA7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkVmFsaWQgPSAkUGFyYW17VmFsaWR9OwogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGtleXdvcmRzIGZyb20gZGIKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGZfa2V5d29yZHMgRlJPTSBmYXFfaXRlbScsCiAgICApOwoKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICRLZXl3b3JkTGlzdCA9IGxjICRSb3dbMF07CgogICAgICAgIGZvciBteSAkS2V5d29yZCAoIHNwbGl0IC8sLywgJEtleXdvcmRMaXN0ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZy90YWlsaW5nIHNwYWNlcwogICAgICAgICAgICAkS2V5d29yZCA9fiBzeyBcQSBccysgfXt9eG1zZzsKICAgICAgICAgICAgJEtleXdvcmQgPX4gc3sgXHMrIFx6IH17fXhtc2c7CgogICAgICAgICAgICAjIGluY3JlYXNlIGtleXdvcmQgY291bnRlcgogICAgICAgICAgICAkRGF0YXskS2V5d29yZH0rKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgRkFRS2V5d29yZEFydGljbGVMaXN0KCkKCkdldCBhIGtleXdvcmQgYW5kIHJlbGF0ZWQgZmFxIGFydGljbGVzIGxvb2t1cCBsaXN0IChvcHRpb25hbCBvbmx5IGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2VzKS4KWW91IGNhbiBidWlsZCBhIGxpc3QgZm9yIGEgYWdlbnQgb3IgY3VzdG9tZXIuIElmIHlvdSBnaXZlIG9ubHkgYSBVc2VySUQgdGhlIHJlc3VsdCBpcyBmb3IKdGhlIGdpdmVuIFVzZXJJRCwgd2l0aCBhIGFkZGl0aW9uYWwgQ3VzdG9tZXJVc2VyIHRoZSBsaXN0IGlzIG9ubHkgZm9yIHRoZSBnaXZlbiBDdXN0b21lclVzZXIuCgogICAgbXkgJUZBUUtleXdvcmRBcnRpY2xlTGlzdCA9ICRGQVFPYmplY3QtPkZBUUtleXdvcmRBcnRpY2xlTGlzdCgKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICBDdXN0b21lclVzZXIgPT4gJ3R0JywgICAgICAgICAgICMgb3B0aW9uYWwgKHdpdGggdGhpcyB0aGUgcmVzdWx0IGlzIG9ubHkgY3VzdG9tZXIgZmFxIGFydGljbGUpCiAgICAgICAgTGFuZ3VhZ2VzICAgID0+IFsgJ2VuJywgJ2RlJyBdLCAjIG9wdGlvbmFsCiAgICAgICAgU2VydmljZUlEICAgID0+ICRTZXJ2aWNlSUQsICAgICAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJucwoKICAgIG15ICVGQVFLZXl3b3JkQXJ0aWNsZUxpc3QgPSAoCiAgICAgICAgJ0V4YW1wbGVLZXl3b3JkJyA9PiBbCiAgICAgICAgICAgIDEyLAogICAgICAgICAgICAxMywKICAgICAgICBdLAogICAgICAgICdUZXN0S2V5d29yZCcgPT4gWwogICAgICAgICAgICA4NzYsCiAgICAgICAgXSwKICAgICk7Cgo9Y3V0CgpzdWIgRkFRS2V5d29yZEFydGljbGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBMYW5ndWFnZUlEczsKCiAgICBMQU5HVUFHRU5BTUU6CiAgICBmb3IgbXkgJExhbmd1YWdlTmFtZSAoIEB7ICRQYXJhbXtMYW5ndWFnZXN9IH0gKSB7CiAgICAgICAgbmV4dCBMQU5HVUFHRU5BTUUgaWYgISRMYW5ndWFnZU5hbWU7CgogICAgICAgIG15ICRMYW5ndWFnZUlEID0gJFNlbGYtPkxhbmd1YWdlTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICRMYW5ndWFnZU5hbWUsCiAgICAgICAgKTsKICAgICAgICBuZXh0IExBTkdVQUdFTkFNRSBpZiAhJExhbmd1YWdlSUQ7CgogICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAkTGFuZ3VhZ2VJRDsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkSW50ZXJmYWNlOwogICAgbXkgJFN0YXRlVHlwZXM7CiAgICBteSAkQ2F0ZWdvcnlJRHM7CgogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyfSApIHsKCiAgICAgICAgJEludGVyZmFjZSA9ICdleHRlcm5hbCc7CgogICAgICAgICRTdGF0ZVR5cGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkN1c3RvbWVyOjpTdGF0ZVR5cGVzJyk7CgogICAgICAgICRDYXRlZ29yeUlEcyA9ICRTZWxmLT5DdXN0b21lckNhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBDdXN0b21lclVzZXIgICAgID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICBNb2RlICAgICAgICAgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIEdldFN1YkNhdGVnb3JpZXMgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICRJbnRlcmZhY2UgPSAnaW50ZXJuYWwnOwoKICAgICAgICAkU3RhdGVUeXBlcyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBZ2VudDo6U3RhdGVUeXBlcycpOwoKICAgICAgICAkQ2F0ZWdvcnlJRHMgPSAkU2VsZi0+QWdlbnRDYXRlZ29yeVNlYXJjaCgKICAgICAgICAgICAgR2V0U3ViQ2F0ZWdvcmllcyA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIGlmICFJc0FycmF5UmVmV2l0aERhdGEoJENhdGVnb3J5SURzKTsKCiAgICBteSAkQ2FjaGVLZXkgPSAnRkFRS2V5d29yZEFydGljbGVMaXN0JzsKCiAgICBpZiAoQExhbmd1YWdlSURzKSB7CiAgICAgICAgJENhY2hlS2V5IC49ICc6Okxhbmd1YWdlJyAuIGpvaW4gJzo6Jywgc29ydCBATGFuZ3VhZ2VJRHM7CiAgICB9CiAgICAkQ2FjaGVLZXkgLj0gJzo6Q2F0ZWdvcnlJRHMnIC4gam9pbiAnOjonLCBzb3J0IEB7JENhdGVnb3J5SURzfTsKICAgICRDYWNoZUtleSAuPSAnOjpJbnRlcmZhY2U6OicgLiAkSW50ZXJmYWNlOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJzo6U2VydmljZUlEOjonIC4gJFBhcmFte1NlcnZpY2VJRH07CiAgICB9CgogICAgbXkgJENhY2hlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICdGQVFLZXl3b3JkQXJ0aWNsZUxpc3QnLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAleyRDYWNoZX0gaWYgJENhY2hlOwoKICAgIG15ICVGQVFTZWFyY2hQYXJhbWV0ZXI7CgogICAgIyBTZXQgaW50ZXJmYWNlIHNldHRpbmcgdG8gJ2V4dGVybmFsJywgdG8gc2VhcmNoIG9ubHkgZm9yIGFwcHJvdmVkIGZhcSBhcnRpY2xlLgogICAgJEZBUVNlYXJjaFBhcmFtZXRlcntJbnRlcmZhY2V9ID0gJFNlbGYtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ2V4dGVybmFsJywKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICRGQVFTZWFyY2hQYXJhbWV0ZXJ7U3RhdGVzfSA9ICRTZWxmLT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkU3RhdGVUeXBlcywKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICRTZWFyY2hMaW1pdCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpLZXl3b3JkQXJ0aWNlTGlzdDo6U2VhcmNoTGltaXQnKTsKCiAgICBpZiAoQExhbmd1YWdlSURzKSB7CiAgICAgICAgJEZBUVNlYXJjaFBhcmFtZXRlcntMYW5ndWFnZUlEc30gPSBcQExhbmd1YWdlSURzOwogICAgfQoKICAgICMgR2V0IHRoZSByZWxldmFudCBGQVEgYXJ0aWNsZSBmb3IgdGhlIGN1cnJlbnQgY3VzdG9tZXIgdXNlci4KICAgIG15IEBGQVFBcnRpY2xlSURzID0gJFNlbGYtPkZBUVNlYXJjaCgKICAgICAgICAlRkFRU2VhcmNoUGFyYW1ldGVyLAogICAgICAgIENhdGVnb3J5SURzICAgICAgPT4gJENhdGVnb3J5SURzLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydGQVFJRCddLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydEb3duJ10sCiAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAkU2VhcmNoTGltaXQsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAoKICAgICAgICAjIEZBUSBTZXJ2aWNlIFRPRE8KICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sCgogICAgICAgICMgZW8gRkFRIFNlcnZpY2UKICAgICk7CgogICAgbXkgJUtleXdvcmRBcnRpY2VMaXN0OwogICAgbXkgJUxvb2t1cEtleXdvcmRBcnRpY2xlSUQ7CgogICAgRkFRQVJUSUNMRUlEOgogICAgZm9yIG15ICRGQVFBcnRpY2xlSUQgKEBGQVFBcnRpY2xlSURzKSB7CgogICAgICAgIG15ICVGQVFBcnRpY2xlRGF0YSA9ICRTZWxmLT5GQVFHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkRkFRQXJ0aWNsZUlELAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBGQVFBUlRJQ0xFSUQgaWYgISRGQVFBcnRpY2xlRGF0YXtLZXl3b3Jkc307CgogICAgICAgICMgUmVwbGFjZSBjb21tYXMgYW5kIHNlbWljb2xvbnMsIGJlY2F1c2UgdGhlIGtleXdvcmRzIGFyZSBub3JtYWwgc3BsaXQgd2l0aCBhbiB3aGl0ZXNwYWNlLgogICAgICAgICRGQVFBcnRpY2xlRGF0YXtLZXl3b3Jkc30gPX4gcy8sLyAvZzsKICAgICAgICAkRkFRQXJ0aWNsZURhdGF7S2V5d29yZHN9ID1+IHMvOy8gL2c7CgogICAgICAgIG15IEBLZXl3b3JkcyA9IHNwbGl0IC9ccysvLCBsYyAkRkFRQXJ0aWNsZURhdGF7S2V5d29yZHN9OwoKICAgICAgICBLRVlXT1JEOgogICAgICAgIGZvciBteSAkS2V5d29yZCAoQEtleXdvcmRzKSB7CgogICAgICAgICAgICBuZXh0IEtFWVdPUkQgaWYgJExvb2t1cEtleXdvcmRBcnRpY2xlSUR7JEtleXdvcmR9LT57JEZBUUFydGljbGVJRH07CgogICAgICAgICAgICBwdXNoIEB7ICRLZXl3b3JkQXJ0aWNlTGlzdHskS2V5d29yZH0gfSwgJEZBUUFydGljbGVJRDsKCiAgICAgICAgICAgICRMb29rdXBLZXl3b3JkQXJ0aWNsZUlEeyRLZXl3b3JkfS0+eyRGQVFBcnRpY2xlSUR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAnRkFRS2V5d29yZEFydGljbGVMaXN0JywKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVLZXl3b3JkQXJ0aWNlTGlzdCwKICAgICAgICBUVEwgICA9PiA2MCAqIDYwICogMywKICAgICk7CgogICAgcmV0dXJuICVLZXl3b3JkQXJ0aWNlTGlzdDsKfQoKPWhlYWQyIEZBUVBhdGhMaXN0R2V0KCkKCnJldHVybnMgYSBjYXRlZ29yeSBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkQ2F0ZWdvcnlJREFycmF5UmVmID0gJEZBUU9iamVjdC0+RkFRUGF0aExpc3RHZXQoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAxNTAsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJENhdGVnb3J5SURBcnJheVJlZiA9IFsKICAgICAgICB7CiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJzInLAogICAgICAgICAgICBQYXJlbnRJRCA9PiAnMCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ015IENhdGVnb3J5JywKICAgICAgICAgICAgQ29tbWVudCA9PiAnTXkgRmlyc3QgQ2F0ZWdvcnknLAogICAgICAgICAgICBWYWxpZElEID0+ICcxJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAnNCcsCiAgICAgICAgICAgIFBhcmVudElEID0+ICcyJywKICAgICAgICAgICAgTmFtZSA9PiAnU3ViIENhdGVnb3J5IEEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdUaGlzIElzIENhdGVnb3J5IEEnLAogICAgICAgICAgICBWYWxpZElEID0+ICcxJywKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBGQVFQYXRoTGlzdEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQENhdGVnb3J5TGlzdDsKICAgIG15ICRUZW1wQ2F0ZWdvcnlJRCA9ICRQYXJhbXtDYXRlZ29yeUlEfTsKICAgIHdoaWxlICgkVGVtcENhdGVnb3J5SUQpIHsKICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkVGVtcENhdGVnb3J5SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJURhdGEpIHsKICAgICAgICAgICAgcHVzaCBAQ2F0ZWdvcnlMaXN0LCBcJURhdGE7CiAgICAgICAgfQogICAgICAgICRUZW1wQ2F0ZWdvcnlJRCA9ICREYXRhe1BhcmVudElEfTsKICAgIH0KCiAgICBAQ2F0ZWdvcnlMaXN0ID0gcmV2ZXJzZSBAQ2F0ZWdvcnlMaXN0OwoKICAgIHJldHVybiBcQENhdGVnb3J5TGlzdDsKCn0KCj1oZWFkMiBGQVFMb2dBZGQoKQoKYWRkcyBhY2Nlc3NlZCBGQVEgYXJ0aWNsZSB0byB0aGUgYWNjZXNzIGxvZyB0YWJsZQoKICAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRTG9nQWRkKAogICAgICAgIEl0ZW1JRCAgICA9PiAnMTIzNDU2JywKICAgICAgICBJbnRlcmZhY2UgPT4gJ2ludGVybmFsJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRTdWNjZXNzID0xOyAgICAgICAgICAgICAgICAjIG9yIHVuZGVmIGlmIEZBUUxvZyBjb3VsZCBub3QgYmUgYWRkZWQKCj1jdXQKCnN1YiBGQVFMb2dBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgSW50ZXJmYWNlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGVudmlyb25tZW50IHZhcmlhYmxlcwogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJElQICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5SZW1vdGVBZGRyKCkgICAgICAgfHwgJ05PTkUnOwogICAgbXkgJFVzZXJBZ2VudCAgID0gJFBhcmFtT2JqZWN0LT5IVFRQKCdVU0VSX0FHRU5UJykgfHwgJ05PTkUnOwoKICAgICMgRGVmaW5lIHRpbWUgcGVyaW9kIHdoZW4gcmVsb2FkcyB3aWxsIG5vdCBiZSBsb2dnZWQgKDEwIG1pbnV0ZXMpLgogICAgbXkgJFJlbG9hZEJsb2NrVGltZSA9IDEwICogNjA7CgogICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAkRGF0ZVRpbWVPYmplY3QtPlN1YnRyYWN0KCBTZWNvbmRzID0+ICRSZWxvYWRCbG9ja1RpbWUgKTsKICAgIG15ICRUaW1lU3RhbXAgPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBjaGVjayBpZiBhIGxvZyBlbnRyeSBleGlzdHMgbmV3ZXIgdGhhbiB0aGUgUmVsb2FkQmxvY2tUaW1lCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGZhcV9sb2cgJwogICAgICAgICAgICAuICdXSEVSRSBpdGVtX2lkID0gPyBBTkQgaXAgPSA/ICcKICAgICAgICAgICAgLiAnQU5EIHVzZXJfYWdlbnQgPSA/IEFORCBjcmVhdGVkID49ID8gJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SXRlbUlEfSwgXCRJUCwgXCRVc2VyQWdlbnQsIFwkVGltZVN0YW1wIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQWxyZWFkeUV4aXN0cyA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWxyZWFkeUV4aXN0cyA9IDE7CiAgICB9CgogICAgcmV0dXJuIGlmICRBbHJlYWR5RXhpc3RzOwoKICAgICMgaW5zZXJ0IG5ldyBsb2cgZW50cnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGZhcV9sb2cgJwogICAgICAgICAgICAuICcoaXRlbV9pZCwgaW50ZXJmYWNlLCBpcCwgdXNlcl9hZ2VudCwgY3JlYXRlZCkgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wKScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SXRlbUlEfSwgXCRQYXJhbXtJbnRlcmZhY2V9LCBcJElQLCBcJFVzZXJBZ2VudCwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZBUVRvcDEwR2V0KCkKClJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgdG9wIDEwIEZBUSBhcnRpY2xlIGlkcy4KCiAgICBteSAkVG9wMTBJRHNSZWYgPSAkRkFRT2JqZWN0LT5GQVFUb3AxMEdldCgKICAgICAgICBJbnRlcmZhY2UgICA9PiAncHVibGljJywKICAgICAgICBDYXRlZ29yeUlEcyA9PiBbIDEsIDIsIDMgXSwgICMgKG9wdGlvbmFsKSBPbmx5IHNob3cgdGhlIFRvcC0xMCBhcnRpY2xlcyBmcm9tIHRoZXNlIGNhdGVnb3JpZXMKICAgICAgICBMaW1pdCAgICAgICA9PiAxMCwgICAgICAgICAgICMgKG9wdGlvbmFsLCBkZWZhdWx0IDEwKQogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkVG9wMTBJRHNSZWYgPSBbCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiAxMywKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gMTU5LCAgICAgICAgICAgICAgICMgbnVtYmVyIG9mIHZpc2l0cwogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAncHVibGljJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gNiwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gNzgsCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdwdWJsaWMnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiA0LAogICAgICAgICAgICAnQ291bnQnICAgICA9PiA1OSwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ2ludGVybmFsJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gMjAsCiAgICAgICAgICAgICdDb3VudCcgICAgID0+IDI5LAogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAncHVibGljJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gMSwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gMjQsCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdleHRlcm5hbCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICdJdGVtSUQnICAgID0+IDExLAogICAgICAgICAgICAnQ291bnQnICAgICA9PiAyNCwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ2ludGVybmFsJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gNSwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gMTgsCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdpbnRlcm5hbCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICdJdGVtSUQnICAgID0+IDksCiAgICAgICAgICAgICdDb3VudCcgICAgID0+IDE2LAogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAnZXh0ZXJuYWwnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiAyLAogICAgICAgICAgICAnQ291bnQnICAgICA9PiAxNCwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ2ludGVybmFsJwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiAxNCwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gNiwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ3B1YmxpYycsCiAgICAgICAgfQogICAgXTsKCj1jdXQKCnN1YiBGQVFUb3AxMEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEludGVyZmFjZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHZhbGlkIGlkIHN0cmluZwogICAgbXkgJFZhbGlkSURzU3RyaW5nID0gam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAjIHByZXBhcmUgU1FMCiAgICBteSBAQmluZDsKICAgIG15ICRTUUwgPSAnU0VMRUNUIGl0ZW1faWQsIGNvdW50KGl0ZW1faWQpIGFzIGl0ZW1jb3VudCwgZmFxX3N0YXRlX3R5cGUubmFtZSwgYXBwcm92ZWQgJwogICAgICAgIC4gJ0ZST00gZmFxX2xvZywgZmFxX2l0ZW0sIGZhcV9zdGF0ZSwgZmFxX3N0YXRlX3R5cGUgJwogICAgICAgIC4gJ1dIRVJFIGZhcV9sb2cuaXRlbV9pZCA9IGZhcV9pdGVtLmlkICcKICAgICAgICAuICdBTkQgZmFxX2l0ZW0uc3RhdGVfaWQgPSBmYXFfc3RhdGUuaWQgJwogICAgICAgIC4gIkFORCBmYXFfaXRlbS52YWxpZF9pZCBJTiAoJFZhbGlkSURzU3RyaW5nKSAiCiAgICAgICAgLiAnQU5EIGZhcV9zdGF0ZS50eXBlX2lkID0gZmFxX3N0YXRlX3R5cGUuaWQgJzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGZpbHRlciBqdXN0IGNhdGVnb3JpZXMgd2l0aCBhdCBsZWFzdCBybyBwZXJtaXNzaW9uCiAgICBpZiAoICRQYXJhbXtDYXRlZ29yeUlEc30gJiYgcmVmICRQYXJhbXtDYXRlZ29yeUlEc30gZXEgJ0FSUkFZJyAmJiBAeyAkUGFyYW17Q2F0ZWdvcnlJRHN9IH0gKSB7CgogICAgICAgICMgaW50ZWdlciBxdW90ZSB0aGUgY2F0ZWdvcnkgaWRzCiAgICAgICAgZm9yIG15ICRDYXRlZ29yeUlEICggQHsgJFBhcmFte0NhdGVnb3J5SURzfSB9ICkgewogICAgICAgICAgICAkQ2F0ZWdvcnlJRCA9ICREQk9iamVjdC0+UXVvdGUoICRDYXRlZ29yeUlELCAnSW50ZWdlcicgKTsKICAgICAgICB9CgogICAgICAgIG15IEBTb3J0ZWRJRHMgPSBzb3J0IEB7ICRQYXJhbXtDYXRlZ29yeUlEc30gfTsKCiAgICAgICAgIyBzcGxpdCBJTiBzdGF0ZW1lbnQgd2l0aCBtb3JlIHRoYW4gOTAwIGVsZW1lbnRzIGluIG1vcmUgc3RhdGVtZW50cyBjb21iaW5lZCB3aXRoIE9SCiAgICAgICAgIyBiZWNhdXNlIE9yYWNsZSBkb2Vzbid0IHN1cHBvcnQgbW9yZSB0aGFuIDEwMDAgZWxlbWVudHMgaW4gb25lIElOIHN0YXRlbWVudC4KICAgICAgICBteSBAU1FMU3RyaW5nczsKICAgICAgICBMT09QOgogICAgICAgIHdoaWxlICggc2NhbGFyIEBTb3J0ZWRJRHMgKSB7CgogICAgICAgICAgICBteSBAU29ydGVkSURzUGFydCA9IHNwbGljZSBAU29ydGVkSURzLCAwLCA5MDA7CgogICAgICAgICAgICBteSAkSURTdHJpbmcgPSBqb2luICcsJywgQFNvcnRlZElEc1BhcnQ7CgogICAgICAgICAgICBwdXNoIEBTUUxTdHJpbmdzLCAiIGZhcV9pdGVtLmNhdGVnb3J5X2lkIElOICgkSURTdHJpbmcpICI7CiAgICAgICAgfQoKICAgICAgICBteSAkU1FMU3RyaW5nID0gam9pbiAnIE9SICcsIEBTUUxTdHJpbmdzOwoKICAgICAgICAkU1FMIC49ICcgQU5EICggJyAuICRTUUxTdHJpbmcgLiAnICkgJzsKICAgIH0KCiAgICAjIGZpbHRlciByZXN1bHRzIGZvciBwdWJsaWMgYW5kIGN1c3RvbWVyIGludGVyZmFjZQogICAgaWYgKCAoICRQYXJhbXtJbnRlcmZhY2V9IGVxICdwdWJsaWMnICkgfHwgKCAkUGFyYW17SW50ZXJmYWNlfSBlcSAnZXh0ZXJuYWwnICkgKSB7CgogICAgICAgICMgb25seSBzaG93IGFwcHJvdmVkIGFydGljbGVzCiAgICAgICAgJFNRTCAuPSAnQU5EIGZhcV9pdGVtLmFwcHJvdmVkID0gMSAnOwoKICAgICAgICAjIG9ubHkgc2hvdyB0aGUgcHVibGljIGFydGljbGVzCiAgICAgICAgJFNRTCAuPSAiQU5EICggKCBmYXFfc3RhdGVfdHlwZS5uYW1lID0gJ3B1YmxpYycgQU5EIGZhcV9sb2cuaW50ZXJmYWNlID0gJ3B1YmxpYycgKSAiOwoKICAgICAgICAjIGN1c3RvbWVycyBjYW4gYWRkaXRpb25hbGx5IHNlZSB0aGUgZXh0ZXJuYWwgYXJ0aWNsZXMKICAgICAgICBpZiAoICRQYXJhbXtJbnRlcmZhY2V9IGVxICdleHRlcm5hbCcgKSB7CiAgICAgICAgICAgICRTUUwgLj0gIk9SICggZmFxX3N0YXRlX3R5cGUubmFtZSA9ICdleHRlcm5hbCcgQU5EIGZhcV9sb2cuaW50ZXJmYWNlID0gJ2V4dGVybmFsJyApICI7CiAgICAgICAgfQoKICAgICAgICAkU1FMIC49ICcpICc7CiAgICB9CgogICAgIyBmaWx0ZXIgcmVzdWx0cyBmb3IgZGVmaW5lZCB0aW1lIHBlcmlvZAogICAgaWYgKCAkUGFyYW17U3RhcnREYXRlfSAmJiAkUGFyYW17RW5kRGF0ZX0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIGZhcV9sb2cuY3JlYXRlZCA+PSA/IEFORCBmYXFfbG9nLmNyZWF0ZWQgPD0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsICggXCRQYXJhbXtTdGFydERhdGV9LCBcJFBhcmFte0VuZERhdGV9ICk7CiAgICB9CgogICAgIyBjb21wbGV0ZSBTUUwgc3RhdGVtZW50CiAgICAkU1FMIC49ICdHUk9VUCBCWSBpdGVtX2lkLCBmYXFfc3RhdGVfdHlwZS5uYW1lLCBhcHByb3ZlZCAnCiAgICAgICAgLiAnT1JERVIgQlkgaXRlbWNvdW50IERFU0MnOwoKICAgICMgZ2V0IHRoZSB0b3AgMTAgYXJ0aWNsZSBpZHMgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIFtdIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCAxMCwKICAgICk7CgogICAgbXkgQFJlc3VsdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFJlc3VsdCwgewogICAgICAgICAgICBJdGVtSUQgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ291bnQgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIEludGVyZmFjZSA9PiAkUm93WzJdLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAUmVzdWx0Owp9Cgo9aGVhZDIgRkFRSW5saW5lQXR0YWNobWVudFVSTFVwZGF0ZSgpCgpVcGRhdGVzIHRoZSBVUkxzIG9mIHVwbG9hZGVkIGlubGluZSBhdHRhY2htZW50cy4KCiAgICBteSAkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUUlubGluZUF0dGFjaG1lbnRVUkxVcGRhdGUoCiAgICAgICAgSXRlbUlEICAgICA9PiAxMiwKICAgICAgICBGb3JtSUQgICAgID0+IDQ1NiwKICAgICAgICBGaWxlSUQgICAgID0+IDUsCiAgICAgICAgQXR0YWNobWVudCA9PiBcJUF0dGFjaG1lbnQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJFN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgICMgb2YgdW5kZWYgaWYgYXR0YWNobWVudCBVUkwgY291bGQgbm90IGJlIHVwZGF0ZWQKCj1jdXQKCnN1YiBGQVFJbmxpbmVBdHRhY2htZW50VVJMVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIEF0dGFjaG1lbnQgRm9ybUlEIEZpbGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGF0dGFjaG1lbnQgaXMgYSBoYXNoIHJlZmVyZW5jZQogICAgaWYgKCByZWYgJFBhcmFte0F0dGFjaG1lbnR9IG5lICdIQVNIJyAmJiAhJXsgJFBhcmFte0F0dGFjaG1lbnR9IH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBdHRhY2htZW50IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG9ubHkgY29uc2lkZXIgaW5saW5lIGF0dGFjaG1lbnRzIGhlcmUgKHRoZXkgaGF2ZSBhIGNvbnRlbnQgaWQpCiAgICByZXR1cm4gMSBpZiAhJFBhcmFte0F0dGFjaG1lbnR9LT57Q29udGVudElEfTsKCiAgICBteSAlRkFRRGF0YSA9ICRTZWxmLT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICBJdGVtRmllbGRzID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBwaWN0dXJlIFVSTCBpbiB1cGxvYWQgY2FjaGUKICAgIG15ICRTZWFyY2ggPSAiQWN0aW9uPVBpY3R1cmVVcGxvYWQgLiBGb3JtSUQ9XFEkUGFyYW17Rm9ybUlEfVxFIC4gIgogICAgICAgIC4gIkNvbnRlbnRJRD1cUSRQYXJhbXtBdHRhY2htZW50fS0+e0NvbnRlbnRJRH1cRSI7CgogICAgIyBwaWN0dXJlIFVSTCBpbiBGQVEgYXR0YWNobWVudAogICAgbXkgJFJlcGxhY2UgPSAiQWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50OyIKICAgICAgICAuICJJdGVtSUQ9JFBhcmFte0l0ZW1JRH07RmlsZUlEPSRQYXJhbXtGaWxlSUR9IjsKCiAgICAjIHJld3JpdGUgcGljdHVyZSBVUkxzCiAgICBGSUVMRDoKICAgIGZvciBteSAkTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGNvbnRhaW5zIHNvbWV0aGluZwogICAgICAgIG5leHQgRklFTEQgaWYgISRGQVFEYXRheyJGaWVsZCROdW1iZXIifTsKCiAgICAgICAgIyByZW1vdmUgbmV3bGluZXMKICAgICAgICAkRkFRRGF0YXsiRmllbGQkTnVtYmVyIn0gPX4gc3sgW1xuXHJdKyB9e31neG1zOwoKICAgICAgICAjIHJlcGxhY2UgVVJMCiAgICAgICAgJEZBUURhdGF7IkZpZWxkJE51bWJlciJ9ID1+IHN7JFNlYXJjaH17JFJlcGxhY2V9eG1zOwogICAgfQoKICAgICMgdXBkYXRlIEZBUSBhcnRpY2xlIHdpdGhvdXQgd3JpdGluZyBhIGhpc3RvcnkgZW50cnkKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkZBUVVwZGF0ZSgKICAgICAgICAlRkFRRGF0YSwKICAgICAgICBIaXN0b3J5T2ZmICA9PiAxLAogICAgICAgIEFwcHJvdmFsT2ZmID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgdXBkYXRlIHdhcyBzdWNjZXNzZnVsCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB1cGRhdGUgRkFRIEl0ZW0jICckUGFyYW17SXRlbUlEfSchIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFBcnRpY2xlVGl0bGVDbGVhbigpCgpzdHJpcC9jbGVhbiB1cCBhIEZBUSBhcnRpY2xlIHRpdGxlCgogICAgbXkgJE5ld1RpdGxlID0gJEZBUU9iamVjdC0+RkFRQXJ0aWNsZVRpdGxlQ2xlYW4oCiAgICAgICAgVGl0bGUgICAgICA9PiAkT2xkVGl0bGUsCiAgICAgICAgU2l6ZSAgICAgICA9PiAkVGl0bGVTaXplVG9CZURpc3BsYXllZCAgICMgb3B0aW9uYWwsIGlmIDAgZG8gbm90IGN1dCB0aXRsZQogICAgKTsKCj1jdXQKCnN1YiBGQVFBcnRpY2xlVGl0bGVDbGVhbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaXRsZSA9ICRQYXJhbXtUaXRsZX0gfHwgJyc7CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbnMKICAgIG15ICRUaXRsZVNpemUgPSAkUGFyYW17U2l6ZX07CiAgICBpZiAoICFkZWZpbmVkICRUaXRsZVNpemUgKSB7CiAgICAgICAgJFRpdGxlU2l6ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpUaXRsZVNpemUnKSB8fCAxMDA7CiAgICB9CgogICAgIyB0cmltIHdoaXRlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kCiAgICAkVGl0bGUgPX4gcy8oXlxzK3xccyskKS8vOwoKICAgICMgcmVzaXplIHRpdGxlIGJhc2VkIG9uIGNvbmZpZwogICAgIyBkbyBub3QgY3V0IHRpdGxlLCBpZiBzaXplIHBhcmFtZXRlciB3YXMgMAogICAgaWYgKCRUaXRsZVNpemUpIHsKICAgICAgICAkVGl0bGUgPX4gcy9eKC57JFRpdGxlU2l6ZX0pLiokLyQxIFsuLi5dLzsKICAgIH0KCiAgICByZXR1cm4gJFRpdGxlOwp9Cgo9aGVhZDIgRkFRQ29udGVudFR5cGVTZXQoKQoKU2V0cyB0aGUgY29udGVudCB0eXBlIG9mIDEsIHNvbWUgb3IgYWxsIEZBUSBpdGVtcywgYnkgYSBnaXZlbiBwYXJhbWV0ZXIgb3IgZGV0ZXJtaW5lZCBieSB0aGUgRkFRIGl0ZW0gY29udGVudAoKICAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRQ29udGVudFR5cGVTZXQoCiAgICAgICAgRkFRSXRlbUlEcyAgPT4gWyAxLCAyLCAzIF0sICAgICAgICAgICAgICMgb3B0aW9uYWwsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3NvbWUgY29udGVudCB0eXBlJywgICAgICMgb3B0aW9uYWwsCiAgICApOwoKPWN1dAoKc3ViIEZBUUNvbnRlbnRUeXBlU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkUGFyYW17RkFRSXRlbUlEc30gJiYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0ZBUUl0ZW1JRHN9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIEZBUUl0ZW1JRHMgZm9ybWF0ISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRDb250ZW50VHlwZSA9ICRQYXJhbXtDb250ZW50VHlwZX0gfHwgJyc7CgogICAgIyBHZXQgZGVmYXVsdCBjb250ZW50IHR5cGUgZnJvbSB0aGUgY29uZmlnIGlmIGl0IHdhcyBub3QgZ2l2ZW4uCiAgICBpZiAoICEkQ29udGVudFR5cGUgKSB7CgogICAgICAgICRDb250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKSApIHsKICAgICAgICAgICAgJENvbnRlbnRUeXBlID0gJ3RleHQvaHRtbCc7CiAgICAgICAgfQogICAgfQoKICAgICMgU1FMIHRvIHNldCB0aGUgY29udGVudCB0eXBlIChkZWZhdWx0IG9yIGdpdmVuKS4KICAgIG15ICRTUUwgPSAnCiAgICAgICAgVVBEQVRFIGZhcV9pdGVtCiAgICAgICAgU0VUIGNvbnRlbnRfdHlwZSA9ID8nOwoKICAgICMgR2V0IEZBUSBpdGVtIElEcyBmcm9tIHRoZSBwYXJhbS4KICAgIG15IEBGQVFJdGVtSURzID0gQHsgJFBhcmFte0ZBUUl0ZW1JRHN9IC8vIFtdIH07CgogICAgIyBSZXN0cmljdCB0byBvbmx5IGdpdmVuIEZBUSBpdGVtIElEcyAoaWYgYW55KS4KICAgIGlmIChARkFRSXRlbUlEcykgewoKICAgICAgICBteSAkSURTdHJpbmcgPSBqb2luICcsJywgQEZBUUl0ZW1JRHM7CgogICAgICAgICRTUUwgLj0gIgogICAgICAgICAgICBXSEVSRSBpZCBJTiAoJElEU3RyaW5nKSI7CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBTZXQgdGhlIGNvbnRlbnQgdHlwZSBlaXRoZXIgYnkgdGhlIGdpdmVuIHBhcmFtIG9yIGFjY29yZGluZyB0byB0aGUgc3lzdGVtIHNldHRpbmdzLgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRDb250ZW50VHlwZSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIE5vIG5lZWQgdG8gZ28gZnVydGhlciBpZiBjb250ZW50IHR5cGUgd2FzIGdpdmVuIChpdCB3YXMgYWxyZWFkeSBzZXQpLgogICAgaWYgKCAkUGFyYW17Q29udGVudFR5cGV9ICkgewoKICAgICAgICAjIERlbGV0ZSBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICdGQVEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgT3RoZXJ3aXNlIGNvbnRlbnQgdHlwZSBoYXMgdG8gYmUgZGV0ZXJtaW5lZCBieSB0aGUgRkFRIGl0ZW0gY29udGVudC4KCiAgICAjIEdldCBhbGwgRkFRSURzIChpZiBubyBmYXEgaXRlbSB3YXMgZ2l2ZW4pLgogICAgaWYgKCAhQEZBUUl0ZW1JRHMgKSB7CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBTRUxFQ1QgRElTVElOQ1QoZmFxX2l0ZW0uaWQpCiAgICAgICAgICAgICAgICBGUk9NIGZhcV9pdGVtCiAgICAgICAgICAgICAgICBPUkRFUiBCWSBpZCBBU0MnLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBwdXNoIEBGQVFJdGVtSURzLCAkUm93WzBdOwogICAgICAgIH0KICAgIH0KCiAgICAjIExvb3AgdHJvdWdoIHRoZSBGQVEgaXRlbXMuCiAgICBJVEVNSUQ6CiAgICBmb3IgbXkgJEl0ZW1JRCAoQEZBUUl0ZW1JRHMpIHsKICAgICAgICBteSAkRGV0ZXJtaW5lZENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgICAgICAjIEdldCB0aGUgY29udGVudHMgb2YgZWFjaCBmaWVsZAogICAgICAgIEZJRUxEOgogICAgICAgIGZvciBteSAkRmllbGQgKHF3KEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewoKICAgICAgICAgICAgbXkgJEZpZWxkQ29udGVudCA9ICRTZWxmLT5JdGVtRmllbGRHZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgIEZpZWxkICA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRGaWVsZENvbnRlbnQ7CgogICAgICAgICAgICAjIGlmIGZpZWxkIGNvbnRlbnQgc2VhbXMgdG8gYmUgSFRNTCBzZXQgdGhlIGNvbnRlbnQgdHlwZSB0byBIVE1MCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRGaWVsZENvbnRlbnQKICAgICAgICAgICAgICAgID1+IG17KD86IDxiclxzKi8+IHwgPC9saT4gfCA8L29sPiB8IDwvdWw+IHwgPC90YWJsZT4gfCA8L3RyPiB8IDwvdGQ+IHwgPC9kaXY+IHwgPC9vPiB8IDwvaT4gfCA8L3NwYW4+IHwgPC9oXGQ+IHwgPC9wPiB8IDwvcHJlPiApfW1zeAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRGV0ZXJtaW5lZENvbnRlbnRUeXBlID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICAgICBsYXN0IEZJRUxEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0IElURU1JRCBpZiAkRGV0ZXJtaW5lZENvbnRlbnRUeXBlIGVxICRDb250ZW50VHlwZTsKCiAgICAgICAgIyBTZXQgdGhlIGNvbnRlbnQgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIGZpZWxkIGNvbnRlbnQuCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgVVBEQVRFIGZhcV9pdGVtCiAgICAgICAgICAgICAgICBTRVQgY29udGVudF90eXBlID0gPwogICAgICAgICAgICAgICAgV0hFUkUgaWQgPT8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkRGV0ZXJtaW5lZENvbnRlbnRUeXBlLAogICAgICAgICAgICAgICAgXCRJdGVtSUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIERlbGV0ZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnRkFRJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMSBERVBSRUNBVEVEIEZVTkNUSU9OUwoKPWhlYWQyIEhpc3RvcnlHZXQoKQoKRGVwcmVjYXRlZCwgdXNlIEZBUUpvdXJuYWxHZXQoKSBpbnN0ZWFkLgoKPWN1dAoKc3ViIEhpc3RvcnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPkZBUUpvdXJuYWxHZXQoJVBhcmFtKTsKfQoKPWhlYWQxIFBSSVZBVEUgRlVOQ1RJT05TCgo9aGVhZDIgX0ZBUUFwcHJvdmFsVXBkYXRlKCkKCnVwZGF0ZSB0aGUgYXBwcm92YWwgc3RhdGUgb2YgYW4gYXJ0aWNsZQoKICAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+X0ZBUUFwcHJvdmFsVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgICAgPT4gMTIzLAogICAgICAgIEFwcHJvdmVkICAgPT4gMSwgICAgIyAwfDEgKGRlZmF1bHQgMCkKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9GQVFBcHByb3ZhbFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtBcHByb3ZlZH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBBcHByb3ZlZCBwYXJhbWV0ZXIhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB1cGRhdGUgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGZhcV9pdGVtIFNFVCAnCiAgICAgICAgICAgIC4gJ2FwcHJvdmVkID0gPywgJwogICAgICAgICAgICAuICdjaGFuZ2VkID0gY3VycmVudF90aW1lc3RhbXAsICcKICAgICAgICAgICAgLiAnY2hhbmdlZF9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0FwcHJvdmVkfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBhcHByb3ZhbCBmZWF0dXJlIGlzIGFjdGl2YXRlZCBhbmQgRkFRIGFydGljbGUgaXMgbm90IGFwcHJvdmVkIHlldAogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICYmICEkUGFyYW17QXBwcm92ZWR9ICkgewoKICAgICAgICBteSAlRkFRRGF0YSA9ICRTZWxmLT5GQVFHZXQoCiAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEl0ZW1GaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQXBwcm92YWxSZXF1aXJlZCAgICAgICAgPSAxOwogICAgICAgIG15ICRBcHByb3ZhbEluY2x1ZGVJbnRlcm5hbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpBcHByb3ZhbDo6SW5jbHVkZUludGVybmFsJyk7CgogICAgICAgIGlmICggISRBcHByb3ZhbEluY2x1ZGVJbnRlcm5hbCApIHsKICAgICAgICAgICAgbXkgJUludGVybmFsU3RhdGUgPSAkU2VsZi0+U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgVHlwZXMgID0+IFsnaW50ZXJuYWwnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkSW50ZXJuYWxTdGF0ZXsgJEZBUURhdGF7U3RhdGVJRH0gfSApIHsKICAgICAgICAgICAgICAgICRBcHByb3ZhbFJlcXVpcmVkID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRBcHByb3ZhbFJlcXVpcmVkKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBuZXcgYXBwcm92YWwgdGlja2V0CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9GQVFBcHByb3ZhbFRpY2tldENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRGQVFEYXRhe0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCA9PiAkRkFRRGF0YXtMYW5ndWFnZUlEfSwKICAgICAgICAgICAgICAgIEZBUU51bWJlciAgPT4gJEZBUURhdGF7TnVtYmVyfSwKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gJEZBUURhdGF7VGl0bGV9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICA9PiAkRkFRRGF0YXtTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBjcmVhdGUgYXBwcm92YWwgdGlja2V0IScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0ZBUUFwcHJvdmFsVGlja2V0Q3JlYXRlKCkKCmNyZWF0ZXMgYW4gYXBwcm92YWwgdGlja2V0CgogICAgbXkgJFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5fRkFRQXBwcm92YWxUaWNrZXRDcmVhdGUoCiAgICAgICAgSXRlbUlEICAgICA9PiAxMjMsCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAyLAogICAgICAgIExhbmd1YWdlSUQgPT4gMSwKICAgICAgICBGQVFOdW1iZXIgID0+IDEwMjExLAogICAgICAgIFRpdGxlICAgICAgPT4gJ1NvbWUgVGl0bGUnLAogICAgICAgIFN0YXRlSUQgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9GQVFBcHByb3ZhbFRpY2tldENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBDYXRlZ29yeUlEIEZBUU51bWJlciBUaXRsZSBTdGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBzdWJqZWN0CiAgICBteSAkU3ViamVjdCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFRpY2tldFN1YmplY3QnKTsKICAgICRTdWJqZWN0ID1+IHN7IDxPVE9CT19GQVFfTlVNQkVSPiAgICAgfXskUGFyYW17RkFRTnVtYmVyfX14bXM7CiAgICAkU3ViamVjdCA9fiBzeyA8T1RPQk9fRkFRX0NBVEVHT1JZSUQ+IH17JFBhcmFte0NhdGVnb3J5SUR9fXhtczsKICAgICRTdWJqZWN0ID1+IHN7IDxPVE9CT19GQVFfSVRFTUlEPiAgICAgfXskUGFyYW17SXRlbUlEfX14bXM7CiAgICAkU3ViamVjdCA9fiBzeyA8T1RPQk9fRkFRX1RJVExFPiAgICAgIH17JFBhcmFte1RpdGxlfX14bXM7CiAgICAkU3ViamVjdCA9fiBzeyA8T1RPQk9fRkFRX1NUQVRFSUQ+ICAgIH17JFBhcmFte1N0YXRlSUR9fXhtczsKCiAgICAjIGNoZWNrIGlmIHdlIGNhbiBmaW5kIGV4aXN0aW5nIG9wZW4gYXBwcm92YWwgdGlja2V0cyBmb3IgdGhpcyBGQVEgYXJ0aWNsZQogICAgbXkgQFRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICAgPT4gJ0FSUkFZJywKICAgICAgICBUaXRsZSAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgU3RhdGVUeXBlID0+ICdPcGVuJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhbm90aGVyIGFwcHJvdmFsIHRpY2tldCBpZiB0aGVyZSBpcyBzdGlsbCBhdCBsZWFzdCBvbmUgdGlja2V0IG9wZW4KICAgICMgZm9yIHRoaXMgRkFRIGFydGljbGUKICAgIHJldHVybiAxIGlmIEBUaWNrZXRJRHM7CgogICAgIyBnZXQgdGlja2V0IHR5cGUgZnJvbSBTeXNDb25maWcKICAgIG15ICRUaWNrZXRUeXBlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsVGlja2V0VHlwZScpIHx8ICcnOwoKICAgICMgdmFsaWRhdGUgdGlja2V0IHR5cGUgaWYgYW55CiAgICBpZiAoJFRpY2tldFR5cGUpIHsKCiAgICAgICAgIyBnZXQgYSB0aWNrZXQgdHlwZSBsb29rdXAgdGFibGUKICAgICAgICBteSAlVHlwZUxpc3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KCk7CiAgICAgICAgbXkgJVR5cGVMb29rdXAgPSByZXZlcnNlICVUeXBlTGlzdDsKCiAgICAgICAgIyBzZXQgJFRpY2tldFR5cGUgdG8gZW1wdHkgaWYgVGlja2V5VHlwZSBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGxvb2t1cCB0YWJsZS4gSWYgc2V0IHRvCiAgICAgICAgIyAgICBlbXB0eSBUaWNrZXRDcmVhdGUoKSB3aWxsIHVzZSBhcyBkZWZhdWx0IFR5cGVJRCA9IDEsIG5vIG1hdHRlciBpZiBpdCBpcyB2YWxpZCBvciBub3QuCiAgICAgICAgJFRpY2tldFR5cGUgPSAkVHlwZUxvb2t1cHskVGlja2V0VHlwZX0gPyAkVGlja2V0VHlwZSA6ICcnOwogICAgfQoKICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICBUaXRsZSAgICA9PiAkU3ViamVjdCwKICAgICAgICBRdWV1ZSAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxRdWV1ZScpIHx8ICdSYXcnLAogICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgIFByaW9yaXR5ID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFRpY2tldFByaW9yaXR5JykgICAgIHx8ICczIG5vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsVGlja2V0RGVmYXVsdFN0YXRlJykgfHwgJ25ldycsCiAgICAgICAgVHlwZSAgICAgPT4gJFRpY2tldFR5cGUsCiAgICAgICAgT3duZXJJRCAgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICBpZiAoJFRpY2tldElEKSB7CgogICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgbXkgJFVzZXJOYW1lID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVN0YXRlID0gJFNlbGYtPlN0YXRlR2V0KAogICAgICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXtTdGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNhdGVnb3JpZXMgY2FuIGJlIG5lc3RlZDsgeW91IGNhbiBoYXZlIHNvbWU6Omxvbmc6OmNhdGVnb3J5LgogICAgICAgIG15IEBDYXRlZ29yeU5hbWVzOwogICAgICAgIG15ICRDYXRlZ29yeUlEID0gJFBhcmFte0NhdGVnb3J5SUR9OwogICAgICAgIENBVEVHT1JZOgogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIG15ICVDYXRlZ29yeSA9ICRTZWxmLT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDYXRlZ29yeU5hbWVzLCAkQ2F0ZWdvcnl7TmFtZX07CiAgICAgICAgICAgIGxhc3QgQ0FURUdPUlkgaWYgISRDYXRlZ29yeXtQYXJlbnRJRH07CiAgICAgICAgICAgICRDYXRlZ29yeUlEID0gJENhdGVnb3J5e1BhcmVudElEfTsKICAgICAgICB9CiAgICAgICAgbXkgJENhdGVnb3J5ID0gam9pbiggJzo6JywgcmV2ZXJzZSBAQ2F0ZWdvcnlOYW1lcyApOwoKICAgICAgICBteSAkTGFuZ3VhZ2U7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6TXVsdGlMYW5ndWFnZScpICkgewogICAgICAgICAgICAkTGFuZ3VhZ2UgPSAkU2VsZi0+TGFuZ3VhZ2VMb29rdXAoCiAgICAgICAgICAgICAgICBMYW5ndWFnZUlEID0+ICRQYXJhbXtMYW5ndWFnZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYW5ndWFnZSA9ICctJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGJvZHkgZnJvbSBjb25maWcKICAgICAgICBteSAkQm9keSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFRpY2tldEJvZHknKTsKICAgICAgICAkQm9keSA9fiBzeyA8T1RPQk9fRkFRX0NBVEVHT1JZSUQ+IH17JFBhcmFte0NhdGVnb3J5SUR9fXhtczsKICAgICAgICAkQm9keSA9fiBzeyA8T1RPQk9fRkFRX0NBVEVHT1JZPiAgIH17JENhdGVnb3J5fXhtczsKICAgICAgICAkQm9keSA9fiBzeyA8T1RPQk9fRkFRX0xBTkdVQUdFPiAgIH17JExhbmd1YWdlfXhtczsKICAgICAgICAkQm9keSA9fiBzeyA8T1RPQk9fRkFRX0lURU1JRD4gICAgIH17JFBhcmFte0l0ZW1JRH19eG1zOwogICAgICAgICRCb2R5ID1+IHN7IDxPVE9CT19GQVFfTlVNQkVSPiAgICAgfXskUGFyYW17RkFRTnVtYmVyfX14bXM7CiAgICAgICAgJEJvZHkgPX4gc3sgPE9UT0JPX0ZBUV9USVRMRT4gICAgICB9eyRQYXJhbXtUaXRsZX19eG1zOwogICAgICAgICRCb2R5ID1+IHN7IDxPVE9CT19GQVFfQVVUSE9SPiAgICAgfXskVXNlck5hbWV9eG1zOwogICAgICAgICRCb2R5ID1+IHN7IDxPVE9CT19GQVFfU1RBVEU+ICAgICAgfXskU3RhdGV7TmFtZX19eG1zOwoKICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZyb20gc3RyaW5nCiAgICAgICAgbXkgJEZyb20gPSAiXCIkVXNlcntVc2VyRnVsbG5hbWV9XCIgPCRVc2Vye1VzZXJFbWFpbH0+IjsKCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICAgICAgbXkgJEludGVybmFsQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdJbnRlcm5hbCcgKTsKCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRJbnRlcm5hbEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDAsCiAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZScpLT57SGlzdG9yeVR5cGV9CiAgICAgICAgICAgICAgICB8fCAnQWRkTm90ZScsCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ID0+CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZScpLT57SGlzdG9yeUNvbW1lbnR9CiAgICAgICAgICAgICAgICB8fCAnJSVOb3RlJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJEFydGljbGVJRDsKICAgIH0KCiAgICByZXR1cm47Cn0KCiMKIyBEZWxldGVzIGFsbCBuZWVkZWQgRkFRIGl0ZW0gY2FjaGUgZW50cmllcyBmb3IgYSBnaXZlbiBGQVEgSXRlbUlELgojCnN1YiBfRGVsZXRlRnJvbUZBUUNhY2hlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEl0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIENsZWFyIEZBUUdldCBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnRkFRJywKICAgICAgICBLZXkgID0+ICdGQVFHZXQ6Okl0ZW1JRDo6JyAuICRQYXJhbXtJdGVtSUR9IC4gJzo6SXRlbUZpZWxkczo6MScsCiAgICApOwogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnRkFRJywKICAgICAgICBLZXkgID0+ICdGQVFHZXQ6Okl0ZW1JRDo6JyAuICRQYXJhbXtJdGVtSUR9IC4gJzo6SXRlbUZpZWxkczo6MCcsCiAgICApOwoKICAgICMgQ2xlYXIgSXRlbUZlbGRHZXQgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAnSXRlbUZpZWxkR2V0OjpJdGVtSUQ6OicgLiAkUGFyYW17SXRlbUlEfSwKICAgICk7CgogICAgIyBDbGVhbnVwIGNhY2hlIGZvciB0aGUgJ0ZBUUtleXdvcmRBcnRpY2xlTGlzdCcuCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnRkFRS2V5d29yZEFydGljbGVMaXN0JywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCj1oZWFkMiBMaW5rUXVvdGVNZW50aW9uKCkKCmNyZWF0ZXMgYW4gYXBwcm92YWwgdGlja2V0CgogICAgbXkgJFN0cmluZyA9ICRGQVFPYmplY3QtPkxpbmtRdW90ZU1lbnRpb24oCiAgICAgICAgU3RyaW5nICAgICA9PiAnVGV4dCcsCiAgICApOwoKUmV0dXJuczoKCiAgICAkU3RyaW5nID0gJzxMaW5rIHF1b3RlIG1lbnRpb24+JzsKCj1jdXQKCnN1YiBMaW5rUXVvdGVNZW50aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFN0cmluZyA9ICRQYXJhbXtTdHJpbmd9IC8vICcnOwoKICAgICRTdHJpbmcgPX4gc3sKICAgICAgICAoPGFcc3sxLDEwfSkoW14+XSpjbGFzcz1cIm1lbnRpb25cIltePl0qKT4KICAgIH0KICAgIHsKICAgICAgICBteSAkU3RhcnQgPSAkMTsKICAgICAgICBteSAkVmFsdWUgPSAkMjsKICAgICAgICBpZiAoICRWYWx1ZSAhfiAvaHJlZj0vaSB8fCAkVmFsdWUgPX4gL3RhcmdldD0vaSApIHsKICAgICAgICAgICAgIiRTdGFydCRWYWx1ZT4iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIiRTdGFydCRWYWx1ZSB0YXJnZXQ9XCJfcGFyZW50XCI+IjsKICAgICAgICB9CiAgICB9ZWd4c2k7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVE9CTyBwcm9qZWN0IChMPGh0dHBzOi8vb3RvYm8ub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=</File>
        <File Location="Custom/Kernel/Modules/AgentFAQAdd.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gYTQ1MmJlNzU4NTc0MWY2NDhiYjk1YWRjYjIxYTIzNzZjMDc4OWRiMyAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50RkFRQWRkLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEZBUUFkZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBBbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0LgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIEdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlLgogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKSB8fCAnJzsKCiAgICAjIEdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuLgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAnRkFRJywKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSB7fTsKCiAgICAjIGNyZWF0ZSBkeW5hbWljIGZpZWxkIGhhc2ggYW5kIGRlZmluaXRpb24KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJER5bmFtaWNGaWVsZExpc3QgLy8gW10gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIHB1c2ggJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0tPkAqLCB7CiAgICAgICAgICAgIERGICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyID8gMSA6IDAsCiAgICAgICAgfTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyICkgewogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZENvbmZpZzsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgUGVybWlzc2lvbiBjaGVjay4KICAgIGlmICggISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gVHJhbnNsYXRhYmxlKCdZb3UgbmVlZCBydyBwZXJtaXNzaW9uIScpLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgR2V0IHBhcmFtZXRlcnMgZnJvbSB3ZWIgcmVxdWVzdC4KICAgIG15ICVHZXRQYXJhbTsKCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KFRpdGxlIENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFZhbGlkSUQgS2V5d29yZHMgQXBwcm92ZWQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgSWNvbikKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgfQoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgICMgR2V0IGNhdGVnb3JpZXMgKHdpdGggY2F0ZWdvcnkgbG9uZyBuYW1lcykgd2hlcmUgdXNlciBoYXMgcmlnaHRzLgogICAgbXkgJFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzID0gJEZBUU9iamVjdC0+R2V0VXNlckNhdGVnb3JpZXNMb25nTmFtZXMoCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBDaGVjayB0aGF0IHRoZXJlIGFyZSBjYXRlZ29yaWVzIGF2YWlsYWJsZSBmb3IgdGhpcyB1c2VyLgogICAgaWYgKAogICAgICAgICEkVXNlckNhdGVnb3JpZXNMb25nTmFtZXMKICAgICAgICB8fCByZWYgJFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzIG5lICdIQVNIJwogICAgICAgIHx8ICEleyRVc2VyQ2F0ZWdvcmllc0xvbmdOYW1lc30KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gY2F0ZWdvcmllcyBmb3VuZCB3aGVyZSB1c2VyIGhhcyByZWFkL3dyaXRlIHBlcm1pc3Npb25zIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCBkeW5hbWljIGZpZWxkIHZhbHVlcyBmb3JtIGh0dHAgcmVxdWVzdC4KICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIEV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZm9ybSB0aGUgd2ViIHJlcXVlc3QuCiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwogICAgfQoKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBnZXQgZm9ybSBpZAogICAgbXkgJEZvcm1JRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRMYXlvdXRPYmplY3QsCiAgICApOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgc2V0IGNvbnRlbnQgdHlwZQogICAgbXkgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpICkgewogICAgICAgICRDb250ZW50VHlwZSA9ICd0ZXh0L2h0bWwnOwogICAgfQoKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgU2hvdyB0aGUgRkFRIGFkZCBzY3JlZW4uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICkgewoKICAgICAgICAgICAgIyBHZXQgQXBwcm92YWwgcXVldWUgbmFtZS4KICAgICAgICAgICAgbXkgJEFwcHJvdmFsUXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgIyBDaGVjayBpZiBBcHByb3ZhbCBxdWV1ZSBleGlzdHMuCiAgICAgICAgICAgIG15ICRBcHByb3ZhbFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWUgPT4gJEFwcHJvdmFsUXVldWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNob3cgbm90aWZpY2F0aW9uIGlmIEFwcHJvdmFsIHF1ZXVlIGRvZXMgbm90IGV4aXN0cy4KICAgICAgICAgICAgaWYgKCAhJEFwcHJvdmFsUXVldWVJRCApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gIkZBUSBBcHByb3ZhbCBpcyBlbmFibGVkIGJ1dCBxdWV1ZSAnJEFwcHJvdmFsUXVldWUnIGRvZXMgbm90IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgPT4gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWRtaW5TeXN0ZW1Db25maWd1cmF0aW9uO1N1YmFjdGlvbj1WaWV3Q3VzdG9tR3JvdXA7TmFtZXM9RkFROjpBcHByb3ZhbFF1ZXVlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICA9PiAkRm9ybUlELAogICAgICAgICAgICBVc2VyQ2F0ZWdvcmllc0xvbmdOYW1lcyA9PiAkVXNlckNhdGVnb3JpZXNMb25nTmFtZXMsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCAgICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsdWVzLAoKICAgICAgICAgICAgIyBMYXN0IHZpZXdlZCBjYXRlZ29yeSBmcm9tIHNlc3Npb24gKHdyaXR0ZW4gYnkgRkFRIGV4cGxvcmVyKS4KICAgICAgICAgICAgQ2F0ZWdvcnlJRCAgPT4gJFNlbGYtPntTZXNzaW9ufXtMYXN0Vmlld2VkQ2F0ZWdvcnl9LAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFNhdmUgdGhlIEZBUS4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyBDaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbi4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhUaXRsZSBDYXRlZ29yeUlEKSkgewoKICAgICAgICAgICAgIyBJZiByZXF1aXJlZCBmaWVsZCBpcyBub3QgZ2l2ZW4sIGFkZCBzZXJ2ZXIgZXJyb3IgY2xhc3MuCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtTmFtZSAuICdTZXJ2ZXJFcnJvcicgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlNlcnZpY2UnKSApIHsKICAgICAgICAgICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICAgICAgICAgIyBnZXQgYWxsIHNlcnZpY2VzCiAgICAgICAgICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0KAogICAgICAgICAgICAgICAgS2VlcENoaWxkcmVuID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpLZWVwQ2hpbGRyZW4nKSAvLyAwLAogICAgICAgICAgICAgICAgVmFsaWQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgQFNlcnZpY2VJRHM7CiAgICAgICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSApIHsKICAgICAgICAgICAgICAgIEBTZXJ2aWNlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSAgID0gXEBTZXJ2aWNlSURzOwogICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUxpc3R9ID0gXCVTZXJ2aWNlTGlzdDsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgZHluYW1pYyBmaWVsZCB2YWxpZGF0aW9uIHJlc3VsdHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgPT4KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQuCiAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFNlbmQgc2VydmVyIGVycm9yIGlmIGFueSByZXF1aXJlZCBwYXJhbWV0ZXIgaXMgbWlzc2luZy4KICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIEdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhLgogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICkgewoKICAgICAgICAgICAgICAgIG15ICRBcHByb3ZhbFF1ZXVlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUXVldWUnKSB8fCAnJzsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIEFwcHJvdmFsIHF1ZXVlIGV4aXN0cy4KICAgICAgICAgICAgICAgIG15ICRBcHByb3ZhbFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRBcHByb3ZhbFF1ZXVlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgbm90aWZpY2F0aW9uIGlmIEFwcHJvdmFsIHF1ZXVlIGRvZXMgbm90IGV4aXN0cy4KICAgICAgICAgICAgICAgIGlmICggISRBcHByb3ZhbFF1ZXVlSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkFRIEFwcHJvdmFsIGlzIGVuYWJsZWQgYnV0IHF1ZXVlICckQXBwcm92YWxRdWV1ZScgZG9lcyBub3QgZXhpc3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgTGluayA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWRtaW5TeXN0ZW1Db25maWd1cmF0aW9uO1N1YmFjdGlvbj1WaWV3Q3VzdG9tR3JvdXA7TmFtZXM9RkFROjpBcHByb3ZhbFF1ZXVlJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgICAgIFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzID0+ICRVc2VyQ2F0ZWdvcmllc0xvbmdOYW1lcywKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzICAgICAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgPT4gJEZvcm1JRCwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiBcJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgICAgIERGRXJyb3JzICAgICA9PiBcJUR5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHQsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgPT4gJENvbnRlbnRUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBBZGQgdGhlIG5ldyBGQVEgaXRlbS4KICAgICAgICBteSAkSXRlbUlEID0gJEZBUU9iamVjdC0+RkFRQWRkKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBlcnJvciBpZiBGQVEgaXRlbSBjb3VsZCBub3QgYmUgYWRkZWQuCiAgICAgICAgaWYgKCAhJEl0ZW1JRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBhbGwgYXR0YWNobWVudHMgZnJvbSB1cGxvYWQgY2FjaGUuCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICk7CgogICAgICAgICMgV3JpdGUgYXR0YWNobWVudHMKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAjIENoZWNrIGlmIGF0dGFjaG1lbnQgaXMgYW4gaW5saW5lIGF0dGFjaG1lbnQuCiAgICAgICAgICAgIG15ICRJbmxpbmUgPSAwOwogICAgICAgICAgICBpZiAoICRBdHRhY2htZW50LT57Q29udGVudElEfSApIHsKCiAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHRoYXQgaXQgaXMgaW5saW5lLgogICAgICAgICAgICAgICAgJElubGluZSA9IDE7CgogICAgICAgICAgICAgICAgIyBSZW1lbWJlciBpZiB0aGlzIGlubGluZSBhdHRhY2htZW50IGlzIHVzZWQgaW4gYW55IEZBUSBhcnRpY2xlLgogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREZvdW5kOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgYWxsIGZpZWxkcyBmb3IgY29udGVudC1pZC4KICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICRGaWVsZCA9ICRHZXRQYXJhbXsgJ0ZpZWxkJyAuICROdW1iZXIgfTsKCiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIGVtcHR5IGZpZWxkcy4KICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGQ7CgogICAgICAgICAgICAgICAgICAgICMgU2tpcCBmaWVsZHMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgY29udGVudC1pZC4KICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCAhfiBteyAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gfXhtczsKCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJREZvdW5kID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEZJRUxEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgV2UgZG8gbm90IHdhbnQgdG8ga2VlcCB0aGlzIGF0dGFjaG1lbnQsIGJlY2F1c2UgaXQgd2FzIGRlbGV0ZWQgaW4gdGhlIHJpY2gtdGV4dCBlZGl0b3IKICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJENvbnRlbnRJREZvdW5kOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRmlsZUlEID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgICAgICBJbmxpbmUgPT4gJElubGluZSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRGaWxlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRJbmxpbmU7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH07CgogICAgICAgICAgICAjIFJld3JpdGUgdGhlIFVSTHMgb2YgdGhlIGlubGluZSBpbWFnZXMgZm9yIHRoZSB1cGxvYWRlZCBwaWN0dXJlcy4KICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFJbmxpbmVBdHRhY2htZW50VVJMVXBkYXRlKAogICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgPT4gJEZvcm1JRCwKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgIEZpbGVJRCAgICAgPT4gJEZpbGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB1cGRhdGUgdGhlIGlubGluZSBpbWFnZSBVUkxzIGZvciBGQVEgSXRlbSMgJyRJdGVtSUQnISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBhbGwgZm9ybSBkYXRhCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRGb3JtSUQgKTsKCiAgICAgICAgIyBTZXQgZHluYW1pYyBmaWVsZHMuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFJlZGlyZWN0IHRvIEZBUSB6b29tLgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gJ0FjdGlvbj1BZ2VudEZBUVpvb207SXRlbUlEPScgLiAkSXRlbUlEICk7CiAgICB9Cn0KCnN1YiBfTWFza05ldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGxpc3QgdHlwZS4KICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIEdldCB2YWxpZCBsaXN0LgogICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICBteSAlRGF0YTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgQnVpbGQgdmFsaWQgc2VsZWN0aW9uLgogICAgJERhdGF7VmFsaWRPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBTZXQgbm8gc2VydmVyIGVycm9yIGNsYXNzIGFzIGRlZmF1bHQuCiAgICAkUGFyYW17Q2F0ZWdvcnlJRFNlcnZlckVycm9yfSB8fD0gJyc7CgogICAgIyBCdWlsZCBjYXRlZ29yeSBzZWxlY3Rpb24uCiAgICAkRGF0YXtDYXRlZ29yeU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1VzZXJDYXRlZ29yaWVzTG9uZ05hbWVzfSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgJyAuICRQYXJhbXtDYXRlZ29yeUlEU2VydmVyRXJyb3J9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIFRyZWVWaWV3ICAgICA9PiAxLAogICAgKTsKCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgIG15ICVMYW5ndWFnZXMgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBHZXQgdGhlIHNlbGVjdGVkIGxhbmd1YWdlLgogICAgbXkgJFNlbGVjdGVkTGFuZ3VhZ2U7CiAgICBpZiAoICRQYXJhbXtMYW5ndWFnZUlEfSAmJiAkTGFuZ3VhZ2VzeyAkUGFyYW17TGFuZ3VhZ2VJRH0gfSApIHsKCiAgICAgICAgIyBHZXQgbGFuZ3VhZ2UgZnJvbSBnaXZlbiBMYW5ndWFnZUlELgogICAgICAgICRTZWxlY3RlZExhbmd1YWdlID0gJExhbmd1YWdlc3sgJFBhcmFte0xhbmd1YWdlSUR9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBVc2UgdGhlIHVzZXIgbGFuZ3VhZ2UsIG9yIGlmIG5vdCBmb3VuZCAnZW4nCiAgICAgICAgJFNlbGVjdGVkTGFuZ3VhZ2UgPSAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSB8fCAnZW4nOwoKICAgICAgICAjIEdldCB1c2VyIExhbmd1YWdlSUQKICAgICAgICBteSAkU2VsZWN0ZWRMYW5ndWFnZUlEID0gJEZBUU9iamVjdC0+TGFuZ3VhZ2VMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJFNlbGVjdGVkTGFuZ3VhZ2UsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBpZiBMYW5kdWFnZUlEIGRvZXMgbm90IGV4aXN0cwogICAgICAgIGlmICggISRTZWxlY3RlZExhbmd1YWdlSUQgKSB7CgogICAgICAgICAgICAjIEdldCB0aGUgbG93ZXN0IGxhbmd1YWdlSUQgZnJvbSB0aGUgRkFRIGxhbmd1YWdlcyBsaXN0CiAgICAgICAgICAgIG15IEBMYW5ndWFnZUlEcyA9IHNvcnQga2V5cyAlTGFuZ3VhZ2VzOwogICAgICAgICAgICAkU2VsZWN0ZWRMYW5ndWFnZUlEID0gJExhbmd1YWdlSURzWzBdOwoKICAgICAgICAgICAgIyBTZXQgdGhlIGxhbmd1YWdlIHdpdGggbG93ZXN0IExhbmd1YWdlSUQgYXMgc2VsZWN0ZWQgbGFuZ3VhZ2UsCiAgICAgICAgICAgICMgICBhcyB0aGlzIGlzIHRoZSBmaXJzdCBhbmQgKHdlIGFzc3VtZWQpIHRoZSBtb3N0IHVzZWQgbGFuZ3VhZ2UKICAgICAgICAgICAgJFNlbGVjdGVkTGFuZ3VhZ2UgPSAkTGFuZ3VhZ2VzeyRTZWxlY3RlZExhbmd1YWdlSUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIEJ1aWxkIHRoZSBsYW5ndWFnZSBzZWxlY3Rpb24uCiAgICAkRGF0YXtMYW5ndWFnZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlTGFuZ3VhZ2VzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0xhbmd1YWdlSUQnLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkTGFuZ3VhZ2UsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAwLAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgIG15IEBTdGF0ZVR5cGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFnZW50OjpTdGF0ZVR5cGVzJyk7CiAgICBteSAlU3RhdGVzICAgICA9ICRGQVFPYmplY3QtPlN0YXRlTGlzdCgKICAgICAgICBUeXBlcyAgPT4gQFN0YXRlVHlwZXMsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBHZXQgdGhlIHNlbGVjdGVkIHN0YXRlLgogICAgbXkgJFNlbGVjdGVkU3RhdGU7CiAgICBpZiAoICRQYXJhbXtTdGF0ZUlEfSAmJiAkU3RhdGVzeyAkUGFyYW17U3RhdGVJRH0gfSApIHsKCiAgICAgICAgIyBHZXQgc3RhdGUgZnJvbSBnaXZlbiBTdGF0ZUlELgogICAgICAgICRTZWxlY3RlZFN0YXRlID0gJFN0YXRlc3sgJFBhcmFte1N0YXRlSUR9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBHZXQgZGVmYXVsdCBzdGF0ZS4KICAgICAgICAkU2VsZWN0ZWRTdGF0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpEZWZhdWx0OjpTdGF0ZScpIHx8ICdpbnRlcm5hbCAoYWdlbnQpJzsKICAgIH0KCiAgICAjIEJ1aWxkIHRoZSBzdGF0ZSBzZWxlY3Rpb24uCiAgICAkRGF0YXtTdGF0ZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU3RhdGVzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkU3RhdGUsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgU2hvdyBhdHRhY2htZW50cy4KICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CgogICAgICAgICMgRG8gbm90IHNob3cgaW5saW5lIGltYWdlcyBhcyBhdHRhY2htZW50cyAodGhleSBoYXZlIGEgQ29udGVudElEKS4KICAgICAgICBpZiAoICRBdHRhY2htZW50LT57Q29udGVudElEfSAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RHluYW1pY0ZpZWxkOjpNYXNrJyktPkVkaXRTZWN0aW9uUmVuZGVyKAogICAgICAgIENvbnRlbnQgICAgICAgICAgICA9PiAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSwKICAgICAgICBEeW5hbWljRmllbGRzICAgICAgPT4gJFNlbGYtPntEeW5hbWljRmllbGR9LAogICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzID0+ICRQYXJhbXtEeW5hbWljRmllbGR9LAogICAgICAgIEVycm9ycyAgICAgICAgICAgICA9PiAkUGFyYW17REZFcnJvcnN9LAogICAgICAgIE9iamVjdCAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGR9LT4lKiwKICAgICAgICB9LAogICAgICAgIEFKQVhVcGRhdGUgPT4gMCwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRkFRQWRkJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlRGF0YSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgc2VydmljZXMKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHNlcnZpY2VzCiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIEtlZXBDaGlsZHJlbiA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZTo6S2VlcENoaWxkcmVuJykgLy8gMCwKICAgICAgICAgICAgVmFsaWQgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAgICAgbXkgQFNlcnZpY2VJRHM7CiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAnU2VydmljZUlEJyApICkgewogICAgICAgICAgICBAU2VydmljZUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdTZXJ2aWNlSUQnICk7CiAgICAgICAgfQoKICAgICAgICAjIEJ1aWxkIHRoZSBzdGF0ZSBzZWxlY3Rpb24uCiAgICAgICAgbXkgJFNlcnZpY2VIVE1MID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlU2VydmljZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMTAsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+IFxAU2VydmljZUlEcywKICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVHJlZVZpZXcgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlT3B0aW9uID0+ICRTZXJ2aWNlSFRNTCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyBsYW5ndWFnZXMgZmllbGQuCiAgICBteSAkTXVsdGlMYW5ndWFnZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpNdWx0aUxhbmd1YWdlJyk7CiAgICBpZiAoJE11bHRpTGFuZ3VhZ2UpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBHZXQgZGVmYXVsdCBsYW5ndWFnZS4KICAgICAgICBteSAkRGVmYXVsdExhbmd1YWdlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkRlZmF1bHQ6Okxhbmd1YWdlJykgfHwgJ2VuJzsKCiAgICAgICAgIyBHZXQgZGVmYXVsdCBMYW5ndWFnZUlECiAgICAgICAgbXkgJExhbmd1YWdlSUQgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkRGVmYXVsdExhbmd1YWdlLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGRlZmF1bHQgbGFuZ3VhZ2UgaWYgaXQgd2FzIGRlbGV0ZWQgb3IgZG9lcyBub3QgZXhpc3RzLgogICAgICAgIGlmICggISRMYW5ndWFnZUlEICkgewogICAgICAgICAgICBteSAkSW5zZXJ0TGFuZ3VhZ2UgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkRGVmYXVsdExhbmd1YWdlLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkSW5zZXJ0TGFuZ3VhZ2UgKSB7CgogICAgICAgICAgICAgICAgIyBSZXR1cm4gd2l0aCBlcnJvciBzY3JlZW4uCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGRlZmF1bHQgbGFuZ3VhZ2UgZm91bmQgYW5kIGNhblwndCBjcmVhdGUgYSBuZXcgb25lLicpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IGRlZmF1bHQgTGFuZ3VhZ2VJRC4KICAgICAgICAgICAgJExhbmd1YWdlSUQgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUxvb2t1cCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJERlZmF1bHRMYW5ndWFnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtMYW5ndWFnZUlEfSA9ICRMYW5ndWFnZUlEOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9MYW5ndWFnZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cgYXBwcm92YWwgZmllbGQuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFJlcXVpcmVkJykgKSB7CgogICAgICAgIG15ICRBcHByb3ZhbFJlcXVpcmVkICAgICAgICA9IDE7CiAgICAgICAgbXkgJEFwcHJvdmFsSW5jbHVkZUludGVybmFsID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsOjpJbmNsdWRlSW50ZXJuYWwnKTsKCiAgICAgICAgaWYgKCAhJEFwcHJvdmFsSW5jbHVkZUludGVybmFsICkgewogICAgICAgICAgICBteSAlSW50ZXJuYWxTdGF0ZSA9ICRGQVFPYmplY3QtPlN0YXRlTGlzdCgKICAgICAgICAgICAgICAgIFR5cGVzICA9PiBbJ2ludGVybmFsJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEludGVybmFsU3RhdGV7ICRQYXJhbXtTdGF0ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEFwcHJvdmFsUmVxdWlyZWQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJEFwcHJvdmFsUmVxdWlyZWQpIHsKCiAgICAgICAgICAgICMgQ2hlY2sgcGVybWlzc2lvbi4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEdldCB0aGUgRkFRIGFwcHJvdmFsIGdyb3VwIGZyb20gY29uZmlnLgogICAgICAgICAgICBteSAkQXBwcm92YWxHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbEdyb3VwJykgfHwgJyc7CgogICAgICAgICAgICAjIEJ1aWxkIHRoZSBhcHByb3ZhbCBzZWxlY3Rpb24gaWYgdXNlciBpcyBpbiB0aGUgYXBwcm92YWwgZ3JvdXAuCiAgICAgICAgICAgIGlmICggJEdyb3Vwc3skQXBwcm92YWxHcm91cH0gKSB7CgogICAgICAgICAgICAgICAgJERhdGF7QXBwcm92YWxPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXBwcm92ZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAwID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiBUcmFuc2xhdGFibGUoJ1llcycpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17QXBwcm92ZWR9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcHByb3ZhbCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUuCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKSB8fCAnJzsKCiAgICAjIEFkZCByaWNoIHRleHQgZWRpdG9yIEphdmFTY3JpcHQgb25seSBpZiBhY3RpdmF0ZWQgYW5kIHRoZSBicm93c2VyIGNhbiBoYW5kbGUgaXQKICAgICMgICBvdGhlcndpc2UganVzdCBhIHRleHQtYXJlYSBpcyBzaG93bgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpICkgewoKICAgICAgICAjIFVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4uCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIFNldCB1cCByaWNoIHRleHQgZWRpdG9yLgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZXQgZGVmYXVsdCBpbnRlcmZhY2Ugc2V0dGluZ3MuCiAgICBteSAkSW50ZXJmYWNlU3RhdGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyAgPT4gQFN0YXRlVHlwZXMsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBTaG93IEZBUSBDb250ZW50LgogICAgJExheW91dE9iamVjdC0+RkFRQ29udGVudFNob3coCiAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgSW50ZXJmYWNlU3RhdGVzID0+ICRJbnRlcmZhY2VTdGF0ZXMsCiAgICAgICAgRkFRRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRQWRkJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentFAQEdit.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gYTQ1MmJlNzU4NTc0MWY2NDhiYjk1YWRjYjIxYTIzNzZjMDc4OWRiMyAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50RkFRRWRpdC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRGQVFFZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QuCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgR2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUuCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIkZBUTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpIHx8ICcnOwoKICAgICMgR2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4uCiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+ICdGQVEnLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9IHt9OwoKICAgICMgY3JlYXRlIGR5bmFtaWMgZmllbGQgaGFzaCBhbmQgZGVmaW5pdGlvbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgcHVzaCAkU2VsZi0+e01hc2tEZWZpbml0aW9ufS0+QCosIHsKICAgICAgICAgICAgREYgICAgICAgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIgPyAxIDogMCwKICAgICAgICB9OwoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntNYW5kYXRvcnl9ID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBQZXJtaXNzaW9uIGNoZWNrLgogICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBuZWVkIHJ3IHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBHZXQgcGFyYW1ldGVycyBmcm9tIHdlYiByZXF1ZXN0LgogICAgbXkgJUdldFBhcmFtOwoKICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoCiAgICAgICAgcXcoSXRlbUlEIFRpdGxlIENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFZhbGlkSUQgS2V5d29yZHMgQXBwcm92ZWQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgSWNvbikKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgfQoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAjIENoZWNrIG5lZWRlZCBzdHVmZi4KICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIEl0ZW1JRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEZBUU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiAgICAjIEZBUSBTZXJ2aWNlICMgVE9ETwogICAgbXkgJUZBUURhdGEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICBJdGVtRmllbGRzICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKICAgIGlmICggISVGQVFEYXRhICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgfQoKICAgICMgQ2hlY2sgdXNlciBwZXJtaXNzaW9uLgogICAgbXkgJFBlcm1pc3Npb24gPSAkRkFRT2JqZWN0LT5DaGVja0NhdGVnb3J5VXNlclBlcm1pc3Npb24oCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkRkFRRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICBUeXBlICAgICAgID0+ICdydycsCiAgICApOwogICAgaWYgKCAhJFBlcm1pc3Npb24gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBoYXZlIG5vIHBlcm1pc3Npb24gZm9yIHRoaXMgY2F0ZWdvcnkhJyksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIEdldCBkeW5hbWljIGZpZWxkIHZhbHVlcyBmb3JtIHdlYiByZXF1ZXN0LgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBFeHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZvcm0gdGhlIHdlYiByZXF1ZXN0LgogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgIG15ICRGb3JtSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+UHJlcGFyZUZvcm1JRCgKICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgKTsKCiAgICAjIEdldCBzY3JlZW4gdHlwZS4KICAgIG15ICRTY3JlZW5UeXBlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NjcmVlblR5cGUnICkgfHwgJyc7CgogICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzaG93IHRoZSBGQVEgZWRpdCBzY3JlZW4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgbXkgJE91dHB1dDsKCiAgICAgICAgIyBTaG93IGEgcG9wLXVwIHNjcmVlbi4KICAgICAgICBpZiAoICRTY3JlZW5UeXBlIGVxICdQb3B1cCcgKSB7CgogICAgICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGFydFNtYWxsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2hvdyBhIG5vcm1hbCB3aW5kb3cuCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGFydE5vcm1hbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBhbGwgZXhpc3RpbmcgYXR0YWNobWVudHMgKHdpdGhvdXQgaW5saW5lIGF0dGFjaG1lbnRzKS4KICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgU2hvd0lubGluZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIENvcHkgYWxsIGV4aXN0aW5nIGF0dGFjaG1lbnRzIHRvIHVwbG9hZCBjYWNoZS4KICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBFeGlzdGluZ0F0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAjIEdldCB0aGUgZXhpc3RpbmcgYXR0YWNobWVudCBkYXRhLgogICAgICAgICAgICBteSAlRmlsZSA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJEF0dGFjaG1lbnQtPntGaWxlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IGNvbnRlbnQgZGlzcG9zaXRpb24gKGlmIGl0cyBhbiBpbmxpbmUgYXR0YWNobWVudCkuCiAgICAgICAgICAgIG15ICREaXNwb3NpdGlvbiA9ICRBdHRhY2htZW50LT57SW5saW5lfSA/ICdpbmxpbmUnIDogJyc7CgogICAgICAgICAgICAjIEFkZCBhdHRhY2htZW50cyB0byB0aGUgdXBsb2FkIGNhY2hlLgogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkRm9ybUlELAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGV7RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEZpbGV7Q29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkRmlsZXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAkRGlzcG9zaXRpb24sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhIGZyb20gdXBsb2FkIGNhY2hlLgogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJEZvcm1JRCwKICAgICAgICApOwoKICAgICAgICAjIFJld3JpdGUgb2xkIHN0eWxlIGlubGluZSBpbWFnZSBVUkxzLgogICAgICAgIEZJRUxEOgogICAgICAgIGZvciBteSAkRmllbGQgKHF3KEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewoKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEZBUURhdGF7JEZpZWxkfTsKCiAgICAgICAgICAgICMgUmV3cml0ZSBoYW5kbGUgYW5kIGFjdGlvbiwgdGFrZSBjYXJlIG9mIG9sZCBzdHlsZSBiZWZvcmUgRkFRIDIuMC54LgogICAgICAgICAgICAkRkFRRGF0YXskRmllbGR9ID1+IHN7CiAgICAgICAgICAgICAgICBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgICAgICB9e0FjdGlvbj1BZ2VudEZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDt9Z3htczsKICAgICAgICB9CgogICAgICAgICMgc2VwYXJhdGUgZHluYW1pYyBmaWVsZCBkYXRhIHRvIHBhc3MgdG8gbWFzayByb3V0aW5lCiAgICAgICAgbXkgJUZBUURhdGFEeW5hbWljRmllbGRWYWx1ZXMgPSBtYXAgeyAkRkFRRGF0YXsiRHluYW1pY0ZpZWxkXyRfIn0gPyAoICJEeW5hbWljRmllbGRfJF8iID0+ICRGQVFEYXRheyJEeW5hbWljRmllbGRfJF8ifSApIDogKCkgfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUmVxdWlyZWQnKSApIHsKCiAgICAgICAgICAgIG15ICRBcHByb3ZhbFF1ZXVlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUXVldWUnKSB8fCAnJzsKCiAgICAgICAgICAgICMgQ2hlY2sgaWYgQXBwcm92YWwgcXVldWUgZXhpc3RzLgogICAgICAgICAgICBteSAkQXBwcm92YWxRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRBcHByb3ZhbFF1ZXVlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTaG93IG5vdGlmaWNhdGlvbiBpZiBBcHByb3ZhbCBxdWV1ZSBkb2VzIG5vdCBleGlzdHMuCiAgICAgICAgICAgIGlmICggISRBcHByb3ZhbFF1ZXVlSUQgKSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+ICJGQVEgQXBwcm92YWwgaXMgZW5hYmxlZCBidXQgcXVldWUgJyRBcHByb3ZhbFF1ZXVlJyBkb2VzIG5vdCBleGlzdHMiLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFkbWluU3lzdGVtQ29uZmlndXJhdGlvbjtTdWJhY3Rpb249Vmlld0N1c3RvbUdyb3VwO05hbWVzPUZBUTo6QXBwcm92YWxRdWV1ZScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgIEF0dGFjaG1lbnRzICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBTY3JlZW5UeXBlICAgPT4gJFNjcmVlblR5cGUsCiAgICAgICAgICAgIEZvcm1JRCAgICAgICA9PiAkRm9ybUlELAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gXCVGQVFEYXRhRHluYW1pY0ZpZWxkVmFsdWVzLAogICAgICAgICk7CgogICAgICAgIGlmICggJFNjcmVlblR5cGUgZXEgJ1BvcHVwJyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFbmRTbWFsbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VuZE5vcm1hbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBTYXZlIHRoZSBGQVEKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyBDaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbi4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRPdXRwdXQ7CgogICAgICAgICMgU2hvdyBhIHBvcC11cCBzY3JlZW4uCiAgICAgICAgaWYgKCAkU2NyZWVuVHlwZSBlcSAnUG9wdXAnICkgewogICAgICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGFydFNtYWxsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2hvdyBhIG5vcm1hbCB3aW5kb3cuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhcnROb3JtYWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhUaXRsZSBDYXRlZ29yeUlEKSkgewoKICAgICAgICAgICAgIyBJZiByZXF1aXJlZCBmaWVsZCBpcyBub3QgZ2l2ZW4sIGFkZCBzZXJ2ZXIgZXJyb3IgY2xhc3MuCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtTmFtZSAuICdTZXJ2ZXJFcnJvcicgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgIyBDaGVjayBpZiBhbiBhdHRhY2htZW50IG11c3QgYmUgZGVsZXRlZC4KICAgICAgICAjIG15IEBBdHRhY2htZW50SURzID0gbWFwIHsKICAgICAgICAjICAgICBteSAoJElEKSA9ICRfID1+IG17IFxBIEF0dGFjaG1lbnREZWxldGUgKFxkKykgXHogfXhtczsKICAgICAgICAjICAgICAkSUQgPyAkSUQgOiAoKTsKICAgICAgICAjIH0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgICAgICMgQ09VTlQ6CiAgICAgICAgIyBmb3IgbXkgJENvdW50ICggcmV2ZXJzZSBzb3J0IEBBdHRhY2htZW50SURzICkgewoKICAgICAgICAjICAgICAjIGNoZWNrIGlmIHRoZSBkZWxldGUgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGlzIGF0dGFjaG1lbnQKICAgICAgICAjICAgICBteSAkRGVsZXRlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkF0dGFjaG1lbnREZWxldGUkQ291bnQiICk7CgogICAgICAgICMgICAgICMgY2hlY2sgbmV4dCBhdHRhY2htZW50IGlmIGl0IHdhcyBub3QgcHJlc3NlZAogICAgICAgICMgICAgIG5leHQgQ09VTlQgaWYgISREZWxldGU7CgogICAgICAgICMgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBuZWVkIHRvIHNob3cgdGhlIHBhZ2UgYWdhaW4KICAgICAgICAjICAgICAkRXJyb3J7QXR0YWNobWVudH0gPSAxOwoKICAgICAgICAjICAgICAjIHJlbW92ZSB0aGUgYXR0YWNobWVudCBmcm9tIHRoZSB1cGxvYWQgY2FjaGUKICAgICAgICAjICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgIyAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICMgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICMgICAgICk7CiAgICAgICAgIyB9CgogICAgICAgICMgIyBjaGVjayBpZiB0aGVyZSB3YXMgYW4gYXR0YWNobWVudCB1cGxvYWQKICAgICAgICAjIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CgogICAgICAgICMgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBuZWVkIHRvIHNob3cgdGhlIHBhZ2UgYWdhaW4KICAgICAgICAjICAgICAkRXJyb3J7QXR0YWNobWVudH0gPSAxOwoKICAgICAgICAjICAgICAjIGdldCB0aGUgdXBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICMgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICMgICAgICAgICBQYXJhbSAgPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICMgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgIyAgICAgKTsKCiAgICAgICAgIyAgICAgIyBhZGQgYXR0YWNobWVudCB0byB0aGUgdXBsb2FkIGNhY2hlCiAgICAgICAgIyAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICMgICAgICAgICBGb3JtSUQgPT4gJEZvcm1JRCwKICAgICAgICAjICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICMgICAgICk7CiAgICAgICAgIyB9CgogICAgICAgICMgc3RvcmUgZHluYW1pYyBmaWVsZCB2YWxpZGF0aW9uIHJlc3VsdHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgPT4KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQuCiAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFNlbmQgc2VydmVyIGVycm9yIGlmIGFueSByZXF1aXJlZCBwYXJhbWV0ZXIgaXMgbWlzc2luZwogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgIyBpZiB0aGVyZSB3YXMgYW4gYXR0YWNobWVudCBkZWxldGUgb3IgdXBsb2FkCiAgICAgICAgICAgICMgIyB3ZSBkbyBub3Qgd2FudCB0byBzaG93IHZhbGlkYXRpb24gZXJyb3JzIGZvciBvdGhlciBmaWVsZHMKICAgICAgICAgICAgIyBpZiAoICRFcnJvcntBdHRhY2htZW50fSApIHsKICAgICAgICAgICAgIyAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICMgfQoKICAgICAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICkgewoKICAgICAgICAgICAgICAgIG15ICRBcHByb3ZhbFF1ZXVlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUXVldWUnKSB8fCAnJzsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIEFwcHJvdmFsIHF1ZXVlIGV4aXN0cy4KICAgICAgICAgICAgICAgIG15ICRBcHByb3ZhbFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRBcHByb3ZhbFF1ZXVlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgbm90aWZpY2F0aW9uIGlmIEFwcHJvdmFsIHF1ZXVlIGRvZXMgbm90IGV4aXN0cy4KICAgICAgICAgICAgICAgIGlmICggISRBcHByb3ZhbFF1ZXVlSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkFRIEFwcHJvdmFsIGlzIGVuYWJsZWQgYnV0IHF1ZXVlICckQXBwcm92YWxRdWV1ZScgZG9lcyBub3QgZXhpc3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgTGluayA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWRtaW5TeXN0ZW1Db25maWd1cmF0aW9uO1N1YmFjdGlvbj1WaWV3Q3VzdG9tR3JvdXA7TmFtZXM9RkFROjpBcHByb3ZhbFF1ZXVlJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICBTY3JlZW5UeXBlICAgPT4gJFNjcmVlblR5cGUsCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgPT4gJEZvcm1JRCwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiBcJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgICAgIERGRXJyb3JzICAgICA9PiBcJUR5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRTY3JlZW5UeXBlIGVxICdQb3B1cCcgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdFbmRTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRW5kTm9ybWFsJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBTZXQgdGhlIGNvbnRlbnQgdHlwZS4KICAgICAgICBteSAkQ29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpICkgewogICAgICAgICAgICAkQ29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlNlcnZpY2UnKSApIHsKICAgICAgICAgICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICAgICAgICAgIyBnZXQgYWxsIHNlcnZpY2VzCiAgICAgICAgICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0KAogICAgICAgICAgICAgICAgS2VlcENoaWxkcmVuID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpLZWVwQ2hpbGRyZW4nKSAvLyAwLAogICAgICAgICAgICAgICAgVmFsaWQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBTZXJ2aWNlSURzOwogICAgICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgKSB7CiAgICAgICAgICAgICAgICBAU2VydmljZUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdTZXJ2aWNlSUQnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gICA9IFxAU2VydmljZUlEczsKICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VMaXN0fSA9IFwlU2VydmljZUxpc3Q7CiAgICAgICAgfQoKICAgICAgICAjIFVwZGF0ZSB0aGUgbmV3IEZBUSBpdGVtLgogICAgICAgIG15ICRVcGRhdGVTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRVXBkYXRlKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBlcnJvciBpZiBGQVEgaXRlbSBjb3VsZCBub3QgYmUgdXBkYXRlZC4KICAgICAgICBpZiAoICEkVXBkYXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBhbGwgYXR0YWNobWVudHMgZnJvbSB1cGxvYWQgY2FjaGUuCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFsbCBleGlzdGluZyBhdHRhY2htZW50cy4KICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgU2hvd0lubGluZSA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIExvb2t1cCBvbGQgaW5saW5lIGF0dGFjaG1lbnRzIChpbml0aWFsbHkgbG9hZGVkIHRvIEFnZW50RkFRRWRpdC5wbSBzY3JlZW4pCiAgICAgICAgIyBhbmQgcHVzaCB0byBBdHRhY2htZW50cyBhcnJheSBpZiB0aGV5IHN0aWxsIGV4aXN0IGluIHRoZSBmb3JtLgogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChARXhpc3RpbmdBdHRhY2htZW50cykgewoKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkQXR0YWNobWVudC0+e0lubGluZX07CgogICAgICAgICAgICBOVU1CRVI6CiAgICAgICAgICAgIGZvciBteSAkTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRkFRRGF0YXsgJ0ZpZWxkJyAuICROdW1iZXIgfQogICAgICAgICAgICAgICAgICAgID1+IG17IEFjdGlvbj1BZ2VudEZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtJdGVtSUQ9JEdldFBhcmFte0l0ZW1JRH07RmlsZUlEPSRBdHRhY2htZW50LT57RmlsZUlEfSB9bXN4CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIEdldCB0aGUgZXhpc3RpbmcgaW5saW5lIGF0dGFjaG1lbnQgZGF0YS4KICAgICAgICAgICAgICAgICAgICBteSAlRmlsZSA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRBdHRhY2htZW50LT57RmlsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgewogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsZXtDb250ZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJEZpbGV7Q29udGVudFR5cGV9LAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzaXplICAgID0+ICRGaWxle0ZpbGVzaXplfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCAgICAgID0+ICRBdHRhY2htZW50LT57RmlsZUlEfSwKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBsYXN0IE5VTUJFUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBCdWlsZCBhIGxvb2t1cCBoYXNoIG9mIHRoZSBuZXcgYXR0YWNobWVudHMuCiAgICAgICAgbXkgJU5ld0F0dGFjaG1lbnQ7CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICMgVGhlIGtleSBpcyB0aGUgZmlsZW5hbWUgKyBmaWxlc2l6ZSArIGNvbnRlbnQgdHlwZS4KICAgICAgICAgICAgbXkgJEtleSA9ICRBdHRhY2htZW50LT57RmlsZW5hbWV9CiAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50LT57RmlsZXNpemV9CiAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9OwoKICAgICAgICAgICAgIyBBcHBlbmQgY29udGVudCBpZCBpZiBhdmFpbGFibGUgKGZvciBuZXcgaW5saW5lIGltYWdlcykuCiAgICAgICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICkgewogICAgICAgICAgICAgICAgJEtleSAuPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU3RvcmUgYWxsIG9mIHRoZSBuZXcgYXR0YWNobWVudCBkYXRhLgogICAgICAgICAgICAkTmV3QXR0YWNobWVudHskS2V5fSA9ICRBdHRhY2htZW50OwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayB0aGUgZXhpc3RpbmcgYXR0YWNobWVudHMuCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBFeGlzdGluZ0F0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAjIFRoZSBrZXkgaXMgdGhlIGZpbGVuYW1lICsgZmlsZXNpemVyYXcgKyBjb250ZW50IHR5cGUgKG5vIGNvbnRlbnQgaWQsIGFzIGV4aXN0aW5nIGF0dGFjaG1lbnRzIGRvbid0IGhhdmUgaXQpLgogICAgICAgICAgICBteSAkS2V5ID0gJEF0dGFjaG1lbnQtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZVJhd30KICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX07CgogICAgICAgICAgICAjIEF0dGFjaG1lbnQgaXMgYWxyZWFkeSBleGlzdGluZywgd2UgY2FuIGRlbGV0ZSBpdCBmcm9tIHRoZSBuZXcgYXR0YWNobWVudCBoYXNoLgogICAgICAgICAgICBpZiAoICROZXdBdHRhY2htZW50eyRLZXl9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICROZXdBdHRhY2htZW50eyRLZXl9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEV4aXN0aW5nIGF0dGFjaG1lbnQgaXMgbm8gbG9uZ2VyIGluIG5ldyBhdHRhY2htZW50cyBoYXNoLgogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIERlbGV0ZSB0aGUgZXhpc3RpbmcgYXR0YWNobWVudC4KICAgICAgICAgICAgICAgIG15ICREZWxldGVTdWNjZXNzZnVsID0gJEZBUU9iamVjdC0+QXR0YWNobWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRBdHRhY2htZW50LT57RmlsZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISREZWxldGVTdWNjZXNzZnVsICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgV3JpdGUgdGhlIG5ldyBhdHRhY2htZW50cy4KICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoIHZhbHVlcyAlTmV3QXR0YWNobWVudCApIHsKCiAgICAgICAgICAgICMgQ2hlY2sgaWYgYXR0YWNobWVudCBpcyBhbiBpbmxpbmUgYXR0YWNobWVudC4KICAgICAgICAgICAgbXkgJElubGluZSA9IDA7CiAgICAgICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSB7CgogICAgICAgICAgICAgICAgIyBSZW1lbWJlciB0aGF0IGl0IGlzIGlubGluZS4KICAgICAgICAgICAgICAgICRJbmxpbmUgPSAxOwoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgaWYgdGhpcyBpbmxpbmUgYXR0YWNobWVudCBpcyBhbHJlYWR5IHVzZWQgaW4gYW55IEZBUSBpdGVtLgogICAgICAgICAgICAgICAgbXkgJElubGluZUF0dGFjaG1lbnRGb3VuZDsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGFsbCBmaWVsZHMgZm9yIHRoZSBpbmxpbmUgYXR0YWNobWVudC4KICAgICAgICAgICAgICAgIE5VTUJFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAgICAgICAgICAgICAjIEdldCBGQVEgZmllbGQuCiAgICAgICAgICAgICAgICAgICAgbXkgJEZpZWxkID0gJEdldFBhcmFteyAnRmllbGQnIC4gJE51bWJlciB9OwoKICAgICAgICAgICAgICAgICAgICAjIFNraXAgZW1wdHkgZmllbGRzLgogICAgICAgICAgICAgICAgICAgIG5leHQgTlVNQkVSIGlmICEkRmllbGQ7CgogICAgICAgICAgICAgICAgICAgICMgU2tpcCBpZiB0aGUgZmllbGQgaXMgbm90IG5ldyAoYWRkZWQpIG9yIG9sZCAoaW5pdGlhbGx5IGxvYWRlZCkgaW5saW5lIGF0dGFjaG1lbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGQgIX4gbXsgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9IH14bXMKICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICF+IG17IEFjdGlvbj1BZ2VudEZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtJdGVtSUQ9JEdldFBhcmFte0l0ZW1JRH07RmlsZUlEPSRBdHRhY2htZW50LT57RmlsZUlEfSB9eG1zCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgTlVNQkVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCB0aGUgaW5saW5lIGF0dGFjaG1lbnQuCiAgICAgICAgICAgICAgICAgICAgJElubGluZUF0dGFjaG1lbnRGb3VuZCA9IDE7CgogICAgICAgICAgICAgICAgICAgICMgV2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIuCiAgICAgICAgICAgICAgICAgICAgbGFzdCBOVU1CRVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBXZSBkbyBub3Qgd2FudCB0byBrZWVwIHRoaXMgYXR0YWNobWVudCwgYmVjYXVzZSBpdCB3YXMgZGVsZXRlZCBpbiB0aGUgcmljaC10ZXh0IGVkaXRvci4KICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJElubGluZUF0dGFjaG1lbnRGb3VuZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBBZGQgYXR0YWNobWVudC4KICAgICAgICAgICAgbXkgJEZpbGVJRCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRBZGQoCiAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIElubGluZSA9PiAkSW5saW5lLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEZpbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJElubGluZTsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fTsKCiAgICAgICAgICAgICMgUmV3cml0ZSB0aGUgVVJMcyBvZiB0aGUgaW5saW5lIGltYWdlcyBmb3IgdGhlIHVwbG9hZGVkIHBpY3R1cmVzLgogICAgICAgICAgICBteSAkT0sgPSAkRkFRT2JqZWN0LT5GQVFJbmxpbmVBdHRhY2htZW50VVJMVXBkYXRlKAogICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgPT4gJEZvcm1JRCwKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBGaWxlSUQgICAgID0+ICRGaWxlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHVwZGF0ZSB0aGUgaW5saW5lIGltYWdlIFVSTHMgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJmb3IgRkFRIEl0ZW0jICckR2V0UGFyYW17SXRlbUlEfSchIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIGFsbCBmb3JtIGRhdGEKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJEZvcm1JRCApOwoKICAgICAgICAjIFNldCBkeW5hbWljIGZpZWxkcy4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBTZXQgdGhlIHZhbHVlLgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgaWYgdGhlcmUgaWYgd2UgbmVlZCB0byBjbG9zZSBhIHBvcC11cCBzY3JlZW4gb3Igbm90LgogICAgICAgIGlmICggJFNjcmVlblR5cGUgZXEgJ1BvcHVwJyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudEZBUVpvb207SXRlbUlEPSRHZXRQYXJhbXtJdGVtSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRGQVFab29tO0l0ZW1JRD0kR2V0UGFyYW17SXRlbUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CgpzdWIgX01hc2tOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIEdldCBsaXN0IHR5cGUuCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICBteSAlRGF0YTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgQnVpbGQgdmFsaWQgc2VsZWN0aW9uLgogICAgJERhdGF7VmFsaWRPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgbXkgJEZBUU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiAgICAjIEdldCBjYXRlZ29yaWVzICh3aXRoIGNhdGVnb3J5IGxvbmcgbmFtZXMpIHdoZXJlIHVzZXIgaGFzIHJpZ2h0cy4KICAgIG15ICRVc2VyQ2F0ZWdvcmllc0xvbmdOYW1lcyA9ICRGQVFPYmplY3QtPkdldFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzKAogICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgU2V0IG5vIHNlcnZlciBlcnJvciBjbGFzcyBhcyBkZWZhdWx0LgogICAgJFBhcmFte0NhdGVnb3J5SURTZXJ2ZXJFcnJvcn0gfHw9ICcnOwoKICAgICMgQnVpbGQgY2F0ZWdvcnkgc2VsZWN0aW9uLgogICAgJERhdGF7Q2F0ZWdvcnlPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRVc2VyQ2F0ZWdvcmllc0xvbmdOYW1lcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgJyAuICRQYXJhbXtDYXRlZ29yeUlEU2VydmVyRXJyb3J9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICApOwoKICAgIG15ICVMYW5ndWFnZXMgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBHZXQgdGhlIHNlbGVjdGVkIGxhbmd1YWdlLgogICAgbXkgJFNlbGVjdGVkTGFuZ3VhZ2U7CiAgICBpZiAoICRQYXJhbXtMYW5ndWFnZUlEfSAmJiAkTGFuZ3VhZ2VzeyAkUGFyYW17TGFuZ3VhZ2VJRH0gfSApIHsKCiAgICAgICAgIyBHZXQgbGFuZ3VhZ2UgZnJvbSBnaXZlbiBMYW5ndWFnZUlECiAgICAgICAgJFNlbGVjdGVkTGFuZ3VhZ2UgPSAkTGFuZ3VhZ2VzeyAkUGFyYW17TGFuZ3VhZ2VJRH0gfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIFVzZSB0aGUgdXNlciBsYW5ndWFnZSwgb3IgaWYgbm90IGZvdW5kICdlbicuCiAgICAgICAgJFNlbGVjdGVkTGFuZ3VhZ2UgPSAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSB8fCAnZW4nOwoKICAgICAgICAjIEdldCB1c2VyIExhbmd1YWdlSUQKICAgICAgICBteSAkU2VsZWN0ZWRMYW5ndWFnZUlEID0gJEZBUU9iamVjdC0+TGFuZ3VhZ2VMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJFNlbGVjdGVkTGFuZ3VhZ2UsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBpZiBMYW5ndWFnZUlEIGRvZXMgbm90IGV4aXN0cy4KICAgICAgICBpZiAoICEkU2VsZWN0ZWRMYW5ndWFnZUlEICkgewoKICAgICAgICAgICAgIyBHZXQgdGhlIGxvd2VzdCBMYW5ndWFnZUlEIGZvcm0gdGhlIEZBUSBsYW5ndWFnZSBsaXN0IGFzIGl0cyB0aGUgZmlyc3QgYWRkZWQgYW5kCiAgICAgICAgICAgICMgICAod2UgYXNzdW1lKSB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQuCiAgICAgICAgICAgIG15IEBMYW5ndWFnZUlEcyA9IHNvcnQga2V5cyAlTGFuZ3VhZ2VzOwogICAgICAgICAgICAkU2VsZWN0ZWRMYW5ndWFnZUlEID0gJExhbmd1YWdlSURzWzBdOwoKICAgICAgICAgICAgIyBTZXQgdGhlIGxhbmd1YWdlIHdpdGggbG93ZXN0IGxhbmd1YWdlSUQgYXMgc2VsZWN0ZWQgbGFuZ3VhZ2UuCiAgICAgICAgICAgICRTZWxlY3RlZExhbmd1YWdlID0gJExhbmd1YWdlc3skU2VsZWN0ZWRMYW5ndWFnZUlEfTsKICAgICAgICB9CiAgICB9CgogICAgIyBCdWlsZCB0aGUgbGFuZ3VhZ2Ugc2VsZWN0aW9uLgogICAgJERhdGF7TGFuZ3VhZ2VPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUxhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdMYW5ndWFnZUlEJywKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZExhbmd1YWdlLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICBteSBAU3RhdGVUeXBlcyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBZ2VudDo6U3RhdGVUeXBlcycpOwogICAgbXkgJVN0YXRlcyAgICAgPSAkRkFRT2JqZWN0LT5TdGF0ZUxpc3QoCiAgICAgICAgVHlwZXMgID0+IEBTdGF0ZVR5cGVzLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgR2V0IHRoZSBzZWxlY3RlZCBzdGF0ZS4KICAgIG15ICRTZWxlY3RlZFN0YXRlOwogICAgaWYgKCAkUGFyYW17U3RhdGVJRH0gJiYgJFN0YXRlc3sgJFBhcmFte1N0YXRlSUR9IH0gKSB7CgogICAgICAgICMgR2V0IHN0YXRlIGZyb20gZ2l2ZW4gU3RhdGVJRAogICAgICAgICRTZWxlY3RlZFN0YXRlID0gJFN0YXRlc3sgJFBhcmFte1N0YXRlSUR9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBHZXQgZGVmYXVsdCBzdGF0ZS4KICAgICAgICAkU2VsZWN0ZWRTdGF0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpEZWZhdWx0OjpTdGF0ZScpIHx8ICdpbnRlcm5hbCAoYWdlbnQpJzsKICAgIH0KCiAgICAjIEJ1aWxkIHRoZSBzdGF0ZSBzZWxlY3Rpb24uCiAgICAkRGF0YXtTdGF0ZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU3RhdGVzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkU3RhdGUsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgR2V0IHNjcmVlbiB0eXBlLgogICAgbXkgJFNjcmVlblR5cGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnU2NyZWVuVHlwZScgKSB8fCAnJzsKCiAgICBteSAkRmllbGRzZXRDbGFzcyA9ICcnOwogICAgaWYgKCAkU2NyZWVuVHlwZSBlcSAnUG9wdXAnICkgewogICAgICAgICRGaWVsZHNldENsYXNzID0gJ0ZpeGVkTGFiZWwnOwogICAgfQoKICAgICMgU2hvdyBhdHRhY2htZW50cy4KICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CgogICAgICAgICMgRG8gbm90IHNob3cgaW5saW5lIGltYWdlcyBhcyBhdHRhY2htZW50cyAodGhleSBoYXZlIGEgY29udGVudCBpZCkKICAgICAgICBpZiAoICRBdHRhY2htZW50LT57Q29udGVudElEfSAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RHluYW1pY0ZpZWxkOjpNYXNrJyktPkVkaXRTZWN0aW9uUmVuZGVyKAogICAgICAgIENvbnRlbnQgICAgICAgICAgICA9PiAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSwKICAgICAgICBEeW5hbWljRmllbGRzICAgICAgPT4gJFNlbGYtPntEeW5hbWljRmllbGR9LAogICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzID0+ICRQYXJhbXtEeW5hbWljRmllbGR9LAogICAgICAgIEVycm9ycyAgICAgICAgICAgICA9PiAkUGFyYW17REZFcnJvcnN9LAogICAgICAgIE9iamVjdCAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGR9LT4lKiwKICAgICAgICB9LAogICAgICAgIEFKQVhVcGRhdGUgPT4gMCwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRkFRRWRpdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgIEZpZWxkc2V0Q2xhc3MgPT4gJEZpZWxkc2V0Q2xhc3MsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBzaG93IHNlcnZpY2VzCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpTZXJ2aWNlJykgKSB7CgogICAgICAgICMgZ2V0IGFsbCBzZXJ2aWNlcwogICAgICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBLZWVwQ2hpbGRyZW4gPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OktlZXBDaGlsZHJlbicpIC8vIDAsCiAgICAgICAgICAgIFZhbGlkICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgICAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgICAgIG15IEBTZXJ2aWNlSURzID0gJFBhcmFte1NlcnZpY2VMaXN0fSA/IGtleXMgJXsgJFBhcmFte1NlcnZpY2VMaXN0fSB9IDogKCk7CgogICAgICAgICMgQnVpbGQgdGhlIHN0YXRlIHNlbGVjdGlvbi4KICAgICAgICBteSAkU2VydmljZUhUTUwgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgICAgICBTaXplICAgICAgICA9PiAxMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gXEBTZXJ2aWNlSURzLAogICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBUcmVlVmlldyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VPcHRpb24gPT4gJFNlcnZpY2VIVE1MLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IGxhbmd1YWdlcyBmaWVsZC4KICAgIG15ICRNdWx0aUxhbmd1YWdlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Ok11bHRpTGFuZ3VhZ2UnKTsKICAgIGlmICgkTXVsdGlMYW5ndWFnZSkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYW5ndWFnZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0xhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyBhcHByb3ZhbCBmaWVsZC4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUmVxdWlyZWQnKSApIHsKCiAgICAgICAgbXkgJEFwcHJvdmFsUmVxdWlyZWQgICAgICAgID0gMTsKICAgICAgICBteSAkQXBwcm92YWxJbmNsdWRlSW50ZXJuYWwgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWw6OkluY2x1ZGVJbnRlcm5hbCcpOwoKICAgICAgICBpZiAoICEkQXBwcm92YWxJbmNsdWRlSW50ZXJuYWwgKSB7CiAgICAgICAgICAgIG15ICVJbnRlcm5hbFN0YXRlID0gJEZBUU9iamVjdC0+U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgVHlwZXMgID0+IFsnaW50ZXJuYWwnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkSW50ZXJuYWxTdGF0ZXsgJFBhcmFte1N0YXRlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkQXBwcm92YWxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkQXBwcm92YWxSZXF1aXJlZCkgewoKICAgICAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uLgogICAgICAgICAgICBteSAlR3JvdXBzID0gcmV2ZXJzZSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IHRoZSBGQVEgYXBwcm92YWwgZ3JvdXAgZnJvbSBjb25maWcuCiAgICAgICAgICAgIG15ICRBcHByb3ZhbEdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsR3JvdXAnKSB8fCAnJzsKCiAgICAgICAgICAgICMgQnVpbGQgdGhlIGFwcHJvdmFsIHNlbGVjdGlvbiBpZiB1c2VyIGlzIGluIHRoZSBhcHByb3ZhbCBncm91cC4KICAgICAgICAgICAgaWYgKCAkR3JvdXBzeyRBcHByb3ZhbEdyb3VwfSApIHsKCiAgICAgICAgICAgICAgICAkRGF0YXtBcHByb3ZhbE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcHByb3ZlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gVHJhbnNsYXRhYmxlKCdObycpLAogICAgICAgICAgICAgICAgICAgICAgICAxID0+IFRyYW5zbGF0YWJsZSgnWWVzJyksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtBcHByb3ZlZH0gfHwgMCwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FwcHJvdmFsJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZS4KICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpIHx8ICcnOwoKICAgICMgQWRkIHJpY2ggdGV4dCBlZGl0b3IgSmF2YVNjcmlwdCBvbmx5IGlmIGFjdGl2YXRlZCBhbmQgdGhlIGJyb3dzZXIgY2FuIGhhbmRsZSBpdAogICAgIyAgIG90aGVyd2lzZSBqdXN0IGEgdGV4dC1hcmVhIGlzIHNob3duCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICYmICRDb25maWdPYmplY3QtPkdldCgnRkFROjpJdGVtOjpIVE1MJykgKSB7CgogICAgICAgICMgVXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbi4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgU2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNldCBkZWZhdWx0IGludGVyZmFjZSBzZXR0aW5ncy4KICAgIG15ICRJbnRlcmZhY2VTdGF0ZXMgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiBAU3RhdGVUeXBlcywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIFNob3cgRkFRIENvbnRlbnQuCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFDb250ZW50U2hvdygKICAgICAgICBGQVFPYmplY3QgICAgICAgPT4gJEZBUU9iamVjdCwKICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICBGQVFEYXRhICAgICAgICAgPT4geyVQYXJhbX0sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAkU2NyZWVuVHlwZSBuZSAnUG9wdXAnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFbmROb3JtYWwnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkU2NyZWVuVHlwZSBlcSAnUG9wdXAnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFbmRTbWFsbCcsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRGQVFFZGl0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentFAQZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50RkFRWm9vbS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRGQVFab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKdXNlIE1JTUU6OkJhc2U2NCBxdyhkZWNvZGVfYmFzZTY0IGVuY29kZV9iYXNlNjQpOwoKIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdC4KICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3tVc2VyQWdlbnREb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIFBlcm1pc3Npb24gY2hlY2suCiAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1JvfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IG5lZWQgcm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBteSAkSXNBbGxvd2VkID0gMDsKICAgICRTZWxmLT57VXNlckxhbmd1YWdlfSA9ICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9IHx8ICdlbic7CgogICAgIyBHZXQgcGFyYW1ldGVycyBmcm9tIHdlYiByZXF1ZXN0LgogICAgbXkgJUdldFBhcmFtOwogICAgJEdldFBhcmFte0l0ZW1JRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXRlbUlEJyApOwogICAgJEdldFBhcmFte1JhdGV9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUmF0ZScgKTsKCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAjR2V0IGRlZmF1bHQgSXRlbUlEIGlmIGl0J3MgZGVmaW5lZAogICAgbXkgJElzRGVmYXVsdEFydGljbGUgID0gMDsKICAgIG15ICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDA7CiAgICBteSAlRGF0YSAgICAgICAgICAgICAgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FnZW50RkFRU2lkZUJhcjo6QXJ0aWNsZXMnKSB9OwoKICAgIENPTkZJRzoKICAgIGZvciBteSAkQ29uZmlnICgga2V5cyAlRGF0YSApIHsKICAgICAgICBuZXh0IENPTkZJRyBpZiAkRGF0YXskQ29uZmlnfS0+e0xhbmd1YWdlfSBuZSAkU2VsZi0+e1VzZXJMYW5ndWFnZX07CgogICAgICAgIGlmICggJERhdGF7JENvbmZpZ30tPntEZWZhdWx0SXRlbUlEfSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0l0ZW1JRH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17SXRlbUlEfSA9ICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH07CiAgICAgICAgICAgICAgICAkSXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEhhc0RlZmF1bHRBcnRpY2xlID0gMTsKICAgICAgICAgICAgbGFzdCBDT05GSUc7CiAgICAgICAgfQogICAgfQoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAjIEdldCBuYXZpZ2F0aW9uIGJhciBvcHRpb24uCiAgICBteSAkTmF2ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hdicgKSB8fCAnJzsKCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAjIFNob3cgbWVzc2FnZSBhbmQgbGluayB0byBGQVEgRXhwbG9yZXIgaWYgbm8gZGVmYXVsdCBpdGVtIGlzIHNldCBhbmQgbm8gSXRlbUlEIHByb3ZpZGVkCiAgICBteSAkT3V0cHV0OwoKICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFBhcmFte0Nzc0NsYXNzTm9BcnRpY2xlfSA9ICdIaWRkZW4nOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EZWZhdWx0SXRlbScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRGQVFab29tJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE91dHB1dCAuICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgfQoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgIG15ICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CiAgICBpZiAoICElRkFRRGF0YSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgIH0KCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAkRkFRRGF0YXtJY29ufSA9ICRGQVFEYXRhe0ljb259ID8gZGVjb2RlX2Jhc2U2NCggJEZBUURhdGF7SWNvbn0gKSA6ICcnOwoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAjIENoZWNrIHVzZXIgcGVybWlzc2lvbi4KICAgIG15ICRQZXJtaXNzaW9uID0gJEZBUU9iamVjdC0+Q2hlY2tDYXRlZ29yeVVzZXJQZXJtaXNzaW9uKAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIENhdGVnb3J5SUQgPT4gJEZBUURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgVHlwZSAgICAgICA9PiAncm8nLAogICAgKTsKICAgIGlmICggISRQZXJtaXNzaW9uICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gVHJhbnNsYXRhYmxlKCdZb3UgaGF2ZSBubyBwZXJtaXNzaW9uIGZvciB0aGlzIGNhdGVnb3J5IScpLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkSXNBbGxvd2VkID0gMTsKICAgIH0KCiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEhUTUxWaWV3IFN1YmFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdIVE1MVmlldycgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRGaWVsZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaWVsZCIgKTsKCiAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KCBJdGVtSUQgRmllbGQgKSkgewogICAgICAgICAgICBpZiAoICEkTmVlZGVkICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZGVkIFBhcmFtOiAkTmVlZGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgRmllbGQgY29udGVudAogICAgICAgIG15ICRGaWVsZENvbnRlbnQgPSAkRkFRT2JqZWN0LT5JdGVtRmllbGRHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgRmllbGQgID0+ICRGaWVsZCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIFJld3JpdGUgaGFuZGxlIGFuZCBhY3Rpb24sIHRha2UgY2FyZSBvZiBvbGQgc3R5bGUgYmVmb3JlIEZBUSAyLjAueC4KICAgICAgICAkRmllbGRDb250ZW50ID1+IHN7CiAgICAgICAgICAgIEFjdGlvbj1BZ2VudEZBUSBbJl0oYW1wOyk/IFN1YmFjdGlvbj1Eb3dubG9hZCBbJl0oYW1wOyk/CiAgICAgICAgfXtBY3Rpb249QWdlbnRGQVFab29tO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7fWd4bXM7CgogICAgICAgICMgYnVpbGQgYmFzZSBVUkwgZm9yIGlubGluZSBpbWFnZXMKICAgICAgICBteSAkU2Vzc2lvbklEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e1Nlc3Npb25JRH0gJiYgISRTZWxmLT57U2Vzc2lvbklEQ29va2llfSApIHsKICAgICAgICAgICAgJFNlc3Npb25JRCA9ICc7JyAuICRTZWxmLT57U2Vzc2lvbk5hbWV9IC4gJz0nIC4gJFNlbGYtPntTZXNzaW9uSUR9OwogICAgICAgICAgICAkRmllbGRDb250ZW50ID1+IHN7CiAgICAgICAgICAgICAgICAoQWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0l0ZW1JRD1cZCs7RmlsZUlEPVxkKykKICAgICAgICAgICAgfXskMSRTZXNzaW9uSUR9Z21zeDsKICAgICAgICB9CgogICAgICAgICMgQ29udmVydCBjb250ZW50IHRvIEhUTUwgaWYgbmVlZGVkLgogICAgICAgIGlmICgKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAkRkFRRGF0YXtDb250ZW50VHlwZX0gbmUgJ3RleHQvaHRtbCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBEZXRlY3QgYWxsIHBsYWluIHRleHQgbGlua3MgYW5kIHB1dCB0aGVtIGludG8gYW4gSFRNTCA8YT4gdGFnLgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICk7CgogICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAjIHNldCB0YXJnZXQ9Il9wYXJlbnQiIGZvciBsaW5rcyB0byBvdGhlciBhcnRpY2xlcyB2aWEgbWVudGlvbgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkRkFRT2JqZWN0LT5MaW5rUXVvdGVNZW50aW9uKAogICAgICAgICAgICBTdHJpbmcgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwoKICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgICAgICMgU2V0IHRhcmdldD0iX2JsYW5rIiBhdHRyaWJ1dGUgdG8gYWxsIEhUTUwgPGE+IHRhZ3MgdGhlIExpbmtRdW90ZSBmdW5jdGlvbiBuZWVkcyB0byBiZQogICAgICAgICMgICBjYWxsZWQgYWdhaW4KICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICAgICAgVGFyZ2V0QWRkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgbmVlZGVkIEhUTUwgaGVhZGVycwogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgICAgIENoYXJzZXQgPT4gJ3V0Zi04JywKICAgICAgICApOwoKICAgICAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICAkRmllbGRDb250ZW50ID1+IHN7KDxoKFsxLTZdKT4uKj88L2hcMj4pfXsgJENvdW50Kys7ICI8YSBpZD1cIiRGaWVsZC0kQ291bnRcIj4mbmJzcDs8L2E+JDEifWdlOwoKICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgICAgICMgcmV0dXJuIGNvbXBsZXRlIEhUTUwgYXMgYW4gYXR0YWNobWVudAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBEb3dubG9hZEF0dGFjaG1lbnQgU3ViLWFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZEF0dGFjaG1lbnQnICkgewoKICAgICAgICAkR2V0UGFyYW17RmlsZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWxlSUQnICk7CgogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ZpbGVJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgRmlsZUlEIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgYXR0YWNobWVudHMuCiAgICAgICAgbXkgJUZpbGUgPSAkRkFRT2JqZWN0LT5BdHRhY2htZW50R2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEZpbGVJRCA9PiAkR2V0UGFyYW17RmlsZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICglRmlsZSkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCglRmlsZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgKCRHZXRQYXJhbXtGaWxlSUR9KSEgTWF5IGJlIGFuIGF0dGFjayEhISIsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgT3RoZXIgc3ViLWFjdGlvbnMgY29udGludWVzIGhlcmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVmFsdWUgPT4gJEZBUURhdGF7VGl0bGV9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICB9CgogICAgIyBEZWZpbmUgZGlmZmVyZW50IG5vdGlmaWNhdGlvbnMuCiAgICBteSAlTm90aWZpY2F0aW9ucyA9ICgKICAgICAgICBUaGFua3MgPT4gewogICAgICAgICAgICBQcmlvcml0eSA9PiAnSW5mbycsCiAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgnVGhhbmtzIGZvciB5b3VyIHZvdGUhJyksCiAgICAgICAgfSwKICAgICAgICBBbHJlYWR5Vm90ZWQgPT4gewogICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICBJbmZvICAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBoYXZlIGFscmVhZHkgdm90ZWQhJyksCiAgICAgICAgfSwKICAgICAgICBOb1JhdGUgPT4gewogICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICBJbmZvICAgICA9PiBUcmFuc2xhdGFibGUoJ05vIHJhdGUgc2VsZWN0ZWQhJyksCiAgICAgICAgfSwKICAgICk7CgogICAgIyBPdXRwdXQgbm90aWZpY2F0aW9ucyBpZiBhbnkuCiAgICBteSAkTm90aWZ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05vdGlmeScgKSB8fCAnJzsKICAgIGlmICggJE5vdGlmeSAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJE5vdGlmaWNhdGlvbnN7JE5vdGlmeX0gKSApIHsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgJXsgJE5vdGlmaWNhdGlvbnN7JE5vdGlmeX0gfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGRlZmF1bHQgb3B0aW9ucy4KICAgIG15ICRNdWx0aUxhbmd1YWdlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Ok11bHRpTGFuZ3VhZ2UnKTsKICAgIG15ICRWb3RpbmcgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlZvdGluZycpOwoKICAgICMgU2V0IGRlZmF1bHQgaW50ZXJmYWNlIHNldHRpbmdzLgogICAgbXkgJEludGVyZmFjZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ2ludGVybmFsJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICRJbnRlcmZhY2VTdGF0ZXMgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QWdlbnQ6OlN0YXRlVHlwZXMnKSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIEdldCBGQVEgdm90ZSBpbmZvcm1hdGlvbi4KICAgIG15ICRWb3RlRGF0YTsKICAgIGlmICgkVm90aW5nKSB7CiAgICAgICAgJFZvdGVEYXRhID0gJEZBUU9iamVjdC0+Vm90ZUdldCgKICAgICAgICAgICAgQ3JlYXRlQnkgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRGQVFEYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgIEludGVyZmFjZSA9PiAkSW50ZXJmYWNlLT57U3RhdGVJRH0sCiAgICAgICAgICAgIElQICAgICAgICA9PiAkUGFyYW1PYmplY3QtPlJlbW90ZUFkZHIoKSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgQ2hlY2sgaWYgdXNlciBhbHJlYWR5IHZvdGVkIHRoaXMgRkFRIGl0ZW0uCiAgICBteSAkQWxyZWFkeVZvdGVkOwogICAgaWYgKCRWb3RlRGF0YSkgewoKICAgICAgICBteSAkSXRlbUNoYW5nZWRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZBUURhdGF7Q2hhbmdlZH0gfHwgJycsCiAgICAgICAgICAgIH0KICAgICAgICApLT5Ub0Vwb2NoKCk7CgogICAgICAgIG15ICRWb3RlQ3JlYXRlZFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVm90ZURhdGEtPntDcmVhdGVkfSB8fCAnJywKICAgICAgICAgICAgfQogICAgICAgICktPlRvRXBvY2goKTsKCiAgICAgICAgaWYgKCAkSXRlbUNoYW5nZWRTeXN0ZW1UaW1lIDw9ICRWb3RlQ3JlYXRlZFN5c3RlbVRpbWUgKSB7CiAgICAgICAgICAgICRBbHJlYWR5Vm90ZWQgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBWb3RlIFN1Yi1hY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVm90ZScgKSB7CgogICAgICAgICMgVXNlciBjYW4ndCB1c2UgdGhpcyBzdWItYWN0aW9uIGlmIGlzIG5vdCBlbmFibGVkLgogICAgICAgIGlmICggISRWb3RpbmcgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGhlIHZvdGluZyBtZWNoYW5pc20gaXMgbm90IGVuYWJsZWQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFVzZXIgY2FuIHZvdGUgb25seSBvbmNlIHBlciBGQVEgcmV2aXNpb24uCiAgICAgICAgaWYgKCRBbHJlYWR5Vm90ZWQpIHsKCiAgICAgICAgICAgICMgUmVkaXJlY3QgdG8gRkFRIHpvb20uCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICdBY3Rpb249QWdlbnRGQVFab29tO0l0ZW1JRD0nCiAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17SXRlbUlEfQogICAgICAgICAgICAgICAgICAgIC4gJztOYXY9JE5hdjtOb3RpZnk9QWxyZWFkeVZvdGVkJwogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTZXQgdGhlIHZvdGUgaWYgYW55LgogICAgICAgIGVsc2lmICggZGVmaW5lZCAkR2V0UGFyYW17UmF0ZX0gKSB7CgogICAgICAgICAgICAjIEdldCByYXRlcyBjb25maWcuCiAgICAgICAgICAgIG15ICRWb3RpbmdSYXRlcyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpJdGVtOjpWb3Rpbmc6OlJhdGVzJyk7CiAgICAgICAgICAgIG15ICRSYXRlICAgICAgICA9ICRHZXRQYXJhbXtSYXRlfTsKCiAgICAgICAgICAgICMgU2VuZCBlcnJvciBpZiByYXRlIGlzIG5vdCBkZWZpbmVkIGluIGNvbmZpZy4KICAgICAgICAgICAgaWYgKCAhJFZvdGluZ1JhdGVzLT57JFJhdGV9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGhlIHZvdGUgcmF0ZSBpcyBub3QgZGVmaW5lZCEnKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgT3RoZXJ3aXNlIGFkZCB0aGUgdm90ZS4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRkFRT2JqZWN0LT5Wb3RlQWRkKAogICAgICAgICAgICAgICAgICAgIENyZWF0ZWRCeSA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIElQICAgICAgICA9PiAkUGFyYW1PYmplY3QtPlJlbW90ZUFkZHIoKSwKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJEludGVyZmFjZS0+e1N0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFJhdGUgICAgICA9PiAkR2V0UGFyYW17UmF0ZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBEbyBub3Qgc2hvdyB0aGUgdm90aW5nIGZvcm0uCiAgICAgICAgICAgICAgICAkQWxyZWFkeVZvdGVkID0gMTsKCiAgICAgICAgICAgICAgICAjIFJlZnJlc2ggRkFRIGl0ZW0gZGF0YS4KICAgICAgICAgICAgICAgICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICElRkFRRGF0YSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFJlZGlyZWN0IHRvIEZBUSB6b29tLgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIE9QID0+ICdBY3Rpb249QWdlbnRGQVFab29tO0l0ZW1JRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFte0l0ZW1JRH0KICAgICAgICAgICAgICAgICAgICAgICAgLiAnO05hdj0kTmF2O05vdGlmeT1UaGFua3MnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFVzZXIgaXMgYWJsZSB0byB2b3RlIGJ1dCBubyByYXRlIGhhcyBiZWVuIHNlbGVjdGVkLgogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBSZWRpcmVjdCB0byBGQVEgem9vbQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAnQWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9JyAuICRHZXRQYXJhbXtJdGVtSUR9IC4gJztOYXY9JE5hdjtOb3RpZnk9Tm9SYXRlJwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAjR2V0IFNpZGViYXIgaW5mbwogICAgJFBhcmFte1NpZGVCYXJ9ID0gJExheW91dE9iamVjdC0+RkFRU2lkZUJhcigKICAgICAgICBNb2RlICAgICAgICAgICAgICA9PiAnQWdlbnQnLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgSXNBbGxvd2VkICAgICAgICAgPT4gJElzQWxsb3dlZCwKICAgICAgICBJdGVtSUQgICAgICAgICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICBBY3Rpb24gICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgSXNEZWZhdWx0QXJ0aWNsZSAgPT4gJElzRGVmYXVsdEFydGljbGUsCiAgICAgICAgSGFzRGVmYXVsdEFydGljbGUgPT4gJEhhc0RlZmF1bHRBcnRpY2xlCiAgICApOwoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAjIFByZXBhcmUgZmllbGRzIGRhdGEgKFN0aWxsIG5lZWRlZCBmb3IgUGxhaW5UZXh0KS4KICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAocXcoRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYpKSB7CiAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEZBUURhdGF7JEZpZWxkfTsKCiAgICAgICAgIyBSZXdyaXRlIGhhbmRsZSBhbmQgYWN0aW9uLCB0YWtlIGNhcmUgb2Ygb2xkIHN0eWxlIGJlZm9yZSBGQVEgMi4wLnguCiAgICAgICAgJEZBUURhdGF7JEZpZWxkfSA9fiBzewogICAgICAgICAgICBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgIH17QWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O31neG1zOwoKICAgICAgICAjIE5vIHF1b3RpbmcgaWYgSFRNTCB2aWV3IGlzIGVuYWJsZWQuCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpOwoKICAgICAgICAjIEhUTUwgcXVvdGluZy4KICAgICAgICAkRkFRRGF0YXskRmllbGR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJEZBUURhdGF7JEZpZWxkfSwKICAgICAgICAgICAgVk1heCAgICAgICAgICAgPT4gNTAwMCwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAjIEdldCB1c2VyIGluZm8gKENyZWF0ZWRCeSkuCiAgICBteSAlVXNlckluZm8gPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRGQVFEYXRhe0NyZWF0ZWRCeX0KICAgICk7CiAgICAkUGFyYW17Q3JlYXRlZEJ5VXNlcn0gPSAiJFVzZXJJbmZve1VzZXJGdWxsbmFtZX0iOwoKICAgICMgR2V0IHVzZXIgaW5mbyAoQ2hhbmdlZEJ5KS4KICAgICVVc2VySW5mbyA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEZBUURhdGF7Q2hhbmdlZEJ5fQogICAgKTsKICAgICRQYXJhbXtDaGFuZ2VkQnlVc2VyfSA9ICIkVXNlckluZm97VXNlckZ1bGxuYW1lfSI7CgogICAgIyBTZXQgdm90aW5nIHJlc3VsdHMuCiAgICAkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9ID0gJExheW91dE9iamVjdC0+R2V0RkFRSXRlbVZvdGluZ1JhdGVDb2xvcigKICAgICAgICBSYXRlID0+ICRGQVFEYXRhe1ZvdGVSZXN1bHR9LAogICAgKTsKCiAgICBpZiAoICEkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9IHx8ICRGQVFEYXRhe1ZvdGVzfSBlcSAnMCcgKSB7CiAgICAgICAgJFBhcmFte1ZvdGluZ1Jlc3VsdENvbG9yfSA9ICdHcmF5JzsKICAgIH0KCiAgICBpZiAoICROYXYgbmUgJ05vbmUnICkgewoKICAgICAgICAjIFJ1biBGQVEgbWVudSBtb2R1bGVzLgogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnRkFROjpGcm9udGVuZDo6TWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJU1lbnVzICAgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIGZvciBteSAkTWVudSAoIHNvcnQga2V5cyAlTWVudXMgKSB7CgogICAgICAgICAgICAgICAgIyBMb2FkIG1vZHVsZS4KICAgICAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkRkFRRGF0YXtJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgU2V0IENTUyBjbGFzc2VzLgogICAgICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9IGVxICdQb3BVcCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTWVudXN7JE1lbnV9LT57Q2xhc3N9ID0gJ0FzUG9wdXAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ0JhY2snICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e0NsYXNzfSA9ICdIaXN0b3J5QmFjayc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkTWVudXN7JE1lbnV9LT57VGFyZ2V0fSBlcSAnQ29uZmlybWF0aW9uRGlhbG9nJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRNZW51c3skTWVudX0tPntDbGFzc30gPSAnQXNDb25maXJtYXRpb25EaWFsb2cnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBSdW4gbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZBUUl0ZW0gPT4geyVGQVFEYXRhfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciA9PiAkQ291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgICAgICAgICBNZW51SUQgID0+ICdNZW51JyAuICRNZW51LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgT3V0cHV0IGFwcHJvdmFsIHN0YXRlLgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICkgewogICAgICAgICRQYXJhbXtBcHByb3ZhbH0gPSAkRkFRRGF0YXtBcHByb3ZlZH0gPyAnWWVzJyA6ICdObyc7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ZpZXdBcHByb3ZhbCcsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoJFZvdGluZykgewoKICAgICAgICAjIE91dHB1dCB2b3RlcyBudW1iZXIgaWYgYW55LgogICAgICAgIGlmICggJEZBUURhdGF7Vm90ZXN9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZpZXdWb3RlcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE90aGVyd2lzZSBkaXNwbGF5IGEgTm8gVm90ZXMgZm91bmQgbWVzc2FnZS4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ1ZpZXdOb1ZvdGVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU2hvd0ZBUVBhdGggPSAkTGF5b3V0T2JqZWN0LT5GQVFQYXRoU2hvdygKICAgICAgICBGQVFPYmplY3QgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIENhdGVnb3J5SUQgID0+ICRGQVFEYXRhe0NhdGVnb3J5SUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBQYXRoRm9ySXRlbSA9PiAxLAogICAgICAgIE5hdiAgICAgICAgID0+ICROYXYsCiAgICApOwogICAgaWYgKCRTaG93RkFRUGF0aCkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFQYXRoSXRlbUVsZW1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICAgICAgICAgIE5hdiAgPT4gJE5hdiwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyBrZXl3b3JkcyBhcyBzZWFyY2ggbGlua3MuCiAgICBpZiAoICRGQVFEYXRhe0tleXdvcmRzfSApIHsKCiAgICAgICAgIyBSZXBsYWNlIGNvbW1hcyBhbmQgc2VtaWNvbG9ucy4KICAgICAgICAkRkFRRGF0YXtLZXl3b3Jkc30gPX4gcy8sLyAvZzsKICAgICAgICAkRkFRRGF0YXtLZXl3b3Jkc30gPX4gcy87LyAvZzsKCiAgICAgICAgbXkgQEtleXdvcmRzID0gc3BsaXQgL1xzKy8sICRGQVFEYXRhe0tleXdvcmRzfTsKICAgICAgICBmb3IgbXkgJEtleXdvcmQgKEBLZXl3b3JkcykgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0tleXdvcmRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleXdvcmQgPT4gJEtleXdvcmQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNob3cgbGFuZ3VhZ2VzLgogICAgaWYgKCRNdWx0aUxhbmd1YWdlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgT3V0cHV0IHJhdGluZyBzdGFycy4KICAgIGlmICgkVm90aW5nKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RkFRUmF0aW5nU3RhcnNTaG93KAogICAgICAgICAgICBWb3RlUmVzdWx0ID0+ICRGQVFEYXRhe1ZvdGVSZXN1bHR9LAogICAgICAgICAgICBWb3RlcyAgICAgID0+ICRGQVFEYXRhe1ZvdGVzfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkTmF2IG5lICdOb25lJyApIHsKCiAgICAgICAgIyBPdXRwdXQgZXhpc3RpbmcgYXR0YWNobWVudHMuCiAgICAgICAgbXkgQEF0dGFjaG1lbnRJbmRleCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgU2hvd0lubGluZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIE91dHB1dCBoZWFkZXIgYW5kIGFsbCBhdHRhY2htZW50cy4KICAgICAgICBpZiAoQEF0dGFjaG1lbnRJbmRleCkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRIZWFkZXInLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50SW5kZXgpIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBTaG93IG1lc3NhZ2UgYWJvdXQgbGlua3MgaW4gaWZyYW1lcywgaWYgdXNlciBkaWRuJ3QgY2xvc2UgaXQgYWxyZWFkeS4KICAgIGlmICggISRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQnJvd3NlckxpbmtNZXNzYWdlJywKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyBGQVEgQ29udGVudC4KICAgIG15ICRGQVFCb2R5ID0gJExheW91dE9iamVjdC0+RkFRQ29udGVudFNob3coCiAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgSW50ZXJmYWNlU3RhdGVzID0+ICRJbnRlcmZhY2VTdGF0ZXMsCiAgICAgICAgRkFRRGF0YSAgICAgICAgID0+IHslRkFRRGF0YX0sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBSZXR1cm5Db250ZW50ICAgPT4gMSwKCiAgICAgICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgIFpvb20gPT4gMQoKICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICApOwoKICAgICMgR2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUuCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIEdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuLgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+ICdGQVEnLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIEdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZC4KICAgICAgICBteSAkVmFsdWVTdHJnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEZBUURhdGF7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjUwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRRHluYW1pY0ZpZWxkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRRHluYW1pY0ZpZWxkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uLgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19QbGFpbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICROYXYgbmUgJ05vbmUnICkgewoKICAgICAgICAjIFNob3cgRkFRIFZvdGluZy4KICAgICAgICBpZiAoJFZvdGluZykgewoKICAgICAgICAgICAgIyBHZXQgdm90aW5nIGNvbmZpZy4KICAgICAgICAgICAgbXkgJFNob3dWb3RpbmdDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpTaG93Jyk7CiAgICAgICAgICAgIGlmICggJFNob3dWb3RpbmdDb25maWctPnsgJEludGVyZmFjZS0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBhbHJlYWR5IHZvdGVkIGFmdGVyIGxhc3QgY2hhbmdlLgogICAgICAgICAgICAgICAgaWYgKCAhJEFscmVhZHlWb3RlZCApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X0ZBUVZvdGluZyggRkFRRGF0YSA9PiB7JUZBUURhdGF9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IGxpbmtlZCBvYmplY3RzLgogICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgICAgICBLZXkgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRMaW5rVGFibGVWaWV3TW9kZSA9ICRDb25maWdPYmplY3QtPkdldCgnTGlua09iamVjdDo6Vmlld01vZGUnKTsKCiAgICAgICAgIyBDcmVhdGUgdGhlIGxpbmsgdGFibGUuCiAgICAgICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkTGF5b3V0T2JqZWN0LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgICAgICBPYmplY3QgICAgICAgICAgID0+ICdGQVEnLAogICAgICAgICAgICBLZXkgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICk7CgogICAgICAgICMgT3V0cHV0IHRoZSBsaW5rIHRhYmxlLgogICAgICAgIGlmICgkTGlua1RhYmxlU3RyZykgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZScgLiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBMb2cgYWNjZXNzIHRvIHRoaXMgRkFRIGl0ZW0uCiAgICAkRkFRT2JqZWN0LT5GQVFMb2dBZGQoCiAgICAgICAgSXRlbUlEICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgIEludGVyZmFjZSA9PiAkSW50ZXJmYWNlLT57TmFtZX0sCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBTdGFydCB0ZW1wbGF0ZSBvdXRwdXQuCiAgICBpZiAoICROYXYgJiYgJE5hdiBlcSAnTm9uZScgKSB7CgogICAgICAgICMgT25seSBjb252ZXJ0IEhUTUwgdG8gcGxhaW4gdGV4dCBpZiByaWNoIHRleHQgZWRpdG9yIGlzIG5vdCB1c2VkLgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgJEZBUURhdGF7RnVsbEJvZHl9ID0gJEZBUUJvZHk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRkFRRGF0YXtGdWxsQm9keX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRGQVFCb2R5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdGhlIHB1YmxpYyBzdGF0ZSB0eXBlLgogICAgICAgIG15ICRQdWJsaWNTdGF0ZVR5cGUgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgICAgIE5hbWUgICA9PiAncHVibGljJywKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIFJlbW92ZSBpbi1saW5lIGltYWdlIGxpbmtzIHRvIEZBUSBpbWFnZXMuCiAgICAgICAgJEZBUURhdGF7RnVsbEJvZHl9CiAgICAgICAgICAgID1+IHN7IDxpbWcgW148Pl0rIEFjdGlvbj0oQWdlbnR8Q3VzdG9tZXJ8UHVibGljKUZBUSBbXjw+XSsgPiB9e31neG1zOwoKICAgICAgICAjIEdldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIFRpY2tldCBDb21wb3NlLgogICAgICAgIG15ICRUaWNrZXRDb21wb3NlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlRpY2tldENvbXBvc2UnKTsKCiAgICAgICAgJFBhcmFte1VwZGF0ZUFydGljbGVTdWJqZWN0fSA9ICRUaWNrZXRDb21wb3NlQ29uZmlnLT57VXBkYXRlQXJ0aWNsZVN1YmplY3R9IHx8IDA7CiAgICAgICAgaWYgKCAkUGFyYW17VXBkYXRlQXJ0aWNsZVN1YmplY3R9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZUFydGljbGVTdWJqZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFNlbmQgZGF0YSB0byBKUy4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXRDb21wb3NlLlVwZGF0ZUFydGljbGVTdWJqZWN0JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1VwZGF0ZUFydGljbGVTdWJqZWN0fSwKICAgICAgICApOwoKICAgICAgICBteSAkU2hvd09yQmxvY2s7CgogICAgICAgICMgU2hvdyAiSW5zZXJ0IFRleHQiIGJ1dHRvbi4KICAgICAgICBpZiAoICRUaWNrZXRDb21wb3NlQ29uZmlnLT57U2hvd0luc2VydFRleHRCdXR0b259ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRUaWNrZXRDb21wb3NlQ29uZmlnLT57SW5zZXJ0TWV0aG9kfQogICAgICAgICAgICAgICAgJiYgJFRpY2tldENvbXBvc2VDb25maWctPntJbnNlcnRNZXRob2R9IGVxICdGdWxsJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnNlcnRGdWxsJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luc2VydFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2hvd09yQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiBGQVEgYXJ0aWNsZSBpcyBwdWJsaWMuCiAgICAgICAgaWYgKCAkRkFRRGF0YXtTdGF0ZVR5cGVJRH0gPT0gJFB1YmxpY1N0YXRlVHlwZS0+e1N0YXRlSUR9ICkgewoKICAgICAgICAgICAgbXkgJEhUVFBUeXBlID0gJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpOwogICAgICAgICAgICBteSAkRlFETiAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZRRE4nKTsKICAgICAgICAgICAgbXkgJEJhc2VsaW5rID0gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfTsKCiAgICAgICAgICAgICMgUmV3cml0ZSBoYW5kbGUuCiAgICAgICAgICAgICRCYXNlbGluawogICAgICAgICAgICAgICAgPX4gc3sgaW5kZXhbLl1wbCBbP10gfXtwdWJsaWMucGw/fWd4bXM7CgogICAgICAgICAgICAkRkFRRGF0YXtQdWJsaWNsaW5rfSA9ICRIVFRQVHlwZSAuICc6Ly8nIC4gJEZRRE4gLiAkQmFzZWxpbmsKICAgICAgICAgICAgICAgIC4gIkFjdGlvbj1QdWJsaWNGQVFab29tO0l0ZW1JRD0kRkFRRGF0YXtJdGVtSUR9IjsKCiAgICAgICAgICAgICNTc2hvdyAiSW5zZXJ0IExpbmsiIGJ1dHRvbi4KICAgICAgICAgICAgaWYgKCAkVGlja2V0Q29tcG9zZUNvbmZpZy0+e1Nob3dJbnNlcnRMaW5rQnV0dG9ufSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luc2VydExpbmsnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNob3dPckJsb2NrID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTaG93ICJJbnNlcnQgVGV4dCBhbmQgTGluayIgYnV0dG9uLgogICAgICAgICAgICBpZiAoICRUaWNrZXRDb21wb3NlQ29uZmlnLT57U2hvd0luc2VydFRleHRBbmRMaW5rQnV0dG9ufSApIHsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRUaWNrZXRDb21wb3NlQ29uZmlnLT57SW5zZXJ0TWV0aG9kfQogICAgICAgICAgICAgICAgICAgICYmICRUaWNrZXRDb21wb3NlQ29uZmlnLT57SW5zZXJ0TWV0aG9kfSBlcSAnRnVsbCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luc2VydEZ1bGxBbmRMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luc2VydFRleHRBbmRMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNob3dPckJsb2NrID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJENhbmNlbEJ1dHRvbkNsYXNzID0gJ1pvb21TbWFsbEJ1dHRvbic7CgogICAgICAgICMgU2hvdyB0aGUgIk9yIiBibG9jayBiZXR3ZWVuIHRoZSBidXR0b25zIGFuZCB0aGUgQ2FuY2VsICYgY2xvc2Ugd2luZG93IGxhYmVsLgogICAgICAgIGlmICgkU2hvd09yQmxvY2spIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTZXQgdGhlICRDYW5jZWxCdXR0b25DbGFzcyB0byAnJy4KICAgICAgICAgICAgJENhbmNlbEJ1dHRvbkNsYXNzID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIFNlbmQgZGF0YSB0byBKUy4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdBZ2VudEZBUVpvb21TbWFsbCcsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRGQVFab29tU21hbGwnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDYW5jZWxCdXR0b25DbGFzcyA9PiAkQ2FuY2VsQnV0dG9uQ2xhc3MgfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAjUmVuZGVyIFRhYmxlIG9mIENvbnRlbnRzCiAgICAgICAgJFBhcmFte1RPQ30gPSAkTGF5b3V0T2JqZWN0LT5GQVFUYWJsZU9mQ29udGVudHMoCiAgICAgICAgICAgIE1vZGUgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgRkFRRGF0YSA9PiBcJUZBUURhdGEKICAgICAgICApOwoKICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRWm9vbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkTmF2ICYmICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICB9CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfRkFRVm90aW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUZBUURhdGEgPSAleyAkUGFyYW17RkFRRGF0YX0gfTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0ZBUVZvdGluZycsCiAgICAgICAgRGF0YSA9PiB7JUZBUURhdGF9LAogICAgKTsKCiAgICAjIEdldCBWb3RpbmcgcmF0ZXMgc2V0dGluZy4KICAgIG15ICRWb3RpbmdSYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpJdGVtOjpWb3Rpbmc6OlJhdGVzJyk7CiAgICBmb3IgbXkgJFJhdGVWYWx1ZSAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICV7JFZvdGluZ1JhdGVzfSApIHsKCiAgICAgICAgIyBDcmVhdGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIG91dHB1dC4KICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgVmFsdWUgPT4gJFJhdGVWYWx1ZSwKICAgICAgICAgICAgVGl0bGUgPT4gJFZvdGluZ1JhdGVzLT57JFJhdGVWYWx1ZX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVZvdGluZ1JhdGVSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/CustomerFAQExplorer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gNWRmZjNkZmU5Y2VhN2UzM2M0NzRmZTBlM2M2MTc2MDdiMzc3MjZjMSAtIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyRkFRRXhwbG9yZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyRkFRRXhwbG9yZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgojIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCBlbmNvZGVfYmFzZTY0KTsKCiMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiRkFROjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZXQgY29uZmlnIGRhdGEKICAgIG15ICRTdGFydEhpdCAgICAgICAgPSBpbnQoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydEhpdCcgKSB8fCAxICk7CiAgICBteSAkU2VhcmNoTGltaXQgICAgID0gJENvbmZpZy0+e1NlYXJjaExpbWl0fSAgICAgfHwgMjAwOwogICAgbXkgJFNlYXJjaFBhZ2VTaG93biA9ICRDb25maWctPntTZWFyY2hQYWdlU2hvd259IHx8IDM7CiAgICBteSAkU29ydEJ5ICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRDb25maWctPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnRkFRSUQnOwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXInICkKICAgICAgICB8fCAkQ29uZmlnLT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnRG93bic7CgogICAgbXkgJENhdGVnb3J5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2F0ZWdvcnlJRCcgKSB8fCAwOwoKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgIyBjaGVjayBmb3Igbm9uIG51bWVyaWMgQ2F0ZWdvcnlJRAogICAgaWYgKCAkQ2F0ZWdvcnlJRCAhfiAvXGQrLyApIHsKICAgICAgICAkQ2F0ZWdvcnlJRCA9IDA7CiAgICB9CgogICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgYXJ0aWNsZSBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZQogICAgbXkgJEhhc0RlZmF1bHRBcnRpY2xlID0gMDsKICAgIG15ICVEYXRhICAgICAgICAgICAgICA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CgogICAgQ09ORklHOgogICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgIG5leHQgQ09ORklHIGlmICREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9IG5lICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9OwoKICAgICAgICBpZiAoICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH0gKSB7CiAgICAgICAgICAgICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIGxhc3QgQ09ORklHOwogICAgICAgIH0KICAgIH0KCiAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgIyBnZXQgY2F0ZWdvcnkgYnkgbmFtZQogICAgbXkgJENhdGVnb3J5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhdGVnb3J5JyApIHx8ICcnOwoKICAgICMgdHJ5IHRvIGdldCB0aGUgQ2F0ZWdvcnkgSUQgZnJvbSBjYXRlZ29yeSBuYW1lIGlmIG5vIENhdGVnb3J5IElECiAgICBpZiAoICRDYXRlZ29yeSAmJiAhJENhdGVnb3J5SUQgKSB7CgogICAgICAgICMgZ2V0IHRoZSBjYXRlZ29yeSB0cmVlCiAgICAgICAgbXkgJENhdGVnb3J5VHJlZSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5VHJlZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXZlcnNlIHRoZSBoYXMgZm9yIGVhc3kgbG9va3VwCiAgICAgICAgbXkgJVJldmVyc2VDYXRlZ29yeVRyZWUgPSByZXZlcnNlICV7JENhdGVnb3J5VHJlZX07CgogICAgICAgICRDYXRlZ29yeUlEID0gJFJldmVyc2VDYXRlZ29yeVRyZWV7JENhdGVnb3J5fSB8fCAwOwogICAgfQoKICAgICMgdHJ5IHRvIGdldCB0aGUgY2F0ZWdvcnkgZGF0YQogICAgbXkgJUNhdGVnb3J5RGF0YTsKICAgIGlmICgkQ2F0ZWdvcnlJRCkgewoKICAgICAgICAjIGdldCBjYXRlZ29yeSBkYXRhCiAgICAgICAgJUNhdGVnb3J5RGF0YSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5R2V0KAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISVDYXRlZ29yeURhdGEgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHVzZXIgcGVybWlzc2lvbgogICAgICAgIG15ICRQZXJtaXNzaW9uID0gJEZBUU9iamVjdC0+Q2hlY2tDYXRlZ29yeUN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgQ2F0ZWdvcnlJRCAgID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFBlcm1pc3Npb24gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc3RvcmUgdGhlIGxhc3Qgc2NyZWVuIG92ZXJ2aWV3IGluIHNlc3Npb24KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgIFZhbHVlID0+ICcnLAogICAgKTsKCiAgICAjIEFkZEpTRGF0YSBmb3IgRVMKICAgIG15ICRFU0FjdGl2ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6QWN0aXZlJyk7CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdFU0FjdGl2ZScsCiAgICAgICAgVmFsdWUgPT4gJEVTQWN0aXZlLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTmF2aWdhdGlvbkJhcigpOwoKICAgIG15ICRDYXRlZ29yeUlEc1JlZjsKICAgIG15ICVTZWFyY2g7CiAgICBteSAlRkFRU2VhcmNoOwoKICAgICMgc2hvdyBzZWFyY2ggcmVzdWx0cwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZWFyY2gnICkgewogICAgICAgIG15ICRTZWFyY2hOYW1lID0gVHJhbnNsYXRhYmxlKCJTZWFyY2giKSAuICI6IjsKICAgICAgICBmb3IgbXkgJE1vZGUgKHF3L0tleXdvcmQgV2hhdC8pIHsKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRNb2RlICk7CiAgICAgICAgICAgIGlmICgkU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoeyRNb2RlfSAgICA9ICRTdHJpbmc7CiAgICAgICAgICAgICAgICAkRkFRU2VhcmNoeyRNb2RlfSA9ICIqJFN0cmluZyoiOwogICAgICAgICAgICAgICAgbXkgJE1vZGVOYW1lID0gJE1vZGUgZXEgJ1doYXQnID8gJ0Z1bGx0ZXh0JyA6ICRNb2RlOwogICAgICAgICAgICAgICAgJFNlYXJjaE5hbWUgLj0gIiAiIC4gVHJhbnNsYXRhYmxlKCRNb2RlTmFtZSkgLiAiIFwiJFN0cmluZ1wiOyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGNhdGVnb3J5IHJvb3QgKCBkb25lIGluIExheW91dE9iamVjdCBmb3Igbm9uIHNlYXJjaGVzICkKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aENhdGVnb3J5RWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RGVmYXVsdDo6Um9vdENhdGVnb3J5TmFtZScpLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHNlYXJjaCBpbmZvcm1hdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50Tm9MaW5rJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICRTZWFyY2hOYW1lLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZGlzYWJsZSBjYXRlZ29yeSBzcGVjaWZpYyBzdHVmZgogICAgICAgICRDYXRlZ29yeUlEID0gLTE7CiAgICB9CgogICAgIyBubyBzZWFyY2ggKCBzdGFuZGFyZCBtb2RlICkKICAgIGVsc2UgewogICAgICAgICMgc2hvdyBGQVEgcGF0aAogICAgICAgICRMYXlvdXRPYmplY3QtPkZBUVBhdGhTaG93KAogICAgICAgICAgICBGQVFPYmplY3QgID0+ICRGQVFPYmplY3QsCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFsbCBkaXJlY3Qgc3ViY2F0ZWdvcmllcyBvZiB0aGUgc2VsZWN0ZWQgY2F0ZWdvcnkKICAgICAgICAkQ2F0ZWdvcnlJRHNSZWYgPSAkRkFRT2JqZWN0LT5DdXN0b21lckNhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgIE1vZGUgICAgICAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaW50ZXJmYWNlIHN0YXRlcyBsaXN0CiAgICBteSAkSW50ZXJmYWNlU3RhdGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkN1c3RvbWVyOjpTdGF0ZVR5cGVzJyksCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiB0aGVyZSBhcmUgc3ViY2F0ZWdvcmllcwogICAgaWYgKCAkQ2F0ZWdvcnlJRHNSZWYgJiYgcmVmICRDYXRlZ29yeUlEc1JlZiBlcSAnQVJSQVknICYmIEB7JENhdGVnb3J5SURzUmVmfSApIHsKCiAgICAgICAgIyBzaG93IHN1YmNhdGVnb3JpZXMgbGlzdAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdWJjYXRlZ29yaWVzJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGRhdGEgZm9yIGVhY2ggc3ViY2F0ZWdvcnkKICAgICAgICBmb3IgbXkgJFN1YkNhdGVnb3J5SUQgKCBAeyRDYXRlZ29yeUlEc1JlZn0gKSB7CgogICAgICAgICAgICBteSAlU3ViQ2F0ZWdvcnlEYXRhID0gJEZBUU9iamVjdC0+Q2F0ZWdvcnlHZXQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRTdWJDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB0aGUgbnVtYmVyIG9mIHN1YmNhdGVnb3JpZXMgb2YgdGhpcyBzdWJjYXRlZ29yeQogICAgICAgICAgICAkU3ViQ2F0ZWdvcnlEYXRhe1N1YkNhdGVnb3J5Q291bnR9ID0gJEZBUU9iamVjdC0+Q2F0ZWdvcnlDb3VudCgKICAgICAgICAgICAgICAgIFBhcmVudElEcyA9PiBbJFN1YkNhdGVnb3J5SURdLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBudW1iZXIgb2YgRkFRIGFydGljbGVzIGluIHRoaXMgY2F0ZWdvcnkKICAgICAgICAgICAgJFN1YkNhdGVnb3J5RGF0YXtBcnRpY2xlQ291bnR9ID0gJEZBUU9iamVjdC0+RkFRQ291bnQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEcyAgPT4gWyRTdWJDYXRlZ29yeUlEXSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgICA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgICAgICAgICAgT25seUFwcHJvdmVkID0+IDEsCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCB0aGUgY2F0ZWdvcnkgZGF0YQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVTdWJDYXRlZ29yeURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGludGVyZmFjZSBzZXR0aW5ncwogICAgbXkgJEludGVyZmFjZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ2V4dGVybmFsJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGluY2x1ZGUgQ2F0ZWdvcnkgaWYgbm90IGluIGJhc2UgQ2F0ZWdvcnkgKDApLCBvciBzZWFyY2ggbW9kZQogICAgaWYgKCAkQ2F0ZWdvcnlJRCA+IDAgKSB7CiAgICAgICAgJEZBUVNlYXJjaHtDYXRlZ29yeUlEc30gPSBbJENhdGVnb3J5SURdOwogICAgfQoKICAgICMgZ2V0IHRoZSBsYXRlc3QgYXJ0aWNsZXMgZm9yIHRoZSByb290IGNhdGVnb3J5IChlbHNlIGVtcHR5KQogICAgZWxzaWYgKCAhJVNlYXJjaCApIHsKICAgICAgICAkU29ydEJ5ICAgICAgPSAnQ2hhbmdlZCc7CiAgICAgICAgJE9yZGVyQnkgICAgID0gJ0Rvd24nOwogICAgICAgICRTZWFyY2hMaW1pdCA9IDEwOwogICAgfQoKICAgICMgc2VhcmNoIGFsbCBGQVEgYXJ0aWNsZXMgd2l0aGluIHRoZSBnaXZlbiBjYXRlZ29yeQogICAgbXkgQFZpZXdhYmxlSXRlbUlEcyA9ICRGQVFPYmplY3QtPkZBUVNlYXJjaCgKICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFskU29ydEJ5XSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFskT3JkZXJCeV0sCiAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAkU2VhcmNoTGltaXQsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgU3RhdGVzICAgICAgICAgICA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gJEludGVyZmFjZSwKICAgICAgICAlRkFRU2VhcmNoLAogICAgKTsKCiAgICAjIHNldCB0aGUgU29ydEJ5IENsYXNzCiAgICBteSAkU29ydENsYXNzOwoKICAgICMgdGhpcyBzZXRzIHRoZSBvcHBvc2l0ZSB0byB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIKICAgIGlmICggJE9yZGVyQnkgZXEgJ0Rvd24nICkgewogICAgICAgICRTb3J0Q2xhc3MgPSAnU29ydEFzY2VuZGluZyc7CiAgICB9CiAgICBlbHNpZiAoICRPcmRlckJ5IGVxICdVcCcgKSB7CiAgICAgICAgJFNvcnRDbGFzcyA9ICdTb3J0RGVzY2VuZGluZyc7CiAgICB9CgogICAgIyBzZXQgdGhlIFNvcnRCeSBDbGFzcyB0byB0aGUgY29ycmVjdCBmaWVsZAogICAgbXkgJUNTU1NvcnQ7CiAgICBteSAkQ1NTU29ydEJ5ID0gJFNvcnRCeSAuICdTb3J0JzsKICAgICRDU1NTb3J0eyRDU1NTb3J0Qnl9ID0gJFNvcnRDbGFzczsKCiAgICBteSAlTmV3T3JkZXIgPSAoCiAgICAgICAgRG93biA9PiAnVXAnLAogICAgICAgIFVwICAgPT4gJ0Rvd24nLAogICAgKTsKCiAgICAjIHNob3cgdGhlIEZBUSBhcnRpY2xlIGxpc3QKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0ZBUUl0ZW1MaXN0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgJUNTU1NvcnQsCiAgICAgICAgICAgIE9yZGVyID0+ICROZXdPcmRlcnskT3JkZXJCeX0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJE11bHRpTGFuZ3VhZ2UgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6TXVsdGlMYW5ndWFnZScpOwoKICAgICMgc2hvdyBsYW5ndWFnZSBoZWFkZXIKICAgIGlmICgkTXVsdGlMYW5ndWFnZSkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMYW5ndWFnZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgICAgICVDU1NTb3J0LAogICAgICAgICAgICAgICAgT3JkZXIgPT4gJE5ld09yZGVyeyRPcmRlckJ5fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb3VudGVyID0gMDsKICAgIGlmIChAVmlld2FibGVJdGVtSURzKSB7CgogICAgICAgIGZvciBteSAkSXRlbUlEIChAVmlld2FibGVJdGVtSURzKSB7CgogICAgICAgICAgICAkQ291bnRlcisrOwoKICAgICAgICAgICAgIyBidWlsZCBzZWFyY2ggcmVzdWx0CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb3VudGVyID49ICRTdGFydEhpdAogICAgICAgICAgICAgICAgJiYgJENvdW50ZXIgPCAoICRTZWFyY2hQYWdlU2hvd24gKyAkU3RhcnRIaXQgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgbXkgJUZBUURhdGEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgICAgIEl0ZW1GaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgICAgICAgICAgJEZBUURhdGF7SWNvbn0gPSAkRkFRRGF0YXtJY29ufSA/IGRlY29kZV9iYXNlNjQoICRGQVFEYXRhe0ljb259ICkgOiAnJzsKCiAgICAgICAgICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgICAgICAgICAgICAgJEZBUURhdGF7Q2xlYW5UaXRsZX0gPSAkRkFRT2JqZWN0LT5GQVFBcnRpY2xlVGl0bGVDbGVhbigKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkRkFRRGF0YXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgPT4gJENvbmZpZy0+e1RpdGxlU2l6ZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGJsb2NrcyB0byB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgbGFuZ3VhZ2UgZGF0YQogICAgICAgICAgICAgICAgaWYgKCRNdWx0aUxhbmd1YWdlKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZExhbmd1YWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgb3RoZXJ3aXNlIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlIGlzIGRpc3BsYXllZAogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRkFRRGF0YUZvdW5kTXNnJywKICAgICAgICApOwogICAgfQoKICAgIG15ICRMaW5rID0gJ1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkU29ydEJ5KSAuICc7JzsKICAgICRMaW5rIC49ICdPcmRlcj0nIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkT3JkZXJCeSkgLiAnOyc7CgogICAgbXkgJEFjdGlvblN0cmluZzsKICAgIGlmICglU2VhcmNoKSB7CiAgICAgICAgJEFjdGlvblN0cmluZyA9ICJBY3Rpb249Q3VzdG9tZXJGQVFFeHBsb3JlcjtTdWJhY3Rpb249U2VhcmNoOyI7CiAgICAgICAgaWYgKCAkRkFRU2VhcmNoe0NhdGVnb3J5SURzfSApIHsKICAgICAgICAgICAgJEFjdGlvblN0cmluZyAuPSAiQ2F0ZWdvcnlJRD0kQ2F0ZWdvcnlJRDsiOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJE1vZGUgKCBrZXlzICVTZWFyY2ggKSB7CiAgICAgICAgICAgICRBY3Rpb25TdHJpbmcgLj0gIiRNb2RlPSRTZWFyY2h7ICRNb2RlIH07IjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQWN0aW9uU3RyaW5nID0gIkFjdGlvbj1DdXN0b21lckZBUUV4cGxvcmVyO0NhdGVnb3J5SUQ9JENhdGVnb3J5SUQiOwogICAgfQoKICAgICMgYnVpbGQgc2VhcmNoIG5hdmlnYXRpb24gYmFyCiAgICBteSAlUGFnZU5hdiA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgTGltaXQgICAgID0+ICRTZWFyY2hMaW1pdCwKICAgICAgICBTdGFydEhpdCAgPT4gJFN0YXJ0SGl0LAogICAgICAgIFBhZ2VTaG93biA9PiAkU2VhcmNoUGFnZVNob3duLAogICAgICAgIEFsbEhpdHMgICA9PiAkQ291bnRlciwKICAgICAgICBBY3Rpb24gICAgPT4gJEFjdGlvblN0cmluZywKICAgICAgICBMaW5rICAgICAgPT4gJExpbmssCiAgICAgICAgSURQcmVmaXggID0+ICJDdXN0b21lckZBUUV4cGxvcmVyIiwKICAgICk7CgogICAgaWYgKCAkUGFnZU5hdntUb3RhbEhpdHN9ID1+IG0vPHNwYW5cc2NsYXNzPSJQYWdpbmF0aW9uTGltaXQiPihcZC4qKTxcL3NwYW4+L2cgKSB7CiAgICAgICAgJFBhZ2VOYXZ7VG90YWxIaXRzfSA9ICQxOwogICAgfQoKICAgICMgc2hvdyBmb290ZXIgZmlsdGVyIC0gc2hvdyBvbmx5IGlmIG1vcmUgdGhlIG9uZSBwYWdlIGlzIGF2YWlsYWJsZQogICAgaWYgKCBkZWZpbmVkICRQYWdlTmF2e1RvdGFsSGl0c30gJiYgKCAkUGFnZU5hdntUb3RhbEhpdHN9ID4gJFNlYXJjaFBhZ2VTaG93biApICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQYWdpbmF0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlUGFnZU5hdiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBRdWlja1NlYXJjaAogICAgJExheW91dE9iamVjdC0+RkFRU2hvd1F1aWNrU2VhcmNoKAogICAgICAgIE1vZGUgICAgICAgICAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgIEN1c3RvbWVyVXNlciAgICA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgSW50ZXJmYWNlICAgICAgID0+ICRJbnRlcmZhY2UsCiAgICAgICAgSW50ZXJmYWNlU3RhdGVzID0+ICRJbnRlcmZhY2VTdGF0ZXMsCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBzaG93IGxhc3QgYWRkZWQgYW5kIGxhc3QgdXBkYXRlZCBhcnRpY2xlcwogICAgZm9yIG15ICRUeXBlIChxdyhMYXN0Q3JlYXRlIExhc3RDaGFuZ2UpKSB7CgogICAgICAgIG15ICRTaG93T2sgPSAkTGF5b3V0T2JqZWN0LT5GQVFTaG93TGF0ZXN0TmV3c0JveCgKICAgICAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgIENhdGVnb3J5SUQgICAgICA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgID0+ICRJbnRlcmZhY2UsCiAgICAgICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNob3dPayApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyB0b3AgdGVuIGFydGljbGVzCiAgICBteSAkU2hvd09rID0gJExheW91dE9iamVjdC0+RkFRU2hvd1RvcDEwKAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIE1vZGUgICAgICAgICAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgIEN1c3RvbWVyVXNlciAgICA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+ICRDYXRlZ29yeUlELAogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJFNob3dPayApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgIH0KCiAgICAjUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICNHZXQgU2lkZWJhciBpbmZvCgogICAgJFBhcmFte1NpZGVCYXJ9ID0gJExheW91dE9iamVjdC0+RkFRU2lkZUJhcigKICAgICAgICBNb2RlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSB8fCAnZW4nLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBJc0FsbG93ZWQgICAgICAgICA9PiAxLAogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+IDAsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIEhhc0RlZmF1bHRBcnRpY2xlID0+ICRIYXNEZWZhdWx0QXJ0aWNsZSwKICAgICk7CgogICAgIyBFTyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckZBUUV4cGxvcmVyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgICVDYXRlZ29yeURhdGEsCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/CustomerFAQZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gN2JkYTc3NDRkZDc1YzdkMjNiYzcyZDQ2OWE2M2I5OTkwZTJlYTQ5YiAtIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyRkFRWm9vbS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJGQVFab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKdXNlIE1JTUU6OkJhc2U2NCBxdyhkZWNvZGVfYmFzZTY0IGVuY29kZV9iYXNlNjQpOwoKIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBpZiAoICFkZWZpbmVkICRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7VXNlckN1c3RvbWVyRG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgICRHZXRQYXJhbXtJdGVtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0l0ZW1JRCcgKTsKICAgICRHZXRQYXJhbXtSYXRlfSAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1JhdGUnICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAjR2V0IGRlZmF1bHQgSXRlbUlEIGlmIGl0J3MgZGVmaW5lZAogICAgbXkgJElzRGVmYXVsdEFydGljbGUgID0gMDsKICAgIG15ICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDA7CiAgICBteSAlRGF0YSAgICAgICAgICAgICAgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0N1c3RvbWVyRkFRU2lkZUJhcjo6QXJ0aWNsZXMnKSB9OwogICAgJFNlbGYtPntVc2VyTGFuZ3VhZ2V9IHx8PSAnZW4nOwoKICAgIENPTkZJRzoKICAgIGZvciBteSAkQ29uZmlnICgga2V5cyAlRGF0YSApIHsKICAgICAgICBuZXh0IENPTkZJRyBpZiAkRGF0YXskQ29uZmlnfS0+e0xhbmd1YWdlfSBuZSAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfTsKCiAgICAgICAgaWYgKCAkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9ICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17SXRlbUlEfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtJdGVtSUR9ID0gJERhdGF7JENvbmZpZ30tPntEZWZhdWx0SXRlbUlEfTsKICAgICAgICAgICAgICAgICRJc0RlZmF1bHRBcnRpY2xlID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkSGFzRGVmYXVsdEFydGljbGUgPSAxOwogICAgICAgICAgICBsYXN0IENPTkZJRzsKICAgICAgICB9CiAgICB9CgogICAgIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgICMgc2F2ZSwgaWYgYnJvd3NlciBsaW5rIG1lc3NhZ2Ugd2FzIGNsb3NlZAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Jyb3dzZXJMaW5rTWVzc2FnZScgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEtleSAgICA9PiAnVXNlckN1c3RvbWVyRG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlJywKICAgICAgICAgICAgVmFsdWUgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAxLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICMgU2hvdyBtZXNzYWdlIGFuZCBsaW5rIHRvIEZBUSBFeHBsb3JlciBpZiBubyBkZWZhdWx0IGl0ZW0gaXMgc2V0IGFuZCBubyBJdGVtSUQgcHJvdmlkZWQKICAgIG15ICRPdXRwdXQ7CgogICAgaWYgKCAhJEdldFBhcmFte0l0ZW1JRH0gKSB7CiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFBhcmFte0Nzc0NsYXNzTm9BcnRpY2xlfSA9ICdIaWRkZW4nOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EZWZhdWx0SXRlbScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJGQVFab29tJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE91dHB1dCAuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CiAgICB9CgogICAgIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgbXkgJUZBUURhdGEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICBJdGVtRmllbGRzICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKICAgIGlmICggISVGQVFEYXRhICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoKTsKICAgIH0KCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAkRkFRRGF0YXtJY29ufSA9ICRGQVFEYXRhe0ljb259ID8gZGVjb2RlX2Jhc2U2NCggJEZBUURhdGF7SWNvbn0gKSA6ICcnOwoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAjIGdldCB0aGUgdmFsaWQgaWRzCiAgICBteSBAVmFsaWRJRHMgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwogICAgbXkgJVZhbGlkSURMb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQFZhbGlkSURzOwoKICAgICMgY2hlY2sgdXNlciBwZXJtaXNzaW9uCiAgICBteSAkUGVybWlzc2lvbiA9ICRGQVFPYmplY3QtPkNoZWNrQ2F0ZWdvcnlDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICBDYXRlZ29yeUlEICAgPT4gJEZBUURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgaW50ZXJmYWNlIHN0YXRlIGxpc3QKICAgIG15ICRJbnRlcmZhY2VTdGF0ZXMgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Q3VzdG9tZXI6OlN0YXRlVHlwZXMnKSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIGlmICgKICAgICAgICAhJFBlcm1pc3Npb24KICAgICAgICB8fCAhJEZBUURhdGF7QXBwcm92ZWR9CiAgICAgICAgfHwgISRWYWxpZElETG9va3VweyAkRkFRRGF0YXtWYWxpZElEfSB9CiAgICAgICAgfHwgISRJbnRlcmZhY2VTdGF0ZXMtPnsgJEZBUURhdGF7U3RhdGVUeXBlSUR9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBzdG9yZSB0aGUgbGFzdCBzY3JlZW4gaW4gc2Vzc2lvbgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEhUTUxWaWV3IFN1YmFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdIVE1MVmlldycgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRGaWVsZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaWVsZCIgKTsKCiAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KCBJdGVtSUQgRmllbGQgKSkgewogICAgICAgICAgICBpZiAoICEkTmVlZGVkICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZGVkIFBhcmFtOiAkTmVlZGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgRmllbGQgY29udGVudAogICAgICAgIG15ICRGaWVsZENvbnRlbnQgPSAkRkFRT2JqZWN0LT5JdGVtRmllbGRHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgRmllbGQgID0+ICRGaWVsZCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHJld3JpdGUgaGFuZGxlIGFuZCBhY3Rpb24KICAgICAgICAkRmllbGRDb250ZW50CiAgICAgICAgICAgID1+IHN7IGluZGV4Wy5dcGwgWz9dIEFjdGlvbj1BZ2VudEZBUVpvb20gfXtjdXN0b21lci5wbD9BY3Rpb249Q3VzdG9tZXJGQVFab29tfWd4bXM7CgogICAgICAgICMgdGFrZSBjYXJlIG9mIG9sZCBzdHlsZSBiZWZvcmUgRkFRIDIuMC54CiAgICAgICAgJEZpZWxkQ29udGVudCA9fiBzewogICAgICAgICAgICBpbmRleFsuXXBsIFs/XSBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgIH17Y3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyRkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O31neG1zOwoKICAgICAgICAjIGJ1aWxkIGJhc2UgVVJMIGZvciBpbmxpbmUgaW1hZ2VzCiAgICAgICAgbXkgJFNlc3Npb25JRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntTZXNzaW9uSUR9ICYmICEkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0gKSB7CiAgICAgICAgICAgICRTZXNzaW9uSUQgPSAnOycgLiAkU2VsZi0+e1Nlc3Npb25OYW1lfSAuICc9JyAuICRTZWxmLT57U2Vzc2lvbklEfTsKICAgICAgICAgICAgJEZpZWxkQ29udGVudCA9fiBzewogICAgICAgICAgICAgICAgKEFjdGlvbj1DdXN0b21lckZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtJdGVtSUQ9XGQrO0ZpbGVJRD1cZCspCiAgICAgICAgICAgIH17JDEkU2Vzc2lvbklEfWdtc3g7CiAgICAgICAgfQoKICAgICAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgICAgICAjIGNvbnZlcnQgY29udGVudCB0byBIVE1MIGlmIG5lZWRlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAkRkFRRGF0YXtDb250ZW50VHlwZX0gbmUgJ3RleHQvaHRtbCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBEZXRlY3QgYWxsIHBsYWluIHRleHQgbGlua3MgYW5kIHB1dCB0aGVtIGludG8gYW4gSFRNTCA8YT4gdGFnLgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICk7CgogICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAjIHNldCB0YXJnZXQ9Il9wYXJlbnQiIGZvciBsaW5rcyB0byBvdGhlciBhcnRpY2xlcyB2aWEgbWVudGlvbgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkRkFRT2JqZWN0LT5MaW5rUXVvdGVNZW50aW9uKAogICAgICAgICAgICBTdHJpbmcgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwoKICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgICAgICMgU2V0IHRhcmdldD0iX2JsYW5rIiBhdHRyaWJ1dGUgdG8gYWxsIEhUTUwgPGE+IHRhZ3MgdGhlIExpbmtRdW90ZSBmdW5jdGlvbiBuZWVkcyB0byBiZQogICAgICAgICMgICBjYWxsZWQgYWdhaW4KICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICAgICAgVGFyZ2V0QWRkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgbmVlZGVkIEhUTUwgaGVhZGVycwogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICA9PiAndXRmLTgnLAogICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSA9PiAxLAogICAgICAgICAgICBDdXN0b21lclVJU3R5bGVzICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgICRGaWVsZENvbnRlbnQgPX4gc3soPGgoWzEtNl0pPi4qPzwvaFwyPil9eyAkQ291bnQrKzsgIjxhIGlkPVwiJEZpZWxkLSRDb3VudFwiPiZuYnNwOzwvYT4kMSJ9Z2U7CgogICAgICAgICMgRU8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgICAgICAjIHJldHVybiBjb21wbGV0ZSBIVE1MIGFzIGFuIGF0dGFjaG1lbnQKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgRG93bmxvYWRBdHRhY2htZW50IFN1YmFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZEF0dGFjaG1lbnQnICkgewoKICAgICAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICAgICAgJEdldFBhcmFte0ZpbGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsZUlEJyApOwogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ZpbGVJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZCBGaWxlSUQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhdHRhY2htZW50cwogICAgICAgIG15ICVGaWxlID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBGaWxlSUQgPT4gJEdldFBhcmFte0ZpbGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJUZpbGUpIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoJUZpbGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkR2V0UGFyYW17RmlsZUlEfSkhIE1heSBiZSBhbiBhdHRhY2shISEiLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgIH0KCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgIFZhbHVlID0+ICRGQVFEYXRhe1RpdGxlfSwKICAgICk7CgogICAgIyBBZGRKU0RhdGEgZm9yIEVTCiAgICBteSAkRVNBY3RpdmUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkFjdGl2ZScpOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnRVNBY3RpdmUnLAogICAgICAgIFZhbHVlID0+ICRFU0FjdGl2ZSwKICAgICk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHNldCBkZWZhdWx0IGludGVyZmFjZSBzZXR0aW5ncwogICAgbXkgJEludGVyZmFjZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ2V4dGVybmFsJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB2b3RpbmcgZGVmYXVsdCBvcHRpb24KICAgIG15ICRWb3RpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Vm90aW5nJyk7CgogICAgIyBnZXQgRkFRIHZvdGUgaW5mb3JtYXRpb24KICAgIG15ICRWb3RlRGF0YTsKICAgIGlmICgkVm90aW5nKSB7CiAgICAgICAgJFZvdGVEYXRhID0gJEZBUU9iamVjdC0+Vm90ZUdldCgKICAgICAgICAgICAgQ3JlYXRlQnkgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRGQVFEYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgIEludGVyZmFjZSA9PiAkSW50ZXJmYWNlLT57U3RhdGVJRH0sCiAgICAgICAgICAgIElQICAgICAgICA9PiAkUGFyYW1PYmplY3QtPlJlbW90ZUFkZHIoKSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBhbHJlYWR5IHZvdGVkIHRoaXMgRkFRIGl0ZW0KICAgIG15ICRBbHJlYWR5Vm90ZWQ7CgogICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgbXkgJFZvdGVNZXNzYWdlOwoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICBpZiAoJFZvdGVEYXRhKSB7CgogICAgICAgIG15ICRJdGVtQ2hhbmdlZFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRkFRRGF0YXtDaGFuZ2VkfSB8fCAnJywKICAgICAgICAgICAgfQogICAgICAgICktPlRvRXBvY2goKTsKCiAgICAgICAgbXkgJFZvdGVDcmVhdGVkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRWb3RlRGF0YS0+e0NyZWF0ZWR9IHx8ICcnLAogICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICBpZiAoICRJdGVtQ2hhbmdlZFN5c3RlbVRpbWUgPD0gJFZvdGVDcmVhdGVkU3lzdGVtVGltZSApIHsKICAgICAgICAgICAgJEFscmVhZHlWb3RlZCA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFZvdGUgU3ViYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZvdGUnICkgewoKICAgICAgICAjIGN1c3RvbWVyIGNhbid0IHVzZSB0aGlzIHN1Yi1hY3Rpb24gaWYgaXMgbm90IGVuYWJsZWQKICAgICAgICBpZiAoICEkVm90aW5nICkgewoKICAgICAgICAgICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgICAgICAkVm90ZU1lc3NhZ2UgPSBUcmFuc2xhdGFibGUoJ1RoZSB2b3RpbmcgbWVjaGFuaXNtIGlzIG5vdCBlbmFibGVkIScpOwoKICAgICAgICAgICAgIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgIH0KCiAgICAgICAgIyB1c2VyIGNhbiB2b3RlIG9ubHkgb25jZSBwZXIgRkFRIHJldmlzaW9uCiAgICAgICAgaWYgKCRBbHJlYWR5Vm90ZWQpIHsKCiAgICAgICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgJFZvdGVNZXNzYWdlID0gVHJhbnNsYXRhYmxlKCdZb3UgaGF2ZSBhbHJlYWR5IHZvdGVkIScpOwoKICAgICAgICAgICAgIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGhlIHZvdGUgaWYgYW55CiAgICAgICAgZWxzaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtSYXRlfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHJhdGVzIGNvbmZpZwogICAgICAgICAgICBteSAkVm90aW5nUmF0ZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcycpOwogICAgICAgICAgICBteSAkUmF0ZSAgICAgICAgPSAkR2V0UGFyYW17UmF0ZX07CgogICAgICAgICAgICAjIHNlbmQgZXJyb3IgaWYgcmF0ZSBpcyBub3QgZGVmaW5lZCBpbiBjb25maWcKICAgICAgICAgICAgaWYgKCAhJFZvdGluZ1JhdGVzLT57JFJhdGV9ICkgewoKICAgICAgICAgICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgICAgICRWb3RlTWVzc2FnZSA9IFRyYW5zbGF0YWJsZSgnVGhlIHZvdGUgcmF0ZSBpcyBub3QgZGVmaW5lZCEnKTsKCiAgICAgICAgICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3RoZXJ3aXNlIGFkZCB0aGUgdm90ZQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRGQVFPYmplY3QtPlZvdGVBZGQoCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgSVAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+UmVtb3RlQWRkcigpLAogICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAkSW50ZXJmYWNlLT57U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUmF0ZSAgICAgID0+ICRHZXRQYXJhbXtSYXRlfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSB2b3RpbmcgZm9ybQogICAgICAgICAgICAgICAgJEFscmVhZHlWb3RlZCA9IDE7CgogICAgICAgICAgICAgICAgIyByZWZyZXNoIEZBUSBpdGVtIGRhdGEKICAgICAgICAgICAgICAgICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgSXRlbUZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgICAgICAgICAkRkFRRGF0YXtJY29ufSA9ICRGQVFEYXRhe0ljb259ID8gZGVjb2RlX2Jhc2U2NCggJEZBUURhdGF7SWNvbn0gKSA6ICcnOwoKICAgICAgICAgICAgICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAgICAgICAgICAgICBpZiAoICElRkFRRGF0YSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgICAgICAgICAgJFZvdGVNZXNzYWdlID0gVHJhbnNsYXRhYmxlKCdUaGFua3MgZm9yIHlvdXIgdm90ZSEnKTsKCiAgICAgICAgICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXNlciBpcyBhYmxlIHRvIHZvdGUgYnV0IG5vIHJhdGUgaGFzIGJlZW4gc2VsZWN0ZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdObyByYXRlIHNlbGVjdGVkIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgZmllbGRzIGRhdGEgKFN0aWxsIG5lZWRlZCBmb3IgUGxhaW5UZXh0KQogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChxdyhGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNikpIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRkFRRGF0YXskRmllbGR9OwoKICAgICAgICAjIHJld3JpdGUgbGlua3MgdG8gZW1iZWRkZWQgaW1hZ2VzIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBpZiAoICRJbnRlcmZhY2UtPntOYW1lfSBlcSAnZXh0ZXJuYWwnICkgewoKICAgICAgICAgICAgIyByZXdyaXRlIGhhbmRsZSBhbmQgYWN0aW9uCiAgICAgICAgICAgICRGQVFEYXRheyRGaWVsZH0KICAgICAgICAgICAgICAgID1+IHN7IGluZGV4Wy5dcGwgWz9dIEFjdGlvbj1BZ2VudEZBUVpvb20gfXtjdXN0b21lci5wbD9BY3Rpb249Q3VzdG9tZXJGQVFab29tfWd4bXM7CgogICAgICAgICAgICAjIHRha2UgY2FyZSBvZiBvbGQgc3R5bGUgYmVmb3JlIEZBUSAyLjAueAogICAgICAgICAgICAkRkFRRGF0YXskRmllbGR9ID1+IHN7CiAgICAgICAgICAgICAgICBpbmRleFsuXXBsIFs/XSBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgICAgICB9e2N1c3RvbWVyLnBsP0FjdGlvbj1DdXN0b21lckZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDt9Z3htczsKICAgICAgICB9CgogICAgICAgICMgbm8gcXVvdGluZyBpZiBIVE1MIHZpZXcgaXMgZW5hYmxlZAogICAgICAgIG5leHQgRklFTEQgaWYgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKTsKCiAgICAgICAgIyBIVE1MIHF1b3RpbmcKICAgICAgICAkRkFRRGF0YXskRmllbGR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJEZBUURhdGF7JEZpZWxkfSwKICAgICAgICAgICAgVk1heCAgICAgICAgICAgPT4gNTAwMCwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHZvdGluZyByZXN1bHRzCiAgICAkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9ID0gJExheW91dE9iamVjdC0+R2V0RkFRSXRlbVZvdGluZ1JhdGVDb2xvcigKICAgICAgICBSYXRlID0+ICRGQVFEYXRhe1ZvdGVSZXN1bHR9LAogICAgKTsKCiAgICBpZiAoICEkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9IHx8ICRGQVFEYXRhe1ZvdGVzfSBlcSAnMCcgKSB7CiAgICAgICAgJFBhcmFte1ZvdGluZ1Jlc3VsdENvbG9yfSA9ICdHcmF5JzsKICAgIH0KCiAgICAjIHNob3cgYmFjayBsaW5rCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCYWNrJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgZ2V0IG11bHRpLWxhbmd1YWdlIGRlZmF1bHQgb3B0aW9uCiAgICBteSAkTXVsdGlMYW5ndWFnZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpNdWx0aUxhbmd1YWdlJyk7CgogICAgIyBzaG93IGxhbmd1YWdlCiAgICBpZiAoJE11bHRpTGFuZ3VhZ2UpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgRkFRIHBhdGgKICAgIG15ICRTaG93RkFRUGF0aCA9ICRMYXlvdXRPYmplY3QtPkZBUVBhdGhTaG93KAogICAgICAgIEZBUU9iamVjdCAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgQ2F0ZWdvcnlJRCAgPT4gJEZBUURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgUGF0aEZvckl0ZW0gPT4gMSwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCRTaG93RkFRUGF0aCkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFQYXRoSXRlbUVsZW1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgbWVzc2FnZSBhYm91dCBsaW5rcyBpbiBpZnJhbWVzLCBpZiB1c2VyIGRpZG4ndCBjbG9zZSBpdCBhbHJlYWR5CiAgICBpZiAoICEkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Jyb3dzZXJMaW5rTWVzc2FnZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgRkFRIENvbnRlbnQKICAgICRMYXlvdXRPYmplY3QtPkZBUUNvbnRlbnRTaG93KAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIEZBUURhdGEgICAgICAgICA9PiB7JUZBUURhdGF9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCgogICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICBab29tID0+IDEKCiAgICAgICAgIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgKTsKCiAgICAjIGxvZyBhY2Nlc3MgdG8gdGhpcyBGQVEgaXRlbQogICAgJEZBUU9iamVjdC0+RkFRTG9nQWRkKAogICAgICAgIEl0ZW1JRCAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICBJbnRlcmZhY2UgPT4gJEludGVyZmFjZS0+e05hbWV9LAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICNSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgI0dldCBTaWRlYmFyIGluZm8KICAgICRQYXJhbXtTaWRlQmFyfSA9ICRMYXlvdXRPYmplY3QtPkZBUVNpZGVCYXIoCiAgICAgICAgTW9kZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICBMYW5ndWFnZSAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIElzQWxsb3dlZCAgICAgICAgID0+IDEsCiAgICAgICAgSXRlbUlEICAgICAgICAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIElzRGVmYXVsdEFydGljbGUgID0+ICRJc0RlZmF1bHRBcnRpY2xlLAogICAgICAgIEhhc0RlZmF1bHRBcnRpY2xlID0+ICRIYXNEZWZhdWx0QXJ0aWNsZQogICAgKTsKCiAgICAjUmVuZGVyIFRhYmxlIG9mIENvbnRlbnRzCiAgICAkUGFyYW17VE9DfSA9ICRMYXlvdXRPYmplY3QtPkZBUVRhYmxlT2ZDb250ZW50cygKICAgICAgICBNb2RlICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgRkFRRGF0YSA9PiBcJUZBUURhdGEKICAgICk7CgogICAgI1JlbmRlciBBZGRpb25hbCBkYXRhIHdpZGdldAogICAgJFBhcmFte0FkZGl0aW9uYWxEYXRhfSA9ICRMYXlvdXRPYmplY3QtPkZBUUFkZGl0aW9uYWxEYXRhKAogICAgICAgIE1vZGUgICAgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgRkFRRGF0YSAgICAgPT4gXCVGQVFEYXRhLAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBWb3RlTWVzc2FnZSA9PiAkVm90ZU1lc3NhZ2UgfHwgJycsCiAgICAgICAgQWN0aW9uICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIENvbmZpZyAgICAgID0+ICRDb25maWcKICAgICk7CgogICAgIyBFTyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckZBUVpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9GQVFWb3RpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRkFRRGF0YSA9ICV7ICRQYXJhbXtGQVFEYXRhfSB9OwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRkFRVm90aW5nJywKICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICApOwoKICAgICMgZ2V0IFZvdGluZyByYXRlcyBzZXR0aW5nCiAgICBteSAkVm90aW5nUmF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcycpOwogICAgZm9yIG15ICRSYXRlVmFsdWUgKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyRWb3RpbmdSYXRlc30gKSB7CgogICAgICAgICMgY3JlYXRlIGRhdGEgc3RydWN0dXJlIGZvciBvdXRwdXQKICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgVmFsdWUgPT4gJFJhdGVWYWx1ZSwKICAgICAgICAgICAgVGl0bGUgPT4gJFZvdGluZ1JhdGVzLT57JFJhdGVWYWx1ZX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVZvdGluZ1JhdGVSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/PublicFAQExplorer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0ZBUUV4cGxvcmVyLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpQdWJsaWNGQVFFeHBsb3JlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCiMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKdXNlIE1JTUU6OkJhc2U2NCBxdyhkZWNvZGVfYmFzZTY0IGVuY29kZV9iYXNlNjQpOwoKIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKdXNlIE1JTUU6OkJhc2U2NCBxdygpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCBVc2VySUQgdG8gcm9vdCBiZWNhdXNlIGluIHB1YmxpYyBpbnRlcmZhY2UgdGhlcmUgaXMgbm8gdXNlcgogICAgJFNlbGYtPntVc2VySUR9ID0gMTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgY29uZmlnIGRhdGEKICAgIG15ICRTdGFydEhpdCAgICAgICAgPSBpbnQoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydEhpdCcgKSB8fCAxICk7CiAgICBteSAkU2VhcmNoTGltaXQgICAgID0gJENvbmZpZy0+e1NlYXJjaExpbWl0fSAgICAgfHwgMjAwOwogICAgbXkgJFNlYXJjaFBhZ2VTaG93biA9ICRDb25maWctPntTZWFyY2hQYWdlU2hvd259IHx8IDM7CiAgICBteSAkU29ydEJ5ICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRDb25maWctPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnRkFRSUQnOwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXInICkKICAgICAgICB8fCAkQ29uZmlnLT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnRG93bic7CgogICAgIyBnZXQgSXRlbSBJRAogICAgbXkgJEl0ZW1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJdGVtSUQnICkgfHwgMDsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgSXRlbUlEIHBhcmFtZXRlciB3YXMgc2VudCBhbmQgcmVkaXJlY3QgdG8gRkFRIGFydGljbGUgem9vbSBzY3JlZW4KICAgIGlmICgkSXRlbUlEKSB7CgogICAgICAgICMgcmVkaXJlY3QgdG8gRkFRIHpvb20KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICdBY3Rpb249UHVibGljRkFRWm9vbTtJdGVtSUQ9JyAuICRJdGVtSUQgKTsKICAgIH0KCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAjIENoZWNrIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBhcnRpY2xlIGRlZmluZWQgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlCiAgICBteSAkSGFzRGVmYXVsdEFydGljbGUgPSAwOwogICAgbXkgJURhdGEgICAgICAgICAgICAgID0gJXsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdQdWJsaWNGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CgogICAgQ09ORklHOgogICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgIG5leHQgQ09ORklHIGlmICREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9IG5lICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9OwoKICAgICAgICBpZiAoICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH0gKSB7CiAgICAgICAgICAgICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIGxhc3QgQ09ORklHOwogICAgICAgIH0KICAgIH0KCiAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgbXkgJENhdGVnb3J5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2F0ZWdvcnlJRCcgKSB8fCAwOwoKICAgICMgY2hlY2sgZm9yIG5vbiBudW1lcmljIENhdGVnb3J5SUQKICAgIGlmICggJENhdGVnb3J5SUQgIX4gL1xkKy8gKSB7CiAgICAgICAgJENhdGVnb3J5SUQgPSAwOwogICAgfQoKICAgICMgZ2V0IGNhdGVnb3J5IGJ5IG5hbWUKICAgIG15ICRDYXRlZ29yeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDYXRlZ29yeScgKSB8fCAnJzsKCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgICMgdHJ5IHRvIGdldCB0aGUgY2F0ZWdvcnkgSUQgZnJvbSBjYXRlZ29yeSBuYW1lIGlmIG5vIGNhdGVnb3J5IElECiAgICBpZiAoICRDYXRlZ29yeSAmJiAhJENhdGVnb3J5SUQgKSB7CgogICAgICAgICMgZ2V0IHRoZSBjYXRlZ29yeSB0cmVlCiAgICAgICAgbXkgJENhdGVnb3J5VHJlZSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5VHJlZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgcmV2ZXJzZSB0aGUgaGFzIGZvciBlYXN5IGxvb2t1cAogICAgICAgIG15ICVSZXZlcnNlQ2F0ZWdvcnlUcmVlID0gcmV2ZXJzZSAleyRDYXRlZ29yeVRyZWV9OwoKICAgICAgICAkQ2F0ZWdvcnlJRCA9ICRSZXZlcnNlQ2F0ZWdvcnlUcmVleyRDYXRlZ29yeX0gfHwgMDsKICAgIH0KCiAgICAjIHRyeSB0byBnZXQgdGhlIGNhdGVnb3J5IGRhdGEKICAgIG15ICVDYXRlZ29yeURhdGE7CiAgICBpZiAoJENhdGVnb3J5SUQpIHsKCiAgICAgICAgIyBnZXQgY2F0ZWdvcnkgZGF0YQogICAgICAgICVDYXRlZ29yeURhdGEgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICElQ2F0ZWdvcnlEYXRhICkgewoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgUlNTIGZlZWQgbGluayBmb3IgbmV3IEZBUSBhcnRpY2xlcyBpbiB0aGUgYnJvd3NlciBVUkwgYmFyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZXRhTGluaycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFJlbCAgID0+ICdhbHRlcm5hdGUnLAogICAgICAgICAgICBUeXBlICA9PiAnYXBwbGljYXRpb24vcnNzK3htbCcsCiAgICAgICAgICAgIFRpdGxlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0ZBUSBBcnRpY2xlcyAobmV3IGNyZWF0ZWQpJyksCiAgICAgICAgICAgIEhyZWYgPT4gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfSAuICdBY3Rpb249UHVibGljRkFRUlNTO1R5cGU9Q3JlYXRlZCcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgUlNTIGZlZWQgbGluayBmb3IgY2hhbmdlZCBGQVEgYXJ0aWNsZXMgaW4gdGhlIGJyb3dzZXIgVVJMIGJhcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWV0YUxpbmsnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBSZWwgICA9PiAnYWx0ZXJuYXRlJywKICAgICAgICAgICAgVHlwZSAgPT4gJ2FwcGxpY2F0aW9uL3Jzcyt4bWwnLAogICAgICAgICAgICBUaXRsZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdGQVEgQXJ0aWNsZXMgKHJlY2VudGx5IGNoYW5nZWQpJyksCiAgICAgICAgICAgIEhyZWYgPT4gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfSAuICdBY3Rpb249UHVibGljRkFRUlNTO1R5cGU9Q2hhbmdlZCcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgUlNTIGZlZWQgbGluayBmb3IgVG9wLTEwIEZBUSBhcnRpY2xlcyBpbiB0aGUgYnJvd3NlciBVUkwgYmFyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZXRhTGluaycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFJlbCAgID0+ICdhbHRlcm5hdGUnLAogICAgICAgICAgICBUeXBlICA9PiAnYXBwbGljYXRpb24vcnNzK3htbCcsCiAgICAgICAgICAgIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRkFRIEFydGljbGVzIChUb3AgMTApJyksCiAgICAgICAgICAgIEhyZWYgID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30gLiAnQWN0aW9uPVB1YmxpY0ZBUVJTUztUeXBlPVRvcDEwJywKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoKTsKCiAgICBteSAkQ2F0ZWdvcnlJRHNSZWY7CiAgICBteSAlU2VhcmNoOwogICAgbXkgJUZBUVNlYXJjaDsKCiAgICAjIHNob3cgc2VhcmNoIHJlc3VsdHMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VhcmNoJyApIHsKICAgICAgICBteSAkU2VhcmNoTmFtZSA9IFRyYW5zbGF0YWJsZSgiU2VhcmNoIikgLiAiOiI7CiAgICAgICAgZm9yIG15ICRNb2RlIChxdy9LZXl3b3JkIFdoYXQvKSB7CiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTW9kZSApOwogICAgICAgICAgICBpZiAoJFN0cmluZykgewogICAgICAgICAgICAgICAgJFNlYXJjaHskTW9kZX0gICAgPSAkU3RyaW5nOwogICAgICAgICAgICAgICAgJEZBUVNlYXJjaHskTW9kZX0gPSAiKiRTdHJpbmcqIjsKICAgICAgICAgICAgICAgIG15ICRNb2RlTmFtZSA9ICRNb2RlIGVxICdXaGF0JyA/ICdGdWxsdGV4dCcgOiAkTW9kZTsKICAgICAgICAgICAgICAgICRTZWFyY2hOYW1lIC49ICIgIiAuIFRyYW5zbGF0YWJsZSgkTW9kZU5hbWUpIC4gIiBcIiRTdHJpbmdcIjsiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjYXRlZ29yeSByb290ICggZG9uZSBpbiBMYXlvdXRPYmplY3QgZm9yIG5vbiBzZWFyY2hlcyApCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVBhdGhDYXRlZ29yeUVsZW1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeU5hbWUnKSwKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBzZWFyY2ggaW5mb3JtYXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aENhdGVnb3J5RWxlbWVudE5vTGluaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAkU2VhcmNoTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGRpc2FibGUgY2F0ZWdvcnkgc3BlY2lmaWMgc3R1ZmYKICAgICAgICAkQ2F0ZWdvcnlJRCA9IC0xOwogICAgfQoKICAgICMgbm8gc2VhcmNoICggc3RhbmRhcmQgbW9kZSApCiAgICBlbHNlIHsKICAgICAgICAjIHNob3cgRkFRIHBhdGgKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GQVFQYXRoU2hvdygKICAgICAgICAgICAgRkFRT2JqZWN0ICA9PiAkRkFRT2JqZWN0LAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhbGwgZGlyZWN0IHN1YmNhdGVnb3JpZXMgb2YgdGhlIHNlbGVjdGVkIGNhdGVnb3J5CiAgICAgICAgJENhdGVnb3J5SURzUmVmID0gJEZBUU9iamVjdC0+UHVibGljQ2F0ZWdvcnlTZWFyY2goCiAgICAgICAgICAgIFBhcmVudElEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICBNb2RlICAgICA9PiAnUHVibGljJywKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaW50ZXJmYWNlIHN0YXRlIGxpc3QKICAgIG15ICRJbnRlcmZhY2VTdGF0ZXMgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6UHVibGljOjpTdGF0ZVR5cGVzJyksCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiB0aGVyZSBhcmUgc3ViY2F0ZWdvcmllcwogICAgaWYgKCAkQ2F0ZWdvcnlJRHNSZWYgJiYgcmVmICRDYXRlZ29yeUlEc1JlZiBlcSAnQVJSQVknICYmIEB7JENhdGVnb3J5SURzUmVmfSApIHsKCiAgICAgICAgIyBzaG93IHN1YmNhdGVnb3JpZXMgbGlzdAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdWJjYXRlZ29yaWVzJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGRhdGEgZm9yIGVhY2ggc3ViY2F0ZWdvcnkKICAgICAgICBmb3IgbXkgJFN1YkNhdGVnb3J5SUQgKCBAeyRDYXRlZ29yeUlEc1JlZn0gKSB7CgogICAgICAgICAgICBteSAlU3ViQ2F0ZWdvcnlEYXRhID0gJEZBUU9iamVjdC0+Q2F0ZWdvcnlHZXQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRTdWJDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB0aGUgbnVtYmVyIG9mIHN1YmNhdGVnb3JpZXMgb2YgdGhpcyBzdWJjYXRlZ29yeQogICAgICAgICAgICAkU3ViQ2F0ZWdvcnlEYXRhe1N1YkNhdGVnb3J5Q291bnR9ID0gJEZBUU9iamVjdC0+Q2F0ZWdvcnlDb3VudCgKICAgICAgICAgICAgICAgIFBhcmVudElEcyA9PiBbJFN1YkNhdGVnb3J5SURdLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBudW1iZXIgb2YgRkFRIGFydGljbGVzIGluIHRoaXMgY2F0ZWdvcnkKICAgICAgICAgICAgJFN1YkNhdGVnb3J5RGF0YXtBcnRpY2xlQ291bnR9ID0gJEZBUU9iamVjdC0+RkFRQ291bnQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEcyAgPT4gWyRTdWJDYXRlZ29yeUlEXSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgICA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgICAgICAgICAgT25seUFwcHJvdmVkID0+IDEsCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCB0aGUgY2F0ZWdvcnkgZGF0YQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVTdWJDYXRlZ29yeURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGludGVyZmFjZSBzZXR0aW5ncwogICAgbXkgJEludGVyZmFjZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ3B1YmxpYycsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBpbmNsdWRlIENhdGVnb3J5IGlmIG5vdCBpbiBiYXNlIENhdGVnb3J5ICgwKSwgb3Igc2VhcmNoIG1vZGUKICAgIGlmICggJENhdGVnb3J5SUQgPiAwICkgewogICAgICAgICRGQVFTZWFyY2h7Q2F0ZWdvcnlJRHN9ID0gWyRDYXRlZ29yeUlEXTsKICAgIH0KCiAgICAjIGdldCB0aGUgbGF0ZXN0IGFydGljbGVzIGZvciB0aGUgcm9vdCBjYXRlZ29yeSAoZWxzZSBlbXB0eSkKICAgIGVsc2lmICggISVTZWFyY2ggKSB7CiAgICAgICAgJFNvcnRCeSAgICAgID0gJ0NoYW5nZWQnOwogICAgICAgICRPcmRlckJ5ICAgICA9ICdEb3duJzsKICAgICAgICAkU2VhcmNoTGltaXQgPSAxMDsKICAgIH0KCiAgICAjIHNlYXJjaCBhbGwgRkFRIGFydGljbGVzIHdpdGhpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkKICAgIG15IEBWaWV3YWJsZUl0ZW1JRHMgPSAkRkFRT2JqZWN0LT5GQVFTZWFyY2goCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJFNvcnRCeV0sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJE9yZGVyQnldLAogICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gJFNlYXJjaExpbWl0LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFN0YXRlcyAgICAgICAgICAgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+ICRJbnRlcmZhY2UsCiAgICAgICAgJUZBUVNlYXJjaCwKICAgICk7CgogICAgIyBzZXQgdGhlIFNvcnRCeSBDbGFzcwogICAgbXkgJFNvcnRDbGFzczsKCiAgICAjIHRoaXMgc2V0cyB0aGUgb3Bwb3NpdGUgdG8gdGhlIE9yZGVyQnkgcGFyYW1ldGVyCiAgICBpZiAoICRPcmRlckJ5IGVxICdEb3duJyApIHsKICAgICAgICAkU29ydENsYXNzID0gJ1NvcnRBc2NlbmRpbmcnOwogICAgfQogICAgZWxzaWYgKCAkT3JkZXJCeSBlcSAnVXAnICkgewogICAgICAgICRTb3J0Q2xhc3MgPSAnU29ydERlc2NlbmRpbmcnOwogICAgfQoKICAgICMgc2V0IHRoZSBTb3J0QnkgQ2xhc3MgdG8gdGhlIGNvcnJlY3QgZmllbGQKICAgIG15ICVDU1NTb3J0OwogICAgbXkgJENTU1NvcnRCeSA9ICRTb3J0QnkgLiAnU29ydCc7CiAgICAkQ1NTU29ydHskQ1NTU29ydEJ5fSA9ICRTb3J0Q2xhc3M7CgogICAgbXkgJU5ld09yZGVyID0gKAogICAgICAgIERvd24gPT4gJ1VwJywKICAgICAgICBVcCAgID0+ICdEb3duJywKICAgICk7CgogICAgIyBzaG93IHRoZSBGQVEgYXJ0aWNsZSBsaXN0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGQVFJdGVtTGlzdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgICVDU1NTb3J0LAogICAgICAgICAgICBPcmRlciA9PiAkTmV3T3JkZXJ7JE9yZGVyQnl9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IG11bHRpIGxhbmd1YWdlIGRlZmF1bHQgb3B0aW9uCiAgICBteSAkTXVsdGlMYW5ndWFnZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpNdWx0aUxhbmd1YWdlJyk7CgogICAgIyBzaG93IGxhbmd1YWdlIGhlYWRlcgogICAgaWYgKCRNdWx0aUxhbmd1YWdlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckxhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgJUNTU1NvcnQsCiAgICAgICAgICAgICAgICBPcmRlciA9PiAkTmV3T3JkZXJ7JE9yZGVyQnl9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENvdW50ZXIgPSAwOwogICAgaWYgKEBWaWV3YWJsZUl0ZW1JRHMpIHsKCiAgICAgICAgIyBjcmVhdGUgYmFjayBsaW5rIGZvciBGQVEgWm9vbSBzY3JlZW4KICAgICAgICBteSAkWm9vbUJhY2tMaW5rID0gIkFjdGlvbj1QdWJsaWNGQVFFeHBsb3JlcjtDYXRlZ29yeUlEPSRDYXRlZ29yeUlEOyIKICAgICAgICAgICAgLiAiU29ydEJ5PSRTb3J0Qnk7T3JkZXI9JE9yZGVyQnk7U3RhcnRIaXQ9JFN0YXJ0SGl0IjsKCiAgICAgICAgIyBlbmNvZGUgYmFjayBsaW5rIHRvIEJhc2U2NCBmb3IgZWFzeSBIVE1MIHRyYW5zcG9ydAogICAgICAgICRab29tQmFja0xpbmsgPSBNSU1FOjpCYXNlNjQ6OmVuY29kZV9iYXNlNjQoJFpvb21CYWNrTGluayk7CgogICAgICAgIGZvciBteSAkSXRlbUlEIChAVmlld2FibGVJdGVtSURzKSB7CgogICAgICAgICAgICAkQ291bnRlcisrOwoKICAgICAgICAgICAgIyBidWlsZCBzZWFyY2ggcmVzdWx0CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb3VudGVyID49ICRTdGFydEhpdAogICAgICAgICAgICAgICAgJiYgJENvdW50ZXIgPCAoICRTZWFyY2hQYWdlU2hvd24gKyAkU3RhcnRIaXQgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgbXkgJUZBUURhdGEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgICAgIEl0ZW1GaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEZBUURhdGF7Q2xlYW5UaXRsZX0gPSAkRkFRT2JqZWN0LT5GQVFBcnRpY2xlVGl0bGVDbGVhbigKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkRkFRRGF0YXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgPT4gJENvbmZpZy0+e1RpdGxlU2l6ZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgICAgICRGQVFEYXRhe0ljb259ID0gJEZBUURhdGF7SWNvbn0gPyBkZWNvZGVfYmFzZTY0KCAkRkFRRGF0YXtJY29ufSApIDogJyc7CgogICAgICAgICAgICAgICAgIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgICAgICAgICAgICAgICMgYWRkIGJsb2NrcyB0byB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFpvb21CYWNrTGluayA9PiAkWm9vbUJhY2tMaW5rLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGxhbmd1YWdlIGRhdGEKICAgICAgICAgICAgICAgIGlmICgkTXVsdGlMYW5ndWFnZSkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmRMYW5ndWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQKICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0ZBUURhdGFGb3VuZE1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkTGluayA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFNvcnRCeSkgLiAnOyc7CiAgICAkTGluayAuPSAnT3JkZXI9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJE9yZGVyQnkpIC4gJzsnOwoKICAgIG15ICRBY3Rpb25TdHJpbmc7CiAgICBpZiAoJVNlYXJjaCkgewogICAgICAgICRBY3Rpb25TdHJpbmcgPSAiQWN0aW9uPVB1YmxpY0ZBUUV4cGxvcmVyO1N1YmFjdGlvbj1TZWFyY2g7IjsKICAgICAgICBpZiAoICRGQVFTZWFyY2h7Q2F0ZWdvcnlJRHN9ICkgewogICAgICAgICAgICAkQWN0aW9uU3RyaW5nIC49ICJDYXRlZ29yeUlEPSRDYXRlZ29yeUlEOyI7CiAgICAgICAgfQogICAgICAgIGZvciBteSAkTW9kZSAoIGtleXMgJVNlYXJjaCApIHsKICAgICAgICAgICAgJEFjdGlvblN0cmluZyAuPSAiJE1vZGU9JFNlYXJjaHsgJE1vZGUgfTsiOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRBY3Rpb25TdHJpbmcgPSAiQWN0aW9uPVB1YmxpY0ZBUUV4cGxvcmVyO0NhdGVnb3J5SUQ9JENhdGVnb3J5SUQiOwogICAgfQoKICAgICMgYnVpbGQgc2VhcmNoIG5hdmlnYXRpb24gYmFyCiAgICBteSAlUGFnZU5hdiA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgTGltaXQgICAgID0+ICRTZWFyY2hMaW1pdCwKICAgICAgICBTdGFydEhpdCAgPT4gJFN0YXJ0SGl0LAogICAgICAgIFBhZ2VTaG93biA9PiAkU2VhcmNoUGFnZVNob3duLAogICAgICAgIEFsbEhpdHMgICA9PiAkQ291bnRlciwKICAgICAgICBBY3Rpb24gICAgPT4gIkFjdGlvbj1QdWJsaWNGQVFFeHBsb3JlcjtDYXRlZ29yeUlEPSRDYXRlZ29yeUlEIiwKICAgICAgICBMaW5rICAgICAgPT4gJExpbmssCiAgICAgICAgSURQcmVmaXggID0+ICJQdWJsaWNGQVFFeHBsb3JlciIsCiAgICApOwoKICAgICMgc2hvdyBmb290ZXIgZmlsdGVyIC0gc2hvdyBvbmx5IGlmIG1vcmUgdGhlIG9uZSBwYWdlIGlzIGF2YWlsYWJsZQogICAgaWYgKCBkZWZpbmVkICRQYWdlTmF2e1RvdGFsSGl0c30gJiYgKCAkUGFnZU5hdntUb3RhbEhpdHN9ID4gJFNlYXJjaFBhZ2VTaG93biApICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQYWdpbmF0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlUGFnZU5hdiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRTZWFyY2hCYWNrTGluayA9ICJBY3Rpb249UHVibGljRkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD0kQ2F0ZWdvcnlJRCI7CgogICAgIyBlbmNvZGUgYmFjayBsaW5rIHRvIEJhc2U2NCBmb3IgZWFzeSBIVE1MIHRyYW5zcG9ydAogICAgJFNlYXJjaEJhY2tMaW5rID0gTUlNRTo6QmFzZTY0OjplbmNvZGVfYmFzZTY0KCRTZWFyY2hCYWNrTGluayk7CgogICAgIyBzaG93IFF1aWNrU2VhcmNoCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFTaG93UXVpY2tTZWFyY2goCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdQdWJsaWMnLAogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIFNlYXJjaEJhY2tMaW5rICA9PiAkU2VhcmNoQmFja0xpbmssCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBzaG93IGxhc3QgYWRkZWQgYW5kIGxhc3QgdXBkYXRlZCBhcnRpY2xlcwogICAgZm9yIG15ICRUeXBlIChxdyhMYXN0Q3JlYXRlIExhc3RDaGFuZ2UpKSB7CgogICAgICAgIG15ICRTaG93T2sgPSAkTGF5b3V0T2JqZWN0LT5GQVFTaG93TGF0ZXN0TmV3c0JveCgKICAgICAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdQdWJsaWMnLAogICAgICAgICAgICBDYXRlZ29yeUlEICAgICAgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTaG93T2sgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgdG9wIHRlbiBhcnRpY2xlcwogICAgbXkgJFNob3dPayA9ICRMYXlvdXRPYmplY3QtPkZBUVNob3dUb3AxMCgKICAgICAgICBGQVFPYmplY3QgICAgICAgPT4gJEZBUU9iamVjdCwKICAgICAgICBNb2RlICAgICAgICAgICAgPT4gJ1B1YmxpYycsCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+ICRDYXRlZ29yeUlELAogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJFNob3dPayApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgIH0KCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAjR2V0IFNpZGViYXIgaW5mbwoKICAgICRQYXJhbXtTaWRlQmFyfSA9ICRMYXlvdXRPYmplY3QtPkZBUVNpZGVCYXIoCiAgICAgICAgTW9kZSAgICAgICAgICAgICAgPT4gJ1B1YmxpYycsCiAgICAgICAgTGFuZ3VhZ2UgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJMYW5ndWFnZX0gfHwgJ2VuJywKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgSXNBbGxvd2VkICAgICAgICAgPT4gMSwKICAgICAgICBJdGVtSUQgICAgICAgICAgICA9PiAwLAogICAgICAgIEFjdGlvbiAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBIYXNEZWZhdWx0QXJ0aWNsZSA9PiAkSGFzRGVmYXVsdEFydGljbGUKICAgICk7CgogICAgIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnUHVibGljRkFRRXhwbG9yZXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgJUNhdGVnb3J5RGF0YSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/PublicFAQZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gN2JkYTc3NDRkZDc1YzdkMjNiYzcyZDQ2OWE2M2I5OTkwZTJlYTQ5YiAtIEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0ZBUVpvb20ucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OlB1YmxpY0ZBUVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTUlNRTo6QmFzZTY0ICAgICAgICAgICAgICAgICAgcXcoKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKdXNlIE1JTUU6OkJhc2U2NCBxdyhkZWNvZGVfYmFzZTY0IGVuY29kZV9iYXNlNjQpOwoKIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCBVc2VySUQgdG8gcm9vdCBiZWNhdXNlIGluIHB1YmxpYyBpbnRlcmZhY2UgdGhlcmUgaXMgbm8gdXNlcgogICAgJFNlbGYtPntVc2VySUR9ID0gMTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICAkR2V0UGFyYW17SXRlbUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJdGVtSUQnICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAjIEdldCBkZWZhdWx0IEl0ZW1JRCBpZiBpdCdzIGRlZmluZWQKICAgIG15ICRJc0RlZmF1bHRBcnRpY2xlICA9IDA7CiAgICBteSAkSGFzRGVmYXVsdEFydGljbGUgPSAwOwogICAgbXkgJURhdGEgICAgICAgICAgICAgID0gJXsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdQdWJsaWNGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CiAgICAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSB8fD0gJ2VuJzsKCiAgICBDT05GSUc6CiAgICBmb3IgbXkgJENvbmZpZyAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgbmV4dCBDT05GSUcgaWYgJERhdGF7JENvbmZpZ30tPntMYW5ndWFnZX0gbmUgJExheW91dE9iamVjdC0+e1VzZXJMYW5ndWFnZX07CgogICAgICAgIGlmICggJERhdGF7JENvbmZpZ30tPntEZWZhdWx0SXRlbUlEfSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0l0ZW1JRH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17SXRlbUlEfSA9ICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH07CiAgICAgICAgICAgICAgICAkSXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEhhc0RlZmF1bHRBcnRpY2xlID0gMTsKICAgICAgICAgICAgbGFzdCBDT05GSUc7CiAgICAgICAgfQogICAgfQoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAjIFNob3cgbWVzc2FnZSBhbmQgbGluayB0byBGQVEgRXhwbG9yZXIgaWYgbm8gZGVmYXVsdCBpdGVtIGlzIHNldCBhbmQgbm8gSXRlbUlEIHByb3ZpZGVkCiAgICBteSAkT3V0cHV0OwoKICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigpOwoKICAgICAgICAkUGFyYW17Q3NzQ2xhc3NOb0FydGljbGV9ID0gJ0hpZGRlbic7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RlZmF1bHRJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQdWJsaWNGQVFab29tJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE91dHB1dCAuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CiAgICB9CgogICAgIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgICMgZ2V0IGJhY2sgbGluawogICAgJEdldFBhcmFte1pvb21CYWNrTGlua30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUJhY2tMaW5rJyApIHx8ICcnOwogICAgaWYgKCAkR2V0UGFyYW17Wm9vbUJhY2tMaW5rfSApIHsKICAgICAgICAkR2V0UGFyYW17Wm9vbUJhY2tMaW5rfSA9IE1JTUU6OkJhc2U2NDo6ZGVjb2RlX2Jhc2U2NCggJEdldFBhcmFte1pvb21CYWNrTGlua30gKTsKICAgIH0KCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgIG15ICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgIEl0ZW1JRCAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgSXRlbUZpZWxkcyA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICggISVGQVFEYXRhICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoKTsKICAgIH0KCiAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAkRkFRRGF0YXtJY29ufSA9ICRGQVFEYXRhe0ljb259ID8gZGVjb2RlX2Jhc2U2NCggJEZBUURhdGF7SWNvbn0gKSA6ICcnOwoKICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAjIGdldCB0aGUgdmFsaWQgaWRzCiAgICBteSBAVmFsaWRJRHMgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwogICAgbXkgJVZhbGlkSURMb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQFZhbGlkSURzOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGludGVyZmFjZSBzdGF0ZSBsaXN0CiAgICBteSAkSW50ZXJmYWNlU3RhdGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlB1YmxpYzo6U3RhdGVUeXBlcycpLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgaWYgKAogICAgICAgICEkRkFRRGF0YXtBcHByb3ZlZH0KICAgICAgICB8fCAhJFZhbGlkSURMb29rdXB7ICRGQVFEYXRhe1ZhbGlkSUR9IH0KICAgICAgICB8fCAhJEludGVyZmFjZVN0YXRlcy0+eyAkRkFRRGF0YXtTdGF0ZVR5cGVJRH0gfQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBIVE1MVmlldyBTdWItYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0hUTUxWaWV3JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJEZpZWxkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpZWxkIiApOwoKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoIEl0ZW1JRCBGaWVsZCApKSB7CiAgICAgICAgICAgIGlmICggISROZWVkZWQgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkZWQgUGFyYW06ICROZWVkZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBGaWVsZCBjb250ZW50CiAgICAgICAgbXkgJEZpZWxkQ29udGVudCA9ICRGQVFPYmplY3QtPkl0ZW1GaWVsZEdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBGaWVsZCAgPT4gJEZpZWxkLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmV3cml0ZSBoYW5kbGUgYW5kIGFjdGlvbgogICAgICAgICRGaWVsZENvbnRlbnQKICAgICAgICAgICAgPX4gc3sgaW5kZXhbLl1wbCBbP10gQWN0aW9uPUFnZW50RkFRWm9vbSB9e3B1YmxpYy5wbD9BY3Rpb249UHVibGljRkFRWm9vbX1neG1zOwoKICAgICAgICAjIHRha2UgY2FyZSBvZiBvbGQgc3R5bGUgYmVmb3JlIEZBUSAyLjAueAogICAgICAgICRGaWVsZENvbnRlbnQgPX4gc3sKICAgICAgICAgICAgaW5kZXhbLl1wbCBbP10gQWN0aW9uPUFnZW50RkFRIFsmXShhbXA7KT8gU3ViYWN0aW9uPURvd25sb2FkIFsmXShhbXA7KT8KICAgICAgICB9e3B1YmxpYy5wbD9BY3Rpb249UHVibGljRkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O31neG1zOwoKICAgICAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgICAgICAjIGNvbnZlcnQgY29udGVudCB0byBIVE1MIGlmIG5lZWRlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAkRkFRRGF0YXtDb250ZW50VHlwZX0gbmUgJ3RleHQvaHRtbCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBEZXRlY3QgYWxsIHBsYWluIHRleHQgbGlua3MgYW5kIHB1dCB0aGVtIGludG8gYW4gSFRNTCA8YT4gdGFnLgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICk7CgogICAgICAgICMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAjIHNldCB0YXJnZXQ9Il9wYXJlbnQiIGZvciBsaW5rcyB0byBvdGhlciBhcnRpY2xlcyB2aWEgbWVudGlvbgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkRkFRT2JqZWN0LT5MaW5rUXVvdGVNZW50aW9uKAogICAgICAgICAgICBTdHJpbmcgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwoKICAgICAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgICAgICMgU2V0IHRhcmdldD0iX2JsYW5rIiBhdHRyaWJ1dGUgdG8gYWxsIEhUTUwgPGE+IHRhZ3MgdGhlIExpbmtRdW90ZSBmdW5jdGlvbiBuZWVkcyB0byBiZQogICAgICAgICMgICBjYWxsZWQgYWdhaW4KICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICAgICAgVGFyZ2V0QWRkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgbmVlZGVkIEhUTUwgaGVhZGVycwogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICA9PiAndXRmLTgnLAogICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSA9PiAxLAogICAgICAgICAgICBDdXN0b21lclVJU3R5bGVzICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgYmFzZSBVUkwgZm9yIGlubGluZSBpbWFnZXMKICAgICAgICBteSAkU2Vzc2lvbklEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e1Nlc3Npb25JRH0gJiYgISRTZWxmLT57U2Vzc2lvbklEQ29va2llfSApIHsKICAgICAgICAgICAgJFNlc3Npb25JRCA9ICc7JyAuICRTZWxmLT57U2Vzc2lvbk5hbWV9IC4gJz0nIC4gJFNlbGYtPntTZXNzaW9uSUR9OwogICAgICAgICAgICAkRmllbGRDb250ZW50ID1+IHN7CiAgICAgICAgICAgICAgICAoQWN0aW9uPVB1YmxpY0ZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtJdGVtSUQ9XGQrO0ZpbGVJRD1cZCspCiAgICAgICAgICAgIH17JDEkU2Vzc2lvbklEfWdtc3g7CiAgICAgICAgfQoKICAgICAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICAkRmllbGRDb250ZW50ID1+IHN7KDxoKFsxLTZdKT4uKj88L2hcMj4pfXsgJENvdW50Kys7ICI8YSBpZD1cIiRGaWVsZC0kQ291bnRcIj4mbmJzcDs8L2E+JDEifWdlOwoKICAgICAgICAjIEVPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAgICAgIyByZXR1cm4gY29tcGxldGUgSFRNTCBhcyBhbiBhdHRhY2htZW50CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIERvd25sb2FkQXR0YWNobWVudCBTdWItYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkQXR0YWNobWVudCcgKSB7CgogICAgICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgICAgICAkR2V0UGFyYW17RmlsZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWxlSUQnICk7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17RmlsZUlEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIEZpbGVJRCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJUZpbGUgPSAkRkFRT2JqZWN0LT5BdHRhY2htZW50R2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEZpbGVJRCA9PiAkR2V0UGFyYW17RmlsZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICglRmlsZSkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgICVGaWxlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggYXR0YWNobWVudCAoJEdldFBhcmFte0ZpbGVJRH0pISBNYXkgYmUgYW4gYXR0YWNrISEhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgIH0KCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgIFZhbHVlID0+ICRGQVFEYXRhe1RpdGxlfSwKICAgICk7CgogICAgIyBzZXQgZGVmYXVsdCBpbnRlcmZhY2Ugc2V0dGluZ3MKICAgIG15ICRJbnRlcmZhY2UgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgTmFtZSAgID0+ICdwdWJsaWMnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgcHJlcGFyZSBmaWVsZHMgZGF0YQogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChxdyhGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNikpIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRkFRRGF0YXskRmllbGR9OwoKICAgICAgICAjIHJld3JpdGUgbGlua3MgdG8gZW1iZWRkZWQgaW1hZ2VzIGZvciBwdWJsaWMgaW50ZXJmYWNlCiAgICAgICAgaWYgKCAkSW50ZXJmYWNlLT57TmFtZX0gZXEgJ3B1YmxpYycgKSB7CgogICAgICAgICAgICAjIHJld3JpdGUgaGFuZGxlIGFuZCBhY3Rpb24KICAgICAgICAgICAgJEZBUURhdGF7JEZpZWxkfQogICAgICAgICAgICAgICAgPX4gc3sgaW5kZXhbLl1wbCBbP10gQWN0aW9uPUFnZW50RkFRWm9vbSB9e3B1YmxpYy5wbD9BY3Rpb249UHVibGljRkFRWm9vbX1neG1zOwoKICAgICAgICAgICAgIyB0YWtlIGNhcmUgb2Ygb2xkIHN0eWxlIGJlZm9yZSBGQVEgMi4wLngKICAgICAgICAgICAgJEZBUURhdGF7JEZpZWxkfSA9fiBzewogICAgICAgICAgICAgICAgaW5kZXhbLl1wbCBbP10gQWN0aW9uPUFnZW50RkFRIFsmXShhbXA7KT8gU3ViYWN0aW9uPURvd25sb2FkIFsmXShhbXA7KT8KICAgICAgICAgICAgfXtwdWJsaWMucGw/QWN0aW9uPVB1YmxpY0ZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDt9Z3htczsKICAgICAgICB9CgogICAgICAgICMgbm8gcXVvdGluZyBpZiBIVE1MIHZpZXcgaXMgZW5hYmxlZAogICAgICAgIG5leHQgRklFTEQgaWYgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKTsKCiAgICAgICAgIyBIVE1MIHF1b3RpbmcKICAgICAgICAkRkFRRGF0YXskRmllbGR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJEZBUURhdGF7JEZpZWxkfSwKICAgICAgICAgICAgVk1heCAgICAgICAgICAgPT4gNTAwMCwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHZvdGluZyByZXN1bHRzCiAgICAkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9ID0gJExheW91dE9iamVjdC0+R2V0RkFRSXRlbVZvdGluZ1JhdGVDb2xvcigKICAgICAgICBSYXRlID0+ICRGQVFEYXRhe1ZvdGVSZXN1bHR9LAogICAgKTsKCiAgICBpZiAoICEkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9IHx8ICRGQVFEYXRhe1ZvdGVzfSBlcSAnMCcgKSB7CiAgICAgICAgJFBhcmFte1ZvdGluZ1Jlc3VsdENvbG9yfSA9ICdHcmF5JzsKICAgIH0KCiAgICAjIHNob3cgYmFjayBsaW5rCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCYWNrJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IG11bHRpLWxhbmd1YWdlIG9wdGlvbgogICAgbXkgJE11bHRpTGFuZ3VhZ2UgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6TXVsdGlMYW5ndWFnZScpOwoKICAgICMgc2hvdyBsYW5ndWFnZQogICAgaWYgKCRNdWx0aUxhbmd1YWdlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7JUZBUURhdGF9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IEZBUSBwYXRoCiAgICBteSAkU2hvd0ZBUVBhdGggPSAkTGF5b3V0T2JqZWN0LT5GQVFQYXRoU2hvdygKICAgICAgICBGQVFPYmplY3QgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIENhdGVnb3J5SUQgID0+ICRGQVFEYXRhe0NhdGVnb3J5SUR9LAogICAgICAgIFBhdGhGb3JJdGVtID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICgkU2hvd0ZBUVBhdGgpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7JUZBUURhdGF9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IEZBUSBDb250ZW50CiAgICAkTGF5b3V0T2JqZWN0LT5GQVFDb250ZW50U2hvdygKICAgICAgICBGQVFPYmplY3QgICAgICAgPT4gJEZBUU9iamVjdCwKICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICBGQVFEYXRhICAgICAgICAgPT4geyVGQVFEYXRhfSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAoKICAgICAgICAjIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgWm9vbSA9PiAxCgogICAgICAgICMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICk7CgogICAgIyBsb2cgYWNjZXNzIHRvIHRoaXMgRkFRIGl0ZW0KICAgICRGQVFPYmplY3QtPkZBUUxvZ0FkZCgKICAgICAgICBJdGVtSUQgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgSW50ZXJmYWNlID0+ICRJbnRlcmZhY2UtPntOYW1lfSwKICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICNHZXQgU2lkZWJhciBpbmZvCiAgICAkUGFyYW17U2lkZUJhcn0gPSAkTGF5b3V0T2JqZWN0LT5GQVFTaWRlQmFyKAogICAgICAgIE1vZGUgICAgICAgICAgICAgID0+ICdQdWJsaWMnLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBJc0FsbG93ZWQgICAgICAgICA9PiAxLAogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgIEFjdGlvbiAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBJc0RlZmF1bHRBcnRpY2xlICA9PiAkSXNEZWZhdWx0QXJ0aWNsZSwKICAgICAgICBIYXNEZWZhdWx0QXJ0aWNsZSA9PiAkSGFzRGVmYXVsdEFydGljbGUKICAgICk7CgogICAgI1JlbmRlciBUYWJsZSBvZiBDb250ZW50cwogICAgJFBhcmFte1RPQ30gPSAkTGF5b3V0T2JqZWN0LT5GQVFUYWJsZU9mQ29udGVudHMoCiAgICAgICAgTW9kZSAgICA9PiAnUHVibGljJywKICAgICAgICBGQVFEYXRhID0+IFwlRkFRRGF0YQogICAgKTsKCiAgICAjUmVuZGVyIEFkZGlvbmFsIGRhdGEgd2lkZ2V0CiAgICAkUGFyYW17QWRkaXRpb25hbERhdGF9ID0gJExheW91dE9iamVjdC0+RkFRQWRkaXRpb25hbERhdGEoCiAgICAgICAgTW9kZSAgICA9PiAnUHVibGljJywKICAgICAgICBGQVFEYXRhID0+IFwlRkFRRGF0YSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSB8fCAxLAogICAgICAgIEFjdGlvbiAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIENvbmZpZyAgPT4gJENvbmZpZwogICAgKTsKCiAgICAjIEVPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQdWJsaWNGQVFab29tJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentFAQExplorer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50RkFRRXhwbG9yZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50RkFRRXhwbG9yZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdC4KICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIFBlcm1pc3Npb24gY2hlY2suCiAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1JvfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IG5lZWQgcm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUuCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgbXkgJElzQWxsb3dlZCA9IDA7CiAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gPSAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfTsKCiAgICAjIEdldCBjb25maWcgZGF0YS4KICAgIG15ICRTdGFydEhpdCAgICA9IGludCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0SGl0JyApIHx8IDEgKTsKICAgIG15ICRTZWFyY2hMaW1pdCA9ICRDb25maWctPntTZWFyY2hMaW1pdH0gfHwgNTAwOwogICAgbXkgJEZpbHRlciAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnJzsKICAgIG15ICRWaWV3ICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdWaWV3JyApICAgfHwgJyc7CiAgICBteSAkU29ydEJ5ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU29ydEJ5JyApCiAgICAgICAgfHwgJENvbmZpZy0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdGQVFJRCc7CiAgICBteSAkT3JkZXJCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJENvbmZpZy0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ0Rvd24nOwoKICAgICMgR2V0IENhdGVnb3J5SUQuCiAgICBteSAkQ2F0ZWdvcnlJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDYXRlZ29yeUlEJyApIHx8IDA7CgogICAgIyBDaGVjayBmb3Igbm9uIG51bWVyaWMgQ2F0ZWdvcnlJRAogICAgaWYgKCAkQ2F0ZWdvcnlJRCAhfiAvXGQrLyApIHsKICAgICAgICAkQ2F0ZWdvcnlJRCA9IDA7CiAgICB9CgogICAgIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgYXJ0aWNsZSBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZQogICAgbXkgJEhhc0RlZmF1bHRBcnRpY2xlID0gMDsKICAgIG15ICVEYXRhICAgICAgICAgICAgICA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CgogICAgQ09ORklHOgogICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgIG5leHQgQ09ORklHIGlmICREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9IG5lICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9OwoKICAgICAgICBpZiAoICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH0gKSB7CiAgICAgICAgICAgICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIGxhc3QgQ09ORklHOwogICAgICAgIH0KICAgIH0KCiAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgbXkgJENhdGVnb3J5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhdGVnb3J5JyApIHx8ICcnOwoKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgIyBUcnkgdG8gZ2V0IHRoZSBDYXRlZ29yeUlEIGZyb20gY2F0ZWdvcnkgbmFtZSBpZiBubyBDYXRlZ29yeUlECiAgICBpZiAoICRDYXRlZ29yeSAmJiAhJENhdGVnb3J5SUQgKSB7CgogICAgICAgICMgR2V0IHRoZSBjYXRlZ29yeSB0cmVlLgogICAgICAgIG15ICRDYXRlZ29yeVRyZWUgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeVRyZWVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgUmV2ZXJzZSB0aGUgaGFzaCBmb3IgZWFzeSBsb29rdXAuCiAgICAgICAgbXkgJVJldmVyc2VDYXRlZ29yeVRyZWUgPSByZXZlcnNlICV7JENhdGVnb3J5VHJlZX07CgogICAgICAgICRDYXRlZ29yeUlEID0gJFJldmVyc2VDYXRlZ29yeVRyZWV7JENhdGVnb3J5fSB8fCAwOwogICAgfQoKICAgICMgR2V0IG5hdmlnYXRpb24gYmFyIG9wdGlvbi4KICAgIG15ICROYXYgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmF2JyApIHx8ICcnOwoKICAgIG15ICRTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CgogICAgIyBTYXZlIENhdGVnb3J5SUQgdG8gc2Vzc2lvbiwgdG8gYmUgdXNlZCBpbiBGQVEgYWRkIHNjcmVlbi4KICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RWaWV3ZWRDYXRlZ29yeScsCiAgICAgICAgVmFsdWUgICAgID0+ICRDYXRlZ29yeUlELAogICAgKTsKCiAgICAjIFN0b3JlIGxhc3Qgb3ZlcnZpZXcgc2NyZWVuIChmb3IgYmFjayBtZW51IGFjdGlvbikgYnV0IG9ubHkgaWYgdGhlIEZBUSBleHBsb3JlciBpcyBub3Qgc2hvd24gYXMgb3ZlcmxheS4KICAgIGlmICggISROYXYgfHwgJE5hdiBuZSAnTm9uZScgKSB7CgogICAgICAgIG15ICRVUkwgPSAiQWN0aW9uPUFnZW50RkFRRXhwbG9yZXI7U29ydEJ5PSRTb3J0QnkiCiAgICAgICAgICAgIC4gIjtDYXRlZ29yeUlEPSRDYXRlZ29yeUlEO05hdj0kTmF2IgogICAgICAgICAgICAuICI7T3JkZXJCeT0kT3JkZXJCeTtTdGFydEhpdD0kU3RhcnRIaXQiOwogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVUkwsCiAgICAgICAgKTsKICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVUkwsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFRyeSB0byBnZXQgdGhlIGNhdGVnb3J5IGRhdGEuCiAgICBteSAlQ2F0ZWdvcnlEYXRhOwogICAgaWYgKCRDYXRlZ29yeUlEKSB7CgogICAgICAgICVDYXRlZ29yeURhdGEgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICElQ2F0ZWdvcnlEYXRhICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1RoZSBDYXRlZ29yeUlEICVzIGlzIGludmFsaWQuJywgJENhdGVnb3J5SUQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgdXNlciBwZXJtaXNzaW9uLgogICAgICAgIG15ICRQZXJtaXNzaW9uID0gJEZBUU9iamVjdC0+Q2hlY2tDYXRlZ29yeVVzZXJQZXJtaXNzaW9uKAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVHlwZSAgICAgICA9PiAncm8nLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFBlcm1pc3Npb24gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IGhhdmUgbm8gcGVybWlzc2lvbiBmb3IgdGhpcyBjYXRlZ29yeSEnKSwKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPdXRwdXQ7CiAgICBpZiAoICROYXYgJiYgJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+RkFRUGF0aFNob3coCiAgICAgICAgRkFRT2JqZWN0ICA9PiAkRkFRT2JqZWN0LAogICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgTmF2ICAgICAgICA9PiAkTmF2LAogICAgKTsKCiAgICAjIEdldCBhbGwgZGlyZWN0IHN1YmNhdGVnb3JpZXMgb2YgdGhlIHNlbGVjdGVkIGNhdGVnb3J5LgogICAgbXkgJENhdGVnb3J5SURzUmVmID0gJEZBUU9iamVjdC0+QWdlbnRDYXRlZ29yeVNlYXJjaCgKICAgICAgICBQYXJlbnRJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1N1YmNhdGVnb3JpZXMnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwoKICAgICMgU2V0IGRlZmF1bHQgaW50ZXJmYWNlIHNldHRpbmdzLgogICAgbXkgJEludGVyZmFjZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ2ludGVybmFsJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICRJbnRlcmZhY2VTdGF0ZXMgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QWdlbnQ6OlN0YXRlVHlwZXMnKSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICNHZXQgU2lkZWJhciBpbmZvCiAgICAkUGFyYW17U2lkZUJhcn0gPSAkTGF5b3V0T2JqZWN0LT5GQVFTaWRlQmFyKAogICAgICAgIE1vZGUgICAgICAgICAgICAgID0+ICdBZ2VudCcsCiAgICAgICAgTGFuZ3VhZ2UgICAgICAgICAgPT4gJFNlbGYtPntVc2VyTGFuZ3VhZ2V9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBJc0FsbG93ZWQgICAgICAgICA9PiAkSXNBbGxvd2VkLAogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+IDAsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIEhhc0RlZmF1bHRBcnRpY2xlID0+ICRIYXNEZWZhdWx0QXJ0aWNsZQogICAgKTsKCiAgICAjIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgIyBHZXQgYWxsIGl0ZW1zICh2YWxpZCBhbmQgaW52YWxpZCkgaWYgU3lTQ29uZmlnIGlzIHNldC4KICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwogICAgbXkgQFZhbGlkSURzOwogICAgbXkgJFZhbGlkID0gMTsKICAgIGlmICggJENvbmZpZy0+e1Nob3dJbnZhbGlkRkFRSXRlbXN9ICkgewogICAgICAgIG15ICVWYWxpZExpc3QgPSAkVmFsaWRPYmplY3QtPlZhbGlkTGlzdCgpOwogICAgICAgIEBWYWxpZElEcyA9IGtleXMgJVZhbGlkTGlzdDsKICAgICAgICAkVmFsaWQgICAgPSAwOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFZhbGlkSURzID0gKCAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICkgKTsKICAgIH0KCiAgICAjIENoZWNrIGlmIHRoZXJlIGFyZSBzdWJjYXRlZ29yaWVzLgogICAgaWYgKCAkQ2F0ZWdvcnlJRHNSZWYgJiYgcmVmICRDYXRlZ29yeUlEc1JlZiBlcSAnQVJSQVknICYmIEB7JENhdGVnb3J5SURzUmVmfSApIHsKCiAgICAgICAgIyBTaG93IGRhdGEgZm9yIGVhY2ggc3ViY2F0ZWdvcnkuCiAgICAgICAgZm9yIG15ICRTdWJDYXRlZ29yeUlEICggQHskQ2F0ZWdvcnlJRHNSZWZ9ICkgewoKICAgICAgICAgICAgbXkgJVN1YkNhdGVnb3J5RGF0YSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5R2V0KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkU3ViQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBHZXQgdGhlIG51bWJlciBvZiBzdWJjYXRlZ29yaWVzIG9mIHRoaXMgc3ViY2F0ZWdvcnkuCiAgICAgICAgICAgICRTdWJDYXRlZ29yeURhdGF7U3ViQ2F0ZWdvcnlDb3VudH0gPSAkRkFRT2JqZWN0LT5DYXRlZ29yeUNvdW50KAogICAgICAgICAgICAgICAgUGFyZW50SURzID0+IFskU3ViQ2F0ZWdvcnlJRF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBHZXQgdGhlIG51bWJlciBvZiBGQVEgYXJ0aWNsZXMgaW4gdGhpcyBjYXRlZ29yeS4KICAgICAgICAgICAgJFN1YkNhdGVnb3J5RGF0YXtBcnRpY2xlQ291bnR9ID0gJEZBUU9iamVjdC0+RkFRQ291bnQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEcyAgPT4gWyRTdWJDYXRlZ29yeUlEXSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgICA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgICAgICAgICAgT25seUFwcHJvdmVkID0+IDAsCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgICAgPT4gJFZhbGlkLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgT3V0cHV0IHRoZSBjYXRlZ29yeSBkYXRhLgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hdiA9PiAkTmF2LAogICAgICAgICAgICAgICAgICAgICVTdWJDYXRlZ29yeURhdGEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIE90aGVyd2lzZSBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQuCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZWFyY2ggYWxsIEZBUSBpdGVtcyB3aXRoaW4gdGhlIGdpdmVuIGNhdGVnb3J5LgogICAgbXkgQFZpZXdhYmxlSXRlbUlEcyA9ICRGQVFPYmplY3QtPkZBUVNlYXJjaCgKICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFskU29ydEJ5XSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFskT3JkZXJCeV0sCiAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAkU2VhcmNoTGltaXQsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgU3RhdGVzICAgICAgICAgICA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gJEludGVyZmFjZSwKICAgICAgICBDYXRlZ29yeUlEcyAgICAgID0+IFskQ2F0ZWdvcnlJRF0sCiAgICAgICAgVmFsaWRJRHMgICAgICAgICA9PiBcQFZhbGlkSURzLAogICAgKTsKCiAgICAjIEJ1aWxkIG5lY2Vzc2FyeSBzdHVmZiBmb3IgdGhlIEZBUSBhcnRpY2xlIGxpc3QuCiAgICBteSAkTGlua1BhZ2UgPSAnRmlsdGVyPScKICAgICAgICAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJEZpbHRlcikKICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkVmlldykKICAgICAgICAuICc7TmF2PScgLiAkTmF2CiAgICAgICAgLiAnO1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkU29ydEJ5KQogICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRPcmRlckJ5KQogICAgICAgIC4gJztDYXRlZ29yeUlEPScgLiAkQ2F0ZWdvcnlJRAogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRGaWx0ZXIpCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFZpZXcpCiAgICAgICAgLiAnO05hdj0nIC4gJE5hdgogICAgICAgIC4gJztDYXRlZ29yeUlEPScgLiAkQ2F0ZWdvcnlJRAogICAgICAgIC4gJzsnOwogICAgbXkgJEZpbHRlckxpbmsgPSAnU29ydEJ5PScgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRTb3J0QnkpCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJE9yZGVyQnkpCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFZpZXcpCiAgICAgICAgLiAnO05hdj0nIC4gJE5hdgogICAgICAgIC4gJztDYXRlZ29yeUlEPScgLiAkQ2F0ZWdvcnlJRAogICAgICAgIC4gJzsnOwoKICAgICMgRmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24uCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRDb25maWctPntTaG93Q29sdW1uc30gKSB7CgogICAgICAgICMgR2V0IGFsbCBwb3NzaWJsZSBjb2x1bW5zIGZyb20gY29uZmlnLgogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRDb25maWctPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBHZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bi4KICAgICAgICBDT0xVTU5OQU1FOgogICAgICAgIGZvciBteSAkTmFtZSAoIHNvcnQga2V5cyAlUG9zc2libGVDb2x1bW4gKSB7CiAgICAgICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhJFBvc3NpYmxlQ29sdW1ueyROYW1lfTsKICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICROYW1lOwogICAgICAgIH0KCiAgICAgICAgIyBFbmZvcmNlIEZBUSBudW1iZXIgY29sdW1uIHNpbmNlIGlzIHRoZSBsaW5rIE1hc3RlckFjdGlvbiBob29rLgogICAgICAgIGlmICggISRQb3NzaWJsZUNvbHVtbnsnTnVtYmVyJ30gKSB7CiAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zLCAnTnVtYmVyJzsKICAgICAgICB9CiAgICB9CgogICAgIyBCdWlsZCB0aGUgdGl0bGUgdmFsdWUgKG9uIHRvcCBvZiB0aGUgYXJ0aWNsZSBsaXN0KS4KICAgIG15ICRUaXRsZSA9ICRDYXRlZ29yeURhdGF7TmFtZX0KICAgICAgICB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RGVmYXVsdDo6Um9vdENhdGVnb3J5TmFtZScpCiAgICAgICAgfHwgJyc7CgogICAgIyBCdWlsZCB0aGUgSFRNTCBmb3IgdGhlIGxpc3Qgb2YgRkFRIGFydGljbGVzIGluIHRoZSBnaXZlbiBjYXRlZ29yeS4KICAgIG15ICRGQVFJdGVtTGlzdEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5GQVFMaXN0U2hvdygKICAgICAgICBGQVFJRHMgICAgID0+IFxAVmlld2FibGVJdGVtSURzLAogICAgICAgIFRvdGFsICAgICAgPT4gc2NhbGFyIEBWaWV3YWJsZUl0ZW1JRHMsCiAgICAgICAgVmlldyAgICAgICA9PiAkVmlldywKICAgICAgICBFbnYgICAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlICAgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ICAgPT4gJExpbmtTb3J0LAogICAgICAgIExpbmtGaWx0ZXIgPT4gJEZpbHRlckxpbmssCgogICAgICAgIFRpdGxlTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdGQVEgQXJ0aWNsZXMnKSwKICAgICAgICBUaXRsZVZhbHVlID0+ICRUaXRsZSwKCiAgICAgICAgTGltaXQgICAgICAgID0+ICRTZWFyY2hMaW1pdCwKICAgICAgICBGaWx0ZXIgICAgICAgPT4gJEZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rICAgPT4gJEZpbHRlckxpbmssCiAgICAgICAgT3JkZXJCeSAgICAgID0+ICRPcmRlckJ5LAogICAgICAgIFNvcnRCeSAgICAgICA9PiAkU29ydEJ5LAogICAgICAgIFNob3dDb2x1bW5zICA9PiBcQFNob3dDb2x1bW5zLAogICAgICAgIE91dHB1dCAgICAgICA9PiAxLAogICAgICAgIE5hdiAgICAgICAgICA9PiAkTmF2LAogICAgICAgIEZBUVRpdGxlU2l6ZSA9PiAkQ29uZmlnLT57VGl0bGVTaXplfSwKICAgICk7CgogICAgIyBTaG93IHRoZSBGQVEgYXJ0aWNsZSBsaXN0LgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRkFRSXRlbUxpc3QnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGQVFJdGVtTGlzdEhUTUwgPT4gJEZBUUl0ZW1MaXN0SFRNTCwKICAgICAgICB9LAogICAgKTsKCiAgICAjIFNldCBRdWlja1NlYXJjaCBtb2RlLgogICAgbXkgJE1vZGUgPSAnQWdlbnQnOwogICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAkTW9kZSA9ICdBZ2VudFNtYWxsJzsKICAgIH0KCiAgICAjIFNob3cgUXVpY2tTZWFyY2guCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFTaG93UXVpY2tTZWFyY2goCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICRNb2RlLAogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgTmF2ICAgICAgICAgICAgID0+ICROYXYsCiAgICApOwoKICAgIG15ICVJbmZvQm94UmVzdWx0czsKCiAgICAjIFNob3cgbGFzdCBhZGRlZCBhbmQgbGFzdCB1cGRhdGVkIGFydGljbGVzLgogICAgZm9yIG15ICRUeXBlIChxdyhMYXN0Q3JlYXRlIExhc3RDaGFuZ2UpKSB7CgogICAgICAgIG15ICRTaG93T2sgPSAkTGF5b3V0T2JqZWN0LT5GQVFTaG93TGF0ZXN0TmV3c0JveCgKICAgICAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIENhdGVnb3J5SUQgICAgICA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgID0+ICRJbnRlcmZhY2UsCiAgICAgICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBOYXYgICAgICAgICAgICAgPT4gJE5hdiwKICAgICAgICApOwogICAgICAgIGlmICggISRTaG93T2sgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBTdG9yZSB0aGUgTmV3c0JveFJlc3VsdC4KICAgICAgICAkSW5mb0JveFJlc3VsdHN7JFR5cGV9ID0gJFNob3dPazsKICAgIH0KCiAgICAjIFNob3cgdG9wIHRlbiBhcnRpY2xlcy4KICAgIG15ICRTaG93T2sgPSAkTGF5b3V0T2JqZWN0LT5GQVFTaG93VG9wMTAoCiAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdBZ2VudCcsCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+ICRDYXRlZ29yeUlELAogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgTmF2ICAgICAgICAgICAgID0+ICROYXYsCiAgICApOwogICAgaWYgKCAhJFNob3dPayApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgIH0KCiAgICAjIFN0b3JlIHRoZSBOZXdzQm94UmVzdWx0LgogICAgJEluZm9Cb3hSZXN1bHRze1RvcDEwfSA9ICRTaG93T2s7CgogICAgIyBTZXQgdGhlIFNpZGViYXIgd2lkdGguCiAgICBteSAkU2lkZWJhckNsYXNzID0gJ0xhcmdlJzsKCiAgICAjIENoZWNrIGlmIGFsbCBJbmZvQm94ZXMgYXJlIGVtcHR5IGFuZCBoaWRlIHRoZSBTaWRlYmFyLgogICAgaWYgKAogICAgICAgICRJbmZvQm94UmVzdWx0c3tMYXN0Q3JlYXRlfSBlcSAtMQogICAgICAgICYmICRJbmZvQm94UmVzdWx0c3tMYXN0Q2hhbmdlfSBlcSAtMQogICAgICAgICYmICRJbmZvQm94UmVzdWx0c3tUb3AxMH0gZXEgLTEKICAgICAgICApCiAgICB7CiAgICAgICAgJFNpZGViYXJDbGFzcyA9ICdIaWRkZW4nOwogICAgfQoKICAgIGlmICggJE5hdiAmJiAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAkU2lkZWJhckNsYXNzID0gJ01lZGl1bSc7CiAgICB9CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUUV4cGxvcmVyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENhdGVnb3J5SUQgICA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgU2lkZWJhckNsYXNzID0+ICRTaWRlYmFyQ2xhc3MsCiAgICAgICAgICAgICVDYXRlZ29yeURhdGEsCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkTmF2ICYmICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICB9CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Layout.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAzMGM4N2NhOTU2OTlhNDc5MzM0NjZmOGM2NjQ4MDNmMWIzZWJkNTM3IC0gS2VybmVsL091dHB1dC9IVE1ML0xheW91dC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6Ok1ENSAgICBxdyhtZDVfaGV4KTsKdXNlIFNjYWxhcjo6VXRpbCAgIHF3KGJsZXNzZWQpOwp1c2UgRmlsZTo6QmFzZW5hbWUgcXcoZmlsZXBhcnNlKTsKCiMgQ1BBTiBtb2R1bGVzCnVzZSBVUkk6OkVzY2FwZSAgICAgcXcodXJpX2VzY2FwZV91dGY4KTsKdXNlIFBsYWNrOjpSZXNwb25zZSAoKTsKdXNlIFBsYWNrOjpVdGlsICAgICAoKTsKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uICgpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpMYW5ndWFnZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1NYWludGVuYW5jZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0IC0gYWxsIGdlbmVyaWMgSFRNTCBmdW5jdGlvbnMKCj1mb3Igc3RvcHdvcmRzIHNhbWVzaXRlCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBnZW5lcmljIEhUTUwgZnVuY3Rpb25zLiBFLiBnLiB0byBnZXQgb3B0aW9ucyBmaWVsZHMsIHRlbXBsYXRlIHByb2Nlc3NpbmcsIC4uLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGEgbmV3IG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwoKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygKICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICBMYW5nICAgID0+ICdkZScsCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgIyAlUGFyYW0gb2Z0ZW4gaGFzIGEgZW50cnkgZm9yICdTZXRDb29raWVzJwogICAgbXkgJFNlbGYgPSBibGVzcyB7JVBhcmFtfSwgJFR5cGU7CgogICAgIyBzZXQgZGVmYXVsdHMKICAgICRTZWxmLT57RGVidWd9ID0gMDsKICAgICRTZWxmLT57U2V0Q29va2llc30gICAgICAgIC8vPSB7fTsgICAgIyBpcyBhbHNvIHNldCBpbiBTZXRDb29raWUoKQogICAgJFNlbGYtPntIYXNEYXRlcGlja2VyfSAgICAgLy89IDA7CiAgICAkU2VsZi0+e0hhc1JpY2hUZXh0RWRpdG9yfSAvLz0gMDsKCiAgICAjIHJlc2V0IGJsb2NrIGRhdGEKICAgIGRlbGV0ZSAkU2VsZi0+e0Jsb2NrRGF0YX07CgogICAgIyBlbXB0eSBhY3Rpb24gaWYgbm90IGRlZmluZWQKICAgICRTZWxmLT57QWN0aW9ufSAvLz0gJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQvc2V0IHNvbWUgY29tbW9uIHBhcmFtcwogICAgJFNlbGYtPntVc2VyVGhlbWV9ICAgIHx8PSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRUaGVtZScpOwogICAgJFNlbGYtPntVc2VyVGltZVpvbmV9IHx8PSBLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUtPlVzZXJEZWZhdWx0VGltZVpvbmVHZXQoKTsKCiAgICAjIERldGVybWluZSB0aGUgbGFuZ3VhZ2UgdG8gdXNlIGJhc2VkIG9uIHRoZSBicm93c2VyIHNldHRpbmcsIGlmIHRoZXJlIGlzbid0IG9uZSB5ZXQuCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBpZiAoICEkU2VsZi0+e1VzZXJMYW5ndWFnZX0gKSB7CiAgICAgICAgbXkgQEJyb3dzZXJMYW5ndWFnZXMgPSBzcGxpdCAvXHMqLFxzKi8sICRTZWxmLT57TGFuZ30gfHwgJFBhcmFtT2JqZWN0LT5IZWFkZXIoJ0FjY2VwdC1MYW5ndWFnZScpIHx8ICcnOwogICAgICAgIG15ICVEYXRhID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0VXNlZExhbmd1YWdlcycpIH07CgogICAgICAgIExBTkdVQUdFOgogICAgICAgIGZvciBteSAkQnJvd3NlckxhbmcgKEBCcm93c2VyTGFuZ3VhZ2VzKSB7CiAgICAgICAgICAgIGZvciBteSAkTGFuZ3VhZ2UgKCByZXZlcnNlIHNvcnQga2V5cyAlRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHh4X1hYIGFuZCB4eC1YWCB0eXBlCiAgICAgICAgICAgICAgICBteSAkTGFuZ3VhZ2VPdGhlclR5cGUgPSAkTGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICAkTGFuZ3VhZ2VPdGhlclR5cGUgPX4gcy9fLy0vOwogICAgICAgICAgICAgICAgaWYgKCAkQnJvd3NlckxhbmcgPX4gL14oJExhbmd1YWdlfCRMYW5ndWFnZU90aGVyVHlwZSkvaSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gPSAkTGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBMQU5HVUFHRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1VzZXJMYW5ndWFnZX0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJExhbmd1YWdlICggcmV2ZXJzZSBzb3J0IGtleXMgJURhdGEgKSB7CgogICAgICAgICAgICAgICAgICAgICMgSWYgQnJvd3NlciByZXF1ZXN0cyAndmknLCBhbHNvIG9mZmVyICd2aV9WSScgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSAndmknCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTGFuZ3VhZ2UgPX4gbS9eJEJyb3dzZXJMYW5nL3NteGkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckxhbmd1YWdlfSA9ICRMYW5ndWFnZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgTEFOR1VBR0U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VXNlckxhbmd1YWdlfSB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwogICAgfQoKICAgICMgY3JlYXRlIGxhbmd1YWdlIG9iamVjdAogICAgaWYgKCAhJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAnS2VybmVsOjpMYW5ndWFnZScgPT4gewogICAgICAgICAgICAgICAgVXNlclRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyk7CiAgICB9CgogICAgIyBvbmx5IHV0Zi04IGlzIHN1cHBvcnRlZCBhbmQgaXQgaXMgdXNlZCBkaXJlY3RseSBieSBmcm9udGVuZCBtb2R1bGVzCiAgICAkU2VsZi0+e1VzZXJDaGFyc2V0fSA9ICd1dGYtOCc7CiAgICAkU2VsZi0+e0NoYXJzZXR9ICAgICA9ICRTZWxmLT57VXNlckNoYXJzZXR9OyAgICAjIGp1c3QgZm9yIGNvbXBhdGliaWxpdHksIHVzZWQgZGlyZWN0bHkgYnkgZnJvbnRlbmQgbW9kdWxlcwoKICAgICMgc2Vzc2lvbiByZWxhdGVkIGF0dHJpYnV0ZXMKICAgICRTZWxmLT57U2Vzc2lvbklEfSAgID0gJFBhcmFte1Nlc3Npb25JRH0gICB8fCAnJzsKICAgICRTZWxmLT57U2Vzc2lvbk5hbWV9ID0gJFBhcmFte1Nlc3Npb25OYW1lfSB8fCAnU2Vzc2lvbklEJzsKCiAgICAjIEJhc2VsaW5rIGlzIGEgbG9jYWwgbGluayBsaWtlIC9vdG9iby9pbmRleC5wbD8KICAgICRTZWxmLT57Q0dJSGFuZGxlfSA9ICRQYXJhbU9iamVjdC0+U2NyaXB0TmFtZSB8fCAnTm8tJEVOVnsiU0NSSVBUX05BTUUifSc7CiAgICAkU2VsZi0+e0Jhc2VsaW5rfSAgPSAkU2VsZi0+e0NHSUhhbmRsZX0gLiAnPyc7CgogICAgJFNlbGYtPntUaW1lfSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UaW1lKAogICAgICAgIEFjdGlvbiA9PiAnR0VUJywKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVGb3JtYXQnLAogICAgKTsKICAgICRTZWxmLT57VGltZUxvbmd9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRpbWUoCiAgICAgICAgQWN0aW9uID0+ICdHRVQnLAogICAgICAgIEZvcm1hdCA9PiAnRGF0ZUZvcm1hdExvbmcnLAogICAgKTsKCiAgICAjIHNldCB0ZXh0IGRpcmVjdGlvbgogICAgJFNlbGYtPntUZXh0RGlyZWN0aW9ufSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT57VGV4dERpcmVjdGlvbn07CgogICAgIyBjaGVjayBGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdAogICAgJFNlbGYtPntGaWx0ZXJFbGVtZW50UG9zdH0gPSB7fTsKCiAgICBteSAlRmlsdGVyRWxlbWVudFBvc3QgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckVsZW1lbnRQb3N0JykgLy8ge30gfTsKCiAgICBGSUxURVI6CiAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVyRWxlbWVudFBvc3QgKSB7CgogICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgY29uZmlnCiAgICAgICAgbXkgJEZpbHRlckNvbmZpZyA9ICRGaWx0ZXJFbGVtZW50UG9zdHskRmlsdGVyfTsKCiAgICAgICAgbmV4dCBGSUxURVIgaWYgISRGaWx0ZXJDb25maWcgfHwgcmVmICRGaWx0ZXJDb25maWcgbmUgJ0hBU0gnOwoKICAgICAgICAjIGV4dHJhY3QgdGVtcGxhdGUgbGlzdAogICAgICAgIG15ICVUZW1wbGF0ZUxpc3QgPSAleyAkRmlsdGVyQ29uZmlnLT57VGVtcGxhdGVzfSB8fCB7fSB9OwoKICAgICAgICBpZiAoICElVGVtcGxhdGVMaXN0IHx8ICRUZW1wbGF0ZUxpc3R7QUxMfSApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IDw8IkVPRiIsCiRGaWx0ZXJDb25maWctPntNb2R1bGV9IHdpbGwgYmUgaWdub3JlZCBiZWNhdXNlIGl0IHdhbnRzIHRvIG9wZXJhdGUgb24gYWxsIHRlbXBsYXRlcyBvciBkb2VzIG5vdCBzcGVjaWZ5IGEgdGVtcGxhdGUgbGlzdC4KRU9GCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEZJTFRFUjsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57RmlsdGVyRWxlbWVudFBvc3R9LT57JEZpbHRlcn0gPSAkRmlsdGVyRWxlbWVudFBvc3R7JEZpbHRlcn07CiAgICB9CgogICAgIyBjaGVjayBGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50CiAgICAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50Jyk7CgogICAgIyBjaGVjayBGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJUZXh0CiAgICAkU2VsZi0+e0ZpbHRlclRleHR9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJUZXh0Jyk7CgogICAgIyBjaGVjayBicm93c2VyCiAgICAkU2VsZi0+e0Jyb3dzZXJ9ICAgICAgICAgPSAnVW5rbm93bic7CiAgICAkU2VsZi0+e0Jyb3dzZXJWZXJzaW9ufSAgPSAwOwogICAgJFNlbGYtPntQbGF0Zm9ybX0gICAgICAgID0gJyc7CiAgICAkU2VsZi0+e0lzTW9iaWxlfSAgICAgICAgPSAwOwogICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMTsKCiAgICBteSAkSHR0cFVzZXJBZ2VudCA9IGxjKCAkUGFyYW1PYmplY3QtPkhlYWRlcignVXNlci1BZ2VudCcpIC8vICcnICk7CgogICAgaWYgKCAhJEh0dHBVc2VyQWdlbnQgKSB7CiAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdVbmtub3duIC0gbm8gJEVOVnsiSFRUUF9VU0VSX0FHRU5UIn0nOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2ssIGlmIHdlIGFyZSBvbiBhIG1vYmlsZSBwbGF0Zm9ybS4KICAgICAgICAjIHRhYmxldHMgYXJlIGhhbmRsZWQgbGlrZSBkZXNrdG9wcwogICAgICAgICMgb25seSBwaG9uZXMgYXJlICJtb2JpbGUiCiAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvbW9iaWxlLyApIHsKICAgICAgICAgICAgJFNlbGYtPntJc01vYmlsZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBhbmRyb2lkCiAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvYW5kcm9pZC8gKSB7CiAgICAgICAgICAgICRTZWxmLT57UGxhdGZvcm19ID0gJ0FuZHJvaWQnOwogICAgICAgIH0KCiAgICAgICAgIyBlZGdlIC8gc3BhcnRhbgogICAgICAgIGlmICggJEh0dHBVc2VyQWdlbnQgPX4gL2VkZ2UvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0VkZ2UnOwogICAgICAgIH0KCiAgICAgICAgIyBtc2llCiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkSHR0cFVzZXJBZ2VudCA9fiAvbXNpZVxzKFswLTkuXSspLwogICAgICAgICAgICB8fCAkSHR0cFVzZXJBZ2VudCA9fiAvaW50ZXJuZXRcc2V4cGxvcmVyXC8oWzAtOS5dKykvCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnTVNJRSc7CgogICAgICAgICAgICBpZiAoICQxID1+IC8oXGQrKVwuKFxkKykvICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWFqb3JWZXJzaW9ufSA9ICQxOwogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWlub3JWZXJzaW9ufSA9ICQyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG9sZGVyIHdpbmRvd3MgbW9iaWxlIHBob25lcyAodW50aWwgSUU5KSwgdGhhdCBzdGlsbCBoYXZlICdNU0lFJyBpbiB0aGUgdXNlciBhZ2VudCBzdHJpbmcKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTW9iaWxlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UGxhdGZvcm19ID0gJ1dpbmRvd3MgUGhvbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG1vYmlsZSBpZQogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL2llbW9iaWxlLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSAgPSAnTVNJRSc7CiAgICAgICAgICAgICRTZWxmLT57UGxhdGZvcm19ID0gJ1dpbmRvd3MgUGhvbmUnOwogICAgICAgIH0KCiAgICAgICAgIyBtb2JpbGUgaWUgKHNlY29uZCB0cnkpCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvdHJpZGVudC8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnTVNJRSc7CgogICAgICAgICAgICBpZiAoICRIdHRwVXNlckFnZW50ID1+IC9ydjooWzAtOV0pK1wuKFswLTldKSsvICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWFqb3JWZXJzaW9ufSA9ICQyOwogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWlub3JWZXJzaW9ufSA9ICQzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlPUwogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gLyhpcGFkfGlwaG9uZXxpcG9kKS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57UGxhdGZvcm19ID0gJ2lPUyc7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gID0gJ1NhZmFyaSc7CgogICAgICAgICAgICBpZiAoICRIdHRwVXNlckFnZW50ID1+IC8oaXBhZHxpcGhvbmV8aXBvZCk7LipjcHUuKm9zIChbMC05XSspXy8gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJWZXJzaW9ufSA9ICQyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRIdHRwVXNlckFnZW50ID1+IC9jcmlvcy8gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0Nocm9tZSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUmljaFRleHQgaXMgc3VwcG9ydGVkIGluIGlPUzYrLgogICAgICAgICAgICBpZiAoICRTZWxmLT57QnJvd3NlclZlcnNpb259ID49IDYgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJSaWNoVGV4dH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYWZhcmkKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9zYWZhcmkvICkgewoKICAgICAgICAgICAgIyBjaHJvbWUKICAgICAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvY2hyb21lLyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnQ2hyb21lJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnU2FmYXJpJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBrb25xdWVyb3IKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9rb25xdWVyb3IvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0tvbnF1ZXJvcic7CgogICAgICAgICAgICAjIG9uIGtvbnF1ZXJlciBkaXNhYmxlIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgZmlyZWZveAogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL2ZpcmVmb3gvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0ZpcmVmb3gnOwogICAgICAgIH0KCiAgICAgICAgIyBvcGVyYQogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL15vcGVyYS4qLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdPcGVyYSc7CiAgICAgICAgfQoKICAgICAgICAjIG5ldHNjYXBlCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvbmV0c2NhcGUvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ05ldHNjYXBlJzsKICAgICAgICB9CgogICAgICAgICMgdzNtCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvXnczbS4qLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSAgICAgICAgID0gJ3czbSc7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7ICAgICAgICMgYXMgdGV4dCBicm93c2VycyBkbyBub3Qgc3VwcG9ydCBKYXZhU2NyaXB0IGJhc2UgcmljaCB0ZXh0IGVkaXRvcnMKICAgICAgICB9CgogICAgICAgICMgbHlueAogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL15seW54LiovICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ICAgICAgICAgPSAnTHlueCc7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7ICAgICAgICAjIGFzIHRleHQgYnJvd3NlcnMgZG8gbm90IHN1cHBvcnQgSmF2YVNjcmlwdCBiYXNlIHJpY2ggdGV4dCBlZGl0b3JzCiAgICAgICAgfQoKICAgICAgICAjIGxpbmtzCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvXmxpbmtzLiovICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0xpbmtzJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnVW5rbm93biAtICcgLiAkSHR0cFVzZXJBZ2VudDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBtb2JpbGUgZGV2aWNlcyB0byBkaXNhYmxlIHJpY2h0ZXh0IHN1cHBvcnQKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0lzTW9iaWxlfQogICAgICAgICYmICRTZWxmLT57UGxhdGZvcm19IG5lICdpT1MnCiAgICAgICAgJiYgJFNlbGYtPntQbGF0Zm9ybX0gbmUgJ0FuZHJvaWQnCiAgICAgICAgJiYgJFNlbGYtPntQbGF0Zm9ybX0gbmUgJ1dpbmRvd3MgUGhvbmUnCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7CiAgICB9CgogICAgIyBjaGVjayBpZiByaWNoIHRleHQgY2FuIGJlIGFjdGl2ZQogICAgaWYgKCAhJFNlbGYtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHJpY2ggdGV4dCBpcyBhY3RpdmUKICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgIH0KCiAgICAjIGxvYWQgdGhlbWUKICAgIG15ICRUaGVtZSA9ICRTZWxmLT57VXNlclRoZW1lfSB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRUaGVtZScpIHx8IFRyYW5zbGF0YWJsZSgnU3RhbmRhcmQnKTsKCiAgICAjIGZvcmNlIGEgdGhlbWUgYmFzZWQgb24gaG9zdCBuYW1lCiAgICBteSAkRGVmYXVsdFRoZW1lSG9zdEJhc2VkID0gJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0VGhlbWU6Okhvc3RCYXNlZCcpOwogICAgbXkgJEhvc3QgICAgICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+SGVhZGVyKCdIb3N0Jyk7CiAgICBpZiAoICREZWZhdWx0VGhlbWVIb3N0QmFzZWQgJiYgJEhvc3QgKSB7CgogICAgICAgIFRIRU1FOgogICAgICAgIGZvciBteSAkUmVnRXhwICggc29ydCBrZXlzICV7JERlZmF1bHRUaGVtZUhvc3RCYXNlZH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgcmVnZXhwIG9yIHRoZW1lIGRpcmVjdG9yaWVzCiAgICAgICAgICAgIG5leHQgVEhFTUUgaWYgISRSZWdFeHA7CiAgICAgICAgICAgIG5leHQgVEhFTUUgaWYgJFJlZ0V4cCBlcSAnJzsKICAgICAgICAgICAgbmV4dCBUSEVNRSBpZiAhJERlZmF1bHRUaGVtZUhvc3RCYXNlZC0+eyRSZWdFeHB9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiByZWdleHAgaXMgbWF0Y2hpbmcKICAgICAgICAgICAgaWYgKCAkSG9zdCA9fiBtLyRSZWdFeHAvaSApIHsKICAgICAgICAgICAgICAgICRUaGVtZSA9ICREZWZhdWx0VGhlbWVIb3N0QmFzZWQtPnskUmVnRXhwfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGxvY2F0ZSB0ZW1wbGF0ZSBmaWxlcwogICAgJFNlbGYtPntUZW1wbGF0ZURpcn0gICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGVtcGxhdGVEaXInKSAuICcvSFRNTC9UZW1wbGF0ZXMvJyAuICRUaGVtZTsKICAgICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZURpcn0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RlbXBsYXRlRGlyJykgLiAnL0hUTUwvVGVtcGxhdGVzLycgLiAnU3RhbmRhcmQnOwoKICAgICMgQ2hlY2sgaWYgJ1N0YW5kYXJkJyBmYWxsYmFjayBleGlzdHMKICAgIGlmICggIS1lICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZURpcn0gKSB7CiAgICAgICAgJFNlbGYtPkZhdGFsRGllKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiTm8gZXhpc3RpbmcgdGVtcGxhdGUgZGlyZWN0b3J5IGZvdW5kICgnJFNlbGYtPntUZW1wbGF0ZURpcn0nKSEgQ2hlY2sgeW91ciBIb21lIGluIEtlcm5lbC9Db25maWcucG0uIgogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhLWUgJFNlbGYtPntUZW1wbGF0ZURpcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAiTm8gZXhpc3RpbmcgdGVtcGxhdGUgZGlyZWN0b3J5IGZvdW5kICgnJFNlbGYtPntUZW1wbGF0ZURpcn0nKSEiCiAgICAgICAgICAgICAgICAuICIgRGVmYXVsdCB0aGVtZSB1c2VkIGluc3RlYWQuIiwKICAgICAgICApOwoKICAgICAgICAjIFNldCBUZW1wbGF0ZURpciB0byAnU3RhbmRhcmQnIGFzIGEgZmFsbGJhY2suCiAgICAgICAgJFRoZW1lID0gJ1N0YW5kYXJkJzsKICAgICAgICAkU2VsZi0+e1RlbXBsYXRlRGlyfSA9ICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZURpcn07CiAgICB9CgogICAgJFNlbGYtPntDdXN0b21UZW1wbGF0ZURpcn0gICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tVGVtcGxhdGVEaXInKSAuICcvSFRNTC9UZW1wbGF0ZXMvJyAuICRUaGVtZTsKICAgICRTZWxmLT57Q3VzdG9tU3RhbmRhcmRUZW1wbGF0ZURpcn0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbVRlbXBsYXRlRGlyJykgLiAnL0hUTUwvVGVtcGxhdGVzLycgLiAnU3RhbmRhcmQnOwoKICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBsb2FkIHN1YiBsYXlvdXQgZmlsZXMKICAgIG15ICRMYXlvdXREaXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RlbXBsYXRlRGlyJykgLiAnL0hUTUwvTGF5b3V0JzsKICAgIGlmICggLWQgJExheW91dERpciApIHsKICAgICAgICBteSBAU3ViTGF5b3V0RmlsZXMgPSAkTWFpbk9iamVjdC0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAgICAgRGlyZWN0b3J5ID0+ICRMYXlvdXREaXIsCiAgICAgICAgICAgIEZpbHRlciAgICA9PiAnKi5wbScsCiAgICAgICAgKTsKCiAgICAgICAgU1VCX0xBWU9VVF9GSUxFOgogICAgICAgIGZvciBteSAkU3ViTGF5b3V0RmlsZSAoQFN1YkxheW91dEZpbGVzKSB7CiAgICAgICAgICAgIG5leHQgU1VCX0xBWU9VVF9GSUxFIGlmICRTdWJMYXlvdXRGaWxlID1+IG0vTGF5b3V0LnBtJC87CgogICAgICAgICAgICBteSAkQ2xhc3NOYW1lRmluYWxQYXJ0ID0gZmlsZXBhcnNlKCAkU3ViTGF5b3V0RmlsZSwgJy5wbScgKTsKICAgICAgICAgICAgbXkgJENsYXNzTmFtZSAgICAgICAgICA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OjokQ2xhc3NOYW1lRmluYWxQYXJ0IjsKICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmVCYXNlQ2xhc3MoJENsYXNzTmFtZSkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+RmF0YWxEaWUoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGxvYWQgY2xhc3MgJENsYXNzTmFtZS4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRTZWxmLT57U2Vzc2lvbklEfSAmJiAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn0gKSB7CiAgICAgICAgJFNlbGYtPntDaGFsbGVuZ2VUb2tlblBhcmFtfSA9ICJDaGFsbGVuZ2VUb2tlbj0kU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn07IjsKICAgIH0KCiAgICAjIGxvYWQgTmF2aWdhdGlvbk1vZHVsZSBpZiBkZWZpbmVkCiAgICBpZiAoICRTZWxmLT57TW9kdWxlUmVnfSApIHsKICAgICAgICBteSAkTmF2aWdhdGlvbk1vZHVsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiRnJvbnRlbmQ6Ok5hdmlnYXRpb25Nb2R1bGUiKTsKICAgICAgICBpZiAoICROYXZpZ2F0aW9uTW9kdWxlLT57ICRQYXJhbXtBY3Rpb259IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TmF2aWdhdGlvbk1vZHVsZX0gPSAkTmF2aWdhdGlvbk1vZHVsZS0+eyAkUGFyYW17QWN0aW9ufSB9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBTZXRFbnYoKQoKQWRkIGFkZGl0aW9uYWwgZGF0YSB0byB0aGUgdGVtcGxhdGUgZW52aXJvbm1lbnQgYmVmb3JlIG91dHB1dCBpcyBnZW5lcmF0ZWQuCgo9Y3V0CgpzdWIgU2V0RW52IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIChxdyhLZXkgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0Vudk5ld1JlZn0tPnsgJFBhcmFte0tleX0gfSA9ICRQYXJhbXtWYWx1ZX07CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBCbG9jaygpCgpjYWxsIGEgYmxvY2sgYW5kIHBhc3MgZGF0YSB0byBpdCAob3B0aW9uYWwpIHRvIGdlbmVyYXRlIHRoZSBibG9jaydzIG91dHB1dC4KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBUaW1lID0+IC4uLiwKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBCbG9jayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTmFtZSEnCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgJFNlbGYtPntCbG9ja0RhdGF9IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3Vicm91dGluZSBPdXRwdXQoKQogICAgIyB3aGljaCBpcyBwcm92aWRlZCBieSB0aGUgYmFzZSBtb2R1bGUgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6VGVtcGxhdGUKICAgICRTZWxmLT57QmxvY2tEYXRhfSAvLz0gW107CiAgICBwdXNoIEB7ICRTZWxmLT57QmxvY2tEYXRhfSB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0RhdGF9LAogICAgICAgIH07CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBKU09ORW5jb2RlKCkKClNlcmlhbGl6ZSBhIFBlcmwgZGF0YSBzdHJ1Y3R1cmUgYXMgSlNPTi4KVGhlIHBhcmFtZXRlcnMgQzxTb3J0S2V5cz4gYW5kIEM8UHJldHR5PiBhcmUgcGFzc2VkIG9uIHRvIHRoZSBtZXRob2QgQzxLZXJuZWw6OlN5c3RlbTo6SlNPTjo6RW5jb2RlKCk+LgoKICAgIG15ICVIYXNoID0gKAogICAgICAgIEtleTEgPT4gJ1NvbWV0aGluZycsCiAgICAgICAgS2V5MiA9PiBbICJGb28iLCAiQmFyIiBdLAogICAgKTsKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICBEYXRhICAgICA9PiBcJUhhc2gsCiAgICAgICAgTm9RdW90ZXMgPT4gMCwgIyBvcHRpb25hbDogMHwxIG5vIGRvdWJsZSBxdW90ZXMgYXQgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIEpTT04gc3RyaW5nLCBkZWZhdWx0IGlzIDAKICAgICAgICBTb3J0S2V5cyA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJEpTT04gPSA8PCdFTkRfSlNPTic7CiAgICB7CiAgICAgICAiS2V5MSIgOiAiU29tZXRoaW5nIiwKICAgICAgICJLZXkyIiA6IFsKICAgICAgICAgICJGb28iLAogICAgICAgICAgIkJhciIKICAgICAgIF0sCiAgICB9CiAgICBFTkRfSlNPTgoKPWN1dAoKc3ViIEpTT05FbmNvZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgZGF0YQogICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRQYXJhbXtEYXRhfTsKCiAgICAjIGdldCBKU09OIGVuY29kZWQgZGF0YQogICAgbXkgJEpTT04gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5FbmNvZGUoCiAgICAgICAgRGF0YSAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgIFNvcnRLZXlzID0+ICRQYXJhbXtTb3J0S2V5c30sCiAgICAgICAgUHJldHR5ICAgPT4gJFBhcmFte1ByZXR0eX0sCiAgICApIHx8ICciIic7CgogICAgIyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgZG91YmxlIHF1b3RlcyBpZiByZXF1ZXN0ZWQKICAgIGlmICggJFBhcmFte05vUXVvdGVzfSApIHsKICAgICAgICAkSlNPTiA9fiBzeyBcQSAiKC4qKSIgXHogfXskMX1zbXg7CiAgICB9CgogICAgcmV0dXJuICRKU09OOwp9Cgo9aGVhZDIgUmVkaXJlY3QoKQoKdGhyb3cgYSBMPEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbj4gdGhhdCB0cmlnZ2VycyBhIHJlZGlyZWN0LiBUaGUgdGFyZ2V0IGZvciB0aGUgcmVkaXJlY3QKY2FuIGJlIGdpdmVuIGVpdGhlciB3aXRoIHRoZSBwYXJhbWV0ZXIgQzxPUD4gb3IgQzxFeHRVUkw+LgoKICAgICMgaW50ZXJuYWwgcmVkaXJlY3RzCiAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICBPUCA9PiAiQWN0aW9uPUFkbWluVXNlckdyb3VwO1N1YmFjdGlvbj1Vc2VyO0lEPSRVc2VySUQiLAogICAgKTsKCiAgICAjIGV4dGVybmFsIHJlZGlyZWN0cwogICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgRXh0VVJMID0+ICJodHRwOi8vc29tZS5leGFtcGxlLmNvbS8iLAogICAgKTsKCkR1cmluZyBsb2dpbiBhY3Rpb24sIEM8TG9naW4gPT4gMT4gc2hvdWxkIGJlIHBhc3NlZCB0byBSZWRpcmVjdCgpLgpUaGlzIGluZGljYXRlcyB0aGF0IGlmIHRoZSBicm93c2VyIGhhcyBjb29raWUgc3VwcG9ydCwgaXQgaXMgT0sKZm9yIHRoZSBzZXNzaW9uIGNvb2tpZSB0byBiZSBub3QgeWV0IHNldC4KCj1jdXQKCnN1YiBSZWRpcmVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgRmlndXJlIG91dCB0byB3aGljaCBVUkwgc2hvdWxkIGJlIHJlZGlyZWN0ZWQKICAgIG15ICRSZWRpcmVjdFVSTDsKICAgIGlmICggJFBhcmFte0V4dFVSTH0gKSB7CiAgICAgICAgJFJlZGlyZWN0VVJMID0gJFBhcmFte0V4dFVSTH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUmVkaXJlY3RVUkwgPSAkU2VsZi0+e0Jhc2VsaW5rfTsgICAgIyB0aGUgZmFsbGJhY2sgd2hlbiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgT1AKCiAgICAgICAgaWYgKCAkUGFyYW17T1B9ICkgewoKICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IGhhemFyZG91cyBjaGFyYWN0ZXJzCiAgICAgICAgICAgIGlmICggJFBhcmFte09QfSA9fiBze1x4MDB9e31zbXhnICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU29tZW9uZSB0cmllcyB0byB1c2UgYSBudWxsIGJ5dGVzIChceDAwKSBjaGFyYWN0ZXIgaW4gcmVkaXJlY3QhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhcmFte09QfSA9fiBze1xyfXt9c214ZyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NvbWVvbmUgdHJpZXMgdG8gdXNlIGEgY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlciBpbiByZWRpcmVjdCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17T1B9ID1+IHN7XG59e31zbXhnICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU29tZW9uZSB0cmllcyB0byB1c2UgYSBuZXdsaW5lIGNoYXJhY3RlciBpbiByZWRpcmVjdCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbnRlcm5hbCByZWRpcmVjdAogICAgICAgICAgICAkUGFyYW17T1B9ID1+IHMvXi4qXD8oLis/KSQvJDEvOwogICAgICAgICAgICAkUmVkaXJlY3RVUkwgLj0gJFBhcmFte09QfTsKICAgICAgICB9CgogICAgICAgICMgdHJpbW1pbmcsIGp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZQogICAgICAgICRSZWRpcmVjdFVSTCA9fiBzL15ccysvLzsKICAgICAgICAkUmVkaXJlY3RVUkwgPX4gcy9ccyskLy87CgogICAgICAgICMgYWRkIHNlc3Npb24gaWQgdG8gdGhlIHJlZGlyZWN0IFVSTCB3aGVuIGFwcHJvcHJpYXRlCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFNlbGYtPntTZXNzaW9uSURDb29raWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZXJlIGluIG5vIHNlc3Npb24gY29va2llIHlldAogICAgICAgICAgICAmJiAhKCAkU2VsZi0+e0Jyb3dzZXJIYXNDb29raWV9ICYmICRQYXJhbXtMb2dpbn0gKSAgICAjIG5vdCB3aGVuIGNvb2tpZSBkb2VzIG5vdCBleGlzdCBiZWNhdXNlIHdlIGluIExvZ2luCiAgICAgICAgICAgICYmICRSZWRpcmVjdFVSTCAhfiBtL2h0dHAvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgPz8/CiAgICAgICAgICAgICYmICRTZWxmLT57U2Vzc2lvbklEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlbiB3ZSBhY3R1YWxseSBoYXZlIGEgc2Vzc2lvbgogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGxvb2sgZm9yIHRoZSBmcmFnbWVudCBwYXJ0IG9mIHRoZSBVUkwsIHRoZSBmcmFnbWVudCBwYXJ0IHN0YXJ0cyB3aXRoIGFuICcjJyBhbmQgaXMgYWx3YXlzIGF0IHRoZSBlbmQgb2YgdGhlIFVSTAogICAgICAgICAgICBteSAoICRUYXJnZXQsICRGcmFnbWVudCApOwogICAgICAgICAgICBpZiAoICRSZWRpcmVjdFVSTCA9fiBtL14oLis/KSMofC4rPykkLyApIHsKICAgICAgICAgICAgICAgICRUYXJnZXQgICA9ICQxOwogICAgICAgICAgICAgICAgJEZyYWdtZW50ID0gIiMkMiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGFyZ2V0ICAgPSAkUmVkaXJlY3RVUkw7CiAgICAgICAgICAgICAgICAkRnJhZ21lbnQgPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaW5kIG91dCBob3cgdG8gY29ycmVjdCBpbmplY3QgdGhlIHNlc3Npb24gaWQgcGFyYW1ldGVyLCBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIHRhcmdldAogICAgICAgICAgICBteSAkSm9pbmVyID0gZXZhbCB7CgogICAgICAgICAgICAgICAgIyBlaXRoZXIgYW4gZW1wdHkgcXVlcnkgcGFydCBvciBhbiBlbXB0eSBmaW5hbCBxdWVyeSBwYXJhbQogICAgICAgICAgICAgICAgcmV0dXJuICcnIGlmICRUYXJnZXQgPX4gbS8oXD98JikkLzsKCiAgICAgICAgICAgICAgICAjIHRoZXJlIGlzIG5vIHF1ZXJ5IHBhcnQgeWV0CiAgICAgICAgICAgICAgICByZXR1cm4gJz8nIGlmICRUYXJnZXQgIX4gbS9cPy87CgogICAgICAgICAgICAgICAgIyBhZGQgcXVlcnkgcGFyYW0gdG8gZXhpc3RpbmcgcXVlcnkgcGFydAogICAgICAgICAgICAgICAgcmV0dXJuICcmJzsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgYWRkIHRoZSBmcmFnbWVudCBwYXJ0IG9mIHRoZSBVUkwgYWdhaW4KICAgICAgICAgICAgJFJlZGlyZWN0VVJMID0gJFRhcmdldCAuICRKb2luZXIgLiAiJFNlbGYtPntTZXNzaW9uTmFtZX09JFNlbGYtPntTZXNzaW9uSUR9IiAuICRGcmFnbWVudDsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYW4gcmVzcG9uc2Ugb2JqZWN0IHdlIGNhbiB3b3JrIHdpdGgKICAgIG15ICRSZWRpcmVjdFJlc3BvbnNlID0gUGxhY2s6OlJlc3BvbnNlLT5uZXcoKTsKICAgICRSZWRpcmVjdFJlc3BvbnNlLT5yZWRpcmVjdCgkUmVkaXJlY3RVUkwpOwoKICAgICMgQWRkIHRoZSBjb29raWVzIHRoYXQgaGFkIGJlZW4gc2V0IGluIHRoZSBjb25zdHJ1Y3Rvci4KICAgICMgVGhlIHZhbHVlcyBvZiAkU2VsZi0+e1NldENvb2tpZXN9IGFyZSBwbGFpbiBoYXNoIHJlZmVyZW5jZXMuCiAgICAjIEZvciBzb21lIHJlYXNvbiB0aGUgbmFtZSBldmVudHVhbGx5IHVzZWQgYnkgQ29va2llOjpCYWtlcjo6YmFrZV9jb29raWUoKSBpcyB0aGUgYXR0cmlidXRlICduYW1lJyBvZiB0aGUgaGFzaHJlZi4KICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgaWYgKAogICAgICAgICRTZWxmLT57U2V0Q29va2llc30KICAgICAgICAmJiByZWYgJFNlbGYtPntTZXRDb29raWVzfSBlcSAnSEFTSCcKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKQogICAgICAgICkKICAgIHsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAkU2VsZi0+e1NldENvb2tpZXN9LT4lKiApIHsKCiAgICAgICAgICAgICMgbWFrZSBhIGNvcHkgYmVjYXVzZSB3ZSBtaWdodCBuZWVkICRTZWxmLT57U2V0Q29va2llc30gbGF0ZXIgb24KICAgICAgICAgICAgbXkgJUluZ3JlZGllbnRzID0gJFNlbGYtPntTZXRDb29raWVzfS0+eyRLZXl9LT4lKjsKICAgICAgICAgICAgbXkgJE5hbWUgICAgICAgID0gZGVsZXRlICRJbmdyZWRpZW50c3tuYW1lfTsKCiAgICAgICAgICAgICMgdGhlIG1ldGhvZCAnY29va2llcycgaXMgaW4gbG93ZXIgY2FzZSBiZWNhdXNlIHdlIHVzZSBQbGFjazo6UmVzcG9uc2UgZGlyZWN0bHkKICAgICAgICAgICAgJFJlZGlyZWN0UmVzcG9uc2UtPmNvb2tpZXMtPnskTmFtZX0gPSBcJUluZ3JlZGllbnRzOwogICAgICAgIH0KICAgIH0KCiAgICAjIFRoZSBleGNlcHRpb24gaXMgY2F1Z2h0IGJlIFBsYWNrOjpNaWRkbGV3YXJlOjpIVFRQRXhjZXB0aW9ucwogICAgZGllIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbi0+bmV3KAogICAgICAgIFBsYWNrUmVzcG9uc2UgPT4gJFJlZGlyZWN0UmVzcG9uc2UKICAgICk7Cn0KCnN1YiBMb2dpbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IEFjdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBsb2FkZXIKICAgICRTZWxmLT57QWN0aW9ufSA9ICdMb2dpbic7CiAgICAkUGFyYW17SXNMb2dpblBhZ2V9ID0gMTsKCiAgICAjIGdldCBzaW5nbGV0b25zCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewoKICAgICAgICAjIGFsd2F5cyBzZXQgYSBjb29raWUsIHNvIHRoYXQgYXQgdGhlIHRpbWUgdGhlIHVzZXIgc3VibWl0cwogICAgICAgICMgdGhlIHBhc3N3b3JkLCB3ZSBrbm93IGFscmVhZHkgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgY29va2llcy4KICAgICAgICAjICggdGhlIHNlc3Npb24gY29va2llIGlzbid0IGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUgKS4KCiAgICAgICAgbXkgJEV4cGlyZXMgPSAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncyc7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKSApIHsKICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICB9CgogICAgICAgICMgc2V0IGEgY29va2llIHRlbnRhdGl2ZWx5IGZvciBjaGVja2luZyBjb29raWUgc3VwcG9ydAogICAgICAgICRTZWxmLT5TZXRDb29raWUoCiAgICAgICAgICAgIEtleSAgICAgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScsCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScsCiAgICAgICAgICAgIFZhbHVlICAgPT4gMSwKICAgICAgICAgICAgRXhwaXJlcyA9PiAkRXhwaXJlcywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG1lc3NhZ2Ugb2YgdGhlIGRheQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nob3dNb3RkJykgKSB7CiAgICAgICAgJFBhcmFte01vdGR9ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdNb3RkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICAgICApOwogICAgfQoKICAgICMgR2VuZXJhdGUgdGhlIG1pbmlmaWVkIENTUyBhbmQgSmF2YVNjcmlwdCBmaWxlcyBhbmQgdGhlIHRhZ3MgcmVmZXJlbmNpbmcgdGhlbSAoc2VlIExheW91dExvYWRlcikKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVBZ2VudENTU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQWdlbnRKU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlSmF2YVNjcmlwdFRyYW5zbGF0aW9uRGF0YSgpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUZW1wbGF0ZURhdGEoKTsKCiAgICAjIHdlIG5lZWQgdGhlIGJhc2VsaW5rIGZvciBWZXJpZmllZEdldCgpIG9mIHNlbGVuaXVtIHRlc3RzCiAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdCYXNlbGluaycsCiAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntCYXNlbGlua30sCiAgICApOwoKICAgICMgQWRkIGhlYWRlciBsb2dvLCBpZiBjb25maWd1cmVkCiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSApIHsKICAgICAgICBteSAlQWdlbnRMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSB9OwogICAgICAgIG15ICVEYXRhOwoKICAgICAgICBmb3IgbXkgJENTU1N0YXRlbWVudCAoIHNvcnQga2V5cyAlQWdlbnRMb2dvICkgewogICAgICAgICAgICBpZiAoICRDU1NTdGF0ZW1lbnQgZXEgJ1VSTCcgKSB7CiAgICAgICAgICAgICAgICBteSAkV2ViUGF0aCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkQWdlbnRMb2dveyRDU1NTdGF0ZW1lbnR9ICF+IC8oaHR0cHxmdHB8aHR0cHMpOlwvL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFdlYlBhdGggPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXsnVVJMJ30gPSAndXJsKCcgLiAkV2ViUGF0aCAuICRBZ2VudExvZ297JENTU1N0YXRlbWVudH0gLiAnKSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF0YXskQ1NTU3RhdGVtZW50fSA9ICRBZ2VudExvZ297JENTU1N0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyTG9nb0NTUycsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgbG9naW4gbG9nbywgaWYgY29uZmlndXJlZAogICAgaWYgKCBkZWZpbmVkICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRMb2dpbkxvZ28nKSApIHsKICAgICAgICBteSAlQWdlbnRMb2dpbkxvZ28gPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FnZW50TG9naW5Mb2dvJykgfTsKICAgICAgICBteSAlRGF0YTsKCiAgICAgICAgZm9yIG15ICRDU1NTdGF0ZW1lbnQgKCBzb3J0IGtleXMgJUFnZW50TG9naW5Mb2dvICkgewogICAgICAgICAgICBpZiAoICRDU1NTdGF0ZW1lbnQgZXEgJ1VSTCcgKSB7CiAgICAgICAgICAgICAgICBteSAkV2ViUGF0aCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkQWdlbnRMb2dpbkxvZ297JENTU1N0YXRlbWVudH0gIX4gLyhodHRwfGZ0cHxodHRwcyk6XC8vaSApIHsKICAgICAgICAgICAgICAgICAgICAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEFnZW50TG9naW5Mb2dveyRDU1NTdGF0ZW1lbnR9IC4gJyknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJERhdGF7JENTU1N0YXRlbWVudH0gPSAkQWdlbnRMb2dpbkxvZ297JENTU1N0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTG9naW5Mb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb2dpbkxvZ28nCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzeXN0ZW0gbWFpbnRlbmFuY2Ugb2JqZWN0CiAgICBteSAkU3lzdGVtTWFpbnRlbmFuY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtTWFpbnRlbmFuY2UnKTsKCiAgICBteSAkQWN0aXZlTWFpbnRlbmFuY2UgPSAkU3lzdGVtTWFpbnRlbmFuY2VPYmplY3QtPlN5c3RlbU1haW50ZW5hbmNlSXNBY3RpdmUoKTsKCiAgICAjIGNoZWNrIGlmIHN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUKICAgIGlmICgkQWN0aXZlTWFpbnRlbmFuY2UpIHsKICAgICAgICBteSAkU3lzdGVtTWFpbnRlbmFuY2VEYXRhID0gJFN5c3RlbU1haW50ZW5hbmNlT2JqZWN0LT5TeXN0ZW1NYWludGVuYW5jZUdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRBY3RpdmVNYWludGVuYW5jZSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU3lzdGVtTWFpbnRlbmFuY2VEYXRhLT57U2hvd0xvZ2luTWVzc2FnZX0gKSB7CgogICAgICAgICAgICBteSAkTG9naW5NZXNzYWdlID0KICAgICAgICAgICAgICAgICRTeXN0ZW1NYWludGVuYW5jZURhdGEtPntMb2dpbk1lc3NhZ2V9CiAgICAgICAgICAgICAgICB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbU1haW50ZW5hbmNlOjpJc0FjdGl2ZURlZmF1bHRMb2dpbk1lc3NhZ2UnKQogICAgICAgICAgICAgICAgfHwgIlN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUsIG5vdCBwb3NzaWJsZSB0byBwZXJmb3JtIGEgbG9naW4hIjsKCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N5c3RlbU1haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExvZ2luTWVzc2FnZSA9PiAkTG9naW5NZXNzYWdlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHByZWxvZ2luIGJsb2NrLCBpZiBpbiBwcmVsb2dpbiBtb2RlIChlLmcuIFNTTyBsb2dpbikKICAgIGlmICggZGVmaW5lZCAkUGFyYW17J01vZGUnfSAmJiAkUGFyYW17J01vZGUnfSBlcSAnUHJlTG9naW4nICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJlTG9naW4nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIG5vdCBpbiBQcmVMb2dpbiBtb2RlLCBzaG93IG5vcm1hbCBsb2dpbiBmb3JtCiAgICBlbHNlIHsKCiAgICAgICAgbXkgJERpc2FibGVMb2dpbkF1dG9jb21wbGV0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRGlzYWJsZUxvZ2luQXV0b2NvbXBsZXRlJyk7CiAgICAgICAgJFBhcmFte1VzZXJOYW1lQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICd1c2VybmFtZSc7CiAgICAgICAgJFBhcmFte1Bhc3N3b3JkQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICdjdXJyZW50LXBhc3N3b3JkJzsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb2dpbkJveCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgMiBmYWN0b3IgcGFzc3dvcmQgaW5wdXQgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYmFja2VuZCBlbmFibGVkCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkF1dGhUd29GYWN0b3JNb2R1bGUkQ291bnQiKTsKCiAgICAgICAgICAgICMgaWYgbm8gZW1wdHkgc2hhcmVkIHNlY3JldHMgYXJlIGFsbG93ZWQsIGlucHV0IGlzIG1hbmRhdG9yeQogICAgICAgICAgICBteSAlTWFuZGF0b3J5T3B0aW9uczsKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCJBdXRoVHdvRmFjdG9yTW9kdWxlJHtDb3VudH06OkFsbG93RW1wdHlTZWNyZXQiKSApIHsKICAgICAgICAgICAgICAgICVNYW5kYXRvcnlPcHRpb25zID0gKAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJ01hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXV0aFR3b0ZhY3RvcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJU1hbmRhdG9yeU9wdGlvbnMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVNYW5kYXRvcnlPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXV0aFR3b0ZhY3Rvck1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxvc3QgcGFzc3dvcmQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnTG9zdFBhc3N3b3JkJykKICAgICAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdBdXRoTW9kdWxlJykgZXEgJ0tlcm5lbDo6U3lzdGVtOjpBdXRoOjpEQicKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9zdFBhc3N3b3JkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb3N0UGFzc3dvcmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnTG9naW5GYWlsZWQnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtMb2dpbkZhaWxlZH0sCiAgICApOwoKICAgICMgZGVmaW5lIGNvbG9yIHNjaGVtZQogICAgbXkgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FnZW50Q29sb3JEZWZpbml0aW9ucycpOwogICAgZm9yIG15ICRDb2xvciAoIHNvcnQga2V5cyAleyRDb2xvckRlZmluaXRpb25zfSApIHsKICAgICAgICAkUGFyYW17Q29sb3JEZWZpbml0aW9uc30gLj0gIi0tY29sJENvbG9yOiRDb2xvckRlZmluaXRpb25zLT57ICRDb2xvciB9OyI7CiAgICB9CgogICAgIyBkZWNsYXJlIGhlYWRlcnMgaW5jbHVkaW5nIHRoZSBYLU9UT0JPLUxvZ2luIGhlYWRlciBmaWVsZAogICAgJFNlbGYtPl9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCgKICAgICAgICBYTG9naW5IZWFkZXIgPT4gMSwKICAgICk7CgogICAgJFBhcmFte0Rpc2FibGVTdGFuZGFyZExvZ2lufSA9ICRTZWxmLT5fSGFzT25seU9JRENBdXRoTW9kdWxlcygpOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdMb2dpbicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgpzdWIgQ2hhbGxlbmdlVG9rZW5DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcmV0dXJuIGlmIGZlYXR1cmUgaXMgZGlzYWJsZWQKICAgIHJldHVybiAxIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Nlc3Npb25DU1JGUHJvdGVjdGlvbicpOwoKICAgICMgZ2V0IGNoYWxsZW5nZSB0b2tlbiBhbmQgY2hlY2sgaXQKICAgIG15ICRDaGFsbGVuZ2VUb2tlbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFsbGVuZ2VUb2tlbicgKSB8fCAnJzsKCiAgICAjIGNoZWNrIHJlZ3VsYXIgQ2hhbGxlbmdlVG9rZW4KICAgIHJldHVybiAxIGlmICRDaGFsbGVuZ2VUb2tlbiBlcSAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn07CgogICAgIyBjaGVjayBDaGFsbGVuZ2VUb2tlbiBvZiBhbGwgb3duIHNlc3Npb25zCiAgICBteSAkU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpOwogICAgbXkgQFNlc3Npb25zICAgICAgPSAkU2Vzc2lvbk9iamVjdC0+R2V0QWxsU2Vzc2lvbklEcygpOwoKICAgIFNFU1NJT046CiAgICBmb3IgbXkgJFNlc3Npb25JRCAoQFNlc3Npb25zKSB7CiAgICAgICAgbXkgJURhdGEgPSAkU2Vzc2lvbk9iamVjdC0+R2V0U2Vzc2lvbklERGF0YSggU2Vzc2lvbklEID0+ICRTZXNzaW9uSUQgKTsKICAgICAgICBuZXh0IFNFU1NJT04gaWYgISREYXRhe1VzZXJJRH07CiAgICAgICAgbmV4dCBTRVNTSU9OIGlmICREYXRhe1VzZXJJRH0gbmUgJFNlbGYtPntVc2VySUR9OwogICAgICAgIG5leHQgU0VTU0lPTiBpZiAhJERhdGF7VXNlckNoYWxsZW5nZVRva2VufTsKCiAgICAgICAgIyBjaGVjayBDaGFsbGVuZ2VUb2tlbgogICAgICAgIHJldHVybiAxIGlmICRDaGFsbGVuZ2VUb2tlbiBlcSAkRGF0YXtVc2VyQ2hhbGxlbmdlVG9rZW59OwogICAgfQoKICAgICMgbm8gdmFsaWQgdG9rZW4gZm91bmQKICAgIGlmICggJFBhcmFte1R5cGV9ICYmIGxjICRQYXJhbXtUeXBlfSBlcSAnY3VzdG9tZXInICkgewogICAgICAgICRTZWxmLT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0ludmFsaWQgQ2hhbGxlbmdlIFRva2VuIScsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICdJbnZhbGlkIENoYWxsZW5nZSBUb2tlbiEnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgRmF0YWxFcnJvcigpCgpMb2cgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHByZXNlbnQgdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGJyb3dzZXIuCgpUaGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYXMgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0aGUgY2xhc3MKQzxLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24+LgoKICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3Qgb3BlbiAkQ29uZmlnRmlsZTogJCEiLAogICAgKTsKCj1jdXQKCnN1YiBGYXRhbEVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBQcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uIGluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCBUZW1wbGF0ZSBlbmdpbmUuCiAgICByZXR1cm4gaWYgJFNlbGYtPntJbkZhdGFsRXJyb3J9Kys7CgogICAgaWYgKCAkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRPdXRwdXQgPSBqb2luICcnLAogICAgICAgICRTZWxmLT5IZWFkZXIoCiAgICAgICAgICAgIEFyZWEgID0+ICdGcm9udGVuZCcsCiAgICAgICAgICAgIFRpdGxlID0+ICdGYXRhbCBFcnJvcicKICAgICAgICApLAogICAgICAgICRTZWxmLT5FcnJvciglUGFyYW0pLAogICAgICAgICRTZWxmLT5Gb290ZXIoKTsKCiAgICAjIE1vZGlmeSB0aGUgb3V0cHV0IGJ5IGFwcGx5aW5nIHRoZSBvdXRwdXQgZmlsdGVycy4KICAgICRPdXRwdXQgPSAkU2VsZi0+QXBwbHlPdXRwdXRGaWx0ZXJzKCBPdXRwdXQgPT4gJE91dHB1dCApOwoKICAgICMgVGhlIENvbnRlbnQtTGVuZ3RoIHdpbGwgYmUgc2V0IGxhdGVyIGluIHRoZSBtaWRkbGV3YXJlIFBsYWNrOjpNaWRkbGV3YXJlOjpDb250ZW50TGVuZ3RoLiBUaGlzIHJlcXVpcmVzIHRoYXQKICAgICMgdGhlcmUgYXJlIG5vIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgZGVsaXZlcmVkIGNvbnRlbnQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgbWlkZGxld2FyZQogICAgIyB1c2VzIGNvcmU6Omxlbmd0aCgpIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudCBsZW5ndGguCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCggXCRPdXRwdXQgKTsKCiAgICAjIFRoZSBPVE9CTyByZXNwb25zZSBvYmplY3QgYWxyZWFkeSBoYXMgdGhlIEhUUFAgaGVhZGVycy4KICAgICMgRW5oYW5jZSBpdCB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFuZCB0aGUgY29udGVudC4KICAgIG15ICRFcnJvclJlc3BvbnNlID0gUGxhY2s6OlJlc3BvbnNlLT5uZXcoCiAgICAgICAgMjAwLAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyktPkhlYWRlcnMoKSwKICAgICAgICAkT3V0cHV0CiAgICApOwoKICAgICMgVGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkhUVFBFeGNlcHRpb25zCiAgICBkaWUgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uLT5uZXcoCiAgICAgICAgUGxhY2tSZXNwb25zZSA9PiAkRXJyb3JSZXNwb25zZQogICAgKTsKfQoKc3ViIFNlY3VyZU1vZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAkU2VsZi0+SGVhZGVyKAogICAgICAgICAgICBBcmVhICA9PiAnRnJvbnRlbmQnLAogICAgICAgICAgICBUaXRsZSA9PiAnU2VjdXJlIE1vZGUnCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VjdXJlTW9kZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+Rm9vdGVyKCk7Cn0KCnN1YiBGYXRhbERpZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBDYWxsZXIgICA9PiAxLAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUGFyYW17TWVzc2FnZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScKICAgICkgfHwgJyc7CiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJFNlbGYtPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFBhcmFte0JhY2tlbmRNZXNzYWdlfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgKTsKICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkUGFyYW17QmFja2VuZE1lc3NhZ2V9OwogICAgfQoKICAgICMgU3RyaW5ncyBhcmUgbm90IGNhdWdodCBieSBQbGFjazo6TWlkZGxld2FyZTo6SFRUUEV4Y2VwdGlvbnMKICAgIGRpZSAkUGFyYW17TWVzc2FnZX07Cn0KCnN1YiBFcnJvclNjcmVlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBqb2luICcnLAogICAgICAgICRTZWxmLT5IZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKSwKICAgICAgICAkU2VsZi0+RXJyb3IoJVBhcmFtKSwKICAgICAgICAkU2VsZi0+Rm9vdGVyKCk7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMKICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgKSB8fCAnJzsKICAgIGlmICggISRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSB8fCAnPycsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgICAgICkgfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0Vycm9yJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKc3ViIFdhcm5pbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdOb3RpY2UnLAogICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkKICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkgfHwgJyc7CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1dhcm5pbmcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9Cgo9aGVhZDIgTm90aWZ5KCkKCmNyZWF0ZXMgaW5mb3JtYXRpb25hbCBub3RpZnkgbGluZXMuIFRoZSB0ZXh0IHdpbGwgYmUgdHJhbnNsYXRlZC4KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgIFByaW9yaXR5ID0+ICdXYXJuaW5nJywKICAgICAgICBJbmZvICAgICA9PiAnU29tZSBJbmZvIE1lc3NhZ2UnLAogICAgKTsKClRoZSBjb250ZW50IG9mIEM8RGF0YT4gd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBsaW5rLiBUaGUgdGV4dCB3aWxsIGJlIHRyYW5zbGF0ZWQuCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBQcmlvcml0eSAgPT4gJ1dhcm5pbmcnLAogICAgICAgIERhdGEgICAgICA9PiAnVGVtcGxhdGUgY29udGVudCcsCiAgICAgICAgTGluayAgICAgID0+ICdodHRwOi8vZXhhbXBsZS5jb20vJywKICAgICAgICBMaW5rQ2xhc3MgPT4gJ3NvbWVfQ1NTX2NsYXNzJywgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7CgpUaGUgY29udGVudCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhbiBlcnJvci4gVGhlIHRleHQgd2lsbCBiZSB0cmFuc2xhdGVkLgoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICBJbmZvICAgICA9PiAnU29tZSBFcnJvciBNZXNzYWdlJywKICAgICk7CgpQcmVzZW50IHRoZSBlcnJvcnMgZnJvbSB0aGUgbG9nIGJhY2tlbmQuIElmIG5vIGVycm9yIGV4aXN0cyB0aGVuIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIHJldHVybmVkCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgKTsKCj1jdXQKCnN1YiBOb3RpZnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIGlmICggISRQYXJhbXtJbmZvfSAmJiAhJFBhcmFte0RhdGF9ICkgewogICAgICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnTm90aWNlJywKICAgICAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICApCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+R2V0TG9nRW50cnkoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgKQogICAgICAgICAgICB8fAogICAgICAgICAgICAnJzsKCiAgICAgICAgJFBhcmFte0luZm99ID0gJFBhcmFte0JhY2tlbmRNZXNzYWdlfTsKCiAgICAgICAgIyByZXR1cm4gaWYgd2UgaGF2ZSBub3RoaW5nIHRvIHNob3cKICAgICAgICByZXR1cm4gJycgaWYgISRQYXJhbXtJbmZvfTsKICAgIH0KCiAgICBteSAkQm94Q2xhc3MgPSAnTm90aWNlJzsKCiAgICBpZiAoICRQYXJhbXtJbmZvfSApIHsKICAgICAgICAkUGFyYW17SW5mb30gPX4gcy9cbi8vZzsKICAgIH0KICAgIGlmICggJFBhcmFte1ByaW9yaXR5fSAmJiAkUGFyYW17UHJpb3JpdHl9IGVxICdFcnJvcicgKSB7CiAgICAgICAgJEJveENsYXNzID0gJ0Vycm9yJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1ByaW9yaXR5fSAmJiAkUGFyYW17UHJpb3JpdHl9IGVxICdTdWNjZXNzJyApIHsKICAgICAgICAkQm94Q2xhc3MgPSAnU3VjY2Vzcyc7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtQcmlvcml0eX0gJiYgJFBhcmFte1ByaW9yaXR5fSBlcSAnSW5mbycgKSB7CiAgICAgICAgJEJveENsYXNzID0gJ0luZm8nOwogICAgfQoKICAgIGlmICggJFBhcmFte0xpbmt9ICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1N0YXJ0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rU3RhcnQgPT4gJFBhcmFte0xpbmt9LAogICAgICAgICAgICAgICAgTGlua0NsYXNzID0+ICRQYXJhbXtMaW5rQ2xhc3N9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtEYXRhfSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17TGlua30gKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rU3RvcCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua1N0b3AgPT4gJzwvYT4nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdOb3RpZnknLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQm94Q2xhc3MgPT4gJEJveENsYXNzLAogICAgICAgIH0sCiAgICApOwp9Cgo9aGVhZDIgTm90aWZ5Tm9uVXBkYXRlZFRpY2tldHMoKQoKQWRkcyBub3RpZmljYXRpb24gYWJvdXQgdGlja2V0cyB3aGljaCBhcmUgbm90IHVwZGF0ZWQuCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeU5vblVwZGF0ZWRUaWNrZXRzKCk7Cgo9Y3V0CgpzdWIgTm90aWZ5Tm9uVXBkYXRlZFRpY2tldHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICA9PiAnTm9uVXBkYXRlZFRpY2tldHNTdHJpbmctJyAuICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmc7CgogICAgIyBEZWxldGUgdGhpcyB2YWx1ZSBmcm9tIHRoZSBjYWNoZS4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnVGlja2V0JywKICAgICAgICBLZXkgID0+ICdOb25VcGRhdGVkVGlja2V0c1N0cmluZy0nIC4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPk5vdGlmeSgKICAgICAgICBJbmZvID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICJUaGUgZm9sbG93aW5nIHRpY2tldHMgYXJlIG5vdCB1cGRhdGVkOiAlcy4iLCAkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmcgKSwKICAgICk7Cgp9Cgo9aGVhZDIgSGVhZGVyKCkKCmdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIHBhZ2UgYmVnaW4gaW4gdGhlIEFnZW50IGludGVyZmFjZS4KQXMgYSBzaWRlIGVmZmVjdCBIVFRQIGhlYWRlcnMgYXJlIGFkZGVkIHRvIHRoZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZSBvYmplY3QuCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU21hbGwnLCAgICMgKG9wdGlvbmFsKSAnJyAoRGVmYXVsdCwgZnVsbCBoZWFkZXIpIG9yICdTbWFsbCcgKGJsYW5rIGhlYWRlcikKICAgICAgICBTaG93VG9vbGJhckl0ZW1zICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBTaG93UHJlZkxpbmsgICAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBTaG93TG9nb3V0QnV0dG9uICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCA9PiAxLCAgICAgICAgICMgKG9wdGlvbmFsLCBkZWZhdWx0IDApIC0gc3VwcHJlc3MgWC1GcmFtZS1PcHRpb25zIGhlYWRlci4KICAgICk7Cgo9Y3V0CgpzdWIgSGVhZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBleHRyYWN0IHBhcmFtcwogICAgbXkgJFR5cGUgPSAkUGFyYW17VHlwZX0gfHwgJyc7CgogICAgIyBjaGVjayBwYXJhbXMKICAgICRQYXJhbXtTaG93VG9vbGJhckl0ZW1zfSAvLz0gMTsKICAgICRQYXJhbXtTaG93UHJlZkxpbmt9ICAgICAvLz0gMTsKICAgICRQYXJhbXtTaG93TG9nb3V0QnV0dG9ufSAvLz0gMTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGRvIG5vdCBzaG93IHByZWZlcmVuY2VzIGxpbmsgaWYgdGhlIHByZWZlcmVuY2VzIG1vZHVsZSBpcyBkaXNhYmxlZAogICAgbXkgJE1vZHVsZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKTsKICAgIGlmICggISRNb2R1bGVzLT57QWdlbnRQcmVmZXJlbmNlc30gKSB7CiAgICAgICAgJFBhcmFte1Nob3dQcmVmTGlua30gPSAwOwogICAgfQoKICAgICMgc2V0IHJ0bCBpZiBuZWVkZWQKICAgIGlmICggJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAmJiAkU2VsZi0+e1RleHREaXJlY3Rpb259IGVxICdydGwnICkgewogICAgICAgICRQYXJhbXtCb2R5Q2xhc3N9ID0gJ1JUTCc7CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkRlYnVnTW9kZScpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVidWdSVExCdXR0b24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUFnZW50Q1NTQ2FsbHMoKTsKCiAgICBteSAlQWdlbnRMb2dvOwoKICAgICMgY2hlY2sgaWYgd2UgbmVlZCB0byBkaXNwbGF5IGEgY3VzdG9tIGxvZ28gZm9yIHRoZSBzZWxlY3RlZCBza2luCiAgICBteSAkQWdlbnRMb2dvQ3VzdG9tID0gJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ29DdXN0b20nKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1NraW5TZWxlY3RlZH0KICAgICAgICAmJiAkQWdlbnRMb2dvQ3VzdG9tCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoJEFnZW50TG9nb0N1c3RvbSkKICAgICAgICAmJiAkQWdlbnRMb2dvQ3VzdG9tLT57ICRTZWxmLT57U2tpblNlbGVjdGVkfSB9CiAgICAgICAgKQogICAgewogICAgICAgICVBZ2VudExvZ28gPSAleyAkQWdlbnRMb2dvQ3VzdG9tLT57ICRTZWxmLT57U2tpblNlbGVjdGVkfSB9IH07CiAgICB9CgogICAgIyBPdGhlcndpc2Ugc2hvdyBkZWZhdWx0IGhlYWRlciBsb2dvLCBpZiBjb25maWd1cmVkCiAgICBlbHNpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSApIHsKICAgICAgICAlQWdlbnRMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSB9OwogICAgfQoKICAgIGlmICggJUFnZW50TG9nbyAmJiBrZXlzICVBZ2VudExvZ28gKSB7CgogICAgICAgIG15ICVEYXRhOwogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICggc29ydCBrZXlzICVBZ2VudExvZ28gKSB7CiAgICAgICAgICAgIGlmICggJENTU1N0YXRlbWVudCBlcSAnVVJMJyApIHsKICAgICAgICAgICAgICAgIG15ICRXZWJQYXRoID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRBZ2VudExvZ297JENTU1N0YXRlbWVudH0gIX4gLyhodHRwfGZ0cHxodHRwcyk6XC8vaSApIHsKICAgICAgICAgICAgICAgICAgICAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkRmlsZSA9ICRQYXJhbXtGaWxlbmFtZX0gfHwgJFNlbGYtPntBY3Rpb259IHx8ICd1bmtub3duJzsKCiAgICAjIHNldCBmaWxlIG5hbWUgZm9yICJzYXZlIHBhZ2UgYXMiCiAgICAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufSA9ICJmaWxlbmFtZT1cIiRGaWxlLmh0bWxcIiI7CgogICAgIyBhcmVhIGFuZCB0aXRsZQogICAgaWYgKCAhJFBhcmFte0FyZWF9ICkgewogICAgICAgICRQYXJhbXtBcmVhfSA9ICgKICAgICAgICAgICAgZGVmaW5lZCAkU2VsZi0+e0FjdGlvbn0KICAgICAgICAgICAgPyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfS0+e05hdkJhck5hbWV9CiAgICAgICAgICAgIDogJycKICAgICAgICApOwogICAgfQogICAgaWYgKCAhJFBhcmFte1RpdGxlfSApIHsKICAgICAgICAkUGFyYW17VGl0bGV9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0tPntUaXRsZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBmb3IgbXkgJFdvcmQgKHF3KFZhbHVlIFRpdGxlIEFyZWEpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JFdvcmR9ICkgewogICAgICAgICAgICAkUGFyYW17VGl0bGVBcmVhfSAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17JFdvcmR9ICkgLiAnIC0gJzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgcnVuIGhlYWRlciBtZXRhIG1vZHVsZXMKICAgIG15ICRIZWFkZXJNZXRhTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6SGVhZGVyTWV0YU1vZHVsZScpOwogICAgaWYgKCByZWYgJEhlYWRlck1ldGFNb2R1bGUgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXskSGVhZGVyTWV0YU1vZHVsZX07CgogICAgICAgIE1PRFVMRToKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBhbmQgcnVuIG1vZHVsZQogICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRPYmplY3Q7CiAgICAgICAgICAgICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gdG9vbCBiYXIgaXRlbSBtb2R1bGVzCiAgICBpZiAoICRTZWxmLT57VXNlcklEfSAmJiAoICRTZWxmLT57VXNlclR5cGV9IC8vICcnICkgZXEgJ1VzZXInICkgewogICAgICAgIG15ICRUb29sQmFyTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6VG9vbEJhck1vZHVsZScpOwogICAgICAgIGlmICggJFBhcmFte1Nob3dUb29sYmFySXRlbXN9ICYmIHJlZiAkVG9vbEJhck1vZHVsZSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb29sQmFyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICVNb2R1bGVzOwogICAgICAgICAgICBteSAlSm9icyA9ICV7JFRvb2xCYXJNb2R1bGV9OwoKICAgICAgICAgICAgIyBnZXQgZ3JvdXAgb2JqZWN0CiAgICAgICAgICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgICAgICAgICAgTU9EVUxFOgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgYW5kIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sICAgICMgVXNlcklEIGV0Yy4KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJE9iamVjdDsKCiAgICAgICAgICAgICAgICBteSAkVG9vbEJhckFjY2Vzc09rOwoKICAgICAgICAgICAgICAgICMgaWYgZ3JvdXAgcmVzdHJpY3Rpb24gZm9yIHRvb2wtYmFyIGlzIHNldCwgY2hlY2sgdXNlciBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57R3JvdXB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB3aGl0ZS1zcGFjZXMKICAgICAgICAgICAgICAgICAgICAkSm9ic3skSm9ifS0+e0dyb3VwfSA9fiBze1xzfXt9eG1zZzsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgZ3JvdXAgY29uZmlndXJhdGlvbnMKICAgICAgICAgICAgICAgICAgICBteSBASXRlbXMgPSBzcGxpdCAvOy8sICRKb2JzeyRKb2J9LT57R3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBJVEVNOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQEl0ZW1zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNwbGl0IHZhbHVlcyBpbnRvIHBlcm1pc3Npb24gYW5kIGdyb3VwCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICggJFBlcm1pc3Npb24sICRHcm91cE5hbWUgKSA9IHNwbGl0IC86LywgJEl0ZW07CgogICAgICAgICAgICAgICAgICAgICAgICAjIGxvZyBhbiBlcnJvciBpZiBub3QgdmFsaWQgc2V0dGluZwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGVybWlzc2lvbiB8fCAhJEdyb3VwTmFtZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgY29uZmlnIGZvciBUb29sQmFyTW9kdWxlICRKb2IgLSBLZXkgR3JvdXA6ICckSXRlbSchICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiTmVlZCBzb21ldGhpbmcgbGlrZSAnUGVybWlzc2lvbjpHcm91cDsnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IGdyb3VwcyBmb3IgY3VycmVudCB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAkUGVybWlzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbmV4dCBqb2IgaWYgdXNlciBoYXZlIG5vdCBncm91cHMKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBJVEVNIGlmICElR3JvdXBzOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB1c2VyIGJlbG9uZ3MgdG8gdGhlIGNvcnJlY3QgZ3JvdXAKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgPSByZXZlcnNlICVHcm91cHM7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTSBpZiAhJEdyb3Vwc1JldmVyc2V7JEdyb3VwTmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICAkVG9vbEJhckFjY2Vzc09rID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgSVRFTTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgZ28gdG8gdGhlIG5leHQgbW9kdWxlIGlmIG5vdCBwZXJtaXNzaW9ucwogICAgICAgICAgICAgICAgICAgICMgZm9yIHRoZSBjdXJyZW50IG9uZQogICAgICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkVG9vbEJhckFjY2Vzc09rOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVNb2R1bGVzID0gKCAkT2JqZWN0LT5SdW4oICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksICVNb2R1bGVzICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUm90aGVyIE9TUyBUT0RPOiBOb3Qgc28gbmljZSBpbXBsZW1lbnRlZCwgcmV2aWV3CgogICAgICAgICAgICBteSAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTaG9ydGN1dCAgPSAwOwogICAgICAgICAgICBteSAkVG9vbEJhckl0ZW1TZXBhcmF0b3JNeVRpY2tldHMgPSAwOwogICAgICAgICAgICBteSAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTZWFyY2ggICAgPSAwOwoKICAgICAgICAgICAgIyBDaGVjayB3aGljaCBzZXBhcmF0b3IgaXMgbmVlZGVkCiAgICAgICAgICAgIFNIT1JUQ1VUQVZBSUxJQkxFOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTW9kdWxlcyApIHsKICAgICAgICAgICAgICAgIG5leHQgU0hPUlRDVVRBVkFJTElCTEUgaWYgISV7ICRNb2R1bGVzeyRLZXl9IH07CgogICAgICAgICAgICAgICAgaWYgKCAkTW9kdWxlc3skS2V5fXtCbG9ja30gZXEgJ1Rvb2xCYXJJdGVtJyApIHsKICAgICAgICAgICAgICAgICAgICAkVG9vbEJhckl0ZW1TZXBhcmF0b3JNeVRpY2tldHMgPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgU0hPUlRDVVRBVkFJTElCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRNb2R1bGVzeyRLZXl9e0Jsb2NrfSBlcSAnVG9vbEJhckl0ZW1TaG9ydGN1dCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJFRvb2xCYXJJdGVtU2VwYXJhdG9yU2hvcnRjdXQgPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgU0hPUlRDVVRBVkFJTElCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRNb2R1bGVzeyRLZXl9e0Jsb2NrfSA9fiBtL1Rvb2xCYXJTZWFyY2guKi8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRvb2xCYXJJdGVtU2VwYXJhdG9yU2VhcmNoID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFNIT1JUQ1VUQVZBSUxJQkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNob3cgc2VwYXJhdG9yIGJldHdlZW4gc2hvcnRjdXRzIGFuZCBteSB0aWNrZXRzCiAgICAgICAgICAgIGlmICggJFRvb2xCYXJJdGVtU2VwYXJhdG9yU2hvcnRjdXQgPT0gMSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJUb29sQmFySXRlbVNlcGFyYXRvclNob3J0Y3V0IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyB0b29sIGJhciBzaG9ydGN1dCBpdGVtcwogICAgICAgICAgICBNT0RVTEVTSE9SVENVVDoKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJU1vZHVsZXMgKSB7CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRVNIT1JUQ1VUIGlmICEleyAkTW9kdWxlc3skS2V5fSB9OwogICAgICAgICAgICAgICAgbmV4dCBNT0RVTEVTSE9SVENVVCBpZiAkTW9kdWxlc3skS2V5fXtCbG9ja30gbmUgJ1Rvb2xCYXJJdGVtU2hvcnRjdXQnOwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRNb2R1bGVzeyRLZXl9LT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkTW9kdWxlc3skS2V5fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLZXlSZWZlcmVuY2UgPT4gJE1vZHVsZXN7JEtleX0tPntBY2Nlc3NLZXl9CiAgICAgICAgICAgICAgICAgICAgICAgID8gIiAoJE1vZHVsZXN7JEtleX0tPntBY2Nlc3NLZXl9KSIKICAgICAgICAgICAgICAgICAgICAgICAgOiAnJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBzaG9ydGN1dCBuZWVkZWQKICAgICAgICAgICAgaWYgKCAkVG9vbEJhckl0ZW1TZXBhcmF0b3JNeVRpY2tldHMgPT0gMSApIHsKCiAgICAgICAgICAgICAgICAjIFNob3cgc2VwYXJhdG9yIGJldHdlZW4gc2hvcnRjdXRzIGFuZCBteSB0aWNrZXRzCiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiVG9vbEJhckl0ZW1TZXBhcmF0b3JNeVRpY2tldHMiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IHRvb2wgYmFyIGl0ZW1zCiAgICAgICAgICAgIE1PRFVMRToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJU1vZHVsZXMgKSB7CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJXsgJE1vZHVsZXN7JEtleX0gfTsKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICRNb2R1bGVzeyRLZXl9e0Jsb2NrfSBlcSAnVG9vbEJhckl0ZW1TaG9ydGN1dCc7CgogICAgICAgICAgICAgICAgIyBGb3IgVG9vbEJhclNlYXJjaEZ1bGx0ZXh0IG1vZHVsZSB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBTZWFyY2hJbkFyY2hpdmUgc2V0dGluZ3MuCiAgICAgICAgICAgICAgICAjIFNlZSBidWcjMTM3OTAgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3OTApLgogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6QXJjaGl2ZVN5c3RlbScpICYmICRNb2R1bGVzeyRLZXl9LT57QmxvY2t9IGVxICdUb29sQmFyU2VhcmNoRnVsbHRleHQnICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTW9kdWxlc3skS2V5fS0+e1NlYXJjaEluQXJjaGl2ZX0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0U2VhcmNoJyktPntEZWZhdWx0c30tPntTZWFyY2hJbkFyY2hpdmV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRNb2R1bGVzeyRLZXl9LT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkTW9kdWxlc3skS2V5fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLZXlSZWZlcmVuY2UgPT4gJE1vZHVsZXN7JEtleX0tPntBY2Nlc3NLZXl9CiAgICAgICAgICAgICAgICAgICAgICAgID8gIiAoJE1vZHVsZXN7JEtleX0tPntBY2Nlc3NLZXl9KSIKICAgICAgICAgICAgICAgICAgICAgICAgOiAnJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBzaG9ydGN1dCBuZWVkZWQKICAgICAgICAgICAgaWYgKCAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTZWFyY2ggPT0gMSApIHsKCiAgICAgICAgICAgICAgICAjIFNob3cgc2VwYXJhdG9yIGJldHdlZW4gc2hvcnRjdXRzIGFuZCBteSB0aWNrZXRzCiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiVG9vbEJhckl0ZW1TZXBhcmF0b3JTZWFyY2giLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNoYXQnLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdDaGF0RW5naW5lOjpBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgYXZhdGFyCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpBdmF0YXJFbmdpbmUnKSBlcSAnR3JhdmF0YXInICYmICRTZWxmLT57VXNlckVtYWlsfSApIHsKICAgICAgICAgICAgbXkgJERlZmF1bHRJY29uID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6R3JhdmF0YXI6OkRlZmF1bHRJbWFnZScpIHx8ICdtcCc7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJFNlbGYtPntVc2VyRW1haWx9ICk7CiAgICAgICAgICAgICRQYXJhbXtBdmF0YXJ9ID0gJy8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvJyAuIG1kNV9oZXgoIGxjICRTZWxmLT57VXNlckVtYWlsfSApIC4gJz9zPTEwMCZkPScgLiAkRGVmYXVsdEljb247CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlciAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBOb091dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17VXNlckluaXRpYWxzfSA9ICRTZWxmLT5Vc2VySW5pdGlhbHNHZXQoIEZ1bGxuYW1lID0+ICRVc2Vye1VzZXJGdWxsbmFtZX0gKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBsb2dnZWQgaW4gbm90aWNlCiAgICAgICAgaWYgKCAkUGFyYW17U2hvd1ByZWZMaW5rfSApIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9naW5XaXRob3V0TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgbG9nb3V0IGJ1dHRvbiAoaWYgcmVnaXN0ZXJlZCkKICAgICAgICBpZiAoCiAgICAgICAgICAgICRQYXJhbXtTaG93TG9nb3V0QnV0dG9ufQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0xvZ291dH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9nb3V0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPl9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCgKICAgICAgICBDb250ZW50RGlzcG9zaXRpb24gICAgICAgICAgICA9PiAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufSwKICAgICAgICBEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCA9PiAkUGFyYW17RGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWR9LAogICAgKTsKCiAgICAjIExvYWQgY29sb3JzIGJhc2VkIG9uIFNraW4gc2VsZWN0aW9uCiAgICAkU2VsZi0+e1NraW5TZWxlY3RlZH0gfHw9ICdkZWZhdWx0JzsKCiAgICBteSAkQ29sb3JEZWZpbml0aW9uczsKICAgIGlmICggJFNlbGYtPntTa2luU2VsZWN0ZWR9ICYmICRTZWxmLT57U2tpblNlbGVjdGVkfSBuZSAnZGVmYXVsdCcgKSB7CiAgICAgICAgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlNraW5Db2xvckRlZmluaXRpb246OiRTZWxmLT57U2tpblNlbGVjdGVkfSIpIC8vICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRDb2xvckRlZmluaXRpb25zJyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ29sb3JEZWZpbml0aW9ucyA9ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRDb2xvckRlZmluaXRpb25zJyk7CiAgICB9CgogICAgZm9yIG15ICRDb2xvciAoIHNvcnQga2V5cyAleyRDb2xvckRlZmluaXRpb25zfSApIHsKICAgICAgICAkUGFyYW17Q29sb3JEZWZpbml0aW9uc30gLj0gIi0tY29sJENvbG9yOiRDb2xvckRlZmluaXRpb25zLT57ICRDb2xvciB9OyI7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gIkhlYWRlciRUeXBlIiwKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCgpCgpiYXNpY2FsbHkgdGhlIHNhbWUgdGhpbmcgYXMgZXhlY3V0aW5nIHRoZSBmb3JtZXJseSB1c2VkIHRlbXBsYXRlIEhUVFBIZWFkZXJzLnR0CgogICAgbXkgJFN1Y2Nlc3MgPSAkTGF5b3V0T2JqZWN0LT5fQWRkSGVhZGVyc1RvUmVzcG9uc2VPYmplY3QoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtcywKICAgICk7CgpUaGUgY29va2llcyBhcmUgYWxzbyBhZGRlZCBoZXJlLgpUaGUgcHJldmlvdXNseSBzZXQgaGVhZGVycyBhcmUgZGlzY2FyZGVkLgoKPWN1dAoKc3ViIF9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGhlcmUgYXJlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMKCiAgICAjIGZpcnN0IHRoZSB1bmNvbmRpdGlvbmFsIGhlYWRlcnMKICAgIG15ICVIZWFkZXJzID0gKAogICAgICAgICdDb250ZW50LVR5cGUnICA9PiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAnRXhwaXJlcycgICAgICAgPT4gJ1R1ZSwgMSBKYW4gMTk4MCAxMjowMDowMCBHTVQnLAogICAgICAgICdDYWNoZS1Db250cm9sJyA9PiAnbm8tY2FjaGUnLAogICAgICAgICdQcmFnbWEnICAgICAgICA9PiAnbm8tY2FjaGUnLAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtDb250ZW50RGlzcG9zaXRpb259ICkgewogICAgICAgICRIZWFkZXJzeydDb250ZW50LURpc3Bvc2l0aW9uJ30gPSAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnU2VjdXJlOjpEaXNhYmxlQmFubmVyJykgKSB7CiAgICAgICAgJEhlYWRlcnN7J1gtUG93ZXJlZC1CeSd9ID0gam9pbiAnICcsICRDb25maWdPYmplY3QtPkdldCgnUHJvZHVjdCcpLCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1ZlcnNpb24nKSwgJyhodHRwczovL290b2JvLmlvLyknOwogICAgfQoKICAgIGlmICgKICAgICAgICAhJENvbmZpZ09iamVjdC0+R2V0KCdEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCcpCiAgICAgICAgJiYgISRQYXJhbXtEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZH0KICAgICAgICApCiAgICB7CiAgICAgICAgJEhlYWRlcnN7J1gtRnJhbWUtT3B0aW9ucyd9ID0gJ1NBTUVPUklHSU4nOwogICAgfQoKICAgICMgV2l0aCB0aGlzIFgtSGVhZGVyLCBDb3JlLkFKQVggY2FuIHJlY29nbml6ZSB0aGF0IHRoZSBBSkFYIHJlcXVlc3QgcmV0dXJuZWQgdGhlIGxvZ2luIHBhZ2UgKHNlc3Npb24gdGltZW91dCkgYW5kIHBlcmZvcm0gYSByZWRpcmVjdC4KICAgIGlmICggJFBhcmFte1hMb2dpbkhlYWRlcn0gKSB7CiAgICAgICAgJEhlYWRlcnN7J1gtT1RPQk8tTG9naW4nfSA9ICRTZWxmLT57QmFzZWxpbmt9OwogICAgfQoKICAgIG15ICRSZXNwb25zZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyk7CiAgICAkUmVzcG9uc2VPYmplY3QtPkhlYWRlcnMoIFslSGVhZGVyc10gKTsKCiAgICAjIEFkZCB0aGUgY29va2llcyB0aGF0IGhhZCBiZWVuIHNldCBpbiB0aGUgY29uc3RydWN0b3IuCiAgICAjIFRoZSB2YWx1ZXMgb2YgJFNlbGYtPntTZXRDb29raWVzfSBhcmUgcGxhaW4gaGFzaCByZWZlcmVuY2VzLgogICAgIyBGb3Igc29tZSByZWFzb24gdGhlIG5hbWUgZXZlbnR1YWxseSB1c2VkIGJ5IENvb2tpZTo6QmFrZXI6OmJha2VfY29va2llKCkgaXMgdGhlIGF0dHJpYnV0ZSAnbmFtZScgb2YgdGhlIGhhc2hyZWYuCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntTZXRDb29raWVzfQogICAgICAgICYmIHJlZiAkU2VsZi0+e1NldENvb2tpZXN9IGVxICdIQVNIJwogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpCiAgICAgICAgKQogICAgewogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICRTZWxmLT57U2V0Q29va2llc30tPiUqICkgewoKICAgICAgICAgICAgIyBtYWtlIGEgY29weSBiZWNhdXNlIHdlIG1pZ2h0IG5lZWQgJFNlbGYtPntTZXRDb29raWVzfSBsYXRlciBvbgogICAgICAgICAgICBteSAlSW5ncmVkaWVudHMgPSAkU2VsZi0+e1NldENvb2tpZXN9LT57JEtleX0tPiUqOwogICAgICAgICAgICBteSAkTmFtZSAgICAgICAgPSBkZWxldGUgJEluZ3JlZGllbnRze25hbWV9OwogICAgICAgICAgICAkUmVzcG9uc2VPYmplY3QtPkNvb2tpZXMtPnskTmFtZX0gPSBcJUluZ3JlZGllbnRzOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWVuZCBJbnRlcm5hbDoKCj1oZWFkMiBGb290ZXIoKQoKZ2VuZXJhdGVzIHRoZSBIVE1MIGZvciB0aGUgcGFnZSBlbmQgaW4gdGhlIEFnZW50IGludGVyZmFjZS4KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7Cgo9Y3V0CgpzdWIgRm9vdGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFR5cGUgICAgICAgICAgPSAkUGFyYW17VHlwZX0gICAgICAgICAgIHx8ICcnOwogICAgbXkgJEhhc0RhdGVwaWNrZXIgPSAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9IHx8IDA7CgogICAgIyBnZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUFnZW50SlNDYWxscygpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUcmFuc2xhdGlvbkRhdGEoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVKYXZhU2NyaXB0VGVtcGxhdGVEYXRhKCk7CgogICAgIyBnZXQgZGF0ZXBpY2tlciBkYXRhLCBpZiBuZWVkZWQgaW4gbW9kdWxlCiAgICBpZiAoJEhhc0RhdGVwaWNrZXIpIHsKICAgICAgICBteSAkVmFjYXRpb25EYXlzICA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCk7CiAgICAgICAgbXkgJFRleHREaXJlY3Rpb24gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259IHx8ICcnOwoKICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdEYXRlcGlja2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzID0+ICRWYWNhdGlvbkRheXMsCiAgICAgICAgICAgICAgICBJc1JUTCAgICAgICAgPT4gKCAkVGV4dERpcmVjdGlvbiBlcSAncnRsJyApID8gMSA6IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUyBpZiBOZXdUaWNrZXRJbk5ld1dpbmRvdyBpcyBlbmFibGVkCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnTmV3VGlja2V0SW5OZXdXaW5kb3c6OkVuYWJsZWQnKSApIHsKICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnTmV3VGlja2V0SW5OZXdXaW5kb3cnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBBdXRvQ29tcGxldGUtQ29uZmlnCiAgICBteSAkQXV0b2NvbXBsZXRlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvQ29tcGxldGU6OkFnZW50Jyk7CgogICAgZm9yIG15ICRDb25maWdFbGVtZW50ICggc29ydCBrZXlzICV7JEF1dG9jb21wbGV0ZUNvbmZpZ30gKSB7CiAgICAgICAgJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fS0+e0J1dHRvblRleHR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fS0+e0J1dHRvblRleHR9ICk7CiAgICB9CgogICAgIyBTZWFyY2ggZnJvbnRlbmQgKEphdmFTY3JpcHQpCiAgICBteSAkU2VhcmNoRnJvbnRlbmRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpTZWFyY2g6OkphdmFTY3JpcHQnKTsKCiAgICAjIGdldCB0YXJnZXQgamF2YXNjcmlwdCBmdW5jdGlvbgogICAgbXkgJEpTQ2FsbCA9ICcnOwoKICAgIGlmICggJFNlYXJjaEZyb250ZW5kQ29uZmlnICYmICRTZWxmLT57QWN0aW9ufSApIHsKICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICV7JFNlYXJjaEZyb250ZW5kQ29uZmlnfSApIHsKICAgICAgICAgICAgUkVHRVhQOgogICAgICAgICAgICBmb3IgbXkgJFJlZ0V4cCAoIHNvcnQga2V5cyAleyAkU2VhcmNoRnJvbnRlbmRDb25maWctPnskR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57QWN0aW9ufSA9fiAvJFJlZ0V4cC8gKSB7CiAgICAgICAgICAgICAgICAgICAgJEpTQ2FsbCA9ICRTZWFyY2hGcm9udGVuZENvbmZpZy0+eyRHcm91cH0tPnskUmVnRXhwfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IFJFR0VYUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIENoZWNrIGlmIHZpZGVvIGNoYXQgaXMgZW5hYmxlZC4KICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICRQYXJhbXtWaWRlb0NoYXRFbmFibGVkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnKS0+SXNFbmFibGVkKCkKICAgICAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VuaXRUZXN0TW9kZScgKSAvLyAwOwogICAgfQoKICAgICMgU2V0IGFuIGFycmF5IHdpdGggcGVuZGluZyBzdGF0ZXMuIFNraXAgZm9yIGluc3RhbGxlciBhbmQgbWlncmF0aW9uIHNjcmlwdC4KICAgIG15IEBQZW5kaW5nU3RhdGVJRHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NlY3VyZU1vZGUnKQogICAgICAgID8gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0U3RhdGVzQnlUeXBlKAogICAgICAgICAgICBTdGF0ZVR5cGUgPT4gWyAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgICAgIFJlc3VsdCAgICA9PiAnSUQnLAogICAgICAgICkKICAgICAgICA6ICgpOwoKICAgIG15ICRXZWJQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwoKICAgICMgTG9hZCByaWNoIHRleHQgbGlicmFyaWVzIG9ubHkgd2hlbiBhIFJURSBoYXMgYmVlbiBzZXQgdXAKICAgIGlmICggJFNlbGYtPntIYXNSaWNoVGV4dEVkaXRvcn0gKSB7CgogICAgICAgIG15ICRKU0RpcmVjdG9yeVBhdGggPSAkV2ViUGF0aCAuICdqcy8nOwoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0SlMnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEpTRGlyZWN0b3J5ICAgICAgICAgPT4gJEpTRGlyZWN0b3J5UGF0aCwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgICAgICAgICAgPT4gJ2NrZWRpdG9yNS5qcycsCiAgICAgICAgICAgICAgICBXcmFwcGVyRmlsZU5hbWUgICAgID0+ICdDb3JlLlVJLkNLRWRpdG9yNVdyYXBwZXIuanMnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb25GaWxlbmFtZSA9PiAkU2VsZi0+X0dldFJpY2hUZXh0VHJhbnNsYXRpb25QYXRoKCksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCBKUyBkYXRhCiAgICBteSAlSlNDb25maWcgPSAoCiAgICAgICAgQmFzZWxpbmsgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QmFzZWxpbmt9LAogICAgICAgIENHSUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NHSUhhbmRsZX0sCiAgICAgICAgV2ViUGF0aCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRXZWJQYXRoLAogICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgU3ViYWN0aW9uICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57U3ViYWN0aW9ufSwKICAgICAgICBTZXNzaW9uSURDb29raWUgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntTZXNzaW9uSURDb29raWV9LAogICAgICAgIFNlc3Npb25OYW1lICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25OYW1lfSwKICAgICAgICBTZXNzaW9uSUQgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIFNlc3Npb25Vc2VDb29raWUgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSwKICAgICAgICBDaGFsbGVuZ2VUb2tlbiAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VyQ2hhbGxlbmdlVG9rZW59LAogICAgICAgIEN1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZSAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpLAogICAgICAgIFVzZXJMYW5ndWFnZSAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgV2ViTWF4RmlsZVVwbG9hZCAgICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnV2ViTWF4RmlsZVVwbG9hZCcpLAogICAgICAgIFJpY2hUZXh0U2V0ICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpLAogICAgICAgIENoZWNrRW1haWxBZGRyZXNzZXMgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSwKICAgICAgICBNZW51RHJhZ0Ryb3BFbmFibGVkICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TWVudURyYWdEcm9wRW5hYmxlZCcpLAogICAgICAgIE9wZW5NYWluTWVudU9uSG92ZXIgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ09wZW5NYWluTWVudU9uSG92ZXInKSwKICAgICAgICBDdXN0b21lckluZm9TZXQgICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJyksCiAgICAgICAgSW5jbHVkZVVua25vd25UaWNrZXRDdXN0b21lcnMgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpJbmNsdWRlVW5rbm93blRpY2tldEN1c3RvbWVycycpLAogICAgICAgIElucHV0RmllbGRzQWN0aXZhdGVkICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ01vZGVybml6ZUZvcm1GaWVsZHMnKSwKICAgICAgICBWaWRlb0NoYXRFbmFibGVkICAgICAgICAgICAgICAgPT4gJFBhcmFte1ZpZGVvQ2hhdEVuYWJsZWR9LAogICAgICAgIFBlbmRpbmdTdGF0ZUlEcyAgICAgICAgICAgICAgICA9PiBcQFBlbmRpbmdTdGF0ZUlEcywKICAgICAgICBDaGVja1NlYXJjaFN0cmluZ3NGb3JTdG9wV29yZHMgPT4gKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VhcmNoSW5kZXg6Oldhcm5PblN0b3BXb3JkVXNhZ2UnKQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VhcmNoSW5kZXhNb2R1bGUnKQogICAgICAgICAgICAgICAgICAgIGVxICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlU2VhcmNoSW5kZXg6OkRCJwogICAgICAgICAgICAgICAgKQogICAgICAgICkgPyAxIDogMCwKICAgICAgICBTZWFyY2hGcm9udGVuZCA9PiAkSlNDYWxsLAogICAgICAgIEF1dG9jb21wbGV0ZSAgID0+ICRBdXRvY29tcGxldGVDb25maWcsCiAgICApOwoKICAgIGZvciBteSAkQ29uZmlnICggc29ydCBrZXlzICVKU0NvbmZpZyApIHsKICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSA9PiAkSlNDb25maWd7JENvbmZpZ30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAiRm9vdGVyJFR5cGUiLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgQXBwbHlPdXRwdXRGaWx0ZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBUaGUgcGFyYW0gT3V0cHV0IG1heSBiZSBhbnl0aGluZyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gUGxhY2s6OlJlc3BvbnNlOjpib2R5KCkuCiAgICBteSAkT3V0cHV0ID0gJFBhcmFte091dHB1dH07CgogICAgIyBSZXR1cm4gZWFybHkgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgogICAgIyBUaGlzIHNob3VsZCBiZSBjaGVhcCwgYXMgUGVybCBoYXMgY29weSBvbiB3cml0ZS4KICAgIHJldHVybiAkT3V0cHV0IHVubGVzcyAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9OwogICAgcmV0dXJuICRPdXRwdXQgdW5sZXNzIHJlZiAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9IGVxICdIQVNIJzsKCiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBhcHBseSB0aGUgZmlsdGVycywgZXhwbGljaXRseSB0cmFjayB3aGV0aGVyIHRoZXJlIGFjdHVhbGx5IHdhcyBhIG1vZGlmaWNhdGlvbgogICAgbXkgJUZpbHRlckxpc3QgPSAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9LT4lKjsKICAgIG15ICggJE51bUFwcGxpZWRGaWx0ZXJzLCAkTW9kaWZpZWRPdXRwdXQgKSA9ICggMCwgJycgKTsKICAgIEZJTFRFUjoKICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJMaXN0ICkgewoKICAgICAgICAjIGV4dHJhY3QgZmlsdGVyIGNvbmZpZwogICAgICAgIG15ICRGaWx0ZXJDb25maWcgPSAkRmlsdGVyTGlzdHskRmlsdGVyfTsKCiAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzICRGaWx0ZXJDb25maWc7CiAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzIHJlZiAkRmlsdGVyQ29uZmlnIGVxICdIQVNIJzsKCiAgICAgICAgIyBleHRyYWN0IHRlbXBsYXRlIGxpc3QKICAgICAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEZpbHRlckNvbmZpZy0+e1RlbXBsYXRlc307CgogICAgICAgICMgY2hlY2sgdGVtcGxhdGUgbGlzdAogICAgICAgIGlmICggISRUZW1wbGF0ZUxpc3QgfHwgcmVmICRUZW1wbGF0ZUxpc3QgbmUgJ0hBU0gnIHx8ICEkVGVtcGxhdGVMaXN0LT4lKiApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBhZGQgYSB0ZW1wbGF0ZSBsaXN0IHRvIG91dHB1dCBmaWx0ZXIgJEZpbHRlckNvbmZpZy0+e01vZHVsZX0gIgogICAgICAgICAgICAgICAgICAgIC4gInRvIGltcHJvdmUgcGVyZm9ybWFuY2UuIFVzZSBBTEwgaWYgT3V0cHV0RmlsdGVyIHNob3VsZCBtb2RpZnkgYWxsICIKICAgICAgICAgICAgICAgICAgICAuICJ0ZW1wbGF0ZXMgb2YgdGhlIHN5c3RlbSAoZGVwcmVjYXRlZCkuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGVtcGxhdGUgbGlzdAogICAgICAgIGlmICggJFBhcmFte1RlbXBsYXRlRmlsZX0gJiYgcmVmICRUZW1wbGF0ZUxpc3QgZXEgJ0hBU0gnICYmICEkVGVtcGxhdGVMaXN0LT57QUxMfSApIHsKICAgICAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzICRUZW1wbGF0ZUxpc3QtPnsgJFBhcmFte1RlbXBsYXRlRmlsZX0gfTsKICAgICAgICB9CgogICAgICAgIG5leHQgRklMVEVSIHVubGVzcyAkTWFpbk9iamVjdC0+UmVxdWlyZSggJEZpbHRlckNvbmZpZy0+e01vZHVsZX0gKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICAgICAgbXkgJE9iamVjdCA9ICRGaWx0ZXJDb25maWctPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzICRPYmplY3Q7CgogICAgICAgICMgVGhlIG91dHB1dCBmaWx0ZXJzIG9wZXJhdGUgb24gc3RyaW5ncy4KICAgICAgICAjIExhemlseSBnZW5lcmF0ZSB0aGUgc3RyaW5nIG9ubHkgd2hlbiBpdCBpcyBuZWVkZWQgZm9yIHRoZSBmaXJzdCBmaWx0ZXIuCiAgICAgICAgaWYgKCAhJE51bUFwcGxpZWRGaWx0ZXJzICkgewoKICAgICAgICAgICAgIyBVc2luZyBQbGFjazo6VXRpbDo6Zm9yZWFjaCgpIGluIG9yZGVyIHRvIGNvdmVyIGFsbCBjYXNlcywgZS5nLiB3aGVuICRPdXRwdXQgaXMgYSBmaWxlIGhhbmRsZS4KICAgICAgICAgICAgIyBUaGUgbG9naWMgaXMgaW5zcGlyZWQgYnkgUGxhY2s6OlJlc3BvbnNlOjpfYm9keSgpLgogICAgICAgICAgICBteSAkUFNHSUJvZHk7CiAgICAgICAgICAgIGlmICggIXJlZiAkT3V0cHV0ICkgewogICAgICAgICAgICAgICAgJFBTR0lCb2R5ID0gWyRPdXRwdXRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggYmxlc3NlZCgkT3V0cHV0KSAmJiBvdmVybG9hZDo6TWV0aG9kKCAkT3V0cHV0LCBxKCIiKSApICYmICEkT3V0cHV0LT5jYW4oJ2dldGxpbmUnKSApIHsKICAgICAgICAgICAgICAgICRQU0dJQm9keSA9IFskT3V0cHV0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQU0dJQm9keSA9ICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFBsYWNrOjpVdGlsOjpmb3JlYWNoKAogICAgICAgICAgICAgICAgJFBTR0lCb2R5LAogICAgICAgICAgICAgICAgc3ViIHsKICAgICAgICAgICAgICAgICAgICBteSAoJExpbmUpID0gQF87CgogICAgICAgICAgICAgICAgICAgICRNb2RpZmllZE91dHB1dCAuPSAkTGluZTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBydW4gb3V0cHV0IGZpbHRlcgogICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgJXskRmlsdGVyQ29uZmlnfSwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwkTW9kaWZpZWRPdXRwdXQsCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAkUGFyYW17VGVtcGxhdGVGaWxlfSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAkTnVtQXBwbGllZEZpbHRlcnMrKzsKICAgIH0KCiAgICAjIHJldHVybiB0aGUgb3JpZ2luYWwgb3V0cHV0IHdoZW4gbm8gZmlsdGVycyByYW4KICAgIHJldHVybiAkTnVtQXBwbGllZEZpbHRlcnMgPyAkTW9kaWZpZWRPdXRwdXQgOiAkT3V0cHV0Owp9Cgo9aGVhZDIgQXNjaWkySHRtbCgpCgpjb252ZXJ0IEFTQ0lJIHRvIEhUTUwgc3RyaW5nCgogICAgbXkgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgICAgICAgICAgICA9PiAnU29tZSA8PiBUZXN0IDxmb250IGNvbG9yPSJyZWQiPlRlc3Q8L2ZvbnQ+JywKICAgICAgICBNYXggICAgICAgICAgICAgPT4gMjAsICAgICAgICMgbWF4IDIwIGNoYXJzIGZsb3dlZCBieSBbLi5dCiAgICAgICAgVk1heCAgICAgICAgICAgID0+IDE1LCAgICAgICAjIGZpcnN0IDE1IGxpbmVzCiAgICAgICAgTmV3TGluZSAgICAgICAgID0+IDAsICAgICAgICAjIG1vdmUgXHIgdG8gXG4KICAgICAgICBIVE1MUmVzdWx0TW9kZSAgPT4gMCwgICAgICAgICMgcmVwbGFjZSAiICIgd2l0aCBDPCZuYnNwOz4KICAgICAgICBTdHJpcEVtcHR5TGluZXMgPT4gMCwKICAgICAgICBUeXBlICAgICAgICAgICAgPT4gJ05vcm1hbCcsICMgSlNUZXh0IG9yIE5vcm1hbCB0ZXh0CiAgICAgICAgTGlua0ZlYXR1cmUgICAgID0+IDAsICAgICAgICAjIGRvIHNvbWUgVVJMIGRldGVjdGlvbnMKICAgICk7CgpBIHJlZmVyZW5jZSB0byBhIHN0cmluZyBjYW4gYWxzbyBiZSBwYXNzZWQuIEluIHRoaXMgY2FzdCB0aGUgcmVzdWx0IHdpbGwgYWxzbyBiZSBhIHJlZmVyZW5jZSB0byBhIHN0cmluZy4KCiAgICBteSAkSFRNTFN0cmluZ1JlZiA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCA9PiBcJFN0cmluZywKICAgICk7Cgo9Y3V0CgpzdWIgQXNjaWkySHRtbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtCiAgICByZXR1cm4gJycgdW5sZXNzIGRlZmluZWQgJFBhcmFte1RleHR9OwoKICAgICMgY2hlY2sgdGV4dAogICAgbXkgJFRleHQ7CiAgICBpZiAoICFyZWYgJFBhcmFte1RleHR9ICkgewogICAgICAgICRUZXh0ID0gXCRQYXJhbXtUZXh0fTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZXh0fSBlcSAnU0NBTEFSJyApIHsKICAgICAgICAkVGV4dCA9ICRQYXJhbXtUZXh0fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgIicgLiByZWYoICRQYXJhbXtUZXh0fSApIC4gJyIgb2YgVGV4dCBwYXJhbSEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICAjIHJ1biBvdXRwdXQgZmlsdGVyIHRleHQKICAgIG15IEBGaWx0ZXJzOwogICAgaWYgKCAkUGFyYW17TGlua0ZlYXR1cmV9ICYmICRTZWxmLT57RmlsdGVyVGV4dH0gJiYgcmVmICRTZWxmLT57RmlsdGVyVGV4dH0gZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGV4dHJhY3QgZmlsdGVyIGxpc3QKICAgICAgICBteSAlRmlsdGVyTGlzdCA9ICV7ICRTZWxmLT57RmlsdGVyVGV4dH0gfTsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBGSUxURVI6CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlckxpc3QgKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZmlsdGVyIGNvbmZpZwogICAgICAgICAgICBteSAkRmlsdGVyQ29uZmlnID0gJEZpbHRlckxpc3R7JEZpbHRlcn07CgogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJEZpbHRlckNvbmZpZzsKICAgICAgICAgICAgbmV4dCBGSUxURVIgaWYgcmVmICRGaWx0ZXJDb25maWcgbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBleHRyYWN0IHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRGaWx0ZXJDb25maWctPntUZW1wbGF0ZXN9OwoKICAgICAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUxpc3QgfHwgcmVmICRUZW1wbGF0ZUxpc3QgbmUgJ0hBU0gnIHx8ICEleyRUZW1wbGF0ZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBhZGQgYSB0ZW1wbGF0ZSBsaXN0IHRvIG91dHB1dCBmaWx0ZXIgJEZpbHRlckNvbmZpZy0+e01vZHVsZX0gIgogICAgICAgICAgICAgICAgICAgICAgICAuICJ0byBpbXByb3ZlIHBlcmZvcm1hbmNlLiBVc2UgQUxMIGlmIE91dHB1dEZpbHRlciBzaG91bGQgbW9kaWZ5IGFsbCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRlbXBsYXRlcyBvZiB0aGUgc3lzdGVtIChkZXByZWNhdGVkKS4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIGlmICggJFBhcmFte1RlbXBsYXRlRmlsZX0gJiYgcmVmICRUZW1wbGF0ZUxpc3QgZXEgJ0hBU0gnICYmICEkVGVtcGxhdGVMaXN0LT57QUxMfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRklMVEVSIGlmICEkVGVtcGxhdGVMaXN0LT57ICRQYXJhbXtUZW1wbGF0ZUZpbGV9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5GYXRhbERpZSgpIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEZpbHRlckNvbmZpZy0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEZpbHRlckNvbmZpZy0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBGSUxURVIgaWYgISRPYmplY3Q7CgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEZpbHRlcnMsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXJDb25maWcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmUgcnVuCiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKEBGaWx0ZXJzKSB7CgogICAgICAgICAgICAkVGV4dCA9ICRGaWx0ZXItPntPYmplY3R9LT5QcmUoCiAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlci0+e0ZpbHRlcn0sCiAgICAgICAgICAgICAgICBEYXRhICAgPT4gJFRleHQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgbWF4IHdpZHRoCiAgICBpZiAoICRQYXJhbXtNYXh9ICYmIGxlbmd0aCAkeyRUZXh0fSA+ICRQYXJhbXtNYXh9ICkgewogICAgICAgICR7JFRleHR9ID0gc3Vic3RyKCAkeyRUZXh0fSwgMCwgJFBhcmFte01heH0gLSA1ICkgLiAnWy4uLl0nOwogICAgfQoKICAgICMgbmV3bGluZQogICAgaWYgKCAkUGFyYW17TmV3TGluZX0gJiYgbGVuZ3RoKCAkeyRUZXh0fSApIDwgMTQwXzAwMCApIHsKICAgICAgICAkeyRUZXh0fSA9fiBzLyhcblxyfFxyXHJcbnxcclxuKS9cbi9nOwogICAgICAgICR7JFRleHR9ID1+IHMvXHIvXG4vZzsKICAgICAgICAkeyRUZXh0fSA9fiBzLyguezQsJFBhcmFte05ld0xpbmV9fSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICAjIHJlbW92ZSB0YWJzCiAgICAkeyRUZXh0fSA9fiBzL1x0LyAvZzsKCiAgICAjIHN0cmlwIGVtcHR5IGxpbmVzCiAgICBpZiAoICRQYXJhbXtTdHJpcEVtcHR5TGluZXN9ICkgewogICAgICAgICR7JFRleHR9ID1+IHMvXlxzKlxuLy9tZzsKICAgIH0KCiAgICAjIG1heCBsaW5lcwogICAgaWYgKCAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgbXkgQFRleHRMaXN0ID0gc3BsaXQgL1xuLywgJHskVGV4dH07CiAgICAgICAgJHskVGV4dH0gPSAnJzsKICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgZm9yIChAVGV4dExpc3QpIHsKICAgICAgICAgICAgaWYgKCAkQ291bnRlciA8PSAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgICAgICAgICAkeyRUZXh0fSAuPSAkXyAuICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkQ291bnRlciA+PSAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgICAgICR7JFRleHR9IC49ICJbLi4uXVxuIjsKICAgICAgICB9CiAgICB9CgogICAgIyBodG1sIHF1b3RpbmcKICAgICR7JFRleHR9ID1+IHMvJi8mYW1wOy9nOwogICAgJHskVGV4dH0gPX4gcy88LyZsdDsvZzsKICAgICR7JFRleHR9ID1+IHMvPi8mZ3Q7L2c7CiAgICAkeyRUZXh0fSA9fiBzLyIvJnF1b3Q7L2c7CgogICAgIyB0ZXh0IC0+IGh0bWwgZm9ybWF0IHF1b3RpbmcKICAgIGlmICggJFBhcmFte0xpbmtGZWF0dXJlfSApIHsKICAgICAgICBmb3IgbXkgJEZpbHRlciAoQEZpbHRlcnMpIHsKICAgICAgICAgICAgJFRleHQgPSAkRmlsdGVyLT57T2JqZWN0fS0+UG9zdCgKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLT57RmlsdGVyfSwKICAgICAgICAgICAgICAgIERhdGEgICA9PiAkVGV4dCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkUGFyYW17SFRNTFJlc3VsdE1vZGV9ICkgewogICAgICAgICR7JFRleHR9ID1+IHMvXG4vPGJyXC8+XG4vZzsKICAgICAgICAkeyRUZXh0fSA9fiBzLyAgLyZuYnNwOyZuYnNwOy9nOwoKICAgICAgICAjIENvbnZlcnQgdGhlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKHNlZSBidWcjMTQzNDYgLSBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTE0MzQ2KS4KICAgICAgICAkeyRUZXh0fSA9fiBzL1xuIC9cbiZuYnNwOy9nOwogICAgfQoKICAgIGlmICggJFBhcmFte1R5cGV9ICYmICRQYXJhbXtUeXBlfSBlcSAnSlNUZXh0JyApIHsKICAgICAgICAkeyRUZXh0fSA9fiBzLycvXFwnL2c7CiAgICB9CgogICAgIyBUaGUgaW5wdXQgcGFyYW1ldGVyIFRleHQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgdmFsdWUKICAgIHJldHVybiAkVGV4dCBpZiByZWYgJFBhcmFte1RleHR9OwogICAgcmV0dXJuICR7JFRleHR9Owp9Cgo9aGVhZDIgTGlua1F1b3RlKCkKCmRldGVjdCBsaW5rcyBpbiB0ZXh0CgogICAgbXkgJEhUTUxXaXRoTGlua3MgPSAkTGF5b3V0T2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgVGV4dCA9PiAkSFRNTFdpdGhPdXRMaW5rcywKICAgICk7CgphbHNvIHN0cmluZyByZWYgaXMgcG9zc2libGUKCiAgICBteSAkSFRNTFdpdGhMaW5rc1JlZiA9ICRMYXlvdXRPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICBUZXh0ID0+IFwkSFRNTFdpdGhPdXRMaW5rc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua1F1b3RlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRleHQgPSAkUGFyYW17VGV4dH0gfHwgJyc7ICAgICMgZWl0aGVyIGEgc3RyaW5nIG9yIGEgcmVmZXJlbmNlIHRvIGEgc3RyaW5nCgogICAgIyBjaGVjayByZWYKICAgIG15ICRUZXh0U2NhbGFyOwogICAgaWYgKCAhcmVmICRUZXh0ICkgewogICAgICAgICRUZXh0U2NhbGFyID0gJFRleHQ7CiAgICAgICAgJFRleHQgICAgICAgPSBcJFRleHRTY2FsYXI7CiAgICB9CgogICAgIyBydW4gb3V0cHV0IGZpbHRlciB0ZXh0CiAgICBteSBARmlsdGVyczsKICAgIGlmICggJFNlbGYtPntGaWx0ZXJUZXh0fSAmJiByZWYgJFNlbGYtPntGaWx0ZXJUZXh0fSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgbGlzdAogICAgICAgIG15ICVGaWx0ZXJMaXN0ID0gJXsgJFNlbGYtPntGaWx0ZXJUZXh0fSB9OwoKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgIEZJTFRFUjoKICAgICAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVyTGlzdCApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgY29uZmlnCiAgICAgICAgICAgIG15ICRGaWx0ZXJDb25maWcgPSAkRmlsdGVyTGlzdHskRmlsdGVyfTsKCiAgICAgICAgICAgIG5leHQgRklMVEVSIGlmICEkRmlsdGVyQ29uZmlnOwogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiByZWYgJEZpbHRlckNvbmZpZyBuZSAnSEFTSCc7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGVtcGxhdGUgbGlzdAogICAgICAgICAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEZpbHRlckNvbmZpZy0+e1RlbXBsYXRlc307CgogICAgICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlTGlzdCB8fCByZWYgJFRlbXBsYXRlTGlzdCBuZSAnSEFTSCcgfHwgISV7JFRlbXBsYXRlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGFkZCBhIHRlbXBsYXRlIGxpc3QgdG8gb3V0cHV0IGZpbHRlciAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRvIGltcHJvdmUgcGVyZm9ybWFuY2UuIFVzZSBBTEwgaWYgT3V0cHV0RmlsdGVyIHNob3VsZCBtb2RpZnkgYWxsICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAidGVtcGxhdGVzIG9mIHRoZSBzeXN0ZW0gKGRlcHJlY2F0ZWQpLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVGaWxlfSAmJiByZWYgJFRlbXBsYXRlTGlzdCBlcSAnSEFTSCcgJiYgISRUZW1wbGF0ZUxpc3QtPntBTEx9ICkgewogICAgICAgICAgICAgICAgbmV4dCBGSUxURVIgaWYgISRUZW1wbGF0ZUxpc3QtPnsgJFBhcmFte1RlbXBsYXRlRmlsZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRGllKCkgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfSApOwoKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJE9iamVjdDsKCiAgICAgICAgICAgIHB1c2ggQEZpbHRlcnMsIHsKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0LAogICAgICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXJDb25maWcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkRmlsdGVyIChARmlsdGVycykgewogICAgICAgICRUZXh0ID0gJEZpbHRlci0+e09iamVjdH0tPlByZSgKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXItPntGaWx0ZXJ9LAogICAgICAgICAgICBEYXRhICAgPT4gJFRleHQKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRGaWx0ZXIgKEBGaWx0ZXJzKSB7CiAgICAgICAgJFRleHQgPSAkRmlsdGVyLT57T2JqZWN0fS0+UG9zdCgKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXItPntGaWx0ZXJ9LAogICAgICAgICAgICBEYXRhICAgPT4gJFRleHQKICAgICAgICApOwogICAgfQoKICAgICMgZG8gbWFpbCB0byBxdW90ZQogICAgJHskVGV4dH0gPX4gcy8obWFpbHRvOi4rPykoXC5cc3xcc3xcKXxcInxdfCcpLzxhIGhyZWY9XCIkMVwiPiQxPFwvYT4kMi9naTsKCiAgICAjIGNoZWNrIHJlZiAmJiByZXR1cm4gcmVzdWx0IGxpa2UgY2FsbGVkCiAgICBpZiAoJFRleHRTY2FsYXIpIHsKICAgICAgICByZXR1cm4gJHskVGV4dH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFRleHQ7CiAgICB9Cn0KCj1oZWFkMiBIVE1MTGlua1F1b3RlKCkKCmRldGVjdCBsaW5rcyBpbiBIVE1MIGNvZGUKCiAgICBteSAkSFRNTFdpdGhMaW5rcyA9ICRMYXlvdXRPYmplY3QtPkhUTUxMaW5rUXVvdGUoCiAgICAgICAgU3RyaW5nID0+ICRIVE1MU3RyaW5nLAogICAgKTsKCmFsc28gc3RyaW5nIHJlZiBpcyBwb3NzaWJsZQoKICAgIG15ICRIVE1MV2l0aExpbmtzUmVmID0gJExheW91dE9iamVjdC0+SFRNTExpbmtRdW90ZSgKICAgICAgICBTdHJpbmcgPT4gXCRIVE1MU3RyaW5nLAogICAgKTsKCj1jdXQKCnN1YiBIVE1MTGlua1F1b3RlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+TGlua1F1b3RlKAogICAgICAgIFN0cmluZyAgICA9PiAkUGFyYW17U3RyaW5nfSwKICAgICAgICBUYXJnZXRBZGQgPT4gMSwKICAgICAgICBUYXJnZXQgICAgPT4gJ19ibGFuaycsCiAgICApOwp9Cgo9aGVhZDIgTGlua0VuY29kZSgpCgpwZXJmb3JtIFVSTCBlbmNvZGluZyBvbiBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyIG5hbWVzIG9yIHZhbHVlcy4KCiAgICBteSAkUGFyYW1WYWx1ZUVuY29kZWQgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRQYXJhbVZhbHVlKTsKCkRvbid0IGVuY29kZSBlbnRpcmUgVVJMcywgYmVjYXVzZSB0aGlzIHdpbGwgbWFrZSB0aGVtIGludmFsaWQKKD8sICYgYW5kIDsgd2lsbCBiZSBlbmNvZGVkIGFzIHdlbGwpLiBPbmx5IHBhc3Mgb25lIHBhcmFtZXRlciBuYW1lCm9yIHZhbHVlIGF0IGEgdGltZS4KCj1jdXQKCnN1YiBMaW5rRW5jb2RlIHsKICAgIG15ICggJFNlbGYsICRMaW5rICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJExpbms7CgogICAgcmV0dXJuIHVyaV9lc2NhcGVfdXRmOCgkTGluayk7Cn0KCnN1YiBDdXN0b21lckFnZUluSG91cnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQWdlICAgICAgID0gZGVmaW5lZCggJFBhcmFte0FnZX0gKSA/ICRQYXJhbXtBZ2V9IDogcmV0dXJuOwogICAgbXkgJFNwYWNlICAgICA9ICRQYXJhbXtTcGFjZX0gfHwgJzxici8+JzsKICAgIG15ICRBZ2VTdHJnICAgPSAnJzsKICAgIG15ICRIb3VyRHNjICAgPSBUcmFuc2xhdGFibGUoJ2gnKTsKICAgIG15ICRNaW51dGVEc2MgPSBUcmFuc2xhdGFibGUoJ20nKTsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaW1lU2hvd0NvbXBsZXRlRGVzY3JpcHRpb24nKSApIHsKICAgICAgICAkSG91ckRzYyAgID0gVHJhbnNsYXRhYmxlKCdob3VyKHMpJyk7CiAgICAgICAgJE1pbnV0ZURzYyA9IFRyYW5zbGF0YWJsZSgnbWludXRlKHMpJyk7CiAgICB9CiAgICBpZiAoICRBZ2UgPX4gL14tKC4qKS8gKSB7CiAgICAgICAgJEFnZSAgICAgPSAkMTsKICAgICAgICAkQWdlU3RyZyA9ICctJzsKICAgIH0KCiAgICAjIGdldCBob3VycwogICAgaWYgKCAkQWdlID49IDM2MDAgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyAzNjAwICkgKSAuICcgJzsKICAgICAgICAkQWdlU3RyZyAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRIb3VyRHNjKTsKICAgICAgICAkQWdlU3RyZyAuPSAkU3BhY2U7CiAgICB9CgogICAgIyBnZXQgbWludXRlcyAoanVzdCBpZiBhZ2UgPCAxIGRheSkKICAgIGlmICggJEFnZSA8PSAzNjAwIHx8IGludCggKCAkQWdlIC8gNjAgKSAlIDYwICkgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyA2MCApICUgNjAgKSAuICcgJzsKICAgICAgICAkQWdlU3RyZyAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRNaW51dGVEc2MpOwogICAgfQogICAgcmV0dXJuICRBZ2VTdHJnOwp9CgpzdWIgQ3VzdG9tZXJBZ2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkQWdlICAgICAgID0gZGVmaW5lZCggJFBhcmFte0FnZX0gKSA/ICRQYXJhbXtBZ2V9IDogcmV0dXJuOwogICAgbXkgJFNwYWNlICAgICA9ICRQYXJhbXtTcGFjZX0gfHwgJzxici8+JzsKICAgIG15ICRBZ2VTdHJnICAgPSAnJzsKICAgIG15ICREYXlEc2MgICAgPSBUcmFuc2xhdGFibGUoJ2QnKTsKICAgIG15ICRIb3VyRHNjICAgPSBUcmFuc2xhdGFibGUoJ2gnKTsKICAgIG15ICRNaW51dGVEc2MgPSBUcmFuc2xhdGFibGUoJ20nKTsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaW1lU2hvd0NvbXBsZXRlRGVzY3JpcHRpb24nKSApIHsKICAgICAgICAkRGF5RHNjICAgID0gVHJhbnNsYXRhYmxlKCdkYXkocyknKTsKICAgICAgICAkSG91ckRzYyAgID0gVHJhbnNsYXRhYmxlKCdob3VyKHMpJyk7CiAgICAgICAgJE1pbnV0ZURzYyA9IFRyYW5zbGF0YWJsZSgnbWludXRlKHMpJyk7CiAgICB9CiAgICBpZiAoICRBZ2UgPX4gL14tKC4qKS8gKSB7CiAgICAgICAgJEFnZSAgICAgPSAkMTsKICAgICAgICAkQWdlU3RyZyA9ICctJzsKICAgIH0KCiAgICAjIGdldCBkYXlzCiAgICBpZiAoICRBZ2UgPj0gODY0MDAgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyAzNjAwICkgLyAyNCApIC4gJyAnOwogICAgICAgICRBZ2VTdHJnIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJERheURzYyk7CiAgICAgICAgJEFnZVN0cmcgLj0gJFNwYWNlOwogICAgfQoKICAgICMgZ2V0IGhvdXJzCiAgICBpZiAoICRBZ2UgPj0gMzYwMCApIHsKICAgICAgICAkQWdlU3RyZyAuPSBpbnQoICggJEFnZSAvIDM2MDAgKSAlIDI0ICkgLiAnICc7CiAgICAgICAgJEFnZVN0cmcgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkSG91ckRzYyk7CiAgICAgICAgJEFnZVN0cmcgLj0gJFNwYWNlOwogICAgfQoKICAgICMgZ2V0IG1pbnV0ZXMgKGp1c3QgaWYgYWdlIDwgMSBkYXkpCiAgICBpZiAoICggJFBhcmFte1RpbWVTaG93QWx3YXlzTG9uZ30gfHwgJENvbmZpZ09iamVjdC0+R2V0KCdUaW1lU2hvd0Fsd2F5c0xvbmcnKSB8fCAkQWdlIDwgODY0MDAgKSAmJiAkQWdlICE9IDAgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyA2MCApICUgNjAgKSAuICcgJzsKICAgICAgICAkQWdlU3RyZyAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRNaW51dGVEc2MpOwogICAgfQogICAgcmV0dXJuICRBZ2VTdHJnOwp9Cgo9aGVhZDIgQnVpbGRTZWxlY3Rpb24oKQoKYnVpbGQgYSBIVE1MIG9wdGlvbiBlbGVtZW50IGJhc2VkIG9uIGdpdmVuIGRhdGEKCiAgICBteSAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgICA9PiAkQXJyYXlSZWYsICAgICAgICAjIHVzZSAkSGFzaFJlZiwgJEFycmF5UmVmIG9yICRBcnJheUhhc2hSZWYgKHNlZSBiZWxvdykKICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJ1RoZU5hbWUnLCAgICAgICAgIyBuYW1lIG9mIGVsZW1lbnQKICAgICAgICBJRCAgICAgICAgICAgICAgPT4gJ0hUTUxJRCcsICAgICAgICAgIyAob3B0aW9uYWwpIHRoZSBIVE1MIElEIGZvciB0aGlzIGVsZW1lbnQsIGlmIG5vdCBwcm92aWRlZCwgdGhlIG5hbWUgd2lsbCBiZSB1c2VkIGFzIElEIGFzIHdlbGwKICAgICAgICBNdWx0aXBsZSAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgICAgIFNpemUgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxIGVsZW1lbnQgc2l6ZQogICAgICAgIENsYXNzICAgICAgICAgICA9PiAnY2xhc3MnLCAgICAgICAgICAjIChvcHRpb25hbCkgYSBjc3MgY2xhc3MsIGluY2x1ZGUgJ01vZGVybml6ZScgdG8gYWN0aXZhdGUgSW5wdXRGaWVsZHMKICAgICAgICBEaXNhYmxlZCAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBkaXNhYmxlIHRoZSBlbGVtZW50CiAgICAgICAgQXV0b0NvbXBsZXRlICAgID0+ICdvZmYnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIE9uQ2hhbmdlICAgICAgICA9PiAnamF2YXNjcmlwdCcsICAgICAjIChvcHRpb25hbCkKICAgICAgICBPbkNsaWNrICAgICAgICAgPT4gJ2phdmFzY3JpcHQnLCAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIFNlbGVjdGVkSUQgICAgID0+IDEsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgdXNlIGludGVnZXIgb3IgYXJyYXlyZWYgKHVuYWJsZSB0byB1c2Ugd2l0aCBBcnJheUhhc2hSZWYpCiAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gWzEsIDUsIDNdLCAgICAgICAgICMgKG9wdGlvbmFsKSB1c2UgaW50ZWdlciBvciBhcnJheXJlZiAodW5hYmxlIHRvIHVzZSB3aXRoIEFycmF5SGFzaFJlZikKICAgICAgICBTZWxlY3RlZFZhbHVlICA9PiAndGVzdCcsICAgICAgICAgICAgIyAob3B0aW9uYWwpIHVzZSBzdHJpbmcgb3IgYXJyYXlyZWYgKHVuYWJsZSB0byB1c2Ugd2l0aCBBcnJheUhhc2hSZWYpCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSAgPT4gWyd0ZXN0JywgJ3Rlc3QxJ10sICMgKG9wdGlvbmFsKSB1c2Ugc3RyaW5nIG9yIGFycmF5cmVmICh1bmFibGUgdG8gdXNlIHdpdGggQXJyYXlIYXNoUmVmKQoKICAgICAgICBTb3J0ICAgICAgICAgICA9PiAnTnVtZXJpY1ZhbHVlJywgICAgIyAob3B0aW9uYWwpIChBbHBoYW51bWVyaWNWYWx1ZXxOdW1lcmljVmFsdWV8QWxwaGFudW1lcmljS2V5fE51bWVyaWNLZXl8VHJlZVZpZXd8SW5kaXZpZHVhbEtleXxJbmRpdmlkdWFsVmFsdWUpIHVuYWJsZSB0byB1c2Ugd2l0aCBBcnJheUhhc2hSZWYKICAgICAgICBTb3J0SW5kaXZpZHVhbCA9PiBbJ3NlYycsICdtaW4nXSAgICAgIyAob3B0aW9uYWwpIG9ubHkgaWYgc29ydCBpcyBzZXQgdG8gSW5kaXZpZHVhbEtleSBvciBJbmRpdmlkdWFsVmFsdWUKICAgICAgICBTb3J0UmV2ZXJzZSAgICA9PiAwLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHJldmVyc2UgdGhlIGxpc3QKCiAgICAgICAgVHJhbnNsYXRpb24gICAgPT4gMSwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgUG9zc2libGVOb25lICAgPT4gMCwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAgKDB8MSkgYWRkIGEgbGVhZGluZyBlbXB0eSBzZWxlY3Rpb24KICAgICAgICBUcmVlVmlldyAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgICAgIERpc2FibGVkQnJhbmNoID0+ICdCcmFuY2gnLCAgICAgICAgICAjIChvcHRpb25hbCkgZGlzYWJsZSBhbGwgZWxlbWVudHMgb2YgdGhpcyBicmFuY2ggKHVzZSBzdHJpbmcgb3IgYXJyYXlyZWYpCiAgICAgICAgTWF4ICAgICAgICAgICAgPT4gMTAwLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEwMCBtYXggc2l6ZSBvZiB0aGUgc2hvd24gdmFsdWUKICAgICAgICBIVE1MUXVvdGUgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKSBkaXNhYmxlIGh0bWwgcXVvdGUKICAgICAgICBUaXRsZSAgICAgICAgICA9PiAnQzxUb29sdGlwPiBUZXh0JywgICAgIyAob3B0aW9uYWwpIHN0cmluZyB3aWxsIGJlIHNob3duIGFzIGM8VG9vbHRpcD4gb24gYzxtb3VzZW92ZXI+CiAgICAgICAgT3B0aW9uVGl0bGUgICAgPT4gMSwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAgKDB8MSkgc2hvdyB0aXRsZSBhdHRyaWJ1dGUgKHRoZSBvcHRpb24gdmFsdWUpIG9uIGV2ZXJ5IG9wdGlvbiBlbGVtZW50CgogICAgICAgIEZpbHRlcnMgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZmlsdGVyIGRhdGEsIHVzZWQgYnkgSW5wdXRGaWVsZHMKICAgICAgICAgICAgTGFzdE93bmVycyA9PiB7ICAgICAgICAgICAgICAgICAgIyBmaWx0ZXIgaWQKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnTGFzdCBvd25lcnMnLCAgICAgIyBuYW1lIG9mIHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgIFZhbHVlcyA9PiB7ICAgICAgICAgICAgICAgICAgIyBmaWx0ZXJlZCBkYXRhIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgIEtleTEgPT4gJ1ZhbHVlMScsCiAgICAgICAgICAgICAgICAgICAgS2V5MiA9PiAnVmFsdWUyJywKICAgICAgICAgICAgICAgICAgICBLZXkzID0+ICdWYWx1ZTMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEFjdGl2ZSA9PiAxLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBtYWtlIHRoaXMgZmlsdGVyIGltbWVkaWF0ZWx5IGFjdGl2ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBJbnZvbHZlZEFnZW50cyA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ0ludm9sdmVkIGluIHRoaXMgdGlja2V0JywKICAgICAgICAgICAgICAgIFZhbHVlcyA9PiBcJUhhc2hXaXRoRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGFuZEZpbHRlcnMgID0+IDEsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpIGV4cGFuZCBmaWx0ZXJzIGxpc3QgYnkgZGVmYXVsdAoKICAgICAgICBWYWxpZGF0ZURhdGVBZnRlciAgPT4gJzIwMTYtMDEtMDEnLCAgIyAob3B0aW9uYWwpIHZhbGlkYXRlIHRoYXQgZGF0ZSBpcyBhZnRlciBzdXBwbGllZCB2YWx1ZQogICAgICAgIFZhbGlkYXRlRGF0ZUJlZm9yZSA9PiAnMjAxNi0wMS0wMScsICAjIChvcHRpb25hbCkgdmFsaWRhdGUgdGhhdCBkYXRlIGlzIGJlZm9yZSBzdXBwbGllZCB2YWx1ZQogICAgKTsKCiAgICBteSAkSGFzaFJlZiA9IHsKICAgICAgICBLZXkxID0+ICdWYWx1ZTEnLAogICAgICAgIEtleTIgPT4gJ1ZhbHVlMicsCiAgICAgICAgS2V5MyA9PiAnVmFsdWUzJywKICAgIH07CgogICAgbXkgJEFycmF5UmVmID0gWwogICAgICAgICdLZXlWYWx1ZTEnLAogICAgICAgICdLZXlWYWx1ZTInLAogICAgICAgICdLZXlWYWx1ZTMnLAogICAgICAgICdLZXlWYWx1ZTQnLAogICAgXTsKCiAgICBteSAkQXJyYXlIYXNoUmVmID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJzEnLAogICAgICAgICAgICBWYWx1ZSA9PiAnVmFsdWUxJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJzInLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAnVmFsdWUxOjpTdWJ2YWx1ZTEnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnMycsCiAgICAgICAgICAgIFZhbHVlID0+ICdWYWx1ZTE6OlN1YnZhbHVlMicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICc0JywKICAgICAgICAgICAgVmFsdWUgICAgPT4gJ1ZhbHVlMicsCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfQogICAgXTsKCj1jdXQKCnN1YiBCdWlsZFNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KE5hbWUgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgVGhlIHBhcmFtZXRlcnMgJ0FqYXgnIGFuZCAnT25DaGFuZ2UnIGFyZSBleGNsdXNpdmUKICAgIGlmICggJFBhcmFte0FqYXh9ICYmICRQYXJhbXtPbkNoYW5nZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVycyAnT25DaGFuZ2UnIGFuZCAnQWpheCcgZXhjbHVkZSBlYWNoIG90aGVyISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBPbkNoYW5nZSBpZiBBSkFYIGlzIHVzZWQKICAgIGlmICggJFBhcmFte0FqYXh9ICkgewogICAgICAgIGlmICggISRQYXJhbXtBamF4fS0+e0RlcGVuZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIERlcGVuZCBQYXJhbSBBamF4IG9wdGlvbiEnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3I7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtBamF4fS0+e1VwZGF0ZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVwZGF0ZSBQYXJhbSBBamF4IG9wdGlvbigpIScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICB9CiAgICAgICAgbXkgJFNlbGVjdG9yID0gJFBhcmFte0lEfSB8fCAkUGFyYW17TmFtZX07CiAgICAgICAgJFBhcmFte09uQ2hhbmdlfSA9ICJDb3JlLkFKQVguRm9ybVVwZGF0ZShcJCgnIyIKICAgICAgICAgICAgLiAkU2VsZWN0b3IgLiAiJyksICciIC4gJFBhcmFte0FqYXh9LT57U3ViYWN0aW9ufSAuICInLCIKICAgICAgICAgICAgLiAiICckUGFyYW17TmFtZX0nKTsiOwogICAgfQoKICAgICMgY3JlYXRlIE9wdGlvblJlZgogICAgbXkgJE9wdGlvblJlZiA9ICRTZWxmLT5fQnVpbGRTZWxlY3Rpb25PcHRpb25SZWZDcmVhdGUoJVBhcmFtKTsKCiAgICAjIGNyZWF0ZSBBdHRyaWJ1dGVSZWYKICAgIG15ICRBdHRyaWJ1dGVSZWYgPSAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uQXR0cmlidXRlUmVmQ3JlYXRlKCVQYXJhbSk7CgogICAgIyBjcmVhdGUgRGF0YVJlZgogICAgbXkgJERhdGFSZWYgPSAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uRGF0YVJlZkNyZWF0ZSgKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgIEF0dHJpYnV0ZVJlZiA9PiAkQXR0cmlidXRlUmVmLAogICAgICAgIE9wdGlvblJlZiAgICA9PiAkT3B0aW9uUmVmLAogICAgKTsKCiAgICAjIGNyZWF0ZSBGaWx0ZXJzUmVmCiAgICBteSBARmlsdGVyczsKICAgIG15ICRGaWx0ZXJBY3RpdmU7CiAgICBpZiAoICRQYXJhbXtGaWx0ZXJzfSApIHsKICAgICAgICBteSAkSW5kZXggPSAxOwogICAgICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICV7ICRQYXJhbXtGaWx0ZXJzfSB9ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUGFyYW17RmlsdGVyc30tPnskRmlsdGVyfS0+e05hbWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17RmlsdGVyc30tPnskRmlsdGVyfS0+e1ZhbHVlc30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEZpbHRlckRhdGEgPSAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uRGF0YVJlZkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0ZpbHRlcnN9LT57JEZpbHRlcn0tPntWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVJlZiA9PiAkQXR0cmlidXRlUmVmLAogICAgICAgICAgICAgICAgICAgIE9wdGlvblJlZiAgICA9PiAkT3B0aW9uUmVmLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2ggQEZpbHRlcnMsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtGaWx0ZXJzfS0+eyRGaWx0ZXJ9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRmlsdGVyRGF0YSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtGaWx0ZXJzfS0+eyRGaWx0ZXJ9LT57QWN0aXZlfSApIHsKICAgICAgICAgICAgICAgICAgICAkRmlsdGVyQWN0aXZlID0gJEluZGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnRWFjaCBGaWx0ZXIgbXVzdCBwcm92aWRlIE5hbWUgYW5kIFZhbHVlcyEnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkSW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgQEZpbHRlcnMgPSBzb3J0IHsgJGEtPntOYW1lfSBjbXAgJGItPntOYW1lfSB9IEBGaWx0ZXJzOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPl9CdWlsZFNlbGVjdGlvbk91dHB1dCgKICAgICAgICBBdHRyaWJ1dGVSZWYgICAgICAgPT4gJEF0dHJpYnV0ZVJlZiwKICAgICAgICBEYXRhUmVmICAgICAgICAgICAgPT4gJERhdGFSZWYsCiAgICAgICAgT3B0aW9uVGl0bGUgICAgICAgID0+ICRQYXJhbXtPcHRpb25UaXRsZX0sCiAgICAgICAgVHJlZVZpZXcgICAgICAgICAgID0+ICRQYXJhbXtUcmVlVmlld30sCiAgICAgICAgRmlsdGVyc1JlZiAgICAgICAgID0+IFxARmlsdGVycywKICAgICAgICBGaWx0ZXJBY3RpdmUgICAgICAgPT4gJEZpbHRlckFjdGl2ZSwKICAgICAgICBFeHBhbmRGaWx0ZXJzICAgICAgPT4gJFBhcmFte0V4cGFuZEZpbHRlcnN9LAogICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyICA9PiAkUGFyYW17VmFsaWRhdGVEYXRlQWZ0ZXJ9LAogICAgICAgIFZhbGlkYXRlRGF0ZUJlZm9yZSA9PiAkUGFyYW17VmFsaWRhdGVEYXRlQmVmb3JlfSwKICAgICk7Cn0KCnN1YiBOb1Blcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkV2l0aEhlYWRlciA9ICRQYXJhbXtXaXRoSGVhZGVyfSB8fCAneWVzJzsKCiAgICBpZiAoICEkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJFBhcmFte01lc3NhZ2V9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgIlRoaXMgdGlja2V0IGRvZXMgbm90IGV4aXN0LCBvciB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgaXQgaW4gaXRzIGN1cnJlbnQgc3RhdGUuIFlvdSBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOiIKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvcHRpb24gZm9yIHBvc3NpYmxlIG5leHQgYWN0aW9ucwogICAgbXkgJFBvc3NpYmxlTmV4dEFjdGlvbnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3NpYmxlTmV4dEFjdGlvbnMnKTsKCiAgICBQT1NTSUJMRToKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlTmV4dEFjdGlvbnMpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUG9zc2libGVOZXh0QWN0aW9uQ29udGFpbmVyJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFBvc3NpYmxlTmV4dEFjdGlvbnN9ICkgewogICAgICAgICAgICBuZXh0IFBPU1NJQkxFIGlmICEkS2V5OwogICAgICAgICAgICBuZXh0IFBPU1NJQkxFIGlmICEkUG9zc2libGVOZXh0QWN0aW9ucy0+eyRLZXl9OwoKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUG9zc2libGVOZXh0QWN0aW9uUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFBvc3NpYmxlTmV4dEFjdGlvbnMtPnskS2V5fSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG91dHB1dAogICAgbXkgJE91dHB1dDsKICAgICRPdXRwdXQgPSAkU2VsZi0+SGVhZGVyKCBUaXRsZSA9PiAnSW5zdWZmaWNpZW50IFJpZ2h0cycgKSBpZiAkV2l0aEhlYWRlciBlcSAneWVzJzsKICAgICRPdXRwdXQgLj0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ05vUGVybWlzc2lvbicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5Gb290ZXIoKSBpZiAkV2l0aEhlYWRlciBlcSAneWVzJzsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZDIgUGVybWlzc2lvbigpCgpjaGVjayBpZiBhY2Nlc3MgdG8gYSBmcm9udGVuZCBtb2R1bGUgZXhpc3RzCgogICAgbXkgJEFjY2VzcyA9ICRMYXlvdXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsICMgcm98cncgcG9zc2libGUKICAgICk7Cgo9Y3V0CgpzdWIgUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhBY3Rpb24gVHlwZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdvdCBubyAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgY29uZmlnIG9wdGlvbiBmb3IgZnJvbnRlbmQgbW9kdWxlLgogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtBY3Rpb259IH07CiAgICByZXR1cm4gaWYgISRDb25maWc7CgogICAgbXkgJEl0ZW0gPSAkQ29uZmlnLT57ICRQYXJhbXtUeXBlfSBlcSAncm8nID8gJ0dyb3VwUm8nIDogJ0dyb3VwJyB9OwoKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJFNlbGYtPntVc2VyVHlwZX0gZXEgJ0N1c3RvbWVyJyA/ICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcgOiAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJwogICAgKTsKCiAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbj8KICAgIGlmICgKICAgICAgICByZWYgJENvbmZpZy0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAmJiAhc2NhbGFyIEB7ICRDb25maWctPntHcm91cFJvfSB9CiAgICAgICAgJiYgcmVmICRDb25maWctPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICYmICFzY2FsYXIgQHsgJENvbmZpZy0+e0dyb3VwfSB9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgQXJyYXkgYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJEl0ZW0pICkgewogICAgICAgIGZvciBteSAkR3JvdXBOYW1lICggQHskSXRlbX0gKSB7CiAgICAgICAgICAgIHJldHVybiAxIGlmICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBBbGxvdyBhY2Nlc3MgaWYgdGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiBmb3IgbW9kdWxlIGdyb3VwIHBlcm1pc3Npb24uCiAgICBlbHNpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRDb25maWctPntHcm91cFJvfSApICYmICFJc0FycmF5UmVmV2l0aERhdGEoICRDb25maWctPntHcm91cH0gKSApIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3ViIFJldHVyblZhbHVlIHsKICAgIG15ICggJFNlbGYsICRXaGF0ICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPnskV2hhdH07Cn0KCj1oZWFkMiBBdHRhY2htZW50KCkKCnJldHVybnMgYnJvd3NlciBvdXRwdXQgdG8gZGlzcGxheS9kb3dubG9hZCBhIGF0dGFjaG1lbnQuCgogICAgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIFR5cGUgICAgICAgICAgICAgPT4gJ2lubGluZScsICAgICAgICAgICMgb3B0aW9uYWwsIGRlZmF1bHQ6IGF0dGFjaG1lbnQsIHBvc3NpYmxlOiBpbmxpbmV8YXR0YWNobWVudAogICAgICAgIEZpbGVuYW1lICAgICAgICAgPT4gJ0ZpbGVOYW1lLnBuZycsICAgICMgb3B0aW9uYWwKICAgICAgICBBZGRpdGlvbmFsSGVhZGVyID0+IFsgJGtleSA9PiAkdmFsIF0gICAjIG9wdGlvbmFsLCBhbiBhcnJheSByZWYKICAgICAgICBDb250ZW50VHlwZSAgICAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgU2FuZGJveCAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwOyB1c2UgY29udGVudCBzZWN1cml0eSBwb2xpY3kgdG8gcHJvaGliaXQgZXh0ZXJuYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgc2NyaXB0cywgZmxhc2ggZXRjLgogICAgKTsKCk9yIGZvciBBSkFYIEhUTUwgc25pcHBldHM6CgogICAgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLCAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdDogYXR0YWNobWVudCwgcG9zc2libGU6IGlubGluZXxhdHRhY2htZW50CiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0ZpbGVOYW1lLmh0bWwnLCAjIG9wdGlvbmFsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgQ2hhcnNldCAgICAgPT4gJ3V0Zi04JywgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKQXMgYSBzaWRlIGVmZmVjdCB0aGUgaGVhZGVycyBvZiB0aGUgSFRUUCByZXNwb25zZSBhcmUgc2V0IGluIHRoZSBvYmplY3QgQzxLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZT4uCgo9Y3V0CgpzdWIgQXR0YWNobWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgZm9yIChxdyhDb250ZW50IENvbnRlbnRUeXBlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdvdCBubyAkXyEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3I7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHNpbmdsZXRvbnMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVIZWFkZXJzOwoKICAgICMgcmV0dXJuIGF0dGFjaG1lbnQKICAgIHsKICAgICAgICBteSAkQ29udGVudERpc3Bvc2l0aW9uID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgICAgICRDb250ZW50RGlzcG9zaXRpb24gLj0gJFBhcmFte1R5cGV9OwogICAgICAgICAgICAkQ29udGVudERpc3Bvc2l0aW9uIC49ICc7ICc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ29udGVudERpc3Bvc2l0aW9uIC49ICRDb25maWdPYmplY3QtPkdldCgnQXR0YWNobWVudERvd25sb2FkVHlwZScpIHx8ICdhdHRhY2htZW50JzsKICAgICAgICAgICAgJENvbnRlbnREaXNwb3NpdGlvbiAuPSAnOyAnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17RmlsZW5hbWV9ICkgewoKICAgICAgICAgICAgIyBJRSAxMCsgc3VwcG9ydHMgdGhpcwogICAgICAgICAgICBteSAkVVJMRW5jb2RlZEZpbGVuYW1lID0gdXJpX2VzY2FwZV91dGY4KCAkUGFyYW17RmlsZW5hbWV9ICk7CiAgICAgICAgICAgICRDb250ZW50RGlzcG9zaXRpb24gLj0gIiBmaWxlbmFtZT1cIiRQYXJhbXtGaWxlbmFtZX1cIjsgZmlsZW5hbWUqPXV0Zi04JyckVVJMRW5jb2RlZEZpbGVuYW1lIjsKICAgICAgICB9CiAgICAgICAgJEhlYWRlcnN7J0NvbnRlbnQtRGlzcG9zaXRpb24nfSA9ICRDb250ZW50RGlzcG9zaXRpb247CiAgICB9CgogICAgIyBhZGQgbm8gY2FjaGUgaGVhZGVycwogICAgaWYgKCAkUGFyYW17Tm9DYWNoZX0gKSB7CiAgICAgICAgJEhlYWRlcnN7J0V4cGlyZXMnfSAgICAgICA9ICdUdWUsIDEgSmFuIDE5ODAgMTI6MDA6MDAgR01UJzsKICAgICAgICAkSGVhZGVyc3snQ2FjaGUtQ29udHJvbCd9ID0gJ25vLWNhY2hlJzsKICAgICAgICAkSGVhZGVyc3snUHJhZ21hJ30gICAgICAgID0gJ25vLWNhY2hlJzsKICAgIH0KCiAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0Rpc2FibGVJRnJhbWVPcmlnaW5SZXN0cmljdGVkJykgKSB7CiAgICAgICAgJEhlYWRlcnN7J1gtRnJhbWUtT3B0aW9ucyd9ID0gJ1NBTUVPUklHSU4nOwogICAgfQoKICAgIGlmICggJFBhcmFte1NhbmRib3h9ICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Rpc2FibGVDb250ZW50U2VjdXJpdHlQb2xpY3knKSApIHsKCiAgICAgICAgIyBEbyBub3QgYWxsb3cgZXh0ZXJuYWwgYW5kIGlubGluZSBzY3JpcHRzLCBhY3RpdmUgY29udGVudCwgZnJhbWVzLCBidXQga2VlcCBhbGxvd2luZyBpbmxpbmUgc3R5bGVzCiAgICAgICAgIyAgIGFzIHRoaXMgaXMgYSBjb21tb24gdXNlIGNhc2UgaW4gZW1haWxzLgogICAgICAgICMgaW1nLXNyYzogICAgYWxsb3cgZXh0ZXJuYWwgYW5kIGlubGluZSAoZGF0YTopIGltYWdlcwogICAgICAgICMgc2NyaXB0LXNyYzogYmxvY2sgYWxsIHNjcmlwdHMKICAgICAgICAjIG9iamVjdC1zcmM6IGFsbG93ICdzZWxmJyBzbyB0aGF0IHRoZSBicm93c2VyIGNhbiBsb2FkIHBsdWdpbnMgZm9yIFBERiBkaXNwbGF5CiAgICAgICAgIyBmcmFtZS1zcmM6ICBibG9jayBhbGwgZnJhbWVzCiAgICAgICAgIyBzdHlsZS1zcmM6ICBhbGxvdyBpbmxpbmUgc3R5bGVzIGZvciBuaWNlIGVtYWlsIGRpc3BsYXkKICAgICAgICAjIHJlZmVycmVyOiAgIGRvbid0IHNlbmQgcmVmZXJyZXJzIHRvIHByZXZlbnQgcmVmZXJyZXItbGVhayBhdHRhY2tzCiAgICAgICAgJEhlYWRlcnN7J0NvbnRlbnQtU2VjdXJpdHktUG9saWN5J30KICAgICAgICAgICAgPSBxe2RlZmF1bHQtc3JjICdzZWxmJzsgaW1nLXNyYyAqIGRhdGE6OyBzY3JpcHQtc3JjICdub25lJzsgb2JqZWN0LXNyYyAnc2VsZic7IGZyYW1lLXNyYyAnbm9uZSc7IHN0eWxlLXNyYyAndW5zYWZlLWlubGluZSc7IHJlZmVycmVyIG5vLXJlZmVycmVyO307CgogICAgICAgICMgVXNlIFJlZmVycmVyLVBvbGljeSBoZWFkZXIgdG8gc3VwcHJlc3MgcmVmZXJyZXIgaW5mb3JtYXRpb24gaW4gbW9kZXJuIGJyb3dzZXJzCiAgICAgICAgIyBpbiBvcmRlciB0byBwcmV2ZW50IHJlZmVycmVyLWxlYWsgYXR0YWNrcy4KICAgICAgICAkSGVhZGVyc3snUmVmZXJyZXItUG9saWN5J30gPSAnbm8tcmVmZXJyZXInOwogICAgfQoKICAgIGlmICggJFBhcmFte0NoYXJzZXR9ICkgewogICAgICAgICRIZWFkZXJzeydDb250ZW50LVR5cGUnfSA9ICIkUGFyYW17Q29udGVudFR5cGV9OyBjaGFyc2V0PSRQYXJhbXtDaGFyc2V0fTsiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEhlYWRlcnN7J0NvbnRlbnQtVHlwZSd9ID0gIiRQYXJhbXtDb250ZW50VHlwZX0iOwogICAgfQoKICAgICMgYWRkaXRpb25hbCBoZWFkZXJzIGFyZSBzdXBwb3J0ZWQsIGJ1dCBjdXJyZW50bHkgbm90IHVzZWQKICAgIG15IEBBZGRpdGlvbmFsSGVhZGVycyA9ICggJFBhcmFte0FkZGl0aW9uYWxIZWFkZXJ9IC8vIFtdICktPkAqOwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKS0+SGVhZGVycyggWyAlSGVhZGVycywgQEFkZGl0aW9uYWxIZWFkZXJzIF0gKTsKCiAgICAjIGZpeCBmb3IgZmlyZWZveCBIRUFEIHByb2JsZW0KICAgIG15ICRSZXF1ZXN0TWV0aG9kID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5SZXF1ZXN0TWV0aG9kKCk7CiAgICBpZiAoICRSZXF1ZXN0TWV0aG9kICYmICRSZXF1ZXN0TWV0aG9kIGVxICdIRUFEJyApIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb250ZW50fTsKfQoKPWhlYWQyIEpTT05SZXBseSgpCgpTZXJpYWxpemUgdGhlIHBhc3NlZCBpbiBkYXRhIHN0cnVjdHVyZSBhcyBKU09OLiBUaGUgcmV0dXJuZWQgSlNPTiBpcyBmb3JtYXR0ZWQgaW4gdGhlIGNhbm9uaWNhbCB3YXksCm1lYW5pbmcgdGhhdCBoYXNoIGtleXMgYXJlIHNvcnRlZC4KClRoaXMgbWV0aG9kIGFjdHMgbGlrZSB0aGUgbWV0aG9kIEM8QXR0YWNobWVudD4uCkFzIGEgc2lkZSBlZmZlY3QsIHRoZSBoZWFkZXJzIG9mIHRoZSBIVFRQIHJlc3BvbnNlIGFyZSBzZXQgaW4gdGhlIG9iamVjdCBDPEtlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlPi4KCk1pc3NpbmcgRGF0YSB0aHJvd3MgYSBmYXRhbCBlcnJvci4KCj1jdXQKCnN1YiBKU09OUmVwbHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiR290IG5vICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNlcmlhbGl6ZSBhcyBKU09OLiBUaGUgcGFzc2VkIGluIGRhdGEgaXMgdXN1YWxseSBlaXRoZXIgYSBoYXNoIG9yIGFycmF5IHJlZmVyZW5jZS4KICAgICMgU3RyaW5ncyBhbmQgbnVtYmVycyBhcmUgYWxzbyBzdXBwb3J0ZWQuCiAgICAjIEhhc2gga2V5cyBhcmUgc29ydGVkLgogICAgbXkgJENvbnRlbnQgPSAkU2VsZi0+SlNPTkVuY29kZSgKICAgICAgICBEYXRhICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgU29ydEtleXMgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmLT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCAvLyAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKPWhlYWQyIFBhZ2VOYXZCYXIoKQoKZ2VuZXJhdGVzIGEgcGFnZSBuYXZpZ2F0aW9uIGJhcgoKICAgIG15ICVQYWdlTmF2QmFyID0gJExheW91dE9iamVjdC0+UGFnZU5hdkJhcigKICAgICAgICBMaW1pdCAgICAgICA9PiAxMDAsICAgICAgICAgIyBtYXJrcyByZXN1bHQgb2YgVG90YWxIaXRzIHJlZCBpZiBMaW1pdCBpcyBnZXJhdGVyIHRoZW4gQWxsSGl0cwogICAgICAgIFdpbmRvd1NpemUgID0+IDE1LCAgICAgICAgICAjIG1heCBzaG93biBwYWdlcyB0byBjbGljawogICAgICAgIFN0YXJ0SGl0ICAgID0+IDEsICAgICAgICAgICAjIHN0YXJ0IHRvIHNob3cgaXRlbXMKICAgICAgICBQYWdlU2hvd24gICA9PiAxNSwgICAgICAgICAgIyBudW1iZXIgb2Ygc2hvd24gaXRlbXMgYSBwYWdlCiAgICAgICAgQWxsSGl0cyAgICAgPT4gNTYsICAgICAgICAgICMgbnVtYmVyIG9mIHRvdGFsIGhpdHMKICAgICAgICBBY3Rpb24gICAgICA9PiAnQWdlbnRYWFgnLCAgIyBlLiBnLiAnQWN0aW9uPScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntBY3Rpb259CiAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssICAgICAgICMgZS4gZy4gJ1N1YmFjdGlvbj1WaWV3OycKICAgICAgICBBSkFYUmVwbGFjZSA9PiAnSURFbGVtZW50JywgIyBJREVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkCiAgICAgICAgSURQcmVmaXggICAgPT4gJ1RpY2tldHMnLCAgICMgUHJlZml4IGZvciB0aGUgaWQgcGFyYW1ldGVyCiAgICApOwoKICAgIHJldHVybiB2YWx1ZXMgb2YgaGFzaAoKICAgICAgICBUb3RhbEhpdHMgICMgdG90YWwgaGl0cwogICAgICAgIFJlc3VsdCAgICAgIyBzaG93biBpdGVtcyBlLiBnLiAiMS01IiBvciAiMTYtMzAiCiAgICAgICAgU2l0ZU5hdkJhciAjIGh0bWwgZm9yIHBhZ2UgbmF2IGJhciBlLiBnLiAiMSAyIDMgNCIKCiAgICAgICAgUmVzdWx0TG9uZyAgICAgIyBzaG93biBpdGVtcyBlLiBnLiAiMS01IG9mIDMyIiBvciAiMTYtMzAgb2YgNjQiCiAgICAgICAgU2l0ZU5hdkJhckxvbmcgIyBodG1sIGZvciBwYWdlIG5hdiBiYXIgZS4gZy4gIlBhZ2U6IDEgMiAzIDQiCgo9Y3V0CgpzdWIgUGFnZU5hdkJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gfHwgMDsKICAgICRQYXJhbXtBbGxIaXRzfSAgPSAwIGlmICggISRQYXJhbXtBbGxIaXRzfSApOwogICAgJFBhcmFte1N0YXJ0SGl0fSA9IDAgaWYgKCAhJFBhcmFte0FsbEhpdHN9ICk7CiAgICBteSAkUGFnZXMgICAgICA9IGludCggKCAkUGFyYW17QWxsSGl0c30gLyAkUGFyYW17UGFnZVNob3dufSApICsgMC45OTk5OSApOwogICAgbXkgJFBhZ2UgICAgICAgPSBpbnQoICggJFBhcmFte1N0YXJ0SGl0fSAvICRQYXJhbXtQYWdlU2hvd259ICkgKyAwLjk5OTk5ICk7CiAgICBteSAkV2luZG93U2l6ZSA9ICRQYXJhbXtXaW5kb3dTaXplfSB8fCA1OwogICAgbXkgJElEUHJlZml4ICAgPSAkUGFyYW17SURQcmVmaXh9ICAgfHwgJ0dlbmVyaWMnOwoKICAgICMgYnVpbGQgUmVzdWx0cyAoMS01IG9yIDE2LTMwKQogICAgaWYgKCAkUGFyYW17QWxsSGl0c30gPj0gKCAkUGFyYW17U3RhcnRIaXR9ICsgJFBhcmFte1BhZ2VTaG93bn0gKSApIHsKICAgICAgICAkUGFyYW17UmVzdWx0c30gPSAkUGFyYW17U3RhcnRIaXR9IC4gIi0iIC4gKCAkUGFyYW17U3RhcnRIaXR9ICsgJFBhcmFte1BhZ2VTaG93bn0gLSAxICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17UmVzdWx0c30gPSAiJFBhcmFte1N0YXJ0SGl0fS0kUGFyYW17QWxsSGl0c30iOwogICAgfQoKICAgICMgY2hlY2sgdG90YWwgaGl0cwogICAgaWYgKCAkTGltaXQgPT0gJFBhcmFte0FsbEhpdHN9ICkgewogICAgICAgICRQYXJhbXtUb3RhbEhpdHN9ID0gIjxzcGFuIGNsYXNzPVwiUGFnaW5hdGlvbkxpbWl0XCI+JFBhcmFte0FsbEhpdHN9PC9zcGFuPiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VG90YWxIaXRzfSA9ICRQYXJhbXtBbGxIaXRzfTsKICAgIH0KCiAgICAjIGJ1aWxkIHBhZ2UgbmF2IGJhcgogICAgbXkgJFdpbmRvd1N0YXJ0ID0gc3ByaW50ZiggIiUuMGYiLCAoICRQYXJhbXtTdGFydEhpdH0gLyAkUGFyYW17UGFnZVNob3dufSApICk7CiAgICAkV2luZG93U3RhcnQgPSBpbnQoICggJFdpbmRvd1N0YXJ0IC8gJFdpbmRvd1NpemUgKSApICsgMTsKICAgICRXaW5kb3dTdGFydCA9ICggJFdpbmRvd1N0YXJ0ICogJFdpbmRvd1NpemUgKSAtICgkV2luZG93U2l6ZSk7CiAgICBteSAkQWN0aW9uICAgPSAkUGFyYW17QWN0aW9ufSB8fCAnJzsKICAgIG15ICRMaW5rICAgICA9ICRQYXJhbXtMaW5rfSAgIHx8ICcnOwogICAgbXkgJEJhc2VsaW5rID0gIiRTZWxmLT57QmFzZWxpbmt9JEFjdGlvbjskTGluayI7CiAgICBteSAkaSAgICAgICAgPSAwOwogICAgbXkgJVBhZ2luYXRpb25EYXRhOwogICAgbXkgJFdpZGdldE5hbWU7CiAgICBteSAkQ2xhc3NXaWRnZXROYW1lOwoKICAgIGlmICggJFBhcmFte0FKQVhSZXBsYWNlfSApIHsKICAgICAgICAkV2lkZ2V0TmFtZSA9ICRQYXJhbXtBSkFYUmVwbGFjZX07CiAgICAgICAgJFdpZGdldE5hbWUgPX4gc3stfXt9eG1zZzsKCiAgICAgICAgJENsYXNzV2lkZ2V0TmFtZSA9ICRXaWRnZXROYW1lOwogICAgICAgICRDbGFzc1dpZGdldE5hbWUgPX4gcy9eRGFzaGJvYXJkLy87CiAgICB9CgogICAgd2hpbGUgKCAkaSA8PSAoICRQYWdlcyAtIDEgKSApIHsKICAgICAgICAkaSsrOwoKICAgICAgICAjIHNob3cgbm9ybWFsIHBhZ2UgMSwyLDMsLi4uCiAgICAgICAgaWYgKCAkaSA8PSAoICRXaW5kb3dTdGFydCArICRXaW5kb3dTaXplICkgJiYgJGkgPiAkV2luZG93U3RhcnQgKSB7CiAgICAgICAgICAgIG15ICRCYXNlbGlua0FsbCA9ICRCYXNlbGluawogICAgICAgICAgICAgICAgLiAiU3RhcnRXaW5kb3c9JFdpbmRvd1N0YXJ0O1N0YXJ0SGl0PSIKICAgICAgICAgICAgICAgIC4gKCAoICggJGkgLSAxICkgKiAkUGFyYW17UGFnZVNob3dufSApICsgMSApOwogICAgICAgICAgICBteSAkU2VsZWN0ZWRQYWdlID0gJyc7CiAgICAgICAgICAgIG15ICRQYWdlTnVtYmVyICAgPSAkaTsKCiAgICAgICAgICAgIGlmICggJFBhZ2UgPT0gJGkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRQYWdlID0gJ1NlbGVjdGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CgogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRQYWdlTnVtYmVyfSA9IHsKICAgICAgICAgICAgICAgICAgICBCYXNlbGluayAgICA9PiAkQmFzZWxpbmtBbGwsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlQWpheCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsICA9PiAkQmFzZWxpbmtBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyICAgPT4gJFBhZ2VOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIElEUHJlZml4ICAgICA9PiAkSURQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUGFnZSA9PiAkU2VsZWN0ZWRQYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua0FsbCAgPT4gJEJhc2VsaW5rQWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyICAgPT4gJFBhZ2VOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIElEUHJlZml4ICAgICA9PiAkSURQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUGFnZSA9PiAkU2VsZWN0ZWRQYWdlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3ZlciB3aW5kb3cgIj4+IiBhbmQgIj58IgogICAgICAgIGVsc2lmICggJGkgPiAoICRXaW5kb3dTdGFydCArICRXaW5kb3dTaXplICkgKSB7CiAgICAgICAgICAgIG15ICRCYXNlbGlua09uZUZvcndhcmQgPSAkQmFzZWxpbmsgLiAiU3RhcnRIaXQ9IiAuICggKCAkaSAtIDEgKSAqICRQYXJhbXtQYWdlU2hvd259ICsgMSApOwogICAgICAgICAgICBteSAkQmFzZWxpbmtBbGxGb3J3YXJkID0gJEJhc2VsaW5rIC4gIlN0YXJ0SGl0PSIgLiAoICggJFBhcmFte1BhZ2VTaG93bn0gKiAoICRQYWdlcyAtIDEgKSApICsgMSApOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17QUpBWFJlcGxhY2V9ICkgewogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua09uZUZvcndhcmR9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua09uZUZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua0FsbEZvcndhcmR9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua0FsbEZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlRm9yd2FyZEFqYXgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua09uZUZvcndhcmQgPT4gJEJhc2VsaW5rT25lRm9yd2FyZCwKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxGb3J3YXJkID0+ICRCYXNlbGlua0FsbEZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICAgICAgICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgICAgICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VGb3J3YXJkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtPbmVGb3J3YXJkID0+ICRCYXNlbGlua09uZUZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsRm9yd2FyZCA9PiAkQmFzZWxpbmtBbGxGb3J3YXJkLAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaSA9IDk5OTk5OTk5OwogICAgICAgIH0KCiAgICAgICAgIyBvdmVyIHdpbmRvdyAiPDwiIGFuZCAifDwiCiAgICAgICAgZWxzaWYgKCAkaSA8ICRXaW5kb3dTdGFydCAmJiAoICRpIC0gMSApIDwgJFBhZ2VzICkgewogICAgICAgICAgICBteSAkQmFzZWxpbmtBbGxCYWNrID0gJEJhc2VsaW5rIC4gJ1N0YXJ0SGl0PTE7U3RhcnRXaW5kb3c9MSc7CiAgICAgICAgICAgIG15ICRCYXNlbGlua09uZUJhY2sgPSAkQmFzZWxpbmsgLiAnU3RhcnRIaXQ9JyAuICggKCAkV2luZG93U3RhcnQgLSAxICkgKiAoICRQYXJhbXtQYWdlU2hvd259ICkgKyAxICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CgogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua09uZUJhY2t9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua09uZUJhY2ssCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua0FsbEJhY2t9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua0FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlQmFja0FqYXgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua09uZUJhY2sgPT4gJEJhc2VsaW5rT25lQmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxCYWNrID0+ICRCYXNlbGlua0FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICAgICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtPbmVCYWNrID0+ICRCYXNlbGlua09uZUJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsQmFjayA9PiAkQmFzZWxpbmtBbGxCYWNrLAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaSA9ICRXaW5kb3dTdGFydCAtIDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1BhZ2luYXRpb25EYXRhJyAuICRDbGFzc1dpZGdldE5hbWUsCiAgICAgICAgICAgIFZhbHVlID0+IFwlUGFnaW5hdGlvbkRhdGEKICAgICAgICApOwogICAgfQoKICAgICRQYXJhbXtTZWFyY2hOYXZCYXJ9ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1BhZ2luYXRpb24nLAogICAgICAgIEFKQVggICAgICAgICA9PiAkUGFyYW17QUpBWH0sCiAgICApOwoKICAgICMgb25seSBzaG93IHRvdGFsIGFtb3VudCBvZiBwYWdlcyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCiAgICBpZiAoICRQYWdlcyA+IDEgKSB7CiAgICAgICAgJFBhcmFte05hdkJhckxvbmd9ID0gIi0gIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlBhZ2UiKSAuICI6ICRQYXJhbXtTZWFyY2hOYXZCYXJ9IjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtTZWFyY2hOYXZCYXJ9ID0gJyc7CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICgKICAgICAgICBUb3RhbEhpdHMgID0+ICRQYXJhbXtUb3RhbEhpdHN9LAogICAgICAgIFJlc3VsdCAgICAgPT4gJFBhcmFte1Jlc3VsdHN9LAogICAgICAgIFJlc3VsdExvbmcgPT4gIiRQYXJhbXtSZXN1bHRzfSAiCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgib2YiKQogICAgICAgICAgICAuICIgJFBhcmFte1RvdGFsSGl0c30iLAogICAgICAgIFNpdGVOYXZCYXIgICAgID0+ICRQYXJhbXtTZWFyY2hOYXZCYXJ9LAogICAgICAgIFNpdGVOYXZCYXJMb25nID0+ICRQYXJhbXtOYXZCYXJMb25nfSwKICAgICAgICBMaW5rICAgICAgICAgICA9PiAkUGFyYW17TGlua30sCiAgICApOwp9CgpzdWIgTmF2aWdhdGlvbkJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkUGFyYW17VHlwZX0gPSAkU2VsZi0+e01vZHVsZVJlZ30tPntOYXZCYXJOYW1lfSB8fCAnVGlja2V0JzsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIENyZWF0ZSBtZW51IGl0ZW1zLgogICAgbXkgJU5hdkJhcjsKCiAgICBteSAkRnJvbnRlbmRSZWdpc3RyYXRpb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKTsKICAgIG15ICRGcm9udGVuZE5hdmlnYXRpb24gICA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok5hdmlnYXRpb24nKTsKCiAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICBNT0RVTEU6CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRGcm9udGVuZE5hdmlnYXRpb259ICkgewoKICAgICAgICAjIFNraXAgaWYgbW9kdWxlIGlzIGRpc2FibGVkIGluIGZyb250ZW5kIHJlZ2lzdHJhdGlvbi4KICAgICAgICBuZXh0IE1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9ICk7CgogICAgICAgICMgVG9wLWxldmVsIGZyb250ZW5kIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbiBzaG91bGQgYWx3YXlzIGJlIGEgaGFzaC4KICAgICAgICBuZXh0IE1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfSApOwoKICAgICAgICBteSBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3M7CgogICAgICAgICMgR28gdGhyb3VnaCBhbGwgZGVmaW5lZCBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgbW9kdWxlIGFuZCBzb3J0IHRoZW0gYnkgdGhlIGtleSAoMDAjLU1vZHVsZSkuCiAgICAgICAgTkFWSUdBVElPTl9DT05GSUc6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9IHx8IHt9IH0gKSB7CiAgICAgICAgICAgIG5leHQgTkFWSUdBVElPTl9DT05GSUcgaWYgJEtleSAhfiBte15cZCt9OwoKICAgICAgICAgICAgIyBGSVhNRTogU3VwcG9ydCBib3RoIG9sZCAoSEFTSCkgYW5kIG5ldyAoQVJSQVkgb2YgSEFTSCkgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9ucywgZm9yIHJlYXNvbnMgb2YgYmFja3dhcmRzCiAgICAgICAgICAgICMgICBjb21wYXRpYmlsaXR5LiBPbmNlIHdlIGFyZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gbWlncmF0ZWQgY29ycmVjdGx5LCBzdXBwb3J0IGZvciBIQVNILW9ubHkKICAgICAgICAgICAgIyAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRyb3BwZWQgaW4gZnV0dXJlIG1ham9yIHJlbGVhc2UuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9LT57JEtleX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgQHsgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9LT57JEtleX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTa2lwIGluY29tcGF0aWJsZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgTkFWSUdBVElPTl9DT05GSUc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIElURU06CiAgICAgICAgZm9yIG15ICRJdGVtIChATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3MpIHsKICAgICAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e05hdkJhcn07CgogICAgICAgICAgICAkSXRlbS0+e0NTU30gPSAnJzsKCiAgICAgICAgICAgICMgSGlnaGxpZ2h0IGFjdGl2ZSBhcmVhIGxpbmsuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggJEl0ZW0tPntUeXBlfSAmJiAkSXRlbS0+e1R5cGV9IGVxICdNZW51JyApCiAgICAgICAgICAgICAgICAmJiAoICRJdGVtLT57TmF2QmFyfSAmJiAkSXRlbS0+e05hdkJhcn0gZXEgJFBhcmFte1R5cGV9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDU1N9IC49ICcgU2VsZWN0ZWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSW5oZXJpdFBlcm1pc3Npb25zID0gMDsKCiAgICAgICAgICAgICMgSW5oZXJpdCBwZXJtaXNzaW9ucyBmcm9tIGZyb250ZW5kIHJlZ2lzdHJhdGlvbiBpZiBubyBwZXJtaXNzaW9ucyB3ZXJlIGRlZmluZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIGVudHJ5LgogICAgICAgICAgICBpZiAoICEkSXRlbS0+e0dyb3VwUm99ICYmICEkSXRlbS0+e0dyb3VwfSApIHsKICAgICAgICAgICAgICAgIGlmICggJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57R3JvdXBSb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntHcm91cFJvfSA9ICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+e0dyb3VwUm99OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPntHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntHcm91cH0gPSAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPntHcm91cH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkSW5oZXJpdFBlcm1pc3Npb25zID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNob3duID0gMDsKCiAgICAgICAgICAgIFBFUk1JU1NJT046CiAgICAgICAgICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKCiAgICAgICAgICAgICAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYgJEl0ZW0tPntHcm91cFJvfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkSXRlbS0+e0dyb3VwUm99IH0KICAgICAgICAgICAgICAgICAgICAmJiByZWYgJEl0ZW0tPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEl0ZW0tPntHcm91cH0gfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEFycmF5IGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPnskUGVybWlzc2lvbn0gJiYgcmVmICRJdGVtLT57JFBlcm1pc3Npb259IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIEB7ICRJdGVtLT57JFBlcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyA/ICdybycgOiAncncnLAoKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIElmIHdlIHBhc3NlZCB0aGUgaW5pdGlhbCBwZXJtaXNzaW9uIGNoZWNrIGFuZCBkaWRuJ3QgaW5oZXJpdCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBtb2R1bGUgcmVnaXN0cmF0aW9uLAogICAgICAgICAgICAjICAgbWFrZSBzdXJlIHRvIGFsc28gY2hlY2sgYWNjZXNzIHRvIHRoZSBtb2R1bGUsIHNpbmNlIG5hdmlnYXRpb24gaXRlbSBtaWdodCBiZSBvdXQgb2Ygc3luYy4KICAgICAgICAgICAgaWYgKCAkU2hvd24gJiYgISRJbmhlcml0UGVybWlzc2lvbnMgKSB7CiAgICAgICAgICAgICAgICBteSAkTW9kdWxlUGVybWlzc2lvbjsKCiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OOgogICAgICAgICAgICAgICAgZm9yIG15ICRQZXJtaXNzaW9uIChxdyhHcm91cFJvIEdyb3VwKSkgewoKICAgICAgICAgICAgICAgICAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwUm99IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9LT57R3JvdXB9IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAkTW9kdWxlUGVybWlzc2lvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgQXJyYXkgYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57JE1vZHVsZX0tPnskUGVybWlzc2lvbn0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9LT57JFBlcm1pc3Npb259IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+eyRQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEdyb3VwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyA/ICdybycgOiAncncnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEhhc1Blcm1pc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTW9kdWxlUGVybWlzc2lvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgSGlkZSBpdGVtIGlmIG5vIHBlcm1pc3Npb24gd2FzIGdyYW50ZWQgdG8gYWNjZXNzIHRoZSBtb2R1bGUuCiAgICAgICAgICAgICAgICBpZiAoICEkTW9kdWxlUGVybWlzc2lvbiApIHsKICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IElURU0gaWYgISRTaG93bjsKCiAgICAgICAgICAgICMgc2V0IHByaW8gb2YgaXRlbQogICAgICAgICAgICBteSAkS2V5ID0gKCAkSXRlbS0+e0Jsb2NrfSB8fCAnJyApIC4gc3ByaW50ZiggIiUwN2QiLCAkSXRlbS0+e1ByaW99ICk7CiAgICAgICAgICAgIENPVU5UOgogICAgICAgICAgICBmb3IgKCAxIC4uIDUxICkgewogICAgICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAhJE5hdkJhcnskS2V5fTsKCiAgICAgICAgICAgICAgICAkSXRlbS0+e1ByaW99Kys7CiAgICAgICAgICAgICAgICAkS2V5ID0gKCAkSXRlbS0+e0Jsb2NrfSB8fCAnJyApIC4gc3ByaW50ZiggIiUwN2QiLCAkSXRlbS0+e1ByaW99ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBhcyBtYWluIG1lbnUKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1R5cGV9IGVxICdNZW51JyApIHsKICAgICAgICAgICAgICAgICROYXZCYXJ7JEtleX0gPSAkSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFzIHN1YiBvZiBtYWluIG1lbnUKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTmF2QmFye1N1Yn0tPnsgJEl0ZW0tPntOYXZCYXJ9IH0tPnskS2V5fSA9ICRJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIFJ1biB0aGUgbWVudSBpdGVtIG1vZHVsZXMgZm9yIHR3ZWFraW5nIHRoZSBtYWluIG1lbnUuCiAgICAjIFRoZXNlIG1vZHVsZXMgbWF5IGFkZCBvciByZW1vdmUgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIGxpc3RzLgogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgfTsKCiAgICAgICAgTUVOVU1PRFVMRToKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgISRPYmplY3Q7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJU5hdkJhciA9ICgKICAgICAgICAgICAgICAgICVOYXZCYXIsCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICAgICBOYXZCYXIgPT4gXCVOYXZCYXIgfHwge30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHRoZSBtYWluIG1lbnUKICAgIElURU06CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTmF2QmFyICkgewogICAgICAgIG5leHQgSVRFTSBpZiAkS2V5IGVxICdTdWInOwogICAgICAgIG5leHQgSVRFTSBpZiAhJXsgJE5hdkJhcnskS2V5fSB9OwogICAgICAgIG15ICRJdGVtID0gJE5hdkJhcnskS2V5fTsKICAgICAgICAkSXRlbS0+e05hbWVGb3JJRH0gPSAkSXRlbS0+e05hbWV9OwogICAgICAgICRJdGVtLT57TmFtZUZvcklEfSA9fiBzL1sgJjtdLy9pZzsKICAgICAgICBteSAkU3ViID0gJE5hdkJhcntTdWJ9LT57ICRJdGVtLT57TmF2QmFyfSB9OwoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1BcmVhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRJdGVtfSwKICAgICAgICAgICAgICAgIEFjY2Vzc0tleVJlZmVyZW5jZSA9PiAkSXRlbS0+e0FjY2Vzc0tleX0gPyAiICgkSXRlbS0+e0FjY2Vzc0tleX0pIiA6ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBzdWIgbWVudSAob25seSBpZiBzdWIgZWxlbWVudHMgYXZhaWxhYmxlKQogICAgICAgIG5leHQgSVRFTSBpZiAhJFN1YjsKICAgICAgICBuZXh0IElURU0gaWYgIWtleXMgJXskU3VifTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJdGVtQXJlYVN1YicsCiAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTb3J0IEFkbWluIHN1YiBtb2R1bGVzIChmYXZvcml0ZXMpIGNvcnJlY3RseS4gU2VlIGJ1ZyMxMzEwMyBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgIG15IEBTdWJzID0gc29ydCBrZXlzICV7JFN1Yn07CiAgICAgICAgaWYgKCAkSXRlbS0+e05hbWVGb3JJRH0gZXEgJ0FkbWluJyApIHsKICAgICAgICAgICAgQFN1YnMgPSBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyRTdWJ9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRLZXkgKEBTdWJzKSB7CiAgICAgICAgICAgIG15ICRJdGVtU3ViID0gJFN1Yi0+eyRLZXl9OwogICAgICAgICAgICAkSXRlbVN1Yi0+e05hbWVGb3JJRH0gPSAkSXRlbVN1Yi0+e05hbWV9OwogICAgICAgICAgICAkSXRlbVN1Yi0+e05hbWVGb3JJRH0gPX4gcy9bICY7XS8vaWc7CiAgICAgICAgICAgICRJdGVtU3ViLT57TmFtZVRvcH0gPSAkSXRlbS0+e05hbWVGb3JJRH07CiAgICAgICAgICAgICRJdGVtU3ViLT57RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICB8fD0gJEl0ZW1TdWItPntOYW1lfTsgICAgIyB1c2UgJ25hbWUnIGFzIGZhbGxiYWNrLCB0aGlzIGlzIHNob3duIGFzIHRoZSBsaW5rIHRpdGxlCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1BcmVhU3ViSXRlbScsICAgICMkSXRlbS0+e0Jsb2NrfSB8fCAnSXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRJdGVtU3VifSwKICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLZXlSZWZlcmVuY2UgPT4gJEl0ZW1TdWItPntBY2Nlc3NLZXl9ID8gIiAoJEl0ZW1TdWItPntBY2Nlc3NLZXl9KSIgOiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHVzZXIgcHJlZmVyZW5jZXMgZm9yIGN1c3RvbSBuYXYgYmFyIGl0ZW0gb3JkZXJpbmcKICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkTmF2YmFyT3JkZXJJdGVtcyA9ICRVc2VyUHJlZmVyZW5jZXN7J1VzZXJOYXZCYXJJdGVtc09yZGVyJ30gfHwgJyc7CiAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXZiYXJPcmRlckl0ZW1zJywKICAgICAgICBWYWx1ZSA9PiAkTmF2YmFyT3JkZXJJdGVtcywKICAgICk7CgogICAgbXkgJEZyb250ZW5kU2VhcmNoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6U2VhcmNoJykgfHwge307CgogICAgbXkgJFNlYXJjaEFkZGVkOwoKICAgICMgc2hvdyBzZWFyY2ggaWNvbiBpZiBhbnkgc2VhcmNoIHJvdXRlciBpcyBjb25maWd1cmVkCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRGcm9udGVuZFNlYXJjaCkgKSB7CgogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRGcm9udGVuZFNlYXJjaH0gKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJEZyb250ZW5kU2VhcmNoLT57JEtleX0gKTsKCiAgICAgICAgICAgIGZvciBteSAkUmVnZXggKCBzb3J0IGtleXMgJXsgJEZyb250ZW5kU2VhcmNoLT57JEtleX0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkUmVnZXg7CgogICAgICAgICAgICAgICAgIyBDaGVjayBpZiByZWdleCBtYXRjaGVzIGN1cnJlbnQgYWN0aW9uLgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0FjdGlvbn0gPX4gbXskUmVnZXh9ZyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IEFjdGlvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgICAgIG15ICgkQWN0aW9uKSA9ICRGcm9udGVuZFNlYXJjaC0+eyRLZXl9LT57JFJlZ2V4fSA9fiBte0FjdGlvbj0oLio/KSg7LiopPyR9OwoKICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBzaG93IFNlYXJjaCBpY29uIGlmIGFjdGlvbiBpcyBub3QgcmVnaXN0ZXJlZC4KICAgICAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57JEFjdGlvbn07CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoSWNvbicsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEFkZGVkID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEtFWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIElmIFNlYXJjaCBpY29uIGlzIG5vdCBhZGRlZCwgY2hlY2sgaWYgQWdlbnRUaWNrZXRTZWFyY2ggaXMgZW5hYmxlZCBhbmQgYWRkIGl0LgogICAgaWYgKCAhJFNlYXJjaEFkZGVkICYmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+e0FnZW50VGlja2V0U2VhcmNofSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEljb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TmF2aWdhdGlvbkJhcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgUnVuIG5hdiBiYXIgb3V0cHV0IG1vZHVsZXMuIE5hdiBiYXIgb3V0cHV0IGFyZSBub3QgdXNlZCBpbiBPVE9CTyBjb3JlLAogICAgIyBidXQgY2FuIGJlIHVzZWQgYnkgT1RPQk8gcGFja2FnZXMuIFRoZSBvdXRwdXQgb2YgYSBuYXYgYmFyIG91dHB1dCBtb2R1bGUKICAgICMgaXMgc3BsaWNlZCBpbiBiZXR3ZWVuIHRoZSBtYWluIG1lbnUgYW5kIHRoZSBub3RpZmljYXRpb24uCiAgICBteSAkTmF2QmFyT3V0cHV0TW9kdWxlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyT3V0cHV0TW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkTmF2QmFyT3V0cHV0TW9kdWxlQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICROYXZCYXJPdXRwdXRNb2R1bGVDb25maWctPiUqOwoKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgSk9CIHVubGVzcyAkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgSk9CIHVubGVzcyAkT2JqZWN0OwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRPdXRwdXQgLj0gJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biBub3RpZmljYXRpb24gbW9kdWxlcwogICAgbXkgJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6Tm90aWZ5TW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkRnJvbnRlbmROb3RpZnlNb2R1bGVDb25maWcgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnLT4lKjsKCiAgICAgICAgSk9COgogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IEpPQiB1bmxlc3MgJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEpPQiB1bmxlc3MgJE9iamVjdDsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkT3V0cHV0IC49ICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gbmF2IGJhciBtb2R1bGUKICAgIGlmICggJFNlbGYtPntOYXZpZ2F0aW9uTW9kdWxlfSApIHsKCiAgICAgICAgIyBydW4gbmF2YmFyIG1vZHVsZXMKICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57TmF2aWdhdGlvbk1vZHVsZX0gfTsKCiAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3tNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgbXkgJE9iamVjdCA9ICRKb2Jze01vZHVsZX0tPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkT2JqZWN0ICkgewogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICRPdXRwdXQgLj0gJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiBcJUpvYnMgKTsKICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFRyYW5zZm9ybURhdGVTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBrZXkgcHJlZml4CiAgICBteSAkUHJlZml4ID0gJFBhcmFte1ByZWZpeH0gfHwgJyc7CgogICAgIyB0aW1lIHpvbmUgdHJhbnNsYXRpb24gaWYgbmVlZGVkCiAgICAjIGZyb20gdXNlciB0aW1lIHpvbmUgdG8gT1RPQk8gdGltZSB6b25lCiAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFllYXIgICAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgTW9udGggICAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9LAogICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSwKICAgICAgICAgICAgICAgIEhvdXIgICAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgfHwgMCwKICAgICAgICAgICAgICAgIE1pbnV0ZSAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gfHwgMCwKICAgICAgICAgICAgICAgIFNlY29uZCAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdTZWNvbmQnIH0gfHwgMCwKICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJERhdGVUaW1lT2JqZWN0KSB7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgIG15ICREYXRlVGltZVZhbHVlcyA9ICREYXRlVGltZU9iamVjdC0+R2V0KCk7CgogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSAgID0gJERhdGVUaW1lVmFsdWVzLT57WWVhcn07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntNb250aH07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdEYXknIH0gICAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntEYXl9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnSG91cicgfSAgID0gJERhdGVUaW1lVmFsdWVzLT57SG91cn07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gPSAkRGF0ZVRpbWVWYWx1ZXMtPntNaW51dGV9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnU2Vjb25kJyB9ID0gJERhdGVUaW1lVmFsdWVzLT57U2Vjb25kfTsKICAgICAgICB9CiAgICB9CgogICAgIyByZXNldCBwcmVmaXgKICAgICRQYXJhbXtQcmVmaXh9ID0gJyc7CgogICAgcmV0dXJuICVQYXJhbTsKfQoKPWhlYWQyIEJ1aWxkRGF0ZVNlbGVjdGlvbigpCgpidWlsZCB0aGUgSFRNTCBjb2RlIHRvIHJlcHJlc2VudCBhIGRhdGUgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBkYXRhLgpEZXBlbmRpbmcgb24gdGhlIFN5c0NvbmZpZyBzZXR0aW5ncyB0aGUgY29udHJvbHMgdG8gc2V0IHRoZSBkYXRlIGNvdWxkIGJlIG11bHRpcGxlIHNlbGVjdCBvciBpbnB1dCBmaWVsZHMKCiAgICBteSAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICdzb21lIHByZWZpeCcsICAgICAgICAjIG9wdGlvbmFsLCAobmVlZGVkIHRvIHNwZWNpZnkgb3RoZXIgcGFyYW1ldGVycykKICAgICAgICA8UHJlZml4PlllYXIgICAgID0+IDIwMTUsICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IHllYXIsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5Nb250aCAgICA9PiA2LCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBtb250aCwgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgdmFsdWUKICAgICAgICA8UHJlZml4PkRheSAgICAgID0+IDksICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGRheSwgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgdmFsdWUKICAgICAgICA8UHJlZml4PkhvdXIgICAgID0+IDEyLCAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGhvdXIsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5NaW51dGUgICA9PiAyNiwgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBtaW51dGUsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5TZWNvbmQgICA9PiA1OSwgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBzZWNvbmQsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5PcHRpb25hbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwLCB3aGVuIGFjdGl2ZSBhIGNoZWNrYm94IGlzIGluY2x1ZGVkIHRvIHNwZWNpZnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgaWYgdGhlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgb3Igbm90CiAgICAgICAgPFByZWZpeD5Vc2VkICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwLCB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY2hlY2tib3gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgbWVudGlvbmVkIGFib3ZlCiAgICAgICAgPHByZWZpeD5DbGFzcyAgICA9PiAnc29tZSBjbGFzcycsICAgICAgICAgIyBvcHRpb25hbCwgc3BlY2lmeSBhbiBhZGRpdGlvbmFsIGNsYXNzIHRvIHRoZSBIVE1MIGVsZW1lbnRzCiAgICAgICAgRGlmZlRpbWUgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwLCB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB0aW1lIGluZmx1ZW5jaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBjdXJyZW50IHRpbWUgKGluIHNlY29uZHMpCiAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgd2hlbiBhY3RpdmUgdGhlIHRpbWUgaXMgbm90IHRyYW5zbGF0ZWQgdG8gdGhlIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgdGltZSB6b25lCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAzLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgdXNlZCB0byBkZWZpbmUgdGhlIG51bWJlciBvZiB5ZWFycyBpbiBmdXR1cmUgdG8gYmUgZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBpbiB0aGUgeWVhciBzZWxlY3QKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDIsICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCB1c2VkIHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIHllYXJzIGluIHBhc3QgdG8gYmUgZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBpbiB0aGUgeWVhciBzZWxlY3QKICAgICAgICBZZWFyRGlmZiAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLiB1c2VkIHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIHllYXJzIHRvIGJlIGRpc3BsYXllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBpbiB0aGUgeWVhciBzZWxlY3QgKGFsdGVybmF0aXZlbHkgdG8gWWVhclBlcmlvZEZ1dHVyZSBhbmQgWWVhclBlcmlvZFBhc3QpCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgICAgID0+IDEsICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgd2hlbiBhY3RpdmUgc2V0cyBhbiBzcGVjaWFsIGNsYXNzIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyB0byBiZSBpbiB0aGUgZnV0dXJlCiAgICAgICAgVmFsaWRhdGVEYXRlTm90SW5GdXR1cmUgID0+IDEsICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgd2hlbiBhY3RpdmUgc2V0cyBhbiBzcGVjaWFsIGNsYXNzIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyBub3QgdG8gYmUgaW4gdGhlIGZ1dHVyZQogICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ICA9PiAnU3RhcnQnLCAgICAgICMgb3B0aW9uYWwgKFByZWZpeCksIHdoZW4gZGVmaW5lZCBzZXRzIGEgc3BlY2lhbCBjbGFzcyB0byB2YWxpZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0aGF0IHRoZSBkYXRlIHNldCBpbiB0aGUgY29udHJvbHMgY29tZXMgYWZ0ZXIgdGhlIGRhdGUgd2l0aCBQcmVmaXgKICAgICAgICBWYWxpZGF0ZURhdGVBZnRlclZhbHVlICAgPT4gJzIwMTYtMDEtMDEnLCAjIG9wdGlvbmFsIChEYXRlKSwgd2hlbiBkZWZpbmVkIHNldHMgYSBzcGVjaWFsIGRhdGEgcGFyYW1ldGVyIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyBjb21lcyBhZnRlciB0aGUgc3VwcGxpZWQgZGF0ZQogICAgICAgIFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCA9PiAnRW5kJywgICAgICAgICMgb3B0aW9uYWwgKFByZWZpeCksIHdoZW4gZGVmaW5lZCBzZXRzIGEgc3BlY2lhbCBjbGFzcyB0byB2YWxpZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0aGF0IHRoZSBkYXRlIHNldCBpbiB0aGUgY29udHJvbHMgY29tZXMgYmVmb3JlIHRoZSBkYXRlIHdpdGggUHJlZml4CiAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlVmFsdWUgID0+ICcyMDE2LTAxLTAxJywgIyBvcHRpb25hbCAoRGF0ZSksIHdoZW4gZGVmaW5lZCBzZXRzIGEgc3BlY2lhbCBkYXRhIHBhcmFtZXRlciB0byB2YWxpZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0aGF0IHRoZSBkYXRlIHNldCBpbiB0aGUgY29udHJvbHMgY29tZXMgYmVmb3JlIHRoZSBzdXBwbGllZCBkYXRlCiAgICAgICAgQ2FsZW5kYXIgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgdXNlZCB0byBkZWZpbmUgdGhlIFN5c0NvbmZpZyBjYWxlbmRhciBvbiB3aGljaCB0aGUgRGF0ZXBpY2tlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB3aWxsIGJlIGJhc2VkIG9uIHRvIHNob3cgdGhlIHZhY2F0aW9uIGRheXMgYW5kIHRoZSBzdGFydCB3ZWVrIGRheQogICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAgICAgICAgICMgb3B0aW9uYWwsIG9yICdEYXRlSW5wdXRGb3JtYXRMb25nJywgdXNlZCB0byBkZWZpbmUgaWYgb25seSBkYXRlIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGRhdGUvdGltZSBjb21wb25lbnRzIHNob3VsZCBiZSBzaG93biAoRGF0ZUlucHV0Rm9ybWF0TG9uZyBzaG93cyBkYXRlL3RpbWUpCiAgICAgICAgVmFsaWRhdGUgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgZGVmaW5lcyBpZiB0aGUgZGF0ZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHZhbGlkYXRlZCBvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBjbGllbnQgc2lkZSB3aXRoIEpTCiAgICAgICAgRGlzYWJsZWQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgd2hlbiBhY3RpdmUgc2VsZWN0IGFuZCBjaGVja2JveCBjb250cm9scyBnZXRzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIGlucHV0IGZpZWxkcyBnZXRzIHRoZSByZWFkIG9ubHkgYXR0cmlidXRlCiAgICAgICAgU3VmZml4ID0+ICdzb21lIHN1ZmZpeCcsICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgaXMgYXR0YWNoZWQgYXQgdGhlIGVuZCBvZiBOYW1lcywgSURzIGV0Yy4KICAgICAgICBRdWlja0RhdGVCdXR0b25zID0+IFxAUXVpY2tEYXRlQnV0dG9ucywgICAjIG9wdGlvbmFsLCBjb25maWcgb2YgcXVpY2sgZGF0ZSBidXR0b25zIHRvIHVzZQogICAgKTsKCj1jdXQKCnN1YiBCdWlsZERhdGVTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkRGF0ZUlucHV0U3R5bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpbWVJbnB1dEZvcm1hdCcpOwogICAgbXkgJE1pbnV0ZVN0ZXAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaW1lSW5wdXRNaW51dGVzU3RlcCcpOwogICAgbXkgJFByZWZpeCAgICAgICAgID0gJFBhcmFte1ByZWZpeH0gfHwgJyc7CiAgICBteSAkU3VmZml4ICAgICAgICAgPSAkUGFyYW17U3VmZml4fSB8fCAnJzsKCiAgICAjIHNhbml0aXplIHByZWZpeCBhbmQgc3VmZml4CiAgICAjICAgYWxsb3cgdGhlIGZvbGxvd2luZzoKICAgICMgICAgICAgLSBjaGFyYWN0ZXJzIChub3Qgb25seSBBLVphLXosIGFzIHVtbGF1dHMgc2hvdWxkIGJlIGFsbG93ZWQgYXMgd2VsbCkKICAgICMgICAgICAgLSBkaWdpdHMgKGFyYWJpYyBhcyB3ZWxsIGFzIG5vbi1hcmFiaWMpCiAgICAjICAgICAgIC0gZGFzaCAoZS5nLiBmb3IgZHluYW1pYyBmaWVsZCBuYW1lc3BhY2VzKQogICAgIyAgICAgICAtIHVuZGVyc2NvcmUKICAgICMgICAgICAgLSA6IGFuZCAjIChlLmcuIGZvciBzeXN0ZW0gY29uZmlndXJhdGlvbiBuYW1lcykKICAgICRQcmVmaXggPX4gcy9bXlx3XGRcLV86I10vL2c7CiAgICAkU3VmZml4ID1+IHMvW15cd1xkXC1fOiNdLy9nOwoKICAgIG15ICREaWZmVGltZSA9ICRQYXJhbXtEaWZmVGltZX0gfHwgMDsKICAgIG15ICRGb3JtYXQgICA9ICRQYXJhbXtGb3JtYXR9IC8vICdEYXRlSW5wdXRGb3JtYXRMb25nJzsKICAgIG15ICRPcHRpb25hbCA9ICRQYXJhbXsgJFByZWZpeCAuICdPcHRpb25hbCcgfSB8fCAwOwogICAgbXkgJFVzZWQgICAgID0gJFBhcmFteyAkUHJlZml4IC4gJ1VzZWQnIH0gICAgIHx8IDA7CiAgICBteSAkQ2xhc3MgICAgPSAkUGFyYW17ICRQcmVmaXggLiAnQ2xhc3MnIH0gICAgfHwgJyc7CgogICAgIyBEZWZpbmVzLCBpZiB0aGUgZGF0ZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiBjbGllbnQgc2lkZSB3aXRoIEpTCiAgICBteSAkVmFsaWRhdGUgPSAkUGFyYW17VmFsaWRhdGV9IHx8IDA7CgogICAgIyBWYWxpZGF0ZSB0aGF0IHRoZSBkYXRlIGlzIGluIHRoZSBmdXR1cmUgKGUuIGcuIHBlbmRpbmcgdGltZXMpCiAgICBteSAkVmFsaWRhdGVEYXRlSW5GdXR1cmUgICAgPSAkUGFyYW17VmFsaWRhdGVEYXRlSW5GdXR1cmV9ICAgIHx8IDA7CiAgICBteSAkVmFsaWRhdGVEYXRlTm90SW5GdXR1cmUgPSAkUGFyYW17VmFsaWRhdGVEYXRlTm90SW5GdXR1cmV9IHx8IDA7CgogICAgIyBWYWxpZGF0ZSB0aGF0IHRoZSBkYXRlIGlzIHNldCBhZnRlci9iZWZvcmUgc3VwcGxpZWQgZGF0ZQogICAgbXkgJFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ICA9ICRQYXJhbXtWYWxpZGF0ZURhdGVBZnRlclByZWZpeH0gIHx8ICcnOwogICAgbXkgJFZhbGlkYXRlRGF0ZUFmdGVyVmFsdWUgICA9ICRQYXJhbXtWYWxpZGF0ZURhdGVBZnRlclZhbHVlfSAgIHx8ICcnOwogICAgbXkgJFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCA9ICRQYXJhbXtWYWxpZGF0ZURhdGVCZWZvcmVQcmVmaXh9IHx8ICcnOwogICAgbXkgJFZhbGlkYXRlRGF0ZUJlZm9yZVZhbHVlICA9ICRQYXJhbXtWYWxpZGF0ZURhdGVCZWZvcmVWYWx1ZX0gIHx8ICcnOwoKICAgIG15ICRHZXRDdXJTeXNEVFVuaXRGcm9tTG93ZXN0ID0gc3ViIHsKICAgICAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17QWRkU2Vjb25kc30gKSB7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+QWRkKCBTZWNvbmRzID0+ICRQYXJhbXtBZGRTZWNvbmRzfSApOwogICAgICAgIH0KCiAgICAgICAgbXkgJURldGFpbHMgPSAleyAkRGF0ZVRpbWVPYmplY3QtPkdldCgpIH07CgogICAgICAgIHJldHVybiBtYXAgeyAkRGV0YWlsc3skX30gfSAocXcoU2Vjb25kIE1pbnV0ZSBIb3VyIERheSBNb250aCBZZWFyKSk7CiAgICB9OwoKICAgIG15ICggdW5kZWYsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJEdldEN1clN5c0RUVW5pdEZyb21Mb3dlc3QtPigKICAgICAgICBBZGRTZWNvbmRzID0+ICREaWZmVGltZSwKICAgICk7CiAgICBteSAoIHVuZGVmLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCB1bmRlZiwgJENZICkgPSAkR2V0Q3VyU3lzRFRVbml0RnJvbUxvd2VzdC0+KCk7CgogICAgIyB0aW1lIHpvbmUgdHJhbnNsYXRpb24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e1VzZXJUaW1lWm9uZX0KICAgICAgICAmJiAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfQogICAgICAgICYmICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfQogICAgICAgICYmICRQYXJhbXsgJFByZWZpeCAuICdEYXknIH0KICAgICAgICAmJiAhJFBhcmFte092ZXJyaWRlVGltZVpvbmV9CiAgICAgICAgKQogICAgewogICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSwKICAgICAgICAgICAgICAgIERheSAgICA9PiAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9LAogICAgICAgICAgICAgICAgSG91ciAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgfHwgMCwKICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiAkUGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9IHx8IDAsCiAgICAgICAgICAgICAgICBTZWNvbmQgPT4gJFBhcmFteyAkUHJlZml4IC4gJ1NlY29uZCcgfSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICgkRGF0ZVRpbWVPYmplY3QpIHsKICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0gKTsKICAgICAgICAgICAgbXkgJERhdGVUaW1lVmFsdWVzID0gJERhdGVUaW1lT2JqZWN0LT5HZXQoKTsKCiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9ICAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntZZWFyfTsKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9ICA9ICREYXRlVGltZVZhbHVlcy0+e01vbnRofTsKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXRlVGltZVZhbHVlcy0+e0RheX07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntIb3VyfTsKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ01pbnV0ZScgfSA9ICREYXRlVGltZVZhbHVlcy0+e01pbnV0ZX07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdTZWNvbmQnIH0gPSAkRGF0ZVRpbWVWYWx1ZXMtPntTZWNvbmR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHllYXIKICAgIGlmICggJERhdGVJbnB1dFN0eWxlIGVxICdPcHRpb24nICkgewogICAgICAgIG15ICVZZWFyOwogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17WWVhclBlcmlvZFBhc3R9ICYmIGRlZmluZWQgJFBhcmFte1llYXJQZXJpb2RGdXR1cmV9ICkgewogICAgICAgICAgICBmb3IgKCAkWSAtICRQYXJhbXtZZWFyUGVyaW9kUGFzdH0gLi4gJFkgKyAkUGFyYW17WWVhclBlcmlvZEZ1dHVyZX0gKSB7CiAgICAgICAgICAgICAgICAkWWVhcnskX30gPSAkXzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yICggMjAwMSAuLiAkWSArIDEgKyAoICRQYXJhbXtZZWFyRGlmZn0gfHwgMCApICkgewogICAgICAgICAgICAgICAgJFllYXJ7JF99ID0gJF87CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgaWYgdGhlIERpZmZUaW1lIGlzIGluIGEgZnV0dXJlIHllYXIuIEluIHRoaXMgY2FzZSwgd2UgYWRkIHRoZSBtaXNzaW5nIHllYXJzIGJldHdlZW4KICAgICAgICAjICRDWSAoY3VycmVudCB5ZWFyKSBhbmQgJFkgKHllYXIpIHRvIGFsbG93IHRoZSB1c2VyIHRvIG1hbnVhbGx5IHNldCBiYWNrIHRoZSB5ZWFyIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRZID4gJENZICkgewogICAgICAgICAgICBmb3IgKCAkQ1kgLi4gJFkgKSB7CiAgICAgICAgICAgICAgICAkWWVhcnskX30gPSAkXzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1llYXJ9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkUHJlZml4IC4gJ1llYXInLAogICAgICAgICAgICBJRCAgICAgICAgICA9PiAkUHJlZml4IC4gJ1llYXInIC4gJFN1ZmZpeCwKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVZZWFyLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9IHx8ICRZICksCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRWYWxpZGF0ZSA/ICJWYWxpZGF0ZV9EYXRlWWVhciAkQ2xhc3MiIDogJENsYXNzLAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdZZWFyJyksCiAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtZZWFyfSA9CiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgJwogICAgICAgICAgICAuICggJFZhbGlkYXRlID8gcXF7Y2xhc3M9IlZhbGlkYXRlX0RhdGVZZWFyICRDbGFzcyIgfSA6IHFxe2NsYXNzPSIkQ2xhc3MiIH0gKQogICAgICAgICAgICAuIHFxe25hbWU9IiR7UHJlZml4fVllYXIiIGlkPSIke1ByZWZpeH1ZZWFyJHtTdWZmaXh9IiBzaXplPSI0IiBtYXhsZW5ndGg9IjQiIH0KICAgICAgICAgICAgLiBzcHJpbnRmKCAndGl0bGU9IiVzIiAnLCAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1llYXInKSApCiAgICAgICAgICAgIC4gc3ByaW50ZiggJ3ZhbHVlPSIlMDJkIiAnLCAoICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9IHx8ICRZICkgKQogICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdyZWFkb25seScgOiAnJyApCiAgICAgICAgICAgIC4gJz4nOwogICAgfQoKICAgICMgbW9udGgKICAgIGlmICggJERhdGVJbnB1dFN0eWxlIGVxICdPcHRpb24nICkgewogICAgICAgIG15ICVNb250aCA9IG1hcCB7ICRfID0+IHNwcmludGYoICIlMDJkIiwgJF8gKTsgfSAoIDEgLi4gMTIgKTsKICAgICAgICAkUGFyYW17TW9udGh9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkUHJlZml4IC4gJ01vbnRoJywKICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJFByZWZpeCAuICdNb250aCcgLiAkU3VmZml4LAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJU1vbnRoLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSB8fCAkTSApLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkVmFsaWRhdGUgPyAiVmFsaWRhdGVfRGF0ZU1vbnRoICRDbGFzcyIgOiAkQ2xhc3MsCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ01vbnRoJyksCiAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtNb250aH0gPQogICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiICcKICAgICAgICAgICAgLiAoICRWYWxpZGF0ZSA/IHFxe2NsYXNzPSJWYWxpZGF0ZV9EYXRlTW9udGggJENsYXNzIiB9IDogcXF7Y2xhc3M9IiRDbGFzcyIgfSApCiAgICAgICAgICAgIC4gcXF7bmFtZT0iJHtQcmVmaXh9TW9udGgiIGlkPSIke1ByZWZpeH1Nb250aCR7U3VmZml4fSIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiB9CiAgICAgICAgICAgIC4gc3ByaW50ZiggJ3RpdGxlPSIlcyIgJywgICAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNb250aCcpICkKICAgICAgICAgICAgLiBzcHJpbnRmKCAndmFsdWU9IiUwMmQiICcsICggJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9IHx8ICRNICkgKQogICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdyZWFkb25seScgOiAnJyApCiAgICAgICAgICAgIC4gJz4nOwogICAgfQoKICAgIG15ICREYXRlVmFsaWRhdGVDbGFzc2VzID0gJyc7CiAgICBpZiAoJFZhbGlkYXRlKSB7CiAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMKICAgICAgICAgICAgLj0gIlZhbGlkYXRlX0RhdGVEYXkgVmFsaWRhdGVfRGF0ZVllYXJfJHtQcmVmaXh9WWVhciBWYWxpZGF0ZV9EYXRlTW9udGhfJHtQcmVmaXh9TW9udGgiOwoKICAgICAgICBpZiAoICRGb3JtYXQgZXEgJ0RhdGVJbnB1dEZvcm1hdExvbmcnICkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcwogICAgICAgICAgICAgICAgLj0gIiBWYWxpZGF0ZV9EYXRlSG91cl8ke1ByZWZpeH1Ib3VyIFZhbGlkYXRlX0RhdGVNaW51dGVfJHtQcmVmaXh9TWludXRlIjsKICAgICAgICB9CgogICAgICAgIGlmICgkVmFsaWRhdGVEYXRlSW5GdXR1cmUpIHsKICAgICAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMgLj0gIiBWYWxpZGF0ZV9EYXRlSW5GdXR1cmUiOwogICAgICAgIH0KICAgICAgICBpZiAoJFZhbGlkYXRlRGF0ZU5vdEluRnV0dXJlKSB7CiAgICAgICAgICAgICREYXRlVmFsaWRhdGVDbGFzc2VzIC49ICIgVmFsaWRhdGVfRGF0ZU5vdEluRnV0dXJlIjsKICAgICAgICB9CiAgICAgICAgaWYgKCAkVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggfHwgJFZhbGlkYXRlRGF0ZUFmdGVyVmFsdWUgKSB7CiAgICAgICAgICAgICREYXRlVmFsaWRhdGVDbGFzc2VzIC49ICcgVmFsaWRhdGVfRGF0ZUFmdGVyJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4IHx8ICRWYWxpZGF0ZURhdGVCZWZvcmVWYWx1ZSApIHsKICAgICAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMgLj0gJyBWYWxpZGF0ZV9EYXRlQmVmb3JlJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRWYWxpZGF0ZURhdGVBZnRlclByZWZpeCkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcyAuPSAiIFZhbGlkYXRlX0RhdGVBZnRlcl8kVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXgiOwogICAgICAgIH0KICAgICAgICBpZiAoJFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcyAuPSAiIFZhbGlkYXRlX0RhdGVCZWZvcmVfJFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCI7CiAgICAgICAgfQogICAgfQoKICAgICMgZGF5CiAgICBpZiAoICREYXRlSW5wdXRTdHlsZSBlcSAnT3B0aW9uJyApIHsKICAgICAgICBteSAlRGF5ID0gbWFwIHsgJF8gPT4gc3ByaW50ZiggIiUwMmQiLCAkXyApOyB9ICggMSAuLiAzMSApOwogICAgICAgICRQYXJhbXtEYXl9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJFByZWZpeCAuICdEYXknLAogICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgPT4gJFByZWZpeCAuICdEYXknIC4gJFN1ZmZpeCwKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlRGF5LAogICAgICAgICAgICBTZWxlY3RlZElEICAgICAgICAgPT4gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9IHx8ICREICksCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgPT4gIiREYXRlVmFsaWRhdGVDbGFzc2VzICRDbGFzcyIsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdEYXknKSwKICAgICAgICAgICAgRGlzYWJsZWQgICAgICAgICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyICA9PiAkVmFsaWRhdGVEYXRlQWZ0ZXJWYWx1ZSwKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlID0+ICRWYWxpZGF0ZURhdGVCZWZvcmVWYWx1ZSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0RheX0gPQogICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiICcKICAgICAgICAgICAgLiBxcXtjbGFzcz0iJHtEYXRlVmFsaWRhdGVDbGFzc2VzfSR7Q2xhc3N9IiB9CiAgICAgICAgICAgIC4gcXF7bmFtZT0iJHtQcmVmaXh9RGF5IiBpZD0iJHtQcmVmaXh9RGF5JHtTdWZmaXh9IiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIH0KICAgICAgICAgICAgLiBzcHJpbnRmKCAndGl0bGU9IiVzIiAnLCAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RheScpICkKICAgICAgICAgICAgLiBzcHJpbnRmKCAndmFsdWU9IiUwMmQiICcsICggJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSB8fCAkRCApICkKICAgICAgICAgICAgLiAoICRQYXJhbXtEaXNhYmxlZH0gPyAncmVhZG9ubHknIDogJycgKQogICAgICAgICAgICAuICc+JzsKCiAgICB9CgogICAgaWYgKCAkRm9ybWF0IGVxICdEYXRlSW5wdXRGb3JtYXRMb25nJyApIHsKCiAgICAgICAgIyBob3VyCiAgICAgICAgaWYgKCAkRGF0ZUlucHV0U3R5bGUgZXEgJ09wdGlvbicgKSB7CiAgICAgICAgICAgIG15ICVIb3VyID0gbWFwIHsgJF8gPT4gc3ByaW50ZiggIiUwMmQiLCAkXyApOyB9ICggMCAuLiAyMyApOwogICAgICAgICAgICAkUGFyYW17SG91cn0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnSG91cicsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgID0+ICRQcmVmaXggLiAnSG91cicgLiAkU3VmZml4LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJUhvdXIsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgID8gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnSG91cicgfSApCiAgICAgICAgICAgICAgICA6IGludCgkaCksCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJFZhbGlkYXRlID8gKCAnVmFsaWRhdGVfRGF0ZUhvdXIgJyAuICRDbGFzcyApIDogJENsYXNzLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSG91cnMnKSwKICAgICAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17SG91cn0gPQogICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiAnCiAgICAgICAgICAgICAgICAuICggJFZhbGlkYXRlID8gcXF7Y2xhc3M9IlZhbGlkYXRlX0RhdGVIb3VyICRDbGFzcyIgfSA6IHFxe2NsYXNzPSIkQ2xhc3MiIH0gKQogICAgICAgICAgICAgICAgLiBxcXtuYW1lPSIke1ByZWZpeH1Ib3VyIiBpZD0iJHtQcmVmaXh9SG91ciR7U3VmZml4fSIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiB9CiAgICAgICAgICAgICAgICAuIHNwcmludGYoICd0aXRsZT0iJXMiICcsICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSG91cnMnKSApCiAgICAgICAgICAgICAgICAuIHNwcmludGYoICd2YWx1ZT0iJTAyZCIgJywgKCAkUGFyYW17ICRQcmVmaXggLiAnSG91cicgfSB8fCAkaCApICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RGlzYWJsZWR9ID8gJ3JlYWRvbmx5JyA6ICcnICkKICAgICAgICAgICAgICAgIC4gJz4nOwoKICAgICAgICB9CgogICAgICAgICMgbWludXRlCiAgICAgICAgaWYgKCAkRGF0ZUlucHV0U3R5bGUgZXEgJ09wdGlvbicgKSB7CiAgICAgICAgICAgIG15ICVNaW51dGUgPSBtYXAgeyAkXyA9PiBzcHJpbnRmKCAiJTAyZCIsICRfICk7IH0gbWFwIHsgJF8gKiAkTWludXRlU3RlcCB9ICggMCAuLiAoIDYwIC8gJE1pbnV0ZVN0ZXAgLSAxICkgKTsKICAgICAgICAgICAgJFBhcmFte01pbnV0ZX0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnTWludXRlJywKICAgICAgICAgICAgICAgIElEICAgICAgICAgPT4gJFByZWZpeCAuICdNaW51dGUnIC4gJFN1ZmZpeCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVNaW51dGUsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgPyBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgOiBpbnQoICRtIC0gJG0gJSAkTWludXRlU3RlcCApLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRWYWxpZGF0ZSA/ICggJ1ZhbGlkYXRlX0RhdGVNaW51dGUgJyAuICRDbGFzcyApIDogJENsYXNzLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWludXRlcycpLAogICAgICAgICAgICAgICAgRGlzYWJsZWQgICAgPT4gJFBhcmFte0Rpc2FibGVkfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNaW51dGV9ID0KICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgJwogICAgICAgICAgICAgICAgLiAoICRWYWxpZGF0ZSA/IHFxe2NsYXNzPSJWYWxpZGF0ZV9EYXRlTWludXRlICRDbGFzcyIgfSA6IHFxe2NsYXNzPSIkQ2xhc3MiIH0gKQogICAgICAgICAgICAgICAgLiBxcXtuYW1lPSIke1ByZWZpeH1NaW51dGUiIGlkPSIke1ByZWZpeH1NaW51dGUke1N1ZmZpeH0iIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgfQogICAgICAgICAgICAgICAgLiBzcHJpbnRmKCAndGl0bGU9IiVzIiAnLCAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ01pbnV0ZXMnKSApCiAgICAgICAgICAgICAgICAuIHNwcmludGYoICd2YWx1ZT0iJTAyZCIgJywgKCAkUGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9IHx8ICRtICkgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtEaXNhYmxlZH0gPyAncmVhZG9ubHknIDogJycgKQogICAgICAgICAgICAgICAgLiAnPic7CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IGZpcnN0IGRheSBvZiB0aGUgd2VlawogICAgbXkgJFdlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKTsKICAgIGlmICggJFBhcmFte0NhbGVuZGFyfSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCggIlRpbWVab25lOjpDYWxlbmRhciIgLiAkUGFyYW17Q2FsZW5kYXJ9IC4gIk5hbWUiICkgKSB7CiAgICAgICAgICAgICRXZWVrRGF5U3RhcnQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICJDYWxlbmRhcldlZWtEYXlTdGFydDo6Q2FsZW5kYXIiIC4gJFBhcmFte0NhbGVuZGFyfSApOwogICAgICAgIH0KICAgIH0KICAgIGlmICggIWRlZmluZWQgJFdlZWtEYXlTdGFydCApIHsKICAgICAgICAkV2Vla0RheVN0YXJ0ID0gMTsKICAgIH0KCiAgICAjIHNhbml0aXplIFdlZWtEYXlTdGFydAogICAgIyAgIGFsbG93IHRoZSBmb2xsb3dpbmc6CiAgICAjICAgICAgIC0gY2hhcmFjdGVycyAobm90IG9ubHkgQS1aYS16LCBhcyB1bWxhdXRzIHNob3VsZCBiZSBhbGxvd2VkIGFzIHdlbGwpCiAgICAjICAgICAgIC0gZGlnaXRzIChhcmFiaWMgYXMgd2VsbCBhcyBub24tYXJhYmljKQogICAgIyAgICAgICAtIGRhc2ggKGUuZy4gZm9yIGR5bmFtaWMgZmllbGQgbmFtZXNwYWNlcykKICAgICMgICAgICAgLSB1bmRlcnNjb3JlCiAgICAjICAgICAgIC0gOiBhbmQgIyAoZS5nLiBmb3Igc3lzdGVtIGNvbmZpZ3VyYXRpb24gbmFtZXMpCiAgICAkV2Vla0RheVN0YXJ0ID1+IHMvW15cd1xkXC1fOiNdLy9nOwoKICAgIG15ICRPdXRwdXQgPSAnJzsKCiAgICAjIG9wdGlvbmFsIGNoZWNrYm94CiAgICBpZiAoJE9wdGlvbmFsKSB7CiAgICAgICAgbXkgJENoZWNrZWQgPSAkVXNlZCA/ICcgY2hlY2tlZCcgOiAnJzsKICAgICAgICAkT3V0cHV0IC49CiAgICAgICAgICAgIHFxezxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJHtQcmVmaXh9VXNlZCIgaWQ9IiR7UHJlZml4fSR7U3VmZml4fVVzZWQiIHZhbHVlPSIxIn0KICAgICAgICAgICAgLiAkQ2hlY2tlZAogICAgICAgICAgICAuIHFxeyBjbGFzcz0iJENsYXNzIn0KICAgICAgICAgICAgLiBzcHJpbnRmKCAnIHRpdGxlPSIlcyIgJywgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ2hlY2sgdG8gYWN0aXZhdGUgdGhpcyBkYXRlJykgKQogICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdkaXNhYmxlZD0iZGlzYWJsZWQiJyA6ICcnICkKICAgICAgICAgICAgLiAiPiZuYnNwOyI7CiAgICB9CgogICAgIyByZW1vdmUgJ1NlY29uZCcgYmVjYXVzZSBpdCBpcyBuZXZlciB1c2VkIGFuZCBidWcgIzk0NDEKICAgIGRlbGV0ZSAkUGFyYW17ICRQcmVmaXggLiAnU2Vjb25kJyB9OwoKICAgICMgZGF0ZSBmb3JtYXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRpbWUoCiAgICAgICAgQWN0aW9uID0+ICdSZXR1cm4nLAogICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICBNb2RlICAgPT4gJ05vdE51bWVyaWMnLAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgIyBwcmVwYXJlIGRhdGVwaWNrZXIgZm9yIHNwZWNpZmljIGNhbGVuZGFyCiAgICBteSAkVmFjYXRpb25EYXlzID0gJyc7CiAgICBpZiAoICRQYXJhbXtDYWxlbmRhcn0gKSB7CiAgICAgICAgJFZhY2F0aW9uRGF5cyA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKAogICAgICAgICAgICBDYWxlbmRhciA9PiAkUGFyYW17Q2FsZW5kYXJ9LAogICAgICAgICk7CiAgICB9CiAgICBteSAkVmFjYXRpb25EYXlzSlNPTiA9ICRTZWxmLT5KU09ORW5jb2RlKAogICAgICAgIERhdGEgPT4gJFZhY2F0aW9uRGF5cywKICAgICk7CgogICAgIyBBZGQgRGF0ZXBpY2tlciBKUyB0byBvdXRwdXQgaWYgd2UgYXJlIG5vdCByZW5kZXJpbmcgYSBtdWx0aXZhbHVlIHRlbXBsYXRlLgogICAgaWYgKCAkUHJlZml4ICF+IC9eRHluYW1pY0ZpZWxkXy8gfHwgKCAkU3VmZml4IG5lICdfVGVtcGxhdGUnICYmICRQcmVmaXggIX4gL19UZW1wbGF0ZSQvICkgKSB7CiAgICAgICAgbXkgJERhdGVwaWNrZXJKUyA9ICcKICAgICAgICBDb3JlLlVJLkRhdGVwaWNrZXIuSW5pdCh7CiAgICAgICAgICAgIERheTogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigiJyAuICRQcmVmaXggLiAnIikgKyAiRGF5IicgLiAgICAgICAoICRTdWZmaXggPyAnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkU3VmZml4IC4gJyIpJyA6ICcnICkgLiAnKSwKICAgICAgICAgICAgTW9udGg6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkUHJlZml4IC4gJyIpICsgIk1vbnRoIicgLiAgICggJFN1ZmZpeCA/ICcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigiJyAuICRTdWZmaXggLiAnIiknIDogJycgKSAuICcpLAogICAgICAgICAgICBZZWFyOiAkKCIjIiArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCInIC4gJFByZWZpeCAuICciKSArICJZZWFyIicgLiAgICAgKCAkU3VmZml4ID8gJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCInIC4gJFN1ZmZpeCAuICciKScgOiAnJyApIC4gJyksCiAgICAgICAgICAgIEhvdXI6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkUHJlZml4IC4gJyIpICsgIkhvdXIiJyAuICAgICAoICRTdWZmaXggPyAnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkU3VmZml4IC4gJyIpJyA6ICcnICkgLiAnKSwKICAgICAgICAgICAgTWludXRlOiAkKCIjIiArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCInIC4gJFByZWZpeCAuICciKSArICJNaW51dGUiJyAuICggJFN1ZmZpeCA/ICcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigiJyAuICRTdWZmaXggLiAnIiknIDogJycgKSAuICcpLAogICAgICAgICAgICBWYWNhdGlvbkRheXM6ICcgLiAkVmFjYXRpb25EYXlzSlNPTiAuICcsCiAgICAgICAgICAgIERhdGVJbkZ1dHVyZTogJyAuICAgICggJFZhbGlkYXRlRGF0ZUluRnV0dXJlICAgID8gJ3RydWUnIDogJ2ZhbHNlJyApIC4gJywKICAgICAgICAgICAgRGF0ZU5vdEluRnV0dXJlOiAnIC4gKCAkVmFsaWRhdGVEYXRlTm90SW5GdXR1cmUgPyAndHJ1ZScgOiAnZmFsc2UnICkgLiAnLAogICAgICAgICAgICBXZWVrRGF5U3RhcnQ6ICcgLiAkV2Vla0RheVN0YXJ0IC4gJwogICAgICAgIH0sIHsKICAgICAgICAgICAgRGlzYWJsZWQ6ICcgLiAoICRQYXJhbXtEaXNhYmxlZH0gPyAndHJ1ZScgOiAnZmFsc2UnICkgLiAnCiAgICAgICAgfSk7JzsKCiAgICAgICAgJFNlbGYtPkFkZEpTT25Eb2N1bWVudENvbXBsZXRlKCBDb2RlID0+ICREYXRlcGlja2VySlMgKTsKICAgIH0KCiAgICAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9ID0gMTsgICAgIyBDYWxsIHNvbWUgRGF0ZXBpY2tlciBpbml0IGNvZGUuCgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtRdWlja0RhdGVCdXR0b25zfSApICkgewoKICAgICAgICBCVVRUT046CiAgICAgICAgZm9yIG15ICRCdXR0b24gKCAkUGFyYW17UXVpY2tEYXRlQnV0dG9uc30tPkAqICkgewogICAgICAgICAgICBteSAkTmFtZSA9ICgga2V5cyAleyRCdXR0b259IClbMF07CgogICAgICAgICAgICBuZXh0IEJVVFRPTiBpZiAhJE5hbWU7CgogICAgICAgICAgICBteSAkVmFsID0gJEJ1dHRvbi0+eyROYW1lfTsKCiAgICAgICAgICAgIG5leHQgQlVUVE9OIGlmICEkVmFsOwoKICAgICAgICAgICAgbXkgJE1ldGhvZCA9ICRWYWwgPX4gcy9eXHMqXCsvLyA/ICdBZGREYXlzJyA6CiAgICAgICAgICAgICAgICAkVmFsID1+IHMvXlxzKi0vLyA/ICdTdWJ0cmFjdERheXMnIDogJ1NldERhdGUnOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gIjxhIGNsYXNzPSdDYWxsRm9yQWN0aW9uIG9vb1F1aWNrRGF0ZSAkTWV0aG9kJyBkYXRhLWRheXM9J1slIERhdGEuVmFsIHwgaHRtbCAlXSc+PHNwYW4+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9zcGFuPjwvYT5cbiIsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsICA9PiAkVmFsLAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQyIEh1bWFuUmVhZGFibGVEYXRhU2l6ZSgpCgpQcm9kdWNlcyBodW1hbiByZWFkYWJsZSBkYXRhIHNpemUuCgogICAgbXkgJFNpemVTdHIgPSAkTGF5b3V0T2JqZWN0LT5IdW1hblJlYWRhYmxlRGF0YVNpemUoCiAgICAgICAgU2l6ZSA9PiAxMjMsICAjIHNpemUgaW4gYnl0ZXMKICAgICk7CgpSZXR1cm5zCgogICAgJFNpemVTdHIgPSAnMTIzIEInOyAgICAgICAgICMgZXhhbXBsZSB3aXRoIGRlY2ltYWwgcG9pbnQ6IDEyMy40IE1CCgo9Y3V0CgpzdWIgSHVtYW5SZWFkYWJsZURhdGFTaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBVc2Ugc2ltcGxlIHN0cmluZyBjb25jYXRlbmF0aW9uIHRvIGZvcm1hdCByZWFsIG51bWJlci4gInNwcmludGYiIHVzZXMgZG90ICguKSBhcyBkZWNpbWFsIHNlcGFyYXRvciB1bmxlc3MKICAgICMgICBsb2NhbGUgYW5kIFBPU0lYIChMQ19OVU1FUklDKSBpcyB1c2VkLiBFdmVuIGluIHRoaXMgY2FzZSwgeW91IGFyZSBub3QgYWxsb3dlZCB0byB1c2UgY3VzdG9tIHNlcGFyYXRvcgogICAgIyAgIChhcyBkZWZpbmVkIGluIGxhbmd1YWdlIGZpbGVzKS4KCiAgICBteSAkRm9ybWF0U2l6ZSA9IHN1YiB7CiAgICAgICAgbXkgKCROdW1iZXIpID0gQF87CgogICAgICAgIG15ICRSZWFkYWJsZVNpemU7CgogICAgICAgIGlmICggSXNJbnRlZ2VyKCROdW1iZXIpICkgewogICAgICAgICAgICAkUmVhZGFibGVTaXplID0gJE51bWJlcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIEdldCBpbnRlZ2VyIGFuZCBkZWNpbWFsIHBhcnRzLgogICAgICAgICAgICBteSAoICRJbnRlZ2VyLCAkRmxvYXQgKSA9IHNwbGl0KCAvXC4vLCBzcHJpbnRmKCAiJS4xZiIsICROdW1iZXIgKSApOwoKICAgICAgICAgICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT57RGVjaW1hbFNlcGFyYXRvcn0gfHwgJy4nOwoKICAgICAgICAgICAgIyBGb3JtYXQgc2l6ZSB3aXRoIHByb3ZpZGVkIGRlY2ltYWwgc2VwYXJhdG9yLgogICAgICAgICAgICAkUmVhZGFibGVTaXplID0gJEludGVnZXIgLiAkU2VwYXJhdG9yIC4gJEZsb2F0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRSZWFkYWJsZVNpemU7CiAgICB9OwoKICAgIGlmICggIWRlZmluZWQoICRQYXJhbXtTaXplfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTaXplIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhSXNJbnRlZ2VyKCAkUGFyYW17U2l6ZX0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NpemUgbXVzdCBiZSBpbnRlZ2VyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBVc2UgY29udmVudGlvbiBkZXNjcmliZWQgb24gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlsZV9zaXplCiAgICBteSAoICRTaXplU3RyLCAkUmVhZGFibGVTaXplICk7CgogICAgaWYgKCAkUGFyYW17U2l6ZX0gPj0gKCAxMDI0Kio0ICkgKSB7CgogICAgICAgICRSZWFkYWJsZVNpemUgPSAkRm9ybWF0U2l6ZS0+KCAkUGFyYW17U2l6ZX0gLyAoIDEwMjQqKjQgKSApOwogICAgICAgICRTaXplU3RyICAgICAgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgVEInLCAkUmVhZGFibGVTaXplICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtTaXplfSA+PSAoIDEwMjQqKjMgKSApIHsKCiAgICAgICAgJFJlYWRhYmxlU2l6ZSA9ICRGb3JtYXRTaXplLT4oICRQYXJhbXtTaXplfSAvICggMTAyNCoqMyApICk7CiAgICAgICAgJFNpemVTdHIgICAgICA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBHQicsICRSZWFkYWJsZVNpemUgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1NpemV9ID49ICggMTAyNCoqMiApICkgewoKICAgICAgICAkUmVhZGFibGVTaXplID0gJEZvcm1hdFNpemUtPiggJFBhcmFte1NpemV9IC8gKCAxMDI0KioyICkgKTsKICAgICAgICAkU2l6ZVN0ciAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIE1CJywgJFJlYWRhYmxlU2l6ZSApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17U2l6ZX0gPj0gMTAyNCApIHsKCiAgICAgICAgJFJlYWRhYmxlU2l6ZSA9ICRGb3JtYXRTaXplLT4oICRQYXJhbXtTaXplfSAvIDEwMjQgKTsKICAgICAgICAkU2l6ZVN0ciAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIEtCJywgJFJlYWRhYmxlU2l6ZSApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNpemVTdHIgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgQicsICRQYXJhbXtTaXplfSApOwogICAgfQoKICAgIHJldHVybiAkU2l6ZVN0cjsKfQoKc3ViIEN1c3RvbWVyTG9naW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17VGl0bGVBcmVhfSAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTG9naW4nKSAuICcgLSAnOwogICAgJFBhcmFte0lzTG9naW5QYWdlfSA9IDE7CgogICAgIyBzZXQgQWN0aW9uIHBhcmFtZXRlciBmb3IgdGhlIGxvYWRlcgogICAgJFNlbGYtPntBY3Rpb259ID0gJ0N1c3RvbWVyTG9naW4nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llJykgKSB7CgogICAgICAgICMgYWx3YXlzIHNldCBhIGNvb2tpZSwgc28gdGhhdCBhdCB0aGUgdGltZSB0aGUgdXNlciBzdWJtaXRzCiAgICAgICAgIyB0aGUgcGFzc3dvcmQsIHdlIGtub3cgYWxyZWFkeSBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBjb29raWVzLgogICAgICAgICMgKCB0aGUgc2Vzc2lvbiBjb29raWUgaXNuJ3QgYXZhaWxhYmxlIGF0IHRoYXQgdGltZSApLgoKICAgICAgICBteSAkRXhwaXJlcyA9ICcrJyAuICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvbk1heFRpbWUnKSAuICdzJzsKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWVBZnRlckJyb3dzZXJDbG9zZScpICkgewogICAgICAgICAgICAkRXhwaXJlcyA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYSBjb29raWUgdGVudGF0aXZlbHkgZm9yIGNoZWNraW5nIGNvb2tpZSBzdXBwb3J0CiAgICAgICAgJFNlbGYtPlNldENvb2tpZSgKICAgICAgICAgICAgS2V5ICAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgTmFtZSAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgVmFsdWUgICA9PiAxLAogICAgICAgICAgICBFeHBpcmVzID0+ICRFeHBpcmVzLAogICAgICAgICk7CiAgICB9CgogICAgIyBBZGQgdGhlIGNvb2tpZXMgdGhhdCBoYWQgYmVlbiBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yLgogICAgIyBUaGUgdmFsdWVzIG9mICRTZWxmLT57U2V0Q29va2llc30gYXJlIHBsYWluIGhhc2ggcmVmZXJlbmNlcy4KICAgICMgRm9yIHNvbWUgcmVhc29uIHRoZSBuYW1lIGV2ZW50dWFsbHkgdXNlZCBieSBDb29raWU6OkJha2VyOjpiYWtlX2Nvb2tpZSgpIGlzIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIG9mIHRoZSBoYXNocmVmLgogICAgbXkgJFJlc3BvbnNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1NldENvb2tpZXN9CiAgICAgICAgJiYgcmVmICRTZWxmLT57U2V0Q29va2llc30gZXEgJ0hBU0gnCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llJykKICAgICAgICApCiAgICB7CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJFNlbGYtPntTZXRDb29raWVzfS0+JSogKSB7CgogICAgICAgICAgICAjIG1ha2UgYSBjb3B5IGJlY2F1c2Ugd2UgbWlnaHQgbmVlZCAkU2VsZi0+e1NldENvb2tpZXN9IGxhdGVyIG9uCiAgICAgICAgICAgIG15ICVJbmdyZWRpZW50cyA9ICRTZWxmLT57U2V0Q29va2llc30tPnskS2V5fS0+JSo7CiAgICAgICAgICAgIG15ICROYW1lICAgICAgICA9IGRlbGV0ZSAkSW5ncmVkaWVudHN7bmFtZX07CiAgICAgICAgICAgICRSZXNwb25zZU9iamVjdC0+Q29va2llcy0+eyROYW1lfSA9IFwlSW5ncmVkaWVudHM7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24KICAgIGlmICggJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaWduZXQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUN1c3RvbWVyQ1NTQ2FsbHMoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVDdXN0b21lckpTQ2FsbHMoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVKYXZhU2NyaXB0VHJhbnNsYXRpb25EYXRhKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlSmF2YVNjcmlwdFRlbXBsYXRlRGF0YSgpOwoKICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ0Jhc2VsaW5rJywKICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0Jhc2VsaW5rfSwKICAgICk7CgogICAgIyBBZGQgaGVhZGVyIGxvZ28sIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggZGVmaW5lZCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyTG9nbycpICkgewogICAgICAgIG15ICVDdXN0b21lckxvZ28gPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyTG9nbycpIH07CiAgICAgICAgbXkgJURhdGE7CgogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICggc29ydCBrZXlzICVDdXN0b21lckxvZ28gKSB7CiAgICAgICAgICAgIGlmICggJENTU1N0YXRlbWVudCBlcSAnVVJMJyApIHsKICAgICAgICAgICAgICAgIG15ICRXZWJQYXRoID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckxvZ297JENTU1N0YXRlbWVudH0gIX4gLyhodHRwfGZ0cHxodHRwcyk6XC8vaSApIHsKICAgICAgICAgICAgICAgICAgICAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEN1c3RvbWVyTG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEN1c3RvbWVyTG9nb3skQ1NTU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHN5c3RlbSBtYWludGVuYW5jZSBvYmplY3QKICAgIG15ICRTeXN0ZW1NYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1NYWludGVuYW5jZScpOwoKICAgIG15ICRBY3RpdmVNYWludGVuYW5jZSA9ICRTeXN0ZW1NYWludGVuYW5jZU9iamVjdC0+U3lzdGVtTWFpbnRlbmFuY2VJc0FjdGl2ZSgpOwoKICAgICMgY2hlY2sgaWYgc3lzdGVtIG1haW50ZW5hbmNlIGlzIGFjdGl2ZQogICAgaWYgKCRBY3RpdmVNYWludGVuYW5jZSkgewogICAgICAgIG15ICRTeXN0ZW1NYWludGVuYW5jZURhdGEgPSAkU3lzdGVtTWFpbnRlbmFuY2VPYmplY3QtPlN5c3RlbU1haW50ZW5hbmNlR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJEFjdGl2ZU1haW50ZW5hbmNlLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFN5c3RlbU1haW50ZW5hbmNlRGF0YS0+e1Nob3dMb2dpbk1lc3NhZ2V9ICkgewogICAgICAgICAgICBteSAkTG9naW5NZXNzYWdlID0KICAgICAgICAgICAgICAgICRTeXN0ZW1NYWludGVuYW5jZURhdGEtPntMb2dpbk1lc3NhZ2V9CiAgICAgICAgICAgICAgICB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbU1haW50ZW5hbmNlOjpJc0FjdGl2ZURlZmF1bHRMb2dpbk1lc3NhZ2UnKQogICAgICAgICAgICAgICAgfHwgIlN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUsIG5vdCBwb3NzaWJsZSB0byBwZXJmb3JtIGEgbG9naW4hIjsKCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N5c3RlbU1haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExvZ2luTWVzc2FnZSA9PiAkTG9naW5NZXNzYWdlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHByZWxvZ2luIGJsb2NrLCBpZiBpbiBwcmVsb2dpbiBtb2RlIChlLmcuIFNTTyBsb2dpbikKICAgIGlmICggZGVmaW5lZCAkUGFyYW17J01vZGUnfSAmJiAkUGFyYW17J01vZGUnfSBlcSAnUHJlTG9naW4nICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJlTG9naW4nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIG5vdCBpbiBQcmVMb2dpbiBtb2RlLCBzaG93IG5vcm1hbCBsb2dpbiBmb3JtCiAgICBlbHNlIHsKCiAgICAgICAgbXkgJERpc2FibGVMb2dpbkF1dG9jb21wbGV0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRGlzYWJsZUxvZ2luQXV0b2NvbXBsZXRlJyk7CiAgICAgICAgJFBhcmFte1VzZXJOYW1lQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICd1c2VybmFtZSc7CiAgICAgICAgJFBhcmFte1Bhc3N3b3JkQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICdjdXJyZW50LXBhc3N3b3JkJzsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb2dpbkJveCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgMiBmYWN0b3IgcGFzc3dvcmQgaW5wdXQgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYmFja2VuZCBlbmFibGVkCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyOjpBdXRoVHdvRmFjdG9yTW9kdWxlJENvdW50Iik7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdXRoVHdvRmFjdG9yJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxvc3QgcGFzc3dvcmQgb3V0cHV0CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb3N0UGFzc3dvcmQnKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlJykgZXEKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6OkRCJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb3N0UGFzc3dvcmRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9zdFBhc3N3b3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBhY2NvdW50IG91dHB1dAogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudCcpCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXI6OkF1dGhNb2R1bGUnKSBlcQogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6REInCiAgICAgICAgICAgICkKCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDcmVhdGVBY2NvdW50TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NyZWF0ZUFjY291bnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnTG9naW5GYWlsZWQnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtMb2dpbkZhaWxlZH0sCiAgICApOwoKICAgIG15ICRCR0NvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJMb2dpbjo6U2V0dGluZ3MnKTsKICAgICRQYXJhbXtMb2dpblRleHR9ICA9ICRCR0NvbmZpZy0+e0xvZ2luVGV4dH0gLy8gJ1lvdXIgVGlja2V0cy4gWW91ciBPVE9CTy4nOwogICAgJFBhcmFte0JhY2tncm91bmR9ID0gJEJHQ29uZmlnLT57QmFja2dyb3VuZH0gfHwgJyc7CiAgICAkUGFyYW17QmFja2dyb3VuZH0gPX4gc3s8T1RPQk9fQ09ORklHXyguKz8pPn17JENvbmZpZ09iamVjdC0+R2V0KCQxKX1lZ3g7CgogICAgIyBkZWZpbmUgY29sb3Igc2NoZW1lCiAgICBteSAkQ29sb3JEZWZpbml0aW9ucyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJDb2xvckRlZmluaXRpb25zJyk7CiAgICBmb3IgbXkgJENvbG9yICggc29ydCBrZXlzICV7JENvbG9yRGVmaW5pdGlvbnN9ICkgewogICAgICAgICRQYXJhbXtDb2xvckRlZmluaXRpb25zfSAuPSAiLS1jb2wkQ29sb3I6JENvbG9yRGVmaW5pdGlvbnMtPnsgJENvbG9yIH07IjsKICAgIH0KCiAgICAkU2VsZi0+X0FkZEhlYWRlcnNUb1Jlc3BvbnNlT2JqZWN0KAogICAgICAgIFhMb2dpbkhlYWRlciA9PiAxLAogICAgKTsKCiAgICAkUGFyYW17RGlzYWJsZVN0YW5kYXJkTG9naW59ID0gJFNlbGYtPl9IYXNPbmx5T0lEQ0F1dGhNb2R1bGVzKCBMb2dpblR5cGUgPT4gJ0N1c3RvbWVyJyApOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckxvZ2luJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBDdXN0b21lckhlYWRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUeXBlID0gJFBhcmFte1R5cGV9IHx8ICcnOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRGaWxlID0gJFBhcmFte0ZpbGVuYW1lfSB8fCAkU2VsZi0+e0FjdGlvbn0gfHwgJ3Vua25vd24nOwoKICAgICMgc2V0IGZpbGUgbmFtZSBmb3IgInNhdmUgcGFnZSBhcyIKICAgICRQYXJhbXtDb250ZW50RGlzcG9zaXRpb259ID0gImZpbGVuYW1lPVwiJEZpbGUuaHRtbFwiIjsKCiAgICAjIGFyZWEgYW5kIHRpdGxlCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcmVhfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0FyZWF9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfQogICAgICAgICAgICAtPntOYXZCYXJOYW1lfSB8fCAnJzsKICAgIH0KICAgIGlmICgKICAgICAgICAhJFBhcmFte1RpdGxlfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0tPntUaXRsZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcmVhfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9CiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtBcmVhfSA9ICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9CiAgICAgICAgICAgIC0+e05hdkJhck5hbWV9IHx8ICcnOwogICAgfQogICAgaWYgKAogICAgICAgICEkUGFyYW17VGl0bGV9CiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdQdWJsaWNGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9LT57VGl0bGV9CiAgICAgICAgICAgIHx8ICcnOwogICAgfQogICAgZm9yIG15ICRXb3JkIChxdyhWYWx1ZSBUaXRsZSBBcmVhKSkgewogICAgICAgIGlmICggJFBhcmFteyRXb3JkfSApIHsKICAgICAgICAgICAgJFBhcmFte1RpdGxlQXJlYX0gLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFBhcmFteyRXb3JkfSApIC4gJyAtICc7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGcm9udGVuZDsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAkRnJvbnRlbmQgPSAnQ3VzdG9tZXInOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEZyb250ZW5kID0gJ1B1YmxpYyc7CiAgICB9CgogICAgIyBydW4gaGVhZGVyIG1ldGEgbW9kdWxlcyBmb3IgY3VzdG9tZXIgYW5kIHB1YmxpYyBmcm9udGVuZHMKICAgIG15ICRIZWFkZXJNZXRhTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCAkRnJvbnRlbmQgLiAnRnJvbnRlbmQ6OkhlYWRlck1ldGFNb2R1bGUnICk7CiAgICBpZiAoIHJlZiAkSGVhZGVyTWV0YU1vZHVsZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyRIZWFkZXJNZXRhTW9kdWxlfTsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBNT0RVTEU6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgYW5kIHJ1biBtb2R1bGUKICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgTGF5b3V0T2JqZWN0ID0+ICRTZWxmICk7CiAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkT2JqZWN0OwogICAgICAgICAgICAkT2JqZWN0LT5SdW4oICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHJ0bCBpZiBuZWVkZWQKICAgIGlmICggJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAmJiAkU2VsZi0+e1RleHREaXJlY3Rpb259IGVxICdydGwnICkgewogICAgICAgICRQYXJhbXtCb2R5Q2xhc3N9ID0gJ1JUTCc7CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkRlYnVnTW9kZScpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVidWdSVExCdXR0b24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWZpbmUgKGN1c3RvbSkgbG9nbwogICAgbXkgJFdlYlBhdGggPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAkUGFyYW17VVJMU2lnbmV0fSA9ICRXZWJQYXRoIC4gJ3NraW5zL0N1c3RvbWVyL2RlZmF1bHQvaW1nL290b2JvX3NpZ25ldF93LnN2Zyc7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSApIHsKICAgICAgICBteSAlQ3VzdG9tZXJMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSB9OwoKICAgICAgICBMT0dPOgogICAgICAgIGZvciBteSAkU3RhdGVtZW50IChxdyhVUkxTaWduZXQpKSB7CiAgICAgICAgICAgIG5leHQgTE9HTyBpZiAhJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fTsKCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fSAhfiAvKGh0dHB8ZnRwfGh0dHBzKTpcLy9pICkgewogICAgICAgICAgICAgICAgJFBhcmFteyRTdGF0ZW1lbnR9ID0gJFdlYlBhdGggLiAkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFteyRTdGF0ZW1lbnR9ID0gJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdlbmVyYXRlIHRoZSBtaW5pZmllZCBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKICAgICMgYW5kIHRoZSB0YWdzIHJlZmVyZW5jaW5nIHRoZW0gKHNlZSBMYXlvdXRMb2FkZXIpCiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQ3VzdG9tZXJDU1NDYWxscygpOwoKICAgICMgTG9hZCBjb2xvcnMgYmFzZWQgb24gU2tpbiBzZWxlY3Rpb24KICAgICMgZGVmaW5lIGNvbG9yIHNjaGVtZQogICAgJFNlbGYtPntVc2VyU2tpbn0gfHw9ICdkZWZhdWx0JzsKICAgIG15ICRDb2xvckRlZmluaXRpb25zOwogICAgaWYgKCAkU2VsZi0+e1VzZXJTa2lufSAmJiAkU2VsZi0+e1VzZXJTa2lufSBuZSAnZGVmYXVsdCcgKSB7CiAgICAgICAgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyU2tpbkNvbG9yRGVmaW5pdGlvbjo6JFNlbGYtPntVc2VyU2tpbn0iKSAvLyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyQ29sb3JEZWZpbml0aW9ucycpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyQ29sb3JEZWZpbml0aW9ucycpOwogICAgfQoKICAgIGZvciBteSAkQ29sb3IgKCBzb3J0IGtleXMgJXskQ29sb3JEZWZpbml0aW9uc30gKSB7CiAgICAgICAgJFBhcmFte0NvbG9yRGVmaW5pdGlvbnN9IC49ICItLWNvbCRDb2xvcjokQ29sb3JEZWZpbml0aW9ucy0+eyAkQ29sb3IgfTsiOwogICAgfQoKICAgICRTZWxmLT5fQWRkSGVhZGVyc1RvUmVzcG9uc2VPYmplY3QoCiAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uICAgICAgICAgICAgPT4gJFBhcmFte0NvbnRlbnREaXNwb3NpdGlvbn0sCiAgICAgICAgRGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWQgPT4gJFBhcmFte0Rpc2FibGVJRnJhbWVPcmlnaW5SZXN0cmljdGVkfSwKICAgICk7CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gIkN1c3RvbWVySGVhZGVyJFR5cGUiLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIEN1c3RvbWVyRm9vdGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFR5cGUgICAgICAgICAgPSAkUGFyYW17VHlwZX0gICAgICAgICAgIHx8ICcnOwogICAgbXkgJEhhc0RhdGVwaWNrZXIgPSAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9IHx8IDA7CgogICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzCiAgICAjIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUN1c3RvbWVySlNDYWxscygpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUcmFuc2xhdGlvbkRhdGEoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVKYXZhU2NyaXB0VGVtcGxhdGVEYXRhKCk7CgogICAgIyBnZXQgZGF0ZXBpY2tlciBkYXRhLCBpZiBuZWVkZWQgaW4gbW9kdWxlCiAgICBpZiAoJEhhc0RhdGVwaWNrZXIpIHsKICAgICAgICBteSAkVmFjYXRpb25EYXlzICA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCk7CiAgICAgICAgbXkgJFRleHREaXJlY3Rpb24gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259IHx8ICcnOwoKICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdEYXRlcGlja2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzID0+ICRWYWNhdGlvbkRheXMsCiAgICAgICAgICAgICAgICBJc1JUTCAgICAgICAgPT4gKCAkVGV4dERpcmVjdGlvbiBlcSAncnRsJyApID8gMSA6IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIENoZWNrIGlmIHZpZGVvIGNoYXQgaXMgZW5hYmxlZC4KICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICRQYXJhbXtWaWRlb0NoYXRFbmFibGVkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnKS0+SXNFbmFibGVkKCkKICAgICAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VuaXRUZXN0TW9kZScgKSAvLyAwOwogICAgfQoKICAgICMgQ2hlY2sgaWYgY3VzdG9tZXIgdXNlciBoYXMgcGVybWlzc2lvbiBmb3IgY2hhdC4KICAgIG15ICRDdXN0b21lckNoYXRQZXJtaXNzaW9uOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNoYXQnLCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICBteSAkQ3VzdG9tZXJDaGF0Q29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eydDdXN0b21lckNoYXQnfSB8fCB7fTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0N1c3RvbWVyR3JvdXBTdXBwb3J0JykKICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkQ3VzdG9tZXJDaGF0Q29uZmlnLT57R3JvdXBSb30gKQogICAgICAgICAgICAgICAgfHwgSXNBcnJheVJlZldpdGhEYXRhKCAkQ3VzdG9tZXJDaGF0Q29uZmlnLT57R3JvdXB9ICkKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcpOwoKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXBOYW1lICggQHsgJEN1c3RvbWVyQ2hhdENvbmZpZy0+e0dyb3VwUm99IH0sIEB7ICRDdXN0b21lckNoYXRDb25maWctPntHcm91cH0gfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckNoYXRQZXJtaXNzaW9uID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGxhc3QgR1JPVVAgaWYgJEN1c3RvbWVyQ2hhdFBlcm1pc3Npb247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDdXN0b21lckNoYXRQZXJtaXNzaW9uID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBBdXRvQ29tcGxldGUtQ29uZmlnCiAgICBteSAkQXV0b2NvbXBsZXRlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvQ29tcGxldGU6OkN1c3RvbWVyJyk7CgogICAgZm9yIG15ICRDb25maWdFbGVtZW50ICggc29ydCBrZXlzICV7JEF1dG9jb21wbGV0ZUNvbmZpZ30gKSB7CiAgICAgICAgJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fS0+e0J1dHRvblRleHR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fXtCdXR0b25UZXh0fSApOwogICAgfQoKICAgIG15ICRXZWJQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwoKICAgICMgTG9hZCByaWNoIHRleHQgbGlicmFyaWVzIG9ubHkgd2hlbiBhIFJURSBoYXMgYmVlbiBzZXQgdXAKICAgIGlmICggJFNlbGYtPntIYXNSaWNoVGV4dEVkaXRvcn0gKSB7CgogICAgICAgIG15ICRKU0RpcmVjdG9yeVBhdGggPSAkV2ViUGF0aCAuICdqcy8nOwoKICAgICAgICAjIGNrZWRpdG9yLmpzIGlzIGFsd2F5cyBsb2FkZWQgd2hlbiByaWNoIHRleHQgaXMgZW5hYmxlZAogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHRKUycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSlNEaXJlY3RvcnkgICAgICAgICA9PiAkSlNEaXJlY3RvcnlQYXRoLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgICAgICA9PiAnY2tlZGl0b3I1LmpzJywKICAgICAgICAgICAgICAgIFdyYXBwZXJGaWxlTmFtZSAgICAgPT4gJ0NvcmUuVUkuQ0tFZGl0b3I1V3JhcHBlci5qcycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbkZpbGVuYW1lID0+ICRTZWxmLT5fR2V0UmljaFRleHRUcmFuc2xhdGlvblBhdGgoKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIEpTIGRhdGEKICAgIG15ICVKU0NvbmZpZyA9ICgKICAgICAgICBCYXNlbGluayAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntCYXNlbGlua30sCiAgICAgICAgQ0dJSGFuZGxlICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q0dJSGFuZGxlfSwKICAgICAgICBXZWJQYXRoICAgICAgICAgICAgICAgICAgPT4gJFdlYlBhdGgsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBTdWJhY3Rpb24gICAgICAgICAgICAgICAgPT4gJFNlbGYtPntTdWJhY3Rpb259LAogICAgICAgIFNlc3Npb25JRENvb2tpZSAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0sCiAgICAgICAgU2Vzc2lvbk5hbWUgICAgICAgICAgICAgID0+ICRTZWxmLT57U2Vzc2lvbk5hbWV9LAogICAgICAgIFNlc3Npb25JRCAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgU2Vzc2lvblVzZUNvb2tpZSAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpLAogICAgICAgIENoYWxsZW5nZVRva2VuICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn0sCiAgICAgICAgQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJyksCiAgICAgICAgVXNlckxhbmd1YWdlICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSwKICAgICAgICBDaGVja0VtYWlsQWRkcmVzc2VzICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyksCiAgICAgICAgSW5wdXRGaWVsZHNBY3RpdmF0ZWQgICAgID0+IDEsCiAgICAgICAgQXV0b2NvbXBsZXRlICAgICAgICAgICAgID0+ICRBdXRvY29tcGxldGVDb25maWcsCiAgICAgICAgVmlkZW9DaGF0RW5hYmxlZCAgICAgICAgID0+ICRQYXJhbXtWaWRlb0NoYXRFbmFibGVkfSwKICAgICAgICBXZWJNYXhGaWxlVXBsb2FkICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdXZWJNYXhGaWxlVXBsb2FkJyksCiAgICAgICAgQ3VzdG9tZXJDaGF0UGVybWlzc2lvbiAgID0+ICRDdXN0b21lckNoYXRQZXJtaXNzaW9uLAogICAgKTsKCiAgICBmb3IgbXkgJENvbmZpZyAoIHNvcnQga2V5cyAlSlNDb25maWcgKSB7CiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgVmFsdWUgPT4gJEpTQ29uZmlneyRDb25maWd9LAogICAgICAgICk7CiAgICB9CgogICAgIyBEaXNwbGF5IGZvb3RlciBsaW5rcy4KICAgIG15ICRGb290ZXJMaW5rcyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6Rm9vdGVyTGlua3MnKTsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEZvb3RlckxpbmtzKSApIHsKCiAgICAgICAgbXkgQEZvb3RlckxpbmtzOwogICAgICAgIG15ICVVUkxDb25maWcgPSAoCiAgICAgICAgICAgIEh0dHBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKSAgICAvLyAnJywKICAgICAgICAgICAgRlFETiAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGUUROJykgICAgICAgIC8vICcnLAogICAgICAgICAgICBTY3JpcHRBbGlhcyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NjcmlwdEFsaWFzJykgLy8gJycsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRMaW5rICggc29ydCBrZXlzICV7JEZvb3RlckxpbmtzfSApIHsKICAgICAgICAgICAgbXkgJFN1YnN0aXR1dGVkTGluayA9ICRMaW5rOwogICAgICAgICAgICBmb3IgbXkgJE9wdGlvbiAocXcvSHR0cFR5cGUgRlFETiBTY3JpcHRBbGlhcy8pIHsKICAgICAgICAgICAgICAgICRTdWJzdGl0dXRlZExpbmsgPX4gcy88T1RPQk9fQ09ORklHXyRPcHRpb24+LyRVUkxDb25maWd7ICRPcHRpb24gfS9nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBGb290ZXJMaW5rcywgewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEZvb3RlckxpbmtzLT57JExpbmt9LAogICAgICAgICAgICAgICAgVGFyZ2V0ICAgICAgPT4gJFN1YnN0aXR1dGVkTGluaywKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtGb290ZXJMaW5rc30gPSBcQEZvb3RlckxpbmtzOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICJDdXN0b21lckZvb3RlciRUeXBlIiwKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBDdXN0b21lckZhdGFsRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIFRlbXBsYXRlIGVuZ2luZS4KICAgIHJldHVybiBpZiAkU2VsZi0+e0luRmF0YWxFcnJvcn0rKzsKCiAgICBpZiAoICRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgQ2FsbGVyICAgPT4gMSwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFBhcmFte01lc3NhZ2V9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9IGpvaW4gJycsCiAgICAgICAgJFNlbGYtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBBcmVhICA9PiAnRnJvbnRlbmQnLAogICAgICAgICAgICBUaXRsZSA9PiAnRmF0YWwgRXJyb3InCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJFcnJvciglUGFyYW0pLAogICAgICAgICRTZWxmLT5DdXN0b21lckZvb3RlcigpOwoKICAgICMgTW9kaWZ5IHRoZSBvdXRwdXQgYnkgYXBwbHlpbmcgdGhlIG91dHB1dCBmaWx0ZXJzLgogICAgJE91dHB1dCA9ICRTZWxmLT5BcHBseU91dHB1dEZpbHRlcnMoIE91dHB1dCA9PiAkT3V0cHV0ICk7CgogICAgIyBUaGUgQ29udGVudC1MZW5ndGggd2lsbCBiZSBzZXQgbGF0ZXIgaW4gdGhlIG1pZGRsZXdhcmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkNvbnRlbnRMZW5ndGguIFRoaXMgcmVxdWlyZXMgdGhhdAogICAgIyB0aGVyZSBhcmUgbm8gbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIGluIHRoZSBkZWxpdmVyZWQgY29udGVudC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBtaWRkbGV3YXJlCiAgICAjIHVzZXMgY29yZTo6bGVuZ3RoKCkgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50IGxlbmd0aC4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJE91dHB1dCApOwoKICAgICMgVGhlIE9UT0JPIHJlc3BvbnNlIG9iamVjdCBhbHJlYWR5IGhhcyB0aGUgSFRQUCBoZWFkZXJzLgogICAgIyBFbmhhbmNlIGl0IHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgYW5kIHRoZSBjb250ZW50LgogICAgbXkgJFBsYWNrUmVzcG9uc2UgPSBQbGFjazo6UmVzcG9uc2UtPm5ldygKICAgICAgICAyMDAsCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKS0+SGVhZGVycygpLAogICAgICAgICRPdXRwdXQKICAgICk7CgogICAgIyBUaGUgZXhjZXB0aW9uIGlzIGNhdWdodCBiZSBQbGFjazo6TWlkZGxld2FyZTo6SFRUUEV4Y2VwdGlvbnMKICAgIGRpZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24tPm5ldygKICAgICAgICBQbGFja1Jlc3BvbnNlID0+ICRQbGFja1Jlc3BvbnNlCiAgICApOwp9CgpzdWIgQ3VzdG9tZXJOYXZpZ2F0aW9uQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjcmVhdGUgbWVudSBpdGVtcwogICAgbXkgJU5hdkJhck1vZHVsZTsKICAgIG15ICRGcm9udGVuZE1vZHVsZSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKTsKICAgIG15ICROYXZpZ2F0aW9uQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpOYXZpZ2F0aW9uJyk7CgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKCiAgICBNT0RVTEU6CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyROYXZpZ2F0aW9uQ29uZmlnfSApIHsKCiAgICAgICAgIyBTa2lwIGlmIG1vZHVsZSBpcyBkaXNhYmxlZCBpbiBmcm9udGVuZCByZWdpc3RyYXRpb24uCiAgICAgICAgbmV4dCBNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRnJvbnRlbmRNb2R1bGUtPnskTW9kdWxlfSApOwoKICAgICAgICAjIFRvcC1sZXZlbCBmcm9udGVuZCBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGhhc2guCiAgICAgICAgbmV4dCBNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkTmF2aWdhdGlvbkNvbmZpZy0+eyRNb2R1bGV9ICk7CgogICAgICAgIG15IEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlnczsKCiAgICAgICAgIyBHbyB0aHJvdWdoIGFsbCBkZWZpbmVkIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUgYW5kIHNvcnQgdGhlbSBieSB0aGUga2V5ICgwMCMtTW9kdWxlKS4KICAgICAgICBOQVZJR0FUSU9OX0NPTkZJRzoKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkTmF2aWdhdGlvbkNvbmZpZy0+eyRNb2R1bGV9IHx8IHt9IH0gKSB7CiAgICAgICAgICAgIG5leHQgTkFWSUdBVElPTl9DT05GSUcgaWYgJEtleSAhfiBte15cZCt9OwoKICAgICAgICAgICAgIyBGSVhNRTogU3VwcG9ydCBib3RoIG9sZCAoSEFTSCkgYW5kIG5ldyAoQVJSQVkgb2YgSEFTSCkgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9ucywgZm9yIHJlYXNvbnMgb2YgYmFja3dhcmRzCiAgICAgICAgICAgICMgICBjb21wYXRpYmlsaXR5LiBPbmNlIHdlIGFyZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gbWlncmF0ZWQgY29ycmVjdGx5LCBzdXBwb3J0IGZvciBIQVNILW9ubHkKICAgICAgICAgICAgIyAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRyb3BwZWQgaW4gZnV0dXJlIG1ham9yIHJlbGVhc2UuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICROYXZpZ2F0aW9uQ29uZmlnLT57JE1vZHVsZX0tPnskS2V5fSApICkgewogICAgICAgICAgICAgICAgcHVzaCBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3MsICROYXZpZ2F0aW9uQ29uZmlnLT57JE1vZHVsZX0tPnskS2V5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJE5hdmlnYXRpb25Db25maWctPnskTW9kdWxlfS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgQHsgJE5hdmlnYXRpb25Db25maWctPnskTW9kdWxlfS0+eyRLZXl9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU2tpcCBpbmNvbXBhdGlibGUgY29uZmlndXJhdGlvbi4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IE5BVklHQVRJT05fQ09ORklHOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBJVEVNOgogICAgICAgIGZvciBteSAkSXRlbSAoQE1vZHVsZU5hdmlnYXRpb25Db25maWdzKSB7CiAgICAgICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntOYXZCYXJ9OwoKICAgICAgICAgICAgbXkgJEluaGVyaXRQZXJtaXNzaW9ucyA9IDA7CgogICAgICAgICAgICAjIEluaGVyaXQgcGVybWlzc2lvbnMgZnJvbSBmcm9udGVuZCByZWdpc3RyYXRpb24gaWYgbm8gcGVybWlzc2lvbnMgd2VyZSBkZWZpbmVkIGZvciB0aGUgbmF2aWdhdGlvbiBlbnRyeS4KICAgICAgICAgICAgaWYgKCAhJEl0ZW0tPntHcm91cFJvfSAmJiAhJEl0ZW0tPntHcm91cH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRGcm9udGVuZE1vZHVsZS0+e0dyb3VwUm99ICkgewogICAgICAgICAgICAgICAgICAgICRJdGVtLT57R3JvdXBSb30gPSAkRnJvbnRlbmRNb2R1bGUtPntHcm91cFJvfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEZyb250ZW5kTW9kdWxlLT57R3JvdXB9ICkgewogICAgICAgICAgICAgICAgICAgICRJdGVtLT57R3JvdXB9ID0gJEZyb250ZW5kTW9kdWxlLT57R3JvdXB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEluaGVyaXRQZXJtaXNzaW9ucyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTaG93biA9IDA7CgogICAgICAgICAgICBQRVJNSVNTSU9OOgogICAgICAgICAgICBmb3IgbXkgJFBlcm1pc3Npb24gKHF3KEdyb3VwUm8gR3JvdXApKSB7CgogICAgICAgICAgICAgICAgIyBObyBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgcmVmICRJdGVtLT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEl0ZW0tPntHcm91cFJvfSB9CiAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRJdGVtLT57R3JvdXB9IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRJdGVtLT57R3JvdXB9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFNob3duID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBBcnJheSBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICAgICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57JFBlcm1pc3Npb259ICYmIHJlZiAkSXRlbS0+eyRQZXJtaXNzaW9ufSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkSXRlbS0+eyRQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkSGFzUGVybWlzc2lvbiA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJFBlcm1pc3Npb24gZXEgJ0dyb3VwUm8nID8gJ3JvJyA6ICdydycsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkSGFzUGVybWlzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNob3duID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJZiB3ZSBwYXNzZWQgdGhlIGluaXRpYWwgcGVybWlzc2lvbiBjaGVjayBhbmQgZGlkbid0IGluaGVyaXQgcGVybWlzc2lvbnMgZnJvbSB0aGUgbW9kdWxlIHJlZ2lzdHJhdGlvbiwKICAgICAgICAgICAgIyAgIG1ha2Ugc3VyZSB0byBhbHNvIGNoZWNrIGFjY2VzcyB0byB0aGUgbW9kdWxlLCBzaW5jZSBuYXZpZ2F0aW9uIGl0ZW0gbWlnaHQgYmUgb3V0IG9mIHN5bmMuCiAgICAgICAgICAgIGlmICggJFNob3duICYmICEkSW5oZXJpdFBlcm1pc3Npb25zICkgewogICAgICAgICAgICAgICAgbXkgJE1vZHVsZVBlcm1pc3Npb247CgogICAgICAgICAgICAgICAgUEVSTUlTU0lPTjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBObyBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICByZWYgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPntHcm91cFJvfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPntHcm91cFJvfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlZiAkRnJvbnRlbmRNb2R1bGUtPnskTW9kdWxlfS0+e0dyb3VwfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPntHcm91cH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgJE1vZHVsZVBlcm1pc3Npb24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIEFycmF5IGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRGcm9udGVuZE1vZHVsZS0+eyRNb2R1bGV9LT57JFBlcm1pc3Npb259CiAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlZiAkRnJvbnRlbmRNb2R1bGUtPnskTW9kdWxlfS0+eyRQZXJtaXNzaW9ufSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggQHsgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPnskUGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRIYXNQZXJtaXNzaW9uID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1vZHVsZVBlcm1pc3Npb24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEhpZGUgaXRlbSBpZiBubyBwZXJtaXNzaW9uIHdhcyBncmFudGVkIHRvIGFjY2VzcyB0aGUgbW9kdWxlLgogICAgICAgICAgICAgICAgaWYgKCAhJE1vZHVsZVBlcm1pc3Npb24gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNob3duID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBJVEVNIGlmICEkU2hvd247CgogICAgICAgICAgICAjIHNldCBwcmlvIG9mIGl0ZW0KICAgICAgICAgICAgbXkgJEtleSA9ICggJEl0ZW0tPntCbG9ja30gfHwgJycgKSAuIHNwcmludGYoICIlMDdkIiwgJEl0ZW0tPntQcmlvfSApOwogICAgICAgICAgICBDT1VOVDoKICAgICAgICAgICAgZm9yICggMSAuLiA1MSApIHsKICAgICAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgISROYXZCYXJNb2R1bGV7JEtleX07CgogICAgICAgICAgICAgICAgJEl0ZW0tPntQcmlvfSsrOwogICAgICAgICAgICAgICAgJEtleSA9ICggJEl0ZW0tPntCbG9ja30gfHwgJycgKSAuIHNwcmludGYoICIlMDdkIiwgJEl0ZW0tPntQcmlvfSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNob3cgYXMgbWFpbiBtZW51LgogICAgICAgICAgICBpZiAoICRJdGVtLT57VHlwZX0gZXEgJ01lbnUnICkgewogICAgICAgICAgICAgICAgJE5hdkJhck1vZHVsZXskS2V5fSA9ICRJdGVtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYXMgc3ViIG9mIG1haW4gbWVudQogICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57VHlwZX0gZXEgJ1N1Ym1lbnUnICkgewogICAgICAgICAgICAgICAgJE5hdkJhck1vZHVsZXtTdWJ9LT57ICRJdGVtLT57TmF2QmFyfSB9LT57JEtleX0gPSAkSXRlbTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBydW4gbWVudSBpdGVtIG1vZHVsZXMKICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpOYXZCYXJNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJU5hdkJhck1vZHVsZSA9ICgKICAgICAgICAgICAgICAgICVOYXZCYXJNb2R1bGUsCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgICA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICAgICBOYXZCYXJNb2R1bGUgPT4gXCVOYXZCYXJNb2R1bGUgfHwge30sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIE9ubHkgaGlnaGxpZ2h0IHRoZSBmaXJzdCBtYXRjaGVkIG5hdmlnYXRpb24gZW50cnkuIElmIHRoZXJlIGFyZSBzZXZlcmFsIGVudHJpZXMKICAgICMgICB3aXRoIHRoZSBzYW1lIEFjdGlvbiBhbmQgU3ViYWN0aW9uLCBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aGljaCBvbmUgd2FzIHVzZWQuCiAgICAjICAgVGhlcmVmb3JlIHdlIGp1c3QgaGlnaGxpZ2h0IHRoZSBmaXJzdCBvbmUuCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVOYXZCYXJNb2R1bGUgKSB7CiAgICAgICAgbmV4dCBJVEVNIGlmICEleyAkTmF2QmFyTW9kdWxleyRJdGVtfSB9OwogICAgICAgIG5leHQgSVRFTSBpZiAkSXRlbSBlcSAnU3ViJzsKCiAgICAgICAgbXkgJFNWR1N0cmluZzsKICAgICAgICBpZiAoICROYXZCYXJNb2R1bGV7JEl0ZW19e3N2Z0ljb259ICkgewogICAgICAgICAgICBpZiAoICROYXZCYXJNb2R1bGV7JEl0ZW19e3N2Z0ljb259ICF+IC9cLnN2ZyQvaSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEl0ZW06ICdzdmdJY29uJyBoYXMgdG8gYmUgYW4gLnN2Zy1maWxlISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSG9tZSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdIb21lJyk7CiAgICAgICAgICAgIG15ICRTVkdSZWYgPSAkTWFpbk9iamVjdC0+RmlsZVJlYWQoCiAgICAgICAgICAgICAgICBMb2NhdGlvbiA9PiAiJEhvbWUvJE5hdkJhck1vZHVsZXskSXRlbX17c3ZnSWNvbn0iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTVkdSZWYpIHsKICAgICAgICAgICAgICAgICRTVkdTdHJpbmcgPSAkeyRTVkdSZWZ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgQ2FsbGVyICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3Qgb3BlbiAkTmF2QmFyTW9kdWxleyRJdGVtfXtzdmdJY29ufTogJCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1c2UgdGhlIHJvdW5kIE9UT0JPIE8gYXMgdGhlIGRlZmF1bHQgaWNvbgogICAgICAgIGlmICggISRTVkdTdHJpbmcgKSB7CiAgICAgICAgICAgICRTVkdTdHJpbmcgPQoKICAgICAgICAgICAgICAgICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaWQ9InJhZGlvX2J1dHRvbl91bmNoZWNrZWQtMjRweCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiB2aWV3Qm94PSIwIDAgNTAgNTAiPgogICAgPGRlZnM+CiAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAuY2xzLTF7ZmlsbDpub25lfQogICAgICAgIDwvc3R5bGU+CiAgICA8L2RlZnM+CiAgICA8cGF0aCBpZD0iUGZhZF8xMzczNSIgZD0iTTAgMGg1MHY1MEgweiIgY2xhc3M9ImNscy0xIiBkYXRhLW5hbWU9IlBmYWQgMTM3MzUiLz4KICAgIDxwYXRoIGlkPSJQZmFkXzEzNzM2IiBkPSJNMjIuNjM3IDJhMjAuNjM3IDIwLjYzNyAwIDEgMCAyMC42MzggMjAuNjM3QTIwLjY0NSAyMC42NDUgMCAwIDAgMjIuNjM3IDJ6bTAgMzcuMTQ3YTE2LjUxIDE2LjUxIDAgMSAxIDE2LjUxLTE2LjUxIDE2LjUwNSAxNi41MDUgMCAwIDEtMTYuNTEgMTYuNTF6IiBkYXRhLW5hbWU9IlBmYWQgMTM3MzYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMzYzIDIuMzYyKSIvPgogPC9zdmc+JzsKCiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJE5hdkJhck1vZHVsZXskSXRlbX0tPntCbG9ja30gfHwgJ0l0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7ICROYXZCYXJNb2R1bGV7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICBTVkcgPT4gJFNWR1N0cmluZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgcnVuIG5vdGlmaWNhdGlvbiBtb2R1bGVzCiAgICBteSAkRnJvbnRlbmROb3RpZnlNb2R1bGVDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok5vdGlmeU1vZHVsZScpOwogICAgaWYgKCByZWYgJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICRGcm9udGVuZE5vdGlmeU1vZHVsZUNvbmZpZy0+JSo7CgogICAgICAgIEpPQjoKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgSk9CIGlmICEkT2JqZWN0OwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb259IC49ICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICApOwogICAgJFBhcmFte1VzZXJOYW1lfSA9IGpvaW4gJyAnLCAoICRVc2Vye1VzZXJGaXJzdG5hbWV9IC8vICcnICksICggJFVzZXJ7VXNlckxhc3RuYW1lfSAvLyAnJyApOwoKICAgICMgZ2VuZXJhdGUgYXZhdGFyCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkF2YXRhckVuZ2luZScpIGVxICdHcmF2YXRhcicgJiYgJFNlbGYtPntVc2VyRW1haWx9ICkgewogICAgICAgIG15ICREZWZhdWx0SWNvbiA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkdyYXZhdGFyOjpEZWZhdWx0SW1hZ2UnKSB8fCAnbW0nOwogICAgICAgICRQYXJhbXtBdmF0YXJ9ID0gJy8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvJyAuIG1kNV9oZXgoIGxjICRTZWxmLT57VXNlckVtYWlsfSApIC4gJz9zPTEwMCZkPScgLiAkRGVmYXVsdEljb247CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VXNlckluaXRpYWxzfSA9IHN1YnN0ciggJFVzZXJ7VXNlckZpcnN0bmFtZX0sIDAsIDEgKSAuIHN1YnN0ciggJFVzZXJ7VXNlckxhc3RuYW1lfSwgMCwgMSApOwogICAgfQoKICAgICMgZGVmaW5lIChjdXN0b20pIGxvZ28KICAgIG15ICRXZWJQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwogICAgJFBhcmFte1VSTExvZ299ICAgPSAkV2ViUGF0aCAuICdza2lucy9DdXN0b21lci9kZWZhdWx0L2ltZy9vdG9ib19sb2dvX3NpbXBsZV93LnN2Zyc7CiAgICAkUGFyYW17VVJMU2lnbmV0fSA9ICRXZWJQYXRoIC4gJ3NraW5zL0N1c3RvbWVyL2RlZmF1bHQvaW1nL290b2JvX3NpZ25ldF93LnN2Zyc7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSApIHsKICAgICAgICBteSAlQ3VzdG9tZXJMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSB9OwoKICAgICAgICBMT0dPOgogICAgICAgIGZvciBteSAkU3RhdGVtZW50IChxdyhVUkxMb2dvIFVSTFNpZ25ldCkpIHsKICAgICAgICAgICAgbmV4dCBMT0dPIGlmICEkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9OwoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9ICF+IC8oaHR0cHxmdHB8aHR0cHMpOlwvL2kgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFN0YXRlbWVudH0gPSAkV2ViUGF0aCAuICRDdXN0b21lckxvZ297JFN0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFN0YXRlbWVudH0gPSAkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgd2hldGhlciBjdXN0b21lciBwcmVmZXJlbmNlcyBzaG91bGQgYmUgc2hvd24KICAgIFBFUk1JU1NJT046CiAgICBmb3IgbXkgJFBlcm1pc3Npb24gKHF3KEdyb3VwUm8gR3JvdXApKSB7CgogICAgICAgICMgTm8gYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgICAgIGlmICgKICAgICAgICAgICAgcmVmICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57R3JvdXBSb30gfQogICAgICAgICAgICAmJiByZWYgJEZyb250ZW5kTW9kdWxlLT57Q3VzdG9tZXJQcmVmZXJlbmNlc30tPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57R3JvdXB9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte1Nob3dQcmVmZXJlbmNlc30gPSAxOwogICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgfQoKICAgICAgICAjIEFycmF5IGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57JFBlcm1pc3Npb259CiAgICAgICAgICAgICYmIHJlZiAkRnJvbnRlbmRNb2R1bGUtPntDdXN0b21lclByZWZlcmVuY2VzfS0+eyRQZXJtaXNzaW9ufSBlcSAnQVJSQVknCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggQHsgJEZyb250ZW5kTW9kdWxlLT57Q3VzdG9tZXJQcmVmZXJlbmNlc30tPnskUGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKICAgICAgICAgICAgICAgIG15ICRIYXNQZXJtaXNzaW9uID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Nob3dQcmVmZXJlbmNlc30gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJOYXZpZ2F0aW9uQmFyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cgp9CgpzdWIgQ3VzdG9tZXJFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMKICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgKSB8fCAnJzsKICAgIGlmICggISRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSB8fCAnPycsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgICAgICkgfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyRXJyb3InLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgQ3VzdG9tZXJFcnJvclNjcmVlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBqb2luICcnLAogICAgICAgICRTZWxmLT5DdXN0b21lckhlYWRlciggVGl0bGUgPT4gJ0Vycm9yJyApLAogICAgICAgICRTZWxmLT5DdXN0b21lckVycm9yKCVQYXJhbSksCiAgICAgICAgJFNlbGYtPkN1c3RvbWVyRm9vdGVyKCk7Cn0KCnN1YiBDdXN0b21lcldhcm5pbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdOb3RpY2UnLAogICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkKICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkgfHwgJyc7CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyV2FybmluZycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cn0KCnN1YiBDdXN0b21lck5vUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRXaXRoSGVhZGVyID0gJFBhcmFte1dpdGhIZWFkZXJ9IHx8ICd5ZXMnOwoKICAgICRQYXJhbXtNZXNzYWdlfSB8fD0gVHJhbnNsYXRhYmxlKCdObyBQZXJtaXNzaW9uIScpOwoKICAgICMgY3JlYXRlIG91dHB1dAogICAgbXkgJE91dHB1dDsKICAgICRPdXRwdXQgPSAkU2VsZi0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnTm8gUGVybWlzc2lvbicpICkgaWYgJFdpdGhIZWFkZXIgZXEgJ3llcyc7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdOb1Blcm1pc3Npb24nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+Q3VzdG9tZXJGb290ZXIoKSBpZiAkV2l0aEhlYWRlciBlcSAneWVzJzsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkT3V0cHV0Owp9CgojIHNpbWlsYXIgdG8gQ3VzdG9tZXJFcnJvcigpIGJ1dCBuZWl0aGVyIHRoZSBsYXN0IGxvZyBtZXNzYWdlIG5vciB0aGUgYmFja3RyYWNlIGlzIHByaW50ZWQKc3ViIFB1YmxpY0Vycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0LCB1c2luZyB0aGUgc2FtZSBsYXlvdXQgYXMgaW4gdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckVycm9yJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKIyB1c2luZyBQdWJsaWNFcnJvcigpIGludGVybmFsbHkKc3ViIFB1YmxpY0ZhdGFsRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIFRlbXBsYXRlIGVuZ2luZS4KICAgIHJldHVybiBpZiAkU2VsZi0+e0luRmF0YWxFcnJvcn0rKzsKCiAgICBpZiAoICRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgQ2FsbGVyICAgPT4gMSwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFBhcmFte01lc3NhZ2V9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9IGpvaW4gJycsCiAgICAgICAgJFNlbGYtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBBcmVhICA9PiAnRnJvbnRlbmQnLAogICAgICAgICAgICBUaXRsZSA9PiAnRmF0YWwgRXJyb3InCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+UHVibGljRXJyb3IoJVBhcmFtKSwgICAgIyB3aXRob3V0IGxhc3QgZXJyb3IgbWVzc2FnZSBhbmQgd2l0aG91dCBsYXN0IHRyYWNlYmFjawogICAgICAgICRTZWxmLT5DdXN0b21lckZvb3RlcigpOwoKICAgICMgTW9kaWZ5IHRoZSBvdXRwdXQgYnkgYXBwbHlpbmcgdGhlIG91dHB1dCBmaWx0ZXJzLgogICAgJE91dHB1dCA9ICRTZWxmLT5BcHBseU91dHB1dEZpbHRlcnMoIE91dHB1dCA9PiAkT3V0cHV0ICk7CgogICAgIyBUaGUgQ29udGVudC1MZW5ndGggd2lsbCBiZSBzZXQgbGF0ZXIgaW4gdGhlIG1pZGRsZXdhcmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkNvbnRlbnRMZW5ndGguIFRoaXMgcmVxdWlyZXMgdGhhdAogICAgIyB0aGVyZSBhcmUgbm8gbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIGluIHRoZSBkZWxpdmVyZWQgY29udGVudC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBtaWRkbGV3YXJlCiAgICAjIHVzZXMgY29yZTo6bGVuZ3RoKCkgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50IGxlbmd0aC4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJE91dHB1dCApOwoKICAgICMgVGhlIE9UT0JPIHJlc3BvbnNlIG9iamVjdCBhbHJlYWR5IGhhcyB0aGUgSFRQUCBoZWFkZXJzLgogICAgIyBFbmhhbmNlIGl0IHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgYW5kIHRoZSBjb250ZW50LgogICAgbXkgJFBsYWNrUmVzcG9uc2UgPSBQbGFjazo6UmVzcG9uc2UtPm5ldygKICAgICAgICAyMDAsCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKS0+SGVhZGVycygpLAogICAgICAgICRPdXRwdXQKICAgICk7CgogICAgIyBUaGUgZXhjZXB0aW9uIGlzIGNhdWdodCBiZSBQbGFjazo6TWlkZGxld2FyZTo6SFRUUEV4Y2VwdGlvbnMKICAgIGRpZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24tPm5ldygKICAgICAgICBQbGFja1Jlc3BvbnNlID0+ICRQbGFja1Jlc3BvbnNlCiAgICApOwp9CgojIHVzaW5nIFB1YmxpY0Vycm9yKCkgaW50ZXJuYWxseQpzdWIgUHVibGljRXJyb3JTY3JlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKSwKICAgICAgICAkU2VsZi0+UHVibGljRXJyb3IoJVBhcmFtKSwKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJGb290ZXIoKTsKfQoKPWhlYWQyIEFzY2lpMlJpY2hUZXh0KCkKCmNvbnZlcnRzIHRleHQgdG8gcmljaCB0ZXh0CgogICAgbXkgJEhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICBTdHJpbmcgPT4gJFRleHRTdHJpbmcsCiAgICApOwoKPWN1dAoKc3ViIEFzY2lpMlJpY2hUZXh0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNjaWkgMiBodG1sCiAgICAkUGFyYW17U3RyaW5nfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RyaW5nfSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtTdHJpbmd9Owp9Cgo9aGVhZDIgUmljaFRleHQyQXNjaWkoKQoKY29udmVydHMgcmljaCB0ZXh0LCB0aGF0IGlzIEhUTUwsIHRvIGxhaWQgb3V0IHBsYWluIHRleHQKCiAgICBteSAkVGV4dFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0MkFzY2lpKAogICAgICAgIFN0cmluZyA9PiAkSFRNTFN0cmluZywKICAgICk7Cgo9Y3V0CgpzdWIgUmljaFRleHQyQXNjaWkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KFN0cmluZykpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgSFRNTCB0byBwbGFpbiB0ZXh0CiAgICAkUGFyYW17U3RyaW5nfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWhlYWQyIFJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgpCgoxKSBhZGQgaHRtbCwgYm9keSwgLi4uIHRhZ3MgdG8gYmUgYSB2YWxpZCBodG1sIGRvY3VtZW50CjIpIHJlcGxhY2UgbGlua3Mgb2YgaW5saW5lIGNvbnRlbnQgZS4gZy4gaW1hZ2VzIHRvIDxpbWcgc3JjPSJjaWQ6eHh4eCIgLz4KCiAgICBteSAkQ29tcGxldGVIVE1MQm9keSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICBTdHJpbmcgPT4gJEhUTUxCb2R5LAogICAgKTsKCj1jdXQKCnN1YiBSaWNoVGV4dERvY3VtZW50Q29tcGxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTdHJpbmcpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpbWFnZSBsaW5rIHdpdGggY29udGVudCBpZCBmb3IgdXBsb2FkZWQgaW1hZ2VzCiAgICBteSAkU3RyaW5nUmVmID0gJFNlbGYtPl9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50KAogICAgICAgIFN0cmluZyA9PiBcJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgICMgdmVyaWZ5IEhUTUwgZG9jdW1lbnQKICAgIG15ICRDdXN0b21lckludGVyZmFjZSA9ICggJFNlbGYtPntTZXNzaW9uU291cmNlfSAmJiAoICRTZWxmLT57U2Vzc2lvblNvdXJjZX0gZXEgJ0N1c3RvbWVySW50ZXJmYWNlJyApICkgPyAxIDogMDsKICAgIG15ICRIVE1MU3RyaW5nICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICBTdHJpbmcgICAgICAgICAgICA9PiAkU3RyaW5nUmVmLT4kKiwKICAgICAgICBDdXN0b21lckludGVyZmFjZSA9PiAkQ3VzdG9tZXJJbnRlcmZhY2UKICAgICk7CgogICAgIyBkbyBjb3JyZWN0IGRpcmVjdGlvbgogICAgaWYgKCAkU2VsZi0+e1RleHREaXJlY3Rpb259ICkgewogICAgICAgICRIVE1MU3RyaW5nID1+IHMvPGJvZHkvPGJvZHkgZGlyPSIkU2VsZi0+e1RleHREaXJlY3Rpb259Ii9pOwogICAgfQoKICAgICMgZmlsdGVyIGxpbmtzIGluIHJlc3BvbnNlCiAgICAkSFRNTFN0cmluZyA9ICRTZWxmLT5IVE1MTGlua1F1b3RlKCBTdHJpbmcgPT4gJEhUTUxTdHJpbmcgKTsKCiAgICByZXR1cm4gJEhUTUxTdHJpbmc7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1oZWFkMiBfUmljaFRleHRSZXBsYWNlTGlua09mSW5saW5lQ29udGVudCgpCgpyZXBsYWNlIGxpbmtzIG9mIGlubGluZSBjb250ZW50IGUuIGcuIGltYWdlcwoKICAgICRIVE1MQm9keVN0cmluZ1JlZiA9ICRMYXlvdXRPYmplY3QtPl9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50KAogICAgICAgIFN0cmluZyA9PiAkSFRNTEJvZHlTdHJpbmdSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlcGxhY2UgaW1hZ2UgbGluayB3aXRoIGNvbnRlbnQgaWQgZm9yIHVwbG9hZGVkIGltYWdlcwogICAgJHsgJFBhcmFte1N0cmluZ30gfSA9fiBzewogICAgICAgICg8aW1nLis/c3JjPSgifCcpKVteIic+XSs/Q29udGVudElEPSguKz8pKCJ8JykoW14+XSo+KQogICAgfQogICAgewogICAgICAgIG15ICgkU3RhcnQsICRDSUQsICRDbG9zZSwgJEVuZCkgPSAoJDEsICQzLCAkNCwgJDUpOwogICAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2V0IHRoZSBDSUQgYW5kIG5vdCBleHRyYSBzdHVmZiBsaWtlIHNlc3Npb24gaW5mb3JtYXRpb24KICAgICAgICAkQ0lEID1+IHN7XihbXjsmXSspLip9eyQxfXNteDsKICAgICAgICAkU3RhcnQgLiAnY2lkOicgLiAkQ0lEIC4gJENsb3NlIC4gJEVuZDsKICAgIH1lc2d4aTsKCiAgICByZXR1cm4gJFBhcmFte1N0cmluZ307Cn0KCj1lbmQgSW50ZXJuYWw6Cgo9aGVhZDIgUmljaFRleHREb2N1bWVudFNlcnZlKCkKClNlcnZlIGEgcmljaCB0ZXh0IChIVE1MKSBkb2N1bWVudCBmb3IgbG9jYWwgdmlldyBpbnNpZGUgb2YgYW4gQzxpZnJhbWU+IGluIGNvcnJlY3QgY2hhcnNldCBhbmQgd2l0aCBjb3JyZWN0IGxpbmtzIGZvcgppbmxpbmUgZG9jdW1lbnRzLgoKQnkgZGVmYXVsdCwgYWxsIGlubGluZS9hY3RpdmUgY29udGVudCAoc3VjaCBhcyBDPHNjcmlwdD4sIEM8b2JqZWN0PiwgQzxhcHBsZXQ+IG9yIEM8ZW1iZWQ+IHRhZ3MpIHdpbGwgYmUgc3RyaXBwZWQuIElmCnRoZXJlIGFyZSBleHRlcm5hbCBpbWFnZXMsIHRoZXkgd2lsbCBiZSBzdHJpcHBlZCB0b28sIGJ1dCBhIG1lc3NhZ2Ugd2lsbCBiZSBzaG93biBhbGxvd2luZyB0aGUgdXNlciB0byByZWxvYWQgdGhlIHBhZ2UKc2hvd2luZyB0aGUgZXh0ZXJuYWwgaW1hZ2VzLgoKICAgIG15ICVIVE1MRmlsZSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRTZXJ2ZSgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEhUTUxCb2R5UmVmLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIicsCiAgICAgICAgfSwKICAgICAgICBVUkwgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRBdHRhY2htZW50O1N1YmFjdGlvbj1IVE1MVmlldztUaWNrZXRJRD0xMjM7QXJ0aWNsZUlEPTEyMztGaWxlSUQ9JywKICAgICAgICBBdHRhY2htZW50cyAgICAgICA9PiBcJUF0dGFjaG1lbnRMaXN0T2ZJbmxpbmVBdHRhY2htZW50cywKCiAgICAgICAgTG9hZElubGluZUNvbnRlbnQgPT4gMCwgICAgICMgU2VydmUgdGhlIGRvY3VtZW50IGluY2x1ZGluZyBhbGwgaW5saW5lIGNvbnRlbnQuIFdBUk5JTkc6IFRoaXMgbWlnaHQgYmUgZGFuZ2Vyb3VzLgoKICAgICAgICBMb2FkRXh0ZXJuYWxJbWFnZXMgPT4gMCwgICAgIyBMb2FkIGV4dGVybmFsIGltYWdlcz8gSWYgdGhpcyBpcyAwLCBhIG1lc3NhZ2Ugd2lsbCBiZSBpbmNsdWRlZCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV4dGVybmFsIGltYWdlcyB3ZXJlIGZvdW5kIGFuZCByZW1vdmVkLgogICAgKTsKCj1jdXQKCnN1YiBSaWNoVGV4dERvY3VtZW50U2VydmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhEYXRhIFVSTCBBdHRhY2htZW50cykpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBjaGFyc2V0IGZyb20gcGFzc2VkIGNvbnRlbnQgdHlwZSBwYXJhbWV0ZXIuCiAgICBteSAkQ2hhcnNldDsKICAgIGlmICggJFBhcmFte0RhdGF9LT57Q29udGVudFR5cGV9ID1+IG0vLis/Y2hhcnNldD0oInwnfCkoLispL2lnICkgewogICAgICAgICRDaGFyc2V0ID0gJDI7CiAgICAgICAgJENoYXJzZXQgPX4gcy8ifCcvL2c7CiAgICB9CiAgICBpZiAoICEkQ2hhcnNldCApIHsKICAgICAgICAkQ2hhcnNldCA9ICd1cy1hc2NpaSc7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudFR5cGV9IC49ICc7IGNoYXJzZXQ9InVzLWFzY2lpIic7CiAgICB9CgogICAgIyBDb252ZXJ0IHRvIGludGVybmFsIGNoYXJzZXQuCiAgICBpZiAoJENoYXJzZXQpIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+Q29udmVydCgKICAgICAgICAgICAgVGV4dCAgPT4gJFBhcmFte0RhdGF9LT57Q29udGVudH0sCiAgICAgICAgICAgIEZyb20gID0+ICRDaGFyc2V0LAogICAgICAgICAgICBUbyAgICA9PiAndXRmLTgnLAogICAgICAgICAgICBDaGVjayA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgUmVwbGFjZSBjaGFyc2V0IGluIGNvbnRlbnQgdHlwZSBhbmQgY29udGVudC4KICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50VHlwZX0gPX4gcy9cUSRDaGFyc2V0XEUvdXRmLTgvZ2k7CiAgICAgICAgaWYgKCAhKCAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9fiBzLyg8bWV0YVtePl0rY2hhcnNldD0oInwnfCkpXFEkQ2hhcnNldFxFLyQxdXRmLTgvZ2kgKSApIHsKCiAgICAgICAgICAgICMgQWRkIGV4cGxpY2l0IGNoYXJzZXQgaWYgbWlzc2luZy4KICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0KICAgICAgICAgICAgICAgID1+IHMvKDxtZXRhIFtePl0rIGh0dHAtZXF1aXY9KCJ8Jyk/Q29udGVudC1UeXBlKCJ8Jyk/IFtePl0rIGNvbnRlbnQ9KCJ8Jyk/W147Iic+XSspLyQxOyBjaGFyc2V0PXV0Zi04L2l4bXM7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGh0bWwgbGlua3MKICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID0gJFNlbGYtPkhUTUxMaW5rUXVvdGUoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9LAogICAgKTsKCiAgICAjIGNsZWFudXAgc29tZSBodG1sIHRhZ3MgdG8gYmUgY3Jvc3MgYnJvd3NlciBjb21wYXQuCiAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9ICRTZWxmLT5SaWNoVGV4dERvY3VtZW50Q2xlYW51cCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57Q29udGVudH0sCiAgICApOwoKICAgICMgc2FmZXR5IGNoZWNrCiAgICBpZiAoICEkUGFyYW17TG9hZElubGluZUNvbnRlbnR9ICkgewoKICAgICAgICAjIFN0cmlwIG91dCBhY3RpdmUgY29udGVudCBmaXJzdCwga2VlcGluZyBleHRlcm5hbCBpbWFnZXMuCiAgICAgICAgbXkgJUNvbW1vblNhZmV0eVBhcmFtcyA9ICgKICAgICAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgICAgIE5vT2JqZWN0ICAgICA9PiAxLAogICAgICAgICAgICBOb0VtYmVkICAgICAgPT4gMSwKICAgICAgICAgICAgTm9TVkcgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vSW50U3JjTG9hZCA9PiAwLAogICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICAgICAgRGVidWcgICAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICk7CiAgICAgICAgbXkgJVNhZmV0eUNoZWNrUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntDb250ZW50fSwKICAgICAgICAgICAgJUNvbW1vblNhZmV0eVBhcmFtcywKICAgICAgICAgICAgTm9FeHRTcmNMb2FkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKCiAgICAgICAgaWYgKCAhJFBhcmFte0xvYWRFeHRlcm5hbEltYWdlc30gKSB7CgogICAgICAgICAgICAjIFN0cmlwIG91dCBleHRlcm5hbCBjb250ZW50LgogICAgICAgICAgICBteSAlU2FmZXR5Q2hlY2tSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntDb250ZW50fSwKICAgICAgICAgICAgICAgICVDb21tb25TYWZldHlQYXJhbXMsCiAgICAgICAgICAgICAgICBOb0V4dFNyY0xvYWQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID0gJFNhZmV0eUNoZWNrUmVzdWx0e1N0cmluZ307CgogICAgICAgICAgICAjIFNob3cgY29uZmlybWF0aW9uIGJ1dHRvbiB0byBsb2FkIGV4dGVybmFsIGNvbnRlbnQgZXhwbGljaXRseSBvbmx5IGlmIEJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQgaXMgZGlzYWJsZWQuCiAgICAgICAgICAgICMgJFNhZmV0eUNoZWNrUmVzdWx0e1JlcGxhY2V9IGRvZXMgbm90IHNob3cgYWxsIHJlcGxhY2VtZW50cywgYnV0IGF0IGxlYXN0IHRob3NlIHRoYXQgYXJlCiAgICAgICAgICAgICMgdHJpZ2dlcmVkIGJ5IE5vRXh0U3JjTG9hZC4KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNhZmV0eUNoZWNrUmVzdWx0e1JlcGxhY2V9CiAgICAgICAgICAgICAgICAmJiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCbG9ja0xvYWRpbmdSZW1vdGVDb250ZW50JykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgYmxvY2tlciBtZXNzYWdlLgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0F0dGFjaG1lbnRCbG9ja2VyJyApOwoKICAgICAgICAgICAgICAgICMgQWRkIGl0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJvZHksIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgcHJlcGVuZCBpdC4KICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0RhdGF9LT57Q29udGVudH0gPX4gLzxib2R5Lio/Pi9zaSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9fiBzLyg8Ym9keS4qPz4pLyQxXG4kTWVzc2FnZS9zaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID0gJE1lc3NhZ2UgLiAkUGFyYW17RGF0YX0tPntDb250ZW50fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIGJhc2UgdXJsIGZvciBpbmxpbmUgaW1hZ2VzCiAgICBteSAkU2Vzc2lvbklEID0gJyc7CiAgICBpZiAoICRTZWxmLT57U2Vzc2lvbklEfSAmJiAhJFNlbGYtPntTZXNzaW9uSURDb29raWV9ICkgewogICAgICAgICRTZXNzaW9uSUQgPSAnOycgLiAkU2VsZi0+e1Nlc3Npb25OYW1lfSAuICc9JyAuICRTZWxmLT57U2Vzc2lvbklEfTsKICAgIH0KCiAgICAjIHJlcGxhY2UgaW5saW5lIGltYWdlcyBpbiBjb250ZW50IHdpdGggcnVudGltZSB1cmwgdG8gaW1hZ2VzCiAgICBteSAkQXR0YWNobWVudExpbmsgPSAkU2VsZi0+e0Jhc2VsaW5rfSAuICRQYXJhbXtVUkx9OwogICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPX4gc3sKICAgICAgICAoPXwifCcpY2lkOiguKj8pKCJ8J3w+fFwvPnxccykKICAgIH0KICAgIHsKICAgICAgICBteSAkU3RhcnQ9ICQxOwogICAgICAgIG15ICRDb250ZW50SUQgPSAkMjsKICAgICAgICBteSAkRW5kID0gJDM7CgogICAgICAgICMgaW1wcm92ZSBodG1sIHF1YWxpdHkKICAgICAgICBpZiAoICRTdGFydCBuZSAnIicgJiYgJFN0YXJ0IG5lICdcJycgKSB7CiAgICAgICAgICAgICRTdGFydCAuPSAnIic7CiAgICAgICAgfQogICAgICAgIGlmICggJEVuZCBuZSAnIicgJiYgJEVuZCBuZSAnXCcnICkgewogICAgICAgICAgICAkRW5kID0gJyInIC4gJEVuZDsKICAgICAgICB9CgogICAgICAgICMgZmluZCBtYXRjaGluZyBhdHRhY2htZW50IGFuZCByZXBsYWNlIGl0IHdpdGggcnVudGltZSB1cmwgdG8gaW1hZ2UKICAgICAgICBBVFRBQ0hNRU5UX0lEOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudElEICggIHNvcnQga2V5cyAleyAkUGFyYW17QXR0YWNobWVudHN9IH0pIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UX0lEIGlmIGxjICRQYXJhbXtBdHRhY2htZW50c30tPnskQXR0YWNobWVudElEfS0+e0NvbnRlbnRJRH0gbmUgbGMgIjwkQ29udGVudElEPiI7CgogICAgICAgICAgICBpZiAoICEkUGFyYW17Q29udGVudElEc30gKXsKICAgICAgICAgICAgICAgICRDb250ZW50SUQgPSAkQXR0YWNobWVudExpbmsgLiAkQXR0YWNobWVudElEIC4gJFNlc3Npb25JRDsKICAgICAgICAgICAgfQogICAgICAgICAgICAjQXJ0aWNsZUVkaXQgaW5saW5lIGF0dGFjaG1lbnRzIHJlbmRlcmluZwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb250ZW50SUQgPSAkQXR0YWNobWVudExpbmsgLiAkUGFyYW17Q29udGVudElEc30tPnskUGFyYW17QXR0YWNobWVudHN9LT57JEF0dGFjaG1lbnRJRH0tPntGaWxlbmFtZX19IC4gJFNlc3Npb25JRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0IEFUVEFDSE1FTlRfSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBuZXcgcnVudGltZSB1cmwKICAgICAgICAkU3RhcnQgLiAkQ29udGVudElEIC4gJEVuZDsKICAgIH1lZ3hpOwoKICAgICMgYnVnICM1MDUzCiAgICAjIGlubGluZSBpbWFnZXMgdXNpbmcgQ29udGVudC1Mb2NhdGlvbiBhcyBpZGVudGlmaWVyIGluc3RlYWQgb2YgQ29udGVudC1JRCBldmVuIFJGQzI1NTcKICAgICMgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjU1Ny50eHQKCiAgICAjIGZpbmQgbWF0Y2hpbmcgYXR0YWNobWVudCBhbmQgcmVwbGFjZSBpdCB3aXRoIHJ1bnRsaW1lIHVybCB0byBpbWFnZQogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudElEICggc29ydCBrZXlzICV7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRQYXJhbXtBdHRhY2htZW50c30tPnskQXR0YWNobWVudElEfS0+e0NvbnRlbnRJRH07CgogICAgICAgICMgY29udGVudCBpZCBjbGVhbnVwCiAgICAgICAgJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfSA9fiBzL148Ly87CiAgICAgICAgJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfSA9fiBzLz4kLy87CgogICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfTsKCiAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPX4gc3sKICAgICAgICAoPXwifCcpKFxRJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfVxFKSgifCd8PnxcLz58XHMpCiAgICB9CiAgICB7CiAgICAgICAgbXkgJFN0YXJ0PSAkMTsKICAgICAgICBteSAkQ29udGVudElEID0gJDI7CiAgICAgICAgbXkgJEVuZCA9ICQzOwoKICAgICAgICAjIGltcHJvdmUgaHRtbCBxdWFsaXR5CiAgICAgICAgaWYgKCAkU3RhcnQgbmUgJyInICYmICRTdGFydCBuZSAnXCcnICkgewogICAgICAgICAgICAkU3RhcnQgLj0gJyInOwogICAgICAgIH0KICAgICAgICBpZiAoICRFbmQgbmUgJyInICYmICRFbmQgbmUgJ1wnJyApIHsKICAgICAgICAgICAgJEVuZCA9ICciJyAuICRFbmQ7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBuZXcgcnVudGltZSB1cmwKICAgICAgICAkQ29udGVudElEID0gJEF0dGFjaG1lbnRMaW5rIC4gJEF0dGFjaG1lbnRJRCAuICRTZXNzaW9uSUQ7CiAgICAgICAgJFN0YXJ0IC4gJENvbnRlbnRJRCAuICRFbmQ7CiAgICB9ZWd4aTsKICAgIH0KCiAgICByZXR1cm4gJXsgJFBhcmFte0RhdGF9IH07Cn0KCj1oZWFkMiBSaWNoVGV4dERvY3VtZW50Q2xlYW51cCgpCgpwbGVhc2Ugc2VlIEw8S2VybmVsOjpTeXN0ZW06OkhUTUw6OkxheW91dDo6RG9jdW1lbnRDbGVhbnVwKCk+Cgo9Y3V0CgpzdWIgUmljaFRleHREb2N1bWVudENsZWFudXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTdHJpbmcpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1N0cmluZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkRvY3VtZW50Q2xlYW51cCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSgpCgpjcmVhdGUgdGhlIG9wdGlvbiBoYXNoCgogICAgbXkgJE9wdGlvblJlZiA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIG15ICRPcHRpb25SZWYgPSB7CiAgICAgICAgU29ydCAgICAgICAgID0+ICdudW1lcmljJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgfQoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IFNlbGVjdGVkSUQgb3B0aW9uCiAgICBteSAkT3B0aW9uUmVmID0ge307CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1NlbGVjdGVkSUR9ICkgewogICAgICAgIGlmICggcmVmICRQYXJhbXtTZWxlY3RlZElEfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJEtleSAoIEB7ICRQYXJhbXtTZWxlY3RlZElEfSB9ICkgewogICAgICAgICAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkSUR9LT57JEtleX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3B0aW9uUmVmLT57U2VsZWN0ZWRJRH0tPnsgJFBhcmFte1NlbGVjdGVkSUR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBTZWxlY3RlZFZhbHVlIG9wdGlvbgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICBpZiAoIHJlZiAkUGFyYW17U2VsZWN0ZWRWYWx1ZX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgZm9yIG15ICRWYWx1ZSAoIEB7ICRQYXJhbXtTZWxlY3RlZFZhbHVlfSB9ICkgewogICAgICAgICAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9LT57JFZhbHVlfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfS0+eyAkUGFyYW17U2VsZWN0ZWRWYWx1ZX0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IFNvcnQgb3B0aW9uCiAgICAkT3B0aW9uUmVmLT57U29ydH0gPSAwOwogICAgaWYgKCAkUGFyYW17U29ydH0gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnR9ID0gJFBhcmFte1NvcnR9OwogICAgfQoKICAgICMgbG9vayBpZiBhIGluZGl2aWR1YWwgc29ydCBpcyBhdmFpbGFibGUKICAgIGlmICggJFBhcmFte1NvcnRJbmRpdmlkdWFsfSAmJiByZWYgJFBhcmFte1NvcnRJbmRpdmlkdWFsfSBlcSAnQVJSQVknICkgewogICAgICAgICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gPSAkUGFyYW17U29ydEluZGl2aWR1YWx9OwogICAgfQoKICAgICMgc2V0IFNvcnRSZXZlcnNlIG9wdGlvbgogICAgJE9wdGlvblJlZi0+e1NvcnRSZXZlcnNlfSA9IDA7CiAgICBpZiAoICRQYXJhbXtTb3J0UmV2ZXJzZX0gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnRSZXZlcnNlfSA9IDE7CiAgICB9CgogICAgIyBzZXQgVHJhbnNsYXRpb24gb3B0aW9uCiAgICAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ID0gMTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VHJhbnNsYXRpb259ICYmICRQYXJhbXtUcmFuc2xhdGlvbn0gPT0gMCApIHsKICAgICAgICAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ID0gMDsKICAgIH0KCiAgICAjIGNvcnJlY3Rpbmcgc2VsZWN0ZWQgdmFsdWUgaGFzaCBpZiB0cmFuc2xhdGlvbiBpcyBvbgogICAgaWYgKAogICAgICAgICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0KICAgICAgICAmJiAkT3B0aW9uUmVmLT57U2VsZWN0ZWRWYWx1ZX0KICAgICAgICAmJiByZWYgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9IGVxICdIQVNIJwogICAgICAgICkKICAgIHsKICAgICAgICBteSAlU2VsZWN0ZWRWYWx1ZU5ldzsKICAgICAgICBmb3IgbXkgJE9yaWdpbmFsS2V5ICggc29ydCBrZXlzICV7ICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfSB9ICkgewogICAgICAgICAgICBteSAkVHJhbnNsYXRlZEtleSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJE9yaWdpbmFsS2V5KTsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWVOZXd7JFRyYW5zbGF0ZWRLZXl9ID0gMTsKICAgICAgICB9CiAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9ID0gXCVTZWxlY3RlZFZhbHVlTmV3OwogICAgfQoKICAgICMgc2V0IFBvc3NpYmxlTm9uZSBvcHRpb24KICAgICRPcHRpb25SZWYtPntQb3NzaWJsZU5vbmV9ID0gJFBhcmFte1Bvc3NpYmxlTm9uZX0gPyAxIDogMDsKCiAgICAjIHNldCBUcmVlVmlldyBvcHRpb24KICAgICRPcHRpb25SZWYtPntUcmVlVmlld30gPSAwOwogICAgaWYgKCAkUGFyYW17VHJlZVZpZXd9ICkgewogICAgICAgICRPcHRpb25SZWYtPntUcmVlVmlld30gPSAxOwogICAgICAgICRPcHRpb25SZWYtPntTb3J0fSAgICAgPSAnVHJlZVZpZXcnOwogICAgfQoKICAgICMgc2V0IERpc2FibGVkQnJhbmNoIG9wdGlvbgogICAgaWYgKCAkUGFyYW17RGlzYWJsZWRCcmFuY2h9ICkgewogICAgICAgIGlmICggcmVmICRQYXJhbXtEaXNhYmxlZEJyYW5jaH0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgZm9yIG15ICRCcmFuY2ggKCBAeyAkUGFyYW17RGlzYWJsZWRCcmFuY2h9IH0gKSB7CiAgICAgICAgICAgICAgICAkT3B0aW9uUmVmLT57RGlzYWJsZWRCcmFuY2h9LT57JEJyYW5jaH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3B0aW9uUmVmLT57RGlzYWJsZWRCcmFuY2h9LT57ICRQYXJhbXtEaXNhYmxlZEJyYW5jaH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IE1heCBvcHRpb24KICAgICRPcHRpb25SZWYtPntNYXh9ID0gJFBhcmFte01heH0gfHwgMTAwOwoKICAgICMgc2V0IEhUTUxRdW90ZSBvcHRpb24sIGRlZmF1bHQgaXMgMQogICAgJE9wdGlvblJlZi0+e0hUTUxRdW90ZX0gPSAkUGFyYW17SFRNTFF1b3RlfSAvLyAxOwoKICAgIHJldHVybiAkT3B0aW9uUmVmOwp9Cgo9aGVhZDIgX0J1aWxkU2VsZWN0aW9uQXR0cmlidXRlUmVmQ3JlYXRlKCkKCmNyZWF0ZSB0aGUgYXR0cmlidXRlIGhhc2gKCiAgICBteSAkQXR0cmlidXRlUmVmID0gJExheW91dE9iamVjdC0+X0J1aWxkU2VsZWN0aW9uQXR0cmlidXRlUmVmQ3JlYXRlKAogICAgICAgICVQYXJhbSwKICAgICk7CgpUaGUgcmVzdWx0IGxvb2tzIGxpa2U6CgogICAgbXkgJEF0dHJpYnV0ZVJlZiA9IHsKICAgICAgICBuYW1lICAgICA9PiAnVGhlTmFtZScsCiAgICAgICAgbXVsdGlwbGUgPT4gdW5kZWYsCiAgICAgICAgc2l6ZSAgICAgPT4gNSwKICAgIH0KCj1jdXQKCnN1YiBfQnVpbGRTZWxlY3Rpb25BdHRyaWJ1dGVSZWZDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlQXR0cmlidXRlczsKCiAgICAjIGNoZWNrIHBhcmFtcyB3aXRoIGtleSBhbmQgdmFsdWUKICAgIGZvciAocXcoTmFtZSBJRCBTaXplIENsYXNzIE9uQ2hhbmdlIE9uQ2xpY2sgQXV0b0NvbXBsZXRlKSkgewogICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZXN7IGxjICRfIH0gPSAkUGFyYW17JF99OwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhIGZhbGxiYWNrIGZvciB0aGUgaWQgYXR0cmlidXRlCiAgICAkQXR0cmlidXRlc3tpZH0gfHw9ICRBdHRyaWJ1dGVze25hbWV9OwoKICAgICMgY2hlY2sgcGFyYW1zIHdpdGgga2V5IGFuZCB2YWx1ZSB0aGF0IG5lZWQgdG8gYmUgSFRNTC1RdW90ZWQKICAgIGZvciAocXcoVGl0bGUpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkQXR0cmlidXRlc3sgbGMoJF8pIH0gPSAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17JF99ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgSFRNTCBwYXJhbXMsIFRPRE86IHRoZSB2YWx1ZXMgYXJlIG5vdCByZWFsbHkgbmVlZGVkCiAgICBmb3IgKHF3KE11bHRpcGxlIERpc2FibGVkKSkgewogICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZXN7IGxjICRfIH0gPSBsYyAkXzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlQXR0cmlidXRlczsKfQoKPWhlYWQyIF9CdWlsZFNlbGVjdGlvbkRhdGFSZWZDcmVhdGUoKQoKY3JlYXRlIHRoZSBkYXRhIGhhc2gKCiAgICBteSAkRGF0YVJlZiA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbkRhdGFSZWZDcmVhdGUoCiAgICAgICAgRGF0YSA9PiAkQXJyYXlSZWYsICAgICAgICAgICAgICAjIHVzZSAkSGFzaFJlZiwgJEFycmF5UmVmIG9yICRBcnJheUhhc2hSZWYKICAgICAgICBBdHRyaWJ1dGVSZWYgPT4gJEF0dHJpYnV0ZVJlZiwKICAgICAgICBPcHRpb25SZWYgPT4gJE9wdGlvblJlZiwKICAgICk7CgogICAgbXkgJERhdGFSZWYgID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+IDExLAogICAgICAgICAgICBWYWx1ZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnYWJjJywKICAgICAgICAgICAgVmFsdWUgPT4gJyZuYnNwOyZuYnNwO1RleHQnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbkRhdGFSZWZDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3B0aW9uUmVmID0gJFBhcmFte09wdGlvblJlZn07CiAgICBteSAkRGF0YVJlZiAgID0gW107CgogICAgIyBmb3IgSGFzaFJlZiBhbmQgQXJyYXlSZWYgb25seQogICAgbXkgJURpc2FibGVkRWxlbWVudHM7CgogICAgIyBkY2xvbmUgJFBhcmFte0RhdGF9IGJlY2F1c2UgdGhlIHN1YnJvdXRpbmUgdW5mb3J0dW5hdGVseSBtb2RpZmllcwogICAgIyB0aGUgb3JpZ2luYWwgZGF0YSByZWYKICAgIG15ICREYXRhTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKS0+Q2xvbmUoIERhdGEgPT4gJFBhcmFte0RhdGF9ICk7CgogICAgIyBpZiBIYXNoUmVmIHdhcyBnaXZlbgogICAgaWYgKCByZWYgJERhdGFMb2NhbCBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgc29ydCBoYXNoIChiZWZvcmUgdGhlIHRyYW5zbGF0aW9uKQogICAgICAgIG15IEBTb3J0S2V5czsKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbFZhbHVlJyAmJiAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9ICkgewogICAgICAgICAgICBteSAlTGlzdCA9IHJldmVyc2UgJXskRGF0YUxvY2FsfTsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBAeyAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMaXN0eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNvcnRLZXlzLCAkTGlzdHskS2V5fTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJExpc3R7JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBAU29ydEtleXMsIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSAoIHZhbHVlcyAlTGlzdCApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbWlzc2luZyBwYXJlbnRzIGFuZCBtYXJrIHRoZW0gZm9yIGRpc2FibGUgbGF0ZXIKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBSZXZlcnNlIGhhc2gsIHNraXBwaW5nIHVuZGVmaW5lZCB2YWx1ZXMuCiAgICAgICAgICAgICMgICB0cmFuc2xhdGUgb24gZWxlbWVudCBiYXNlIHByaW9yIHRvIHNvcnRpbmcKICAgICAgICAgICAgbXkgJUxpc3Q7CiAgICAgICAgICAgIGlmICggJE9wdGlvblJlZi0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyREYXRhTG9jYWx9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICREYXRhTG9jYWwtPnskS2V5fTsKCiAgICAgICAgICAgICAgICAgICAgbXkgQFRyYW5zbGF0ZWQgPSBtYXAgeyAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSB9ICggc3BsaXQgLzo6LywgJERhdGFMb2NhbC0+eyRLZXl9ICk7CiAgICAgICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eyRLZXl9ID0gam9pbiAnOjonLCBAVHJhbnNsYXRlZDsKCiAgICAgICAgICAgICAgICAgICAgJExpc3R7ICREYXRhTG9jYWwtPnskS2V5fSB9ID0gXEBUcmFuc2xhdGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICVMaXN0ID0gbWFwIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YUxvY2FsLT57JF99ID0+IFsgc3BsaXQgLzo6LywgJERhdGFMb2NhbC0+eyRffSBdCiAgICAgICAgICAgICAgICB9IGdyZXAgeyBkZWZpbmVkICREYXRhTG9jYWwtPnskX30gfSBrZXlzICV7JERhdGFMb2NhbH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGVhY2ggZGF0YSB2YWx1ZQogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTGlzdCApIHsKICAgICAgICAgICAgICAgIG15ICRQYXJlbnRzID0gJyc7CgogICAgICAgICAgICAgICAgIyBnZXQgZWFjaCBlbGVtZW50IGluIHRoZSBoaWVyYXJjaHkKICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoICRMaXN0eyRLZXl9LT5AKiApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgaXRzIG93biBwYXJlbnRzIGZvciB0aGUgY29tcGxldGUgbmFtZQogICAgICAgICAgICAgICAgICAgIG15ICRFbGVtZW50TG9uZ05hbWUgPSAkUGFyZW50cyAuICRFbGVtZW50OwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBvcmlnaW5hbCBkYXRhIG9yIGlmIGl0IGlzIGFscmVhZHkgbWFya2VkCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJExpc3R7JEVsZW1lbnRMb25nTmFtZX0gJiYgISREaXNhYmxlZEVsZW1lbnRzeyRFbGVtZW50TG9uZ05hbWV9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBtYXJrIGVsZW1lbnQgYXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgICAgJERpc2FibGVkRWxlbWVudHN7JEVsZW1lbnRMb25nTmFtZX0gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIG9yaWdpbmFsIGRhdGEgdG8gYmUgZGlzYWJsZWQgbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eyAkRWxlbWVudExvbmdOYW1lIC4gJ19EaXNhYmxlZCcgfSA9ICRFbGVtZW50TG9uZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRQYXJlbnRzIC49ICRFbGVtZW50IC4gJzo6JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2xhdGUgdmFsdWUgZm9yIG5vbiB0cmVlIGNhc2VzCiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIHNvcnQga2V5cyAleyREYXRhTG9jYWx9ICkgewogICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eyRSb3d9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJERhdGFMb2NhbC0+eyRSb3d9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29ydCBoYXNoIChhZnRlciB0aGUgdHJhbnNsYXRpb24pCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNLZXknICkgewogICAgICAgICAgICBAU29ydEtleXMgPSBzb3J0IHsgJGEgPD0+ICRiIH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNWYWx1ZScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgeyAkRGF0YUxvY2FsLT57JGF9IDw9PiAkRGF0YUxvY2FsLT57JGJ9IH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0FscGhhbnVtZXJpY0tleScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQoIGtleXMgJXskRGF0YUxvY2FsfSApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgICAgICAgICAgbXkgJVNvcnRIYXNoOwogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkRGF0YUxvY2FsLT57JEtleX07CiAgICAgICAgICAgICAgICAkU29ydEhhc2h7JEtleX0gPSAkRGF0YUxvY2FsLT57JEtleX0gLiAnOjonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgeyBsYyAkU29ydEhhc2h7JGF9IGNtcCBsYyAkU29ydEhhc2h7JGJ9IH0gKCBrZXlzICVTb3J0SGFzaCApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbEtleScgJiYgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSApIHsKICAgICAgICAgICAgbXkgJUxpc3QgPSAleyREYXRhTG9jYWx9OwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIEB7ICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gfSApIHsKICAgICAgICAgICAgICAgIGlmICggJExpc3R7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU29ydEtleXMsICRLZXk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRMaXN0eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQFNvcnRLZXlzLCBzb3J0IHsgbGMgJExpc3R7JGF9IGNtcCBsYyAkTGlzdHskYn0gfSAoIGtleXMgJUxpc3QgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0luZGl2aWR1YWxWYWx1ZScgJiYgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSApIHsKCiAgICAgICAgICAgICMgYWxyZWFkeSBkb25lIGJlZm9yZSB0aGUgdHJhbnNsYXRpb24KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGlmIGVtcHR5IHZhbHVlIGhhcyBiZWVuIGFkZGVkLCByZW1vdmUgYmVmb3JlIHNvcnQKICAgICAgICAgICAgbXkgJEVtcHR5VmFsdWUgPSBkZWxldGUgJERhdGFMb2NhbC0+eycnfTsKCiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgewogICAgICAgICAgICAgICAgbGMoICREYXRhTG9jYWwtPnskYX0gLy8gJycgKQogICAgICAgICAgICAgICAgICAgIGNtcCBsYyggJERhdGFMb2NhbC0+eyRifSAvLyAnJyApCiAgICAgICAgICAgIH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKCiAgICAgICAgICAgICMgaWYgd2UgaGFkIGFuIGVtcHR5IHZhbHVlLCBwdXQgaXQgYmFjayBhbmQgYWRkIGl0J3MKICAgICAgICAgICAgIyBzb3J0LWtleSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRFbXB0eVZhbHVlICkgewogICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eycnfSA9ICRFbXB0eVZhbHVlOwogICAgICAgICAgICAgICAgdW5zaGlmdCBAU29ydEtleXMsICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRPcHRpb25SZWYtPntTb3J0fSA9ICdBbHBoYW51bWVyaWNWYWx1ZSc7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBEYXRhUmVmCiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkUm93IChAU29ydEtleXMpIHsKICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntLZXl9ICAgPSAkUm93OwogICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e1ZhbHVlfSA9ICREYXRhTG9jYWwtPnskUm93fTsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBBcnJheUhhc2hSZWYgd2FzIGdpdmVuCiAgICBlbHNpZiAoIHJlZiAkRGF0YUxvY2FsIGVxICdBUlJBWScgJiYgcmVmICREYXRhTG9jYWwtPlswXSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IG1pc3NpbmcgcGFyZW50cyBhbmQgbWFyayB0aGVtIGZvciBkaXNhYmxlIGxhdGVyCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ1RyZWVWaWV3JyApIHsKCiAgICAgICAgICAgICMgYnVpbGQgYSBsaXN0IG9mIGVsZW1lbnQgbG9uZ25hbWVzCiAgICAgICAgICAgIG15IEBOZXdEYXRhTG9jYWw7CgogICAgICAgICAgICBteSAlTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRWYWx1ZUhhc2ggKCBAeyREYXRhTG9jYWx9ICkgewogICAgICAgICAgICAgICAgJExpc3R7ICRWYWx1ZUhhc2gtPntWYWx1ZX0gfSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGVhY2ggZGF0YSB2YWx1ZSBoYXNoCiAgICAgICAgICAgIGZvciBteSAkVmFsdWVIYXNoICggQHskRGF0YUxvY2FsfSApIHsKCiAgICAgICAgICAgICAgICBteSAkUGFyZW50cyA9ICcnOwoKICAgICAgICAgICAgICAgICMgdHJ5IHRvIHNwbGl0IGl0cyBwYXJlbnRzIChlLmcuIFF1ZXVlIG9yIFNlcnZpY2UpIEdyYW5kUGFyZW50OjpQYXJlbnQ6OlNvbgogICAgICAgICAgICAgICAgbXkgQEVsZW1lbnRzID0gc3BsaXQgLzo6LywgJFZhbHVlSGFzaC0+e1ZhbHVlfTsKCiAgICAgICAgICAgICAgICAjIGdldCBlYWNoIGVsZW1lbnQgaW4gdGhlIGhpZXJhcmNoeQogICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50IChARWxlbWVudHMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgaXRzIG93biBwYXJlbnRzIGZvciB0aGUgY29tcGxldGUgbmFtZQogICAgICAgICAgICAgICAgICAgIG15ICRFbGVtZW50TG9uZ05hbWUgPSAkUGFyZW50cyAuICRFbGVtZW50OwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBvcmlnaW5hbCBkYXRhIG9yIGlmIGl0IGlzIGFscmVhZHkgbWFya2VkCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJExpc3R7JEVsZW1lbnRMb25nTmFtZX0gJiYgISREaXNhYmxlZEVsZW1lbnRzeyRFbGVtZW50TG9uZ05hbWV9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBtYXJrIGVsZW1lbnQgYXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgICAgJERpc2FibGVkRWxlbWVudHN7JEVsZW1lbnRMb25nTmFtZX0gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBwdXNoIHRoZSBtaXNzaW5nIGVsZW1lbnQgdG8gdGhlIGRhdGEgbG9jYWwgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATmV3RGF0YUxvY2FsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkRWxlbWVudExvbmdOYW1lIC4gJ19EaXNhYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkRWxlbWVudExvbmdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmVudHMgLj0gJEVsZW1lbnQgLiAnOjonOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHVzaCB0aGUgZWxlbWVudCB0byB0aGUgZGF0YSBsb2NhbCBhcnJheQogICAgICAgICAgICAgICAgcHVzaCBATmV3RGF0YUxvY2FsLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJFZhbHVlSGFzaC0+e0tleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJFZhbHVlSGFzaC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZCA9PiAkVmFsdWVIYXNoLT57U2VsZWN0ZWR9ID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgPT4gJFZhbHVlSGFzaC0+e0Rpc2FibGVkfSA/IDEgOiAwLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgZGF0YSBsb2NhbCB3aXRoIHRoZSBuZXcgb25lCiAgICAgICAgICAgIEB7JERhdGFMb2NhbH0gPSBATmV3RGF0YUxvY2FsOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgRGF0YVJlZgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgIGlmICggcmVmICRSb3cgZXEgJ0hBU0gnICYmIGRlZmluZWQgJFJvdy0+e0tleX0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e0tleX0gICA9ICRSb3ctPntLZXl9OwogICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkUm93LT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICMgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgICAgICAgICBpZiAoICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e1ZhbHVlfSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2V0IFNlbGVjdGVkIGFuZCBEaXNhYmxlZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoICRSb3ctPntTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntTZWxlY3RlZH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUm93LT57RGlzYWJsZWR9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57RGlzYWJsZWR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBpZiBBcnJheVJlZiB3YXMgZ2l2ZW4KICAgIGVsc2lmICggcmVmICREYXRhTG9jYWwgZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgIyBnZXQgbWlzc2luZyBwYXJlbnRzIGFuZCBtYXJrIHRoZW0gZm9yIGRpc2FibGUgbGF0ZXIKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewogICAgICAgICAgICBteSAlTGlzdCA9IG1hcCB7ICRfID0+IDEgfSBAeyREYXRhTG9jYWx9OwoKICAgICAgICAgICAgIyBnZXQgZWFjaCBkYXRhIHZhbHVlCiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVMaXN0ICkgewogICAgICAgICAgICAgICAgbXkgJFBhcmVudHMgPSAnJzsKCiAgICAgICAgICAgICAgICAjIHRyeSB0byBzcGxpdCBpdHMgcGFyZW50cyAoZS5nLiBRdWV1ZSBvciBTZXJ2aWNlKSBHcmFuZFBhcmVudDo6UGFyZW50OjpTb24KICAgICAgICAgICAgICAgIG15IEBFbGVtZW50cyA9IHNwbGl0IC86Oi8sICRLZXk7CgogICAgICAgICAgICAgICAgIyBnZXQgZWFjaCBlbGVtZW50IGluIHRoZSBoaWVyYXJjaHkKICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoQEVsZW1lbnRzKSB7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGl0cyBvd24gcGFyZW50cyBmb3IgdGhlIGNvbXBsZXRlIG5hbWUKICAgICAgICAgICAgICAgICAgICBteSAkRWxlbWVudExvbmdOYW1lID0gJFBhcmVudHMgLiAkRWxlbWVudDsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBlbGVtZW50IGV4aXN0cyBpbiB0aGUgb3JpZ2luYWwgZGF0YSBvciBpZiBpdCBpcyBhbHJlYWR5IG1hcmtlZAogICAgICAgICAgICAgICAgICAgIGlmICggISRMaXN0eyRFbGVtZW50TG9uZ05hbWV9ICYmICEkRGlzYWJsZWRFbGVtZW50c3skRWxlbWVudExvbmdOYW1lfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbWFyayBlbGVtZW50IGFzIGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgICAgICREaXNhYmxlZEVsZW1lbnRzeyRFbGVtZW50TG9uZ05hbWV9ID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhIHRvIGJlIGRpc2FibGVkIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskRGF0YUxvY2FsfSwgJEVsZW1lbnRMb25nTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmVudHMgLj0gJEVsZW1lbnQgLiAnOjonOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbFZhbHVlJyAmJiAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9ICkgewogICAgICAgICAgICBteSAlTGlzdCA9IG1hcCB7ICRfID0+IDEgfSBAeyREYXRhTG9jYWx9OwogICAgICAgICAgICAkRGF0YUxvY2FsID0gW107CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggQHsgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTGlzdHskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JERhdGFMb2NhbH0sICRLZXk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRMaXN0eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQHskRGF0YUxvY2FsfSwgc29ydCB7ICRhIGNtcCAkYiB9ICgga2V5cyAlTGlzdCApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVJldmVyc2VIYXNoOwoKICAgICAgICAjIHRyYW5zbGF0ZSB2YWx1ZQogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgbXkgQFRyYW5zbGF0ZUFycmF5OwogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgICAgICBteSAkVHJhbnNsYXRlU3RyaW5nID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkUm93KTsKICAgICAgICAgICAgICAgIHB1c2ggQFRyYW5zbGF0ZUFycmF5LCAkVHJhbnNsYXRlU3RyaW5nOwogICAgICAgICAgICAgICAgJFJldmVyc2VIYXNoeyRUcmFuc2xhdGVTdHJpbmd9ID0gJFJvdzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YUxvY2FsID0gXEBUcmFuc2xhdGVBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YUxvY2FsfSApIHsKICAgICAgICAgICAgICAgICRSZXZlcnNlSGFzaHskUm93fSA9ICRSb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29ydCBhcnJheQogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1NvcnR9IGVxICdBbHBoYW51bWVyaWNLZXknIHx8ICRPcHRpb25SZWYtPntTb3J0fSBlcSAnQWxwaGFudW1lcmljVmFsdWUnICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBTb3J0QXJyYXkgPSBzb3J0KCBAeyREYXRhTG9jYWx9ICk7CiAgICAgICAgICAgICREYXRhTG9jYWwgPSBcQFNvcnRBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNLZXknIHx8ICRPcHRpb25SZWYtPntTb3J0fSBlcSAnTnVtZXJpY1ZhbHVlJyApIHsKICAgICAgICAgICAgbXkgQFNvcnRBcnJheSA9IHNvcnQgeyAkYSA8PT4gJGIgfSAoIEB7JERhdGFMb2NhbH0gKTsKICAgICAgICAgICAgJERhdGFMb2NhbCA9IFxAU29ydEFycmF5OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBzb3J0IGFycmF5LCBhZGQgJzo6JyBpbiB0aGUgY29tcGFyaXNvbiwgZm9yIHByb3BlciBzb3J0IG9mIEl0ZW1zIHdpdGggSXRlbXM6OlN1Ykl0ZW1zCiAgICAgICAgICAgIG15IEBTb3J0QXJyYXkgPSBzb3J0IHsgJGEgLiAnOjonIGNtcCAkYiAuICc6OicgfSBAeyREYXRhTG9jYWx9OwogICAgICAgICAgICAkRGF0YUxvY2FsID0gXEBTb3J0QXJyYXk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBEYXRhUmVmCiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YUxvY2FsfSApIHsKICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntLZXl9ICAgPSAkUmV2ZXJzZUhhc2h7JFJvd307CiAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57VmFsdWV9ID0gJFJvdzsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBkaXNhYmxlZCBpdGVtcyBvbiBBcnJheVJlZiBvciBIYXNoUmVmIG9ubHkKICAgIGlmICgKICAgICAgICByZWYgJERhdGFMb2NhbCBlcSAnSEFTSCcKICAgICAgICB8fCAoIHJlZiAkRGF0YUxvY2FsIGVxICdBUlJBWScgJiYgcmVmICREYXRhTG9jYWwtPlswXSBuZSAnSEFTSCcgKQogICAgICAgICkKICAgIHsKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFSZWZ9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFJvdy0+e1ZhbHVlfSAmJiAkRGlzYWJsZWRFbGVtZW50c3sgJFJvdy0+e1ZhbHVlfSB9ICkgewogICAgICAgICAgICAgICAgJFJvdy0+e0tleX0gICAgICA9ICctJzsKICAgICAgICAgICAgICAgICRSb3ctPntEaXNhYmxlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgRGlzYWJsZWRCcmFuY2ggb3B0aW9uCiAgICBpZiAoICRPcHRpb25SZWYtPntEaXNhYmxlZEJyYW5jaH0gKSB7CiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKICAgICAgICAgICAgZm9yIG15ICRCcmFuY2ggKCBzb3J0IGtleXMgJXsgJE9wdGlvblJlZi0+e0Rpc2FibGVkQnJhbmNofSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkUm93LT57VmFsdWV9ID1+IC9eKFxRJEJyYW5jaFxFKSQvIHx8ICRSb3ctPntWYWx1ZX0gPX4gL14oXFEkQnJhbmNoXEUpOjovICkgewogICAgICAgICAgICAgICAgICAgICRSb3ctPntEaXNhYmxlZH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgU2VsZWN0ZWRJRCBhbmQgU2VsZWN0ZWRWYWx1ZSBvcHRpb24KICAgIGlmICggZGVmaW5lZCAkT3B0aW9uUmVmLT57U2VsZWN0ZWRJRH0gfHwgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9ICkgewogICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YVJlZn0gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJFJvdy0+e0tleX0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJE9wdGlvblJlZi0+e1NlbGVjdGVkSUR9LT57ICRSb3ctPntLZXl9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJFJvdy0+e1ZhbHVlfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkT3B0aW9uUmVmLT57U2VsZWN0ZWRWYWx1ZX0tPnsgJFJvdy0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRSb3ctPntWYWx1ZX0KICAgICAgICAgICAgICAgICAgICAmJiAhJERpc2FibGVkRWxlbWVudHN7ICRSb3ctPntWYWx1ZX0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUm93LT57U2VsZWN0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFNvcnRSZXZlcnNlIG9wdGlvbgogICAgaWYgKCAkT3B0aW9uUmVmLT57U29ydFJldmVyc2V9ICkgewogICAgICAgIEB7JERhdGFSZWZ9ID0gcmV2ZXJzZSBAeyREYXRhUmVmfTsKICAgIH0KCiAgICAjIGFkZCBhbiBlbXB0eSBvcHRpb24gYXMgZmlyc3Qgb3B0aW9uIHdoZW4gUG9zc2libGVOb25lIGlzIGdpdmVuCiAgICBpZiAoICRPcHRpb25SZWYtPntQb3NzaWJsZU5vbmV9ICkgewogICAgICAgIHVuc2hpZnQgJERhdGFSZWYtPkAqLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICctJywKICAgICAgICAgICAgfTsKICAgIH0KCiAgICAjIFRyZWVWaWV3IG9wdGlvbgogICAgaWYgKCAkT3B0aW9uUmVmLT57VHJlZVZpZXd9ICkgewoKICAgICAgICBST1c6CiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKCiAgICAgICAgICAgIG5leHQgUk9XIGlmICEkUm93LT57VmFsdWV9OwoKICAgICAgICAgICAgbXkgQEZyYWdtZW50ID0gc3BsaXQgLzo6LywgJFJvdy0+e1ZhbHVlfTsKICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9IHBvcCBARnJhZ21lbnQ7CgogICAgICAgICAgICAjIHRyYW5zbGF0ZSB0aGUgaW5kaXZpZHVhbCB0cmVlIG9wdGlvbnMKICAgICAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRSb3ctPntWYWx1ZX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBUT0RPOiBIZXJlIHdlIGFyZSBjb21iaW5pbmcgTWF4IHdpdGggSFRNTFF1b3RlLCBjaGVjayBiZWxvdyBmb3IgdGhlIFJFTUFSSzoKICAgICAgICAgICAgIyBNYXggYW5kIEhUTUxRdW90ZSBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSBzcGFjZXMgaW5zZXJ0IGJ1dCBhZnRlciB0aGUgc3BsaXQgb2YgdGhlCiAgICAgICAgICAgICMgcGFyZW50cywgdGhlbiBpdCBpcyBub3QgcG9zc2libGUgdG8gZG8gaXQgb3V0c2lkZQogICAgICAgICAgICBpZiAoICRPcHRpb25SZWYtPntIVE1MUXVvdGV9ICkgewogICAgICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9ICRTZWxmLT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJFJvdy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBNYXggID0+ICRPcHRpb25SZWYtPntNYXh9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntNYXh9ICkgewogICAgICAgICAgICAgICAgaWYgKCBsZW5ndGggJFJvdy0+e1ZhbHVlfSA+ICRPcHRpb25SZWYtPntNYXh9ICkgewogICAgICAgICAgICAgICAgICAgICRSb3ctPntWYWx1ZX0gPSBzdWJzdHIoICRSb3ctPntWYWx1ZX0sIDAsICRPcHRpb25SZWYtPntNYXh9IC0gNSApIC4gJ1suLi5dJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBVc2UgdW5pY29kZSAnTk8tQlJFQUsgU1BBQ0UnIHNpbmNlIHVuaWNvZGUgY2hhcmFjdGVycyBkb2Vzbid0IG5lZWQgdG8gYmUgZXNjYXBlZC4KICAgICAgICAgICAgIyBQcmV2aW91c2x5LCB3ZSB1c2VkICcmbmJzcDsnIGFuZCB3ZSBoYWQgaXNzdWUgdGhhdCBPcHRpb24gbmVlZHMgdG8gYmUgaHRtbCBlbmNvZGVkCiAgICAgICAgICAgICMgaW4gQUpBWCwgYW5kIGl0IHdhcyBjYXVzaW5nIGlzc3Vlcy4KICAgICAgICAgICAgbXkgJFNwYWNlID0gIlx4QTBceEEwIiB4IHNjYWxhciBARnJhZ21lbnQ7CiAgICAgICAgICAgICRTcGFjZSB8fD0gJyc7CgogICAgICAgICAgICAkUm93LT57VmFsdWV9ID0gJFNwYWNlIC4gJFJvdy0+e1ZhbHVlfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBIVE1MUXVvdGUgb3B0aW9uCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57SFRNTFF1b3RlfSApIHsKICAgICAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKICAgICAgICAgICAgICAgICRSb3ctPntLZXl9ICAgPSAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkUm93LT57S2V5fSApOwogICAgICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9ICRTZWxmLT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRSb3ctPntWYWx1ZX0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBUT0RPOiBDaGVjayB0aGlzIGNvbW1lbnQhCiAgICAgICAgIyBNYXggb3B0aW9uCiAgICAgICAgIyBSRU1BUks6IERvbid0IG1lcmdlIHRoZSBNYXggaGFuZGxpbmcgd2l0aCBBc2NpaTJIdG1sIGZ1bmN0aW9uIGNhbGwgb2YKICAgICAgICAjIHRoZSBIVE1MUXVvdGUgaGFuZGxpbmcuIEluIHRoaXMgY2FzZSB5b3UgbG9zZSB0aGUgbWF4IGhhbmRsaW5nIGlmIHlvdQogICAgICAgICMgZGVhY3RpdmF0ZSBIVE1MUXVvdGUKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntNYXh9ICkgewoKICAgICAgICAgICAgIyBSRU1BUks6IFRoaXMgaXMgdGhlIHNhbWUgc29sdXRpb24gYXMgaW4gQXNjaWkySHRtbAogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFSZWZ9ICkgewoKICAgICAgICAgICAgICAgIGlmICggcmVmICRSb3cgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgICAgIGlmICggbGVuZ3RoICRSb3ctPntWYWx1ZX0gPiAkT3B0aW9uUmVmLT57TWF4fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9IHN1YnN0ciggJFJvdy0+e1ZhbHVlfSwgMCwgJE9wdGlvblJlZi0+e01heH0gLSA1ICkgLiAnWy4uLl0nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICggbGVuZ3RoICRSb3cgPiAkT3B0aW9uUmVmLT57TWF4fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJvdyA9IHN1YnN0ciggJFJvdywgMCwgJE9wdGlvblJlZi0+e01heH0gLSA1ICkgLiAnWy4uLl0nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJERhdGFSZWY7Cn0KCj1oZWFkMiBfQnVpbGRTZWxlY3Rpb25PdXRwdXQoKQoKY3JlYXRlIHRoZSBIVE1MIHN0cmluZyBmb3IgYSBzZWxlY3Rpb246CgogICAgbXkgJUF0dHJpYnV0ZXMgPSB7CiAgICAgICAgbmFtZSAgICAgPT4gJ1RoZU5hbWUnLAogICAgICAgIG11bHRpcGxlID0+IHVuZGVmLAogICAgICAgIHNpemUgICAgID0+IDUsCiAgICB9CiAgICBteSBARGF0YSA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAxMSwKICAgICAgICAgICAgVmFsdWUgPT4gJ1RleHQnLAogICAgICAgICAgICBEaXNhYmxlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ2FiYycsCiAgICAgICAgICAgIFZhbHVlID0+ICcmbmJzcDsmbmJzcDtUZXh0JywKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbk91dHB1dCgKICAgICAgICBBdHRyaWJ1dGVSZWYgICAgICAgPT4gXCVBdHRyaWJ1dGVzLAogICAgICAgIERhdGFSZWYgICAgICAgICAgICA9PiBcQERhdGFSZWYsCiAgICAgICAgVHJlZVZpZXcgICAgICAgICAgID0+IDAsICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBzZWUgQnVpbGRTZWxlY3Rpb24oKQogICAgICAgIEZpbHRlcnNSZWYgICAgICAgICA9PiBcQEZpbHRlcnMsICAgICAgIyBvcHRpb25hbCwgc2VlIEJ1aWxkU2VsZWN0aW9uKCkKICAgICAgICBGaWx0ZXJBY3RpdmUgICAgICAgPT4gJEZpbHRlckFjdGl2ZSwgICMgb3B0aW9uYWwsIHNlZSBCdWlsZFNlbGVjdGlvbigpCiAgICAgICAgRXhwYW5kRmlsdGVycyAgICAgID0+IDEsICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBzZWUgQnVpbGRTZWxlY3Rpb24oKQogICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyICA9PiAnMjAxNi0wMS0wMScsICAgIyBvcHRpb25hbCwgc2VlIEJ1aWxkU2VsZWN0aW9uKCkKICAgICAgICBWYWxpZGF0ZURhdGVCZWZvcmUgPT4gJzIwMTYtMDEtMDEnLCAgICMgb3B0aW9uYWwsIHNlZSBCdWlsZFNlbGVjdGlvbigpCiAgICApOwoKUmV0dXJucyB1bmRlZiB3aGVuIEM8RGF0YVJlZj4gb3IgQzxBdHRyaWJ1dGVSZWY+IGlzIG1pc3NpbmcuCgo9Y3V0CgpzdWIgX0J1aWxkU2VsZWN0aW9uT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzdGFydCBnZW5lcmF0aW9uIGlmIEF0dHJpYnV0ZVJlZiBhbmQgRGF0YVJlZiB3ZXJlIGZvdW5kCiAgICByZXR1cm4gdW5sZXNzICRQYXJhbXtBdHRyaWJ1dGVSZWZ9OwogICAgcmV0dXJuIHVubGVzcyAkUGFyYW17RGF0YVJlZn07CgogICAgIyBjb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzZWxlY3QgdGFnCiAgICBteSBAQXR0cmlidXRlczsKICAgIHsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQgZ3JlcCB7JF99IGtleXMgJFBhcmFte0F0dHJpYnV0ZVJlZn0tPiUqICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte0F0dHJpYnV0ZVJlZn0tPnskS2V5fSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsIHFxeyRLZXk9IiRQYXJhbXtBdHRyaWJ1dGVSZWZ9LT57JEtleX0ifTsgICAgIyBUT0RPOiB3aGF0IGlmIHRoZSB2YWx1ZSBjb250YWlucyBkb3VibGUgcXVvdGVzID8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsICRLZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIGZpbHRlcnMgaWYgZGVmaW5lZAogICAgICAgIGlmICggJFBhcmFte0ZpbHRlcnNSZWZ9ICYmIHNjYWxhciBAeyAkUGFyYW17RmlsdGVyc1JlZn0gfSA+IDAgKSB7CiAgICAgICAgICAgIG15ICRKU09OID0gJFNlbGYtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBGaWx0ZXJzID0+ICRQYXJhbXtGaWx0ZXJzUmVmfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBOb1F1b3RlcyA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkSlNPTkVzY2FwZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkSlNPTiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgcXF7ZGF0YS1maWx0ZXJzPSIkSlNPTkVzY2FwZWQifTsKCiAgICAgICAgICAgIGlmICggJFBhcmFte0ZpbHRlckFjdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLCAnZGF0YS1maWx0ZXJlZD0iJyAuIGludCggJFBhcmFte0ZpbHRlckFjdGl2ZX0gKSAuICciJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17RXhwYW5kRmlsdGVyc30gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLCAnZGF0YS1leHBhbmQtZmlsdGVycz0iJyAuIGludCggJFBhcmFte0V4cGFuZEZpbHRlcnN9ICkgLiAnIic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJlZSBmbGFnIGZvciBJbnB1dCBGaWVsZHMKICAgICAgICBpZiAoICRQYXJhbXtUcmVlVmlld30gKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsICdkYXRhLXRyZWU9InRydWUiJzsKICAgICAgICB9CgogICAgICAgICMgZGF0ZSB2YWxpZGF0aW9uIHZhbHVlcwogICAgICAgIGlmICggJFBhcmFte1ZhbGlkYXRlRGF0ZUFmdGVyfSApIHsKICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgcXF7ZGF0YS12YWxpZGF0ZS1kYXRlLWFmdGVyPSIkUGFyYW17VmFsaWRhdGVEYXRlQWZ0ZXJ9In07CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte1ZhbGlkYXRlRGF0ZUJlZm9yZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsIHFxe2RhdGEtdmFsaWRhdGUtZGF0ZS1iZWZvcmU9IiRQYXJhbXtWYWxpZGF0ZURhdGVCZWZvcmV9In07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2VuZXJhdGUgPHNlbGVjdD4gcm93CgogICAgIyBnZW5lcmF0ZSA8b3B0aW9uPiByb3dzCiAgICBteSBAT3B0aW9uTGluZXM7CiAgICBmb3IgbXkgJFJvdyAoICRQYXJhbXtEYXRhUmVmfS0+QCogKSB7CiAgICAgICAgbXkgJEtleSAgICAgICAgICAgICAgPSAkUm93LT57S2V5fSAgIC8vICcnOwogICAgICAgIG15ICRWYWx1ZSAgICAgICAgICAgID0gJFJvdy0+e1ZhbHVlfSAvLyAnJzsKICAgICAgICBteSAkU2VsZWN0ZWREaXNhYmxlZCA9ICcnOwogICAgICAgIGlmICggJFJvdy0+e1NlbGVjdGVkfSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkRGlzYWJsZWQgPSAnIHNlbGVjdGVkPSJzZWxlY3RlZCInOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSb3ctPntEaXNhYmxlZH0gKSB7CiAgICAgICAgICAgICRTZWxlY3RlZERpc2FibGVkID0gJyBkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICB9CiAgICAgICAgbXkgJE9wdGlvblRpdGxlID0gJFBhcmFte09wdGlvblRpdGxlfSA/IHFxeyB0aXRsZT0iJFZhbHVlIn0gOiAnJzsKCiAgICAgICAgcHVzaCBAT3B0aW9uTGluZXMsIHFxeyAgPG9wdGlvbiB2YWx1ZT0iJEtleSIkU2VsZWN0ZWREaXNhYmxlZCRPcHRpb25UaXRsZT4kVmFsdWU8L29wdGlvbj59OwogICAgfQoKICAgIG15ICRIVE1MID0gam9pbiAiXG4iLAogICAgICAgIHFxezxzZWxlY3QgQEF0dHJpYnV0ZXM+fSwKICAgICAgICBAT3B0aW9uTGluZXMsCiAgICAgICAgJzwvc2VsZWN0Pic7CgogICAgaWYgKCAkUGFyYW17VHJlZVZpZXd9ICkgewogICAgICAgIG15ICRUcmVlU2VsZWN0aW9uTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlNob3cgVHJlZSBTZWxlY3Rpb24iKTsKICAgICAgICAkSFRNTAogICAgICAgICAgICAuPSAnIDxhIGhyZWY9IiMiIHRpdGxlPSInCiAgICAgICAgICAgIC4gJFRyZWVTZWxlY3Rpb25NZXNzYWdlCiAgICAgICAgICAgIC4gJyIgY2xhc3M9IlNob3dUcmVlU2VsZWN0aW9uIj48c3Bhbj4nCiAgICAgICAgICAgIC4gJFRyZWVTZWxlY3Rpb25NZXNzYWdlIC4gJzwvc3Bhbj48aSBjbGFzcz0iZmEgZmEtc2l0ZW1hcCI+PC9pPjwvYT4nOwogICAgfQoKICAgIHJldHVybiAkSFRNTDsKfQoKPWVuZCBJbnRlcm5hbDoKCj1oZWFkMiBXcmFwUGxhaW5UZXh0KCkKClRoaXMgc3ViIGhhcyB0d28gbWFpbiBmdW5jdGlvbmFsaXRpZXM6CjEuIENoZWNrIGV2ZXJ5IGxpbmUgYW5kIG1ha2Ugc3VyZSB0aGF0ICJcbiIgaXMgdGhlIGVuZGluZyBvZiB0aGUgbGluZS4KMi4gSWYgdGhlIGxpbmUgZG9lcyBfbm90XyBzdGFydCB3aXRoICI+IiAoZS5nLiBub3QgY2l0ZWQgdGV4dCkKd3JhcCBpdCBhZnRlciB0aGUgbnVtYmVyIG9mICJNYXhDaGFyYWN0ZXJzIiAoZS5nLiBpZiBNYXhDaGFyYWN0ZXJzIGlzICI4MCIgd3JhcCBhZnRlciA4MCBjaGFyYWN0ZXJzKS4KRG8gdGhpcyBfanVzdF8gaWYgdGhlIGxpbmUsIHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQsIGNvbnRhaW5zIHNwYWNlIGNoYXJhY3RlcnMgYXQgd2hpY2ggdGhlIGxpbmUgY2FuIGJlIHdyYXBwZWQuCgpJZiB5b3UgbmVlZCBtb3JlIGluZm8gdG8gdW5kZXJzdGFuZCB3aGF0IGl0IGRvZXMsIHRha2UgYSBsb29rIGF0IHRoZSBVbml0VGVzdCBXcmFwUGxhaW5UZXh0LnQgdG8gc2VlCnVzZSBjYXNlcyB0aGVyZS4KCiAgICBteSAkV3JhcHBlZFBsYWluVGV4dCA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAiU29tZSBQbGFpbiB0ZXh0IHRoYXQgaXMgbG9uZ2VyIHRoYW4gdGhlIGFtb3VudCBzdG9yZWQgaW4gTWF4Q2hhcmFjdGVycyIsCiAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiA4MCwKICAgICk7Cgo9Y3V0CgpzdWIgV3JhcFBsYWluVGV4dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgUmV0dXJuIGlmIHdlIGRpZCBub3QgZ2V0IE1heENoYXJhY3RlcnMKICAgICMgb3IgTWF4Q2hhcmFjdGVycyBkb2Vzbid0IGNvbnRhaW4ganVzdCBhbiBpbnQKICAgIGlmICggIUlzUG9zaXRpdmVJbnRlZ2VyKCAkUGFyYW17TWF4Q2hhcmFjdGVyc30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdvdCBubyBvciBpbnZhbGlkIE1heENoYXJhY3RlcnMhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBSZXR1cm4gaWYgd2UgZGlkbid0IGdldCBQbGFpblRleHQKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkUGFyYW17UGxhaW5UZXh0fTsKCiAgICAjIFJldHVybiBpZiB3ZSBnb3Qgbm8gU2NhbGFyCiAgICBpZiAoIHJlZiAkUGFyYW17UGxhaW5UZXh0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkhhZCBubyBzdHJpbmcgaW4gUGxhaW5UZXh0ISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgUmV0dXJuIFBsYWluVGV4dCBpZiB3ZSBoYXZlIGxlc3MgdGhhbiBNYXhDaGFyYWN0ZXJzCiAgICByZXR1cm4gJFBhcmFte1BsYWluVGV4dH0gaWYgbGVuZ3RoICRQYXJhbXtQbGFpblRleHR9IDwgJFBhcmFte01heENoYXJhY3RlcnN9OwoKICAgIG15ICRXb3JrU3RyaW5nID0gJFBhcmFte1BsYWluVGV4dH07CgogICAgIyBOb3JtYWxpemUgbGluZSBlbmRpbmdzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggXHJcbiAoYnVnIzExMDc4KS4KICAgICRXb3JrU3RyaW5nID1+IHMvXHJcbj8vXG4vZzsKICAgICRXb3JrU3RyaW5nID1+IHMvKF4+Lit8Lns0LCRQYXJhbXtNYXhDaGFyYWN0ZXJzfX0pKD86XHN8XHopLyQxXG4vZ207CgogICAgcmV0dXJuICRXb3JrU3RyaW5nOwp9Cgo9aGVhZDIgU2V0UmljaFRleHRQYXJhbWV0ZXJzKCkKCnNldHMgcHJvcGVydGllcyBmb3IgcmljaCB0ZXh0IGVkaXRvciBhbmQgc2VuZHMgdGhlbSB0byBKYXZhU2NyaXB0IHZpYSBBZGRKU0RhdGEoKS4KCiAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCkFzIGEgc2lkZSBlZmZlY3QgYWN0aXZhdGVkIHRoZSBmbGFnIEM8SGFzUmljaFRleHRFZGl0b3I+IHNvIHRoYXQgdGhlIGZvb3RlciBnZW5lcmF0aW5nIG1ldGhvZHMKY2FuIGluY2x1ZGUgdGhlIHJpY2ggdGV4dCBlZGl0b3IgbGlicmFyaWVzLgoKPWN1dAoKc3ViIFNldFJpY2hUZXh0UGFyYW1ldGVycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtEYXRhfSB8fD0ge307CgogICAgIyBnZXQgYW5kIGNoZWNrIHBhcmFtIERhdGEKICAgIGlmICggcmVmICRQYXJhbXtEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEhhc2hSZWYgaW4gUGFyYW0gRGF0YSEgR290OiAnIiAuIHJlZiggJFBhcmFte0RhdGF9ICkgLiAiJyEiLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgfQoKICAgICMgdGVsbCB0aGUgZm9vdGVyIG1ldGhvZHMgdGhhdCByaWNoIHRleHQgbGlicmFyaWVzIGFyZSBuZWVkZWQKICAgICRTZWxmLT57SGFzUmljaFRleHRFZGl0b3J9ID0gMTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBuZWVkZWQgdmFyaWFibGVzCiAgICBteSAkU2NyZWVuUmljaFRleHRIZWlnaHQgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dEhlaWdodH0gICAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0SGVpZ2h0Iik7CiAgICBteSAkU2NyZWVuUmljaFRleHRXaWR0aCAgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dFdpZHRofSAgICAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0V2lkdGgiKTsKICAgIG15ICRSaWNoVGV4dFR5cGUgICAgICAgICA9ICRQYXJhbXtEYXRhfS0+e1JpY2hUZXh0VHlwZX0gICAgICAgICAgICAgICAgfHwgJyc7CiAgICBteSAkUGljdHVyZVVwbG9hZEFjdGlvbiAgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dFBpY3R1cmVVcGxvYWRBY3Rpb259IHx8ICcnOwoKICAgICMgRGVjbGFyZSBkaWZmZXJlbnQgdG9vbGJhcnMuIFRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIHVzZWQgaW4gSmF2YVNjcmlwdC4KICAgIG15ICggQFRvb2xiYXIsIEBUb29sYmFyV2l0aG91dEltYWdlICk7CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dDo6RW5oYW5jZWRNb2RlJykgPT0gMSApIHsKICAgICAgICBAVG9vbGJhciA9ICgKICAgICAgICAgICAgJ2hlYWRpbmcnLCAgICAgICAnYm9sZCcsICAgICAgICAgICAgICAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywgICdudW1iZXJlZExpc3QnLCAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJywgICAnfCcsICAgICAgICAgICAgICAgICAnaW5kZW50JywgICAgICdvdXRkZW50JywgJ2FsaWdubWVudCcsICd8JywKICAgICAgICAgICAgJ2xpbmsnLCAgICAgICAgICAndW5kbycsICAgICAgICAgICAgICAncmVkbycsICAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydEltYWdlJywgICAnaG9yaXpvbnRhbExpbmUnLCAgICAnYmxvY2tRdW90ZScsICd8JywgJ2ZpbmRBbmRSZXBsYWNlJywgJ2ZvbnRDb2xvcicsICdmb250QmFja2dyb3VuZENvbG9yJywgJ3JlbW92ZUZvcm1hdCcsICd8JywKICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLCAnc3BlY2lhbENoYXJhY3RlcnMnLCAnfCcsCiAgICAgICAgICAgICdmb250RmFtaWx5JywgICAgJ2ZvbnRTaXplJywgICAgICAgICAgJ3wnLCAnY29kZUJsb2NrJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gKAogICAgICAgICAgICAnaGVhZGluZycsICAgICAgICAnYm9sZCcsICAgICAgICAgICAgICAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywgICAnbnVtYmVyZWRMaXN0JywgICAgICAnfCcsCiAgICAgICAgICAgICdpbnNlcnRUYWJsZScsICAgICd8JywgICAgICAgICAgICAgICAgICdpbmRlbnQnLCAnb3V0ZGVudCcsICdhbGlnbm1lbnQnLCAnfCcsCiAgICAgICAgICAgICdsaW5rJywgICAgICAgICAgICd1bmRvJywgICAgICAgICAgICAgICdyZWRvJywgICAnfCcsCiAgICAgICAgICAgICdob3Jpem9udGFsTGluZScsICdibG9ja1F1b3RlJywgICAgICAgICd8JywgICAgICAnZmluZEFuZFJlcGxhY2UnLCAnZm9udENvbG9yJywgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAncmVtb3ZlRm9ybWF0JywgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycsICAnc3BlY2lhbENoYXJhY3RlcnMnLCAnfCcsCiAgICAgICAgICAgICdmb250RmFtaWx5JywgICAgICdmb250U2l6ZScsICAgICAgICAgICd8JywgJ2NvZGVCbG9jaycKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFRvb2xiYXIgPSAoCiAgICAgICAgICAgICdoZWFkaW5nJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywKICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywKICAgICAgICAgICAgJ2ZvbnRDb2xvcicsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2JvbGQnLAogICAgICAgICAgICAndW5kZXJsaW5lJywKICAgICAgICAgICAgJ2l0YWxpYycsCiAgICAgICAgICAgICdzdHJpa2V0aHJvdWdoJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywKICAgICAgICAgICAgJ251bWJlcmVkTGlzdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ291dGRlbnQnLAogICAgICAgICAgICAnaW5kZW50JywKICAgICAgICAgICAgJ2FsaWdubWVudCcsCiAgICAgICAgICAgICdsaW5rJywKICAgICAgICAgICAgJ2Jsb2NrUXVvdGUnLAogICAgICAgICAgICAncmVtb3ZlRm9ybWF0JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnaW1hZ2VJbnNlcnQnLAogICAgICAgICAgICAnaW5zZXJ0VGFibGUnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdzb3VyY2VFZGl0aW5nJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gKAogICAgICAgICAgICAnaGVhZGluZycsCiAgICAgICAgICAgICdmb250U2l6ZScsCiAgICAgICAgICAgICdmb250RmFtaWx5JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnZm9udEJhY2tncm91bmRDb2xvcicsCiAgICAgICAgICAgICdmb250Q29sb3InLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdib2xkJywKICAgICAgICAgICAgJ3VuZGVybGluZScsCiAgICAgICAgICAgICdpdGFsaWMnLAogICAgICAgICAgICAnc3RyaWtldGhyb3VnaCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2J1bGxldGVkTGlzdCcsCiAgICAgICAgICAgICdudW1iZXJlZExpc3QnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdvdXRkZW50JywKICAgICAgICAgICAgJ2luZGVudCcsCiAgICAgICAgICAgICdhbGlnbm1lbnQnLAogICAgICAgICAgICAnbGluaycsCiAgICAgICAgICAgICdibG9ja1F1b3RlJywKICAgICAgICAgICAgJ3JlbW92ZUZvcm1hdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycKICAgICAgICApOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgbXkgQFBsdWdpbnMgPSAoCiAgICAgICAgJ0FsaWdubWVudCcsICAgICdBdXRvZm9ybWF0JywgJ0Jsb2NrUXVvdGUnLCAnQm9sZCcsICdDb2RlQmxvY2snLCAnRGF0YUZpbHRlcicsICdEYXRhU2NoZW1hJywgJ0ZpbmRBbmRSZXBsYWNlJywgJ0ZvbnRDb2xvcicsCiAgICAgICAgJ0ZvbnRGYW1pbHknLCAgICdGb250U2l6ZScsICAgJ0ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAnR2VuZXJhbEh0bWxTdXBwb3J0JywgJ0hlYWRpbmcnLCAnSG9yaXpvbnRhbExpbmUnLCAnSW1hZ2UnLCAnSW1hZ2VSZXNpemUnLCAnSW1hZ2VTdHlsZScsICdJbWFnZVVwbG9hZCcsCiAgICAgICAgJ0ltYWdlVG9vbGJhcicsICdJbWFnZUluc2VydCcsCiAgICAgICAgJ0luZGVudCcsICAgICAgICdJdGFsaWMnLCAnTGluaycsICdNZW50aW9uJywgJ0xpc3QnLCAnUGFyYWdyYXBoJywgJ1JlbW92ZUZvcm1hdCcsICdTZWxlY3RBbGwnLCAnU2ltcGxlVXBsb2FkQWRhcHRlcicsICdTb3VyY2VFZGl0aW5nJywgJ1NwZWNpYWxDaGFyYWN0ZXJzJywKICAgICAgICAnU3BlY2lhbENoYXJhY3RlcnNFc3NlbnRpYWxzJywKICAgICAgICAnU3RyaWtldGhyb3VnaCcsICdUYWJsZScsICdUYWJsZUNlbGxQcm9wZXJ0aWVzJywgJ1RhYmxlQ29sdW1uUmVzaXplJywgJ1RhYmxlUHJvcGVydGllcycsICdUYWJsZVRvb2xiYXInLCAnVW5kZXJsaW5lJywgJ1VuZG8nLCAnUGFzdGVGcm9tT2ZmaWNlJwogICAgKTsKIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgICMgc2V0IGRhdGEgd2l0aCBBZGRKU0RhdGEoKQogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmljaFRleHQnLAogICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgSGVpZ2h0ID0+ICRTY3JlZW5SaWNoVGV4dEhlaWdodCwKICAgICAgICAgICAgV2lkdGggID0+ICRTY3JlZW5SaWNoVGV4dFdpZHRoLAogICAgICAgICAgICBMYW5nICAgPT4gewogICAgICAgICAgICAgICAgU3BsaXRRdW90ZSAgPT4gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ1NwbGl0IFF1b3RlJyksCiAgICAgICAgICAgICAgICBSZW1vdmVRdW90ZSA9PiAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgnUmVtb3ZlIFF1b3RlJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFBsdWdpbnMgICAgICAgICAgICAgPT4gXEBQbHVnaW5zLAogICAgICAgICAgICBUb29sYmFyICAgICAgICAgICAgID0+IFxAVG9vbGJhciwKICAgICAgICAgICAgVG9vbGJhcldpdGhvdXRJbWFnZSA9PiBcQFRvb2xiYXJXaXRob3V0SW1hZ2UsCiAgICAgICAgICAgIFBpY3R1cmVVcGxvYWRBY3Rpb24gPT4gJFBpY3R1cmVVcGxvYWRBY3Rpb24sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgPT4gJFJpY2hUZXh0VHlwZSwKICAgICAgICAgICAgRWRpdG9yU3R5bGVzUGF0aCAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dEVkaXRvclN0eWxlcyIpLAogICAgICAgICAgICBDb250ZW50U3R5bGVzUGF0aCAgID0+ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0QXJ0aWNsZVN0eWxlcyIpLAogICAgICAgICAgICBDdXN0b21DU1MgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0OjpEZWZhdWx0Q1NTIiksCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycygpCgpzZXRzIHByb3BlcnRpZXMgZm9yIGN1c3RvbWVyIHJpY2ggdGV4dCBlZGl0b3IgYW5kIHNlbmRzIHRoZW0gdG8gSmF2YVNjcmlwdCB2aWEgQWRkSlNEYXRhKCkuCgogICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJTZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCkFzIGEgc2lkZSBlZmZlY3QgYWN0aXZhdGVkIHRoZSBmbGFnIEM8SGFzUmljaFRleHRFZGl0b3I+IHNvIHRoYXQgdGhlIGZvb3RlciBnZW5lcmF0aW5nIG1ldGhvZHMKY2FuIGluY2x1ZGUgdGhlIHJpY2ggdGV4dCBlZGl0b3IgbGlicmFyaWVzLgoKPWN1dAoKc3ViIEN1c3RvbWVyU2V0UmljaFRleHRQYXJhbWV0ZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte0RhdGF9IHx8PSB7fTsKCiAgICAjIGdldCBhbmQgY2hlY2sgcGFyYW0gRGF0YQogICAgaWYgKCByZWYgJFBhcmFte0RhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgSGFzaFJlZiBpbiBQYXJhbSBEYXRhISBHb3Q6ICciIC4gcmVmKCAkUGFyYW17RGF0YX0gKSAuICInISIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3I7CiAgICB9CgogICAgIyB0ZWxsIHRoZSBmb290ZXIgbWV0aG9kcyB0aGF0IHJpY2ggdGV4dCBsaWJyYXJpZXMgYXJlIG5lZWRlZAogICAgJFNlbGYtPntIYXNSaWNoVGV4dEVkaXRvcn0gPSAxOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRTY3JlZW5SaWNoVGV4dEhlaWdodCA9ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0SGVpZ2h0Iik7CiAgICBteSAkU2NyZWVuUmljaFRleHRXaWR0aCAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dFdpZHRoIik7CiAgICBteSAkUGljdHVyZVVwbG9hZEFjdGlvbiAgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dFBpY3R1cmVVcGxvYWRBY3Rpb259IHx8ICcnOwoKICAgICMgRGVjbGFyZSBkaWZmZXJlbnQgdG9vbGJhcnMuIFRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIHVzZWQgaW4gSmF2YVNjcmlwdC4KICAgIG15ICggQFRvb2xiYXIsIEBUb29sYmFyV2l0aG91dEltYWdlLCBAVG9vbGJhck1pZGksIEBUb29sYmFyTWluaSApOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dDo6RW5oYW5jZWRNb2RlOjpDdXN0b21lcicpID09IDEgKSB7CiAgICAgICAgQFRvb2xiYXIgPSAoCiAgICAgICAgICAgICdoZWFkaW5nJywgICAgICAgJ2JvbGQnLCAgICAgICAgICAgICAgJ2l0YWxpYycsICAgICAndW5kZXJsaW5lJywgJ3N0cmlrZXRocm91Z2gnLCAnfCcsICdidWxsZXRlZExpc3QnLCAnbnVtYmVyZWRMaXN0JywgJ3wnLAogICAgICAgICAgICAnaW5zZXJ0VGFibGUnLCAgICd8JywgICAgICAgICAgICAgICAgICdpbmRlbnQnLCAgICAgJ291dGRlbnQnLCAgICdhbGlnbm1lbnQnLCAgICAgJ3wnLAogICAgICAgICAgICAnbGluaycsICAgICAgICAgICd1bmRvJywgICAgICAgICAgICAgICdyZWRvJywgICAgICAgJ3NlbGVjdEFsbCcsICctJywKICAgICAgICAgICAgJ2luc2VydEltYWdlJywgICAnaG9yaXpvbnRhbExpbmUnLCAgICAnYmxvY2tRdW90ZScsICd8JywgICAgICAgICAnZmluZEFuZFJlcGxhY2UnLCAnZm9udENvbG9yJywgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAncmVtb3ZlRm9ybWF0JywgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycsICdzcGVjaWFsQ2hhcmFjdGVycycsICctJywKICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLCAgICAnZm9udFNpemUnLCAgICAgICAgICAnfCcsICdjb2RlQmxvY2snCiAgICAgICAgKTsKCiAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSAoCiAgICAgICAgICAgICdoZWFkaW5nJywgICAgICAgICdib2xkJywgICAgICAgICAgICAgICdpdGFsaWMnLCAndW5kZXJsaW5lJywgICAgICAnc3RyaWtldGhyb3VnaCcsICd8JywgJ2J1bGxldGVkTGlzdCcsICdudW1iZXJlZExpc3QnLCAnfCcsCiAgICAgICAgICAgICdpbnNlcnRUYWJsZScsICAgICd8JywgICAgICAgICAgICAgICAgICdpbmRlbnQnLCAnb3V0ZGVudCcsICAgICAgICAnYWxpZ25tZW50JywgICAgICd8JywKICAgICAgICAgICAgJ2xpbmsnLCAgICAgICAgICAgJ3VuZG8nLCAgICAgICAgICAgICAgJ3JlZG8nLCAgICdzZWxlY3RBbGwnLCAgICAgICctJywKICAgICAgICAgICAgJ2hvcml6b250YWxMaW5lJywgJ2Jsb2NrUXVvdGUnLCAgICAgICAgJ3wnLCAgICAgICdmaW5kQW5kUmVwbGFjZScsICdmb250Q29sb3InLCAnZm9udEJhY2tncm91bmRDb2xvcicsICdyZW1vdmVGb3JtYXQnLCAnfCcsCiAgICAgICAgICAgICdzb3VyY2VFZGl0aW5nJywgICdzcGVjaWFsQ2hhcmFjdGVycycsICctJywKICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLCAgICAgJ2ZvbnRTaXplJywgICAgICAgICAgJ3wnLCAnY29kZUJsb2NrJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyTWlkaSA9ICgKICAgICAgICAgICAgJ2JvbGQnLCAgICAgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAgICAgICdzdHJpa2V0aHJvdWdoJywgICAgICAgJ3wnLCAgICAgICAgICAgICdudW1iZXJlZExpc3QnLCAnYnVsbGV0ZWRMaXN0JywgJ3wnLAogICAgICAgICAgICAnbGluaycsICAgICAnfCcsICAgICAgJ2hvcml6b250YWxMaW5lJywgJ3wnLCAgICAgICAgICAgICAgICAgICAndW5kbycsICAgICAgICAgJ3JlZG8nLCAgICAgICAgICctJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywgJ3wnLCAgICAgICdmb250Q29sb3InLCAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywgJ3JlbW92ZUZvcm1hdCcsICd8JywgICAgICAgICAgICAnc3BlY2lhbENoYXJhY3RlcnMnLCAnYmxvY2tRdW90ZScsICd8JywgJ2NvZGVCbG9jaycKICAgICAgICApOwoKICAgICAgICBAVG9vbGJhck1pbmkgPSAoCiAgICAgICAgICAgICdib2xkJywgICAgICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZXRocm91Z2gnLCAnfCcsICdidWxsZXRlZExpc3QnLCAnfCcsICdsaW5rJywgJ3wnLCAndW5kbycsICdyZWRvJywgJy0nLAogICAgICAgICAgICAnZm9udFNpemUnLCAnfCcsICAgICAgJ2ZvbnRDb2xvcicsICdyZW1vdmVGb3JtYXQnLCAgJ3wnLCAnYmxvY2tRdW90ZScsICAgJ3wnLCAnY29kZUJsb2NrJwogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAVG9vbGJhciA9ICgKICAgICAgICAgICAgJ2hlYWRpbmcnLAogICAgICAgICAgICAnZm9udFNpemUnLAogICAgICAgICAgICAnZm9udEZhbWlseScsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLAogICAgICAgICAgICAnZm9udENvbG9yJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnYm9sZCcsCiAgICAgICAgICAgICd1bmRlcmxpbmUnLAogICAgICAgICAgICAnaXRhbGljJywKICAgICAgICAgICAgJ3N0cmlrZXRocm91Z2gnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdidWxsZXRlZExpc3QnLAogICAgICAgICAgICAnbnVtYmVyZWRMaXN0JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnb3V0ZGVudCcsCiAgICAgICAgICAgICdpbmRlbnQnLAogICAgICAgICAgICAnYWxpZ25tZW50JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycsCiAgICAgICAgICAgICdsaW5rJywKICAgICAgICAgICAgJ2Jsb2NrUXVvdGUnLAogICAgICAgICAgICAncmVtb3ZlRm9ybWF0JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnaW1hZ2VJbnNlcnQnLAogICAgICAgICAgICAnaW5zZXJ0VGFibGUnCiAgICAgICAgKTsKCiAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSAoCiAgICAgICAgICAgICdoZWFkaW5nJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywKICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywKICAgICAgICAgICAgJ2ZvbnRDb2xvcicsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2JvbGQnLAogICAgICAgICAgICAndW5kZXJsaW5lJywKICAgICAgICAgICAgJ2l0YWxpYycsCiAgICAgICAgICAgICdzdHJpa2V0aHJvdWdoJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywKICAgICAgICAgICAgJ251bWJlcmVkTGlzdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ291dGRlbnQnLAogICAgICAgICAgICAnaW5kZW50JywKICAgICAgICAgICAgJ2FsaWdubWVudCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLAogICAgICAgICAgICAnbGluaycsCiAgICAgICAgICAgICdibG9ja1F1b3RlJywKICAgICAgICAgICAgJ3JlbW92ZUZvcm1hdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyTWlkaSA9ICgKICAgICAgICAgICAgJ2JvbGQnLCAgICAgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAgICAgICdzdHJpa2V0aHJvdWdoJywgICAgICAgJ3wnLCAgICAgICAgICAgICdudW1iZXJlZExpc3QnLCAnYnVsbGV0ZWRMaXN0JywgJ3wnLAogICAgICAgICAgICAnbGluaycsICAgICAnfCcsICAgICAgJ2hvcml6b250YWxMaW5lJywgJ3wnLCAgICAgICAgICAgICAgICAgICAndW5kbycsICAgICAgICAgJ3JlZG8nLCAgICAgICAgICctJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywgJ3wnLCAgICAgICdmb250Q29sb3InLCAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywgJ3JlbW92ZUZvcm1hdCcsICd8JywgICAgICAgICAgICAnc3BlY2lhbENoYXJhY3RlcnMnLCAnYmxvY2tRdW90ZScKICAgICAgICApOwoKICAgICAgICBAVG9vbGJhck1pbmkgPSAoCiAgICAgICAgICAgICdib2xkJywgICAgICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZXRocm91Z2gnLCAnfCcsICdidWxsZXRlZExpc3QnLCAnfCcsICdsaW5rJywgJ3wnLCAndW5kbycsICdyZWRvJywgJy0nLAogICAgICAgICAgICAnZm9udFNpemUnLCAnfCcsICAgICAgJ2ZvbnRDb2xvcicsICdyZW1vdmVGb3JtYXQnLCAgJ3wnLCAnYmxvY2tRdW90ZScKICAgICAgICApOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgbXkgQFBsdWdpbnMgPSAoCiAgICAgICAgJ0FsaWdubWVudCcsICAgICdBdXRvZm9ybWF0JywgJ0Jsb2NrUXVvdGUnLCAnQm9sZCcsICdDb2RlQmxvY2snLCAnRGF0YUZpbHRlcicsICdEYXRhU2NoZW1hJywgJ0ZpbmRBbmRSZXBsYWNlJywgJ0ZvbnRDb2xvcicsCiAgICAgICAgJ0ZvbnRGYW1pbHknLCAgICdGb250U2l6ZScsICAgJ0ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAnR2VuZXJhbEh0bWxTdXBwb3J0JywgJ0hlYWRpbmcnLCAnSG9yaXpvbnRhbExpbmUnLCAnSW1hZ2UnLCAnSW1hZ2VSZXNpemUnLCAnSW1hZ2VTdHlsZScsICdJbWFnZVVwbG9hZCcsCiAgICAgICAgJ0ltYWdlVG9vbGJhcicsICdJbWFnZUluc2VydCcsCiAgICAgICAgJ0luZGVudCcsICAgICAgICdJdGFsaWMnLCAnTGluaycsICdMaXN0JywgJ01lbnRpb24nLCAnUGFyYWdyYXBoJywgJ1JlbW92ZUZvcm1hdCcsICdTZWxlY3RBbGwnLCAnU2ltcGxlVXBsb2FkQWRhcHRlcicsICdTb3VyY2VFZGl0aW5nJywgJ1NwZWNpYWxDaGFyYWN0ZXJzJywKICAgICAgICAnU3BlY2lhbENoYXJhY3RlcnNFc3NlbnRpYWxzJywKICAgICAgICAnU3RyaWtldGhyb3VnaCcsICdUYWJsZScsICdUYWJsZUNlbGxQcm9wZXJ0aWVzJywgJ1RhYmxlQ29sdW1uUmVzaXplJywgJ1RhYmxlUHJvcGVydGllcycsICdUYWJsZVRvb2xiYXInLCAnVW5kZXJsaW5lJywgJ1VuZG8nLCAnUGFzdGVGcm9tT2ZmaWNlJwogICAgKTsKIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgICMgc2V0IGRhdGEgd2l0aCBBZGRKU0RhdGEoKQogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmljaFRleHQnLAogICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgSGVpZ2h0ID0+ICRTY3JlZW5SaWNoVGV4dEhlaWdodCwKICAgICAgICAgICAgV2lkdGggID0+ICRTY3JlZW5SaWNoVGV4dFdpZHRoLAogICAgICAgICAgICBMYW5nICAgPT4gewogICAgICAgICAgICAgICAgU3BsaXRRdW90ZSA9PiAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgnU3BsaXQgUXVvdGUnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUGx1Z2lucyAgICAgICAgICAgICA9PiBcQFBsdWdpbnMsCiAgICAgICAgICAgIFRvb2xiYXIgICAgICAgICAgICAgPT4gXEBUb29sYmFyLAogICAgICAgICAgICBUb29sYmFyV2l0aG91dEltYWdlID0+IFxAVG9vbGJhcldpdGhvdXRJbWFnZSwKICAgICAgICAgICAgVG9vbGJhck1pZGkgICAgICAgICA9PiBcQFRvb2xiYXJNaWRpLAogICAgICAgICAgICBUb29sYmFyTWluaSAgICAgICAgID0+IFxAVG9vbGJhck1pbmksCiAgICAgICAgICAgIFBpY3R1cmVVcGxvYWRBY3Rpb24gPT4gJFBpY3R1cmVVcGxvYWRBY3Rpb24sCiAgICAgICAgICAgIEVkaXRvclN0eWxlc1BhdGggICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckZyb250ZW5kOjpSaWNoVGV4dEVkaXRvclN0eWxlcyIpLAogICAgICAgICAgICBDb250ZW50U3R5bGVzUGF0aCAgID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJGcm9udGVuZDo6UmljaFRleHRBcnRpY2xlU3R5bGVzIiksCiAgICAgICAgICAgIEN1c3RvbUNTUyAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckZyb250ZW5kOjpSaWNoVGV4dDo6RGVmYXVsdENTUyIpLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVXNlckluaXRpYWxzR2V0KCkKCkdldCBpbml0aWFscyBmcm9tIGEgZnVsbCBuYW1lIG9mIGEgdXNlci4KCiAgICBteSAkVXNlckluaXRpYWxzID0gJExheW91dE9iamVjdC0+VXNlckluaXRpYWxzR2V0KAogICAgICAgIEZ1bGxuYW1lID0+ICdKb2huIERvZScsCiAgICApOwoKUmV0dXJucyBzdHJpbmcgb2YgZXhhY3RseSB0d28gdXBwZXJjYXNlIGNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnQgdXNlciBpbml0aWFsczoKCiAgICAkVXNlckluaXRpYWxzID0gJ0pEJzsKClBsZWFzZSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAnTycgaWYgaW52YWxpZCBuYW1lICh3aXRob3V0IGFueSB3b3JkIGNoYXJhY3RlcnMpIHdhcyBzdXBwbGllZC4KCj1jdXQKCnN1YiBVc2VySW5pdGlhbHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEZhbGxiYWNrIGluIGNhc2UgbmFtZSBpcyBpbnZhbGlkLgogICAgbXkgJFVzZXJJbml0aWFscyA9ICdPJzsKICAgIHJldHVybiAkVXNlckluaXRpYWxzIGlmICEkUGFyYW17RnVsbG5hbWV9OwoKICAgICMgUmVtb3ZlIGFueXRoaW5nIGZvdW5kIGluIGJyYWNrZXRzIChlbWFpbCBhZGRyZXNzLCBldGMpLgogICAgbXkgJEZ1bGxuYW1lID0gJFBhcmFte0Z1bGxuYW1lfSA9fiBzL1s8W3soXS4qWz5cXX0pXS8vcjsKCiAgICAjIFRyaW0gd2hpdGVzcGFjZXMuCiAgICAkRnVsbG5hbWUgPX4gcy9eXHMrfFxzKyQvL2c7CgogICAgIyBTcGxpdCBmdWxsIG5hbWUgYnkgd2hpdGVzcGFjZS4KICAgIG15IEBVc2VyTmFtZXMgPSBzcGxpdCAvXHMrLywgJEZ1bGxuYW1lOwogICAgaWYgKEBVc2VyTmFtZXMpIHsKCiAgICAgICAgIyBDbGVhbnVwIHVubmVjZXNzYXJ5IGNoYXJhY3RlcnMuCiAgICAgICAgbXkgJEZpcnN0TmFtZSA9ICRVc2VyTmFtZXNbMF0gPX4gcy9cVy8vZ3I7CiAgICAgICAgcmV0dXJuICRVc2VySW5pdGlhbHMgaWYgISRGaXJzdE5hbWU7CgogICAgICAgICMgR2V0IGZpcnN0IGNoYXJhY3RlciBvZiBmaXJzdCBuYW1lLgogICAgICAgICRVc2VySW5pdGlhbHMgPSB1YyBzdWJzdHIgJEZpcnN0TmFtZSwgMCwgMTsKCiAgICAgICAgaWYgKCBAVXNlck5hbWVzID4gMSApIHsKCiAgICAgICAgICAgICMgQ2xlYW51cCB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzLgogICAgICAgICAgICBteSAkTGFzdE5hbWUgPSAkVXNlck5hbWVzWy0xXSA9fiBzL1xXLy9ncjsKICAgICAgICAgICAgcmV0dXJuICRVc2VySW5pdGlhbHMgaWYgISRMYXN0TmFtZTsKCiAgICAgICAgICAgICMgR2V0IGZpcnN0IGNoYXJhY3RlciBvZiBsYXN0IG5hbWUuCiAgICAgICAgICAgICRVc2VySW5pdGlhbHMgLj0gdWMgc3Vic3RyICRMYXN0TmFtZSwgMCwgMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRVc2VySW5pdGlhbHM7Cn0KCj1oZWFkMiBTZXRDb29raWUoKQoKRGVjbGFyZSBhIGNvb2tpZSB0aGF0IHNob3VsZCBiZSBzZW50IG91dCB2aWEgdGhlIFNldC1Db29raWUgSFRUUCBoZWFkZXIuCgogICAgJFJlc3BvbnNlT2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgUmVnaXN0ZXJJbk9NID0+IDEsICAgICAgICAgICAjIDB8MSwgb3B0aW9uYWwsIGRlZmF1bHQgMCwgd2hldGhlciAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoKSBzaG91bGQgYmUgY2FsbGVkCiAgICAgICAgS2V5ICAgICAgICAgID0+ICdJRCcsICAgICAgICAjIG5hbWUsIGRldGVybWluZXMgb3JkZXIgaW4gd2hpY2ggY29va2llcyBhcmUgc2V0IHdoZW4gdGhleSBoYXZlIHRoZSBzYW1lIG5hbWUKICAgICAgICBOYW1lICAgICAgICAgPT4gJ05hbWUnLCAgICAgICMgb3B0aW9uYWwsIG5hbWUgb2YgdGhlIGNvb2tpZSwgdGhlIGRlZmF1bHQgaXMgdGhlIHZhbHVlIG9mICdLZXknCiAgICAgICAgVmFsdWUgICAgICAgID0+IDEyMzQ1NiwgICAgICAjIHZhbHVlCiAgICAgICAgRXhwaXJlcyAgICAgID0+ICcrMzY2MHMnLCAgICAjIGV4cGlyZXMKICAgICAgICBQYXRoICAgICAgICAgPT4gJy9vdG9iby8nLCAgICMgcGF0aCBvcHRpb25hbCwgb25seSBhbGxvdyBjb29raWUgZm9yIGdpdmVuIHBhdGgKICAgICAgICBTZWN1cmUgICAgICAgPT4gMSwgICAgICAgICAgICMgMHwxLCBvcHRpb25hbCwgc2V0IHNlY3VyZSBhdHRyaWJ1dGUgdG8gZGlzYWJsZSBjb29raWUgb24gSFRUUCAoSFRUUFMgb25seSkKICAgICAgICBTYW1lU2l0ZSAgICAgPT4gJ2xheCcsICAgICAgICMgbm9uZXxsYXh8c3RyaWN0LCBvcHRpb25hbCwgc2V0cyBzYW1lc2l0ZSBhdHRyaWJ1dGUgb2YgY29va2llCiAgICAgICAgSFRUUE9ubHkgICAgID0+IDEsICAgICAgICAgICAjIDF8JycsIG9wdGlvbmFsLCB0aGUgZGVmYXVsdCBpcyAxLCBzZXRzIGh0dHBvbmx5IGF0dHJpYnV0ZSBvZiBjb29raWUgdG8gcHJldmVudCBhY2Nlc3MgdmlhIEphdmFTY3JpcHQKICAgICk7CgpUaGUgYXR0cmlidXRlICdzYW1lc2l0ZScgaXMgdXN1YWxseSBzZXQgZnJvbSB0aGUgU3lzQ29uZmlnIHNldHRpbmcgQjxTZXNzaW9uU2FtZVNpdGU+LiBJbiBzcGVjaWFsIGNhc2VzIGl0IGNhbgpiZSBvdmVycmlkZGVuIGJ5IHRoZSBwYXJhbWV0ZXIgQzxTYW1lU2l0ZT4uIFRoZSBmYWxsYmFjayBpcyAnbGF4Jy4gVGhpcyBmYWxsYmFjayBpcyBhbHNvIHVzZWQgd2hlbiBzYW1lc2l0ZSB3b3VsZCBiZQphbnl0aGluZyBidXQgJ25vbmUnLCAnbGF4Jywgb3IgJ3N0cmljdCcuCgpUaGUgYXR0cmlidXRlICdzZWN1cmUnIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBTeXNDb25maWcgc2V0dGluZyBCPEh0dHBUeXBlPi4gSW4gc3BlY2lhbCBjYXNlcyBpdCBjYW4KYmUgb3ZlcnJpZGRlbiBieSB0aGUgcGFyYW1ldGVyIEM8U2VjdXJlPi4gVGhlIGRlZmF1bHQgaXMgMCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VjdXJlIGZsYWcgaXMgbm90IHNldC4KClRoZSBhdHRyaWJ1dGUgJ2h0dHAnIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBTeXNDb25maWcgc2V0dGluZyBCPFNjcmlwdEFsaWFzPi4gSW4gc3BlY2lhbCBjYXNlcyBpdCBjYW4KYmUgb3ZlcnJpZGRlbiBieSB0aGUgcGFyYW1ldGVyIEM8UGF0aD4uIEluIGFueSBjYXNlIGEgbGVhZGluZyBzbGFzaCBpcyBwcmVwZW5kZWQgdW5sZXNzIHRoZXJlIGFscmVhZHkgaXMKYSBsZWFkaW5nIHNsYXNoLgoKVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB2aWEgdGhlIHBhY2thZ2UgbmFtZSB3aGVuIEM8UmVnaXN0ZXJJbk9NPiBpcyBhY3RpdmUuCgogICBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5TZXRDb29raWUoCiAgICAgICBSZWdpc3RlckluT00gPT4gMSwKICAgICAgIEtleSAgICAgICAgICA9PiAnU2Vzc2lvbklEQ29va2llJywKICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgVmFsdWUgICAgICAgID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICBFeHBpcmVzICAgICAgPT4gJEV4cGlyZXMsCiAgICk7Cgo9Y3V0CgpzdWIgU2V0Q29va2llIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3L0tleS8pIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIERlY2xhcmUgd2hldGhlcnMgYnJvd3NlciBzaG91bGQgc2VuZCB0aGUgY29va2llIHRvIGFub3RoZXIgZG9tYWluLgogICAgIyBBbm90aGVyIHByb3RvY29sIGNvdW50cyBhcyBhbm90aGVyIGRvbWFpbi4KICAgICMgVGhlIHZhbHVlIGZyb20gdGhlIGFyZ3VtZW50IGxpc3QgaGFzIHByZWNlZGVuY2UKICAgICMgb3ZlciB0aGUgdmFsdWUgZnJvbSBTeXNDb25maWcgaXMgdXNlZC4gQnV0IHVzdWFsbHkgbm8gZXhwbGljaXQgdmFsdWUgaXMgcGFzc2VkLgogICAgIyBVc2UgJ2xheCcgYXMgZmFsbGJhY2suCiAgICBteSAkU2FtZVNpdGUgPSAkUGFyYW17U2FtZVNpdGV9OwogICAgewoKICAgICAgICAjIHRoZSBjb25maWd1cmVkIHZhbHVlIGlzIHRoZSByZWd1bGFyIGNhc2UKICAgICAgICAkU2FtZVNpdGUgLy89ICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblNhbWVTaXRlJyk7CgogICAgICAgICMgZmFsbGJhY2sgd2hlbiBuZWl0aGVyIGNvbmZpZ3VyZWQgb3IgcGFzc2VkIGZyb20gY29tbWFuZCBsaW5lCiAgICAgICAgJFNhbWVTaXRlIC8vPSAnbGF4JzsKCiAgICAgICAgIyBsb3dlciBjYXNlCiAgICAgICAgJFNhbWVTaXRlID0gbGMgJFNhbWVTaXRlOwoKICAgICAgICAjIHdlIHJlYWxseSB3YW50IHRvIHBhc3MgYSB2YWxpZCB2YWx1ZTogJ25vbmUnLCAnbGF4Jywgb3IgJ3N0cmljdCcKICAgICAgICBpZiAoICRTYW1lU2l0ZSBuZSAnbm9uZScgJiYgJFNhbWVTaXRlIG5lICdzdHJpY3QnICkgewogICAgICAgICAgICAkU2FtZVNpdGUgPSAnbGF4JzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNlY3VyZSA9ICRQYXJhbXtTZWN1cmV9OwogICAgewogICAgICAgICMgdGhlIGNvbmZpZ3VyZWQgdmFsdWUgaXMgdGhlIHJlZ3VsYXIgY2FzZQogICAgICAgICRTZWN1cmUgLy89ICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKSBlcSAnaHR0cHMnID8gMSA6IDA7CgogICAgICAgICMgb2ZmIHBlciBkZWZhdWx0CiAgICAgICAgJFNlY3VyZSAvLz0gMDsKICAgIH0KCiAgICBteSAkUGF0aCA9ICRQYXJhbXtQYXRofTsKICAgIHsKICAgICAgICAjIHRoZSBjb25maWd1cmVkIHZhbHVlIGlzIHRoZSByZWd1bGFyIGNhc2UKICAgICAgICAkUGF0aCAvLz0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGZhbGxiYWNrIHdoZW4gbmVpdGhlciBjb25maWd1cmVkIG9yIHBhc3NlZCBmcm9tIGNvbW1hbmQgbGluZQogICAgICAgICRQYXRoIC8vPSAnJzsKCiAgICAgICAgIyBsZWFkaW5nIHNsYXNoIHVubGVzcyB0aGVyZSBhbHJlYWR5IGlzIGEgbGVhZGluZyBzbGFzaAogICAgICAgIGlmICggJFBhdGggIX4gbSFeLyEgKSB7CiAgICAgICAgICAgICRQYXRoID0gJy8nIC4gJFBhdGg7CiAgICAgICAgfQogICAgfQoKICAgIG15ICVJbmdyZWRpZW50cyA9ICgKICAgICAgICBuYW1lICAgICA9PiAkUGFyYW17TmFtZX0gLy8gJFBhcmFte0tleX0sCiAgICAgICAgdmFsdWUgICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBleHBpcmVzICA9PiAkUGFyYW17RXhwaXJlc30sCiAgICAgICAgc2VjdXJlICAgPT4gJFNlY3VyZSwKICAgICAgICBzYW1lc2l0ZSA9PiAkU2FtZVNpdGUsCiAgICAgICAgaHR0cG9ubHkgPT4gJFBhcmFte0hUVFBPbmx5fSAvLyAxLAogICAgICAgIHBhdGggICAgID0+ICRQYXRoLAogICAgKTsKCiAgICAjIEVpdGhlciBzdG9yZSB0aGUgaW5ncmVkaWVudCBpbiB0aGUgaW5zdGFuY2Ugb3IgcmVnaXN0ZXIgaXQgd2l0aCB0aGUgT2JqZWN0TWFuYWdlcgogICAgaWYgKCAkUGFyYW17UmVnaXN0ZXJJbk9NfSApIHsKCiAgICAgICAgIyBTdG9yZSB0aGUgaW5ncmVkaWVudHMgZGlyZWN0bHkgaW4gdGhlIFBhcmFtIGRhdGEgc3RydWN0dXJlIGFzIE9iamVjdFBhcmFtQWRkKCkKICAgICAgICAjIHdvdWxkIHJlcGxhY2UgdGhlIGNvbXBsZXRlIFNldENvb2tpZXMgZW50cnkKICAgICAgICAkS2VybmVsOjpPTS0+e1BhcmFtfS0+eydLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0J30tPntTZXRDb29raWVzfS0+eyAkUGFyYW17S2V5fSB9ID0gXCVJbmdyZWRpZW50czsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHRoZSBtb3JlIHN0cmFpZ2h0IGZvcndhcmQgd2F5CiAgICAgICAgJFNlbGYtPntTZXRDb29raWVzfS0+eyAkUGFyYW17S2V5fSB9ID0gXCVJbmdyZWRpZW50czsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9IYXNPbmx5T0lEQ0F1dGhNb2R1bGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJExvZ2luVHlwZSA9ICRQYXJhbXtMb2dpblR5cGV9IHx8ICdBZ2VudCc7CgogICAgbXkgJExvZ2luTW9kdWxlID0gJExvZ2luVHlwZSBlcSAnQ3VzdG9tZXInCiAgICAgICAgPyAnQ3VzdG9tZXI6OkF1dGhNb2R1bGUnCiAgICAgICAgOiAnQXV0aE1vZHVsZSc7CgogICAgbXkgJE9JRENBdXRoTW9kdWxlID0gJExvZ2luVHlwZSBlcSAnQ3VzdG9tZXInCiAgICAgICAgPyAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6T3BlbklEQ29ubmVjdCcKICAgICAgICA6ICdLZXJuZWw6OlN5c3RlbTo6QXV0aDo6T3BlbklEQ29ubmVjdCc7CgogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG15ICRNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIiRMb2dpbk1vZHVsZSRDb3VudCIpOwoKICAgICAgICBpZiAoICRNb2R1bGUgJiYgJE1vZHVsZSBuZSAkT0lEQ0F1dGhNb2R1bGUgKSB7CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfR2V0UmljaFRleHRUcmFuc2xhdGlvblBhdGggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkSG9tZSAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdIb21lJyk7CiAgICBteSAkV2ViUGF0aCAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwogICAgbXkgJFJpY2hUZXh0UGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0UGF0aCIpOwoKICAgIG15ICRTaG9ydExhbmd1YWdlID0gbGMgJFNlbGYtPntVc2VyTGFuZ3VhZ2V9OwogICAgJFNob3J0TGFuZ3VhZ2UgPX4gcy9fLiokLy87CgogICAgbXkgJFJpY2hUZXh0RmlsZVBhdGggPSAkUmljaFRleHRQYXRoOwogICAgJFJpY2hUZXh0RmlsZVBhdGggPX4gc34kV2ViUGF0aH4kSG9tZS92YXIvaHR0cGQvaHRkb2NzL347CgogICAgbXkgJFRyYW5zbGF0aW9uUGF0aCA9ICRSaWNoVGV4dEZpbGVQYXRoIC4gJ3RyYW5zbGF0aW9ucy8nIC4gJFNob3J0TGFuZ3VhZ2UgLiAnLmpzJzsKCiAgICAjIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSB0cmFuc2xhdGlvbiBhdmFpbCBmb3IgQ0tFZGl0b3I1CiAgICBpZiAoIC1lICRUcmFuc2xhdGlvblBhdGggKSB7CiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGlvbnMvJyAuICRTaG9ydExhbmd1YWdlIC4gJy5qcyc7CiAgICB9CgogICAgcmV0dXJuICd0cmFuc2xhdGlvbnMvZW4uanMnOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Output/HTML/Layout/FAQ.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXQvRkFRLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6RkFROwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OjpGQVEgLSBhbGwgRkFRLXJlbGF0ZWQgSFRNTCBmdW5jdGlvbnMKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIEZBUS1yZWxhdGVkIEhUTUwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIEdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IoKQpSZXR1cm5zIGEgY29sb3IgZGVwZW5kaW5nIG9uIHRoZSBGQVEgcmF0ZQoKICAgIG15ICRWb3RpbmdSZXN1bHRDb2xvciA9ICRMYXlvdXRPYmplY3QtPkdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IoCiAgICAgICAgUmF0ZSA9PiAnMjAnLAogICAgKTsKClJldHVybnM6CgogICAgJFZvdGluZ1Jlc3VsdENvbG9yID0gJ3JlZCcgICAgICAgICAgIyBvciAnb3JhbmdlJyBvciAnZ3JlZW4nCgo9Y3V0CgpzdWIgR2V0RkFRSXRlbVZvdGluZ1JhdGVDb2xvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1JhdGV9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgcmF0ZSEnKSwKICAgICAgICApOwogICAgfQogICAgbXkgJENzc1RtcCAgICAgICAgICAgICA9ICcnOwogICAgbXkgJFZvdGluZ1Jlc3VsdENvbG9ycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpFeHBsb3Jlcjo6SXRlbUxpc3Q6OlZvdGluZ1Jlc3VsdENvbG9ycycpOwoKICAgIGZvciBteSAkS2V5ICggc29ydCB7ICRiIDw9PiAkYSB9IGtleXMgJXskVm90aW5nUmVzdWx0Q29sb3JzfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtSYXRlfSA8PSAkS2V5ICkgewogICAgICAgICAgICAkQ3NzVG1wID0gJFZvdGluZ1Jlc3VsdENvbG9ycy0+eyRLZXl9OwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkQ3NzVG1wOwp9Cgo9aGVhZDIgRkFRTGlzdFNob3coKQoKUmV0dXJucyBhIGxpc3Qgb2YgRkFRIGl0ZW1zIGFzIHNvcnQtYWJsZSBsaXN0IHdpdGggcGFnaW5hdGlvbi4KClRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBMPEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRUaWNrZXQ6OlRpY2tldExpc3RTaG93KCk+CmluIEY8S2VybmVsL091dHB1dC9IVE1ML0xheW91dC9UaWNrZXQucG0+LgoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5GQVFMaXN0U2hvdygKICAgICAgICBGQVFJRHMgICAgID0+ICRGQVFJRHNSZWYsICAgICAgICAgICAgICAgICAgICAgICAgICMgdG90YWwgbGlzdCBvZiBGQVFJRHMsIHRoYXQgY2FuIGJlIGxpc3RlZAogICAgICAgIFRvdGFsICAgICAgPT4gc2NhbGFyIEB7ICRGQVFJRHNSZWYgfSwgICAgICAgICAgICAgIyB0b3RhbCBudW1iZXIgb2YgbGlzdCBpdGVtcywgaW4gdGhpcyBjYXNlCiAgICAgICAgVmlldyAgICAgICA9PiAkU2VsZi0+e1ZpZXd9LCAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAnU21hbGwnCiAgICAgICAgRmlsdGVyICAgICA9PiAnQWxsJywKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCiAgICAgICAgVGl0bGVOYW1lICA9PiAnT3ZlcnZpZXc6IEZBUScsCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRW52ICAgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSAgID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCAgID0+ICRMaW5rU29ydCwKICAgICAgICBGcm9udGVuZCAgID0+ICdBZ2VudCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgKEFnZW50fEN1c3RvbWVyfFB1YmxpYyksIGRlZmF1bHQ6IEFnZW50LCBpbmRpY2F0ZXMgZnJvbSB3aGljaCBmcm9udGVuZCB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQKICAgICk7Cgo9Y3V0CgpzdWIgRkFRTGlzdFNob3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRha2Ugb2JqZWN0IHJlZiB0byBsb2NhbCwgcmVtb3ZlIGl0IGZyb20gJVBhcmFtIChwcmV2ZW50IG1lbW9yeSBsZWFrKQogICAgbXkgJEVudiA9ICRQYXJhbXtFbnZ9OwogICAgZGVsZXRlICRQYXJhbXtFbnZ9OwoKICAgICMgbG9va3VwIGxhdGVzdCB1c2VkIHZpZXcgbW9kZQogICAgaWYgKCAhJFBhcmFte1ZpZXd9ICYmICRTZWxmLT57ICdVc2VyRkFRT3ZlcnZpZXcnIC4gJEVudi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAkUGFyYW17Vmlld30gPSAkU2VsZi0+eyAnVXNlckZBUU92ZXJ2aWV3JyAuICRFbnYtPntBY3Rpb259IH07CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2aWV3IG1vZGUgdG8gJ3NtYWxsJwogICAgbXkgJFZpZXcgPSAkUGFyYW17Vmlld30gfHwgJ1NtYWxsJzsKCiAgICAjIHN0b3JlIGxhdGVzdCB2aWV3IG1vZGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJGQVFPdmVydmlldycgLiAkRW52LT57QWN0aW9ufSwKICAgICAgICBWYWx1ZSAgICAgPT4gJFZpZXcsCiAgICApOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGJhY2tlbmQgZnJvbSBjb25maWcKICAgIG15ICRCYWNrZW5kcyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpGcm9udGVuZDo6T3ZlcnZpZXcnKSB8fCAnJzsKICAgIGlmICggISRCYWNrZW5kcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIGNvbmZpZyBvcHRpb24gRkFROjpGcm9udGVuZDo6T3ZlcnZpZXcnKSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGhhc2gtcmVmCiAgICBpZiAoIHJlZiAkQmFja2VuZHMgbmUgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvbmZpZyBvcHRpb24gRkFROjpGcm9udGVuZDo6T3ZlcnZpZXcgbmVlZHMgdG8gYmUgYSBIQVNIIHJlZiEnKSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGNvbmZpZyBrZXkKICAgIGlmICggISRCYWNrZW5kcy0+eyRWaWV3fSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05vIGNvbmZpZyBvcHRpb24gZm91bmQgZm9yIHRoZSB2aWV3ICIlcyIhJywgJFZpZXcgKSwKICAgICAgICApOwogICAgfQoKICAgICMgbmF2aWdhdGlvbiBiYXIKICAgIG15ICRTdGFydEhpdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oCiAgICAgICAgUGFyYW0gPT4gJ1N0YXJ0SGl0JywKICAgICkgfHwgMTsKCiAgICAjIGdldCBwZXJzb25hbCBwYWdlIHNob3duIGNvdW50CiAgICBteSAkUGFnZVNob3duUHJlZmVyZW5jZXNLZXkgPSAnVXNlckZBUU92ZXJ2aWV3JyAuICRWaWV3IC4gJ1BhZ2VTaG93bic7CiAgICBteSAkUGFnZVNob3duICAgICAgICAgICAgICAgPSAkU2VsZi0+eyRQYWdlU2hvd25QcmVmZXJlbmNlc0tleX0gfHwgMTA7CiAgICBteSAkR3JvdXAgICAgICAgICAgICAgICAgICAgPSAnRkFRT3ZlcnZpZXcnIC4gJFZpZXcgLiAnUGFnZVNob3duJzsKCiAgICAjIGNoZWNrIHN0YXJ0IG9wdGlvbiwgaWYgaGlnaGVyIHRoZW4gZWxlbWVudHMgYXZhaWxhYmxlLCBzZXQKICAgICMgaXQgdG8gdGhlIGxhc3Qgb3ZlcnZpZXcgcGFnZSAoVGhhbmtzIHRvIFN0ZWZhbiBTY2htaWR0ISkKICAgIGlmICggJFN0YXJ0SGl0ID4gJFBhcmFte1RvdGFsfSApIHsKICAgICAgICBteSAkUGFnZXMgPSBpbnQoICggJFBhcmFte1RvdGFsfSAvICRQYWdlU2hvd24gKSArIDAuOTk5OTkgKTsKICAgICAgICAkU3RhcnRIaXQgPSAoICggJFBhZ2VzIC0gMSApICogJFBhZ2VTaG93biApICsgMTsKICAgIH0KCiAgICAjIGdldCBkYXRhIHNlbGVjdGlvbgogICAgbXkgJURhdGE7CiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdQcmVmZXJlbmNlc0dyb3VwcycpOwogICAgaWYgKCAkQ29uZmlnICYmICRDb25maWctPnskR3JvdXB9ICYmICRDb25maWctPnskR3JvdXB9LT57RGF0YX0gKSB7CiAgICAgICAgJURhdGEgPSAleyAkQ29uZmlnLT57JEdyb3VwfS0+e0RhdGF9IH07CiAgICB9CgogICAgIyBzZXQgcGFnZSBsaW1pdCBhbmQgYnVpbGQgcGFnZSBuYXZpZ2F0aW9uCiAgICBteSAkTGltaXQgICA9ICRQYXJhbXtMaW1pdH0gfHwgMjBfMDAwOwogICAgbXkgJVBhZ2VOYXYgPSAkU2VsZi0+UGFnZU5hdkJhcigKICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgIFN0YXJ0SGl0ICA9PiAkU3RhcnRIaXQsCiAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgQWxsSGl0cyAgID0+ICRQYXJhbXtUb3RhbH0gfHwgMCwKICAgICAgICBBY3Rpb24gICAgPT4gJ0FjdGlvbj0nIC4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIExpbmsgICAgICA9PiAkUGFyYW17TGlua1BhZ2V9LAogICAgKTsKCiAgICAjIGJ1aWxkIHNob3duIEZBUSBhcnRpY2xlcyBvbiBhIHBhZ2UKICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICAgID0gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iOwogICAgJFBhcmFte0dyb3VwfSAgICAgICAgICAgPSAkR3JvdXA7CiAgICAkUGFyYW17UHJlZmVyZW5jZXNLZXl9ICA9ICRQYWdlU2hvd25QcmVmZXJlbmNlc0tleTsKICAgICRQYXJhbXtQYWdlU2hvd25TdHJpbmd9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICRQYWdlU2hvd25QcmVmZXJlbmNlc0tleSwKICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFnZVNob3duLAogICAgICAgIERhdGEgICAgICAgID0+IFwlRGF0YSwKICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgIFNvcnQgICAgICAgID0+ICdOdW1lcmljVmFsdWUnLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGJ1aWxkIG5hdmlnYXRpb24gYmFyIGNvbnRlbnQKICAgICRTZWxmLT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkTGlua0JhY2tJRCA9ICdGQVFTZWFyY2gnOwogICAgaWYgKCAkUGFyYW17TmF2fSAmJiAkUGFyYW17TmF2fSBlcSAnTm9uZScgKSB7CiAgICAgICAgJExpbmtCYWNrSUQgLj0gJ1NtYWxsJzsKICAgIH0KCiAgICAjIGJhY2sgbGluawogICAgaWYgKCAkUGFyYW17TGlua0JhY2t9ICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJQYWdlQmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua0JhY2tJRCA9PiAkTGlua0JhY2tJRCwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgU2VuZCBkYXRhIHRvIEpTLgogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnRkFRU2VhcmNoUHJvZmlsZScsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte1Byb2ZpbGV9LAogICAgKTsKCiAgICAjIGdldCBmaWx0ZXJzCiAgICBpZiAoICRQYXJhbXtGaWx0ZXJzfSApIHsKCiAgICAgICAgIyBnZXQgZ2l2ZW4gZmlsdGVycwogICAgICAgIG15IEBOYXZCYXJGaWx0ZXJzOwogICAgICAgIGZvciBteSAkUHJpbyAoIHNvcnQga2V5cyAleyAkUGFyYW17RmlsdGVyc30gfSApIHsKICAgICAgICAgICAgcHVzaCBATmF2QmFyRmlsdGVycywgJFBhcmFte0ZpbHRlcnN9LT57JFByaW99OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBmaWx0ZXIgY29udGVudAogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGxvb3Agb3ZlciBmaWx0ZXJzCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICBmb3IgbXkgJEZpbHRlciAoQE5hdkJhckZpbHRlcnMpIHsKCiAgICAgICAgICAgICMgaW5jcmVtZW50IGZpbHRlciBjb3VudCBhbmQgYnVpbGQgZmlsdGVyIGl0ZW0KICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZpbHRlciBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICRGaWx0ZXItPntGaWx0ZXJ9IGVxICRQYXJhbXtGaWx0ZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb3Agb3ZlciBjb25maWd1cmVkIGJhY2stZW5kcwogICAgZm9yIG15ICRCYWNrZW5kICggc29ydCBrZXlzICV7JEJhY2tlbmRzfSApIHsKCiAgICAgICAgIyBidWlsZCBuYXZpZ2F0aW9uIGJhciB2aWV3IG1vZGUKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyVmlld01vZGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICV7ICRCYWNrZW5kcy0+eyRCYWNrZW5kfSB9LAogICAgICAgICAgICAgICAgRmlsdGVyID0+ICRQYXJhbXtGaWx0ZXJ9LAogICAgICAgICAgICAgICAgVmlldyAgID0+ICRCYWNrZW5kLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgY3VycmVudCB2aWV3IGlzIGNvbmZpZ3VyZWQgaW4gYmFja2VuZAogICAgICAgIGlmICggJFZpZXcgZXEgJEJhY2tlbmQgKSB7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyVmlld01vZGVTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICAgICAgRmlsdGVyID0+ICRQYXJhbXtGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIFZpZXcgICA9PiAkQmFja2VuZCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlTm90U2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7ICRCYWNrZW5kcy0+eyRCYWNrZW5kfSB9LAogICAgICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHBhZ2UgbmF2aWdhdGlvbiBpcyBhdmFpbGFibGUKICAgIGlmICglUGFnZU5hdikgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJQYWdlTmF2QmFyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhZ2VOYXYsCiAgICAgICAgKTsKCiAgICAgICAgIyBkb24ndCBzaG93IGNvbnRleHQgc2V0dGluZ3MgaW4gQUpBWCBjYXNlIChlLiBnLiBpbiBjdXN0b21lciBGQVEgaGlzdG9yeSksCiAgICAgICAgIyBiZWNhdXNlIHRoZSBzdWJtaXQgd2l0aCBwYWdlIHJlbG9hZCB3aWxsIG5vdCB3b3JrIHRoZXJlCiAgICAgICAgaWYgKCAhJFBhcmFte0FKQVh9ICkgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb250ZXh0U2V0dGluZ3MnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhZ2VOYXYsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBIVE1MIGNvbnRlbnQKICAgIG15ICRPdXRwdXROYXZCYXIgPSAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRGQVFPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgVmlldyA9PiAkVmlldywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY3JlYXRlIG91dHB1dAogICAgbXkgJE91dHB1dFJhdyA9ICRPdXRwdXROYXZCYXI7CgogICAgIyBsb2FkIG1vZHVsZQogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJEJhY2tlbmRzLT57JFZpZXd9LT57TW9kdWxlfSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+RmF0YWxFcnJvcigpOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkT2JqZWN0ID0gJEJhY2tlbmRzLT57JFZpZXd9LT57TW9kdWxlfS0+bmV3KCAleyRFbnZ9ICk7CiAgICByZXR1cm4gaWYgISRPYmplY3Q7CgogICAgIyBydW4gbW9kdWxlCiAgICBteSAkT3V0cHV0ID0gJE9iamVjdC0+UnVuKAogICAgICAgICVQYXJhbSwKICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgIFN0YXJ0SGl0ICA9PiAkU3RhcnRIaXQsCiAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgQWxsSGl0cyAgID0+ICRQYXJhbXtUb3RhbH0gICAgfHwgMCwKICAgICAgICBGcm9udGVuZCAgPT4gJFBhcmFte0Zyb250ZW5kfSB8fCAnQWdlbnQnLAogICAgICAgIE5hdiAgICAgICA9PiAkUGFyYW17TmF2fSAgICAgIHx8ICcnLAogICAgICAgIFRpdGxlU2l6ZSA9PiAkUGFyYW17RkFRVGl0bGVTaXplfSwKICAgICk7CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXQ7CgogICAgIyBjcmVhdGUgb3ZlcnZpZXcgbmF2aWdhdGlvbiBiYXIKICAgICRTZWxmLT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyByZXR1cm4gY29udGVudCBpZiBhdmFpbGFibGUKICAgIHJldHVybiAkT3V0cHV0UmF3Owp9Cgo9aGVhZDIgRkFRQ29udGVudFNob3coKQoKT3V0cHV0cyB0aGUgbmVjZXNzYXJ5IGJsb2NrcyB0byBkaXNwbGF5IHRoZSBGQVEgaXRlbSBmaWVsZHMgZm9yIHRoZSBzdXBwbGllZCBGQVEgaXRlbSBJRC4KVGhlIGZpZWxkcyBkaXNwbGF5ZWQgYXJlIGFsc28gcmVzdHJpY3RlZCBieSB0aGUgcGVybWlzc2lvbnMgcmVwcmVzZW50ZWQgYnkgdGhlIHN1cHBsaWVkIGludGVyZmFjZQoKSWYgZXhpc3QgUmV0dXJuQ29udGVudCBwYXJhbWV0ZXIgaXQgcmV0dXJucyB0aGUgRkFRIGl0ZW1zIGZpZWxkcyBvbiBhIEhUTUwgZm9ybWF0dGVkIHN0cmluZwoKICAgICRMYXlvdXRPYmplY3QtPkZBUUNvbnRlbnRTaG93KAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LCAgICAgICAgICAgICAgICAgIyBuZWVkZWQgZm9yIGNvcmUgbW9kdWxlIGludGVyYWN0aW9uCiAgICAgICAgRkFRRGF0YSAgICAgICAgID0+ICV7ICRGQVFEYXRhIH0sCiAgICAgICAgSW50ZXJmYWNlU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJENvbnRlbnQgPSAkTGF5b3V0T2JqZWN0LT5GQVFDb250ZW50U2hvdygKICAgICAgICBGQVFPYmplY3QgICAgICAgPT4gJEZBUU9iamVjdCwgICAgICAgICAgICAgICAgICMgbmVlZGVkIGZvciBjb3JlIG1vZHVsZSBpbnRlcmFjdGlvbgogICAgICAgIEZBUURhdGEgICAgICAgICA9PiAleyAkRkFRRGF0YSB9LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgUmV0dXJuQ29udGVudCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZBUUNvbnRlbnRTaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KEZBUU9iamVjdCBGQVFEYXRhIEludGVyZmFjZVN0YXRlcyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRQYXJhbU5hbWV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUGFyYW1OYW1lISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzdG9yZSBGQVEgb2JqZWN0IGxvY2FsbHkKICAgIG15ICRGQVFPYmplY3QgPSAkUGFyYW17RkFRT2JqZWN0fTsKIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgbXkgJUZBUURhdGEgICA9ICV7ICRQYXJhbXtGQVFEYXRhfSB9OwojIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgdGhlIGNvbmZpZyBvZiBGQVEgZmllbGRzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICBteSAlRmllbGRzOwogICAgRklFTEQ6CiAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gNiApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIG9mIEZBUSBmaWVsZAogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICdGQVE6Okl0ZW06OkZpZWxkJyAuICROdW1iZXIgKTsKCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhJENvbmZpZy0+e1Nob3d9OwoKIyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQogICAgICAgICMgc2tpcCBvdmVyIGZpZWxkcyB3aXRob3V0IGNvbnRlbnQKICAgICAgICBuZXh0IEZJRUxEIGlmICRQYXJhbXtab29tfSAmJiAkRkFRRGF0YXsiRmllbGQkTnVtYmVyIn0gZXEgJyc7CgojIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgICAgICMgc3RvcmUgb25seSB0aGUgY29uZmlnIG9mIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgICRGaWVsZHN7IkZpZWxkJE51bWJlciJ9ID0gJENvbmZpZzsKICAgIH0KCiAgICBteSAkRnVsbENvbnRlbnQ7CgogICAgIyBzb3J0IHNob3duIGZpZWxkcyBieSBwcmlvcml0eQogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkICggc29ydCB7ICRGaWVsZHN7JGF9LT57UHJpb30gPD0+ICRGaWVsZHN7JGJ9LT57UHJpb30gfSBrZXlzICVGaWVsZHMgKSB7CgogICAgICAgICMgZ2V0IHRoZSBzdGF0ZSB0eXBlIGRhdGEgb2YgdGhpcyBmaWVsZAogICAgICAgIG15ICRTdGF0ZVR5cGVEYXRhID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlR2V0KAogICAgICAgICAgICBOYW1lICAgPT4gJEZpZWxkc3skRmllbGR9LT57U2hvd30sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGRvIG5vdCBzaG93IGZpZWxkcyB0aGF0IGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgZ2l2ZW4gaW50ZXJmYWNlCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhJFBhcmFte0ludGVyZmFjZVN0YXRlc30tPnsgJFN0YXRlVHlwZURhdGEtPntTdGF0ZUlEfSB9OwoKICAgICAgICBteSAkQ2FwdGlvbiA9ICRGaWVsZHN7JEZpZWxkfS0+eydDYXB0aW9uJ307CiAgICAgICAgbXkgJENvbnRlbnQgPSAkUGFyYW17RkFRRGF0YX0tPnskRmllbGR9IHx8ICcnOwoKICAgICAgICAjIHJlbW92ZSBhY3RpdmUgSFRNTCBjb250ZW50IChzY3JpcHRzLCBhcHBsZXRzLCBldGMuLi4pCiAgICAgICAgbXkgJVNhZmVDb250ZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyAgICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgICAgIE5vT2JqZWN0ICAgICA9PiAxLAogICAgICAgICAgICBOb0VtYmVkICAgICAgPT4gMSwKICAgICAgICAgICAgTm9JbnRTcmNMb2FkID0+IDAsCiAgICAgICAgICAgIE5vRXh0U3JjTG9hZCA9PiAwLAogICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHRha2UgdGhlIHNhZmUgY29udGVudCBpZiBuZWNlc3NhcnkKICAgICAgICBpZiAoICRTYWZlQ29udGVudHtSZXBsYWNlfSApIHsKICAgICAgICAgICAgJENvbnRlbnQgPSAkU2FmZUNvbnRlbnR7U3RyaW5nfTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aGUgZmllbGQKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUNvbnRlbnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkUGFyYW17RkFRRGF0YX0tPntJdGVtSUR9LAogICAgICAgICAgICAgICAgRmllbGQgICAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgIENhcHRpb24gICA9PiAkQ2FwdGlvbiwKICAgICAgICAgICAgICAgIFN0YXRlTmFtZSA9PiAkU3RhdGVUeXBlRGF0YS0+e05hbWV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICRDb250ZW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKSAmJiAkU2VsZi0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFDb250ZW50SFRNTCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0ZBUURhdGF9LT57SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGNvbnZlcnQgZmllbGRzIEFTQ0lJIGlmIG5lZWRlZAogICAgICAgICAgICBpZiAoICRQYXJhbXtGQVFEYXRhfS0+e0NvbnRlbnRUeXBlfSBuZSAndGV4dC9wbGFpbicgKSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJENvbnRlbnQsCiAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFDb250ZW50UGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFNlbmQgY29uZmlnIHRvIEpTLgogICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdBZ2VudEhUTUxGaWVsZEhlaWdodERlZmF1bHQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RnJvbnRlbmQ6OkFnZW50SFRNTEZpZWxkSGVpZ2h0RGVmYXVsdCcpLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0FnZW50SFRNTEZpZWxkSGVpZ2h0TWF4JywKICAgICAgICAgICAgVmFsdWUgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkZyb250ZW5kOjpBZ2VudEhUTUxGaWVsZEhlaWdodE1heCcpLAogICAgICAgICk7CgogICAgICAgICMgc3RvcmUgdGhlIGZpZWxkIHRvIHJldHVybiBhbGwgRkFRIEJvZHkKICAgICAgICBpZiAoICRQYXJhbXtSZXR1cm5Db250ZW50fSAmJiAkQ29udGVudCApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBpbnRlcm5hbCBzdGF0ZSB0eXBlCiAgICAgICAgICAgIG15ICRJbnRlcm5hbFN0YXRlVHlwZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnaW50ZXJuYWwnLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IGZpZWxkIGlzIGludGVybmFsCiAgICAgICAgICAgIG15ICRJc0ludGVybmFsOwogICAgICAgICAgICBpZiAoICRTdGF0ZVR5cGVEYXRhLT57U3RhdGVJRH0gPT0gJEludGVybmFsU3RhdGVUeXBlLT57U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkSXNJbnRlcm5hbCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgVGlja2V0IENvbXBvc2UKICAgICAgICAgICAgbXkgJFRpY2tldENvbXBvc2VDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6VGlja2V0Q29tcG9zZScpOwoKICAgICAgICAgICAgIyBDaGVjayBpZiBmaWVsZCBzaG91bGQgYmUgcGFydCBvZiB0aGUgcmV0dXJuaW5nIHN0cmluZwogICAgICAgICAgICBpZiAoICRUaWNrZXRDb21wb3NlQ29uZmlnLT57SW5jbHVkZUludGVybmFsfSB8fCAhJElzSW50ZXJuYWwgKSB7CgogICAgICAgICAgICAgICAgIyBDaGVjayBpZiBmaWVsZCBuYW1lIHNob3VsZCBiZSByZXR1cm5lZAogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0Q29tcG9zZUNvbmZpZy0+e1Nob3dGaWVsZE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAkRnVsbENvbnRlbnQgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkQ2FwdGlvbikgLiAnIDxici8+ICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRnVsbENvbnRlbnQgLj0gJENvbnRlbnQgLiAnIDxici8+ICc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gYWxsIHRoZSAocGVybWl0dGVkKSBGQVEgYm9keQogICAgaWYgKCAkUGFyYW17UmV0dXJuQ29udGVudH0gKSB7CiAgICAgICAgaWYgKCRGdWxsQ29udGVudCkgewogICAgICAgICAgICByZXR1cm4gJEZ1bGxDb250ZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVGhpcyBhcnRpY2xlIGlzIGVtcHR5IScpOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRkFRUGF0aFNob3coKQoKaWYgaXRzIGFsbG93ZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24sIG91dHB1dHMgdGhlIG5lY2Vzc2FyeSBibG9ja3MgdG8gZGlzcGxheSB0aGUgRkFRIGl0ZW0gcGF0aCwKYW5kIHJldHVybnMgdGhlIHZhbHVlIDEuCgogICAgbXkgJFNob3dQYXRoT2sgPSAkTGF5b3V0T2JqZWN0LT5GQVFQYXRoU2hvdygKICAgICAgICBGQVFPYmplY3QgICA9PiAkRkFRT2JqZWN0LCAgICAgICAgICAgICAgICAgICAjIG5lZWRlZCBmb3IgY29yZSBtb2R1bGUgaW50ZXJhY3Rpb24KICAgICAgICBDYXRlZ29yeUlEICA9PiA1LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgUGF0aEZvckl0ZW0gPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoZGVmYXVsdCAwKQogICAgICAgIE5hdiAgICAgICAgID0+ICdub25lJywgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgRkFRUGF0aFNob3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhGQVFPYmplY3QgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtQYXRoRm9ySXRlbX0gfHw9IDA7CgogICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtDYXRlZ29yeUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2F0ZWdvcnlJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRCbG9jayA9ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50JzsKICAgIGlmICggJFBhcmFte0NhdGVnb3J5SUR9IGVxICcwJyApIHsKICAgICAgICAkQmxvY2sgPSAnRkFRUGF0aENhdGVnb3J5RWxlbWVudE5vTGluayc7CiAgICB9CgogICAgIyBvdXRwdXQgY2F0ZWdvcnkgcm9vdAogICAgJFNlbGYtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJEJsb2NrLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBOYW1lICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlOYW1lJyksCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gMCwKICAgICAgICAgICAgTmF2ICAgICAgICA9PiAkUGFyYW17TmF2fSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBTaG93IEZBUSBQYXRoIHNldHRpbmcKICAgIG15ICRTaG93UGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpFeHBsb3Jlcjo6UGF0aDo6U2hvdycpOwoKICAgICMgZG8gbm90IGRpc3BsYXkgdGhlIHBhdGggaWYgc2V0dGluZyBpcyBvZmYKICAgIHJldHVybiBpZiAhJFNob3dQYXRoOwoKICAgIG15ICRGQVFPYmplY3QgPSAkUGFyYW17RkFRT2JqZWN0fTsKCiAgICBteSAkQ2F0ZWdvcnlMaXN0ID0gJEZBUU9iamVjdC0+RkFRUGF0aExpc3RHZXQoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBvdXRwdXQgc3ViY2F0ZWdvcmllcwogICAgZm9yIG15ICRDYXRlZ29yeURhdGEgKCBAeyRDYXRlZ29yeUxpc3R9ICkgewoKICAgICAgICAkQmxvY2sgPSAnRkFRUGF0aENhdGVnb3J5RWxlbWVudCc7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ2F0ZWdvcnlEYXRhLT57Q2F0ZWdvcnlJRH0gPT0gJENhdGVnb3J5TGlzdC0+Wy0xXS0+e0NhdGVnb3J5SUR9CiAgICAgICAgICAgICYmICEkUGFyYW17UGF0aEZvckl0ZW19CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRCbG9jayA9ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50Tm9MaW5rJzsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2ssCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmF2ID0+ICRQYXJhbXtOYXZ9LAogICAgICAgICAgICAgICAgJXskQ2F0ZWdvcnlEYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFSYXRpbmdTdGFyc1Nob3coKQoKT3V0cHV0cyB0aGUgbmVjZXNzYXJ5IGJsb2NrcyB0byByZXByZXNlbnQgdGhlIEZBUSBpdGVtIHJhdGluZwphcyAiU3RhcnMiIGluIHRoZSBzY2FsZSBmcm9tIDEgdG8gNS4KCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFSYXRpbmdTdGFyc1Nob3coCiAgICAgICAgVm90ZVJlc3VsdCA9PiAkRkFRRGF0YS0+e1ZvdGVSZXN1bHR9LAogICAgICAgIFZvdGVzICAgICAgPT4gJEZBUURhdGEgLT57Vm90ZXN9LAogICAgKTsKCj1jdXQKCnN1YiBGQVFSYXRpbmdTdGFyc1Nob3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoVm90ZVJlc3VsdCBWb3RlcykpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHN0YXJzIGJ5IG11bHRpcGx5IGJ5IDUgYW5kIGRpdmlkZSBieSAxMDAKICAgICMgMTAwIGJlY2F1c2UgVm90ZSByZXN1bHQgaXMgYSAlCiAgICAjIDUgYmVjYXVzZSB3ZSBoYXZlIG9ubHkgNSBzdGFycwogICAgbXkgJFN0YXJDb3VudGVyID0gaW50KCAkUGFyYW17Vm90ZVJlc3VsdH0gKiAwLjA1ICk7CiAgICBpZiAoICRTdGFyQ291bnRlciA8IDUgKSB7CgogICAgICAgICMgYWRkIDEgYmVjYXVzZSBsb3dlc3QgdmFsdWUgc2hvdWxkIGJlIDEKICAgICAgICAkU3RhckNvdW50ZXIrKzsKICAgIH0KCiAgICAjIHRoZSBudW1iZXIgb2Ygc3RhcnMgY2FuJ3QgYmUgZ3JhdGVyIHRoYXQgNQogICAgZWxzaWYgKCAkU3RhckNvdW50ZXIgPiA1ICkgewogICAgICAgICRTdGFyQ291bnRlciA9IDU7CiAgICB9CgogICAgIyBvdXRwdXQgcmF0aW5nIGJsb2NrCiAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVmlld1JhdGluZycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGRvIG5vdCBvdXRwdXQgYW55IHN0YXIgaWYgdGhpcyBGQVEgaGFzIGJlZW4gbm90IHZvdGVkCiAgICBpZiAoICRQYXJhbXtWb3Rlc30gZXEgJzAnICkgewogICAgICAgICRTdGFyQ291bnRlciA9IDA7CiAgICB9CgogICAgIyBzaG93IHN0YXJzIG9ubHkgaWYgdGhlIEZBUSBpdGVtIGhhcyBiZWVuIHZvdGVkIGF0IGxlYXN0IG9uY2UgZXZlbiBpZiB0aGUgJFZvdGVSZXN1bHQgaXMgMAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IHN0YXJzCiAgICAgICAgZm9yICggMSAuLiAkU3RhckNvdW50ZXIgKSB7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JhdGVTdGFycycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IHN0YXJzIHRleHQKICAgICRTZWxmLT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSYXRlU3RhcnNDb3VudCcsCiAgICAgICAgRGF0YSA9PiB7IFN0YXJzID0+ICRTdGFyQ291bnRlciB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZBUVNob3dMYXRlc3ROZXdzQm94KCkKClNob3dzIGFuIGluZm8gYm94IHdpdGggdGhlIGxhc3QgdXBkYXRlZCBvciBsYXN0IGNyZWF0ZWQgRkFRIGFydGljbGVzLgpEZXBlbmRpbmcgb24gdGhlIHVzZXMgaW50ZXJmYWNlIChhZ2VudCwgY3VzdG9tZXIsIHB1YmxpYykgb25seSB0aGUgYXBwcm9wcmlhdGUKYXJ0aWNsZXMgYXJlIHNob3duIGhlcmUuCgogICAgJExheW91dE9iamVjdC0+RkFRU2hvd0xhdGVzdE5ld3NCb3goCiAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsICAgICAgICAgICAgICAgICAjIG5lZWRlZCBmb3IgY29yZSBtb2R1bGUgaW50ZXJhY3Rpb24KICAgICAgICBUeXBlICAgICAgICAgICAgPT4gJ0xhc3RDcmVhdGUnLCAgICAgICAgICAgICAgICMgKExhc3RDcmVhdGUgfCBMYXN0Q2hhbmdlKQogICAgICAgIE1vZGUgICAgICAgICAgICA9PiAnUHVibGljJywgICAgICAgICAgICAgICAgICAgIyAoQWdlbnQsIEN1c3RvbWVyLCBQdWJsaWMpCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+IDUsCiAgICAgICAgSW50ZXJmYWNlICAgICAgID0+ICRTZWxmLT57SW50ZXJmYWNlfSwKICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgIE5hdiAgICAgICAgICAgICA9PiAnbm9uZScsICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBGQVFTaG93TGF0ZXN0TmV3c0JveCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhGQVFPYmplY3QgVHlwZSBNb2RlIEludGVyZmFjZSBJbnRlcmZhY2VTdGF0ZXMgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0NhdGVnb3J5SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBDYXRlZ29yeUlEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0eXBlCiAgICBpZiAoICRQYXJhbXtUeXBlfSAhfiBteyBMYXN0Q3JlYXRlIHwgTGFzdENoYW5nZSB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVHlwZSBtdXN0IGJlIGVpdGhlciBMYXN0Q3JlYXRlIG9yIExhc3RDaGFuZ2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIG1vZGUKICAgIGlmICggJFBhcmFte01vZGV9ICF+IG17IEFnZW50IHwgQ3VzdG9tZXIgfCBQdWJsaWMgfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01vZGUgbXVzdCBiZSBlaXRoZXIgQWdlbnQsIEN1c3RvbWVyIG9yIFB1YmxpYyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgQ3VzdG9tZXJVc2VyCiAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInICYmICEkUGFyYW17Q3VzdG9tZXJVc2VyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgb3JkZXIgYnkgc2VhcmNoIHBhcmFtZXRlciBhbmQgaGVhZGVyIGJhc2VkIG9uIHR5cGUKICAgIG15ICRPcmRlckJ5OwogICAgbXkgJEhlYWRlcjsKICAgIG15ICRSU1NUaXRsZTsKICAgIGlmICggJFBhcmFte1R5cGV9IGVxICdMYXN0Q3JlYXRlJyApIHsKICAgICAgICAkT3JkZXJCeSAgPSAnQ3JlYXRlZCc7CiAgICAgICAgJEhlYWRlciAgID0gVHJhbnNsYXRhYmxlKCdMYXRlc3QgY3JlYXRlZCBGQVEgYXJ0aWNsZXMnKTsKICAgICAgICAkUlNTVGl0bGUgPSBUcmFuc2xhdGFibGUoJ0ZBUSBBcnRpY2xlcyAobmV3IGNyZWF0ZWQpJyk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtUeXBlfSBlcSAnTGFzdENoYW5nZScgKSB7CiAgICAgICAgJE9yZGVyQnkgID0gJ0NoYW5nZWQnOwogICAgICAgICRIZWFkZXIgICA9IFRyYW5zbGF0YWJsZSgnTGF0ZXN0IHVwZGF0ZWQgRkFRIGFydGljbGVzJyk7CiAgICAgICAgJFJTU1RpdGxlID0gVHJhbnNsYXRhYmxlKCdGQVEgQXJ0aWNsZXMgKHJlY2VudGx5IGNoYW5nZWQpJyk7CiAgICB9CgogICAgbXkgJFJlc3VsdCA9IC0xOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgc2hvdyBsYXN0IGFkZGVkL3VwZGF0ZWQgYXJ0aWNsZXMKICAgIG15ICRTaG93ID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkV4cGxvcmVyOjokUGFyYW17VHlwZX06OlNob3ciKTsKICAgIGlmICggJFNob3ctPnsgJFBhcmFte0ludGVyZmFjZX0tPntOYW1lfSB9ICkgewoKICAgICAgICBteSAkRkFRT2JqZWN0ID0gJFBhcmFte0ZBUU9iamVjdH07CgogICAgICAgICMgdG8gc3RvcmUgc2VhcmNoIHBhcmFtIGZvciBjYXRlZ29yaWVzCiAgICAgICAgbXkgJUNhdGVnb3J5U2VhcmNoUGFyYW07CgogICAgICAgICMgaWYgc3ViY2F0ZWdvcmllcyBzaG91bGQgYWxzbyBiZSBzaG93bgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkV4cGxvcmVyOjokUGFyYW17VHlwZX06OlNob3dTdWJDYXRlZ29yeUl0ZW1zIikgKSB7CgogICAgICAgICAgICAjIGZpbmQgdGhlIHN1YmNhdGVnb3JpZXMgb2YgdGhpcyBjYXRlZ29yeQogICAgICAgICAgICBteSAkU3ViQ2F0ZWdvcnlJRHNSZWYgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeVN1YkNhdGVnb3J5SURMaXN0KAogICAgICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgIE1vZGUgICAgICAgICA9PiAkUGFyYW17TW9kZX0sCiAgICAgICAgICAgICAgICBJdGVtU3RhdGVzICAgPT4gJFBhcmFte0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0gfHwgJycsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlYXJjaCBpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgYW5kIGFkZCB0aGUgc3ViY2F0ZWdvcnkKICAgICAgICAgICAgJENhdGVnb3J5U2VhcmNoUGFyYW17Q2F0ZWdvcnlJRHN9ID0gWyAkUGFyYW17Q2F0ZWdvcnlJRH0sIEB7JFN1YkNhdGVnb3J5SURzUmVmfSBdOwogICAgICAgIH0KCiAgICAgICAgIyBhIGNhdGVnb3J5IGlzIGdpdmVuIGFuZCBzdWJjYXRlZ29yaWVzIHNob3VsZCBub3QgYmUgc2hvd24KICAgICAgICBlbHNpZiAoICRQYXJhbXtDYXRlZ29yeUlEfSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIG9ubHkgaW4gdGhlIGdpdmVuIGNhdGVnb3J5CiAgICAgICAgICAgICRDYXRlZ29yeVNlYXJjaFBhcmFte0NhdGVnb3J5SURzfSA9IFsgJFBhcmFte0NhdGVnb3J5SUR9IF07CiAgICAgICAgfQoKICAgICAgICAjIHNlYXJjaCB0aGUgRkFRIGFydGljbGVzCiAgICAgICAgbXkgQEl0ZW1JRHMgPSAkRkFRT2JqZWN0LT5GQVFTZWFyY2goCiAgICAgICAgICAgIFN0YXRlcyAgICAgICAgICAgPT4gJFBhcmFte0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyRPcmRlckJ5XSwKICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJ0Rvd24nXSwKICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICA9PiAkUGFyYW17SW50ZXJmYWNlfSwKICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUTo6RXhwbG9yZXI6OiRQYXJhbXtUeXBlfTo6TGltaXQiKSB8fCA1LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAlQ2F0ZWdvcnlTZWFyY2hQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzaG93CiAgICAgICAgaWYgKEBJdGVtSURzKSB7CgogICAgICAgICAgICAkUmVzdWx0ID0gMTsKCiAgICAgICAgICAgICMgc2hvdyB0aGUgaW5mbyBib3gKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb0JveEZBUU1pbmlMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEhlYWRlciA9PiAkSGVhZGVyLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyB0aGUgUlNTIEZlZWQgaWNvbgogICAgICAgICAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnUHVibGljJyApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb0JveEZBUU1pbmlMaXN0TmV3c1JTUycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICRPcmRlckJ5LAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkUlNTVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciBteSAkSXRlbUlEIChASXRlbUlEcykgewoKICAgICAgICAgICAgICAgICMgZ2V0IEZBUSBkYXRhCiAgICAgICAgICAgICAgICBteSAlRkFRRGF0YSA9ICRGQVFPYmplY3QtPkZBUUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICAgID0+ICRJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgSXRlbUZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2hvdyB0aGUgYXJ0aWNsZSByb3cKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvQm94RkFRTWluaUxpc3RJdGVtUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmF2ID0+ICRQYXJhbXtOYXZ9LAogICAgICAgICAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIEZBUVNob3dUb3AxMCgpCgpTaG93cyBhbiBpbmZvIGJveCB3aXRoIHRoZSBUb3AgMTAgRkFRIGFydGljbGVzLgpEZXBlbmRpbmcgb24gdGhlIHVzZXMgaW50ZXJmYWNlIChhZ2VudCwgY3VzdG9tZXIsIHB1YmxpYykgb25seSB0aGUgYXBwcm9wcmlhdGUKYXJ0aWNsZXMgYXJlIHNob3duIGhlcmUuCgogICAgJExheW91dE9iamVjdC0+RkFRU2hvd1RvcDEwKAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LCAgICAgICAgICAgICAgICAgIyBuZWVkZWQgZm9yIGNvcmUgbW9kdWxlIGludGVyYWN0aW9uCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdQdWJsaWMnLCAgICAgICAgICAgICAgICAgICAjIChBZ2VudCwgQ3VzdG9tZXIsIFB1YmxpYykKICAgICAgICBDYXRlZ29yeUlEICAgICAgPT4gNSwKICAgICAgICBJbnRlcmZhY2UgICAgICAgPT4gJFNlbGYtPntJbnRlcmZhY2V9LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgTmF2ICAgICAgICAgICAgID0+ICdub25lJywgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEZBUVNob3dUb3AxMCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhGQVFPYmplY3QgTW9kZSBJbnRlcmZhY2UgSW50ZXJmYWNlU3RhdGVzIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtTmFtZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRQYXJhbU5hbWUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtDYXRlZ29yeUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ2F0ZWdvcnlJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbW9kZQogICAgaWYgKCAkUGFyYW17TW9kZX0gIX4gbXsgQWdlbnQgfCBDdXN0b21lciB8IFB1YmxpYyB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTW9kZSBtdXN0IGJlIGVpdGhlciBBZ2VudCwgQ3VzdG9tZXIgb3IgUHVibGljIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBDdXN0b21lclVzZXIKICAgIGlmICggJFBhcmFte01vZGV9IGVxICdDdXN0b21lcicgJiYgISRQYXJhbXtDdXN0b21lclVzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lclVzZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkUmVzdWx0ID0gLTE7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzaG93IGxhc3QgYWRkZWQvdXBkYXRlZCBhcnRpY2xlcwogICAgbXkgJFNob3cgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6OlRvcDEwOjpTaG93Jyk7CiAgICBpZiAoICRTaG93LT57ICRQYXJhbXtJbnRlcmZhY2V9LT57TmFtZX0gfSApIHsKCiAgICAgICAgbXkgJEZBUU9iamVjdCA9ICRQYXJhbXtGQVFPYmplY3R9OwoKICAgICAgICAjIHRvIHN0b3JlIHNlYXJjaCBwYXJhbSBmb3IgY2F0ZWdvcmllcwogICAgICAgIG15ICVDYXRlZ29yeVNlYXJjaFBhcmFtOwoKICAgICAgICAjIGlmIHN1YmNhdGVnb3JpZXMgc2hvdWxkIGFsc28gYmUgc2hvd24KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpFeHBsb3Jlcjo6VG9wMTA6OlNob3dTdWJDYXRlZ29yeUl0ZW1zJykgKSB7CgogICAgICAgICAgICAjIGZpbmQgdGhlIHN1YmNhdGVnb3JpZXMgb2YgdGhpcyBjYXRlZ29yeQogICAgICAgICAgICBteSAkU3ViQ2F0ZWdvcnlJRHNSZWYgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeVN1YkNhdGVnb3J5SURMaXN0KAogICAgICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgIE1vZGUgICAgICAgICA9PiAkUGFyYW17TW9kZX0sCiAgICAgICAgICAgICAgICBJdGVtU3RhdGVzICAgPT4gJFBhcmFte0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0gfHwgJycsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlYXJjaCBpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgYW5kIGFkZCB0aGUgc3ViY2F0ZWdvcnkKICAgICAgICAgICAgJENhdGVnb3J5U2VhcmNoUGFyYW17Q2F0ZWdvcnlJRHN9ID0gWyAkUGFyYW17Q2F0ZWdvcnlJRH0sIEB7JFN1YkNhdGVnb3J5SURzUmVmfSBdOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHRvcCAxMCBhcnRpY2xlcyBmb3IgY2F0ZWdvcmllcyB3aXRoIGF0IGxlYXN0IHJvIHBlcm1pc3Npb25zCiAgICAgICAgbXkgJFRvcDEwSXRlbUlEc1JlZiA9ICRGQVFPYmplY3QtPkZBUVRvcDEwR2V0KAogICAgICAgICAgICBJbnRlcmZhY2UgPT4gJFBhcmFte0ludGVyZmFjZX0tPntOYW1lfSwKICAgICAgICAgICAgTGltaXQgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpFeHBsb3Jlcjo6VG9wMTA6OkxpbWl0JykgfHwgMTAsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgJUNhdGVnb3J5U2VhcmNoUGFyYW0sCiAgICAgICAgKSB8fCBbXTsKCiAgICAgICAgIyB0aGVyZSBpcyBzb21ldGhpbmcgdG8gc2hvdwogICAgICAgIGlmICggJFRvcDEwSXRlbUlEc1JlZiAmJiByZWYgJFRvcDEwSXRlbUlEc1JlZiBlcSAnQVJSQVknICYmIEB7JFRvcDEwSXRlbUlEc1JlZn0gKSB7CgogICAgICAgICAgICAkUmVzdWx0ID0gMTsKCiAgICAgICAgICAgICMgc2hvdyB0aGUgaW5mbyBib3gKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb0JveEZBUU1pbmlMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEhlYWRlciA9PiBUcmFuc2xhdGFibGUoJ1RvcCAxMCBGQVEgYXJ0aWNsZXMnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgdGhlIFJTUyBGZWVkIGljb24KICAgICAgICAgICAgaWYgKCAkUGFyYW17TW9kZX0gZXEgJ1B1YmxpYycgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9Cb3hGQVFNaW5pTGlzdE5ld3NSU1MnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICA9PiAnVG9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0ZBUSBBcnRpY2xlcyAoVG9wIDEwKScpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkTnVtYmVyOwogICAgICAgICAgICBmb3IgbXkgJFRvcDEwSXRlbSAoIEB7JFRvcDEwSXRlbUlEc1JlZn0gKSB7CgogICAgICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgbnVtYmVyCiAgICAgICAgICAgICAgICAkTnVtYmVyKys7CgogICAgICAgICAgICAgICAgbXkgJUZBUURhdGEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkVG9wMTBJdGVtLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBJdGVtRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IHRoZSBhcnRpY2xlIHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9Cb3hGQVFNaW5pTGlzdEl0ZW1Sb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYXYgPT4gJFBhcmFte05hdn0sCiAgICAgICAgICAgICAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2hvdyB0aGUgVG9wLTEwIHBvc2l0aW9uIG51bWJlcgogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9Cb3hGQVFNaW5pTGlzdEl0ZW1Sb3dQb3NpdGlvbk51bWJlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciA9PiAkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aGVhZDIgRkFRU2hvd1F1aWNrU2VhcmNoKCkKClNob3dzIGFuIGluZm8gYm94IHdpdGggdGhlIFF1aWNrIFNlYXJjaC4KCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFTaG93UXVpY2tTZWFyY2goCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdQdWJsaWMnLCAgICAgICAgICAgICAgICAgICAjIChBZ2VudCwgQ3VzdG9tZXIsIFB1YmxpYykKICAgICAgICBJbnRlcmZhY2UgICAgICAgPT4gJFNlbGYtPntJbnRlcmZhY2V9LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgTmF2ICAgICAgICAgICAgID0+ICdub25lJywgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgU2VhcmNoQmFja0xpbmsgID0+ICRCYXNlNjRFbmNvZGVkVXJsLCAgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEZBUVNob3dRdWlja1NlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhNb2RlIEludGVyZmFjZSBJbnRlcmZhY2VTdGF0ZXMgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbW9kZQogICAgaWYgKCAkUGFyYW17TW9kZX0gIX4gbXsgQWdlbnQgfCBBZ2VudFNtYWxsIHwgQ3VzdG9tZXIgfCBQdWJsaWMgfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01vZGUgbXVzdCBiZSBlaXRoZXIgQWdlbnQsIEN1c3RvbWVyIG9yIFB1YmxpYyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGFjdGlvbiBtb2R1bGUKICAgIG15ICRBY3Rpb247CiAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnQWdlbnRTbWFsbCcgKSB7CiAgICAgICAgJEFjdGlvbiA9ICdBZ2VudEZBUVNlYXJjaFNtYWxsJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRBY3Rpb24gPSAkUGFyYW17TW9kZX0gLiAnRkFRU2VhcmNoJzsKICAgIH0KCiAgICAjIGNoZWNrIEN1c3RvbWVyVXNlcgogICAgaWYgKCAkUGFyYW17TW9kZX0gZXEgJ0N1c3RvbWVyJyAmJiAhJFBhcmFte0N1c3RvbWVyVXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2hvdyBxdWljayBzZWFyY2gKICAgIG15ICRTaG93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpRdWlja1NlYXJjaDo6U2hvdycpOwogICAgaWYgKCAkU2hvdy0+eyAkUGFyYW17SW50ZXJmYWNlfS0+e05hbWV9IH0gfHwgJFBhcmFte01vZGV9IGVxICdBZ2VudFNtYWxsJyApIHsKCiAgICAgICAgIyBjYWxsIFF1aWNrU2VhcmNoIGJsb2NrCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWlja1NlYXJjaCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJEFjdGlvbiwKICAgICAgICAgICAgICAgIE5hdiAgICAgICAgICAgID0+ICRQYXJhbXtOYXZ9ICAgICAgICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICBTZWFyY2hCYWNrTGluayA9PiAkUGFyYW17U2VhcmNoQmFja0xpbmt9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RPQk8gcHJvamVjdCAoTDxodHRwczovL290b2JvLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentFAQAdd.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRGQVFBZGQudHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gRm9ybVNjcmVlbiBOb1NpZGViYXIiPgoKICAgIDxoMT5bJSBUcmFuc2xhdGUoIkFkZCBGQVEgQXJ0aWNsZSIpIHwgaHRtbCAlXTwvaDE+CiAgICA8cCBjbGFzcz0iQXN0ZXJpc2tFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgbWFuZGF0b3J5LiIpIHwgaHRtbCAlXTwvcD4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUFkZCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2F2ZSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRkFRRWRpdE1hc2siPgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJUaXRsZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+KiA8L3NwYW4+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiBpZD0iVGl0bGUiIHZhbHVlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuVGl0bGVTZXJ2ZXJFcnJvciB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMjAwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgojIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikljb24iPlslIFRyYW5zbGF0ZSgiSWNvbiAoc3ZnKSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEljb25GaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSWNvblByZXZpZXciIGNsYXNzPSJJY29uQm94Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSWNvbiIgaWQ9Ikljb24iIHZhbHVlPSJbJSBEYXRhLkljb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJJY29uVXBsb2FkIiBpZD0iSWNvblVwbG9hZCIgY2xhc3M9IkhpZGRlbiIgYWNjZXB0PSIuc3ZnLCBpbWFnZS9zdmcreG1sIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IkJ0blVwbG9hZEljb24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiVXBsb2FkIEljb24iKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCBhbiBpY29uIGluIFNWRyBmb3JtYXQgdG8gdXBsb2FkIGl0LiIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPiBbJSBUcmFuc2xhdGUoIlVwbG9hZCBJY29uIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiMgRU8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iS2V5d29yZHMiPlslIFRyYW5zbGF0ZSgiS2V5d29yZHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJLZXl3b3JkcyIgaWQ9IktleXdvcmRzIiB2YWx1ZT0iWyUgRGF0YS5LZXl3b3JkcyB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkNhdGVnb3J5SUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPiogPC9zcGFuPlslIFRyYW5zbGF0ZSgiQ2F0ZWdvcnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2F0ZWdvcnlPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2F0ZWdvcnlJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkEgY2F0ZWdvcnkgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2F0ZWdvcnlJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkEgY2F0ZWdvcnkgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXRlSUQiPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhdGVPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlNlcnZpY2VPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkWyUgSUYgIURhdGEuS2V5ICVdIE5vTWFyZ2luWyUgRU5EICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTGFuZ3VhZ2VJRCI+WyUgVHJhbnNsYXRlKCJMYW5ndWFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYW5ndWFnZU9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkxhbmd1YWdlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vTGFuZ3VhZ2UiKSAlXQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikxhbmd1YWdlSUQiIHZhbHVlPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdIi8+ClslIFJlbmRlckJsb2NrRW5kKCJOb0xhbmd1YWdlIikgJV0KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcHByb3ZhbCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQXBwcm92ZWQiPlslIFRyYW5zbGF0ZSgiQXBwcm92YWwiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQXBwcm92YWxPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcHByb3ZhbCIpICVdCgpbJSBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0F0dGFjaG1lbnRMaXN0LnR0IiAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUNvbnRlbnQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuRmllbGQgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5DYXB0aW9uKSB8IGh0bWwgJV06PGJyLz48c3BhbiBjbGFzcz0iRkFRU3RhdGVOYW1lIj4oWyUgVHJhbnNsYXRlKERhdGEuU3RhdGVOYW1lKSB8IGh0bWwgJV0pPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIGNsYXNzPSJSaWNoVGV4dCIgbmFtZT0iWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIHJvd3M9IjE1IiBjb2xzPSI3MCI+WyUgRGF0YS5Db250ZW50IHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudCIpICVdCgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJGQVFTdWJtaXQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQ3JlYXRlIikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50RkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFBZGQiKSAlXQogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo=</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentFAQEdit.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRGQVFFZGl0LnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCjxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGFydE5vcm1hbCIpICVdCiAgICA8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBGb3JtU2NyZWVuIE5vU2lkZWJhciI+CiAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiRWRpdCIpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKCJGQVEiKSB8IGh0bWwgJV06IFslIERhdGEuTnVtYmVyIHwgaHRtbCAlXTwvaDE+CiAgICAgICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhcnROb3JtYWwiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhcnRTbWFsbCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJFZGl0IikgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoIkZBUSIpIHwgaHRtbCAlXTogWyUgRGF0YS5OdW1iZXIgfCBodG1sICVdPC9oMT4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iQXN0ZXJpc2tFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgbWFuZGF0b3J5LiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXJ0U21hbGwiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRWRpdCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNhdmUiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJbJSBEYXRhLkl0ZW1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTY3JlZW5UeXBlIiB2YWx1ZT0iWyUgRGF0YS5TY3JlZW5UeXBlIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGQVFFZGl0TWFzayBbJSBEYXRhLkZpZWxkc2V0Q2xhc3MgfCBodG1sICVdIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlRpdGxlIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qIDwvc3Bhbj5bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgaWQ9IlRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLlRpdGxlU2VydmVyRXJyb3IgfCBodG1sICVdIiBtYXhsZW5ndGg9IjIwMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGl0bGVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiMgUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSWNvbiI+WyUgVHJhbnNsYXRlKCJJY29uIChzdmcpIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgSWNvbkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJJY29uUHJldmlldyIgY2xhc3M9Ikljb25Cb3giPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikljb24iIGlkPSJJY29uIiB2YWx1ZT0iWyUgRGF0YS5JY29uIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJJY29uVXBsb2FkIiBpZD0iSWNvblVwbG9hZCIgY2xhc3M9IkhpZGRlbiIgYWNjZXB0PSIuc3ZnLCBpbWFnZS9zdmcreG1sIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iQnRuVXBsb2FkSWNvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJVcGxvYWQgSWNvbiIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IGFuIGljb24gaW4gU1ZHIGZvcm1hdCB0byB1cGxvYWQgaXQuIikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtdXBsb2FkIj48L2k+IFslIFRyYW5zbGF0ZSgiVXBsb2FkIEljb24iKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKIyBFTyBSb3RoZXIgT1NTIC8gRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iS2V5d29yZHMiPlslIFRyYW5zbGF0ZSgiS2V5d29yZHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IktleXdvcmRzIiBpZD0iS2V5d29yZHMiIHZhbHVlPSJbJSBEYXRhLktleXdvcmRzIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjIwMCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iQ2F0ZWdvcnlJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+KiA8L3NwYW4+WyUgVHJhbnNsYXRlKCJDYXRlZ29yeSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhdGVnb3J5T3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDYXRlZ29yeUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkEgY2F0ZWdvcnkgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDYXRlZ29yeUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkEgY2F0ZWdvcnkgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhdGVPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlNlcnZpY2VPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkWyUgSUYgIURhdGEuS2V5ICVdIE5vTWFyZ2luWyUgRU5EICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2VydmljZU9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIj5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkxhbmd1YWdlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTGFuZ3VhZ2VJRCI+WyUgVHJhbnNsYXRlKCJMYW5ndWFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhbmd1YWdlT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJMYW5ndWFnZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0xhbmd1YWdlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTGFuZ3VhZ2VJRCIgdmFsdWU9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV0iLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vTGFuZ3VhZ2UiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwcm92YWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBcHByb3ZlZCI+WyUgVHJhbnNsYXRlKCJBcHByb3ZhbCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkFwcHJvdmFsT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcHByb3ZhbCIpICVdCgpbJSBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJTkNMVURFICJGb3JtRWxlbWVudHMvQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFDb250ZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkNhcHRpb24pIHwgaHRtbCAlXTo8YnIvPjxzcGFuIGNsYXNzPSJGQVFTdGF0ZU5hbWUiPihbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZU5hbWUpIHwgaHRtbCAlXSk8L3NwYW4+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlslIERhdGEuRmllbGQgfCBodG1sICVdIiBjbGFzcz0iUmljaFRleHQiIG5hbWU9IlslIERhdGEuRmllbGQgfCBodG1sICVdIiByb3dzPSIxNSIgY29scz0iNzAiPlslIERhdGEuQ29udGVudCB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbmROb3JtYWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IkZBUVN1Ym1pdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJVcGRhdGUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjayI+PC9pPiBbJSBUcmFuc2xhdGUoIlVwZGF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJFbmROb3JtYWwiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkVuZFNtYWxsIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iRkFRU3VibWl0IiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlVwZGF0ZSIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiVXBkYXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJFbmRTbWFsbCIpICVdCgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Zvcm0+Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentFAQZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRGQVFab29tLnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVE9CTzo6VFQ6OlNjcmlwdFVzYWdlKQoKPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iQ2xlYXJMZWZ0Ij48L2Rpdj4KIyBSb3RoZXIgT1NTIC0gYSBsb3Qgb2YgdW5tYXJrZWQgY2hhbmdlcyBoZXJlLi4uCiAgICA8ZGl2IGNsYXNzPSJIZWFkbGluZSBbJSBEYXRhLkNzc0NsYXNzTm9BcnRpY2xlIHwgaHRtbCAlXSI+CiAgICAgICAgWyUgRGF0YS5JY29uICVdCiAgICAgICAgPGgxIHRpdGxlPSJbJSBDb25maWcoIkZBUTo6RkFRSG9vayIpICVdOiBbJSBEYXRhLk51bWJlciB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgIFslIENvbmZpZygiRkFROjpGQVFIb29rIikgJV06IFslIERhdGEuTnVtYmVyICVdIDxzcGFuPiZtZGFzaDs8L3NwYW4+IFslIERhdGEuVGl0bGUgfCBodG1sICVdCiAgICAgICAgPC9oMT4KICAgIDwvZGl2PgoKICAgIDx1bCBjbGFzcz0iQnJlYWRDcnVtYiBbJSBEYXRhLkNzc0NsYXNzTm9BcnRpY2xlIHwgaHRtbCAlXSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQogICAgICAgIDxsaT4KICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50RkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV07TmF2PVslIERhdGEuTmF2IHwgdXJpICVdIj4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXQogICAgICAgICAgICA8L2E+CiAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFQYXRoSXRlbUVsZW1lbnQiKSAlXQogICAgICAgIDxsaT5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFQYXRoSXRlbUVsZW1lbnQiKSAlXQogICAgPC91bD4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlNpZGVCYXIgJV0KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgWyUgRGF0YS5UT0MgJV0KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJGQVEgSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDYXRlZ29yeSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DYXRlZ29yeU5hbWUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQ2F0ZWdvcnlOYW1lLCAiMTgiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIktleXdvcmRzIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIktleXdvcmRzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEZBUVNlYXJjaDtTdWJhY3Rpb249U2VhcmNoO0tleXdvcmQ9WyUgRGF0YS5LZXl3b3JkIHwgdXJpICVdIiB0aXRsZT0iWyUgRGF0YS5LZXl3b3JkIHwgaHRtbCAlXSI+WyUgRGF0YS5LZXl3b3JkIHwgaHRtbCAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIktleXdvcmRzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSwgIjI1IikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCwgIjI1IikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkxhbmd1YWdlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTGFuZ3VhZ2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UsICIxOCIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGFuZ3VhZ2UiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVmlld0FwcHJvdmFsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXBwcm92YWwiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQXBwcm92YWwpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQXBwcm92YWwsICIxOCIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVmlld0FwcHJvdmFsIikgJV0KCiMgc2hvdyBmYXEgZHluYW1pYyBmaWVsZHMKWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRHluYW1pY0ZpZWxkTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRRHluYW1pY0ZpZWxkTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGRfRmllbGQxX0xpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRfRmllbGQxX0xpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRHluYW1pY0ZpZWxkX0ZpZWxkMV9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDFfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDJfTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDJfTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGRfRmllbGQyX1BsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRkFRRHluYW1pY0ZpZWxkX0ZpZWxkMl9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRkFRRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJWaWV3UmF0aW5nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUmF0aW5nIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSYXRpbmciKSB8IGh0bWwgJV0gWyUgRGF0YS5Wb3RlUmVzdWx0ICVdJSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSYXRlU3RhcnMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZVN0YXIiPjxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSYXRlU3RhcnMiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSYXRlU3RhcnNDb3VudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSYXRlU3RhclRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhcnMgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgib3V0IG9mIDUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUmF0ZVN0YXJzQ291bnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVmlld1JhdGluZyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJWaWV3Vm90ZXMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJWb3RlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Wb3RlcykgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Wb3RlcywgIjE4IikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiVmlld1ZvdGVzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVmlld05vVm90ZXMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJWb3RlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk5vIHZvdGVzIGZvdW5kISIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJObyB2b3RlcyBmb3VuZCEgQmUgdGhlIGZpcnN0IG9uZSB0byByYXRlIHRoaXMgRkFRIGFydGljbGUuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiVmlld05vVm90ZXMiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXSAgKFslIERhdGEuQ3JlYXRlZEJ5VXNlciAlXSk8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNoYW5nZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkNoYW5nZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0gIChbJSBEYXRhLkNoYW5nZWRCeVVzZXIgJV0pPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVZvdGluZyIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlJhdGluZyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRkFRVm90aW5nIENvbnRlbnQiIGlkPSJGQVFWb3RpbmciPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRkFRQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkhvdyBoZWxwZnVsIHdhcyB0aGlzIGFydGljbGU/IFBsZWFzZSBnaXZlIHVzIHlvdXIgcmF0aW5nIGFuZCBoZWxwIHRvIGltcHJvdmUgdGhlIEZBUSBEYXRhYmFzZS4gVGhhbmsgWW91ISIpIHwgaHRtbCAlXTwvcD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRkFRVm90ZSIgY2xhc3M9IkZBUVZvdGVGb3JtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IlJhdGVCdXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgibm90IGhlbHBmdWwiKSB8IGh0bWwgJV08L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFWb3RpbmdSYXRlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGlkPSJSYXRlQnV0dG9uWyUgRGF0YS5WYWx1ZSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZUJ1dHRvbiBSYXRlVW5DaGVja2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3Rhci1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRVm90aW5nUmF0ZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoInZlcnkgaGVscGZ1bCIpIHwgaHRtbCAlXTwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgY2xhc3M9IkNsZWFyIiAvPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiBIaWRkZW4iIGlkPSJSYXRlU3VibWl0QnV0dG9uIiBuYW1lPSJidG4iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlZvdGUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlZvdGUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRGQVFab29tIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVm90ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSJbJSBEYXRhLkNhdGVnb3J5SUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iWyUgRGF0YS5JdGVtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmF0ZSIgdmFsdWU9IiIgaWQ9IlJhdGVWYWx1ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRVm90aW5nIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBEb250UHJpbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaW5rZWQgT2JqZWN0cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBbJSBEYXRhLkNzc0NsYXNzTm9BcnRpY2xlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIGlkPSJbJSBEYXRhLk1lbnVJRCB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgWyUgRGF0YS5MaW5rUGFyYW0gJV0gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgoKICAgICAgICAgICAgPGRpdiBpZD0iRkFRQm9keSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RlZmF1bHRJdGVtIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gZGVmYXVsdCBpdGVtIGhhcyBiZWVuIHNldCB5ZXQhIFN0YXJ0IGJyb3dzaW5nIGFydGljbGVzIGluIHRoZSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50RkFRRXhwbG9yZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJGQVEgRXhwbG9yZXIiKSB8IGh0bWwgJV08L2E+LgogICAgICAgICAgICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOb0RlZmF1bHRJdGVtIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50cyIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUZBUUNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkRvd25sb2FkQXR0YWNobWVudCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRG93bmxvYWQgQXR0YWNobWVudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCB1cmkgJV07RmlsZUlEPVslIERhdGEuRmlsZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRSb3ciKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRIZWFkZXIiKSAlXQoKI1slIFJlbmRlckJsb2NrU3RhcnQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMjIFNob3cgaW5mbywgdGhhdCBsaW5rcyB3aXRoaW4gdGhlIGlmcmFtZSBtdXN0IGJlIGNsaWNrZWQgd2l0aCBzdHJnL2NtZC9zaGlmdCAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGJyb3dzZXIgYW5kIG9zKQojIyB0byBvcGVuIHRoZSBsaW5rcyBpbiBhIG5ldyB3aW5kb3cgd2l0aG91dCB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbnMgZ2l2ZW4gdG8gdGhlIGlmcmFtZQojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZBUU1lc3NhZ2VCcm93c2VyIj4KIyAgICAgICAgICAgICAgICAgICAgPHA+CiMgICAgICAgIFslIFRyYW5zbGF0ZSgiVG8gb3BlbiBsaW5rcyBpbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGJsb2NrcywgeW91IG1pZ2h0IG5lZWQgdG8gcHJlc3MgQ3RybCBvciBDbWQgb3IgU2hpZnQga2V5IHdoaWxlIGNsaWNraW5nIHRoZSBsaW5rIChkZXBlbmRpbmcgb24geW91ciBicm93c2VyIGFuZCBPUykuIikgfCBodG1sICVdCiMgICAgICAgICAgICAgICAgICAgIDwvcD4KIyAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNsb3NlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDbG9zZSB0aGlzIG1lc3NhZ2UiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPjwvYT4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJCcm93c2VyTGlua01lc3NhZ2UiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRQ29udGVudCIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgICAgIDxhIGlkPSJbJSBEYXRhLkZpZWxkICVdIj48L2E+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkJhY2tUb3AiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkJhY2sgdG8gdG9wIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2hldnJvbi11cCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuQ2FwdGlvbikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRkFRU3RhdGVOYW1lIj4oWyUgVHJhbnNsYXRlKERhdGEuU3RhdGVOYW1lKSB8IGh0bWwgJV0pPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFDb250ZW50SFRNTCIpICVdCiMgZXhlY3V0ZSBJRnJhbWUgSlMgYXN5bmNocm9ub3VzbHkuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gYmVmb3JlIG91ciBBUEkgd2FzIGxvYWRlZAojIHRoZSBmb2xsb3dpbmcgSlMgY29kZSBtdXN0IGJlIHdpdGhpbiB0aGUgdGVtcGxhdGUsIG90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4sIHRoYXQgYWxzbyB0aGlzIGNvZGUgaXRzZWxmIGlzIG5vdCBsb2FkZWQgeWV0CjxzY3JpcHQ+CmZ1bmN0aW9uIENoZWNrSUZyYW1lSGVpZ2h0KElGcmFtZUlEKSB7CiAgICBpZiAodHlwZW9mIEZBUSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIEZBUS5BZ2VudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIEZBUS5BZ2VudC5GQVFab29tID09PSAnb2JqZWN0JykgewogICAgICAgIEZBUS5BZ2VudC5GQVFab29tLklmcmFtZUF1dG9IZWlnaHQoJCgnIycgKyBJRnJhbWVJRCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDaGVja0lGcmFtZUhlaWdodChJRnJhbWVJRCk7CiAgICAgICAgfSwgNTAwKTsKICAgIH0KfQo8L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KIyBVc2UgdGhlIEhUTUw1IHNhbmRib3ggYXR0cmlidXRlIHRvIHByZXZlbnQgcGx1Z2lucyBhbmQgc2NyaXB0cyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGluIHRoZSBicm93c2VyLgojIEFwcGVuZCBzZXNzaW9uIGluZm8gdG8gVVJMIGJlY2F1c2UgSUUgd2lsbCBub3Qgc2VuZCBjb29raWVzLgojIFNldCAnYWxsb3ctcG9wdXBzJyB0byBhbGxvdyBJRTEwKyB0byBvcGVuIGxpbmtzLiByZWY6IGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvd2lraS9DaGFuZ2VQcm9wb3NhbHMvc2FuZGJveF9hbGxvd19wb3B1cHMKCiMgUm90aGVyIE9TUyAvIEFsbG93aW5nIHRvcCBuYXZpZ2F0aW9uIGZvciBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyBtcy1hbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IGFsbG93LXRvcC1uYXZpZ2F0aW9uIiBjbGFzcz0iRkFRRmllbGQiIGlkPSJJZnJhbWVGQVFbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgb25sb2FkPSJ3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCl7IENoZWNrSUZyYW1lSGVpZ2h0KCdJZnJhbWVGQVFbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXScpOyB9LCA1MDApOyIgc3JjPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRGQVFab29tO1N1YmFjdGlvbj1IVE1MVmlldztJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCBodG1sICVdO0ZpZWxkPVslIERhdGEuRmllbGQgfCBodG1sICVdO1slIEVudigiU2Vzc2lvbk5hbWUiKSB8IGh0bWwgJV09WyUgRW52KCJTZXNzaW9uSUQiKSB8IGh0bWwgJV0iPjwvaWZyYW1lPgojIEVPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFDb250ZW50SFRNTCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUNvbnRlbnRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVGQVFDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ29udGVudCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudCIpICVdCgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlua1RhYmxlQ29tcGxleCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5MaW5rVGFibGVTdHJnICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlQ29tcGxleCIpICVdCgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerFAQExplorer.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMGZkZjM2YzY4OWM2OTU3YzFlNGI5MGNmNzJlNTE5NjcxOWZkZjRiMiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQ3VzdG9tZXJGQVFFeHBsb3Jlci50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgo8ZGl2IGlkPSJvb29Db250ZW50Ij4KICAgIDxkaXYgaWQ9Im9vb0hlYWRlciI+CiMgUm90aGVyIE9TUyAtIGEgbG90IG9mIHVubWFya2VkIGNoYW5nZXMgaGVyZS4uLgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlclJvd1RpdGxlIj4KICAgICAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiRkFRIEV4cGxvcmVyIikgfCBodG1sICVdPC9oMT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXJSb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJCcmVhZENydW1iIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJGQVFFeHBsb3JlcjtDYXRlZ29yeUlEPVslIERhdGEuQ2F0ZWdvcnlJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnROb0xpbmsiKSAlXQogICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudE5vTGluayIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9Im9vb1NlYXJjaEJveCIgY2xhc3M9IkhlYWRlclJvdyBGQVFTZWFyY2hCb3giPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lckZBUUV4cGxvcmVyIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZWFyY2giLz4KCiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9J29vb2cnPgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1zZWFyY2giPjwvaT4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldoYXQiIGlkPSJvb29TZWFyY2giIHRpdGxlPSJbJSBUcmFuc2xhdGUoJ0ZBUSBTZWFyY2gnKSB8IGh0bWwgJV0iICBjbGFzcz0ib29vU2VhcmNoRkFRIi8+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J29vb1NlYXJjaExhYmVsJz5bJSBUcmFuc2xhdGUoJ0ZBUSBTZWFyY2gnKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J29vb1NlYXJjaExhYmVsJz48aSBjbGFzcz0ib29vZm8gb29vZm8tc2VhcmNoIj48L2k+IFslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXTwvc3Bhbj4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJvb29NYWluQm94IiBjbGFzcz0iRkFRQ29udGVudCI+CgogICAgWyUgRGF0YS5TaWRlQmFyICVdCgogICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUFyZWEiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3ViY2F0ZWdvcmllcyIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSZXN1bHQiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3ViY2F0ZWdvcmllcyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vU3ViQm94Ij4KIyBubyB3aGl0ZXNwYWNlL25ld2xpbmUgcmVzdWx0cyBpbiBubyB3aGl0ZXNwYWNlIGJldHdlZW4gZGlzcGxheTogaW5saW5lLWJsb2NrOyBlbGVtZW50cwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdFJvdyIpICVdPGEgY2xhc3M9Im9vb1N1YiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU3ViQ2F0ZWdvcnlDb3VudCAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJvb29TdWJDb3VudCI+WyUgRGF0YS5TdWJDYXRlZ29yeUNvdW50IHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0ib29vZyBvb29Db21tZW50Ij5bJSBUcmFuc2xhdGUoRGF0YS5Db21tZW50KSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2E+WyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0Um93IikgJV0KIyBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHRSb3ciKQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN1YmNhdGVnb3JpZXMiKSAlXQoKClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUl0ZW1MaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KWyUgSUYgRGF0YS5DYXRlZ29yeUlEID09IDAgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxhdGVzdCB1cGRhdGVkIEZBUSBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvaDI+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkZBUSBBcnRpY2xlcyIpIHwgaHRtbCAlXTwvaDI+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQYWdpbmF0aW9uIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlBhZ2luYXRpb24gb29vMTBnIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIERhdGEuUmVzdWx0IHwgaHRtbCAlXTwvc3Ryb25nPiBbJSBUcmFuc2xhdGUoIm9mIikgfCBodG1sICVdIDxzdHJvbmc+WyUgRGF0YS5Ub3RhbEhpdHMgfCBodG1sICVdPC9zdHJvbmc+IC0gWyUgVHJhbnNsYXRlKCJQYWdlIikgfCBodG1sICVdOiBbJSBEYXRhLlNpdGVOYXZCYXIgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGFnaW5hdGlvbiIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRQm94Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9GQVFEYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9Im9vb0ZBUSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiTm8gRkFRIGFydGljbGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJOb0ZBUURhdGFGb3VuZE1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZCIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0ib29vRkFRIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJGQVFab29tO0l0ZW1JRD1bJSBEYXRhLkZBUUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkljb24gJV0KICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9IlRpdGxlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9oMz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkTGFuZ3VhZ2UiKSAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJMYW5ndWFnZSBvb29nIiB0aXRsZT0iWyUgRGF0YS5MYW5ndWFnZSB8IGh0bWwgJV0iPlslIERhdGEuTGFuZ3VhZ2UgfCB0cnVuY2F0ZSg1KSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRMYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQm90dG9tU3ViTmF2aWdhdGlvbiIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQYWdpbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIERhdGEuUmVzdWx0IHwgaHRtbCAlXTwvc3Ryb25nPiBbJSBUcmFuc2xhdGUoIm9mIikgfCBodG1sICVdIDxzdHJvbmc+WyUgRGF0YS5Ub3RhbEhpdHMgfCBodG1sICVdPC9zdHJvbmc+IC0gWyUgVHJhbnNsYXRlKCJQYWdlIikgfCBodG1sICVdOiBbJSBEYXRhLlNpdGVOYXZCYXIgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQm90dG9tU3ViTmF2aWdhdGlvbiIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRSXRlbUxpc3QiKSAlXQogICAgICAgIDwvZGl2PiA8IS0tIEFydGljbGVBcmVhIC0tPgoKICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerFAQZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQ3VzdG9tZXJGQVFab29tLnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVE9CTzo6VFQ6OlNjcmlwdFVzYWdlKQoKPGRpdiBpZD0ib29vQ29udGVudCI+CgogICAgPGRpdiBpZD0ib29vSGVhZGVyIj4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgIDxkaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyUm93VGl0bGUiPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiRkFRIEV4cGxvcmVyIikgfCBodG1sICVdPC9oMT4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlclJvdyI+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJCcmVhZENydW1iIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJGQVFFeHBsb3JlcjtDYXRlZ29yeUlEPVslIERhdGEuQ2F0ZWdvcnlJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhJdGVtRWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9J29vb2cnPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9oMz4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhJdGVtRWxlbWVudCIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgIDxkaXYgaWQ9Im9vb1NlYXJjaEJveCI+CiAgICAgICAgPGRpdiBpZD0ib29vU2VhcmNoQm94IiBjbGFzcz0iSGVhZGVyUm93IEZBUVNlYXJjaEJveCI+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lckZBUUV4cGxvcmVyIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZWFyY2giLz4KCiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9J29vb2cnPgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1zZWFyY2giPjwvaT4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldoYXQiIGlkPSJvb29TZWFyY2giIHRpdGxlPSJbJSBUcmFuc2xhdGUoJ0ZBUSBTZWFyY2gnKSB8IGh0bWwgJV0iICBjbGFzcz0ib29vU2VhcmNoRkFRIi8+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J29vb1NlYXJjaExhYmVsJz5bJSBUcmFuc2xhdGUoJ0ZBUSBTZWFyY2gnKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J29vb1NlYXJjaExhYmVsJz48aSBjbGFzcz0ib29vZm8gb29vZm8tc2VhcmNoIj48L2k+IFslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXTwvc3Bhbj4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICA8ZGl2IGlkPSJvb29NYWluQm94Ij4KIwojICAgICAgICA8ZGl2IGNsYXNzPSdXaWRnZXRTaW1wbGUnPgojICAgICAgICAgICAgPGgyIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0KIyAgICAgICAgICAgIDwvaDI+CiAgICA8ZGl2IGlkPSJvb29NYWluQm94IiBjbGFzcz0iRkFRQ29udGVudCI+CgogICAgWyUgRGF0YS5TaWRlQmFyICVdCgogICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlQXJlYSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RlZmF1bHRJdGVtIikgJV0KCiAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxhIGNsYXNzPSJvb29GQVEiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lckZBUUV4cGxvcmVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGQVEgRXhwbG9yZXIiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGg0PlslIFRyYW5zbGF0ZSgiTm8gZGVmYXVsdCBpdGVtIGhhcyBiZWVuIHNldCB5ZXQhIFN0YXJ0IGJyb3dzaW5nIGFydGljbGVzIGluIHRoZSIpIHwgaHRtbCAlXSA8Yj5bJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXTwvYj48L2g0PgogICAgICAgICAgICA8L2E+CiAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGVmYXVsdEl0ZW0iKSAlXQoKICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRQm94IFslIERhdGEuQ3NzQ2xhc3NOb0FydGljbGUgfCBodG1sICVdIj4KICAgICAgICAgICAgIDxhIGNsYXNzPSJvb29GQVEgb29vRkFRSW5kZXgiIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5JY29uICVdCiAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJUaXRsZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Ikxhbmd1YWdlIG9vb2ciIHRpdGxlPSJbJSBEYXRhLkxhbmd1YWdlIHwgaHRtbCAlXSI+WyUgRGF0YS5MYW5ndWFnZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICA8L2E+CiAgICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAgICAgICAgIDx1bCBpZD0iTWVzc2FnZXMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50SGVhZGVyIikgJV0KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQ3VzdG9tZXIgVmlzaWJsZSI+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkN1c3RvbWVyIFZpc2libGUgQ29udGVudEluZGV4Ij4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnRzIikgfCBodG1sICVdOjwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBdHRhY2htZW50cyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGFwZXJjbGlwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEb3dubG9hZEF0dGFjaG1lbnQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRvd25sb2FkIEF0dGFjaG1lbnQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCB1cmkgJV07RmlsZUlEPVslIERhdGEuRmlsZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxici8+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50SGVhZGVyIikgJV0KCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCcm93c2VyTGlua01lc3NhZ2UiKSAlXQojIyBTaG93IGluZm8sIHRoYXQgbGlua3Mgd2l0aGluIHRoZSBpZnJhbWUgbXVzdCBiZSBjbGlja2VkIHdpdGggc3RyZy9jbWQvc2hpZnQgKGRlcGVuZGluZyBvbiB0aGUgdXNlZCBicm93c2VyIGFuZCBvcykKIyMgdG8gb3BlbiB0aGUgbGlua3MgaW4gYSBuZXcgd2luZG93IHdpdGhvdXQgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb25zIGdpdmVuIHRvIHRoZSBpZnJhbWUKIyAgICAgICAgICAgIDxsaT4KIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGQVFNZXNzYWdlQnJvd3NlciI+CiMgICAgICAgICAgICAgICAgICAgIDxwPgojICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIG9wZW4gbGlua3MgaW4gdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiBibG9ja3MsIHlvdSBtaWdodCBuZWVkIHRvIHByZXNzIEN0cmwgb3IgQ21kIG9yIFNoaWZ0IGtleSB3aGlsZSBjbGlja2luZyB0aGUgbGluayAoZGVwZW5kaW5nIG9uIHlvdXIgYnJvd3NlciBhbmQgT1MpLiIpIHwgaHRtbCAlXQojICAgICAgICAgICAgICAgICAgICA8L3A+CiMgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDbG9zZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2xvc2UgdGhpcyBtZXNzYWdlIikgfCBodG1sICVdIiBocmVmPSIjIj48aSBjbGFzcz0iZmEgZmEtdGltZXMiPjwvaT48L2E+CiMgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICA8L2xpPgojWyUgUmVuZGVyQmxvY2tFbmQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkN1c3RvbWVyIFZpc2libGUgQ29udGVudEluZGV4Ij4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUNvbnRlbnQiKSAlXQojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJDdXN0b21lciBWaXNpYmxlIj4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUhlYWRlciI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8aDM+WyUgVHJhbnNsYXRlKERhdGEuQ2FwdGlvbikgfCBodG1sICVdOjwvaDM+CiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IlslIERhdGEuRmllbGQgJV0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJDYXB0aW9uTGFiZWwiPlslIFRyYW5zbGF0ZShEYXRhLkNhcHRpb24pIHwgaHRtbCAlXTo8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQmFja1RvcCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQmFjayB0byB0b3AiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tdXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJ0cnVlIiBuYW1lPSJGaWVsZFN0YXRlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRQ29udGVudEhUTUwiKSAlXQojIGV4ZWN1dGUgSUZyYW1lIEpTIGFzeW5jaHJvbm91c2x5LiBPdGhlcndpc2UgaXQgY291bGQgaGFwcGVuIGJlZm9yZSBvdXIgQVBJIHdhcyBsb2FkZWQKIyB0aGUgZm9sbG93aW5nIEpTIGNvZGUgbXVzdCBiZSB3aXRoaW4gdGhlIHRlbXBsYXRlLCBvdGhlcndpc2UgaXQgY291bGQgaGFwcGVuLCB0aGF0IGFsc28gdGhpcyBjb2RlIGl0c2VsZiBpcyBub3QgbG9hZGVkIHlldAo8c2NyaXB0PgpmdW5jdGlvbiBDaGVja0lGcmFtZUhlaWdodChJRnJhbWVJRCkgewogICAgaWYgKHR5cGVvZiBGQVEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBGQVEuQ3VzdG9tZXIgPT09ICdvYmplY3QnICYmIHR5cGVvZiBGQVEuQ3VzdG9tZXIuRkFRWm9vbSA9PT0gJ29iamVjdCcpIHsKICAgICAgICBGQVEuQ3VzdG9tZXIuRkFRWm9vbS5JZnJhbWVBdXRvSGVpZ2h0KCQoJyMnICsgSUZyYW1lSUQpKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ2hlY2tJRnJhbWVIZWlnaHQoSUZyYW1lSUQpOwogICAgICAgIH0sIDUwMCk7CiAgICB9Cn0KPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUJvZHkiPgojIFVzZSB0aGUgSFRNTDUgc2FuZGJveCBhdHRyaWJ1dGUgdG8gcHJldmVudCBwbHVnaW5zIGFuZCBzY3JpcHRzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXIuCiMgQXBwZW5kIHNlc3Npb24gaW5mbyB0byBVUkwgYmVjYXVzZSBJRSB3aWxsIG5vdCBzZW5kIGNvb2tpZXMuCiMgU2V0ICdhbGxvdy1wb3B1cHMnIHRvIGFsbG93IElFMTArIHRvIG9wZW4gbGlua3MuIHJlZjogaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy93aWtpL0NoYW5nZVByb3Bvc2Fscy9zYW5kYm94X2FsbG93X3BvcHVwcwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbiAtIEFsbG93aW5nIHRvcCBuYXZpZ2F0aW9uIGZvciBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiMgICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyBtcy1hbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IiBjbGFzcz0iRkFRRmllbGQiIGlkPSJJZnJhbWVGQVFbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgb25sb2FkPSJ3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCl7IENoZWNrSUZyYW1lSGVpZ2h0KCdJZnJhbWVGQVFbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXScpOyB9LCA1MDApOyIgc3JjPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJGQVFab29tO1N1YmFjdGlvbj1IVE1MVmlldztJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCBodG1sICVdO0ZpZWxkPVslIERhdGEuRmllbGQgfCBodG1sICVdO1slIEVudigiU2Vzc2lvbk5hbWUiKSB8IGh0bWwgJV09WyUgRW52KCJTZXNzaW9uSUQiKSB8IGh0bWwgJV0iPjwvaWZyYW1lPgogICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyBtcy1hbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IGFsbG93LXRvcC1uYXZpZ2F0aW9uIiBjbGFzcz0iRkFRRmllbGQiIGlkPSJJZnJhbWVGQVFbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgb25sb2FkPSJ3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCl7IENoZWNrSUZyYW1lSGVpZ2h0KCdJZnJhbWVGQVFbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXScpOyB9LCA1MDApOyIgc3JjPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJGQVFab29tO1N1YmFjdGlvbj1IVE1MVmlldztJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCBodG1sICVdO0ZpZWxkPVslIERhdGEuRmllbGQgfCBodG1sICVdO1slIEVudigiU2Vzc2lvbk5hbWUiKSB8IGh0bWwgJV09WyUgRW52KCJTZXNzaW9uSUQiKSB8IGh0bWwgJV0iPjwvaWZyYW1lPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnRIVE1MIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRQ29udGVudFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRkFRQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudFBsYWluIikgJV0KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgICAgICAgIDwvbGk+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudCIpICVdCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgIDwvbGk+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICA8L2Rpdj4gPCEtLSBBcnRpY2xlQXJlYSAtLT4KIyBPbGQgc2lkZWJhciBIVE1MIHdhcyBjb21wbGV0ZWx5IHJlbW92ZWQKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBcmVhLVRvcCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlRPQyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QXJlYS1NaWRkbGUiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5BZGRpdGlvbmFsRGF0YSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QXJlYS1Cb3R0b20iPjwvZGl2PgogICAgICAgIDwvZGl2PgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/PublicFAQExplorer.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMGZkZjM2YzY4OWM2OTU3YzFlNGI5MGNmNzJlNTE5NjcxOWZkZjRiMiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvUHVibGljRkFRRXhwbG9yZXIudHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBpZD0ib29vQ29udGVudCI+CiAgICA8ZGl2IGlkPSJvb29IZWFkZXIiPgojIFJvdGhlciBPU1MgLSBhIGxvdCBvZiB1bm1hcmtlZCBjaGFuZ2VzIGhlcmUuLi4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXJSb3dUaXRsZSI+CiAgICAgICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXTwvaDE+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyUm93Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQnJlYWRDcnVtYiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVB1YmxpY0ZBUUV4cGxvcmVyO0NhdGVnb3J5SUQ9WyUgRGF0YS5DYXRlZ29yeUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9J29vb2cnPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudE5vTGluayIpICVdCiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9J29vb2cnPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvaDM+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50Tm9MaW5rIikgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ib29vU2VhcmNoQm94IiBjbGFzcz0iSGVhZGVyUm93IEZBUVNlYXJjaEJveCI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlB1YmxpY0ZBUUV4cGxvcmVyIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZWFyY2giLz4KCiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9J29vb2cnPgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1zZWFyY2giPjwvaT4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldoYXQiIGlkPSJvb29TZWFyY2giIHRpdGxlPSJbJSBUcmFuc2xhdGUoJ0ZBUSBTZWFyY2gnKSB8IGh0bWwgJV0iICBjbGFzcz0ib29vU2VhcmNoRkFRIi8+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J29vb1NlYXJjaExhYmVsJz5bJSBUcmFuc2xhdGUoJ0ZBUSBTZWFyY2gnKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J29vb1NlYXJjaExhYmVsJz48aSBjbGFzcz0ib29vZm8gb29vZm8tc2VhcmNoIj48L2k+IFslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXTwvc3Bhbj4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJvb29NYWluQm94IiBjbGFzcz0iRkFRQ29udGVudCI+CgogICAgWyUgRGF0YS5TaWRlQmFyICVdCgogICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUFyZWEiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3ViY2F0ZWdvcmllcyIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSZXN1bHQiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3ViY2F0ZWdvcmllcyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vU3ViQm94Ij4KIyBubyB3aGl0ZXNwYWNlL25ld2xpbmUgcmVzdWx0cyBpbiBubyB3aGl0ZXNwYWNlIGJldHdlZW4gZGlzcGxheTogaW5saW5lLWJsb2NrOyBlbGVtZW50cwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdFJvdyIpICVdPGEgY2xhc3M9Im9vb1N1YiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU3ViQ2F0ZWdvcnlDb3VudCAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJvb29TdWJDb3VudCI+WyUgRGF0YS5TdWJDYXRlZ29yeUNvdW50IHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0ib29vZyBvb29Db21tZW50Ij5bJSBUcmFuc2xhdGUoRGF0YS5Db21tZW50KSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2E+WyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0Um93IikgJV0KIyBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHRSb3ciKQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN1YmNhdGVnb3JpZXMiKSAlXQoKClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUl0ZW1MaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KWyUgSUYgRGF0YS5DYXRlZ29yeUlEID09IDAgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxhdGVzdCB1cGRhdGVkIEZBUSBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvaDI+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkZBUSBBcnRpY2xlcyIpIHwgaHRtbCAlXTwvaDI+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQYWdpbmF0aW9uIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlBhZ2luYXRpb24gb29vMTBnIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIERhdGEuUmVzdWx0IHwgaHRtbCAlXTwvc3Ryb25nPiBbJSBUcmFuc2xhdGUoIm9mIikgfCBodG1sICVdIDxzdHJvbmc+WyUgRGF0YS5Ub3RhbEhpdHMgfCBodG1sICVdPC9zdHJvbmc+IC0gWyUgVHJhbnNsYXRlKCJQYWdlIikgfCBodG1sICVdOiBbJSBEYXRhLlNpdGVOYXZCYXIgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGFnaW5hdGlvbiIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRQm94Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9GQVFEYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9Im9vb0ZBUSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiTm8gRkFRIGFydGljbGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJOb0ZBUURhdGFGb3VuZE1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZCIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0ib29vRkFRIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249UHVibGljRkFRWm9vbTtJdGVtSUQ9WyUgRGF0YS5GQVFJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JY29uICVdCiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJUaXRsZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvaDM+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZExhbmd1YWdlIikgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iTGFuZ3VhZ2Ugb29vZyIgdGl0bGU9IlslIERhdGEuTGFuZ3VhZ2UgfCBodG1sICVdIj5bJSBEYXRhLkxhbmd1YWdlIHwgdHJ1bmNhdGUoNSkgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkTGFuZ3VhZ2UiKSAlXQogICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkJvdHRvbVN1Yk5hdmlnYXRpb24iKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUGFnaW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBEYXRhLlJlc3VsdCB8IGh0bWwgJV08L3N0cm9uZz4gWyUgVHJhbnNsYXRlKCJvZiIpIHwgaHRtbCAlXSA8c3Ryb25nPlslIERhdGEuVG90YWxIaXRzIHwgaHRtbCAlXTwvc3Ryb25nPiAtIFslIFRyYW5zbGF0ZSgiUGFnZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5TaXRlTmF2QmFyICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJvdHRvbVN1Yk5hdmlnYXRpb24iKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUl0ZW1MaXN0IikgJV0KICAgICAgICA8L2Rpdj4gPCEtLSBBcnRpY2xlQXJlYSAtLT4KCiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/PublicFAQZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMzA2MTYzYmRmNTEyN2MyNjgxMWZmMWU1MDYzZGI4ODRmZjhiZjk0ZSAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvUHVibGljRkFRWm9vbS50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlRUOjpTY3JpcHRVc2FnZSkKCjxkaXYgaWQ9Im9vb0NvbnRlbnQiPgoKICAgIDxkaXYgaWQ9Im9vb0hlYWRlciI+CiMgUm90aGVyIE9TUyAtIGEgbG90IG9mIHVubWFya2VkIGNoYW5nZXMgaGVyZS4uLgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlclJvd1RpdGxlIj4KICAgICAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiRkFRIEV4cGxvcmVyIikgfCBodG1sICVdPC9oMT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXJSb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJCcmVhZENydW1iIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249UHVibGljRkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0nb29vZyc+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9oMz4KICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFQYXRoSXRlbUVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvaDM+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFQYXRoSXRlbUVsZW1lbnQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJvb29TZWFyY2hCb3giIGNsYXNzPSJIZWFkZXJSb3cgRkFRU2VhcmNoQm94Ij4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iUHVibGljRkFRRXhwbG9yZXIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCIvPgoKICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0nb29vZyc+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLXNlYXJjaCI+PC9pPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iV2hhdCIgaWQ9Im9vb1NlYXJjaCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXSIgIGNsYXNzPSJvb29TZWFyY2hGQVEiLz4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nb29vU2VhcmNoTGFiZWwnPlslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nb29vU2VhcmNoTGFiZWwnPjxpIGNsYXNzPSJvb29mbyBvb29mby1zZWFyY2giPjwvaT4gWyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdPC9zcGFuPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKCiAgICA8ZGl2IGlkPSJvb29NYWluQm94IiAgY2xhc3M9IkZBUUNvbnRlbnQiPgoKICAgIFslIERhdGEuU2lkZUJhciAlXQoKICAgIDxkaXYgY2xhc3M9IkFydGljbGVBcmVhIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vRGVmYXVsdEl0ZW0iKSAlXQoKICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGEgY2xhc3M9Im9vb0ZBUSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVB1YmxpY0ZBUUV4cGxvcmVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGQVEgRXhwbG9yZXIiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGg0PlslIFRyYW5zbGF0ZSgiTm8gZGVmYXVsdCBpdGVtIGhhcyBiZWVuIHNldCB5ZXQhIFN0YXJ0IGJyb3dzaW5nIGFydGljbGVzIGluIHRoZSIpIHwgaHRtbCAlXSA8Yj5bJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXTwvYj48L2g0PgogICAgICAgICAgICA8L2E+CiAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGVmYXVsdEl0ZW0iKSAlXQoKICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRQm94IFslIERhdGEuQ3NzQ2xhc3NOb0FydGljbGUgfCBodG1sICVdIj4KICAgICAgICAgICAgIDxhIGNsYXNzPSJvb29GQVEgb29vRkFRSW5kZXgiIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5JY29uICVdCiAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJUaXRsZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Ikxhbmd1YWdlIG9vb2ciIHRpdGxlPSJbJSBEYXRhLkxhbmd1YWdlIHwgaHRtbCAlXSI+WyUgRGF0YS5MYW5ndWFnZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICA8L2E+CiAgICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgogICAgICAgICA8YSBpZD0idG9wIj48L2E+CiAgICAgICAgICAgIDx1bCBpZD0iTWVzc2FnZXMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50SGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iUHVibGljIFZpc2libGUgQ29udGVudEluZGV4Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudHMiKSB8IGh0bWwgJV06PC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkF0dGFjaG1lbnRzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wYXBlcmNsaXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkRvd25sb2FkQXR0YWNobWVudCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRG93bmxvYWQgQXR0YWNobWVudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0l0ZW1JRD1bJSBEYXRhLkl0ZW1JRCB8IHVyaSAlXTtGaWxlSUQ9WyUgRGF0YS5GaWxlSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRIZWFkZXIiKSAlXQoKI1slIFJlbmRlckJsb2NrU3RhcnQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMjIFNob3cgaW5mbywgdGhhdCBsaW5rcyB3aXRoaW4gdGhlIGlmcmFtZSBtdXN0IGJlIGNsaWNrZWQgd2l0aCBzdHJnL2NtZC9zaGlmdCAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGJyb3dzZXIgYW5kIG9zKQojIyB0byBvcGVuIHRoZSBsaW5rcyBpbiBhIG5ldyB3aW5kb3cgd2l0aG91dCB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbnMgZ2l2ZW4gdG8gdGhlIGlmcmFtZQojICAgICAgICAgICAgPGxpPgojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZBUU1lc3NhZ2VCcm93c2VyIj4KIyAgICAgICAgICAgICAgICAgICAgPHA+CiMgICAgICAgIFslIFRyYW5zbGF0ZSgiVG8gb3BlbiBsaW5rcyBpbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGJsb2NrcywgeW91IG1pZ2h0IG5lZWQgdG8gcHJlc3MgQ3RybCBvciBDbWQgb3IgU2hpZnQga2V5IHdoaWxlIGNsaWNraW5nIHRoZSBsaW5rIChkZXBlbmRpbmcgb24geW91ciBicm93c2VyIGFuZCBPUykuIikgfCBodG1sICVdCiMgICAgICAgICAgICAgICAgICAgIDwvcD4KIyAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNsb3NlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDbG9zZSB0aGlzIG1lc3NhZ2UiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPjwvYT4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgIDwvbGk+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQnJvd3NlckxpbmtNZXNzYWdlIikgJV0KCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IlB1YmxpYyBWaXNpYmxlIENvbnRlbnRJbmRleCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUNvbnRlbnQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGlkPSJbJSBEYXRhLkZpZWxkICVdIj48L2E+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0iQ2FwdGlvbkxhYmVsIj5bJSBUcmFuc2xhdGUoRGF0YS5DYXB0aW9uKSB8IGh0bWwgJV06PC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkJhY2tUb3AiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkJhY2sgdG8gdG9wIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLXVwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJ0cnVlIiBuYW1lPSJGaWVsZFN0YXRlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRQ29udGVudEhUTUwiKSAlXQojIGV4ZWN1dGUgSUZyYW1lIEpTIGFzeW5jaHJvbm91c2x5LiBPdGhlcndpc2UgaXQgY291bGQgaGFwcGVuIGJlZm9yZSBvdXIgQVBJIHdhcyBsb2FkZWQKIyB0aGUgZm9sbG93aW5nIEpTIGNvZGUgbXVzdCBiZSB3aXRoaW4gdGhlIHRlbXBsYXRlLCBvdGhlcndpc2UgaXQgY291bGQgaGFwcGVuLCB0aGF0IGFsc28gdGhpcyBjb2RlIGl0c2VsZiBpcyBub3QgbG9hZGVkIHlldAo8c2NyaXB0PgpmdW5jdGlvbiBDaGVja0lGcmFtZUhlaWdodChJRnJhbWVJRCkgewogICAgaWYgKHR5cGVvZiBGQVEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBGQVEuQ3VzdG9tZXIgPT09ICdvYmplY3QnICYmIHR5cGVvZiBGQVEuQ3VzdG9tZXIuRkFRWm9vbSA9PT0gJ29iamVjdCcpIHsKICAgICAgICBGQVEuQ3VzdG9tZXIuRkFRWm9vbS5JZnJhbWVBdXRvSGVpZ2h0KCQoJyMnICsgSUZyYW1lSUQpKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ2hlY2tJRnJhbWVIZWlnaHQoSUZyYW1lSUQpOwogICAgICAgIH0sIDUwMCk7CiAgICB9Cn0KPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUJvZHkiPgojIFVzZSB0aGUgSFRNTDUgc2FuZGJveCBhdHRyaWJ1dGUgdG8gcHJldmVudCBwbHVnaW5zIGFuZCBzY3JpcHRzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXIuCiMgQXBwZW5kIHNlc3Npb24gaW5mbyB0byBVUkwgYmVjYXVzZSBJRSB3aWxsIG5vdCBzZW5kIGNvb2tpZXMuCiMgU2V0ICdhbGxvdy1wb3B1cHMnIHRvIGFsbG93IElFMTArIHRvIG9wZW4gbGlua3MuIHJlZjogaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy93aWtpL0NoYW5nZVByb3Bvc2Fscy9zYW5kYm94X2FsbG93X3BvcHVwcwoKIyBSb3RoZXIgT1NTIC8gQWxsb3dpbmcgdG9wIG5hdmlnYXRpb24gZm9yIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgbXMtYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy10b3AtbmF2aWdhdGlvbiIgY2xhc3M9IkZBUUZpZWxkIiBpZD0iSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIG9ubG9hZD0id2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpeyBDaGVja0lGcmFtZUhlaWdodCgnSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0nKTsgfSwgNTAwKTsiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVB1YmxpY0ZBUVpvb207U3ViYWN0aW9uPUhUTUxWaWV3O0l0ZW1JRD1bJSBEYXRhLkl0ZW1JRCB8IGh0bWwgJV07RmllbGQ9WyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iPjwvaWZyYW1lPgojIEVPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnRIVE1MIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRQ29udGVudFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRkFRQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudFBsYWluIikgJV0KClslIFJlbmRlckJsb2NrRW5kKCJGQVFDb250ZW50IikgJV0KICAgICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8L2Rpdj4gPCEtLSBBcnRpY2xlQXJlYSAtLT4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0Q29sdW1uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QXJlYS1Ub3AiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5UT0MgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFyZWEtTWlkZGxlIj4KICAgICAgICAgICAgICAgIFslIERhdGEuQWRkaXRpb25hbERhdGEgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFyZWEtQm90dG9tIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KPCEtLQogICAgICAgICAgICA8ZGl2IGlkPSJab29tU2lkZWJhciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDM+WyUgVHJhbnNsYXRlKCJGQVEgSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHVsIGlkPSJNZXRhZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiQXJ0aWNsZSBOdW1iZXIiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3Bhbj5bJSBEYXRhLk51bWJlciB8IGh0bWwgJV08L3NwYW4+PC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKCJDYXRlZ29yeSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DYXRlZ29yeU5hbWUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQ2F0ZWdvcnlOYW1lKSB8IGh0bWwgJV08L3NwYW4+PC9saT4KCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJLZXl3b3Jkc0NvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiS2V5d29yZHMiKSB8IGh0bWwgJV06PC9zcGFuPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJLZXl3b3JkcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJLZXl3b3JkIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWFyY2ggZm9yIGFydGljbGVzIHdpdGgga2V5d29yZCIpIHwgaHRtbCAlXTogWyUgRGF0YS5LZXl3b3JkIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249UHVibGljRkFRRXhwbG9yZXI7U3ViYWN0aW9uPVNlYXJjaDtLZXl3b3JkPVslIERhdGEuS2V5d29yZCB8IHVyaSAlXSI+WyUgRGF0YS5LZXl3b3JkIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiS2V5d29yZHMiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiTGFuZ3VhZ2UiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGFuZ3VhZ2UiKSAlXQoKIyBzaG93IGZhcSBkeW5hbWljIGZpZWxkcwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRRHluYW1pY0ZpZWxkIikgJV0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgIDxsaT4KIyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlMSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgPC9saT4KI1slIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgIDxsaT4KIyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlMiB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgPC9saT4KI1slIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRfRmllbGQyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlZpZXdSYXRpbmciKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSBSYXRpbmdMYWJlbCI+WyUgVHJhbnNsYXRlKCJSYXRpbmciKSB8IGh0bWwgJV06PC9zcGFuPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSYXRlU3RhcnMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZVN0YXIiPjxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmF0ZVN0YXJzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmF0ZVN0YXJzQ291bnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZVN0YXJUZXh0IiB0aXRsZT0iWyUgRGF0YS5TdGFycyB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCJvdXQgb2YgNSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXJzIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIm91dCBvZiA1IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJhdGVTdGFyc0NvdW50IikgJV0KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiVmlld1JhdGluZyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJWaWV3Vm90ZXMiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlZvdGVzIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuVm90ZXMgfCBodG1sICVdIj5bJSBEYXRhLlZvdGVzIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiVmlld1ZvdGVzIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgotLT4KICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentFAQExplorer.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogIC0gMGZkZjM2YzY4OWM2OTU3YzFlNGI5MGNmNzJlNTE5NjcxOWZkZjRiMiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRGQVFFeHBsb3Jlci50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBGQVEiPgogICAgPGRpdiBjbGFzcz0iQ2xlYXJMZWZ0Ij48L2Rpdj4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXTwvaDE+CgogICAgPHVsIGNsYXNzPSJCcmVhZENydW1iIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdCiAgICAgICAgPGxpPgogICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRGQVFFeHBsb3JlcjtDYXRlZ29yeUlEPVslIERhdGEuQ2F0ZWdvcnlJRCB8IHVyaSAlXTtOYXY9WyUgRGF0YS5OYXYgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdCiAgICAgICAgICAgIDwvYT4KICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnROb0xpbmsiKSAlXQogICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudE5vTGluayIpICVdCgogICAgPC91bD4KCiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgojIFJvdGhlciBPU1MKICAgIDxkaXYgY2xhc3M9IkxheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIFslIERhdGEuU2lkZUJhciAlXQogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KIyBFTwoKICAgIDxkaXYgY2xhc3M9IkxheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyTGFzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiBbJSBEYXRhLlNpZGViYXJDbGFzcyB8IGh0bWwgJV0iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUXVpY2tTZWFyY2giKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDM+WyUgVHJhbnNsYXRlKCJTZWFyY2giKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25saXN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9IlNlYXJjaEJveCIgYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIERhdGEuQWN0aW9uIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik5hdiIgdmFsdWU9IlslIERhdGEuTmF2IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJGdWxsdGV4dCIgdmFsdWU9IlslIERhdGEuU2VhcmNoIHwgaHRtbCAlXSIgaWQ9IlNlYXJjaCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VhcmNoIikgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNlYXJjaCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zZWFyY2giPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUXVpY2sgU2VhcmNoIikgfCBodG1sICVdPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJXaWxkY2FyZHMgYXJlIGFsbG93ZWQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhICBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGQVFTZWFyY2hCdXR0b24gU3BhY2luZ1RvcCIgaWQ9IlslIERhdGEuQWN0aW9uIHwgdXJpICVdIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRGF0YS5BY3Rpb24gfCB1cmkgJV07TmF2PVslIERhdGEuTmF2IHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXNlYXJjaCI+PC9pPiBbJSBUcmFuc2xhdGUoIkFkdmFuY2VkIFNlYXJjaCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJRdWlja1NlYXJjaCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmZvQm94RkFRTWluaUxpc3QiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuSGVhZGVyKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IlRhYmxlbGlrZSBGQVFNaW5pTGlzdCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkluZm9Cb3hGQVFNaW5pTGlzdEl0ZW1Sb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmZvQm94RkFRTWluaUxpc3RJdGVtUm93UG9zaXRpb25OdW1iZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OdW1iZXIgfCBodG1sICVdLgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5mb0JveEZBUU1pbmlMaXN0SXRlbVJvd1Bvc2l0aW9uTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRGQVFab29tO0l0ZW1JRD1bJSBEYXRhLkl0ZW1JRCB8IHVyaSAlXTtOYXY9WyUgRGF0YS5OYXYgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSAoWyUgRGF0YS5DYXRlZ29yeU5hbWUgfCBodG1sICVdKSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DYXRlZ29yeVNob3J0TmFtZSB8IHRydW5jYXRlKDE1KSB8IGh0bWwgJV0gLSBbJSBEYXRhLkxhbmd1YWdlIHwgaHRtbCAlXSAtIFslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV0gLSBbJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5mb0JveEZBUU1pbmlMaXN0SXRlbVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9Cb3hGQVFNaW5pTGlzdCIpICVdCgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdWJjYXRlZ29yaWVzIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3ViY2F0ZWdvcmllcyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSIgc3VtbWFyeT0iRkFRIGNhdGVnb3JpZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJTdWJjYXRlZ29yaWVzIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiRkFRIEFydGljbGVzIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIHN1YmNhdGVnb3JpZXMgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSZXN1bHRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGNsYXNzPSJBc0Jsb2NrIE1hc3RlckFjdGlvbkxpbmsiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0NhdGVnb3J5SUQ9WyUgRGF0YS5DYXRlZ29yeUlEIHwgdXJpICVdO05hdj1bJSBEYXRhLk5hdiB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5Db21tZW50KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5TdWJDYXRlZ29yeUNvdW50IHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkFydGljbGVDb3VudCB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHQiKSAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTdWJjYXRlZ29yaWVzIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUl0ZW1MaXN0IikgJV0KWyUgRGF0YS5GQVFJdGVtTGlzdEhUTUwgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUl0ZW1MaXN0IikgJV0KCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4K</File>
        <File Location="Kernel/Output/HTML/Templates/Standard/AgentFAQSidebar.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkZBUSBTaWRlYmFyIFNldHRpbmdzIikgfCBodG1sICVdPC9oMT4KCiAgICBbJSBCcmVhZGNydW1iUGF0aCA9IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGUoJ0ZBUSBTaWRlYmFyIFNldHRpbmdzJyksCiAgICAgICAgICAgICAgICBMaW5rID0+IEVudigiQWN0aW9uIiksCiAgICAgICAgICAgIH0sCiAgICAgICAgXQogICAgJV0KCiAgICBbJSBJRiBEYXRhLkludGVyZmFjZSAhPSAiIiAlXQogICAgICAgIFslIFVTRSBFZGl0VGl0bGUgPSBTdHJpbmcoVHJhbnNsYXRlKCJTZXR0aW5ncyBmb3IiKSkgJV0KICAgICAgICBbJSBCcmVhZGNydW1iUGF0aC5wdXNoKHsgTmFtZSA9PiBFZGl0VGl0bGUuYXBwZW5kKCAnICcsIFRyYW5zbGF0ZSgiSW50ZXJmYWNlIiksICcgOicsIERhdGEuSW50ZXJmYWNlLCAnLCAnICwgVHJhbnNsYXRlKCJMYW5ndWFnZSIpLCAnOiAnLCAgRGF0YS5TaWRlYmFyTGFuZ3VhZ2UpIH0pICVdCiAgICBbJSBFTkQgJV0KCiAgICBbJSBJTkNMVURFICJCcmVhZGNydW1iLnR0IiBQYXRoID0gQnJlYWRjcnVtYlBhdGggVHlwZSA9ICJBZ2VudCIgJV0KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25MYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgaWQ9IkxhbmdTZWxlY3Rpb24iIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDaGFuZ2UiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50ZXJmYWNlIj5bJSBUcmFuc2xhdGUoIkludGVyZmFjZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJEcm9wZG93blNwYWNpbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW50ZXJmYWNlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkludGVyZmFjZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlVzZXJMYW5ndWFnZXMiPlslIFRyYW5zbGF0ZSgiTGFuZ3VhZ2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRHJvcGRvd25TcGFjaW5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNpZGViYXJMYW5ndWFnZXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2lkZWJhckxhbmd1YWdlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciBCdG5FZGl0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNvZyI+PC9pPlslIFRyYW5zbGF0ZSgiTG9hZCBTZXR0aW5ncyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uTGFuZ3VhZ2UiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uT3ZlcnZpZXciKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWxlZnQiPjwvaT5bJSBUcmFuc2xhdGUoIkdvIHRvIG92ZXJ2aWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uT3ZlcnZpZXciKSAlXQoKICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uTGlzdCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWx0ZXIiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+PGxhYmVsIGZvcj0iRmlsdGVyIj5bJSBUcmFuc2xhdGUoIkZpbHRlciBmb3IgU2V0dGluZ3MiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlciIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBTZXR0aW5ncyIpIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGaWx0ZXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGludE92ZXJ2aWV3IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiSGludCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJMYXVuY2ggdGhlIEFkZC9FZGl0IFNpZGViYXIgU2V0dGluZ3Mgc2NyZWVuIGJ5IHNlbGVjdGluZzoiKSB8IGh0bWwgJV08YnI+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIFNpZGVCYXJFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxiPlslIFRyYW5zbGF0ZSgiSW50ZXJmYWNlIikgfCBodG1sICVdOjwvYj4gWyUgVHJhbnNsYXRlKCJPVE9CTyBpbnRlcmZhY2Ugd2hlcmUgdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQuIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+PGI+WyUgVHJhbnNsYXRlKCJMYW5ndWFnZSIpIHwgaHRtbCAlXTo8L2I+IFslIFRyYW5zbGF0ZSgiVXNlcidzIGxhbmd1YWdlIGluIHRoZSBPVE9CTyBpbnRlcmZhY2UuIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhpbnRPdmVydmlldyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIaW50IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiSGludCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDb25maWd1cmUgdGhlIHNpZGViYXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gdGhlIE9UT0JPIGxhbmd1YWdlIGFuZCBpbnRlcmZhY2U6IikgfCBodG1sICVdPGJyPgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiBTaWRlQmFyRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxsaT48Yj5bJSBUcmFuc2xhdGUoIkludGVyZmFjZSIpIHwgaHRtbCAlXTo8L2I+IFslIFRyYW5zbGF0ZSgiT1RPQk8gaW50ZXJmYWNlIHdoZXJlIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkLiIpIHwgaHRtbCAlXTwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxiPlslIFRyYW5zbGF0ZSgiTGFuZ3VhZ2UiKSB8IGh0bWwgJV06PC9iPiBbJSBUcmFuc2xhdGUoIlVzZXIncyBsYW5ndWFnZSBpbiB0aGUgT1RPQk8gaW50ZXJmYWNlLiIpIHwgaHRtbCAlXTwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxiPlslIFRyYW5zbGF0ZSgiRGVmYXVsdCBGQVEgSXRlbSIpIHwgaHRtbCAlXTo8L2I+IFslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoZSBkZWZhdWx0IGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgem9vbSB2aWV3IHdoZW4gdGhlIEZBUSBsb2Fkcy4iKSB8IGh0bWwgJV08L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT48Yj5bJSBUcmFuc2xhdGUoIkN1c3RvbSBHcm91cCBPcmRlciIpIHwgaHRtbCAlXTo8L2I+IFslIFRyYW5zbGF0ZSgiRGVmaW5lIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgcXVpY2sgbGluayBncm91cHMgaW4gdGhlIEZBUSB3aWxsIGJlIGRpc3BsYXllZC4iKSB8IGh0bWwgJV08L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT48Yj5bJSBUcmFuc2xhdGUoIlF1aWNrc3RhcnQgTGlua3MiKSB8IGh0bWwgJV06PC9iPiBbJSBUcmFuc2xhdGUoIkRlZmluaXRpb24gb2YgdGhlIGxpbmtzIHRvIHRoZSBGQVEgYXJ0aWNsZXMuIFRoZXkgbXVzdCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIkluIHRoZSB0ZXh0IGZpZWxkOiBOYW1lIG9mIHRoZSBncm91cCB0byBjb25zb2xpZGF0ZSB0aGUgbGlua3MuIFVwIHRvIHR3byBsZXZlbHMgb2YgZGVwdGggY2FuIGJlIGRlZmluZWQuIFVzZSB0aGUgc3ludGF4IFwiR3JvdXA6OlN1Ymdyb3VwXCIgd2hlbiBkZWZpbmluZyBzdWJncm91cHMuIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIkZBUSBBcnRpY2xlOiBTZWxlY3QgdGhlIEZBUSBhcnRpY2xlIGZyb20gdGhlIGxpc3QgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgc2lkZWJhci4iKSB8IGh0bWwgJV08L2k+PC9iPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxicj48Yj5bJSBUcmFuc2xhdGUoIk5vdGUiKSB8IGh0bWwgJV06PC9iPiBbJSBUcmFuc2xhdGUoIlRoZSBcIlJlc2V0IHNldHRpbmdzXCIgYnV0dG9uIG9ubHkgYXBwbGllcyB0byB0aGUgc2V0dGluZ3MgY3VycmVudGx5IGJlaW5nIGVkaXRlZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJIaW50IikgJV0KCjwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaXN0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIiBpZD0iU2V0dGluZ3MiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiSW50ZXJmYWNlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkxhbmd1YWdlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkRlZmF1bHQgRkFRIEl0ZW0iKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuSW50ZXJmYWNlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkludGVyZmFjZSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXSI+PGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1DaGFuZ2U7SW50ZXJmYWNlPVslIERhdGEuSW50ZXJmYWNlIHwgdXJpICVdO1NpZGViYXJMYW5ndWFnZT1bJSBEYXRhLkxhbmd1YWdlIHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYW5ndWFnZURlc2NyaXB0aW9uKSB8IGh0bWwgJV08L2E+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB0aXRsZT0iWyUgRGF0YS5GQVFUaXRsZSB8IGh0bWwgJV0iPjxhIGNsYXNzPSJBc0Jsb2NrIiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9WyUgRGF0YS5EZWZhdWx0SXRlbUlEIHwgdXJpICVdIj5bJSBEYXRhLkZBUVRpdGxlIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3VXBkYXRlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyIikgJV0KCiAgICAgICAgICAgIFslIElGIERhdGEuQWN0aW9uID09ICJFZGl0IiAlXQogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRWRpdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIFslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyIikgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiIGlkPSJTaWRlYmFyU2V0dGluZ3MiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSIgaWQ9IlNpZGViYXJTZXR0aW5nc0Zvcm0iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIGlkPSJTdWJhY3Rpb24iIHZhbHVlPSJDaGFuZ2VBY3Rpb24iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbnRlcmZhY2UiIHZhbHVlPSJbJSBEYXRhLkludGVyZmFjZSB8IHVyaSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNvbmZpZ0lEIiAgdmFsdWU9IlslIERhdGEuQ29uZmlnSUQgfCB1cmkgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlQ291bnQiIGlkPSJBcnRpY2xlQ291bnQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVDb3VudCB8IHVyaSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkN1c3RvbUdyb3VwT3JkZXIiIGlkPSJDdXN0b21Hcm91cE9yZGVyIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21Hcm91cE9yZGVyIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkludGVyZmFjZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJJbnRlcmZhY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkludGVyZmFjZSIgaWQ9IkludGVyZmFjZSIgdmFsdWU9IlslIERhdGEuSW50ZXJmYWNlIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiBtYXhsZW5ndGg9IjUwIiByZWFkb25seSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSW50ZXJmYWNlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJMYW5ndWFnZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJMYW5ndWFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTGFuZ3VhZ2UiIGlkPSJMYW5ndWFnZSIgdmFsdWU9IlslIERhdGEuTGFuZ3VhZ2UgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQiIG1heGxlbmd0aD0iNTAiIHJlYWRvbmx5IC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJMYW5ndWFnZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iRGVmYXVsdEl0ZW1JRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJEZWZhdWx0IEZBUSBJdGVtIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRGVmYXVsdEl0ZW1JRFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlZmF1bHRJdGVtSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkN1c3RvbUdyb3VwT3JkZXIiPlslIFRyYW5zbGF0ZSgiQ3VzdG9tIEdyb3VwIE9yZGVyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik9wdGlvbkxpc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBpZD0iSXRlbUxpc3QiIGNsYXNzPSJMaXN0Q29udGFpbmVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tR3JvdXBPcmRlckl0ZW1zIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJMaXN0SXRlbSIgZGF0YS1pZD0iWyUgRGF0YS5PcmRlciB8IGh0bWwgJV0iPlslIERhdGEuQ29udGVudCB8IGh0bWwgJV08L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tR3JvdXBPcmRlckl0ZW1zIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJPcmRlckJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FsbEZvckFjdGlvbiIgaWQ9ImJ0blVwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYXJldC11cCI+PC9pPiBbJSBUcmFuc2xhdGUoIk1vdmUgVXAiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiBpZD0iYnRuRG93biI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPiBbJSBUcmFuc2xhdGUoIk1vdmUgRG93biIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSb3dBcnRpY2xlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db3VudCA9PSAiMSIgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFydGljbGVfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiUXVpY2tzdGFydCBMaW5rcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBcnRpY2xlX1slIERhdGEuQ291bnQgfCBodG1sICVdIj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgQXJyYXlJdGVtIiBpZD0iRmllbGRfQXJ0aWNsZV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQXJ0aWNsZV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgaWQ9IkFydGljbGVfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLkNvbnRlbnQgfCBodG1sICVdIiBjbGFzcz0iVzI1cGMgVmFsaWRhdGVfUmVxdWlyZWQiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFydGljbGVfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkl0ZW1JRFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ikl0ZW1JRF9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuQ291bnQgPiAxICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSIgdHlwZT0iYnV0dG9uIiBpZD0iQnRuQXJ0aWNsZV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1jaXJjbGUiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jvd0FydGljbGUiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQnRuQWRkRW50cnkiPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdmFsdWU9IlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBlbnRyeSIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBlbnRyeSIpIHwgaHRtbCAlXSIgdHlwZT0iYnV0dG9uIiBpZD0iQnRuQWRkRW50cnkiIGNsYXNzPSJBZGRCdXR0b24iIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wbHVzLWNpcmNsZSI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBlbnRyeSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9ImJ1dHRvbiIgaWQ9IkJ0blJlc2V0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJSZXNldCBTZXR0aW5nIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlJlc2V0IFNldHRpbmciKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdP0FjdGlvbj1BZ2VudEZBUVNpZGViYXIiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZVRlbXBsYXRlIEhpZGRlbiIgaWQ9IkFydGljbGVUZW1wbGF0ZSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBcnRpY2xlX05leHRJRCI+PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEFycmF5SXRlbSIgaWQ9IkZpZWxkX0FydGljbGVfTmV4dElEIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQXJ0aWNsZV9OZXh0SUQiIGlkPSJBcnRpY2xlX05leHRJRCIgdmFsdWU9IiIgY2xhc3M9IlcyNXBjIFZhbGlkYXRlX1JlcXVpcmVkIi8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQXJ0aWNsZV9OZXh0SURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkl0ZW1OZXh0SURTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSXRlbUlEX05leHRJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdmFsdWU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIiB0eXBlPSJidXR0b24iIGlkPSJCdG5BcnRpY2xlX05leHRJRCIgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtY2lyY2xlIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3VXBkYXRlIikgJV0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==</File>
        <File Location="Kernel/Output/HTML/Layout/FAQExtendedNavigation.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ6OkZBUUV4dGVuZGVkTmF2aWdhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBNSU1FOjpCYXNlNjQgICAgICAgICAgICAgICAgICBxdyhkZWNvZGVfYmFzZTY0IGVuY29kZV9iYXNlNjQpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpGQVEnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OjpGQVFFeHRlbmRlZE5hdmlnYXRpb24gLSBhbGwgRkFRRXh0ZW5kZWROYXZpZ2F0aW9uLXJlbGF0ZWQgSFRNTCBmdW5jdGlvbnMKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIEZBUUV4dGVuZGVkTmF2aWdhdGlvbi1yZWxhdGVkIEhUTUwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIEZBUVNpZGVCYXIoKQoKU2hvd3MgYSBzaWRlIGJhciB0byBxdWljayBvcGVuIEZBUSBhcnRpY2xlcy4KCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFTaWRlQmFyKAogICAgICAgIE1vZGUgICAgICAgICAgICA9PiAnUHVibGljJywgICAgICAgICAgICAgICAgICAgIyAoQWdlbnQsIEN1c3RvbWVyLCBQdWJsaWMpCiAgICAgICAgTGFuZ3VhZ2UgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSwKICAgICAgICBJbnRlcmZhY2UgICAgICAgPT4gJFNlbGYtPntJbnRlcmZhY2V9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGQVFTaWRlQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhNb2RlIExhbmd1YWdlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtTmFtZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRQYXJhbU5hbWUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG1vZGUKICAgIGlmICggJFBhcmFte01vZGV9ICF+IG17IEFnZW50IHwgQ3VzdG9tZXIgfCBQdWJsaWMgfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01vZGUgbXVzdCBiZSBlaXRoZXIgQWdlbnQsIEN1c3RvbWVyIG9yIFB1YmxpYyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgc2lkZWJhciBpcyBlbmFibGVkCiAgICBteSAkSXNBY3RpdmUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUVNpZGVCYXI6OiRQYXJhbXtNb2RlfTo6RW5hYmxlZCIpIHx8ICdObyc7CgogICAgI1NldCBab29tIEFjdGlvbgogICAgbXkgJFpvb21BY3Rpb24gPSAoICRQYXJhbXtNb2RlfSBlcSAnQWdlbnQnICkgPyAnQWdlbnRGQVFab29tJyA6CiAgICAgICAgKCAkUGFyYW17TW9kZX0gZXEgJ0N1c3RvbWVyJyApID8gJ0N1c3RvbWVyRkFRWm9vbScgOgogICAgICAgICggJFBhcmFte01vZGV9IGVxICdQdWJsaWMnICkgICA/ICdQdWJsaWNGQVFab29tJyA6ICcnOwoKICAgICNTZXQgSG9tZSBBY3Rpb24KICAgICRQYXJhbXtIb21lQWN0aW9ufSA9ICggJFBhcmFte01vZGV9IGVxICdBZ2VudCcgKSA/ICdBZ2VudEZBUVpvb20nIDoKICAgICAgICAoICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInICkgPyAnQ3VzdG9tZXJGQVFab29tJyA6CiAgICAgICAgKCAkUGFyYW17TW9kZX0gZXEgJ1B1YmxpYycgKSAgID8gJ1B1YmxpY0ZBUVpvb20nIDogJyc7CgogICAgI1NldCBFeHBsb3JlciBBY3Rpb24KICAgICRQYXJhbXtFeHBsb3JlckFjdGlvbn0gPSAoICRQYXJhbXtNb2RlfSBlcSAnQWdlbnQnICkgPyAnQWdlbnRGQVFFeHBsb3JlcicgOgogICAgICAgICggJFBhcmFte01vZGV9IGVxICdDdXN0b21lcicgKSA/ICdDdXN0b21lckZBUUV4cGxvcmVyJyA6CiAgICAgICAgKCAkUGFyYW17TW9kZX0gZXEgJ1B1YmxpYycgKSAgID8gJ1B1YmxpY0ZBUUV4cGxvcmVyJyA6ICcnOwoKICAgICNSZWRpcmVjdCBzY3JlZW4KICAgIGlmICggJFBhcmFte01vZGV9IGVxICdDdXN0b21lcicgKSB7CiAgICAgICAgJFpvb21BY3Rpb24gPSAkUGFyYW17QWN0aW9ufSBlcSAnQ3VzdG9tZXJGQVFFeHBsb3JlcicgPyAnQ3VzdG9tZXJGQVFab29tJyA6ICRQYXJhbXtBY3Rpb259OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TW9kZX0gZXEgJ1B1YmxpYycgKSB7CiAgICAgICAgJFpvb21BY3Rpb24gPSAkUGFyYW17QWN0aW9ufSBlcSAnUHVibGljRkFRRXhwbG9yZXInID8gJ1B1YmxpY0ZBUVpvb20nIDogJFBhcmFte0FjdGlvbn07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtNb2RlfSBlcSAnQWdlbnQnICkgewogICAgICAgICRab29tQWN0aW9uID0gJFBhcmFte0FjdGlvbn0gZXEgJ0FnZW50RkFRRXhwbG9yZXInID8gJ0FnZW50RkFRWm9vbScgOiAkUGFyYW17QWN0aW9ufTsKICAgIH0KCiAgICBteSAkRXhwYW5kID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVFTaWRlQmFyOjpFeHBhbmRTdWJjYXRlZ29yaWVzJyk7CgogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnRXhwYW5kU3ViY2F0ZWdvcmllcycsCiAgICAgICAgVmFsdWUgPT4gJEV4cGFuZCwKICAgICk7CgogICAgIyBnZXQgdGhlIHZhbGlkIGlkcwogICAgbXkgQFZhbGlkSURzICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKICAgIG15ICVWYWxpZElETG9va3VwID0gbWFwIHsgJF8gPT4gMSB9IEBWYWxpZElEczsKCiAgICBteSAkU2lkZWJhckluaXQgPSAwOwogICAgJFBhcmFte0lzRGVmYXVsdEFydGljbGV9ICB8fD0gMDsKICAgICRQYXJhbXtIYXNEZWZhdWx0QXJ0aWNsZX0gfHw9IDA7CgogICAgaWYgKCAkSXNBY3RpdmUgZXEgJ1llcycgKSB7CiAgICAgICAgbXkgJURhdGEgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoIiRQYXJhbXtNb2RlfUZBUVNpZGVCYXI6OkFydGljbGVzIikgfTsKCiAgICAgICAgQ09ORklHOgogICAgICAgIGZvciBteSAkQ29uZmlnICgga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgbmV4dCBDT05GSUcgaWYgJERhdGF7JENvbmZpZ30tPntMYW5ndWFnZX0gbmUgJFBhcmFte0xhbmd1YWdlfTsKCiAgICAgICAgICAgIG15IEBBcnRpY2xlRGF0YSA9IEB7ICREYXRheyRDb25maWd9LT57IkFydGljbGVzIn0gfTsKICAgICAgICAgICAgbXkgQEdyb3VwcyAgICAgID0gbWFwIHsgL14oLis/KTo6LzsgJDEgfSBAQXJ0aWNsZURhdGE7CgogICAgICAgICAgICBpZiAoICREYXRheyRDb25maWd9LT57IkN1c3RvbUdyb3VwT3JkZXIifSApIHsgICAgIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVE9CTzo6UGVybDo6UGVybENyaXRpYykKICAgICAgICAgICAgICAgIEBHcm91cHMgPSBzcGxpdCAvXCwvLCAkRGF0YXskQ29uZmlnfS0+eyJDdXN0b21Hcm91cE9yZGVyIn07CiAgICAgICAgICAgICAgICBAR3JvdXBzID0gbWFwIHtzL15ccyt8XHMrJC8vZ3J9IEBHcm91cHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVOZXN0ZWQ7CiAgICAgICAgICAgIG15ICRFeHBhbmRMZXZlbE5hbWUgPSAnJzsKCiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQEFydGljbGVEYXRhKSB7CiAgICAgICAgICAgICAgICBteSBARWxlbWVudCA9IHNwbGl0IC86Oi8sICRJdGVtOwogICAgICAgICAgICAgICAgbXkgJERhdGEgICAgPSBcJU5lc3RlZDsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJEZBUUl0ZW0gKEBFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGEgPSAkRGF0YS0+eyRGQVFJdGVtfSB8fD0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRQcm9jZXNzTGV2ZWw7CiAgICAgICAgICAgICRQcm9jZXNzTGV2ZWwgPSBzdWIgewoKICAgICAgICAgICAgICAgIG15ICggJEhhc2hSZWYsICRMZXZlbE5hbWUgKSA9IEBfOwogICAgICAgICAgICAgICAgcmV0dXJuIGlmICEkSGFzaFJlZiB8fCByZWYgJEhhc2hSZWYgbmUgJ0hBU0gnOwoKICAgICAgICAgICAgICAgIGlmICggJEhhc2hSZWYtPnsgJFBhcmFte0l0ZW1JRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXhwYW5kTGV2ZWxOYW1lID0gJExldmVsTmFtZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBJVEVNOgogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskSGFzaFJlZn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1cnJlbnROb2RlID0gJEhhc2hSZWYtPnskS2V5fTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCBrZXlzICV7JEN1cnJlbnROb2RlfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdIZWFkZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkTmVzdGVkeyRLZXl9ID8gJ29vb0ZBUVNpZGViYXJIZWFkZXInIDogJ29vb0ZBUVNpZGViYXJTdWJIZWFkZXIgQ29sbGFwc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJvdyAgICAgICA9PiAkTmVzdGVkeyRLZXl9ID8gJycgICAgICAgICAgICAgICAgICAgIDogJzxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCBvb29JY29uU3ViSGVhZGVyIj48L2k+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJjYXRlZ29yeSA9PiAkS2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkUHJvY2Vzc0xldmVsLT4oICRDdXJyZW50Tm9kZSwgJEtleSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEl0ZW1JRCA9ICRLZXk7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAlRkFRRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKS0+RkFRR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTSBpZiAha2V5cyAlRkFRRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte01vZGV9IG5lICdQdWJsaWMnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdXNlciBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKS0+Q2hlY2tDYXRlZ29yeUN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICA9PiAkRkFRRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBpbnRlcmZhY2Ugc3RhdGUgbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEludGVyZmFjZVN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKS0+U3RhdGVUeXBlTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OiRQYXJhbXtNb2RlfTo6U3RhdGVUeXBlcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEkUGVybWlzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEkRkFRRGF0YXtBcHByb3ZlZH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhJFZhbGlkSURMb29rdXB7ICRGQVFEYXRhe1ZhbGlkSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhJEludGVyZmFjZVN0YXRlcy0+eyAkRkFRRGF0YXtTdGF0ZVR5cGVJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IElURU07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBpbnRlcmZhY2Ugc3RhdGUgbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEludGVyZmFjZVN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKS0+U3RhdGVUeXBlTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlB1YmxpYzo6U3RhdGVUeXBlcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISRGQVFEYXRhe0FwcHJvdmVkfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEkVmFsaWRJRExvb2t1cHsgJEZBUURhdGF7VmFsaWRJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEkSW50ZXJmYWNlU3RhdGVzLT57ICRGQVFEYXRhe1N0YXRlVHlwZUlEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJY29uICAgPT4gJEZBUURhdGF7SWNvbn0gPyBkZWNvZGVfYmFzZTY0KCAkRkFRRGF0YXtJY29ufSApIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgID0+ICRJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgID0+ICRGQVFEYXRhe1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFpvb21BY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgID0+ICROZXN0ZWR7JExldmVsTmFtZX0gPyAnJyA6ICdvb29GQVFTdWJIZWFkZXJTcGFjaW5nJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIGtleXMgJU5lc3RlZCApIHsKICAgICAgICAgICAgICAgIGlmICggISRTaWRlYmFySW5pdCApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2lkZUJhcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte01vZGV9IGVxICdBZ2VudCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkU2lkZWJhckluaXQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBAVG9wTGV2ZWwgPSAkRGF0YXskQ29uZmlnfS0+eyJDdXN0b21Hcm91cE9yZGVyIn0KICAgICAgICAgICAgICAgICAgICA/IHNwbGl0KCAvLC8sICREYXRheyRDb25maWd9LT57IkN1c3RvbUdyb3VwT3JkZXIifSApCiAgICAgICAgICAgICAgICAgICAgOiBzb3J0IGtleXMgJU5lc3RlZDsKCiAgICAgICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBUb3BMZXZlbCkgewogICAgICAgICAgICAgICAgICAgICRHcm91cCA9fiBzL15ccyt8XHMrJC8vZzsKICAgICAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkTmVzdGVkeyRHcm91cH07CiAgICAgICAgICAgICAgICAgICAgJFByb2Nlc3NMZXZlbC0+KCB7ICRHcm91cCA9PiAkTmVzdGVkeyRHcm91cH0gfSwgJEdyb3VwICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAnTGV2ZWxOYW1lJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRFeHBhbmRMZXZlbE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbUlEfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFFeHBsb3JlckxpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICggJFpvb21BY3Rpb24gbmUgJ0N1c3RvbWVyRkFRWm9vbScgJiYgJFpvb21BY3Rpb24gbmUgJ1B1YmxpY0ZBUVpvb20nICYmICRab29tQWN0aW9uIG5lICdBZ2VudEZBUVpvb20nICkKICAgICAgICAgICAgfHwgKCAkUGFyYW17QWN0aW9ufSBlcSAnQ3VzdG9tZXJGQVFab29tJyB8fCAkUGFyYW17QWN0aW9ufSBlcSAnUHVibGljRkFRWm9vbScgfHwgJFBhcmFte0FjdGlvbn0gZXEgJ0FnZW50RkFRWm9vbScgKSAmJiAhJFBhcmFte0lzRGVmYXVsdEFydGljbGV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggJFBhcmFte0hhc0RlZmF1bHRBcnRpY2xlfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUJhY2tIb21lTGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICggJFBhcmFte0FjdGlvbn0gZXEgJ0N1c3RvbWVyRkFRRXhwbG9yZXInIHx8ICRQYXJhbXtBY3Rpb259IGVxICdQdWJsaWNGQVFFeHBsb3JlcicgfHwgJFBhcmFte0FjdGlvbn0gZXEgJ0FnZW50RkFRRXhwbG9yZXInICkgJiYgJFBhcmFte0hhc0RlZmF1bHRBcnRpY2xlfSApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUJhY2tIb21lQmxvY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRL0ZBUVNpZGVCYXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbQogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZDIgRkFRVGFibGVPZkNvbnRlbnRzKCkKClNob3dzIGEgdGFibGUgb2YgY29udGVudHMgdG8gcXVpY2sganVtcCB0byByZWxldmFudCBhcnRpY2xlIGluZm9ybWF0aW9uLgoKICAgICRMYXlvdXRPYmplY3QtPkZBUVRhYmxlT2ZDb250ZW50cygKICAgICAgICBGQVFEYXRhICAgICAgICAgPT4gXCVGQVFEYXRhLAogICAgICAgIE1vZGUgICAgICAgICAgICA9PiAnQWdlbnQnCiAgICApOwoKPWN1dAoKc3ViIEZBUVRhYmxlT2ZDb250ZW50cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoRkFRRGF0YSBNb2RlKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbW9kZQogICAgaWYgKCAkUGFyYW17TW9kZX0gIX4gbXsgQWdlbnQgfCBDdXN0b21lciB8IFB1YmxpYyB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTW9kZSBtdXN0IGJlIGVpdGhlciBBZ2VudCwgQ3VzdG9tZXIgb3IgUHVibGljIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJE1heERlcHRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVFUYWJsZU9mQ29udGVudHM6Ok1heERlcHRoJykgfHwgMzsKICAgIG15ICVEYXRhICAgICA9ICV7ICRQYXJhbXtGQVFEYXRhfSB9OwoKICAgIG15IEBUT0NGaWVsZHMgICAgICAgPSBncmVwIHsgJERhdGF7JF99ID1+IC9cUy8gfSBxdyhGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNik7CiAgICBteSAkU2luZ2xlRmllbGRNb2RlID0gMDsKCiAgICAjIElkZW50aWZ5IGlmIHdlIGFyZSBpbiBzaW5nbGUgZmllbGQgbW9kZQogICAgU0lOR0xFRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAVE9DRmllbGRzKSB7CiAgICAgICAgbXkgJEZpZWxkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCAnRkFROjpJdGVtOjonIC4gJEZpZWxkICk7CiAgICAgICAgbmV4dCBTSU5HTEVGSUVMRCBpZiAhJEZpZWxkQ29uZmlnOwogICAgICAgIG5leHQgU0lOR0xFRklFTEQgaWYgJEZpZWxkQ29uZmlnLT57U2hvd30gZXEgJ2ludGVybmFsJyAmJiAkUGFyYW17TW9kZX0gbmUgJ0FnZW50JzsKCiAgICAgICAgaWYgKCAkRGF0YXskRmllbGR9ICkgewogICAgICAgICAgICAkU2luZ2xlRmllbGRNb2RlKys7CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FydGljbGVGaWVsZCcsCiAgICAgICAgRGF0YSA9PiB7fQogICAgKTsKCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKEBUT0NGaWVsZHMpIHsKICAgICAgICBteSAkRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoICdGQVE6Okl0ZW06OicgLiAkRmllbGQgKTsKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGRDb25maWc7CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGRDb25maWctPntTaG93fSBlcSAnaW50ZXJuYWwnICYmICRQYXJhbXtNb2RlfSBuZSAnQWdlbnQnOwoKICAgICAgICBteSBAU3ViQW5jaG9ycyA9ICREYXRheyRGaWVsZH0gPX4gbXw8aChbMS02XSlbXj5dKj4oLio/KTwvaFsxLTZdPnxnaTsKCiAgICAgICAgaWYgKCAkU2luZ2xlRmllbGRNb2RlID4gMSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmllbGRQYXJlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2FwdGlvbiA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoIFN0cmluZyA9PiAkRmllbGRDb25maWctPntDYXB0aW9ufSApLAogICAgICAgICAgICAgICAgICAgIEZpZWxkICAgPT4gJEZpZWxkCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQFN1YkFuY2hvcnMpIHsKICAgICAgICAgICAgbXkgJENvdW50ID0gMTsKCiAgICAgICAgICAgIE5FU1RFRDoKICAgICAgICAgICAgd2hpbGUgKCBteSAoICRMZXZlbCwgJENvbnRlbnQgKSA9IHNwbGljZSggQFN1YkFuY2hvcnMsIDAsIDIgKSApIHsKICAgICAgICAgICAgICAgIG5leHQgTkVTVEVEIGlmICRMZXZlbCA+ICRNYXhEZXB0aDsKCiAgICAgICAgICAgICAgICBteSAkUGFkZGluZyA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCAkU2luZ2xlRmllbGRNb2RlID09IDEgJiYgJENvdW50ID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhZGRpbmcgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAoICRTaW5nbGVGaWVsZE1vZGUgPT0gMSAmJiAkQ291bnQgPiAxICkgfHwgJFNpbmdsZUZpZWxkTW9kZSAhPSAxICkgewogICAgICAgICAgICAgICAgICAgICRQYWRkaW5nID0gKCAkTGV2ZWwgLSAxICkgKiAxNTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRTaW5nbGVGaWVsZE1vZGUgPiAxID8gJ0FydGljbGVBbmNob3InIDogJ0FydGljbGVBbmNob3JTaW5nbGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDYXB0aW9uID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSggU3RyaW5nID0+ICRDb250ZW50ICksCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkICAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgID0+ICIkRmllbGQtJENvdW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwgICA9PiAkTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhZGRpbmcgPT4gJFBhZGRpbmcsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEvRkFRVGFibGVPZkNvbnRlbnRzJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0KICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQyIEZBUUFkZGl0aW9uYWxEYXRhKCkKClNob3dzIGFkZGl0aW9uYWwgZGF0YSBmb3IgY3VycmVudCBpdGVtLgoKICAgICRMYXlvdXRPYmplY3QtPkZBUUFkZGl0aW9uYWxEYXRhKAogICAgICAgIEZBUURhdGEgICAgICAgICA9PiBcJUZBUURhdGEsCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdBZ2VudCcKICAgICk7Cgo9Y3V0CgpzdWIgRkFRQWRkaXRpb25hbERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRGQVFPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KEZBUURhdGEgTW9kZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtTmFtZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRQYXJhbU5hbWUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG1vZGUKICAgIGlmICggJFBhcmFte01vZGV9ICF+IG17IEFnZW50IHwgQ3VzdG9tZXIgfCBQdWJsaWMgfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01vZGUgbXVzdCBiZSBlaXRoZXIgQWdlbnQsIEN1c3RvbWVyIG9yIFB1YmxpYyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJUZBUURhdGEgICAgICA9ICV7ICRQYXJhbXtGQVFEYXRhfSB9OwoKICAgICRQYXJhbXtFeHBsb3JlckFjdGlvbn0gPSAiJFBhcmFte01vZGV9RkFRRXhwbG9yZXIiOwoKICAgICMgc2hvdyBrZXl3b3JkcyBhcyBzZWFyY2ggbGlua3MKICAgIGlmICggJEZBUURhdGF7S2V5d29yZHN9ICkgewoKICAgICAgICAjIHJlcGxhY2UgY29tbWFzIGFuZCBzZW1pY29sb25zCiAgICAgICAgJEZBUURhdGF7S2V5d29yZHN9ID1+IHMvLC8gL2c7CiAgICAgICAgJEZBUURhdGF7S2V5d29yZHN9ID1+IHMvOy8gL2c7CgogICAgICAgIG15IEBLZXl3b3JkcyA9IHNwbGl0IC9ccysvLCAkRkFRRGF0YXtLZXl3b3Jkc307CiAgICAgICAgZm9yIG15ICRLZXl3b3JkIChAS2V5d29yZHMpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdLZXl3b3JkcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBLZXl3b3JkICAgICAgICA9PiAkS2V5d29yZCwKICAgICAgICAgICAgICAgICAgICBFeHBsb3JlckFjdGlvbiA9PiAkUGFyYW17RXhwbG9yZXJBY3Rpb259CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB2b3RpbmcgZGVmYXVsdCBvcHRpb24KICAgIG15ICRWb3RpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Vm90aW5nJyk7CgogICAgbXkgJFR5cGVOYW1lID0gJFBhcmFte01vZGV9IGVxICdQdWJsaWMnID8gJ3B1YmxpYycgOiAnZXh0ZXJuYWwnOwoKICAgICMgc2V0IGRlZmF1bHQgaW50ZXJmYWNlIHNldHRpbmdzCiAgICBteSAkSW50ZXJmYWNlID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlR2V0KAogICAgICAgIE5hbWUgICA9PiAkVHlwZU5hbWUsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBGQVEgdm90ZSBpbmZvcm1hdGlvbgogICAgbXkgJFZvdGVEYXRhOwogICAgaWYgKCRWb3RpbmcpIHsKICAgICAgICAkVm90ZURhdGEgPSAkRkFRT2JqZWN0LT5Wb3RlR2V0KAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkRkFRRGF0YXtJdGVtSUR9LAogICAgICAgICAgICBJbnRlcmZhY2UgPT4gJEludGVyZmFjZS0+e1N0YXRlSUR9LAogICAgICAgICAgICBJUCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5SZW1vdGVBZGRyKCksCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGFsd2F5cyBkaXNwbGF5cyBWb3RlcyByZXN1bHQgZXZlbiBpZiBpdHMgMAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdWaWV3Vm90ZXMnLAogICAgICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgYWxyZWFkeSB2b3RlZCB0aGlzIEZBUSBpdGVtCiAgICBteSAkQWxyZWFkeVZvdGVkOwogICAgaWYgKCRWb3RlRGF0YSkgewoKICAgICAgICBteSAkSXRlbUNoYW5nZWRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZBUURhdGF7Q2hhbmdlZH0gfHwgJycsCiAgICAgICAgICAgIH0KICAgICAgICApLT5Ub0Vwb2NoKCk7CgogICAgICAgIG15ICRWb3RlQ3JlYXRlZFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVm90ZURhdGEtPntDcmVhdGVkfSB8fCAnJywKICAgICAgICAgICAgfQogICAgICAgICktPlRvRXBvY2goKTsKCiAgICAgICAgaWYgKCAkSXRlbUNoYW5nZWRTeXN0ZW1UaW1lIDw9ICRWb3RlQ3JlYXRlZFN5c3RlbVRpbWUgKSB7CiAgICAgICAgICAgICRBbHJlYWR5Vm90ZWQgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCByYXRpbmcgc3RhcnMKICAgIGlmICgkVm90aW5nKSB7CgogICAgICAgICMgZ2V0IHZvdGluZyBjb25maWcKICAgICAgICBteSAkU2hvd1ZvdGluZ0NvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpJdGVtOjpWb3Rpbmc6OlNob3cnKTsKICAgICAgICBpZiAoICRTaG93Vm90aW5nQ29uZmlnLT57ICRJbnRlcmZhY2UtPntOYW1lfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgdXNlciBhbHJlYWR5IHZvdGVkIGFmdGVyIGxhc3QgY2hhbmdlCiAgICAgICAgICAgIGlmICggISRBbHJlYWR5Vm90ZWQgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+X0ZBUVZvdGluZygKICAgICAgICAgICAgICAgICAgICBGQVFEYXRhID0+IHslRkFRRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkUGFyYW17QWN0aW9ufQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+RkFRUmF0aW5nU3RhcnNTaG93KAogICAgICAgICAgICBWb3RlUmVzdWx0ID0+ICRGQVFEYXRhe1ZvdGVSZXN1bHR9LAogICAgICAgICAgICBWb3RlcyAgICAgID0+ICRGQVFEYXRhe1ZvdGVzfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGF0dGFjaG1lbnRzIGlmIGFueQogICAgbXkgQEF0dGFjaG1lbnRJbmRleCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRJbmRleCgKICAgICAgICBJdGVtSUQgICAgID0+ICRGQVFEYXRhe0l0ZW1JRH0sCiAgICAgICAgU2hvd0lubGluZSA9PiAwLAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICRDb25maWcgPSAkUGFyYW17Q29uZmlnfTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gJ0ZBUScsCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkRkFRRGF0YXtJdGVtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjUwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGF0dGFjaG1lbnRzCiAgICBpZiAoQEF0dGFjaG1lbnRJbmRleCkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50SGVhZGVyJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRJbmRleCkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRL0ZBUUFkZGl0aW9uYWxEYXRhJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVGQVFEYXRhCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfRkFRVm90aW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUZBUURhdGEgPSAleyAkUGFyYW17RkFRRGF0YX0gfTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0ZBUVZvdGluZycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgICAgICBBY3Rpb24gPT4gJFBhcmFte0FjdGlvbn0KICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBWb3RpbmcgcmF0ZXMgc2V0dGluZwogICAgbXkgJFZvdGluZ1JhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGQVE6Okl0ZW06OlZvdGluZzo6UmF0ZXMnKTsKICAgIGZvciBteSAkUmF0ZVZhbHVlICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJXskVm90aW5nUmF0ZXN9ICkgewoKICAgICAgICAjIGNyZWF0ZSBkYXRhIHN0cnVjdHVyZSBmb3Igb3V0cHV0CiAgICAgICAgbXkgJURhdGEgPSAoCiAgICAgICAgICAgIFZhbHVlID0+ICRSYXRlVmFsdWUsCiAgICAgICAgICAgIFRpdGxlID0+ICRWb3RpbmdSYXRlcy0+eyRSYXRlVmFsdWV9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFWb3RpbmdSYXRlUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7JURhdGF9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RPQk8gcHJvamVjdCAoTDxodHRwczovL290b2JvLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK</File>
        <File Location="Kernel/Output/HTML/Templates/Standard/FAQ/FAQAdditionalData.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgogICAgPGRpdiBjbGFzcz0iQWRkaXRpb25hbERhdGEiPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9vb0ZBUUFkZGl0aW9uYWxEYXRhIj4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ib29vRkFRU2lkZWJhckxpc3QiPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ib29vRkFRSGVhZGVyIj5bJSBUcmFuc2xhdGUoIkZBUSBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvbGk+CgogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIkFydGljbGUgTnVtYmVyIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4+WyUgRGF0YS5OdW1iZXIgfCBodG1sICVdPC9zcGFuPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiQ2F0ZWdvcnkiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ2F0ZWdvcnlOYW1lKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkNhdGVnb3J5TmFtZSkgfCBodG1sICVdPC9zcGFuPjwvbGk+CgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iS2V5d29yZHNDb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIktleXdvcmRzIikgfCBodG1sICVdOjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiS2V5d29yZHMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5d29yZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VhcmNoIGZvciBhcnRpY2xlcyB3aXRoIGtleXdvcmQiKSB8IGh0bWwgJV06IFslIERhdGEuS2V5d29yZCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIERhdGEuRXhwbG9yZXJBY3Rpb24gfCB1cmkgJV07U3ViYWN0aW9uPVNlYXJjaDtLZXl3b3JkPVslIERhdGEuS2V5d29yZCB8IHVyaSAlXSI+WyUgRGF0YS5LZXl3b3JkIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiS2V5d29yZHMiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiTGFuZ3VhZ2UiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGFuZ3VhZ2UiKSAlXQoKIyBzaG93IGZhcSBkeW5hbWljIGZpZWxkcwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRRHluYW1pY0ZpZWxkIikgJV0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgIDxsaT4KIyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlMSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgPC9saT4KI1slIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgIDxsaT4KIyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlMiB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgPC9saT4KI1slIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRfRmllbGQyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlZpZXdSYXRpbmciKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSBSYXRpbmdMYWJlbCI+WyUgVHJhbnNsYXRlKCJSYXRpbmciKSB8IGh0bWwgJV06PC9zcGFuPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSYXRlU3RhcnMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZVN0YXIiPjxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmF0ZVN0YXJzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmF0ZVN0YXJzQ291bnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZVN0YXJUZXh0IiB0aXRsZT0iWyUgRGF0YS5TdGFycyB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCJvdXQgb2YgNSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXJzIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIm91dCBvZiA1IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJhdGVTdGFyc0NvdW50IikgJV0KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiVmlld1JhdGluZyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJWaWV3Vm90ZXMiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlZvdGVzIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuVm90ZXMgfCBodG1sICVdIj5bJSBEYXRhLlZvdGVzIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiVmlld1ZvdGVzIikgJV0KClslIElGIERhdGEuVm90ZU1lc3NhZ2UgIT0gIiIgJV0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkNlbnRlciI+PGgzPlslIFRyYW5zbGF0ZShEYXRhLlZvdGVNZXNzYWdlKSB8IGh0bWwgJV08L2gzPjwvbGk+ClslIEVORCAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVZvdGluZyIpICVdCiAgICA8ZGl2IGNsYXNzPSJSYXRpbmciPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9vb0ZBUVJhdGluZyI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im9vb0ZBUVNpZGViYXJMaXN0Ij4KCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJvb29GQVFIZWFkZXIiPlslIFRyYW5zbGF0ZSgiUmF0aW5nIikgfCBodG1sICVdOjwvbGk+CgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRkFRVm90ZSIgY2xhc3M9IlByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWb3RpbmdDb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVm90aW5nQm94IFZpc2libGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZBUVZvdGluZyIgY2xhc3M9IkZBUVZvdGluZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJWb3RpbmdRdWVzdGlvbiI+WyUgVHJhbnNsYXRlKCJIb3cgaGVscGZ1bCB3YXMgdGhpcyBhcnRpY2xlPyBQbGVhc2UgZ2l2ZSB1cyB5b3VyIHJhdGluZyBhbmQgaGVscCB0byBpbXByb3ZlIHRoZSBGQVEgRGF0YWJhc2UuIFRoYW5rIFlvdSEiKSB8IGh0bWwgJV08L3NwYW4+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik1lc3NlbmdlciIgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJhdGVMYWJlbEJlZm9yZSBvb29nIj5bJSBUcmFuc2xhdGUoIm5vdCBoZWxwZnVsIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICBbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFWb3RpbmdSYXRlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJhdGVCdXR0b25bJSBEYXRhLlZhbHVlICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZUJ1dHRvbiBSYXRlVW5DaGVja2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXItbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBbJSBSZW5kZXJCbG9ja0VuZCgiRkFRVm90aW5nUmF0ZVJvdyIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZUxhYmVsQWZ0ZXIgb29vZyI+WyUgVHJhbnNsYXRlKCJ2ZXJ5IGhlbHBmdWwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIERhdGEuQWN0aW9uIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVm90ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2F0ZWdvcnlJRCIgdmFsdWU9IlslIERhdGEuQ2F0ZWdvcnlJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IlslIERhdGEuSXRlbUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyBWb3RpbmdBY3Rpb25Sb3cgQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgIGlkPSJSYXRlU3VibWl0QnV0dG9uIiBjbGFzcz0iSGlkZGVuIG9vb1hTIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmF0ZSIgdmFsdWU9IlslIERhdGEuU2VsZWN0ZWRSYXRlIHwgaHRtbCAlXSJpZD0iUmF0ZVZhbHVlIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVZvdGluZyIpICVdCg==</File>
        <File Location="Kernel/Output/HTML/Templates/Standard/FAQ/FAQSideBar.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckFyZWEiIGlkPSJGQVFTaWRlYmFyIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNpZGVCYXIiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBNYWluU2lkZUJhciI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJUaXRsZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlF1aWNrc3RhcnQgTGlua3MiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJUaXRsZSIpICVdCgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRU2lkZWJhciI+CiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJvb29GQVFTaWRlYmFyTGlzdCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgZGF0YS1uYW1lPSJbJSBEYXRhLlN1YmNhdGVnb3J5IHwgaHRtbCAlXSI+WyUgRGF0YS5BcnJvdyAlXTxzcGFuPlslIERhdGEuSGVhZGVyIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUxpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ib29vRkFRU2lkZWJhckFydGljbGUgWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkljb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCdCYXNlTGluaycpICVdP0FjdGlvbj1bJSBEYXRhLkFjdGlvbiB8IHVyaSAlXTtJdGVtSUQ9WyUgRGF0YS5JRCAlXSIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUxpbmsiKSAlXQoKWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2lkZUJhciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFFeHBsb3JlckxpbmsiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9vb0ZBUUV4cGxvcmVyIj4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ib29vRkFRTGlua3MiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFCYWNrSG9tZUxpbmsiKSAlXQogICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudignQmFzZUxpbmsnKSAlXT9BY3Rpb249WyUgRGF0YS5Ib21lQWN0aW9uIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJCYWNrIHRvIEZBUSBIb21lIikgfCBodG1sICVdIiBjbGFzcz0iTGlua0ZBUUV4cGxvcmVyIj48aSBjbGFzcz0iZmEgZmEtaG9tZSBvb29TaWRlQmFySWNvbkhvbWUiPjwvaT5bJSBUcmFuc2xhdGUoIkJhY2sgdG8gRkFRIEhvbWUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQmFja0hvbWVMaW5rIikgJV0KICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoJ0Jhc2VMaW5rJykgJV0/QWN0aW9uPVslIERhdGEuRXhwbG9yZXJBY3Rpb24gfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXSIgY2xhc3M9IkxpbmtGQVFFeHBsb3JlciBbJSBJRiBEYXRhLklzRGVmYXVsdEFydGljbGUgJV1vb29GQVFMaW5rUG9zaXRpb25bJSBFTkQgJV0iPjxzdmcgY2xhc3M9Im9vb1NpZGVCYXJJY29uRXhwbG9yZXIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjwvcmVjdD48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjwvcmVjdD48L2c+PGc+PHBhdGggZD0iTTE3LjUsNC41Yy0xLjk1LDAtNC4wNSwwLjQtNS41LDEuNWMtMS40NS0xLjEtMy41NS0xLjUtNS41LTEuNWMtMS40NSwwLTIuOTksMC4yMi00LjI4LDAuNzlDMS40OSw1LjYyLDEsNi4zMywxLDcuMTQgbDAsMTEuMjhjMCwxLjMsMS4yMiwyLjI2LDIuNDgsMS45NEM0LjQ2LDIwLjExLDUuNSwyMCw2LjUsMjBjMS41NiwwLDMuMjIsMC4yNiw0LjU2LDAuOTJjMC42LDAuMywxLjI4LDAuMywxLjg3LDAgYzEuMzQtMC42NywzLTAuOTIsNC41Ni0wLjkyYzEsMCwyLjA0LDAuMTEsMy4wMiwwLjM2YzEuMjYsMC4zMywyLjQ4LTAuNjMsMi40OC0xLjk0bDAtMTEuMjhjMC0wLjgxLTAuNDktMS41Mi0xLjIyLTEuODUgQzIwLjQ5LDQuNzIsMTguOTUsNC41LDE3LjUsNC41eiBNMjEsMTcuMjNjMCwwLjYzLTAuNTgsMS4wOS0xLjIsMC45OGMtMC43NS0wLjE0LTEuNTMtMC4yLTIuMy0wLjJjLTEuNywwLTQuMTUsMC42NS01LjUsMS41VjggYzEuMzUtMC44NSwzLjgtMS41LDUuNS0xLjVjMC45MiwwLDEuODMsMC4wOSwyLjcsMC4yOGMwLjQ2LDAuMSwwLjgsMC41MSwwLjgsMC45OFYxNy4yM3oiPjwvcGF0aD48Zz48L2c+PHBhdGggZD0iTTEzLjk4LDExLjAxYy0wLjMyLDAtMC42MS0wLjItMC43MS0wLjUyYy0wLjEzLTAuMzksMC4wOS0wLjgyLDAuNDgtMC45NGMxLjU0LTAuNSwzLjUzLTAuNjYsNS4zNi0wLjQ1IGMwLjQxLDAuMDUsMC43MSwwLjQyLDAuNjYsMC44M2MtMC4wNSwwLjQxLTAuNDIsMC43MS0wLjgzLDAuNjZjLTEuNjItMC4xOS0zLjM5LTAuMDQtNC43MywwLjM5IEMxNC4xMywxMC45OSwxNC4wNSwxMS4wMSwxMy45OCwxMS4wMXoiPjwvcGF0aD48cGF0aCBkPSJNMTMuOTgsMTMuNjdjLTAuMzIsMC0wLjYxLTAuMi0wLjcxLTAuNTJjLTAuMTMtMC4zOSwwLjA5LTAuODIsMC40OC0wLjk0YzEuNTMtMC41LDMuNTMtMC42Niw1LjM2LTAuNDUgYzAuNDEsMC4wNSwwLjcxLDAuNDIsMC42NiwwLjgzYy0wLjA1LDAuNDEtMC40MiwwLjcxLTAuODMsMC42NmMtMS42Mi0wLjE5LTMuMzktMC4wNC00LjczLDAuMzkgQzE0LjEzLDEzLjY2LDE0LjA1LDEzLjY3LDEzLjk4LDEzLjY3eiI+PC9wYXRoPjxwYXRoIGQ9Ik0xMy45OCwxNi4zM2MtMC4zMiwwLTAuNjEtMC4yLTAuNzEtMC41MmMtMC4xMy0wLjM5LDAuMDktMC44MiwwLjQ4LTAuOTRjMS41My0wLjUsMy41My0wLjY2LDUuMzYtMC40NSBjMC40MSwwLjA1LDAuNzEsMC40MiwwLjY2LDAuODNjLTAuMDUsMC40MS0wLjQyLDAuNy0wLjgzLDAuNjZjLTEuNjItMC4xOS0zLjM5LTAuMDQtNC43MywwLjM5IEMxNC4xMywxNi4zMiwxNC4wNSwxNi4zMywxMy45OCwxNi4zM3oiPjwvcGF0aD48L2c+PC9zdmc+WyUgVHJhbnNsYXRlKCJGQVEgRXhwbG9yZXIiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFFeHBsb3JlckxpbmsiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRQmFja0hvbWVCbG9jayIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRRXhwbG9yZXIiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJvb29GQVFMaW5rcyI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoJ0Jhc2VMaW5rJykgJV0/QWN0aW9uPVslIERhdGEuSG9tZUFjdGlvbiB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQmFjayB0byBGQVEgSG9tZSIpIHwgaHRtbCAlXSIgY2xhc3M9IkxpbmtGQVFFeHBsb3JlciI+PGkgY2xhc3M9ImZhIGZhLWhvbWUgb29vU2lkZUJhckljb25Ib21lIG9vb0ZBUUxpbmtGaXJzdCI+PC9pPiBbJSBUcmFuc2xhdGUoIkJhY2sgdG8gRkFRIEhvbWUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQmFja0hvbWVCbG9jayIpICVdCiAgICA8L2Rpdj4K</File>
        <File Location="Kernel/Output/HTML/Templates/Standard/FAQ/FAQTableOfContents.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgogICAgPGRpdiBjbGFzcz0iVGFibGVPZkNvbnRlbnRzIiBpZD0iVE9DIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvb29GQVFUT0MiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJvb29GQVFTaWRlYmFyTGlzdCI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJvb29GQVFIZWFkZXIiPlslIFRyYW5zbGF0ZSgiVGFibGUgb2YgQ29udGVudHMiKSB8IGh0bWwgJV08L2xpPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUZpZWxkIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVGaWVsZFBhcmVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJvb29GQVFUT0NBcnRpY2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWFuZ2xlLXJpZ2h0IFRPQ0xldmVsMSI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjWyUgRGF0YS5GaWVsZCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkNhcHRpb24pIHwgaHRtbCAlXSIgY2xhc3M9IkxpbmtMZXZlbCI+WyUgVHJhbnNsYXRlKERhdGEuQ2FwdGlvbikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBbmNob3IiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ib29vRkFRVE9DQXJ0aWNsZSIgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgbGVmdDogWyUgRGF0YS5QYWRkaW5nIHwgaHRtbCAlXXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1hbmdsZS1yaWdodCBUT0NMZXZlbDIiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUS5hbmNob3JGcmFtZVNjcm9sbCgnSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCAlXScsJ1slIERhdGEuSUQgJV0nKTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DYXB0aW9uKSB8IGh0bWwgJV0iIGNsYXNzPSJMaW5rTGV2ZWwyIj5bJSBUcmFuc2xhdGUoRGF0YS5DYXB0aW9uKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVBbmNob3IiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUZpZWxkUGFyZW50IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBbmNob3JTaW5nbGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ib29vRkFRVE9DQXJ0aWNsZSIgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgbGVmdDogWyUgRGF0YS5QYWRkaW5nIHwgaHRtbCAlXXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1hbmdsZS1yaWdodCBUT0NMZXZlbDEiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUS5hbmNob3JGcmFtZVNjcm9sbCgnSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCAlXScsJ1slIERhdGEuSUQgJV0nKTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DYXB0aW9uKSB8IGh0bWwgJV0iIGNsYXNzPSJMaW5rTGV2ZWwxIExpbmtBbmNob3JTaW5nbGUiPlslIFRyYW5zbGF0ZShEYXRhLkNhcHRpb24pIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUFuY2hvclNpbmdsZSIpICVdCgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUZpZWxkIikgJV0KCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4K</File>
        <File Location="var/httpd/htdocs/js/FAQ.ExtendedNavigation.FAQ.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNSBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgRkFRID0gRkFRIHx8IHt9OwpGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uID0gRkFRLkV4dGVuZGVkTmF2aWdhdGlvbiB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlCiAqIEBleHBvcnRzIFRhcmdldE5TIGFzIEZBUS5FeHRlbmRlZE5hdmlnYXRpb24uRkFRCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UuCiAqLwpGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUSA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBUYWdzIEV4dGVuZGVkTmF2aWdhdGlvbiBGQVEgTW9kdWxlLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICAgIC8qIFNWRyBJY29uIHVwbG9hZCBmb3IgRkFRIGFydGljbGVzICovCiAgICAgICAgY29uc3QgRmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0ljb25VcGxvYWQnKTsKCiAgICAgICAgaWYgKCBGaWxlSW5wdXQgIT09IG51bGwgKSB7CgogICAgICAgICAgICAkKCIjQnRuVXBsb2FkSWNvbiIpLmJpbmQoImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKCIjSWNvblVwbG9hZCIpLnRyaWdnZXIoImNsaWNrIik7CiAgICAgICAgICAgICAgICAkKCIjQnRuVXBsb2FkSWNvbiIpLnRyaWdnZXIoImJsdXIiKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBGaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdOwoKICAgICAgICAgICAgICAgIGlmIChGaWxlICYmIEZpbGUudHlwZSA9PT0gImltYWdlL3N2Zyt4bWwiKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgTGVjdG9yID0gbmV3IEZpbGVSZWFkZXIoKTsKCiAgICAgICAgICAgICAgICAgICAgTGVjdG9yLm9ubG9hZCA9IGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50U1ZHID0gZXZ0LnRhcmdldC5yZXN1bHQ7ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBsb2FkSWNvbkZpbGUoY29udGVudFNWRyk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgTGVjdG9yLnJlYWRBc1RleHQoRmlsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOyAgICAKCiAgICAgICAgICAgIC8vIExvYWQgZXhpc3RpbmcgaWNvbiBpZiBhdmFpbGFibGUKICAgICAgICAgICAgY29uc3QgRXhpc3RpbmdJY29uVmFsdWUgPSAkKCIjSWNvbiIpLnZhbCgpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCBFeGlzdGluZ0ljb25WYWx1ZS5sZW5ndGggPiAwICkgewogICAgICAgICAgICAgICAgY29uc3Qgc3ZnVGV4dCA9IGF0b2IoRXhpc3RpbmdJY29uVmFsdWUpOwogICAgICAgICAgICAgICAgbG9hZEljb25GaWxlKHN2Z1RleHQpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgJCgiLkJhY2tUb3AiKS5iaW5kKCJjbGljayIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnfSkKICAgICAgICB9KTsKCiAgICAgICAgLy8gQ3JlYXRlIG9ic2VydmVyIHRvIGNoZWNrIGlmIE5hdmJhciBhbmQgRkFRIFNpZGViYXIgb3ZlcmxhcHMKCiAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNvb29OYXZpZ2F0aW9uJyk7CgogICAgICAgIGlmICggdGFyZ2V0Tm9kZSApIHsKICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zTGlzdCkgPT4gewogICAgICAgICAgICAgICAgZm9yIChsZXQgbXV0YXRpb24gb2YgbXV0YXRpb25zTGlzdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnY2xhc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXhwYW5kZWQgPSB0YXJnZXROb2RlLmNsYXNzTGlzdC5jb250YWlucygnb29vRXhwYW5kZWQnKTsKICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXhwYW5kZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IE92ZXJMYXAgPSBjaGVja092ZXJsYXAodGFyZ2V0Tm9kZSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLlNpZGViYXJBcmVhJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIE92ZXJMYXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNGQVFTaWRlYmFyIikuY3NzKCJvcGFjaXR5IiwgIjAuMSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI0ZBUVNpZGViYXIiKS5jc3MoIm9wYWNpdHkiLCAiMSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGFyZ2V0Tm9kZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pOwogICAgICAgIH0KCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm9vb0ZBUVNpZGViYXJTdWJIZWFkZXInKS5mb3JFYWNoKGhlYWRlciA9PiB7CiAgICAgICAgICAgIGhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgICAgIGhlYWRlci5jbGFzc0xpc3QudG9nZ2xlKCdFeHBhbmRlZCcpOwogICAgICAgICAgICAgICAgaGVhZGVyLmNsYXNzTGlzdC50b2dnbGUoJ0NvbGxhcHNlZCcpOwogICAgICAgICAgICAgICAgJCgiaS5vb29JY29uU3ViSGVhZGVyIiwgJChoZWFkZXIpKS50b2dnbGVDbGFzcygnZmEtY2FyZXQtcmlnaHQgZmEtY2FyZXQtZG93bicpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGhlYWRlci5uZXh0RWxlbWVudFNpYmxpbmc7CiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCAmJiBuZXh0LmNsYXNzTGlzdC5jb250YWlucygnb29vRkFRU2lkZWJhckFydGljbGUnKSkgewogICAgICAgICAgICAgICAgICAgIG5leHQuY2xhc3NMaXN0LnRvZ2dsZSgnb29vLWlzLXZpc2libGUnKTsKICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0RWxlbWVudFNpYmxpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAkKCBkb2N1bWVudCApLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIENvcmUuQ29uZmlnLkdldCgnRXhwYW5kU3ViY2F0ZWdvcmllcycpID09ICJZZXMiICkgewogICAgICAgICAgICAgICAgJCgib29vRkFRU2lkZWJhciAuZmEtY2hldnJvbi1yaWdodCIpLnRyaWdnZXIoImNsaWNrIik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIENvcmUuQ29uZmlnLkdldCgnTGV2ZWxOYW1lJykgIT0gIiIgKSB7CiAgICAgICAgICAgICAgICAkKCdbZGF0YS1uYW1lPSInKyBlc2NhcGVTdHJpbmcoQ29yZS5Db25maWcuR2V0KCdMZXZlbE5hbWUnKSkgKyAnIl0nKS50cmlnZ2VyKCJjbGljayIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBlc2NhcGVTdHJpbmcKICAgICAqIEBtZW1iZXJvZiBGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBlc2NhcGUgc3RyaW5nIGNvbnRlbnQgZm9yIEpxdWVyeSBmaWVsZHMuCiAgICAgKi8KCiAgICBmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKSB7CiAgICAgICAgaWYgKCB0eXBlb2Ygc3RyID09ICd1bmRlZmluZWQnICkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1shIiMkJSYnKCkqKywuXC86Ozw9Pj9AW1xcXF1eYHt8fX5dL2csICJcXCQmIik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBsb2FkSWNvbkZpbGUKICAgICAqIEBtZW1iZXJvZiBGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBsb2FkIGljb24gZmlsZSBpbiBjb250YWluZXIuCiAgICAgKi8KCiAgICBmdW5jdGlvbiBsb2FkSWNvbkZpbGUoc3ZnVGV4dCkgewogICAgICAgIGNvbnN0IEljb25QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0ljb25QcmV2aWV3Jyk7CiAgICAgICAgY29uc3QgYmFzZTY0U1ZHID0gYnRvYShzdmdUZXh0KTsKICAgICAgICAkKCIjSWNvbiIpLnZhbChiYXNlNjRTVkcpOwogICAgICAgIEljb25QcmV2aWV3LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJHtiYXNlNjRTVkd9JylgOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0RkFRQXJ0aWNsZXMKICAgICAqIEBtZW1iZXJvZiBGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm4gRkFRIGFydGljbGVzIGFsbG93ZWQgdG8gYmUgbWV0aW9uZWQgZm9yIHRoZSBjdXJyZW50IHVzZXIuCiAgICAgKi8KICAgIFRhcmdldE5TLmdldEZBUUFydGljbGVzID0gZnVuY3Rpb24ocXVlcnlUZXh0KSB7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgY29uc3QgRGF0YSA9IHsgCiAgICAgICAgICAgICAgICBBY3Rpb246ICAgICdBZ2VudEZBUUF1dG9Db21wbGV0ZScsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdHZXRGQVFJdGVtcycsCiAgICAgICAgICAgICAgICBRdWVyeTogICAgIGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVRleHQpLAogICAgICAgICAgICAgICAgTWFya2VyOiAgICBlbmNvZGVVUklDb21wb25lbnQoJyMnKSwKICAgICAgICAgICAgICAgIFVzZXJJRDogICAgMSwKICAgICAgICAgICAgICAgIExpbWl0OiAgICAgMjAsIAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpOwoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkwsIERhdGEsIGZ1bmN0aW9uIChSZXN1bHQpIHsKICAgICAgICAgICAgICAgIGlmIChSZXN1bHQgJiYgUmVzdWx0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFJlc3VsdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KQogICAgICAgIC50aGVuKChSZXN1bHQpID0+IHsKICAgICAgICAgICAgY29uc3QgVmFsdWVEYXRhID0gW107CiAgICAgICAgICAgIAogICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBWYWx1ZURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICAgICAgdGhpcy5pZCwKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAgICB0aGlzLnRleHQsCiAgICAgICAgICAgICAgICAgICAgaXRlbV9pZDogdGhpcy5pdGVtX2lkLAogICAgICAgICAgICAgICAgICAgIGxpbms6ICAgIHRoaXMubGluawogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIFZhbHVlRGF0YTsKICAgICAgICB9KTsgICAgICAgIAogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGFuY2hvckZyYW1lU2Nyb2xsCiAgICAgKiBAbWVtYmVyb2YgRkFRLkV4dGVuZGVkTmF2aWdhdGlvbi5GQVEKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gZG8gc2Nyb2xsIHRvIElmcmFtZSBhbmNob3IuCiAgICAgKi8KICAgIFRhcmdldE5TLmFuY2hvckZyYW1lU2Nyb2xsID0gZnVuY3Rpb24oRmllbGRJRCwgSUQpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChGaWVsZElEKS5jb250ZW50V2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKElEKS5zY3JvbGxJbnRvVmlldygpOwogICAgfSAgICAKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBjaGVja092ZXJsYXAKICAgICAqIEBtZW1iZXJvZiBDb3JlLkN1c3RvbWVyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIHRydWUuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBjaGVjayBpZiB0d28gZWxlbWVudHMgb3ZlcmxhcHMgKGZvciBjaGVja2luZyBzaWRlYmFyIG92ZXJsYXBwaW5nKS4KICAgICAqLwogICAgZnVuY3Rpb24gY2hlY2tPdmVybGFwKGVsMSwgZWwyKSB7CiAgICAgICAgY29uc3QgY29vcmQxID0gZWwxLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGNvb3JkMiA9IGVsMi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCiAgICAgICAgY29uc3Qgb3ZlcmxhcCA9ICEoCiAgICAgICAgICAgIGNvb3JkMS5yaWdodCA8IGNvb3JkMi5sZWZ0IHx8IAogICAgICAgICAgICBjb29yZDEubGVmdCA+IGNvb3JkMi5yaWdodCB8fCAKICAgICAgICAgICAgY29vcmQxLmJvdHRvbSA8IGNvb3JkMi50b3AgfHwgCiAgICAgICAgICAgIGNvb3JkMS50b3AgPiBjb29yZDIuYm90dG9tCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIG92ZXJsYXA7CiAgICB9ICAgIAoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oRkFRLkV4dGVuZGVkTmF2aWdhdGlvbi5GQVEgfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/js/Core.UI.CKEditor5Wrapper.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMjEtMjAyNCBabnVueSBHbWJILCBodHRwczovL3pudW55Lm9yZy8KLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwovLyAtLQovLyAkb3JpZ2luOiBvdG9ibyAtIDQwZjg2ZjU1NzRjMThhYTg0NWZjZTYwNmQ0MjE3MjQyMzExNTc1ZGYgLSB2YXIvaHR0cGQvaHRkb2NzL2pzL0NvcmUuVUkuQ0tFZGl0b3I1V3JhcHBlci5qcwovLyAtLQovLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgovLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQovLyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLy8gQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKaW1wb3J0ICogYXMgQ0tFZGl0b3I1V3JhcHBlciBmcm9tICdja2VkaXRvcjUnOwoKLyoqCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFdyYXBwZXIgZm9yIENLRWRpdG9yIDUuCiAqICAgICAgVGhlIENLRWRpdG9yIGlzIHVzaW5nIEVTNiBtb2R1bGUgc3ludGF4IHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBPVE9CTydzIGN1cnJlbnRseSB1c2VkIEVTNSBzeW50YXguCiAqICAgICAgVGhpcyB3cmFwcGVyIG1ha2VzIHRoZSByZWxldmFudCBleHBvcnRlZCB2YXJpYWJsZXMgb2YgdGhlIENLRWRpdG9yIGF2YWlsYWJsZSB0byB0aGUgZ2xvYmFsIHNjb3BlLgogKi8Kd2luZG93LkNLRWRpdG9yNVdyYXBwZXIgPSBDS0VkaXRvcjVXcmFwcGVyOwoKLyoqCiAqIGFsbCB0aGUgdXNlZCBwbHVnaW4gbmFtZXMgYXJlIG5lZWRlZCBmb3IgY3JlYXRpbmcgYW4gZWRpdG9yIGluc3RhbmNlCiAqLwpsZXQgUGx1Z2lucyA9IFsKICAgIENLRWRpdG9yNVdyYXBwZXIuQWxpZ25tZW50LAogICAgQ0tFZGl0b3I1V3JhcHBlci5BdXRvZm9ybWF0LAogICAgQ0tFZGl0b3I1V3JhcHBlci5CbG9ja1F1b3RlLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Cb2xkLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Db2RlQmxvY2ssCiAgICBDS0VkaXRvcjVXcmFwcGVyLkRhdGFGaWx0ZXIsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkRhdGFTY2hlbWEsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkZpbmRBbmRSZXBsYWNlLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Gb250Q29sb3IsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkZvbnRGYW1pbHksCiAgICBDS0VkaXRvcjVXcmFwcGVyLkZvbnRTaXplLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Gb250QmFja2dyb3VuZENvbG9yLAogICAgQ0tFZGl0b3I1V3JhcHBlci5HZW5lcmFsSHRtbFN1cHBvcnQsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkhlYWRpbmcsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkhvcml6b250YWxMaW5lLAogICAgQ0tFZGl0b3I1V3JhcHBlci5JbWFnZSwKICAgIENLRWRpdG9yNVdyYXBwZXIuSW1hZ2VSZXNpemUsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkltYWdlU3R5bGUsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkltYWdlVXBsb2FkLAogICAgQ0tFZGl0b3I1V3JhcHBlci5JbWFnZVRvb2xiYXIsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkltYWdlSW5zZXJ0LAogICAgQ0tFZGl0b3I1V3JhcHBlci5JbmRlbnQsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkl0YWxpYywKICAgIENLRWRpdG9yNVdyYXBwZXIuTGluaywKICAgIENLRWRpdG9yNVdyYXBwZXIuTGlzdCwKICAgIENLRWRpdG9yNVdyYXBwZXIuTWVudGlvbiwgIC8qIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlICAqLwogICAgQ0tFZGl0b3I1V3JhcHBlci5QYXJhZ3JhcGgsCiAgICBDS0VkaXRvcjVXcmFwcGVyLlJlbW92ZUZvcm1hdCwKICAgIENLRWRpdG9yNVdyYXBwZXIuU2VsZWN0QWxsLAogICAgQ0tFZGl0b3I1V3JhcHBlci5TaW1wbGVVcGxvYWRBZGFwdGVyLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Tb3VyY2VFZGl0aW5nLAogICAgQ0tFZGl0b3I1V3JhcHBlci5TcGVjaWFsQ2hhcmFjdGVycywKICAgIENLRWRpdG9yNVdyYXBwZXIuU3BlY2lhbENoYXJhY3RlcnNFc3NlbnRpYWxzLAogICAgQ0tFZGl0b3I1V3JhcHBlci5TdHJpa2V0aHJvdWdoLAogICAgQ0tFZGl0b3I1V3JhcHBlci5UYWJsZSwKICAgIENLRWRpdG9yNVdyYXBwZXIuVGFibGVDZWxsUHJvcGVydGllcywKICAgIENLRWRpdG9yNVdyYXBwZXIuVGFibGVDb2x1bW5SZXNpemUsCiAgICBDS0VkaXRvcjVXcmFwcGVyLlRhYmxlUHJvcGVydGllcywKICAgIENLRWRpdG9yNVdyYXBwZXIuVGFibGVUb29sYmFyLAogICAgQ0tFZGl0b3I1V3JhcHBlci5VbmRlcmxpbmUsCiAgICBDS0VkaXRvcjVXcmFwcGVyLlVuZG8sCiAgICBDS0VkaXRvcjVXcmFwcGVyLlBhc3RlRnJvbU9mZmljZQpdOwpsZXQgUGx1Z2luRGljdCA9IHt9OwoKZm9yIChsZXQgUGx1Z2luIG9mIFBsdWdpbnMpIHsKICAgIFBsdWdpbkRpY3RbUGx1Z2luLnBsdWdpbk5hbWVdID0gUGx1Z2luOwp9CgovKioKICogYWRkIHRoZSBwbHVnaW4gbmFtZXMgYW5kIG9iamVjdHMgdG8gdGhlIGJyb3dzZXIncyB3aW5kb3cgb2JqZWN0CiAqLwp3aW5kb3cuQ0tFZGl0b3I1UGx1Z2lucyA9IFBsdWdpbkRpY3Q7Cg==</File>
        <File Location="var/httpd/htdocs/js/Core.UI.RichTextEditor.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMjEtMjAyNCBabnVueSBHbWJILCBodHRwczovL3pudW55Lm9yZy8KLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwovLyAtLQovLyAkb3JpZ2luOiAgLSBjOWUyNWZlZTg0NzMwMTJhODgyOTI2MWRlZDg2MGMyYWUyOTIwMTM1IC0gdmFyL2h0dHBkL2h0ZG9jcy9qcy9Db3JlLlVJLlJpY2hUZXh0RWRpdG9yLmpzCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuVUkgPSBDb3JlLlVJIHx8IHt9Owp2YXIgQ0tFZGl0b3JJbnN0YW5jZXMgPSB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICogQG1lbWJlcm9mIENvcmUuVUkKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBSaWNodGV4dCBFZGl0b3IuCiAqLwpDb3JlLlVJLlJpY2hUZXh0RWRpdG9yID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lICRGb3JtSUQKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAbWVtYmVyIHtqUXVlcnlPYmplY3R9CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSGlkZGVuIGlucHV0IGZpZWxkIHdpdGggbmFtZSBGb3JtSUQuCiAgICAgKi8KICAgIHZhciAkRm9ybUlELAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIFRpbWVPdXRSVEVPbkNoYW5nZQogICAgICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgICAgICogQG1lbWJlciB7T2JqZWN0fQogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqICAgICAgT2JqZWN0IHRvIGhhbmRsZSB0aW1lb3V0LgogICAgICAgICAqLwogICAgICAgIFRpbWVPdXRSVEVPbkNoYW5nZTsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDaGVja0Zvcm1JRAogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge2pRdWVyeU9iamVjdH0gRm9ybUlEIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVkaXRvckFyZWEgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZWxlbWVudCB0aGF0IGhhcyBiZWNvbWUgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENoZWNrIGluIHRoZSB3aW5kb3cgd2hpY2ggaGlkZGVuIGVsZW1lbnQgaGFzIGEgbmFtZSBzYW1lIHRvICdGb3JtSUQnIGFuZCByZXR1cm4gaXQgbGlrZSBhIEpRdWVyeSBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENoZWNrRm9ybUlEKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgaWYgKHR5cGVvZiAkRm9ybUlEID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAkRm9ybUlEID0gJEVkaXRvckFyZWEuY2xvc2VzdCgnZm9ybScpLmZpbmQoJ2lucHV0OmhpZGRlbltuYW1lPUZvcm1JRF0nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRGb3JtSUQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0RWRpdG9yCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBmYWxzZSBvbiBlcnJvci4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWRpdG9yQXJlYSAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgYXBwbGljYXRpb24gYW5kIGV4ZWN1dGVzIHRoZSBuZWVkZWQgZnVuY3Rpb25zLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0RWRpdG9yID0gZnVuY3Rpb24gKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgdmFyIEVkaXRvcklEID0gJycsCiAgICAgICAgICAgIFVzZXJMYW5ndWFnZSwKICAgICAgICAgICAgUGx1Z2luTGlzdCA9IENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuUGx1Z2lucycpLAogICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSA9IChDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25OYW1lJykgPT09IENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJykpOwoKICAgICAgICAvLyBUaGUgZm9ybWF0IGZvciB0aGUgbGFuZ3VhZ2UgaXMgZGlmZmVyZW50IGJldHdlZW4gT1RPQk8gYW5kIENLRWRpdG9yIChzZWUgYnVnIzgwMjQpCiAgICAgICAgLy8gVG8gY29ycmVjdCB0aGlzLCB3ZSByZXBsYWNlICJfIiB3aXRoICItIiBpbiB0aGUgbGFuZ3VhZ2UgKGUuZy4gemhfQ04gYmVjb21lcyB6aC1jbikKICAgICAgICBVc2VyTGFuZ3VhZ2UgPSBDb3JlLkNvbmZpZy5HZXQoJ1VzZXJMYW5ndWFnZScpLnJlcGxhY2UoL18vLCAnLScpLnRvTG93ZXJDYXNlKCk7CgogICAgICAgIGlmICghd2luZG93LkNLRWRpdG9yNVdyYXBwZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgaW5zdGFuY2UgaXMgYWxyZWFkeSBsb2FkZWQKICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJEVkaXRvckFyZWEpICYmICRFZGl0b3JBcmVhLmhhc0NsYXNzKCdIYXNDS0VJbnN0YW5jZScpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIEVkaXRvcklEID0gJEVkaXRvckFyZWEuYXR0cignaWQnKTsKICAgICAgICB9CgogICAgICAgIGlmIChFZGl0b3JJRCA9PT0gJycpIHsKICAgICAgICAgICAgQ29yZS5FeGNlcHRpb24uVGhyb3coJ1JpY2hUZXh0RWRpdG9yOiBOZWVkIGV4YWN0bHkgb25lIEVkaXRvckFyZWEhJywgJ1R5cGVFcnJvcicpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29tbW9uIGVkaXRvciBsYWJlbAogICAgICAgIC8vICB1c2Ugd2lsZGNhcmQgdG8gaW5jbHVkZSAiUmljaFRleHQ8QWN0aXZpdHlEaWFsb2dJRD4iCiAgICAgICAgY29uc3QgUmljaFRleHRMYWJlbCA9ICRFZGl0b3JBcmVhLnBhcmVudCgpLmZpbmQoJ2xhYmVsW2Zvcl49IlJpY2hUZXh0Il0nKTsKCiAgICAgICAgdmFyIFRvb2xiYXJDb25maWc7CiAgICAgICAgaWYgKCBDdXN0b21lckludGVyZmFjZSApIHsKICAgICAgICAgICAgVG9vbGJhckNvbmZpZyA9IC8qJEVkaXRvckFyZWEud2lkdGgoKSA8IDQ1NCA/IENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuVG9vbGJhck1pbmknKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRWRpdG9yQXJlYS53aWR0aCgpIDwgNjIyID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyTWlkaScpIDoqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tGb3JtSUQoJEVkaXRvckFyZWEpLmxlbmd0aCA/IENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuVG9vbGJhcicpIDogQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyV2l0aG91dEltYWdlJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBUb29sYmFyQ29uZmlnID0gQ2hlY2tGb3JtSUQoJEVkaXRvckFyZWEpLmxlbmd0aCA/IENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuVG9vbGJhcicpIDogQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyV2l0aG91dEltYWdlJyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgSW50ZWdyYXRpb25zOwogICAgICAgIHZhciByZW1vdmVkUGx1Z2lucyA9IFtdOwogICAgICAgIHZhciBCbG9ja1Bhc3RlSW1nID0gZmFsc2U7CgogICAgICAgIC8vRW5hYmxlIHBpY3R1cmUgdXBsb2FkIHdoZW4gRm9ybUlEIGlzIHByZXNlbnQKICAgICAgICAvL0lmIG5vdCwgbG9hZCBvbmx5IHRoZSB1cmwgdG8gaW1hZ2UgZnVuY3Rpb24KICAgICAgICBpZiAoIENoZWNrRm9ybUlEKCRFZGl0b3JBcmVhKS5sZW5ndGggKSB7CiAgICAgICAgICAgIEludGVncmF0aW9ucyA9IFsgJ3VwbG9hZCcsICd1cmwnIF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgSW50ZWdyYXRpb25zID0gWyAndXJsJyBdOwogICAgICAgICAgICBCbG9ja1Bhc3RlSW1nID0gdHJ1ZTsKICAgICAgICAgICAgcmVtb3ZlZFBsdWdpbnMgPSBbICdTaW1wbGVVcGxvYWRBZGFwdGVyJyBdOwogICAgICAgIH0KCi8vIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgdmFyIGV4dHJhUGx1Z2lucyA9IFtdOwogICAgICAgIHZhciBtZW50aW9uc0NvbmZpZyA9IHt9OwoKICAgICAgICBpZiAoIC9BZ2VudEZBUS8udGVzdChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpKSA9PSB0cnVlIAogICAgICAgICAgICAgICAgfHwgL0N1c3RvbWVyRkFRLy50ZXN0KENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykpID09IHRydWUKICAgICAgICAgICAgICAgICAgfHwgL1B1YmxpY0ZBUS8udGVzdChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpKSAgPT0gdHJ1ZSApIHsKICAgICAgICAgICAgZXh0cmFQbHVnaW5zID0gWyBNZW50aW9uQ3VzdG9taXphdGlvbiBdOwoKICAgICAgICAgICAgbWVudGlvbnNDb25maWcgPSB7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmZWVkczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyOiAnIycsCiAgICAgICAgICAgICAgICAgICAgICAgIGZlZWQ6IEZBUS5FeHRlbmRlZE5hdmlnYXRpb24uRkFRLmdldEZBUUFydGljbGVzLAogICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtQ2hhcmFjdGVyczogMSwKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVJlbmRlcmVyOiAoaXRlbSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgbWFya2VyIGZyb20gaXRlbSBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1FbGVtZW50LnRleHRDb250ZW50ID0gaXRlbS50ZXh0OyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtRWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfTsKICAgICAgICB9Ci8vIEVPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAgICAgLy8gaWYgdGhpcyBpcyBhIFJpY2hUZXh0IERGLCBkaXNhYmxlIEltYWdlIFVwbG9hZAogICAgICAgIGlmKCRFZGl0b3JBcmVhLmhhc0NsYXNzKCdEeW5hbWljRmllbGRSaWNoVGV4dCcpKSB7CiAgICAgICAgICAgIFRvb2xiYXJDb25maWcgPSBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJXaXRob3V0SW1hZ2UnKTsKICAgICAgICAgICAgSW50ZWdyYXRpb25zID0gWyAndXJsJyBdOwogICAgICAgICAgICByZW1vdmVkUGx1Z2lucyA9IFsgJ1NpbXBsZVVwbG9hZEFkYXB0ZXInIF07CiAgICAgICAgfQoKICAgICAgICB2YXIgQ2xhc3NpY0VkaXRvciA9IENLRWRpdG9yNVdyYXBwZXIuQ2xhc3NpY0VkaXRvcjsKICAgICAgICBsZXQgRW5hYmxlZFBsdWdpbnMgPSBbXTsKICAgICAgICBmb3IgKGxldCBwbHVnaW5OYW1lIG9mIFBsdWdpbkxpc3QpIHsKICAgICAgICAgICAgbGV0IFBsdWdpbiA9IENLRWRpdG9yNVBsdWdpbnNbcGx1Z2luTmFtZV07CiAgICAgICAgICAgIGlmIChQbHVnaW4pIHsKICAgICAgICAgICAgICAgIEVuYWJsZWRQbHVnaW5zLnB1c2goQ0tFZGl0b3I1UGx1Z2luc1twbHVnaW5OYW1lXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5TaG93RXJyb3IoJ0NvdWxkblwndCBmaW5kIHBsdWdpbjogJyArIHBsdWdpbk5hbWUsICdKYXZhU2NyaXB0RXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQ2xhc3NpY0VkaXRvci5jcmVhdGUoJCgkRWRpdG9yQXJlYSkuZ2V0KDApLCB7CiAgICAgICAgICAgIGxpY2Vuc2VLZXk6ICdHUEwnLAogICAgICAgICAgICB1aTogewogICAgICAgICAgICAgICAgcG93ZXJlZEJ5OiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdpbnNpZGUnLAogICAgICAgICAgICAgICAgICAgIHNpZGU6ICdyaWdodCcsCiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VWaXNpYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiAyLAogICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IDIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGVhZGluZzogewogICAgICAgICAgICAgICAgb3B0aW9uczogWwogICAgICAgICAgICAgICAgICAgIHsgbW9kZWw6ICdwYXJhZ3JhcGgnLCB0aXRsZTogJ1BhcmFncmFwaCcsIGNsYXNzOiAnY2staGVhZGluZ19wYXJhZ3JhcGgnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmcxJywgdmlldzogJ2gxJywgdGl0bGU6ICdIZWFkaW5nIDEnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzEnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmcyJywgdmlldzogJ2gyJywgdGl0bGU6ICdIZWFkaW5nIDInLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzInIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmczJywgdmlldzogJ2gzJywgdGl0bGU6ICdIZWFkaW5nIDMnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzMnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc0JywgdmlldzogJ2g0JywgdGl0bGU6ICdIZWFkaW5nIDQnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzQnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc1JywgdmlldzogJ2g1JywgdGl0bGU6ICdIZWFkaW5nIDUnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzUnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc2JywgdmlldzogJ2g2JywgdGl0bGU6ICdIZWFkaW5nIDYnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzYnIH0sCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZvbnRTaXplOiB7CiAgICAgICAgICAgICAgICBvcHRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQnLCA4LCAxMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI2LCAyOCwgMzAKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBzdXBwb3J0QWxsVmFsdWVzOiB0cnVlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZvbnRGYW1pbHk6IHsKICAgICAgICAgICAgICAgIHN1cHBvcnRBbGxWYWx1ZXM6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdG9vbGJhcjogewogICAgICAgICAgICAgICAgc2hvdWxkTm90R3JvdXBXaGVuRnVsbDogdHJ1ZSwKICAgICAgICAgICAgICAgIGl0ZW1zOiBUb29sYmFyQ29uZmlnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBsdWdpbnM6IEVuYWJsZWRQbHVnaW5zLAogICAgICAgICAgICByZW1vdmVQbHVnaW5zOiByZW1vdmVkUGx1Z2lucywKLy8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgZXh0cmFQbHVnaW5zOiBleHRyYVBsdWdpbnMsCi8vIEVPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgbGFuZ3VhZ2U6IHsKICAgICAgICAgICAgICAgIHVpOiBVc2VyTGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICBjb250ZW50OiBVc2VyTGFuZ3VhZ2UKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaHRtbFN1cHBvcnQ6IHsKICAgICAgICAgICAgICAgIGFsbG93OiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc3BhbicsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY2l0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc3R5bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3RhYmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBkaXNhbGxvdzogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogLyhhYnNvbHV0ZXxzdGlja3l8Zml4ZWQpJC8KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgaW1hZ2U6IHsKICAgICAgICAgICAgICAgIHJlc2l6ZVVuaXQ6ICdweCcsCiAgICAgICAgICAgICAgICByZXNpemVPcHRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncmVzaXplSW1hZ2U6b3JpZ2luYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ09yaWdpbmFsIEltYWdlIFNpemUnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ29yaWdpbmFsJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncmVzaXplSW1hZ2U6Y3VzdG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdTY2FsZSBJbWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnY3VzdG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2N1c3RvbScKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgc3R5bGVzOiB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICAnYWxpZ25MZWZ0JywgJ2FsaWduQ2VudGVyJywgJ2FsaWduUmlnaHQnLCAnYWxpZ25CbG9ja1JpZ2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2FsaWduQmxvY2tMZWZ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVmYXVsdDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRvb2xiYXI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpbWFnZVN0eWxlOmltYWdlUG9zaXRpb25pbmdEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnSW1hZ2UgUG9zaXRpb25pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlU3R5bGU6YWxpZ25MZWZ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbWFnZVN0eWxlOmFsaWduQ2VudGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbWFnZVN0eWxlOmFsaWduUmlnaHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlU3R5bGU6YWxpZ25CbG9ja0xlZnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlU3R5bGU6YWxpZ25CbG9ja1JpZ2h0JwogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SXRlbTogJ2ltYWdlU3R5bGU6YWxpZ25CbG9ja0xlZnQnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAncmVzaXplSW1hZ2UnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgaW5zZXJ0OiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ltYWdlQmxvY2snLAogICAgICAgICAgICAgICAgICAgIGludGVncmF0aW9uczogSW50ZWdyYXRpb25zCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRhYmxlOiB7CiAgICAgICAgICAgICAgICB0YWJsZUNlbGxQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogJ2xlZnQnLAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudDogJ3RvcCcsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRhYmxlUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogJ2NlbnRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY29udGVudFRvb2xiYXI6IFsKICAgICAgICAgICAgICAgICAgICAndGFibGVDb2x1bW4nLCAndGFibGVSb3cnLCAnbWVyZ2VUYWJsZUNlbGxzJywgJ3RhYmxlUHJvcGVydGllcycsICd0YWJsZUNlbGxQcm9wZXJ0aWVzJwogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaW1wbGVVcGxvYWQ6IHsKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIFVSTCBmb3IgaW1hZ2UgdXBsb2FkCiAgICAgICAgICAgICAgICB1cGxvYWRVcmw6IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKQogICAgICAgICAgICAgICAgICAgICsgJ0FjdGlvbj0nCiAgICAgICAgICAgICAgICAgICAgKyBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlBpY3R1cmVVcGxvYWRBY3Rpb24nLCAnUGljdHVyZVVwbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgKyAnJkZvcm1JRD0nCiAgICAgICAgICAgICAgICAgICAgKyBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkudmFsKCkKICAgICAgICAgICAgICAgICAgICArICcmJyArIENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbk5hbWUnKQogICAgICAgICAgICAgICAgICAgICsgJz0nICsgQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uSUQnKSwKCiAgICAgICAgICAgICAgICAvLyBFbmFibGUgdGhlIFhNTEh0dHBSZXF1ZXN0LndpdGhDcmVkZW50aWFscyBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsCgogICAgICAgICAgICAgICAgLy8gSGVhZGVycyBzZW50IGFsb25nIHdpdGggdGhlIFhNTEh0dHBSZXF1ZXN0IHRvIHRoZSB1cGxvYWQgc2VydmVyLgogICAgICAgICAgICAgICAgaGVhZGVyczoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZm9udENvbG9yOiB7CiAgICAgICAgICAgICAgICBjb2xvcnM6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzAwMDAwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQmxhY2snCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRkNGQ0ZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRGltIGdyZXknCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzk5OTk5OScsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnR3JleScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZTZlNmU2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMaWdodCBncmV5JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNmZmZmZmYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1doaXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgaGFzQm9yZGVyOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2U2NGM0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVkJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNjk5NGMnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ09yYW5nZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZTZlNjRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdZZWxsb3cnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzk5ZTY0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTGlnaHQgZ3JlZW4nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRjZTY0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnR3JlZW4nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRjZTY5OScsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQXF1YW1hcmluZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGNlNmU2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdUdXJxdW9pc2UnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRjOTllNicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTGlnaHQgYmx1ZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGM0Y2U2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdCbHVlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM5OTRjZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1B1cnBsZScKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgY29sb3JQaWNrZXI6IHsKICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdoZXgnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZvbnRCYWNrZ3JvdW5kQ29sb3I6IHsKICAgICAgICAgICAgICAgIGNvbG9yczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMDAwMDAwJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdCbGFjaycKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGQ0ZDRkJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdEaW0gZ3JleScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjOTk5OTk5JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdHcmV5JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNmU2ZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0xpZ2h0IGdyZXknCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnV2hpdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBoYXNCb3JkZXI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZTY0YzRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdSZWQnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2U2OTk0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnT3JhbmdlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNmU2NGMnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1llbGxvdycKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjOTllNjRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMaWdodCBncmVlbicKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGNlNjRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdHcmVlbicKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGNlNjk5JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBcXVhbWFyaW5lJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0Y2U2ZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1R1cnF1b2lzZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGM5OWU2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMaWdodCBibHVlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0YzRjZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JsdWUnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzk5NGNlNicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUHVycGxlJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBjb2xvclBpY2tlcjogewogICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ2hleCcKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKLy8gUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgbWVudGlvbjogbWVudGlvbnNDb25maWcsCi8vIEVPIFJvdGhlciBPU1MgLyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgICAgIHRyYW5zbGF0aW9uczogWwogICAgICAgICAgICAgICAgQ0tFZGl0b3I1Q29yZVRyYW5zbGF0aW9ucywKICAgICAgICAgICAgXQogICAgICAgIH0pCiAgICAgICAgICAgIC50aGVuKGVkaXRvciA9PiB7CiAgICAgICAgICAgICAgICAvKiBHZW5lcmF0ZSBJRCBmb3IgY3VycmVudCBFZGl0b3IgKi8KICAgICAgICAgICAgICAgIGVkaXRvci5FbGVtZW50SWQgPSBFZGl0b3JJRDsKICAgICAgICAgICAgICAgIENLRWRpdG9ySW5zdGFuY2VzWyRFZGl0b3JBcmVhLmF0dHIoJ2lkJyldID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgIHdpbmRvdy5lZGl0b3IgPSBlZGl0b3I7CgogICAgICAgICAgICAgICAgLyogY29uZmlndXJlIHBlcm1pc3NhYmxlIGh0bWwgdGFncyAqLwogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3IucGx1Z2lucy5oYXMoIkRhdGFGaWx0ZXIiKSkgewogICAgICAgICAgICAgICAgICAgIGxldCBkYXRhRmlsdGVyID0gd2luZG93LmVkaXRvci5wbHVnaW5zLmdldCgiRGF0YUZpbHRlciIpOwogICAgICAgICAgICAgICAgICAgIGRhdGFGaWx0ZXIuYWxsb3dFbGVtZW50KCAic3R5bGUiICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogU2V0IENvbnRhaW5lciBzaXplICovCiAgICAgICAgICAgICAgICB2YXIgJGRvbUVkaXRhYmxlRWxlbWVudCA9ICQoJEVkaXRvckFyZWEpLmNsb3Nlc3QoIi5SaWNoVGV4dEZpZWxkIik7CgogICAgICAgICAgICAgICAgLy9UcnkgdXNlIFJpY2hUZXh0SG9sZGVyIGZvciBDdXN0b21lciBJbnRlcmZhY2UKICAgICAgICAgICAgICAgIGlmIChDdXN0b21lckludGVyZmFjZSkgewogICAgICAgICAgICAgICAgICAgICRkb21FZGl0YWJsZUVsZW1lbnQgPSAkKCRFZGl0b3JBcmVhKS5jbG9zZXN0KCIuUmljaFRleHRIb2xkZXIiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1NldCB0byBSZWFkb25seSBtb2RlIGlmIHJlcXVpcmVkCiAgICAgICAgICAgICAgICBpZiAoJEVkaXRvckFyZWEuaGFzQ2xhc3MoJ1JlYWRvbmx5JykpIHsKICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZW5hYmxlUmVhZE9ubHlNb2RlKCdERl9SZWFkb25seScpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VFZGl0aW5nQWN0aXZlID0gZmFsc2U7CgogICAgICAgICAgICAgICAgJGRvbUVkaXRhYmxlRWxlbWVudC5yZXNpemFibGUoKTsKICAgICAgICAgICAgICAgICRkb21FZGl0YWJsZUVsZW1lbnQucmVzaXphYmxlKCJvcHRpb24iLCAiaGFuZGxlcyIsICJzIik7CiAgICAgICAgICAgICAgICAkKCIudWktcmVzaXphYmxlLXMiLCAkZG9tRWRpdGFibGVFbGVtZW50KS5hcHBlbmQoIjxpIGNsYXNzPSdvb29mbyBvb29mby1tb3JlX2gnPjwvaT4iKTsKCiAgICAgICAgICAgICAgICAkZG9tRWRpdGFibGVFbGVtZW50Lm9uKCdyZXNpemUnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBhZGp1c3RFZGl0b3JTaXplKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgRWRpdG9yIFNpemUgdG8gbWF0Y2ggKHJlc2l6YWJsZSkgY29udGFpbmVyIHNpemUKICAgICAgICAgICAgICAgIHZhciBhZGp1c3RFZGl0b3JTaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHRvb2xiYXJIZWlnaHQgPSAkZG9tRWRpdGFibGVFbGVtZW50LmZpbmQoJy5jay1lZGl0b3JfX3RvcCcpLm91dGVySGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkUGFkZGluZyA9IHBhcnNlRmxvYXQoJGRvbUVkaXRhYmxlRWxlbWVudC5jc3MoInBhZGRpbmctdG9wIikpCiAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyc2VGbG9hdCgkZG9tRWRpdGFibGVFbGVtZW50LmNzcygicGFkZGluZy1ib3R0b20iKSk7CiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VkaXRvclNpemUgPSAkZG9tRWRpdGFibGVFbGVtZW50LmlubmVySGVpZ2h0KCkgLSBmaWVsZFBhZGRpbmc7CiAgICAgICAgICAgICAgICAgICAgbGV0ICRlZGl0aW5nQXJlYSA9ICRkb21FZGl0YWJsZUVsZW1lbnQuZmluZCgnLmNrLWNvbnRlbnQnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRWRpdGluZ0FjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZWRpdGluZ0FyZWEgPSAkZG9tRWRpdGFibGVFbGVtZW50LmZpbmQoJy5jay1zb3VyY2UtZWRpdGluZy1hcmVhJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxldCB2ZXJ0aWNhbFBhZGRpbmcgPSBwYXJzZUZsb2F0KCRlZGl0aW5nQXJlYS5jc3MoInBhZGRpbmctdG9wIikpICsgcGFyc2VGbG9hdCgkZWRpdGluZ0FyZWEuY3NzKCJwYWRkaW5nLWJvdHRvbSIpKTsKICAgICAgICAgICAgICAgICAgICBsZXQgYm9yZGVyV2lkdGggPSBwYXJzZUZsb2F0KCRlZGl0aW5nQXJlYS5jc3MoImJvcmRlci10b3AiKSkgKyBwYXJzZUZsb2F0KCRlZGl0aW5nQXJlYS5jc3MoImJvcmRlci1ib3R0b20iKSk7CiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1NpemUgPSBuZXdFZGl0b3JTaXplIC0gKHRvb2xiYXJIZWlnaHQgKyB2ZXJ0aWNhbFBhZGRpbmcpCiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUVkaXRpbmdBY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGVkaXRpbmdBcmVhLmhlaWdodChuZXdTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmVkaXRpbmcudmlldy5mb3JjZVJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NpemUgLT0gYm9yZGVyV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5lZGl0aW5nLnZpZXcuY2hhbmdlKHdyaXRlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0U3R5bGUoJ2hlaWdodCcsIG5ld1NpemUgKyAncHgnLCBlZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50LmdldFJvb3QoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy9yZXNpemUgZWRpdG9yIG9uIG1vZGUgY2hhbmdlCiAgICAgICAgICAgICAgICBpZiAoIGVkaXRvci5wbHVnaW5zLmhhcyggJ1NvdXJjZUVkaXRpbmcnICkgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRWRpdGluZyA9IGVkaXRvci5wbHVnaW5zLmdldCggJ1NvdXJjZUVkaXRpbmcnICk7CgogICAgICAgICAgICAgICAgICAgIGVkaXRvci5saXN0ZW5Ubyggc291cmNlRWRpdGluZywgJ2NoYW5nZTppc1NvdXJjZUVkaXRpbmdNb2RlJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VFZGl0aW5nQWN0aXZlID0gc291cmNlRWRpdGluZy5pc1NvdXJjZUVkaXRpbmdNb2RlOwogICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RFZGl0b3JTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgfSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGJpbmQgZWRpdG9yIHJlc2l6ZSB0byBjb250YWluZXIoJGRvbUVkaXRhYmxlRWxlbWVudCkgc2l6ZSBjaGFuZ2UKICAgICAgICAgICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBhZGp1c3RFZGl0b3JTaXplKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoJGRvbUVkaXRhYmxlRWxlbWVudC5maXJzdCgpLmdldCgwKSk7CgogICAgICAgICAgICAgICAgLy8gc2V0IGNvcnJlY3QgbWluLWhlaWdodCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlIHRvIHByZXZlbnQgb3ZlcmxhcHBpbmcKICAgICAgICAgICAgICAgIGlmIChDdXN0b21lckludGVyZmFjZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xiYXJSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sYmFySGVpZ2h0ID0gJGRvbUVkaXRhYmxlRWxlbWVudC5maW5kKCcuY2stZWRpdG9yX190b3AnKS5vdXRlckhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IE1pbkhlaWdodCA9IHRvb2xiYXJIZWlnaHQgKyAxMDA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRvbUVkaXRhYmxlRWxlbWVudC5jc3MoJ21pbi1oZWlnaHQnLCBNaW5IZWlnaHQgKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB0b29sYmFyUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IudWkudmlldy50b29sYmFyLmVsZW1lbnQpOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAvL21ha2Ugc3VyZSBlZGl0b3Igc2l6ZSBpcyBhZGp1c3RlZCB3aGVuZXZlciB0aGUgdG9vbGJhciBjaGFuZ2VzIHNpemUKICAgICAgICAgICAgICAgIC8vb3RoZXJ3aXNlIGVkaXRvciBzaXplIGNhbiBiZWhhdmUgd2VpcmRseSByaWdodCBhZnRlciBsb2FkaW5nIHBhZ2UKICAgICAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWRpdG9yLnVpLnZpZXcudG9vbGJhci5lbGVtZW50KTsKCiAgICAgICAgICAgICAgICBpZiAoQ3VzdG9tZXJJbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50LmdldFJvb3QoJ21haW4nKS5wbGFjZWhvbGRlciA9IFJpY2hUZXh0TGFiZWxbMF0uaW5uZXJUZXh0OwogICAgICAgICAgICAgICAgICAgIFJpY2hUZXh0TGFiZWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvKiBTZXQgZWRpdGluZyBhcmVhIHdpZHRoIGZvciBDdXN0b21lciAqLwogICAgICAgICAgICAgICAgICAgIGVkaXRvci5lZGl0aW5nLnZpZXcuY2hhbmdlKHdyaXRlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zZXRTdHlsZSgnbWF4LXdpZHRoJywgJzEwMCUnLCBlZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50LmdldFJvb3QoKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9CbG9jayBwYXN0aW5nIGltYWdlcyBmb3IgVG9vbGJhcldpdGhvdXRJbWFnZQogICAgICAgICAgICAgICAgZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudC5vbiggJ2NsaXBib2FyZElucHV0JywgKCBldnQsIGRhdGEgKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVRyYW5zZmVyID0gZGF0YS5kYXRhVHJhbnNmZXI7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGF0YVRyYW5zZmVyLl9maWxlcy5sZW5ndGggPiAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSBkYXRhVHJhbnNmZXIuX2ZpbGVzWzBdLm5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIC9cLihqcGU/Z3xwbmd8Z2lmfGJtcCkkL2kudGVzdChpbWFnZU5hbWUpICYmIEJsb2NrUGFzdGVJbWcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgaWYgKCFDdXN0b21lckludGVyZmFjZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIChtYXhpbXVtKSBFZGl0b3Igc2l6ZSBhcyBkZWZpbmVkIGJ5IFN5c3RlbSBDb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgbGV0IEVkaXRvcldpZHRoID0gTnVtYmVyKCBDb3JlLkNvbmZpZy5HZXQoIlJpY2hUZXh0LldpZHRoIiwgNjIwKSApOwoKICAgICAgICAgICAgICAgICAgICAkZG9tRWRpdGFibGVFbGVtZW50LmNzcygiaGVpZ2h0IiwgQ29yZS5Db25maWcuR2V0KCJSaWNoVGV4dC5IZWlnaHQiLCAzMjApKTsKICAgICAgICAgICAgICAgICAgICAkZG9tRWRpdGFibGVFbGVtZW50LmNoaWxkcmVuKCkuY3NzKCJtYXgtd2lkdGgiLCBFZGl0b3JXaWR0aCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgQ29yZS5BcHAuUHVibGlzaCgnRXZlbnQuVUkuUmljaFRleHRFZGl0b3IuSW5zdGFuY2VDcmVhdGVkJywgW2VkaXRvcl0pOwoKICAgICAgICAgICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGNrZWRpdG9yIG5vdCB1c2luZyBkYXRhIGZpbHRlciBjb3JyZWN0bHkgb24gcHJlLWZpbGxlZCBjb250ZW50CiAgICAgICAgICAgICAgICBpZiAoZWRpdG9yLkVsZW1lbnRJZCA9PSAnUmljaFRleHQnKSB7CiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNldERhdGEoZWRpdG9yLnNvdXJjZUVsZW1lbnQuaW5uZXJUZXh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1VwZGF0ZSB2YWxpZGF0aW9uIGVycm9yIHRvb2x0aXAgd2hpbGUgY29udGVudCBpcyBhZGRlZCB0byB0aGUgZWRpdG9yCiAgICAgICAgICAgICAgICBlZGl0b3IubW9kZWwuZG9jdW1lbnQub24oJ2NoYW5nZTpkYXRhJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoVGltZU91dFJURU9uQ2hhbmdlKTsKICAgICAgICAgICAgICAgICAgICBUaW1lT3V0UlRFT25DaGFuZ2UgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBFZGl0b3JBcmVhQ29udGVudCA9IGVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFZGl0b3JBcmVhQ29udGVudCAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiIyIgKyBlZGl0b3IuRWxlbWVudElkKS52YWwoRWRpdG9yQXJlYUNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5WYWxpZGF0ZUVsZW1lbnQoJEVkaXRvckFyZWEpOwogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFwcC5QdWJsaXNoKCdFdmVudC5VSS5SaWNoVGV4dEVkaXRvci5DaGFuZ2VWYWxpZGF0aW9uQ29tcGxldGUnLCBbZWRpdG9yXSk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGVkaXRvci51aS5mb2N1c1RyYWNrZXIub24oJ2NoYW5nZTppc0ZvY3VzZWQnLCAoX2V2dCwgX25hbWUsIGlzRm9jdXNlZCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghaXNGb2N1c2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoIiMiICsgJEVkaXRvckFyZWEuYXR0cignaWQnKSkudmFsKGVkaXRvci5nZXREYXRhKCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLlZhbGlkYXRlRWxlbWVudCgkRWRpdG9yQXJlYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuRm9ybS5FcnJvclRvb2x0aXBzLlJlbW92ZVJURVRvb2x0aXAoJEVkaXRvckFyZWEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgLy8gbWFyayB0aGUgZWRpdG9yIHRleHRhcmVhIGFzIGxpbmtlZCB3aXRoIGFuIFJURSBpbnN0YW5jZSB0byBhdm9pZCBtdWx0aXBsZSBpbnN0YW5jZXMKICAgICAgICAkRWRpdG9yQXJlYS5hZGRDbGFzcygnSGFzQ0tFSW5zdGFuY2UnKTsKCiAgICAgICAgLy9SZW1vdmUgdmFsaWRhdGlvbiBmb3IgdW5kZWZpbmVkIGVsZW1lbnRzIG9uIENLRWRpdG9yIChKUXVlcnkgdmFsaWRhdGUgcGx1Z2luIGV4Y2VwdGlvbikKICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICQoJ2Zvcm0nKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ3ZhbGlkYXRvcicpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIEV4aXN0aW5nSWdub3JlcyA9ICggJCh0aGlzKS5kYXRhKCd2YWxpZGF0b3InKS5zZXR0aW5ncy5pZ25vcmUgfHwgJycgKS5zcGxpdCgnLCAnKTsKICAgICAgICAgICAgICAgICAgICBbIi5jayIsICIuY2stZWRpdG9yX19lZGl0YWJsZSIsICIuY2stY29udGVudCJdLmZvckVhY2goZnVuY3Rpb24oRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIEV4aXN0aW5nSWdub3Jlcy5pbmRleE9mKEVsZW1lbnQpID09IC0xICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpc3RpbmdJZ25vcmVzLnB1c2goRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ3ZhbGlkYXRvcicpLnNldHRpbmdzLmlnbm9yZSA9IEV4aXN0aW5nSWdub3Jlcy5qb2luKCIsICIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8vUm90aGVyIE9TUyAvIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAgLyoqCiAgICAgKiBAbmFtZSBNZW50aW9uQ3VzdG9taXphdGlvbgogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgcmVuZGVyZWQgaXRlbSBpbnRvIGEgRkFRIGFydGljbGUgbGluay4KICAgICAqLwogICAgZnVuY3Rpb24gTWVudGlvbkN1c3RvbWl6YXRpb24oIGVkaXRvciApIHsKICAgICAgICAvLyBUaGUgdXBjYXN0IGNvbnZlcnRlciB3aWxsIGNvbnZlcnQgdmlldyA8YSBjbGFzcz0ibWVudGlvbiIgaHJlZj0iIiBkYXRhLWl0ZW0taWQ9IiI+CiAgICAgICAgLy8gZWxlbWVudHMgdG8gdGhlIG1vZGVsICdtZW50aW9uJyB0ZXh0IGF0dHJpYnV0ZS4KICAgICAgICBlZGl0b3IuY29udmVyc2lvbi5mb3IoICd1cGNhc3QnICkuZWxlbWVudFRvQXR0cmlidXRlKCB7CiAgICAgICAgICAgIHZpZXc6IHsKICAgICAgICAgICAgICAgIG5hbWU6ICdhJywKICAgICAgICAgICAgICAgIGtleTogJ2RhdGEtbWVudGlvbicsCiAgICAgICAgICAgICAgICBjbGFzc2VzOiAnbWVudGlvbicsCiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICAgICAgICAgaHJlZjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAnZGF0YS1pdGVtLWlkJzogdHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBtb2RlbDogewogICAgICAgICAgICAgICAga2V5OiAnbWVudGlvbicsCiAgICAgICAgICAgICAgICB2YWx1ZTogdmlld0l0ZW0gPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBtZW50aW9uIGZlYXR1cmUgZXhwZWN0cyB0aGF0IHRoZSBtZW50aW9uIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtb2RlbCBpcyBhIHBsYWluIG9iamVjdCB3aXRoIGEgc2V0IG9mIGFkZGl0aW9uYWwgYXR0cmlidXRlcy4KICAgICAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBjcmVhdGUgYSBwcm9wZXIgb2JqZWN0IHVzZSB0aGUgdG9NZW50aW9uQXR0cmlidXRlKCkgaGVscGVyIG1ldGhvZDoKICAgICAgICAgICAgICAgICAgICBjb25zdCBtZW50aW9uQXR0cmlidXRlID0gZWRpdG9yLnBsdWdpbnMuZ2V0KCAnTWVudGlvbicgKS50b01lbnRpb25BdHRyaWJ1dGUoIHZpZXdJdGVtLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBhbnkgb3RoZXIgcHJvcGVydGllcyB0aGF0IHlvdSBuZWVkLgogICAgICAgICAgICAgICAgICAgICAgICBsaW5rOiB2aWV3SXRlbS5nZXRBdHRyaWJ1dGUoICdocmVmJyApLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtX2lkOiB2aWV3SXRlbS5nZXRBdHRyaWJ1dGUoICdkYXRhLWl0ZW0taWQnICkKICAgICAgICAgICAgICAgICAgICB9ICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW50aW9uQXR0cmlidXRlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBjb252ZXJ0ZXJQcmlvcml0eTogJ2hpZ2gnCiAgICAgICAgfSApOwoKICAgICAgICAvLyBEb3duY2FzdCB0aGUgbW9kZWwgJ21lbnRpb24nIHRleHQgYXR0cmlidXRlIHRvIGEgdmlldyA8YT4gZWxlbWVudC4KICAgICAgICBlZGl0b3IuY29udmVyc2lvbi5mb3IoICdkb3duY2FzdCcgKS5hdHRyaWJ1dGVUb0VsZW1lbnQoIHsKICAgICAgICAgICAgbW9kZWw6ICdtZW50aW9uJywKICAgICAgICAgICAgdmlldzogKCBtb2RlbEF0dHJpYnV0ZVZhbHVlLCB7IHdyaXRlciB9ICkgPT4gewogICAgICAgICAgICAgICAgLy8gRG8gbm90IGNvbnZlcnQgZW1wdHkgYXR0cmlidXRlcyAobGFjayBvZiB2YWx1ZSBtZWFucyBubyBtZW50aW9uKS4KICAgICAgICAgICAgICAgIGlmICggIW1vZGVsQXR0cmlidXRlVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB3cml0ZXIuY3JlYXRlQXR0cmlidXRlRWxlbWVudCggJ2EnLCB7CiAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdtZW50aW9uJywKICAgICAgICAgICAgICAgICAgICAnZGF0YS1tZW50aW9uJzogbW9kZWxBdHRyaWJ1dGVWYWx1ZS50ZXh0LAogICAgICAgICAgICAgICAgICAgICdkYXRhLWl0ZW0taWQnOiBtb2RlbEF0dHJpYnV0ZVZhbHVlLml0ZW1faWQsCiAgICAgICAgICAgICAgICAgICAgJ2hyZWYnOiBtb2RlbEF0dHJpYnV0ZVZhbHVlLmxpbmsKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIG1lbnRpb24gYXR0cmlidXRlIHRvIGJlIHdyYXBwZWQgYnkgb3RoZXIgYXR0cmlidXRlIGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiAyMCwKICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG1lcmdpbmcgbWVudGlvbnMgdG9nZXRoZXIuCiAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZGVsQXR0cmlidXRlVmFsdWUudWlkCiAgICAgICAgICAgICAgICB9ICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNvbnZlcnRlclByaW9yaXR5OiAnaGlnaCcKICAgICAgICB9ICk7CiAgICB9ICAKCiAgICAvL0VPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRBbGxFZGl0b3JzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhcyBhIHJpY2ggdGV4dCBlZGl0b3IgZXZlcnkgdGV4dGFyZWEgZWxlbWVudCB0aGF0IGNvbnRhaW5pbmcgdGhlIFJpY2hUZXh0IGNsYXNzLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0QWxsRWRpdG9ycyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgaWYgKCF3aW5kb3cuQ0tFZGl0b3I1V3JhcHBlcikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkKCd0ZXh0YXJlYS5SaWNoVGV4dCcpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBUYXJnZXROUy5Jbml0RWRpdG9yKCQodGhpcykpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIEpTIGZ1bmN0aW9uYWxpdHkuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgIGlmICghd2luZG93LkNLRWRpdG9yNVdyYXBwZXIgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PSAnQWRtaW5HZW5lcmljSW50ZXJmYWNlTWFwcGluZ1hTTFQnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBDdXN0b21lckludGVyZmFjZSA9IChDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25OYW1lJykgPT09IENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJykpOwoKICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInICsgQ29yZS5Db25maWcuR2V0KCdXZWJQYXRoJykgKyBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LkVkaXRvclN0eWxlc1BhdGgnKSArICciPicpOwogICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgKyBDb3JlLkNvbmZpZy5HZXQoJ1dlYlBhdGgnKSArIENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuQ29udGVudFN0eWxlc1BhdGgnKSArICciPicpOwogICAgICAgIGlmIChDdXN0b21lckludGVyZmFjZSkgewogICAgICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInICsgQ29yZS5Db25maWcuR2V0KCdXZWJQYXRoJykgKyAnL3NraW5zL0N1c3RvbWVyL2RlZmF1bHQvY3NzL0NLRWRpdG9yQ3VzdG9tU3R5bGVzLmNzcyI+Jyk7CiAgICAgICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgKyBDb3JlLkNvbmZpZy5HZXQoJ1dlYlBhdGgnKSArICcvc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvUmljaFRleHRBcnRpY2xlQ29udGVudC5jc3MiPicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgKyBDb3JlLkNvbmZpZy5HZXQoJ1dlYlBhdGgnKSArICcvc2tpbnMvQWdlbnQvZGVmYXVsdC9jc3MvQ0tFZGl0b3JDdXN0b21TdHlsZXMuY3NzIj4nKTsKICAgICAgICAgICAgJCgiaGVhZCIpLmFwcGVuZCgnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyArIENvcmUuQ29uZmlnLkdldCgnV2ViUGF0aCcpICsgJy9za2lucy9BZ2VudC9kZWZhdWx0L2Nzcy9SaWNoVGV4dEFydGljbGVDb250ZW50LmNzcyI+Jyk7CiAgICAgICAgfQoKICAgICAgICBsZXQgQ3VzdG9tU3R5bGVzID0gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5DdXN0b21DU1MnKSB8fCAnJzsKICAgICAgICBpZiAoQ3VzdG9tU3R5bGVzICE9ICcnKSB7CiAgICAgICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+IC5jay1jb250ZW50IHsnICsgQ3VzdG9tU3R5bGVzICsgJ30gPC9zdHlsZT4nKTsKICAgICAgICB9CgogICAgICAgIFRhcmdldE5TLkluaXRBbGxFZGl0b3JzKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0UlRFCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7alF1ZXJ5T2JqZWN0fSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBjb3JyZXNwb25kaW5nIFJURSBlbGVtZW50LgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFZGl0b3JBcmVhIC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgR2V0IFJURSBqUXVlcnkgZWxlbWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuR2V0UlRFID0gZnVuY3Rpb24gKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgdmFyICRSVEU7CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkpIHsKICAgICAgICAgICAgJFJURSA9ICQoJEVkaXRvckFyZWEuYXR0cignaWQnKSk7CiAgICAgICAgICAgIHJldHVybiAoJFJURS5sZW5ndGggPyAkUlRFIDogdW5kZWZpbmVkKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgVXBkYXRlTGlua2VkRmllbGQKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWRpdG9yQXJlYSAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbGlua2VkIGZpZWxkIGZvciBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKi8KICAgIFRhcmdldE5TLlVwZGF0ZUxpbmtlZEZpZWxkID0gZnVuY3Rpb24gKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgdmFyIEVkaXRvcklEID0gJycsCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIFN0cmlwcGVkQ29udGVudDsKCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFZGl0b3JBcmVhKSAmJiAkRWRpdG9yQXJlYS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgRWRpdG9ySUQgPSAkRWRpdG9yQXJlYS5hdHRyKCdpZCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEVkaXRvcklEID09PSAnJykgewogICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5UaHJvdygnUmljaFRleHRFZGl0b3I6IE5lZWQgZXhhY3RseSBvbmUgRWRpdG9yQXJlYSEnLCAnVHlwZUVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICBEYXRhID0gd2luZG93LmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgU3RyaXBwZWRDb250ZW50ID0gRGF0YS5yZXBsYWNlKC9ccyt8Jm5ic3A7fDxcLz9cdytbXj5dKlwvPz4vZywgJycpOwoKICAgICAgICBpZiAoU3RyaXBwZWRDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiAhRGF0YS5tYXRjaCgvPGltZy8pKSB7CiAgICAgICAgICAgICRFZGl0b3JBcmVhLnZhbCgnJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRWRpdG9yQXJlYS52YWwoRGF0YSk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIElzRW5hYmxlZAogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgUlRFIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFZGl0b3JBcmVhIC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIHJpY2ggdGV4dCBlZGl0b3IgaXMgZW5hYmxlIGluIHRoaXMgbW9tZW50LgogICAgICovCiAgICBUYXJnZXROUy5Jc0VuYWJsZWQgPSBmdW5jdGlvbiAoJEVkaXRvckFyZWEpIHsKICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5lZGl0b3IgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEubGVuZ3RoICYmICRFZGl0b3JBcmVhLmhhc0NsYXNzKCdSaWNoVGV4dCcpKSB7CiAgICAgICAgICAgIHJldHVybiAod2luZG93LmVkaXRvciA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBGb2N1cwogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFZGl0b3JBcmVhIC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBmb2N1c3NlcyB0aGUgZ2l2ZW4gUlRFLgogICAgICovCiAgICBUYXJnZXROUy5Gb2N1cyA9IGZ1bmN0aW9uICgkRWRpdG9yQXJlYSkgewogICAgICAgIHZhciBFZGl0b3JJRCA9ICcnOwoKICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJEVkaXRvckFyZWEpICYmICRFZGl0b3JBcmVhLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBFZGl0b3JJRCA9ICRFZGl0b3JBcmVhLmF0dHIoJ2lkJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoRWRpdG9ySUQgPT09ICcnKSB7CiAgICAgICAgICAgIENvcmUuRXhjZXB0aW9uLlRocm93KCdSaWNoVGV4dEVkaXRvcjogTmVlZCBleGFjdGx5IG9uZSBFZGl0b3JBcmVhIScsICdUeXBlRXJyb3InKTsKICAgICAgICB9CgogICAgICAgIGlmICh0eXBlb2YgQ2xhc3NpY0VkaXRvciAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBDS0VkaXRvckluc3RhbmNlc1skRWRpdG9yQXJlYS5hdHRyKCdpZCcpXS5mb2N1cygpOwogICAgICAgIH0KICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLlVJLlJpY2hUZXh0RWRpdG9yIHx8IHt9KSk7Cg==</File>
        <File Location="var/httpd/htdocs/js/FAQ.Agent.Sidebar.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNSBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgRkFRLkFnZW50LlNpZGViYXIKICogQG1lbWJlcm9mIEZBUS5BZ2VudAogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBGQVEgU2lkZWJhciBzZXR0aW5ncyBtb2R1bGUuCiAqLwpGQVEuQWdlbnQuU2lkZWJhciA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICBsZXQgc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKICAgIGNvbnN0IGxpc3QgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnSXRlbUxpc3QnKTsKICAgIGNvbnN0IGJ0blVwICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVXAnKTsKICAgIGNvbnN0IGJ0bkRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuRG93bicpOwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIEZBUS5BZ2VudC5TaWRlYmFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIG1vZHVsZS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgnI0ZpbHRlcicpLCAkKCcjU2V0dGluZ3MnKSk7ICAgICAgICAKCiAgICAgICAgJCgnLkJ0bkVkaXQnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAkKCIjTGFuZ1NlbGVjdGlvbiIpLnN1Ym1pdCgpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuUmVtb3ZlQnV0dG9uJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBCdXR0b25JRCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgICAgICAgICAgdmFyIFJlbW92ZUlEID0gQnV0dG9uSUQuc3BsaXQoJ18nKS5wb3AoKTsKICAgICAgICAgICAKICAgICAgICAgICAgdmFyIE1heElEID0gMDsKCiAgICAgICAgICAgICQoJ1tpZF49IkZpZWxkX0FydGljbGVfIl0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIEN1cnJlbnRJRCA9IHBhcnNlSW50KCQodGhpcykuYXR0cignaWQnKS5zcGxpdCgnXycpLnBvcCgpKTsKCiAgICAgICAgICAgICAgICBpZiAoQ3VycmVudElEID4gTWF4SUQpIHsKICAgICAgICAgICAgICAgICAgICBNYXhJRCA9IEN1cnJlbnRJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAKICAgICAgICAgICAgJCgiI0FydGljbGVDb3VudCIpLnZhbChwYXJzZUludChNYXhJRCAtIDEpKTsKCiAgICAgICAgICAgICQoJyNGaWVsZF9BcnRpY2xlXycgKyBSZW1vdmVJRCkucmVtb3ZlKCk7CiAgICAgICAgICAgICQoJ2xhYmVsW2Zvcj0iQXJ0aWNsZV8nICsgUmVtb3ZlSUQgKyAnIl0nKS5yZW1vdmUoKTsgICAgICAgICAgIAogICAgICAgICAgICBzeW5jR3JvdXBPcmRlcigpOwogICAgICAgICAgICBSZWJ1aWxkTGlzdEl0ZW1zKCk7CiAgICAgICAgfSk7CgogICAgICAgICQoJyNCdG5BZGRFbnRyeScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBZGROZXdBcnRpY2xlKCk7CiAgICAgICAgfSk7IAoKICAgICAgICAkKCcjYnRuVXAnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBtb3ZlVXAoKTsKICAgICAgICB9KTsgCgogICAgICAgICQoJyNidG5Eb3duJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgbW92ZURvd24oKTsKICAgICAgICB9KTsgCgogICAgICAgICQoJyNCdG5SZXNldCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgTW9kYWw6IHRydWUsCiAgICAgICAgICAgICAgICBUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dhcm5pbmcnKSwKICAgICAgICAgICAgICAgIEhUTUw6ICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUmVzdG9yaW5nIHRoZXNlIHNldHRpbmdzIHdpbGwgZXJhc2UgYWxsIGRhdGEuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPycpLAogICAgICAgICAgICAgICAgUG9zaXRpb25Ub3A6ICcyMCUnLAogICAgICAgICAgICAgICAgUG9zaXRpb25MZWZ0OiAnQ2VudGVyJywKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IGZhbHNlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogZmFsc2UsCiAgICAgICAgICAgICAgICBCdXR0b25zOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Nsb3NlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnQ2FsbEZvckFjdGlvbicKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPaycpLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI1N1YmFjdGlvbiIpLnZhbCgiRGVsZXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjU2lkZWJhclNldHRpbmdzRm9ybSIpLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ0NhbGxGb3JBY3Rpb24nCiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0pOyAgICAgICAgICAgIAogICAgICAgIH0pOwoKICAgICAgICBpZiAoIHR5cGVvZiBsaXN0ICE9PSAndW5kZWZpbmVkJyAmJiBsaXN0ICkgewogICAgICAgICAgICBsaXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ0xpc3RJdGVtJykpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnQgPSBlLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB1cGRhdGVCdXR0b25zKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOyAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBHZXRHcm91cE9yZGVyKCk7CgogICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBzeW5jR3JvdXBPcmRlcigpOwogICAgICAgIH0pOwoKICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsKICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLAogICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlCiAgICAgICAgfSk7CgogICAgICAgICQoZG9jdW1lbnQpLm9uKCdibHVyJywgJ2lucHV0JywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoZS50YXJnZXQuaWQgJiYgZS50YXJnZXQuaWQuc3RhcnRzV2l0aCgnQXJ0aWNsZV8nKSAmJiAhZS50YXJnZXQuaWQuaW5jbHVkZXMoJ0Vycm9yJykgJiYgIWUudGFyZ2V0LmlkLmluY2x1ZGVzKCdOZXh0SUQnKSkgewogICAgICAgICAgICAgICAgc3luY0dyb3VwT3JkZXIoKTsKICAgICAgICAgICAgICAgIFJlYnVpbGRMaXN0SXRlbXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOyAgICAgICAgCgogICAgICAgIHN5bmNHcm91cE9yZGVyKCk7ICAgICAgCiAgICB9OwoKICAgIGZ1bmN0aW9uIG1vdmVVcCgpIHsKICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICYmIHNlbGVjdGVkRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7CiAgICAgICAgICAgIGxpc3QuaW5zZXJ0QmVmb3JlKHNlbGVjdGVkRWxlbWVudCwgc2VsZWN0ZWRFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpOwogICAgICAgICAgICB1cGRhdGVCdXR0b25zKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG1vdmVEb3duKCkgewogICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgJiYgc2VsZWN0ZWRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZykgewogICAgICAgICAgICBsaXN0Lmluc2VydEJlZm9yZShzZWxlY3RlZEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLCBzZWxlY3RlZEVsZW1lbnQpOwogICAgICAgICAgICB1cGRhdGVCdXR0b25zKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUJ1dHRvbnMoKSB7CiAgICAgICAgaWYgKCFzZWxlY3RlZEVsZW1lbnQpIHJldHVybjsKCiAgICAgICAgYnRuVXAuZGlzYWJsZWQgPSAhc2VsZWN0ZWRFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7CiAgICAgICAgYnRuRG93bi5kaXNhYmxlZCA9ICFzZWxlY3RlZEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nOyAgICAgIAoKICAgICAgICBzZWxlY3RlZEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7CiAgICAgICAgR2V0R3JvdXBPcmRlcigpOwogICAgfSAgICAKCiAgICBmdW5jdGlvbiBHZXRHcm91cE9yZGVyKCkgewogICAgICAgIGNvbnN0IGl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI0l0ZW1MaXN0IC5MaXN0SXRlbScpOwogICAgICAgIAogICAgICAgIGNvbnN0IEdyb3VwT3JkZXIgPSBBcnJheS5mcm9tKGl0ZW1zKQogICAgICAgICAgICAubWFwKGl0ZW0gPT4gaXRlbS50ZXh0Q29udGVudC50cmltKCkucmVwbGFjZSgvLC9nLCAiIikpIAogICAgICAgICAgICAuam9pbigiLCIpOwoKICAgICAgICAkKCcjQ3VzdG9tR3JvdXBPcmRlcicpLnZhbChHcm91cE9yZGVyKTsKICAgIH0gICAKICAgICAgIAogICAgZnVuY3Rpb24gY2xlYW5OYW1lKHRleHQpIHsKICAgICAgICBpZiAoIXRleHQpIHJldHVybiAiIjsKICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgnOjonKVswXS50cmltKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3luY0dyb3VwT3JkZXIoKSB7CiAgICAgICAgY29uc3Qgb3JkZXJJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdDdXN0b21Hcm91cE9yZGVyJyk7CiAgICAgICAgaWYgKCFvcmRlcklucHV0KSByZXR1cm47CgogICAgICAgIGNvbnN0IGFsbEFydGljbGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXj0iQXJ0aWNsZV8iXScpOwogICAgICAgIAogICAgICAgIGNvbnN0IHZhbGlkQXJ0aWNsZXMgPSBBcnJheS5mcm9tKGFsbEFydGljbGVzKS5maWx0ZXIoZWwgPT4gewogICAgICAgICAgICByZXR1cm4gIWVsLmlkLmluY2x1ZGVzKCdFcnJvcicpOyAKICAgICAgICAgICAgcmV0dXJuICFlbC5pZC5pbmNsdWRlcygnTmV4dElEJyk7IAogICAgICAgIH0pOwoKICAgICAgICBjb25zdCBjdXJyZW50TmFtZXMgPSB2YWxpZEFydGljbGVzCiAgICAgICAgICAgIC5tYXAoZWwgPT4gY2xlYW5OYW1lKGVsLnRleHRDb250ZW50IHx8IGVsLnZhbHVlKSkKICAgICAgICAgICAgLmZpbHRlcihuYW1lID0+IG5hbWUgIT09ICIiKTsKCiAgICAgICAgbGV0IGV4aXN0aW5nT3JkZXIgPSBvcmRlcklucHV0LnZhbHVlID8gb3JkZXJJbnB1dC52YWx1ZS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKSA6IFtdOwoKICAgICAgICBleGlzdGluZ09yZGVyID0gZXhpc3RpbmdPcmRlci5maWx0ZXIobmFtZSA9PiBjdXJyZW50TmFtZXMuaW5jbHVkZXMobmFtZSkpOwoKICAgICAgICBjdXJyZW50TmFtZXMuZm9yRWFjaChuYW1lID0+IHsKICAgICAgICAgICAgaWYgKCFleGlzdGluZ09yZGVyLmluY2x1ZGVzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICBleGlzdGluZ09yZGVyLnB1c2gobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgb3JkZXJJbnB1dC52YWx1ZSA9IGV4aXN0aW5nT3JkZXIuam9pbignLCcpOwogICAgfSAKCiAgICBmdW5jdGlvbiBSZWJ1aWxkTGlzdEl0ZW1zKCkgewogICAgICAgIGNvbnN0IG9yZGVySW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnQ3VzdG9tR3JvdXBPcmRlcicpOwogICAgICAgIGNvbnN0IGxpc3RDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnSXRlbUxpc3QnKTsgLy8gRWwgPHVsPiBkb25kZSBlc3TDoW4gbG9zIGl0ZW1zCiAgICAgICAgCiAgICAgICAgaWYgKCFvcmRlcklucHV0IHx8ICFsaXN0Q29udGFpbmVyIHx8ICFvcmRlcklucHV0LnZhbHVlKSByZXR1cm47CiAgICAgICAgY29uc3Qgb3JkZW5Ob21icmVzID0gb3JkZXJJbnB1dC52YWx1ZS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKTsKCiAgICAgICAgY29uc3QgYWxsQXJ0aWNsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49IkFydGljbGVfIl0nKSkKICAgICAgICAgICAgLmZpbHRlcihlbCA9PiAhZWwuaWQuaW5jbHVkZXMoJ0Vycm9yJykpLmZpbHRlcihlbCA9PiAhZWwuaWQuaW5jbHVkZXMoJ05leHRJRCcpKTsKICAgICAgICBsaXN0Q29udGFpbmVyLmlubmVySFRNTCA9ICcnOwoKICAgICAgICBvcmRlbk5vbWJyZXMuZm9yRWFjaChub21icmVFbkNTViA9PiB7CiAgICAgICAgICAgIGNvbnN0IGFydGljdWxvRW5jb250cmFkbyA9IGFsbEFydGljbGVzLmZpbmQoZWwgPT4gewogICAgICAgICAgICAgICAgY29uc3Qgbm9tYnJlTGltcGlvID0gKGVsLnRleHRDb250ZW50IHx8IGVsLnZhbHVlKS5zcGxpdCgnOjonKVswXS50cmltKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbm9tYnJlTGltcGlvID09PSBub21icmVFbkNTVjsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoYXJ0aWN1bG9FbmNvbnRyYWRvKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKSk7CiAgICAgICAgICAgICAgICBsaS5jbGFzc05hbWUgPSAnTGlzdEl0ZW0nOwogICAgICAgICAgICAgICAgbGkudGV4dENvbnRlbnQgPSBub21icmVFbkNTVjsKICAgICAgICAgICAgICAgIGxpLmRhdGFzZXQuaWQgPSBhcnRpY3Vsb0VuY29udHJhZG8uaWQ7ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbGlzdENvbnRhaW5lci5hcHBlbmRDaGlsZChsaSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgYWxsQXJ0aWNsZXMuZm9yRWFjaChlbCA9PiB7CiAgICAgICAgICAgIGNvbnN0IG5vbWJyZUxpbXBpbyA9IChlbC50ZXh0Q29udGVudCB8fCBlbC52YWx1ZSkuc3BsaXQoJzo6JylbMF0udHJpbSgpOwogICAgICAgICAgICBpZiAoIW9yZGVuTm9tYnJlcy5pbmNsdWRlcyhub21icmVMaW1waW8pKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICAgICAgICAgICAgICBsaS5jbGFzc05hbWUgPSAnTGlzdEl0ZW0nOwogICAgICAgICAgICAgICAgbGkudGV4dENvbnRlbnQgPSBub21icmVMaW1waW87CiAgICAgICAgICAgICAgICBsaS5kYXRhc2V0LmlkID0gZWwuaWQ7CiAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyLmFwcGVuZENoaWxkKGxpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEFkZE5ld0FydGljbGUKICAgICAqIEBtZW1iZXJvZiBGQVEuQWdlbnQuU2lkZWJhcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0gCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICBGdW5jdGlvbiBmb3IgYWRkIG5ldyBhcnRpY2xlIGxpbmUuCiAgICAgKi8gICAgCiAgICBmdW5jdGlvbiBBZGROZXdBcnRpY2xlKCkgewogICAgICAgIHZhciBNYXhJRCA9IDA7CgogICAgICAgICQoJ1tpZF49IkZpZWxkX0FydGljbGVfIl0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgQ3VycmVudElEID0gcGFyc2VJbnQoJCh0aGlzKS5hdHRyKCdpZCcpLnNwbGl0KCdfJykucG9wKCkpOwoKICAgICAgICAgICAgaWYgKEN1cnJlbnRJRCA+IE1heElEKSB7CiAgICAgICAgICAgICAgICBNYXhJRCA9IEN1cnJlbnRJRDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB2YXIgTmV4dElEID0gcGFyc2VJbnQoTWF4SUQgKyAxKTsKICAgICAgICAkKCIjQXJ0aWNsZUNvdW50IikudmFsKE5leHRJRCk7CgogICAgICAgIHZhciBUZW1wbGF0ZUhUTUwgPSAkKCIjQXJ0aWNsZVRlbXBsYXRlIikuaHRtbCgpLnJlcGxhY2UoL05leHRJRC9nLCBOZXh0SUQpOwogICAgICAgIHZhciBMYXN0QXJ0aWNsZSA9ICQoJyNGaWVsZF9BcnRpY2xlXycgKyBwYXJzZUludChNYXhJRCkpOwogICAgICAgIExhc3RBcnRpY2xlLmFmdGVyKFRlbXBsYXRlSFRNTCk7CgogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoIiNTaWRlYmFyU2V0dGluZ3MiKTsKICAgIH0gICAgCgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShGQVEuQWdlbnQuU2lkZWJhciB8fCB7fSkpOwo=</File>
        <File Location="var/httpd/htdocs/skins/Agent/default/css/FAQExtendedNavigation.Agent.Default.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIERlZmF1bHQgU2V0dGluZ3MKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKOnJvb3QgewogICAgLS1GQVFTaWRlYmFySWNvblNpemU6IDIwcHg7CiAgICAtLUZBUVNpZGViYXJJY29uTWFyZ2luOiA0cHg7CiAgICAtLUZBUVNpZGViYXJVbmV4cGxhaW5lZFdoaXRlc3BhY2U6IDRweDsKfQoKLk1haW5TaWRlQmFyIHsKICAgIG1hcmdpbi1ib3R0b206IDE1cHg7Cn0KCi5vb29TaWRlQmFySWNvbkhvbWUsCi5vb29TaWRlQmFySWNvbkV4cGxvcmVyIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tRkFRU2lkZWJhckljb25TaXplKSAhaW1wb3J0YW50OwogICAgd2lkdGg6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5vb29TaWRlQmFySWNvbkV4cGxvcmVyIHsKICAgIGZpbGw6IHZhcigtLWNvbFRleHREYXJrKTsKfQoKLm9vb0ZBUVNpZGViYXJIZWFkZXIgewogICAgY29sb3I6IHZhcigtLWNvbFRleHREYXJrKTsKICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5vb29GQVFTaWRlYmFySGVhZGVyOmZpcnN0LWNoaWxkLAoub29vRkFRVE9DSGVhZGVyOmZpcnN0LWNoaWxkCnsKICAgIHBhZGRpbmctdG9wOiAyMHB4Owp9Cgoub29vRkFRTGlua3MgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgIAp9Cgoub29vRkFRTGlua1Bvc2l0aW9uIHsKICAgIG1hcmdpbi10b3A6IDE0cHg7CiAgICBtYXJnaW4tYm90dG9tOiAwcHggIWltcG9ydGFudDsKfQoKLm9vb0ZBUUxpbmtzPmxpOmZpcnN0LWNoaWxkOmhhcyhhOm5vdCgub29vRkFRTGlua1Bvc2l0aW9uKSkKewogICAgbWFyZ2luLXRvcDogNXB4Owp9Cgoub29vRkFRTGlua3M+bGk6Zmlyc3QtY2hpbGQ6aGFzKGE6bm90KC5vb29GQVFMaW5rRmlyc3QpKSB7CiAgICBtYXJnaW4tdG9wOiAwOwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9Cgoub29vRkFRU2lkZWJhciB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1pbi1oZWlnaHQ6IDUwdmg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xCR1NpZGVCYXIpOwogICAgcGFkZGluZzogMHB4IDE2cHggMTZweCAxNnB4Owp9Cgoub29vRkFRU2lkZWJhckFydGljbGUsCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOiAiaWNvbiB0ZXh0IjsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tRkFRU2lkZWJhckljb25TaXplKSBhdXRvOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tRkFRU2lkZWJhckljb25NYXJnaW4pOwogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIHBhZGRpbmctdG9wOiAwLjI1cmVtOwogICAgcGFkZGluZy1sZWZ0OiAwLjFyZW07CiAgICBtaW4taGVpZ2h0OiB2YXIoLS1GQVFTaWRlYmFySWNvblNpemUpOwp9Cgoub29vRkFRQm94IHN2ZyB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgdG9wOiAtMnB4OwogICAgZmlsdGVyOiBicmlnaHRuZXNzKDApIG9wYWNpdHkoMC41KTsKfQoKLm9vb0ZBUVNpZGViYXJMaXN0IGxpOmxhc3QtY2hpbGQgewogIHBhZGRpbmctYm90dG9tOiAyMHB4Owp9Cgoub29vRkFRU2lkZWJhckFydGljbGUrLm9vb0ZBUVNpZGViYXJIZWFkZXIgewogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlOWU4ZTg4YzsKICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICBwYWRkaW5nLXRvcDogMjVweDsKICAgIHBhZGRpbmctYm90dG9tOiA1cHg7Cn0KCi5vb29TaWRlQmFySWNvbiwKLm9vb0ZBUVNpZGViYXIgLm9vb0ljb25TdWJIZWFkZXIsCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBzdmcgewogICAgd2lkdGg6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbik7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5vb29GQVFTaWRlYmFyIC5vb29JY29uU3ViSGVhZGVyIHsKICAgIGdyaWQtYXJlYTogaWNvbjsKICAgIGZvbnQtc2l6ZTogMTdweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBzdmcgewogICAgZmlsbDogdmFyKC0tY29sVGV4dE1lZGl1bSk7Cn0KCi5vb29GQVFUT0NBcnRpY2xlIGEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgY29sb3I6IHZhcigtLWNvbFRleHRGQVFUT0NMaXN0KTsKICAgIHdpZHRoOiA4MCU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlIGEsCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyIHNwYW4gewogICAgZ3JpZC1hcmVhOiB0ZXh0OwogICAgdG9wOiA1cHg7CiAgICB3aWR0aDogODUlOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBhIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0TGluayk7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZTpob3ZlciBhIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7Cn0KCi5CYWNrVG9wIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsb2F0OiByaWdodDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHotaW5kZXg6IDIwMDA7Cn0KCi5CYWNrVG9wICA+IGkgewogICAgY29sb3I6IHZhcigtLWNvbEJHRGFyayk7Cn0KCi5vb29GQVFFeHBsb3JlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBsZWZ0OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCByZ2JhKDQsIDAsIDcxLCAuMTYpOwogICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgdmFyKC0tY29sU2hhZG93RGFyayk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgcGFkZGluZzogMTZweDsKfQoKLm9vb0ZBUVRPQyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBhZGRpbmc6IDhweCAxNnB4IDE2cHggMTBweDsKfQoKLm9vb0ZBUVNpZGViYXJMaXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwogICAgbWF4LXdpZHRoOiAzMjBweDsKfQoKLm9vb0ZBUUhlYWRlciB7CiAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgZm9udC1zaXplOiAxM3B4Owp9Cgoub29vRkFRVE9DQXJ0aWNsZSB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5vb29GQVFUT0NBcnRpY2xlIGEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgY29sb3I6IHZhcigtLWNvbFRleHRGQVFUT0NMaXN0KTsKICAgIHdpZHRoOiA4NSU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLlRPQ0xldmVsMSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0b3A6IC0ycHg7Cn0KCi5UT0NMZXZlbDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAtMnB4OwogICAgbGVmdDogMTBweDsKfQoKLkxpbmtMZXZlbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nLWxlZnQ6IDZweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDsKfQoKLkxpbmtMZXZlbDIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1sZWZ0OiAxNnB4Owp9CgouTGlua0FuY2hvclNpbmdsZSB7CiAgICBsZWZ0OiAxMHB4Owp9CgouTGlua0ZBUUV4cGxvcmVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgouQXJ0aWNsZUFyZWE+LldpZGdldFNpbXBsZSwKLlRhYmxlT2ZDb250ZW50cz4uV2lkZ2V0U2ltcGxlLAouU2lkZWJhckFyZWE+LldpZGdldFNpbXBsZQp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi5IZWFkbGluZSBzdmcgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGZpbGw6IHZhcigtLWNvbFRleHRNZWRpdW0pOwp9CgouSGVhZGxpbmUgaDEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouSWNvbkZpZWxkIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5JY29uQm94IHsKICAgIGhlaWdodDogMzJweDsgCiAgICB3aWR0aDogMzJweDsgCiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOyAKICAgIG1hcmdpbi1ib3R0b206IDFweDsgIAogICAgYmFja2dyb3VuZC1zaXplOmNvdmVyOwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7IAogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKI0J0blVwbG9hZEljb24gewogICAgd2lkdGg6IGF1dG87CiAgICBsaW5lLWJyZWFrOiB1bnNldDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBtYXJnaW4tbGVmdDogMTJweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZS5vb29GQVFTdWJIZWFkZXJTcGFjaW5nIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2U7CiAgICBwYWRkaW5nLWxlZnQ6IGNhbGMoIAogICAgICAgIHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSkgKyAKICAgICAgICB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbikgKwogICAgICAgIDE2cHgKICAgICk7IAp9Cgoub29vRkFRU2lkZWJhckFydGljbGUub29vLWlzLXZpc2libGUgewogICAgZGlzcGxheTogZmxleDsKICAgIG9wYWNpdHk6IDE7Cn0KCn0K</File>
        <File Location="var/httpd/htdocs/skins/Agent/default/css/FAQExtendedNavigation.Agent.Detail.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIEZBUURldGFpbHMKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKICAgIC5MYXlvdXRGaXhlZFNpZGViYXIuU2lkZWJhckZpcnN0ID4gZGl2LlNpZGViYXJDb2x1bW4gewogICAgICAgIHdpZHRoOiAyNDBweDsKICAgIH0KCiAgICAuWm9vbVRpdGxlIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLlJhdGVCdXR0b25zID4gbGkgewogICAgICAgIG1heC13aWR0aDogNzJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIC8qIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBvZiBGQVEgKi8KICAgIHNwYW4uRkFRU3RhdGVOYW1lIHsKICAgICAgICByaWdodDogMzBweDsKICAgICAgICB0b3A6IDlweDsKICAgIH0KCn0K</File>
        <File Location="var/httpd/htdocs/skins/Agent/default/css/FAQ.Agent.Sidebar.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIERlZmF1bHQgU2V0dGluZ3MKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLkRyb3Bkb3duU3BhY2luZyB7CiAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLkFycmF5SXRlbSBidXR0b24uUmVtb3ZlQnV0dG9uIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAyMnB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIHRvcDogMHB4OwogICAgYm9yZGVyOiAwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZSAwLjNzOwogICAgY29sb3I6ICNiYmI7CiAgICBmb250LXNpemU6IDE0cHg7Cn0KCiNCdG5BZGRFbnRyeS5BZGRCdXR0b24KewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDIycHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgbWFyZ2luLXRvcDogNXB4OwogICAgbGVmdDogNXB4OwogICAgYm9yZGVyOiAwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZSAwLjNzOwogICAgY29sb3I6ICNiYmI7CiAgICBmb250LXNpemU6IDE0cHg7Cn0KCi5BcnJheUl0ZW0gYnV0dG9uLlJlbW92ZUJ1dHRvbjpob3ZlciwKLkFycmF5SXRlbSBidXR0b24uUmVtb3ZlQnV0dG9uOmZvY3VzLAojQnRuQWRkRW50cnkuQWRkQnV0dG9uOmhvdmVyLAojQnRuQWRkRW50cnkuQWRkQnV0dG9uOmZvY3VzCnsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5TaWRlQmFyRXhwbGFuYXRpb24gPiBsaQp7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKfQoKLlNpZGVCYXJFeHBsYW5hdGlvbiA+IGxpID4gdWwgPiBsaSAKewogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgbGluZS1oZWlnaHQ6IDE2cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7Cn0KCi5TaWRlQmFyRXhwbGFuYXRpb24gPiBsaT4gdWwgPiBsaTpmaXJzdC1jaGlsZCB7CiAgICBtYXJnaW4tdG9wOiA1cHg7Cn0KCi5PcHRpb25MaXN0IHsKICAgIHdpZHRoOiAzMDBweDsKICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgIG1hcmdpbi10b3A6IDNweDsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKfQoKLkxpc3RDb250YWluZXIgewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5MaXN0SXRlbSB7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7Cn0KCi5MaXN0SXRlbTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xIb3ZlckxpZ2h0KTsKfQoKLkxpc3RJdGVtLnNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbEJHTGlnaHRNZWRpdW0pOwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1jb2xUZXh0TGluayk7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoKLk9yZGVyQnV0dG9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA1cHg7Cn0KCiNidG5VcCwgI2J0bkRvd24gewogICAgY3Vyc29yOiBwb2ludGVyOwoKfQoKfQo=</File>
        <File Location="var/httpd/htdocs/skins/Agent/default/css/RichTextArticleContent.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qIEFkZGVkIGZyb20gdmFyL2h0dHBkL2h0ZG9jcy9za2lucy9BZ2VudC9kZWZhdWx0L2Nzcy9Db3JlLlJlc2V0LmNzcyB0byBlbnN1cmUgY29uc2lzdGVudCBzdHlsaW5nICovCgouY2stY29udGVudCBodG1sLCAuY2stY29udGVudCBib2R5LCAuY2stY29udGVudCBkaXYsCi5jay1jb250ZW50IHNwYW4sIC5jay1jb250ZW50IGgxLCAuY2stY29udGVudCBoMiwKLmNrLWNvbnRlbnQgaDMsIC5jay1jb250ZW50IGg0LCAuY2stY29udGVudCBoNSwKLmNrLWNvbnRlbnQgaDYsIC5jay1jb250ZW50IHAsIC5jay1jb250ZW50IGJsb2NrcXVvdGUsCi5jay1jb250ZW50IGNpdGUsIC5jay1jb250ZW50IGNvZGUsCi5jay1jb250ZW50IGVtLCAuY2stY29udGVudCBpbWcsCi5jay1jb250ZW50IHEsIC5jay1jb250ZW50IHMsCi5jay1jb250ZW50IHNtYWxsLCAuY2stY29udGVudCBzdHJpa2UsIC5jay1jb250ZW50IHN0cm9uZywKLmNrLWNvbnRlbnQgc3ViLCAuY2stY29udGVudCBzdXAsIC5jay1jb250ZW50IHR0LAouY2stY29udGVudCB2YXIsIC5jay1jb250ZW50IGRsLCAuY2stY29udGVudCBkdCwKLmNrLWNvbnRlbnQgZGQsIC5jay1jb250ZW50IG9sLCAuY2stY29udGVudCB1bCwKLmNrLWNvbnRlbnQgbGksIC5jay1jb250ZW50IGZpZWxkc2V0LCAuY2stY29udGVudCBmb3JtLAouY2stY29udGVudCBsYWJlbCwgLmNrLWNvbnRlbnQgbGVnZW5kLCAuY2stY29udGVudCB0YWJsZSwKLmNrLWNvbnRlbnQgY2FwdGlvbiwgLmNrLWNvbnRlbnQgdGJvZHksIC5jay1jb250ZW50IHRmb290LAouY2stY29udGVudCB0aGVhZCwgLmNrLWNvbnRlbnQgdHIsIC5jay1jb250ZW50IHRoLAouY2stY29udGVudCB0ZCwgLmNrLWNvbnRlbnQgaHIgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMDsKICAgIG91dGxpbmU6IDA7CiAgICBmb250LXdlaWdodDogaW5oZXJpdDsKICAgIGZvbnQtc3R5bGU6IGluaGVyaXQ7CiAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgICBkaXJlY3Rpb246IGluaGVyaXQ7Cn0KCi8qIEVuZCBvZiBhZGRpdGlvbnMgZnJvbSBDb3JlLlJlc2V0LmNzcyAqLwoKLmNrLWNvbnRlbnQgewogICAgdGV4dC13cmFwOiB3cmFwOwogICAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS4yZW07CiAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgY29sb3I6ICMwMDAwMDA7CiAgICBtYXJnaW4tYm90dG9tOiAwcHg7Cn0KCi8qIFJvdGhlciBPU1MgLyBBZGQgbWVudGlvbiBhbmQgdHJhbnNwYXJlbnQgKi8KLmNrLWNvbnRlbnQgYSwKLmNrLWNvbnRlbnQgYS5tZW50aW9uIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgY29sb3I6ICMwMDFiZmY7Cn0KCi5jay1jb250ZW50IGE6aG92ZXIsCi5jay1jb250ZW50IGEubWVudGlvbjpob3ZlciwKLmNrLWNvbnRlbnQgYTpmb2N1cywKLmNrLWNvbnRlbnQgYS5tZW50aW9uOmZvY3VzIHsKICAgIGNvbG9yOiAjMDAwMjNjOwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi5jay1jb250ZW50ICo6dmlzaXRlZCB7CiAgICBjb2xvcjogIzAwMWJmZjsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9Ci8qIEVPIEFkZCBtZW50aW9uIGFuZCB0cmFuc3BhcmVudCAqLwoKLmNrLWNvbnRlbnQgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgouY2stY29udGVudCBlbSB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5jay1jb250ZW50IGZpZ3VyZS50YWJsZSB7CiAgICBtYXJnaW46IDAgMCAwIDA7CiAgICB3aWR0aDogMTAwJTsKfQoKLmNrLWNvbnRlbnQgcCB7CiAgICBtYXJnaW4tdG9wOiAwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAwcHg7Cn0KCi5jay1jb250ZW50IGgxIHsKICAgIGZvbnQtc2l6ZTogMmVtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgY29sb3I6IGluaGVyaXQ7Cn0gCgouY2stY29udGVudCBoMiB7CiAgICBmb250LXNpemU6IDEuNWVtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgY29sb3I6IGluaGVyaXQ7Cn0KCi5jay1jb250ZW50IGgzIHsKICAgIGZvbnQtc2l6ZTogMS4xN2VtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICBjb2xvcjogaW5oZXJpdDsKfQoKLmNrLWNvbnRlbnQgaDQgewogICAgZm9udC1zaXplOiAxZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgIGNvbG9yOiBpbmhlcml0Owp9CgouY2stY29udGVudCBoNSB7CiAgICBmb250LXNpemU6IDAuODNlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgY29sb3I6IGluaGVyaXQ7Cn0gCgouY2stY29udGVudCBoNiB7CiAgICBmb250LXNpemU6IDAuNjdlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgY29sb3I6IGluaGVyaXQ7Cn0gCgouY2stY29udGVudCBibG9ja3F1b3RlIHsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWxlZnQ6IHNvbGlkICMwMDAwOTkgMS41cHQgIWltcG9ydGFudDsgCiAgICBwYWRkaW5nOiAwY20gMGNtIDBjbSA0cHQgIWltcG9ydGFudDsKICAgIG1hcmdpbjogMDsKfQoKLmNrLWNvbnRlbnQgdWwsCi5jay1jb250ZW50IG9sICAKewogICAgcGFkZGluZzogMCA1MHB4Owp9CgovKiBkZWZhdWx0IGltYWdlIHN0eWxlICovCi5jay1jb250ZW50IGZpZ3VyZS5pbWFnZTpub3QoICAgLmltYWdlLXN0eWxlLWFsaWduLWNlbnRlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmltYWdlLXN0eWxlLWJsb2NrLWFsaWduLXJpZ2h0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW1hZ2Utc3R5bGUtYWxpZ24tbGVmdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmltYWdlLXN0eWxlLWFsaWduLXJpZ2h0KSAKewogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSB2YXIoLS1jay1pbWFnZS1zdHlsZS1zcGFjaW5nKSk7CiAgICBtYXJnaW4tbGVmdDogMDsKICAgIG1hcmdpbi1yaWdodDogYXV0bwp9CgouY2stY29udGVudCBjb2RlIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cn0K</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/FAQExtendedNavigation.Customer.Default.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCjpyb290IHsKICAgIC0tRkFRU2lkZWJhckljb25TaXplOiAyMHB4OwogICAgLS1GQVFTaWRlYmFySWNvbk1hcmdpbjogNHB4OwogICAgLS1GQVFTaWRlYmFyVW5leHBsYWluZWRXaGl0ZXNwYWNlOiA0cHg7Cn0KCi5GQVFIb21lIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7Cn0KCiNvb29TZWFyY2hCb3guRkFRU2VhcmNoQm94IHsKICAgIHBhZGRpbmctcmlnaHQ6IDA7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKI29vb1NlYXJjaC5vb29TZWFyY2hGQVEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbGVmdDogMDsKICAgIHdpZHRoOiBjYWxjKCAxMDAlIC0gMzZweCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xCR0xpZ2h0KTsKfQoKLm9vb1NlYXJjaEZBUSArICNvb29TZWFyY2hMYWJlbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBsZWZ0OiBjYWxjKCAtMTAwJSArIDI4cHggKTsKfQoKLldpZGdldENvbHVtbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMjRweDsKfQoKLkFydGljbGVBcmVhPi5XaWRnZXRTaW1wbGUsCi5UYWJsZU9mQ29udGVudHM+LldpZGdldFNpbXBsZSwKLlNpZGViYXJBcmVhPi5XaWRnZXRTaW1wbGUKewogICAgbWFyZ2luLXRvcDogMHB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5BZGRpdGlvbmFsRGF0YT4uV2lkZ2V0U2ltcGxlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLlJhdGluZz4uV2lkZ2V0U2ltcGxlIHsKICAgIG1hcmdpbi10b3A6IDI0cHg7Cn0KCiNSYXRlU3VibWl0QnV0dG9uIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMTVweDsKfQoKLlZvdGluZ0NvbnRhaW5lciB7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouS2V5d29yZCB7CiAgICBjb2xvcjogdmFyKC0tY29sVGV4dExpZ2h0KQp9Cgoub29vRkFRSW5kZXggewogICAgbWFyZ2luLXRvcDogMHB4ICFpbXBvcnRhbnQ7Cn0KCi5Db250ZW50SW5kZXggPiBhIHsKICAgIHNjcm9sbC1tYXJnaW4tdG9wOiAxNTVweDsKfQoKLm9vb0ZBUVRPQyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1pbi1oZWlnaHQ6IDIwdmg7CiAgICBib3JkZXItcmFkaXVzOiAyMHB4OwogICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgcmdiYSg0LCAwLCA3MSwgLjE2KTsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHZhcigtLWNvbFNoYWRvd0RhcmspOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDE2cHggMjRweCAxNnB4IDE2cHg7Cn0KCi5UT0NMZXZlbDEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAtNnB4Owp9CgouVE9DTGV2ZWwyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogLTZweDsKICAgIGxlZnQ6IDEwcHg7Cn0KCi5MaW5rTGV2ZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1sZWZ0OiA2cHg7CiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7Cn0KCi5MaW5rTGV2ZWwyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHBhZGRpbmctbGVmdDogMTZweDsKfQoKLkxpbmtBbmNob3JTaW5nbGUgewogICAgbGVmdDogMTBweDsKfQoKLktleXdvcmQgPiBhIHsgCiAgICBjb2xvcjogIzAwMWJmZjsKfQoKLm9vb0ZBUUFkZGl0aW9uYWxEYXRhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9Cgoub29vRkFRUmF0aW5nIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9CgouVm90aW5nQm94IHsKICAgIG1hcmdpbi10b3A6IDBweCAhaW1wb3J0YW50Owp9CgouUmF0ZUJ1dHRvbiB7CiAgICB3aWR0aDogMjBweDsKfQoKLlJhdGVMYWJlbEJlZm9yZSB7CiAgICBtYXJnaW4tbGVmdDogMHB4OwogICAgcGFkZGluZy1yaWdodDogM3B4Owp9CgouUmF0ZUxhYmVsQWZ0ZXIgewogICAgbWFyZ2luLXJpZ2h0OiAwcHg7Cn0KCiNNZXNzZW5nZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm9vb0ZBUUV4cGxvcmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9Cgoub29vU2lkZUJhckljb25FeHBsb3JlciB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZpbGw6IHZhcigtLWNvbFRleHREYXJrKTsKfQoKLm9vb1NpZGVCYXJJY29uSG9tZSB7CiAgICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMXB4OwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7Cn0KCi5vb29JbmRleEljb25FeHBsb3JlciB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMnB4OwogICAgY29udGVudDogdXJsKCAnLi4vaW1nL2ZhcS5zdmcnICk7Cn0KCi5MaW5rRkFRRXhwbG9yZXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgoub29vRkFRU2lkZWJhciB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCByZ2JhKDQsIDAsIDcxLCAuMTYpOwogICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgdmFyKC0tY29sU2hhZG93RGFyayk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgcGFkZGluZzogMTZweCAxNnB4IDE2cHggMTZweDsKfQoKLm9vb0ZBUVNpZGViYXJMaXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwogICAgbWF4LXdpZHRoOiAzMjBweDsKfQoKLm9vb0ZBUVNpZGViYXJIZWFkZXIgewogICAgY29sb3I6IHZhcigtLWNvbFRleHREYXJrKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBwYWRkaW5nOiAyNXB4IDEwcHggMTBweCAwcHg7Cn0KCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBwYWRkaW5nLWxlZnQ6IC4ycmVtOwogICAgcGFkZGluZy10b3A6IDhweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm9vb0ZBUVNpZGViYXJTdWJIZWFkZXIgLmZhLWNoZXZyb24tcmlnaHQgewogICAgbWFyZ2luLXJpZ2h0OiAxM3B4Owp9Cgoub29vRkFRU3ViSGVhZGVyU3BhY2luZyB7CiAgICBwYWRkaW5nLWxlZnQ6IDI3cHggIWltcG9ydGFudDsKfQoKLm9vb0ZBUUhlYWRlciB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBwYWRkaW5nOiA4cHggMCAxMnB4IDA7Cn0KCi5vb29GQVFTaWRlYmFySGVhZGVyOmZpcnN0LWNoaWxkLAoub29vRkFRVE9DSGVhZGVyOmZpcnN0LWNoaWxkCnsKICAgIHBhZGRpbmctdG9wOiA4cHg7Cn0KCi5vb29GQVFMaW5rczpmaXJzdC1jaGlsZCB7CiAgICBwYWRkaW5nLXRvcDogNXB4Owp9Cgoub29vRkFRTGlua3MgPiBsaSB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSwKLm9vb0ZBUVNpZGViYXJTdWJIZWFkZXIgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJpY29uIHRleHQiOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1GQVFTaWRlYmFySWNvblNpemUpIGF1dG87CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbik7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgcGFkZGluZy10b3A6IDAuMjVyZW07CiAgICBwYWRkaW5nLWxlZnQ6IDAuMXJlbTsKICAgIG1pbi1oZWlnaHQ6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7Cn0KCi5vb29GQVFCb3ggc3ZnIHsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICB0b3A6IC0ycHg7CiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMCkgb3BhY2l0eSgwLjUpOwp9Cgoub29vRkFRU2lkZWJhckFydGljbGUgc3ZnIHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgZmlsbDogdmFyKC0tY29sVGV4dERhcmspOwp9Cgoub29vRkFRU2lkZWJhckxpc3QgbGk6bGFzdC1jaGlsZCB7CiAgcGFkZGluZy1ib3R0b206IDIwcHg7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSsub29vRkFRU2lkZWJhckhlYWRlciB7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U5ZThlODhjOwogICAgbWFyZ2luLXRvcDogMTZweDsKICAgIHBhZGRpbmctdG9wOiAyMHB4Owp9Cgoub29vU2lkZUJhckljb24sCi5vb29GQVFTaWRlYmFyIC5vb29JY29uU3ViSGVhZGVyLAoub29vRkFRU2lkZWJhckFydGljbGUgc3ZnIHsKICAgIHdpZHRoOiB2YXIoLS1GQVFTaWRlYmFySWNvblNpemUpOwogICAgaGVpZ2h0OiB2YXIoLS1GQVFTaWRlYmFySWNvblNpemUpOwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIG1hcmdpbi1yaWdodDogdmFyKC0tRkFRU2lkZWJhckljb25NYXJnaW4pOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgoub29vRkFRU2lkZWJhciAub29vSWNvblN1YkhlYWRlciB7CiAgICBncmlkLWFyZWE6IGljb247CiAgICBmb250LXNpemU6IDE3cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29sVGV4dERhcmspOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cgoub29vRkFRVE9DQXJ0aWNsZSBhIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHdpZHRoOiA4MCU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlIGEsCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyIHNwYW4gewogICAgZ3JpZC1hcmVhOiB0ZXh0OwogICAgdG9wOiA1cHg7CiAgICB3aWR0aDogODUlOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZTpob3ZlciBhIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xNYWluSG92ZXIpOwp9CgouQmFja1RvcCB7CiAgICBmbG9hdDogcmlnaHQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29sVGV4dExpZ2h0KTsKICAgIG9wYWNpdHk6IDAuNTsKfQoKLkNhcHRpb25MYWJlbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCmh0bWwgewogICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7CiAgICBzY3JvbGwtcGFkZGluZy10b3A6IDE0NXB4Owp9Cgoub29vRkFRU2lkZWJhckFydGljbGUub29vRkFRU3ViSGVhZGVyU3BhY2luZyB7CiAgICBkaXNwbGF5OiBub25lOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOwogICAgcGFkZGluZy1sZWZ0OiBjYWxjKCAKICAgICAgICB2YXIoLS1GQVFTaWRlYmFySWNvblNpemUpICsgCiAgICAgICAgdmFyKC0tRkFRU2lkZWJhckljb25NYXJnaW4pICsKICAgICAgICAxNnB4CiAgICApOyAKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlLm9vby1pcy12aXNpYmxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBvcGFjaXR5OiAxOwp9Cgoub29vRkFRU2lkZWJhclN1YkhlYWRlci5pcy1leHBhbmRlZCAuZmEtY2hldnJvbi1yaWdodCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAycHg7Cn0K</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/FAQExtendedNavigation.Customer.Detail.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIERlZmF1bHQgU2V0dGluZ3MKICovCgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7CiAgICAjb29vTWFpbkJveC5GQVFDb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtcm93LWdhcDogOHB4OwogICAgICAgIHdpZHRoOiBjYWxjKCAxMDAlIC0gMTZweCApOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gYXV0bzsKICAgIH0KCiAgICAjb29vSGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBncmlkOyAKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsgCiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiA0NXB4IDMwcHggMzZweDsKICAgICAgICBncmlkLXJvdy1nYXA6IDhweDsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgI0ZBUVNpZGViYXIgewogICAgICAgIGdyaWQtYXJlYTogMiAvIDEgLyAzIC8gMjsKICAgIH0KCiAgICAjb29vTWFpbkJveCA+IC5BcnRpY2xlQXJlYSB7CiAgICAgICAgZ3JpZC1hcmVhOiAxIC8gMSAvIDIgLyAyOwogICAgfQoKICAgICNvb29NYWluQm94ID4gLldpZGdldENvbHVtbiB7CiAgICAgICAgZGlzcGxheTogbm9uZQogICAgfQoKICAgICNNZXNzYWdlcyA+IGxpLAogICAgI1pvb21TaWRlYmFyIHsKICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICB9CgogICAgLk1haW5TaWRlQmFyIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICB9Cn0KCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICAgICNNZXNzYWdlcyA+IGxpLAogICAgI1pvb21TaWRlYmFyIHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgfQoKICAgIC5NYWluU2lkZUJhciB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgIH0KCgogICAgLkhlYWRlclJvd1RpdGxlIHsKICAgICAgZ3JpZC1yb3c6IHNwYW4gMjsKICAgIH0KCiAgICAuUHVibGljSGVhZGVyUm93VGl0bGUgewogICAgICBncmlkLXJvdzogc3BhbiAyOwogICAgICBwYWRkaW5nLWxlZnQ6IDE5MHB4OwogICAgfQp9CgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSBhbmQgKG1heC13aWR0aDogMTE3NXB4KSB7CiAgICAjb29vTWFpbkJveC5GQVFDb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgZ3JpZC1yb3ctZ2FwOiAyNHB4OwogICAgICAgIHdpZHRoOiBjYWxjKCAxMDAlIC0gMTA0cHggKTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDgwcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogMjRweDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gYXV0bzsKICAgIH0KCiAgICAjb29vSGVhZGVyIHsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDEwNHB4ICkgIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDgwcHggIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgZGlzcGxheTogZ3JpZDsgCiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzMzJweCAxZnI7IAogICAgICAgIGdyaWQtY29sdW1uLWdhcDogMjRweDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDQ4cHggNDhweDsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgI0ZBUVNpZGViYXIgewogICAgICAgIGdyaWQtYXJlYTogMiAvIDEgLyAzIC8gMjsKICAgIH0KCiAgICAjb29vTWFpbkJveCA+IC5BcnRpY2xlQXJlYSB7CiAgICAgICAgZ3JpZC1hcmVhOiAxIC8gMSAvIDIgLyAyOwogICAgfQoKICAgICNvb29NYWluQm94ID4gLldpZGdldENvbHVtbiB7CiAgICAgICAgZGlzcGxheTogbm9uZQogICAgfQp9CgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDExNzZweCApIGFuZCAobWF4LXdpZHRoOiAxNDM5cHgpIHsKICAgICNvb29NYWluQm94LkZBUUNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgICBncmlkLWNvbHVtbi1nYXA6IDI0cHg7CiAgICAgICAgd2lkdGg6IGNhbGMoIDEwMCUgLSAxMDRweCApOwogICAgICAgIHBhZGRpbmctbGVmdDogODBweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4OwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogY2FsYyggMTAwJSAtIDM0NHB4ICkgMzIwcHg7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBhdXRvIDFmcjsKICAgIH0KCiAgICAjb29vSGVhZGVyIHsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDEwNHB4ICkgIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDgwcHggIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgZGlzcGxheTogZ3JpZDsgCiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzMzJweCBjYWxjKCAxMDAlIC0gNDMycHggKTsgCiAgICAgICAgZ3JpZC1jb2x1bW4tZ2FwOiAyNHB4OwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogNDhweCA0OHB4OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAjRkFRU2lkZWJhciB7CiAgICAgICAgZ3JpZC1hcmVhOiAyIC8gMiAvIDMgLyAzOwogICAgfQoKICAgICNvb29NYWluQm94ID4gLkFydGljbGVBcmVhIHsKICAgICAgICBncmlkLWFyZWE6IDEgLyAxIC8gMyAvIDI7CiAgICB9CgogICAgI29vb01haW5Cb3ggPiAuV2lkZ2V0Q29sdW1uIHsKICAgICAgICBncmlkLWFyZWE6IDEgLyAyIC8gMiAvIDM7CiAgICB9Cn0KCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTQ0MHB4ICkgYW5kIChtYXgtd2lkdGg6IDE3MjdweCkgewogICAgI29vb01haW5Cb3guRkFRQ29udGVudCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIGdyaWQtY29sdW1uLWdhcDogMjRweDsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDEwNHB4ICk7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA4MHB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDI0cHg7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyNDBweCBjYWxjKCAxMDAlIC0gNjA4cHggKSAzMjBweDsKICAgIH0KCiAgICAjb29vSGVhZGVyIHsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDEwNHB4ICkgIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDgwcHggIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgZGlzcGxheTogZ3JpZDsgCiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzMzJweCBjYWxjKCAxMDAlIC0gNzkycHggKTsgCiAgICAgICAgZ3JpZC1jb2x1bW4tZ2FwOiAyNHB4OwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogNDhweCA0OHB4OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAub29vRkFRU2lkZWJhciB7CiAgICAgICAgbWluLWhlaWdodDogNTB2aDsKICAgIH0KfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxNzI4cHggKSB7CiAgICAjb29vTWFpbkJveC5GQVFDb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgZ3JpZC1jb2x1bW4tZ2FwOiAyNHB4OwogICAgICAgIHdpZHRoOiAxNjI0cHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiBjYWxjKCA1MCUgLSA3ODRweCApOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IGNhbGMoIDUwJSAtIDg0MHB4ICk7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyNDBweCAxMDE2cHggMzIwcHg7CiAgICB9CgogICAgI29vb0hlYWRlciB7CiAgICAgICAgd2lkdGg6IDE2MjRweCAhaW1wb3J0YW50OwogICAgICAgIHBhZGRpbmctbGVmdDogY2FsYyggNTAlIC0gNzg0cHggKSAhaW1wb3J0YW50OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IGNhbGMoIDUwJSAtIDg0MHB4ICkgIWltcG9ydGFudDsKICAgICAgICBkaXNwbGF5OiBncmlkOyAKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDMzMnB4IDgzMnB4OyAKICAgICAgICBncmlkLWNvbHVtbi1nYXA6IDI0cHg7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiA0OHB4IDQ4cHg7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5vb29GQVFTaWRlYmFyIHsKICAgICAgICBtaW4taGVpZ2h0OiA1MHZoOwogICAgfQp9CgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKICAgICNvb29IZWFkZXIgaSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDNweDsKICAgIH0KCiAgICAuQnJlYWRDcnVtYiB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIH0KCiAgICAuQnJlYWRDcnVtYiBhLAogICAgLkJyZWFkQ3J1bWIgaDMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIH0KCiAgICAuQnJlYWRDcnVtYiA+IGE6YWZ0ZXIgewogICAgICAgIC8qIHVzZSAhaW1wb3J0YW50IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggYnJvd3NlciBleHRlbnNpb25zIHRoYXQgY2hhbmdlIGZvbnRzICovCiAgICAgICAgZm9udC1mYW1pbHk6ICdvdG9ibycgIWltcG9ydGFudDsKICAgICAgICBzcGVhazogbm9uZTsKICAgICAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBsaW5lLWhlaWdodDogMTsKCiAgICAgICAgLyogQmV0dGVyIEZvbnQgUmVuZGVyaW5nID09PT09PT09PT09ICovCiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTsKCiAgICAgICAgY29udGVudDogIlxlOTA0IjsKICAgICAgICBjb2xvcjogIzdmODA5ZDsKICAgICAgICBjb2xvcjogdmFyKC0tY29sVGV4dExpZ2h0KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDRweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICB9CgogICAgI29vb0N1c3RvbWVyTm90aWZpY2F0aW9ucyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmOTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xCR0xpZ2h0KTsKICAgIH0KCiAgICAuSGVhZGVyIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMTZweDsKICAgIH0KCi8qIFN1YkNhdGVnb3JpZXMgKi8KICAgIC5vb29TdWJCb3ggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0b3A6IC01cHg7CiAgICAgICAgbGVmdDogLTVweDsKICAgICAgICBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7CiAgICAgICAgbWFyZ2luLXRvcDogOHB4OwoKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbWF4LWhlaWdodDogMjYwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIH0KCiAgICAub29vU3ViIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiA2NnB4OwogICAgICAgIHdpZHRoOiAyNTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIDAuMTYpOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHZhcigtLWNvbFNoYWRvd0RhcmspOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNnB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgcGFkZGluZzogMjRweCAyNHB4IDI0cHggMjRweDsKICAgIH0KCiAgICAub29vU3ViID4gaDMsCiAgICAub29vU3ViID4gcCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQoKICAgIC5vb29TdWIgPiBoMyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1heC13aWR0aDogMjIwcHg7CiAgICB9CgogICAgLm9vb1N1YkNvdW50IHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy10b3A6IDJweDsKICAgIH0KCiAgICAub29vQ29tbWVudCB7CiAgICAgICAgaGVpZ2h0OiA0MnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgfQoKLyogYXJ0aWNsZSBsaXN0ICovCiAgICAuSGVhZGVyID4gaDIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIH0KICAgIC5QYWdpbmF0aW9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogMzZweDsKICAgIH0KCiAgICAub29vRkFRIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgd2lkdGg6IGNhbGMoIDEwMCUgLSA3MnB4ICk7CiAgICAgICAgbWF4LXdpZHRoOiAxMDQ4cHg7IC8qIGNvbnNpZGVyIHJlbW92aW5nIHdoZW4gbWVyZ2luZyB3aXRoIEZBUSAqLwogICAgICAgIGJvcmRlci1yYWRpdXM6IDE1cHg7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgcmdiYSg0LCAwLCA3MSwgMC4xNik7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgdmFyKC0tY29sU2hhZG93RGFyayk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgICBwYWRkaW5nOiAyNHB4IDM2cHggMjRweCAzNnB4OwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICB9CgogICAgLm9vb0ZBUSBoMyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1heC13aWR0aDogY2FsYyggMTAwJSAtIDQwcHggKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB9CgogICAgLm9vb0ZBUSBwIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgcGFkZGluZy10b3A6IDJweDsKICAgIH0KCi8qIGFydGljbGUgem9vbSAqLwoKICAgICNNZXNzYWdlcyA+IGxpLAogICAgI1pvb21TaWRlYmFyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDcycHggKTsKICAgICAgICBtYXgtd2lkdGg6IDk3OHB4OyAvKiBjb25zaWRlciByZW1vdmluZyB3aGVuIG1lcmdpbmcgd2l0aCBGQVEgKi8KICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIDAuMTYpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICAgICAgcGFkZGluZzogMjRweCAzNnB4IDI0cHggMzZweDsKICAgIH0KCiAgICAjTWVzc2FnZXMgLk1lc3NhZ2VCb2R5IHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgIH0KCiAgICAuQXR0YWNobWVudHMsCiAgICAjTWV0YWRhdGEgewogICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICB9CgovKiBSYXRpbmcgKi8KICAgIC5SYXRlQnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMzBweDsKICAgICAgICB3aWR0aDogMjVweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgY29sb3I6ICMwMDAwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgfQogICAgCiAgICAuUlRMIC5SYXRlQnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICB9CiAgICAKICAgIC5SYXRlQnV0dG9uIGkgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICM3ZjgwOWQ7CiAgICAgICAgY29sb3I6IHZhcigtLWNvbFRleHRMaWdodCk7CiAgICB9CiAgICAKICAgIC5SYXRlQnV0dG9uIGkuZmEtc3RhciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KICAgIAogICAgLlJhdGVCdXR0b24uUmF0ZUNoZWNrZWQgaS5mYS1zdGFyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBjb2xvcjogIzAwMWJmZjsKICAgICAgICBjb2xvcjogdmFyKC0tY29sTWFpbkxpZ2h0KTsKICAgIH0KICAgIAogICAgLlJhdGVCdXR0b24uUmF0ZUNoZWNrZWQgaS5mYS1zdGFyLW8gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CiAgICAKICAgIC5SYXRlQnV0dG9uOmhvdmVyIGkuZmEtc3Rhci1vIHsKICAgICAgICBjb2xvcjogIzAwMDIzYzsKICAgICAgICBjb2xvcjogdmFyKC0tY29sTWFpbkRhcmspOwogICAgfQogICAgCiAgICAuUmF0ZVN0YXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxcHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgfQogICAgCiAgICAuUlRMIC5SYXRlU3RhciB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgfQogICAgCiAgICAuUmF0ZVN0YXJUZXh0IHsKICAgICAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgfQogICAgCiAgICAuUlRMIC5SYXRlU3RhclRleHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA2cHg7CiAgICB9CiAgICAKICAgIC5SYXRlTGFiZWxCZWZvcmUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICB9CiAgICAKICAgIC5SVEwgLlJhdGVMYWJlbEJlZm9yZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgfQogICAgCiAgICAuUmF0ZUxhYmVsQWZ0ZXIgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyNXB4OwogICAgfQogICAgCiAgICAuUlRMIC5SYXRlTGFiZWxBZnRlciB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDY1cHg7CiAgICB9CiAgICAKICAgIC5SYXRpbmdMYWJlbCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMnB4OwogICAgfQogICAgCiAgICAuUlRMIC5SYXRpbmdMYWJlbCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgfQoKICAgIC5Wb3RpbmdCb3ggewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICB9CgogICAgI0ZBUVZvdGluZyAuU3BhY2luZ1RvcCB7CiAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgfQp9Cg==</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/RichTextArticleContent.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qIEFkZGVkIGZyb20gdmFyL2h0dHBkL2h0ZG9jcy9za2lucy9BZ2VudC9kZWZhdWx0L2Nzcy9Db3JlLlJlc2V0LmNzcyB0byBlbnN1cmUgY29uc2lzdGVudCBzdHlsaW5nICovCgouY2stY29udGVudCBodG1sLCAuY2stY29udGVudCBib2R5LCAuY2stY29udGVudCBkaXYsCi5jay1jb250ZW50IHNwYW4sIC5jay1jb250ZW50IGgxLCAuY2stY29udGVudCBoMiwKLmNrLWNvbnRlbnQgaDMsIC5jay1jb250ZW50IGg0LCAuY2stY29udGVudCBoNSwKLmNrLWNvbnRlbnQgaDYsIC5jay1jb250ZW50IHAsIC5jay1jb250ZW50IGJsb2NrcXVvdGUsCi5jay1jb250ZW50IGNpdGUsIC5jay1jb250ZW50IGNvZGUsCi5jay1jb250ZW50IGVtLCAuY2stY29udGVudCBpbWcsCi5jay1jb250ZW50IHEsIC5jay1jb250ZW50IHMsCi5jay1jb250ZW50IHNtYWxsLCAuY2stY29udGVudCBzdHJpa2UsIC5jay1jb250ZW50IHN0cm9uZywKLmNrLWNvbnRlbnQgc3ViLCAuY2stY29udGVudCBzdXAsIC5jay1jb250ZW50IHR0LAouY2stY29udGVudCB2YXIsIC5jay1jb250ZW50IGRsLCAuY2stY29udGVudCBkdCwKLmNrLWNvbnRlbnQgZGQsIC5jay1jb250ZW50IG9sLCAuY2stY29udGVudCB1bCwKLmNrLWNvbnRlbnQgbGksIC5jay1jb250ZW50IGZpZWxkc2V0LCAuY2stY29udGVudCBmb3JtLAouY2stY29udGVudCBsYWJlbCwgLmNrLWNvbnRlbnQgbGVnZW5kLCAuY2stY29udGVudCB0YWJsZSwKLmNrLWNvbnRlbnQgY2FwdGlvbiwgLmNrLWNvbnRlbnQgdGJvZHksIC5jay1jb250ZW50IHRmb290LAouY2stY29udGVudCB0aGVhZCwgLmNrLWNvbnRlbnQgdHIsIC5jay1jb250ZW50IHRoLAouY2stY29udGVudCB0ZCwgLmNrLWNvbnRlbnQgaHIgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMDsKICAgIG91dGxpbmU6IDA7CiAgICBmb250LXdlaWdodDogaW5oZXJpdDsKICAgIGZvbnQtc3R5bGU6IGluaGVyaXQ7CiAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgICBkaXJlY3Rpb246IGluaGVyaXQ7Cn0KCi8qIEVuZCBvZiBhZGRpdGlvbnMgZnJvbSBDb3JlLlJlc2V0LmNzcyAqLwoKLmNrLWNvbnRlbnQgewogICAgdGV4dC13cmFwOiB3cmFwOwogICAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgIGNvbG9yOiAjMDAwMjNjOwogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgovKiBSb3RoZXIgT1NTIC8gQWRkIG1lbnRpb24gYW5kIHRyYW5zcGFyZW50ICovCi5jay1jb250ZW50IGEsCi5jay1jb250ZW50IGEubWVudGlvbiB7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiAjMDAxYmZmOwp9CgouY2stY29udGVudCBhOmhvdmVyLAouY2stY29udGVudCBhLm1lbnRpb246aG92ZXIsCi5jay1jb250ZW50IGE6Zm9jdXMsCi5jay1jb250ZW50IGEubWVudGlvbjpmb2N1cyB7CiAgICBjb2xvcjogIzAwMDIzYzsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9CgouY2stY29udGVudCAqOnZpc2l0ZWQgewogICAgY29sb3I6ICMwMDFiZmY7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKfQovKiBFTyBBZGQgbWVudGlvbiBhbmQgdHJhbnNwYXJlbnQgKi8KCi5jay1jb250ZW50IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoKLmNrLWNvbnRlbnQgZW0gewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgouY2stY29udGVudC5DdXN0b21lclVJIHsKICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIjsKfQoKLmNrLWNvbnRlbnQuQ3VzdG9tZXJVSSAqIHsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0Owp9CgouY2stY29udGVudCBmaWd1cmUudGFibGUgewogICAgbWFyZ2luOiAwIDAgMCAwOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5jay1jb250ZW50IHAgewogICAgbWFyZ2luLXRvcDogMHB4OwogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouY2stY29udGVudCBoMSB7CiAgICBmb250LXNpemU6IDJlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgIGNvbG9yOiBpbmhlcml0Owp9IAoKLmNrLWNvbnRlbnQgaDIgewogICAgZm9udC1zaXplOiAxLjVlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgIGNvbG9yOiBpbmhlcml0Owp9CgouY2stY29udGVudCBoMyB7CiAgICBmb250LXNpemU6IDEuMTdlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgY29sb3I6IGluaGVyaXQ7Cn0KCi5jay1jb250ZW50IGg0IHsKICAgIGZvbnQtc2l6ZTogMWVtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICBjb2xvcjogaW5oZXJpdDsKfQoKLmNrLWNvbnRlbnQgaDUgewogICAgZm9udC1zaXplOiAwLjgzZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgIGNvbG9yOiBpbmhlcml0Owp9IAoKLmNrLWNvbnRlbnQgaDYgewogICAgZm9udC1zaXplOiAwLjY3ZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGNvbG9yOiBpbmhlcml0Owp9IAoKLmNrLWNvbnRlbnQgYmxvY2txdW90ZSB7CiAgICBmb250LXN0eWxlOiBub3JtYWwgIWltcG9ydGFudDsKICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjMDAwMDk5IDEuNXB0ICFpbXBvcnRhbnQ7IAogICAgcGFkZGluZzogMGNtIDBjbSAwY20gNHB0ICFpbXBvcnRhbnQ7CiAgICBtYXJnaW46IDA7Cn0KCi5jay1jb250ZW50IHVsLAouY2stY29udGVudCBvbCAgCnsKICAgIHBhZGRpbmc6IDAgNTBweDsKfQoKLyogZGVmYXVsdCBpbWFnZSBzdHlsZSAqLwouY2stY29udGVudCBmaWd1cmUuaW1hZ2U6bm90KCAgIC5pbWFnZS1zdHlsZS1hbGlnbi1jZW50ZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbWFnZS1zdHlsZS1ibG9jay1hbGlnbi1yaWdodCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmltYWdlLXN0eWxlLWFsaWduLWxlZnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbWFnZS1zdHlsZS1hbGlnbi1yaWdodCkgCnsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gdmFyKC0tY2staW1hZ2Utc3R5bGUtc3BhY2luZykpOwogICAgbWFyZ2luLWxlZnQ6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IGF1dG8KfQoKLmNrLWNvbnRlbnQgY29kZSB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwp9Cg==</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/img/home.svg" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAgMCBDOC4yMTI2MDgxNiA1LjQyNTIxNjMyIDguMjEyNjA4MTYgNS40MjUyMTYzMiAxMCA5IEMxMC4xNzQ4NDgzMSAxMS4yODczNTk4IDEwLjI2NzIwMDQ5IDEzLjU4MTQxNDQzIDEwLjMxMjUgMTUuODc1IEMxMC4zNDk4ODI4MSAxNy4xMDk5MjE4OCAxMC4zODcyNjU2MyAxOC4zNDQ4NDM3NSAxMC40MjU3ODEyNSAxOS42MTcxODc1IEMxMCAyMyAxMCAyMyA4LjE3NTc4MTI1IDI1LjQyMTg3NSBDNS4yODY0NTQ1MSAyNy41MTc1NDQ2NyAzLjQ5MDk5NzA2IDI3LjQ1NTM0NzQ0IDAgMjcgQy0yLjc2MjIzMjc4IDI0LjIzNzc2NzIyIC0yLjU3ODU2MjkxIDIxLjc5MjkzMzgzIC0zIDE4IEMtMy42NiAxOCAtNC4zMiAxOCAtNSAxOCBDLTUuMTIzNzUgMTkuMTEzNzUgLTUuMjQ3NSAyMC4yMjc1IC01LjM3NSAyMS4zNzUgQy02IDI1IC02IDI1IC04IDI3IEMtMTEuNDkyMTExMDQgMjcuNDU1NDkyNzQgLTEzLjI4Mjk2NTMxIDI3LjUyNzcyNzE2IC0xNi4xNjAxNTYyNSAyNS40MTAxNTYyNSBDLTE5LjI2NTc3NDU1IDIxLjM0MTg2MjIxIC0xOC41OTY0NTU3IDE3LjIzMjc1ODgxIC0xOC40NTMxMjUgMTIuMjkyOTY4NzUgQy0xOCA5IC0xOCA5IC0xNS44MTI1IDUuODc1IEMtMTQuODg0Mzc1IDUuMjU2MjUgLTEzLjk1NjI1IDQuNjM3NSAtMTMgNCBDLTEyLjExMzEyNSAzLjI1NzUgLTExLjIyNjI1IDIuNTE1IC0xMC4zMTI1IDEuNzUgQy02LjM5OTQ3Mjk4IC0xLjIxMTIwOTY0IC00Ljc3OTQyODc0IC0xLjM5MDM3OTI3IDAgMCBaIE0tMTIuMzU5Mzc1IDcuNjQ0NTMxMjUgQy0xNS40MDE4NDU5OCAxMi4wMTI2NTAyOSAtMTQuNjAxMTc3OTggMTYuOTE1MDM2MjUgLTE0IDIyIEMtMTIuNjggMjIuMzMgLTExLjM2IDIyLjY2IC0xMCAyMyBDLTkuMzQgMjAuMzYgLTguNjggMTcuNzIgLTggMTUgQy0yLjU2MTgwODEyIDEzLjY3MDY2NDIxIC0yLjU2MTgwODEyIDEzLjY3MDY2NDIxIC0wLjE4NzUgMTUuMDYyNSBDMS4zOTI2ODI0IDE3LjY0MDY5MjM0IDEuNjY5MDIyNDYgMjAuMDIxMjAyMSAyIDIzIEMzLjMyIDIyLjY3IDQuNjQgMjIuMzQgNiAyMiBDNy4wMDE1MTE5OCAxNC40NjM4NDMyNyA3LjAwMTUxMTk4IDE0LjQ2Mzg0MzI3IDQuMzU5Mzc1IDcuNjQ0NTMxMjUgQy0xLjk3MTU4MTcxIDEuOTU4Mzk0MjEgLTYuMDI4NDE4MjkgMS45NTgzOTQyMSAtMTIuMzU5Mzc1IDcuNjQ0NTMxMjUgWiAiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwLDMpIi8+Cjwvc3ZnPgo=</File>
        <File Location="var/httpd/htdocs/skins/Agent/default/img/faq.svg" Permission="660" Encode="Base64">PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxwYXRoIGQ9Ik0xNy41LDQuNWMtMS45NSwwLTQuMDUsMC40LTUuNSwxLjVjLTEuNDUtMS4xLTMuNTUtMS41LTUuNS0xLjVjLTEuNDUsMC0yLjk5LDAuMjItNC4yOCwwLjc5QzEuNDksNS42MiwxLDYuMzMsMSw3LjE0IGwwLDExLjI4YzAsMS4zLDEuMjIsMi4yNiwyLjQ4LDEuOTRDNC40NiwyMC4xMSw1LjUsMjAsNi41LDIwYzEuNTYsMCwzLjIyLDAuMjYsNC41NiwwLjkyYzAuNiwwLjMsMS4yOCwwLjMsMS44NywwIGMxLjM0LTAuNjcsMy0wLjkyLDQuNTYtMC45MmMxLDAsMi4wNCwwLjExLDMuMDIsMC4zNmMxLjI2LDAuMzMsMi40OC0wLjYzLDIuNDgtMS45NGwwLTExLjI4YzAtMC44MS0wLjQ5LTEuNTItMS4yMi0xLjg1IEMyMC40OSw0LjcyLDE4Ljk1LDQuNSwxNy41LDQuNXogTTIxLDE3LjIzYzAsMC42My0wLjU4LDEuMDktMS4yLDAuOThjLTAuNzUtMC4xNC0xLjUzLTAuMi0yLjMtMC4yYy0xLjcsMC00LjE1LDAuNjUtNS41LDEuNVY4IGMxLjM1LTAuODUsMy44LTEuNSw1LjUtMS41YzAuOTIsMCwxLjgzLDAuMDksMi43LDAuMjhjMC40NiwwLjEsMC44LDAuNTEsMC44LDAuOThWMTcuMjN6Ii8+PGcvPjxwYXRoIGQ9Ik0xMy45OCwxMS4wMWMtMC4zMiwwLTAuNjEtMC4yLTAuNzEtMC41MmMtMC4xMy0wLjM5LDAuMDktMC44MiwwLjQ4LTAuOTRjMS41NC0wLjUsMy41My0wLjY2LDUuMzYtMC40NSBjMC40MSwwLjA1LDAuNzEsMC40MiwwLjY2LDAuODNjLTAuMDUsMC40MS0wLjQyLDAuNzEtMC44MywwLjY2Yy0xLjYyLTAuMTktMy4zOS0wLjA0LTQuNzMsMC4zOSBDMTQuMTMsMTAuOTksMTQuMDUsMTEuMDEsMTMuOTgsMTEuMDF6Ii8+PHBhdGggZD0iTTEzLjk4LDEzLjY3Yy0wLjMyLDAtMC42MS0wLjItMC43MS0wLjUyYy0wLjEzLTAuMzksMC4wOS0wLjgyLDAuNDgtMC45NGMxLjUzLTAuNSwzLjUzLTAuNjYsNS4zNi0wLjQ1IGMwLjQxLDAuMDUsMC43MSwwLjQyLDAuNjYsMC44M2MtMC4wNSwwLjQxLTAuNDIsMC43MS0wLjgzLDAuNjZjLTEuNjItMC4xOS0zLjM5LTAuMDQtNC43MywwLjM5IEMxNC4xMywxMy42NiwxNC4wNSwxMy42NywxMy45OCwxMy42N3oiLz48cGF0aCBkPSJNMTMuOTgsMTYuMzNjLTAuMzIsMC0wLjYxLTAuMi0wLjcxLTAuNTJjLTAuMTMtMC4zOSwwLjA5LTAuODIsMC40OC0wLjk0YzEuNTMtMC41LDMuNTMtMC42Niw1LjM2LTAuNDUgYzAuNDEsMC4wNSwwLjcxLDAuNDIsMC42NiwwLjgzYy0wLjA1LDAuNDEtMC40MiwwLjctMC44MywwLjY2Yy0xLjYyLTAuMTktMy4zOS0wLjA0LTQuNzMsMC4zOSBDMTQuMTMsMTYuMzIsMTQuMDUsMTYuMzMsMTMuOTgsMTYuMzN6Ii8+PC9nPjwvc3ZnPg==</File>
        <File Location="doc/en/FAQ-ExtendedNavigation.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="faq_item">
            <ColumnAdd Name="icon" Required="false" Type="LONGBLOB"></ColumnAdd>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall>
        <TableAlter Type="post" Name="faq_item">
            <ColumnDrop Name="icon"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>