<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>FAQ-ExtendedNavigation</Name>
    <Version>11.0.2</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-07-30 08:21:56" Version="11.0.2">Added:
- Icon Deletion
- Show only valid articles in quick link side bar management
- Search only in keywords, title and number when linking FAQs
- Hide empty TOC and improve quick link side bar building</ChangeLog>
    <ChangeLog Date="2026-05-28 15:20:04" 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>e8f63437d7ff20fe4677a858050c905e4ec32eca</BuildCommitID>
    <BuildDate>2026-07-30 08:22:00</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+RkFRRXh0ZW5kZWROYXZpZ2F0aW9uLkN1c3RvbWVyLkZBUVpvb20uRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkZBUUV4dGVuZGVkTmF2aWdhdGlvbi5DdXN0b21lci5GQVFab29tLkRldGFpbC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6UHVibGljRkFRWm9vbSMjIzAwMy1GQVFFeHRlbmRlZE5hdmlnYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkZBUUV4dGVuZGVkTmF2aWdhdGlvbi5DdXN0b21lci5GQVFab29tLkRlZmF1bHQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVFFeHRlbmRlZE5hdmlnYXRpb24uQ3VzdG9tZXIuRkFRWm9vbS5EZXRhaWwuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OlB1YmxpY0ZBUVNlYXJjaCMjIzAwMy1GQVFFeHRlbmRlZE5hdmlnYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkZBUUV4dGVuZGVkTmF2aWdhdGlvbi5DdXN0b21lci5EZWZhdWx0LmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpDdXN0b21lclRpY2tldE1lc3NhZ2UjIyMwMDMtRkFRRXh0ZW5kZWROYXZpZ2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RkFRRXh0ZW5kZWROYXZpZ2F0aW9uLkN1c3RvbWVyLkRlZmF1bHQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50RkFRU2lkZWJhciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgRkFRIFNpZGViYXIgc2V0dGluZ3MuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+UXVpY2tsaW5rIE1hbmFnZW1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50RkFRU2lkZWJhciMjIzAwMi1GQVEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVEuQWdlbnQuU2lkZWJhci5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVEuQWdlbnQuU2lkZWJhci5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWdlbnRGQVFTaWRlYmFyIyMjMDAyLUZBUSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPk1hbmFnZSBGQVEgU2lkZWJhciBzZXR0aW5ncy48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5RdWlja2xpbmsgTWFuYWdlbWVudDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRGQVFTaWRlYmFyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPcHRpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXIiPkZBUTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2Nlc3NLZXkiPnM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+OTU1PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRkFRU2lkZUJhcjo6Q3VzdG9tZXI6OkVuYWJsZWQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyBpZiB0aGUgc2lkZWJhciBpcyBlbmFibGVkIGZvciBDdXN0b21lciBJbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RkFRU2lkZUJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJObyI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlllcyIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9Ik5vIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZBUVNpZGVCYXI6OlB1YmxpYzo6RW5hYmxlZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZXRlcm1pbmVzIGlmIHRoZSBzaWRlYmFyIGlzIGVuYWJsZWQgZm9yIFB1YmxpYyBJbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RkFRU2lkZUJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJObyI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlllcyIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9Ik5vIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZBUVNpZGVCYXI6OkFnZW50OjpFbmFibGVkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRldGVybWluZXMgaWYgdGhlIHNpZGViYXIgaXMgZW5hYmxlZCBmb3IgQWdlbnQgSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iTm8iPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJZZXMiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJObyIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGQVFTaWRlQmFyOjpFeHBhbmRTdWJjYXRlZ29yaWVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRldGVybWluZXMgaWYgdGhlIHN1YmNhdGVnb3JpZXMgbXVzdCBiZSBleHBhbmRlcyBvbiBTaWRlYmFyIGluaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RkFRU2lkZUJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJObyI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlllcyIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9Ik5vIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZBUVRhYmxlT2ZDb250ZW50czo6TWF4RGVwdGgiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBkZXB0aCBsZXZlbHMgZm9yIGVhY2ggZmllbGQgaW4gdGh0IFRPQy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFUYWJsZU9mQ29udGVudHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iMyI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMiIgVHJhbnNsYXRhYmxlPSIxIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIzIiBUcmFuc2xhdGFibGU9IjEiPjM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjQiIFRyYW5zbGF0YWJsZT0iMSI+NDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iNSIgVHJhbnNsYXRhYmxlPSIxIj41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSI2IiBUcmFuc2xhdGFibGU9IjEiPjY8L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ3VzdG9tZXJGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ3VzdG9tZXJGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ3VzdG9tZXJGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ3VzdG9tZXJGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ3VzdG9tZXJGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUHVibGljRkFRU2lkZUJhcjo6QXJ0aWNsZXMjIyMwMDEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlndXJlIHRoZSBhcnRpY2xlcyBmb3IgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQdWJsaWNGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgcHVibGljIGludGVyZmFjZSBzaWRlYmFyLCBhY2NvcmRpbmcgdG8gdGhlIGxhbmd1YWdlLiBSZWxldmFudCBmaWVsZHM6IExhbmd1YWdlOiBEZWZpbmVzIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgc2lkZWJhciB3aWxsIGJlIGRpc3BsYXllZDsgRGVmYXVsdEl0ZW1JRDogSUQgb2YgdGhlIEZBUSBhcnRpY2xlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgZGVmYXVsdCBpbiB0aGUgWm9vbSB2aWV3OyBDdXN0b21Hcm91cE9yZGVyOiBDdXN0b20gb3JkZXIgZm9yIGRpc3BsYXlpbmcgdGhlIGFydGljbGUgZ3JvdXBpbmcgY2F0ZWdvcmllczsgQXJ0aWNsZXM6IERlZmluaXRpb24gb2YgdGhlIGdyb3VwaW5nIGNhdGVnb3JpZXMgYW5kIHRoZSBhcnRpY2xlcyB0byBkaXNwbGF5LCB1cCB0byAyIGxldmVscyBkZWVwLiBGb3IgZXhhbXBsZTogU2VydmljZSBEZXNrOjoxMCB3aWxsIGRpc3BsYXkgdGhlIGxpbmsgdG8gdGhlIEZBUSBhcnRpY2xlIHdpdGggSUQ9MTAgZm9yIHRoZSAiU2VydmljZSBEZXNrIiBncm91cCwgb3IgU2VydmljZSBEZXNrOjpTZWN1cml0eTo6MjAgd2lsbCBkaXNwbGF5IHRoZSAiU2VydmljZSBEZXNrICZndDsgU2VjdXJpdHkiIGdyb3VwIGFuZCB3aXRoaW4gaXQgdGhlIGxpbmsgdG8gdGhlIEZBUSBhcnRpY2xlIHdpdGggSUQ9MjAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RkFRU2lkZUJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYW5ndWFnZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0SXRlbUlEIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbUdyb3VwT3JkZXIiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlB1YmxpY0ZBUVNpZGVCYXI6OkFydGljbGVzIyMjMDAzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB0aGUgYXJ0aWNsZXMgZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHNpZGViYXIsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuIFJlbGV2YW50IGZpZWxkczogTGFuZ3VhZ2U6IERlZmluZXMgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkOyBEZWZhdWx0SXRlbUlEOiBJRCBvZiB0aGUgRkFRIGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0IGluIHRoZSBab29tIHZpZXc7IEN1c3RvbUdyb3VwT3JkZXI6IEN1c3RvbSBvcmRlciBmb3IgZGlzcGxheWluZyB0aGUgYXJ0aWNsZSBncm91cGluZyBjYXRlZ29yaWVzOyBBcnRpY2xlczogRGVmaW5pdGlvbiBvZiB0aGUgZ3JvdXBpbmcgY2F0ZWdvcmllcyBhbmQgdGhlIGFydGljbGVzIHRvIGRpc3BsYXksIHVwIHRvIDIgbGV2ZWxzIGRlZXAuIEZvciBleGFtcGxlOiBTZXJ2aWNlIERlc2s6OjEwIHdpbGwgZGlzcGxheSB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0xMCBmb3IgdGhlICJTZXJ2aWNlIERlc2siIGdyb3VwLCBvciBTZXJ2aWNlIERlc2s6OlNlY3VyaXR5OjoyMCB3aWxsIGRpc3BsYXkgdGhlICJTZXJ2aWNlIERlc2sgJmd0OyBTZWN1cml0eSIgZ3JvdXAgYW5kIHdpdGhpbiBpdCB0aGUgbGluayB0byB0aGUgRkFRIGFydGljbGUgd2l0aCBJRD0yMC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpGQVFTaWRlQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxhbmd1YWdlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRJdGVtSUQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tR3JvdXBPcmRlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUHVibGljRkFRU2lkZUJhcjo6QXJ0aWNsZXMjIyMwMDQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlndXJlIHRoZSBhcnRpY2xlcyBmb3IgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugc2lkZWJhciwgYWNjb3JkaW5nIHRvIHRoZSBsYW5ndWFnZS4gUmVsZXZhbnQgZmllbGRzOiBMYW5ndWFnZTogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQ7IERlZmF1bHRJdGVtSUQ6IElEIG9mIHRoZSBGQVEgYXJ0aWNsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQgaW4gdGhlIFpvb20gdmlldzsgQ3VzdG9tR3JvdXBPcmRlcjogQ3VzdG9tIG9yZGVyIGZvciBkaXNwbGF5aW5nIHRoZSBhcnRpY2xlIGdyb3VwaW5nIGNhdGVnb3JpZXM7IEFydGljbGVzOiBEZWZpbml0aW9uIG9mIHRoZSBncm91cGluZyBjYXRlZ29yaWVzIGFuZCB0aGUgYXJ0aWNsZXMgdG8gZGlzcGxheSwgdXAgdG8gMiBsZXZlbHMgZGVlcC4gRm9yIGV4YW1wbGU6IFNlcnZpY2UgRGVzazo6MTAgd2lsbCBkaXNwbGF5IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTEwIGZvciB0aGUgIlNlcnZpY2UgRGVzayIgZ3JvdXAsIG9yIFNlcnZpY2UgRGVzazo6U2VjdXJpdHk6OjIwIHdpbGwgZGlzcGxheSB0aGUgIlNlcnZpY2UgRGVzayAmZ3Q7IFNlY3VyaXR5IiBncm91cCBhbmQgd2l0aGluIGl0IHRoZSBsaW5rIHRvIHRoZSBGQVEgYXJ0aWNsZSB3aXRoIElEPTIwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkZBUVNpZGVCYXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFuZ3VhZ2UiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdEl0ZW1JRCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21Hcm91cE9yZGVyIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQdWJsaWNGQVFTaWRlQmFyOjpBcnRpY2xlcyMjIzAwNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmUgdGhlIGFydGljbGVzIGZvciB0aGUgcHVibGljIGludGVyZmFjZSBzaWRlYmFyLCBhY2NvcmRpbmcgdG8gdGhlIGxhbmd1YWdlLiBSZWxldmFudCBmaWVsZHM6IExhbmd1YWdlOiBEZWZpbmVzIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgc2lkZWJhciB3aWxsIGJlIGRpc3BsYXllZDsgRGVmYXVsdEl0ZW1JRDogSUQgb2YgdGhlIEZBUSBhcnRpY2xlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgZGVmYXVsdCBpbiB0aGUgWm9vbSB2aWV3OyBDdXN0b21Hcm91cE9yZGVyOiBDdXN0b20gb3JkZXIgZm9yIGRpc3BsYXlpbmcgdGhlIGFydGljbGUgZ3JvdXBpbmcgY2F0ZWdvcmllczsgQXJ0aWNsZXM6IERlZmluaXRpb24gb2YgdGhlIGdyb3VwaW5nIGNhdGVnb3JpZXMgYW5kIHRoZSBhcnRpY2xlcyB0byBkaXNwbGF5LCB1cCB0byAyIGxldmVscyBkZWVwLiBGb3IgZXhhbXBsZTogU2VydmljZSBEZXNrOjoxMCB3aWxsIGRpc3BsYXkgdGhlIGxpbmsgdG8gdGhlIEZBUSBhcnRpY2xlIHdpdGggSUQ9MTAgZm9yIHRoZSAiU2VydmljZSBEZXNrIiBncm91cCwgb3IgU2VydmljZSBEZXNrOjpTZWN1cml0eTo6MjAgd2lsbCBkaXNwbGF5IHRoZSAiU2VydmljZSBEZXNrICZndDsgU2VjdXJpdHkiIGdyb3VwIGFuZCB3aXRoaW4gaXQgdGhlIGxpbmsgdG8gdGhlIEZBUSBhcnRpY2xlIHdpdGggSUQ9MjAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RkFRU2lkZUJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYW5ndWFnZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0SXRlbUlEIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbUdyb3VwT3JkZXIiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWdlbnRGQVFab29tIyMjMDAyLUZBUSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkZBUSBIb21lPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+RkFRIEhvbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50RkFRWm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rT3B0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjZXNzS2V5Ij5oPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjAxMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNDdXN0b21lckZBUUV4cGxvcmVyIyMjMDAyLUZBUSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1DdXN0b21lckZBUVpvb208L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk1lbnU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2Nlc3NLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj43MDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic3ZnSWNvbiI+dmFyL2h0dHBkL2h0ZG9jcy9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltZy9mYXEuc3ZnPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgo8L290b2JvX2NvbmZpZz4K</File>
        <File Location="Kernel/Language/de_FAQExtendedNavigation.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ZBUUV4dGVuZGVkTmF2aWdhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYmxlIG9mIENvbnRlbnRzJ30gPSAnSW5oYWx0c3ZlcnplaWNobmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2sgdG8gRkFRIEhvbWUnfSA9ICdadXLDvGNrIHp1ciBGQVEtU3RhcnRzZWl0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrIHRvIHRvcCd9ID0gJ1p1csO8Y2sgbmFjaCBvYmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ljb24gKHN2ZyknfSA9ICdJY29uIChzdmcpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBJY29uJ30gPSAnSWNvbiBob2NobGFkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIEljb24nfSA9ICdJY29uIGzDtnNjaGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhbiBpY29uIGluIFNWRyBmb3JtYXQgdG8gdXBsb2FkIGl0Lid9ID0gJ1fDpGhsZW4gU2llIGVpbiBTeW1ib2wgaW0gU1ZHLUZvcm1hdCBhdXMsIHVtIGVzIGhvY2h6dWxhZGVuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVpY2tsaW5rIE1hbmFnZW1lbnQnfSA9ICdTY2huZWxsLUxpbmstVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIFNldHRpbmdzJ30gPSAnRmlsdGVyIGbDvHIgRWluc3RlbGx1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGQVEgU2lkZWJhciBTZXR0aW5ncyd9ID0gJ0ZBUS1TZWl0ZW5sZWlzdGVua29uZmlndXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2FkIFNldHRpbmdzJ30gPSAnTGFkZSBLb25maWd1cmF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmF1bHQgRkFRIEl0ZW0nfSA9ICdGQVEtU3RhcnRzZWl0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20gR3JvdXAgT3JkZXInfSA9ICdLYXRlZ29yaWVuc29ydGllcnVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIFVwJ30gPSAnTmFjaCBvYmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgRG93bid9ID0gJ05hY2ggdW50ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVpY2tzdGFydCBMaW5rcyd9ID0gJ1NjaG5lbGwtTGlua3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0dGluZ3MgZm9yJ30gPSAnRWluc3RlbGx1bmdlbiBmw7xyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc2V0IFNldHRpbmcnfSA9ICdFaW5zdGVsbHVuZ2VuIHp1csO8Y2tzZXR6ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdG9yaW5nIHRoZXNlIHNldHRpbmdzIHdpbGwgZXJhc2UgYWxsIGRhdGEuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPyd9ID0gJ1dpZWRlcmhlcnN0ZWxsZW4gZGllc2VyIEVpbnN0ZWxsdW5nZW4gd2lyZCBhbGxlIERhdGVuIGzDtnNjaGVuLiBUcm90emRlbSBmb3J0ZmFocmVuPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXR0aW5ncyBzdWNjZXNzZnVsbHkgdXBkYXRlZCEnfSA9ICdFaW5zdGVsbHVuZ2VuIGVyZm9sZ3JlaWNoIGdldXBkYXRlZCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0dGluZ3Mgc3VjY2Vzc2Z1bGx5IHJlc2V0ISd9ID0gJ0VpbnN0ZWxsdW5nZW4gZXJmb2xncmVpY2ggenVyw7xja2dlc2V0enQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhbmd1YWdlIGNvbmZpZ3VyYXRpb24gbGltaXQgcmVhY2hlZCBmb3IgdGhlIGludGVyZmFjZTogJXMhJ30gPSAnTWF4aW1hbGUgQW56YWhsIGFuIFNwcmFjaGVpbnN0ZWxsdW5nZW4gZsO8ciBkYXMgSW50ZXJmYWNlICVzIGVycmVpY2h0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmUgdGhlIHNpZGViYXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gdGhlIE9UT0JPIGxhbmd1YWdlIGFuZCBpbnRlcmZhY2UnfSA9ICdLb25maWd1cmllcmUgZGllIFNlaXRlbmxlaXN0ZW4tRWluc3RlbGx1bmdlbiBhYmjDpG5naWcgdm9uIEludGVyZmFjZSB1bmQgU3ByYWNoZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RPQk8gaW50ZXJmYWNlIHdoZXJlIHRoZSBzaWRlYmFyIHdpbGwgYmUgZGlzcGxheWVkLid9ID0gJ09UT0JPLUludGVyZmFjZSBhdWYgZGVtIGRpZSBTZWl0ZW5sZWlzdGUgYW5nZXplaWd0IHdlcmRlbiB3aXJkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyXCdzIGxhbmd1YWdlIGluIHRoZSBPVE9CTyBpbnRlcmZhY2UuJ30gPSAnU3ByYWNoZSBkZXMgTnV0emVycyBpbiBPVE9CTy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IHRoZSBkZWZhdWx0IGFydGljbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgem9vbSB2aWV3IHdoZW4gdGhlIEZBUSBsb2Fkcy4nfSA9ICdXw6RobGUgZGVuIFN0YW5kYXJkLUFydGlrZWwsIGRlciBpbiBkZXIgRkFRLVpvb20gYW5nZXplaWd0IHdpcmQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHF1aWNrIGxpbmsgZ3JvdXBzIGluIHRoZSBGQVEgd2lsbCBiZSBkaXNwbGF5ZWQuJ30gPSAnTGVnZSBkaWUgUmVpaGVuZm9sZ2UgZmVzdCwgaW4gZGVyIGRpZSBLYXRlZ29yaWVuIGRlciBTY2huZWxsLUxpbmtzIGRhcmdlc3RlbGx0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbiBvZiB0aGUgbGlua3MgdG8gdGhlIEZBUSBhcnRpY2xlcy4gVGhleSBtdXN0IGJlIGNvbmZpZ3VyZWQgYXMgZm9sbG93czonfSA9ICdEZWZpbml0aW9uIGRlciBGQVEtTGlua3MuIERpZSBLb25maWd1cmF0aW9uIGlzdCB3aWUgZm9sZ3Q6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luIHRoZSB0ZXh0IGZpZWxkOiBOYW1lIG9mIHRoZSBncm91cCB0byBjb25zb2xpZGF0ZSB0aGUgbGlua3MuIFVwIHRvIHR3byBsZXZlbHMgb2YgZGVwdGggY2FuIGJlIGRlZmluZWQuIFVzZSB0aGUgc3ludGF4ICJHcm91cDo6U3ViZ3JvdXAiIHdoZW4gZGVmaW5pbmcgc3ViZ3JvdXBzLid9ID0gJ0ltIFRleHRmZWxkIGRlciBOYW1lIHVudGVyIGRlbSBBcnRpa2VsIGdydXBwaWVydCB3ZXJkZW4uIEJpcyB6dSB6d2VpIEViZW5lbiBrw7ZubmVuIGZlc3RlZ2VsZ3Qgd2VyZGVuLCBkaWUgU3ludGF4IGbDvHIgVW50ZXJncnVwcGVuIGlzdCAiR3J1cHBlOjpVbnRlcmdydXBwZSIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZBUSBBcnRpY2xlOiBTZWxlY3QgdGhlIEZBUSBhcnRpY2xlIGZyb20gdGhlIGxpc3QgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgc2lkZWJhci4nfSA9ICdGQVEtQXJ0aWtlbDogV8OkaGxlIGRlbiBGQVEtQXJ0aWtlbCBhdXMgZGVyIExpc3RlLCBkZXIgaW4gZGVyIFNlaXRlbmxlaXN0ZSBhbmdlemVpZ3Qgd2lyZC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlICJSZXNldCBzZXR0aW5ncyIgYnV0dG9uIG9ubHkgYXBwbGllcyB0byB0aGUgc2V0dGluZ3MgY3VycmVudGx5IGJlaW5nIGVkaXRlZC4nfSA9ICdEZXIgIkVpbnN0ZWxsdW5nZW4genVyw7xja3NldHplbiItS25vcGYgYmV0cmlmZnQgYXVzc2NobGllw59saWNoIGRpZSBtb21lbnRhbiBiZWFyYmVpdGV0ZSBFaW5zdGVsbHVuZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGF1bmNoIHRoZSBBZGQvRWRpdCBTaWRlYmFyIFNldHRpbmdzIHNjcmVlbiBieSBzZWxlY3Rpbmc6J30gPSAnw5ZmZm5lIGRpZSBTZWl0ZSB6dW0gWnVmw7xnZW4gdW5kIEJlYXJiZWl0ZW4gZHVyY2ggQXVzd2FobDonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmYXVsdCBpdGVtIGhhcyBiZWVuIHNldCB5ZXQhIFN0YXJ0IGJyb3dzaW5nIGFydGljbGVzIGluIHRoZSd9ID0gJ0tlaW4gRWluc3RpZWdzYXJ0aWtlbCBnZXNldHp0ISBEdXJjaHN1Y2hlIGRpZSBGQVFzIGltJzsKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICAgICAnUmVzdG9yaW5nIHRoZXNlIHNldHRpbmdzIHdpbGwgZXJhc2UgYWxsIGRhdGEuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPycsCiAgICApOwoKCn0KCjE7Cg==</File>
        <File Location="Kernel/Language/es_FAQExtendedNavigation.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0ZBUUV4dGVuZGVkTmF2aWdhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYmxlIG9mIENvbnRlbnRzJ30gPSAnVGFibGEgZGUgQ29udGVuaWRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrIHRvIEZBUSBIb21lJ30gPSAnUMOhZ2luYSBpbmljaWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2sgdG8gdG9wJ30gPSAnVm9sdmVyIGFsIGluaWNpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJY29uIChzdmcpJ30gPSAnSWNvbm8gKHN2ZyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIEljb24nfSA9ICdDYXJnYXIgSWNvbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGFuIGljb24gaW4gU1ZHIGZvcm1hdCB0byB1cGxvYWQgaXQuJ30gPSAnU2VsZWNjaW9uZSB1biBpY29ubyBlbiBmb3JtYXRvIFNWRyBwYXJhIGNhcmdhcmxvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWlja2xpbmsgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIGxhIEJhcnJhIExhdGVyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBTZXR0aW5ncyd9ID0gJ0ZpbHRyYXIgQ29uZmlndXJhY2lvbmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZBUSBTaWRlYmFyIFNldHRpbmdzJ30gPSAnR2VzdGnDs24gZGUgbGEgQmFycmEgTGF0ZXJhbCBkZWwgRkFRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvYWQgU2V0dGluZ3MnfSA9ICdDYXJnYXIgQ29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmYXVsdCBGQVEgSXRlbSd9ID0gJ0FydMOtY3VsbyBkZWwgRkFRIHBvciBkZWZlY3RvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSBHcm91cCBPcmRlcid9ID0gJ09yZGVuIHBlcnNvbmFsaXphZG8gZGUgbG9zIGdydXBvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIFVwJ30gPSAnTW92ZXIgQXJyaWJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgRG93bid9ID0gJ01vdmVyIEFiYWpvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1aWNrc3RhcnQgTGlua3MnfSA9ICdFbmxhY2VzIGRlIEFjY2VzbyBSw6FwaWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHRpbmdzIGZvcid9ID0gJ0NvbmZpZ3VyYWNpw7NuIHBhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzZXQgU2V0dGluZyd9ID0gJ1Jlc3RhYmxlY2VyIGNvbmZpZ3VyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RvcmluZyB0aGVzZSBzZXR0aW5ncyB3aWxsIGVyYXNlIGFsbCBkYXRhLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZD8nfSA9ICdBbCByZXN0YWJsZWNlciBlc3RhIGNvbmZpZ3VyYWNpw7NuLCB0b2RvcyBsb3MgZGF0b3Mgc2UgcGVyZGVyYW4uIEVzdGEgc2VndXJvIGRlIHByb2NlZGVyPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXR0aW5ncyBzdWNjZXNzZnVsbHkgdXBkYXRlZCEnfSA9ICdDb25maWd1cmFjacOzbiBhY3R1YWxpemFkYSBjb3JyZWN0YW1lbnRlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXR0aW5ncyBzdWNjZXNzZnVsbHkgcmVzZXQhJ30gPSAnQ29uZmlndXJhY2nDs24gcmVzdGFibGVjaWRhIGNvcnJlY3RhbWVudGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhbmd1YWdlIGNvbmZpZ3VyYXRpb24gbGltaXQgcmVhY2hlZCBmb3IgdGhlIGludGVyZmFjZTogJXMhJ30gPSAnTGltaXRlIGRlIGNvbmZpZ3VyYWNpw7NuIGRlIGlkaW9tYXMgYWxjYW56YWRvIHBhcmEgbGEgaW50ZXJmYXo6ICVzISc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJlIHRoZSBzaWRlYmFyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHRoZSBPVE9CTyBsYW5ndWFnZSBhbmQgaW50ZXJmYWNlJ30gPSAnQ29uZmlndXJlIGxvcyBwYXLDoW1ldHJvcyBkZSBsYSBiYXJyYSBsYXRlcmFsIHNlZ8O6biBlbCBpZGlvbWEgeSBsYSBpbnRlcmZheiBkZSBPVE9CTyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVE9CTyBpbnRlcmZhY2Ugd2hlcmUgdGhlIHNpZGViYXIgd2lsbCBiZSBkaXNwbGF5ZWQuJ30gPSAnSW50ZXJmYXogZGUgT1RPQk8gZG9uZGUgc2UgbW9zdHJhcsOhIGxhIGJhcnJhIGxhdGVyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXJcJ3MgbGFuZ3VhZ2UgaW4gdGhlIE9UT0JPIGludGVyZmFjZS4nfSA9ICdJZGlvbWEgZGVsIHVzdWFyaW8gZW4gbGEgaW50ZXJmYXogZGUgT1RPQk8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCB0aGUgZGVmYXVsdCBhcnRpY2xlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHpvb20gdmlldyB3aGVuIHRoZSBGQVEgbG9hZHMuJ30gPSAnU2VsZWNjaW9uZSBlbCBhcnTDrWN1bG8gcG9yIGRlZmVjdG8gcXVlIHNlIG1vc3RyYXLDoSBlbiBsYSB2aXN0YSBkZSB6b29tIGN1YW5kbyBzZSBjYXJndWUgZWwgRkFRLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBxdWljayBsaW5rIGdyb3VwcyBpbiB0aGUgRkFRIHdpbGwgYmUgZGlzcGxheWVkLid9ID0gJ0RlZmluYSBlbCBvcmRlbiBlbiBlbCBxdWUgc2UgbW9zdHJhcsOhbiBsb3MgZ3J1cG9zIGRlIGVubGFjZXMgcsOhcGlkb3MgZW4gZWwgRkFRLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uIG9mIHRoZSBsaW5rcyB0byB0aGUgRkFRIGFydGljbGVzLiBUaGV5IG11c3QgYmUgY29uZmlndXJlZCBhcyBmb2xsb3dzOid9ID0gJ0RlZmluaWNpw7NuIGRlIGxvcyBlbmxhY2VzIGEgbG9zIGFydMOtY3Vsb3MgZGVsIEZBUS4gRGViZW4gY29uZmlndXJhcnNlIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luIHRoZSB0ZXh0IGZpZWxkOiBOYW1lIG9mIHRoZSBncm91cCB0byBjb25zb2xpZGF0ZSB0aGUgbGlua3MuIFVwIHRvIHR3byBsZXZlbHMgb2YgZGVwdGggY2FuIGJlIGRlZmluZWQuIFVzZSB0aGUgc3ludGF4ICJHcm91cDo6U3ViZ3JvdXAiIHdoZW4gZGVmaW5pbmcgc3ViZ3JvdXBzLid9ID0gJ0VuIGVsIGNhbXBvIGRlIHRleHRvOiBOb21icmUgZGVsIGdydXBvIHBhcmEgY29uc29saWRhciBsb3MgZW5sYWNlcy4gU2UgcHVlZGVuIGRlZmluaXIgaGFzdGEgZG9zIG5pdmVsZXMgZGUgcHJvZnVuZGlkYWQuIFVzZSBsYSBzaW50YXhpcyAiR3J1cG86OlN1YmdydXBvIiBhbCBkZWZpbmlyIHN1YmdydXBvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRkFRIEFydGljbGU6IFNlbGVjdCB0aGUgRkFRIGFydGljbGUgZnJvbSB0aGUgbGlzdCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBzaWRlYmFyLid9ID0gJ0FydMOtY3VsbyBkZWwgRkFROiBTZWxlY2Npb25lIGVsIGFydMOtY3VsbyBkZWwgRkFRIGRlIGxhIGxpc3RhIHF1ZSBzZSBtb3N0cmFyw6EgZW4gbGEgYmFycmEgbGF0ZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlICJSZXNldCBzZXR0aW5ncyIgYnV0dG9uIG9ubHkgYXBwbGllcyB0byB0aGUgc2V0dGluZ3MgY3VycmVudGx5IGJlaW5nIGVkaXRlZC4nfSA9ICdFbCBib3TDs24gIlJlc3RhYmxlY2VyIGNvbmZpZ3VyYWNpw7NuIiBzb2xvIGFwbGljYSBhIGxvcyBhanVzdGVzIHF1ZSBzZSBlc3TDoW4gZWRpdGFuZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhdW5jaCB0aGUgQWRkL0VkaXQgU2lkZWJhciBTZXR0aW5ncyBzY3JlZW4gYnkgc2VsZWN0aW5nOid9ID0gJ0Nhcmd1ZSBsYSBwYW50YWxsYSBkZSBBZ3JlZ2FyL0VkaXRhciBDb25maWd1cmFjacOzbiBkZSBsYSBCYXJyYSBMYXRlcmFsIHNlbGVjY2lvbmFuZG86JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmF1bHQgaXRlbSBoYXMgYmVlbiBzZXQgeWV0ISBTdGFydCBicm93c2luZyBhcnRpY2xlcyBpbiB0aGUnfSA9ICfCoU5vIHNlIGhhIGVzdGFibGVjaWRvIHVuIGFydMOtY3VsbyBwb3IgZGVmZWN0byB0b2RhdsOtYSEgQ29taWVuY2UgYSBuYXZlZ2FyIGxvcyBhcnTDrWN1bG9zIGVuIGVsJzsKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICAgICAnUmVzdG9yaW5nIHRoZXNlIHNldHRpbmdzIHdpbGwgZXJhc2UgYWxsIGRhdGEuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPycsCiAgICApOwoKfQoKMTsK</File>
        <File Location="Kernel/Modules/AgentFAQAutoComplete.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRGQVFBdXRvQ29tcGxldGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIFVSSTo6RXNjYXBlICAgICAgICAgICAgICAgICAgIHF3KHVyaV91bmVzY2FwZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEZBUU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdHZXRGQVFJdGVtcycgKSB7CgogICAgICAgICMgZmV0Y2ggcGFyYW1zCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KFF1ZXJ5IE1hcmtlcikpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKTsKICAgICAgICB9CgogICAgICAgIG15ICVTZWFyY2hQYXJhbXM7CiAgICAgICAgbXkgQEl0ZW1zOwoKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtRdWVyeX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkOiBRdWVyeSEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gQEl0ZW1zOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KE1hcmtlcikpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZDogJE5lZWRlZCEiCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybiBASXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWFyY2hQYXJhbXN7V2hhdH0gID0gJyonIC4gdXJpX3VuZXNjYXBlKCAkR2V0UGFyYW17UXVlcnl9ICkgLiAnKic7CiAgICAgICAgJFNlYXJjaFBhcmFtc3tWYWxpZH0gPSAxOwoKICAgICAgICBteSAkTWFya2VyID0gdXJpX3VuZXNjYXBlKCAkR2V0UGFyYW17TWFya2VyfSApOwogICAgICAgIG15ICRIb29rICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RkFRSG9vaycpOwoKICAgICAgICAjIEdldCBVc2VyQ2F0ZWdvcnlHcm91cCBIYXNoLgogICAgICAgICMgVGhpcyByZXR1cm5zIGEgSGFzaCBvZiB0aGUgZm9sbG93aW5nIHNhbXBsZSBkYXRhIHN0cnVjdHVyZToKICAgICAgICAjCiAgICAgICAgIyAkVXNlckNhdEdyb3VwID0gewogICAgICAgICMgICAnMScgPT4gewogICAgICAgICMgICAgICAgICAgJzMnID0+ICdNaXNjU3ViJwogICAgICAgICMgICAgICAgIH0sCiAgICAgICAgIyAgICczJyA9PiB7fSwKICAgICAgICAjICAgJzAnID0+IHsKICAgICAgICAjICAgICAgICAgICAgJzEnID0+ICdNaXNjJywKICAgICAgICAjICAgICAgICAgICAgJzInID0+ICdzZWNyZXQnCiAgICAgICAgIyAgICAgICAgICB9LAogICAgICAgICMgICAnMicgPT4ge30KICAgICAgICAjIH07CiAgICAgICAgIwogICAgICAgICMgS2V5cyBvZiB0aGUgb3V0ZXIgaGFzaCBpbmZvcm0gYWJvdXQgc3ViY2F0ZWdvcmllcy4KICAgICAgICAjICAgMCBTaG93cyB0b3AgbGV2ZWwgQ2F0ZWdvcnlJRHMuCiAgICAgICAgIyAgIDEgU2hvd3MgdGhlIFN1YmNhdGVnb3J5SURzIG9mIENhdGVnb3J5IDEuCiAgICAgICAgIyAgIDIgYW5kIDMgYXJlIGVtcHR5IGhhc2hlcyBiZWNhdXNlIHRoZXNlIGNhdGVnb3JpZXMgZG9uJ3QgaGF2ZSBzdWJjYXRlZ29yaWVzLgogICAgICAgICMKICAgICAgICAjIEtleXMgb2YgdGhlIGlubmVyIGhhc2hlcyBhcmUgQ2F0ZWdvcnlJRHMgYSB1c2VyIGlzIGFsbG93ZWQgdG8gaGF2ZSBybyBhY2Nlc3MgdG8uCiAgICAgICAgIyBWYWx1ZXMgYXJlIHRoZSBDYXRlZ29yeSBuYW1lcy4KICAgICAgICBteSAkVXNlckNhdEdyb3VwID0gJEZBUU9iamVjdC0+R2V0VXNlckNhdGVnb3JpZXMoCiAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgRmluZCBDYXRlZ29yeUlEcyB0aGUgY3VycmVudCBVc2VyIGlzIGFsbG93ZWQgdG8gdmlldy4KICAgICAgICBteSAlQWxsb3dlZENhdGVnb3J5SURzID0gKCk7CgogICAgICAgIGlmICggJFVzZXJDYXRHcm91cCAmJiByZWYgJFVzZXJDYXRHcm91cCBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIFNvIG5vdyB3ZSBoYXZlIHRvIGV4dHJhY3QgYWxsIENhdGVnb3J5IElEJ3Mgb2YgdGhlICJpbm5lciBoYXNoZXMiCiAgICAgICAgICAgICMgICAtPiBMb29wIHRocm91Z2ggdGhlIG91dGVyIGNhdGVnb3J5IElEJ3MuCiAgICAgICAgICAgIGZvciBteSAkTGV2ZWwgKCBzb3J0IGtleXMgJXskVXNlckNhdEdyb3VwfSApIHsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBWYWx1ZSBvZiB0aGUgY3VycmVudCBoYXNoIGtleSBpcyBhIGhhc2ggcmVmLgogICAgICAgICAgICAgICAgaWYgKCAkVXNlckNhdEdyb3VwLT57JExldmVsfSAmJiByZWYgJFVzZXJDYXRHcm91cC0+eyRMZXZlbH0gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICAgICAjIE1hcCB0aGUga2V5cyBvZiB0aGUgaW5uZXIgaGFzaCB0byBhIFRlbXBJRHMgaGFzaC4KICAgICAgICAgICAgICAgICAgICAjIE9yaWdpbmFsIERhdGEgc3RydWN0dXJlOgogICAgICAgICAgICAgICAgICAgICMgICB7CiAgICAgICAgICAgICAgICAgICAgIyAgICAgICAnMScgPT4gJ01pc2MnLAogICAgICAgICAgICAgICAgICAgICMgICAgICAgJzInID0+ICdzZWNyZXQnCiAgICAgICAgICAgICAgICAgICAgIyAgIH0KICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAgICAgIyAgIGFmdGVyIG1hcHBpbmc6CiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgICMgICB7CiAgICAgICAgICAgICAgICAgICAgIyAgICAgICAnMScgPT4gMSwKICAgICAgICAgICAgICAgICAgICAjICAgICAgICcyJyA9PiAxJwogICAgICAgICAgICAgICAgICAgICMgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJVRlbXBJRHMgPSBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyAkVXNlckNhdEdyb3VwLT57JExldmVsfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIFB1dCB0aGUgVGVtcElEcyBvdmVyIHRoZSBmb3JtYWxseSBmb3VuZCBBbGxvd2VkQ2F0ZWdvcmllcyB0byBwcm9kdWNlIGEgaGFzaAogICAgICAgICAgICAgICAgICAgICMgICB0aGF0IGhvbGRzIGFsbCBDYXRlZ29yeUlEIGFzIGtleXMgYW5kIHRoZSBudW1iZXIgMSBhcyB2YWx1ZXMuCiAgICAgICAgICAgICAgICAgICAgJUFsbG93ZWRDYXRlZ29yeUlEcyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgJUFsbG93ZWRDYXRlZ29yeUlEcywKICAgICAgICAgICAgICAgICAgICAgICAgJVRlbXBJRHMKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEZvciB0aGUgZGF0YWJhc2UgcXVlcnkgaXQncyBuZWNlc3NhcnkgdG8gaGF2ZSBhbiBhcnJheSBvZiBDYXRlZ29yeUlEcy4KICAgICAgICBteSBAQ2F0ZWdvcnlJRHMgPSAoKTsKCiAgICAgICAgaWYgKCVBbGxvd2VkQ2F0ZWdvcnlJRHMpIHsKICAgICAgICAgICAgQENhdGVnb3J5SURzID0gc29ydCBrZXlzICVBbGxvd2VkQ2F0ZWdvcnlJRHM7CiAgICAgICAgfQoKICAgICAgICAjIEp1c3Qgc2VhcmNoIGlmIHdlIGRvIGhhdmUgY2F0ZWdvcmllcywgd2UgaGF2ZSBhY2Nlc3MgdG8uCiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byBhbnkgY2F0ZWdvcnksIGEgc2VhcmNoIHdpdGggbm8gQ2F0ZWdvcnlJRHMKICAgICAgICAjICAgd291bGQgcmVzdWx0IGluIGZpbmRpbmcgYWxsIGNhdGVnb3JpZXMuCiAgICAgICAgIwogICAgICAgICMgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBGQVEncyB3aXRob3V0IGNhdGVnb3JpZXMKICAgICAgICAjICAgc28gYXQgbGVhc3Qgb25lIGNhdGVnb3J5IGhhcyB0byBiZSBwcmVzZW50CgogICAgICAgIG15IEBJRHM7CiAgICAgICAgaWYgKEBDYXRlZ29yeUlEcykgewogICAgICAgICAgICBASURzID0gJEZBUU9iamVjdC0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgJVNlYXJjaFBhcmFtcywKICAgICAgICAgICAgICAgIFdoYXRBdHRyaWJ1dGVzID0+IFsgJ1RpdGxlJywgJ0tleXdvcmQnLCAnTnVtYmVyJyBdLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgICAgPT4gXEBDYXRlZ29yeUlEcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKICAgICAgICAgICAgbXkgJUZBUSA9ICRGQVFPYmplY3QtPkZBUUdldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJElELAogICAgICAgICAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAxLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBJdGVtcywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZCAgICAgID0+ICRNYXJrZXIgLiAiJEhvb2sgJEZBUXtOdW1iZXJ9IC0gJEZBUXtUaXRsZX0iLCAgICAgICAgICAgICAjSUQgTXVzdCBjb250YWluIG1hcmtlcgogICAgICAgICAgICAgICAgICAgIHRleHQgICAgPT4gIiRIb29rICRGQVF7TnVtYmVyfSAtICRGQVF7VGl0bGV9IiwKICAgICAgICAgICAgICAgICAgICBpdGVtX2lkID0+ICRJRCwKICAgICAgICAgICAgICAgICAgICBsaW5rICAgID0+ICIvb3RvYm8vaW5kZXgucGw/QWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9JElEO05hdj07IiwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gXEBJdGVtcywKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBkYXRhIHRvIGZyb250ZW5kCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCn0KCjE7Cg==</File>
        <File Location="Kernel/Modules/AgentFAQSidebar.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRGQVFTaWRlYmFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QuCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBQZXJtaXNzaW9uIGNoZWNrLgogICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBuZWVkIHJ3IHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBHZXQgcGFyYW1ldGVycyBmcm9tIHdlYiByZXF1ZXN0LgogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KFNpZGViYXJMYW5ndWFnZSBMYW5ndWFnZSBJbnRlcmZhY2UgRGVmYXVsdEl0ZW1JRCBDdXN0b21Hcm91cE9yZGVyIENvbmZpZ0lEIEFydGljbGVDb3VudCkpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgI0xvYWQgZGVmaW5lZCBMYW5ndWFnZXMgZm9yIHRoZSBzeXN0ZW0KICAgIG15ICVTeXN0ZW1MYW5ndWFnZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRVc2VkTGFuZ3VhZ2VzJykgfTsKCiAgICAjTG9hZCBsYW5ndWFnZSBkZXNjcmlwdGlvbnMKICAgIG15ICVTeXN0ZW1MYW5ndWFnZXNOYXRpdmUgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRVc2VkTGFuZ3VhZ2VzTmF0aXZlJykgfTsKCiAgICAjRmlsbCBoYXNoIGRhdGEgZm9yIGxhbmd1YWdlIERyb3Bkb3duCiAgICBmb3IgbXkgJExhbmd1YWdlICgga2V5cyAlU3lzdGVtTGFuZ3VhZ2VzICkgewogICAgICAgICRTeXN0ZW1MYW5ndWFnZXN7JExhbmd1YWdlfSA9ICIoJExhbmd1YWdlKSAtICRTeXN0ZW1MYW5ndWFnZXNOYXRpdmV7JExhbmd1YWdlfSI7CiAgICB9CgogICAgJEdldFBhcmFte1NpZGViYXJMYW5ndWFnZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVN5c3RlbUxhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NpZGViYXJMYW5ndWFnZScsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTaWRlYmFyTGFuZ3VhZ2V9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcsCiAgICAgICAgVHJhbnNsYXRhYmxlID0+IDAKICAgICk7CgogICAgbXkgJUludGVyZmFjZXMgPSAoCiAgICAgICAgJ0FnZW50JyAgICA9PiAnQWdlbnQnLAogICAgICAgICdDdXN0b21lcicgPT4gJ0N1c3RvbWVyJywKICAgICAgICAnUHVibGljJyAgID0+ICdQdWJsaWMnCiAgICApOwoKICAgICRHZXRQYXJhbXtJbnRlcmZhY2VzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVJbnRlcmZhY2VzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnSW50ZXJmYWNlJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ludGVyZmFjZX0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQgJywKICAgICAgICBUcmFuc2xhdGFibGUgPT4gMAogICAgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIExhbmd1YWdlcyA9PiBcJVN5c3RlbUxhbmd1YWdlcywKICAgICAgICAgICAgJUdldFBhcmFtCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUVNpZGViYXInLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENoYW5nZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2VBY3Rpb24nICkgewoKICAgICAgICAjIENoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uLgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoTGFuZ3VhZ2UgSW50ZXJmYWNlKSkgewogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXskUGFyYW1OYW1lfSApIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05lZWQgJXMhJywgJFBhcmFtTmFtZSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte0NvbmZpZ0lEfSA9IHNwcmludGYoICIlMDNkIiwgJEdldFBhcmFte0NvbmZpZ0lEfSApOwoKICAgICAgICBteSAkU2V0dGluZ05hbWUgPSAiJEdldFBhcmFte0ludGVyZmFjZX1GQVFTaWRlQmFyOjpBcnRpY2xlcyMjIyRHZXRQYXJhbXtDb25maWdJRH0iOwogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBteSBAQXJ0aWNsZXM7CgogICAgICAgIG15ICVDb25maWcgPSAoCiAgICAgICAgICAgIExhbmd1YWdlICAgICAgICAgPT4gJEdldFBhcmFte0xhbmd1YWdlfSwKICAgICAgICAgICAgRGVmYXVsdEl0ZW1JRCAgICA9PiAkR2V0UGFyYW17RGVmYXVsdEl0ZW1JRH0sCiAgICAgICAgICAgIEN1c3RvbUdyb3VwT3JkZXIgPT4gJEdldFBhcmFte0N1c3RvbUdyb3VwT3JkZXJ9CiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRBcnRpY2xlQ291bnQgKCAxIC4uICRHZXRQYXJhbXtBcnRpY2xlQ291bnR9ICkgewogICAgICAgICAgICBteSAkQXJ0aWNsZUdyb3VwICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlXyIgLiAkQXJ0aWNsZUNvdW50ICkgfHwgJyc7CiAgICAgICAgICAgIG15ICRBcnRpY2xlSXRlbUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkl0ZW1JRF8iIC4gJEFydGljbGVDb3VudCApICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQXJ0aWNsZUdyb3VwKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcnRpY2xlcywgJEFydGljbGVHcm91cCAuICI6OiIgLiAkQXJ0aWNsZUl0ZW1JRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJENvbmZpZ3tBcnRpY2xlc30gPSBcQEFydGljbGVzOwoKICAgICAgICBteSBARGVwbG95U2V0dGluZ3M7CgogICAgICAgIG15ICRFeGNsdXNpdmVMb2NrR1VJRCA9ICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdMb2NrKAogICAgICAgICAgICBOYW1lICAgPT4gJFNldHRpbmdOYW1lLAogICAgICAgICAgICBGb3JjZSAgPT4gMSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHVubGVzcyAkRXhjbHVzaXZlTG9ja0dVSUQ7CgogICAgICAgIG15ICVVcGRhdGVSZXN1bHQgPSAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nVXBkYXRlKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAkU2V0dGluZ05hbWUsCiAgICAgICAgICAgIElzVmFsaWQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEVmZmVjdGl2ZVZhbHVlICAgID0+IFwlQ29uZmlnLAogICAgICAgICAgICBFeGNsdXNpdmVMb2NrR1VJRCA9PiAkRXhjbHVzaXZlTG9ja0dVSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVXBkYXRlUmVzdWx0e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICBwdXNoIEBEZXBsb3lTZXR0aW5ncywgJFNldHRpbmdOYW1lOwogICAgICAgIH0KCiAgICAgICAgbXkgJURlcGxveW1lbnRSZXN1bHQgPSAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWd1cmF0aW9uRGVwbG95KAogICAgICAgICAgICBDb21tZW50cyAgICAgID0+ICdTaWRlYmFyIHNldHRpbmcgJyAuICRTZXR0aW5nTmFtZSAuICcgbW9kaWZpZWQgYnk6ICcgLiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgRm9yY2UgICAgICAgICA9PiAxLAogICAgICAgICAgICBEaXJ0eVNldHRpbmdzID0+IFxARGVwbG95U2V0dGluZ3MsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJERlcGxveW1lbnRSZXN1bHR7U3VjY2Vzc30gKSB7CiAgICAgICAgICAgICRFcnJvcnsgJERlcGxveW1lbnRSZXN1bHR7RXJyb3J9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgICAgIExhbmd1YWdlcyA9PiBcJVN5c3RlbUxhbmd1YWdlcywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRU2lkZWJhcicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgRGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJyApIHsKCiAgICAgICAgIyBDaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbi4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KExhbmd1YWdlIEludGVyZmFjZSkpIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JFBhcmFtTmFtZX0gKSB7CgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdOZWVkICVzIScsICRQYXJhbU5hbWUgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXtDb25maWdJRH0gPSBzcHJpbnRmKCAiJTAzZCIsICRHZXRQYXJhbXtDb25maWdJRH0gKTsKCiAgICAgICAgbXkgJFNldHRpbmdOYW1lID0gIiRHZXRQYXJhbXtJbnRlcmZhY2V9RkFRU2lkZUJhcjo6QXJ0aWNsZXMjIyMkR2V0UGFyYW17Q29uZmlnSUR9IjsKCiAgICAgICAgbXkgQERlcGxveVNldHRpbmdzOwoKICAgICAgICBteSAkRXhjbHVzaXZlTG9ja0dVSUQgPSAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nTG9jaygKICAgICAgICAgICAgTmFtZSAgID0+ICRTZXR0aW5nTmFtZSwKICAgICAgICAgICAgRm9yY2UgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRSZXN1bHQgPSAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nUmVzZXQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICRTZXR0aW5nTmFtZSwKICAgICAgICAgICAgRXhjbHVzaXZlTG9ja0dVSUQgPT4gJEV4Y2x1c2l2ZUxvY2tHVUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgkUmVzdWx0KSB7CiAgICAgICAgICAgIHB1c2ggQERlcGxveVNldHRpbmdzLCAkU2V0dGluZ05hbWU7CiAgICAgICAgfQoKICAgICAgICBteSAlRGVwbG95bWVudFJlc3VsdCA9ICRTeXNDb25maWdPYmplY3QtPkNvbmZpZ3VyYXRpb25EZXBsb3koCiAgICAgICAgICAgIENvbW1lbnRzICAgICAgPT4gJ1NpZGViYXIgc2V0dGluZyAnIC4gJFNldHRpbmdOYW1lIC4gJyBkZWxldGVkIGJ5OiAnIC4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIEZvcmNlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgRGlydHlTZXR0aW5ncyA9PiBcQERlcGxveVNldHRpbmdzLAogICAgICAgICk7CgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgaWYgKCAhJERlcGxveW1lbnRSZXN1bHR7U3VjY2Vzc30gKSB7CiAgICAgICAgICAgICRFcnJvcnsgJERlcGxveW1lbnRSZXN1bHR7RXJyb3J9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgICAgIExhbmd1YWdlcyA9PiBcJVN5c3RlbUxhbmd1YWdlcywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRU2lkZWJhcicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249UmVzZXQiICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgT3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBteSAkTm90aWZpY2F0aW9uICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvblRleHQgPSAoCiAgICAgICAgICAgIFVwZGF0ZSA9PiBUcmFuc2xhdGFibGUoJ1NldHRpbmdzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIScpLAogICAgICAgICAgICBSZXNldCAgPT4gVHJhbnNsYXRhYmxlKCdTZXR0aW5ncyBzdWNjZXNzZnVsbHkgcmVzZXQhJyksCiAgICAgICAgKTsKICAgICAgICBpZiAoICROb3RpZmljYXRpb24gJiYgJE5vdGlmaWNhdGlvblRleHR7JE5vdGlmaWNhdGlvbn0gKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+ICROb3RpZmljYXRpb25UZXh0eyROb3RpZmljYXRpb259ICk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgU3lzdGVtTGFuZ3VhZ2VzID0+IFwlU3lzdGVtTGFuZ3VhZ2VzCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUVNpZGViYXInLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfRWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRGQVFPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgbXkgJUFnZW50RGF0YSAgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZBUVNpZGVCYXI6OkFydGljbGVzJykgfTsKICAgIG15ICVQdWJsaWNEYXRhICAgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1B1YmxpY0ZBUVNpZGVCYXI6OkFydGljbGVzJykgfTsKCiAgICBteSAlU2VsZWN0ZWREYXRhID0gJFBhcmFte0ludGVyZmFjZX0gZXEgJ0FnZW50JwogICAgICAgID8gJUFnZW50RGF0YQogICAgICAgIDogJFBhcmFte0ludGVyZmFjZX0gZXEgJ0N1c3RvbWVyJyA/ICVDdXN0b21lckRhdGEKICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHVibGljRGF0YTsKCiAgICBteSAlSW50ZXJmYWNlRGF0YTsKICAgIG15ICRDb25maWdJRDsKICAgIG15ICRDb25maWdMaW1pdCA9IGludCgga2V5cyAlU2VsZWN0ZWREYXRhICk7CiAgICBteSAkQ29uZmlnQ291bnQgPSAwOwogICAgbXkgJE5leHRDb25maWcgID0gMDsKICAgICRQYXJhbXtTaWRlYmFyTGFuZ3VhZ2V9IHx8PSAnJzsKCiAgICBDT05GSUc6CiAgICBmb3IgbXkgJENvbmZpZyAoIHNvcnQga2V5cyAlU2VsZWN0ZWREYXRhICkgewoKICAgICAgICAjIENvbGxlY3QgdGhlIGNvdW50IG9mIGNvbmZpZ3VyYXRpb25zIHdpdGggbGFuZ3VhZ2UgZGVmaW5lZAogICAgICAgIGlmICggJFNlbGVjdGVkRGF0YXskQ29uZmlnfS0+e0xhbmd1YWdlfSApIHsKICAgICAgICAgICAgJENvbmZpZ0NvdW50Kys7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTmV4dENvbmZpZyA9ICROZXh0Q29uZmlnID09IDAgPyBpbnQoJENvbmZpZykgOiAkTmV4dENvbmZpZzsKICAgICAgICB9CgogICAgICAgIG5leHQgQ09ORklHIGlmICRTZWxlY3RlZERhdGF7JENvbmZpZ30tPntMYW5ndWFnZX0gbmUgJFBhcmFte1NpZGViYXJMYW5ndWFnZX07CgogICAgICAgICVJbnRlcmZhY2VEYXRhID0gJXsgJFNlbGVjdGVkRGF0YXskQ29uZmlnfSB9OwogICAgICAgICRJbnRlcmZhY2VEYXRhe0xhbmd1YWdlfSB8fD0gJFBhcmFte1NpZGViYXJMYW5ndWFnZX07CiAgICAgICAgJENvbmZpZ0lEID0gaW50KCRDb25maWcpOwogICAgICAgIGxhc3QgQ09ORklHOwogICAgfQoKICAgIGlmICggJENvbmZpZ0NvdW50ID09ICRDb25maWdMaW1pdCAmJiAhJENvbmZpZ0lEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0xhbmd1YWdlIGNvbmZpZ3VyYXRpb24gbGltaXQgcmVhY2hlZCBmb3IgdGhlIGludGVyZmFjZTogJXMhJywgJFBhcmFte0ludGVyZmFjZX0gKSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkQ29uZmlnQ291bnQgPCAkQ29uZmlnTGltaXQgJiYgISRDb25maWdJRCApIHsKICAgICAgICAkQ29uZmlnSUQgPSAkTmV4dENvbmZpZzsKICAgIH0KCiAgICBteSBAQ3VzdG9tR3JvdXBPcmRlcjsKCiAgICBpZiAoICRJbnRlcmZhY2VEYXRhe0N1c3RvbUdyb3VwT3JkZXJ9ICkgewogICAgICAgIEBDdXN0b21Hcm91cE9yZGVyID0gc3BsaXQgLywvLCAkSW50ZXJmYWNlRGF0YXtDdXN0b21Hcm91cE9yZGVyfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICVPcmRlckl0ZW1zOwoKICAgICAgICBmb3IgbXkgJEFydGljbGUgKCBAeyAkSW50ZXJmYWNlRGF0YXtBcnRpY2xlc30gfSApIHsKICAgICAgICAgICAgbXkgQENvbnRlbnQgPSBzcGxpdCAvOjovLCAkQXJ0aWNsZTsKICAgICAgICAgICAgJE9yZGVySXRlbXN7ICRDb250ZW50WzBdIH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgQEN1c3RvbUdyb3VwT3JkZXIgPSBzb3J0IGtleXMgJU9yZGVySXRlbXM7CiAgICB9CgogICAgQEN1c3RvbUdyb3VwT3JkZXIgPSBtYXAge3MvXlxzK3xccyskLy9ncn0gQEN1c3RvbUdyb3VwT3JkZXI7CiAgICBteSAkQWN0aW9uID0gJ0VkaXQnOwoKICAgIGlmICggISRJbnRlcmZhY2VEYXRhe0xhbmd1YWdlfSApIHsKICAgICAgICAkQWN0aW9uID0gJ0FkZCc7CiAgICAgICAgJEludGVyZmFjZURhdGF7TGFuZ3VhZ2V9ID0gJFBhcmFte1NpZGViYXJMYW5ndWFnZX07CiAgICB9CgogICAgbXkgJUZBUVNlYXJjaFBhcmFtZXRlcjsKICAgIG15ICRTZWFyY2hMaW1pdCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpLZXl3b3JkQXJ0aWNlTGlzdDo6U2VhcmNoTGltaXQnKTsKICAgIG15IEBMYW5ndWFnZXMgICA9IGtleXMgJXsgJFBhcmFte0xhbmd1YWdlc30gfTsKCiAgICBteSBATGFuZ3VhZ2VJRHM7CiAgICBteSAlRkFRQXJ0aWNsZXM7CgogICAgTEFOR1VBR0VOQU1FOgogICAgZm9yIG15ICRMYW5ndWFnZU5hbWUgKEBMYW5ndWFnZXMpIHsKICAgICAgICBuZXh0IExBTkdVQUdFTkFNRSBpZiAhJExhbmd1YWdlTmFtZTsKCiAgICAgICAgbXkgJExhbmd1YWdlSUQgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkTGFuZ3VhZ2VOYW1lLAogICAgICAgICk7CgogICAgICAgIG5leHQgTEFOR1VBR0VOQU1FIGlmICEkTGFuZ3VhZ2VJRDsKICAgICAgICBwdXNoIEBMYW5ndWFnZUlEcywgJExhbmd1YWdlSUQ7CiAgICB9CgogICAgaWYgKEBMYW5ndWFnZXMpIHsKICAgICAgICAkRkFRU2VhcmNoUGFyYW1ldGVye0xhbmd1YWdlSURzfSA9IFxATGFuZ3VhZ2VJRHM7CiAgICB9CgogICAgIyByZXN0cmljdCBzZWxlY3RhYmxlIEZBUSBhcnRpY2xlcyBieSBpbnRlcmZhY2UKICAgIG15ICRGQVFTdGF0ZVR5cGVMaXN0UmVmID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlRkFRU3RhdGVUeXBlSURMb29rdXAgPSByZXZlcnNlICRGQVFTdGF0ZVR5cGVMaXN0UmVmLT4lKjsKICAgIGlmICggJFBhcmFte0ludGVyZmFjZX0gZXEgJ0FnZW50JyApIHsKICAgICAgICAkRkFRU2VhcmNoUGFyYW1ldGVye1N0YXRlc30gPSB7CiAgICAgICAgICAgICRGQVFTdGF0ZVR5cGVJRExvb2t1cHsnaW50ZXJuYWwnfSA9PiAnaW50ZXJuYWwnLAogICAgICAgICAgICAkRkFRU3RhdGVUeXBlSURMb29rdXB7J2V4dGVybmFsJ30gPT4gJ2V4dGVybmFsJywKICAgICAgICAgICAgJEZBUVN0YXRlVHlwZUlETG9va3VweydwdWJsaWMnfSAgID0+ICdwdWJsaWMnLAogICAgICAgIH07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJbnRlcmZhY2V9IGVxICdDdXN0b21lcicgKSB7CiAgICAgICAgJEZBUVNlYXJjaFBhcmFtZXRlcntTdGF0ZXN9ID0gewogICAgICAgICAgICAkRkFRU3RhdGVUeXBlSURMb29rdXB7J2V4dGVybmFsJ30gPT4gJ2V4dGVybmFsJywKICAgICAgICAgICAgJEZBUVN0YXRlVHlwZUlETG9va3VweydwdWJsaWMnfSAgID0+ICdwdWJsaWMnLAogICAgICAgIH07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJbnRlcmZhY2V9IGVxICdQdWJsaWMnICkgewogICAgICAgICRGQVFTZWFyY2hQYXJhbWV0ZXJ7U3RhdGVzfSA9IHsKICAgICAgICAgICAgJEZBUVN0YXRlVHlwZUlETG9va3VweydwdWJsaWMnfSA9PiAncHVibGljJywKICAgICAgICB9OwogICAgfQoKICAgICMgR2V0IHRoZSByZWxldmFudCBGQVEgYXJ0aWNsZXMuCiAgICBteSBARkFRQXJ0aWNsZUlEcyA9ICRGQVFPYmplY3QtPkZBUVNlYXJjaCgKICAgICAgICAlRkFRU2VhcmNoUGFyYW1ldGVyLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydGQVFJRCddLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydEb3duJ10sCiAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAkU2VhcmNoTGltaXQsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGZvciBteSAkSXRlbUlEIChARkFRQXJ0aWNsZUlEcykgewogICAgICAgIG15ICVGQVEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAwLAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRGQVFBcnRpY2xlc3skSXRlbUlEfSA9ICJbJEZBUXtMYW5ndWFnZX1dICRGQVF7VGl0bGV9IjsKICAgIH0KCiAgICAkUGFyYW17RGVmYXVsdEl0ZW1JRFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRkFRQXJ0aWNsZXMsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZWZhdWx0SXRlbUlEJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJEludGVyZmFjZURhdGF7RGVmYXVsdEl0ZW1JRH0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQgJywKICAgICAgICBUcmFuc2xhdGFibGUgPT4gMAogICAgKTsKCiAgICAkUGFyYW17SXRlbU5leHRJRFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRkFRQXJ0aWNsZXMsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdJdGVtSURfTmV4dElEJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gMCwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCAnLAogICAgICAgIFRyYW5zbGF0YWJsZSA9PiAwCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uTGlzdCcsCiAgICAgICAgRGF0YSA9PiB7fSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnSGludCcsCiAgICAgICAgRGF0YSA9PiB7fSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVJbnRlcmZhY2VEYXRhLAogICAgICAgICAgICBBcnRpY2xlQ291bnQgPT4gaW50KCBAeyAkSW50ZXJmYWNlRGF0YXtBcnRpY2xlc30gfSApIHx8IDEsCiAgICAgICAgICAgIENvbmZpZ0lEICAgICA9PiAkQ29uZmlnSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJycKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoQEN1c3RvbUdyb3VwT3JkZXIpIHsKICAgICAgICBteSAkQ291bnRPcmRlciA9IDE7CgogICAgICAgIGZvciBteSAkR3JvdXBOYW1lIChAQ3VzdG9tR3JvdXBPcmRlcikgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbUdyb3VwT3JkZXJJdGVtcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPcmRlciAgID0+ICRDb3VudE9yZGVyLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEdyb3VwTmFtZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENvdW50T3JkZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvdW50ID0gMTsKCiAgICBpZiAoIEB7ICRJbnRlcmZhY2VEYXRhe0FydGljbGVzfSB9ID4gMCApIHsKICAgICAgICBmb3IgbXkgJEFydGljbGUgKCBAeyAkSW50ZXJmYWNlRGF0YXtBcnRpY2xlc30gfSApIHsKCiAgICAgICAgICAgIG15IEBDb250ZW50ID0gJEFydGljbGUgPX4gL14oLiopOjooXGQrKSQvOwoKICAgICAgICAgICAgJFBhcmFte0l0ZW1JRFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVGQVFBcnRpY2xlcywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnSXRlbUlEXycgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENvbnRlbnRbMV0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGUgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jvd0FydGljbGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICA9PiAkQ29udGVudFswXSwKICAgICAgICAgICAgICAgICAgICBJdGVtSURTdHJnID0+ICRQYXJhbXtJdGVtSURTdHJnfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICRQYXJhbXtJdGVtSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVGQVFBcnRpY2xlcywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdJdGVtSURfMScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAwLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQgJywKICAgICAgICAgICAgVHJhbnNsYXRhYmxlID0+IDAKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSb3dBcnRpY2xlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgID0+ICIiLAogICAgICAgICAgICAgICAgSXRlbUlEU3RyZyA9PiAkUGFyYW17SXRlbUlEU3RyZ30KICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0hlYWRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEFjdGlvbiA9PiAkQWN0aW9uIHx8ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJEZBUU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiAgICBteSAlQWdlbnREYXRhICAgID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudEZBUVNpZGVCYXI6OkFydGljbGVzJykgfTsKICAgIG15ICVDdXN0b21lckRhdGEgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRkFRU2lkZUJhcjo6QXJ0aWNsZXMnKSB9OwogICAgbXkgJVB1YmxpY0RhdGEgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRkFRU2lkZUJhcjo6QXJ0aWNsZXMnKSB9OwogICAgbXkgQERhdGE7CgogICAgbXkgJVN5c3RlbUxhbmd1YWdlcyA9ICV7ICRQYXJhbXtTeXN0ZW1MYW5ndWFnZXN9IH07CgogICAgQ09ORklHX0FHRU5UOgogICAgZm9yIG15ICRJbnRlcmZhY2UgKHF3KEFnZW50IEN1c3RvbWVyIFB1YmxpYykpIHsKICAgICAgICBteSAlU2VsZWN0ZWREYXRhID0gJEludGVyZmFjZSBlcSAnQWdlbnQnCiAgICAgICAgICAgID8gJUFnZW50RGF0YQogICAgICAgICAgICA6ICRJbnRlcmZhY2UgZXEgJ0N1c3RvbWVyJyA/ICVDdXN0b21lckRhdGEKICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHVibGljRGF0YTsKCiAgICAgICAgQ09ORklHOgogICAgICAgIGZvciBteSAkQ29uZmlnICggc29ydCBrZXlzICVTZWxlY3RlZERhdGEgKSB7CiAgICAgICAgICAgIG5leHQgQ09ORklHIGlmICEkU2VsZWN0ZWREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9OwoKICAgICAgICAgICAgbXkgJUZBUTsKCiAgICAgICAgICAgIGlmICggJFNlbGVjdGVkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9ICkgewogICAgICAgICAgICAgICAgJUZBUSA9ICRGQVFPYmplY3QtPkZBUUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICAgICAgID0+ICRTZWxlY3RlZERhdGF7JENvbmZpZ30tPntEZWZhdWx0SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBJdGVtRmllbGRzICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgICAgICAgICAgQ29uZmlnSUQgICAgICAgICAgICA9PiBpbnQoJENvbmZpZyksCiAgICAgICAgICAgICAgICBMYW5ndWFnZSAgICAgICAgICAgID0+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvU3lzdGVtL0ZBUS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CgojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UT0JPOjpQZXJsOjpQYXJhbU9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNSU1FOjpCYXNlNjQgcXcoKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnVzZSBwYXJlbnQgcXcoCiAgICBLZXJuZWw6OlN5c3RlbTo6RkFRU2VhcmNoCiAgICBLZXJuZWw6OlN5c3RlbTo6RkFROjpMYW5ndWFnZQogICAgS2VybmVsOjpTeXN0ZW06OkZBUTo6Q2F0ZWdvcnkKICAgIEtlcm5lbDo6U3lzdGVtOjpGQVE6OlN0YXRlCiAgICBLZXJuZWw6OlN5c3RlbTo6RkFROjpSZWxhdGVkQXJ0aWNsZQogICAgS2VybmVsOjpTeXN0ZW06OkZBUTo6Vm90ZQogICAgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcgopOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RkFRIC0gIEZBUSBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIEZBUSBmdW5jdGlvbnMuIEUuIGcuIHRvIGFkZCBGQVFzIG9yIHRvIGdldCBGQVFzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpCiAgICAkU2VsZi0+e0xpa2VFc2NhcGVTdHJpbmd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBkZWZhdWx0IG9wdGlvbnMKICAgICRTZWxmLT57Vm90aW5nfSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpWb3RpbmcnKTsKCiAgICAjIGdldCB0aGUgY2FjaGUgVFRMIChpbiBzZWNvbmRzKQogICAgJFNlbGYtPntDYWNoZVRUTH0gPSBpbnQoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpDYWNoZVRUTCcpIHx8IDYwICogNjAgKiAyNCAqIDIgKTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgIyBjdXJyZW50bHkgdGhlcmUgYXJlIG5vIEZBUSBldmVudCBtb2R1bGVzIGJ1dCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBvdGhlcndpc2UgZXJyb3JzIGFyZQogICAgIyAgICAgbG9nIGR1ZSB0byBzZWFyY2hpbmcgdW5kZWZpbmVkIHNldHRpbmcgaW50byBDb25maWdPYmplY3QuCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgPT4gJycsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEZBUUdldCgpCgo9Zm9yIHN0b3B3b3JkcyBzdmcKCmdldCBhbiBGQVEgaXRlbQoKICAgIG15ICVGQVEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAxMjMsCiAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAwLCAgICAgICAgIyBPcHRpb25hbCwgZGVmYXVsdCAwLiBUbyBpbmNsdWRlIHRoZSBpdGVtIGZpZWxkIGNvbnRlbnQgZm9yIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgRkFRIGl0ZW0gb24gdGhlIHJldHVybiBzdHJ1Y3R1cmUuCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLCAgICAgICAgIyBPcHRpb25hbCwgZGVmYXVsdCAwLiBUbyBpbmNsdWRlIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBGQVEgaXRlbSBvbiB0aGUgcmV0dXJuIHN0cnVjdHVyZS4KICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAlRkFRID0gKAogICAgICAgIElEICAgICAgICAgICAgICAgID0+IDMyLAogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+IDMyLAogICAgICAgIEZBUUlEICAgICAgICAgICAgID0+IDMyLAogICAgICAgIE51bWJlciAgICAgICAgICAgID0+IDEwMDAzMiwKICAgICAgICBDYXRlZ29yeUlEICAgICAgICA9PiAnMicsCiAgICAgICAgQ2F0ZWdvcnlOYW1lJyAgICAgPT4gJ0NhdGVnb3J5QTo6Q2F0ZWdvcnlCJywKICAgICAgICBDYXRlZ29yeVNob3J0TmFtZSA9PiAnQ2F0ZWdvcnlCJywKICAgICAgICBMYW5ndWFnZUlEICAgICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICdlbicsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgPT4gJ0FydGljbGUgVGl0bGUnLAogICAgICAgIEFwcHJvdmVkICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciAwCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZCAgICAgICAgICAgICA9PiAndmFsaWQnLAogICAgICAgIEtleXdvcmRzICAgICAgICAgID0+ICdLZXlXb3JkMSBLZXlXb3JkMicsCiAgICAgICAgVm90ZXMgICAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG51bWJlciBvZiB2b3RlcwogICAgICAgIFZvdGVSZXN1bHQgICAgICAgID0+ICcwLjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBiZXR3ZWVuIDAuMDAgYW5kIDEwMC4wMAogICAgICAgIFN0YXRlSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgU3RhdGUgICAgICAgICAgICAgPT4gJ2ludGVybmFsIChhZ2VudCknLCAgICAgICAgICAgICAjIG9yICdleHRlcm5hbCAoY3VzdG9tZXIpJyBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAncHVibGljIChhbGwpJwogICAgICAgIFN0YXRlVHlwZUlEICAgICAgID0+IDEsCiAgICAgICAgU3RhdGVUeXBlTmFtZSAgICAgPT4gJ2ludGVybmFsJywgICAgICAgICAgICAgICAgICAgICAjIG9yICdleHRlcm5hbCcgb3IgJ3B1YmxpYycKICAgICAgICBDcmVhdGVkQnkgICAgICAgICA9PiAxLAogICAgICAgIENoYW5nZWQnICAgICAgICAgID0+ICcyMDExLTAxLTA1IDIxOjUzOjUwJywKICAgICAgICBDaGFuZ2VkQnkgICAgICAgICA9PiAnMScsCiAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgPT4gJzIwMTEtMDEtMDUgMjE6NTM6NTAnLAogICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICcxMjk0Mjg2MDMwLTMxLjE2OTcyOTcxMDQ3MzInLCAgIyBGQVEgQXJ0aWNsZSBuYW1lIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN5c3RlbXRpbWUgKyAnLScgKyByYW5kb20gbnVtYmVyCiAgICAgICAgU2VydmljZUxpc3QgICAgICAgPT4geyAnMScgPT4gJ0NvbXB1dGVyJyB9LCAgICAgICAgICAgIyBIYXNoIG9mIHJlbGF0ZWQgc2VydmljZXMKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICBJY29uICAgICAgICAgICAgICA9PiAnc3ZnIHRleHQnCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgKTsKCiAgICBteSAlRkFRID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgIEl0ZW1JRCAgICAgICAgPT4gMTIzLAogICAgICAgIEl0ZW1GaWVsZHMgICAgPT4gMSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJUZBUSA9ICgKCiAgICAgICAgIyBDb21wYXRpYmlsaXR5IElEIG5hbWVzLgogICAgICAgIElEICAgICAgICAgICAgICAgID0+IDMyLAogICAgICAgIEZBUUlEICAgICAgICAgICAgID0+IDMyLAoKICAgICAgICBJdGVtSUQgICAgICAgICAgICA9PiAzMiwKICAgICAgICBOdW1iZXIgICAgICAgICAgICA9PiAxMDAwMzIsCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgICAgPT4gJzInLAogICAgICAgIENhdGVnb3J5TmFtZScgICAgID0+ICdDYXRlZ29yeUE6OkNhdGVnb3J5QicsCiAgICAgICAgQ2F0ZWdvcnlTaG9ydE5hbWUgPT4gJ0NhdGVnb3J5QicsCiAgICAgICAgTGFuZ3VhZ2VJRCAgICAgICAgPT4gMSwKICAgICAgICBMYW5ndWFnZSAgICAgICAgICA9PiAnZW4nLAogICAgICAgIFRpdGxlICAgICAgICAgICAgID0+ICdBcnRpY2xlIFRpdGxlJywKICAgICAgICBGaWVsZDEgICAgICAgICAgICA9PiAnVGhlIFN5bXB0b21zJywKICAgICAgICBGaWVsZDIgICAgICAgICAgICA9PiAnVGhlIFByb2JsZW0nLAogICAgICAgIEZpZWxkMyAgICAgICAgICAgID0+ICdUaGUgU29sdXRpb24nLAogICAgICAgIEZpZWxkNCAgICAgICAgICAgID0+IHVuZGVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgYWN0aXZlIGJ5IGRlZmF1bHQKICAgICAgICBGaWVsZDUgICAgICAgICAgICA9PiB1bmRlZiwgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IGFjdGl2ZSBieSBkZWZhdWx0CiAgICAgICAgRmllbGQ2ICAgICAgICAgICAgPT4gJ0NvbW1lbnRzJywKICAgICAgICBBcHByb3ZlZCAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IgMAogICAgICAgIFZhbGlkSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgQ29udGVudFR5cGUgICAgICAgPT4gJ3RleHQvcGxhaW4nLCAgICAgICAgICAgICAgICAgICMgb3IgJ3RleHQvaHRtbCcKICAgICAgICBWYWxpZCAgICAgICAgICAgICA9PiAndmFsaWQnLAogICAgICAgIEtleXdvcmRzICAgICAgICAgID0+ICdLZXlXb3JkMSBLZXlXb3JkMicsCiAgICAgICAgVm90ZXMgICAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG51bWJlciBvZiB2b3RlcwogICAgICAgIFZvdGVSZXN1bHQgICAgICAgID0+ICcwLjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBiZXR3ZWVuIDAuMDAgYW5kIDEwMC4wMAogICAgICAgIFN0YXRlSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgU3RhdGUgICAgICAgICAgICAgPT4gJ2ludGVybmFsIChhZ2VudCknLCAgICAgICAgICAgICAjIG9yICdleHRlcm5hbCAoY3VzdG9tZXIpJyBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAncHVibGljIChhbGwpJwogICAgICAgIFN0YXRlVHlwZUlEICAgICAgID0+IDEsCiAgICAgICAgU3RhdGVUeXBlTmFtZSAgICAgPT4gJ2ludGVybmFsJywgICAgICAgICAgICAgICAgICAgICAjIG9yICdleHRlcm5hbCcgb3IgJ3B1YmxpYycKICAgICAgICBDcmVhdGVkQnkgICAgICAgICA9PiAxLAogICAgICAgIENoYW5nZWQnICAgICAgICAgID0+ICcyMDExLTAxLTA1IDIxOjUzOjUwJywKICAgICAgICBDaGFuZ2VkQnkgICAgICAgICA9PiAnMScsCiAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgPT4gJzIwMTEtMDEtMDUgMjE6NTM6NTAnLAogICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICcxMjk0Mjg2MDMwLTMxLjE2OTcyOTcxMDQ3MzInLCAgIyBGQVEgQXJ0aWNsZSBuYW1lIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN5c3RlbXRpbWUgKyAnLScgKyByYW5kb20gbnVtYmVyCiAgICAgICAgU2VydmljZUxpc3QgICAgICAgPT4geyAnMScgPT4gJ0NvbXB1dGVyJyB9LCAgICAgICAgICAgIyBIYXNoIG9mIHJlbGF0ZWQgc2VydmljZXMKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgIEljb24gICAgICAgICAgICAgID0+ICdzdmcgdGV4dCcKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICApOwoKPWN1dAoKc3ViIEZBUUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVuYW1lIGZyb20gSXRlbUlEIHRvIEZBUUlECiAgICBpZiAoICRQYXJhbXtGQVFJRH0gKSB7CiAgICAgICAgJFBhcmFte0l0ZW1JRH0gPSAkUGFyYW17RkFRSUR9OwogICAgfQoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkRmV0Y2hJdGVtRmllbGRzID0gJFBhcmFte0l0ZW1GaWVsZHN9ID8gMSA6IDA7CgogICAgbXkgJENhY2hlS2V5ID0gJ0ZBUUdldDo6SXRlbUlEOjonIC4gJFBhcmFte0l0ZW1JRH0gLiAnOjpJdGVtRmllbGRzOjonIC4gJEZldGNoSXRlbUZpZWxkczsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBteSAkQ2FjaGUgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICdGQVEnLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICREQk9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHNldCAlRGF0YSBmcm9tIGNhY2hlIGlmIGFueQogICAgbXkgJURhdGE7CiAgICBpZiAoIHJlZiAkQ2FjaGUgZXEgJ0hBU0gnICkgewogICAgICAgICVEYXRhID0gJXskQ2FjaGV9OwogICAgfQoKICAgICMgb3RoZXJ3aXNlIGdldCAlRGF0YSBmcm9tIHRoZSBEQgogICAgZWxzZSB7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKIyAgICAgICAgICAgICBTUUwgPT4gJwojICAgICAgICAgICAgICAgICBTRUxFQ1QgaS5mX25hbWUsIGkuZl9sYW5ndWFnZV9pZCwgaS5mX3N1YmplY3QsIGkuY3JlYXRlZCwgaS5jcmVhdGVkX2J5LCBpLmNoYW5nZWQsCiMgICAgICAgICAgICAgICAgICAgICBpLmNoYW5nZWRfYnksIGkuY2F0ZWdvcnlfaWQsIGkuc3RhdGVfaWQsIGMubmFtZSwgcy5uYW1lLCBsLm5hbWUsIGkuZl9rZXl3b3JkcywKIyAgICAgICAgICAgICAgICAgICAgIGkuYXBwcm92ZWQsIGkudmFsaWRfaWQsIGkuY29udGVudF90eXBlLCBpLmZfbnVtYmVyLCBzdC5pZCwgc3QubmFtZQojICAgICAgICAgICAgICAgICBGUk9NIGZhcV9pdGVtIGksIGZhcV9jYXRlZ29yeSBjLCBmYXFfc3RhdGUgcywgZmFxX3N0YXRlX3R5cGUgc3QsIGZhcV9sYW5ndWFnZSBsCiMgICAgICAgICAgICAgICAgIFdIRVJFIGkuc3RhdGVfaWQgPSBzLmlkCiMgICAgICAgICAgICAgICAgICAgICBBTkQgcy50eXBlX2lkID0gc3QuaWQKIyAgICAgICAgICAgICAgICAgICAgIEFORCBpLmNhdGVnb3J5X2lkID0gYy5pZAojICAgICAgICAgICAgICAgICAgICAgQU5EIGkuZl9sYW5ndWFnZV9pZCA9IGwuaWQKIyAgICAgICAgICAgICAgICAgICAgIEFORCBpLmlkID0gPycsCiMgICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKIyAgICAgICAgICAgICBMaW1pdCA9PiAxLAojICAgICAgICAgKTsKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFNFTEVDVCBpLmZfbmFtZSwgaS5mX2xhbmd1YWdlX2lkLCBpLmZfc3ViamVjdCwgaS5jcmVhdGVkLCBpLmNyZWF0ZWRfYnksIGkuY2hhbmdlZCwKICAgICAgICAgICAgICAgICAgICBpLmNoYW5nZWRfYnksIGkuY2F0ZWdvcnlfaWQsIGkuc3RhdGVfaWQsIGMubmFtZSwgcy5uYW1lLCBsLm5hbWUsIGkuZl9rZXl3b3JkcywKICAgICAgICAgICAgICAgICAgICBpLmFwcHJvdmVkLCBpLnZhbGlkX2lkLCBpLmNvbnRlbnRfdHlwZSwgaS5mX251bWJlciwgc3QuaWQsIHN0Lm5hbWUsIGkuaWNvbgogICAgICAgICAgICAgICAgRlJPTSBmYXFfaXRlbSBpLCBmYXFfY2F0ZWdvcnkgYywgZmFxX3N0YXRlIHMsIGZhcV9zdGF0ZV90eXBlIHN0LCBmYXFfbGFuZ3VhZ2UgbAogICAgICAgICAgICAgICAgV0hFUkUgaS5zdGF0ZV9pZCA9IHMuaWQKICAgICAgICAgICAgICAgICAgICBBTkQgcy50eXBlX2lkID0gc3QuaWQKICAgICAgICAgICAgICAgICAgICBBTkQgaS5jYXRlZ29yeV9pZCA9IGMuaWQKICAgICAgICAgICAgICAgICAgICBBTkQgaS5mX2xhbmd1YWdlX2lkID0gbC5pZAogICAgICAgICAgICAgICAgICAgIEFORCBpLmlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgJURhdGEgPSAoCgogICAgICAgICAgICAgICAgIyBDb21wYXRpYmlsaXR5IElEIG5hbWVzLgogICAgICAgICAgICAgICAgSUQgICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBGQVFJRCA9PiAkUGFyYW17SXRlbUlEfSwKCiAgICAgICAgICAgICAgICAjIEdldCBkYXRhIGF0dHJpYnV0ZXMuCiAgICAgICAgICAgICAgICBJdGVtSUQgICAgICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCAgICA9PiAkUm93WzFdLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICAgICAgQ3JlYXRlZCAgICAgICA9PiAkUm93WzNdLAogICAgICAgICAgICAgICAgQ3JlYXRlZEJ5ICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICAgICAgQ2hhbmdlZCAgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICAgICAgQ2hhbmdlZEJ5ICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCAgICA9PiAkUm93WzddLAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkUm93WzhdLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlOYW1lICA9PiAkUm93WzldLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICA9PiAkUm93WzEwXSwKICAgICAgICAgICAgICAgIExhbmd1YWdlICAgICAgPT4gJFJvd1sxMV0sCiAgICAgICAgICAgICAgICBLZXl3b3JkcyAgICAgID0+ICRSb3dbMTJdLAogICAgICAgICAgICAgICAgQXBwcm92ZWQgICAgICA9PiAkUm93WzEzXSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJFJvd1sxNF0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgID0+ICRSb3dbMTVdLAogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICA9PiAkUm93WzE2XSwKICAgICAgICAgICAgICAgIFN0YXRlVHlwZUlEICAgPT4gJFJvd1sxN10sCiAgICAgICAgICAgICAgICBTdGF0ZVR5cGVOYW1lID0+ICRSb3dbMThdLAojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICBJY29uID0+ICRSb3dbMTldLAojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJURhdGEgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIEl0ZW1JRCAkUGFyYW17SXRlbUlEfSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBGQVEgaXRlbSBmaWVsZHMgYXJlIHJlcXVpcmVkCiAgICAgICAgaWYgKCRGZXRjaEl0ZW1GaWVsZHMpIHsKCiAgICAgICAgICAgIGZvciBteSAkRmllbGROdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZmllbGQgbmFtZQogICAgICAgICAgICAgICAgbXkgJEZpZWxkID0gIkZpZWxkJEZpZWxkTnVtYmVyIjsKCiAgICAgICAgICAgICAgICAjIGdldCBlYWNoIGZpZWxkIGNvbnRlbnQKICAgICAgICAgICAgICAgICREYXRheyRGaWVsZH0gPSAkU2VsZi0+SXRlbUZpZWxkR2V0KAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBudW1iZXIKICAgICAgICBpZiAoICEkRGF0YXtOdW1iZXJ9ICkgewoKICAgICAgICAgICAgbXkgJE51bWJlciA9ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtSUQnKSAuICcwMCcgLiAkRGF0YXtJdGVtSUR9OwoKICAgICAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIGZhcV9pdGVtIFNFVCBmX251bWJlciA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJE51bWJlciwgXCREYXRhe0l0ZW1JRH0gXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREYXRhe051bWJlcn0gPSAkTnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGNhdGVnb3J5IGxvbmcgbmFtZXMKICAgICAgICBteSAkQ2F0ZWdvcnlUcmVlID0gJFNlbGYtPkNhdGVnb3J5VHJlZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdGhlIGNhdGVnb3J5IHNob3J0IG5hbWUKICAgICAgICAkRGF0YXtDYXRlZ29yeVNob3J0TmFtZX0gPSAkRGF0YXtDYXRlZ29yeU5hbWV9OwoKICAgICAgICAjIGdldCB0aGUgY2F0ZWdvcnkgbG9uZyBuYW1lCiAgICAgICAgJERhdGF7Q2F0ZWdvcnlOYW1lfSA9ICRDYXRlZ29yeVRyZWUtPnsgJERhdGF7Q2F0ZWdvcnlJRH0gfTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAgICAgJERhdGF7VmFsaWR9ID0gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfTsKIyBGQVEgU2VydmljZQoKICAgICAgICAjIGdldCByZWxhdGVkIHNlcnZpY2VzCiAgICAgICAgbXkgJFNlcnZpY2VzUmVsYXRlZCA9ICRTZWxmLT5GQVFTZXJ2aWNlR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFNlcnZpY2VzUmVsYXRlZCkgewogICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2UgKEAkU2VydmljZXNSZWxhdGVkKSB7CiAgICAgICAgICAgICAgICAkRGF0YXtTZXJ2aWNlTGlzdH0tPnsgJFNlcnZpY2UtPnsnU2VydmljZUlEJ30gfSA9ICRTZXJ2aWNlLT57J05hbWUnfTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyBlbyBGQVEgU2VydmljZQoKICAgICAgICAjIGNhY2hlIHJlc3VsdAogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRkFRJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJURhdGEsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFZvdGVEYXRhOwogICAgaWYgKCAkU2VsZi0+e1ZvdGluZ30gKSB7CiAgICAgICAgJFZvdGVEYXRhID0gJFNlbGYtPkl0ZW1Wb3RlRGF0YUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZnJvbSBjb25maWcKICAgIG15ICREZWNpbWFsUGxhY2VzID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkV4cGxvcmVyOjpJdGVtTGlzdDo6Vm90aW5nUmVzdWx0RGVjaW1hbFBsYWNlcycpIHx8IDA7CgogICAgIyBmb3JtYXQgdGhlIHZvdGUgcmVzdWx0CiAgICBteSAkVm90ZVJlc3VsdCA9IHNwcmludGYoICIlMC4iIC4gJERlY2ltYWxQbGFjZXMgLiAiZiIsICRWb3RlRGF0YS0+e1Jlc3VsdH0gfHwgMCApOwoKICAgICMgYWRkIHZvdGluZyBpbmZvcm1hdGlvbiB0byBGQVEgaXRlbQogICAgJERhdGF7Vm90ZVJlc3VsdH0gPSAkVm90ZVJlc3VsdDsKICAgICREYXRhe1ZvdGVzfSAgICAgID0gJFZvdGVEYXRhLT57Vm90ZXN9IHx8IDA7CgogICAgIyBjaGVjayBpZiBuZWVkIHRvIHJldHVybiBEeW5hbWljRmllbGRzCiAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRzfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIGR5bmFtaWMgZmllbGRzIGZvciB0aGUgb2JqZWN0IHR5cGUgRkFRCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ0ZBUScKICAgICAgICApOwoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKCiAgICAgICAgICAgICMgdmFsaWRhdGUgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjdXJyZW50IHZhbHVlIGZvciBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdGhlIGR5bmFtaWMgZmllbGQgbmFtZSBhbmQgdmFsdWUgaW50byB0aGUgZGF0YSBoYXNoCiAgICAgICAgICAgICREYXRheyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9CgpzdWIgSXRlbUZpZWxkR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIEl0ZW1JRCBGaWVsZCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIHZhbGlkIGZpZWxkIG5hbWUKICAgIGlmICggJFBhcmFte0ZpZWxkfSAhfiBteyBcQSBGaWVsZCBbMS02XSBceiB9bXN4aSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZpZWxkICckUGFyYW17RmllbGR9JyBpcyBpbnZhbGlkISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdJdGVtRmllbGRHZXQ6Okl0ZW1JRDo6JyAuICRQYXJhbXtJdGVtSUR9OwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgICMgY2hlY2sgaWYgYSBjYWNoZSBlbnRyeSBleGlzdHMgZm9yIHRoZSBnaXZlbiBGaWVsZAogICAgaWYgKCByZWYgJENhY2hlIGVxICdIQVNIJyAmJiBleGlzdHMgJENhY2hlLT57ICRQYXJhbXtGaWVsZH0gfSApIHsKCiAgICAgICAgcmV0dXJuICRDYWNoZS0+eyAkUGFyYW17RmllbGR9IH07CiAgICB9CgogICAgIyBjcmVhdGUgYSBmaWVsZCBsb29rdXAgdGFibGUKICAgIG15ICVGaWVsZExvb2t1cCA9ICgKICAgICAgICBGaWVsZDEgPT4gJ2ZfZmllbGQxJywKICAgICAgICBGaWVsZDIgPT4gJ2ZfZmllbGQyJywKICAgICAgICBGaWVsZDMgPT4gJ2ZfZmllbGQzJywKICAgICAgICBGaWVsZDQgPT4gJ2ZfZmllbGQ0JywKICAgICAgICBGaWVsZDUgPT4gJ2ZfZmllbGQ1JywKICAgICAgICBGaWVsZDYgPT4gJ2ZfZmllbGQ2JywKICAgICk7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgJyAuICRGaWVsZExvb2t1cHsgJFBhcmFte0ZpZWxkfSB9IC4gJwogICAgICAgICAgICBGUk9NIGZhcV9pdGVtCiAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkRmllbGQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRmllbGQgPSAkUm93WzBdIHx8ICcnOwogICAgfQoKICAgIGlmICggcmVmICRDYWNoZSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgQ2FjaGUgZmlsZSBmb3IgSXRlbUlEIGFscmVhZHkgZXhpc3RzLCBhZGQgZmllbGQgZGF0YS4KICAgICAgICAkQ2FjaGUtPnsgJFBhcmFte0ZpZWxkfSB9ID0gJEZpZWxkOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgQ3JlYXRlIG5ldyBjYWNoZSBmaWxlLgogICAgICAgICRDYWNoZSA9IHsKICAgICAgICAgICAgJFBhcmFte0ZpZWxkfSA9PiAkRmllbGQsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+ICRDYWNoZSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuICRGaWVsZDsKfQoKPWhlYWQyIEZBUUFkZCgpCgphZGQgYW4gYXJ0aWNsZQoKICAgIG15ICRJdGVtSUQgPSAkRkFRT2JqZWN0LT5GQVFBZGQoCiAgICAgICAgVGl0bGUgICAgICAgPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgQ2F0ZWdvcnlJRCAgPT4gMSwKICAgICAgICBTdGF0ZUlEICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlSUQgID0+IDEsCiAgICAgICAgTnVtYmVyICAgICAgPT4gJzEzNDAyJywgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgS2V5d29yZHMgICAgPT4gJ3NvbWUga2V5d29yZHMnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQxICAgICAgPT4gJ1N5bXB0b20uLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQyICAgICAgPT4gJ1Byb2JsZW0uLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQzICAgICAgPT4gJ1NvbHV0aW9uLi4uJywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ0ICAgICAgPT4gJ0ZpZWxkNC4uLicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ1ICAgICAgPT4gJ0ZpZWxkNS4uLicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ2ICAgICAgPT4gJ0NvbW1lbnQuLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQXBwcm92ZWQgICAgPT4gMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsICAgICAjIG9yICd0ZXh0L2h0bWwnCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgIEljb24gICAgICAgID0+ICdzdmcgdGV4dCcsICAgICAgICAjIChvcHRpb25hbCkKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICApOwoKUmV0dXJuczoKCiAgICAkSXRlbUlEID0gMzQ7Cgo9Y3V0CgpzdWIgRkFRQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDYXRlZ29yeUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCBUaXRsZSBVc2VySUQgQ29udGVudFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgVmFsaWRJRAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWRJRH0gKSB7CgogICAgICAgICMgZ2V0IHRoZSB2YWxpZCBpZHMKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgJFBhcmFte1ZhbGlkSUR9ID0gJFZhbGlkSURzWzBdOwogICAgfQoKICAgICMgY2hlY2sgbmFtZQogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRQYXJhbXtOYW1lfSA9IHRpbWUoKSAuICctJyAuIHJhbmQoMTAwKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG51bWJlcgogICAgaWYgKCAhJFBhcmFte051bWJlcn0gKSB7CiAgICAgICAgJFBhcmFte051bWJlcn0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbUlEJykgLiByYW5kKDEwMCk7CiAgICB9CgogICAgIyBjaGVjayBpZiBhcHByb3ZhbCBmZWF0dXJlIGlzIHVzZWQKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUmVxdWlyZWQnKSApIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICAgICAgbXkgJUdyb3VwcyA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgYXBwcm92YWwgZ3JvdXAKICAgICAgICBteSAkQXBwcm92YWxHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbEdyb3VwJyk7CgogICAgICAgICMgc2V0IGRlZmF1bHQgdG8gMCBpZiBhcHByb3ZlZCBwYXJhbSBpcyBub3QgZ2l2ZW4KICAgICAgICAjIG9yIGlmIHVzZXIgZG9lcyBub3QgaGF2ZSB0aGUgcmlnaHRzIHRvIGFwcHJvdmUKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtBcHByb3ZlZH0gfHwgISRHcm91cHN7JEFwcHJvdmFsR3JvdXB9ICkgewogICAgICAgICAgICAkUGFyYW17QXBwcm92ZWR9ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBhcHByb3ZhbCBmZWF0dXJlIGlzIG5vdCBhY3RpdmF0ZWQsIGEgbmV3IEZBUSBpdGVtIGlzIGFsd2F5cyBhcHByb3ZlZAogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0FwcHJvdmVkfSA9IDE7CiAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAojICAgICAgICAgU1FMID0+ICcKIyAgICAgICAgICAgICBJTlNFUlQgSU5UTyBmYXFfaXRlbQojICAgICAgICAgICAgICAgICAoZl9udW1iZXIsIGZfbmFtZSwgZl9sYW5ndWFnZV9pZCwgZl9zdWJqZWN0LAojICAgICAgICAgICAgICAgICBjYXRlZ29yeV9pZCwgc3RhdGVfaWQsIGZfa2V5d29yZHMsIGFwcHJvdmVkLCB2YWxpZF9pZCwgY29udGVudF90eXBlLAojICAgICAgICAgICAgICAgICBmX2ZpZWxkMSwgZl9maWVsZDIsIGZfZmllbGQzLCBmX2ZpZWxkNCwgZl9maWVsZDUsIGZfZmllbGQ2LAojICAgICAgICAgICAgICAgICBjcmVhdGVkLCBjcmVhdGVkX2J5LCBjaGFuZ2VkLCBjaGFuZ2VkX2J5KQojICAgICAgICAgICAgIFZBTFVFUwojICAgICAgICAgICAgICAgICAoPywgPywgPywgPywKIyAgICAgICAgICAgICAgICAgPywgPywgPywgPywgPywgPywKIyAgICAgICAgICAgICAgICAgPywgPywgPywgPywgPywgPywKIyAgICAgICAgICAgICAgICAgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiMgICAgICAgICBCaW5kID0+IFsKIyAgICAgICAgICAgICBcJFBhcmFte051bWJlcn0sICAgICBcJFBhcmFte05hbWV9LCAgICBcJFBhcmFte0xhbmd1YWdlSUR9LCBcJFBhcmFte1RpdGxlfSwKIyAgICAgICAgICAgICBcJFBhcmFte0NhdGVnb3J5SUR9LCBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte0tleXdvcmRzfSwgICBcJFBhcmFte0FwcHJvdmVkfSwKIyAgICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LCAgICBcJFBhcmFte0NvbnRlbnRUeXBlfSwKIyAgICAgICAgICAgICBcJFBhcmFte0ZpZWxkMX0sICAgICBcJFBhcmFte0ZpZWxkMn0sIFwkUGFyYW17RmllbGQzfSwKIyAgICAgICAgICAgICBcJFBhcmFte0ZpZWxkNH0sICAgICBcJFBhcmFte0ZpZWxkNX0sIFwkUGFyYW17RmllbGQ2fSwKIyAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sICAgICBcJFBhcmFte1VzZXJJRH0sCiMgICAgICAgICBdLAojICAgICApOwogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgSU5TRVJUIElOVE8gZmFxX2l0ZW0KICAgICAgICAgICAgICAgIChmX251bWJlciwgZl9uYW1lLCBmX2xhbmd1YWdlX2lkLCBmX3N1YmplY3QsCiAgICAgICAgICAgICAgICBjYXRlZ29yeV9pZCwgc3RhdGVfaWQsIGZfa2V5d29yZHMsIGFwcHJvdmVkLCB2YWxpZF9pZCwgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgZl9maWVsZDEsIGZfZmllbGQyLCBmX2ZpZWxkMywgZl9maWVsZDQsIGZfZmllbGQ1LCBmX2ZpZWxkNiwgaWNvbiwKICAgICAgICAgICAgICAgIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpCiAgICAgICAgICAgIFZBTFVFUwogICAgICAgICAgICAgICAgKD8sID8sID8sID8sCiAgICAgICAgICAgICAgICA/LCA/LCA/LCA/LCA/LCA/LAogICAgICAgICAgICAgICAgPywgPywgPywgPywgPywgPywgPywKICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte051bWJlcn0sICAgICBcJFBhcmFte05hbWV9LCAgICBcJFBhcmFte0xhbmd1YWdlSUR9LCBcJFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgXCRQYXJhbXtDYXRlZ29yeUlEfSwgXCRQYXJhbXtTdGF0ZUlEfSwgXCRQYXJhbXtLZXl3b3Jkc30sICAgXCRQYXJhbXtBcHByb3ZlZH0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sICAgIFwkUGFyYW17Q29udGVudFR5cGV9LAogICAgICAgICAgICBcJFBhcmFte0ZpZWxkMX0sICAgICBcJFBhcmFte0ZpZWxkMn0sIFwkUGFyYW17RmllbGQzfSwKICAgICAgICAgICAgXCRQYXJhbXtGaWVsZDR9LCAgICAgXCRQYXJhbXtGaWVsZDV9LCBcJFBhcmFte0ZpZWxkNn0sIFwkUGFyYW17SWNvbn0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBidWlsZCBTUUwgdG8gZ2V0IHRoZSBpZCBvZiB0aGUgbmV3bHkgaW5zZXJ0ZWQgRkFRIGFydGljbGUKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkIEZST00gZmFxX2l0ZW0KICAgICAgICBXSEVSRSBmX251bWJlciA9ID8KICAgICAgICAgICAgQU5EIGZfbmFtZSA9ID8KICAgICAgICAgICAgQU5EIGZfbGFuZ3VhZ2VfaWQgPSA/CiAgICAgICAgICAgIEFORCBjYXRlZ29yeV9pZCA9ID8KICAgICAgICAgICAgQU5EIHN0YXRlX2lkID0gPwogICAgICAgICAgICBBTkQgYXBwcm92ZWQgPSA/CiAgICAgICAgICAgIEFORCB2YWxpZF9pZCA9ID8KICAgICAgICAgICAgQU5EIGNyZWF0ZWRfYnkgPSA/CiAgICAgICAgICAgIEFORCBjaGFuZ2VkX2J5ID0gPyc7CgogICAgIyBoYW5kbGUgdGhlIHRpdGxlCiAgICBpZiAoICRQYXJhbXtUaXRsZX0gKSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCBmX3N1YmplY3QgPSA/ICc7CiAgICB9CgogICAgIyBhZGRpdGlvbmFsIFNRTCBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgdGl0bGUgaXMgYW4gZW1wdHkgc3RyaW5nCiAgICAjIGFuZCB0aGUgZGF0YWJhc2UgaXMgb3JhY2xlLCB3aGljaCB0cmVhdHMgZW1wdHkgc3RyaW5ncyBhcyBOVUxMCiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgQU5EICgoZl9zdWJqZWN0ID0gPykgT1IgKGZfc3ViamVjdCBJUyBOVUxMKSkgJzsKICAgIH0KCiAgICAjIGhhbmRsZSB0aGUga2V5d29yZHMKICAgIGlmICggJFBhcmFte0tleXdvcmRzfSApIHsKICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgQU5EIGZfa2V5d29yZHMgPSA/ICc7CiAgICB9CgogICAgIyBhZGRpdGlvbmFsIFNRTCBmb3IgdGhlIGNhc2UgdGhhdCBrZXl3b3JkcyBpcyBhbiBlbXB0eSBzdHJpbmcKICAgICMgYW5kIHRoZSBkYXRhYmFzZSBpcyBvcmFjbGUsIHdoaWNoIHRyZWF0cyBlbXB0eSBzdHJpbmdzIGFzIE5VTEwKICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICBBTkQgKChmX2tleXdvcmRzID0gPykgT1IgKGZfa2V5d29yZHMgSVMgTlVMTCkpICc7CiAgICB9CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBpZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte051bWJlcn0sCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17TGFuZ3VhZ2VJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIFwkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17QXBwcm92ZWR9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5d29yZHN9LAogICAgICAgIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJElEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHVwZGF0ZSBudW1iZXIKICAgIG15ICROdW1iZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbUlEJykgLiAnMDAnIC4gJElEOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdVUERBVEUgZmFxX2l0ZW0gU0VUIGZfbnVtYmVyID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJE51bWJlciwgXCRJRCBdLAogICAgKTsKCiAgICAjIGFkZCBoaXN0b3J5CiAgICAkU2VsZi0+RkFRSGlzdG9yeUFkZCgKICAgICAgICBOYW1lICAgPT4gJ0NyZWF0ZWQnLAogICAgICAgIEl0ZW1JRCA9PiAkSUQsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKIyBGQVEgU2VydmljZQoKICAgICMgYWRkIHNlcnZpY2VzCgogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIEB7ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgIG15ICRBZGRTdWNjZXNzID0gJFNlbGYtPkZBUVNlcnZpY2VBZGQoCiAgICAgICAgICAgICAgICBJdGVtSUQgICAgPT4gJElELAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJFBhcmFte1NlcnZpY2VMaXN0fS0+eyRTZXJ2aWNlSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KIyBFTyBGQVEgU2VydmljZQoKICAgICMgY2hlY2sgaWYgYXBwcm92YWwgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFJlcXVpcmVkJykgJiYgISRQYXJhbXtBcHByb3ZlZH0gKSB7CgogICAgICAgIG15ICRBcHByb3ZhbFJlcXVpcmVkICAgICAgICA9IDE7CiAgICAgICAgbXkgJEFwcHJvdmFsSW5jbHVkZUludGVybmFsID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsOjpJbmNsdWRlSW50ZXJuYWwnKTsKCiAgICAgICAgaWYgKCAhJEFwcHJvdmFsSW5jbHVkZUludGVybmFsICkgewogICAgICAgICAgICBteSAlSW50ZXJuYWxTdGF0ZSA9ICRTZWxmLT5TdGF0ZUxpc3QoCiAgICAgICAgICAgICAgICBUeXBlcyAgPT4gWydpbnRlcm5hbCddLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRJbnRlcm5hbFN0YXRleyAkUGFyYW17U3RhdGVJRH0gfSApIHsKICAgICAgICAgICAgICAgICRBcHByb3ZhbFJlcXVpcmVkID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IGFwcHJvdmFsIHRpY2tldAogICAgICAgIGlmICggJEFwcHJvdmFsUmVxdWlyZWQgKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9GQVFBcHByb3ZhbFRpY2tldENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJElELAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICAgICBMYW5ndWFnZUlEID0+ICRQYXJhbXtMYW5ndWFnZUlEfSwKICAgICAgICAgICAgICAgIEZBUU51bWJlciAgPT4gJE51bWJlciwKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gJFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgPT4gJFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGNyZWF0ZSBhcHByb3ZhbCB0aWNrZXQhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBDbGVhbnVwIHRoZSBjYWNoZSBmb3IgJ0ZBUUtleXdvcmRBcnRpY2xlTGlzdCcgYW5kIHRoZSBydW50aW1lIGNhY2hlLgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnRkFRS2V5d29yZEFydGljbGVMaXN0JywKICAgICk7CgogICAgIyBDbGVhbnVwIHRoZSBydW50aW1lIGNhY2hlIGZyb20gdGhlIEZBUS9DYXRlZ29yeS5wbS4KICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfTsKCiAgICByZXR1cm4gJElEOwp9Cgo9aGVhZDIgRkFRVXBkYXRlKCkKCnVwZGF0ZSBhbiBhcnRpY2xlCgogICBteSAkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUVVwZGF0ZSgKICAgICAgICBJdGVtSUQgICAgICA9PiAxMjMsCiAgICAgICAgQ2F0ZWdvcnlJRCAgPT4gMSwKICAgICAgICBTdGF0ZUlEICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlSUQgID0+IDEsCiAgICAgICAgQXBwcm92ZWQgICAgPT4gMSwKICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYW4nLCAgICAgIyBvciAndGV4dC9odG1sJwogICAgICAgIFRpdGxlICAgICAgID0+ICdTb21lIFRleHQnLAogICAgICAgIEZpZWxkMSAgICAgID0+ICdQcm9ibGVtLi4uJywKICAgICAgICBGaWVsZDIgICAgICA9PiAnU29sdXRpb24uLi4nLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgQXBwcm92YWxPZmYgPT4gMSwgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCAoaWYgc2V0IHRvIDEgYXBwcm92YWwgaXMgaWdub3JlZC4gVGhpcyBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGltcG9ydGFudCB3aGVuIGNhbGxlZCBmcm9tIEZBUUlubGluZUF0dGFjaG1lbnRVUkxVcGRhdGUpCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICBJY29uICAgICAgICA9PiAnc3ZnIHRleHQnLCAgICAgICMgKG9wdGlvbmFsKQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICk7CgpSZXR1cm5zOgoKICAgICRTdWNjZXNzID0gMSA7ICAgICAgICAgICMgb3IgdW5kZWYgaWYgY2FuJ3QgdXBkYXRlIHRoZSBGQVEgYXJ0aWNsZQoKPWN1dAoKc3ViIEZBUVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBDYXRlZ29yeUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCBUaXRsZSBVc2VySUQgQ29udGVudFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRkFRRGF0YSA9ICRTZWxmLT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICBJdGVtRmllbGRzID0+IDAsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBpZiBubyBuYW1lIHdhcyBnaXZlbiB1c2Ugb2xkIG5hbWUgZnJvbSBGQVEKICAgIGlmICggISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkUGFyYW17TmFtZX0gPSAkRkFRRGF0YXtOYW1lfTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciBWYWxpZElECiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZElEfSApIHsKICAgICAgICAkUGFyYW17VmFsaWRJRH0gPSAkRkFRRGF0YXtWYWxpZElEfTsKICAgIH0KIyBGQVEgU2VydmljZXMKCiAgICBteSAkU2VydmljZXNJbkRCID0gJFNlbGYtPkZBUVNlcnZpY2VHZXQoCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgKTsKCiAgICBteSAlU2VydmljZXNJbkRCOwogICAgbWFwIHsgJFNlcnZpY2VzSW5EQnsgJF8tPntTZXJ2aWNlSUR9IH0rKyB9IEB7JFNlcnZpY2VzSW5EQn07CgogICAgbXkgJFNlcnZpY2VzQ2hhbmdlZCA9IDA7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgIFNFUlZJQ0VJRDogZm9yIG15ICRTZXJ2aWNlSUQgKCBAeyAkUGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICBpZiAoIGV4aXN0cyAkU2VydmljZXNJbkRCeyRTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlc0luREJ7JFNlcnZpY2VJRH07CiAgICAgICAgICAgICAgICBuZXh0IFNFUlZJQ0VJRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRBZGRTdWNjZXNzID0gJFNlbGYtPkZBUVNlcnZpY2VBZGQoCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUGFyYW17U2VydmljZUxpc3R9LT57JFNlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlcnZpY2VzQ2hhbmdlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlc0luREIgKSB7CiAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+RkFRU2VydmljZURlbGV0ZSgKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICApOwogICAgICAgICRTZXJ2aWNlc0NoYW5nZWQrKzsKICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgaWYgKCRTZXJ2aWNlc0NoYW5nZWQpIHsKICAgICAgICAkU2VsZi0+X0RlbGV0ZUZyb21GQVFDYWNoZSglUGFyYW0pOwogICAgfQojIGVvIEZBUSBTZXJ2aWNlcwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKIyAgICAgICAgIFNRTCA9PiAnCiMgICAgICAgICAgICAgVVBEQVRFIGZhcV9pdGVtIFNFVAojICAgICAgICAgICAgICAgICBmX25hbWUgPSA/LCBmX2xhbmd1YWdlX2lkID0gPywgZl9zdWJqZWN0ID0gPywgY2F0ZWdvcnlfaWQgPSA/LAojICAgICAgICAgICAgICAgICBzdGF0ZV9pZCA9ID8sIGZfa2V5d29yZHMgPSA/LCB2YWxpZF9pZCA9ID8sIGNvbnRlbnRfdHlwZSA9ID8sCiMgICAgICAgICAgICAgICAgIGZfZmllbGQxID0gPywgZl9maWVsZDIgPSA/LAojICAgICAgICAgICAgICAgICBmX2ZpZWxkMyA9ID8sIGZfZmllbGQ0ID0gPywKIyAgICAgICAgICAgICAgICAgZl9maWVsZDUgPSA/LCBmX2ZpZWxkNiA9ID8sCiMgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBjdXJyZW50X3RpbWVzdGFtcCwKIyAgICAgICAgICAgICAgICAgY2hhbmdlZF9ieSA9ID8KIyAgICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAojICAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgICAgXCRQYXJhbXtMYW5ndWFnZUlEfSwgXCRQYXJhbXtUaXRsZX0sICAgXCRQYXJhbXtDYXRlZ29yeUlEfSwKIyAgICAgICAgICAgICBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte0tleXdvcmRzfSwgICBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbnRlbnRUeXBlfSwKIyAgICAgICAgICAgICBcJFBhcmFte0ZpZWxkMX0sICBcJFBhcmFte0ZpZWxkMn0sCiMgICAgICAgICAgICAgXCRQYXJhbXtGaWVsZDN9LCAgXCRQYXJhbXtGaWVsZDR9LAojICAgICAgICAgICAgIFwkUGFyYW17RmllbGQ1fSwgIFwkUGFyYW17RmllbGQ2fSwKIyAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiMgICAgICAgICAgICAgXCRQYXJhbXtJdGVtSUR9LAojICAgICAgICAgXSwKIyAgICAgKTsKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBmYXFfaXRlbSBTRVQKICAgICAgICAgICAgICAgIGZfbmFtZSA9ID8sIGZfbGFuZ3VhZ2VfaWQgPSA/LCBmX3N1YmplY3QgPSA/LCBjYXRlZ29yeV9pZCA9ID8sCiAgICAgICAgICAgICAgICBzdGF0ZV9pZCA9ID8sIGZfa2V5d29yZHMgPSA/LCB2YWxpZF9pZCA9ID8sIGNvbnRlbnRfdHlwZSA9ID8sCiAgICAgICAgICAgICAgICBmX2ZpZWxkMSA9ID8sIGZfZmllbGQyID0gPywKICAgICAgICAgICAgICAgIGZfZmllbGQzID0gPywgZl9maWVsZDQgPSA/LAogICAgICAgICAgICAgICAgZl9maWVsZDUgPSA/LCBmX2ZpZWxkNiA9ID8sIGljb24gPSA/LAogICAgICAgICAgICAgICAgY2hhbmdlZCA9IGN1cnJlbnRfdGltZXN0YW1wLAogICAgICAgICAgICAgICAgY2hhbmdlZF9ieSA9ID8KICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgICAgXCRQYXJhbXtMYW5ndWFnZUlEfSwgXCRQYXJhbXtUaXRsZX0sICAgXCRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtTdGF0ZUlEfSwgXCRQYXJhbXtLZXl3b3Jkc30sICAgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgIFwkUGFyYW17RmllbGQxfSwgIFwkUGFyYW17RmllbGQyfSwKICAgICAgICAgICAgXCRQYXJhbXtGaWVsZDN9LCAgXCRQYXJhbXtGaWVsZDR9LAogICAgICAgICAgICBcJFBhcmFte0ZpZWxkNX0sICBcJFBhcmFte0ZpZWxkNn0sIFwkUGFyYW17SWNvbn0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtJdGVtSUR9LAogICAgICAgIF0sCiAgICApOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJFNlbGYtPl9EZWxldGVGcm9tRkFRQ2FjaGUoJVBhcmFtKTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHVwZGF0ZSBhcHByb3ZhbAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICYmICEkUGFyYW17QXBwcm92YWxPZmZ9ICkgewoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgICAgICBteSAlR3JvdXBzID0gcmV2ZXJzZSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBhcHByb3ZhbCBncm91cAogICAgICAgIG15ICRBcHByb3ZhbEdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsR3JvdXAnKTsKCiAgICAgICAgIyBzZXQgYXBwcm92YWwgdG8gMCBpZiB1c2VyIGRvZXMgbm90IGhhdmUgdGhlIHJpZ2h0cyB0byBhcHByb3ZlCiAgICAgICAgaWYgKCAhJEdyb3Vwc3skQXBwcm92YWxHcm91cH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtBcHByb3ZlZH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIGFwcHJvdmFsCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkU2VsZi0+X0ZBUUFwcHJvdmFsVXBkYXRlKAogICAgICAgICAgICBJdGVtSUQgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgQXBwcm92ZWQgPT4gJFBhcmFte0FwcHJvdmVkfSB8fCAwLAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRVcGRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHVwZGF0ZSBhcHByb3ZhbCBmb3IgSXRlbUlEICRQYXJhbXtJdGVtSUR9ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjYWNoZQogICAgICAgICRTZWxmLT5fRGVsZXRlRnJvbUZBUUNhY2hlKCVQYXJhbSk7CiAgICB9CgogICAgIyBjaGVjayBpZiBoaXN0b3J5IGVudHJ5IHNob3VsZCBiZSBhZGRlZAogICAgcmV0dXJuIDEgaWYgJFBhcmFte0hpc3RvcnlPZmZ9OwoKICAgICMgd3JpdGUgaGlzdG9yeSBlbnRyeQogICAgJFNlbGYtPkZBUUhpc3RvcnlBZGQoCiAgICAgICAgTmFtZSAgID0+ICdVcGRhdGVkJywKICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEF0dGFjaG1lbnRBZGQoKQoKYWRkIGFydGljbGUgYXR0YWNobWVudHMsIHJldHVybnMgdGhlIGF0dGFjaG1lbnQgaWQKCiAgICBteSAkQXR0YWNobWVudElEID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEFkZCgKICAgICAgICBJdGVtSUQgICAgICA9PiAxMjMsCiAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQveG1sJywKICAgICAgICBGaWxlbmFtZSAgICA9PiAnc29tZW5hbWUueG1sJywKICAgICAgICBJbmxpbmUgICAgICA9PiAxLCAgICgwfDEsIGRlZmF1bHQgMCkKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJEF0dGFjaG1lbnRJRCA9IDEyMyA7ICAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBjYW4ndCBhZGQgdGhlIGF0dGFjaG1lbnQKCj1jdXQKCnN1YiBBdHRhY2htZW50QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIENvbnRlbnQgQ29udGVudFR5cGUgRmlsZW5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdAogICAgaWYgKCAhJFBhcmFte0lubGluZX0gKSB7CiAgICAgICAgJFBhcmFte0lubGluZX0gPSAwOwogICAgfQoKICAgICMgZ2V0IGF0dGFjaG1lbnQgc2l6ZQogICAgewogICAgICAgIHVzZSBieXRlczsKICAgICAgICAkUGFyYW17RmlsZXNpemV9ID0gbGVuZ3RoICRQYXJhbXtDb250ZW50fTsKICAgICAgICBubyBieXRlczsKICAgIH0KCiAgICAjIGdldCBhbGwgZXhpc3RpbmcgYXR0YWNobWVudHMKICAgIG15IEBJbmRleCA9ICRTZWxmLT5BdHRhY2htZW50SW5kZXgoCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGZpbGVuYW1lCiAgICBteSAkTmV3RmlsZU5hbWUgPSAkUGFyYW17RmlsZW5hbWV9OwoKICAgICMgYnVpbGQgYSBsb29rdXAgaGFzaCBvZiBhbGwgZXhpc3RpbmcgZmlsZSBuYW1lcwogICAgbXkgJVVzZWRGaWxlOwogICAgZm9yIG15ICRGaWxlIChASW5kZXgpIHsKICAgICAgICAkVXNlZEZpbGV7ICRGaWxlLT57RmlsZW5hbWV9IH0gPSAxOwogICAgfQoKICAgICMgdHJ5IHRvIG1vZGlmeSB0aGUgdGhlIGZpbGUgbmFtZSBieSBhZGRpbmcgYSBudW1iZXIgaWYgaXQgZXhpc3RzIGFscmVhZHkKICAgIG15ICRDb3VudCA9IDA7CiAgICB3aGlsZSAoICRDb3VudCA8IDUwICkgewoKICAgICAgICAjIGluY3JlYXNlIGNvdW50ZXIKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgIyBpZiB0aGUgZmlsZSBuYW1lIGV4aXN0cwogICAgICAgIGlmICggZXhpc3RzICRVc2VkRmlsZXskTmV3RmlsZU5hbWV9ICkgewoKICAgICAgICAgICAgIyBmaWxlbmFtZSBoYXMgYSBmaWxlIG5hbWUgZXh0ZW5zaW9uIChlLmcuIHRlc3QuanBnKQogICAgICAgICAgICBpZiAoICRQYXJhbXtGaWxlbmFtZX0gPX4gbXsgXEEgKC4qKSBcLiAoLis/KSBceiB9eG1zICkgewogICAgICAgICAgICAgICAgJE5ld0ZpbGVOYW1lID0gIiQxLSRDb3VudC4kMiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTmV3RmlsZU5hbWUgPSAiJFBhcmFte0ZpbGVuYW1lfS0kQ291bnQiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc3RvcmUgdGhlIG5ldyBmaWxlbmFtZQogICAgJFBhcmFte0ZpbGVuYW1lfSA9ICROZXdGaWxlTmFtZTsKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZW5jb2RlIGF0dGFjaG1lbnQgaWYgaXQncyBhIHBvc3RncmVzcWwgYmFja2VuZCEhIQogICAgaWYgKCAhJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJFBhcmFte0NvbnRlbnR9ICk7CgogICAgICAgICRQYXJhbXtDb250ZW50fSA9IE1JTUU6OkJhc2U2NDo6ZW5jb2RlX2Jhc2U2NCggJFBhcmFte0NvbnRlbnR9ICk7CiAgICB9CgogICAgIyB3cml0ZSBhdHRhY2htZW50IHRvIGRiCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBmYXFfYXR0YWNobWVudCAnIC4KICAgICAgICAgICAgJyAoZmFxX2lkLCBmaWxlbmFtZSwgY29udGVudF90eXBlLCBjb250ZW50X3NpemUsIGNvbnRlbnQsIGlubGluZWF0dGFjaG1lbnQsICcgLgogICAgICAgICAgICAnIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpIFZBTFVFUyAnIC4KICAgICAgICAgICAgJyAoPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SXRlbUlEfSwgIFwkUGFyYW17RmlsZW5hbWV9LCBcJFBhcmFte0NvbnRlbnRUeXBlfSwgXCRQYXJhbXtGaWxlc2l6ZX0sCiAgICAgICAgICAgIFwkUGFyYW17Q29udGVudH0sIFwkUGFyYW17SW5saW5lfSwgICBcJFBhcmFte1VzZXJJRH0sICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBhdHRhY2htZW50IGlkCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCAnCiAgICAgICAgICAgIC4gJ0ZST00gZmFxX2F0dGFjaG1lbnQgJwogICAgICAgICAgICAuICdXSEVSRSBmYXFfaWQgPSA/IEFORCBmaWxlbmFtZSA9ID8gJwogICAgICAgICAgICAuICdBTkQgY29udGVudF90eXBlID0gPyBBTkQgY29udGVudF9zaXplID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBpbmxpbmVhdHRhY2htZW50ID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBjcmVhdGVkX2J5ID0gPyBBTkQgY2hhbmdlZF9ieSA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sIFwkUGFyYW17RmlsZW5hbWV9LCBcJFBhcmFte0NvbnRlbnRUeXBlfSwgXCRQYXJhbXtGaWxlc2l6ZX0sCiAgICAgICAgICAgIFwkUGFyYW17SW5saW5lfSwgXCRQYXJhbXtVc2VySUR9LCAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRBdHRhY2htZW50SUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQXR0YWNobWVudElEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJEF0dGFjaG1lbnRJRDsKfQoKPWhlYWQyIEF0dGFjaG1lbnRHZXQoKQoKZ2V0IGF0dGFjaG1lbnQgb2YgYXJ0aWNsZQoKICAgIG15ICVGaWxlID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEdldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgICAgIEZpbGVJRCA9PiAxLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJUZpbGUgPSAoCiAgICAgICAgRmlsZXNpemUgICAgPT4gJzU0MDI4NicsICAgICAgICAgICAgICAgICMgZmlsZSBzaXplIGluIGJ5dGVzCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgIEZpbGVuYW1lICAgID0+ICdFcnJvci5qcGcnLAogICAgICAgIENvbnRlbnQgICAgID0+ICcuLi4nICAgICAgICAgICAgICAgICAgICAjIGZpbGUgYmluYXJ5IGNvbnRlbnQKICAgICk7Cgo9Y3V0CgpzdWIgQXR0YWNobWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBGaWxlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBmaWxlbmFtZSwgY29udGVudF90eXBlLCBjb250ZW50X3NpemUsIGNvbnRlbnQgJwogICAgICAgICAgICAuICdGUk9NIGZhcV9hdHRhY2htZW50ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/IEFORCBmYXFfaWQgPSA/ICcKICAgICAgICAgICAgLiAnT1JERVIgQlkgY3JlYXRlZCcsCiAgICAgICAgQmluZCAgID0+IFsgXCRQYXJhbXtGaWxlSUR9LCBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBFbmNvZGUgPT4gWyAxLCAxLCAxLCAwIF0sCiAgICAgICAgTGltaXQgID0+IDEsCiAgICApOwoKICAgIG15ICVGaWxlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgZGVjb2RlIGF0dGFjaG1lbnQgaWYgaXQncyBhIHBvc3RncmVzcWwgYmFja2VuZCBhbmQgbm90IEJMT0IKICAgICAgICBpZiAoICEkREJPYmplY3QtPkdldERhdGFiYXNlRnVuY3Rpb24oJ0RpcmVjdEJsb2InKSApIHsKICAgICAgICAgICAgJFJvd1szXSA9IE1JTUU6OkJhc2U2NDo6ZGVjb2RlX2Jhc2U2NCggJFJvd1szXSApOwogICAgICAgIH0KCiAgICAgICAgJEZpbGV7RmlsZW5hbWV9ICAgID0gJFJvd1swXTsKICAgICAgICAkRmlsZXtDb250ZW50VHlwZX0gPSAkUm93WzFdOwogICAgICAgICRGaWxle0ZpbGVzaXplfSAgICA9ICRSb3dbMl07CiAgICAgICAgJEZpbGV7Q29udGVudH0gICAgID0gJFJvd1szXTsKICAgIH0KCiAgICByZXR1cm4gJUZpbGU7Cn0KCj1oZWFkMiBBdHRhY2htZW50RGVsZXRlKCkKCmRlbGV0ZSBhdHRhY2htZW50IG9mIGFydGljbGUKCiAgICBteSAkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICAgICBGaWxlSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRTdWNjZXNzID0gMSA7ICAgICAgICAgICAgICAjIG9yIHVuZGVmIGlmIGF0dGFjaG1lbnQgY291bGQgbm90IGJlIGRlbGV0ZWQKCj1jdXQKCnN1YiBBdHRhY2htZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIEZpbGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGZhcV9hdHRhY2htZW50IFdIRVJFIGlkID0gPyBBTkQgZmFxX2lkID0gPyAnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0ZpbGVJRH0sIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEF0dGFjaG1lbnRJbmRleCgpCgpyZXR1cm4gYW4gYXR0YWNobWVudCBpbmRleCBvZiBhbiBhcnRpY2xlCgogICAgbXkgQEluZGV4ID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEluZGV4KAogICAgICAgIEl0ZW1JRCAgICAgPT4gMTIzLAogICAgICAgIFNob3dJbmxpbmUgPT4gMCwgICAoIDB8MSwgZGVmYXVsdCAxKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgIEBJbmRleCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEZpbGVzaXplICAgID0+ICc1MjcuNiBLQnl0ZXMnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdFcnJvci5qcGcnLAogICAgICAgICAgICBGaWxlc2l6ZVJhdyA9PiA1NDAyODYsCiAgICAgICAgICAgIEZpbGVJRCAgICAgID0+IDYsCiAgICAgICAgICAgIElubGluZSAgICAgID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7LAogICAgICAgICAgICBGaWxlc2l6ZSA9PiAnNDMwLjAgS0J5dGVzJywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICBGaWxlbmFtZSA9PiAnU29sdXRpb24uanBnJywKICAgICAgICAgICAgRmlsZXNpemVSYXcgPT4gNDQwMjg2LAogICAgICAgICAgICBGaWxlSUQgPT4gNSwKICAgICAgICAgICAgSW5saW5lID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpbGVzaXplID0+ICcyOTYgQnl0ZXMnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICdBZGRpdGlvbmFsQ29tbWVudHMudHh0JywKICAgICAgICAgICAgRmlsZXNpemVSYXcgPT4gMjk2LAogICAgICAgICAgICBGaWxlSUQgPT4gNywKICAgICAgICAgICAgSW5saW5lID0+IDAsCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgQXR0YWNobWVudEluZGV4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGZpbGVuYW1lLCBjb250ZW50X3R5cGUsIGNvbnRlbnRfc2l6ZSwgaW5saW5lYXR0YWNobWVudCAnCiAgICAgICAgICAgIC4gJ0ZST00gZmFxX2F0dGFjaG1lbnQgJwogICAgICAgICAgICAuICdXSEVSRSBmYXFfaWQgPSA/ICcKICAgICAgICAgICAgLiAnT1JERVIgQlkgZmlsZW5hbWUnLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMTAwLAogICAgKTsKCiAgICBteSBASW5kZXg7CiAgICBBVFRBQ0hNRU5UOgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICRJRCAgICAgICAgICA9ICRSb3dbMF07CiAgICAgICAgbXkgJEZpbGVuYW1lICAgID0gJFJvd1sxXTsKICAgICAgICBteSAkQ29udGVudFR5cGUgPSAkUm93WzJdOwogICAgICAgIG15ICRGaWxlc2l6ZSAgICA9ICRSb3dbM107CiAgICAgICAgbXkgJElubGluZSAgICAgID0gJFJvd1s0XTsKCiAgICAgICAgIyBkbyBub3Qgc2hvdyBpbmxpbmUgYXR0YWNobWVudHMKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1Nob3dJbmxpbmV9ICYmICEkUGFyYW17U2hvd0lubGluZX0gJiYgJElubGluZSApIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgIyBjb252ZXJ0IHRvIGh1bWFuIHJlYWRhYmxlIGZpbGUgc2l6ZQogICAgICAgIG15ICRGaWxlU2l6ZVJhdyA9ICRGaWxlc2l6ZTsKICAgICAgICBpZiAoJEZpbGVzaXplKSB7CiAgICAgICAgICAgIGlmICggJEZpbGVzaXplID4gKCAxMDI0ICogMTAyNCApICkgewogICAgICAgICAgICAgICAgJEZpbGVzaXplID0gc3ByaW50ZiAiJS4xZiBNQnl0ZXMiLCAoICRGaWxlc2l6ZSAvICggMTAyNCAqIDEwMjQgKSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEZpbGVzaXplID4gMTAyNCApIHsKICAgICAgICAgICAgICAgICRGaWxlc2l6ZSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCAoICRGaWxlc2l6ZSAvIDEwMjQgKSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEZpbGVzaXplID0gJEZpbGVzaXplIC4gJyBCeXRlcyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQEluZGV4LCB7CiAgICAgICAgICAgIEZpbGVJRCAgICAgID0+ICRJRCwKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgIEZpbGVzaXplICAgID0+ICRGaWxlc2l6ZSwKICAgICAgICAgICAgRmlsZXNpemVSYXcgPT4gJEZpbGVTaXplUmF3LAogICAgICAgICAgICBJbmxpbmUgICAgICA9PiAkSW5saW5lLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBJbmRleDsKfQoKPWhlYWQyIEZBUUNvdW50KCkKCkNvdW50IHRoZSBudW1iZXIgb2YgYXJ0aWNsZXMgZm9yIGEgZGVmaW5lZCBjYXRlZ29yeS4gT25seSB2YWxpZCBGQVEgYXJ0aWNsZXMgd2lsbCBiZSBjb3VudGVkLgoKICAgIG15ICRBcnRpY2xlQ291bnQgPSAkRkFRT2JqZWN0LT5GQVFDb3VudCgKICAgICAgICBDYXRlZ29yeUlEcyA9PiBbMSwyLDMsNF0sCiAgICAgICAgSXRlbVN0YXRlcyA9PiAgewogICAgICAgICAgICAxID0+ICdpbnRlcm5hbCcsCiAgICAgICAgICAgIDIgPT4gJ2V4dGVybmFsJywKICAgICAgICAgICAgMyA9PiAncHVibGljJywKICAgICAgICB9LAogICAgICAgIE9ubHlBcHByb3ZlZCA9PiAxLCAgICMgb3B0aW9uYWwgKGRlZmF1bHQgMCkKICAgICAgICBWYWxpZCAgICAgICAgPT4gMSwgICAjIG9wdGlvbmFsIChkZWZhdWx0IDApCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkQXJ0aWNsZUNvdW50ID0gMzsKCj1jdXQKCnN1YiBGQVFDb3VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENhdGVnb3J5SURzIEl0ZW1TdGF0ZXMgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlCiAgICBteSAkVmFsaWQgICAgPSAkUGFyYW17VmFsaWR9ID8gMSA6IDA7CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSAkQ2F0ZWdvcnlJRFN0cmluZyA9ICcnOwogICAgaWYgKCAkUGFyYW17Q2F0ZWdvcnlJRHN9ICYmIHJlZiAkUGFyYW17Q2F0ZWdvcnlJRHN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte0NhdGVnb3J5SURzfSB9ICkgewoKICAgICAgICAjIGludGVnZXIgcXVvdGUgdGhlIGNhdGVnb3J5IGlkcwogICAgICAgIGZvciBteSAkQ2F0ZWdvcnlJRCAoIEB7ICRQYXJhbXtDYXRlZ29yeUlEc30gfSApIHsKICAgICAgICAgICAgJENhdGVnb3J5SUQgPSAkREJPYmplY3QtPlF1b3RlKCAkQ2F0ZWdvcnlJRCwgJ0ludGVnZXInICk7CiAgICAgICAgfQoKICAgICAgICBteSBAU29ydGVkSURzID0gc29ydCBAeyAkUGFyYW17Q2F0ZWdvcnlJRHN9IH07CgogICAgICAgICMgc3BsaXQgSU4gc3RhdGVtZW50IHdpdGggbW9yZSB0aGFuIDkwMCBlbGVtZW50cyBpbiBtb3JlIHN0YXRlbWVudHMgY29tYmluZWQgd2l0aCBPUgogICAgICAgICMgYmVjYXVzZSBPcmFjbGUgZG9lc24ndCBzdXBwb3J0IG1vcmUgdGhhbiAxMDAwIGVsZW1lbnRzIGluIG9uZSBJTiBzdGF0ZW1lbnQuCiAgICAgICAgbXkgQFNRTFN0cmluZ3M7CiAgICAgICAgTE9PUDoKICAgICAgICB3aGlsZSAoIHNjYWxhciBAU29ydGVkSURzICkgewoKICAgICAgICAgICAgbXkgQFNvcnRlZElEc1BhcnQgPSBzcGxpY2UgQFNvcnRlZElEcywgMCwgOTAwOwoKICAgICAgICAgICAgbXkgJElEU3RyaW5nID0gam9pbiAnLCcsIEBTb3J0ZWRJRHNQYXJ0OwoKICAgICAgICAgICAgcHVzaCBAU1FMU3RyaW5ncywgIiBpLmNhdGVnb3J5X2lkIElOICgkSURTdHJpbmcpICI7CiAgICAgICAgfQoKICAgICAgICBteSAkU1FMU3RyaW5nID0gam9pbiAnIE9SICcsIEBTUUxTdHJpbmdzOwoKICAgICAgICAkQ2F0ZWdvcnlJRFN0cmluZyAuPSAnQU5EICggJyAuICRTUUxTdHJpbmcgLiAnICkgJzsKICAgIH0KCiAgICAjIGJ1aWxkIHZhbGlkIGlkIHN0cmluZwogICAgbXkgJFZhbGlkSURzU3RyaW5nOwogICAgaWYgKCRWYWxpZCkgewogICAgICAgICRWYWxpZElEc1N0cmluZyA9IGpvaW4gJywgJywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgICAgICRWYWxpZElEc1N0cmluZyA9IGpvaW4gJywgJywga2V5cyAlVmFsaWRMaXN0OwogICAgfQoKICAgIG15ICRTUUwgPSAnU0VMRUNUIENPVU5UKCopICcKICAgICAgICAuICdGUk9NIGZhcV9pdGVtIGksIGZhcV9zdGF0ZSBzICcKICAgICAgICAuICdXSEVSRSBpLnN0YXRlX2lkID0gcy5pZCAnCiAgICAgICAgLiAiQU5EIGkudmFsaWRfaWQgSU4gKCRWYWxpZElEc1N0cmluZykgIgogICAgICAgIC4gJENhdGVnb3J5SURTdHJpbmc7CgogICAgIyBjb3VudCBvbmx5IGFwcHJvdmVkIGFydGljbGVzCiAgICBpZiAoICRQYXJhbXtPbmx5QXBwcm92ZWR9ICkgewogICAgICAgICRTUUwgLj0gJyBBTkQgaS5hcHByb3ZlZCA9IDEnOwogICAgfQoKICAgIG15ICRFeHQgPSAnJzsKICAgIGlmICggJFBhcmFte0l0ZW1TdGF0ZXN9ICYmIHJlZiAkUGFyYW17SXRlbVN0YXRlc30gZXEgJ0hBU0gnICYmICV7ICRQYXJhbXtJdGVtU3RhdGVzfSB9ICkgewogICAgICAgIG15ICRTdGF0ZXNTdHJpbmcgPSBqb2luICcsICcsIGtleXMgJXsgJFBhcmFte0l0ZW1TdGF0ZXN9IH07CiAgICAgICAgJEV4dCAuPSAiIEFORCBzLnR5cGVfaWQgSU4gKCRTdGF0ZXNTdHJpbmcgKSI7CiAgICB9CiAgICAkRXh0IC49ICcgR1JPVVAgQlkgY2F0ZWdvcnlfaWQnOwogICAgJFNRTCAuPSAkRXh0OwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gMjAwLAogICAgKTsKCiAgICBteSAkQ291bnQgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvdW50ICs9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRDb3VudDsKfQoKPWhlYWQyIEZBUURlbGV0ZSgpCgpEZWxldGUgYW4gYXJ0aWNsZS4KCiAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUURlbGV0ZSgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJERlbGV0ZVN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBhcnRpY2xlIGNvdWxkIG5vdCBiZSBkZWxldGVkCgo9Y3V0CgpzdWIgRkFRRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGF0dGFjaG1lbnRzCiAgICBteSBASW5kZXggPSAkU2VsZi0+QXR0YWNobWVudEluZGV4KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgZm9yIG15ICRGaWxlSUQgKEBJbmRleCkgewogICAgICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPkF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgRmlsZUlEID0+ICRGaWxlSUQtPntGaWxlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICEkRGVsZXRlU3VjY2VzczsKICAgIH0KCiAgICAjIGRlbGV0ZSB2b3RlcwogICAgbXkgJFZvdGVJRHNSZWYgPSAkU2VsZi0+Vm90ZVNlYXJjaCgKICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIGZvciBteSAkVm90ZUlEICggQHskVm90ZUlEc1JlZn0gKSB7CiAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+Vm90ZURlbGV0ZSgKICAgICAgICAgICAgVm90ZUlEID0+ICRWb3RlSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISREZWxldGVTdWNjZXNzOwogICAgfQoKICAgICMgZGVsZXRlIGFsbCBGQVEgbGlua3Mgb2YgdGhpcyBGQVEgYXJ0aWNsZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICBPYmplY3QgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgaGlzdG9yeQogICAgcmV0dXJuIGlmICEkU2VsZi0+RkFRSGlzdG9yeURlbGV0ZSgKICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKIyBGQVEgU2VydmljZQoKICAgICMgZGVsZXRlIGFsbCByZWxhdGVkIHNlcnZpY2VzCiAgICBteSAkU2VydmljZURhdGFBcnJheVJlZiA9ICRTZWxmLT5GQVFTZXJ2aWNlR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICk7CgogICAgZm9yIG15ICRTZXJ2aWNlICggQHskU2VydmljZURhdGFBcnJheVJlZn0gKSB7CiAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+RkFRU2VydmljZURlbGV0ZSgKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2UtPntTZXJ2aWNlSUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJERlbGV0ZVN1Y2Nlc3M7CiAgICB9CiMgZW8gRkFRIFNlcnZpY2UKCiAgICAjIGRlbGV0ZSBhcnRpY2xlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBmYXFfaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT5fRGVsZXRlRnJvbUZBUUNhY2hlKCVQYXJhbSk7CgogICAgcmV0dXJuIDE7Cn0KIyBGQVEgU2VydmljZQoKPWhlYWQyIEZBUVNlcnZpY2VBZGQoKQoKYWRkIHNlcnZpY2VzIHRvIGFuIGFydGljbGUKCiAgICBteSAkQWRkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUVNlcnZpY2VBZGQoCiAgICAgICAgSXRlbUlEID0+IDEsCiAgICAgICAgU2VydmljZUlEID0+IDEsCiAgICAgICAgTmFtZSAgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgKTsKClJldHVybnM6CgogICAgJEFkZFN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgICMgb3IgdW5kZWYgaWYgYXJ0aWNsZSBzZXJ2aWNlIGNvdWxkIG5vdCBiZSBhZGRlZAoKPWN1dAoKc3ViIEZBUVNlcnZpY2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgTmFtZSBTZXJ2aWNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGZhcV9zZXJ2aWNlIChuYW1lLCBzZXJ2aWNlX2lkLCBpdGVtX2lkKScgLgogICAgICAgICAgICAnIFZBTFVFUyAoID8sID8sID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFTZXJ2aWNlR2V0KCkKCmdldCBhbiBhcnJheSB3aXRoIGhhc2ggcmVmZXJlbmNlIHdpdGggdGhlIHNlcnZpY2VzIG9mIGFuIGFydGljbGUKCiAgICBteSAkU2VydmljZURhdGFBcnJheVJlZiA9ICRGQVFPYmplY3QtPkZBUVNlcnZpY2VHZXQoCiAgICAgICAgSXRlbUlEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkU2VydmljZURhdGFBcnJheVJlZiA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDb21wdXRlcjo6SGFyZHdhcmUnLAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMiwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBGQVFTZXJ2aWNlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIG5hbWUsIHNlcnZpY2VfaWQKICAgICAgICAgICAgRlJPTSBmYXFfc2VydmljZQogICAgICAgICAgICBXSEVSRSBpdGVtX2lkID0gPwogICAgICAgICAgICBPUkRFUiBCWSBuYW1lLCBzZXJ2aWNlX2lkJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICApOwoKICAgICMgJEdldFBhcmFte1NlcnZpY2VMaXN0fSAgICAgICAgID0gXCVTZXJ2aWNlTGlzdDsKCiAgICBteSBARGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVSZWNvcmQgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFJvd1sxXSwKICAgICAgICApOwogICAgICAgIHB1c2ggQERhdGEsIFwlUmVjb3JkOwogICAgfQoKICAgIHJldHVybiBcQERhdGE7Cgp9Cgo9aGVhZDIgRkFRU2VydmljZUFydGljbGVzR2V0KCkKCmdldCBhbiBhcnJheSB3aXRoIGFydGljbGVzIHJlbGF0ZWQgdG8gYSBzZXJ2aWNlCgogICAgbXkgJEZBUVNlcnZpY2VBcnRpY2xlcyA9ICRGQVFPYmplY3QtPkZBUVNlcnZpY2VBcnRpY2xlc0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMSwKICAgICAgICBMaW1pdCAgICAgPT4gMTAsICAgICMgZGVmYXVsdCAxMAogICAgKTsKClJldHVybnM6CgogICAgJEZBUVNlcnZpY2VBcnRpY2xlcyA9IFsgMSwgMiwgMyBdOwoKCj1jdXQKCnN1YiBGQVFTZXJ2aWNlQXJ0aWNsZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkTGltaXQgPSAxMDsKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAkTGltaXQgPSAkUGFyYW17TGltaXR9OwogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpdGVtX2lkCiAgICAgICAgICAgIEZST00gZmFxX3NlcnZpY2UKICAgICAgICAgICAgV0hFUkUgc2VydmljZV9pZCA9ID8KICAgICAgICAgICAgT1JERVIgQlkgaXRlbV9pZCcsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1NlcnZpY2VJRH0gXSwKICAgICAgICBMaW1pdCA9PiAkTGltaXQsCiAgICApOwoKICAgIG15IEBEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBARGF0YSwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhOwoKfQoKPWhlYWQyIEZBUVNlcnZpY2VEZWxldGUoKQoKZGVsZXRlIHRoZSBzZXJ2aWNlIG9mIGFuIGFydGljbGUKCiAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUVNlcnZpY2VEZWxldGUoCiAgICAgICAgSXRlbUlEICAgID0+IDEsCiAgICAgICAgU2VydmljZUlEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkRGVsZXRlU3VjY2VzcyA9IDE7ICAgICAgICAgICAgICAgICMgb3IgdW5kZWYgaWYgc2VydmljZSBjb3VsZCBub3QgYmUgZGVsZXRlZAoKPWN1dAoKc3ViIEZBUVNlcnZpY2VEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgU2VydmljZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBmYXFfc2VydmljZSBXSEVSRSBpdGVtX2lkID0gPyBBTkQgc2VydmljZV9pZCA9ID8gJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJdGVtSUR9LCBcJFBhcmFte1NlcnZpY2VJRH0sIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CiMgZW8gRkFRIFNlcnZpY2UKCj1oZWFkMiBGQVFIaXN0b3J5QWRkKCkKCmFkZCBhbiBoaXN0b3J5IHRvIGFuIGFydGljbGUKCiAgICBteSAkQWRkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUUhpc3RvcnlBZGQoCiAgICAgICAgSXRlbUlEID0+IDEsCiAgICAgICAgTmFtZSAgID0+ICdVcGRhdGVkIEFydGljbGUuJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRBZGRTdWNjZXNzID0gMTsgICAgICAgICAgICAgICAjIG9yIHVuZGVmIGlmIGFydGljbGUgaGlzdG9yeSBjb3VsZCBub3QgYmUgYWRkZWQKCj1jdXQKCnN1YiBGQVFIaXN0b3J5QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIE5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBmYXFfaGlzdG9yeSAobmFtZSwgaXRlbV9pZCwgJyAuCiAgICAgICAgICAgICcgY3JlYXRlZCwgY3JlYXRlZF9ieSwgY2hhbmdlZCwgY2hhbmdlZF9ieSknIC4KICAgICAgICAgICAgJyBWQUxVRVMgKCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtJdGVtSUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZBUUhpc3RvcnlHZXQoKQoKZ2V0IGFuIGFycmF5IHdpdGggaGFzaCByZWZlcmVuY2Ugd2l0aCB0aGUgaGlzdG9yeSBvZiBhbiBhcnRpY2xlCgogICAgbXkgJEhpc3RvcnlEYXRhQXJyYXlSZWYgPSAkRkFRT2JqZWN0LT5GQVFIaXN0b3J5R2V0KAogICAgICAgIEl0ZW1JRCA9PiAxLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJEhpc3RvcnlEYXRhQXJyYXlSZWYgPSBbCiAgICAgICAgewogICAgICAgICAgICBDcmVhdGVkQnkgPT4gMSwKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICcyMDEwLTExLTAyIDA3OjQ1OjE1JywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDcmVhdGVkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+IDEsCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAnMjAxMS0wNi0xNCAxMjo1Mzo1NScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVXBkYXRlZCcsCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgRkFRSGlzdG9yeUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgbmFtZSwgY3JlYXRlZCwgY3JlYXRlZF9ieQogICAgICAgICAgICBGUk9NIGZhcV9oaXN0b3J5CiAgICAgICAgICAgIFdIRVJFIGl0ZW1faWQgPSA/CiAgICAgICAgICAgIE9SREVSIEJZIGNyZWF0ZWQsIGlkJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICApOwoKICAgIG15IEBEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJVJlY29yZCA9ICgKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAkUm93WzFdLAogICAgICAgICAgICBDcmVhdGVkQnkgPT4gJFJvd1syXSwKICAgICAgICApOwogICAgICAgIHB1c2ggQERhdGEsIFwlUmVjb3JkOwogICAgfQoKICAgIHJldHVybiBcQERhdGE7Cn0KCj1oZWFkMiBGQVFIaXN0b3J5RGVsZXRlKCkKCmRlbGV0ZSB0aGUgaGlzdG9yeSBvZiBhbiBhcnRpY2xlCgogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFIaXN0b3J5RGVsZXRlKAogICAgICAgIEl0ZW1JRCA9PiAxLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJERlbGV0ZUR1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgICAjIG9yIHVuZGVmIGlmIGhpc3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQKCj1jdXQKCnN1YiBGQVFIaXN0b3J5RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gZmFxX2hpc3RvcnkgV0hFUkUgaXRlbV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFKb3VybmFsR2V0KCkKCmdldCB0aGUgc3lzdGVtIGpvdXJuYWwKCiAgICBteSAkSGlzdG9yeURhdGFBcnJheVJlZiA9ICRGQVFPYmplY3QtPkZBUUpvdXJuYWxHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkSm91cm5hbERhdGFBcnJheVJlZiA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAnMzInLAogICAgICAgICAgICBOdW1iZXIgICAgPT4gJzEwMDA0JywKICAgICAgICAgICAgQ2F0ZWdvcnkgID0+ICdNeSBDYXRlZ29yeScsCiAgICAgICAgICAgIFN1YmplY3QgICA9PiAnTmV3IEFydGljbGUnLAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICBDcmVhdGVkQnkgPT4gJzEnLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJzIwMTEtMDEtMDUgMjE6NTM6NTAnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBJdGVtSUQgICAgPT4gJzQnLAogICAgICAgICAgICBOdW1iZXIgICAgPT4gJzEwMDA0JywKICAgICAgICAgICAgQ2F0ZWdvcnkgID0+ICdNeSBDYXRlZ29yeScsCiAgICAgICAgICAgIFN1YmplY3QgICA9PiAiTmV3IEFydGljbGUiLAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ1VwZGF0ZWQnLAogICAgICAgICAgICBDcmVhdGVkQnkgPT4gJzEnLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJzIwMTEtMDEtMDUgMjE6NTU6MzInLAogICAgICAgIH0KICAgIF07Cgo9Y3V0CgpzdWIgRkFRSm91cm5hbEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICVHcm91cHMgICAgICA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgKTsKCiAgICByZXR1cm4gaWYgISVHcm91cHM7CgogICAgbXkgQEdyb3VwSURzICAgICAgICAgID0ga2V5cyAlR3JvdXBzOwogICAgbXkgJEdyb3VwUGxhY2Vob2xkZXJzID0gam9pbiAnLCAnLCAoJz8nKSB4IEBHcm91cElEczsKICAgIG15IEBHcm91cEJpbmQgICAgICAgICA9IG1hcCB7IFwkXyB9IEBHcm91cElEczsKCiAgICBteSAkQ2F0ZWdvcnlTUUwgPQogICAgICAgICJTRUxFQ1QgZy5jYXRlZ29yeV9pZAogICAgICAgIEZST00gZmFxX2NhdGVnb3J5X2dyb3VwIGcKICAgICAgICBXSEVSRSBnLmdyb3VwX2lkIElOICggJEdyb3VwUGxhY2Vob2xkZXJzICkiOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkQ2F0ZWdvcnlTUUwsCiAgICAgICAgQmluZCA9PiBcQEdyb3VwQmluZCwKICAgICk7CgogICAgbXkgQENhdGVnb3J5SURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ2F0ZWdvcnlJRHMsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIGlmICFAQ2F0ZWdvcnlJRHM7CgogICAgbXkgQEJpbmQgICAgICAgICAgICAgICAgID0gbWFwIHsgXCRfIH0gQENhdGVnb3J5SURzOwogICAgbXkgJENhdGVnb3J5UGxhY2Vob2xkZXJzID0gam9pbiAnLCAnLCAoJz8nKSB4IEBDYXRlZ29yeUlEczsKCiAgICAjIGJ1aWxkIFNRTCBxdWVyeQogICAgbXkgJFNRTCA9CiAgICAgICAgIlNFTEVDVCBpLmlkLCBoLm5hbWUsIGguY3JlYXRlZCwgaC5jcmVhdGVkX2J5LCBjLm5hbWUsIGkuZl9zdWJqZWN0LCBpLmZfbnVtYmVyCiAgICAgICAgRlJPTSBmYXFfaXRlbSBpCiAgICAgICAgICAgIElOTkVSIEpPSU4gZmFxX3N0YXRlIHMgT04gcy5pZCA9IGkuc3RhdGVfaWQKICAgICAgICAgICAgSU5ORVIgSk9JTiBmYXFfaGlzdG9yeSBoIE9OIGguaXRlbV9pZCA9IGkuaWQKICAgICAgICAgICAgSU5ORVIgSk9JTiBmYXFfY2F0ZWdvcnkgYyBPTiBjLmlkID0gaS5jYXRlZ29yeV9pZAogICAgICAgIFdIRVJFIGMuaWQgSU4gKCRDYXRlZ29yeVBsYWNlaG9sZGVycykiOwoKICAgICMgYWRkIHN0YXRlcyBjb25kaXRpb24KICAgIGlmICggJFBhcmFte1N0YXRlc30gJiYgcmVmICRQYXJhbXtTdGF0ZXN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte1N0YXRlc30gfSApIHsKICAgICAgICBwdXNoIEBCaW5kLCBtYXAgeyBcJF8gfSBAeyAkUGFyYW17U3RhdGVzfSB9OwogICAgICAgIG15ICRTdGF0ZXNTdHJpbmcgPSBqb2luICcsICcsICgnPycpIHggQHsgJFBhcmFte1N0YXRlc30gfTsKICAgICAgICAkU1FMIC49ICJBTkQgcy5uYW1lIElOICgkU3RhdGVzU3RyaW5nKSAiOwogICAgfQoKICAgICMgYWRkIG9yZGVyIGJ5IGNsYXVzZQogICAgJFNRTCAuPSAnT1JERVIgQlkgaC5jcmVhdGVkIERFU0MnOwoKICAgICMgZ2V0IHRoZSBkYXRhIGZyb20gZGIKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gMjAwLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgQERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlUmVjb3JkID0gKAogICAgICAgICAgICBJdGVtSUQgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgQWN0aW9uICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAkUm93WzJdLAogICAgICAgICAgICBDcmVhdGVkQnkgPT4gJFJvd1szXSwKICAgICAgICAgICAgQ2F0ZWdvcnkgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIFN1YmplY3QgICA9PiAkUm93WzVdLAogICAgICAgICAgICBOdW1iZXIgICAgPT4gJFJvd1s2XSwKICAgICAgICApOwogICAgICAgIHB1c2ggQERhdGEsIFwlUmVjb3JkOwogICAgfQoKICAgIHJldHVybiBcQERhdGE7Cn0KCj1oZWFkMiBLZXl3b3JkTGlzdCgpCgpnZXQgYSBsaXN0IG9mIGtleXdvcmRzIGFzIGEgaGFzaCwgd2l0aCB0aGVpciBjb3VudCBhcyB0aGUgdmFsdWU6CgogICAgbXkgJUtleXdvcmRzID0gJEZBUU9iamVjdC0+S2V5d29yZExpc3QoCiAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAlS2V5d29yZHMgPSAoCiAgICAgICAgICAnbWFjb3N4JyAgID0+IDgsCiAgICAgICAgICAndWJ1bnR1JyAgID0+IDEsCiAgICAgICAgICAnb3V0bG9vaycgID0+IDIsCiAgICAgICAgICAnd2luZG93cycgID0+IDMsCiAgICAgICAgICAnZXhjaGFuZ2UnID0+IDEsCiAgICApOwoKPWN1dAoKIyBUT0RPOiBGdW5jdGlvbiBub3QgdXNlZD8gS2V5d29yZCBzZXBhcmF0b3IgaXMgaGVyZSBhIG90aGVyIGFzIGF0IG90aGVyIHBsYWNlcy4uLgojIFRPRE86IENsYXJpZnkgLSBSZW1vdmUgZnVuY3Rpb24gb3IgY2hhbmdlIHRoZSBzZXBhcmF0b3I/CnN1YiBLZXl3b3JkTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdAogICAgbXkgJFZhbGlkID0gMDsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRWYWxpZCA9ICRQYXJhbXtWYWxpZH07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQga2V5d29yZHMgZnJvbSBkYgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgZl9rZXl3b3JkcyBGUk9NIGZhcV9pdGVtJywKICAgICk7CgogICAgbXkgJURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJEtleXdvcmRMaXN0ID0gbGMgJFJvd1swXTsKCiAgICAgICAgZm9yIG15ICRLZXl3b3JkICggc3BsaXQgLywvLCAkS2V5d29yZExpc3QgKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nL3RhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICRLZXl3b3JkID1+IHN7IFxBIFxzKyB9e314bXNnOwogICAgICAgICAgICAkS2V5d29yZCA9fiBzeyBccysgXHogfXt9eG1zZzsKCiAgICAgICAgICAgICMgaW5jcmVhc2Uga2V5d29yZCBjb3VudGVyCiAgICAgICAgICAgICREYXRheyRLZXl3b3JkfSsrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBGQVFLZXl3b3JkQXJ0aWNsZUxpc3QoKQoKR2V0IGEga2V5d29yZCBhbmQgcmVsYXRlZCBmYXEgYXJ0aWNsZXMgbG9va3VwIGxpc3QgKG9wdGlvbmFsIG9ubHkgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZXMpLgpZb3UgY2FuIGJ1aWxkIGEgbGlzdCBmb3IgYSBhZ2VudCBvciBjdXN0b21lci4gSWYgeW91IGdpdmUgb25seSBhIFVzZXJJRCB0aGUgcmVzdWx0IGlzIGZvcgp0aGUgZ2l2ZW4gVXNlcklELCB3aXRoIGEgYWRkaXRpb25hbCBDdXN0b21lclVzZXIgdGhlIGxpc3QgaXMgb25seSBmb3IgdGhlIGdpdmVuIEN1c3RvbWVyVXNlci4KCiAgICBteSAlRkFRS2V5d29yZEFydGljbGVMaXN0ID0gJEZBUU9iamVjdC0+RkFRS2V5d29yZEFydGljbGVMaXN0KAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgIEN1c3RvbWVyVXNlciA9PiAndHQnLCAgICAgICAgICAgIyBvcHRpb25hbCAod2l0aCB0aGlzIHRoZSByZXN1bHQgaXMgb25seSBjdXN0b21lciBmYXEgYXJ0aWNsZSkKICAgICAgICBMYW5ndWFnZXMgICAgPT4gWyAnZW4nLCAnZGUnIF0sICMgb3B0aW9uYWwKICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJFNlcnZpY2VJRCwgICAgICMgb3B0aW9uYWwKICAgICk7CgpSZXR1cm5zCgogICAgbXkgJUZBUUtleXdvcmRBcnRpY2xlTGlzdCA9ICgKICAgICAgICAnRXhhbXBsZUtleXdvcmQnID0+IFsKICAgICAgICAgICAgMTIsCiAgICAgICAgICAgIDEzLAogICAgICAgIF0sCiAgICAgICAgJ1Rlc3RLZXl3b3JkJyA9PiBbCiAgICAgICAgICAgIDg3NiwKICAgICAgICBdLAogICAgKTsKCj1jdXQKCnN1YiBGQVFLZXl3b3JkQXJ0aWNsZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQExhbmd1YWdlSURzOwoKICAgIExBTkdVQUdFTkFNRToKICAgIGZvciBteSAkTGFuZ3VhZ2VOYW1lICggQHsgJFBhcmFte0xhbmd1YWdlc30gfSApIHsKICAgICAgICBuZXh0IExBTkdVQUdFTkFNRSBpZiAhJExhbmd1YWdlTmFtZTsKCiAgICAgICAgbXkgJExhbmd1YWdlSUQgPSAkU2VsZi0+TGFuZ3VhZ2VMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJExhbmd1YWdlTmFtZSwKICAgICAgICApOwogICAgICAgIG5leHQgTEFOR1VBR0VOQU1FIGlmICEkTGFuZ3VhZ2VJRDsKCiAgICAgICAgcHVzaCBATGFuZ3VhZ2VJRHMsICRMYW5ndWFnZUlEOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRJbnRlcmZhY2U7CiAgICBteSAkU3RhdGVUeXBlczsKICAgIG15ICRDYXRlZ29yeUlEczsKCiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJ9ICkgewoKICAgICAgICAkSW50ZXJmYWNlID0gJ2V4dGVybmFsJzsKCiAgICAgICAgJFN0YXRlVHlwZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Q3VzdG9tZXI6OlN0YXRlVHlwZXMnKTsKCiAgICAgICAgJENhdGVnb3J5SURzID0gJFNlbGYtPkN1c3RvbWVyQ2F0ZWdvcnlTZWFyY2goCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgIE1vZGUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgR2V0U3ViQ2F0ZWdvcmllcyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgJEludGVyZmFjZSA9ICdpbnRlcm5hbCc7CgogICAgICAgICRTdGF0ZVR5cGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFnZW50OjpTdGF0ZVR5cGVzJyk7CgogICAgICAgICRDYXRlZ29yeUlEcyA9ICRTZWxmLT5BZ2VudENhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBHZXRTdWJDYXRlZ29yaWVzID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ2F0ZWdvcnlJRHMpOwoKICAgIG15ICRDYWNoZUtleSA9ICdGQVFLZXl3b3JkQXJ0aWNsZUxpc3QnOwoKICAgIGlmIChATGFuZ3VhZ2VJRHMpIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJzo6TGFuZ3VhZ2UnIC4gam9pbiAnOjonLCBzb3J0IEBMYW5ndWFnZUlEczsKICAgIH0KICAgICRDYWNoZUtleSAuPSAnOjpDYXRlZ29yeUlEcycgLiBqb2luICc6OicsIHNvcnQgQHskQ2F0ZWdvcnlJRHN9OwogICAgJENhY2hlS2V5IC49ICc6OkludGVyZmFjZTo6JyAuICRJbnRlcmZhY2U7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICRDYWNoZUtleSAuPSAnOjpTZXJ2aWNlSUQ6OicgLiAkUGFyYW17U2VydmljZUlEfTsKICAgIH0KCiAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0ZBUUtleXdvcmRBcnRpY2xlTGlzdCcsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgcmV0dXJuICV7JENhY2hlfSBpZiAkQ2FjaGU7CgogICAgbXkgJUZBUVNlYXJjaFBhcmFtZXRlcjsKCiAgICAjIFNldCBpbnRlcmZhY2Ugc2V0dGluZyB0byAnZXh0ZXJuYWwnLCB0byBzZWFyY2ggb25seSBmb3IgYXBwcm92ZWQgZmFxIGFydGljbGUuCiAgICAkRkFRU2VhcmNoUGFyYW1ldGVye0ludGVyZmFjZX0gPSAkU2VsZi0+U3RhdGVUeXBlR2V0KAogICAgICAgIE5hbWUgICA9PiAnZXh0ZXJuYWwnLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgJEZBUVNlYXJjaFBhcmFtZXRlcntTdGF0ZXN9ID0gJFNlbGYtPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgID0+ICRTdGF0ZVR5cGVzLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJFNlYXJjaExpbWl0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OktleXdvcmRBcnRpY2VMaXN0OjpTZWFyY2hMaW1pdCcpOwoKICAgIGlmIChATGFuZ3VhZ2VJRHMpIHsKICAgICAgICAkRkFRU2VhcmNoUGFyYW1ldGVye0xhbmd1YWdlSURzfSA9IFxATGFuZ3VhZ2VJRHM7CiAgICB9CgogICAgIyBHZXQgdGhlIHJlbGV2YW50IEZBUSBhcnRpY2xlIGZvciB0aGUgY3VycmVudCBjdXN0b21lciB1c2VyLgogICAgbXkgQEZBUUFydGljbGVJRHMgPSAkU2VsZi0+RkFRU2VhcmNoKAogICAgICAgICVGQVFTZWFyY2hQYXJhbWV0ZXIsCiAgICAgICAgQ2F0ZWdvcnlJRHMgICAgICA9PiAkQ2F0ZWdvcnlJRHMsCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJ0ZBUUlEJ10sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJ0Rvd24nXSwKICAgICAgICBMaW1pdCAgICAgICAgICAgID0+ICRTZWFyY2hMaW1pdCwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiMgRkFRIFNlcnZpY2UgVE9ETwogICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwKIyBlbyBGQVEgU2VydmljZQogICAgKTsKCiAgICBteSAlS2V5d29yZEFydGljZUxpc3Q7CiAgICBteSAlTG9va3VwS2V5d29yZEFydGljbGVJRDsKCiAgICBGQVFBUlRJQ0xFSUQ6CiAgICBmb3IgbXkgJEZBUUFydGljbGVJRCAoQEZBUUFydGljbGVJRHMpIHsKCiAgICAgICAgbXkgJUZBUUFydGljbGVEYXRhID0gJFNlbGYtPkZBUUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRGQVFBcnRpY2xlSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IEZBUUFSVElDTEVJRCBpZiAhJEZBUUFydGljbGVEYXRhe0tleXdvcmRzfTsKCiAgICAgICAgIyBSZXBsYWNlIGNvbW1hcyBhbmQgc2VtaWNvbG9ucywgYmVjYXVzZSB0aGUga2V5d29yZHMgYXJlIG5vcm1hbCBzcGxpdCB3aXRoIGFuIHdoaXRlc3BhY2UuCiAgICAgICAgJEZBUUFydGljbGVEYXRhe0tleXdvcmRzfSA9fiBzLywvIC9nOwogICAgICAgICRGQVFBcnRpY2xlRGF0YXtLZXl3b3Jkc30gPX4gcy87LyAvZzsKCiAgICAgICAgbXkgQEtleXdvcmRzID0gc3BsaXQgL1xzKy8sIGxjICRGQVFBcnRpY2xlRGF0YXtLZXl3b3Jkc307CgogICAgICAgIEtFWVdPUkQ6CiAgICAgICAgZm9yIG15ICRLZXl3b3JkIChAS2V5d29yZHMpIHsKCiAgICAgICAgICAgIG5leHQgS0VZV09SRCBpZiAkTG9va3VwS2V5d29yZEFydGljbGVJRHskS2V5d29yZH0tPnskRkFRQXJ0aWNsZUlEfTsKCiAgICAgICAgICAgIHB1c2ggQHsgJEtleXdvcmRBcnRpY2VMaXN0eyRLZXl3b3JkfSB9LCAkRkFRQXJ0aWNsZUlEOwoKICAgICAgICAgICAgJExvb2t1cEtleXdvcmRBcnRpY2xlSUR7JEtleXdvcmR9LT57JEZBUUFydGljbGVJRH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICdGQVFLZXl3b3JkQXJ0aWNsZUxpc3QnLAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJUtleXdvcmRBcnRpY2VMaXN0LAogICAgICAgIFRUTCAgID0+IDYwICogNjAgKiAzLAogICAgKTsKCiAgICByZXR1cm4gJUtleXdvcmRBcnRpY2VMaXN0Owp9Cgo9aGVhZDIgRkFRUGF0aExpc3RHZXQoKQoKcmV0dXJucyBhIGNhdGVnb3J5IGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRDYXRlZ29yeUlEQXJyYXlSZWYgPSAkRkFRT2JqZWN0LT5GQVFQYXRoTGlzdEdldCgKICAgICAgICBDYXRlZ29yeUlEID0+IDE1MCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkQ2F0ZWdvcnlJREFycmF5UmVmID0gWwogICAgICAgIHsKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAnMicsCiAgICAgICAgICAgIFBhcmVudElEID0+ICcwJywKICAgICAgICAgICAgTmFtZSA9PiAnTXkgQ2F0ZWdvcnknLAogICAgICAgICAgICBDb21tZW50ID0+ICdNeSBGaXJzdCBDYXRlZ29yeScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJzEnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICc0JywKICAgICAgICAgICAgUGFyZW50SUQgPT4gJzInLAogICAgICAgICAgICBOYW1lID0+ICdTdWIgQ2F0ZWdvcnkgQScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1RoaXMgSXMgQ2F0ZWdvcnkgQScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJzEnLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIEZBUVBhdGhMaXN0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBAQ2F0ZWdvcnlMaXN0OwogICAgbXkgJFRlbXBDYXRlZ29yeUlEID0gJFBhcmFte0NhdGVnb3J5SUR9OwogICAgd2hpbGUgKCRUZW1wQ2F0ZWdvcnlJRCkgewogICAgICAgIG15ICVEYXRhID0gJFNlbGYtPkNhdGVnb3J5R2V0KAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRUZW1wQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICglRGF0YSkgewogICAgICAgICAgICBwdXNoIEBDYXRlZ29yeUxpc3QsIFwlRGF0YTsKICAgICAgICB9CiAgICAgICAgJFRlbXBDYXRlZ29yeUlEID0gJERhdGF7UGFyZW50SUR9OwogICAgfQoKICAgIEBDYXRlZ29yeUxpc3QgPSByZXZlcnNlIEBDYXRlZ29yeUxpc3Q7CgogICAgcmV0dXJuIFxAQ2F0ZWdvcnlMaXN0OwoKfQoKPWhlYWQyIEZBUUxvZ0FkZCgpCgphZGRzIGFjY2Vzc2VkIEZBUSBhcnRpY2xlIHRvIHRoZSBhY2Nlc3MgbG9nIHRhYmxlCgogICAgbXkgJFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFMb2dBZGQoCiAgICAgICAgSXRlbUlEICAgID0+ICcxMjM0NTYnLAogICAgICAgIEludGVyZmFjZSA9PiAnaW50ZXJuYWwnLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJFN1Y2Nlc3MgPTE7ICAgICAgICAgICAgICAgICMgb3IgdW5kZWYgaWYgRkFRTG9nIGNvdWxkIG5vdCBiZSBhZGRlZAoKPWN1dAoKc3ViIEZBUUxvZ0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBJbnRlcmZhY2UgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkSVAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPlJlbW90ZUFkZHIoKSAgICAgICB8fCAnTk9ORSc7CiAgICBteSAkVXNlckFnZW50ICAgPSAkUGFyYW1PYmplY3QtPkhUVFAoJ1VTRVJfQUdFTlQnKSB8fCAnTk9ORSc7CgogICAgIyBEZWZpbmUgdGltZSBwZXJpb2Qgd2hlbiByZWxvYWRzIHdpbGwgbm90IGJlIGxvZ2dlZCAoMTAgbWludXRlcykuCiAgICBteSAkUmVsb2FkQmxvY2tUaW1lID0gMTAgKiA2MDsKCiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICREYXRlVGltZU9iamVjdC0+U3VidHJhY3QoIFNlY29uZHMgPT4gJFJlbG9hZEJsb2NrVGltZSApOwogICAgbXkgJFRpbWVTdGFtcCA9ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGNoZWNrIGlmIGEgbG9nIGVudHJ5IGV4aXN0cyBuZXdlciB0aGFuIHRoZSBSZWxvYWRCbG9ja1RpbWUKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gZmFxX2xvZyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGl0ZW1faWQgPSA/IEFORCBpcCA9ID8gJwogICAgICAgICAgICAuICdBTkQgdXNlcl9hZ2VudCA9ID8gQU5EIGNyZWF0ZWQgPj0gPyAnLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJdGVtSUR9LCBcJElQLCBcJFVzZXJBZ2VudCwgXCRUaW1lU3RhbXAgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRBbHJlYWR5RXhpc3RzID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBbHJlYWR5RXhpc3RzID0gMTsKICAgIH0KCiAgICByZXR1cm4gaWYgJEFscmVhZHlFeGlzdHM7CgogICAgIyBpbnNlcnQgbmV3IGxvZyBlbnRyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gZmFxX2xvZyAnCiAgICAgICAgICAgIC4gJyhpdGVtX2lkLCBpbnRlcmZhY2UsIGlwLCB1c2VyX2FnZW50LCBjcmVhdGVkKSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXApJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtJdGVtSUR9LCBcJFBhcmFte0ludGVyZmFjZX0sIFwkSVAsIFwkVXNlckFnZW50LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRkFRVG9wMTBHZXQoKQoKUmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSB0b3AgMTAgRkFRIGFydGljbGUgaWRzLgoKICAgIG15ICRUb3AxMElEc1JlZiA9ICRGQVFPYmplY3QtPkZBUVRvcDEwR2V0KAogICAgICAgIEludGVyZmFjZSAgID0+ICdwdWJsaWMnLAogICAgICAgIENhdGVnb3J5SURzID0+IFsgMSwgMiwgMyBdLCAgIyAob3B0aW9uYWwpIE9ubHkgc2hvdyB0aGUgVG9wLTEwIGFydGljbGVzIGZyb20gdGhlc2UgY2F0ZWdvcmllcwogICAgICAgIExpbWl0ICAgICAgID0+IDEwLCAgICAgICAgICAgIyAob3B0aW9uYWwsIGRlZmF1bHQgMTApCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRUb3AxMElEc1JlZiA9IFsKICAgICAgICB7CiAgICAgICAgICAgICdJdGVtSUQnICAgID0+IDEzLAogICAgICAgICAgICAnQ291bnQnICAgICA9PiAxNTksICAgICAgICAgICAgICAgIyBudW1iZXIgb2YgdmlzaXRzCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdwdWJsaWMnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiA2LAogICAgICAgICAgICAnQ291bnQnICAgICA9PiA3OCwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ3B1YmxpYycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICdJdGVtSUQnICAgID0+IDQsCiAgICAgICAgICAgICdDb3VudCcgICAgID0+IDU5LAogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAnaW50ZXJuYWwnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiAyMCwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gMjksCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdwdWJsaWMnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiAxLAogICAgICAgICAgICAnQ291bnQnICAgICA9PiAyNCwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ2V4dGVybmFsJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gMTEsCiAgICAgICAgICAgICdDb3VudCcgICAgID0+IDI0LAogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAnaW50ZXJuYWwnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiA1LAogICAgICAgICAgICAnQ291bnQnICAgICA9PiAxOCwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ2ludGVybmFsJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gOSwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gMTYsCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdleHRlcm5hbCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICdJdGVtSUQnICAgID0+IDIsCiAgICAgICAgICAgICdDb3VudCcgICAgID0+IDE0LAogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAnaW50ZXJuYWwnCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICdJdGVtSUQnICAgID0+IDE0LAogICAgICAgICAgICAnQ291bnQnICAgICA9PiA2LAogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAncHVibGljJywKICAgICAgICB9CiAgICBdOwoKPWN1dAoKc3ViIEZBUVRvcDEwR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSW50ZXJmYWNlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdmFsaWQgaWQgc3RyaW5nCiAgICBteSAkVmFsaWRJRHNTdHJpbmcgPSBqb2luICcsICcsICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwoKICAgICMgcHJlcGFyZSBTUUwKICAgIG15IEBCaW5kOwogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaXRlbV9pZCwgY291bnQoaXRlbV9pZCkgYXMgaXRlbWNvdW50LCBmYXFfc3RhdGVfdHlwZS5uYW1lLCBhcHByb3ZlZCAnCiAgICAgICAgLiAnRlJPTSBmYXFfbG9nLCBmYXFfaXRlbSwgZmFxX3N0YXRlLCBmYXFfc3RhdGVfdHlwZSAnCiAgICAgICAgLiAnV0hFUkUgZmFxX2xvZy5pdGVtX2lkID0gZmFxX2l0ZW0uaWQgJwogICAgICAgIC4gJ0FORCBmYXFfaXRlbS5zdGF0ZV9pZCA9IGZhcV9zdGF0ZS5pZCAnCiAgICAgICAgLiAiQU5EIGZhcV9pdGVtLnZhbGlkX2lkIElOICgkVmFsaWRJRHNTdHJpbmcpICIKICAgICAgICAuICdBTkQgZmFxX3N0YXRlLnR5cGVfaWQgPSBmYXFfc3RhdGVfdHlwZS5pZCAnOwoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZmlsdGVyIGp1c3QgY2F0ZWdvcmllcyB3aXRoIGF0IGxlYXN0IHJvIHBlcm1pc3Npb24KICAgIGlmICggJFBhcmFte0NhdGVnb3J5SURzfSAmJiByZWYgJFBhcmFte0NhdGVnb3J5SURzfSBlcSAnQVJSQVknICYmIEB7ICRQYXJhbXtDYXRlZ29yeUlEc30gfSApIHsKCiAgICAgICAgIyBpbnRlZ2VyIHF1b3RlIHRoZSBjYXRlZ29yeSBpZHMKICAgICAgICBmb3IgbXkgJENhdGVnb3J5SUQgKCBAeyAkUGFyYW17Q2F0ZWdvcnlJRHN9IH0gKSB7CiAgICAgICAgICAgICRDYXRlZ29yeUlEID0gJERCT2JqZWN0LT5RdW90ZSggJENhdGVnb3J5SUQsICdJbnRlZ2VyJyApOwogICAgICAgIH0KCiAgICAgICAgbXkgQFNvcnRlZElEcyA9IHNvcnQgQHsgJFBhcmFte0NhdGVnb3J5SURzfSB9OwoKICAgICAgICAjIHNwbGl0IElOIHN0YXRlbWVudCB3aXRoIG1vcmUgdGhhbiA5MDAgZWxlbWVudHMgaW4gbW9yZSBzdGF0ZW1lbnRzIGNvbWJpbmVkIHdpdGggT1IKICAgICAgICAjIGJlY2F1c2UgT3JhY2xlIGRvZXNuJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gMTAwMCBlbGVtZW50cyBpbiBvbmUgSU4gc3RhdGVtZW50LgogICAgICAgIG15IEBTUUxTdHJpbmdzOwogICAgICAgIExPT1A6CiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQFNvcnRlZElEcyApIHsKCiAgICAgICAgICAgIG15IEBTb3J0ZWRJRHNQYXJ0ID0gc3BsaWNlIEBTb3J0ZWRJRHMsIDAsIDkwMDsKCiAgICAgICAgICAgIG15ICRJRFN0cmluZyA9IGpvaW4gJywnLCBAU29ydGVkSURzUGFydDsKCiAgICAgICAgICAgIHB1c2ggQFNRTFN0cmluZ3MsICIgZmFxX2l0ZW0uY2F0ZWdvcnlfaWQgSU4gKCRJRFN0cmluZykgIjsKICAgICAgICB9CgogICAgICAgIG15ICRTUUxTdHJpbmcgPSBqb2luICcgT1IgJywgQFNRTFN0cmluZ3M7CgogICAgICAgICRTUUwgLj0gJyBBTkQgKCAnIC4gJFNRTFN0cmluZyAuICcgKSAnOwogICAgfQoKICAgICMgZmlsdGVyIHJlc3VsdHMgZm9yIHB1YmxpYyBhbmQgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICBpZiAoICggJFBhcmFte0ludGVyZmFjZX0gZXEgJ3B1YmxpYycgKSB8fCAoICRQYXJhbXtJbnRlcmZhY2V9IGVxICdleHRlcm5hbCcgKSApIHsKCiAgICAgICAgIyBvbmx5IHNob3cgYXBwcm92ZWQgYXJ0aWNsZXMKICAgICAgICAkU1FMIC49ICdBTkQgZmFxX2l0ZW0uYXBwcm92ZWQgPSAxICc7CgogICAgICAgICMgb25seSBzaG93IHRoZSBwdWJsaWMgYXJ0aWNsZXMKICAgICAgICAkU1FMIC49ICJBTkQgKCAoIGZhcV9zdGF0ZV90eXBlLm5hbWUgPSAncHVibGljJyBBTkQgZmFxX2xvZy5pbnRlcmZhY2UgPSAncHVibGljJyApICI7CgogICAgICAgICMgY3VzdG9tZXJzIGNhbiBhZGRpdGlvbmFsbHkgc2VlIHRoZSBleHRlcm5hbCBhcnRpY2xlcwogICAgICAgIGlmICggJFBhcmFte0ludGVyZmFjZX0gZXEgJ2V4dGVybmFsJyApIHsKICAgICAgICAgICAgJFNRTCAuPSAiT1IgKCBmYXFfc3RhdGVfdHlwZS5uYW1lID0gJ2V4dGVybmFsJyBBTkQgZmFxX2xvZy5pbnRlcmZhY2UgPSAnZXh0ZXJuYWwnICkgIjsKICAgICAgICB9CgogICAgICAgICRTUUwgLj0gJykgJzsKICAgIH0KCiAgICAjIGZpbHRlciByZXN1bHRzIGZvciBkZWZpbmVkIHRpbWUgcGVyaW9kCiAgICBpZiAoICRQYXJhbXtTdGFydERhdGV9ICYmICRQYXJhbXtFbmREYXRlfSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgZmFxX2xvZy5jcmVhdGVkID49ID8gQU5EIGZhcV9sb2cuY3JlYXRlZCA8PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgKCBcJFBhcmFte1N0YXJ0RGF0ZX0sIFwkUGFyYW17RW5kRGF0ZX0gKTsKICAgIH0KCiAgICAjIGNvbXBsZXRlIFNRTCBzdGF0ZW1lbnQKICAgICRTUUwgLj0gJ0dST1VQIEJZIGl0ZW1faWQsIGZhcV9zdGF0ZV90eXBlLm5hbWUsIGFwcHJvdmVkICcKICAgICAgICAuICdPUkRFUiBCWSBpdGVtY291bnQgREVTQyc7CgogICAgIyBnZXQgdGhlIHRvcCAxMCBhcnRpY2xlIGlkcyBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gW10gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9IHx8IDEwLAogICAgKTsKCiAgICBteSBAUmVzdWx0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAUmVzdWx0LCB7CiAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBDb3VudCAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgSW50ZXJmYWNlID0+ICRSb3dbMl0sCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gXEBSZXN1bHQ7Cn0KCj1oZWFkMiBGQVFJbmxpbmVBdHRhY2htZW50VVJMVXBkYXRlKCkKClVwZGF0ZXMgdGhlIFVSTHMgb2YgdXBsb2FkZWQgaW5saW5lIGF0dGFjaG1lbnRzLgoKICAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRSW5saW5lQXR0YWNobWVudFVSTFVwZGF0ZSgKICAgICAgICBJdGVtSUQgICAgID0+IDEyLAogICAgICAgIEZvcm1JRCAgICAgPT4gNDU2LAogICAgICAgIEZpbGVJRCAgICAgPT4gNSwKICAgICAgICBBdHRhY2htZW50ID0+IFwlQXR0YWNobWVudCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkU3VjY2VzcyA9IDE7ICAgICAgICAgICAgICAgIyBvZiB1bmRlZiBpZiBhdHRhY2htZW50IFVSTCBjb3VsZCBub3QgYmUgdXBkYXRlZAoKPWN1dAoKc3ViIEZBUUlubGluZUF0dGFjaG1lbnRVUkxVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgQXR0YWNobWVudCBGb3JtSUQgRmlsZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYXR0YWNobWVudCBpcyBhIGhhc2ggcmVmZXJlbmNlCiAgICBpZiAoIHJlZiAkUGFyYW17QXR0YWNobWVudH0gbmUgJ0hBU0gnICYmICEleyAkUGFyYW17QXR0YWNobWVudH0gfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF0dGFjaG1lbnQgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgb25seSBjb25zaWRlciBpbmxpbmUgYXR0YWNobWVudHMgaGVyZSAodGhleSBoYXZlIGEgY29udGVudCBpZCkKICAgIHJldHVybiAxIGlmICEkUGFyYW17QXR0YWNobWVudH0tPntDb250ZW50SUR9OwoKICAgIG15ICVGQVFEYXRhID0gJFNlbGYtPkZBUUdldCgKICAgICAgICBJdGVtSUQgICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIEl0ZW1GaWVsZHMgPT4gMSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHBpY3R1cmUgVVJMIGluIHVwbG9hZCBjYWNoZQogICAgbXkgJFNlYXJjaCA9ICJBY3Rpb249UGljdHVyZVVwbG9hZCAuIEZvcm1JRD1cUSRQYXJhbXtGb3JtSUR9XEUgLiAiCiAgICAgICAgLiAiQ29udGVudElEPVxRJFBhcmFte0F0dGFjaG1lbnR9LT57Q29udGVudElEfVxFIjsKCiAgICAjIHBpY3R1cmUgVVJMIGluIEZBUSBhdHRhY2htZW50CiAgICBteSAkUmVwbGFjZSA9ICJBY3Rpb249QWdlbnRGQVFab29tO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7IgogICAgICAgIC4gIkl0ZW1JRD0kUGFyYW17SXRlbUlEfTtGaWxlSUQ9JFBhcmFte0ZpbGVJRH0iOwoKICAgICMgcmV3cml0ZSBwaWN0dXJlIFVSTHMKICAgIEZJRUxEOgogICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICMgY2hlY2sgaWYgZmllbGQgY29udGFpbnMgc29tZXRoaW5nCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEZBUURhdGF7IkZpZWxkJE51bWJlciJ9OwoKICAgICAgICAjIHJlbW92ZSBuZXdsaW5lcwogICAgICAgICRGQVFEYXRheyJGaWVsZCROdW1iZXIifSA9fiBzeyBbXG5ccl0rIH17fWd4bXM7CgogICAgICAgICMgcmVwbGFjZSBVUkwKICAgICAgICAkRkFRRGF0YXsiRmllbGQkTnVtYmVyIn0gPX4gc3skU2VhcmNofXskUmVwbGFjZX14bXM7CiAgICB9CgogICAgIyB1cGRhdGUgRkFRIGFydGljbGUgd2l0aG91dCB3cml0aW5nIGEgaGlzdG9yeSBlbnRyeQogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+RkFRVXBkYXRlKAogICAgICAgICVGQVFEYXRhLAogICAgICAgIEhpc3RvcnlPZmYgID0+IDEsCiAgICAgICAgQXBwcm92YWxPZmYgPT4gMSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHVwZGF0ZSBGQVEgSXRlbSMgJyRQYXJhbXtJdGVtSUR9JyEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZBUUFydGljbGVUaXRsZUNsZWFuKCkKCnN0cmlwL2NsZWFuIHVwIGEgRkFRIGFydGljbGUgdGl0bGUKCiAgICBteSAkTmV3VGl0bGUgPSAkRkFRT2JqZWN0LT5GQVFBcnRpY2xlVGl0bGVDbGVhbigKICAgICAgICBUaXRsZSAgICAgID0+ICRPbGRUaXRsZSwKICAgICAgICBTaXplICAgICAgID0+ICRUaXRsZVNpemVUb0JlRGlzcGxheWVkICAgIyBvcHRpb25hbCwgaWYgMCBkbyBub3QgY3V0IHRpdGxlCiAgICApOwoKPWN1dAoKc3ViIEZBUUFydGljbGVUaXRsZUNsZWFuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpdGxlID0gJFBhcmFte1RpdGxlfSB8fCAnJzsKCiAgICAjIGdldCBjb25maWcgb3B0aW9ucwogICAgbXkgJFRpdGxlU2l6ZSA9ICRQYXJhbXtTaXplfTsKICAgIGlmICggIWRlZmluZWQgJFRpdGxlU2l6ZSApIHsKICAgICAgICAkVGl0bGVTaXplID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGQVE6OlRpdGxlU2l6ZScpIHx8IDEwMDsKICAgIH0KCiAgICAjIHRyaW0gd2hpdGUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQKICAgICRUaXRsZSA9fiBzLyheXHMrfFxzKyQpLy87CgogICAgIyByZXNpemUgdGl0bGUgYmFzZWQgb24gY29uZmlnCiAgICAjIGRvIG5vdCBjdXQgdGl0bGUsIGlmIHNpemUgcGFyYW1ldGVyIHdhcyAwCiAgICBpZiAoJFRpdGxlU2l6ZSkgewogICAgICAgICRUaXRsZSA9fiBzL14oLnskVGl0bGVTaXplfSkuKiQvJDEgWy4uLl0vOwogICAgfQoKICAgIHJldHVybiAkVGl0bGU7Cn0KCj1oZWFkMiBGQVFDb250ZW50VHlwZVNldCgpCgpTZXRzIHRoZSBjb250ZW50IHR5cGUgb2YgMSwgc29tZSBvciBhbGwgRkFRIGl0ZW1zLCBieSBhIGdpdmVuIHBhcmFtZXRlciBvciBkZXRlcm1pbmVkIGJ5IHRoZSBGQVEgaXRlbSBjb250ZW50CgogICAgbXkgJFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFDb250ZW50VHlwZVNldCgKICAgICAgICBGQVFJdGVtSURzICA9PiBbIDEsIDIsIDMgXSwgICAgICAgICAgICAgIyBvcHRpb25hbCwKICAgICAgICBDb250ZW50VHlwZSA9PiAnc29tZSBjb250ZW50IHR5cGUnLCAgICAgIyBvcHRpb25hbCwKICAgICk7Cgo9Y3V0CgpzdWIgRkFRQ29udGVudFR5cGVTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRQYXJhbXtGQVFJdGVtSURzfSAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RkFRSXRlbUlEc30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgRkFRSXRlbUlEcyBmb3JtYXQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJENvbnRlbnRUeXBlID0gJFBhcmFte0NvbnRlbnRUeXBlfSB8fCAnJzsKCiAgICAjIEdldCBkZWZhdWx0IGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBjb25maWcgaWYgaXQgd2FzIG5vdCBnaXZlbi4KICAgIGlmICggISRDb250ZW50VHlwZSApIHsKCiAgICAgICAgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpICkgewogICAgICAgICAgICAkQ29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9CiAgICB9CgogICAgIyBTUUwgdG8gc2V0IHRoZSBjb250ZW50IHR5cGUgKGRlZmF1bHQgb3IgZ2l2ZW4pLgogICAgbXkgJFNRTCA9ICcKICAgICAgICBVUERBVEUgZmFxX2l0ZW0KICAgICAgICBTRVQgY29udGVudF90eXBlID0gPyc7CgogICAgIyBHZXQgRkFRIGl0ZW0gSURzIGZyb20gdGhlIHBhcmFtLgogICAgbXkgQEZBUUl0ZW1JRHMgPSBAeyAkUGFyYW17RkFRSXRlbUlEc30gLy8gW10gfTsKCiAgICAjIFJlc3RyaWN0IHRvIG9ubHkgZ2l2ZW4gRkFRIGl0ZW0gSURzIChpZiBhbnkpLgogICAgaWYgKEBGQVFJdGVtSURzKSB7CgogICAgICAgIG15ICRJRFN0cmluZyA9IGpvaW4gJywnLCBARkFRSXRlbUlEczsKCiAgICAgICAgJFNRTCAuPSAiCiAgICAgICAgICAgIFdIRVJFIGlkIElOICgkSURTdHJpbmcpIjsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIFNldCB0aGUgY29udGVudCB0eXBlIGVpdGhlciBieSB0aGUgZ2l2ZW4gcGFyYW0gb3IgYWNjb3JkaW5nIHRvIHRoZSBzeXN0ZW0gc2V0dGluZ3MuCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJENvbnRlbnRUeXBlLAogICAgICAgIF0sCiAgICApOwoKICAgICMgTm8gbmVlZCB0byBnbyBmdXJ0aGVyIGlmIGNvbnRlbnQgdHlwZSB3YXMgZ2l2ZW4gKGl0IHdhcyBhbHJlYWR5IHNldCkuCiAgICBpZiAoICRQYXJhbXtDb250ZW50VHlwZX0gKSB7CgogICAgICAgICMgRGVsZXRlIGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBPdGhlcndpc2UgY29udGVudCB0eXBlIGhhcyB0byBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBGQVEgaXRlbSBjb250ZW50LgoKICAgICMgR2V0IGFsbCBGQVFJRHMgKGlmIG5vIGZhcSBpdGVtIHdhcyBnaXZlbikuCiAgICBpZiAoICFARkFRSXRlbUlEcyApIHsKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFNFTEVDVCBESVNUSU5DVChmYXFfaXRlbS5pZCkKICAgICAgICAgICAgICAgIEZST00gZmFxX2l0ZW0KICAgICAgICAgICAgICAgIE9SREVSIEJZIGlkIEFTQycsCiAgICAgICAgKTsKCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQEZBUUl0ZW1JRHMsICRSb3dbMF07CiAgICAgICAgfQogICAgfQoKICAgICMgTG9vcCB0cm91Z2ggdGhlIEZBUSBpdGVtcy4KICAgIElURU1JRDoKICAgIGZvciBteSAkSXRlbUlEIChARkFRSXRlbUlEcykgewogICAgICAgIG15ICREZXRlcm1pbmVkQ29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CgogICAgICAgICMgR2V0IHRoZSBjb250ZW50cyBvZiBlYWNoIGZpZWxkCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYpKSB7CgogICAgICAgICAgICBteSAkRmllbGRDb250ZW50ID0gJFNlbGYtPkl0ZW1GaWVsZEdldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgRmllbGQgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEZpZWxkQ29udGVudDsKCiAgICAgICAgICAgICMgaWYgZmllbGQgY29udGVudCBzZWFtcyB0byBiZSBIVE1MIHNldCB0aGUgY29udGVudCB0eXBlIHRvIEhUTUwKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEZpZWxkQ29udGVudAogICAgICAgICAgICAgICAgPX4gbXsoPzogPGJyXHMqLz4gfCA8L2xpPiB8IDwvb2w+IHwgPC91bD4gfCA8L3RhYmxlPiB8IDwvdHI+IHwgPC90ZD4gfCA8L2Rpdj4gfCA8L28+IHwgPC9pPiB8IDwvc3Bhbj4gfCA8L2hcZD4gfCA8L3A+IHwgPC9wcmU+ICl9bXN4CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICREZXRlcm1pbmVkQ29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICAgICAgICAgIGxhc3QgRklFTEQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5leHQgSVRFTUlEIGlmICREZXRlcm1pbmVkQ29udGVudFR5cGUgZXEgJENvbnRlbnRUeXBlOwoKICAgICAgICAjIFNldCB0aGUgY29udGVudCB0eXBlIGFjY29yZGluZyB0byB0aGUgZmllbGQgY29udGVudC4KICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgZmFxX2l0ZW0KICAgICAgICAgICAgICAgIFNFVCBjb250ZW50X3R5cGUgPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9PycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCREZXRlcm1pbmVkQ29udGVudFR5cGUsCiAgICAgICAgICAgICAgICBcJEl0ZW1JRCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQoKICAgICMgRGVsZXRlIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICdGQVEnLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQxIERFUFJFQ0FURUQgRlVOQ1RJT05TCgo9aGVhZDIgSGlzdG9yeUdldCgpCgpEZXByZWNhdGVkLCB1c2UgRkFRSm91cm5hbEdldCgpIGluc3RlYWQuCgo9Y3V0CgpzdWIgSGlzdG9yeUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+RkFRSm91cm5hbEdldCglUGFyYW0pOwp9Cgo9aGVhZDEgUFJJVkFURSBGVU5DVElPTlMKCj1oZWFkMiBfRkFRQXBwcm92YWxVcGRhdGUoKQoKdXBkYXRlIHRoZSBhcHByb3ZhbCBzdGF0ZSBvZiBhbiBhcnRpY2xlCgogICAgbXkgJFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5fRkFRQXBwcm92YWxVcGRhdGUoCiAgICAgICAgSXRlbUlEICAgICA9PiAxMjMsCiAgICAgICAgQXBwcm92ZWQgICA9PiAxLCAgICAjIDB8MSAoZGVmYXVsdCAwKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0ZBUUFwcHJvdmFsVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0FwcHJvdmVkfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEFwcHJvdmVkIHBhcmFtZXRlciEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHVwZGF0ZSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgZmFxX2l0ZW0gU0VUICcKICAgICAgICAgICAgLiAnYXBwcm92ZWQgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZWQgPSBjdXJyZW50X3RpbWVzdGFtcCwgJwogICAgICAgICAgICAuICdjaGFuZ2VkX2J5ID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17QXBwcm92ZWR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SXRlbUlEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGFwcHJvdmFsIGZlYXR1cmUgaXMgYWN0aXZhdGVkIGFuZCBGQVEgYXJ0aWNsZSBpcyBub3QgYXBwcm92ZWQgeWV0CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpBcHByb3ZhbFJlcXVpcmVkJykgJiYgISRQYXJhbXtBcHByb3ZlZH0gKSB7CgogICAgICAgIG15ICVGQVFEYXRhID0gJFNlbGYtPkZBUUdldCgKICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgSXRlbUZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRBcHByb3ZhbFJlcXVpcmVkICAgICAgICA9IDE7CiAgICAgICAgbXkgJEFwcHJvdmFsSW5jbHVkZUludGVybmFsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGQVE6OkFwcHJvdmFsOjpJbmNsdWRlSW50ZXJuYWwnKTsKCiAgICAgICAgaWYgKCAhJEFwcHJvdmFsSW5jbHVkZUludGVybmFsICkgewogICAgICAgICAgICBteSAlSW50ZXJuYWxTdGF0ZSA9ICRTZWxmLT5TdGF0ZUxpc3QoCiAgICAgICAgICAgICAgICBUeXBlcyAgPT4gWydpbnRlcm5hbCddLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRJbnRlcm5hbFN0YXRleyAkRkFRRGF0YXtTdGF0ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEFwcHJvdmFsUmVxdWlyZWQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRBcHByb3ZhbFJlcXVpcmVkICkgewogICAgICAgICAgICAjIGNyZWF0ZSBuZXcgYXBwcm92YWwgdGlja2V0CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9GQVFBcHByb3ZhbFRpY2tldENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+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+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAnSXRlbUZpZWxkR2V0OjpJdGVtSUQ6OicgLiAkUGFyYW17SXRlbUlEfSwKICAgICk7CgogICAgIyBDbGVhbnVwIGNhY2hlIGZvciB0aGUgJ0ZBUUtleXdvcmRBcnRpY2xlTGlzdCcuCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnRkFRS2V5d29yZEFydGljbGVMaXN0JywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KPWhlYWQyIExpbmtRdW90ZU1lbnRpb24oKQoKY3JlYXRlcyBhbiBhcHByb3ZhbCB0aWNrZXQKCiAgICBteSAkU3RyaW5nID0gJEZBUU9iamVjdC0+TGlua1F1b3RlTWVudGlvbigKICAgICAgICBTdHJpbmcgICAgID0+ICdUZXh0JywKICAgICk7CgpSZXR1cm5zOgoKICAgICRTdHJpbmcgPSAnPExpbmsgcXVvdGUgbWVudGlvbj4nOwoKPWN1dAoKc3ViIExpbmtRdW90ZU1lbnRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU3RyaW5nID0gJFBhcmFte1N0cmluZ30gLy8gJyc7CgogICAgJFN0cmluZyA9fiBzewogICAgICAgICg8YVxzezEsMTB9KShbXj5dKmNsYXNzPVwibWVudGlvblwiW14+XSopPgogICAgfQogICAgewogICAgICAgIG15ICRTdGFydCA9ICQxOwogICAgICAgIG15ICRWYWx1ZSA9ICQyOwogICAgICAgIGlmICggJFZhbHVlICF+IC9ocmVmPS9pIHx8ICRWYWx1ZSA9fiAvdGFyZ2V0PS9pICkgewogICAgICAgICAgICAiJFN0YXJ0JFZhbHVlPiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAiJFN0YXJ0JFZhbHVlIHRhcmdldD1cIl9wYXJlbnRcIj4iOwogICAgICAgIH0KICAgIH1lZ3hzaTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RPQk8gcHJvamVjdCAoTDxodHRwczovL290b2JvLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK</File>
        <File Location="Custom/Kernel/System/FAQSearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvU3lzdGVtL0ZBUVNlYXJjaC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGQVFTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZBUVNlYXJjaCAtIEZBUSBzZWFyY2ggbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBGQVEgc2VhcmNoIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgRkFRU2VhcmNoKCkKCnNlYXJjaCBpbiBGQVEgYXJ0aWNsZXMKCiAgICBteSBASURzID0gJEZBUU9iamVjdC0+RkFRU2VhcmNoKAoKICAgICAgICBOdW1iZXIgICAgPT4gJyoxMzQqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFRpdGxlICAgICA9PiAnKnNvbWUgdGl0bGUqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgaXMgc2VhcmNoaW5nIGluIE51bWJlciwgVGl0bGUsIEtleXdvcmQgYW5kIEZpZWxkMS02CiAgICAgICAgV2hhdCAgICAgID0+ICcqc29tZSB0ZXh0KicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAjIG9wdGlvbmFsbHkgcmVzdHJpY3Qga2V5d29yZHMgc2VhcmNoZWQgZm9yICJXaGF0IgogICAgICAgIFdoYXRBdHRyaWJ1dGVzID0+IFsnVGl0bGUnLCAnTnVtYmVyJywgJ0tleXdvcmQnXSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICBLZXl3b3JkICAgPT4gJyp3ZWJzZXJ2ZXIqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFN0YXRlcyAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgICAgIDEgPT4gJ2ludGVybmFsJywKICAgICAgICAgICAgMiA9PiAnZXh0ZXJuYWwnLAogICAgICAgIH0sCiAgICAgICAgTGFuZ3VhZ2VJRHMgPT4gWyA0LCA1LCA2IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDYXRlZ29yeUlEcyA9PiBbIDcsIDgsIDkgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbGlkSURzICAgID0+IFsgMSwgMiwgMyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIChkZWZhdWx0IDEpCgogICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgVXNlIEZBUVNlYXJjaCBhcyBhbiBGQVEgZmlsdGVyIG9uIGEgc2luZ2xlIEZBUSBpdGVtLAogICAgICAgICMgb3IgYSBwcmVkZWZpbmVkIEZBUSBpdGVtIGxpc3QKICAgICAgICBGQVFJRCAgICAgPT4gMTIzNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEZBUUlEICAgICA9PiBbMTIzNCwgMTIzNV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgQXBwcm92ZWQKICAgICAgICAjICAgIE9ubHkgYXZhaWxhYmxlIGluIGludGVybmFsIGludGVyZmFjZSAoYWdlbnQgaW50ZXJmYWNlKQogICAgICAgIEFwcHJvdmVkICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIDEgb3IgMCwKCiAgICAgICAgIyBWb3RlcwogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbMTIzLCA2NTRdCiAgICAgICAgVm90ZXMgPT4gewogICAgICAgICAgICBFcXVhbHMgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIEdyZWF0ZXJUaGFuICAgICAgID0+IDEyMywKICAgICAgICAgICAgR3JlYXRlclRoYW5FcXVhbHMgPT4gMTIzLAogICAgICAgICAgICBTbWFsbGVyVGhhbiAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuRXF1YWxzID0+IDEyMywKICAgICAgICB9CgogICAgICAgICMgUmF0ZQogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbNTAsIDc1XQogICAgICAgIFJhdGUgPT4gewogICAgICAgICAgICBFcXVhbHMgICAgICAgICAgICA9PiA3NSwKICAgICAgICAgICAgR3JlYXRlclRoYW4gICAgICAgPT4gNzUsCiAgICAgICAgICAgIEdyZWF0ZXJUaGFuRXF1YWxzID0+IDc1LAogICAgICAgICAgICBTbWFsbGVyVGhhbiAgICAgICA9PiA3NSwKICAgICAgICAgICAgU21hbGxlclRoYW5FcXVhbHMgPT4gNzUsCiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBGQVEgaXRlbSBwcm9wZXJ0aWVzIChvcHRpb25hbCkKICAgICAgICBDcmVhdGVkVXNlcklEcyA9PiBbMSwgMTIsIDQ1NSwgMzJdCgogICAgICAgICMgY2hhbmdlIEZBUSBpdGVtIHByb3BlcnRpZXMgKG9wdGlvbmFsKQogICAgICAgIExhc3RDaGFuZ2VkVXNlcklEcyA9PiBbMSwgMTIsIDQ1NSwgMzJdCgogICAgICAgICMgRHluYW1pY0ZpZWxkcwogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbJ3ZhbHVlMScsICd2YWx1ZTInXQogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZE5hbWVYID0+IHsKICAgICAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBMaWtlICAgICAgICAgICAgICA9PiAndmFsdWUqJywgICAgICAgICAgICAgICAgIyAiZXF1YWxzIiBvcGVyYXRvciB3aXRoIHdpbGQtY2FyZCBzdXBwb3J0CiAgICAgICAgICAgIEdyZWF0ZXJUaGFuICAgICAgID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgR3JlYXRlclRoYW5FcXVhbHMgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBTbWFsbGVyVGhhbiAgICAgICA9PiAnMjAwMi0wMi0wMiAwMjowMjowMicsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuRXF1YWxzID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICB9CgogICAgICAgICMgRkFRIGl0ZW1zIGNyZWF0ZWQgbW9yZSB0aGFuIDYwIG1pbnV0ZXMgYWdvIChpdGVtIG9sZGVyIHRoYW4gNjAgbWludXRlcykgIChvcHRpb25hbCkKICAgICAgICBJdGVtQ3JlYXRlVGltZU9sZGVyTWludXRlcyA9PiA2MCwKICAgICAgICAjIEZBUSBpdGVtIGNyZWF0ZWQgbGVzcyB0aGFuIDEyMCBtaW51dGVzIGFnbyAoaXRlbSBuZXdlciB0aGFuIDEyMCBtaW51dGVzKSAob3B0aW9uYWwpCiAgICAgICAgSXRlbUNyZWF0ZVRpbWVOZXdlck1pbnV0ZXMgPT4gMTIwLAoKICAgICAgICAjIEZBUSBpdGVtcyB3aXRoIGNyZWF0ZSB0aW1lIGFmdGVyIC4uLiAoaXRlbSBuZXdlciB0aGFuIHRoaXMgZGF0ZSkgKG9wdGlvbmFsKQogICAgICAgIEl0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywKICAgICAgICAjIEZBUSBpdGVtcyB3aXRoIGNyZWF0ZWQgdGltZSBiZWZvcmUgLi4uIChpdGVtIG9sZGVyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLAoKICAgICAgICAjIEZBUSBpdGVtcyBjaGFuZ2VkIG1vcmUgdGhhbiA2MCBtaW51dGVzIGFnbyAob3B0aW9uYWwpCiAgICAgICAgSXRlbUNoYW5nZVRpbWVPbGRlck1pbnV0ZXMgPT4gNjAsCiAgICAgICAgIyBGQVEgaXRlbXMgY2hhbmdlZCBsZXNzIHRoYW4gMTIwIG1pbnV0ZXMgYWdvIChvcHRpb25hbCkKICAgICAgICBJdGVtQ2hhbmdlVGltZU5ld2VyTWludXRlcyA9PiAxMjAsCgogICAgICAgICMgRkFRIGl0ZW0gd2l0aCBjaGFuZ2VkIHRpbWUgYWZ0ZXIgLi4uIChpdGVtIGNoYW5nZWQgbmV3ZXIgdGhhbiB0aGlzIGRhdGUpIChvcHRpb25hbCkKICAgICAgICBJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsCiAgICAgICAgIyBGQVEgaXRlbSB3aXRoIGNoYW5nZWQgdGltZSBiZWZvcmUgLi4uIChpdGVtIGNoYW5nZWQgb2xkZXIgdGhhbiB0aGlzIGRhdGUpIChvcHRpb25hbCkKICAgICAgICBJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsCgogICAgICAgIE9yZGVyQnkgPT4gWyAnRkFRSUQnLCAnVGl0bGUnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBbICdGQVFJRCcgXSwKICAgICAgICAjIChGQVFJRCwgTnVtYmVyLCBUaXRsZSwgTGFuZ3VhZ2UsIENhdGVnb3J5LCBWYWxpZCwgQ3JlYXRlZCwKICAgICAgICAjIENoYW5nZWQsIFN0YXRlLCBWb3RlcywgUmVzdWx0KQoKICAgICAgICAjIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIE9yZGVyQnk6CiAgICAgICAgIyBUaGUgT3JkZXJCeURpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIE9yZGVyQnkgYXR0cmlidXRlLgogICAgICAgICMgVGhlIHBhaXJpbmcgaXMgbWFkZSBieSB0aGUgYXJyYXkgaW5kZXhlcy4KCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGRlZmF1bHQ6IFsgJ1VQJyBdCiAgICAgICAgIyAoRG93biB8IFVwKQoKICAgICAgICBMaW1pdCAgICAgPT4gMTUwLAoKICAgICAgICBJbnRlcmZhY2UgPT4geyAgICAgICAgICAgICAgIyAoZGVmYXVsdCBpbnRlcm5hbCkKICAgICAgICAgICAgU3RhdGVJRCA9PiAzLAogICAgICAgICAgICBOYW1lICAgID0+ICdwdWJsaWMnLCAgICAjIHB1YmxpYyB8IGV4dGVybmFsIHwgaW50ZXJuYWwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgQElEcyA9ICgKICAgICAgICAzMiwKICAgICAgICAxMywKICAgICAgICAxMiwKICAgICAgICA5LAogICAgICAgIDYsCiAgICAgICAgNSwKICAgICAgICA0LAogICAgICAgIDEsCiAgICApOwoKPWN1dAoKc3ViIEZBUVNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBpbnRlcmZhY2UKICAgIGlmICggISRQYXJhbXtJbnRlcmZhY2V9IHx8ICEkUGFyYW17SW50ZXJmYWNlfS0+e05hbWV9ICkgewogICAgICAgICRQYXJhbXtJbnRlcmZhY2V9LT57TmFtZX0gPSAnaW50ZXJuYWwnOwogICAgfQoKICAgICMgdmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXkgcmVmZXJlbmNlCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9yZGVyQnkgT3JkZXJCeURpcmVjdGlvbikpIHsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9IFtdOwoKICAgICAgICAgICAgbmV4dCBBUkdVTUVOVDsKICAgICAgICB9CgogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWZpbmUgb3JkZXIgdGFibGUKICAgIG15ICVPcmRlckJ5VGFibGUgPSAoCgogICAgICAgICMgRkFRIGl0ZW0gYXR0cmlidXRlcwogICAgICAgIEZBUUlEICAgID0+ICdpLmlkJywKICAgICAgICBOdW1iZXIgICA9PiAnaS5mX251bWJlcicsCiAgICAgICAgVGl0bGUgICAgPT4gJ2kuZl9zdWJqZWN0JywKICAgICAgICBMYW5ndWFnZSA9PiAnaS5mX2xhbmd1YWdlX2lkJywKICAgICAgICBDYXRlZ29yeSA9PiAnaS5jYXRlZ29yeV9pZCcsCiAgICAgICAgVmFsaWQgICAgPT4gJ2kudmFsaWRfaWQnLAogICAgICAgIENyZWF0ZWQgID0+ICdpLmNyZWF0ZWQnLAogICAgICAgIENoYW5nZWQgID0+ICdpLmNoYW5nZWQnLAoKICAgICAgICAjIFN0YXRlIGF0dHJpYnV0ZXMKICAgICAgICBTdGF0ZSA9PiAncy5uYW1lJywKCiAgICAgICAgIyBWb3RlIGF0dHJpYnV0ZXMKICAgICAgICBWb3RlcyAgPT4gJ3ZvdGVzJywKICAgICAgICBSZXN1bHQgPT4gJ3ZyYXRlJywKICAgICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHF1b3RlIGlkIGFycmF5IGVsZW1lbnRzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkS2V5IChxdyhMYW5ndWFnZUlEcyBDYXRlZ29yeUlEcyBWYWxpZElEcyBDcmVhdGVkVXNlcklEcyBMYXN0Q2hhbmdlZFVzZXJJRHMpKSB7CiAgICAgICAgbmV4dCBBUkdVTUVOVCBpZiAhJFBhcmFteyRLZXl9OwoKICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXskS2V5fSApICkgewoKICAgICAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBnaXZlbiBwYXJhbSAnJEtleScgaXMgaW52YWxpZCBvciBhbiBlbXB0eSBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgcXVvdGUgZWxlbWVudHMKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JEtleX0gfSApIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkREJPYmplY3QtPlF1b3RlKCAkRWxlbWVudCwgJ0ludGVnZXInICkgKSB7CgogICAgICAgICAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBnaXZlbiBwYXJhbSAnJEVsZW1lbnQnIGluICckS2V5JyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGQVFEeW5hbWljRmllbGRzID0gW107CiAgICBteSAlVmFsaWREeW5hbWljRmllbGRQYXJhbXM7CiAgICBteSAlRkFRRHluYW1pY0ZpZWxkTmFtZTJDb25maWc7CgogICAgIyBPbmx5IGZldGNoIER5bmFtaWNGaWVsZCBkYXRhIGlmIGEgZmllbGQgd2FzIHJlcXVlc3RlZCBmb3Igc2VhcmNoaW5nIG9yIHNvcnRpbmcKICAgIG15ICRQYXJhbUNoZWNrU3RyaW5nID0gKCBqb2luICcnLCBrZXlzICVQYXJhbSApIHx8ICcnOwoKICAgIGlmICggcmVmICRQYXJhbXtPcmRlckJ5fSBlcSAnQVJSQVknICkgewogICAgICAgICRQYXJhbUNoZWNrU3RyaW5nIC49ICggam9pbiAnJywgQHsgJFBhcmFte09yZGVyQnl9IH0gKTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtPcmRlckJ5fSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFBhcmFtQ2hlY2tTdHJpbmcgLj0gJFBhcmFte09yZGVyQnl9IHx8ICcnOwogICAgfQoKICAgIGlmICggJFBhcmFtQ2hlY2tTdHJpbmcgPX4gbS9EeW5hbWljRmllbGRfL3NteCApIHsKCiAgICAgICAgIyBDaGVjayBhbGwgY29uZmlndXJlZCBGQVEgZHluYW1pYyBmaWVsZHMKICAgICAgICAkRkFRRHluYW1pY0ZpZWxkcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnRkFRJywKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JEZBUUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgICAgICAkVmFsaWREeW5hbWljRmllbGRQYXJhbXN7ICJEeW5hbWljRmllbGRfIiAuICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgJEZBUUR5bmFtaWNGaWVsZE5hbWUyQ29uZmlneyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMKICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkT3JkZXJCeQogICAgICAgICAgICB8fCAoICEkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSAmJiAhJFZhbGlkRHluYW1pY0ZpZWxkUGFyYW1zeyRPcmRlckJ5fSApCiAgICAgICAgICAgIHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnkgY29udGFpbnMgaW52YWxpZCB2YWx1ZSAnJE9yZGVyQnknICIKICAgICAgICAgICAgICAgICAgICAuICdvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciB0aGUgdmFsdWUgdG8gY2hlY2sgaWYgaXQgYXBwZWFycyBtb3JlIHRoYW4gb25jZQogICAgICAgICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gPSAxOwoKICAgIH0KCiAgICAjIGNoZWNrIGlmIE9yZGVyQnlEaXJlY3Rpb24gYXJyYXkgY29udGFpbnMgb25seSAnVXAnIG9yICdEb3duJwogICAgRElSRUNUSU9OOgogICAgZm9yIG15ICREaXJlY3Rpb24gKCBAeyAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgIyBvbmx5ICdVcCcgb3IgJ0Rvd24nIGFsbG93ZWQKICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFNRTAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaS5pZCwgY291bnQoIHYuaXRlbV9pZCApIGFzIHZvdGVzLCBhdmcoIHYucmF0ZSApIGFzIHZyYXRlICcKICAgICAgICAuICdGUk9NIGZhcV9pdGVtIGkgJwogICAgICAgIC4gJ0xFRlQgSk9JTiBmYXFfdm90aW5nIHYgT04gdi5pdGVtX2lkID0gaS5pZCAnCiAgICAgICAgLiAnTEVGVCBKT0lOIGZhcV9zdGF0ZSBzIE9OIHMuaWQgPSBpLnN0YXRlX2lkJzsKCiAgICAjIGV4dGVuZGVkIFNRTAogICAgbXkgJEV4dCA9ICcnOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnIExFRlQgSk9JTiBmYXFfc2VydmljZSBzZSBPTiBzZS5pdGVtX2lkID0gaS5pZCc7CiAgICB9CgogICAgIyBmdWxsLXRleHQgc2VhcmNoCiAgICBpZiAoICRQYXJhbXtXaGF0fSAmJiAkUGFyYW17V2hhdH0gbmUgJyonICkgewoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICBteSBAV2hhdEF0dHJpYnV0ZXM7CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJFBhcmFte1doYXRBdHRyaWJ1dGVzfSkgKSB7CiAgICAgICAgICAgIEBXaGF0QXR0cmlidXRlcyA9ICRQYXJhbXtXaGF0QXR0cmlidXRlc30tPkAqOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgQFdoYXRBdHRyaWJ1dGVzID0gcXcoTnVtYmVyIFN1YmplY3QgS2V5d29yZHMgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYpOwogICAgICAgIH0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgICAgICMgZGVmaW5lIHRoZSBzZWFyY2ggZmllbGRzIGZvciBmdWxsLXRleHQgc2VhcmNoCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgIG15IEBTZWFyY2hGaWVsZHMgPSAoICdpLmZfbnVtYmVyJywgJ2kuZl9zdWJqZWN0JywgJ2kuZl9rZXl3b3JkcycgKTsKICAgICAgICBteSBAU2VhcmNoRmllbGRzOwogICAgICAgIGlmICggYW55IHsgJF8gZXEgJ051bWJlcicgfSBAV2hhdEF0dHJpYnV0ZXMgKSB7CiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgJ2kuZl9udW1iZXInOwogICAgICAgIH0KICAgICAgICBpZiAoIGFueSB7ICRfIGVxICdTdWJqZWN0JyB9IEBXaGF0QXR0cmlidXRlcyApIHsKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAnaS5mX3N1YmplY3QnOwogICAgICAgIH0KICAgICAgICBpZiAoIGFueSB7ICRfIGVxICdLZXl3b3JkJyB9IEBXaGF0QXR0cmlidXRlcyApIHsKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAnaS5mX2tleXdvcmRzJzsKICAgICAgICB9CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAjIHVzZWQgZnJvbSB0aGUgYWdlbnQgaW50ZXJmYWNlIChpbnRlcm5hbCkKICAgICAgICBpZiAoICRQYXJhbXtJbnRlcmZhY2V9LT57TmFtZX0gZXEgJ2ludGVybmFsJyApIHsKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgQUdFTlROVU1CRVI6CiAgICAgICAgICAgIGZvciBteSAkTnVtYmVyICggMSAuLiA2ICkgewogICAgICAgICAgICAgICAgbmV4dCBBR0VOVE5VTUJFUiB1bmxlc3MgYW55IHsgJF8gZXEgIkZpZWxkJE51bWJlciIgfSBAV2hhdEF0dHJpYnV0ZXM7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzdGF0ZSBvZiB0aGUgZmllbGQgKGludGVybmFsLCBleHRlcm5hbCwgcHVibGljKQogICAgICAgICAgICAgICAgbXkgJEZpZWxkU3RhdGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICdGQVE6Okl0ZW06OkZpZWxkJyAuICROdW1iZXIgKS0+e1Nob3d9OwoKICAgICAgICAgICAgICAgICMgYWRkIGFsbCBpbnRlcm5hbCwgZXh0ZXJuYWwgYW5kIHB1YmxpYyBmaWVsZHMKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRmllbGRTdGF0ZSBlcSAnaW50ZXJuYWwnCiAgICAgICAgICAgICAgICAgICAgfHwgJEZpZWxkU3RhdGUgZXEgJ2V4dGVybmFsJwogICAgICAgICAgICAgICAgICAgIHx8ICRGaWVsZFN0YXRlIGVxICdwdWJsaWMnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgJ2kuZl9maWVsZCcgLiAkTnVtYmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVzZWQgZnJvbSB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlIChleHRlcm5hbCkKICAgICAgICBlbHNpZiAoICRQYXJhbXtJbnRlcmZhY2V9LT57TmFtZX0gZXEgJ2V4dGVybmFsJyApIHsKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgQ1VTVE9NRVJOVU1CRVI6CiAgICAgICAgICAgIGZvciBteSAkTnVtYmVyICggMSAuLiA2ICkgewogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUk5VTUJFUiB1bmxlc3MgYW55IHsgJF8gZXEgIkZpZWxkJE51bWJlciIgfSBAV2hhdEF0dHJpYnV0ZXM7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzdGF0ZSBvZiB0aGUgZmllbGQgKGludGVybmFsLCBleHRlcm5hbCwgcHVibGljKQogICAgICAgICAgICAgICAgbXkgJEZpZWxkU3RhdGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICdGQVE6Okl0ZW06OkZpZWxkJyAuICROdW1iZXIgKS0+e1Nob3d9OwoKICAgICAgICAgICAgICAgICMgYWRkIGFsbCBleHRlcm5hbCBhbmQgcHVibGljIGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCAkRmllbGRTdGF0ZSBlcSAnZXh0ZXJuYWwnIHx8ICRGaWVsZFN0YXRlIGVxICdwdWJsaWMnICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgJ2kuZl9maWVsZCcgLiAkTnVtYmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVzZWQgZnJvbSB0aGUgcHVibGljIGludGVyZmFjZSAocHVibGljKQogICAgICAgIGVsc2UgewojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgIFBVQkxJQ05VTUJFUjoKICAgICAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgICAgICBuZXh0IFBVQkxJQ05VTUJFUiB1bmxlc3MgYW55IHsgJF8gZXEgIkZpZWxkJE51bWJlciIgfSBAV2hhdEF0dHJpYnV0ZXM7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzdGF0ZSBvZiB0aGUgZmllbGQgKGludGVybmFsLCBleHRlcm5hbCwgcHVibGljKQogICAgICAgICAgICAgICAgbXkgJEZpZWxkU3RhdGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICdGQVE6Okl0ZW06OkZpZWxkJyAuICROdW1iZXIgKS0+e1Nob3d9OwoKICAgICAgICAgICAgICAgICMgYWRkIGFsbCBwdWJsaWMgZmllbGRzCiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZFN0YXRlIGVxICdwdWJsaWMnICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgJ2kuZl9maWVsZCcgLiAkTnVtYmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCB0aGUgU1FMIGZvciB0aGUgZnVsbC10ZXh0IHNlYXJjaAogICAgICAgICRFeHQgLj0gJERCT2JqZWN0LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgICAgID0+IFxAU2VhcmNoRmllbGRzLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJFBhcmFte1doYXR9LAogICAgICAgICAgICBTZWFyY2hQcmVmaXggPT4gJyonLAogICAgICAgICAgICBTZWFyY2hTdWZmaXggPT4gJyonLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWFyY2ggZm9yIHRoZSBudW1iZXIKICAgIGlmICggJFBhcmFte051bWJlcn0gKSB7CiAgICAgICAgJFBhcmFte051bWJlcn0gPX4gcy9cKi8lL2c7CiAgICAgICAgJFBhcmFte051bWJlcn0gPX4gcy8lJS8lL2c7CiAgICAgICAgJFBhcmFte051bWJlcn0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17TnVtYmVyfSwgJ0xpa2UnICk7CiAgICAgICAgaWYgKCRFeHQpIHsKICAgICAgICAgICAgJEV4dCAuPSAnIEFORCAnOwogICAgICAgIH0KICAgICAgICAkRXh0IC49ICIgTE9XRVIoaS5mX251bWJlcikgTElLRSBMT1dFUignIiAuICRQYXJhbXtOdW1iZXJ9IC4gIicpICRTZWxmLT57TGlrZUVzY2FwZVN0cmluZ30iOwogICAgfQoKICAgICMgc2VhcmNoIGZvciB0aGUgdGl0bGUKICAgIGlmICggJFBhcmFte1RpdGxlfSApIHsKICAgICAgICAkUGFyYW17VGl0bGV9ID0gIlwlJFBhcmFte1RpdGxlfVwlIjsKICAgICAgICAkUGFyYW17VGl0bGV9ID1+IHMvXCovJS9nOwogICAgICAgICRQYXJhbXtUaXRsZX0gPX4gcy8lJS8lL2c7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXtUaXRsZX0sICdMaWtlJyApOwogICAgICAgIGlmICgkRXh0KSB7CiAgICAgICAgICAgICRFeHQgLj0gJyBBTkQgJzsKICAgICAgICB9CiAgICAgICAgJEV4dCAuPSAiIExPV0VSKGkuZl9zdWJqZWN0KSBMSUtFIExPV0VSKCciIC4gJFBhcmFte1RpdGxlfSAuICInKSAkU2VsZi0+e0xpa2VFc2NhcGVTdHJpbmd9IjsKICAgIH0KCiAgICAjIExpbWl0IHRoZSBzZWFyY2ggdG8ganVzdCBvbmUgKG9yIGEgbGlzdCkgRkFRSUQgKHVzZWQgYnkgdGhlIG90b2JvLWFpIHBhY2thZ2UKICAgICMgICB0byBmaWx0ZXIgZm9yIGV2ZW50cyBvbiBzaW5nbGUgRkFRIGl0ZW1zIHdpdGggdGhlIGpvYidzIEZBUSBmaWx0ZXIpLgogICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RkFRSUR9ICkgfHwgSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RkFRSUR9ICkgKSB7CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ2kuaWQnLAogICAgICAgICAgICBWYWx1ZXMgICAgPT4gcmVmICRQYXJhbXtGQVFJRH0gZXEgJ0FSUkFZJyA/ICRQYXJhbXtGQVFJRH0gOiBbICRQYXJhbXtGQVFJRH0gXSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBpZiAoJEV4dCkgewogICAgICAgICAgICAkRXh0IC49ICcgQU5EICc7CiAgICAgICAgfQogICAgICAgICRFeHQgLj0gJyAoICcgLiAkU1FMUXVlcnlJbkNvbmRpdGlvbiAuICcgKSAnOwogICAgfQoKICAgICMgc2VhcmNoIGZvciBsYW5ndWFnZXMKICAgIGlmICggJFBhcmFte0xhbmd1YWdlSURzfSAmJiByZWYgJFBhcmFte0xhbmd1YWdlSURzfSBlcSAnQVJSQVknICYmIEB7ICRQYXJhbXtMYW5ndWFnZUlEc30gfSApIHsKCiAgICAgICAgbXkgJEluU3RyaW5nID0gJFNlbGYtPl9JbkNvbmRpdGlvbkdldCgKICAgICAgICAgICAgVGFibGVDb2x1bW4gPT4gJ2kuZl9sYW5ndWFnZV9pZCcsCiAgICAgICAgICAgIElEUmVmICAgICAgID0+ICRQYXJhbXtMYW5ndWFnZUlEc30sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRFeHQpIHsKICAgICAgICAgICAgJEV4dCAuPSAnIEFORCAnOwogICAgICAgIH0KICAgICAgICAkRXh0IC49ICRJblN0cmluZzsKICAgIH0KCiAgICAjIHNlYXJjaCBmb3IgY2F0ZWdvcmllcwogICAgaWYgKCAkUGFyYW17Q2F0ZWdvcnlJRHN9ICYmIHJlZiAkUGFyYW17Q2F0ZWdvcnlJRHN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte0NhdGVnb3J5SURzfSB9ICkgewoKICAgICAgICBteSAkSW5TdHJpbmcgPSAkU2VsZi0+X0luQ29uZGl0aW9uR2V0KAogICAgICAgICAgICBUYWJsZUNvbHVtbiA9PiAnaS5jYXRlZ29yeV9pZCcsCiAgICAgICAgICAgIElEUmVmICAgICAgID0+ICRQYXJhbXtDYXRlZ29yeUlEc30sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRFeHQpIHsKICAgICAgICAgICAgJEV4dCAuPSAnIEFORCAnOwogICAgICAgIH0KICAgICAgICAkRXh0IC49ICRJblN0cmluZzsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciBWYWxpZElEcyAob25seSBzZWFyY2ggZm9yIHZhbGlkIEZBUXMpCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZElEc30gKSB7CgogICAgICAgICMgZ2V0IHRoZSB2YWxpZCBpZHMKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgJFBhcmFte1ZhbGlkSURzfSA9IFxAVmFsaWRJRHM7CiAgICB9CgogICAgIyBzZWFyY2ggZm9yIFZhbGlkSURzCiAgICBpZiAoICRQYXJhbXtWYWxpZElEc30gJiYgcmVmICRQYXJhbXtWYWxpZElEc30gZXEgJ0FSUkFZJyAmJiBAeyAkUGFyYW17VmFsaWRJRHN9IH0gKSB7CgogICAgICAgIG15ICRJblN0cmluZyA9ICRTZWxmLT5fSW5Db25kaXRpb25HZXQoCiAgICAgICAgICAgIFRhYmxlQ29sdW1uID0+ICdpLnZhbGlkX2lkJywKICAgICAgICAgICAgSURSZWYgICAgICAgPT4gJFBhcmFte1ZhbGlkSURzfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJEV4dCkgewogICAgICAgICAgICAkRXh0IC49ICcgQU5EICc7CiAgICAgICAgfQogICAgICAgICRFeHQgLj0gJEluU3RyaW5nOwogICAgfQoKICAgICMgc2VhcmNoIGZvciBzdGF0ZXMKICAgIGlmICggJFBhcmFte1N0YXRlc30gJiYgcmVmICRQYXJhbXtTdGF0ZXN9IGVxICdIQVNIJyAmJiAleyAkUGFyYW17U3RhdGVzfSB9ICkgewoKICAgICAgICBteSBAU3RhdGVzID0gbWFwIHsgJERCT2JqZWN0LT5RdW90ZSggJF8sICdJbnRlZ2VyJyApIH0ga2V5cyAleyAkUGFyYW17U3RhdGVzfSB9OwoKICAgICAgICByZXR1cm4gaWYgc2NhbGFyIEBTdGF0ZXMgIT0ga2V5cyAleyAkUGFyYW17U3RhdGVzfSB9OwoKICAgICAgICBteSAkSW5TdHJpbmcgPSAkU2VsZi0+X0luQ29uZGl0aW9uR2V0KAogICAgICAgICAgICBUYWJsZUNvbHVtbiA9PiAncy50eXBlX2lkJywKICAgICAgICAgICAgSURSZWYgICAgICAgPT4gXEBTdGF0ZXMsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRFeHQpIHsKICAgICAgICAgICAgJEV4dCAuPSAnIEFORCAnOwogICAgICAgIH0KICAgICAgICAkRXh0IC49ICRJblN0cmluZzsKICAgIH0KCiAgICAjIHNlYXJjaCBmb3Igc2VydmljZQogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgbXkgJFNRTFN0cmluZyA9ICcoIHNlLnNlcnZpY2VfaWQ9JyAuICRQYXJhbXtTZXJ2aWNlSUR9IC4gJyApJzsKCiAgICAgICAgaWYgKCRFeHQpIHsKICAgICAgICAgICAgJEV4dCAuPSAnIEFORCAnOwogICAgICAgIH0KICAgICAgICAkRXh0IC49ICRTUUxTdHJpbmc7CiAgICB9CgogICAgIyBzZWFyY2ggZm9yIGtleXdvcmRzCiAgICBpZiAoICRQYXJhbXtLZXl3b3JkfSApIHsKCiAgICAgICAgJFBhcmFte0tleXdvcmR9ID1+IHMvLC8mJi9nOwogICAgICAgICRQYXJhbXtLZXl3b3JkfSA9fiBzLzsvJiYvZzsKICAgICAgICAkUGFyYW17S2V5d29yZH0gPX4gcy8gLyYmL2c7CgogICAgICAgIGlmICgkRXh0KSB7CiAgICAgICAgICAgICRFeHQgLj0gJyBBTkQgJzsKICAgICAgICB9CgogICAgICAgICMgYWRkIHRoZSBTUUwgZm9yIHRoZSBrZXl3b3JkIHNlYXJjaAogICAgICAgICRFeHQgLj0gJERCT2JqZWN0LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgICAgID0+ICdpLmZfa2V5d29yZHMnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJFBhcmFte0tleXdvcmR9LAogICAgICAgICAgICBTZWFyY2hQcmVmaXggPT4gJyonLAogICAgICAgICAgICBTZWFyY2hTdWZmaXggPT4gJyonLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IG9ubHkgYXBwcm92ZWQgRkFRIGFydGljbGVzIGZvciBwdWJsaWMgYW5kIGN1c3RvbWVyIGludGVyZmFjZQogICAgaWYgKCAkUGFyYW17SW50ZXJmYWNlfS0+e05hbWV9IGVxICdwdWJsaWMnIHx8ICRQYXJhbXtJbnRlcmZhY2V9LT57TmFtZX0gZXEgJ2V4dGVybmFsJyApIHsKICAgICAgICBpZiAoJEV4dCkgewogICAgICAgICAgICAkRXh0IC49ICcgQU5EICc7CiAgICAgICAgfQogICAgICAgICRFeHQgLj0gJyBpLmFwcHJvdmVkID0gMSc7CiAgICB9CgogICAgIyBvdGhlcndpc2UgY2hlY2sgaWYgbmVlZCB0byBzZWFyY2ggZm9yIGFwcHJvdmVkIHN0YXR1cwogICAgZWxzaWYgKCBkZWZpbmVkICRQYXJhbXtBcHByb3ZlZH0gKSB7CiAgICAgICAgbXkgJEFwcHJvdmVkVmFsdWUgPSAkUGFyYW17QXBwcm92ZWR9ID8gMSA6IDA7CiAgICAgICAgaWYgKCRFeHQpIHsKICAgICAgICAgICAgJEV4dCAuPSAnIEFORCAnOwogICAgICAgIH0KICAgICAgICAkRXh0IC49ICIgaS5hcHByb3ZlZCA9ICRBcHByb3ZlZFZhbHVlIjsKICAgIH0KCiAgICAjIHNlYXJjaCBmb3IgY3JlYXRlIHVzZXJzCiAgICBpZiAoCiAgICAgICAgJFBhcmFte0NyZWF0ZWRVc2VySURzfQogICAgICAgICYmIHJlZiAkUGFyYW17Q3JlYXRlZFVzZXJJRHN9IGVxICdBUlJBWScKICAgICAgICAmJiBAeyAkUGFyYW17Q3JlYXRlZFVzZXJJRHN9IH0KICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRJblN0cmluZyA9ICRTZWxmLT5fSW5Db25kaXRpb25HZXQoCiAgICAgICAgICAgIFRhYmxlQ29sdW1uID0+ICdpLmNyZWF0ZWRfYnknLAogICAgICAgICAgICBJRFJlZiAgICAgICA9PiAkUGFyYW17Q3JlYXRlZFVzZXJJRHN9LAogICAgICAgICk7CgogICAgICAgIGlmICgkRXh0KSB7CiAgICAgICAgICAgICRFeHQgLj0gJyBBTkQgJzsKICAgICAgICB9CiAgICAgICAgJEV4dCAuPSAkSW5TdHJpbmc7CiAgICB9CgogICAgIyBzZWFyY2ggZm9yIGxhc3QgY2hhbmdlIHVzZXJzCiAgICBpZiAoCiAgICAgICAgJFBhcmFte0xhc3RDaGFuZ2VkVXNlcklEc30KICAgICAgICAmJiByZWYgJFBhcmFte0xhc3RDaGFuZ2VkVXNlcklEc30gZXEgJ0FSUkFZJwogICAgICAgICYmIEB7ICRQYXJhbXtMYXN0Q2hhbmdlZFVzZXJJRHN9IH0KICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRJblN0cmluZyA9ICRTZWxmLT5fSW5Db25kaXRpb25HZXQoCiAgICAgICAgICAgIFRhYmxlQ29sdW1uID0+ICdpLmNoYW5nZWRfYnknLAogICAgICAgICAgICBJRFJlZiAgICAgICA9PiAkUGFyYW17TGFzdENoYW5nZWRVc2VySURzfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJEV4dCkgewogICAgICAgICAgICAkRXh0IC49ICcgQU5EICc7CiAgICAgICAgfQogICAgICAgICRFeHQgLj0gJEluU3RyaW5nOwogICAgfQoKICAgICMgU2VhcmNoIGZvciBjcmVhdGUgYW5kIGNoYW5nZSB0aW1lcy4KICAgICMgUmVtZW1iZXIgY3VycmVudCB0aW1lIHRvIHByZXZlbnQgc2VhcmNoZXMgZm9yIGZ1dHVyZSB0aW1lc3RhbXBzLgogICAgbXkgJERhdGVUaW1lT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKTsKCiAgICAjIGdldCBGQVEgaXRlbXMgY3JlYXRlZCBvbGRlciB0aGFuIHggbWludXRlcwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtJdGVtQ3JlYXRlVGltZU9sZGVyTWludXRlc30gKSB7CiAgICAgICAgJFBhcmFte0l0ZW1DcmVhdGVUaW1lT2xkZXJNaW51dGVzfSB8fD0gMDsKCiAgICAgICAgbXkgJERhdGVUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgJERhdGVUaW1lLT5TdWJ0cmFjdCggU2Vjb25kcyA9PiAkUGFyYW17SXRlbUNyZWF0ZVRpbWVPbGRlck1pbnV0ZXN9ICogNjAgKTsKICAgICAgICAkUGFyYW17SXRlbUNyZWF0ZVRpbWVPbGRlckRhdGV9ID0gJERhdGVUaW1lLT5Ub1N0cmluZygpOwogICAgfQoKICAgICMgZ2V0IEZBUSBpdGVtcyBjcmVhdGVkIG5ld2VyIHRoYW4geCBtaW51dGVzCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0l0ZW1DcmVhdGVUaW1lTmV3ZXJNaW51dGVzfSApIHsKICAgICAgICAkUGFyYW17SXRlbUNyZWF0ZVRpbWVOZXdlck1pbnV0ZXN9IHx8PSAwOwoKICAgICAgICBteSAkRGF0ZVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAkRGF0ZVRpbWUtPlN1YnRyYWN0KCBTZWNvbmRzID0+ICRQYXJhbXtJdGVtQ3JlYXRlVGltZU5ld2VyTWludXRlc30gKiA2MCApOwogICAgICAgICRQYXJhbXtJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZX0gPSAkRGF0ZVRpbWUtPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIyBnZXQgRkFRIGl0ZW1zIGNyZWF0ZWQgb2xkZXIgdGhhbiB4eHh4LXh4LXh4IHh4Onh4IGRhdGUKICAgIG15ICRDb21wYXJlQ3JlYXRlVGltZU9sZGVyTmV3ZXJEYXRlOwogICAgaWYgKCAkUGFyYW17SXRlbUNyZWF0ZVRpbWVPbGRlckRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIHRpbWUgZm9ybWF0CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17SXRlbUNyZWF0ZVRpbWVPbGRlckRhdGV9CiAgICAgICAgICAgICF+IC9cZFxkXGRcZC0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCk6KFxkXGR8XGQpLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIGZvcm1hdCAnJFBhcmFte0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlfSchIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbXkgJFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17SXRlbUNyZWF0ZVRpbWVPbGRlckRhdGV9LAogICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwogICAgICAgIGlmICggISRUaW1lICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHRpbWUgJyIKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZX0gLiAiJyEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkQ29tcGFyZUNyZWF0ZVRpbWVPbGRlck5ld2VyRGF0ZSA9ICRUaW1lOwoKICAgICAgICAkRXh0IC49ICIgQU5EIGkuY3JlYXRlZCA8PSAnIgogICAgICAgICAgICAuICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXtJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZX0gKSAuICInIjsKICAgIH0KCiAgICAjIGdldCBJdGVtcyBjaGFuZ2VkIG5ld2VyIHRoYW4geHh4eC14eC14eCB4eDp4eCBkYXRlCiAgICBpZiAoICRQYXJhbXtJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZX0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17SXRlbUNyZWF0ZVRpbWVOZXdlckRhdGV9CiAgICAgICAgICAgICF+IC9cZFxkXGRcZC0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCk6KFxkXGR8XGQpLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIGZvcm1hdCAnJFBhcmFte0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlfSchIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbXkgJFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17SXRlbUNyZWF0ZVRpbWVOZXdlckRhdGV9LAogICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwogICAgICAgIGlmICggISRUaW1lICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHRpbWUgJyIKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZX0gLiAiJyEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBkb24ndCBleGVjdXRlIHF1ZXJpZXMgaWYgbmV3ZXIgZGF0ZSBpcyBhZnRlciBjdXJyZW50IGRhdGUKICAgICAgICByZXR1cm4gaWYgJFRpbWUgPiAkQ3VycmVudFN5c3RlbVRpbWU7CgogICAgICAgICMgZG9uJ3QgZXhlY3V0ZSBxdWVyaWVzIGlmIG9sZGVyL25ld2VyIGRhdGUgcmVzdHJpY3Rpb24gc2hvdyBub3cgdmFsaWQgdGltZSBmcmFtZQogICAgICAgIHJldHVybiBpZiAkQ29tcGFyZUNyZWF0ZVRpbWVPbGRlck5ld2VyRGF0ZSAmJiAkVGltZSA+ICRDb21wYXJlQ3JlYXRlVGltZU9sZGVyTmV3ZXJEYXRlOwoKICAgICAgICAkRXh0IC49ICIgQU5EIGkuY3JlYXRlZCA+PSAnIgogICAgICAgICAgICAuICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXtJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZX0gKSAuICInIjsKICAgIH0KCiAgICAjIGdldCBGQVEgaXRlbXMgY2hhbmdlZCBvbGRlciB0aGFuIHggbWludXRlcwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtJdGVtQ2hhbmdlVGltZU9sZGVyTWludXRlc30gKSB7CiAgICAgICAgJFBhcmFte0l0ZW1DaGFuZ2VUaW1lT2xkZXJNaW51dGVzfSB8fD0gMDsKCiAgICAgICAgbXkgJERhdGVUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgJERhdGVUaW1lLT5TdWJ0cmFjdCggU2Vjb25kcyA9PiAkUGFyYW17SXRlbUNoYW5nZVRpbWVPbGRlck1pbnV0ZXN9ICogNjAgKTsKICAgICAgICAkUGFyYW17SXRlbUNoYW5nZVRpbWVPbGRlckRhdGV9ID0gJERhdGVUaW1lLT5Ub1N0cmluZygpOwogICAgfQoKICAgICMgZ2V0IEZBUSBpdGVtcyBjaGFuZ2VkIG5ld2VyIHRoYW4geCBtaW51dGVzCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0l0ZW1DaGFuZ2VUaW1lTmV3ZXJNaW51dGVzfSApIHsKICAgICAgICAkUGFyYW17SXRlbUNoYW5nZVRpbWVOZXdlck1pbnV0ZXN9IHx8PSAwOwoKICAgICAgICBteSAkRGF0ZVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAkRGF0ZVRpbWUtPlN1YnRyYWN0KCBTZWNvbmRzID0+ICRQYXJhbXtJdGVtQ2hhbmdlVGltZU5ld2VyTWludXRlc30gKiA2MCApOwogICAgICAgICRQYXJhbXtJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZX0gPSAkRGF0ZVRpbWUtPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIyBnZXQgRkFRIGl0ZW1zIGNoYW5nZWQgb2xkZXIgdGhhbiB4eHh4LXh4LXh4IHh4Onh4IGRhdGUKICAgIG15ICRDb21wYXJlQ2hhbmdlVGltZU9sZGVyTmV3ZXJEYXRlOwogICAgaWYgKCAkUGFyYW17SXRlbUNoYW5nZVRpbWVPbGRlckRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIHRpbWUgZm9ybWF0CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17SXRlbUNoYW5nZVRpbWVPbGRlckRhdGV9CiAgICAgICAgICAgICF+IC9cZFxkXGRcZC0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCk6KFxkXGR8XGQpLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIGZvcm1hdCAnJFBhcmFte0l0ZW1DaGFuZ2VUaW1lT2xkZXJEYXRlfSchIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbXkgJFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17SXRlbUNoYW5nZVRpbWVPbGRlckRhdGV9LAogICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwogICAgICAgIGlmICggISRUaW1lICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHRpbWUgJyIKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZX0gLiAiJyEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkQ29tcGFyZUNoYW5nZVRpbWVPbGRlck5ld2VyRGF0ZSA9ICRUaW1lOwoKICAgICAgICAkRXh0IC49ICIgQU5EIGkuY2hhbmdlZCA8PSAnIgogICAgICAgICAgICAuICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXtJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZX0gKSAuICInIjsKICAgIH0KCiAgICAjIGdldCBJdGVtcyBjaGFuZ2VkIG5ld2VyIHRoYW4geHh4eC14eC14eCB4eDp4eCBkYXRlCiAgICBpZiAoICRQYXJhbXtJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZX0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17SXRlbUNoYW5nZVRpbWVOZXdlckRhdGV9CiAgICAgICAgICAgICF+IC9cZFxkXGRcZC0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCk6KFxkXGR8XGQpLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIGZvcm1hdCAnJFBhcmFte0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlfSchIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbXkgJFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17SXRlbUNoYW5nZVRpbWVOZXdlckRhdGV9LAogICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwogICAgICAgIGlmICggISRUaW1lICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHRpbWUgJyIKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZX0gLiAiJyEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBkb24ndCBleGVjdXRlIHF1ZXJpZXMgaWYgbmV3ZXIgZGF0ZSBpcyBhZnRlciBjdXJyZW50IGRhdGUKICAgICAgICByZXR1cm4gaWYgJFRpbWUgPiAkQ3VycmVudFN5c3RlbVRpbWU7CgogICAgICAgICMgZG9uJ3QgZXhlY3V0ZSBxdWVyaWVzIGlmIG9sZGVyL25ld2VyIGRhdGUgcmVzdHJpY3Rpb24gc2hvdyBub3cgdmFsaWQgdGltZSBmcmFtZQogICAgICAgIHJldHVybiBpZiAkQ29tcGFyZUNoYW5nZVRpbWVPbGRlck5ld2VyRGF0ZSAmJiAkVGltZSA+ICRDb21wYXJlQ2hhbmdlVGltZU9sZGVyTmV3ZXJEYXRlOwoKICAgICAgICAkRXh0IC49ICIgQU5EIGkuY2hhbmdlZCA+PSAnIgogICAgICAgICAgICAuICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXtJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZX0gKSAuICInIjsKICAgIH0KCiAgICAjIGFkZCBXSEVSRSBzdGF0ZW1lbnQKICAgIGlmICgkRXh0KSB7CiAgICAgICAgJEV4dCA9ICcgV0hFUkUgJyAuICRFeHQ7CiAgICB9CgogICAgIyBSZW1lbWJlciBhbHJlYWR5IGpvaW5lZCB0YWJsZXMgZm9yIHNvcnRpbmcuCiAgICBteSAlRHluYW1pY0ZpZWxkSm9pblRhYmxlczsKICAgIG15ICREeW5hbWljRmllbGRKb2luQ291bnRlciA9IDE7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrLWVuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIERZTkFNSUNfRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JEZBUUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIG15ICRTZWFyY2hQYXJhbSA9ICRQYXJhbXsgIkR5bmFtaWNGaWVsZF8iIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH07CgogICAgICAgIG5leHQgRFlOQU1JQ19GSUVMRCBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IERZTkFNSUNfRklFTEQgaWYgKCByZWYgJFNlYXJjaFBhcmFtIG5lICdIQVNIJyApOwoKICAgICAgICBteSAkTmVlZEpvaW47CgogICAgICAgIGZvciBteSAkT3BlcmF0b3IgKCBzb3J0IGtleXMgJXskU2VhcmNoUGFyYW19ICkgewoKICAgICAgICAgICAgbXkgQFNlYXJjaFBhcmFtcyA9ICggcmVmICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gZXEgJ0FSUkFZJyApCiAgICAgICAgICAgICAgICA/IEB7ICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gfQogICAgICAgICAgICAgICAgOiAoICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gKTsKCiAgICAgICAgICAgIG15ICRTUUxFeHRTdWIgPSAnIEFORCAoJzsKICAgICAgICAgICAgbXkgJENvdW50ZXIgICA9IDA7CiAgICAgICAgICAgIFRFWFQ6CiAgICAgICAgICAgIGZvciBteSAkVGV4dCAoQFNlYXJjaFBhcmFtcykgewogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICggIWRlZmluZWQgJFRleHQgfHwgJFRleHQgZXEgJycgKTsKCiAgICAgICAgICAgICAgICAkVGV4dCA9fiBzL1wqLyUvZ2k7CgogICAgICAgICAgICAgICAgIyBjaGVjayBzZWFyY2ggYXR0cmlidXRlLCB3ZSBkbyBub3QgbmVlZCB0byBzZWFyY2ggZm9yICoKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAkVGV4dCA9fiAvXlwlezEsM30kLzsKCiAgICAgICAgICAgICAgICAjIHZhbGlkYXRlIGRhdGEgdHlwZQogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbGlkYXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHZhbHVlICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRUZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICInIG9uIGZpZWxkICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGQtPntOYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRXh0U3ViIC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTUUxFeHRTdWIgLj0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlNlYXJjaFNRTEdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBUYWJsZUFsaWFzICAgICAgICAgPT4gImRmdiREeW5hbWljRmllbGRKb2luQ291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgICAgICAgICAgID0+ICRPcGVyYXRvciwKICAgICAgICAgICAgICAgICAgICBTZWFyY2hUZXJtICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNRTEV4dFN1YiAuPSAnKSc7CiAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgJEV4dCAuPSAkU1FMRXh0U3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewoKICAgICAgICAgICAgIyBKb2luIHRoZSB0YWJsZSBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgICRTUUwgLj0gIiBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICBPTiAoaS5pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICBBTkQgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLmZpZWxkX2lkID0gIiAuCiAgICAgICAgICAgICAgICAkREJPYmplY3QtPlF1b3RlKCAkRHluYW1pY0ZpZWxkLT57SUR9LCAnSW50ZWdlcicgKSAuICIpICI7CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSm9pblRhYmxlc3sgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIjsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRKb2luQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBHUk9VUCBCWQogICAgJEV4dAogICAgICAgIC49ICcgR1JPVVAgQlkgaS5pZCwgaS5mX3N1YmplY3QsIGkuZl9sYW5ndWFnZV9pZCwgaS5jcmVhdGVkLCBpLmNoYW5nZWQsIHMubmFtZSwgdi5pdGVtX2lkICc7CgogICAgIyBhZGQgSEFWSU5HIGNsYXVzZSAoIFZvdGVzIGFuZCBSYXRlIGFyZSBhZ2dyZWdhdGVkIGNvbHVtbnMsIHRoZXkgY2FuJ3QgYmUgaW4gdGhlIFdIRVJFIGNsYXVzZSkKICAgICMgZGVmaW5lZCB2b3RpbmcgcGFyYW1ldGVycyAoZm9yIFZvdGVzIGFuZCBSYXRlKQogICAgbXkgJVZvdGluZ09wZXJhdG9ycyA9ICgKICAgICAgICBFcXVhbHMgICAgICAgICAgICA9PiAnPScsCiAgICAgICAgR3JlYXRlclRoYW4gICAgICAgPT4gJz4nLAogICAgICAgIEdyZWF0ZXJUaGFuRXF1YWxzID0+ICc+PScsCiAgICAgICAgU21hbGxlclRoYW4gICAgICAgPT4gJzwnLAogICAgICAgIFNtYWxsZXJUaGFuRXF1YWxzID0+ICc8PScsCiAgICApOwoKICAgIG15ICRIYXZpbmdQcmludDsKICAgIG15ICRBZGRlZENvbmRpdGlvbjsKCiAgICBIQVZJTkdfUEFSQU06CiAgICBmb3IgbXkgJEhhdmluZ1BhcmFtIChxdyhWb3RlcyBSYXRlKSkgewogICAgICAgIG15ICRTZWFyY2hQYXJhbSA9ICRQYXJhbXskSGF2aW5nUGFyYW19OwoKICAgICAgICBuZXh0IEhBVklOR19QQVJBTSBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IEhBVklOR19QQVJBTSBpZiAoIHJlZiAkU2VhcmNoUGFyYW0gbmUgJ0hBU0gnICk7CgogICAgICAgIE9QRVJBVE9SOgogICAgICAgIGZvciBteSAkT3BlcmF0b3IgKCBzb3J0IGtleXMgJXskU2VhcmNoUGFyYW19ICkgewoKICAgICAgICAgICAgbmV4dCBPUEVSQVRPUiBpZiAhKCAkVm90aW5nT3BlcmF0b3JzeyRPcGVyYXRvcn0gKTsKCiAgICAgICAgICAgICMgcHJpbnQgSEFWSU5HIGNsYXVzZSBqdXN0IG9uY2UgaWYgYW5kIGp1c3QgaWYgdGhlIG9wZXJhdG9yIGlzIHZhbGlkCiAgICAgICAgICAgIGlmICggISRIYXZpbmdQcmludCApIHsKICAgICAgICAgICAgICAgICRFeHQgLj0gJyBIQVZJTkcgJzsKICAgICAgICAgICAgICAgICRIYXZpbmdQcmludCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTUUxFeHRTdWI7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIEFORCBvbiB0aGUgZmlyc3QgY29uZGl0aW9uCiAgICAgICAgICAgIGlmICgkQWRkZWRDb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICRTUUxFeHRTdWIgLj0gJyBBTkQgKCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRXh0U3ViIC49ICcgKCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBURVhUOgogICAgICAgICAgICBmb3IgbXkgJFRleHQgKEBTZWFyY2hQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0IGVxICcnICk7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAqCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgJFNRTEV4dFN1YiAuPSAnIE9SICcgaWYgKCRDb3VudGVyKTsKCiAgICAgICAgICAgICAgICAjIGRlZmluZSBhZ2dyZWdhdGlvbiBjb2x1bW4KICAgICAgICAgICAgICAgIG15ICRBZ2dyZWdhdGVDb2x1bW4gPSAnY291bnQoIHYuaXRlbV9pZCApJzsKICAgICAgICAgICAgICAgIGlmICggJEhhdmluZ1BhcmFtIGVxICdSYXRlJyApIHsKICAgICAgICAgICAgICAgICAgICAkQWdncmVnYXRlQ29sdW1uID0gJ2F2Zyggdi5yYXRlICknOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2V0IGNvbmRpdGlvbgogICAgICAgICAgICAgICAgJFNRTEV4dFN1YiAuPSAiICRBZ2dyZWdhdGVDb2x1bW4gJFZvdGluZ09wZXJhdG9yc3skT3BlcmF0b3J9ICI7CiAgICAgICAgICAgICAgICAkU1FMRXh0U3ViIC49ICREQk9iamVjdC0+UXVvdGUoICRUZXh0LCAnTnVtYmVyJyApIC4gIiAiOwoKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2xvc2UgY29uZGl0aW9uCiAgICAgICAgICAgICRTUUxFeHRTdWIgLj0gJykgJzsKCiAgICAgICAgICAgICMgYWRkIGNvbmRpdGlvbiB0byB0aGUgZmluYWwgU1FMIHN0YXRlbWVudAogICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICRFeHQgLj0gJFNRTEV4dFN1YjsKICAgICAgICAgICAgICAgICRBZGRlZENvbmRpdGlvbiA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkYXRhYmFzZSBxdWVyeSBmb3Igc29ydC9vcmRlciBieSBvcHRpb24KICAgIG15ICRFeHRPcmRlckJ5ID0gJyBPUkRFUiBCWSc7CiAgICBmb3IgbXkgJENvdW50ICggMCAuLiAkI3sgJFBhcmFte09yZGVyQnl9IH0gKSB7CiAgICAgICAgaWYgKCAkQ291bnQgPiAwICkgewogICAgICAgICAgICAkRXh0T3JkZXJCeSAuPSAnLCc7CiAgICAgICAgfQoKICAgICAgICAjIHNvcnQgYnkgZHluYW1pYyBmaWVsZAogICAgICAgIGlmICggJFZhbGlkRHluYW1pY0ZpZWxkUGFyYW1zeyAkUGFyYW17T3JkZXJCeX0tPlskQ291bnRdIH0gKSB7CiAgICAgICAgICAgIG15ICgkRHluYW1pY0ZpZWxkTmFtZSkgPSAkUGFyYW17T3JkZXJCeX0tPlskQ291bnRdID1+IG0vXkR5bmFtaWNGaWVsZF8oLiopJC9zbXg7CgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJEZBUUR5bmFtaWNGaWVsZE5hbWUyQ29uZmlneyREeW5hbWljRmllbGROYW1lfTsKCiAgICAgICAgICAgICMgSWYgdGhlIHRhYmxlIHdhcyBhbHJlYWR5IGpvaW5lZCBmb3Igc2VhcmNoaW5nLCB3ZSByZXVzZSBpdC4KICAgICAgICAgICAgaWYgKCAhJER5bmFtaWNGaWVsZEpvaW5UYWJsZXN7JER5bmFtaWNGaWVsZE5hbWV9ICkgewoKICAgICAgICAgICAgICAgICMgSm9pbiB0aGUgdGFibGUgZm9yIHRoaXMgZHluYW1pYyBmaWVsZDsgdXNlIGEgbGVmdCBvdXRlciBqb2luIGluIHRoaXMgY2FzZS4KICAgICAgICAgICAgICAgICMgV2l0aCBhbiBJTk5FUiBKT0lOIHdlJ2QgbGltaXQgdGhlIHJlc3VsdCBzZXQgdG8gdGlja2V0cyB3aGljaCBoYXZlIGFuIGVudHJ5CiAgICAgICAgICAgICAgICAjICAgZm9yIHRoZSBERiB3aGljaCBpcyB1c2VkIGZvciBzb3J0aW5nLgogICAgICAgICAgICAgICAgJFNRTAogICAgICAgICAgICAgICAgICAgIC49ICIgTEVGVCBPVVRFUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGkuaWQgPSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIub2JqZWN0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIuZmllbGRfaWQgPSAiIC4KICAgICAgICAgICAgICAgICAgICAkREJPYmplY3QtPlF1b3RlKCAkRHluYW1pY0ZpZWxkLT57SUR9LCAnSW50ZWdlcicgKSAuICIpICI7CgogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5UYWJsZXN7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gImRmdiREeW5hbWljRmllbGRKb2luQ291bnRlciI7CgogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTUUxPcmRlckZpZWxkID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlNlYXJjaFNRTE9yZGVyRmllbGRHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkSm9pblRhYmxlc3skRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFeHQgICAgICAgIC49ICIsICRTUUxPcmRlckZpZWxkICI7CiAgICAgICAgICAgICRFeHRPcmRlckJ5IC49ICIgJFNRTE9yZGVyRmllbGQgIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIFJlZ3VsYXIgc29ydC4KICAgICAgICAgICAgJEV4dE9yZGVyQnkgLj0gJyAnIC4gJE9yZGVyQnlUYWJsZXsgJFBhcmFte09yZGVyQnl9LT5bJENvdW50XSB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICRFeHRPcmRlckJ5IC49ICcgQVNDJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFeHRPcmRlckJ5IC49ICcgREVTQyc7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBvcmRlcmluZyBpcyBub3QgZGV0ZXJtaW5lZAogICAgIyB3ZSBhZGQgYW4gZGVzY2VuZGluZyBvcmRlcmluZyBieSBpZAogICAgaWYgKCAhZ3JlcCB7ICRfIGVxICdGQVFJRCcgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgaWYgKCAkI3sgJFBhcmFte09yZGVyQnl9IH0gPj0gMCApIHsKICAgICAgICAgICAgJEV4dE9yZGVyQnkgLj0gJywnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVmYXVsdCBvcmRlciBieSBkaXJlY3Rpb24KICAgICAgICBteSAkT3JkZXJCeURpcmVjdGlvbiA9ICdBU0MnOwoKICAgICAgICAjIHRyeSB0byBnZXQgdGhlIG9yZGVyIGJ5IGRpcmVjdGlvbiBvZiB0aGUgbGFzdAogICAgICAgICMgdXNlZCAnQ3JlYXRlZCcgb3IgJ0NoYW5nZWQnIE9yZGVyQnkgcGFyYW1ldGVycwogICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CiAgICAgICAgICAgIGlmICggJE9yZGVyQnkgZXEgJ0NyZWF0ZWQnIHx8ICRPcmRlckJ5IGVxICdDaGFuZ2VkJyApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ1VwJyApIHsKICAgICAgICAgICAgICAgICAgICAkT3JkZXJCeURpcmVjdGlvbiA9ICdBU0MnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE9yZGVyQnlEaXJlY3Rpb24gPSAnREVTQyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAkRXh0T3JkZXJCeSAuPSAnICcgLiAkT3JkZXJCeVRhYmxle0ZBUUlEfSAuICcgJyAuICRPcmRlckJ5RGlyZWN0aW9uOwogICAgfQoKICAgICMgYWRkIGV4dGVuZGVkIFNRTAogICAgJFNRTCAuPSAkRXh0IC4gJEV4dE9yZGVyQnk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCA1MDAsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBATGlzdDsKfQoKPWhlYWQxIFBSSVZBVEUgRlVOQ1RJT05TCgo9aGVhZDIgX0luQ29uZGl0aW9uR2V0KCkKCmludGVybmFsIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbgoKICAgIHRhYmxlLmNvbHVtbiBJTiAodmFsdWVzKQoKY29uZGl0aW9uIHN0cmluZyBmcm9tIGFuIGFycmF5LgoKICAgIG15ICRTUUxQYXJ0ID0gJFRpY2tldE9iamVjdC0+X0luQ29uZGl0aW9uR2V0KAogICAgICAgIFRhYmxlQ29sdW1uID0+ICd0YWJsZS5jb2x1bW4nLAogICAgICAgIElEUmVmICAgICAgID0+ICRBcnJheVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX0luQ29uZGl0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1RhYmxlQ29sdW1ufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVGFibGVDb2x1bW4hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtJRFJlZn0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgSURSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNvcnQgaWRzIHRvIGNhY2hlIHRoZSBTUUwgcXVlcnkKICAgIG15IEBTb3J0ZWRJRHMgPSBzb3J0IHsgJGEgPD0+ICRiIH0gQHsgJFBhcmFte0lEUmVmfSB9OwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBFcnJvciBvdXQgaWYgc29tZSB2YWx1ZXMgd2VyZSBub3QgaW50ZWdlcnMuCiAgICBAU29ydGVkSURzID0gbWFwIHsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkXywgJ0ludGVnZXInICkgfSBAU29ydGVkSURzOwogICAgcmV0dXJuIGlmIHNjYWxhciBAU29ydGVkSURzICE9IHNjYWxhciBAeyAkUGFyYW17SURSZWZ9IH07CgogICAgIyBzcGxpdCBJTiBzdGF0ZW1lbnQgd2l0aCBtb3JlIHRoYW4gOTAwIGVsZW1lbnRzIGluIG1vcmUgc3RhdGVtZW50cyBjb21iaW5lZCB3aXRoIE9SCiAgICAjIGJlY2F1c2UgT3JhY2xlIGRvZXNuJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gMTAwMCBlbGVtZW50cyBpbiBvbmUgSU4gc3RhdGVtZW50LgogICAgbXkgQFNRTFN0cmluZ3M7CiAgICBMT09QOgogICAgd2hpbGUgKCBzY2FsYXIgQFNvcnRlZElEcyApIHsKCiAgICAgICAgbXkgQFNvcnRlZElEc1BhcnQgPSBzcGxpY2UgQFNvcnRlZElEcywgMCwgOTAwOwoKICAgICAgICBteSAkSURTdHJpbmcgPSBqb2luICcsICcsIEBTb3J0ZWRJRHNQYXJ0OwoKICAgICAgICBwdXNoIEBTUUxTdHJpbmdzLCAiICRQYXJhbXtUYWJsZUNvbHVtbn0gSU4gKCRJRFN0cmluZykgIjsKICAgIH0KCiAgICBteSAkU1FMID0gam9pbiAnIE9SICcsIEBTUUxTdHJpbmdzOwogICAgJFNRTCA9ICcgKCAnIC4gJFNRTCAuICcgKSAnOwoKICAgIHJldHVybiAkU1FMOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UT0JPIHByb2plY3QgKEw8aHR0cHM6Ly9vdG9iby5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentFAQAdd.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudEZBUUFkZC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRGQVFBZGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdC4KICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBHZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZS4KICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiRkFROjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259IikgfHwgJyc7CgogICAgIyBHZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbi4KICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gJ0ZBUScsCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0ge307CgogICAgIyBjcmVhdGUgZHluYW1pYyBmaWVsZCBoYXNoIGFuZCBkZWZpbml0aW9uCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICREeW5hbWljRmllbGRMaXN0IC8vIFtdIH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBwdXNoICRTZWxmLT57TWFza0RlZmluaXRpb259LT5AKiwgewogICAgICAgICAgICBERiAgICAgICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBNYW5kYXRvcnkgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiA/IDEgOiAwLAogICAgICAgIH07CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiApIHsKICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e01hbmRhdG9yeX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRDb25maWc7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIFBlcm1pc3Npb24gY2hlY2suCiAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1J3fSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IG5lZWQgcncgcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIEdldCBwYXJhbWV0ZXJzIGZyb20gd2ViIHJlcXVlc3QuCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgIHF3KFRpdGxlIENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFZhbGlkSUQgS2V5d29yZHMgQXBwcm92ZWQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYpCiAgICAgICAgcXcoVGl0bGUgQ2F0ZWdvcnlJRCBTdGF0ZUlEIExhbmd1YWdlSUQgVmFsaWRJRCBLZXl3b3JkcyBBcHByb3ZlZCBGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNiBJY29uKQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgfQoKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgIyBHZXQgY2F0ZWdvcmllcyAod2l0aCBjYXRlZ29yeSBsb25nIG5hbWVzKSB3aGVyZSB1c2VyIGhhcyByaWdodHMuCiAgICBteSAkVXNlckNhdGVnb3JpZXNMb25nTmFtZXMgPSAkRkFRT2JqZWN0LT5HZXRVc2VyQ2F0ZWdvcmllc0xvbmdOYW1lcygKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIENoZWNrIHRoYXQgdGhlcmUgYXJlIGNhdGVnb3JpZXMgYXZhaWxhYmxlIGZvciB0aGlzIHVzZXIuCiAgICBpZiAoCiAgICAgICAgISRVc2VyQ2F0ZWdvcmllc0xvbmdOYW1lcwogICAgICAgIHx8IHJlZiAkVXNlckNhdGVnb3JpZXNMb25nTmFtZXMgbmUgJ0hBU0gnCiAgICAgICAgfHwgISV7JFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzfQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBjYXRlZ29yaWVzIGZvdW5kIHdoZXJlIHVzZXIgaGFzIHJlYWQvd3JpdGUgcGVybWlzc2lvbnMhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvcm0gaHR0cCByZXF1ZXN0LgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgRXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdC4KICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAjIGdldCBmb3JtIGlkCiAgICBteSAkRm9ybUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPlByZXBhcmVGb3JtSUQoCiAgICAgICAgUGFyYW1PYmplY3QgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzZXQgY29udGVudCB0eXBlCiAgICBteSAkQ29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICYmICRDb25maWdPYmplY3QtPkdldCgnRkFROjpJdGVtOjpIVE1MJykgKSB7CiAgICAgICAgJENvbnRlbnRUeXBlID0gJ3RleHQvaHRtbCc7CiAgICB9CgogICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBTaG93IHRoZSBGQVEgYWRkIHNjcmVlbi4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFJlcXVpcmVkJykgKSB7CgogICAgICAgICAgICAjIEdldCBBcHByb3ZhbCBxdWV1ZSBuYW1lLgogICAgICAgICAgICBteSAkQXBwcm92YWxRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFF1ZXVlJykgfHwgJyc7CgogICAgICAgICAgICAjIENoZWNrIGlmIEFwcHJvdmFsIHF1ZXVlIGV4aXN0cy4KICAgICAgICAgICAgbXkgJEFwcHJvdmFsUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkQXBwcm92YWxRdWV1ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2hvdyBub3RpZmljYXRpb24gaWYgQXBwcm92YWwgcXVldWUgZG9lcyBub3QgZXhpc3RzLgogICAgICAgICAgICBpZiAoICEkQXBwcm92YWxRdWV1ZUlEICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICBJbmZvICAgICA9PiAiRkFRIEFwcHJvdmFsIGlzIGVuYWJsZWQgYnV0IHF1ZXVlICckQXBwcm92YWxRdWV1ZScgZG9lcyBub3QgZXhpc3RzIiwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZG1pblN5c3RlbUNvbmZpZ3VyYXRpb247U3ViYWN0aW9uPVZpZXdDdXN0b21Hcm91cDtOYW1lcz1GQVE6OkFwcHJvdmFsUXVldWUnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgID0+ICRGb3JtSUQsCiAgICAgICAgICAgIFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzID0+ICRVc2VyQ2F0ZWdvcmllc0xvbmdOYW1lcywKICAgICAgICAgICAgRHluYW1pY0ZpZWxkICAgICAgICAgICAgPT4gXCVEeW5hbWljRmllbGRWYWx1ZXMsCgogICAgICAgICAgICAjIExhc3Qgdmlld2VkIGNhdGVnb3J5IGZyb20gc2Vzc2lvbiAod3JpdHRlbiBieSBGQVEgZXhwbG9yZXIpLgogICAgICAgICAgICBDYXRlZ29yeUlEICA9PiAkU2VsZi0+e1Nlc3Npb259e0xhc3RWaWV3ZWRDYXRlZ29yeX0sCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICApOwoKICAgICAgICAjIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgU2F2ZSB0aGUgRkFRLgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIENoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uLgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBteSAlRXJyb3I7CiAgICAgICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KFRpdGxlIENhdGVnb3J5SUQpKSB7CgogICAgICAgICAgICAjIElmIHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBnaXZlbiwgYWRkIHNlcnZlciBlcnJvciBjbGFzcy4KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyRQYXJhbU5hbWV9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1OYW1lIC4gJ1NlcnZlckVycm9yJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6U2VydmljZScpICkgewogICAgICAgICAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgICAgICAgICAjIGdldCBhbGwgc2VydmljZXMKICAgICAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICBLZWVwQ2hpbGRyZW4gPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OktlZXBDaGlsZHJlbicpIC8vIDAsCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAU2VydmljZUlEczsKICAgICAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAnU2VydmljZUlEJyApICkgewogICAgICAgICAgICAgICAgQFNlcnZpY2VJRHMgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAnU2VydmljZUlEJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICAgPSBcQFNlcnZpY2VJRHM7CiAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlTGlzdH0gPSBcJVNlcnZpY2VMaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0cwogICAgICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZC4KICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gICAgICAgICAgICAgICAgICAgICAgICA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2VuZCBzZXJ2ZXIgZXJyb3IgaWYgYW55IHJlcXVpcmVkIHBhcmFtZXRlciBpcyBtaXNzaW5nLgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgR2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEuCiAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFJlcXVpcmVkJykgKSB7CgogICAgICAgICAgICAgICAgbXkgJEFwcHJvdmFsUXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgQXBwcm92YWwgcXVldWUgZXhpc3RzLgogICAgICAgICAgICAgICAgbXkgJEFwcHJvdmFsUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gJEFwcHJvdmFsUXVldWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2hvdyBub3RpZmljYXRpb24gaWYgQXBwcm92YWwgcXVldWUgZG9lcyBub3QgZXhpc3RzLgogICAgICAgICAgICAgICAgaWYgKCAhJEFwcHJvdmFsUXVldWVJRCApIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGQVEgQXBwcm92YWwgaXMgZW5hYmxlZCBidXQgcXVldWUgJyRBcHByb3ZhbFF1ZXVlJyBkb2VzIG5vdCBleGlzdHMiLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZG1pblN5c3RlbUNvbmZpZ3VyYXRpb247U3ViYWN0aW9uPVZpZXdDdXN0b21Hcm91cDtOYW1lcz1GQVE6OkFwcHJvdmFsUXVldWUnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICAgICAgVXNlckNhdGVnb3JpZXNMb25nTmFtZXMgPT4gJFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzLAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICA9PiAkRm9ybUlELAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IFwlRHluYW1pY0ZpZWxkVmFsdWVzLAogICAgICAgICAgICAgICAgREZFcnJvcnMgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIEFkZCB0aGUgbmV3IEZBUSBpdGVtLgogICAgICAgIG15ICRJdGVtSUQgPSAkRkFRT2JqZWN0LT5GQVFBZGQoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTaG93IGVycm9yIGlmIEZBUSBpdGVtIGNvdWxkIG5vdCBiZSBhZGRlZC4KICAgICAgICBpZiAoICEkSXRlbUlEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGFsbCBhdHRhY2htZW50cyBmcm9tIHVwbG9hZCBjYWNoZS4KICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBXcml0ZSBhdHRhY2htZW50cwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICMgQ2hlY2sgaWYgYXR0YWNobWVudCBpcyBhbiBpbmxpbmUgYXR0YWNobWVudC4KICAgICAgICAgICAgbXkgJElubGluZSA9IDA7CiAgICAgICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICkgewoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgdGhhdCBpdCBpcyBpbmxpbmUuCiAgICAgICAgICAgICAgICAkSW5saW5lID0gMTsKCiAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIGlmIHRoaXMgaW5saW5lIGF0dGFjaG1lbnQgaXMgdXNlZCBpbiBhbnkgRkFRIGFydGljbGUuCiAgICAgICAgICAgICAgICBteSAkQ29udGVudElERm91bmQ7CgogICAgICAgICAgICAgICAgIyBDaGVjayBhbGwgZmllbGRzIGZvciBjb250ZW50LWlkLgogICAgICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gNiApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJEZpZWxkID0gJEdldFBhcmFteyAnRmllbGQnIC4gJE51bWJlciB9OwoKICAgICAgICAgICAgICAgICAgICAjIFNraXAgZW1wdHkgZmllbGRzLgogICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIGZpZWxkcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBjb250ZW50LWlkLgogICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkICF+IG17ICRBdHRhY2htZW50LT57Q29udGVudElEfSB9eG1zOwoKICAgICAgICAgICAgICAgICAgICAkQ29udGVudElERm91bmQgPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgRklFTEQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBXZSBkbyBub3Qgd2FudCB0byBrZWVwIHRoaXMgYXR0YWNobWVudCwgYmVjYXVzZSBpdCB3YXMgZGVsZXRlZCBpbiB0aGUgcmljaC10ZXh0IGVkaXRvcgogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkQ29udGVudElERm91bmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGaWxlSUQgPSAkRkFRT2JqZWN0LT5BdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgIElubGluZSA9PiAkSW5saW5lLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEZpbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJElubGluZTsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fTsKCiAgICAgICAgICAgICMgUmV3cml0ZSB0aGUgVVJMcyBvZiB0aGUgaW5saW5lIGltYWdlcyBmb3IgdGhlIHVwbG9hZGVkIHBpY3R1cmVzLgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUUlubGluZUF0dGFjaG1lbnRVUkxVcGRhdGUoCiAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+ICRBdHRhY2htZW50LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICA9PiAkRm9ybUlELAogICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgRmlsZUlEICAgICA9PiAkRmlsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHVwZGF0ZSB0aGUgaW5saW5lIGltYWdlIFVSTHMgZm9yIEZBUSBJdGVtIyAnJEl0ZW1JRCchIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIGFsbCBmb3JtIGRhdGEKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJEZvcm1JRCApOwoKICAgICAgICAjIFNldCBkeW5hbWljIGZpZWxkcy4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUmVkaXJlY3QgdG8gRkFRIHpvb20uCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAnQWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9JyAuICRJdGVtSUQgKTsKICAgIH0KfQoKc3ViIF9NYXNrTmV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBHZXQgbGlzdCB0eXBlLgogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgR2V0IHZhbGlkIGxpc3QuCiAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgIG15ICVEYXRhOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBCdWlsZCB2YWxpZCBzZWxlY3Rpb24uCiAgICAkRGF0YXtWYWxpZE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIFNldCBubyBzZXJ2ZXIgZXJyb3IgY2xhc3MgYXMgZGVmYXVsdC4KICAgICRQYXJhbXtDYXRlZ29yeUlEU2VydmVyRXJyb3J9IHx8PSAnJzsKCiAgICAjIEJ1aWxkIGNhdGVnb3J5IHNlbGVjdGlvbi4KICAgICREYXRhe0NhdGVnb3J5T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VXNlckNhdGVnb3JpZXNMb25nTmFtZXN9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gJFBhcmFte0NhdGVnb3J5SURTZXJ2ZXJFcnJvcn0sCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgVHJlZVZpZXcgICAgID0+IDEsCiAgICApOwoKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgbXkgJUxhbmd1YWdlcyA9ICRGQVFPYmplY3QtPkxhbmd1YWdlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIEdldCB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UuCiAgICBteSAkU2VsZWN0ZWRMYW5ndWFnZTsKICAgIGlmICggJFBhcmFte0xhbmd1YWdlSUR9ICYmICRMYW5ndWFnZXN7ICRQYXJhbXtMYW5ndWFnZUlEfSB9ICkgewoKICAgICAgICAjIEdldCBsYW5ndWFnZSBmcm9tIGdpdmVuIExhbmd1YWdlSUQuCiAgICAgICAgJFNlbGVjdGVkTGFuZ3VhZ2UgPSAkTGFuZ3VhZ2VzeyAkUGFyYW17TGFuZ3VhZ2VJRH0gfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIFVzZSB0aGUgdXNlciBsYW5ndWFnZSwgb3IgaWYgbm90IGZvdW5kICdlbicKICAgICAgICAkU2VsZWN0ZWRMYW5ndWFnZSA9ICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9IHx8ICdlbic7CgogICAgICAgICMgR2V0IHVzZXIgTGFuZ3VhZ2VJRAogICAgICAgIG15ICRTZWxlY3RlZExhbmd1YWdlSUQgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkU2VsZWN0ZWRMYW5ndWFnZSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIExhbmR1YWdlSUQgZG9lcyBub3QgZXhpc3RzCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkTGFuZ3VhZ2VJRCApIHsKCiAgICAgICAgICAgICMgR2V0IHRoZSBsb3dlc3QgbGFuZ3VhZ2VJRCBmcm9tIHRoZSBGQVEgbGFuZ3VhZ2VzIGxpc3QKICAgICAgICAgICAgbXkgQExhbmd1YWdlSURzID0gc29ydCBrZXlzICVMYW5ndWFnZXM7CiAgICAgICAgICAgICRTZWxlY3RlZExhbmd1YWdlSUQgPSAkTGFuZ3VhZ2VJRHNbMF07CgogICAgICAgICAgICAjIFNldCB0aGUgbGFuZ3VhZ2Ugd2l0aCBsb3dlc3QgTGFuZ3VhZ2VJRCBhcyBzZWxlY3RlZCBsYW5ndWFnZSwKICAgICAgICAgICAgIyAgIGFzIHRoaXMgaXMgdGhlIGZpcnN0IGFuZCAod2UgYXNzdW1lZCkgdGhlIG1vc3QgdXNlZCBsYW5ndWFnZQogICAgICAgICAgICAkU2VsZWN0ZWRMYW5ndWFnZSA9ICRMYW5ndWFnZXN7JFNlbGVjdGVkTGFuZ3VhZ2VJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgQnVpbGQgdGhlIGxhbmd1YWdlIHNlbGVjdGlvbi4KICAgICREYXRhe0xhbmd1YWdlT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVMYW5ndWFnZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnTGFuZ3VhZ2VJRCcsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRMYW5ndWFnZSwKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgbXkgQFN0YXRlVHlwZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QWdlbnQ6OlN0YXRlVHlwZXMnKTsKICAgIG15ICVTdGF0ZXMgICAgID0gJEZBUU9iamVjdC0+U3RhdGVMaXN0KAogICAgICAgIFR5cGVzICA9PiBAU3RhdGVUeXBlcywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIEdldCB0aGUgc2VsZWN0ZWQgc3RhdGUuCiAgICBteSAkU2VsZWN0ZWRTdGF0ZTsKICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICYmICRTdGF0ZXN7ICRQYXJhbXtTdGF0ZUlEfSB9ICkgewoKICAgICAgICAjIEdldCBzdGF0ZSBmcm9tIGdpdmVuIFN0YXRlSUQuCiAgICAgICAgJFNlbGVjdGVkU3RhdGUgPSAkU3RhdGVzeyAkUGFyYW17U3RhdGVJRH0gfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIEdldCBkZWZhdWx0IHN0YXRlLgogICAgICAgICRTZWxlY3RlZFN0YXRlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkRlZmF1bHQ6OlN0YXRlJykgfHwgJ2ludGVybmFsIChhZ2VudCknOwogICAgfQoKICAgICMgQnVpbGQgdGhlIHN0YXRlIHNlbGVjdGlvbi4KICAgICREYXRhe1N0YXRlT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRTdGF0ZSwKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBTaG93IGF0dGFjaG1lbnRzLgogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKCiAgICAgICAgIyBEbyBub3Qgc2hvdyBpbmxpbmUgaW1hZ2VzIGFzIGF0dGFjaG1lbnRzICh0aGV5IGhhdmUgYSBDb250ZW50SUQpLgogICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICB9CgogICAgIyByZW5kZXIgZHluYW1pYyBmaWVsZHMKICAgICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpEeW5hbWljRmllbGQ6Ok1hc2snKS0+RWRpdFNlY3Rpb25SZW5kZXIoCiAgICAgICAgQ29udGVudCAgICAgICAgICAgID0+ICRTZWxmLT57TWFza0RlZmluaXRpb259LAogICAgICAgIER5bmFtaWNGaWVsZHMgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgPT4gJFBhcmFte0R5bmFtaWNGaWVsZH0sCiAgICAgICAgRXJyb3JzICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgT2JqZWN0ICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZH0tPiUqLAogICAgICAgIH0sCiAgICAgICAgQUpBWFVwZGF0ZSA9PiAwLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGQVFBZGQnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVEYXRhLAogICAgICAgIH0sCiAgICApOwoKICAgICMgc2hvdyBzZXJ2aWNlcwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6U2VydmljZScpICkgewoKICAgICAgICAjIGdldCBhbGwgc2VydmljZXMKICAgICAgICBteSAlU2VydmljZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgS2VlcENoaWxkcmVuID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpLZWVwQ2hpbGRyZW4nKSAvLyAwLAogICAgICAgICAgICBWYWxpZCAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICAgICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICAgICBteSBAU2VydmljZUlEczsKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgKSB7CiAgICAgICAgICAgIEBTZXJ2aWNlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKTsKICAgICAgICB9CgogICAgICAgICMgQnVpbGQgdGhlIHN0YXRlIHNlbGVjdGlvbi4KICAgICAgICBteSAkU2VydmljZUhUTUwgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgICAgICBTaXplICAgICAgICA9PiAxMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gXEBTZXJ2aWNlSURzLAogICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBUcmVlVmlldyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VPcHRpb24gPT4gJFNlcnZpY2VIVE1MLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IGxhbmd1YWdlcyBmaWVsZC4KICAgIG15ICRNdWx0aUxhbmd1YWdlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Ok11bHRpTGFuZ3VhZ2UnKTsKICAgIGlmICgkTXVsdGlMYW5ndWFnZSkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYW5ndWFnZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIEdldCBkZWZhdWx0IGxhbmd1YWdlLgogICAgICAgIG15ICREZWZhdWx0TGFuZ3VhZ2UgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RGVmYXVsdDo6TGFuZ3VhZ2UnKSB8fCAnZW4nOwoKICAgICAgICAjIEdldCBkZWZhdWx0IExhbmd1YWdlSUQKICAgICAgICBteSAkTGFuZ3VhZ2VJRCA9ICRGQVFPYmplY3QtPkxhbmd1YWdlTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICREZWZhdWx0TGFuZ3VhZ2UsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgZGVmYXVsdCBsYW5ndWFnZSBpZiBpdCB3YXMgZGVsZXRlZCBvciBkb2VzIG5vdCBleGlzdHMuCiAgICAgICAgaWYgKCAhJExhbmd1YWdlSUQgKSB7CiAgICAgICAgICAgIG15ICRJbnNlcnRMYW5ndWFnZSA9ICRGQVFPYmplY3QtPkxhbmd1YWdlQWRkKAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICREZWZhdWx0TGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRJbnNlcnRMYW5ndWFnZSApIHsKCiAgICAgICAgICAgICAgICAjIFJldHVybiB3aXRoIGVycm9yIHNjcmVlbi4KICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gZGVmYXVsdCBsYW5ndWFnZSBmb3VuZCBhbmQgY2FuXCd0IGNyZWF0ZSBhIG5ldyBvbmUuJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgZGVmYXVsdCBMYW5ndWFnZUlELgogICAgICAgICAgICAkTGFuZ3VhZ2VJRCA9ICRGQVFPYmplY3QtPkxhbmd1YWdlTG9va3VwKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRGVmYXVsdExhbmd1YWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte0xhbmd1YWdlSUR9ID0gJExhbmd1YWdlSUQ7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0xhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyBhcHByb3ZhbCBmaWVsZC4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUmVxdWlyZWQnKSApIHsKCiAgICAgICAgbXkgJEFwcHJvdmFsUmVxdWlyZWQgICAgICAgID0gMTsKICAgICAgICBteSAkQXBwcm92YWxJbmNsdWRlSW50ZXJuYWwgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWw6OkluY2x1ZGVJbnRlcm5hbCcpOwoKICAgICAgICBpZiAoICEkQXBwcm92YWxJbmNsdWRlSW50ZXJuYWwgKSB7CiAgICAgICAgICAgIG15ICVJbnRlcm5hbFN0YXRlID0gJEZBUU9iamVjdC0+U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgVHlwZXMgID0+IFsnaW50ZXJuYWwnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkSW50ZXJuYWxTdGF0ZXsgJFBhcmFte1N0YXRlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkQXBwcm92YWxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEFwcHJvdmFsUmVxdWlyZWQgKSB7CgogICAgICAgICAgICAjIENoZWNrIHBlcm1pc3Npb24uCiAgICAgICAgICAgIG15ICVHcm91cHMgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBHZXQgdGhlIEZBUSBhcHByb3ZhbCBncm91cCBmcm9tIGNvbmZpZy4KICAgICAgICAgICAgbXkgJEFwcHJvdmFsR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxHcm91cCcpIHx8ICcnOwoKICAgICAgICAgICAgIyBCdWlsZCB0aGUgYXBwcm92YWwgc2VsZWN0aW9uIGlmIHVzZXIgaXMgaW4gdGhlIGFwcHJvdmFsIGdyb3VwLgogICAgICAgICAgICBpZiAoICRHcm91cHN7JEFwcHJvdmFsR3JvdXB9ICkgewoKICAgICAgICAgICAgICAgICREYXRhe0FwcHJvdmFsT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FwcHJvdmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgMCA9PiBUcmFuc2xhdGFibGUoJ05vJyksCiAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0FwcHJvdmVkfSB8fCAwLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXBwcm92YWwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlLgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiRkFROjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259IikgfHwgJyc7CgogICAgIyBBZGQgcmljaCB0ZXh0IGVkaXRvciBKYXZhU2NyaXB0IG9ubHkgaWYgYWN0aXZhdGVkIGFuZCB0aGUgYnJvd3NlciBjYW4gaGFuZGxlIGl0CiAgICAjICAgb3RoZXJ3aXNlIGp1c3QgYSB0ZXh0LWFyZWEgaXMgc2hvd24KICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gJiYgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKSApIHsKCiAgICAgICAgIyBVc2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuLgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBTZXQgdXAgcmljaCB0ZXh0IGVkaXRvci4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgU2V0IGRlZmF1bHQgaW50ZXJmYWNlIHNldHRpbmdzLgogICAgbXkgJEludGVyZmFjZVN0YXRlcyA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgID0+IEBTdGF0ZVR5cGVzLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgU2hvdyBGQVEgQ29udGVudC4KICAgICRMYXlvdXRPYmplY3QtPkZBUUNvbnRlbnRTaG93KAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIEZBUURhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUUFkZCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AgentFAQEdit.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudEZBUUVkaXQucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50RkFRRWRpdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBBbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0LgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIEdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlLgogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKSB8fCAnJzsKCiAgICAjIEdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuLgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAnRkFRJywKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSB7fTsKCiAgICAjIGNyZWF0ZSBkeW5hbWljIGZpZWxkIGhhc2ggYW5kIGRlZmluaXRpb24KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJER5bmFtaWNGaWVsZExpc3QgLy8gW10gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIHB1c2ggJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0tPkAqLCB7CiAgICAgICAgICAgIERGICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyID8gMSA6IDAsCiAgICAgICAgfTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyICkgewogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZENvbmZpZzsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgUGVybWlzc2lvbiBjaGVjay4KICAgIGlmICggISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gVHJhbnNsYXRhYmxlKCdZb3UgbmVlZCBydyBwZXJtaXNzaW9uIScpLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgR2V0IHBhcmFtZXRlcnMgZnJvbSB3ZWIgcmVxdWVzdC4KICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkUGFyYW1OYW1lICgKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgcXcoSXRlbUlEIFRpdGxlIENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFZhbGlkSUQgS2V5d29yZHMgQXBwcm92ZWQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYpCiAgICAgICAgcXcoSXRlbUlEIFRpdGxlIENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFZhbGlkSUQgS2V5d29yZHMgQXBwcm92ZWQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgSWNvbikKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIENoZWNrIG5lZWRlZCBzdHVmZi4KICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIEl0ZW1JRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEZBUU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiMgRkFRIFNlcnZpY2UgIyBUT0RPCiAgICBteSAlRkFRRGF0YSA9ICRGQVFPYmplY3QtPkZBUUdldCgKICAgICAgICBJdGVtSUQgICAgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgIEl0ZW1GaWVsZHMgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwogICAgaWYgKCAhJUZBUURhdGEgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICB9CgogICAgIyBDaGVjayB1c2VyIHBlcm1pc3Npb24uCiAgICBteSAkUGVybWlzc2lvbiA9ICRGQVFPYmplY3QtPkNoZWNrQ2F0ZWdvcnlVc2VyUGVybWlzc2lvbigKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBDYXRlZ29yeUlEID0+ICRGQVFEYXRhe0NhdGVnb3J5SUR9LAogICAgICAgIFR5cGUgICAgICAgPT4gJ3J3JywKICAgICk7CiAgICBpZiAoICEkUGVybWlzc2lvbiApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IGhhdmUgbm8gcGVybWlzc2lvbiBmb3IgdGhpcyBjYXRlZ29yeSEnKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvcm0gd2ViIHJlcXVlc3QuCiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIEV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZm9ybSB0aGUgd2ViIHJlcXVlc3QuCiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwogICAgfQoKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBnZXQgZm9ybSBpZAogICAgbXkgJEZvcm1JRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRMYXlvdXRPYmplY3QsCiAgICApOwoKICAgICMgR2V0IHNjcmVlbiB0eXBlLgogICAgbXkgJFNjcmVlblR5cGUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2NyZWVuVHlwZScgKSB8fCAnJzsKCiAgICBteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgdGhlIEZBUSBlZGl0IHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewoKICAgICAgICBteSAkT3V0cHV0OwoKICAgICAgICAjIFNob3cgYSBwb3AtdXAgc2NyZWVuLgogICAgICAgIGlmICggJFNjcmVlblR5cGUgZXEgJ1BvcHVwJyApIHsKCiAgICAgICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXJ0U21hbGwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IGEgbm9ybWFsIHdpbmRvdy4KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXJ0Tm9ybWFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGFsbCBleGlzdGluZyBhdHRhY2htZW50cyAod2l0aG91dCBpbmxpbmUgYXR0YWNobWVudHMpLgogICAgICAgIG15IEBFeGlzdGluZ0F0dGFjaG1lbnRzID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEluZGV4KAogICAgICAgICAgICBJdGVtSUQgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBTaG93SW5saW5lID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgQ29weSBhbGwgZXhpc3RpbmcgYXR0YWNobWVudHMgdG8gdXBsb2FkIGNhY2hlLgogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICMgR2V0IHRoZSBleGlzdGluZyBhdHRhY2htZW50IGRhdGEuCiAgICAgICAgICAgIG15ICVGaWxlID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQXR0YWNobWVudC0+e0ZpbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBHZXQgY29udGVudCBkaXNwb3NpdGlvbiAoaWYgaXRzIGFuIGlubGluZSBhdHRhY2htZW50KS4KICAgICAgICAgICAgbXkgJERpc3Bvc2l0aW9uID0gJEF0dGFjaG1lbnQtPntJbmxpbmV9ID8gJ2lubGluZScgOiAnJzsKCiAgICAgICAgICAgICMgQWRkIGF0dGFjaG1lbnRzIHRvIHRoZSB1cGxvYWQgY2FjaGUuCiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRGb3JtSUQsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsZXtDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRGaWxle0NvbnRlbnRUeXBlfSwKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICREaXNwb3NpdGlvbiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEgZnJvbSB1cGxvYWQgY2FjaGUuCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICk7CgogICAgICAgICMgUmV3cml0ZSBvbGQgc3R5bGUgaW5saW5lIGltYWdlIFVSTHMuCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYpKSB7CgogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkRkFRRGF0YXskRmllbGR9OwoKICAgICAgICAgICAgIyBSZXdyaXRlIGhhbmRsZSBhbmQgYWN0aW9uLCB0YWtlIGNhcmUgb2Ygb2xkIHN0eWxlIGJlZm9yZSBGQVEgMi4wLnguCiAgICAgICAgICAgICRGQVFEYXRheyRGaWVsZH0gPX4gc3sKICAgICAgICAgICAgICAgIEFjdGlvbj1BZ2VudEZBUSBbJl0oYW1wOyk/IFN1YmFjdGlvbj1Eb3dubG9hZCBbJl0oYW1wOyk/CiAgICAgICAgICAgIH17QWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O31neG1zOwogICAgICAgIH0KCiAgICAgICAgIyBzZXBhcmF0ZSBkeW5hbWljIGZpZWxkIGRhdGEgdG8gcGFzcyB0byBtYXNrIHJvdXRpbmUKICAgICAgICBteSAlRkFRRGF0YUR5bmFtaWNGaWVsZFZhbHVlcyA9IG1hcCB7ICRGQVFEYXRheyJEeW5hbWljRmllbGRfJF8ifSA/ICggIkR5bmFtaWNGaWVsZF8kXyIgPT4gJEZBUURhdGF7IkR5bmFtaWNGaWVsZF8kXyJ9ICkgOiAoKSB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICkgewoKICAgICAgICAgICAgbXkgJEFwcHJvdmFsUXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgIyBDaGVjayBpZiBBcHByb3ZhbCBxdWV1ZSBleGlzdHMuCiAgICAgICAgICAgIG15ICRBcHByb3ZhbFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWUgPT4gJEFwcHJvdmFsUXVldWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNob3cgbm90aWZpY2F0aW9uIGlmIEFwcHJvdmFsIHF1ZXVlIGRvZXMgbm90IGV4aXN0cy4KICAgICAgICAgICAgaWYgKCAhJEFwcHJvdmFsUXVldWVJRCApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gIkZBUSBBcHByb3ZhbCBpcyBlbmFibGVkIGJ1dCBxdWV1ZSAnJEFwcHJvdmFsUXVldWUnIGRvZXMgbm90IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgPT4gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWRtaW5TeXN0ZW1Db25maWd1cmF0aW9uO1N1YmFjdGlvbj1WaWV3Q3VzdG9tR3JvdXA7TmFtZXM9RkFROjpBcHByb3ZhbFF1ZXVlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgQXR0YWNobWVudHMgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgIFNjcmVlblR5cGUgICA9PiAkU2NyZWVuVHlwZSwKICAgICAgICAgICAgRm9ybUlEICAgICAgID0+ICRGb3JtSUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiBcJUZBUURhdGFEeW5hbWljRmllbGRWYWx1ZXMsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU2NyZWVuVHlwZSBlcSAnUG9wdXAnICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VuZFNtYWxsJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRW5kTm9ybWFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFNhdmUgdGhlIEZBUQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIENoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uLgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJE91dHB1dDsKCiAgICAgICAgIyBTaG93IGEgcG9wLXVwIHNjcmVlbi4KICAgICAgICBpZiAoICRTY3JlZW5UeXBlIGVxICdQb3B1cCcgKSB7CiAgICAgICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXJ0U21hbGwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IGEgbm9ybWFsIHdpbmRvdy4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGFydE5vcm1hbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlRXJyb3I7CiAgICAgICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KFRpdGxlIENhdGVnb3J5SUQpKSB7CgogICAgICAgICAgICAjIElmIHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBnaXZlbiwgYWRkIHNlcnZlciBlcnJvciBjbGFzcy4KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyRQYXJhbU5hbWV9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1OYW1lIC4gJ1NlcnZlckVycm9yJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyAjIENoZWNrIGlmIGFuIGF0dGFjaG1lbnQgbXVzdCBiZSBkZWxldGVkLgogICAgICAgICMgbXkgQEF0dGFjaG1lbnRJRHMgPSBtYXAgewogICAgICAgICMgICAgIG15ICgkSUQpID0gJF8gPX4gbXsgXEEgQXR0YWNobWVudERlbGV0ZSAoXGQrKSBceiB9eG1zOwogICAgICAgICMgICAgICRJRCA/ICRJRCA6ICgpOwogICAgICAgICMgfSAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKTsKCiAgICAgICAgIyBDT1VOVDoKICAgICAgICAjIGZvciBteSAkQ291bnQgKCByZXZlcnNlIHNvcnQgQEF0dGFjaG1lbnRJRHMgKSB7CgogICAgICAgICMgICAgICMgY2hlY2sgaWYgdGhlIGRlbGV0ZSBidXR0b24gd2FzIHByZXNzZWQgZm9yIHRoaXMgYXR0YWNobWVudAogICAgICAgICMgICAgIG15ICREZWxldGUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKCiAgICAgICAgIyAgICAgIyBjaGVjayBuZXh0IGF0dGFjaG1lbnQgaWYgaXQgd2FzIG5vdCBwcmVzc2VkCiAgICAgICAgIyAgICAgbmV4dCBDT1VOVCBpZiAhJERlbGV0ZTsKCiAgICAgICAgIyAgICAgIyByZW1lbWJlciB0aGF0IHdlIG5lZWQgdG8gc2hvdyB0aGUgcGFnZSBhZ2FpbgogICAgICAgICMgICAgICRFcnJvcntBdHRhY2htZW50fSA9IDE7CgogICAgICAgICMgICAgICMgcmVtb3ZlIHRoZSBhdHRhY2htZW50IGZyb20gdGhlIHVwbG9hZCBjYWNoZQogICAgICAgICMgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAjICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgIyAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgIyAgICAgKTsKICAgICAgICAjIH0KCiAgICAgICAgIyAjIGNoZWNrIGlmIHRoZXJlIHdhcyBhbiBhdHRhY2htZW50IHVwbG9hZAogICAgICAgICMgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSApIHsKCiAgICAgICAgIyAgICAgIyByZW1lbWJlciB0aGF0IHdlIG5lZWQgdG8gc2hvdyB0aGUgcGFnZSBhZ2FpbgogICAgICAgICMgICAgICRFcnJvcntBdHRhY2htZW50fSA9IDE7CgogICAgICAgICMgICAgICMgZ2V0IHRoZSB1cGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgIyAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgIyAgICAgICAgIFBhcmFtICA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgIyAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAjICAgICApOwoKICAgICAgICAjICAgICAjIGFkZCBhdHRhY2htZW50IHRvIHRoZSB1cGxvYWQgY2FjaGUKICAgICAgICAjICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgIyAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICMgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgIyAgICAgKTsKICAgICAgICAjIH0KCiAgICAgICAgIyBzdG9yZSBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0cwogICAgICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZC4KICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gICAgICAgICAgICAgICAgICAgICAgICA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2VuZCBzZXJ2ZXIgZXJyb3IgaWYgYW55IHJlcXVpcmVkIHBhcmFtZXRlciBpcyBtaXNzaW5nCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyAjIGlmIHRoZXJlIHdhcyBhbiBhdHRhY2htZW50IGRlbGV0ZSBvciB1cGxvYWQKICAgICAgICAgICAgIyAjIHdlIGRvIG5vdCB3YW50IHRvIHNob3cgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIG90aGVyIGZpZWxkcwogICAgICAgICAgICAjIGlmICggJEVycm9ye0F0dGFjaG1lbnR9ICkgewogICAgICAgICAgICAjICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgIyB9CgogICAgICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFJlcXVpcmVkJykgKSB7CgogICAgICAgICAgICAgICAgbXkgJEFwcHJvdmFsUXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgQXBwcm92YWwgcXVldWUgZXhpc3RzLgogICAgICAgICAgICAgICAgbXkgJEFwcHJvdmFsUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gJEFwcHJvdmFsUXVldWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2hvdyBub3RpZmljYXRpb24gaWYgQXBwcm92YWwgcXVldWUgZG9lcyBub3QgZXhpc3RzLgogICAgICAgICAgICAgICAgaWYgKCAhJEFwcHJvdmFsUXVldWVJRCApIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGQVEgQXBwcm92YWwgaXMgZW5hYmxlZCBidXQgcXVldWUgJyRBcHByb3ZhbFF1ZXVlJyBkb2VzIG5vdCBleGlzdHMiLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZG1pblN5c3RlbUNvbmZpZ3VyYXRpb247U3ViYWN0aW9uPVZpZXdDdXN0b21Hcm91cDtOYW1lcz1GQVE6OkFwcHJvdmFsUXVldWUnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgIFNjcmVlblR5cGUgICA9PiAkU2NyZWVuVHlwZSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICA9PiAkRm9ybUlELAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IFwlRHluYW1pY0ZpZWxkVmFsdWVzLAogICAgICAgICAgICAgICAgREZFcnJvcnMgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFNjcmVlblR5cGUgZXEgJ1BvcHVwJyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VuZFNtYWxsJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdFbmROb3JtYWwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIFNldCB0aGUgY29udGVudCB0eXBlLgogICAgICAgIG15ICRDb250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICYmICRDb25maWdPYmplY3QtPkdldCgnRkFROjpJdGVtOjpIVE1MJykgKSB7CiAgICAgICAgICAgICRDb250ZW50VHlwZSA9ICd0ZXh0L2h0bWwnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6U2VydmljZScpICkgewogICAgICAgICAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgICAgICAgICAjIGdldCBhbGwgc2VydmljZXMKICAgICAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICBLZWVwQ2hpbGRyZW4gPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OktlZXBDaGlsZHJlbicpIC8vIDAsCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgQFNlcnZpY2VJRHM7CiAgICAgICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSApIHsKICAgICAgICAgICAgICAgIEBTZXJ2aWNlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSAgID0gXEBTZXJ2aWNlSURzOwogICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUxpc3R9ID0gXCVTZXJ2aWNlTGlzdDsKICAgICAgICB9CgogICAgICAgICMgVXBkYXRlIHRoZSBuZXcgRkFRIGl0ZW0uCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFVcGRhdGUoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTaG93IGVycm9yIGlmIEZBUSBpdGVtIGNvdWxkIG5vdCBiZSB1cGRhdGVkLgogICAgICAgIGlmICggISRVcGRhdGVTdWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGFsbCBhdHRhY2htZW50cyBmcm9tIHVwbG9hZCBjYWNoZS4KICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgYWxsIGV4aXN0aW5nIGF0dGFjaG1lbnRzLgogICAgICAgIG15IEBFeGlzdGluZ0F0dGFjaG1lbnRzID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEluZGV4KAogICAgICAgICAgICBJdGVtSUQgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBTaG93SW5saW5lID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgTG9va3VwIG9sZCBpbmxpbmUgYXR0YWNobWVudHMgKGluaXRpYWxseSBsb2FkZWQgdG8gQWdlbnRGQVFFZGl0LnBtIHNjcmVlbikKICAgICAgICAjIGFuZCBwdXNoIHRvIEF0dGFjaG1lbnRzIGFycmF5IGlmIHRoZXkgc3RpbGwgZXhpc3QgaW4gdGhlIGZvcm0uCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBFeGlzdGluZ0F0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRBdHRhY2htZW50LT57SW5saW5lfTsKCiAgICAgICAgICAgIE5VTUJFUjoKICAgICAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRGQVFEYXRheyAnRmllbGQnIC4gJE51bWJlciB9CiAgICAgICAgICAgICAgICAgICAgPX4gbXsgQWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0l0ZW1JRD0kR2V0UGFyYW17SXRlbUlEfTtGaWxlSUQ9JEF0dGFjaG1lbnQtPntGaWxlSUR9IH1tc3gKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgR2V0IHRoZSBleGlzdGluZyBpbmxpbmUgYXR0YWNobWVudCBkYXRhLgogICAgICAgICAgICAgICAgICAgIG15ICVGaWxlID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJEF0dGFjaG1lbnQtPntGaWxlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRGaWxle0NvbnRlbnR9LAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkRmlsZXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxle0ZpbGVuYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXNpemUgICAgPT4gJEZpbGV7RmlsZXNpemV9LAogICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEICAgICAgPT4gJEF0dGFjaG1lbnQtPntGaWxlSUR9LAogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGxhc3QgTlVNQkVSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEJ1aWxkIGEgbG9va3VwIGhhc2ggb2YgdGhlIG5ldyBhdHRhY2htZW50cy4KICAgICAgICBteSAlTmV3QXR0YWNobWVudDsKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewoKICAgICAgICAgICAgIyBUaGUga2V5IGlzIHRoZSBmaWxlbmFtZSArIGZpbGVzaXplICsgY29udGVudCB0eXBlLgogICAgICAgICAgICBteSAkS2V5ID0gJEF0dGFjaG1lbnQtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0KICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX07CgogICAgICAgICAgICAjIEFwcGVuZCBjb250ZW50IGlkIGlmIGF2YWlsYWJsZSAoZm9yIG5ldyBpbmxpbmUgaW1hZ2VzKS4KICAgICAgICAgICAgaWYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gKSB7CiAgICAgICAgICAgICAgICAkS2V5IC49ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTdG9yZSBhbGwgb2YgdGhlIG5ldyBhdHRhY2htZW50IGRhdGEuCiAgICAgICAgICAgICROZXdBdHRhY2htZW50eyRLZXl9ID0gJEF0dGFjaG1lbnQ7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIHRoZSBleGlzdGluZyBhdHRhY2htZW50cy4KICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICMgVGhlIGtleSBpcyB0aGUgZmlsZW5hbWUgKyBmaWxlc2l6ZXJhdyArIGNvbnRlbnQgdHlwZSAobm8gY29udGVudCBpZCwgYXMgZXhpc3RpbmcgYXR0YWNobWVudHMgZG9uJ3QgaGF2ZSBpdCkuCiAgICAgICAgICAgIG15ICRLZXkgPSAkQXR0YWNobWVudC0+e0ZpbGVuYW1lfQogICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudC0+e0ZpbGVzaXplUmF3fQogICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfTsKCiAgICAgICAgICAgICMgQXR0YWNobWVudCBpcyBhbHJlYWR5IGV4aXN0aW5nLCB3ZSBjYW4gZGVsZXRlIGl0IGZyb20gdGhlIG5ldyBhdHRhY2htZW50IGhhc2guCiAgICAgICAgICAgIGlmICggJE5ld0F0dGFjaG1lbnR7JEtleX0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJE5ld0F0dGFjaG1lbnR7JEtleX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRXhpc3RpbmcgYXR0YWNobWVudCBpcyBubyBsb25nZXIgaW4gbmV3IGF0dGFjaG1lbnRzIGhhc2guCiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgRGVsZXRlIHRoZSBleGlzdGluZyBhdHRhY2htZW50LgogICAgICAgICAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3NmdWwgPSAkRkFRT2JqZWN0LT5BdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJEF0dGFjaG1lbnQtPntGaWxlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3NmdWwgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBXcml0ZSB0aGUgbmV3IGF0dGFjaG1lbnRzLgogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50ICggdmFsdWVzICVOZXdBdHRhY2htZW50ICkgewoKICAgICAgICAgICAgIyBDaGVjayBpZiBhdHRhY2htZW50IGlzIGFuIGlubGluZSBhdHRhY2htZW50LgogICAgICAgICAgICBteSAkSW5saW5lID0gMDsKICAgICAgICAgICAgaWYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApIHsKCiAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHRoYXQgaXQgaXMgaW5saW5lLgogICAgICAgICAgICAgICAgJElubGluZSA9IDE7CgogICAgICAgICAgICAgICAgIyBSZW1lbWJlciBpZiB0aGlzIGlubGluZSBhdHRhY2htZW50IGlzIGFscmVhZHkgdXNlZCBpbiBhbnkgRkFRIGl0ZW0uCiAgICAgICAgICAgICAgICBteSAkSW5saW5lQXR0YWNobWVudEZvdW5kOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgYWxsIGZpZWxkcyBmb3IgdGhlIGlubGluZSBhdHRhY2htZW50LgogICAgICAgICAgICAgICAgTlVNQkVSOgogICAgICAgICAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICAgICAgICAgICAgICMgR2V0IEZBUSBmaWVsZC4KICAgICAgICAgICAgICAgICAgICBteSAkRmllbGQgPSAkR2V0UGFyYW17ICdGaWVsZCcgLiAkTnVtYmVyIH07CgogICAgICAgICAgICAgICAgICAgICMgU2tpcCBlbXB0eSBmaWVsZHMuCiAgICAgICAgICAgICAgICAgICAgbmV4dCBOVU1CRVIgaWYgISRGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIGlmIHRoZSBmaWVsZCBpcyBub3QgbmV3IChhZGRlZCkgb3Igb2xkIChpbml0aWFsbHkgbG9hZGVkKSBpbmxpbmUgYXR0YWNobWVudC4KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZCAhfiBteyAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gfXhtcwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgIX4gbXsgQWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0l0ZW1JRD0kR2V0UGFyYW17SXRlbUlEfTtGaWxlSUQ9JEF0dGFjaG1lbnQtPntGaWxlSUR9IH14bXMKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBOVU1CRVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIEZvdW5kIHRoZSBpbmxpbmUgYXR0YWNobWVudC4KICAgICAgICAgICAgICAgICAgICAkSW5saW5lQXR0YWNobWVudEZvdW5kID0gMTsKCiAgICAgICAgICAgICAgICAgICAgIyBXZSBkbyBub3QgbmVlZCB0byBzZWFyY2ggZnVydGhlci4KICAgICAgICAgICAgICAgICAgICBsYXN0IE5VTUJFUjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFdlIGRvIG5vdCB3YW50IHRvIGtlZXAgdGhpcyBhdHRhY2htZW50LCBiZWNhdXNlIGl0IHdhcyBkZWxldGVkIGluIHRoZSByaWNoLXRleHQgZWRpdG9yLgogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkSW5saW5lQXR0YWNobWVudEZvdW5kOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEFkZCBhdHRhY2htZW50LgogICAgICAgICAgICBteSAkRmlsZUlEID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgSW5saW5lID0+ICRJbmxpbmUsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkRmlsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkSW5saW5lOwogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9OwoKICAgICAgICAgICAgIyBSZXdyaXRlIHRoZSBVUkxzIG9mIHRoZSBpbmxpbmUgaW1hZ2VzIGZvciB0aGUgdXBsb2FkZWQgcGljdHVyZXMuCiAgICAgICAgICAgIG15ICRPSyA9ICRGQVFPYmplY3QtPkZBUUlubGluZUF0dGFjaG1lbnRVUkxVcGRhdGUoCiAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+ICRBdHRhY2htZW50LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICA9PiAkRm9ybUlELAogICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCAgICAgPT4gJEZpbGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT0sgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdXBkYXRlIHRoZSBpbmxpbmUgaW1hZ2UgVVJMcyAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gImZvciBGQVEgSXRlbSMgJyRHZXRQYXJhbXtJdGVtSUR9JyEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgYWxsIGZvcm0gZGF0YQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkRm9ybUlEICk7CgogICAgICAgICMgU2V0IGR5bmFtaWMgZmllbGRzLgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIFNldCB0aGUgdmFsdWUuCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiB0aGVyZSBpZiB3ZSBuZWVkIHRvIGNsb3NlIGEgcG9wLXVwIHNjcmVlbiBvciBub3QuCiAgICAgICAgaWYgKCAkU2NyZWVuVHlwZSBlcSAnUG9wdXAnICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9JEdldFBhcmFte0l0ZW1JRH0iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudEZBUVpvb207SXRlbUlEPSRHZXRQYXJhbXtJdGVtSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCnN1YiBfTWFza05ldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGxpc3QgdHlwZS4KICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgIG15ICVEYXRhOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBCdWlsZCB2YWxpZCBzZWxlY3Rpb24uCiAgICAkRGF0YXtWYWxpZE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgICMgR2V0IGNhdGVnb3JpZXMgKHdpdGggY2F0ZWdvcnkgbG9uZyBuYW1lcykgd2hlcmUgdXNlciBoYXMgcmlnaHRzLgogICAgbXkgJFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzID0gJEZBUU9iamVjdC0+R2V0VXNlckNhdGVnb3JpZXNMb25nTmFtZXMoCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBTZXQgbm8gc2VydmVyIGVycm9yIGNsYXNzIGFzIGRlZmF1bHQuCiAgICAkUGFyYW17Q2F0ZWdvcnlJRFNlcnZlckVycm9yfSB8fD0gJyc7CgogICAgIyBCdWlsZCBjYXRlZ29yeSBzZWxlY3Rpb24uCiAgICAkRGF0YXtDYXRlZ29yeU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJFVzZXJDYXRlZ29yaWVzTG9uZ05hbWVzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gJFBhcmFte0NhdGVnb3J5SURTZXJ2ZXJFcnJvcn0sCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICk7CgogICAgbXkgJUxhbmd1YWdlcyA9ICRGQVFPYmplY3QtPkxhbmd1YWdlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIEdldCB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UuCiAgICBteSAkU2VsZWN0ZWRMYW5ndWFnZTsKICAgIGlmICggJFBhcmFte0xhbmd1YWdlSUR9ICYmICRMYW5ndWFnZXN7ICRQYXJhbXtMYW5ndWFnZUlEfSB9ICkgewoKICAgICAgICAjIEdldCBsYW5ndWFnZSBmcm9tIGdpdmVuIExhbmd1YWdlSUQKICAgICAgICAkU2VsZWN0ZWRMYW5ndWFnZSA9ICRMYW5ndWFnZXN7ICRQYXJhbXtMYW5ndWFnZUlEfSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgVXNlIHRoZSB1c2VyIGxhbmd1YWdlLCBvciBpZiBub3QgZm91bmQgJ2VuJy4KICAgICAgICAkU2VsZWN0ZWRMYW5ndWFnZSA9ICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9IHx8ICdlbic7CgogICAgICAgICMgR2V0IHVzZXIgTGFuZ3VhZ2VJRAogICAgICAgIG15ICRTZWxlY3RlZExhbmd1YWdlSUQgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkU2VsZWN0ZWRMYW5ndWFnZSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIExhbmd1YWdlSUQgZG9lcyBub3QgZXhpc3RzLgogICAgICAgIGlmICggISRTZWxlY3RlZExhbmd1YWdlSUQgKSB7CgogICAgICAgICAgICAjIEdldCB0aGUgbG93ZXN0IExhbmd1YWdlSUQgZm9ybSB0aGUgRkFRIGxhbmd1YWdlIGxpc3QgYXMgaXRzIHRoZSBmaXJzdCBhZGRlZCBhbmQKICAgICAgICAgICAgIyAgICh3ZSBhc3N1bWUpIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC4KICAgICAgICAgICAgbXkgQExhbmd1YWdlSURzID0gc29ydCBrZXlzICVMYW5ndWFnZXM7CiAgICAgICAgICAgICRTZWxlY3RlZExhbmd1YWdlSUQgPSAkTGFuZ3VhZ2VJRHNbMF07CgogICAgICAgICAgICAjIFNldCB0aGUgbGFuZ3VhZ2Ugd2l0aCBsb3dlc3QgbGFuZ3VhZ2VJRCBhcyBzZWxlY3RlZCBsYW5ndWFnZS4KICAgICAgICAgICAgJFNlbGVjdGVkTGFuZ3VhZ2UgPSAkTGFuZ3VhZ2VzeyRTZWxlY3RlZExhbmd1YWdlSUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIEJ1aWxkIHRoZSBsYW5ndWFnZSBzZWxlY3Rpb24uCiAgICAkRGF0YXtMYW5ndWFnZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlTGFuZ3VhZ2VzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0xhbmd1YWdlSUQnLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkTGFuZ3VhZ2UsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAwLAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgIG15IEBTdGF0ZVR5cGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFnZW50OjpTdGF0ZVR5cGVzJyk7CiAgICBteSAlU3RhdGVzICAgICA9ICRGQVFPYmplY3QtPlN0YXRlTGlzdCgKICAgICAgICBUeXBlcyAgPT4gQFN0YXRlVHlwZXMsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBHZXQgdGhlIHNlbGVjdGVkIHN0YXRlLgogICAgbXkgJFNlbGVjdGVkU3RhdGU7CiAgICBpZiAoICRQYXJhbXtTdGF0ZUlEfSAmJiAkU3RhdGVzeyAkUGFyYW17U3RhdGVJRH0gfSApIHsKCiAgICAgICAgIyBHZXQgc3RhdGUgZnJvbSBnaXZlbiBTdGF0ZUlECiAgICAgICAgJFNlbGVjdGVkU3RhdGUgPSAkU3RhdGVzeyAkUGFyYW17U3RhdGVJRH0gfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIEdldCBkZWZhdWx0IHN0YXRlLgogICAgICAgICRTZWxlY3RlZFN0YXRlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkRlZmF1bHQ6OlN0YXRlJykgfHwgJ2ludGVybmFsIChhZ2VudCknOwogICAgfQoKICAgICMgQnVpbGQgdGhlIHN0YXRlIHNlbGVjdGlvbi4KICAgICREYXRhe1N0YXRlT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRTdGF0ZSwKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBHZXQgc2NyZWVuIHR5cGUuCiAgICBteSAkU2NyZWVuVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTY3JlZW5UeXBlJyApIHx8ICcnOwoKICAgIG15ICRGaWVsZHNldENsYXNzID0gJyc7CiAgICBpZiAoICRTY3JlZW5UeXBlIGVxICdQb3B1cCcgKSB7CiAgICAgICAgJEZpZWxkc2V0Q2xhc3MgPSAnRml4ZWRMYWJlbCc7CiAgICB9CgogICAgIyBTaG93IGF0dGFjaG1lbnRzLgogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKCiAgICAgICAgIyBEbyBub3Qgc2hvdyBpbmxpbmUgaW1hZ2VzIGFzIGF0dGFjaG1lbnRzICh0aGV5IGhhdmUgYSBjb250ZW50IGlkKQogICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICB9CgogICAgIyByZW5kZXIgZHluYW1pYyBmaWVsZHMKICAgICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpEeW5hbWljRmllbGQ6Ok1hc2snKS0+RWRpdFNlY3Rpb25SZW5kZXIoCiAgICAgICAgQ29udGVudCAgICAgICAgICAgID0+ICRTZWxmLT57TWFza0RlZmluaXRpb259LAogICAgICAgIER5bmFtaWNGaWVsZHMgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgPT4gJFBhcmFte0R5bmFtaWNGaWVsZH0sCiAgICAgICAgRXJyb3JzICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgT2JqZWN0ICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZH0tPiUqLAogICAgICAgIH0sCiAgICAgICAgQUpBWFVwZGF0ZSA9PiAwLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGQVFFZGl0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgRmllbGRzZXRDbGFzcyA9PiAkRmllbGRzZXRDbGFzcywKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgc2VydmljZXMKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHNlcnZpY2VzCiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIEtlZXBDaGlsZHJlbiA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZTo6S2VlcENoaWxkcmVuJykgLy8gMCwKICAgICAgICAgICAgVmFsaWQgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAgICAgbXkgQFNlcnZpY2VJRHMgPSAkUGFyYW17U2VydmljZUxpc3R9ID8ga2V5cyAleyAkUGFyYW17U2VydmljZUxpc3R9IH0gOiAoKTsKCiAgICAgICAgIyBCdWlsZCB0aGUgc3RhdGUgc2VsZWN0aW9uLgogICAgICAgIG15ICRTZXJ2aWNlSFRNTCA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVNlcnZpY2VMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgIFNpemUgICAgICAgID0+IDEwLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiBcQFNlcnZpY2VJRHMsCiAgICAgICAgICAgIFNvcnQgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2VydmljZU9wdGlvbiA9PiAkU2VydmljZUhUTUwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cgbGFuZ3VhZ2VzIGZpZWxkLgogICAgbXkgJE11bHRpTGFuZ3VhZ2UgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6TXVsdGlMYW5ndWFnZScpOwogICAgaWYgKCRNdWx0aUxhbmd1YWdlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IGFwcHJvdmFsIGZpZWxkLgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICkgewoKICAgICAgICBteSAkQXBwcm92YWxSZXF1aXJlZCAgICAgICAgPSAxOwogICAgICAgIG15ICRBcHByb3ZhbEluY2x1ZGVJbnRlcm5hbCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbDo6SW5jbHVkZUludGVybmFsJyk7CgogICAgICAgIGlmICggISRBcHByb3ZhbEluY2x1ZGVJbnRlcm5hbCApIHsKICAgICAgICAgICAgbXkgJUludGVybmFsU3RhdGUgPSAkRkFRT2JqZWN0LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgICAgICBUeXBlcyAgPT4gWydpbnRlcm5hbCddLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRJbnRlcm5hbFN0YXRleyAkUGFyYW17U3RhdGVJRH0gfSApIHsKICAgICAgICAgICAgICAgICRBcHByb3ZhbFJlcXVpcmVkID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQXBwcm92YWxSZXF1aXJlZCApIHsKCiAgICAgICAgICAgICMgQ2hlY2sgcGVybWlzc2lvbi4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEdldCB0aGUgRkFRIGFwcHJvdmFsIGdyb3VwIGZyb20gY29uZmlnLgogICAgICAgICAgICBteSAkQXBwcm92YWxHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbEdyb3VwJykgfHwgJyc7CgogICAgICAgICAgICAjIEJ1aWxkIHRoZSBhcHByb3ZhbCBzZWxlY3Rpb24gaWYgdXNlciBpcyBpbiB0aGUgYXBwcm92YWwgZ3JvdXAuCiAgICAgICAgICAgIGlmICggJEdyb3Vwc3skQXBwcm92YWxHcm91cH0gKSB7CgogICAgICAgICAgICAgICAgJERhdGF7QXBwcm92YWxPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXBwcm92ZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAwID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiBUcmFuc2xhdGFibGUoJ1llcycpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17QXBwcm92ZWR9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcHByb3ZhbCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUuCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKSB8fCAnJzsKCiAgICAjIEFkZCByaWNoIHRleHQgZWRpdG9yIEphdmFTY3JpcHQgb25seSBpZiBhY3RpdmF0ZWQgYW5kIHRoZSBicm93c2VyIGNhbiBoYW5kbGUgaXQKICAgICMgICBvdGhlcndpc2UganVzdCBhIHRleHQtYXJlYSBpcyBzaG93bgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpICkgewoKICAgICAgICAjIFVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4uCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIFNldCB1cCByaWNoIHRleHQgZWRpdG9yLgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZXQgZGVmYXVsdCBpbnRlcmZhY2Ugc2V0dGluZ3MuCiAgICBteSAkSW50ZXJmYWNlU3RhdGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyAgPT4gQFN0YXRlVHlwZXMsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBTaG93IEZBUSBDb250ZW50LgogICAgJExheW91dE9iamVjdC0+RkFRQ29udGVudFNob3coCiAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgSW50ZXJmYWNlU3RhdGVzID0+ICRJbnRlcmZhY2VTdGF0ZXMsCiAgICAgICAgRkFRRGF0YSAgICAgICAgID0+IHslUGFyYW19LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggJFNjcmVlblR5cGUgbmUgJ1BvcHVwJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRW5kTm9ybWFsJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNjcmVlblR5cGUgZXEgJ1BvcHVwJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRW5kU21hbGwnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AgentFAQZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudEZBUVpvb20ucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50RkFRWm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCBlbmNvZGVfYmFzZTY0KTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBBbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0LgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2Vze1VzZXJBZ2VudERvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gPSAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgUGVybWlzc2lvbiBjaGVjay4KICAgIGlmICggISRTZWxmLT57QWNjZXNzUm99ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gVHJhbnNsYXRhYmxlKCdZb3UgbmVlZCBybyBwZXJtaXNzaW9uIScpLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgbXkgJElzQWxsb3dlZCA9IDA7CiAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gPSAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSB8fCAnZW4nOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAjIEdldCBwYXJhbWV0ZXJzIGZyb20gd2ViIHJlcXVlc3QuCiAgICBteSAlR2V0UGFyYW07CiAgICAkR2V0UGFyYW17SXRlbUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJdGVtSUQnICk7CiAgICAkR2V0UGFyYW17UmF0ZX0gICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdSYXRlJyApOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgIyBHZXQgZGVmYXVsdCBJdGVtSUQgaWYgaXQncyBkZWZpbmVkCiAgICBteSAkSXNEZWZhdWx0QXJ0aWNsZSAgPSAwOwogICAgbXkgJEhhc0RlZmF1bHRBcnRpY2xlID0gMDsKICAgIG15ICVEYXRhICAgICAgICAgICAgICA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CgogICAgQ09ORklHOgogICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgIG5leHQgQ09ORklHIGlmICREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9IG5lICRTZWxmLT57VXNlckxhbmd1YWdlfTsKCiAgICAgICAgaWYgKCAkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9ICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17SXRlbUlEfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtJdGVtSUR9ID0gJERhdGF7JENvbmZpZ30tPntEZWZhdWx0SXRlbUlEfTsKICAgICAgICAgICAgICAgICRJc0RlZmF1bHRBcnRpY2xlID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkSGFzRGVmYXVsdEFydGljbGUgPSAxOwogICAgICAgICAgICBsYXN0IENPTkZJRzsKICAgICAgICB9CiAgICB9CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICMgR2V0IG5hdmlnYXRpb24gYmFyIG9wdGlvbi4KICAgIG15ICROYXYgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmF2JyApIHx8ICcnOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICBpZiAoICEkR2V0UGFyYW17SXRlbUlEfSApIHsKIyAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKIyAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gSXRlbUlEIGlzIGdpdmVuIScpLAojICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKIyAgICAgICAgICk7CiMgICAgIH0KICAgICMgU2hvdyBtZXNzYWdlIGFuZCBsaW5rIHRvIEZBUSBFeHBsb3JlciBpZiBubyBkZWZhdWx0IGl0ZW0gaXMgc2V0IGFuZCBubyBJdGVtSUQgcHJvdmlkZWQKICAgIG15ICRPdXRwdXQ7CgogICAgaWYgKCAhJEdldFBhcmFte0l0ZW1JRH0gKSB7CiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkUGFyYW17Q3NzQ2xhc3NOb0FydGljbGV9ID0gJ0hpZGRlbic7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RlZmF1bHRJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUVpvb20nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkT3V0cHV0IC4gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICB9CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgbXkgJUZBUURhdGEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICBJdGVtRmllbGRzICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKICAgIGlmICggISVGQVFEYXRhICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgJEZBUURhdGF7SWNvbn0gPSAkRkFRRGF0YXtJY29ufSA/IGRlY29kZV9iYXNlNjQoICRGQVFEYXRhe0ljb259ICkgOiAnJzsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBDaGVjayB1c2VyIHBlcm1pc3Npb24uCiAgICBteSAkUGVybWlzc2lvbiA9ICRGQVFPYmplY3QtPkNoZWNrQ2F0ZWdvcnlVc2VyUGVybWlzc2lvbigKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBDYXRlZ29yeUlEID0+ICRGQVFEYXRhe0NhdGVnb3J5SUR9LAogICAgICAgIFR5cGUgICAgICAgPT4gJ3JvJywKICAgICk7CiAgICBpZiAoICEkUGVybWlzc2lvbiApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IGhhdmUgbm8gcGVybWlzc2lvbiBmb3IgdGhpcyBjYXRlZ29yeSEnKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICBlbHNlIHsKICAgICAgICAkSXNBbGxvd2VkID0gMTsKICAgIH0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgbXkgJEhUTUxVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBIVE1MVmlldyBTdWJhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSFRNTFZpZXcnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkRmllbGQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRmllbGQiICk7CgogICAgICAgIGZvciBteSAkTmVlZGVkIChxdyggSXRlbUlEIEZpZWxkICkpIHsKICAgICAgICAgICAgaWYgKCAhJE5lZWRlZCApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWRlZCBQYXJhbTogJE5lZWRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIEZpZWxkIGNvbnRlbnQKICAgICAgICBteSAkRmllbGRDb250ZW50ID0gJEZBUU9iamVjdC0+SXRlbUZpZWxkR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEZpZWxkICA9PiAkRmllbGQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBSZXdyaXRlIGhhbmRsZSBhbmQgYWN0aW9uLCB0YWtlIGNhcmUgb2Ygb2xkIHN0eWxlIGJlZm9yZSBGQVEgMi4wLnguCiAgICAgICAgJEZpZWxkQ29udGVudCA9fiBzewogICAgICAgICAgICBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgIH17QWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O31neG1zOwoKICAgICAgICAjIGJ1aWxkIGJhc2UgVVJMIGZvciBpbmxpbmUgaW1hZ2VzCiAgICAgICAgbXkgJFNlc3Npb25JRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntTZXNzaW9uSUR9ICYmICEkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0gKSB7CiAgICAgICAgICAgICRTZXNzaW9uSUQgPSAnOycgLiAkU2VsZi0+e1Nlc3Npb25OYW1lfSAuICc9JyAuICRTZWxmLT57U2Vzc2lvbklEfTsKICAgICAgICAgICAgJEZpZWxkQ29udGVudCA9fiBzewogICAgICAgICAgICAgICAgKEFjdGlvbj1BZ2VudEZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtJdGVtSUQ9XGQrO0ZpbGVJRD1cZCspCiAgICAgICAgICAgIH17JDEkU2Vzc2lvbklEfWdtc3g7CiAgICAgICAgfQoKICAgICAgICAjIENvbnZlcnQgY29udGVudCB0byBIVE1MIGlmIG5lZWRlZC4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpJdGVtOjpIVE1MJykKICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgJEZBUURhdGF7Q29udGVudFR5cGV9IG5lICd0ZXh0L2h0bWwnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0hUTUwoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgRGV0ZWN0IGFsbCBwbGFpbiB0ZXh0IGxpbmtzIGFuZCBwdXQgdGhlbSBpbnRvIGFuIEhUTUwgPGE+IHRhZy4KICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICMgc2V0IHRhcmdldD0iX3BhcmVudCIgZm9yIGxpbmtzIHRvIG90aGVyIGFydGljbGVzIHZpYSBtZW50aW9uCiAgICAgICAgJEZpZWxkQ29udGVudCA9ICRGQVFPYmplY3QtPkxpbmtRdW90ZU1lbnRpb24oCiAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICk7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAjIFNldCB0YXJnZXQ9Il9ibGFuayIgYXR0cmlidXRlIHRvIGFsbCBIVE1MIDxhPiB0YWdzIHRoZSBMaW5rUXVvdGUgZnVuY3Rpb24gbmVlZHMgdG8gYmUKICAgICAgICAjICAgY2FsbGVkIGFnYWluCiAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nICAgID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgICAgIFRhcmdldEFkZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYWRkIG5lZWRlZCBIVE1MIGhlYWRlcnMKICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgU3RyaW5nICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICBDaGFyc2V0ID0+ICd1dGYtOCcsCiAgICAgICAgKTsKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgICRGaWVsZENvbnRlbnQgPX4gc3soPGgoWzEtNl0pPi4qPzwvaFwyPil9eyAkQ291bnQrKzsgIjxhIGlkPVwiJEZpZWxkLSRDb3VudFwiPiZuYnNwOzwvYT4kMSJ9Z2U7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAjIHJldHVybiBjb21wbGV0ZSBIVE1MIGFzIGFuIGF0dGFjaG1lbnQKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgRG93bmxvYWRBdHRhY2htZW50IFN1Yi1hY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG93bmxvYWRBdHRhY2htZW50JyApIHsKCiAgICAgICAgJEdldFBhcmFte0ZpbGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsZUlEJyApOwoKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtGaWxlSUR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIEZpbGVJRCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGF0dGFjaG1lbnRzLgogICAgICAgIG15ICVGaWxlID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBGaWxlSUQgPT4gJEdldFBhcmFte0ZpbGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJUZpbGUpIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoJUZpbGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkR2V0UGFyYW17RmlsZUlEfSkhIE1heSBiZSBhbiBhdHRhY2shISEiLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE90aGVyIHN1Yi1hY3Rpb25zIGNvbnRpbnVlcyBoZXJlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgIG15ICRPdXRwdXQ7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFZhbHVlID0+ICRGQVFEYXRhe1RpdGxlfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgfQoKICAgICMgRGVmaW5lIGRpZmZlcmVudCBub3RpZmljYXRpb25zLgogICAgbXkgJU5vdGlmaWNhdGlvbnMgPSAoCiAgICAgICAgVGhhbmtzID0+IHsKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0luZm8nLAogICAgICAgICAgICBJbmZvICAgICA9PiBUcmFuc2xhdGFibGUoJ1RoYW5rcyBmb3IgeW91ciB2b3RlIScpLAogICAgICAgIH0sCiAgICAgICAgQWxyZWFkeVZvdGVkID0+IHsKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdZb3UgaGF2ZSBhbHJlYWR5IHZvdGVkIScpLAogICAgICAgIH0sCiAgICAgICAgTm9SYXRlID0+IHsKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdObyByYXRlIHNlbGVjdGVkIScpLAogICAgICAgIH0sCiAgICApOwoKICAgICMgT3V0cHV0IG5vdGlmaWNhdGlvbnMgaWYgYW55LgogICAgbXkgJE5vdGlmeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZnknICkgfHwgJyc7CiAgICBpZiAoICROb3RpZnkgJiYgSXNIYXNoUmVmV2l0aERhdGEoICROb3RpZmljYXRpb25zeyROb3RpZnl9ICkgKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICV7ICROb3RpZmljYXRpb25zeyROb3RpZnl9IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIEdldCBkZWZhdWx0IG9wdGlvbnMuCiAgICBteSAkTXVsdGlMYW5ndWFnZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpNdWx0aUxhbmd1YWdlJyk7CiAgICBteSAkVm90aW5nICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpWb3RpbmcnKTsKCiAgICAjIFNldCBkZWZhdWx0IGludGVyZmFjZSBzZXR0aW5ncy4KICAgIG15ICRJbnRlcmZhY2UgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgTmFtZSAgID0+ICdpbnRlcm5hbCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAkSW50ZXJmYWNlU3RhdGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFnZW50OjpTdGF0ZVR5cGVzJyksCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBHZXQgRkFRIHZvdGUgaW5mb3JtYXRpb24uCiAgICBteSAkVm90ZURhdGE7CiAgICBpZiAoJFZvdGluZykgewogICAgICAgICRWb3RlRGF0YSA9ICRGQVFPYmplY3QtPlZvdGVHZXQoCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkRkFRRGF0YXtJdGVtSUR9LAogICAgICAgICAgICBJbnRlcmZhY2UgPT4gJEludGVyZmFjZS0+e1N0YXRlSUR9LAogICAgICAgICAgICBJUCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5SZW1vdGVBZGRyKCksCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENoZWNrIGlmIHVzZXIgYWxyZWFkeSB2b3RlZCB0aGlzIEZBUSBpdGVtLgogICAgbXkgJEFscmVhZHlWb3RlZDsKICAgIGlmICgkVm90ZURhdGEpIHsKCiAgICAgICAgbXkgJEl0ZW1DaGFuZ2VkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRGQVFEYXRhe0NoYW5nZWR9IHx8ICcnLAogICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICBteSAkVm90ZUNyZWF0ZWRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFZvdGVEYXRhLT57Q3JlYXRlZH0gfHwgJycsCiAgICAgICAgICAgIH0KICAgICAgICApLT5Ub0Vwb2NoKCk7CgogICAgICAgIGlmICggJEl0ZW1DaGFuZ2VkU3lzdGVtVGltZSA8PSAkVm90ZUNyZWF0ZWRTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAkQWxyZWFkeVZvdGVkID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgVm90ZSBTdWItYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZvdGUnICkgewoKICAgICAgICAjIFVzZXIgY2FuJ3QgdXNlIHRoaXMgc3ViLWFjdGlvbiBpZiBpcyBub3QgZW5hYmxlZC4KICAgICAgICBpZiAoICEkVm90aW5nICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RoZSB2b3RpbmcgbWVjaGFuaXNtIGlzIG5vdCBlbmFibGVkIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBVc2VyIGNhbiB2b3RlIG9ubHkgb25jZSBwZXIgRkFRIHJldmlzaW9uLgogICAgICAgIGlmICgkQWxyZWFkeVZvdGVkKSB7CgogICAgICAgICAgICAjIFJlZGlyZWN0IHRvIEZBUSB6b29tLgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAnQWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9JwogICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFte0l0ZW1JRH0KICAgICAgICAgICAgICAgICAgICAuICc7TmF2PSROYXY7Tm90aWZ5PUFscmVhZHlWb3RlZCcKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2V0IHRoZSB2b3RlIGlmIGFueS4KICAgICAgICBlbHNpZiAoIGRlZmluZWQgJEdldFBhcmFte1JhdGV9ICkgewoKICAgICAgICAgICAgIyBHZXQgcmF0ZXMgY29uZmlnLgogICAgICAgICAgICBteSAkVm90aW5nUmF0ZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcycpOwogICAgICAgICAgICBteSAkUmF0ZSAgICAgICAgPSAkR2V0UGFyYW17UmF0ZX07CgogICAgICAgICAgICAjIFNlbmQgZXJyb3IgaWYgcmF0ZSBpcyBub3QgZGVmaW5lZCBpbiBjb25maWcuCiAgICAgICAgICAgIGlmICggISRWb3RpbmdSYXRlcy0+eyRSYXRlfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RoZSB2b3RlIHJhdGUgaXMgbm90IGRlZmluZWQhJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIE90aGVyd2lzZSBhZGQgdGhlIHZvdGUuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEZBUU9iamVjdC0+Vm90ZUFkZCgKICAgICAgICAgICAgICAgICAgICBDcmVhdGVkQnkgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBJUCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5SZW1vdGVBZGRyKCksCiAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICRJbnRlcmZhY2UtPntTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBSYXRlICAgICAgPT4gJEdldFBhcmFte1JhdGV9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgRG8gbm90IHNob3cgdGhlIHZvdGluZyBmb3JtLgogICAgICAgICAgICAgICAgJEFscmVhZHlWb3RlZCA9IDE7CgogICAgICAgICAgICAgICAgIyBSZWZyZXNoIEZBUSBpdGVtIGRhdGEuCiAgICAgICAgICAgICAgICAlRkFRRGF0YSA9ICRGQVFPYmplY3QtPkZBUUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICAgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIEl0ZW1GaWVsZHMgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJUZBUURhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBSZWRpcmVjdCB0byBGQVEgem9vbS4KICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAnQWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9JwogICAgICAgICAgICAgICAgICAgICAgICAuICRHZXRQYXJhbXtJdGVtSUR9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJztOYXY9JE5hdjtOb3RpZnk9VGhhbmtzJwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBVc2VyIGlzIGFibGUgdG8gdm90ZSBidXQgbm8gcmF0ZSBoYXMgYmVlbiBzZWxlY3RlZC4KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgUmVkaXJlY3QgdG8gRkFRIHpvb20KICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gJ0FjdGlvbj1BZ2VudEZBUVpvb207SXRlbUlEPScgLiAkR2V0UGFyYW17SXRlbUlEfSAuICc7TmF2PSROYXY7Tm90aWZ5PU5vUmF0ZScKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAjIEdldCBTaWRlYmFyIGluZm8KICAgICRQYXJhbXtTaWRlQmFyfSA9ICRMYXlvdXRPYmplY3QtPkZBUVNpZGVCYXIoCiAgICAgICAgTW9kZSAgICAgICAgICAgICAgPT4gJ0FnZW50JywKICAgICAgICBMYW5ndWFnZSAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIElzQWxsb3dlZCAgICAgICAgID0+ICRJc0FsbG93ZWQsCiAgICAgICAgSXRlbUlEICAgICAgICAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIElzRGVmYXVsdEFydGljbGUgID0+ICRJc0RlZmF1bHRBcnRpY2xlLAogICAgICAgIEhhc0RlZmF1bHRBcnRpY2xlID0+ICRIYXNEZWZhdWx0QXJ0aWNsZQogICAgKSB8fCAnJzsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBQcmVwYXJlIGZpZWxkcyBkYXRhIChTdGlsbCBuZWVkZWQgZm9yIFBsYWluVGV4dCkuCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKHF3KEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewogICAgICAgIG5leHQgRklFTEQgaWYgISRGQVFEYXRheyRGaWVsZH07CgogICAgICAgICMgUmV3cml0ZSBoYW5kbGUgYW5kIGFjdGlvbiwgdGFrZSBjYXJlIG9mIG9sZCBzdHlsZSBiZWZvcmUgRkFRIDIuMC54LgogICAgICAgICRGQVFEYXRheyRGaWVsZH0gPX4gc3sKICAgICAgICAgICAgQWN0aW9uPUFnZW50RkFRIFsmXShhbXA7KT8gU3ViYWN0aW9uPURvd25sb2FkIFsmXShhbXA7KT8KICAgICAgICB9e0FjdGlvbj1BZ2VudEZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDt9Z3htczsKCiAgICAgICAgIyBObyBxdW90aW5nIGlmIEhUTUwgdmlldyBpcyBlbmFibGVkLgogICAgICAgIG5leHQgRklFTEQgaWYgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKTsKCiAgICAgICAgIyBIVE1MIHF1b3RpbmcuCiAgICAgICAgJEZBUURhdGF7JEZpZWxkfSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRGQVFEYXRheyRGaWVsZH0sCiAgICAgICAgICAgIFZNYXggICAgICAgICAgID0+IDUwMDAsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBHZXQgdXNlciBpbmZvIChDcmVhdGVkQnkpLgogICAgbXkgJVVzZXJJbmZvID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkRkFRRGF0YXtDcmVhdGVkQnl9CiAgICApOwogICAgJFBhcmFte0NyZWF0ZWRCeVVzZXJ9ID0gIiRVc2VySW5mb3tVc2VyRnVsbG5hbWV9IjsKCiAgICAjIEdldCB1c2VyIGluZm8gKENoYW5nZWRCeSkuCiAgICAlVXNlckluZm8gPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRGQVFEYXRhe0NoYW5nZWRCeX0KICAgICk7CiAgICAkUGFyYW17Q2hhbmdlZEJ5VXNlcn0gPSAiJFVzZXJJbmZve1VzZXJGdWxsbmFtZX0iOwoKICAgICMgU2V0IHZvdGluZyByZXN1bHRzLgogICAgJFBhcmFte1ZvdGluZ1Jlc3VsdENvbG9yfSA9ICRMYXlvdXRPYmplY3QtPkdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IoCiAgICAgICAgUmF0ZSA9PiAkRkFRRGF0YXtWb3RlUmVzdWx0fSwKICAgICk7CgogICAgaWYgKCAhJFBhcmFte1ZvdGluZ1Jlc3VsdENvbG9yfSB8fCAkRkFRRGF0YXtWb3Rlc30gZXEgJzAnICkgewogICAgICAgICRQYXJhbXtWb3RpbmdSZXN1bHRDb2xvcn0gPSAnR3JheSc7CiAgICB9CgogICAgaWYgKCAkTmF2IG5lICdOb25lJyApIHsKCiAgICAgICAgIyBSdW4gRkFRIG1lbnUgbW9kdWxlcy4KICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVNZW51cyAgID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgICAgICMgTG9hZCBtb2R1bGUuCiAgICAgICAgICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEZBUURhdGF7SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIFNldCBDU1MgY2xhc3Nlcy4KICAgICAgICAgICAgICAgICAgICBpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkTWVudXN7JE1lbnV9LT57VGFyZ2V0fSBlcSAnUG9wVXAnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e0NsYXNzfSA9ICdBc1BvcHVwJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9IGVxICdCYWNrJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRNZW51c3skTWVudX0tPntDbGFzc30gPSAnSGlzdG9yeUJhY2snOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ0NvbmZpcm1hdGlvbkRpYWxvZycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTWVudXN7JE1lbnV9LT57Q2xhc3N9ID0gJ0FzQ29uZmlybWF0aW9uRGlhbG9nJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgUnVuIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBGQVFJdGVtID0+IHslRkFRRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICAgICAgICAgTWVudUlEICA9PiAnTWVudScgLiAkTWVudSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIE91dHB1dCBhcHByb3ZhbCBzdGF0ZS4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUmVxdWlyZWQnKSApIHsKICAgICAgICAkUGFyYW17QXBwcm92YWx9ID0gJEZBUURhdGF7QXBwcm92ZWR9ID8gJ1llcycgOiAnTm8nOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdWaWV3QXBwcm92YWwnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCRWb3RpbmcpIHsKCiAgICAgICAgIyBPdXRwdXQgdm90ZXMgbnVtYmVyIGlmIGFueS4KICAgICAgICBpZiAoICRGQVFEYXRhe1ZvdGVzfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWaWV3Vm90ZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JUZBUURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBPdGhlcndpc2UgZGlzcGxheSBhIE5vIFZvdGVzIGZvdW5kIG1lc3NhZ2UuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdWaWV3Tm9Wb3RlcycgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNob3dGQVFQYXRoID0gJExheW91dE9iamVjdC0+RkFRUGF0aFNob3coCiAgICAgICAgRkFRT2JqZWN0ICAgPT4gJEZBUU9iamVjdCwKICAgICAgICBDYXRlZ29yeUlEICA9PiAkRkFRRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgUGF0aEZvckl0ZW0gPT4gMSwKICAgICAgICBOYXYgICAgICAgICA9PiAkTmF2LAogICAgKTsKICAgIGlmICgkU2hvd0ZBUVBhdGgpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7JUZBUURhdGF9LAogICAgICAgICAgICBOYXYgID0+ICROYXYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cga2V5d29yZHMgYXMgc2VhcmNoIGxpbmtzLgogICAgaWYgKCAkRkFRRGF0YXtLZXl3b3Jkc30gKSB7CgogICAgICAgICMgUmVwbGFjZSBjb21tYXMgYW5kIHNlbWljb2xvbnMuCiAgICAgICAgJEZBUURhdGF7S2V5d29yZHN9ID1+IHMvLC8gL2c7CiAgICAgICAgJEZBUURhdGF7S2V5d29yZHN9ID1+IHMvOy8gL2c7CgogICAgICAgIG15IEBLZXl3b3JkcyA9IHNwbGl0IC9ccysvLCAkRkFRRGF0YXtLZXl3b3Jkc307CiAgICAgICAgZm9yIG15ICRLZXl3b3JkIChAS2V5d29yZHMpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdLZXl3b3JkcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBLZXl3b3JkID0+ICRLZXl3b3JkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBTaG93IGxhbmd1YWdlcy4KICAgIGlmICgkTXVsdGlMYW5ndWFnZSkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYW5ndWFnZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIE91dHB1dCByYXRpbmcgc3RhcnMuCiAgICBpZiAoJFZvdGluZykgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZBUVJhdGluZ1N0YXJzU2hvdygKICAgICAgICAgICAgVm90ZVJlc3VsdCA9PiAkRkFRRGF0YXtWb3RlUmVzdWx0fSwKICAgICAgICAgICAgVm90ZXMgICAgICA9PiAkRkFRRGF0YXtWb3Rlc30sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJE5hdiBuZSAnTm9uZScgKSB7CgogICAgICAgICMgT3V0cHV0IGV4aXN0aW5nIGF0dGFjaG1lbnRzLgogICAgICAgIG15IEBBdHRhY2htZW50SW5kZXggPSAkRkFRT2JqZWN0LT5BdHRhY2htZW50SW5kZXgoCiAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFNob3dJbmxpbmUgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBPdXRwdXQgaGVhZGVyIGFuZCBhbGwgYXR0YWNobWVudHMuCiAgICAgICAgaWYgKEBBdHRhY2htZW50SW5kZXgpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50SGVhZGVyJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudEluZGV4KSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgU2hvdyBtZXNzYWdlIGFib3V0IGxpbmtzIGluIGlmcmFtZXMsIGlmIHVzZXIgZGlkbid0IGNsb3NlIGl0IGFscmVhZHkuCiAgICBpZiAoICEkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Jyb3dzZXJMaW5rTWVzc2FnZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cgRkFRIENvbnRlbnQuCiAgICBteSAkRkFRQm9keSA9ICRMYXlvdXRPYmplY3QtPkZBUUNvbnRlbnRTaG93KAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIEZBUURhdGEgICAgICAgICA9PiB7JUZBUURhdGF9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgUmV0dXJuQ29udGVudCAgID0+IDEsCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICBab29tID0+IDEKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICApOwoKICAgICMgR2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUuCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIEdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuLgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+ICdGQVEnLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIEdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZC4KICAgICAgICBteSAkVmFsdWVTdHJnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEZBUURhdGF7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjUwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRRHluYW1pY0ZpZWxkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRRHluYW1pY0ZpZWxkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uLgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19QbGFpbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICROYXYgbmUgJ05vbmUnICkgewoKICAgICAgICAjIFNob3cgRkFRIFZvdGluZy4KICAgICAgICBpZiAoJFZvdGluZykgewoKICAgICAgICAgICAgIyBHZXQgdm90aW5nIGNvbmZpZy4KICAgICAgICAgICAgbXkgJFNob3dWb3RpbmdDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpTaG93Jyk7CiAgICAgICAgICAgIGlmICggJFNob3dWb3RpbmdDb25maWctPnsgJEludGVyZmFjZS0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBhbHJlYWR5IHZvdGVkIGFmdGVyIGxhc3QgY2hhbmdlLgogICAgICAgICAgICAgICAgaWYgKCAhJEFscmVhZHlWb3RlZCApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X0ZBUVZvdGluZyggRkFRRGF0YSA9PiB7JUZBUURhdGF9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IGxpbmtlZCBvYmplY3RzLgogICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgICAgICBLZXkgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRMaW5rVGFibGVWaWV3TW9kZSA9ICRDb25maWdPYmplY3QtPkdldCgnTGlua09iamVjdDo6Vmlld01vZGUnKTsKCiAgICAgICAgIyBDcmVhdGUgdGhlIGxpbmsgdGFibGUuCiAgICAgICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkTGF5b3V0T2JqZWN0LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgICAgICBPYmplY3QgICAgICAgICAgID0+ICdGQVEnLAogICAgICAgICAgICBLZXkgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICk7CgogICAgICAgICMgT3V0cHV0IHRoZSBsaW5rIHRhYmxlLgogICAgICAgIGlmICgkTGlua1RhYmxlU3RyZykgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZScgLiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBMb2cgYWNjZXNzIHRvIHRoaXMgRkFRIGl0ZW0uCiAgICAkRkFRT2JqZWN0LT5GQVFMb2dBZGQoCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgIEl0ZW1JRCAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXRlbUlEJyApLAogICAgICAgIEl0ZW1JRCAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgSW50ZXJmYWNlID0+ICRJbnRlcmZhY2UtPntOYW1lfSwKICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIFN0YXJ0IHRlbXBsYXRlIG91dHB1dC4KICAgIGlmICggJE5hdiAmJiAkTmF2IGVxICdOb25lJyApIHsKCiAgICAgICAgIyBPbmx5IGNvbnZlcnQgSFRNTCB0byBwbGFpbiB0ZXh0IGlmIHJpY2ggdGV4dCBlZGl0b3IgaXMgbm90IHVzZWQuCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAkRkFRRGF0YXtGdWxsQm9keX0gPSAkRkFRQm9keTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRGQVFEYXRhe0Z1bGxCb2R5fSA9ICRIVE1MVXRpbHNPYmplY3QtPlRvQXNjaWkoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZBUUJvZHksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCB0aGUgcHVibGljIHN0YXRlIHR5cGUuCiAgICAgICAgbXkgJFB1YmxpY1N0YXRlVHlwZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICAgICAgTmFtZSAgID0+ICdwdWJsaWMnLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgUmVtb3ZlIGluLWxpbmUgaW1hZ2UgbGlua3MgdG8gRkFRIGltYWdlcy4KICAgICAgICAkRkFRRGF0YXtGdWxsQm9keX0KICAgICAgICAgICAgPX4gc3sgPGltZyBbXjw+XSsgQWN0aW9uPShBZ2VudHxDdXN0b21lcnxQdWJsaWMpRkFRIFtePD5dKyA+IH17fWd4bXM7CgogICAgICAgICMgR2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgVGlja2V0IENvbXBvc2UuCiAgICAgICAgbXkgJFRpY2tldENvbXBvc2VDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6VGlja2V0Q29tcG9zZScpOwoKICAgICAgICAkUGFyYW17VXBkYXRlQXJ0aWNsZVN1YmplY3R9ID0gJFRpY2tldENvbXBvc2VDb25maWctPntVcGRhdGVBcnRpY2xlU3ViamVjdH0gfHwgMDsKICAgICAgICBpZiAoICRQYXJhbXtVcGRhdGVBcnRpY2xlU3ViamVjdH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlQXJ0aWNsZVN1YmplY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2VuZCBkYXRhIHRvIEpTLgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldENvbXBvc2UuVXBkYXRlQXJ0aWNsZVN1YmplY3QnLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17VXBkYXRlQXJ0aWNsZVN1YmplY3R9LAogICAgICAgICk7CgogICAgICAgIG15ICRTaG93T3JCbG9jazsKCiAgICAgICAgIyBTaG93ICJJbnNlcnQgVGV4dCIgYnV0dG9uLgogICAgICAgIGlmICggJFRpY2tldENvbXBvc2VDb25maWctPntTaG93SW5zZXJ0VGV4dEJ1dHRvbn0gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFRpY2tldENvbXBvc2VDb25maWctPntJbnNlcnRNZXRob2R9CiAgICAgICAgICAgICAgICAmJiAkVGlja2V0Q29tcG9zZUNvbmZpZy0+e0luc2VydE1ldGhvZH0gZXEgJ0Z1bGwnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luc2VydEZ1bGwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5zZXJ0VGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTaG93T3JCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIEZBUSBhcnRpY2xlIGlzIHB1YmxpYy4KICAgICAgICBpZiAoICRGQVFEYXRhe1N0YXRlVHlwZUlEfSA9PSAkUHVibGljU3RhdGVUeXBlLT57U3RhdGVJRH0gKSB7CgogICAgICAgICAgICBteSAkSFRUUFR5cGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJyk7CiAgICAgICAgICAgIG15ICRGUUROICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnRlFETicpOwogICAgICAgICAgICBteSAkQmFzZWxpbmsgPSAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9OwoKICAgICAgICAgICAgIyBSZXdyaXRlIGhhbmRsZS4KICAgICAgICAgICAgJEJhc2VsaW5rCiAgICAgICAgICAgICAgICA9fiBzeyBpbmRleFsuXXBsIFs/XSB9e3B1YmxpYy5wbD99Z3htczsKCiAgICAgICAgICAgICRGQVFEYXRhe1B1YmxpY2xpbmt9ID0gJEhUVFBUeXBlIC4gJzovLycgLiAkRlFETiAuICRCYXNlbGluawogICAgICAgICAgICAgICAgLiAiQWN0aW9uPVB1YmxpY0ZBUVpvb207SXRlbUlEPSRGQVFEYXRhe0l0ZW1JRH0iOwoKICAgICAgICAgICAgI1NzaG93ICJJbnNlcnQgTGluayIgYnV0dG9uLgogICAgICAgICAgICBpZiAoICRUaWNrZXRDb21wb3NlQ29uZmlnLT57U2hvd0luc2VydExpbmtCdXR0b259ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5zZXJ0TGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2hvd09yQmxvY2sgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNob3cgIkluc2VydCBUZXh0IGFuZCBMaW5rIiBidXR0b24uCiAgICAgICAgICAgIGlmICggJFRpY2tldENvbXBvc2VDb25maWctPntTaG93SW5zZXJ0VGV4dEFuZExpbmtCdXR0b259ICkgewogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJFRpY2tldENvbXBvc2VDb25maWctPntJbnNlcnRNZXRob2R9CiAgICAgICAgICAgICAgICAgICAgJiYgJFRpY2tldENvbXBvc2VDb25maWctPntJbnNlcnRNZXRob2R9IGVxICdGdWxsJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5zZXJ0RnVsbEFuZExpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5zZXJ0VGV4dEFuZExpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU2hvd09yQmxvY2sgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FuY2VsQnV0dG9uQ2xhc3MgPSAnWm9vbVNtYWxsQnV0dG9uJzsKCiAgICAgICAgIyBTaG93IHRoZSAiT3IiIGJsb2NrIGJldHdlZW4gdGhlIGJ1dHRvbnMgYW5kIHRoZSBDYW5jZWwgJiBjbG9zZSB3aW5kb3cgbGFiZWwuCiAgICAgICAgaWYgKCRTaG93T3JCbG9jaykgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ09yJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNldCB0aGUgJENhbmNlbEJ1dHRvbkNsYXNzIHRvICcnLgogICAgICAgICAgICAkQ2FuY2VsQnV0dG9uQ2xhc3MgPSAnJzsKICAgICAgICB9CgogICAgICAgICMgU2VuZCBkYXRhIHRvIEpTLgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0FnZW50RkFRWm9vbVNtYWxsJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUVpvb21TbWFsbCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENhbmNlbEJ1dHRvbkNsYXNzID0+ICRDYW5jZWxCdXR0b25DbGFzcyB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAjIFJlbmRlciBUYWJsZSBvZiBDb250ZW50cwogICAgICAgICRQYXJhbXtUT0N9ID0gJExheW91dE9iamVjdC0+RkFRVGFibGVPZkNvbnRlbnRzKAogICAgICAgICAgICBNb2RlICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIEZBUURhdGEgPT4gXCVGQVFEYXRhCiAgICAgICAgKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRWm9vbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkTmF2ICYmICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICB9CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfRkFRVm90aW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUZBUURhdGEgPSAleyAkUGFyYW17RkFRRGF0YX0gfTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0ZBUVZvdGluZycsCiAgICAgICAgRGF0YSA9PiB7JUZBUURhdGF9LAogICAgKTsKCiAgICAjIEdldCBWb3RpbmcgcmF0ZXMgc2V0dGluZy4KICAgIG15ICRWb3RpbmdSYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpJdGVtOjpWb3Rpbmc6OlJhdGVzJyk7CiAgICBmb3IgbXkgJFJhdGVWYWx1ZSAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICV7JFZvdGluZ1JhdGVzfSApIHsKCiAgICAgICAgIyBDcmVhdGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIG91dHB1dC4KICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgVmFsdWUgPT4gJFJhdGVWYWx1ZSwKICAgICAgICAgICAgVGl0bGUgPT4gJFZvdGluZ1JhdGVzLT57JFJhdGVWYWx1ZX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVZvdGluZ1JhdGVSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/CustomerFAQExplorer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9DdXN0b21lckZBUUV4cGxvcmVyLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lckZBUUV4cGxvcmVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgp1c2UgTUlNRTo6QmFzZTY0IHF3KGRlY29kZV9iYXNlNjQgZW5jb2RlX2Jhc2U2NCk7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVE6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICMgZ2V0IGNvbmZpZyBkYXRhCiAgICBteSAkU3RhcnRIaXQgICAgICAgID0gaW50KCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhcnRIaXQnICkgfHwgMSApOwogICAgbXkgJFNlYXJjaExpbWl0ICAgICA9ICRDb25maWctPntTZWFyY2hMaW1pdH0gICAgIHx8IDIwMDsKICAgIG15ICRTZWFyY2hQYWdlU2hvd24gPSAkQ29uZmlnLT57U2VhcmNoUGFnZVNob3dufSB8fCAzOwogICAgbXkgJFNvcnRCeSAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkQ29uZmlnLT57J1NvcnRCeTo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ0ZBUUlEJzsKICAgIG15ICRPcmRlckJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyJyApCiAgICAgICAgfHwgJENvbmZpZy0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ0Rvd24nOwoKICAgIG15ICRDYXRlZ29yeUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhdGVnb3J5SUQnICkgfHwgMDsKCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgICMgY2hlY2sgZm9yIG5vbiBudW1lcmljIENhdGVnb3J5SUQKICAgIGlmICggJENhdGVnb3J5SUQgIX4gL1xkKy8gKSB7CiAgICAgICAgJENhdGVnb3J5SUQgPSAwOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgYXJ0aWNsZSBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZQogICAgbXkgJEhhc0RlZmF1bHRBcnRpY2xlID0gMDsKICAgIG15ICVEYXRhICAgICAgICAgICAgICA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CgogICAgQ09ORklHOgogICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgIG5leHQgQ09ORklHIGlmICREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9IG5lICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9OwoKICAgICAgICBpZiAoICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH0gKSB7CiAgICAgICAgICAgICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIGxhc3QgQ09ORklHOwogICAgICAgIH0KICAgIH0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBnZXQgY2F0ZWdvcnkgYnkgbmFtZQogICAgbXkgJENhdGVnb3J5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhdGVnb3J5JyApIHx8ICcnOwoKICAgICMgdHJ5IHRvIGdldCB0aGUgQ2F0ZWdvcnkgSUQgZnJvbSBjYXRlZ29yeSBuYW1lIGlmIG5vIENhdGVnb3J5IElECiAgICBpZiAoICRDYXRlZ29yeSAmJiAhJENhdGVnb3J5SUQgKSB7CgogICAgICAgICMgZ2V0IHRoZSBjYXRlZ29yeSB0cmVlCiAgICAgICAgbXkgJENhdGVnb3J5VHJlZSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5VHJlZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXZlcnNlIHRoZSBoYXMgZm9yIGVhc3kgbG9va3VwCiAgICAgICAgbXkgJVJldmVyc2VDYXRlZ29yeVRyZWUgPSByZXZlcnNlICV7JENhdGVnb3J5VHJlZX07CgogICAgICAgICRDYXRlZ29yeUlEID0gJFJldmVyc2VDYXRlZ29yeVRyZWV7JENhdGVnb3J5fSB8fCAwOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAjIHRyeSB0byBnZXQgdGhlIGNhdGVnb3J5IGRhdGEKICAgIG15ICVDYXRlZ29yeURhdGE7CiAgICBpZiAoJENhdGVnb3J5SUQpIHsKCiAgICAgICAgIyBnZXQgY2F0ZWdvcnkgZGF0YQogICAgICAgICVDYXRlZ29yeURhdGEgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICElQ2F0ZWdvcnlEYXRhICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB1c2VyIHBlcm1pc3Npb24KICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRGQVFPYmplY3QtPkNoZWNrQ2F0ZWdvcnlDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgIENhdGVnb3J5SUQgICA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRQZXJtaXNzaW9uICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHN0b3JlIHRoZSBsYXN0IHNjcmVlbiBvdmVydmlldyBpbiBzZXNzaW9uCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICBWYWx1ZSA9PiAnJywKICAgICk7CgogICAgIyBBZGRKU0RhdGEgZm9yIEVTCiAgICBteSAkRVNBY3RpdmUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkFjdGl2ZScpOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnRVNBY3RpdmUnLAogICAgICAgIFZhbHVlID0+ICRFU0FjdGl2ZSwKICAgICk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICBteSAkQ2F0ZWdvcnlJRHNSZWY7CiAgICBteSAlU2VhcmNoOwogICAgbXkgJUZBUVNlYXJjaDsKCiAgICAjIHNob3cgc2VhcmNoIHJlc3VsdHMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VhcmNoJyApIHsKICAgICAgICBteSAkU2VhcmNoTmFtZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VhcmNoIikgLiAiOiI7CiAgICAgICAgZm9yIG15ICRNb2RlIChxdy9LZXl3b3JkIFdoYXQvKSB7CiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTW9kZSApOwogICAgICAgICAgICBpZiAoJFN0cmluZykgewogICAgICAgICAgICAgICAgJFNlYXJjaHskTW9kZX0gICAgPSAkU3RyaW5nOwogICAgICAgICAgICAgICAgJEZBUVNlYXJjaHskTW9kZX0gPSAiKiRTdHJpbmcqIjsKICAgICAgICAgICAgICAgIG15ICRNb2RlTmFtZSA9ICRNb2RlIGVxICdXaGF0JyA/ICdGdWxsdGV4dCcgOiAkTW9kZTsKICAgICAgICAgICAgICAgICRTZWFyY2hOYW1lIC49ICIgIiAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkTW9kZU5hbWUpIC4gIiBcIiRTdHJpbmdcIjsiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjYXRlZ29yeSByb290ICggZG9uZSBpbiBMYXlvdXRPYmplY3QgZm9yIG5vbiBzZWFyY2hlcyApCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVBhdGhDYXRlZ29yeUVsZW1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeU5hbWUnKSwKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBzZWFyY2ggaW5mb3JtYXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aENhdGVnb3J5RWxlbWVudE5vTGluaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAkU2VhcmNoTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGRpc2FibGUgY2F0ZWdvcnkgc3BlY2lmaWMgc3R1ZmYKICAgICAgICAkQ2F0ZWdvcnlJRCA9IC0xOwogICAgfQoKICAgICMgbm8gc2VhcmNoICggc3RhbmRhcmQgbW9kZSApCiAgICBlbHNlIHsKICAgICAgICAjIHNob3cgRkFRIHBhdGgKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GQVFQYXRoU2hvdygKICAgICAgICAgICAgRkFRT2JqZWN0ICA9PiAkRkFRT2JqZWN0LAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhbGwgZGlyZWN0IHN1YmNhdGVnb3JpZXMgb2YgdGhlIHNlbGVjdGVkIGNhdGVnb3J5CiAgICAgICAgJENhdGVnb3J5SURzUmVmID0gJEZBUU9iamVjdC0+Q3VzdG9tZXJDYXRlZ29yeVNlYXJjaCgKICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICBNb2RlICAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGludGVyZmFjZSBzdGF0ZXMgbGlzdAogICAgbXkgJEludGVyZmFjZVN0YXRlcyA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpDdXN0b21lcjo6U3RhdGVUeXBlcycpLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHN1YmNhdGVnb3JpZXMKICAgIGlmICggJENhdGVnb3J5SURzUmVmICYmIHJlZiAkQ2F0ZWdvcnlJRHNSZWYgZXEgJ0FSUkFZJyAmJiBAeyRDYXRlZ29yeUlEc1JlZn0gKSB7CgogICAgICAgICMgc2hvdyBzdWJjYXRlZ29yaWVzIGxpc3QKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3ViY2F0ZWdvcmllcycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBkYXRhIGZvciBlYWNoIHN1YmNhdGVnb3J5CiAgICAgICAgZm9yIG15ICRTdWJDYXRlZ29yeUlEICggQHskQ2F0ZWdvcnlJRHNSZWZ9ICkgewoKICAgICAgICAgICAgbXkgJVN1YkNhdGVnb3J5RGF0YSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5R2V0KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkU3ViQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgdGhlIG51bWJlciBvZiBzdWJjYXRlZ29yaWVzIG9mIHRoaXMgc3ViY2F0ZWdvcnkKICAgICAgICAgICAgJFN1YkNhdGVnb3J5RGF0YXtTdWJDYXRlZ29yeUNvdW50fSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5Q291bnQoCiAgICAgICAgICAgICAgICBQYXJlbnRJRHMgPT4gWyRTdWJDYXRlZ29yeUlEXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB0aGUgbnVtYmVyIG9mIEZBUSBhcnRpY2xlcyBpbiB0aGlzIGNhdGVnb3J5CiAgICAgICAgICAgICRTdWJDYXRlZ29yeURhdGF7QXJ0aWNsZUNvdW50fSA9ICRGQVFPYmplY3QtPkZBUUNvdW50KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgID0+IFskU3ViQ2F0ZWdvcnlJRF0sCiAgICAgICAgICAgICAgICBJdGVtU3RhdGVzICAgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICAgICAgICAgIE9ubHlBcHByb3ZlZCA9PiAxLAogICAgICAgICAgICAgICAgVmFsaWQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgdGhlIGNhdGVnb3J5IGRhdGEKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslU3ViQ2F0ZWdvcnlEYXRhfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBpbnRlcmZhY2Ugc2V0dGluZ3MKICAgIG15ICRJbnRlcmZhY2UgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgTmFtZSAgID0+ICdleHRlcm5hbCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBpbmNsdWRlIENhdGVnb3J5IGlmIG5vdCBpbiBiYXNlIENhdGVnb3J5ICgwKSwgb3Igc2VhcmNoIG1vZGUKICAgIGlmICggJENhdGVnb3J5SUQgPiAwICkgewogICAgICAgICRGQVFTZWFyY2h7Q2F0ZWdvcnlJRHN9ID0gWyRDYXRlZ29yeUlEXTsKICAgIH0KCiAgICAjIGdldCB0aGUgbGF0ZXN0IGFydGljbGVzIGZvciB0aGUgcm9vdCBjYXRlZ29yeSAoZWxzZSBlbXB0eSkKICAgIGVsc2lmICggISVTZWFyY2ggKSB7CiAgICAgICAgJFNvcnRCeSAgICAgID0gJ0NoYW5nZWQnOwogICAgICAgICRPcmRlckJ5ICAgICA9ICdEb3duJzsKICAgICAgICAkU2VhcmNoTGltaXQgPSAxMDsKICAgIH0KCiAgICAjIHNlYXJjaCBhbGwgRkFRIGFydGljbGVzIHdpdGhpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkKICAgIG15IEBWaWV3YWJsZUl0ZW1JRHMgPSAkRkFRT2JqZWN0LT5GQVFTZWFyY2goCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJFNvcnRCeV0sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJE9yZGVyQnldLAogICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gJFNlYXJjaExpbWl0LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFN0YXRlcyAgICAgICAgICAgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+ICRJbnRlcmZhY2UsCiAgICAgICAgJUZBUVNlYXJjaCwKICAgICk7CgogICAgIyBzZXQgdGhlIFNvcnRCeSBDbGFzcwogICAgbXkgJFNvcnRDbGFzczsKCiAgICAjIHRoaXMgc2V0cyB0aGUgb3Bwb3NpdGUgdG8gdGhlIE9yZGVyQnkgcGFyYW1ldGVyCiAgICBpZiAoICRPcmRlckJ5IGVxICdEb3duJyApIHsKICAgICAgICAkU29ydENsYXNzID0gJ1NvcnRBc2NlbmRpbmcnOwogICAgfQogICAgZWxzaWYgKCAkT3JkZXJCeSBlcSAnVXAnICkgewogICAgICAgICRTb3J0Q2xhc3MgPSAnU29ydERlc2NlbmRpbmcnOwogICAgfQoKICAgICMgc2V0IHRoZSBTb3J0QnkgQ2xhc3MgdG8gdGhlIGNvcnJlY3QgZmllbGQKICAgIG15ICVDU1NTb3J0OwogICAgbXkgJENTU1NvcnRCeSA9ICRTb3J0QnkgLiAnU29ydCc7CiAgICAkQ1NTU29ydHskQ1NTU29ydEJ5fSA9ICRTb3J0Q2xhc3M7CgogICAgbXkgJU5ld09yZGVyID0gKAogICAgICAgIERvd24gPT4gJ1VwJywKICAgICAgICBVcCAgID0+ICdEb3duJywKICAgICk7CgogICAgIyBzaG93IHRoZSBGQVEgYXJ0aWNsZSBsaXN0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGQVFJdGVtTGlzdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgICVDU1NTb3J0LAogICAgICAgICAgICBPcmRlciA9PiAkTmV3T3JkZXJ7JE9yZGVyQnl9LAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRNdWx0aUxhbmd1YWdlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Ok11bHRpTGFuZ3VhZ2UnKTsKCiAgICAjIHNob3cgbGFuZ3VhZ2UgaGVhZGVyCiAgICBpZiAoJE11bHRpTGFuZ3VhZ2UpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgICAgICAlQ1NTU29ydCwKICAgICAgICAgICAgICAgIE9yZGVyID0+ICROZXdPcmRlcnskT3JkZXJCeX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ291bnRlciA9IDA7CiAgICBpZiAoQFZpZXdhYmxlSXRlbUlEcykgewoKICAgICAgICBmb3IgbXkgJEl0ZW1JRCAoQFZpZXdhYmxlSXRlbUlEcykgewoKICAgICAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgICAgICMgYnVpbGQgc2VhcmNoIHJlc3VsdAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ291bnRlciA+PSAkU3RhcnRIaXQKICAgICAgICAgICAgICAgICYmICRDb3VudGVyIDwgKCAkU2VhcmNoUGFnZVNob3duICsgJFN0YXJ0SGl0ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG15ICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBJdGVtRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgICAgJEZBUURhdGF7SWNvbn0gPSAkRkFRRGF0YXtJY29ufSA/IGRlY29kZV9iYXNlNjQoICRGQVFEYXRhe0ljb259ICkgOiAnJzsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgICAgICAgICAgICAgJEZBUURhdGF7Q2xlYW5UaXRsZX0gPSAkRkFRT2JqZWN0LT5GQVFBcnRpY2xlVGl0bGVDbGVhbigKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkRkFRRGF0YXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgPT4gJENvbmZpZy0+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+RXJyb3JTY3JlZW4oKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICMgR2V0IFNpZGViYXIgaW5mbwogICAgJFBhcmFte1NpZGVCYXJ9ID0gJExheW91dE9iamVjdC0+RkFRU2lkZUJhcigKICAgICAgICBNb2RlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSB8fCAnZW4nLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBJc0FsbG93ZWQgICAgICAgICA9PiAxLAogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+IDAsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIEhhc0RlZmF1bHRBcnRpY2xlID0+ICRIYXNEZWZhdWx0QXJ0aWNsZSwKICAgICk7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJGQVFFeHBsb3JlcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAlQ2F0ZWdvcnlEYXRhLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/CustomerFAQZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9DdXN0b21lckZBUVpvb20ucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyRkFRWm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCBlbmNvZGVfYmFzZTY0KTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3tVc2VyQ3VzdG9tZXJEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgJEdldFBhcmFte0l0ZW1JRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXRlbUlEJyApOwogICAgJEdldFBhcmFte1JhdGV9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUmF0ZScgKTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgIyBHZXQgZGVmYXVsdCBJdGVtSUQgaWYgaXQncyBkZWZpbmVkCiAgICBteSAkSXNEZWZhdWx0QXJ0aWNsZSAgPSAwOwogICAgbXkgJEhhc0RlZmF1bHRBcnRpY2xlID0gMDsKICAgIG15ICVEYXRhICAgICAgICAgICAgICA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CiAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gfHw9ICdlbic7CgogICAgQ09ORklHOgogICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgIG5leHQgQ09ORklHIGlmICREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9IG5lICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9OwoKICAgICAgICBpZiAoICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH0gKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0l0ZW1JRH0gPSAkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9OwogICAgICAgICAgICAgICAgJElzRGVmYXVsdEFydGljbGUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIGxhc3QgQ09ORklHOwogICAgICAgIH0KICAgIH0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBzYXZlLCBpZiBicm93c2VyIGxpbmsgbWVzc2FnZSB3YXMgY2xvc2VkCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQnJvd3NlckxpbmtNZXNzYWdlJyApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyQ3VzdG9tZXJEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2UnLAogICAgICAgICAgICBWYWx1ZSAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+IDEsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewojICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKIyAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZCBJdGVtSUQhJyksCiMgICAgICAgICApOwojICAgICB9CiAgICAjIFNob3cgbWVzc2FnZSBhbmQgbGluayB0byBGQVEgRXhwbG9yZXIgaWYgbm8gZGVmYXVsdCBpdGVtIGlzIHNldCBhbmQgbm8gSXRlbUlEIHByb3ZpZGVkCiAgICBteSAkT3V0cHV0OwoKICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRQYXJhbXtDc3NDbGFzc05vQXJ0aWNsZX0gPSAnSGlkZGVuJzsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRGVmYXVsdEl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyRkFRWm9vbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQgLiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwogICAgfQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgIG15ICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CiAgICBpZiAoICElRkFRRGF0YSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKCk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAkRkFRRGF0YXtJY29ufSA9ICRGQVFEYXRhe0ljb259ID8gZGVjb2RlX2Jhc2U2NCggJEZBUURhdGF7SWNvbn0gKSA6ICcnOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAjIGdldCB0aGUgdmFsaWQgaWRzCiAgICBteSBAVmFsaWRJRHMgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwogICAgbXkgJVZhbGlkSURMb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQFZhbGlkSURzOwoKICAgICMgY2hlY2sgdXNlciBwZXJtaXNzaW9uCiAgICBteSAkUGVybWlzc2lvbiA9ICRGQVFPYmplY3QtPkNoZWNrQ2F0ZWdvcnlDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICBDYXRlZ29yeUlEICAgPT4gJEZBUURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgaW50ZXJmYWNlIHN0YXRlIGxpc3QKICAgIG15ICRJbnRlcmZhY2VTdGF0ZXMgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Q3VzdG9tZXI6OlN0YXRlVHlwZXMnKSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIGlmICgKICAgICAgICAhJFBlcm1pc3Npb24KICAgICAgICB8fCAhJEZBUURhdGF7QXBwcm92ZWR9CiAgICAgICAgfHwgISRWYWxpZElETG9va3VweyAkRkFRRGF0YXtWYWxpZElEfSB9CiAgICAgICAgfHwgISRJbnRlcmZhY2VTdGF0ZXMtPnsgJEZBUURhdGF7U3RhdGVUeXBlSUR9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBzdG9yZSB0aGUgbGFzdCBzY3JlZW4gaW4gc2Vzc2lvbgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEhUTUxWaWV3IFN1YmFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdIVE1MVmlldycgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRGaWVsZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaWVsZCIgKTsKCiAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KCBJdGVtSUQgRmllbGQgKSkgewogICAgICAgICAgICBpZiAoICEkTmVlZGVkICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZGVkIFBhcmFtOiAkTmVlZGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgRmllbGQgY29udGVudAogICAgICAgIG15ICRGaWVsZENvbnRlbnQgPSAkRkFRT2JqZWN0LT5JdGVtRmllbGRHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgRmllbGQgID0+ICRGaWVsZCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHJld3JpdGUgaGFuZGxlIGFuZCBhY3Rpb24KICAgICAgICAkRmllbGRDb250ZW50CiAgICAgICAgICAgID1+IHN7IGluZGV4Wy5dcGwgWz9dIEFjdGlvbj1BZ2VudEZBUVpvb20gfXtjdXN0b21lci5wbD9BY3Rpb249Q3VzdG9tZXJGQVFab29tfWd4bXM7CgogICAgICAgICMgdGFrZSBjYXJlIG9mIG9sZCBzdHlsZSBiZWZvcmUgRkFRIDIuMC54CiAgICAgICAgJEZpZWxkQ29udGVudCA9fiBzewogICAgICAgICAgICBpbmRleFsuXXBsIFs/XSBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgIH17Y3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyRkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O31neG1zOwoKICAgICAgICAjIGJ1aWxkIGJhc2UgVVJMIGZvciBpbmxpbmUgaW1hZ2VzCiAgICAgICAgbXkgJFNlc3Npb25JRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntTZXNzaW9uSUR9ICYmICEkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0gKSB7CiAgICAgICAgICAgICRTZXNzaW9uSUQgPSAnOycgLiAkU2VsZi0+e1Nlc3Npb25OYW1lfSAuICc9JyAuICRTZWxmLT57U2Vzc2lvbklEfTsKICAgICAgICAgICAgJEZpZWxkQ29udGVudCA9fiBzewogICAgICAgICAgICAgICAgKEFjdGlvbj1DdXN0b21lckZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtJdGVtSUQ9XGQrO0ZpbGVJRD1cZCspCiAgICAgICAgICAgIH17JDEkU2Vzc2lvbklEfWdtc3g7CiAgICAgICAgfQoKICAgICAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgICAgICAjIGNvbnZlcnQgY29udGVudCB0byBIVE1MIGlmIG5lZWRlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAkRkFRRGF0YXtDb250ZW50VHlwZX0gbmUgJ3RleHQvaHRtbCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBEZXRlY3QgYWxsIHBsYWluIHRleHQgbGlua3MgYW5kIHB1dCB0aGVtIGludG8gYW4gSFRNTCA8YT4gdGFnLgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgICAgICk7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgIyBzZXQgdGFyZ2V0PSJfcGFyZW50IiBmb3IgbGlua3MgdG8gb3RoZXIgYXJ0aWNsZXMgdmlhIG1lbnRpb24KICAgICAgICAkRmllbGRDb250ZW50ID0gJEZBUU9iamVjdC0+TGlua1F1b3RlTWVudGlvbigKICAgICAgICAgICAgU3RyaW5nID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgICAgICMgU2V0IHRhcmdldD0iX2JsYW5rIiBhdHRyaWJ1dGUgdG8gYWxsIEhUTUwgPGE+IHRhZ3MgdGhlIExpbmtRdW90ZSBmdW5jdGlvbiBuZWVkcyB0byBiZQogICAgICAgICMgICBjYWxsZWQgYWdhaW4KICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICAgICAgVGFyZ2V0QWRkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgbmVlZGVkIEhUTUwgaGVhZGVycwogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICA9PiAndXRmLTgnLAogICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSA9PiAxLAogICAgICAgICAgICBDdXN0b21lclVJU3R5bGVzICA9PiAxLAogICAgICAgICk7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICAkRmllbGRDb250ZW50ID1+IHN7KDxoKFsxLTZdKT4uKj88L2hcMj4pfXsgJENvdW50Kys7ICI8YSBpZD1cIiRGaWVsZC0kQ291bnRcIj4mbmJzcDs8L2E+JDEifWdlOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAgICAgIyByZXR1cm4gY29tcGxldGUgSFRNTCBhcyBhbiBhdHRhY2htZW50CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIERvd25sb2FkQXR0YWNobWVudCBTdWJhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG93bmxvYWRBdHRhY2htZW50JyApIHsKCiAgICAgICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgICAgICRHZXRQYXJhbXtGaWxlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbGVJRCcgKTsKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtGaWxlSUR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgRmlsZUlEIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXR0YWNobWVudHMKICAgICAgICBteSAlRmlsZSA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgRmlsZUlEID0+ICRHZXRQYXJhbXtGaWxlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCVGaWxlKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KCVGaWxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggYXR0YWNobWVudCAoJEdldFBhcmFte0ZpbGVJRH0pISBNYXkgYmUgYW4gYXR0YWNrISEhIiwKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoKTsKICAgICAgICB9CiAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgIFZhbHVlID0+ICRGQVFEYXRhe1RpdGxlfSwKICAgICk7CgogICAgIyBBZGRKU0RhdGEgZm9yIEVTCiAgICBteSAkRVNBY3RpdmUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkFjdGl2ZScpOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnRVNBY3RpdmUnLAogICAgICAgIFZhbHVlID0+ICRFU0FjdGl2ZSwKICAgICk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHNldCBkZWZhdWx0IGludGVyZmFjZSBzZXR0aW5ncwogICAgbXkgJEludGVyZmFjZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ2V4dGVybmFsJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB2b3RpbmcgZGVmYXVsdCBvcHRpb24KICAgIG15ICRWb3RpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Vm90aW5nJyk7CgogICAgIyBnZXQgRkFRIHZvdGUgaW5mb3JtYXRpb24KICAgIG15ICRWb3RlRGF0YTsKICAgIGlmICgkVm90aW5nKSB7CiAgICAgICAgJFZvdGVEYXRhID0gJEZBUU9iamVjdC0+Vm90ZUdldCgKICAgICAgICAgICAgQ3JlYXRlQnkgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRGQVFEYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgIEludGVyZmFjZSA9PiAkSW50ZXJmYWNlLT57U3RhdGVJRH0sCiAgICAgICAgICAgIElQICAgICAgICA9PiAkUGFyYW1PYmplY3QtPlJlbW90ZUFkZHIoKSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBhbHJlYWR5IHZvdGVkIHRoaXMgRkFRIGl0ZW0KICAgIG15ICRBbHJlYWR5Vm90ZWQ7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICBteSAkVm90ZU1lc3NhZ2U7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgIGlmICgkVm90ZURhdGEpIHsKCiAgICAgICAgbXkgJEl0ZW1DaGFuZ2VkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRGQVFEYXRhe0NoYW5nZWR9IHx8ICcnLAogICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICBteSAkVm90ZUNyZWF0ZWRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFZvdGVEYXRhLT57Q3JlYXRlZH0gfHwgJycsCiAgICAgICAgICAgIH0KICAgICAgICApLT5Ub0Vwb2NoKCk7CgogICAgICAgIGlmICggJEl0ZW1DaGFuZ2VkU3lzdGVtVGltZSA8PSAkVm90ZUNyZWF0ZWRTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAkQWxyZWFkeVZvdGVkID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgVm90ZSBTdWJhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVm90ZScgKSB7CgogICAgICAgICMgY3VzdG9tZXIgY2FuJ3QgdXNlIHRoaXMgc3ViLWFjdGlvbiBpZiBpcyBub3QgZW5hYmxlZAogICAgICAgIGlmICggISRWb3RpbmcgKSB7CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiMgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUaGUgdm90aW5nIG1lY2hhbmlzbSBpcyBub3QgZW5hYmxlZCEnKSwKIyAgICAgICAgICAgICApOwogICAgICAgICAgICAkVm90ZU1lc3NhZ2UgPSBUcmFuc2xhdGFibGUoJ1RoZSB2b3RpbmcgbWVjaGFuaXNtIGlzIG5vdCBlbmFibGVkIScpOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICB9CgogICAgICAgICMgdXNlciBjYW4gdm90ZSBvbmx5IG9uY2UgcGVyIEZBUSByZXZpc2lvbgogICAgICAgIGlmICgkQWxyZWFkeVZvdGVkKSB7CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKIyAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKIyAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdZb3UgaGF2ZSBhbHJlYWR5IHZvdGVkIScpLAojICAgICAgICAgICAgICk7CiAgICAgICAgICAgICRWb3RlTWVzc2FnZSA9IFRyYW5zbGF0YWJsZSgnWW91IGhhdmUgYWxyZWFkeSB2b3RlZCEnKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aGUgdm90ZSBpZiBhbnkKICAgICAgICBlbHNpZiAoIGRlZmluZWQgJEdldFBhcmFte1JhdGV9ICkgewoKICAgICAgICAgICAgIyBnZXQgcmF0ZXMgY29uZmlnCiAgICAgICAgICAgIG15ICRWb3RpbmdSYXRlcyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpJdGVtOjpWb3Rpbmc6OlJhdGVzJyk7CiAgICAgICAgICAgIG15ICRSYXRlICAgICAgICA9ICRHZXRQYXJhbXtSYXRlfTsKCiAgICAgICAgICAgICMgc2VuZCBlcnJvciBpZiByYXRlIGlzIG5vdCBkZWZpbmVkIGluIGNvbmZpZwogICAgICAgICAgICBpZiAoICEkVm90aW5nUmF0ZXMtPnskUmF0ZX0gKSB7CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAojICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RoZSB2b3RlIHJhdGUgaXMgbm90IGRlZmluZWQhJyksCiMgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVm90ZU1lc3NhZ2UgPSBUcmFuc2xhdGFibGUoJ1RoZSB2b3RlIHJhdGUgaXMgbm90IGRlZmluZWQhJyk7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG90aGVyd2lzZSBhZGQgdGhlIHZvdGUKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRkFRT2JqZWN0LT5Wb3RlQWRkKAogICAgICAgICAgICAgICAgICAgIENyZWF0ZWRCeSA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIElQICAgICAgICA9PiAkUGFyYW1PYmplY3QtPlJlbW90ZUFkZHIoKSwKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJEludGVyZmFjZS0+e1N0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFJhdGUgICAgICA9PiAkR2V0UGFyYW17UmF0ZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBkbyBub3Qgc2hvdyB0aGUgdm90aW5nIGZvcm0KICAgICAgICAgICAgICAgICRBbHJlYWR5Vm90ZWQgPSAxOwoKICAgICAgICAgICAgICAgICMgcmVmcmVzaCBGQVEgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICAlRkFRRGF0YSA9ICRGQVFPYmplY3QtPkZBUUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIEl0ZW1GaWVsZHMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAkRkFRRGF0YXtJY29ufSA9ICRGQVFEYXRhe0ljb259ID8gZGVjb2RlX2Jhc2U2NCggJEZBUURhdGF7SWNvbn0gKSA6ICcnOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAgICAgICAgICAgICBpZiAoICElRkFRRGF0YSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAojICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiBUcmFuc2xhdGFibGUoJ1RoYW5rcyBmb3IgeW91ciB2b3RlIScpLAojICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFZvdGVNZXNzYWdlID0gVHJhbnNsYXRhYmxlKCdUaGFua3MgZm9yIHlvdXIgdm90ZSEnKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXNlciBpcyBhYmxlIHRvIHZvdGUgYnV0IG5vIHJhdGUgaGFzIGJlZW4gc2VsZWN0ZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdObyByYXRlIHNlbGVjdGVkIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgZmllbGRzIGRhdGEgKFN0aWxsIG5lZWRlZCBmb3IgUGxhaW5UZXh0KQogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChxdyhGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNikpIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRkFRRGF0YXskRmllbGR9OwoKICAgICAgICAjIHJld3JpdGUgbGlua3MgdG8gZW1iZWRkZWQgaW1hZ2VzIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBpZiAoICRJbnRlcmZhY2UtPntOYW1lfSBlcSAnZXh0ZXJuYWwnICkgewoKICAgICAgICAgICAgIyByZXdyaXRlIGhhbmRsZSBhbmQgYWN0aW9uCiAgICAgICAgICAgICRGQVFEYXRheyRGaWVsZH0KICAgICAgICAgICAgICAgID1+IHN7IGluZGV4Wy5dcGwgWz9dIEFjdGlvbj1BZ2VudEZBUVpvb20gfXtjdXN0b21lci5wbD9BY3Rpb249Q3VzdG9tZXJGQVFab29tfWd4bXM7CgogICAgICAgICAgICAjIHRha2UgY2FyZSBvZiBvbGQgc3R5bGUgYmVmb3JlIEZBUSAyLjAueAogICAgICAgICAgICAkRkFRRGF0YXskRmllbGR9ID1+IHN7CiAgICAgICAgICAgICAgICBpbmRleFsuXXBsIFs/XSBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgICAgICB9e2N1c3RvbWVyLnBsP0FjdGlvbj1DdXN0b21lckZBUVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDt9Z3htczsKICAgICAgICB9CgogICAgICAgICMgbm8gcXVvdGluZyBpZiBIVE1MIHZpZXcgaXMgZW5hYmxlZAogICAgICAgIG5leHQgRklFTEQgaWYgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKTsKCiAgICAgICAgIyBIVE1MIHF1b3RpbmcKICAgICAgICAkRkFRRGF0YXskRmllbGR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJEZBUURhdGF7JEZpZWxkfSwKICAgICAgICAgICAgVk1heCAgICAgICAgICAgPT4gNTAwMCwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHZvdGluZyByZXN1bHRzCiAgICAkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9ID0gJExheW91dE9iamVjdC0+R2V0RkFRSXRlbVZvdGluZ1JhdGVDb2xvcigKICAgICAgICBSYXRlID0+ICRGQVFEYXRhe1ZvdGVSZXN1bHR9LAogICAgKTsKCiAgICBpZiAoICEkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9IHx8ICRGQVFEYXRhe1ZvdGVzfSBlcSAnMCcgKSB7CiAgICAgICAgJFBhcmFte1ZvdGluZ1Jlc3VsdENvbG9yfSA9ICdHcmF5JzsKICAgIH0KCiAgICAjIHNob3cgYmFjayBsaW5rCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCYWNrJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgZ2V0IG11bHRpLWxhbmd1YWdlIGRlZmF1bHQgb3B0aW9uCiAgICBteSAkTXVsdGlMYW5ndWFnZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpNdWx0aUxhbmd1YWdlJyk7CgogICAgIyBzaG93IGxhbmd1YWdlCiAgICBpZiAoJE11bHRpTGFuZ3VhZ2UpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgIyBzaG93IHZvdGVzCiMgICAgIGlmICgkVm90aW5nKSB7CiMKIyAgICAgICAgICMgYWx3YXlzIGRpc3BsYXlzIFZvdGVzIHJlc3VsdCBldmVuIGlmIGl0cyAwCiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKIyAgICAgICAgICAgICBOYW1lID0+ICdWaWV3Vm90ZXMnLAojICAgICAgICAgICAgIERhdGEgPT4geyVGQVFEYXRhfSwKIyAgICAgICAgICk7CiMgICAgIH0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBzaG93IEZBUSBwYXRoCiAgICBteSAkU2hvd0ZBUVBhdGggPSAkTGF5b3V0T2JqZWN0LT5GQVFQYXRoU2hvdygKICAgICAgICBGQVFPYmplY3QgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIENhdGVnb3J5SUQgID0+ICRGQVFEYXRhe0NhdGVnb3J5SUR9LAogICAgICAgIFBhdGhGb3JJdGVtID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICgkU2hvd0ZBUVBhdGgpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7JUZBUURhdGF9LAogICAgICAgICk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICMgc2hvdyBrZXl3b3JkcyBhcyBzZWFyY2ggbGlua3MKIyAgICAgaWYgKCAkRkFRRGF0YXtLZXl3b3Jkc30gKSB7CiMKIyAgICAgICAgICMgcmVwbGFjZSBjb21tYXMgYW5kIHNlbWljb2xvbnMKIyAgICAgICAgICRGQVFEYXRhe0tleXdvcmRzfSA9fiBzLywvIC9nOwojICAgICAgICAgJEZBUURhdGF7S2V5d29yZHN9ID1+IHMvOy8gL2c7CiMKIyAgICAgICAgIG15IEBLZXl3b3JkcyA9IHNwbGl0IC9ccysvLCAkRkFRRGF0YXtLZXl3b3Jkc307CiMgICAgICAgICBmb3IgbXkgJEtleXdvcmQgKEBLZXl3b3JkcykgewojICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAojICAgICAgICAgICAgICAgICBOYW1lID0+ICdLZXl3b3JkcycsCiMgICAgICAgICAgICAgICAgIERhdGEgPT4gewojICAgICAgICAgICAgICAgICAgICAgS2V5d29yZCA9PiAkS2V5d29yZCwKIyAgICAgICAgICAgICAgICAgfSwKIyAgICAgICAgICAgICApOwojICAgICAgICAgfQojICAgICB9CiMKIyAgICAgIyBvdXRwdXQgcmF0aW5nIHN0YXJzCiMgICAgIGlmICgkVm90aW5nKSB7CiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GQVFSYXRpbmdTdGFyc1Nob3coCiMgICAgICAgICAgICAgVm90ZVJlc3VsdCA9PiAkRkFRRGF0YXtWb3RlUmVzdWx0fSwKIyAgICAgICAgICAgICBWb3RlcyAgICAgID0+ICRGQVFEYXRhe1ZvdGVzfSwKIyAgICAgICAgICk7CiMgICAgIH0KIwojICAgICAjIG91dHB1dCBhdHRhY2htZW50cyBpZiBhbnkKIyAgICAgbXkgQEF0dGFjaG1lbnRJbmRleCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRJbmRleCgKIyAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiMgICAgICAgICBTaG93SW5saW5lID0+IDAsCiMgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKIyAgICAgKTsKIwojICAgICAjIG91dHB1dCBhdHRhY2htZW50cwojICAgICBpZiAoQEF0dGFjaG1lbnRJbmRleCkgewojICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiMgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudEhlYWRlcicsCiMgICAgICAgICApOwojICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudEluZGV4KSB7CiMgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiMgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3cnLAojICAgICAgICAgICAgICAgICBEYXRhID0+IHsKIyAgICAgICAgICAgICAgICAgICAgICVGQVFEYXRhLAojICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiMgICAgICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICAgKTsKIyAgICAgICAgIH0KIyAgICAgfQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAjIHNob3cgbWVzc2FnZSBhYm91dCBsaW5rcyBpbiBpZnJhbWVzLCBpZiB1c2VyIGRpZG4ndCBjbG9zZSBpdCBhbHJlYWR5CiAgICBpZiAoICEkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Jyb3dzZXJMaW5rTWVzc2FnZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgRkFRIENvbnRlbnQKICAgICRMYXlvdXRPYmplY3QtPkZBUUNvbnRlbnRTaG93KAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIEZBUURhdGEgICAgICAgICA9PiB7JUZBUURhdGF9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICBab29tID0+IDEKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiMgICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiMgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAojICAgICAgICAgT2JqZWN0VHlwZSAgPT4gJ0ZBUScsCiMgICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKIyAgICAgKTsKIwojICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKIwojICAgICBEWU5BTUlDRklFTEQ6CiMgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKIyAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKIwojICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAojICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAojICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKIyAgICAgICAgICk7CiMKIyAgICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiMgICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKIyAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKIyAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAojICAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAyNTAsCiMgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiMgICAgICAgICApOwojCiMgICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwojCiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKIyAgICAgICAgICAgICBOYW1lID0+ICdGQVFEeW5hbWljRmllbGQnLAojICAgICAgICAgICAgIERhdGEgPT4gewojICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiMgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiMgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiMgICAgICAgICAgICAgfSwKIyAgICAgICAgICk7CiMKIyAgICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKIyAgICAgICAgICAgICBOYW1lID0+ICdGQVFEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKIyAgICAgICAgICAgICBEYXRhID0+IHsKIyAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAojICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAojICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAojICAgICAgICAgICAgIH0sCiMgICAgICAgICApOwojICAgICB9CiMKIyAgICAgIyBzaG93IEZBUSBWb3RpbmcKIyAgICAgaWYgKCRWb3RpbmcpIHsKIwojICAgICAgICAgIyBnZXQgdm90aW5nIGNvbmZpZwojICAgICAgICAgbXkgJFNob3dWb3RpbmdDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpTaG93Jyk7CiMgICAgICAgICBpZiAoICRTaG93Vm90aW5nQ29uZmlnLT57ICRJbnRlcmZhY2UtPntOYW1lfSB9ICkgewojCiMgICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgdXNlciBhbHJlYWR5IHZvdGVkIGFmdGVyIGxhc3QgY2hhbmdlCiMgICAgICAgICAgICAgaWYgKCAhJEFscmVhZHlWb3RlZCApIHsKIyAgICAgICAgICAgICAgICAgJFNlbGYtPl9GQVFWb3RpbmcoIEZBUURhdGEgPT4geyVGQVFEYXRhfSApOwojICAgICAgICAgICAgIH0KIyAgICAgICAgIH0KIyAgICAgfQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAjIGxvZyBhY2Nlc3MgdG8gdGhpcyBGQVEgaXRlbQogICAgJEZBUU9iamVjdC0+RkFRTG9nQWRkKAojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICBJdGVtSUQgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0l0ZW1JRCcgKSwKICAgICAgICBJdGVtSUQgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgIEludGVyZmFjZSA9PiAkSW50ZXJmYWNlLT57TmFtZX0sCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAjIEdldCBTaWRlYmFyIGluZm8KICAgICRQYXJhbXtTaWRlQmFyfSA9ICRMYXlvdXRPYmplY3QtPkZBUVNpZGVCYXIoCiAgICAgICAgTW9kZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICBMYW5ndWFnZSAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIElzQWxsb3dlZCAgICAgICAgID0+IDEsCiAgICAgICAgSXRlbUlEICAgICAgICAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIElzRGVmYXVsdEFydGljbGUgID0+ICRJc0RlZmF1bHRBcnRpY2xlLAogICAgICAgIEhhc0RlZmF1bHRBcnRpY2xlID0+ICRIYXNEZWZhdWx0QXJ0aWNsZQogICAgKSB8fCAnJzsKCiAgICAjIFJlbmRlciBUYWJsZSBvZiBDb250ZW50cwogICAgJFBhcmFte1RPQ30gPSAkTGF5b3V0T2JqZWN0LT5GQVFUYWJsZU9mQ29udGVudHMoCiAgICAgICAgTW9kZSAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgIEZBUURhdGEgPT4gXCVGQVFEYXRhCiAgICApOwoKICAgICMgUmVuZGVyIEFkZGlvbmFsIGRhdGEgd2lkZ2V0CiAgICAkUGFyYW17QWRkaXRpb25hbERhdGF9ID0gJExheW91dE9iamVjdC0+RkFRQWRkaXRpb25hbERhdGEoCiAgICAgICAgTW9kZSAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICBGQVFEYXRhICAgICA9PiBcJUZBUURhdGEsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFZvdGVNZXNzYWdlID0+ICRWb3RlTWVzc2FnZSB8fCAnJywKICAgICAgICBBY3Rpb24gICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgQ29uZmlnICAgICAgPT4gJENvbmZpZwogICAgKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckZBUVpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9GQVFWb3RpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRkFRRGF0YSA9ICV7ICRQYXJhbXtGQVFEYXRhfSB9OwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRkFRVm90aW5nJywKICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICApOwoKICAgICMgZ2V0IFZvdGluZyByYXRlcyBzZXR0aW5nCiAgICBteSAkVm90aW5nUmF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcycpOwogICAgZm9yIG15ICRSYXRlVmFsdWUgKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyRWb3RpbmdSYXRlc30gKSB7CgogICAgICAgICMgY3JlYXRlIGRhdGEgc3RydWN0dXJlIGZvciBvdXRwdXQKICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgVmFsdWUgPT4gJFJhdGVWYWx1ZSwKICAgICAgICAgICAgVGl0bGUgPT4gJFZvdGluZ1JhdGVzLT57JFJhdGVWYWx1ZX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVZvdGluZ1JhdGVSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/PublicFAQExplorer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9QdWJsaWNGQVFFeHBsb3Jlci5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6UHVibGljRkFRRXhwbG9yZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCBlbmNvZGVfYmFzZTY0KTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgp1c2UgTUlNRTo6QmFzZTY0IHF3KCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IFVzZXJJRCB0byByb290IGJlY2F1c2UgaW4gcHVibGljIGludGVyZmFjZSB0aGVyZSBpcyBubyB1c2VyCiAgICAkU2VsZi0+e1VzZXJJRH0gPSAxOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBjb25maWcgZGF0YQogICAgbXkgJFN0YXJ0SGl0ICAgICAgICA9IGludCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0SGl0JyApIHx8IDEgKTsKICAgIG15ICRTZWFyY2hMaW1pdCAgICAgPSAkQ29uZmlnLT57U2VhcmNoTGltaXR9ICAgICB8fCAyMDA7CiAgICBteSAkU2VhcmNoUGFnZVNob3duID0gJENvbmZpZy0+e1NlYXJjaFBhZ2VTaG93bn0gfHwgMzsKICAgIG15ICRTb3J0QnkgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU29ydEJ5JyApCiAgICAgICAgfHwgJENvbmZpZy0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdGQVFJRCc7CiAgICBteSAkT3JkZXJCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlcicgKQogICAgICAgIHx8ICRDb25maWctPnsnT3JkZXI6OkRlZmF1bHQnfQogICAgICAgIHx8ICdEb3duJzsKCiAgICAjIGdldCBJdGVtIElECiAgICBteSAkSXRlbUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0l0ZW1JRCcgKSB8fCAwOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBJdGVtSUQgcGFyYW1ldGVyIHdhcyBzZW50IGFuZCByZWRpcmVjdCB0byBGQVEgYXJ0aWNsZSB6b29tIHNjcmVlbgogICAgaWYgKCRJdGVtSUQpIHsKCiAgICAgICAgIyByZWRpcmVjdCB0byBGQVEgem9vbQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gJ0FjdGlvbj1QdWJsaWNGQVFab29tO0l0ZW1JRD0nIC4gJEl0ZW1JRCApOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgYXJ0aWNsZSBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZQogICAgbXkgJEhhc0RlZmF1bHRBcnRpY2xlID0gMDsKICAgIG15ICVEYXRhICAgICAgICAgICAgICA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUHVibGljRkFRU2lkZUJhcjo6QXJ0aWNsZXMnKSB9OwoKICAgIENPTkZJRzoKICAgIGZvciBteSAkQ29uZmlnICgga2V5cyAlRGF0YSApIHsKICAgICAgICBuZXh0IENPTkZJRyBpZiAkRGF0YXskQ29uZmlnfS0+e0xhbmd1YWdlfSBuZSAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfTsKCiAgICAgICAgaWYgKCAkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9ICkgewogICAgICAgICAgICAkSGFzRGVmYXVsdEFydGljbGUgPSAxOwogICAgICAgICAgICBsYXN0IENPTkZJRzsKICAgICAgICB9CiAgICB9CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgIG15ICRDYXRlZ29yeUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhdGVnb3J5SUQnICkgfHwgMDsKCiAgICAjIGNoZWNrIGZvciBub24gbnVtZXJpYyBDYXRlZ29yeUlECiAgICBpZiAoICRDYXRlZ29yeUlEICF+IC9cZCsvICkgewogICAgICAgICRDYXRlZ29yeUlEID0gMDsKICAgIH0KCiAgICAjIGdldCBjYXRlZ29yeSBieSBuYW1lCiAgICBteSAkQ2F0ZWdvcnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2F0ZWdvcnknICkgfHwgJyc7CgogICAgbXkgJEZBUU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiAgICAjIHRyeSB0byBnZXQgdGhlIGNhdGVnb3J5IElEIGZyb20gY2F0ZWdvcnkgbmFtZSBpZiBubyBjYXRlZ29yeSBJRAogICAgaWYgKCAkQ2F0ZWdvcnkgJiYgISRDYXRlZ29yeUlEICkgewoKICAgICAgICAjIGdldCB0aGUgY2F0ZWdvcnkgdHJlZQogICAgICAgIG15ICRDYXRlZ29yeVRyZWUgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeVRyZWVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHJldmVyc2UgdGhlIGhhcyBmb3IgZWFzeSBsb29rdXAKICAgICAgICBteSAlUmV2ZXJzZUNhdGVnb3J5VHJlZSA9IHJldmVyc2UgJXskQ2F0ZWdvcnlUcmVlfTsKCiAgICAgICAgJENhdGVnb3J5SUQgPSAkUmV2ZXJzZUNhdGVnb3J5VHJlZXskQ2F0ZWdvcnl9IHx8IDA7CiAgICB9CgogICAgIyB0cnkgdG8gZ2V0IHRoZSBjYXRlZ29yeSBkYXRhCiAgICBteSAlQ2F0ZWdvcnlEYXRhOwogICAgaWYgKCRDYXRlZ29yeUlEKSB7CgogICAgICAgICMgZ2V0IGNhdGVnb3J5IGRhdGEKICAgICAgICAlQ2F0ZWdvcnlEYXRhID0gJEZBUU9iamVjdC0+Q2F0ZWdvcnlHZXQoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJUNhdGVnb3J5RGF0YSApIHsKCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIFJTUyBmZWVkIGxpbmsgZm9yIG5ldyBGQVEgYXJ0aWNsZXMgaW4gdGhlIGJyb3dzZXIgVVJMIGJhcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWV0YUxpbmsnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBSZWwgICA9PiAnYWx0ZXJuYXRlJywKICAgICAgICAgICAgVHlwZSAgPT4gJ2FwcGxpY2F0aW9uL3Jzcyt4bWwnLAogICAgICAgICAgICBUaXRsZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdGQVEgQXJ0aWNsZXMgKG5ldyBjcmVhdGVkKScpLAogICAgICAgICAgICBIcmVmID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30gLiAnQWN0aW9uPVB1YmxpY0ZBUVJTUztUeXBlPUNyZWF0ZWQnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIFJTUyBmZWVkIGxpbmsgZm9yIGNoYW5nZWQgRkFRIGFydGljbGVzIGluIHRoZSBicm93c2VyIFVSTCBiYXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01ldGFMaW5rJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgUmVsICAgPT4gJ2FsdGVybmF0ZScsCiAgICAgICAgICAgIFR5cGUgID0+ICdhcHBsaWNhdGlvbi9yc3MreG1sJywKICAgICAgICAgICAgVGl0bGUgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRkFRIEFydGljbGVzIChyZWNlbnRseSBjaGFuZ2VkKScpLAogICAgICAgICAgICBIcmVmID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30gLiAnQWN0aW9uPVB1YmxpY0ZBUVJTUztUeXBlPUNoYW5nZWQnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIFJTUyBmZWVkIGxpbmsgZm9yIFRvcC0xMCBGQVEgYXJ0aWNsZXMgaW4gdGhlIGJyb3dzZXIgVVJMIGJhcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWV0YUxpbmsnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBSZWwgICA9PiAnYWx0ZXJuYXRlJywKICAgICAgICAgICAgVHlwZSAgPT4gJ2FwcGxpY2F0aW9uL3Jzcyt4bWwnLAogICAgICAgICAgICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0ZBUSBBcnRpY2xlcyAoVG9wIDEwKScpLAogICAgICAgICAgICBIcmVmICA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9IC4gJ0FjdGlvbj1QdWJsaWNGQVFSU1M7VHlwZT1Ub3AxMCcsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CgogICAgbXkgJENhdGVnb3J5SURzUmVmOwogICAgbXkgJVNlYXJjaDsKICAgIG15ICVGQVFTZWFyY2g7CgogICAgIyBzaG93IHNlYXJjaCByZXN1bHRzCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcgKSB7CiAgICAgICAgbXkgJFNlYXJjaE5hbWUgPSBUcmFuc2xhdGFibGUoIlNlYXJjaCIpIC4gIjoiOwogICAgICAgIGZvciBteSAkTW9kZSAocXcvS2V5d29yZCBXaGF0LykgewogICAgICAgICAgICBteSAkU3RyaW5nID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJE1vZGUgKTsKICAgICAgICAgICAgaWYgKCRTdHJpbmcpIHsKICAgICAgICAgICAgICAgICRTZWFyY2h7JE1vZGV9ICAgID0gJFN0cmluZzsKICAgICAgICAgICAgICAgICRGQVFTZWFyY2h7JE1vZGV9ID0gIiokU3RyaW5nKiI7CiAgICAgICAgICAgICAgICBteSAkTW9kZU5hbWUgPSAkTW9kZSBlcSAnV2hhdCcgPyAnRnVsbHRleHQnIDogJE1vZGU7CiAgICAgICAgICAgICAgICAkU2VhcmNoTmFtZSAuPSAiICIgLiBUcmFuc2xhdGFibGUoJE1vZGVOYW1lKSAuICIgXCIkU3RyaW5nXCI7IjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgY2F0ZWdvcnkgcm9vdCAoIGRvbmUgaW4gTGF5b3V0T2JqZWN0IGZvciBub24gc2VhcmNoZXMgKQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlOYW1lJyksCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgc2VhcmNoIGluZm9ybWF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVBhdGhDYXRlZ29yeUVsZW1lbnROb0xpbmsnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNlYXJjaE5hbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNhYmxlIGNhdGVnb3J5IHNwZWNpZmljIHN0dWZmCiAgICAgICAgJENhdGVnb3J5SUQgPSAtMTsKICAgIH0KCiAgICAjIG5vIHNlYXJjaCAoIHN0YW5kYXJkIG1vZGUgKQogICAgZWxzZSB7CiAgICAgICAgIyBzaG93IEZBUSBwYXRoCiAgICAgICAgJExheW91dE9iamVjdC0+RkFRUGF0aFNob3coCiAgICAgICAgICAgIEZBUU9iamVjdCAgPT4gJEZBUU9iamVjdCwKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIGRpcmVjdCBzdWJjYXRlZ29yaWVzIG9mIHRoZSBzZWxlY3RlZCBjYXRlZ29yeQogICAgICAgICRDYXRlZ29yeUlEc1JlZiA9ICRGQVFPYmplY3QtPlB1YmxpY0NhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgTW9kZSAgICAgPT4gJ1B1YmxpYycsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGludGVyZmFjZSBzdGF0ZSBsaXN0CiAgICBteSAkSW50ZXJmYWNlU3RhdGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OlB1YmxpYzo6U3RhdGVUeXBlcycpLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHN1YmNhdGVnb3JpZXMKICAgIGlmICggJENhdGVnb3J5SURzUmVmICYmIHJlZiAkQ2F0ZWdvcnlJRHNSZWYgZXEgJ0FSUkFZJyAmJiBAeyRDYXRlZ29yeUlEc1JlZn0gKSB7CgogICAgICAgICMgc2hvdyBzdWJjYXRlZ29yaWVzIGxpc3QKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3ViY2F0ZWdvcmllcycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBkYXRhIGZvciBlYWNoIHN1YmNhdGVnb3J5CiAgICAgICAgZm9yIG15ICRTdWJDYXRlZ29yeUlEICggQHskQ2F0ZWdvcnlJRHNSZWZ9ICkgewoKICAgICAgICAgICAgbXkgJVN1YkNhdGVnb3J5RGF0YSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5R2V0KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkU3ViQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgdGhlIG51bWJlciBvZiBzdWJjYXRlZ29yaWVzIG9mIHRoaXMgc3ViY2F0ZWdvcnkKICAgICAgICAgICAgJFN1YkNhdGVnb3J5RGF0YXtTdWJDYXRlZ29yeUNvdW50fSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5Q291bnQoCiAgICAgICAgICAgICAgICBQYXJlbnRJRHMgPT4gWyRTdWJDYXRlZ29yeUlEXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB0aGUgbnVtYmVyIG9mIEZBUSBhcnRpY2xlcyBpbiB0aGlzIGNhdGVnb3J5CiAgICAgICAgICAgICRTdWJDYXRlZ29yeURhdGF7QXJ0aWNsZUNvdW50fSA9ICRGQVFPYmplY3QtPkZBUUNvdW50KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgID0+IFskU3ViQ2F0ZWdvcnlJRF0sCiAgICAgICAgICAgICAgICBJdGVtU3RhdGVzICAgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICAgICAgICAgIE9ubHlBcHByb3ZlZCA9PiAxLAogICAgICAgICAgICAgICAgVmFsaWQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgdGhlIGNhdGVnb3J5IGRhdGEKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslU3ViQ2F0ZWdvcnlEYXRhfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBpbnRlcmZhY2Ugc2V0dGluZ3MKICAgIG15ICRJbnRlcmZhY2UgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgTmFtZSAgID0+ICdwdWJsaWMnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgaW5jbHVkZSBDYXRlZ29yeSBpZiBub3QgaW4gYmFzZSBDYXRlZ29yeSAoMCksIG9yIHNlYXJjaCBtb2RlCiAgICBpZiAoICRDYXRlZ29yeUlEID4gMCApIHsKICAgICAgICAkRkFRU2VhcmNoe0NhdGVnb3J5SURzfSA9IFskQ2F0ZWdvcnlJRF07CiAgICB9CgogICAgIyBnZXQgdGhlIGxhdGVzdCBhcnRpY2xlcyBmb3IgdGhlIHJvb3QgY2F0ZWdvcnkgKGVsc2UgZW1wdHkpCiAgICBlbHNpZiAoICElU2VhcmNoICkgewogICAgICAgICRTb3J0QnkgICAgICA9ICdDaGFuZ2VkJzsKICAgICAgICAkT3JkZXJCeSAgICAgPSAnRG93bic7CiAgICAgICAgJFNlYXJjaExpbWl0ID0gMTA7CiAgICB9CgogICAgIyBzZWFyY2ggYWxsIEZBUSBhcnRpY2xlcyB3aXRoaW4gdGhlIGdpdmVuIGNhdGVnb3J5CiAgICBteSBAVmlld2FibGVJdGVtSURzID0gJEZBUU9iamVjdC0+RkFRU2VhcmNoKAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyRTb3J0QnldLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyRPcmRlckJ5XSwKICAgICAgICBMaW1pdCAgICAgICAgICAgID0+ICRTZWFyY2hMaW1pdCwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBTdGF0ZXMgICAgICAgICAgID0+ICRJbnRlcmZhY2VTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgICVGQVFTZWFyY2gsCiAgICApOwoKICAgICMgc2V0IHRoZSBTb3J0QnkgQ2xhc3MKICAgIG15ICRTb3J0Q2xhc3M7CgogICAgIyB0aGlzIHNldHMgdGhlIG9wcG9zaXRlIHRvIHRoZSBPcmRlckJ5IHBhcmFtZXRlcgogICAgaWYgKCAkT3JkZXJCeSBlcSAnRG93bicgKSB7CiAgICAgICAgJFNvcnRDbGFzcyA9ICdTb3J0QXNjZW5kaW5nJzsKICAgIH0KICAgIGVsc2lmICggJE9yZGVyQnkgZXEgJ1VwJyApIHsKICAgICAgICAkU29ydENsYXNzID0gJ1NvcnREZXNjZW5kaW5nJzsKICAgIH0KCiAgICAjIHNldCB0aGUgU29ydEJ5IENsYXNzIHRvIHRoZSBjb3JyZWN0IGZpZWxkCiAgICBteSAlQ1NTU29ydDsKICAgIG15ICRDU1NTb3J0QnkgPSAkU29ydEJ5IC4gJ1NvcnQnOwogICAgJENTU1NvcnR7JENTU1NvcnRCeX0gPSAkU29ydENsYXNzOwoKICAgIG15ICVOZXdPcmRlciA9ICgKICAgICAgICBEb3duID0+ICdVcCcsCiAgICAgICAgVXAgICA9PiAnRG93bicsCiAgICApOwoKICAgICMgc2hvdyB0aGUgRkFRIGFydGljbGUgbGlzdAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRkFRSXRlbUxpc3QnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAlQ1NTU29ydCwKICAgICAgICAgICAgT3JkZXIgPT4gJE5ld09yZGVyeyRPcmRlckJ5fSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBtdWx0aSBsYW5ndWFnZSBkZWZhdWx0IG9wdGlvbgogICAgbXkgJE11bHRpTGFuZ3VhZ2UgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6TXVsdGlMYW5ndWFnZScpOwoKICAgICMgc2hvdyBsYW5ndWFnZSBoZWFkZXIKICAgIGlmICgkTXVsdGlMYW5ndWFnZSkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMYW5ndWFnZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgICAgICVDU1NTb3J0LAogICAgICAgICAgICAgICAgT3JkZXIgPT4gJE5ld09yZGVyeyRPcmRlckJ5fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb3VudGVyID0gMDsKICAgIGlmIChAVmlld2FibGVJdGVtSURzKSB7CgogICAgICAgICMgY3JlYXRlIGJhY2sgbGluayBmb3IgRkFRIFpvb20gc2NyZWVuCiAgICAgICAgbXkgJFpvb21CYWNrTGluayA9ICJBY3Rpb249UHVibGljRkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD0kQ2F0ZWdvcnlJRDsiCiAgICAgICAgICAgIC4gIlNvcnRCeT0kU29ydEJ5O09yZGVyPSRPcmRlckJ5O1N0YXJ0SGl0PSRTdGFydEhpdCI7CgogICAgICAgICMgZW5jb2RlIGJhY2sgbGluayB0byBCYXNlNjQgZm9yIGVhc3kgSFRNTCB0cmFuc3BvcnQKICAgICAgICAkWm9vbUJhY2tMaW5rID0gTUlNRTo6QmFzZTY0OjplbmNvZGVfYmFzZTY0KCRab29tQmFja0xpbmspOwoKICAgICAgICBmb3IgbXkgJEl0ZW1JRCAoQFZpZXdhYmxlSXRlbUlEcykgewoKICAgICAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgICAgICMgYnVpbGQgc2VhcmNoIHJlc3VsdAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ291bnRlciA+PSAkU3RhcnRIaXQKICAgICAgICAgICAgICAgICYmICRDb3VudGVyIDwgKCAkU2VhcmNoUGFnZVNob3duICsgJFN0YXJ0SGl0ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG15ICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBJdGVtRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRGQVFEYXRhe0NsZWFuVGl0bGV9ID0gJEZBUU9iamVjdC0+RkFRQXJ0aWNsZVRpdGxlQ2xlYW4oCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJEZBUURhdGF7VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFNpemUgID0+ICRDb25maWctPntUaXRsZVNpemV9LAogICAgICAgICAgICAgICAgKTsKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICRGQVFEYXRhe0ljb259ID0gJEZBUURhdGF7SWNvbn0gPyBkZWNvZGVfYmFzZTY0KCAkRkFRRGF0YXtJY29ufSApIDogJyc7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAgICAgICAgICMgYWRkIGJsb2NrcyB0byB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFpvb21CYWNrTGluayA9PiAkWm9vbUJhY2tMaW5rLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGxhbmd1YWdlIGRhdGEKICAgICAgICAgICAgICAgIGlmICgkTXVsdGlMYW5ndWFnZSkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmRMYW5ndWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQKICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0ZBUURhdGFGb3VuZE1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkTGluayA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFNvcnRCeSkgLiAnOyc7CiAgICAkTGluayAuPSAnT3JkZXI9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJE9yZGVyQnkpIC4gJzsnOwoKICAgIG15ICRBY3Rpb25TdHJpbmc7CiAgICBpZiAoJVNlYXJjaCkgewogICAgICAgICRBY3Rpb25TdHJpbmcgPSAiQWN0aW9uPVB1YmxpY0ZBUUV4cGxvcmVyO1N1YmFjdGlvbj1TZWFyY2g7IjsKICAgICAgICBpZiAoICRGQVFTZWFyY2h7Q2F0ZWdvcnlJRHN9ICkgewogICAgICAgICAgICAkQWN0aW9uU3RyaW5nIC49ICJDYXRlZ29yeUlEPSRDYXRlZ29yeUlEOyI7CiAgICAgICAgfQogICAgICAgIGZvciBteSAkTW9kZSAoIGtleXMgJVNlYXJjaCApIHsKICAgICAgICAgICAgJEFjdGlvblN0cmluZyAuPSAiJE1vZGU9JFNlYXJjaHsgJE1vZGUgfTsiOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRBY3Rpb25TdHJpbmcgPSAiQWN0aW9uPVB1YmxpY0ZBUUV4cGxvcmVyO0NhdGVnb3J5SUQ9JENhdGVnb3J5SUQiOwogICAgfQoKICAgICMgYnVpbGQgc2VhcmNoIG5hdmlnYXRpb24gYmFyCiAgICBteSAlUGFnZU5hdiA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgTGltaXQgICAgID0+ICRTZWFyY2hMaW1pdCwKICAgICAgICBTdGFydEhpdCAgPT4gJFN0YXJ0SGl0LAogICAgICAgIFBhZ2VTaG93biA9PiAkU2VhcmNoUGFnZVNob3duLAogICAgICAgIEFsbEhpdHMgICA9PiAkQ291bnRlciwKICAgICAgICBBY3Rpb24gICAgPT4gIkFjdGlvbj1QdWJsaWNGQVFFeHBsb3JlcjtDYXRlZ29yeUlEPSRDYXRlZ29yeUlEIiwKICAgICAgICBMaW5rICAgICAgPT4gJExpbmssCiAgICAgICAgSURQcmVmaXggID0+ICJQdWJsaWNGQVFFeHBsb3JlciIsCiAgICApOwoKICAgICMgc2hvdyBmb290ZXIgZmlsdGVyIC0gc2hvdyBvbmx5IGlmIG1vcmUgdGhlIG9uZSBwYWdlIGlzIGF2YWlsYWJsZQogICAgaWYgKCBkZWZpbmVkICRQYWdlTmF2e1RvdGFsSGl0c30gJiYgKCAkUGFnZU5hdntUb3RhbEhpdHN9ID4gJFNlYXJjaFBhZ2VTaG93biApICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQYWdpbmF0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlUGFnZU5hdiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRTZWFyY2hCYWNrTGluayA9ICJBY3Rpb249UHVibGljRkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD0kQ2F0ZWdvcnlJRCI7CgogICAgIyBlbmNvZGUgYmFjayBsaW5rIHRvIEJhc2U2NCBmb3IgZWFzeSBIVE1MIHRyYW5zcG9ydAogICAgJFNlYXJjaEJhY2tMaW5rID0gTUlNRTo6QmFzZTY0OjplbmNvZGVfYmFzZTY0KCRTZWFyY2hCYWNrTGluayk7CgogICAgIyBzaG93IFF1aWNrU2VhcmNoCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFTaG93UXVpY2tTZWFyY2goCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdQdWJsaWMnLAogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIFNlYXJjaEJhY2tMaW5rICA9PiAkU2VhcmNoQmFja0xpbmssCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBzaG93IGxhc3QgYWRkZWQgYW5kIGxhc3QgdXBkYXRlZCBhcnRpY2xlcwogICAgZm9yIG15ICRUeXBlIChxdyhMYXN0Q3JlYXRlIExhc3RDaGFuZ2UpKSB7CgogICAgICAgIG15ICRTaG93T2sgPSAkTGF5b3V0T2JqZWN0LT5GQVFTaG93TGF0ZXN0TmV3c0JveCgKICAgICAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdQdWJsaWMnLAogICAgICAgICAgICBDYXRlZ29yeUlEICAgICAgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTaG93T2sgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgdG9wIHRlbiBhcnRpY2xlcwogICAgbXkgJFNob3dPayA9ICRMYXlvdXRPYmplY3QtPkZBUVNob3dUb3AxMCgKICAgICAgICBGQVFPYmplY3QgICAgICAgPT4gJEZBUU9iamVjdCwKICAgICAgICBNb2RlICAgICAgICAgICAgPT4gJ1B1YmxpYycsCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+ICRDYXRlZ29yeUlELAogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJFNob3dPayApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICMgR2V0IFNpZGViYXIgaW5mbwogICAgJFBhcmFte1NpZGVCYXJ9ID0gJExheW91dE9iamVjdC0+RkFRU2lkZUJhcigKICAgICAgICBNb2RlICAgICAgICAgICAgICA9PiAnUHVibGljJywKICAgICAgICBMYW5ndWFnZSAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSB8fCAnZW4nLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBJc0FsbG93ZWQgICAgICAgICA9PiAxLAogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+IDAsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIEhhc0RlZmF1bHRBcnRpY2xlID0+ICRIYXNEZWZhdWx0QXJ0aWNsZQogICAgKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQdWJsaWNGQVFFeHBsb3JlcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAlQ2F0ZWdvcnlEYXRhLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/PublicFAQZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9QdWJsaWNGQVFab29tLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpQdWJsaWNGQVFab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIE1JTUU6OkJhc2U2NCAgICAgICAgICAgICAgICAgIHF3KCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCBlbmNvZGVfYmFzZTY0KTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IFVzZXJJRCB0byByb290IGJlY2F1c2UgaW4gcHVibGljIGludGVyZmFjZSB0aGVyZSBpcyBubyB1c2VyCiAgICAkU2VsZi0+e1VzZXJJRH0gPSAxOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgICRHZXRQYXJhbXtJdGVtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0l0ZW1JRCcgKTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgIyBHZXQgZGVmYXVsdCBJdGVtSUQgaWYgaXQncyBkZWZpbmVkCiAgICBteSAkSXNEZWZhdWx0QXJ0aWNsZSAgPSAwOwogICAgbXkgJEhhc0RlZmF1bHRBcnRpY2xlID0gMDsKICAgIG15ICVEYXRhICAgICAgICAgICAgICA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUHVibGljRkFRU2lkZUJhcjo6QXJ0aWNsZXMnKSB9OwogICAgJExheW91dE9iamVjdC0+e1VzZXJMYW5ndWFnZX0gfHw9ICdlbic7CgogICAgQ09ORklHOgogICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgIG5leHQgQ09ORklHIGlmICREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9IG5lICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9OwoKICAgICAgICBpZiAoICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH0gKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0l0ZW1JRH0gPSAkRGF0YXskQ29uZmlnfS0+e0RlZmF1bHRJdGVtSUR9OwogICAgICAgICAgICAgICAgJElzRGVmYXVsdEFydGljbGUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIGxhc3QgQ09ORklHOwogICAgICAgIH0KICAgIH0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewojICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKIyAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZCBJdGVtSUQhJyksCiMgICAgICAgICApOwojICAgICB9CiAgICAjIFNob3cgbWVzc2FnZSBhbmQgbGluayB0byBGQVEgRXhwbG9yZXIgaWYgbm8gZGVmYXVsdCBpdGVtIGlzIHNldCBhbmQgbm8gSXRlbUlEIHByb3ZpZGVkCiAgICBteSAkT3V0cHV0OwoKICAgIGlmICggISRHZXRQYXJhbXtJdGVtSUR9ICkgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigpOwoKICAgICAgICAkUGFyYW17Q3NzQ2xhc3NOb0FydGljbGV9ID0gJ0hpZGRlbic7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RlZmF1bHRJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQdWJsaWNGQVFab29tJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE91dHB1dCAuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CiAgICB9CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICMgZ2V0IGJhY2sgbGluawogICAgJEdldFBhcmFte1pvb21CYWNrTGlua30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUJhY2tMaW5rJyApIHx8ICcnOwogICAgaWYgKCAkR2V0UGFyYW17Wm9vbUJhY2tMaW5rfSApIHsKICAgICAgICAkR2V0UGFyYW17Wm9vbUJhY2tMaW5rfSA9IE1JTUU6OkJhc2U2NDo6ZGVjb2RlX2Jhc2U2NCggJEdldFBhcmFte1pvb21CYWNrTGlua30gKTsKICAgIH0KCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgIG15ICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgIEl0ZW1JRCAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgSXRlbUZpZWxkcyA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICggISVGQVFEYXRhICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICRGQVFEYXRhe0ljb259ID0gJEZBUURhdGF7SWNvbn0gPyBkZWNvZGVfYmFzZTY0KCAkRkFRRGF0YXtJY29ufSApIDogJyc7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICMgZ2V0IHRoZSB2YWxpZCBpZHMKICAgIG15IEBWYWxpZElEcyAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CiAgICBteSAlVmFsaWRJRExvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAVmFsaWRJRHM7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgaW50ZXJmYWNlIHN0YXRlIGxpc3QKICAgIG15ICRJbnRlcmZhY2VTdGF0ZXMgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6UHVibGljOjpTdGF0ZVR5cGVzJyksCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICBpZiAoCiAgICAgICAgISRGQVFEYXRhe0FwcHJvdmVkfQogICAgICAgIHx8ICEkVmFsaWRJRExvb2t1cHsgJEZBUURhdGF7VmFsaWRJRH0gfQogICAgICAgIHx8ICEkSW50ZXJmYWNlU3RhdGVzLT57ICRGQVFEYXRhe1N0YXRlVHlwZUlEfSB9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5vUGVybWlzc2lvbigKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEhUTUxWaWV3IFN1Yi1hY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSFRNTFZpZXcnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkRmllbGQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRmllbGQiICk7CgogICAgICAgIGZvciBteSAkTmVlZGVkIChxdyggSXRlbUlEIEZpZWxkICkpIHsKICAgICAgICAgICAgaWYgKCAhJE5lZWRlZCApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWRlZCBQYXJhbTogJE5lZWRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIEZpZWxkIGNvbnRlbnQKICAgICAgICBteSAkRmllbGRDb250ZW50ID0gJEZBUU9iamVjdC0+SXRlbUZpZWxkR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEZpZWxkICA9PiAkRmllbGQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXdyaXRlIGhhbmRsZSBhbmQgYWN0aW9uCiAgICAgICAgJEZpZWxkQ29udGVudAogICAgICAgICAgICA9fiBzeyBpbmRleFsuXXBsIFs/XSBBY3Rpb249QWdlbnRGQVFab29tIH17cHVibGljLnBsP0FjdGlvbj1QdWJsaWNGQVFab29tfWd4bXM7CgogICAgICAgICMgdGFrZSBjYXJlIG9mIG9sZCBzdHlsZSBiZWZvcmUgRkFRIDIuMC54CiAgICAgICAgJEZpZWxkQ29udGVudCA9fiBzewogICAgICAgICAgICBpbmRleFsuXXBsIFs/XSBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgIH17cHVibGljLnBsP0FjdGlvbj1QdWJsaWNGQVFab29tO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7fWd4bXM7CgogICAgICAgIG15ICRIVE1MVXRpbHNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyk7CgogICAgICAgICMgY29udmVydCBjb250ZW50IHRvIEhUTUwgaWYgbmVlZGVkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpCiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICRGQVFEYXRhe0NvbnRlbnRUeXBlfSBuZSAndGV4dC9odG1sJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+VG9IVE1MKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIERldGVjdCBhbGwgcGxhaW4gdGV4dCBsaW5rcyBhbmQgcHV0IHRoZW0gaW50byBhbiBIVE1MIDxhPiB0YWcuCiAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgKTsKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAjIHNldCB0YXJnZXQ9Il9wYXJlbnQiIGZvciBsaW5rcyB0byBvdGhlciBhcnRpY2xlcyB2aWEgbWVudGlvbgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkRkFRT2JqZWN0LT5MaW5rUXVvdGVNZW50aW9uKAogICAgICAgICAgICBTdHJpbmcgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAgICAgIyBTZXQgdGFyZ2V0PSJfYmxhbmsiIGF0dHJpYnV0ZSB0byBhbGwgSFRNTCA8YT4gdGFncyB0aGUgTGlua1F1b3RlIGZ1bmN0aW9uIG5lZWRzIHRvIGJlCiAgICAgICAgIyAgIGNhbGxlZCBhZ2FpbgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICBUYXJnZXRBZGQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBuZWVkZWQgSFRNTCBoZWFkZXJzCiAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPkRvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgID0+ICd1dGYtOCcsCiAgICAgICAgICAgIEN1c3RvbWVySW50ZXJmYWNlID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVyVUlTdHlsZXMgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBiYXNlIFVSTCBmb3IgaW5saW5lIGltYWdlcwogICAgICAgIG15ICRTZXNzaW9uSUQgPSAnJzsKICAgICAgICBpZiAoICRTZWxmLT57U2Vzc2lvbklEfSAmJiAhJFNlbGYtPntTZXNzaW9uSURDb29raWV9ICkgewogICAgICAgICAgICAkU2Vzc2lvbklEID0gJzsnIC4gJFNlbGYtPntTZXNzaW9uTmFtZX0gLiAnPScgLiAkU2VsZi0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgICRGaWVsZENvbnRlbnQgPX4gc3sKICAgICAgICAgICAgICAgIChBY3Rpb249UHVibGljRkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0l0ZW1JRD1cZCs7RmlsZUlEPVxkKykKICAgICAgICAgICAgfXskMSRTZXNzaW9uSUR9Z21zeDsKICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICAkRmllbGRDb250ZW50ID1+IHN7KDxoKFsxLTZdKT4uKj88L2hcMj4pfXsgJENvdW50Kys7ICI8YSBpZD1cIiRGaWVsZC0kQ291bnRcIj4mbmJzcDs8L2E+JDEifWdlOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAgICAgIyByZXR1cm4gY29tcGxldGUgSFRNTCBhcyBhbiBhdHRhY2htZW50CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIERvd25sb2FkQXR0YWNobWVudCBTdWItYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkQXR0YWNobWVudCcgKSB7CgogICAgICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgICAgICAkR2V0UGFyYW17RmlsZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWxlSUQnICk7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17RmlsZUlEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIEZpbGVJRCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJUZpbGUgPSAkRkFRT2JqZWN0LT5BdHRhY2htZW50R2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEZpbGVJRCA9PiAkR2V0UGFyYW17RmlsZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICglRmlsZSkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgICVGaWxlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggYXR0YWNobWVudCAoJEdldFBhcmFte0ZpbGVJRH0pISBNYXkgYmUgYW4gYXR0YWNrISEhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgIH0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgVmFsdWUgPT4gJEZBUURhdGF7VGl0bGV9LAogICAgKTsKCiAgICAjIHNldCBkZWZhdWx0IGludGVyZmFjZSBzZXR0aW5ncwogICAgbXkgJEludGVyZmFjZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ3B1YmxpYycsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBwcmVwYXJlIGZpZWxkcyBkYXRhCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKHF3KEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewogICAgICAgIG5leHQgRklFTEQgaWYgISRGQVFEYXRheyRGaWVsZH07CgogICAgICAgICMgcmV3cml0ZSBsaW5rcyB0byBlbWJlZGRlZCBpbWFnZXMgZm9yIHB1YmxpYyBpbnRlcmZhY2UKICAgICAgICBpZiAoICRJbnRlcmZhY2UtPntOYW1lfSBlcSAncHVibGljJyApIHsKCiAgICAgICAgICAgICMgcmV3cml0ZSBoYW5kbGUgYW5kIGFjdGlvbgogICAgICAgICAgICAkRkFRRGF0YXskRmllbGR9CiAgICAgICAgICAgICAgICA9fiBzeyBpbmRleFsuXXBsIFs/XSBBY3Rpb249QWdlbnRGQVFab29tIH17cHVibGljLnBsP0FjdGlvbj1QdWJsaWNGQVFab29tfWd4bXM7CgogICAgICAgICAgICAjIHRha2UgY2FyZSBvZiBvbGQgc3R5bGUgYmVmb3JlIEZBUSAyLjAueAogICAgICAgICAgICAkRkFRRGF0YXskRmllbGR9ID1+IHN7CiAgICAgICAgICAgICAgICBpbmRleFsuXXBsIFs/XSBBY3Rpb249QWdlbnRGQVEgWyZdKGFtcDspPyBTdWJhY3Rpb249RG93bmxvYWQgWyZdKGFtcDspPwogICAgICAgICAgICB9e3B1YmxpYy5wbD9BY3Rpb249UHVibGljRkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O31neG1zOwogICAgICAgIH0KCiAgICAgICAgIyBubyBxdW90aW5nIGlmIEhUTUwgdmlldyBpcyBlbmFibGVkCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpOwoKICAgICAgICAjIEhUTUwgcXVvdGluZwogICAgICAgICRGQVFEYXRheyRGaWVsZH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiAwLAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkRkFRRGF0YXskRmllbGR9LAogICAgICAgICAgICBWTWF4ICAgICAgICAgICA9PiA1MDAwLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICBMaW5rRmVhdHVyZSAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgdm90aW5nIHJlc3VsdHMKICAgICRQYXJhbXtWb3RpbmdSZXN1bHRDb2xvcn0gPSAkTGF5b3V0T2JqZWN0LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKAogICAgICAgIFJhdGUgPT4gJEZBUURhdGF7Vm90ZVJlc3VsdH0sCiAgICApOwoKICAgIGlmICggISRQYXJhbXtWb3RpbmdSZXN1bHRDb2xvcn0gfHwgJEZBUURhdGF7Vm90ZXN9IGVxICcwJyApIHsKICAgICAgICAkUGFyYW17Vm90aW5nUmVzdWx0Q29sb3J9ID0gJ0dyYXknOwogICAgfQoKICAgICMgc2hvdyBiYWNrIGxpbmsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0JhY2snLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbXVsdGktbGFuZ3VhZ2Ugb3B0aW9uCiAgICBteSAkTXVsdGlMYW5ndWFnZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpNdWx0aUxhbmd1YWdlJyk7CgogICAgIyBzaG93IGxhbmd1YWdlCiAgICBpZiAoJE11bHRpTGFuZ3VhZ2UpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHslRkFRRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgIyBnZXQgdm90aW5nIGRlZmF1bHQgb3B0aW9uCiMgICAgIG15ICRWb3RpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Vm90aW5nJyk7CiMKIyAgICAgIyBzaG93IHZvdGVzCiMgICAgIGlmICgkVm90aW5nKSB7CiMKIyAgICAgICAgICMgYWx3YXlzIGRpc3BsYXlzIFZvdGVzIHJlc3VsdCBldmVuIGlmIGl0cyAwCiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKIyAgICAgICAgICAgICBOYW1lID0+ICdWaWV3Vm90ZXMnLAojICAgICAgICAgICAgIERhdGEgPT4geyVGQVFEYXRhfSwKIyAgICAgICAgICk7CiMgICAgIH0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBzaG93IEZBUSBwYXRoCiAgICBteSAkU2hvd0ZBUVBhdGggPSAkTGF5b3V0T2JqZWN0LT5GQVFQYXRoU2hvdygKICAgICAgICBGQVFPYmplY3QgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIENhdGVnb3J5SUQgID0+ICRGQVFEYXRhe0NhdGVnb3J5SUR9LAogICAgICAgIFBhdGhGb3JJdGVtID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICgkU2hvd0ZBUVBhdGgpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7JUZBUURhdGF9LAogICAgICAgICk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICMgc2hvdyBrZXl3b3JkcyBhcyBzZWFyY2ggbGlua3MKIyAgICAgaWYgKCAkRkFRRGF0YXtLZXl3b3Jkc30gKSB7CiMKIyAgICAgICAgICMgcmVwbGFjZSBjb21tYXMgYW5kIHNlbWljb2xvbnMKIyAgICAgICAgICRGQVFEYXRhe0tleXdvcmRzfSA9fiBzLywvIC9nOwojICAgICAgICAgJEZBUURhdGF7S2V5d29yZHN9ID1+IHMvOy8gL2c7CiMKIyAgICAgICAgIG15IEBLZXl3b3JkcyA9IHNwbGl0IC9ccysvLCAkRkFRRGF0YXtLZXl3b3Jkc307CiMgICAgICAgICBmb3IgbXkgJEtleXdvcmQgKEBLZXl3b3JkcykgewojICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAojICAgICAgICAgICAgICAgICBOYW1lID0+ICdLZXl3b3JkcycsCiMgICAgICAgICAgICAgICAgIERhdGEgPT4gewojICAgICAgICAgICAgICAgICAgICAgS2V5d29yZCA9PiAkS2V5d29yZCwKIyAgICAgICAgICAgICAgICAgfSwKIyAgICAgICAgICAgICApOwojICAgICAgICAgfQojICAgICB9CiMKIyAgICAgIyBvdXRwdXQgcmF0aW5nIHN0YXJzCiMgICAgIGlmICgkVm90aW5nKSB7CiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GQVFSYXRpbmdTdGFyc1Nob3coCiMgICAgICAgICAgICAgVm90ZVJlc3VsdCA9PiAkRkFRRGF0YXtWb3RlUmVzdWx0fSwKIyAgICAgICAgICAgICBWb3RlcyAgICAgID0+ICRGQVFEYXRhe1ZvdGVzfSwKIyAgICAgICAgICk7CiMgICAgIH0KIwojICAgICAjIG91dHB1dCBhdHRhY2htZW50cyBpZiBhbnkKIyAgICAgbXkgQEF0dGFjaG1lbnRJbmRleCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRJbmRleCgKIyAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiMgICAgICAgICBTaG93SW5saW5lID0+IDAsCiMgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKIyAgICAgKTsKIwojICAgICAjIG91dHB1dCBhdHRhY2htZW50cwojICAgICBpZiAoQEF0dGFjaG1lbnRJbmRleCkgewojICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiMgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudEhlYWRlcicsCiMgICAgICAgICApOwojICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudEluZGV4KSB7CiMgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiMgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3cnLAojICAgICAgICAgICAgICAgICBEYXRhID0+IHsKIyAgICAgICAgICAgICAgICAgICAgICVGQVFEYXRhLAojICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiMgICAgICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICAgKTsKIyAgICAgICAgIH0KIyAgICAgfQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAjIHNob3cgRkFRIENvbnRlbnQKICAgICRMYXlvdXRPYmplY3QtPkZBUUNvbnRlbnRTaG93KAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkSW50ZXJmYWNlU3RhdGVzLAogICAgICAgIEZBUURhdGEgICAgICAgICA9PiB7JUZBUURhdGF9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICBab29tID0+IDEKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiMgICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiMgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAojICAgICAgICAgT2JqZWN0VHlwZSAgPT4gJ0ZBUScsCiMgICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKIyAgICAgKTsKIwojICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKIwojICAgICBEWU5BTUlDRklFTERDT05GSUc6CiMgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKIyAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEQ09ORklHIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKIwojICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAojICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAojICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKIyAgICAgICAgICk7CiMKIyAgICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiMgICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKIyAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKIyAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAojICAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAyNTAsCiMgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiMgICAgICAgICApOwojCiMgICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwojCiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKIyAgICAgICAgICAgICBOYW1lID0+ICdGQVFEeW5hbWljRmllbGQnLAojICAgICAgICAgICAgIERhdGEgPT4gewojICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiMgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiMgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiMgICAgICAgICAgICAgfSwKIyAgICAgICAgICk7CiMKIyAgICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKIyAgICAgICAgICAgICBOYW1lID0+ICdGQVFEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKIyAgICAgICAgICAgICBEYXRhID0+IHsKIyAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAojICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAojICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAojICAgICAgICAgICAgIH0sCiMgICAgICAgICApOwojICAgICB9CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICMgbG9nIGFjY2VzcyB0byB0aGlzIEZBUSBpdGVtCiAgICAkRkFRT2JqZWN0LT5GQVFMb2dBZGQoCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgIEl0ZW1JRCAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXRlbUlEJyApLAogICAgICAgIEl0ZW1JRCAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgSW50ZXJmYWNlID0+ICRJbnRlcmZhY2UtPntOYW1lfSwKICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICMgR2V0IFNpZGViYXIgaW5mbwogICAgJFBhcmFte1NpZGVCYXJ9ID0gJExheW91dE9iamVjdC0+RkFRU2lkZUJhcigKICAgICAgICBNb2RlICAgICAgICAgICAgICA9PiAnUHVibGljJywKICAgICAgICBMYW5ndWFnZSAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgSXNBbGxvd2VkICAgICAgICAgPT4gMSwKICAgICAgICBJdGVtSUQgICAgICAgICAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICBBY3Rpb24gICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgSXNEZWZhdWx0QXJ0aWNsZSAgPT4gJElzRGVmYXVsdEFydGljbGUsCiAgICAgICAgSGFzRGVmYXVsdEFydGljbGUgPT4gJEhhc0RlZmF1bHRBcnRpY2xlCiAgICApIHx8ICcnOwoKICAgICMgUmVuZGVyIFRhYmxlIG9mIENvbnRlbnRzCiAgICAkUGFyYW17VE9DfSA9ICRMYXlvdXRPYmplY3QtPkZBUVRhYmxlT2ZDb250ZW50cygKICAgICAgICBNb2RlICAgID0+ICdQdWJsaWMnLAogICAgICAgIEZBUURhdGEgPT4gXCVGQVFEYXRhCiAgICApOwoKICAgICMgUmVuZGVyIEFkZGlvbmFsIGRhdGEgd2lkZ2V0CiAgICAkUGFyYW17QWRkaXRpb25hbERhdGF9ID0gJExheW91dE9iamVjdC0+RkFRQWRkaXRpb25hbERhdGEoCiAgICAgICAgTW9kZSAgICA9PiAnUHVibGljJywKICAgICAgICBGQVFEYXRhID0+IFwlRkFRRGF0YSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSB8fCAxLAogICAgICAgIEFjdGlvbiAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIENvbmZpZyAgPT4gJENvbmZpZwogICAgKTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnUHVibGljRkFRWm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AgentFAQExplorer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudEZBUUV4cGxvcmVyLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEZBUUV4cGxvcmVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QuCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBQZXJtaXNzaW9uIGNoZWNrLgogICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSb30gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBuZWVkIHJvIHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIEdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlLgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiRkFROjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgbXkgJElzQWxsb3dlZCA9IDA7CiAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gPSAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgIyBHZXQgY29uZmlnIGRhdGEuCiAgICBteSAkU3RhcnRIaXQgICAgPSBpbnQoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydEhpdCcgKSB8fCAxICk7CiAgICBteSAkU2VhcmNoTGltaXQgPSAkQ29uZmlnLT57U2VhcmNoTGltaXR9IHx8IDUwMDsKICAgIG15ICRGaWx0ZXIgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJyc7CiAgICBteSAkVmlldyAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwogICAgbXkgJFNvcnRCeSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRDb25maWctPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnRkFRSUQnOwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRDb25maWctPnsnT3JkZXI6OkRlZmF1bHQnfQogICAgICAgIHx8ICdEb3duJzsKCiAgICAjIEdldCBDYXRlZ29yeUlELgogICAgbXkgJENhdGVnb3J5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2F0ZWdvcnlJRCcgKSB8fCAwOwoKICAgICMgQ2hlY2sgZm9yIG5vbiBudW1lcmljIENhdGVnb3J5SUQKICAgIGlmICggJENhdGVnb3J5SUQgIX4gL1xkKy8gKSB7CiAgICAgICAgJENhdGVnb3J5SUQgPSAwOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgYXJ0aWNsZSBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZQogICAgbXkgJEhhc0RlZmF1bHRBcnRpY2xlID0gMDsKICAgIG15ICVEYXRhICAgICAgICAgICAgICA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQWdlbnRGQVFTaWRlQmFyOjpBcnRpY2xlcycpIH07CgogICAgQ09ORklHOgogICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgIG5leHQgQ09ORklHIGlmICREYXRheyRDb25maWd9LT57TGFuZ3VhZ2V9IG5lICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9OwoKICAgICAgICBpZiAoICREYXRheyRDb25maWd9LT57RGVmYXVsdEl0ZW1JRH0gKSB7CiAgICAgICAgICAgICRIYXNEZWZhdWx0QXJ0aWNsZSA9IDE7CiAgICAgICAgICAgIGxhc3QgQ09ORklHOwogICAgICAgIH0KICAgIH0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgbXkgJENhdGVnb3J5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhdGVnb3J5JyApIHx8ICcnOwoKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgIyBUcnkgdG8gZ2V0IHRoZSBDYXRlZ29yeUlEIGZyb20gY2F0ZWdvcnkgbmFtZSBpZiBubyBDYXRlZ29yeUlECiAgICBpZiAoICRDYXRlZ29yeSAmJiAhJENhdGVnb3J5SUQgKSB7CgogICAgICAgICMgR2V0IHRoZSBjYXRlZ29yeSB0cmVlLgogICAgICAgIG15ICRDYXRlZ29yeVRyZWUgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeVRyZWVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgUmV2ZXJzZSB0aGUgaGFzaCBmb3IgZWFzeSBsb29rdXAuCiAgICAgICAgbXkgJVJldmVyc2VDYXRlZ29yeVRyZWUgPSByZXZlcnNlICV7JENhdGVnb3J5VHJlZX07CgogICAgICAgICRDYXRlZ29yeUlEID0gJFJldmVyc2VDYXRlZ29yeVRyZWV7JENhdGVnb3J5fSB8fCAwOwogICAgfQoKICAgICMgR2V0IG5hdmlnYXRpb24gYmFyIG9wdGlvbi4KICAgIG15ICROYXYgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmF2JyApIHx8ICcnOwoKICAgIG15ICRTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CgogICAgIyBTYXZlIENhdGVnb3J5SUQgdG8gc2Vzc2lvbiwgdG8gYmUgdXNlZCBpbiBGQVEgYWRkIHNjcmVlbi4KICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RWaWV3ZWRDYXRlZ29yeScsCiAgICAgICAgVmFsdWUgICAgID0+ICRDYXRlZ29yeUlELAogICAgKTsKCiAgICAjIFN0b3JlIGxhc3Qgb3ZlcnZpZXcgc2NyZWVuIChmb3IgYmFjayBtZW51IGFjdGlvbikgYnV0IG9ubHkgaWYgdGhlIEZBUSBleHBsb3JlciBpcyBub3Qgc2hvd24gYXMgb3ZlcmxheS4KICAgIGlmICggISROYXYgfHwgJE5hdiBuZSAnTm9uZScgKSB7CgogICAgICAgIG15ICRVUkwgPSAiQWN0aW9uPUFnZW50RkFRRXhwbG9yZXI7U29ydEJ5PSRTb3J0QnkiCiAgICAgICAgICAgIC4gIjtDYXRlZ29yeUlEPSRDYXRlZ29yeUlEO05hdj0kTmF2IgogICAgICAgICAgICAuICI7T3JkZXJCeT0kT3JkZXJCeTtTdGFydEhpdD0kU3RhcnRIaXQiOwogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVUkwsCiAgICAgICAgKTsKICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVUkwsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFRyeSB0byBnZXQgdGhlIGNhdGVnb3J5IGRhdGEuCiAgICBteSAlQ2F0ZWdvcnlEYXRhOwogICAgaWYgKCRDYXRlZ29yeUlEKSB7CgogICAgICAgICVDYXRlZ29yeURhdGEgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICElQ2F0ZWdvcnlEYXRhICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1RoZSBDYXRlZ29yeUlEICVzIGlzIGludmFsaWQuJywgJENhdGVnb3J5SUQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgdXNlciBwZXJtaXNzaW9uLgogICAgICAgIG15ICRQZXJtaXNzaW9uID0gJEZBUU9iamVjdC0+Q2hlY2tDYXRlZ29yeVVzZXJQZXJtaXNzaW9uKAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgVHlwZSAgICAgICA9PiAncm8nLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFBlcm1pc3Npb24gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IGhhdmUgbm8gcGVybWlzc2lvbiBmb3IgdGhpcyBjYXRlZ29yeSEnKSwKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPdXRwdXQ7CiAgICBpZiAoICROYXYgJiYgJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+RkFRUGF0aFNob3coCiAgICAgICAgRkFRT2JqZWN0ICA9PiAkRkFRT2JqZWN0LAogICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgTmF2ICAgICAgICA9PiAkTmF2LAogICAgKTsKCiAgICAjIEdldCBhbGwgZGlyZWN0IHN1YmNhdGVnb3JpZXMgb2YgdGhlIHNlbGVjdGVkIGNhdGVnb3J5LgogICAgbXkgJENhdGVnb3J5SURzUmVmID0gJEZBUU9iamVjdC0+QWdlbnRDYXRlZ29yeVNlYXJjaCgKICAgICAgICBQYXJlbnRJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1N1YmNhdGVnb3JpZXMnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwoKICAgICMgU2V0IGRlZmF1bHQgaW50ZXJmYWNlIHNldHRpbmdzLgogICAgbXkgJEludGVyZmFjZSA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ2ludGVybmFsJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICRJbnRlcmZhY2VTdGF0ZXMgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QWdlbnQ6OlN0YXRlVHlwZXMnKSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICMgR2V0IFNpZGViYXIgaW5mbwogICAgJFBhcmFte1NpZGVCYXJ9ID0gJExheW91dE9iamVjdC0+RkFRU2lkZUJhcigKICAgICAgICBNb2RlICAgICAgICAgICAgICA9PiAnQWdlbnQnLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgSXNBbGxvd2VkICAgICAgICAgPT4gJElzQWxsb3dlZCwKICAgICAgICBJdGVtSUQgICAgICAgICAgICA9PiAwLAogICAgICAgIEFjdGlvbiAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBIYXNEZWZhdWx0QXJ0aWNsZSA9PiAkSGFzRGVmYXVsdEFydGljbGUKICAgICk7CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICMgR2V0IGFsbCBpdGVtcyAodmFsaWQgYW5kIGludmFsaWQpIGlmIFN5U0NvbmZpZyBpcyBzZXQuCiAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKICAgIG15IEBWYWxpZElEczsKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoICRDb25maWctPntTaG93SW52YWxpZEZBUUl0ZW1zfSApIHsKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFZhbGlkT2JqZWN0LT5WYWxpZExpc3QoKTsKICAgICAgICBAVmFsaWRJRHMgPSBrZXlzICVWYWxpZExpc3Q7CiAgICAgICAgJFZhbGlkICAgID0gMDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEBWYWxpZElEcyA9ICggJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApICk7CiAgICB9CgogICAgIyBDaGVjayBpZiB0aGVyZSBhcmUgc3ViY2F0ZWdvcmllcy4KICAgIGlmICggJENhdGVnb3J5SURzUmVmICYmIHJlZiAkQ2F0ZWdvcnlJRHNSZWYgZXEgJ0FSUkFZJyAmJiBAeyRDYXRlZ29yeUlEc1JlZn0gKSB7CgogICAgICAgICMgU2hvdyBkYXRhIGZvciBlYWNoIHN1YmNhdGVnb3J5LgogICAgICAgIGZvciBteSAkU3ViQ2F0ZWdvcnlJRCAoIEB7JENhdGVnb3J5SURzUmVmfSApIHsKCiAgICAgICAgICAgIG15ICVTdWJDYXRlZ29yeURhdGEgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJFN1YkNhdGVnb3J5SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IHRoZSBudW1iZXIgb2Ygc3ViY2F0ZWdvcmllcyBvZiB0aGlzIHN1YmNhdGVnb3J5LgogICAgICAgICAgICAkU3ViQ2F0ZWdvcnlEYXRhe1N1YkNhdGVnb3J5Q291bnR9ID0gJEZBUU9iamVjdC0+Q2F0ZWdvcnlDb3VudCgKICAgICAgICAgICAgICAgIFBhcmVudElEcyA9PiBbJFN1YkNhdGVnb3J5SURdLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IHRoZSBudW1iZXIgb2YgRkFRIGFydGljbGVzIGluIHRoaXMgY2F0ZWdvcnkuCiAgICAgICAgICAgICRTdWJDYXRlZ29yeURhdGF7QXJ0aWNsZUNvdW50fSA9ICRGQVFPYmplY3QtPkZBUUNvdW50KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgID0+IFskU3ViQ2F0ZWdvcnlJRF0sCiAgICAgICAgICAgICAgICBJdGVtU3RhdGVzICAgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICAgICAgICAgIE9ubHlBcHByb3ZlZCA9PiAwLAogICAgICAgICAgICAgICAgVmFsaWQgICAgICAgID0+ICRWYWxpZCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIE91dHB1dCB0aGUgY2F0ZWdvcnkgZGF0YS4KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYXYgPT4gJE5hdiwKICAgICAgICAgICAgICAgICAgICAlU3ViQ2F0ZWdvcnlEYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBPdGhlcndpc2UgYSBubyBkYXRhIGZvdW5kIG1lc3NhZ2UgaXMgZGlzcGxheWVkLgogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICApOwogICAgfQoKICAgICMgU2VhcmNoIGFsbCBGQVEgaXRlbXMgd2l0aGluIHRoZSBnaXZlbiBjYXRlZ29yeS4KICAgIG15IEBWaWV3YWJsZUl0ZW1JRHMgPSAkRkFRT2JqZWN0LT5GQVFTZWFyY2goCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJFNvcnRCeV0sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJE9yZGVyQnldLAogICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gJFNlYXJjaExpbWl0LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFN0YXRlcyAgICAgICAgICAgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+ICRJbnRlcmZhY2UsCiAgICAgICAgQ2F0ZWdvcnlJRHMgICAgICA9PiBbJENhdGVnb3J5SURdLAogICAgICAgIFZhbGlkSURzICAgICAgICAgPT4gXEBWYWxpZElEcywKICAgICk7CgogICAgIyBCdWlsZCBuZWNlc3Nhcnkgc3R1ZmYgZm9yIHRoZSBGQVEgYXJ0aWNsZSBsaXN0LgogICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRGaWx0ZXIpCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFZpZXcpCiAgICAgICAgLiAnO05hdj0nIC4gJE5hdgogICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFNvcnRCeSkKICAgICAgICAuICc7T3JkZXJCeT0nIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkT3JkZXJCeSkKICAgICAgICAuICc7Q2F0ZWdvcnlJRD0nIC4gJENhdGVnb3J5SUQKICAgICAgICAuICc7JzsKICAgIG15ICRMaW5rU29ydCA9ICdGaWx0ZXI9JwogICAgICAgIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkRmlsdGVyKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRWaWV3KQogICAgICAgIC4gJztOYXY9JyAuICROYXYKICAgICAgICAuICc7Q2F0ZWdvcnlJRD0nIC4gJENhdGVnb3J5SUQKICAgICAgICAuICc7JzsKICAgIG15ICRGaWx0ZXJMaW5rID0gJ1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkU29ydEJ5KQogICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRPcmRlckJ5KQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRWaWV3KQogICAgICAgIC4gJztOYXY9JyAuICROYXYKICAgICAgICAuICc7Q2F0ZWdvcnlJRD0nIC4gJENhdGVnb3J5SUQKICAgICAgICAuICc7JzsKCiAgICAjIEZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duLgogICAgbXkgQFNob3dDb2x1bW5zOwogICAgaWYgKCAkQ29uZmlnLT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIEdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZy4KICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkQ29uZmlnLT57U2hvd0NvbHVtbnN9IH07CgogICAgICAgICMgR2V0IHRoZSBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24uCiAgICAgICAgQ09MVU1OTkFNRToKICAgICAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJVBvc3NpYmxlQ29sdW1uICkgewogICAgICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgISRQb3NzaWJsZUNvbHVtbnskTmFtZX07CiAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zLCAkTmFtZTsKICAgICAgICB9CgogICAgICAgICMgRW5mb3JjZSBGQVEgbnVtYmVyIGNvbHVtbiBzaW5jZSBpcyB0aGUgbGluayBNYXN0ZXJBY3Rpb24gaG9vay4KICAgICAgICBpZiAoICEkUG9zc2libGVDb2x1bW57J051bWJlcid9ICkgewogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJ051bWJlcic7CiAgICAgICAgfQogICAgfQoKICAgICMgQnVpbGQgdGhlIHRpdGxlIHZhbHVlIChvbiB0b3Agb2YgdGhlIGFydGljbGUgbGlzdCkuCiAgICBteSAkVGl0bGUgPSAkQ2F0ZWdvcnlEYXRhe05hbWV9CiAgICAgICAgfHwgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeU5hbWUnKQogICAgICAgIHx8ICcnOwoKICAgICMgQnVpbGQgdGhlIEhUTUwgZm9yIHRoZSBsaXN0IG9mIEZBUSBhcnRpY2xlcyBpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCiAgICBteSAkRkFRSXRlbUxpc3RIVE1MID0gJExheW91dE9iamVjdC0+RkFRTGlzdFNob3coCiAgICAgICAgRkFRSURzICAgICA9PiBcQFZpZXdhYmxlSXRlbUlEcywKICAgICAgICBUb3RhbCAgICAgID0+IHNjYWxhciBAVmlld2FibGVJdGVtSURzLAogICAgICAgIFZpZXcgICAgICAgPT4gJFZpZXcsCiAgICAgICAgRW52ICAgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSAgID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCAgID0+ICRMaW5rU29ydCwKICAgICAgICBMaW5rRmlsdGVyID0+ICRGaWx0ZXJMaW5rLAoKICAgICAgICBUaXRsZU5hbWUgID0+IFRyYW5zbGF0YWJsZSgnRkFRIEFydGljbGVzJyksCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkVGl0bGUsCgogICAgICAgIExpbWl0ICAgICAgICA9PiAkU2VhcmNoTGltaXQsCiAgICAgICAgRmlsdGVyICAgICAgID0+ICRGaWx0ZXIsCiAgICAgICAgRmlsdGVyTGluayAgID0+ICRGaWx0ZXJMaW5rLAogICAgICAgIE9yZGVyQnkgICAgICA9PiAkT3JkZXJCeSwKICAgICAgICBTb3J0QnkgICAgICAgPT4gJFNvcnRCeSwKICAgICAgICBTaG93Q29sdW1ucyAgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICBPdXRwdXQgICAgICAgPT4gMSwKICAgICAgICBOYXYgICAgICAgICAgPT4gJE5hdiwKICAgICAgICBGQVFUaXRsZVNpemUgPT4gJENvbmZpZy0+e1RpdGxlU2l6ZX0sCiAgICApOwoKICAgICMgU2hvdyB0aGUgRkFRIGFydGljbGUgbGlzdC4KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0ZBUUl0ZW1MaXN0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRkFRSXRlbUxpc3RIVE1MID0+ICRGQVFJdGVtTGlzdEhUTUwsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBTZXQgUXVpY2tTZWFyY2ggbW9kZS4KICAgIG15ICRNb2RlID0gJ0FnZW50JzsKICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgJE1vZGUgPSAnQWdlbnRTbWFsbCc7CiAgICB9CgogICAgIyBTaG93IFF1aWNrU2VhcmNoLgogICAgJExheW91dE9iamVjdC0+RkFRU2hvd1F1aWNrU2VhcmNoKAogICAgICAgIE1vZGUgICAgICAgICAgICA9PiAkTW9kZSwKICAgICAgICBJbnRlcmZhY2UgICAgICAgPT4gJEludGVyZmFjZSwKICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIE5hdiAgICAgICAgICAgICA9PiAkTmF2LAogICAgKTsKCiAgICBteSAlSW5mb0JveFJlc3VsdHM7CgogICAgIyBTaG93IGxhc3QgYWRkZWQgYW5kIGxhc3QgdXBkYXRlZCBhcnRpY2xlcy4KICAgIGZvciBteSAkVHlwZSAocXcoTGFzdENyZWF0ZSBMYXN0Q2hhbmdlKSkgewoKICAgICAgICBteSAkU2hvd09rID0gJExheW91dE9iamVjdC0+RkFRU2hvd0xhdGVzdE5ld3NCb3goCiAgICAgICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgIE1vZGUgICAgICAgICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBDYXRlZ29yeUlEICAgICAgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkSW50ZXJmYWNlLAogICAgICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTmF2ICAgICAgICAgICAgID0+ICROYXYsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2hvd09rICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgU3RvcmUgdGhlIE5ld3NCb3hSZXN1bHQuCiAgICAgICAgJEluZm9Cb3hSZXN1bHRzeyRUeXBlfSA9ICRTaG93T2s7CiAgICB9CgogICAgIyBTaG93IHRvcCB0ZW4gYXJ0aWNsZXMuCiAgICBteSAkU2hvd09rID0gJExheW91dE9iamVjdC0+RkFRU2hvd1RvcDEwKAogICAgICAgIEZBUU9iamVjdCAgICAgICA9PiAkRkFRT2JqZWN0LAogICAgICAgIE1vZGUgICAgICAgICAgICA9PiAnQWdlbnQnLAogICAgICAgIENhdGVnb3J5SUQgICAgICA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICBJbnRlcmZhY2UgICAgICAgPT4gJEludGVyZmFjZSwKICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJEludGVyZmFjZVN0YXRlcywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIE5hdiAgICAgICAgICAgICA9PiAkTmF2LAogICAgKTsKICAgIGlmICggISRTaG93T2sgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICB9CgogICAgIyBTdG9yZSB0aGUgTmV3c0JveFJlc3VsdC4KICAgICRJbmZvQm94UmVzdWx0c3tUb3AxMH0gPSAkU2hvd09rOwoKICAgICMgU2V0IHRoZSBTaWRlYmFyIHdpZHRoLgogICAgbXkgJFNpZGViYXJDbGFzcyA9ICdMYXJnZSc7CgogICAgIyBDaGVjayBpZiBhbGwgSW5mb0JveGVzIGFyZSBlbXB0eSBhbmQgaGlkZSB0aGUgU2lkZWJhci4KICAgIGlmICgKICAgICAgICAkSW5mb0JveFJlc3VsdHN7TGFzdENyZWF0ZX0gZXEgLTEKICAgICAgICAmJiAkSW5mb0JveFJlc3VsdHN7TGFzdENoYW5nZX0gZXEgLTEKICAgICAgICAmJiAkSW5mb0JveFJlc3VsdHN7VG9wMTB9IGVxIC0xCiAgICAgICAgKQogICAgewogICAgICAgICRTaWRlYmFyQ2xhc3MgPSAnSGlkZGVuJzsKICAgIH0KCiAgICBpZiAoICROYXYgJiYgJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgJFNpZGViYXJDbGFzcyA9ICdNZWRpdW0nOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRGQVFFeHBsb3JlcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBDYXRlZ29yeUlEICAgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIFNpZGViYXJDbGFzcyA9PiAkU2lkZWJhckNsYXNzLAogICAgICAgICAgICAlQ2F0ZWdvcnlEYXRhLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJE5hdiAmJiAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgfQoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Output/HTML/Layout.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA3MzFlMjZjYzNmNjA0YjVlYjYzNTRmZmJhNTE2NjNmMTFlMzk0ZTY1IC0gS2VybmVsL091dHB1dC9IVE1ML0xheW91dC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+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+e1JpY2hUZXh0VHlwZX0gICAgICAgICAgICAgICAgfHwgJyc7CiAgICBteSAkUGljdHVyZVVwbG9hZEFjdGlvbiAgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dFBpY3R1cmVVcGxvYWRBY3Rpb259IHx8ICcnOwoKICAgICMgRGVjbGFyZSBkaWZmZXJlbnQgdG9vbGJhcnMuIFRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIHVzZWQgaW4gSmF2YVNjcmlwdC4KICAgIG15ICggQFRvb2xiYXIsIEBUb29sYmFyV2l0aG91dEltYWdlICk7CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dDo6RW5oYW5jZWRNb2RlJykgPT0gMSApIHsKICAgICAgICBAVG9vbGJhciA9ICgKICAgICAgICAgICAgJ2hlYWRpbmcnLCAgICAgICAnYm9sZCcsICAgICAgICAgICAgICAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywgICdudW1iZXJlZExpc3QnLCAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJywgICAnfCcsICAgICAgICAgICAgICAgICAnaW5kZW50JywgICAgICdvdXRkZW50JywgJ2FsaWdubWVudCcsICd8JywKICAgICAgICAgICAgJ2xpbmsnLCAgICAgICAgICAndW5kbycsICAgICAgICAgICAgICAncmVkbycsICAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydEltYWdlJywgICAnaG9yaXpvbnRhbExpbmUnLCAgICAnYmxvY2tRdW90ZScsICd8JywgJ2ZpbmRBbmRSZXBsYWNlJywgJ2ZvbnRDb2xvcicsICdmb250QmFja2dyb3VuZENvbG9yJywgJ3JlbW92ZUZvcm1hdCcsICd8JywKICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLCAnc3BlY2lhbENoYXJhY3RlcnMnLCAnfCcsCiAgICAgICAgICAgICdmb250RmFtaWx5JywgICAgJ2ZvbnRTaXplJywgICAgICAgICAgJ3wnLCAnY29kZUJsb2NrJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gKAogICAgICAgICAgICAnaGVhZGluZycsICAgICAgICAnYm9sZCcsICAgICAgICAgICAgICAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywgICAnbnVtYmVyZWRMaXN0JywgICAgICAnfCcsCiAgICAgICAgICAgICdpbnNlcnRUYWJsZScsICAgICd8JywgICAgICAgICAgICAgICAgICdpbmRlbnQnLCAnb3V0ZGVudCcsICdhbGlnbm1lbnQnLCAnfCcsCiAgICAgICAgICAgICdsaW5rJywgICAgICAgICAgICd1bmRvJywgICAgICAgICAgICAgICdyZWRvJywgICAnfCcsCiAgICAgICAgICAgICdob3Jpem9udGFsTGluZScsICdibG9ja1F1b3RlJywgICAgICAgICd8JywgICAgICAnZmluZEFuZFJlcGxhY2UnLCAnZm9udENvbG9yJywgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAncmVtb3ZlRm9ybWF0JywgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycsICAnc3BlY2lhbENoYXJhY3RlcnMnLCAnfCcsCiAgICAgICAgICAgICdmb250RmFtaWx5JywgICAgICdmb250U2l6ZScsICAgICAgICAgICd8JywgJ2NvZGVCbG9jaycKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFRvb2xiYXIgPSAoCiAgICAgICAgICAgICdoZWFkaW5nJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywKICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywKICAgICAgICAgICAgJ2ZvbnRDb2xvcicsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2JvbGQnLAogICAgICAgICAgICAndW5kZXJsaW5lJywKICAgICAgICAgICAgJ2l0YWxpYycsCiAgICAgICAgICAgICdzdHJpa2V0aHJvdWdoJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywKICAgICAgICAgICAgJ251bWJlcmVkTGlzdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ291dGRlbnQnLAogICAgICAgICAgICAnaW5kZW50JywKICAgICAgICAgICAgJ2FsaWdubWVudCcsCiAgICAgICAgICAgICdsaW5rJywKICAgICAgICAgICAgJ2Jsb2NrUXVvdGUnLAogICAgICAgICAgICAncmVtb3ZlRm9ybWF0JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnaW1hZ2VJbnNlcnQnLAogICAgICAgICAgICAnaW5zZXJ0VGFibGUnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdzb3VyY2VFZGl0aW5nJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gKAogICAgICAgICAgICAnaGVhZGluZycsCiAgICAgICAgICAgICdmb250U2l6ZScsCiAgICAgICAgICAgICdmb250RmFtaWx5JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnZm9udEJhY2tncm91bmRDb2xvcicsCiAgICAgICAgICAgICdmb250Q29sb3InLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdib2xkJywKICAgICAgICAgICAgJ3VuZGVybGluZScsCiAgICAgICAgICAgICdpdGFsaWMnLAogICAgICAgICAgICAnc3RyaWtldGhyb3VnaCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2J1bGxldGVkTGlzdCcsCiAgICAgICAgICAgICdudW1iZXJlZExpc3QnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdvdXRkZW50JywKICAgICAgICAgICAgJ2luZGVudCcsCiAgICAgICAgICAgICdhbGlnbm1lbnQnLAogICAgICAgICAgICAnbGluaycsCiAgICAgICAgICAgICdibG9ja1F1b3RlJywKICAgICAgICAgICAgJ3JlbW92ZUZvcm1hdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycKICAgICAgICApOwogICAgfQoKICAgIG15IEBQbHVnaW5zID0gKAogICAgICAgICdBbGlnbm1lbnQnLCAgICAnQXV0b2Zvcm1hdCcsICdCbG9ja1F1b3RlJywgJ0JvbGQnLCAnQ29kZUJsb2NrJywgJ0RhdGFGaWx0ZXInLCAnRGF0YVNjaGVtYScsICdGaW5kQW5kUmVwbGFjZScsICdGb250Q29sb3InLAogICAgICAgICdGb250RmFtaWx5JywgICAnRm9udFNpemUnLCAgICdGb250QmFja2dyb3VuZENvbG9yJywgJ0dlbmVyYWxIdG1sU3VwcG9ydCcsICdIZWFkaW5nJywgJ0hvcml6b250YWxMaW5lJywgJ0ltYWdlJywgJ0ltYWdlUmVzaXplJywgJ0ltYWdlU3R5bGUnLCAnSW1hZ2VVcGxvYWQnLAogICAgICAgICdJbWFnZVRvb2xiYXInLCAnSW1hZ2VJbnNlcnQnLAojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAnSW5kZW50JywgJ0luZGVudEJsb2NrJywgJ0l0YWxpYycsICdMaW5rJywgJ0xpc3QnLCAnUGFyYWdyYXBoJywgJ1JlbW92ZUZvcm1hdCcsICdTZWxlY3RBbGwnLCAnU2ltcGxlVXBsb2FkQWRhcHRlcicsICdTb3VyY2VFZGl0aW5nJywgJ1NwZWNpYWxDaGFyYWN0ZXJzJywKICAgICAgICAnSW5kZW50JywgJ0luZGVudEJsb2NrJywgJ0l0YWxpYycsICdMaW5rJywgJ01lbnRpb24nLCAnTGlzdCcsICdQYXJhZ3JhcGgnLCAnUmVtb3ZlRm9ybWF0JywgJ1NlbGVjdEFsbCcsICdTaW1wbGVVcGxvYWRBZGFwdGVyJywgJ1NvdXJjZUVkaXRpbmcnLCAnU3BlY2lhbENoYXJhY3RlcnMnLAojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAnU3BlY2lhbENoYXJhY3RlcnNFc3NlbnRpYWxzJywKICAgICAgICAnU3RyaWtldGhyb3VnaCcsICdUYWJsZScsICdUYWJsZUNlbGxQcm9wZXJ0aWVzJywgJ1RhYmxlQ29sdW1uUmVzaXplJywgJ1RhYmxlUHJvcGVydGllcycsICdUYWJsZVRvb2xiYXInLCAnVW5kZXJsaW5lJywgJ1VuZG8nLCAnUGFzdGVGcm9tT2ZmaWNlJwogICAgKTsKCiAgICAjIHNldCBkYXRhIHdpdGggQWRkSlNEYXRhKCkKICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ1JpY2hUZXh0JywKICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgIEhlaWdodCA9PiAkU2NyZWVuUmljaFRleHRIZWlnaHQsCiAgICAgICAgICAgIFdpZHRoICA9PiAkU2NyZWVuUmljaFRleHRXaWR0aCwKICAgICAgICAgICAgTGFuZyAgID0+IHsKICAgICAgICAgICAgICAgIFNwbGl0UXVvdGUgID0+ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdTcGxpdCBRdW90ZScpLAogICAgICAgICAgICAgICAgUmVtb3ZlUXVvdGUgPT4gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ1JlbW92ZSBRdW90ZScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBQbHVnaW5zICAgICAgICAgICAgID0+IFxAUGx1Z2lucywKICAgICAgICAgICAgVG9vbGJhciAgICAgICAgICAgICA9PiBcQFRvb2xiYXIsCiAgICAgICAgICAgIFRvb2xiYXJXaXRob3V0SW1hZ2UgPT4gXEBUb29sYmFyV2l0aG91dEltYWdlLAogICAgICAgICAgICBQaWN0dXJlVXBsb2FkQWN0aW9uID0+ICRQaWN0dXJlVXBsb2FkQWN0aW9uLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgID0+ICRSaWNoVGV4dFR5cGUsCiAgICAgICAgICAgIEVkaXRvclN0eWxlc1BhdGggICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJGcm9udGVuZDo6UmljaFRleHRFZGl0b3JTdHlsZXMiKSwKICAgICAgICAgICAgQ29udGVudFN0eWxlc1BhdGggICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dEFydGljbGVTdHlsZXMiKSwKICAgICAgICAgICAgQ3VzdG9tQ1NTICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dDo6RGVmYXVsdENTUyIpLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ3VzdG9tZXJTZXRSaWNoVGV4dFBhcmFtZXRlcnMoKQoKc2V0cyBwcm9wZXJ0aWVzIGZvciBjdXN0b21lciByaWNoIHRleHQgZWRpdG9yIGFuZCBzZW5kcyB0aGVtIHRvIEphdmFTY3JpcHQgdmlhIEFkZEpTRGF0YSgpLgoKICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyU2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgpBcyBhIHNpZGUgZWZmZWN0IGFjdGl2YXRlZCB0aGUgZmxhZyBDPEhhc1JpY2hUZXh0RWRpdG9yPiBzbyB0aGF0IHRoZSBmb290ZXIgZ2VuZXJhdGluZyBtZXRob2RzCmNhbiBpbmNsdWRlIHRoZSByaWNoIHRleHQgZWRpdG9yIGxpYnJhcmllcy4KCj1jdXQKCnN1YiBDdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtEYXRhfSB8fD0ge307CgogICAgIyBnZXQgYW5kIGNoZWNrIHBhcmFtIERhdGEKICAgIGlmICggcmVmICRQYXJhbXtEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEhhc2hSZWYgaW4gUGFyYW0gRGF0YSEgR290OiAnIiAuIHJlZiggJFBhcmFte0RhdGF9ICkgLiAiJyEiLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgfQoKICAgICMgdGVsbCB0aGUgZm9vdGVyIG1ldGhvZHMgdGhhdCByaWNoIHRleHQgbGlicmFyaWVzIGFyZSBuZWVkZWQKICAgICRTZWxmLT57SGFzUmljaFRleHRFZGl0b3J9ID0gMTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkU2NyZWVuUmljaFRleHRIZWlnaHQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dEhlaWdodCIpOwogICAgbXkgJFNjcmVlblJpY2hUZXh0V2lkdGggID0gJENvbmZpZ09iamVjdC0+R2V0KCJGcm9udGVuZDo6UmljaFRleHRXaWR0aCIpOwogICAgbXkgJFBpY3R1cmVVcGxvYWRBY3Rpb24gID0gJFBhcmFte0RhdGF9LT57UmljaFRleHRQaWN0dXJlVXBsb2FkQWN0aW9ufSB8fCAnJzsKCiAgICAjIERlY2xhcmUgZGlmZmVyZW50IHRvb2xiYXJzLiBUaGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZSB1c2VkIGluIEphdmFTY3JpcHQuCiAgICBteSAoIEBUb29sYmFyLCBAVG9vbGJhcldpdGhvdXRJbWFnZSwgQFRvb2xiYXJNaWRpLCBAVG9vbGJhck1pbmkgKTsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQ6OkVuaGFuY2VkTW9kZTo6Q3VzdG9tZXInKSA9PSAxICkgewogICAgICAgIEBUb29sYmFyID0gKAogICAgICAgICAgICAnaGVhZGluZycsICAgICAgICdib2xkJywgICAgICAgICAgICAgICdpdGFsaWMnLCAgICAgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3wnLCAnYnVsbGV0ZWRMaXN0JywgJ251bWJlcmVkTGlzdCcsICd8JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJywgICAnfCcsICAgICAgICAgICAgICAgICAnaW5kZW50JywgICAgICdvdXRkZW50JywgICAnYWxpZ25tZW50JywgICAgICd8JywKICAgICAgICAgICAgJ2xpbmsnLCAgICAgICAgICAndW5kbycsICAgICAgICAgICAgICAncmVkbycsICAgICAgICdzZWxlY3RBbGwnLCAnLScsCiAgICAgICAgICAgICdpbnNlcnRJbWFnZScsICAgJ2hvcml6b250YWxMaW5lJywgICAgJ2Jsb2NrUXVvdGUnLCAnfCcsICAgICAgICAgJ2ZpbmRBbmRSZXBsYWNlJywgJ2ZvbnRDb2xvcicsICdmb250QmFja2dyb3VuZENvbG9yJywgJ3JlbW92ZUZvcm1hdCcsICd8JywKICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLCAnc3BlY2lhbENoYXJhY3RlcnMnLCAnLScsCiAgICAgICAgICAgICdmb250RmFtaWx5JywgICAgJ2ZvbnRTaXplJywgICAgICAgICAgJ3wnLCAnY29kZUJsb2NrJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gKAogICAgICAgICAgICAnaGVhZGluZycsICAgICAgICAnYm9sZCcsICAgICAgICAgICAgICAnaXRhbGljJywgJ3VuZGVybGluZScsICAgICAgJ3N0cmlrZXRocm91Z2gnLCAnfCcsICdidWxsZXRlZExpc3QnLCAnbnVtYmVyZWRMaXN0JywgJ3wnLAogICAgICAgICAgICAnaW5zZXJ0VGFibGUnLCAgICAnfCcsICAgICAgICAgICAgICAgICAnaW5kZW50JywgJ291dGRlbnQnLCAgICAgICAgJ2FsaWdubWVudCcsICAgICAnfCcsCiAgICAgICAgICAgICdsaW5rJywgICAgICAgICAgICd1bmRvJywgICAgICAgICAgICAgICdyZWRvJywgICAnc2VsZWN0QWxsJywgICAgICAnLScsCiAgICAgICAgICAgICdob3Jpem9udGFsTGluZScsICdibG9ja1F1b3RlJywgICAgICAgICd8JywgICAgICAnZmluZEFuZFJlcGxhY2UnLCAnZm9udENvbG9yJywgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAncmVtb3ZlRm9ybWF0JywgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycsICAnc3BlY2lhbENoYXJhY3RlcnMnLCAnLScsCiAgICAgICAgICAgICdmb250RmFtaWx5JywgICAgICdmb250U2l6ZScsICAgICAgICAgICd8JywgJ2NvZGVCbG9jaycKICAgICAgICApOwoKICAgICAgICBAVG9vbGJhck1pZGkgPSAoCiAgICAgICAgICAgICdib2xkJywgICAgICdpdGFsaWMnLCAndW5kZXJsaW5lJywgICAgICAnc3RyaWtldGhyb3VnaCcsICAgICAgICd8JywgICAgICAgICAgICAnbnVtYmVyZWRMaXN0JywgJ2J1bGxldGVkTGlzdCcsICd8JywKICAgICAgICAgICAgJ2xpbmsnLCAgICAgJ3wnLCAgICAgICdob3Jpem9udGFsTGluZScsICd8JywgICAgICAgICAgICAgICAgICAgJ3VuZG8nLCAgICAgICAgICdyZWRvJywgICAgICAgICAnLScsCiAgICAgICAgICAgICdmb250U2l6ZScsICd8JywgICAgICAnZm9udENvbG9yJywgICAgICAnZm9udEJhY2tncm91bmRDb2xvcicsICdyZW1vdmVGb3JtYXQnLCAnfCcsICAgICAgICAgICAgJ3NwZWNpYWxDaGFyYWN0ZXJzJywgJ2Jsb2NrUXVvdGUnLCAnfCcsICdjb2RlQmxvY2snCiAgICAgICAgKTsKCiAgICAgICAgQFRvb2xiYXJNaW5pID0gKAogICAgICAgICAgICAnYm9sZCcsICAgICAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3wnLCAnYnVsbGV0ZWRMaXN0JywgJ3wnLCAnbGluaycsICd8JywgJ3VuZG8nLCAncmVkbycsICctJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywgJ3wnLCAgICAgICdmb250Q29sb3InLCAncmVtb3ZlRm9ybWF0JywgICd8JywgJ2Jsb2NrUXVvdGUnLCAgICd8JywgJ2NvZGVCbG9jaycKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFRvb2xiYXIgPSAoCiAgICAgICAgICAgICdoZWFkaW5nJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywKICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywKICAgICAgICAgICAgJ2ZvbnRDb2xvcicsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2JvbGQnLAogICAgICAgICAgICAndW5kZXJsaW5lJywKICAgICAgICAgICAgJ2l0YWxpYycsCiAgICAgICAgICAgICdzdHJpa2V0aHJvdWdoJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywKICAgICAgICAgICAgJ251bWJlcmVkTGlzdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ291dGRlbnQnLAogICAgICAgICAgICAnaW5kZW50JywKICAgICAgICAgICAgJ2FsaWdubWVudCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLAogICAgICAgICAgICAnbGluaycsCiAgICAgICAgICAgICdibG9ja1F1b3RlJywKICAgICAgICAgICAgJ3JlbW92ZUZvcm1hdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2ltYWdlSW5zZXJ0JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gKAogICAgICAgICAgICAnaGVhZGluZycsCiAgICAgICAgICAgICdmb250U2l6ZScsCiAgICAgICAgICAgICdmb250RmFtaWx5JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnZm9udEJhY2tncm91bmRDb2xvcicsCiAgICAgICAgICAgICdmb250Q29sb3InLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdib2xkJywKICAgICAgICAgICAgJ3VuZGVybGluZScsCiAgICAgICAgICAgICdpdGFsaWMnLAogICAgICAgICAgICAnc3RyaWtldGhyb3VnaCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2J1bGxldGVkTGlzdCcsCiAgICAgICAgICAgICdudW1iZXJlZExpc3QnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdvdXRkZW50JywKICAgICAgICAgICAgJ2luZGVudCcsCiAgICAgICAgICAgICdhbGlnbm1lbnQnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdzb3VyY2VFZGl0aW5nJywKICAgICAgICAgICAgJ2xpbmsnLAogICAgICAgICAgICAnYmxvY2tRdW90ZScsCiAgICAgICAgICAgICdyZW1vdmVGb3JtYXQnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdpbnNlcnRUYWJsZScKICAgICAgICApOwoKICAgICAgICBAVG9vbGJhck1pZGkgPSAoCiAgICAgICAgICAgICdib2xkJywgICAgICdpdGFsaWMnLCAndW5kZXJsaW5lJywgICAgICAnc3RyaWtldGhyb3VnaCcsICAgICAgICd8JywgICAgICAgICAgICAnbnVtYmVyZWRMaXN0JywgJ2J1bGxldGVkTGlzdCcsICd8JywKICAgICAgICAgICAgJ2xpbmsnLCAgICAgJ3wnLCAgICAgICdob3Jpem9udGFsTGluZScsICd8JywgICAgICAgICAgICAgICAgICAgJ3VuZG8nLCAgICAgICAgICdyZWRvJywgICAgICAgICAnLScsCiAgICAgICAgICAgICdmb250U2l6ZScsICd8JywgICAgICAnZm9udENvbG9yJywgICAgICAnZm9udEJhY2tncm91bmRDb2xvcicsICdyZW1vdmVGb3JtYXQnLCAnfCcsICAgICAgICAgICAgJ3NwZWNpYWxDaGFyYWN0ZXJzJywgJ2Jsb2NrUXVvdGUnCiAgICAgICAgKTsKCiAgICAgICAgQFRvb2xiYXJNaW5pID0gKAogICAgICAgICAgICAnYm9sZCcsICAgICAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3wnLCAnYnVsbGV0ZWRMaXN0JywgJ3wnLCAnbGluaycsICd8JywgJ3VuZG8nLCAncmVkbycsICctJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywgJ3wnLCAgICAgICdmb250Q29sb3InLCAncmVtb3ZlRm9ybWF0JywgICd8JywgJ2Jsb2NrUXVvdGUnCiAgICAgICAgKTsKICAgIH0KCiAgICBteSBAUGx1Z2lucyA9ICgKICAgICAgICAnQWxpZ25tZW50JywgICAgJ0F1dG9mb3JtYXQnLCAnQmxvY2tRdW90ZScsICdCb2xkJywgJ0NvZGVCbG9jaycsICdEYXRhRmlsdGVyJywgJ0RhdGFTY2hlbWEnLCAnRmluZEFuZFJlcGxhY2UnLCAnRm9udENvbG9yJywKICAgICAgICAnRm9udEZhbWlseScsICAgJ0ZvbnRTaXplJywgICAnRm9udEJhY2tncm91bmRDb2xvcicsICdHZW5lcmFsSHRtbFN1cHBvcnQnLCAnSGVhZGluZycsICdIb3Jpem9udGFsTGluZScsICdJbWFnZScsICdJbWFnZVJlc2l6ZScsICdJbWFnZVN0eWxlJywgJ0ltYWdlVXBsb2FkJywKICAgICAgICAnSW1hZ2VUb29sYmFyJywgJ0ltYWdlSW5zZXJ0JywKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgJ0luZGVudCcsICdJbmRlbnRCbG9jaycsJ0l0YWxpYycsICdMaW5rJywgJ0xpc3QnLCAnUGFyYWdyYXBoJywgJ1JlbW92ZUZvcm1hdCcsICdTZWxlY3RBbGwnLCAnU2ltcGxlVXBsb2FkQWRhcHRlcicsICdTb3VyY2VFZGl0aW5nJywgJ1NwZWNpYWxDaGFyYWN0ZXJzJywKICAgICAgICAnSW5kZW50JywgJ0luZGVudEJsb2NrJywnSXRhbGljJywgJ0xpbmsnLCAnTGlzdCcsICdNZW50aW9uJywgJ1BhcmFncmFwaCcsICdSZW1vdmVGb3JtYXQnLCAnU2VsZWN0QWxsJywgJ1NpbXBsZVVwbG9hZEFkYXB0ZXInLCAnU291cmNlRWRpdGluZycsICdTcGVjaWFsQ2hhcmFjdGVycycsCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICdTcGVjaWFsQ2hhcmFjdGVyc0Vzc2VudGlhbHMnLAogICAgICAgICdTdHJpa2V0aHJvdWdoJywgJ1RhYmxlJywgJ1RhYmxlQ2VsbFByb3BlcnRpZXMnLCAnVGFibGVDb2x1bW5SZXNpemUnLCAnVGFibGVQcm9wZXJ0aWVzJywgJ1RhYmxlVG9vbGJhcicsICdVbmRlcmxpbmUnLCAnVW5kbycsICdQYXN0ZUZyb21PZmZpY2UnCiAgICApOwoKICAgICMgc2V0IGRhdGEgd2l0aCBBZGRKU0RhdGEoKQogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmljaFRleHQnLAogICAgICAgIFZhbHVlID0+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvTGF5b3V0L0ZBUS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ6OkZBUTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6RkFRIC0gYWxsIEZBUS1yZWxhdGVkIEhUTUwgZnVuY3Rpb25zCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBGQVEtcmVsYXRlZCBIVE1MIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBHZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKCkKUmV0dXJucyBhIGNvbG9yIGRlcGVuZGluZyBvbiB0aGUgRkFRIHJhdGUKCiAgICBteSAkVm90aW5nUmVzdWx0Q29sb3IgPSAkTGF5b3V0T2JqZWN0LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKAogICAgICAgIFJhdGUgPT4gJzIwJywKICAgICk7CgpSZXR1cm5zOgoKICAgICRWb3RpbmdSZXN1bHRDb2xvciA9ICdyZWQnICAgICAgICAgICMgb3IgJ29yYW5nZScgb3IgJ2dyZWVuJwoKPWN1dAoKc3ViIEdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtSYXRlfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIHJhdGUhJyksCiAgICAgICAgKTsKICAgIH0KICAgIG15ICRDc3NUbXAgICAgICAgICAgICAgPSAnJzsKICAgIG15ICRWb3RpbmdSZXN1bHRDb2xvcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okl0ZW1MaXN0OjpWb3RpbmdSZXN1bHRDb2xvcnMnKTsKCiAgICBmb3IgbXkgJEtleSAoIHNvcnQgeyAkYiA8PT4gJGEgfSBrZXlzICV7JFZvdGluZ1Jlc3VsdENvbG9yc30gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17UmF0ZX0gPD0gJEtleSApIHsKICAgICAgICAgICAgJENzc1RtcCA9ICRWb3RpbmdSZXN1bHRDb2xvcnMtPnskS2V5fTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJENzc1RtcDsKfQoKPWhlYWQyIEZBUUxpc3RTaG93KCkKClJldHVybnMgYSBsaXN0IG9mIEZBUSBpdGVtcyBhcyBzb3J0LWFibGUgbGlzdCB3aXRoIHBhZ2luYXRpb24uCgpUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gTDxLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0VGlja2V0OjpUaWNrZXRMaXN0U2hvdygpPgppbiBGPEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXQvVGlja2V0LnBtPi4KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+RkFRTGlzdFNob3coCiAgICAgICAgRkFRSURzICAgICA9PiAkRkFRSURzUmVmLCAgICAgICAgICAgICAgICAgICAgICAgICAjIHRvdGFsIGxpc3Qgb2YgRkFRSURzLCB0aGF0IGNhbiBiZSBsaXN0ZWQKICAgICAgICBUb3RhbCAgICAgID0+IHNjYWxhciBAeyAkRkFRSURzUmVmIH0sICAgICAgICAgICAgICMgdG90YWwgbnVtYmVyIG9mIGxpc3QgaXRlbXMsIGluIHRoaXMgY2FzZQogICAgICAgIFZpZXcgICAgICAgPT4gJFNlbGYtPntWaWV3fSwgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgJ1NtYWxsJwogICAgICAgIEZpbHRlciAgICAgPT4gJ0FsbCcsCiAgICAgICAgRmlsdGVycyAgICA9PiBcJU5hdkJhckZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rID0+ICRMaW5rRmlsdGVyLAogICAgICAgIFRpdGxlTmFtZSAgPT4gJ092ZXJ2aWV3OiBGQVEnLAogICAgICAgIFRpdGxlVmFsdWUgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgIEVudiAgICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgICA9PiAkTGlua1BhZ2UsCiAgICAgICAgTGlua1NvcnQgICA9PiAkTGlua1NvcnQsCiAgICAgICAgRnJvbnRlbmQgICA9PiAnQWdlbnQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIChBZ2VudHxDdXN0b21lcnxQdWJsaWMpLCBkZWZhdWx0OiBBZ2VudCwgaW5kaWNhdGVzIGZyb20gd2hpY2ggZnJvbnRlbmQgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkCiAgICApOwoKPWN1dAoKc3ViIEZBUUxpc3RTaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0YWtlIG9iamVjdCByZWYgdG8gbG9jYWwsIHJlbW92ZSBpdCBmcm9tICVQYXJhbSAocHJldmVudCBtZW1vcnkgbGVhaykKICAgIG15ICRFbnYgPSAkUGFyYW17RW52fTsKICAgIGRlbGV0ZSAkUGFyYW17RW52fTsKCiAgICAjIGxvb2t1cCBsYXRlc3QgdXNlZCB2aWV3IG1vZGUKICAgIGlmICggISRQYXJhbXtWaWV3fSAmJiAkU2VsZi0+eyAnVXNlckZBUU92ZXJ2aWV3JyAuICRFbnYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgJFBhcmFte1ZpZXd9ID0gJFNlbGYtPnsgJ1VzZXJGQVFPdmVydmlldycgLiAkRW52LT57QWN0aW9ufSB9OwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmlldyBtb2RlIHRvICdzbWFsbCcKICAgIG15ICRWaWV3ID0gJFBhcmFte1ZpZXd9IHx8ICdTbWFsbCc7CgogICAgIyBzdG9yZSBsYXRlc3QgdmlldyBtb2RlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdVc2VyRkFRT3ZlcnZpZXcnIC4gJEVudi0+e0FjdGlvbn0sCiAgICAgICAgVmFsdWUgICAgID0+ICRWaWV3LAogICAgKTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBiYWNrZW5kIGZyb20gY29uZmlnCiAgICBteSAkQmFja2VuZHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RnJvbnRlbmQ6Ok92ZXJ2aWV3JykgfHwgJyc7CiAgICBpZiAoICEkQmFja2VuZHMgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZCBjb25maWcgb3B0aW9uIEZBUTo6RnJvbnRlbmQ6Ok92ZXJ2aWV3JyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBoYXNoLXJlZgogICAgaWYgKCByZWYgJEJhY2tlbmRzIG5lICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb25maWcgb3B0aW9uIEZBUTo6RnJvbnRlbmQ6Ok92ZXJ2aWV3IG5lZWRzIHRvIGJlIGEgSEFTSCByZWYhJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBjb25maWcga2V5CiAgICBpZiAoICEkQmFja2VuZHMtPnskVmlld30gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdObyBjb25maWcgb3B0aW9uIGZvdW5kIGZvciB0aGUgdmlldyAiJXMiIScsICRWaWV3ICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG5hdmlnYXRpb24gYmFyCiAgICBteSAkU3RhcnRIaXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICdTdGFydEhpdCcsCiAgICApIHx8IDE7CgogICAgIyBnZXQgcGVyc29uYWwgcGFnZSBzaG93biBjb3VudAogICAgbXkgJFBhZ2VTaG93blByZWZlcmVuY2VzS2V5ID0gJ1VzZXJGQVFPdmVydmlldycgLiAkVmlldyAuICdQYWdlU2hvd24nOwogICAgbXkgJFBhZ2VTaG93biAgICAgICAgICAgICAgID0gJFNlbGYtPnskUGFnZVNob3duUHJlZmVyZW5jZXNLZXl9IHx8IDEwOwogICAgbXkgJEdyb3VwICAgICAgICAgICAgICAgICAgID0gJ0ZBUU92ZXJ2aWV3JyAuICRWaWV3IC4gJ1BhZ2VTaG93bic7CgogICAgIyBjaGVjayBzdGFydCBvcHRpb24sIGlmIGhpZ2hlciB0aGVuIGVsZW1lbnRzIGF2YWlsYWJsZSwgc2V0CiAgICAjIGl0IHRvIHRoZSBsYXN0IG92ZXJ2aWV3IHBhZ2UgKFRoYW5rcyB0byBTdGVmYW4gU2NobWlkdCEpCiAgICBpZiAoICRTdGFydEhpdCA+ICRQYXJhbXtUb3RhbH0gKSB7CiAgICAgICAgbXkgJFBhZ2VzID0gaW50KCAoICRQYXJhbXtUb3RhbH0gLyAkUGFnZVNob3duICkgKyAwLjk5OTk5ICk7CiAgICAgICAgJFN0YXJ0SGl0ID0gKCAoICRQYWdlcyAtIDEgKSAqICRQYWdlU2hvd24gKSArIDE7CiAgICB9CgogICAgIyBnZXQgZGF0YSBzZWxlY3Rpb24KICAgIG15ICVEYXRhOwogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnUHJlZmVyZW5jZXNHcm91cHMnKTsKICAgIGlmICggJENvbmZpZyAmJiAkQ29uZmlnLT57JEdyb3VwfSAmJiAkQ29uZmlnLT57JEdyb3VwfS0+e0RhdGF9ICkgewogICAgICAgICVEYXRhID0gJXsgJENvbmZpZy0+eyRHcm91cH0tPntEYXRhfSB9OwogICAgfQoKICAgICMgc2V0IHBhZ2UgbGltaXQgYW5kIGJ1aWxkIHBhZ2UgbmF2aWdhdGlvbgogICAgbXkgJExpbWl0ICAgPSAkUGFyYW17TGltaXR9IHx8IDIwXzAwMDsKICAgIG15ICVQYWdlTmF2ID0gJFNlbGYtPlBhZ2VOYXZCYXIoCiAgICAgICAgTGltaXQgICAgID0+ICRMaW1pdCwKICAgICAgICBTdGFydEhpdCAgPT4gJFN0YXJ0SGl0LAogICAgICAgIFBhZ2VTaG93biA9PiAkUGFnZVNob3duLAogICAgICAgIEFsbEhpdHMgICA9PiAkUGFyYW17VG90YWx9IHx8IDAsCiAgICAgICAgQWN0aW9uICAgID0+ICdBY3Rpb249JyAuICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBMaW5rICAgICAgPT4gJFBhcmFte0xpbmtQYWdlfSwKICAgICk7CgogICAgIyBidWlsZCBzaG93biBGQVEgYXJ0aWNsZXMgb24gYSBwYWdlCiAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSAgICA9ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IjsKICAgICRQYXJhbXtHcm91cH0gICAgICAgICAgID0gJEdyb3VwOwogICAgJFBhcmFte1ByZWZlcmVuY2VzS2V5fSAgPSAkUGFnZVNob3duUHJlZmVyZW5jZXNLZXk7CiAgICAkUGFyYW17UGFnZVNob3duU3RyaW5nfSA9ICRTZWxmLT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAkUGFnZVNob3duUHJlZmVyZW5jZXNLZXksCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhZ2VTaG93biwKICAgICAgICBEYXRhICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICBTb3J0ICAgICAgICA9PiAnTnVtZXJpY1ZhbHVlJywKICAgICAgICBDbGFzcyAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBidWlsZCBuYXZpZ2F0aW9uIGJhciBjb250ZW50CiAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJExpbmtCYWNrSUQgPSAnRkFRU2VhcmNoJzsKICAgIGlmICggJFBhcmFte05hdn0gJiYgJFBhcmFte05hdn0gZXEgJ05vbmUnICkgewogICAgICAgICRMaW5rQmFja0lEIC49ICdTbWFsbCc7CiAgICB9CgogICAgIyBiYWNrIGxpbmsKICAgIGlmICggJFBhcmFte0xpbmtCYWNrfSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZUJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExpbmtCYWNrSUQgPT4gJExpbmtCYWNrSUQsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNlbmQgZGF0YSB0byBKUy4KICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ0ZBUVNlYXJjaFByb2ZpbGUnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtQcm9maWxlfSwKICAgICk7CgogICAgIyBnZXQgZmlsdGVycwogICAgaWYgKCAkUGFyYW17RmlsdGVyc30gKSB7CgogICAgICAgICMgZ2V0IGdpdmVuIGZpbHRlcnMKICAgICAgICBteSBATmF2QmFyRmlsdGVyczsKICAgICAgICBmb3IgbXkgJFByaW8gKCBzb3J0IGtleXMgJXsgJFBhcmFte0ZpbHRlcnN9IH0gKSB7CiAgICAgICAgICAgIHB1c2ggQE5hdkJhckZpbHRlcnMsICRQYXJhbXtGaWx0ZXJzfS0+eyRQcmlvfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgZmlsdGVyIGNvbnRlbnQKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb29wIG92ZXIgZmlsdGVycwogICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKEBOYXZCYXJGaWx0ZXJzKSB7CgogICAgICAgICAgICAjIGluY3JlbWVudCBmaWx0ZXIgY291bnQgYW5kIGJ1aWxkIGZpbHRlciBpdGVtCiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmaWx0ZXIgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCAkRmlsdGVyLT57RmlsdGVyfSBlcSAkUGFyYW17RmlsdGVyfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBsb29wIG92ZXIgY29uZmlndXJlZCBiYWNrLWVuZHMKICAgIGZvciBteSAkQmFja2VuZCAoIHNvcnQga2V5cyAleyRCYWNrZW5kc30gKSB7CgogICAgICAgICMgYnVpbGQgbmF2aWdhdGlvbiBiYXIgdmlldyBtb2RlCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyAkQmFja2VuZHMtPnskQmFja2VuZH0gfSwKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgIFZpZXcgICA9PiAkQmFja2VuZCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGN1cnJlbnQgdmlldyBpcyBjb25maWd1cmVkIGluIGJhY2tlbmQKICAgICAgICBpZiAoICRWaWV3IGVxICRCYWNrZW5kICkgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlU2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7ICRCYWNrZW5kcy0+eyRCYWNrZW5kfSB9LAogICAgICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZU5vdFNlbGVjdGVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyAkQmFja2VuZHMtPnskQmFja2VuZH0gfSwKICAgICAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJFBhcmFte0ZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgVmlldyAgID0+ICRCYWNrZW5kLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBwYWdlIG5hdmlnYXRpb24gaXMgYXZhaWxhYmxlCiAgICBpZiAoJVBhZ2VOYXYpIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYWdlTmF2LAogICAgICAgICk7CgogICAgICAgICMgZG9uJ3Qgc2hvdyBjb250ZXh0IHNldHRpbmdzIGluIEFKQVggY2FzZSAoZS4gZy4gaW4gY3VzdG9tZXIgRkFRIGhpc3RvcnkpLAogICAgICAgICMgYmVjYXVzZSB0aGUgc3VibWl0IHdpdGggcGFnZSByZWxvYWQgd2lsbCBub3Qgd29yayB0aGVyZQogICAgICAgIGlmICggISRQYXJhbXtBSkFYfSApIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29udGV4dFNldHRpbmdzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgSFRNTCBjb250ZW50CiAgICBteSAkT3V0cHV0TmF2QmFyID0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFZpZXcgPT4gJFZpZXcsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBvdXRwdXQKICAgIG15ICRPdXRwdXRSYXcgPSAkT3V0cHV0TmF2QmFyOwoKICAgICMgbG9hZCBtb2R1bGUKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRCYWNrZW5kcy0+eyRWaWV3fS0+e01vZHVsZX0gKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPkZhdGFsRXJyb3IoKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBiYWNrZW5kIG9iamVjdAogICAgbXkgJE9iamVjdCA9ICRCYWNrZW5kcy0+eyRWaWV3fS0+e01vZHVsZX0tPm5ldyggJXskRW52fSApOwogICAgcmV0dXJuIGlmICEkT2JqZWN0OwoKICAgICMgcnVuIG1vZHVsZQogICAgbXkgJE91dHB1dCA9ICRPYmplY3QtPlJ1bigKICAgICAgICAlUGFyYW0sCiAgICAgICAgTGltaXQgICAgID0+ICRMaW1pdCwKICAgICAgICBTdGFydEhpdCAgPT4gJFN0YXJ0SGl0LAogICAgICAgIFBhZ2VTaG93biA9PiAkUGFnZVNob3duLAogICAgICAgIEFsbEhpdHMgICA9PiAkUGFyYW17VG90YWx9ICAgIHx8IDAsCiAgICAgICAgRnJvbnRlbmQgID0+ICRQYXJhbXtGcm9udGVuZH0gfHwgJ0FnZW50JywKICAgICAgICBOYXYgICAgICAgPT4gJFBhcmFte05hdn0gICAgICB8fCAnJywKICAgICAgICBUaXRsZVNpemUgPT4gJFBhcmFte0ZBUVRpdGxlU2l6ZX0sCiAgICApOwoKICAgICMgY3JlYXRlIG91dHB1dAogICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0OwoKICAgICMgY3JlYXRlIG92ZXJ2aWV3IG5hdmlnYXRpb24gYmFyCiAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgcmV0dXJuIGNvbnRlbnQgaWYgYXZhaWxhYmxlCiAgICByZXR1cm4gJE91dHB1dFJhdzsKfQoKPWhlYWQyIEZBUUNvbnRlbnRTaG93KCkKCk91dHB1dHMgdGhlIG5lY2Vzc2FyeSBibG9ja3MgdG8gZGlzcGxheSB0aGUgRkFRIGl0ZW0gZmllbGRzIGZvciB0aGUgc3VwcGxpZWQgRkFRIGl0ZW0gSUQuClRoZSBmaWVsZHMgZGlzcGxheWVkIGFyZSBhbHNvIHJlc3RyaWN0ZWQgYnkgdGhlIHBlcm1pc3Npb25zIHJlcHJlc2VudGVkIGJ5IHRoZSBzdXBwbGllZCBpbnRlcmZhY2UKCklmIGV4aXN0IFJldHVybkNvbnRlbnQgcGFyYW1ldGVyIGl0IHJldHVybnMgdGhlIEZBUSBpdGVtcyBmaWVsZHMgb24gYSBIVE1MIGZvcm1hdHRlZCBzdHJpbmcKCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFDb250ZW50U2hvdygKICAgICAgICBGQVFPYmplY3QgICAgICAgPT4gJEZBUU9iamVjdCwgICAgICAgICAgICAgICAgICMgbmVlZGVkIGZvciBjb3JlIG1vZHVsZSBpbnRlcmFjdGlvbgogICAgICAgIEZBUURhdGEgICAgICAgICA9PiAleyAkRkFRRGF0YSB9LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICRDb250ZW50ID0gJExheW91dE9iamVjdC0+RkFRQ29udGVudFNob3coCiAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsICAgICAgICAgICAgICAgICAjIG5lZWRlZCBmb3IgY29yZSBtb2R1bGUgaW50ZXJhY3Rpb24KICAgICAgICBGQVFEYXRhICAgICAgICAgPT4gJXsgJEZBUURhdGEgfSwKICAgICAgICBJbnRlcmZhY2VTdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgIFJldHVybkNvbnRlbnQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGQVFDb250ZW50U2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhGQVFPYmplY3QgRkFRRGF0YSBJbnRlcmZhY2VTdGF0ZXMgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc3RvcmUgRkFRIG9iamVjdCBsb2NhbGx5CiAgICBteSAkRkFRT2JqZWN0ID0gJFBhcmFte0ZBUU9iamVjdH07CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgIG15ICVGQVFEYXRhICAgPSAleyAkUGFyYW17RkFRRGF0YX0gfTsKIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgdGhlIGNvbmZpZyBvZiBGQVEgZmllbGRzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICBteSAlRmllbGRzOwogICAgRklFTEQ6CiAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gNiApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIG9mIEZBUSBmaWVsZAogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICdGQVE6Okl0ZW06OkZpZWxkJyAuICROdW1iZXIgKTsKCiAgICAgICAgIyBza2lwIG92ZXIgbm90IHNob3duIGZpZWxkcwogICAgICAgIG5leHQgRklFTEQgaWYgISRDb25maWctPntTaG93fTsKCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAjIHNraXAgb3ZlciBmaWVsZHMgd2l0aG91dCBjb250ZW50CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkUGFyYW17Wm9vbX0gJiYgJEZBUURhdGF7IkZpZWxkJE51bWJlciJ9IGVxICcnOwojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAgICAgIyBzdG9yZSBvbmx5IHRoZSBjb25maWcgb2YgZmllbGRzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgJEZpZWxkc3siRmllbGQkTnVtYmVyIn0gPSAkQ29uZmlnOwogICAgfQoKICAgIG15ICRGdWxsQ29udGVudDsKCiAgICAjIHNvcnQgc2hvd24gZmllbGRzIGJ5IHByaW9yaXR5CiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKCBzb3J0IHsgJEZpZWxkc3skYX0tPntQcmlvfSA8PT4gJEZpZWxkc3skYn0tPntQcmlvfSB9IGtleXMgJUZpZWxkcyApIHsKCiAgICAgICAgIyBnZXQgdGhlIHN0YXRlIHR5cGUgZGF0YSBvZiB0aGlzIGZpZWxkCiAgICAgICAgbXkgJFN0YXRlVHlwZURhdGEgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgICAgIE5hbWUgICA9PiAkRmllbGRzeyRGaWVsZH0tPntTaG93fSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZG8gbm90IHNob3cgZmllbGRzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBnaXZlbiBpbnRlcmZhY2UKICAgICAgICBuZXh0IEZJRUxEIGlmICEkUGFyYW17SW50ZXJmYWNlU3RhdGVzfS0+eyAkU3RhdGVUeXBlRGF0YS0+e1N0YXRlSUR9IH07CgogICAgICAgIG15ICRDYXB0aW9uID0gJEZpZWxkc3skRmllbGR9LT57J0NhcHRpb24nfTsKICAgICAgICBteSAkQ29udGVudCA9ICRQYXJhbXtGQVFEYXRhfS0+eyRGaWVsZH0gfHwgJyc7CgogICAgICAgICMgcmVtb3ZlIGFjdGl2ZSBIVE1MIGNvbnRlbnQgKHNjcmlwdHMsIGFwcGxldHMsIGV0Yy4uLikKICAgICAgICBteSAlU2FmZUNvbnRlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICAgICAgU3RyaW5nICAgICAgID0+ICRDb250ZW50LAogICAgICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICAgICAgTm9PYmplY3QgICAgID0+IDEsCiAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICBOb0ludFNyY0xvYWQgPT4gMCwKICAgICAgICAgICAgTm9FeHRTcmNMb2FkID0+IDAsCiAgICAgICAgICAgIE5vSmF2YVNjcmlwdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgdGFrZSB0aGUgc2FmZSBjb250ZW50IGlmIG5lY2Vzc2FyeQogICAgICAgIGlmICggJFNhZmVDb250ZW50e1JlcGxhY2V9ICkgewogICAgICAgICAgICAkQ29udGVudCA9ICRTYWZlQ29udGVudHtTdHJpbmd9OwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSBmaWVsZAogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRQ29udGVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSXRlbUlEICAgID0+ICRQYXJhbXtGQVFEYXRhfS0+e0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBGaWVsZCAgICAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgQ2FwdGlvbiAgID0+ICRDYXB0aW9uLAogICAgICAgICAgICAgICAgU3RhdGVOYW1lID0+ICRTdGF0ZVR5cGVEYXRhLT57TmFtZX0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJENvbnRlbnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpICYmICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUNvbnRlbnRIVE1MJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17RkFRRGF0YX0tPntJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpZWxkICA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgY29udmVydCBmaWVsZHMgQVNDSUkgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmICggJFBhcmFte0ZBUURhdGF9LT57Q29udGVudFR5cGV9IG5lICd0ZXh0L3BsYWluJyApIHsKICAgICAgICAgICAgICAgICRDb250ZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUNvbnRlbnRQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRDb250ZW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2VuZCBjb25maWcgdG8gSlMuCiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0FnZW50SFRNTEZpZWxkSGVpZ2h0RGVmYXVsdCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpGcm9udGVuZDo6QWdlbnRIVE1MRmllbGRIZWlnaHREZWZhdWx0JyksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnQWdlbnRIVE1MRmllbGRIZWlnaHRNYXgnLAogICAgICAgICAgICBWYWx1ZSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6RnJvbnRlbmQ6OkFnZW50SFRNTEZpZWxkSGVpZ2h0TWF4JyksCiAgICAgICAgKTsKCiAgICAgICAgIyBzdG9yZSB0aGUgZmllbGQgdG8gcmV0dXJuIGFsbCBGQVEgQm9keQogICAgICAgIGlmICggJFBhcmFte1JldHVybkNvbnRlbnR9ICYmICRDb250ZW50ICkgewoKICAgICAgICAgICAgIyBnZXQgdGhlIGludGVybmFsIHN0YXRlIHR5cGUKICAgICAgICAgICAgbXkgJEludGVybmFsU3RhdGVUeXBlID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlR2V0KAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICdpbnRlcm5hbCcsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGN1cnJlbnQgZmllbGQgaXMgaW50ZXJuYWwKICAgICAgICAgICAgbXkgJElzSW50ZXJuYWw7CiAgICAgICAgICAgIGlmICggJFN0YXRlVHlwZURhdGEtPntTdGF0ZUlEfSA9PSAkSW50ZXJuYWxTdGF0ZVR5cGUtPntTdGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRJc0ludGVybmFsID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBUaWNrZXQgQ29tcG9zZQogICAgICAgICAgICBteSAkVGlja2V0Q29tcG9zZUNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpUaWNrZXRDb21wb3NlJyk7CgogICAgICAgICAgICAjIENoZWNrIGlmIGZpZWxkIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSByZXR1cm5pbmcgc3RyaW5nCiAgICAgICAgICAgIGlmICggJFRpY2tldENvbXBvc2VDb25maWctPntJbmNsdWRlSW50ZXJuYWx9IHx8ICEkSXNJbnRlcm5hbCApIHsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIGZpZWxkIG5hbWUgc2hvdWxkIGJlIHJldHVybmVkCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXRDb21wb3NlQ29uZmlnLT57U2hvd0ZpZWxkTmFtZXN9ICkgewogICAgICAgICAgICAgICAgICAgICRGdWxsQ29udGVudCAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRDYXB0aW9uKSAuICcgPGJyLz4gJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRGdWxsQ29udGVudCAuPSAkQ29udGVudCAuICcgPGJyLz4gJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBhbGwgdGhlIChwZXJtaXR0ZWQpIEZBUSBib2R5CiAgICBpZiAoICRQYXJhbXtSZXR1cm5Db250ZW50fSApIHsKICAgICAgICBpZiAoJEZ1bGxDb250ZW50KSB7CiAgICAgICAgICAgIHJldHVybiAkRnVsbENvbnRlbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdUaGlzIGFydGljbGUgaXMgZW1wdHkhJyk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFQYXRoU2hvdygpCgppZiBpdHMgYWxsb3dlZCBieSB0aGUgY29uZmlndXJhdGlvbiwgb3V0cHV0cyB0aGUgbmVjZXNzYXJ5IGJsb2NrcyB0byBkaXNwbGF5IHRoZSBGQVEgaXRlbSBwYXRoLAphbmQgcmV0dXJucyB0aGUgdmFsdWUgMS4KCiAgICBteSAkU2hvd1BhdGhPayA9ICRMYXlvdXRPYmplY3QtPkZBUVBhdGhTaG93KAogICAgICAgIEZBUU9iamVjdCAgID0+ICRGQVFPYmplY3QsICAgICAgICAgICAgICAgICAgICMgbmVlZGVkIGZvciBjb3JlIG1vZHVsZSBpbnRlcmFjdGlvbgogICAgICAgIENhdGVnb3J5SUQgID0+IDUsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICBQYXRoRm9ySXRlbSA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIChkZWZhdWx0IDApCiAgICAgICAgTmF2ICAgICAgICAgPT4gJ25vbmUnLCAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBGQVFQYXRoU2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KEZBUU9iamVjdCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRQYXJhbU5hbWV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUGFyYW1OYW1lISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1BhdGhGb3JJdGVtfSB8fD0gMDsKCiAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0NhdGVnb3J5SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDYXRlZ29yeUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJEJsb2NrID0gJ0ZBUVBhdGhDYXRlZ29yeUVsZW1lbnQnOwogICAgaWYgKCAkUGFyYW17Q2F0ZWdvcnlJRH0gZXEgJzAnICkgewogICAgICAgICRCbG9jayA9ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50Tm9MaW5rJzsKICAgIH0KCiAgICAjIG91dHB1dCBjYXRlZ29yeSByb290CiAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkQmxvY2ssCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeU5hbWUnKSwKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAwLAogICAgICAgICAgICBOYXYgICAgICAgID0+ICRQYXJhbXtOYXZ9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IFNob3cgRkFRIFBhdGggc2V0dGluZwogICAgbXkgJFNob3dQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkV4cGxvcmVyOjpQYXRoOjpTaG93Jyk7CgogICAgIyBkbyBub3QgZGlzcGxheSB0aGUgcGF0aCBpZiBzZXR0aW5nIGlzIG9mZgogICAgcmV0dXJuIGlmICEkU2hvd1BhdGg7CgogICAgbXkgJEZBUU9iamVjdCA9ICRQYXJhbXtGQVFPYmplY3R9OwoKICAgIG15ICRDYXRlZ29yeUxpc3QgPSAkRkFRT2JqZWN0LT5GQVFQYXRoTGlzdEdldCgKICAgICAgICBDYXRlZ29yeUlEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIG91dHB1dCBzdWJjYXRlZ29yaWVzCiAgICBmb3IgbXkgJENhdGVnb3J5RGF0YSAoIEB7JENhdGVnb3J5TGlzdH0gKSB7CgogICAgICAgICRCbG9jayA9ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50JzsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDYXRlZ29yeURhdGEtPntDYXRlZ29yeUlEfSA9PSAkQ2F0ZWdvcnlMaXN0LT5bLTFdLT57Q2F0ZWdvcnlJRH0KICAgICAgICAgICAgJiYgISRQYXJhbXtQYXRoRm9ySXRlbX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrID0gJ0ZBUVBhdGhDYXRlZ29yeUVsZW1lbnROb0xpbmsnOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRCbG9jaywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYXYgPT4gJFBhcmFte05hdn0sCiAgICAgICAgICAgICAgICAleyRDYXRlZ29yeURhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZBUVJhdGluZ1N0YXJzU2hvdygpCgpPdXRwdXRzIHRoZSBuZWNlc3NhcnkgYmxvY2tzIHRvIHJlcHJlc2VudCB0aGUgRkFRIGl0ZW0gcmF0aW5nCmFzICJTdGFycyIgaW4gdGhlIHNjYWxlIGZyb20gMSB0byA1LgoKICAgICRMYXlvdXRPYmplY3QtPkZBUVJhdGluZ1N0YXJzU2hvdygKICAgICAgICBWb3RlUmVzdWx0ID0+ICRGQVFEYXRhLT57Vm90ZVJlc3VsdH0sCiAgICAgICAgVm90ZXMgICAgICA9PiAkRkFRRGF0YSAtPntWb3Rlc30sCiAgICApOwoKPWN1dAoKc3ViIEZBUVJhdGluZ1N0YXJzU2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhWb3RlUmVzdWx0IFZvdGVzKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRQYXJhbU5hbWV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUGFyYW1OYW1lISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgc3RhcnMgYnkgbXVsdGlwbHkgYnkgNSBhbmQgZGl2aWRlIGJ5IDEwMAogICAgIyAxMDAgYmVjYXVzZSBWb3RlIHJlc3VsdCBpcyBhICUKICAgICMgNSBiZWNhdXNlIHdlIGhhdmUgb25seSA1IHN0YXJzCiAgICBteSAkU3RhckNvdW50ZXIgPSBpbnQoICRQYXJhbXtWb3RlUmVzdWx0fSAqIDAuMDUgKTsKICAgIGlmICggJFN0YXJDb3VudGVyIDwgNSApIHsKCiAgICAgICAgIyBhZGQgMSBiZWNhdXNlIGxvd2VzdCB2YWx1ZSBzaG91bGQgYmUgMQogICAgICAgICRTdGFyQ291bnRlcisrOwogICAgfQoKICAgICMgdGhlIG51bWJlciBvZiBzdGFycyBjYW4ndCBiZSBncmF0ZXIgdGhhdCA1CiAgICBlbHNpZiAoICRTdGFyQ291bnRlciA+IDUgKSB7CiAgICAgICAgJFN0YXJDb3VudGVyID0gNTsKICAgIH0KCiAgICAjIG91dHB1dCByYXRpbmcgYmxvY2sKICAgICRTZWxmLT5CbG9jaygKICAgICAgICBOYW1lID0+ICdWaWV3UmF0aW5nJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZG8gbm90IG91dHB1dCBhbnkgc3RhciBpZiB0aGlzIEZBUSBoYXMgYmVlbiBub3Qgdm90ZWQKICAgIGlmICggJFBhcmFte1ZvdGVzfSBlcSAnMCcgKSB7CiAgICAgICAgJFN0YXJDb3VudGVyID0gMDsKICAgIH0KCiAgICAjIHNob3cgc3RhcnMgb25seSBpZiB0aGUgRkFRIGl0ZW0gaGFzIGJlZW4gdm90ZWQgYXQgbGVhc3Qgb25jZSBldmVuIGlmIHRoZSAkVm90ZVJlc3VsdCBpcyAwCiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgc3RhcnMKICAgICAgICBmb3IgKCAxIC4uICRTdGFyQ291bnRlciApIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmF0ZVN0YXJzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgc3RhcnMgdGV4dAogICAgJFNlbGYtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1JhdGVTdGFyc0NvdW50JywKICAgICAgICBEYXRhID0+IHsgU3RhcnMgPT4gJFN0YXJDb3VudGVyIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRkFRU2hvd0xhdGVzdE5ld3NCb3goKQoKU2hvd3MgYW4gaW5mbyBib3ggd2l0aCB0aGUgbGFzdCB1cGRhdGVkIG9yIGxhc3QgY3JlYXRlZCBGQVEgYXJ0aWNsZXMuCkRlcGVuZGluZyBvbiB0aGUgdXNlcyBpbnRlcmZhY2UgKGFnZW50LCBjdXN0b21lciwgcHVibGljKSBvbmx5IHRoZSBhcHByb3ByaWF0ZQphcnRpY2xlcyBhcmUgc2hvd24gaGVyZS4KCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFTaG93TGF0ZXN0TmV3c0JveCgKICAgICAgICBGQVFPYmplY3QgICAgICAgPT4gJEZBUU9iamVjdCwgICAgICAgICAgICAgICAgICMgbmVlZGVkIGZvciBjb3JlIG1vZHVsZSBpbnRlcmFjdGlvbgogICAgICAgIFR5cGUgICAgICAgICAgICA9PiAnTGFzdENyZWF0ZScsICAgICAgICAgICAgICAgIyAoTGFzdENyZWF0ZSB8IExhc3RDaGFuZ2UpCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdQdWJsaWMnLCAgICAgICAgICAgICAgICAgICAjIChBZ2VudCwgQ3VzdG9tZXIsIFB1YmxpYykKICAgICAgICBDYXRlZ29yeUlEICAgICAgPT4gNSwKICAgICAgICBJbnRlcmZhY2UgICAgICAgPT4gJFNlbGYtPntJbnRlcmZhY2V9LAogICAgICAgIEludGVyZmFjZVN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgTmF2ICAgICAgICAgICAgID0+ICdub25lJywgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEZBUVNob3dMYXRlc3ROZXdzQm94IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KEZBUU9iamVjdCBUeXBlIE1vZGUgSW50ZXJmYWNlIEludGVyZmFjZVN0YXRlcyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRQYXJhbU5hbWV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUGFyYW1OYW1lISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17Q2F0ZWdvcnlJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIENhdGVnb3J5SUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHR5cGUKICAgIGlmICggJFBhcmFte1R5cGV9ICF+IG17IExhc3RDcmVhdGUgfCBMYXN0Q2hhbmdlIH14bXMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUeXBlIG11c3QgYmUgZWl0aGVyIExhc3RDcmVhdGUgb3IgTGFzdENoYW5nZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbW9kZQogICAgaWYgKCAkUGFyYW17TW9kZX0gIX4gbXsgQWdlbnQgfCBDdXN0b21lciB8IFB1YmxpYyB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTW9kZSBtdXN0IGJlIGVpdGhlciBBZ2VudCwgQ3VzdG9tZXIgb3IgUHVibGljIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBDdXN0b21lclVzZXIKICAgIGlmICggJFBhcmFte01vZGV9IGVxICdDdXN0b21lcicgJiYgISRQYXJhbXtDdXN0b21lclVzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lclVzZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBvcmRlciBieSBzZWFyY2ggcGFyYW1ldGVyIGFuZCBoZWFkZXIgYmFzZWQgb24gdHlwZQogICAgbXkgJE9yZGVyQnk7CiAgICBteSAkSGVhZGVyOwogICAgbXkgJFJTU1RpdGxlOwogICAgaWYgKCAkUGFyYW17VHlwZX0gZXEgJ0xhc3RDcmVhdGUnICkgewogICAgICAgICRPcmRlckJ5ICA9ICdDcmVhdGVkJzsKICAgICAgICAkSGVhZGVyICAgPSBUcmFuc2xhdGFibGUoJ0xhdGVzdCBjcmVhdGVkIEZBUSBhcnRpY2xlcycpOwogICAgICAgICRSU1NUaXRsZSA9IFRyYW5zbGF0YWJsZSgnRkFRIEFydGljbGVzIChuZXcgY3JlYXRlZCknKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1R5cGV9IGVxICdMYXN0Q2hhbmdlJyApIHsKICAgICAgICAkT3JkZXJCeSAgPSAnQ2hhbmdlZCc7CiAgICAgICAgJEhlYWRlciAgID0gVHJhbnNsYXRhYmxlKCdMYXRlc3QgdXBkYXRlZCBGQVEgYXJ0aWNsZXMnKTsKICAgICAgICAkUlNTVGl0bGUgPSBUcmFuc2xhdGFibGUoJ0ZBUSBBcnRpY2xlcyAocmVjZW50bHkgY2hhbmdlZCknKTsKICAgIH0KCiAgICBteSAkUmVzdWx0ID0gLTE7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzaG93IGxhc3QgYWRkZWQvdXBkYXRlZCBhcnRpY2xlcwogICAgbXkgJFNob3cgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUTo6RXhwbG9yZXI6OiRQYXJhbXtUeXBlfTo6U2hvdyIpOwogICAgaWYgKCAkU2hvdy0+eyAkUGFyYW17SW50ZXJmYWNlfS0+e05hbWV9IH0gKSB7CgogICAgICAgIG15ICRGQVFPYmplY3QgPSAkUGFyYW17RkFRT2JqZWN0fTsKCiAgICAgICAgIyB0byBzdG9yZSBzZWFyY2ggcGFyYW0gZm9yIGNhdGVnb3JpZXMKICAgICAgICBteSAlQ2F0ZWdvcnlTZWFyY2hQYXJhbTsKCiAgICAgICAgIyBpZiBzdWJjYXRlZ29yaWVzIHNob3VsZCBhbHNvIGJlIHNob3duCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoIkZBUTo6RXhwbG9yZXI6OiRQYXJhbXtUeXBlfTo6U2hvd1N1YkNhdGVnb3J5SXRlbXMiKSApIHsKCiAgICAgICAgICAgICMgZmluZCB0aGUgc3ViY2F0ZWdvcmllcyBvZiB0aGlzIGNhdGVnb3J5CiAgICAgICAgICAgIG15ICRTdWJDYXRlZ29yeUlEc1JlZiA9ICRGQVFPYmplY3QtPkNhdGVnb3J5U3ViQ2F0ZWdvcnlJRExpc3QoCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgTW9kZSAgICAgICAgID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgICA9PiAkUGFyYW17SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSB8fCAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VhcmNoIGluIHRoZSBnaXZlbiBjYXRlZ29yeSBhbmQgYWRkIHRoZSBzdWJjYXRlZ29yeQogICAgICAgICAgICAkQ2F0ZWdvcnlTZWFyY2hQYXJhbXtDYXRlZ29yeUlEc30gPSBbICRQYXJhbXtDYXRlZ29yeUlEfSwgQHskU3ViQ2F0ZWdvcnlJRHNSZWZ9IF07CiAgICAgICAgfQoKICAgICAgICAjIGEgY2F0ZWdvcnkgaXMgZ2l2ZW4gYW5kIHN1YmNhdGVnb3JpZXMgc2hvdWxkIG5vdCBiZSBzaG93bgogICAgICAgIGVsc2lmICggJFBhcmFte0NhdGVnb3J5SUR9ICkgewoKICAgICAgICAgICAgIyBzZWFyY2ggb25seSBpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkKICAgICAgICAgICAgJENhdGVnb3J5U2VhcmNoUGFyYW17Q2F0ZWdvcnlJRHN9ID0gWyAkUGFyYW17Q2F0ZWdvcnlJRH0gXTsKICAgICAgICB9CgogICAgICAgICMgc2VhcmNoIHRoZSBGQVEgYXJ0aWNsZXMKICAgICAgICBteSBASXRlbUlEcyA9ICRGQVFPYmplY3QtPkZBUVNlYXJjaCgKICAgICAgICAgICAgU3RhdGVzICAgICAgICAgICA9PiAkUGFyYW17SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJE9yZGVyQnldLAogICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsnRG93biddLAogICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+ICRQYXJhbXtJbnRlcmZhY2V9LAogICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgiRkFROjpFeHBsb3Jlcjo6JFBhcmFte1R5cGV9OjpMaW1pdCIpIHx8IDUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICVDYXRlZ29yeVNlYXJjaFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHNob3cKICAgICAgICBpZiAoQEl0ZW1JRHMpIHsKCiAgICAgICAgICAgICRSZXN1bHQgPSAxOwoKICAgICAgICAgICAgIyBzaG93IHRoZSBpbmZvIGJveAogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvQm94RkFRTWluaUxpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgSGVhZGVyID0+ICRIZWFkZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IHRoZSBSU1MgRmVlZCBpY29uCiAgICAgICAgICAgIGlmICggJFBhcmFte01vZGV9IGVxICdQdWJsaWMnICkgewoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvQm94RkFRTWluaUxpc3ROZXdzUlNTJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJE9yZGVyQnksCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRSU1NUaXRsZSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRJdGVtSUQgKEBJdGVtSURzKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgRkFRIGRhdGEKICAgICAgICAgICAgICAgIG15ICVGQVFEYXRhID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBJdGVtRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IHRoZSBhcnRpY2xlIHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9Cb3hGQVFNaW5pTGlzdEl0ZW1Sb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYXYgPT4gJFBhcmFte05hdn0sCiAgICAgICAgICAgICAgICAgICAgICAgICVGQVFEYXRhLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aGVhZDIgRkFRU2hvd1RvcDEwKCkKClNob3dzIGFuIGluZm8gYm94IHdpdGggdGhlIFRvcCAxMCBGQVEgYXJ0aWNsZXMuCkRlcGVuZGluZyBvbiB0aGUgdXNlcyBpbnRlcmZhY2UgKGFnZW50LCBjdXN0b21lciwgcHVibGljKSBvbmx5IHRoZSBhcHByb3ByaWF0ZQphcnRpY2xlcyBhcmUgc2hvd24gaGVyZS4KCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFTaG93VG9wMTAoCiAgICAgICAgRkFRT2JqZWN0ICAgICAgID0+ICRGQVFPYmplY3QsICAgICAgICAgICAgICAgICAjIG5lZWRlZCBmb3IgY29yZSBtb2R1bGUgaW50ZXJhY3Rpb24KICAgICAgICBNb2RlICAgICAgICAgICAgPT4gJ1B1YmxpYycsICAgICAgICAgICAgICAgICAgICMgKEFnZW50LCBDdXN0b21lciwgUHVibGljKQogICAgICAgIENhdGVnb3J5SUQgICAgICA9PiA1LAogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkU2VsZi0+e0ludGVyZmFjZX0sCiAgICAgICAgSW50ZXJmYWNlU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICBOYXYgICAgICAgICAgICAgPT4gJ25vbmUnLCAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgRkFRU2hvd1RvcDEwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KEZBUU9iamVjdCBNb2RlIEludGVyZmFjZSBJbnRlcmZhY2VTdGF0ZXMgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0NhdGVnb3J5SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBDYXRlZ29yeUlEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBtb2RlCiAgICBpZiAoICRQYXJhbXtNb2RlfSAhfiBteyBBZ2VudCB8IEN1c3RvbWVyIHwgUHVibGljIH14bXMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNb2RlIG11c3QgYmUgZWl0aGVyIEFnZW50LCBDdXN0b21lciBvciBQdWJsaWMhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIEN1c3RvbWVyVXNlcgogICAgaWYgKCAkUGFyYW17TW9kZX0gZXEgJ0N1c3RvbWVyJyAmJiAhJFBhcmFte0N1c3RvbWVyVXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRSZXN1bHQgPSAtMTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNob3cgbGFzdCBhZGRlZC91cGRhdGVkIGFydGljbGVzCiAgICBteSAkU2hvdyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpFeHBsb3Jlcjo6VG9wMTA6OlNob3cnKTsKICAgIGlmICggJFNob3ctPnsgJFBhcmFte0ludGVyZmFjZX0tPntOYW1lfSB9ICkgewoKICAgICAgICBteSAkRkFRT2JqZWN0ID0gJFBhcmFte0ZBUU9iamVjdH07CgogICAgICAgICMgdG8gc3RvcmUgc2VhcmNoIHBhcmFtIGZvciBjYXRlZ29yaWVzCiAgICAgICAgbXkgJUNhdGVnb3J5U2VhcmNoUGFyYW07CgogICAgICAgICMgaWYgc3ViY2F0ZWdvcmllcyBzaG91bGQgYWxzbyBiZSBzaG93bgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkV4cGxvcmVyOjpUb3AxMDo6U2hvd1N1YkNhdGVnb3J5SXRlbXMnKSApIHsKCiAgICAgICAgICAgICMgZmluZCB0aGUgc3ViY2F0ZWdvcmllcyBvZiB0aGlzIGNhdGVnb3J5CiAgICAgICAgICAgIG15ICRTdWJDYXRlZ29yeUlEc1JlZiA9ICRGQVFPYmplY3QtPkNhdGVnb3J5U3ViQ2F0ZWdvcnlJRExpc3QoCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgTW9kZSAgICAgICAgID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgICA9PiAkUGFyYW17SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSB8fCAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VhcmNoIGluIHRoZSBnaXZlbiBjYXRlZ29yeSBhbmQgYWRkIHRoZSBzdWJjYXRlZ29yeQogICAgICAgICAgICAkQ2F0ZWdvcnlTZWFyY2hQYXJhbXtDYXRlZ29yeUlEc30gPSBbICRQYXJhbXtDYXRlZ29yeUlEfSwgQHskU3ViQ2F0ZWdvcnlJRHNSZWZ9IF07CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgdG9wIDEwIGFydGljbGVzIGZvciBjYXRlZ29yaWVzIHdpdGggYXQgbGVhc3Qgcm8gcGVybWlzc2lvbnMKICAgICAgICBteSAkVG9wMTBJdGVtSURzUmVmID0gJEZBUU9iamVjdC0+RkFRVG9wMTBHZXQoCiAgICAgICAgICAgIEludGVyZmFjZSA9PiAkUGFyYW17SW50ZXJmYWNlfS0+e05hbWV9LAogICAgICAgICAgICBMaW1pdCAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkV4cGxvcmVyOjpUb3AxMDo6TGltaXQnKSB8fCAxMCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAlQ2F0ZWdvcnlTZWFyY2hQYXJhbSwKICAgICAgICApIHx8IFtdOwoKICAgICAgICAjIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzaG93CiAgICAgICAgaWYgKCAkVG9wMTBJdGVtSURzUmVmICYmIHJlZiAkVG9wMTBJdGVtSURzUmVmIGVxICdBUlJBWScgJiYgQHskVG9wMTBJdGVtSURzUmVmfSApIHsKCiAgICAgICAgICAgICRSZXN1bHQgPSAxOwoKICAgICAgICAgICAgIyBzaG93IHRoZSBpbmZvIGJveAogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvQm94RkFRTWluaUxpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgSGVhZGVyID0+IFRyYW5zbGF0YWJsZSgnVG9wIDEwIEZBUSBhcnRpY2xlcycpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyB0aGUgUlNTIEZlZWQgaWNvbgogICAgICAgICAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnUHVibGljJyApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb0JveEZBUU1pbmlMaXN0TmV3c1JTUycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICdUb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRkFRIEFydGljbGVzIChUb3AgMTApJyksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICROdW1iZXI7CiAgICAgICAgICAgIGZvciBteSAkVG9wMTBJdGVtICggQHskVG9wMTBJdGVtSURzUmVmfSApIHsKCiAgICAgICAgICAgICAgICAjIGluY3JlYXNlIHRoZSBudW1iZXIKICAgICAgICAgICAgICAgICROdW1iZXIrKzsKCiAgICAgICAgICAgICAgICBteSAlRkFRRGF0YSA9ICRGQVFPYmplY3QtPkZBUUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICAgID0+ICRUb3AxMEl0ZW0tPntJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIEl0ZW1GaWVsZHMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNob3cgdGhlIGFydGljbGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb0JveEZBUU1pbmlMaXN0SXRlbVJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hdiA9PiAkUGFyYW17TmF2fSwKICAgICAgICAgICAgICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IHRoZSBUb3AtMTAgcG9zaXRpb24gbnVtYmVyCiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb0JveEZBUU1pbmlMaXN0SXRlbVJvd1Bvc2l0aW9uTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyID0+ICROdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1oZWFkMiBGQVFTaG93UXVpY2tTZWFyY2goKQoKU2hvd3MgYW4gaW5mbyBib3ggd2l0aCB0aGUgUXVpY2sgU2VhcmNoLgoKICAgICRMYXlvdXRPYmplY3QtPkZBUVNob3dRdWlja1NlYXJjaCgKICAgICAgICBNb2RlICAgICAgICAgICAgPT4gJ1B1YmxpYycsICAgICAgICAgICAgICAgICAgICMgKEFnZW50LCBDdXN0b21lciwgUHVibGljKQogICAgICAgIEludGVyZmFjZSAgICAgICA9PiAkU2VsZi0+e0ludGVyZmFjZX0sCiAgICAgICAgSW50ZXJmYWNlU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICBOYXYgICAgICAgICAgICAgPT4gJ25vbmUnLCAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBTZWFyY2hCYWNrTGluayAgPT4gJEJhc2U2NEVuY29kZWRVcmwsICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgRkFRU2hvd1F1aWNrU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KE1vZGUgSW50ZXJmYWNlIEludGVyZmFjZVN0YXRlcyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRQYXJhbU5hbWV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUGFyYW1OYW1lISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBtb2RlCiAgICBpZiAoICRQYXJhbXtNb2RlfSAhfiBteyBBZ2VudCB8IEFnZW50U21hbGwgfCBDdXN0b21lciB8IFB1YmxpYyB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTW9kZSBtdXN0IGJlIGVpdGhlciBBZ2VudCwgQ3VzdG9tZXIgb3IgUHVibGljIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgYWN0aW9uIG1vZHVsZQogICAgbXkgJEFjdGlvbjsKICAgIGlmICggJFBhcmFte01vZGV9IGVxICdBZ2VudFNtYWxsJyApIHsKICAgICAgICAkQWN0aW9uID0gJ0FnZW50RkFRU2VhcmNoU21hbGwnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEFjdGlvbiA9ICRQYXJhbXtNb2RlfSAuICdGQVFTZWFyY2gnOwogICAgfQoKICAgICMgY2hlY2sgQ3VzdG9tZXJVc2VyCiAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInICYmICEkUGFyYW17Q3VzdG9tZXJVc2VyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzaG93IHF1aWNrIHNlYXJjaAogICAgbXkgJFNob3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZBUTo6RXhwbG9yZXI6OlF1aWNrU2VhcmNoOjpTaG93Jyk7CiAgICBpZiAoICRTaG93LT57ICRQYXJhbXtJbnRlcmZhY2V9LT57TmFtZX0gfSB8fCAkUGFyYW17TW9kZX0gZXEgJ0FnZW50U21hbGwnICkgewoKICAgICAgICAjIGNhbGwgUXVpY2tTZWFyY2ggYmxvY2sKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1F1aWNrU2VhcmNoJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkQWN0aW9uLAogICAgICAgICAgICAgICAgTmF2ICAgICAgICAgICAgPT4gJFBhcmFte05hdn0gICAgICAgICAgICB8fCAnJywKICAgICAgICAgICAgICAgIFNlYXJjaEJhY2tMaW5rID0+ICRQYXJhbXtTZWFyY2hCYWNrTGlua30gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVE9CTyBwcm9qZWN0IChMPGh0dHBzOi8vb3RvYm8ub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentFAQAdd.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0FnZW50RkFRQWRkLnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIEZvcm1TY3JlZW4gTm9TaWRlYmFyIj4KCiAgICA8aDE+WyUgVHJhbnNsYXRlKCJBZGQgRkFRIEFydGljbGUiKSB8IGh0bWwgJV08L2gxPgogICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFBZGQiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNhdmUiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZBUUVkaXRNYXNrIj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGl0bGUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPiogPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgaWQ9IlRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLlRpdGxlU2VydmVyRXJyb3IgfCBodG1sICVdIiBtYXhsZW5ndGg9IjIwMCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaXRsZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGl0bGVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikljb24iPlslIFRyYW5zbGF0ZSgiSWNvbiAoc3ZnKSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEljb25GaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSWNvblByZXZpZXciIGNsYXNzPSJJY29uQm94Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSWNvbiIgaWQ9Ikljb24iIHZhbHVlPSJbJSBEYXRhLkljb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJJY29uVXBsb2FkIiBpZD0iSWNvblVwbG9hZCIgY2xhc3M9IkhpZGRlbiIgYWNjZXB0PSIuc3ZnLCBpbWFnZS9zdmcreG1sIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IkJ0blVwbG9hZEljb24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiVXBsb2FkIEljb24iKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCBhbiBpY29uIGluIFNWRyBmb3JtYXQgdG8gdXBsb2FkIGl0LiIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPiBbJSBUcmFuc2xhdGUoIlVwbG9hZCBJY29uIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJCdG5EZWxldGVJY29uIiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSBJY29uIikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUgdGhlIGN1cnJlbnQgaWNvbi4iKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS10cmFzaCI+PC9pPiBbJSBUcmFuc2xhdGUoIkRlbGV0ZSBJY29uIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IktleXdvcmRzIj5bJSBUcmFuc2xhdGUoIktleXdvcmRzIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iS2V5d29yZHMiIGlkPSJLZXl3b3JkcyIgdmFsdWU9IlslIERhdGEuS2V5d29yZHMgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMiIG1heGxlbmd0aD0iMjAwIi8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJDYXRlZ29yeUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qIDwvc3Bhbj5bJSBUcmFuc2xhdGUoIkNhdGVnb3J5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhdGVnb3J5T3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhdGVnb3J5SURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJBIGNhdGVnb3J5IGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhdGVnb3J5SURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJBIGNhdGVnb3J5IGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXRlT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU2VydmljZSIpICVdCiAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5TZXJ2aWNlT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZFslIElGICFEYXRhLktleSAlXSBOb01hcmdpblslIEVORCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2VydmljZU9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIj5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbGlkT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTGFuZ3VhZ2UiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikxhbmd1YWdlSUQiPlslIFRyYW5zbGF0ZSgiTGFuZ3VhZ2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFuZ3VhZ2VPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJMYW5ndWFnZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0xhbmd1YWdlIikgJV0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJMYW5ndWFnZUlEIiB2YWx1ZT0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9MYW5ndWFnZSIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwcm92YWwiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFwcHJvdmVkIj5bJSBUcmFuc2xhdGUoIkFwcHJvdmFsIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkFwcHJvdmFsT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXBwcm92YWwiKSAlXQoKWyUgRGF0YS5EeW5hbWljRmllbGRIVE1MICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElOQ0xVREUgIkZvcm1FbGVtZW50cy9BdHRhY2htZW50TGlzdC50dCIgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFDb250ZW50IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQ2FwdGlvbikgfCBodG1sICVdOjxici8+PHNwYW4gY2xhc3M9IkZBUVN0YXRlTmFtZSI+KFslIFRyYW5zbGF0ZShEYXRhLlN0YXRlTmFtZSkgfCBodG1sICVdKTwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlslIERhdGEuRmllbGQgfCBodG1sICVdIiBjbGFzcz0iUmljaFRleHQiIG5hbWU9IlslIERhdGEuRmllbGQgfCBodG1sICVdIiByb3dzPSIxNSIgY29scz0iNzAiPlslIERhdGEuQ29udGVudCB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnQiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iRkFRU3VibWl0IiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkNyZWF0ZSIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiQ3JlYXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEZBUUV4cGxvcmVyO0NhdGVnb3J5SUQ9WyUgRGF0YS5DYXRlZ29yeUlEIHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQWRkIikgJV0KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentFAQEdit.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0FnZW50RkFRRWRpdC50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhcnROb3JtYWwiKSAlXQogICAgPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gRm9ybVNjcmVlbiBOb1NpZGViYXIiPgogICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkVkaXQiKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZSgiRkFRIikgfCBodG1sICVdOiBbJSBEYXRhLk51bWJlciB8IGh0bWwgJV08L2gxPgogICAgICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgoKICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXJ0Tm9ybWFsIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXJ0U21hbGwiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiRWRpdCIpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKCJGQVEiKSB8IGh0bWwgJV06IFslIERhdGEuTnVtYmVyIHwgaHRtbCAlXTwvaDE+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrRW5kKCJTdGFydFNtYWxsIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUVkaXQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iWyUgRGF0YS5JdGVtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2NyZWVuVHlwZSIgdmFsdWU9IlslIERhdGEuU2NyZWVuVHlwZSB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRkFRRWRpdE1hc2sgWyUgRGF0YS5GaWVsZHNldENsYXNzIHwgaHRtbCAlXSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJUaXRsZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+KiA8L3NwYW4+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIGlkPSJUaXRsZSIgdmFsdWU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5UaXRsZVNlcnZlckVycm9yIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGl0bGVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSWNvbiI+WyUgVHJhbnNsYXRlKCJJY29uIChzdmcpIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgSWNvbkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJJY29uUHJldmlldyIgY2xhc3M9Ikljb25Cb3giPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikljb24iIGlkPSJJY29uIiB2YWx1ZT0iWyUgRGF0YS5JY29uIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJJY29uVXBsb2FkIiBpZD0iSWNvblVwbG9hZCIgY2xhc3M9IkhpZGRlbiIgYWNjZXB0PSIuc3ZnLCBpbWFnZS9zdmcreG1sIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iQnRuVXBsb2FkSWNvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJVcGxvYWQgSWNvbiIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IGFuIGljb24gaW4gU1ZHIGZvcm1hdCB0byB1cGxvYWQgaXQuIikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtdXBsb2FkIj48L2k+IFslIFRyYW5zbGF0ZSgiVXBsb2FkIEljb24iKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iQnRuRGVsZXRlSWNvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUgSWNvbiIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIHRoZSBjdXJyZW50IGljb24uIikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtdHJhc2giPjwvaT4gWyUgVHJhbnNsYXRlKCJEZWxldGUgSWNvbiIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iS2V5d29yZHMiPlslIFRyYW5zbGF0ZSgiS2V5d29yZHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IktleXdvcmRzIiBpZD0iS2V5d29yZHMiIHZhbHVlPSJbJSBEYXRhLktleXdvcmRzIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjIwMCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iQ2F0ZWdvcnlJRCI+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0FnZW50RkFRWm9vbS50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlRUOjpTY3JpcHRVc2FnZSkKCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyTGVmdCI+PC9kaXY+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgPGRpdiBjbGFzcz0iSGVhZGxpbmUiPgogICAgPGRpdiBjbGFzcz0iSGVhZGxpbmUgWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgogICAgICAgIFslIERhdGEuSWNvbiAlXQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICA8aDEgdGl0bGU9IlslIENvbmZpZygiRkFROjpGQVFIb29rIikgJV06IFslIERhdGEuTnVtYmVyIHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuVGl0bGUgfCBodG1sICVdIj4KICAgICAgICAgICAgWyUgQ29uZmlnKCJGQVE6OkZBUUhvb2siKSAlXTogWyUgRGF0YS5OdW1iZXIgJV0gPHNwYW4+Jm1kYXNoOzwvc3Bhbj4gWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0KICAgICAgICA8L2gxPgogICAgPC9kaXY+CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgIDx1bCBjbGFzcz0iQnJlYWRDcnVtYiI+CiAgICA8dWwgY2xhc3M9IkJyZWFkQ3J1bWIgWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdCiAgICAgICAgPGxpPgogICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRGQVFFeHBsb3JlcjtDYXRlZ29yeUlEPVslIERhdGEuQ2F0ZWdvcnlJRCB8IHVyaSAlXTtOYXY9WyUgRGF0YS5OYXYgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdCiAgICAgICAgICAgIDwvYT4KICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhJdGVtRWxlbWVudCIpICVdCiAgICAgICAgPGxpPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhJdGVtRWxlbWVudCIpICVdCiAgICA8L3VsPgoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5TaWRlQmFyICVdCiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgogICAgICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgWyUgSUYgRGF0YS5UT0MgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBbJSBEYXRhLkNzc0NsYXNzTm9BcnRpY2xlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlRPQyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgWyUgRU5EICVdCgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRkFRIEluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ2F0ZWdvcnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ2F0ZWdvcnlOYW1lKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkNhdGVnb3J5TmFtZSwgIjE4IikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJLZXl3b3JkcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJLZXl3b3JkcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRGQVFTZWFyY2g7U3ViYWN0aW9uPVNlYXJjaDtLZXl3b3JkPVslIERhdGEuS2V5d29yZCB8IHVyaSAlXSIgdGl0bGU9IlslIERhdGEuS2V5d29yZCB8IGh0bWwgJV0iPlslIERhdGEuS2V5d29yZCB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJLZXl3b3JkcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUsICIyNSIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVmFsaWQpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuVmFsaWQsICIyNSIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxhbmd1YWdlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkxhbmd1YWdlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhbmd1YWdlLCAiMTgiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkxhbmd1YWdlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlZpZXdBcHByb3ZhbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFwcHJvdmFsIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkFwcHJvdmFsKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkFwcHJvdmFsLCAiMTgiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlZpZXdBcHByb3ZhbCIpICVdCgojIHNob3cgZmFxIGR5bmFtaWMgZmllbGRzClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRRHluYW1pY0ZpZWxkIikgJV0KCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRHluYW1pY0ZpZWxkX0ZpZWxkMV9MaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRkFRRHluYW1pY0ZpZWxkX0ZpZWxkMV9MaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDFfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRfRmllbGQxX1BsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KI1slIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRHluYW1pY0ZpZWxkX0ZpZWxkMl9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDJfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVmlld1JhdGluZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlJhdGluZyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmF0aW5nIikgfCBodG1sICVdIFslIERhdGEuVm90ZVJlc3VsdCAlXSUiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmF0ZVN0YXJzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJhdGVTdGFyIj48aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUmF0ZVN0YXJzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmF0ZVN0YXJzQ291bnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmF0ZVN0YXJUZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXJzIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIm91dCBvZiA1IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJhdGVTdGFyc0NvdW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlZpZXdSYXRpbmciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVmlld1ZvdGVzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVm90ZXMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVm90ZXMpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuVm90ZXMsICIxOCIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIlZpZXdWb3RlcyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlZpZXdOb1ZvdGVzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVm90ZXMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJObyB2b3RlcyBmb3VuZCEiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiTm8gdm90ZXMgZm91bmQhIEJlIHRoZSBmaXJzdCBvbmUgdG8gcmF0ZSB0aGlzIEZBUSBhcnRpY2xlLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIlZpZXdOb1ZvdGVzIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0gIChbJSBEYXRhLkNyZWF0ZWRCeVVzZXIgJV0pPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5DaGFuZ2VkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdICAoWyUgRGF0YS5DaGFuZ2VkQnlVc2VyICVdKTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVZvdGluZyIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlJhdGluZyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRkFRVm90aW5nIENvbnRlbnQiIGlkPSJGQVFWb3RpbmciPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRkFRQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkhvdyBoZWxwZnVsIHdhcyB0aGlzIGFydGljbGU/IFBsZWFzZSBnaXZlIHVzIHlvdXIgcmF0aW5nIGFuZCBoZWxwIHRvIGltcHJvdmUgdGhlIEZBUSBEYXRhYmFzZS4gVGhhbmsgWW91ISIpIHwgaHRtbCAlXTwvcD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRkFRVm90ZSIgY2xhc3M9IkZBUVZvdGVGb3JtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IlJhdGVCdXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgibm90IGhlbHBmdWwiKSB8IGh0bWwgJV08L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFWb3RpbmdSYXRlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGlkPSJSYXRlQnV0dG9uWyUgRGF0YS5WYWx1ZSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZUJ1dHRvbiBSYXRlVW5DaGVja2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3Rhci1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRVm90aW5nUmF0ZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoInZlcnkgaGVscGZ1bCIpIHwgaHRtbCAlXTwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgY2xhc3M9IkNsZWFyIiAvPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiBIaWRkZW4iIGlkPSJSYXRlU3VibWl0QnV0dG9uIiBuYW1lPSJidG4iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlZvdGUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlZvdGUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRGQVFab29tIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVm90ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSJbJSBEYXRhLkNhdGVnb3J5SUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iWyUgRGF0YS5JdGVtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmF0ZSIgdmFsdWU9IiIgaWQ9IlJhdGVWYWx1ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRVm90aW5nIikgJV0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBEb250UHJpbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaW5rZWQgT2JqZWN0cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk1lbnVJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgaWQ9IlslIERhdGEuTWVudUlEIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkxpbmtQYXJhbSAlXSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuRGVzY3JpcHRpb24pIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk1lbnVJdGVtIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcCI+PC9kaXY+CgogICAgICAgICAgICA8ZGl2IGlkPSJGQVFCb2R5Ij4KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EZWZhdWx0SXRlbSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRlZmF1bHQgaXRlbSBoYXMgYmVlbiBzZXQgeWV0ISBTdGFydCBicm93c2luZyBhcnRpY2xlcyBpbiB0aGUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEZBUUV4cGxvcmVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGQVEgRXhwbG9yZXIiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiRkFRIEV4cGxvcmVyIikgfCBodG1sICVdPC9hPi4KICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EZWZhdWx0SXRlbSIpICVdCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudEhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnRzIikgfCBodG1sICVdOjwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRkFRQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRG93bmxvYWRBdHRhY2htZW50IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEb3dubG9hZCBBdHRhY2htZW50IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0l0ZW1JRD1bJSBEYXRhLkl0ZW1JRCB8IHVyaSAlXTtGaWxlSUQ9WyUgRGF0YS5GaWxlSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXR0YWNobWVudFJvdyIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXR0YWNobWVudEhlYWRlciIpICVdCgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCcm93c2VyTGlua01lc3NhZ2UiKSAlXQojIyBTaG93IGluZm8sIHRoYXQgbGlua3Mgd2l0aGluIHRoZSBpZnJhbWUgbXVzdCBiZSBjbGlja2VkIHdpdGggc3RyZy9jbWQvc2hpZnQgKGRlcGVuZGluZyBvbiB0aGUgdXNlZCBicm93c2VyIGFuZCBvcykKIyMgdG8gb3BlbiB0aGUgbGlua3MgaW4gYSBuZXcgd2luZG93IHdpdGhvdXQgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb25zIGdpdmVuIHRvIHRoZSBpZnJhbWUKIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGQVFNZXNzYWdlQnJvd3NlciI+CiMgICAgICAgICAgICAgICAgICAgIDxwPgojICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIG9wZW4gbGlua3MgaW4gdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiBibG9ja3MsIHlvdSBtaWdodCBuZWVkIHRvIHByZXNzIEN0cmwgb3IgQ21kIG9yIFNoaWZ0IGtleSB3aGlsZSBjbGlja2luZyB0aGUgbGluayAoZGVwZW5kaW5nIG9uIHlvdXIgYnJvd3NlciBhbmQgT1MpLiIpIHwgaHRtbCAlXQojICAgICAgICAgICAgICAgICAgICA8L3A+CiMgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDbG9zZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2xvc2UgdGhpcyBtZXNzYWdlIikgfCBodG1sICVdIiBocmVmPSIjIj48aSBjbGFzcz0iZmEgZmEtdGltZXMiPjwvaT48L2E+CiMgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQnJvd3NlckxpbmtNZXNzYWdlIikgJV0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFDb250ZW50IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iWyUgRGF0YS5GaWVsZCAlXSI+PC9hPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJCYWNrVG9wIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJCYWNrIHRvIHRvcCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tdXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5DYXB0aW9uKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJGQVFTdGF0ZU5hbWUiPihbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZU5hbWUpIHwgaHRtbCAlXSk8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUNvbnRlbnRIVE1MIikgJV0KIyBleGVjdXRlIElGcmFtZSBKUyBhc3luY2hyb25vdXNseS4gT3RoZXJ3aXNlIGl0IGNvdWxkIGhhcHBlbiBiZWZvcmUgb3VyIEFQSSB3YXMgbG9hZGVkCiMgdGhlIGZvbGxvd2luZyBKUyBjb2RlIG11c3QgYmUgd2l0aGluIHRoZSB0ZW1wbGF0ZSwgb3RoZXJ3aXNlIGl0IGNvdWxkIGhhcHBlbiwgdGhhdCBhbHNvIHRoaXMgY29kZSBpdHNlbGYgaXMgbm90IGxvYWRlZCB5ZXQKPHNjcmlwdD4KZnVuY3Rpb24gQ2hlY2tJRnJhbWVIZWlnaHQoSUZyYW1lSUQpIHsKICAgIGlmICh0eXBlb2YgRkFRID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgRkFRLkFnZW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgRkFRLkFnZW50LkZBUVpvb20gPT09ICdvYmplY3QnKSB7CiAgICAgICAgRkFRLkFnZW50LkZBUVpvb20uSWZyYW1lQXV0b0hlaWdodCgkKCcjJyArIElGcmFtZUlEKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENoZWNrSUZyYW1lSGVpZ2h0KElGcmFtZUlEKTsKICAgICAgICB9LCA1MDApOwogICAgfQp9Cjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgojIFVzZSB0aGUgSFRNTDUgc2FuZGJveCBhdHRyaWJ1dGUgdG8gcHJldmVudCBwbHVnaW5zIGFuZCBzY3JpcHRzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXIuCiMgQXBwZW5kIHNlc3Npb24gaW5mbyB0byBVUkwgYmVjYXVzZSBJRSB3aWxsIG5vdCBzZW5kIGNvb2tpZXMuCiMgU2V0ICdhbGxvdy1wb3B1cHMnIHRvIGFsbG93IElFMTArIHRvIG9wZW4gbGlua3MuIHJlZjogaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy93aWtpL0NoYW5nZVByb3Bvc2Fscy9zYW5kYm94X2FsbG93X3BvcHVwcwojIFJvdGhlciBPU1MgLyBBbGxvd2luZyB0b3AgbmF2aWdhdGlvbiBmb3IgRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyBtcy1hbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IiBjbGFzcz0iRkFRRmllbGQiIGlkPSJJZnJhbWVGQVFbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgb25sb2FkPSJ3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCl7IENoZWNrSUZyYW1lSGVpZ2h0KCdJZnJhbWVGQVFbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXScpOyB9LCA1MDApOyIgc3JjPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRGQVFab29tO1N1YmFjdGlvbj1IVE1MVmlldztJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCBodG1sICVdO0ZpZWxkPVslIERhdGEuRmllbGQgfCBodG1sICVdO1slIEVudigiU2Vzc2lvbk5hbWUiKSB8IGh0bWwgJV09WyUgRW52KCJTZXNzaW9uSUQiKSB8IGh0bWwgJV0iPjwvaWZyYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgbXMtYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy10b3AtbmF2aWdhdGlvbiIgY2xhc3M9IkZBUUZpZWxkIiBpZD0iSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIG9ubG9hZD0id2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpeyBDaGVja0lGcmFtZUhlaWdodCgnSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0nKTsgfSwgNTAwKTsiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249SFRNTFZpZXc7SXRlbUlEPVslIERhdGEuSXRlbUlEIHwgaHRtbCAlXTtGaWVsZD1bJSBEYXRhLkZpZWxkIHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIj48L2lmcmFtZT4KIyBFTyBGQVEgRXh0ZW5kZWQgTmF2aWdhdGlvbiBQYWNrYWdlCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudEhUTUwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFDb250ZW50UGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRkFRQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNvbnRlbnQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnQiKSAlXQoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojIFslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVZvdGluZyIpICVdCiMgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiMgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgojICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgojICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlJhdGluZyIpIHwgaHRtbCAlXTwvaDI+CiMgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZBUVZvdGluZyBDb250ZW50IiBpZD0iRkFRVm90aW5nIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRkFRQ29udGVudCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJDZW50ZXIiPlslIFRyYW5zbGF0ZSgiSG93IGhlbHBmdWwgd2FzIHRoaXMgYXJ0aWNsZT8gUGxlYXNlIGdpdmUgdXMgeW91ciByYXRpbmcgYW5kIGhlbHAgdG8gaW1wcm92ZSB0aGUgRkFRIERhdGFiYXNlLiBUaGFuayBZb3UhIikgfCBodG1sICVdPC9wPgojCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJGQVFWb3RlIiBjbGFzcz0iRkFRVm90ZUZvcm0iPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJSYXRlQnV0dG9ucyI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgibm90IGhlbHBmdWwiKSB8IGh0bWwgJV08L2xpPgojIFslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVZvdGluZ1JhdGVSb3ciKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBpZD0iUmF0ZUJ1dHRvblslIERhdGEuVmFsdWUgJV0iPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZUJ1dHRvbiBSYXRlVW5DaGVja2VkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyLW8iPjwvaT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KIyBbJSBSZW5kZXJCbG9ja0VuZCgiRkFRVm90aW5nUmF0ZVJvdyIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgidmVyeSBoZWxwZnVsIikgfCBodG1sICVdPC9saT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgY2xhc3M9IkNsZWFyIiAvPgojCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiBIaWRkZW4iIGlkPSJSYXRlU3VibWl0QnV0dG9uIiBuYW1lPSJidG4iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlZvdGUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlZvdGUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudEZBUVpvb20iLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlZvdGUiLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSJbJSBEYXRhLkNhdGVnb3J5SUQgfCBodG1sICVdIi8+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJbJSBEYXRhLkl0ZW1JRCB8IGh0bWwgJV0iLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJhdGUiIHZhbHVlPSIiIGlkPSJSYXRlVmFsdWUiLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgojICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgIDwvZGl2PgojIFslIFJlbmRlckJsb2NrRW5kKCJGQVFWb3RpbmciKSAlXQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlua1RhYmxlQ29tcGxleCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5MaW5rVGFibGVTdHJnICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlQ29tcGxleCIpICVdCgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerFAQExplorer.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0N1c3RvbWVyRkFRRXhwbG9yZXIudHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBpZD0ib29vQ29udGVudCI+CiAgICA8ZGl2IGlkPSJvb29IZWFkZXIiPgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICA8ZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlclJvd1RpdGxlIj4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXTwvaDE+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXJSb3ciPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQnJlYWRDcnVtYiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyRkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0nb29vZyc+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9oMz4KICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50Tm9MaW5rIikgJV0KICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0nb29vZyc+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9oMz4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnROb0xpbmsiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgPGRpdiBpZD0ib29vU2VhcmNoQm94Ij4KICAgICAgICA8ZGl2IGlkPSJvb29TZWFyY2hCb3giIGNsYXNzPSJIZWFkZXJSb3cgRkFRU2VhcmNoQm94Ij4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkN1c3RvbWVyRkFRRXhwbG9yZXIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCIvPgoKICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0nb29vZyc+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLXNlYXJjaCI+PC9pPgojICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iV2hhdCIgaWQ9Im9vb1NlYXJjaCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXSIvPgojICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nb29vU2VhcmNoTGFiZWwnPlslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iV2hhdCIgaWQ9Im9vb1NlYXJjaCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXSIgIGNsYXNzPSJvb29TZWFyY2hGQVEiLz4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nb29vU2VhcmNoTGFiZWwnPjxpIGNsYXNzPSJvb29mbyBvb29mby1zZWFyY2giPjwvaT4gWyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdPC9zcGFuPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICA8ZGl2IGlkPSJvb29NYWluQm94Ij4KICAgIDxkaXYgaWQ9Im9vb01haW5Cb3giIGNsYXNzPSJGQVFDb250ZW50Ij4KCiAgICBbJSBEYXRhLlNpZGVCYXIgJV0KCiAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlQXJlYSI+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3ViY2F0ZWdvcmllcyIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSZXN1bHQiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3ViY2F0ZWdvcmllcyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vU3ViQm94Ij4KIyBubyB3aGl0ZXNwYWNlL25ld2xpbmUgcmVzdWx0cyBpbiBubyB3aGl0ZXNwYWNlIGJldHdlZW4gZGlzcGxheTogaW5saW5lLWJsb2NrOyBlbGVtZW50cwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdFJvdyIpICVdPGEgY2xhc3M9Im9vb1N1YiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU3ViQ2F0ZWdvcnlDb3VudCAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJvb29TdWJDb3VudCI+WyUgRGF0YS5TdWJDYXRlZ29yeUNvdW50IHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0ib29vZyBvb29Db21tZW50Ij5bJSBUcmFuc2xhdGUoRGF0YS5Db21tZW50KSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2E+WyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0Um93IikgJV0KIyBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHRSb3ciKQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN1YmNhdGVnb3JpZXMiKSAlXQoKClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUl0ZW1MaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KWyUgSUYgRGF0YS5DYXRlZ29yeUlEID09IDAgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxhdGVzdCB1cGRhdGVkIEZBUSBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvaDI+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkZBUSBBcnRpY2xlcyIpIHwgaHRtbCAlXTwvaDI+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQYWdpbmF0aW9uIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlBhZ2luYXRpb24gb29vMTBnIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIERhdGEuUmVzdWx0IHwgaHRtbCAlXTwvc3Ryb25nPiBbJSBUcmFuc2xhdGUoIm9mIikgfCBodG1sICVdIDxzdHJvbmc+WyUgRGF0YS5Ub3RhbEhpdHMgfCBodG1sICVdPC9zdHJvbmc+IC0gWyUgVHJhbnNsYXRlKCJQYWdlIikgfCBodG1sICVdOiBbJSBEYXRhLlNpdGVOYXZCYXIgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGFnaW5hdGlvbiIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRQm94Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9GQVFEYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9Im9vb0ZBUSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiTm8gRkFRIGFydGljbGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJOb0ZBUURhdGFGb3VuZE1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZCIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0ib29vRkFRIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJGQVFab29tO0l0ZW1JRD1bJSBEYXRhLkZBUUlEIHwgdXJpICVdIj4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuSWNvbiAlXQojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9IlRpdGxlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9oMz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkTGFuZ3VhZ2UiKSAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJMYW5ndWFnZSBvb29nIiB0aXRsZT0iWyUgRGF0YS5MYW5ndWFnZSB8IGh0bWwgJV0iPlslIERhdGEuTGFuZ3VhZ2UgfCB0cnVuY2F0ZSg1KSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRMYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQm90dG9tU3ViTmF2aWdhdGlvbiIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQYWdpbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIERhdGEuUmVzdWx0IHwgaHRtbCAlXTwvc3Ryb25nPiBbJSBUcmFuc2xhdGUoIm9mIikgfCBodG1sICVdIDxzdHJvbmc+WyUgRGF0YS5Ub3RhbEhpdHMgfCBodG1sICVdPC9zdHJvbmc+IC0gWyUgVHJhbnNsYXRlKCJQYWdlIikgfCBodG1sICVdOiBbJSBEYXRhLlNpdGVOYXZCYXIgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQm90dG9tU3ViTmF2aWdhdGlvbiIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRSXRlbUxpc3QiKSAlXQojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgPC9kaXY+IDwhLS0gQXJ0aWNsZUFyZWEgLS0+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerFAQZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0N1c3RvbWVyRkFRWm9vbS50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlRUOjpTY3JpcHRVc2FnZSkKCjxkaXYgaWQ9Im9vb0NvbnRlbnQiPgoKICAgIDxkaXYgaWQ9Im9vb0hlYWRlciI+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICA8ZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlclJvd1RpdGxlIj4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXTwvaDE+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXJSb3ciPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQnJlYWRDcnVtYiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyRkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0nb29vZyc+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9oMz4KICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFQYXRoSXRlbUVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvaDM+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFQYXRoSXRlbUVsZW1lbnQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICA8ZGl2IGlkPSJvb29TZWFyY2hCb3giPgogICAgICAgIDxkaXYgaWQ9Im9vb1NlYXJjaEJveCIgY2xhc3M9IkhlYWRlclJvdyBGQVFTZWFyY2hCb3giPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQ3VzdG9tZXJGQVFFeHBsb3JlciIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VhcmNoIi8+CgogICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0ib29vZm8gb29vZm8tc2VhcmNoIj48L2k+CiMgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXaGF0IiBpZD0ib29vU2VhcmNoIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdIi8+CiMgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdvb29TZWFyY2hMYWJlbCc+WyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXaGF0IiBpZD0ib29vU2VhcmNoIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdIiAgY2xhc3M9Im9vb1NlYXJjaEZBUSIvPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdvb29TZWFyY2hMYWJlbCc+PGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLXNlYXJjaCI+PC9pPiBbJSBUcmFuc2xhdGUoJ0ZBUSBTZWFyY2gnKSB8IGh0bWwgJV08L3NwYW4+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgojICAgICAgICAgICAgPHVsIGlkPSJGQVFPcHRpb25zIj4KIyAgICAgICAgICAgICAgICA8bGk+CiMgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lckZBUVByaW50O0l0ZW1JRD1bJSBEYXRhLkl0ZW1JRCB8IHVyaSAlXSIgY2xhc3M9IlByaW50IEFzUG9wdXAiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlByaW50IikgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wcmludCI+PC9pPgojICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJQcmludCIpIHwgaHRtbCAlXTwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgPC9hPgojICAgICAgICAgICAgICAgIDwvbGk+CiMgICAgICAgICAgICA8L3VsPgogICAgPC9kaXY+CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgPGRpdiBpZD0ib29vTWFpbkJveCI+CiMKIyAgICAgICAgPGRpdiBjbGFzcz0nV2lkZ2V0U2ltcGxlJz4KIyAgICAgICAgICAgIDxoMiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgIFslIERhdGEuVGl0bGUgfCBodG1sICVdCiMgICAgICAgICAgICA8L2gyPgogICAgPGRpdiBpZD0ib29vTWFpbkJveCIgY2xhc3M9IkZBUUNvbnRlbnQiPgoKICAgIFslIERhdGEuU2lkZUJhciAlXQoKICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUFyZWEiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EZWZhdWx0SXRlbSIpICVdCgogICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8YSBjbGFzcz0ib29vRkFRIG9vb0ZBUU5vSXRlbXMiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lckZBUUV4cGxvcmVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGQVEgRXhwbG9yZXIiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGg0PlslIFRyYW5zbGF0ZSgiTm8gZGVmYXVsdCBpdGVtIGhhcyBiZWVuIHNldCB5ZXQhIFN0YXJ0IGJyb3dzaW5nIGFydGljbGVzIGluIHRoZSIpIHwgaHRtbCAlXSA8Yj5bJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXTwvYj48L2g0PgogICAgICAgICAgICA8L2E+CiAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGVmYXVsdEl0ZW0iKSAlXQoKICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRQm94IFslIERhdGEuQ3NzQ2xhc3NOb0FydGljbGUgfCBodG1sICVdIj4KICAgICAgICAgICAgIDxhIGNsYXNzPSJvb29GQVEgb29vRkFRSW5kZXgiIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5JY29uICVdCiAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPSJUaXRsZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvaDI+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJMYW5ndWFnZSBvb29nIiB0aXRsZT0iWyUgRGF0YS5MYW5ndWFnZSB8IGh0bWwgJV0iPlslIERhdGEuTGFuZ3VhZ2UgfCBodG1sICVdPC9wPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgIDwvYT4KICAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBbJSBEYXRhLkNzc0NsYXNzTm9BcnRpY2xlIHwgaHRtbCAlXSI+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAgICAgPHVsIGlkPSJNZXNzYWdlcyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRIZWFkZXIiKSAlXQojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJDdXN0b21lciBWaXNpYmxlIj4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQ3VzdG9tZXIgVmlzaWJsZSBDb250ZW50SW5kZXgiPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudHMiKSB8IGh0bWwgJV06PC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkF0dGFjaG1lbnRzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wYXBlcmNsaXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkRvd25sb2FkQXR0YWNobWVudCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRG93bmxvYWQgQXR0YWNobWVudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0l0ZW1JRD1bJSBEYXRhLkl0ZW1JRCB8IHVyaSAlXTtGaWxlSUQ9WyUgRGF0YS5GaWxlSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRIZWFkZXIiKSAlXQoKI1slIFJlbmRlckJsb2NrU3RhcnQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMjIFNob3cgaW5mbywgdGhhdCBsaW5rcyB3aXRoaW4gdGhlIGlmcmFtZSBtdXN0IGJlIGNsaWNrZWQgd2l0aCBzdHJnL2NtZC9zaGlmdCAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGJyb3dzZXIgYW5kIG9zKQojIyB0byBvcGVuIHRoZSBsaW5rcyBpbiBhIG5ldyB3aW5kb3cgd2l0aG91dCB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbnMgZ2l2ZW4gdG8gdGhlIGlmcmFtZQojICAgICAgICAgICAgPGxpPgojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZBUU1lc3NhZ2VCcm93c2VyIj4KIyAgICAgICAgICAgICAgICAgICAgPHA+CiMgICAgICAgIFslIFRyYW5zbGF0ZSgiVG8gb3BlbiBsaW5rcyBpbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGJsb2NrcywgeW91IG1pZ2h0IG5lZWQgdG8gcHJlc3MgQ3RybCBvciBDbWQgb3IgU2hpZnQga2V5IHdoaWxlIGNsaWNraW5nIHRoZSBsaW5rIChkZXBlbmRpbmcgb24geW91ciBicm93c2VyIGFuZCBPUykuIikgfCBodG1sICVdCiMgICAgICAgICAgICAgICAgICAgIDwvcD4KIyAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNsb3NlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDbG9zZSB0aGlzIG1lc3NhZ2UiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPjwvYT4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgIDwvbGk+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQnJvd3NlckxpbmtNZXNzYWdlIikgJV0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQ3VzdG9tZXIgVmlzaWJsZSBDb250ZW50SW5kZXgiPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRQ29udGVudCIpICVdCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkN1c3RvbWVyIFZpc2libGUiPgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoRGF0YS5DYXB0aW9uKSB8IGh0bWwgJV06PC9oMz4KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iWyUgRGF0YS5GaWVsZCAlXSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9IkNhcHRpb25MYWJlbCI+WyUgVHJhbnNsYXRlKERhdGEuQ2FwdGlvbikgfCBodG1sICVdOjwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJCYWNrVG9wIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJCYWNrIHRvIHRvcCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2hldnJvbi11cCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9InRydWUiIG5hbWU9IkZpZWxkU3RhdGUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFDb250ZW50SFRNTCIpICVdCiMgZXhlY3V0ZSBJRnJhbWUgSlMgYXN5bmNocm9ub3VzbHkuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gYmVmb3JlIG91ciBBUEkgd2FzIGxvYWRlZAojIHRoZSBmb2xsb3dpbmcgSlMgY29kZSBtdXN0IGJlIHdpdGhpbiB0aGUgdGVtcGxhdGUsIG90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4sIHRoYXQgYWxzbyB0aGlzIGNvZGUgaXRzZWxmIGlzIG5vdCBsb2FkZWQgeWV0CjxzY3JpcHQ+CmZ1bmN0aW9uIENoZWNrSUZyYW1lSGVpZ2h0KElGcmFtZUlEKSB7CiAgICBpZiAodHlwZW9mIEZBUSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIEZBUS5DdXN0b21lciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIEZBUS5DdXN0b21lci5GQVFab29tID09PSAnb2JqZWN0JykgewogICAgICAgIEZBUS5DdXN0b21lci5GQVFab29tLklmcmFtZUF1dG9IZWlnaHQoJCgnIycgKyBJRnJhbWVJRCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDaGVja0lGcmFtZUhlaWdodChJRnJhbWVJRCk7CiAgICAgICAgfSwgNTAwKTsKICAgIH0KfQo8L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlQm9keSI+CiMgVXNlIHRoZSBIVE1MNSBzYW5kYm94IGF0dHJpYnV0ZSB0byBwcmV2ZW50IHBsdWdpbnMgYW5kIHNjcmlwdHMgZnJvbSBiZWluZyBleGVjdXRlZCBpbiB0aGUgYnJvd3Nlci4KIyBBcHBlbmQgc2Vzc2lvbiBpbmZvIHRvIFVSTCBiZWNhdXNlIElFIHdpbGwgbm90IHNlbmQgY29va2llcy4KIyBTZXQgJ2FsbG93LXBvcHVwcycgdG8gYWxsb3cgSUUxMCsgdG8gb3BlbiBsaW5rcy4gcmVmOiBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL3dpa2kvQ2hhbmdlUHJvcG9zYWxzL3NhbmRib3hfYWxsb3dfcG9wdXBzCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24gLSBBbGxvd2luZyB0b3AgbmF2aWdhdGlvbiBmb3IgRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQojICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgbXMtYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCIgY2xhc3M9IkZBUUZpZWxkIiBpZD0iSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIG9ubG9hZD0id2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpeyBDaGVja0lGcmFtZUhlaWdodCgnSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0nKTsgfSwgNTAwKTsiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyRkFRWm9vbTtTdWJhY3Rpb249SFRNTFZpZXc7SXRlbUlEPVslIERhdGEuSXRlbUlEIHwgaHRtbCAlXTtGaWVsZD1bJSBEYXRhLkZpZWxkIHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIj48L2lmcmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgbXMtYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy10b3AtbmF2aWdhdGlvbiIgY2xhc3M9IkZBUUZpZWxkIiBpZD0iSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIG9ubG9hZD0id2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpeyBDaGVja0lGcmFtZUhlaWdodCgnSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0nKTsgfSwgNTAwKTsiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyRkFRWm9vbTtTdWJhY3Rpb249SFRNTFZpZXc7SXRlbUlEPVslIERhdGEuSXRlbUlEIHwgaHRtbCAlXTtGaWVsZD1bJSBEYXRhLkZpZWxkIHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIj48L2lmcmFtZT4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFDb250ZW50SFRNTCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUNvbnRlbnRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUZBUUNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ29udGVudCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnRQbGFpbiIpICVdCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICA8L2xpPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnQiKSAlXQojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICA8L2xpPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICA8ZGl2IGlkPSJab29tU2lkZWJhciI+CiMgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VIZWFkZXIiPgojICAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiRkFRIEluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMz4KIyAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgIDx1bCBpZD0iTWV0YWRhdGEiPgojICAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiQXJ0aWNsZSBOdW1iZXIiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3Bhbj5bJSBEYXRhLk51bWJlciB8IGh0bWwgJV08L3NwYW4+PC9saT4KIyAgICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIkNhdGVnb3J5IikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkNhdGVnb3J5TmFtZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5DYXRlZ29yeU5hbWUpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgojCiMgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IktleXdvcmRzQ29udGFpbmVyIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIktleXdvcmRzIikgfCBodG1sICVdOjwvc3Bhbj4KIyBbJSBSZW5kZXJCbG9ja1N0YXJ0KCJLZXl3b3JkcyIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleXdvcmQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlYXJjaCBmb3IgYXJ0aWNsZXMgd2l0aCBrZXl3b3JkIikgfCBodG1sICVdOiBbJSBEYXRhLktleXdvcmQgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyRkFRRXhwbG9yZXI7U3ViYWN0aW9uPVNlYXJjaDtLZXl3b3JkPVslIERhdGEuS2V5d29yZCB8IHVyaSAlXSI+WyUgRGF0YS5LZXl3b3JkIHwgaHRtbCAlXTwvYT4KIyAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiMgWyUgUmVuZGVyQmxvY2tFbmQoIktleXdvcmRzIikgJV0KIyAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiMgICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC9zcGFuPjwvbGk+CiMgWyUgUmVuZGVyQmxvY2tTdGFydCgiTGFuZ3VhZ2UiKSAlXQojICAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiTGFuZ3VhZ2UiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgojIFslIFJlbmRlckJsb2NrRW5kKCJMYW5ndWFnZSIpICVdCiMKIyAjIHNob3cgZmFxIGR5bmFtaWMgZmllbGRzCiMgWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRHluYW1pY0ZpZWxkIikgJV0KIyAgICAgICAgICAgICAgICAgICAgIDxsaT4KIyAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgICA8L2xpPgojIFslIFJlbmRlckJsb2NrRW5kKCJGQVFEeW5hbWljRmllbGQiKSAlXQojICMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojICMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgIyBmaWVsZCBuYW1lcwojICNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAjICAgICAgICAgICAgICAgIDxsaT4KIyAjICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KIyAjICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZTEgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojICMgICAgICAgICAgICAgICAgPC9saT4KIyAjWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAjICAgICAgICAgICAgICAgIDxsaT4KIyAjICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KIyAjICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZTIgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojICMgICAgICAgICAgICAgICAgPC9saT4KIyAjWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojCiMgWyUgUmVuZGVyQmxvY2tTdGFydCgiVmlld1JhdGluZyIpICVdCiMgICAgICAgICAgICAgICAgICAgICA8bGk+CiMgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSBSYXRpbmdMYWJlbCI+WyUgVHJhbnNsYXRlKCJSYXRpbmciKSB8IGh0bWwgJV06PC9zcGFuPgojIFslIFJlbmRlckJsb2NrU3RhcnQoIlJhdGVTdGFycyIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJhdGVTdGFyIj48aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPjwvc3Bhbj4KIyBbJSBSZW5kZXJCbG9ja0VuZCgiUmF0ZVN0YXJzIikgJV0KIyBbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSYXRlU3RhcnNDb3VudCIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJhdGVTdGFyVGV4dCIgdGl0bGU9IlslIERhdGEuU3RhcnMgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgib3V0IG9mIDUiKSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXJzIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIm91dCBvZiA1IikgfCBodG1sICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgojIFslIFJlbmRlckJsb2NrRW5kKCJSYXRlU3RhcnNDb3VudCIpICVdCiMgICAgICAgICAgICAgICAgICAgICA8L2xpPgojIFslIFJlbmRlckJsb2NrRW5kKCJWaWV3UmF0aW5nIikgJV0KIwojIFslIFJlbmRlckJsb2NrU3RhcnQoIlZpZXdWb3RlcyIpICVdCiMgICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKCJWb3RlcyIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlZvdGVzIHwgaHRtbCAlXSI+WyUgRGF0YS5Wb3RlcyB8IGh0bWwgJV08L3NwYW4+PC9saT4KIyBbJSBSZW5kZXJCbG9ja0VuZCgiVmlld1ZvdGVzIikgJV0KIyAgICAgICAgICAgICAgICAgPC91bD4KIyAgICAgICAgICAgICA8L2Rpdj4KIwojIFslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVZvdGluZyIpICVdCiMgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRkFRVm90ZSIgY2xhc3M9IlByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgojICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZvdGluZ0NvbnRhaW5lciI+CiMgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZvdGluZ0JveCBWaXNpYmxlIj4KIyAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZBUVZvdGluZyIgY2xhc3M9IkZBUVZvdGluZyI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUhlYWRlciI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoIlJhdGluZyIpIHwgaHRtbCAlXTo8L2gzPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTWVzc2VuZ2VyIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcCI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJWb3RpbmdRdWVzdGlvbiI+WyUgVHJhbnNsYXRlKCJIb3cgaGVscGZ1bCB3YXMgdGhpcyBhcnRpY2xlPyBQbGVhc2UgZ2l2ZSB1cyB5b3VyIHJhdGluZyBhbmQgaGVscCB0byBpbXByb3ZlIHRoZSBGQVEgRGF0YWJhc2UuIFRoYW5rIFlvdSEiKSB8IGh0bWwgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJhdGVMYWJlbEJlZm9yZSBvb29nIj5bJSBUcmFuc2xhdGUoIm5vdCBoZWxwZnVsIikgfCBodG1sICVdPC9zcGFuPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIwojIFslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVZvdGluZ1JhdGVSb3ciKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSYXRlQnV0dG9uWyUgRGF0YS5WYWx1ZSAlXSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUmF0ZUJ1dHRvbiBSYXRlVW5DaGVja2VkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3Rhci1vIj48L2k+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyBbJSBSZW5kZXJCbG9ja0VuZCgiRkFRVm90aW5nUmF0ZVJvdyIpICVdCiMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJSYXRlTGFiZWxBZnRlciBvb29nIj5bJSBUcmFuc2xhdGUoInZlcnkgaGVscGZ1bCIpIHwgaHRtbCAlXTwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkN1c3RvbWVyRkFRWm9vbSIvPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWb3RlIi8+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSJbJSBEYXRhLkNhdGVnb3J5SUQgfCBodG1sICVdIi8+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IlslIERhdGEuSXRlbUlEIHwgaHRtbCAlXSIvPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3cgVm90aW5nQWN0aW9uUm93Ij4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiAgaWQ9IlJhdGVTdWJtaXRCdXR0b24iIGNsYXNzPSJIaWRkZW4gb29vWFMiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L2J1dHRvbj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJhdGUiIHZhbHVlPSJbJSBEYXRhLlNlbGVjdGVkUmF0ZSB8IGh0bWwgJV0iaWQ9IlJhdGVWYWx1ZSIvPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgIDwvZm9ybT4KIyBbJSBSZW5kZXJCbG9ja0VuZCgiRkFRVm90aW5nIikgJV0KICAgICAgPC9kaXY+IDwhLS0gQXJ0aWNsZUFyZWEgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0Q29sdW1uIj4KICAgICAgICAgICAgWyUgSUYgRGF0YS5UT0MgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QXJlYS1Ub3AiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5UT0MgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBcmVhLU1pZGRsZSI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkFkZGl0aW9uYWxEYXRhICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBcmVhLUJvdHRvbSI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/PublicFAQExplorer.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL1B1YmxpY0ZBUUV4cGxvcmVyLnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCjxkaXYgaWQ9Im9vb0NvbnRlbnQiPgogICAgPGRpdiBpZD0ib29vSGVhZGVyIj4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgPGRpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXJSb3dUaXRsZSI+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJGQVEgRXhwbG9yZXIiKSB8IGh0bWwgJV08L2gxPgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyUm93Ij4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkJyZWFkQ3J1bWIiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IikgJV0KICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1QdWJsaWNGQVFFeHBsb3JlcjtDYXRlZ29yeUlEPVslIERhdGEuQ2F0ZWdvcnlJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnROb0xpbmsiKSAlXQogICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aENhdGVnb3J5RWxlbWVudE5vTGluayIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICA8ZGl2IGlkPSJvb29TZWFyY2hCb3giPgogICAgICAgIDxkaXYgaWQ9Im9vb1NlYXJjaEJveCIgY2xhc3M9IkhlYWRlclJvdyBGQVFTZWFyY2hCb3giPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iUHVibGljRkFRRXhwbG9yZXIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCIvPgoKICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0nb29vZyc+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLXNlYXJjaCI+PC9pPgojICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iV2hhdCIgaWQ9Im9vb1NlYXJjaCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXSIvPgojICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nb29vU2VhcmNoTGFiZWwnPlslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iV2hhdCIgaWQ9Im9vb1NlYXJjaCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgnRkFRIFNlYXJjaCcpIHwgaHRtbCAlXSIgIGNsYXNzPSJvb29TZWFyY2hGQVEiLz4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nb29vU2VhcmNoTGFiZWwnPjxpIGNsYXNzPSJvb29mbyBvb29mby1zZWFyY2giPjwvaT4gWyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdPC9zcGFuPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICA8ZGl2IGlkPSJvb29NYWluQm94Ij4KICAgIDxkaXYgaWQ9Im9vb01haW5Cb3giIGNsYXNzPSJGQVFDb250ZW50Ij4KCiAgICBbJSBEYXRhLlNpZGVCYXIgJV0KCiAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlQXJlYSI+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3ViY2F0ZWdvcmllcyIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSZXN1bHQiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3ViY2F0ZWdvcmllcyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vU3ViQm94Ij4KIyBubyB3aGl0ZXNwYWNlL25ld2xpbmUgcmVzdWx0cyBpbiBubyB3aGl0ZXNwYWNlIGJldHdlZW4gZGlzcGxheTogaW5saW5lLWJsb2NrOyBlbGVtZW50cwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdFJvdyIpICVdPGEgY2xhc3M9Im9vb1N1YiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU3ViQ2F0ZWdvcnlDb3VudCAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJvb29TdWJDb3VudCI+WyUgRGF0YS5TdWJDYXRlZ29yeUNvdW50IHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0ib29vZyBvb29Db21tZW50Ij5bJSBUcmFuc2xhdGUoRGF0YS5Db21tZW50KSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2E+WyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0Um93IikgJV0KIyBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHRSb3ciKQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN1YmNhdGVnb3JpZXMiKSAlXQoKClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUl0ZW1MaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KWyUgSUYgRGF0YS5DYXRlZ29yeUlEID09IDAgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxhdGVzdCB1cGRhdGVkIEZBUSBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvaDI+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkZBUSBBcnRpY2xlcyIpIHwgaHRtbCAlXTwvaDI+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQYWdpbmF0aW9uIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlBhZ2luYXRpb24gb29vMTBnIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIERhdGEuUmVzdWx0IHwgaHRtbCAlXTwvc3Ryb25nPiBbJSBUcmFuc2xhdGUoIm9mIikgfCBodG1sICVdIDxzdHJvbmc+WyUgRGF0YS5Ub3RhbEhpdHMgfCBodG1sICVdPC9zdHJvbmc+IC0gWyUgVHJhbnNsYXRlKCJQYWdlIikgfCBodG1sICVdOiBbJSBEYXRhLlNpdGVOYXZCYXIgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGFnaW5hdGlvbiIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ib29vRkFRQm94Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9GQVFEYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9Im9vb0ZBUSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiTm8gRkFRIGFydGljbGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJOb0ZBUURhdGFGb3VuZE1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZCIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0ib29vRkFRIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249UHVibGljRkFRWm9vbTtJdGVtSUQ9WyUgRGF0YS5GQVFJRCB8IHVyaSAlXSI+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkljb24gJV0KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJUaXRsZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvaDM+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZExhbmd1YWdlIikgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iTGFuZ3VhZ2Ugb29vZyIgdGl0bGU9IlslIERhdGEuTGFuZ3VhZ2UgfCBodG1sICVdIj5bJSBEYXRhLkxhbmd1YWdlIHwgdHJ1bmNhdGUoNSkgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkTGFuZ3VhZ2UiKSAlXQogICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkJvdHRvbVN1Yk5hdmlnYXRpb24iKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUGFnaW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBEYXRhLlJlc3VsdCB8IGh0bWwgJV08L3N0cm9uZz4gWyUgVHJhbnNsYXRlKCJvZiIpIHwgaHRtbCAlXSA8c3Ryb25nPlslIERhdGEuVG90YWxIaXRzIHwgaHRtbCAlXTwvc3Ryb25nPiAtIFslIFRyYW5zbGF0ZSgiUGFnZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5TaXRlTmF2QmFyICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJvdHRvbVN1Yk5hdmlnYXRpb24iKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUl0ZW1MaXN0IikgJV0KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgIDwvZGl2PiA8IS0tIEFydGljbGVBcmVhIC0tPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/PublicFAQZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL1B1YmxpY0ZBUVpvb20udHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UT0JPOjpUVDo6U2NyaXB0VXNhZ2UpCgo8ZGl2IGlkPSJvb29Db250ZW50Ij4KCiAgICA8ZGl2IGlkPSJvb29IZWFkZXIiPgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICA8ZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlclJvd1RpdGxlIj4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXTwvaDE+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXJSb3ciPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQnJlYWRDcnVtYiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVB1YmxpY0ZBUUV4cGxvcmVyO0NhdGVnb3J5SUQ9WyUgRGF0YS5DYXRlZ29yeUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9J29vb2cnPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRUGF0aEl0ZW1FbGVtZW50IikgJV0KICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0nb29vZyc+WyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L2gzPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUGF0aEl0ZW1FbGVtZW50IikgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgIDxkaXYgaWQ9Im9vb1NlYXJjaEJveCI+CiAgICAgICAgPGRpdiBpZD0ib29vU2VhcmNoQm94IiBjbGFzcz0iSGVhZGVyUm93IEZBUVNlYXJjaEJveCI+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJQdWJsaWNGQVFFeHBsb3JlciIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VhcmNoIi8+CgogICAgICAgICAgICAgICAgPGgzIGNsYXNzPSdvb29nJz4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0ib29vZm8gb29vZm8tc2VhcmNoIj48L2k+CiMgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXaGF0IiBpZD0ib29vU2VhcmNoIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdIi8+CiMgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdvb29TZWFyY2hMYWJlbCc+WyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXaGF0IiBpZD0ib29vU2VhcmNoIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdGQVEgU2VhcmNoJykgfCBodG1sICVdIiAgY2xhc3M9Im9vb1NlYXJjaEZBUSIvPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdvb29TZWFyY2hMYWJlbCc+PGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLXNlYXJjaCI+PC9pPiBbJSBUcmFuc2xhdGUoJ0ZBUSBTZWFyY2gnKSB8IGh0bWwgJV08L3NwYW4+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgojICAgICAgICAgICAgPHVsIGlkPSJGQVFPcHRpb25zIj4KIyAgICAgICAgICAgICAgICA8bGk+CiMgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1QdWJsaWNGQVFQcmludDtJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCB1cmkgJV0iIGNsYXNzPSJQcmludCBBc1BvcHVwIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJQcmludCIpIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcHJpbnQiPjwvaT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiUHJpbnQiKSB8IGh0bWwgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDwvYT4KIyAgICAgICAgICAgICAgICA8L2xpPgojICAgICAgICAgICAgPC91bD4KICAgIDwvZGl2PgoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICA8ZGl2IGlkPSJvb29NYWluQm94Ij4KICAgIDxkaXYgaWQ9Im9vb01haW5Cb3giICBjbGFzcz0iRkFRQ29udGVudCI+CgogICAgWyUgRGF0YS5TaWRlQmFyICVdCgogICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUFyZWEiPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KIyAgICAgICAgIDxkaXYgY2xhc3M9J1dpZGdldFNpbXBsZSc+CiMgICAgICAgICAgICAgPGgyIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgIFslIERhdGEuVGl0bGUgfCBodG1sICVdCiMgICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EZWZhdWx0SXRlbSIpICVdCgogICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8YSBjbGFzcz0ib29vRkFRIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249UHVibGljRkFRRXhwbG9yZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZBUSBFeHBsb3JlciIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8aDQ+WyUgVHJhbnNsYXRlKCJObyBkZWZhdWx0IGl0ZW0gaGFzIGJlZW4gc2V0IHlldCEgU3RhcnQgYnJvd3NpbmcgYXJ0aWNsZXMgaW4gdGhlIikgfCBodG1sICVdIDxiPlslIFRyYW5zbGF0ZSgiRkFRIEV4cGxvcmVyIikgfCBodG1sICVdPC9iPjwvaDQ+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EZWZhdWx0SXRlbSIpICVdCgogICAgICAgICA8ZGl2IGNsYXNzPSJvb29GQVFCb3ggWyUgRGF0YS5Dc3NDbGFzc05vQXJ0aWNsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgPGEgY2xhc3M9Im9vb0ZBUSBvb29GQVFJbmRleCIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkljb24gJV0KICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IlRpdGxlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9oMj4KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Ikxhbmd1YWdlIG9vb2ciIHRpdGxlPSJbJSBEYXRhLkxhbmd1YWdlIHwgaHRtbCAlXSI+WyUgRGF0YS5MYW5ndWFnZSB8IGh0bWwgJV08L3A+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgPC9hPgogICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFslIERhdGEuQ3NzQ2xhc3NOb0FydGljbGUgfCBodG1sICVdIj4KICAgICAgICAgPGEgaWQ9InRvcCI+PC9hPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgPHVsIGlkPSJNZXNzYWdlcyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRIZWFkZXIiKSAlXQojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iUHVibGljIFZpc2libGUiPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJQdWJsaWMgVmlzaWJsZSBDb250ZW50SW5kZXgiPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudHMiKSB8IGh0bWwgJV06PC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkF0dGFjaG1lbnRzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wYXBlcmNsaXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkRvd25sb2FkQXR0YWNobWVudCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRG93bmxvYWQgQXR0YWNobWVudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0l0ZW1JRD1bJSBEYXRhLkl0ZW1JRCB8IHVyaSAlXTtGaWxlSUQ9WyUgRGF0YS5GaWxlSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRIZWFkZXIiKSAlXQoKI1slIFJlbmRlckJsb2NrU3RhcnQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMjIFNob3cgaW5mbywgdGhhdCBsaW5rcyB3aXRoaW4gdGhlIGlmcmFtZSBtdXN0IGJlIGNsaWNrZWQgd2l0aCBzdHJnL2NtZC9zaGlmdCAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGJyb3dzZXIgYW5kIG9zKQojIyB0byBvcGVuIHRoZSBsaW5rcyBpbiBhIG5ldyB3aW5kb3cgd2l0aG91dCB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbnMgZ2l2ZW4gdG8gdGhlIGlmcmFtZQojICAgICAgICAgICAgPGxpPgojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZBUU1lc3NhZ2VCcm93c2VyIj4KIyAgICAgICAgICAgICAgICAgICAgPHA+CiMgICAgICAgIFslIFRyYW5zbGF0ZSgiVG8gb3BlbiBsaW5rcyBpbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGJsb2NrcywgeW91IG1pZ2h0IG5lZWQgdG8gcHJlc3MgQ3RybCBvciBDbWQgb3IgU2hpZnQga2V5IHdoaWxlIGNsaWNraW5nIHRoZSBsaW5rIChkZXBlbmRpbmcgb24geW91ciBicm93c2VyIGFuZCBPUykuIikgfCBodG1sICVdCiMgICAgICAgICAgICAgICAgICAgIDwvcD4KIyAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNsb3NlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDbG9zZSB0aGlzIG1lc3NhZ2UiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPjwvYT4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgIDwvbGk+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQnJvd3NlckxpbmtNZXNzYWdlIikgJV0KCiMgUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iUHVibGljIFZpc2libGUgQ29udGVudEluZGV4Ij4KIyBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUNvbnRlbnQiKSAlXQojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iUHVibGljIFZpc2libGUiPgogICAgICAgICAgICAgICAgICAgIDxhIGlkPSJbJSBEYXRhLkZpZWxkICVdIj48L2E+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VIZWFkZXIiPgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiMgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZShEYXRhLkNhcHRpb24pIHwgaHRtbCAlXTo8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9IkNhcHRpb25MYWJlbCI+WyUgVHJhbnNsYXRlKERhdGEuQ2FwdGlvbikgfCBodG1sICVdOjwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJCYWNrVG9wIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJCYWNrIHRvIHRvcCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2hldnJvbi11cCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9InRydWUiIG5hbWU9IkZpZWxkU3RhdGUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFDb250ZW50SFRNTCIpICVdCiMgZXhlY3V0ZSBJRnJhbWUgSlMgYXN5bmNocm9ub3VzbHkuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gYmVmb3JlIG91ciBBUEkgd2FzIGxvYWRlZAojIHRoZSBmb2xsb3dpbmcgSlMgY29kZSBtdXN0IGJlIHdpdGhpbiB0aGUgdGVtcGxhdGUsIG90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4sIHRoYXQgYWxzbyB0aGlzIGNvZGUgaXRzZWxmIGlzIG5vdCBsb2FkZWQgeWV0CjxzY3JpcHQ+CmZ1bmN0aW9uIENoZWNrSUZyYW1lSGVpZ2h0KElGcmFtZUlEKSB7CiAgICBpZiAodHlwZW9mIEZBUSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIEZBUS5DdXN0b21lciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIEZBUS5DdXN0b21lci5GQVFab29tID09PSAnb2JqZWN0JykgewogICAgICAgIEZBUS5DdXN0b21lci5GQVFab29tLklmcmFtZUF1dG9IZWlnaHQoJCgnIycgKyBJRnJhbWVJRCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDaGVja0lGcmFtZUhlaWdodChJRnJhbWVJRCk7CiAgICAgICAgfSwgNTAwKTsKICAgIH0KfQo8L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlQm9keSI+CiMgVXNlIHRoZSBIVE1MNSBzYW5kYm94IGF0dHJpYnV0ZSB0byBwcmV2ZW50IHBsdWdpbnMgYW5kIHNjcmlwdHMgZnJvbSBiZWluZyBleGVjdXRlZCBpbiB0aGUgYnJvd3Nlci4KIyBBcHBlbmQgc2Vzc2lvbiBpbmZvIHRvIFVSTCBiZWNhdXNlIElFIHdpbGwgbm90IHNlbmQgY29va2llcy4KIyBTZXQgJ2FsbG93LXBvcHVwcycgdG8gYWxsb3cgSUUxMCsgdG8gb3BlbiBsaW5rcy4gcmVmOiBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL3dpa2kvQ2hhbmdlUHJvcG9zYWxzL3NhbmRib3hfYWxsb3dfcG9wdXBzCgojIFJvdGhlciBPU1MgLyBBbGxvd2luZyB0b3AgbmF2aWdhdGlvbiBmb3IgRkFRIEV4dGVuZGVkIE5hdmlnYXRpb24gUGFja2FnZQojICAgICAgICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgc2FuZGJveD0iYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctcG9wdXBzIG1zLWFsbG93LXBvcHVwcyBhbGxvdy1wb3B1cHMtdG8tZXNjYXBlLXNhbmRib3giIGNsYXNzPSJGQVFGaWVsZCIgaWQ9IklmcmFtZUZBUVslIERhdGEuRmllbGQgfCBodG1sICVdIiBvbmxvYWQ9IndpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKXsgQ2hlY2tJRnJhbWVIZWlnaHQoJ0lmcmFtZUZBUVslIERhdGEuRmllbGQgfCBodG1sICVdJyk7IH0sIDUwMCk7IiBzcmM9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1QdWJsaWNGQVFab29tO1N1YmFjdGlvbj1IVE1MVmlldztJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCBodG1sICVdO0ZpZWxkPVslIERhdGEuRmllbGQgfCBodG1sICVdIj48L2lmcmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgbXMtYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy10b3AtbmF2aWdhdGlvbiIgY2xhc3M9IkZBUUZpZWxkIiBpZD0iSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIG9ubG9hZD0id2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpeyBDaGVja0lGcmFtZUhlaWdodCgnSWZyYW1lRkFRWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0nKTsgfSwgNTAwKTsiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVB1YmxpY0ZBUVpvb207U3ViYWN0aW9uPUhUTUxWaWV3O0l0ZW1JRD1bJSBEYXRhLkl0ZW1JRCB8IGh0bWwgJV07RmllbGQ9WyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iPjwvaWZyYW1lPgojIEVPIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnRIVE1MIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRQ29udGVudFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRkFRQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRQ29udGVudFBsYWluIikgJV0KIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgojICAgICAgICAgICAgICAgICA8L2xpPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUUNvbnRlbnQiKSAlXQojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgICAgICAgICA8L2xpPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgICAgPC9kaXY+IDwhLS0gQXJ0aWNsZUFyZWEgLS0+CgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldENvbHVtbiI+CiAgICAgICAgICAgIFslIElGIERhdGEuVE9DICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFyZWEtVG9wIj4KICAgICAgICAgICAgICAgIFslIERhdGEuVE9DICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QXJlYS1NaWRkbGUiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5BZGRpdGlvbmFsRGF0YSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QXJlYS1Cb3R0b20iPjwvZGl2PgogICAgICAgIDwvZGl2Pgo8IS0tCiMgRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICA8ZGl2IGlkPSJab29tU2lkZWJhciI+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+CiAgICAgICAgICAgIDwvZGl2PgojIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCi0tPgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentFAQExplorer.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0FnZW50RkFRRXhwbG9yZXIudHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gRkFRIj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyTGVmdCI+PC9kaXY+CiAgICA8aDE+WyUgVHJhbnNsYXRlKCJGQVEgRXhwbG9yZXIiKSB8IGh0bWwgJV08L2gxPgoKICAgIDx1bCBjbGFzcz0iQnJlYWRDcnVtYiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQogICAgICAgIDxsaT4KICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50RkFRRXhwbG9yZXI7Q2F0ZWdvcnlJRD1bJSBEYXRhLkNhdGVnb3J5SUQgfCB1cmkgJV07TmF2PVslIERhdGEuTmF2IHwgdXJpICVdIj4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXQogICAgICAgICAgICA8L2E+CiAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50Tm9MaW5rIikgJV0KICAgICAgICA8bGk+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkZBUVBhdGhDYXRlZ29yeUVsZW1lbnROb0xpbmsiKSAlXQoKICAgIDwvdWw+CgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKIyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5TaWRlQmFyICVdCiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgojIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgogICAgICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4gWyUgRGF0YS5TaWRlYmFyQ2xhc3MgfCBodG1sICVdIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlF1aWNrU2VhcmNoIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiU2VhcmNoIikgfCBodG1sICVdPC9oMz4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ubGlzdCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJTZWFyY2hCb3giIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBEYXRhLkFjdGlvbiB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZWFyY2giLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJOYXYiIHZhbHVlPSJbJSBEYXRhLk5hdiB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRnVsbHRleHQiIHZhbHVlPSJbJSBEYXRhLlNlYXJjaCB8IGh0bWwgJV0iIGlkPSJTZWFyY2giIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlYXJjaCIpIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTZWFyY2giKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc2VhcmNoIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlF1aWNrIFNlYXJjaCIpIHwgaHRtbCAlXTxzcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiV2lsZGNhcmRzIGFyZSBhbGxvd2VkLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRkFRU2VhcmNoQnV0dG9uIFNwYWNpbmdUb3AiIGlkPSJbJSBEYXRhLkFjdGlvbiB8IHVyaSAlXSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIERhdGEuQWN0aW9uIHwgdXJpICVdO05hdj1bJSBEYXRhLk5hdiB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1zZWFyY2giPjwvaT4gWyUgVHJhbnNsYXRlKCJBZHZhbmNlZCBTZWFyY2giKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUXVpY2tTZWFyY2giKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5mb0JveEZBUU1pbmlMaXN0IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLkhlYWRlcikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJsZWxpa2UgRkFRTWluaUxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmZvQm94RkFRTWluaUxpc3RJdGVtUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5mb0JveEZBUU1pbmlMaXN0SXRlbVJvd1Bvc2l0aW9uTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTnVtYmVyIHwgaHRtbCAlXS4KWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9Cb3hGQVFNaW5pTGlzdEl0ZW1Sb3dQb3NpdGlvbk51bWJlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCB1cmkgJV07TmF2PVslIERhdGEuTmF2IHwgdXJpICVdIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0gKFslIERhdGEuQ2F0ZWdvcnlOYW1lIHwgaHRtbCAlXSkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGl0bGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2F0ZWdvcnlTaG9ydE5hbWUgfCB0cnVuY2F0ZSgxNSkgfCBodG1sICVdIC0gWyUgRGF0YS5MYW5ndWFnZSB8IGh0bWwgJV0gLSBbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIC0gWyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9Cb3hGQVFNaW5pTGlzdEl0ZW1Sb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJbmZvQm94RkFRTWluaUxpc3QiKSAlXQoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3ViY2F0ZWdvcmllcyIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdCIpICVdCgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlN1YmNhdGVnb3JpZXMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiIHN1bW1hcnk9IkZBUSBjYXRlZ29yaWVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiU3ViY2F0ZWdvcmllcyIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkZBUSBBcnRpY2xlcyIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vRGF0YUZvdW5kTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBzdWJjYXRlZ29yaWVzIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJOb0RhdGFGb3VuZE1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3UmVzdWx0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBjbGFzcz0iQXNCbG9jayBNYXN0ZXJBY3Rpb25MaW5rIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtDYXRlZ29yeUlEPVslIERhdGEuQ2F0ZWdvcnlJRCB8IHVyaSAlXTtOYXY9WyUgRGF0YS5OYXYgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgVHJhbnNsYXRlKERhdGEuQ29tbWVudCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuU3ViQ2F0ZWdvcnlDb3VudCB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5BcnRpY2xlQ291bnQgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3ViY2F0ZWdvcmllcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGQVFJdGVtTGlzdCIpICVdClslIERhdGEuRkFRSXRlbUxpc3RIVE1MICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFJdGVtTGlzdCIpICVdCgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cg==</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+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ6OkZBUUV4dGVuZGVkTmF2aWdhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsICAgcXcobm9uZSk7CnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RkFRJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6RkFRRXh0ZW5kZWROYXZpZ2F0aW9uIC0gYWxsIEZBUUV4dGVuZGVkTmF2aWdhdGlvbi1yZWxhdGVkIEhUTUwgZnVuY3Rpb25zCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBGQVFFeHRlbmRlZE5hdmlnYXRpb24tcmVsYXRlZCBIVE1MIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBGQVFTaWRlQmFyKCkKClNob3dzIGEgc2lkZSBiYXIgdG8gcXVpY2sgb3BlbiBGQVEgYXJ0aWNsZXMuCgogICAgJExheW91dE9iamVjdC0+RkFRU2lkZUJhcigKICAgICAgICBNb2RlICAgICAgICAgICAgPT4gJ1B1YmxpYycsICAgICAgICAgICAgICAgICAgICMgKEFnZW50LCBDdXN0b21lciwgUHVibGljKQogICAgICAgIExhbmd1YWdlICAgICAgICA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgSW50ZXJmYWNlICAgICAgID0+ICRTZWxmLT57SW50ZXJmYWNlfSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCj1jdXQKCnN1YiBGQVFTaWRlQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KE1vZGUgTGFuZ3VhZ2UgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG1vZGUKICAgIGlmICggJFBhcmFte01vZGV9ICF+IG17IEFnZW50IHwgQ3VzdG9tZXIgfCBQdWJsaWMgfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01vZGUgbXVzdCBiZSBlaXRoZXIgQWdlbnQsIEN1c3RvbWVyIG9yIFB1YmxpYyEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkRkFRT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgICMgY2hlY2sgaWYgc2lkZWJhciBpcyBlbmFibGVkIGFuZCBzdWJjYXRlZ29yaWVzIHNob3VsZCBiZSBleHBhbmRlZAogICAgbXkgJElzQWN0aXZlID0gJENvbmZpZ09iamVjdC0+R2V0KCJGQVFTaWRlQmFyOjokUGFyYW17TW9kZX06OkVuYWJsZWQiKSB8fCAnTm8nOwogICAgbXkgJEV4cGFuZCAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVFTaWRlQmFyOjpFeHBhbmRTdWJjYXRlZ29yaWVzJyk7CgogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnRXhwYW5kU3ViY2F0ZWdvcmllcycsCiAgICAgICAgVmFsdWUgPT4gJEV4cGFuZCwKICAgICk7CgogICAgIyBzZXQgaW50ZXJmYWNlIHNwZWNpZmljIHZhcmlhYmxlcwogICAgbXkgJFpvb21BY3Rpb247CiAgICBteSAkSW50ZXJmYWNlU3RhdGVzID0ge307CiAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnQWdlbnQnICkgewogICAgICAgICRab29tQWN0aW9uICAgICAgICAgICAgPSAkUGFyYW17QWN0aW9ufSBlcSAnQWdlbnRGQVFFeHBsb3JlcicgPyAnQWdlbnRGQVFab29tJyA6ICRQYXJhbXtBY3Rpb259OwogICAgICAgICRQYXJhbXtIb21lQWN0aW9ufSAgICAgPSAnQWdlbnRGQVFab29tJzsKICAgICAgICAkUGFyYW17RXhwbG9yZXJBY3Rpb259ID0gJ0FnZW50RkFRRXhwbG9yZXInOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TW9kZX0gZXEgJ0N1c3RvbWVyJyApIHsKICAgICAgICAkWm9vbUFjdGlvbiAgICAgICAgICAgID0gJFBhcmFte0FjdGlvbn0gZXEgJ0N1c3RvbWVyRkFRRXhwbG9yZXInID8gJ0N1c3RvbWVyRkFRWm9vbScgOiAkUGFyYW17QWN0aW9ufTsKICAgICAgICAkUGFyYW17SG9tZUFjdGlvbn0gICAgID0gJ0N1c3RvbWVyRkFRWm9vbSc7CiAgICAgICAgJFBhcmFte0V4cGxvcmVyQWN0aW9ufSA9ICdDdXN0b21lckZBUUV4cGxvcmVyJzsKCiAgICAgICAgJEludGVyZmFjZVN0YXRlcyA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Q3VzdG9tZXI6OlN0YXRlVHlwZXMnKSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TW9kZX0gZXEgJ1B1YmxpYycgKSB7CiAgICAgICAgJFpvb21BY3Rpb24gICAgICAgICAgICA9ICRQYXJhbXtBY3Rpb259IGVxICdQdWJsaWNGQVFFeHBsb3JlcicgPyAnUHVibGljRkFRWm9vbScgOiAkUGFyYW17QWN0aW9ufTsKICAgICAgICAkUGFyYW17SG9tZUFjdGlvbn0gICAgID0gJ1B1YmxpY0ZBUVpvb20nOwogICAgICAgICRQYXJhbXtFeHBsb3JlckFjdGlvbn0gPSAnUHVibGljRkFRRXhwbG9yZXInOwoKICAgICAgICAkSW50ZXJmYWNlU3RhdGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICAgICAgVHlwZXMgID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpQdWJsaWM6OlN0YXRlVHlwZXMnKSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgdmFsaWQgaWRzCiAgICBteSBAVmFsaWRJRHMgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwogICAgbXkgJVZhbGlkSURMb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQFZhbGlkSURzOwoKICAgIG15ICRTaWRlYmFySW5pdCA9IDA7CiAgICAkUGFyYW17SXNEZWZhdWx0QXJ0aWNsZX0gIHx8PSAwOwogICAgJFBhcmFte0hhc0RlZmF1bHRBcnRpY2xlfSB8fD0gMDsKCiAgICBpZiAoICRJc0FjdGl2ZSBlcSAnWWVzJyApIHsKICAgICAgICBteSAlRGF0YSA9ICV7ICRDb25maWdPYmplY3QtPkdldCgiJFBhcmFte01vZGV9RkFRU2lkZUJhcjo6QXJ0aWNsZXMiKSAvLyB7fSB9OwoKICAgICAgICBDT05GSUc6CiAgICAgICAgZm9yIG15ICRDb25maWcgKCBrZXlzICVEYXRhICkgewogICAgICAgICAgICBuZXh0IENPTkZJRyBpZiAkRGF0YXskQ29uZmlnfS0+e0xhbmd1YWdlfSBuZSAkUGFyYW17TGFuZ3VhZ2V9OwoKICAgICAgICAgICAgbXkgJFF1aWNrTGlua0NvbmZpZyA9ICREYXRheyRDb25maWd9OwoKICAgICAgICAgICAgbXkgJUZBUURhdGFBbGw7CiAgICAgICAgICAgIG15ICVRdWlja0xpbmtTdHJ1Y3R1cmU7CiAgICAgICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgICAgIG15ICRQcmlvID0gMDsKCiAgICAgICAgICAgIENPTkZJR0VOVFJZOgogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0VudHJ5ICggQHsgJERhdGF7JENvbmZpZ30tPnsiQXJ0aWNsZXMifSAvLyBbXSB9ICkgewogICAgICAgICAgICAgICAgbXkgQEVsZW1lbnQgPSBzcGxpdCAvOjovLCAkQ29uZmlnRW50cnk7CgogICAgICAgICAgICAgICAgbXkgJUZBUURhdGEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkRWxlbWVudFstMV0sCiAgICAgICAgICAgICAgICAgICAgSXRlbUZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBjYXRlZ29yeSBwZXJtaXNzaW9uIGZvciBhZ2VudHMgYW5kIGN1c3RvbWVycwogICAgICAgICAgICAgICAgaWYgKCAhZXhpc3RzICRTZWxmLT57Q2F0ZWdvcnlQZXJtaXNzaW9ufXsgJEZBUURhdGF7Q2F0ZWdvcnlJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnQWdlbnQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NhdGVnb3J5UGVybWlzc2lvbn17ICRGQVFEYXRhe0NhdGVnb3J5SUR9IH0gPSAkRkFRT2JqZWN0LT5DaGVja0NhdGVnb3J5VXNlclBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEZBUURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFBhcmFte01vZGV9IGVxICdDdXN0b21lcicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q2F0ZWdvcnlQZXJtaXNzaW9ufXsgJEZBUURhdGF7Q2F0ZWdvcnlJRH0gfSA9ICRGQVFPYmplY3QtPkNoZWNrQ2F0ZWdvcnlDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCAgID0+ICRGQVFEYXRhe0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgUHVibGljRkFRcyBhcmUgb25seSByZXN0cmljdGVkIGJ5IHN0YXRlIHR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDYXRlZ29yeVBlcm1pc3Npb259eyAkRkFRRGF0YXtDYXRlZ29yeUlEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dCBDT05GSUdFTlRSWSB1bmxlc3MgJFNlbGYtPntDYXRlZ29yeVBlcm1pc3Npb259eyAkRkFRRGF0YXtDYXRlZ29yeUlEfSB9OwoKICAgICAgICAgICAgICAgICMgY2hlY2sgZmFxIHN0YXRlIHR5cGUgcGVybWlzc2lvbiBmb3IgY3VzdG9tZXJzIGFuZCBwdWJsaWMKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TW9kZX0gbmUgJ0FnZW50JyAmJiAoCiAgICAgICAgICAgICAgICAgICAgICAgICEkRkFRRGF0YXtBcHByb3ZlZH0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgISRWYWxpZElETG9va3VweyAkRkFRRGF0YXtWYWxpZElEfSB9IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICEkSW50ZXJmYWNlU3RhdGVzLT57ICRGQVFEYXRhe1N0YXRlVHlwZUlEfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05GSUdFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkRkFRRGF0YUFsbHsgJEVsZW1lbnRbLTFdIH0gPSBcJUZBUURhdGE7CgogICAgICAgICAgICAgICAgIyBidWlsZCBuZXN0ZWQgUXVpY2tMaW5rU3RydWN0dXJlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN0cnVjdHVyZSA9IFwlUXVpY2tMaW5rU3RydWN0dXJlOwoKICAgICAgICAgICAgICAgICAgICAjIHRyYXZlcnNlIHRocm91Z2ggdGhlIGxheWVycywgdXNpbmcgZXhpc3Rpbmcgb3IgaW5pdGlhbGl6aW5nIG5ldyBoYXNoIHJlZnMKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZBUUl0ZW0gKEBFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdHJ1Y3R1cmUgPSAkU3RydWN0dXJlLT57TmVzdGVkfXskRkFRSXRlbX0gfHw9IHtQcmlvID0+ICRQcmlvKyt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByZXBhcmUgc3RhbmRhcmQgZ3JvdXAgb3JkZXIKICAgICAgICAgICAgICAgIHB1c2ggQEdyb3VwcywgJEVsZW1lbnRbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFF1aWNrTGlua0NvbmZpZy0+e0N1c3RvbUdyb3VwT3JkZXJ9ICkgewogICAgICAgICAgICAgICAgQEdyb3VwcyA9IHNwbGl0IC9cLC8sICRRdWlja0xpbmtDb25maWctPntDdXN0b21Hcm91cE9yZGVyfTsKICAgICAgICAgICAgICAgIEBHcm91cHMgPSBtYXAge3MvXlxzK3xccyskLy9ncn0gQEdyb3VwczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFByb2Nlc3NMZXZlbDsKICAgICAgICAgICAgbXkgJEV4cGFuZExldmVsTmFtZSA9ICcnOwogICAgICAgICAgICAkUHJvY2Vzc0xldmVsID0gc3ViIHsKICAgICAgICAgICAgICAgIG15ICggJEhhc2hSZWYsICRMZXZlbE5hbWUgKSA9IEBfOwoKICAgICAgICAgICAgICAgIHJldHVybiBpZiAhJEhhc2hSZWYgfHwgcmVmICRIYXNoUmVmIG5lICdIQVNIJzsKCiAgICAgICAgICAgICAgICBpZiAoICRIYXNoUmVmLT57ICRQYXJhbXtJdGVtSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEV4cGFuZExldmVsTmFtZSA9ICRMZXZlbE5hbWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSVRFTToKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCB7ICRIYXNoUmVmLT57JGF9e1ByaW99IDw9PiAkSGFzaFJlZi0+eyRifXtQcmlvfSB9IGtleXMgJXskSGFzaFJlZn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1cnJlbnROb2RlID0gJEhhc2hSZWYtPnskS2V5fTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VycmVudE5vZGUtPntOZXN0ZWR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRRdWlja0xpbmtTdHJ1Y3R1cmV7TmVzdGVkfXskS2V5fSA/ICdvb29GQVFTaWRlYmFySGVhZGVyJyA6ICdvb29GQVFTaWRlYmFyU3ViSGVhZGVyIENvbGxhcHNlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyb3cgICAgICAgPT4gJFF1aWNrTGlua1N0cnVjdHVyZXtOZXN0ZWR9eyRLZXl9ID8gJycgICAgICAgICAgICAgICAgICAgIDogJzxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCBvb29JY29uU3ViSGVhZGVyIj48L2k+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJjYXRlZ29yeSA9PiAkS2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkUHJvY2Vzc0xldmVsLT4oICRDdXJyZW50Tm9kZS0+e05lc3RlZH0sICRLZXkgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUxpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbiAgID0+ICRGQVFEYXRhQWxseyRLZXl9e0ljb259ID8gZGVjb2RlX2Jhc2U2NCggJEZBUURhdGFBbGx7JEtleX17SWNvbn0gKSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICA9PiAkRkFRRGF0YUFsbHskS2V5fXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICRab29tQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICA9PiAkUXVpY2tMaW5rU3RydWN0dXJle05lc3RlZH17JExldmVsTmFtZX0gPyAnJyA6ICdvb29GQVFTdWJIZWFkZXJTcGFjaW5nJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIGtleXMgJVF1aWNrTGlua1N0cnVjdHVyZSApIHsKICAgICAgICAgICAgICAgIGlmICggISRTaWRlYmFySW5pdCApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2lkZUJhcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte01vZGV9IGVxICdBZ2VudCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkU2lkZWJhckluaXQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgICAgICAkR3JvdXAgPX4gcy9eXHMrfFxzKyQvL2c7CgogICAgICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRRdWlja0xpbmtTdHJ1Y3R1cmV7TmVzdGVkfXskR3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICAkUHJvY2Vzc0xldmVsLT4oIHsgJEdyb3VwID0+ICRRdWlja0xpbmtTdHJ1Y3R1cmV7TmVzdGVkfXskR3JvdXB9IH0sICRHcm91cCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0xldmVsTmFtZScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRXhwYW5kTGV2ZWxOYW1lLAogICAgICAgICAgICApOwoKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte0l0ZW1JRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRRXhwbG9yZXJMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAoICRab29tQWN0aW9uIG5lICdDdXN0b21lckZBUVpvb20nICYmICRab29tQWN0aW9uIG5lICdQdWJsaWNGQVFab29tJyAmJiAkWm9vbUFjdGlvbiBuZSAnQWdlbnRGQVFab29tJyApCiAgICAgICAgICAgIHx8ICggJFBhcmFte0FjdGlvbn0gZXEgJ0N1c3RvbWVyRkFRWm9vbScgfHwgJFBhcmFte0FjdGlvbn0gZXEgJ1B1YmxpY0ZBUVpvb20nIHx8ICRQYXJhbXtBY3Rpb259IGVxICdBZ2VudEZBUVpvb20nICkgJiYgISRQYXJhbXtJc0RlZmF1bHRBcnRpY2xlfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoICRQYXJhbXtIYXNEZWZhdWx0QXJ0aWNsZX0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFCYWNrSG9tZUxpbmsnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAoICRQYXJhbXtBY3Rpb259IGVxICdDdXN0b21lckZBUUV4cGxvcmVyJyB8fCAkUGFyYW17QWN0aW9ufSBlcSAnUHVibGljRkFRRXhwbG9yZXInIHx8ICRQYXJhbXtBY3Rpb259IGVxICdBZ2VudEZBUUV4cGxvcmVyJyApICYmICRQYXJhbXtIYXNEZWZhdWx0QXJ0aWNsZX0gKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFCYWNrSG9tZUJsb2NrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUS9GQVFTaWRlQmFyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0KICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQyIEZBUVRhYmxlT2ZDb250ZW50cygpCgpTaG93cyBhIHRhYmxlIG9mIGNvbnRlbnRzIHRvIHF1aWNrIGp1bXAgdG8gcmVsZXZhbnQgYXJ0aWNsZSBpbmZvcm1hdGlvbi4KCiAgICAkTGF5b3V0T2JqZWN0LT5GQVFUYWJsZU9mQ29udGVudHMoCiAgICAgICAgRkFRRGF0YSAgICAgICAgID0+IFwlRkFRRGF0YSwKICAgICAgICBNb2RlICAgICAgICAgICAgPT4gJ0FnZW50JwogICAgKTsKCj1jdXQKCnN1YiBGQVFUYWJsZU9mQ29udGVudHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KEZBUURhdGEgTW9kZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtTmFtZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRQYXJhbU5hbWUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG1vZGUKICAgIGlmICggJFBhcmFte01vZGV9ICF+IG17IEFnZW50IHwgQ3VzdG9tZXIgfCBQdWJsaWMgfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01vZGUgbXVzdCBiZSBlaXRoZXIgQWdlbnQsIEN1c3RvbWVyIG9yIFB1YmxpYyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRNYXhEZXB0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFRVGFibGVPZkNvbnRlbnRzOjpNYXhEZXB0aCcpIHx8IDM7CiAgICBteSAlRGF0YSAgICAgPSAleyAkUGFyYW17RkFRRGF0YX0gfTsKCiAgICBteSBAVE9DRmllbGRzID0gZ3JlcCB7ICREYXRheyRffSA9fiAvXFMvIH0gcXcoRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYpOwoKICAgIHJldHVybiB1bmxlc3MgQFRPQ0ZpZWxkczsKCiAgICBteSAkU2luZ2xlRmllbGRNb2RlID0gMDsKCiAgICAjIElkZW50aWZ5IGlmIHdlIGFyZSBpbiBzaW5nbGUgZmllbGQgbW9kZQogICAgU0lOR0xFRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAVE9DRmllbGRzKSB7CiAgICAgICAgbXkgJEZpZWxkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCAnRkFROjpJdGVtOjonIC4gJEZpZWxkICk7CiAgICAgICAgbmV4dCBTSU5HTEVGSUVMRCBpZiAhJEZpZWxkQ29uZmlnOwogICAgICAgIG5leHQgU0lOR0xFRklFTEQgaWYgJEZpZWxkQ29uZmlnLT57U2hvd30gZXEgJ2ludGVybmFsJyAmJiAkUGFyYW17TW9kZX0gbmUgJ0FnZW50JzsKCiAgICAgICAgaWYgKCAkRGF0YXskRmllbGR9ICkgewogICAgICAgICAgICAkU2luZ2xlRmllbGRNb2RlKys7CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FydGljbGVGaWVsZCcsCiAgICAgICAgRGF0YSA9PiB7fQogICAgKTsKCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKEBUT0NGaWVsZHMpIHsKICAgICAgICBteSAkRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoICdGQVE6Okl0ZW06OicgLiAkRmllbGQgKTsKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGRDb25maWc7CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGRDb25maWctPntTaG93fSBlcSAnaW50ZXJuYWwnICYmICRQYXJhbXtNb2RlfSBuZSAnQWdlbnQnOwoKICAgICAgICBteSBAU3ViQW5jaG9ycyA9ICREYXRheyRGaWVsZH0gPX4gbXw8aChbMS02XSlbXj5dKj4oLio/KTwvaFsxLTZdPnxnaTsKCiAgICAgICAgcmV0dXJuIHVubGVzcyAoICRTaW5nbGVGaWVsZE1vZGUgIT0gMSB8fCBAU3ViQW5jaG9ycyApOwoKICAgICAgICBpZiAoICRTaW5nbGVGaWVsZE1vZGUgPiAxICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGaWVsZFBhcmVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDYXB0aW9uID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSggU3RyaW5nID0+ICRGaWVsZENvbmZpZy0+e0NhcHRpb259ICksCiAgICAgICAgICAgICAgICAgICAgRmllbGQgICA9PiAkRmllbGQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmIChAU3ViQW5jaG9ycykgewogICAgICAgICAgICBteSAkQ291bnQgPSAxOwoKICAgICAgICAgICAgTkVTVEVEOgogICAgICAgICAgICB3aGlsZSAoIG15ICggJExldmVsLCAkQ29udGVudCApID0gc3BsaWNlKCBAU3ViQW5jaG9ycywgMCwgMiApICkgewogICAgICAgICAgICAgICAgbmV4dCBORVNURUQgaWYgJExldmVsID4gJE1heERlcHRoOwoKICAgICAgICAgICAgICAgIG15ICRQYWRkaW5nID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRTaW5nbGVGaWVsZE1vZGUgPT0gMSAmJiAkQ291bnQgPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFkZGluZyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICggJFNpbmdsZUZpZWxkTW9kZSA9PSAxICYmICRDb3VudCA+IDEgKSB8fCAkU2luZ2xlRmllbGRNb2RlICE9IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhZGRpbmcgPSAoICRMZXZlbCAtIDEgKSAqIDE1OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNpbmdsZUZpZWxkTW9kZSA+IDEgPyAnQXJ0aWNsZUFuY2hvcicgOiAnQXJ0aWNsZUFuY2hvclNpbmdsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIENhcHRpb24gPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKCBTdHJpbmcgPT4gJENvbnRlbnQgKSwKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgICA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgIElEICAgICAgPT4gIiRGaWVsZC0kQ291bnQiLAogICAgICAgICAgICAgICAgICAgICAgICBMZXZlbCAgID0+ICRMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgUGFkZGluZyA9PiAkUGFkZGluZywKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUS9GQVFUYWJsZU9mQ29udGVudHMnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbQogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZDIgRkFRQWRkaXRpb25hbERhdGEoKQoKU2hvd3MgYWRkaXRpb25hbCBkYXRhIGZvciBjdXJyZW50IGl0ZW0uCgogICAgJExheW91dE9iamVjdC0+RkFRQWRkaXRpb25hbERhdGEoCiAgICAgICAgRkFRRGF0YSAgICAgICAgID0+IFwlRkFRRGF0YSwKICAgICAgICBNb2RlICAgICAgICAgICAgPT4gJ0FnZW50JwogICAgKTsKCj1jdXQKCnN1YiBGQVFBZGRpdGlvbmFsRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEZBUU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoRkFRRGF0YSBNb2RlKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbW9kZQogICAgaWYgKCAkUGFyYW17TW9kZX0gIX4gbXsgQWdlbnQgfCBDdXN0b21lciB8IFB1YmxpYyB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTW9kZSBtdXN0IGJlIGVpdGhlciBBZ2VudCwgQ3VzdG9tZXIgb3IgUHVibGljIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAlRkFRRGF0YSAgICAgID0gJXsgJFBhcmFte0ZBUURhdGF9IH07CgogICAgJFBhcmFte0V4cGxvcmVyQWN0aW9ufSA9ICIkUGFyYW17TW9kZX1GQVFFeHBsb3JlciI7CgogICAgIyBzaG93IGtleXdvcmRzIGFzIHNlYXJjaCBsaW5rcwogICAgaWYgKCAkRkFRRGF0YXtLZXl3b3Jkc30gKSB7CgogICAgICAgICMgcmVwbGFjZSBjb21tYXMgYW5kIHNlbWljb2xvbnMKICAgICAgICAkRkFRRGF0YXtLZXl3b3Jkc30gPX4gcy8sLyAvZzsKICAgICAgICAkRkFRRGF0YXtLZXl3b3Jkc30gPX4gcy87LyAvZzsKCiAgICAgICAgbXkgQEtleXdvcmRzID0gc3BsaXQgL1xzKy8sICRGQVFEYXRhe0tleXdvcmRzfTsKICAgICAgICBmb3IgbXkgJEtleXdvcmQgKEBLZXl3b3JkcykgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0tleXdvcmRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleXdvcmQgICAgICAgID0+ICRLZXl3b3JkLAogICAgICAgICAgICAgICAgICAgIEV4cGxvcmVyQWN0aW9uID0+ICRQYXJhbXtFeHBsb3JlckFjdGlvbn0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHZvdGluZyBkZWZhdWx0IG9wdGlvbgogICAgbXkgJFZvdGluZyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpWb3RpbmcnKTsKCiAgICBteSAkVHlwZU5hbWUgPSAkUGFyYW17TW9kZX0gZXEgJ1B1YmxpYycgPyAncHVibGljJyA6ICdleHRlcm5hbCc7CgogICAgIyBzZXQgZGVmYXVsdCBpbnRlcmZhY2Ugc2V0dGluZ3MKICAgIG15ICRJbnRlcmZhY2UgPSAkRkFRT2JqZWN0LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgTmFtZSAgID0+ICRUeXBlTmFtZSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IEZBUSB2b3RlIGluZm9ybWF0aW9uCiAgICBteSAkVm90ZURhdGE7CiAgICBpZiAoJFZvdGluZykgewogICAgICAgICRWb3RlRGF0YSA9ICRGQVFPYmplY3QtPlZvdGVHZXQoCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRGQVFEYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgIEludGVyZmFjZSA9PiAkSW50ZXJmYWNlLT57U3RhdGVJRH0sCiAgICAgICAgICAgIElQICAgICAgICA9PiAkUGFyYW1PYmplY3QtPlJlbW90ZUFkZHIoKSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgYWx3YXlzIGRpc3BsYXlzIFZvdGVzIHJlc3VsdCBldmVuIGlmIGl0cyAwCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ZpZXdWb3RlcycsCiAgICAgICAgICAgIERhdGEgPT4geyVGQVFEYXRhfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBhbHJlYWR5IHZvdGVkIHRoaXMgRkFRIGl0ZW0KICAgIG15ICRBbHJlYWR5Vm90ZWQ7CiAgICBpZiAoJFZvdGVEYXRhKSB7CgogICAgICAgIG15ICRJdGVtQ2hhbmdlZFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRkFRRGF0YXtDaGFuZ2VkfSB8fCAnJywKICAgICAgICAgICAgfQogICAgICAgICktPlRvRXBvY2goKTsKCiAgICAgICAgbXkgJFZvdGVDcmVhdGVkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRWb3RlRGF0YS0+e0NyZWF0ZWR9IHx8ICcnLAogICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICBpZiAoICRJdGVtQ2hhbmdlZFN5c3RlbVRpbWUgPD0gJFZvdGVDcmVhdGVkU3lzdGVtVGltZSApIHsKICAgICAgICAgICAgJEFscmVhZHlWb3RlZCA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IHJhdGluZyBzdGFycwogICAgaWYgKCRWb3RpbmcpIHsKCiAgICAgICAgIyBnZXQgdm90aW5nIGNvbmZpZwogICAgICAgIG15ICRTaG93Vm90aW5nQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OlZvdGluZzo6U2hvdycpOwogICAgICAgIGlmICggJFNob3dWb3RpbmdDb25maWctPnsgJEludGVyZmFjZS0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRoZSB1c2VyIGFscmVhZHkgdm90ZWQgYWZ0ZXIgbGFzdCBjaGFuZ2UKICAgICAgICAgICAgaWYgKCAhJEFscmVhZHlWb3RlZCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5fRkFRVm90aW5nKAogICAgICAgICAgICAgICAgICAgIEZBUURhdGEgPT4geyVGQVFEYXRhfSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gID0+ICRQYXJhbXtBY3Rpb259CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GQVFSYXRpbmdTdGFyc1Nob3coCiAgICAgICAgICAgIFZvdGVSZXN1bHQgPT4gJEZBUURhdGF7Vm90ZVJlc3VsdH0sCiAgICAgICAgICAgIFZvdGVzICAgICAgPT4gJEZBUURhdGF7Vm90ZXN9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgYXR0YWNobWVudHMgaWYgYW55CiAgICBteSBAQXR0YWNobWVudEluZGV4ID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEluZGV4KAogICAgICAgIEl0ZW1JRCAgICAgPT4gJEZBUURhdGF7SXRlbUlEfSwKICAgICAgICBTaG93SW5saW5lID0+IDAsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJENvbmZpZyA9ICRQYXJhbXtDb25maWd9OwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAnRkFRJywKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRGQVFEYXRhe0l0ZW1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAyNTAsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgYXR0YWNobWVudHMKICAgIGlmIChAQXR0YWNobWVudEluZGV4KSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRIZWFkZXInLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudEluZGV4KSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlRkFRRGF0YSwKICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEvRkFRQWRkaXRpb25hbERhdGEnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUZBUURhdGEKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9GQVFWb3RpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRkFRRGF0YSA9ICV7ICRQYXJhbXtGQVFEYXRhfSB9OwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRkFRVm90aW5nJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJUZBUURhdGEsCiAgICAgICAgICAgIEFjdGlvbiA9PiAkUGFyYW17QWN0aW9ufQogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IFZvdGluZyByYXRlcyBzZXR0aW5nCiAgICBteSAkVm90aW5nUmF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcycpOwogICAgZm9yIG15ICRSYXRlVmFsdWUgKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyRWb3RpbmdSYXRlc30gKSB7CgogICAgICAgICMgY3JlYXRlIGRhdGEgc3RydWN0dXJlIGZvciBvdXRwdXQKICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgVmFsdWUgPT4gJFJhdGVWYWx1ZSwKICAgICAgICAgICAgVGl0bGUgPT4gJFZvdGluZ1JhdGVzLT57JFJhdGVWYWx1ZX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVZvdGluZ1JhdGVSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVE9CTyBwcm9qZWN0IChMPGh0dHBzOi8vb3RvYm8ub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=</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">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNSBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgRkFRID0gRkFRIHx8IHt9OwpGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uID0gRkFRLkV4dGVuZGVkTmF2aWdhdGlvbiB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlCiAqIEBleHBvcnRzIFRhcmdldE5TIGFzIEZBUS5FeHRlbmRlZE5hdmlnYXRpb24uRkFRCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIEZBUSBFeHRlbmRlZCBOYXZpZ2F0aW9uIFBhY2thZ2UuCiAqLwpGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUSA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBUYWdzIEV4dGVuZGVkTmF2aWdhdGlvbiBGQVEgTW9kdWxlLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICAgIC8qIFNWRyBJY29uIHVwbG9hZCBmb3IgRkFRIGFydGljbGVzICovCiAgICAgICAgY29uc3QgRmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0ljb25VcGxvYWQnKTsKCiAgICAgICAgaWYgKCBGaWxlSW5wdXQgIT09IG51bGwgKSB7CgogICAgICAgICAgICAkKCIjQnRuVXBsb2FkSWNvbiIpLmJpbmQoImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKCIjSWNvblVwbG9hZCIpLnRyaWdnZXIoImNsaWNrIik7CiAgICAgICAgICAgICAgICAkKCIjQnRuVXBsb2FkSWNvbiIpLnRyaWdnZXIoImJsdXIiKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkKCIjQnRuRGVsZXRlSWNvbiIpLmJpbmQoImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKCIjSWNvbiIpLnZhbCgiIik7CiAgICAgICAgICAgICAgICAkKCIjSWNvblByZXZpZXciKS5jc3MoImJhY2tncm91bmQtaW1hZ2UiLCAibm9uZSIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIEZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gZS50YXJnZXQuZmlsZXNbMF07CgogICAgICAgICAgICAgICAgaWYgKEZpbGUgJiYgRmlsZS50eXBlID09PSAiaW1hZ2Uvc3ZnK3htbCIpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBMZWN0b3IgPSBuZXcgRmlsZVJlYWRlcigpOwoKICAgICAgICAgICAgICAgICAgICBMZWN0b3Iub25sb2FkID0gZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRTVkcgPSBldnQudGFyZ2V0LnJlc3VsdDsgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRJY29uRmlsZShjb250ZW50U1ZHKTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBMZWN0b3IucmVhZEFzVGV4dChGaWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7ICAgIAoKICAgICAgICAgICAgLy8gTG9hZCBleGlzdGluZyBpY29uIGlmIGF2YWlsYWJsZQogICAgICAgICAgICBjb25zdCBFeGlzdGluZ0ljb25WYWx1ZSA9ICQoIiNJY29uIikudmFsKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIEV4aXN0aW5nSWNvblZhbHVlLmxlbmd0aCA+IDAgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdmdUZXh0ID0gYXRvYihFeGlzdGluZ0ljb25WYWx1ZSk7CiAgICAgICAgICAgICAgICBsb2FkSWNvbkZpbGUoc3ZnVGV4dCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAkKCIuQmFja1RvcCIpLmJpbmQoImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7dG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCd9KQogICAgICAgIH0pOwoKICAgICAgICAvLyBDcmVhdGUgb2JzZXJ2ZXIgdG8gY2hlY2sgaWYgTmF2YmFyIGFuZCBGQVEgU2lkZWJhciBvdmVybGFwcwoKICAgICAgICBjb25zdCB0YXJnZXROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI29vb05hdmlnYXRpb24nKTsKCiAgICAgICAgaWYgKCB0YXJnZXROb2RlICkgewogICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnNMaXN0KSA9PiB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdjbGFzcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFeHBhbmRlZCA9IHRhcmdldE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdvb29FeHBhbmRlZCcpOwogICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFeHBhbmRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgT3ZlckxhcCA9IGNoZWNrT3ZlcmxhcCh0YXJnZXROb2RlLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuU2lkZWJhckFyZWEnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggT3ZlckxhcCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI0ZBUVNpZGViYXIiKS5jc3MoIm9wYWNpdHkiLCAiMC4xIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjRkFRU2lkZWJhciIpLmNzcygib3BhY2l0eSIsICIxIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXROb2RlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7CiAgICAgICAgfQoKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcub29vRkFRU2lkZWJhclN1YkhlYWRlcicpLmZvckVhY2goaGVhZGVyID0+IHsKICAgICAgICAgICAgaGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgaGVhZGVyLmNsYXNzTGlzdC50b2dnbGUoJ0V4cGFuZGVkJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIuY2xhc3NMaXN0LnRvZ2dsZSgnQ29sbGFwc2VkJyk7CiAgICAgICAgICAgICAgICAkKCJpLm9vb0ljb25TdWJIZWFkZXIiLCAkKGhlYWRlcikpLnRvZ2dsZUNsYXNzKCdmYS1jYXJldC1yaWdodCBmYS1jYXJldC1kb3duJyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gaGVhZGVyLm5leHRFbGVtZW50U2libGluZzsKICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuY2xhc3NMaXN0LmNvbnRhaW5zKCdvb29GQVFTaWRlYmFyQXJ0aWNsZScpKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dC5jbGFzc0xpc3QudG9nZ2xlKCdvb28taXMtdmlzaWJsZScpOwogICAgICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHRFbGVtZW50U2libGluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgICQoIGRvY3VtZW50ICkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICggQ29yZS5Db25maWcuR2V0KCdFeHBhbmRTdWJjYXRlZ29yaWVzJykgPT0gIlllcyIgKSB7CiAgICAgICAgICAgICAgICAkKCJvb29GQVFTaWRlYmFyIC5mYS1jaGV2cm9uLXJpZ2h0IikudHJpZ2dlcigiY2xpY2siKTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQ29yZS5Db25maWcuR2V0KCdMZXZlbE5hbWUnKSAhPSAiIiApIHsKICAgICAgICAgICAgICAgICQoJ1tkYXRhLW5hbWU9IicrIGVzY2FwZVN0cmluZyhDb3JlLkNvbmZpZy5HZXQoJ0xldmVsTmFtZScpKSArICciXScpLnRyaWdnZXIoImNsaWNrIik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgIAogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGVzY2FwZVN0cmluZwogICAgICogQG1lbWJlcm9mIEZBUS5FeHRlbmRlZE5hdmlnYXRpb24uRkFRCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGVzY2FwZSBzdHJpbmcgY29udGVudCBmb3IgSnF1ZXJ5IGZpZWxkcy4KICAgICAqLwoKICAgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHsKICAgICAgICBpZiAoIHR5cGVvZiBzdHIgPT0gJ3VuZGVmaW5lZCcgKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWyEiIyQlJicoKSorLC5cLzo7PD0+P0BbXFxcXV5ge3x9fl0vZywgIlxcJCYiKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIGxvYWRJY29uRmlsZQogICAgICogQG1lbWJlcm9mIEZBUS5FeHRlbmRlZE5hdmlnYXRpb24uRkFRCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGxvYWQgaWNvbiBmaWxlIGluIGNvbnRhaW5lci4KICAgICAqLwoKICAgIGZ1bmN0aW9uIGxvYWRJY29uRmlsZShzdmdUZXh0KSB7CiAgICAgICAgY29uc3QgSWNvblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnSWNvblByZXZpZXcnKTsKICAgICAgICBjb25zdCBiYXNlNjRTVkcgPSBidG9hKHN2Z1RleHQpOwogICAgICAgICQoIiNJY29uIikudmFsKGJhc2U2NFNWRyk7CiAgICAgICAgSWNvblByZXZpZXcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke2Jhc2U2NFNWR30nKWA7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRGQVFBcnRpY2xlcwogICAgICogQG1lbWJlcm9mIEZBUS5FeHRlbmRlZE5hdmlnYXRpb24uRkFRCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybiBGQVEgYXJ0aWNsZXMgYWxsb3dlZCB0byBiZSBtZW50aW9uZWQgZm9yIHRoZSBjdXJyZW50IHVzZXIuCiAgICAgKi8KICAgIFRhcmdldE5TLmdldEZBUUFydGljbGVzID0gZnVuY3Rpb24ocXVlcnlUZXh0KSB7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IERhdGEgPSB7IAogICAgICAgICAgICAgICAgQWN0aW9uOiAgICAnQWdlbnRGQVFBdXRvQ29tcGxldGUnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnR2V0RkFRSXRlbXMnLAogICAgICAgICAgICAgICAgUXVlcnk6ICAgICBlbmNvZGVVUklDb21wb25lbnQocXVlcnlUZXh0KSwKICAgICAgICAgICAgICAgIE1hcmtlcjogICAgZW5jb2RlVVJJQ29tcG9uZW50KCcjJyksCiAgICAgICAgICAgICAgICBMaW1pdDogICAgIDIwLCAKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGNvbnN0IFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKTsKCiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBpZiAoUmVzdWx0ICYmIFJlc3VsdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShSZXN1bHQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSkKICAgICAgICAudGhlbigoUmVzdWx0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IFZhbHVlRGF0YSA9IFtdOwogICAgICAgICAgICAKICAgICAgICAgICAgJC5lYWNoKFJlc3VsdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgVmFsdWVEYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIGlkOiAgICAgIHRoaXMuaWQsCiAgICAgICAgICAgICAgICAgICAgdGV4dDogICAgdGhpcy50ZXh0LAogICAgICAgICAgICAgICAgICAgIGl0ZW1faWQ6IHRoaXMuaXRlbV9pZCwgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY2FtZWxjYXNlCiAgICAgICAgICAgICAgICAgICAgbGluazogICAgdGhpcy5saW5rCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gVmFsdWVEYXRhOwogICAgICAgIH0pOyAgICAgICAgCiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgYW5jaG9yRnJhbWVTY3JvbGwKICAgICAqIEBtZW1iZXJvZiBGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBkbyBzY3JvbGwgdG8gSWZyYW1lIGFuY2hvci4KICAgICAqLwogICAgVGFyZ2V0TlMuYW5jaG9yRnJhbWVTY3JvbGwgPSBmdW5jdGlvbihGaWVsZElELCBJRCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEZpZWxkSUQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoSUQpLnNjcm9sbEludG9WaWV3KCk7CiAgICB9ICAgIAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGNoZWNrT3ZlcmxhcAogICAgICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgdHJ1ZS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrIGlmIHR3byBlbGVtZW50cyBvdmVybGFwcyAoZm9yIGNoZWNraW5nIHNpZGViYXIgb3ZlcmxhcHBpbmcpLgogICAgICovCiAgICBmdW5jdGlvbiBjaGVja092ZXJsYXAoZWwxLCBlbDIpIHsKICAgICAgICBjb25zdCBjb29yZDEgPSBlbDEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3QgY29vcmQyID0gZWwyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoKICAgICAgICBjb25zdCBvdmVybGFwID0gISgKICAgICAgICAgICAgY29vcmQxLnJpZ2h0IDwgY29vcmQyLmxlZnQgfHwgCiAgICAgICAgICAgIGNvb3JkMS5sZWZ0ID4gY29vcmQyLnJpZ2h0IHx8IAogICAgICAgICAgICBjb29yZDEuYm90dG9tIDwgY29vcmQyLnRvcCB8fCAKICAgICAgICAgICAgY29vcmQxLnRvcCA+IGNvb3JkMi5ib3R0b20KICAgICAgICApOwoKICAgICAgICByZXR1cm4gb3ZlcmxhcDsKICAgIH0gICAgCgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShGQVEuRXh0ZW5kZWROYXZpZ2F0aW9uLkZBUSB8fCB7fSkpOwo=</File>
        <File Location="var/httpd/htdocs/js/Core.UI.CKEditor5Wrapper.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMjEtMjAyNCBabnVueSBHbWJILCBodHRwczovL3pudW55Lm9yZy8KLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwovLyAtLQovLyAkb3JpZ2luOiBvdG9ibyAtIDczMWUyNmNjM2Y2MDRiNWViNjM1NGZmYmE1MTY2M2YxMWUzOTRlNjUgLSB2YXIvaHR0cGQvaHRkb2NzL2pzL0NvcmUuVUkuQ0tFZGl0b3I1V3JhcHBlci5qcwovLyAtLQovLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgovLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQovLyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLy8gQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKaW1wb3J0ICogYXMgQ0tFZGl0b3I1V3JhcHBlciBmcm9tICdja2VkaXRvcjUnOwoKLyoqCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFdyYXBwZXIgZm9yIENLRWRpdG9yIDUuCiAqICAgICAgVGhlIENLRWRpdG9yIGlzIHVzaW5nIEVTNiBtb2R1bGUgc3ludGF4IHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBPVE9CTydzIGN1cnJlbnRseSB1c2VkIEVTNSBzeW50YXguCiAqICAgICAgVGhpcyB3cmFwcGVyIG1ha2VzIHRoZSByZWxldmFudCBleHBvcnRlZCB2YXJpYWJsZXMgb2YgdGhlIENLRWRpdG9yIGF2YWlsYWJsZSB0byB0aGUgZ2xvYmFsIHNjb3BlLgogKi8Kd2luZG93LkNLRWRpdG9yNVdyYXBwZXIgPSBDS0VkaXRvcjVXcmFwcGVyOwoKLyoqCiAqIGFsbCB0aGUgdXNlZCBwbHVnaW4gbmFtZXMgYXJlIG5lZWRlZCBmb3IgY3JlYXRpbmcgYW4gZWRpdG9yIGluc3RhbmNlCiAqLwpsZXQgUGx1Z2lucyA9IFsKICAgIENLRWRpdG9yNVdyYXBwZXIuQWxpZ25tZW50LAogICAgQ0tFZGl0b3I1V3JhcHBlci5BdXRvZm9ybWF0LAogICAgQ0tFZGl0b3I1V3JhcHBlci5CbG9ja1F1b3RlLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Cb2xkLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Db2RlQmxvY2ssCiAgICBDS0VkaXRvcjVXcmFwcGVyLkRhdGFGaWx0ZXIsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkRhdGFTY2hlbWEsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkZpbmRBbmRSZXBsYWNlLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Gb250Q29sb3IsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkZvbnRGYW1pbHksCiAgICBDS0VkaXRvcjVXcmFwcGVyLkZvbnRTaXplLAogICAgQ0tFZGl0b3I1V3JhcHBlci5Gb250QmFja2dyb3VuZENvbG9yLAogICAgQ0tFZGl0b3I1V3JhcHBlci5HZW5lcmFsSHRtbFN1cHBvcnQsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkhlYWRpbmcsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkhvcml6b250YWxMaW5lLAogICAgQ0tFZGl0b3I1V3JhcHBlci5JbWFnZSwKICAgIENLRWRpdG9yNVdyYXBwZXIuSW1hZ2VSZXNpemUsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkltYWdlU3R5bGUsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkltYWdlVXBsb2FkLAogICAgQ0tFZGl0b3I1V3JhcHBlci5JbWFnZVRvb2xiYXIsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkltYWdlSW5zZXJ0LAogICAgQ0tFZGl0b3I1V3JhcHBlci5JbmRlbnQsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkluZGVudEJsb2NrLAogICAgQ0tFZGl0b3I1V3JhcHBlci5JdGFsaWMsCiAgICBDS0VkaXRvcjVXcmFwcGVyLkxpbmssCiAgICBDS0VkaXRvcjVXcmFwcGVyLkxpc3QsCi8vIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICBDS0VkaXRvcjVXcmFwcGVyLk1lbnRpb24sCi8vIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgIENLRWRpdG9yNVdyYXBwZXIuUGFyYWdyYXBoLAogICAgQ0tFZGl0b3I1V3JhcHBlci5SZW1vdmVGb3JtYXQsCiAgICBDS0VkaXRvcjVXcmFwcGVyLlNlbGVjdEFsbCwKICAgIENLRWRpdG9yNVdyYXBwZXIuU2ltcGxlVXBsb2FkQWRhcHRlciwKICAgIENLRWRpdG9yNVdyYXBwZXIuU291cmNlRWRpdGluZywKICAgIENLRWRpdG9yNVdyYXBwZXIuU3BlY2lhbENoYXJhY3RlcnMsCiAgICBDS0VkaXRvcjVXcmFwcGVyLlNwZWNpYWxDaGFyYWN0ZXJzRXNzZW50aWFscywKICAgIENLRWRpdG9yNVdyYXBwZXIuU3RyaWtldGhyb3VnaCwKICAgIENLRWRpdG9yNVdyYXBwZXIuVGFibGUsCiAgICBDS0VkaXRvcjVXcmFwcGVyLlRhYmxlQ2VsbFByb3BlcnRpZXMsCiAgICBDS0VkaXRvcjVXcmFwcGVyLlRhYmxlQ29sdW1uUmVzaXplLAogICAgQ0tFZGl0b3I1V3JhcHBlci5UYWJsZVByb3BlcnRpZXMsCiAgICBDS0VkaXRvcjVXcmFwcGVyLlRhYmxlVG9vbGJhciwKICAgIENLRWRpdG9yNVdyYXBwZXIuVW5kZXJsaW5lLAogICAgQ0tFZGl0b3I1V3JhcHBlci5VbmRvLAogICAgQ0tFZGl0b3I1V3JhcHBlci5QYXN0ZUZyb21PZmZpY2UKXTsKbGV0IFBsdWdpbkRpY3QgPSB7fTsKCmZvciAobGV0IFBsdWdpbiBvZiBQbHVnaW5zKSB7CiAgICBQbHVnaW5EaWN0W1BsdWdpbi5wbHVnaW5OYW1lXSA9IFBsdWdpbjsKfQoKLyoqCiAqIGFkZCB0aGUgcGx1Z2luIG5hbWVzIGFuZCBvYmplY3RzIHRvIHRoZSBicm93c2VyJ3Mgd2luZG93IG9iamVjdAogKi8Kd2luZG93LkNLRWRpdG9yNVBsdWdpbnMgPSBQbHVnaW5EaWN0Owo=</File>
        <File Location="var/httpd/htdocs/js/Core.UI.RichTextEditor.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMjEtMjAyNCBabnVueSBHbWJILCBodHRwczovL3pudW55Lm9yZy8KLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwovLyAtLQovLyAkb3JpZ2luOiBvdG9ibyAtIGRhNWMzZGU3ZjI4YmZiNTFlMzFkMmNmNDUzZDI4NjU2MmYxZjFhNTQgLSB2YXIvaHR0cGQvaHRkb2NzL2pzL0NvcmUuVUkuUmljaFRleHRFZGl0b3IuanMKLy8gLS0KLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLy8gRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi8vIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgovLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQovLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5VSSA9IENvcmUuVUkgfHwge307CnZhciBDS0VkaXRvckluc3RhbmNlcyA9IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogKiBAbWVtYmVyb2YgQ29yZS5VSQogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFJpY2h0ZXh0IEVkaXRvci4KICovCkNvcmUuVUkuUmljaFRleHRFZGl0b3IgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgJEZvcm1JRAogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBtZW1iZXIge2pRdWVyeU9iamVjdH0KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBIaWRkZW4gaW5wdXQgZmllbGQgd2l0aCBuYW1lIEZvcm1JRC4KICAgICAqLwogICAgdmFyICRGb3JtSUQsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgVGltZU91dFJURU9uQ2hhbmdlCiAgICAgICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAgICAgKiBAbWVtYmVyIHtPYmplY3R9CiAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICogICAgICBPYmplY3QgdG8gaGFuZGxlIHRpbWVvdXQuCiAgICAgICAgICovCiAgICAgICAgVGltZU91dFJURU9uQ2hhbmdlOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENoZWNrRm9ybUlECiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7alF1ZXJ5T2JqZWN0fSBGb3JtSUQgZWxlbWVudC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWRpdG9yQXJlYSAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBlbGVtZW50IHRoYXQgaGFzIGJlY29tZSBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2hlY2sgaW4gdGhlIHdpbmRvdyB3aGljaCBoaWRkZW4gZWxlbWVudCBoYXMgYSBuYW1lIHNhbWUgdG8gJ0Zvcm1JRCcgYW5kIHJldHVybiBpdCBsaWtlIGEgSlF1ZXJ5IG9iamVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gQ2hlY2tGb3JtSUQoJEVkaXRvckFyZWEpIHsKICAgICAgICBpZiAodHlwZW9mICRGb3JtSUQgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICRGb3JtSUQgPSAkRWRpdG9yQXJlYS5jbG9zZXN0KCdmb3JtJykuZmluZCgnaW5wdXQ6aGlkZGVuW25hbWU9Rm9ybUlEXScpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJEZvcm1JRDsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRFZGl0b3IKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFZGl0b3JBcmVhIC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBhcHBsaWNhdGlvbiBhbmQgZXhlY3V0ZXMgdGhlIG5lZWRlZCBmdW5jdGlvbnMuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRFZGl0b3IgPSBmdW5jdGlvbiAoJEVkaXRvckFyZWEpIHsKICAgICAgICB2YXIgRWRpdG9ySUQgPSAnJywKICAgICAgICAgICAgVXNlckxhbmd1YWdlLAogICAgICAgICAgICBQbHVnaW5MaXN0ID0gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5QbHVnaW5zJyksCiAgICAgICAgICAgIEN1c3RvbWVySW50ZXJmYWNlID0gKENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbk5hbWUnKSA9PT0gQ29yZS5Db25maWcuR2V0KCdDdXN0b21lclBhbmVsU2Vzc2lvbk5hbWUnKSk7CgogICAgICAgIC8vIFRoZSBmb3JtYXQgZm9yIHRoZSBsYW5ndWFnZSBpcyBkaWZmZXJlbnQgYmV0d2VlbiBPVE9CTyBhbmQgQ0tFZGl0b3IgKHNlZSBidWcjODAyNCkKICAgICAgICAvLyBUbyBjb3JyZWN0IHRoaXMsIHdlIHJlcGxhY2UgIl8iIHdpdGggIi0iIGluIHRoZSBsYW5ndWFnZSAoZS5nLiB6aF9DTiBiZWNvbWVzIHpoLWNuKQogICAgICAgIFVzZXJMYW5ndWFnZSA9IENvcmUuQ29uZmlnLkdldCgnVXNlckxhbmd1YWdlJykucmVwbGFjZSgvXy8sICctJykudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgaWYgKCF3aW5kb3cuQ0tFZGl0b3I1V3JhcHBlcikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBpbnN0YW5jZSBpcyBhbHJlYWR5IGxvYWRlZAogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEuaGFzQ2xhc3MoJ0hhc0NLRUluc3RhbmNlJykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFZGl0b3JBcmVhKSAmJiAkRWRpdG9yQXJlYS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgRWRpdG9ySUQgPSAkRWRpdG9yQXJlYS5hdHRyKCdpZCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEVkaXRvcklEID09PSAnJykgewogICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5UaHJvdygnUmljaFRleHRFZGl0b3I6IE5lZWQgZXhhY3RseSBvbmUgRWRpdG9yQXJlYSEnLCAnVHlwZUVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBDb21tb24gZWRpdG9yIGxhYmVsCiAgICAgICAgLy8gIHVzZSB3aWxkY2FyZCB0byBpbmNsdWRlICJSaWNoVGV4dDxBY3Rpdml0eURpYWxvZ0lEPiIKICAgICAgICBjb25zdCBSaWNoVGV4dExhYmVsID0gJEVkaXRvckFyZWEucGFyZW50KCkuZmluZCgnbGFiZWxbZm9yXj0iUmljaFRleHQiXScpOwoKICAgICAgICB2YXIgVG9vbGJhckNvbmZpZzsKICAgICAgICBpZiAoIEN1c3RvbWVySW50ZXJmYWNlICkgewogICAgICAgICAgICBUb29sYmFyQ29uZmlnID0gLyokRWRpdG9yQXJlYS53aWR0aCgpIDwgNDU0ID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyTWluaScpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFZGl0b3JBcmVhLndpZHRoKCkgPCA2MjIgPyBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJNaWRpJykgOiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkubGVuZ3RoID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyJykgOiBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJXaXRob3V0SW1hZ2UnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFRvb2xiYXJDb25maWcgPSBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkubGVuZ3RoID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyJykgOiBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJXaXRob3V0SW1hZ2UnKTsKICAgICAgICB9CgogICAgICAgIHZhciBJbnRlZ3JhdGlvbnM7CiAgICAgICAgdmFyIHJlbW92ZWRQbHVnaW5zID0gW107CiAgICAgICAgdmFyIEJsb2NrUGFzdGVJbWcgPSBmYWxzZTsKCiAgICAgICAgLy9FbmFibGUgcGljdHVyZSB1cGxvYWQgd2hlbiBGb3JtSUQgaXMgcHJlc2VudAogICAgICAgIC8vSWYgbm90LCBsb2FkIG9ubHkgdGhlIHVybCB0byBpbWFnZSBmdW5jdGlvbgogICAgICAgIGlmICggQ2hlY2tGb3JtSUQoJEVkaXRvckFyZWEpLmxlbmd0aCApIHsKICAgICAgICAgICAgSW50ZWdyYXRpb25zID0gWyAndXBsb2FkJywgJ3VybCcgXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBJbnRlZ3JhdGlvbnMgPSBbICd1cmwnIF07CiAgICAgICAgICAgIEJsb2NrUGFzdGVJbWcgPSB0cnVlOwogICAgICAgICAgICByZW1vdmVkUGx1Z2lucyA9IFsgJ1NpbXBsZVVwbG9hZEFkYXB0ZXInIF07CiAgICAgICAgfQoKLy8gUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24KICAgICAgICB2YXIgZXh0cmFQbHVnaW5zID0gW107CiAgICAgICAgdmFyIG1lbnRpb25zQ29uZmlnID0ge307CgogICAgICAgIGlmICggL0FnZW50RkFRLy50ZXN0KENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykpID09IHRydWUgCiAgICAgICAgICAgICAgICB8fCAvQ3VzdG9tZXJGQVEvLnRlc3QoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSkgPT0gdHJ1ZQogICAgICAgICAgICAgICAgICB8fCAvUHVibGljRkFRLy50ZXN0KENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykpICA9PSB0cnVlICkgewogICAgICAgICAgICBleHRyYVBsdWdpbnMgPSBbIE1lbnRpb25DdXN0b21pemF0aW9uIF07CgogICAgICAgICAgICBtZW50aW9uc0NvbmZpZyA9IHsgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZlZWRzOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXI6ICcjJywKICAgICAgICAgICAgICAgICAgICAgICAgZmVlZDogRkFRLkV4dGVuZGVkTmF2aWdhdGlvbi5GQVEuZ2V0RkFRQXJ0aWNsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1DaGFyYWN0ZXJzOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtUmVuZGVyZXI6IChpdGVtKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSBtYXJrZXIgZnJvbSBpdGVtIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUVsZW1lbnQudGV4dENvbnRlbnQgPSBpdGVtLnRleHQ7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1FbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9OwogICAgICAgIH0KLy8gRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgUmljaFRleHQgREYsIGRpc2FibGUgSW1hZ2UgVXBsb2FkCiAgICAgICAgaWYoJEVkaXRvckFyZWEuaGFzQ2xhc3MoJ0R5bmFtaWNGaWVsZFJpY2hUZXh0JykpIHsKICAgICAgICAgICAgVG9vbGJhckNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuVG9vbGJhcldpdGhvdXRJbWFnZScpOwogICAgICAgICAgICBJbnRlZ3JhdGlvbnMgPSBbICd1cmwnIF07CiAgICAgICAgICAgIHJlbW92ZWRQbHVnaW5zID0gWyAnU2ltcGxlVXBsb2FkQWRhcHRlcicgXTsKICAgICAgICB9CgogICAgICAgIHZhciBDbGFzc2ljRWRpdG9yID0gQ0tFZGl0b3I1V3JhcHBlci5DbGFzc2ljRWRpdG9yOwogICAgICAgIGxldCBFbmFibGVkUGx1Z2lucyA9IFtdOwogICAgICAgIGZvciAobGV0IHBsdWdpbk5hbWUgb2YgUGx1Z2luTGlzdCkgewogICAgICAgICAgICBsZXQgUGx1Z2luID0gQ0tFZGl0b3I1UGx1Z2luc1twbHVnaW5OYW1lXTsKICAgICAgICAgICAgaWYgKFBsdWdpbikgewogICAgICAgICAgICAgICAgRW5hYmxlZFBsdWdpbnMucHVzaChDS0VkaXRvcjVQbHVnaW5zW3BsdWdpbk5hbWVdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIENvcmUuRXhjZXB0aW9uLlNob3dFcnJvcignQ291bGRuXCd0IGZpbmQgcGx1Z2luOiAnICsgcGx1Z2luTmFtZSwgJ0phdmFTY3JpcHRFcnJvcicpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBDbGFzc2ljRWRpdG9yLmNyZWF0ZSgkKCRFZGl0b3JBcmVhKS5nZXQoMCksIHsKICAgICAgICAgICAgbGljZW5zZUtleTogJ0dQTCcsCiAgICAgICAgICAgIHVpOiB7CiAgICAgICAgICAgICAgICBwb3dlcmVkQnk6IHsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2luc2lkZScsCiAgICAgICAgICAgICAgICAgICAgc2lkZTogJ3JpZ2h0JywKICAgICAgICAgICAgICAgICAgICBsYWJlbDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBmb3JjZVZpc2libGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IDIsCiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldDogMgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBoZWFkaW5nOiB7CiAgICAgICAgICAgICAgICBvcHRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ3BhcmFncmFwaCcsIHRpdGxlOiAnUGFyYWdyYXBoJywgY2xhc3M6ICdjay1oZWFkaW5nX3BhcmFncmFwaCcgfSwKICAgICAgICAgICAgICAgICAgICB7IG1vZGVsOiAnaGVhZGluZzEnLCB2aWV3OiAnaDEnLCB0aXRsZTogJ0hlYWRpbmcgMScsIGNsYXNzOiAnY2staGVhZGluZ19oZWFkaW5nMScgfSwKICAgICAgICAgICAgICAgICAgICB7IG1vZGVsOiAnaGVhZGluZzInLCB2aWV3OiAnaDInLCB0aXRsZTogJ0hlYWRpbmcgMicsIGNsYXNzOiAnY2staGVhZGluZ19oZWFkaW5nMicgfSwKICAgICAgICAgICAgICAgICAgICB7IG1vZGVsOiAnaGVhZGluZzMnLCB2aWV3OiAnaDMnLCB0aXRsZTogJ0hlYWRpbmcgMycsIGNsYXNzOiAnY2staGVhZGluZ19oZWFkaW5nMycgfSwKICAgICAgICAgICAgICAgICAgICB7IG1vZGVsOiAnaGVhZGluZzQnLCB2aWV3OiAnaDQnLCB0aXRsZTogJ0hlYWRpbmcgNCcsIGNsYXNzOiAnY2staGVhZGluZ19oZWFkaW5nNCcgfSwKICAgICAgICAgICAgICAgICAgICB7IG1vZGVsOiAnaGVhZGluZzUnLCB2aWV3OiAnaDUnLCB0aXRsZTogJ0hlYWRpbmcgNScsIGNsYXNzOiAnY2staGVhZGluZ19oZWFkaW5nNScgfSwKICAgICAgICAgICAgICAgICAgICB7IG1vZGVsOiAnaGVhZGluZzYnLCB2aWV3OiAnaDYnLCB0aXRsZTogJ0hlYWRpbmcgNicsIGNsYXNzOiAnY2staGVhZGluZ19oZWFkaW5nNicgfSwKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZm9udFNpemU6IHsKICAgICAgICAgICAgICAgIG9wdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdCcsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzMAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIHN1cHBvcnRBbGxWYWx1ZXM6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZm9udEZhbWlseTogewogICAgICAgICAgICAgICAgc3VwcG9ydEFsbFZhbHVlczogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICB0b29sYmFyOiB7CiAgICAgICAgICAgICAgICBzaG91bGROb3RHcm91cFdoZW5GdWxsOiB0cnVlLAogICAgICAgICAgICAgICAgaXRlbXM6IFRvb2xiYXJDb25maWcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcGx1Z2luczogRW5hYmxlZFBsdWdpbnMsCiAgICAgICAgICAgIHJlbW92ZVBsdWdpbnM6IHJlbW92ZWRQbHVnaW5zLAovLyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICBleHRyYVBsdWdpbnM6IGV4dHJhUGx1Z2lucywKLy8gRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICBsYW5ndWFnZTogewogICAgICAgICAgICAgICAgdWk6IFVzZXJMYW5ndWFnZSwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFVzZXJMYW5ndWFnZQogICAgICAgICAgICB9LAogICAgICAgICAgICBodG1sU3VwcG9ydDogewogICAgICAgICAgICAgICAgYWxsb3c6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzcGFuJywKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjaXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzdHlsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIGRpc2FsbG93OiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAvKGFic29sdXRlfHN0aWNreXxmaXhlZCkkLwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICBpbWFnZTogewogICAgICAgICAgICAgICAgcmVzaXplVW5pdDogJ3B4JywKICAgICAgICAgICAgICAgIHJlc2l6ZU9wdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZTpvcmlnaW5hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnT3JpZ2luYWwgSW1hZ2UgU2l6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnb3JpZ2luYWwnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZTpjdXN0b20nLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1NjYWxlIEltYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdjdXN0b20nLAogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnY3VzdG9tJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBzdHlsZXM6IHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICdhbGlnbkxlZnQnLCAnYWxpZ25DZW50ZXInLCAnYWxpZ25SaWdodCcsICdhbGlnbkJsb2NrUmlnaHQnLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYWxpZ25CbG9ja0xlZnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0OiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdG9vbGJhcjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2ltYWdlU3R5bGU6aW1hZ2VQb3NpdGlvbmluZ0Ryb3Bkb3duJywKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdJbWFnZSBQb3NpdGlvbmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1hZ2VTdHlsZTphbGlnbkxlZnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlU3R5bGU6YWxpZ25DZW50ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlU3R5bGU6YWxpZ25SaWdodCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1hZ2VTdHlsZTphbGlnbkJsb2NrTGVmdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1hZ2VTdHlsZTphbGlnbkJsb2NrUmlnaHQnCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRJdGVtOiAnaW1hZ2VTdHlsZTphbGlnbkJsb2NrTGVmdCcKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdyZXNpemVJbWFnZScKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBpbnNlcnQ6IHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnSW1hZ2VCbG9jaycsCiAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRpb25zOiBJbnRlZ3JhdGlvbnMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGFibGU6IHsKICAgICAgICAgICAgICAgIHRhYmxlQ2VsbFByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiAndG9wJywKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGFibGVQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiAnY2VudGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb250ZW50VG9vbGJhcjogWwogICAgICAgICAgICAgICAgICAgICd0YWJsZUNvbHVtbicsICd0YWJsZVJvdycsICdtZXJnZVRhYmxlQ2VsbHMnLCAndGFibGVQcm9wZXJ0aWVzJywgJ3RhYmxlQ2VsbFByb3BlcnRpZXMnCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNpbXBsZVVwbG9hZDogewogICAgICAgICAgICAgICAgLy8gYnVpbGQgVVJMIGZvciBpbWFnZSB1cGxvYWQKICAgICAgICAgICAgICAgIHVwbG9hZFVybDogQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpCiAgICAgICAgICAgICAgICAgICAgKyAnQWN0aW9uPScKICAgICAgICAgICAgICAgICAgICArIENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuUGljdHVyZVVwbG9hZEFjdGlvbicsICdQaWN0dXJlVXBsb2FkJykKICAgICAgICAgICAgICAgICAgICArICcmRm9ybUlEPScKICAgICAgICAgICAgICAgICAgICArIENoZWNrRm9ybUlEKCRFZGl0b3JBcmVhKS52YWwoKQogICAgICAgICAgICAgICAgICAgICsgJyYnICsgQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uTmFtZScpCiAgICAgICAgICAgICAgICAgICAgKyAnPScgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRCcpLAoKICAgICAgICAgICAgICAgIC8vIEVuYWJsZSB0aGUgWE1MSHR0cFJlcXVlc3Qud2l0aENyZWRlbnRpYWxzIHByb3BlcnR5LgogICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSwKCiAgICAgICAgICAgICAgICAvLyBIZWFkZXJzIHNlbnQgYWxvbmcgd2l0aCB0aGUgWE1MSHR0cFJlcXVlc3QgdG8gdGhlIHVwbG9hZCBzZXJ2ZXIuCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICBmb250Q29sb3I6IHsKICAgICAgICAgICAgICAgIGNvbG9yczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMDAwMDAwJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdCbGFjaycKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGQ0ZDRkJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdEaW0gZ3JleScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjOTk5OTk5JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdHcmV5JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNmU2ZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0xpZ2h0IGdyZXknCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnV2hpdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBoYXNCb3JkZXI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZTY0YzRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdSZWQnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2U2OTk0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnT3JhbmdlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNmU2NGMnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1llbGxvdycKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjOTllNjRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMaWdodCBncmVlbicKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGNlNjRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdHcmVlbicKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGNlNjk5JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBcXVhbWFyaW5lJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0Y2U2ZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1R1cnF1b2lzZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGM5OWU2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMaWdodCBibHVlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0YzRjZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JsdWUnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzk5NGNlNicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUHVycGxlJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBjb2xvclBpY2tlcjogewogICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ2hleCcKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZm9udEJhY2tncm91bmRDb2xvcjogewogICAgICAgICAgICAgICAgY29sb3JzOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyMwMDAwMDAnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JsYWNrJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0ZDRkNGQnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0RpbSBncmV5JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM5OTk5OTknLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0dyZXknCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2U2ZTZlNicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTGlnaHQgZ3JleScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZmZmZmZmJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdXaGl0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JvcmRlcjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNjRjNGMnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JlZCcKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZTY5OTRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdPcmFuZ2UnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2U2ZTY0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnWWVsbG93JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM5OWU2NGMnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0xpZ2h0IGdyZWVuJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0Y2U2NGMnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0dyZWVuJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0Y2U2OTknLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0FxdWFtYXJpbmUnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRjZTZlNicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVHVycXVvaXNlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0Yzk5ZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0xpZ2h0IGJsdWUnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRjNGNlNicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQmx1ZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjOTk0Y2U2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQdXJwbGUnCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIGNvbG9yUGlja2VyOiB7CiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnaGV4JwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAovLyBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICBtZW50aW9uOiBtZW50aW9uc0NvbmZpZywKLy8gRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgogICAgICAgICAgICB0cmFuc2xhdGlvbnM6IFsKICAgICAgICAgICAgICAgIENLRWRpdG9yNUNvcmVUcmFuc2xhdGlvbnMsCiAgICAgICAgICAgIF0KICAgICAgICB9KQogICAgICAgICAgICAudGhlbihlZGl0b3IgPT4gewogICAgICAgICAgICAgICAgLyogR2VuZXJhdGUgSUQgZm9yIGN1cnJlbnQgRWRpdG9yICovCiAgICAgICAgICAgICAgICBlZGl0b3IuRWxlbWVudElkID0gRWRpdG9ySUQ7CiAgICAgICAgICAgICAgICBDS0VkaXRvckluc3RhbmNlc1skRWRpdG9yQXJlYS5hdHRyKCdpZCcpXSA9IGVkaXRvcjsKCiAgICAgICAgICAgICAgICB3aW5kb3cuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgIC8qIGNvbmZpZ3VyZSBwZXJtaXNzYWJsZSBodG1sIHRhZ3MgKi8KICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuZWRpdG9yLnBsdWdpbnMuaGFzKCJEYXRhRmlsdGVyIikpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YUZpbHRlciA9IHdpbmRvdy5lZGl0b3IucGx1Z2lucy5nZXQoIkRhdGFGaWx0ZXIiKTsKICAgICAgICAgICAgICAgICAgICBkYXRhRmlsdGVyLmFsbG93RWxlbWVudCggInN0eWxlIiApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIFNldCBDb250YWluZXIgc2l6ZSAqLwogICAgICAgICAgICAgICAgdmFyICRkb21FZGl0YWJsZUVsZW1lbnQgPSAkKCRFZGl0b3JBcmVhKS5jbG9zZXN0KCIuUmljaFRleHRGaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vVHJ5IHVzZSBSaWNoVGV4dEhvbGRlciBmb3IgQ3VzdG9tZXIgSW50ZXJmYWNlCiAgICAgICAgICAgICAgICBpZiAoQ3VzdG9tZXJJbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICAgICAkZG9tRWRpdGFibGVFbGVtZW50ID0gJCgkRWRpdG9yQXJlYSkuY2xvc2VzdCgiLlJpY2hUZXh0SG9sZGVyIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9TZXQgdG8gUmVhZG9ubHkgbW9kZSBpZiByZXF1aXJlZAogICAgICAgICAgICAgICAgaWYgKCRFZGl0b3JBcmVhLmhhc0NsYXNzKCdSZWFkb25seScpKSB7CiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmVuYWJsZVJlYWRPbmx5TW9kZSgnREZfUmVhZG9ubHknKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgc291cmNlRWRpdGluZ0FjdGl2ZSA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICRkb21FZGl0YWJsZUVsZW1lbnQucmVzaXphYmxlKCk7CiAgICAgICAgICAgICAgICAkZG9tRWRpdGFibGVFbGVtZW50LnJlc2l6YWJsZSgib3B0aW9uIiwgImhhbmRsZXMiLCAicyIpOwogICAgICAgICAgICAgICAgJCgiLnVpLXJlc2l6YWJsZS1zIiwgJGRvbUVkaXRhYmxlRWxlbWVudCkuYXBwZW5kKCI8aSBjbGFzcz0nb29vZm8gb29vZm8tbW9yZV9oJz48L2k+Iik7CgogICAgICAgICAgICAgICAgJGRvbUVkaXRhYmxlRWxlbWVudC5vbigncmVzaXplJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0RWRpdG9yU2l6ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gQWRqdXN0IEVkaXRvciBTaXplIHRvIG1hdGNoIChyZXNpemFibGUpIGNvbnRhaW5lciBzaXplCiAgICAgICAgICAgICAgICB2YXIgYWRqdXN0RWRpdG9yU2l6ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGxldCB0b29sYmFySGVpZ2h0ID0gJGRvbUVkaXRhYmxlRWxlbWVudC5maW5kKCcuY2stZWRpdG9yX190b3AnKS5vdXRlckhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGxldCBmaWVsZFBhZGRpbmcgPSBwYXJzZUZsb2F0KCRkb21FZGl0YWJsZUVsZW1lbnQuY3NzKCJwYWRkaW5nLXRvcCIpKQogICAgICAgICAgICAgICAgICAgICAgICArIHBhcnNlRmxvYXQoJGRvbUVkaXRhYmxlRWxlbWVudC5jc3MoInBhZGRpbmctYm90dG9tIikpOwogICAgICAgICAgICAgICAgICAgIGxldCBuZXdFZGl0b3JTaXplID0gJGRvbUVkaXRhYmxlRWxlbWVudC5pbm5lckhlaWdodCgpIC0gZmllbGRQYWRkaW5nOwogICAgICAgICAgICAgICAgICAgIGxldCAkZWRpdGluZ0FyZWEgPSAkZG9tRWRpdGFibGVFbGVtZW50LmZpbmQoJy5jay1jb250ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUVkaXRpbmdBY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGVkaXRpbmdBcmVhID0gJGRvbUVkaXRhYmxlRWxlbWVudC5maW5kKCcuY2stc291cmNlLWVkaXRpbmctYXJlYScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZXQgdmVydGljYWxQYWRkaW5nID0gcGFyc2VGbG9hdCgkZWRpdGluZ0FyZWEuY3NzKCJwYWRkaW5nLXRvcCIpKSArIHBhcnNlRmxvYXQoJGVkaXRpbmdBcmVhLmNzcygicGFkZGluZy1ib3R0b20iKSk7CiAgICAgICAgICAgICAgICAgICAgbGV0IGJvcmRlcldpZHRoID0gcGFyc2VGbG9hdCgkZWRpdGluZ0FyZWEuY3NzKCJib3JkZXItdG9wIikpICsgcGFyc2VGbG9hdCgkZWRpdGluZ0FyZWEuY3NzKCJib3JkZXItYm90dG9tIikpOwogICAgICAgICAgICAgICAgICAgIGxldCBuZXdTaXplID0gbmV3RWRpdG9yU2l6ZSAtICh0b29sYmFySGVpZ2h0ICsgdmVydGljYWxQYWRkaW5nKQogICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VFZGl0aW5nQWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRlZGl0aW5nQXJlYS5oZWlnaHQobmV3U2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5lZGl0aW5nLnZpZXcuZm9yY2VSZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdTaXplIC09IGJvcmRlcldpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZWRpdGluZy52aWV3LmNoYW5nZSh3cml0ZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnNldFN0eWxlKCdoZWlnaHQnLCBuZXdTaXplICsgJ3B4JywgZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudC5nZXRSb290KCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vcmVzaXplIGVkaXRvciBvbiBtb2RlIGNoYW5nZQogICAgICAgICAgICAgICAgaWYgKCBlZGl0b3IucGx1Z2lucy5oYXMoICdTb3VyY2VFZGl0aW5nJyApICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUVkaXRpbmcgPSBlZGl0b3IucGx1Z2lucy5nZXQoICdTb3VyY2VFZGl0aW5nJyApOwoKICAgICAgICAgICAgICAgICAgICBlZGl0b3IubGlzdGVuVG8oIHNvdXJjZUVkaXRpbmcsICdjaGFuZ2U6aXNTb3VyY2VFZGl0aW5nTW9kZScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRWRpdGluZ0FjdGl2ZSA9IHNvdXJjZUVkaXRpbmcuaXNTb3VyY2VFZGl0aW5nTW9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0RWRpdG9yU2l6ZSgpOwogICAgICAgICAgICAgICAgICAgIH0gKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGVkaXRvciByZXNpemUgdG8gY29udGFpbmVyKCRkb21FZGl0YWJsZUVsZW1lbnQpIHNpemUgY2hhbmdlCiAgICAgICAgICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0RWRpdG9yU2l6ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKCRkb21FZGl0YWJsZUVsZW1lbnQuZmlyc3QoKS5nZXQoMCkpOwoKICAgICAgICAgICAgICAgIC8vIHNldCBjb3JyZWN0IG1pbi1oZWlnaHQgZm9yIGN1c3RvbWVyIGludGVyZmFjZSB0byBwcmV2ZW50IG92ZXJsYXBwaW5nCiAgICAgICAgICAgICAgICBpZiAoQ3VzdG9tZXJJbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sYmFyUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9vbGJhckhlaWdodCA9ICRkb21FZGl0YWJsZUVsZW1lbnQuZmluZCgnLmNrLWVkaXRvcl9fdG9wJykub3V0ZXJIZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBNaW5IZWlnaHQgPSB0b29sYmFySGVpZ2h0ICsgMTAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkb21FZGl0YWJsZUVsZW1lbnQuY3NzKCdtaW4taGVpZ2h0JywgTWluSGVpZ2h0ICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdG9vbGJhclJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWRpdG9yLnVpLnZpZXcudG9vbGJhci5lbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy9tYWtlIHN1cmUgZWRpdG9yIHNpemUgaXMgYWRqdXN0ZWQgd2hlbmV2ZXIgdGhlIHRvb2xiYXIgY2hhbmdlcyBzaXplCiAgICAgICAgICAgICAgICAvL290aGVyd2lzZSBlZGl0b3Igc2l6ZSBjYW4gYmVoYXZlIHdlaXJkbHkgcmlnaHQgYWZ0ZXIgbG9hZGluZyBwYWdlCiAgICAgICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVkaXRvci51aS52aWV3LnRvb2xiYXIuZWxlbWVudCk7CgogICAgICAgICAgICAgICAgaWYgKEN1c3RvbWVySW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudC5nZXRSb290KCdtYWluJykucGxhY2Vob2xkZXIgPSBSaWNoVGV4dExhYmVsWzBdLmlubmVyVGV4dDsKICAgICAgICAgICAgICAgICAgICBSaWNoVGV4dExhYmVsLmhpZGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLyogU2V0IGVkaXRpbmcgYXJlYSB3aWR0aCBmb3IgQ3VzdG9tZXIgKi8KICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZWRpdGluZy52aWV3LmNoYW5nZSh3cml0ZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0U3R5bGUoJ21heC13aWR0aCcsICcxMDAlJywgZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudC5nZXRSb290KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vQmxvY2sgcGFzdGluZyBpbWFnZXMgZm9yIFRvb2xiYXJXaXRob3V0SW1hZ2UKICAgICAgICAgICAgICAgIGVkaXRvci5lZGl0aW5nLnZpZXcuZG9jdW1lbnQub24oICdjbGlwYm9hcmRJbnB1dCcsICggZXZ0LCBkYXRhICkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFUcmFuc2ZlciA9IGRhdGEuZGF0YVRyYW5zZmVyOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGFUcmFuc2Zlci5fZmlsZXMubGVuZ3RoID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VOYW1lID0gZGF0YVRyYW5zZmVyLl9maWxlc1swXS5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAvXC4oanBlP2d8cG5nfGdpZnxibXApJC9pLnRlc3QoaW1hZ2VOYW1lKSAmJiBCbG9ja1Bhc3RlSW1nICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghQ3VzdG9tZXJJbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaW5pdGlhbCAobWF4aW11bSkgRWRpdG9yIHNpemUgYXMgZGVmaW5lZCBieSBTeXN0ZW0gQ29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgIGxldCBFZGl0b3JXaWR0aCA9IE51bWJlciggQ29yZS5Db25maWcuR2V0KCJSaWNoVGV4dC5XaWR0aCIsIDYyMCkgKTsKCiAgICAgICAgICAgICAgICAgICAgJGRvbUVkaXRhYmxlRWxlbWVudC5jc3MoImhlaWdodCIsIENvcmUuQ29uZmlnLkdldCgiUmljaFRleHQuSGVpZ2h0IiwgMzIwKSk7CiAgICAgICAgICAgICAgICAgICAgJGRvbUVkaXRhYmxlRWxlbWVudC5jaGlsZHJlbigpLmNzcygibWF4LXdpZHRoIiwgRWRpdG9yV2lkdGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIENvcmUuQXBwLlB1Ymxpc2goJ0V2ZW50LlVJLlJpY2hUZXh0RWRpdG9yLkluc3RhbmNlQ3JlYXRlZCcsIFtlZGl0b3JdKTsKCiAgICAgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBja2VkaXRvciBub3QgdXNpbmcgZGF0YSBmaWx0ZXIgY29ycmVjdGx5IG9uIHByZS1maWxsZWQgY29udGVudAogICAgICAgICAgICAgICAgaWYgKGVkaXRvci5FbGVtZW50SWQgPT0gJ1JpY2hUZXh0JykgewogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZXREYXRhKGVkaXRvci5zb3VyY2VFbGVtZW50LmlubmVyVGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9VcGRhdGUgdmFsaWRhdGlvbiBlcnJvciB0b29sdGlwIHdoaWxlIGNvbnRlbnQgaXMgYWRkZWQgdG8gdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgZWRpdG9yLm1vZGVsLmRvY3VtZW50Lm9uKCdjaGFuZ2U6ZGF0YScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KFRpbWVPdXRSVEVPbkNoYW5nZSk7CiAgICAgICAgICAgICAgICAgICAgVGltZU91dFJURU9uQ2hhbmdlID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgRWRpdG9yQXJlYUNvbnRlbnQgPSBlZGl0b3IuZ2V0RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoRWRpdG9yQXJlYUNvbnRlbnQgIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiMiICsgZWRpdG9yLkVsZW1lbnRJZCkudmFsKEVkaXRvckFyZWFDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuVmFsaWRhdGVFbGVtZW50KCRFZGl0b3JBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BcHAuUHVibGlzaCgnRXZlbnQuVUkuUmljaFRleHRFZGl0b3IuQ2hhbmdlVmFsaWRhdGlvbkNvbXBsZXRlJywgW2VkaXRvcl0pOwogICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBlZGl0b3IudWkuZm9jdXNUcmFja2VyLm9uKCdjaGFuZ2U6aXNGb2N1c2VkJywgKF9ldnQsIF9uYW1lLCBpc0ZvY3VzZWQpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCIjIiArICRFZGl0b3JBcmVhLmF0dHIoJ2lkJykpLnZhbChlZGl0b3IuZ2V0RGF0YSgpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5WYWxpZGF0ZUVsZW1lbnQoJEVkaXRvckFyZWEpOwogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkZvcm0uRXJyb3JUb29sdGlwcy5SZW1vdmVSVEVUb29sdGlwKCRFZGl0b3JBcmVhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIC8vIG1hcmsgdGhlIGVkaXRvciB0ZXh0YXJlYSBhcyBsaW5rZWQgd2l0aCBhbiBSVEUgaW5zdGFuY2UgdG8gYXZvaWQgbXVsdGlwbGUgaW5zdGFuY2VzCiAgICAgICAgJEVkaXRvckFyZWEuYWRkQ2xhc3MoJ0hhc0NLRUluc3RhbmNlJyk7CgogICAgICAgIC8vUmVtb3ZlIHZhbGlkYXRpb24gZm9yIHVuZGVmaW5lZCBlbGVtZW50cyBvbiBDS0VkaXRvciAoSlF1ZXJ5IHZhbGlkYXRlIHBsdWdpbiBleGNlcHRpb24pCiAgICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKCdmb3JtJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5kYXRhKCd2YWxpZGF0b3InKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBFeGlzdGluZ0lnbm9yZXMgPSAoICQodGhpcykuZGF0YSgndmFsaWRhdG9yJykuc2V0dGluZ3MuaWdub3JlIHx8ICcnICkuc3BsaXQoJywgJyk7CiAgICAgICAgICAgICAgICAgICAgWyIuY2siLCAiLmNrLWVkaXRvcl9fZWRpdGFibGUiLCAiLmNrLWNvbnRlbnQiXS5mb3JFYWNoKGZ1bmN0aW9uKEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBFeGlzdGluZ0lnbm9yZXMuaW5kZXhPZihFbGVtZW50KSA9PSAtMSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXN0aW5nSWdub3Jlcy5wdXNoKEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCd2YWxpZGF0b3InKS5zZXR0aW5ncy5pZ25vcmUgPSBFeGlzdGluZ0lnbm9yZXMuam9pbigiLCAiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfTsKCi8vIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uCiAgICAgLyoqCiAgICAgKiBAbmFtZSBNZW50aW9uQ3VzdG9taXphdGlvbgogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgcmVuZGVyZWQgaXRlbSBpbnRvIGEgRkFRIGFydGljbGUgbGluay4KICAgICAqLwogICAgZnVuY3Rpb24gTWVudGlvbkN1c3RvbWl6YXRpb24oIGVkaXRvciApIHsKICAgICAgICAvLyBUaGUgdXBjYXN0IGNvbnZlcnRlciB3aWxsIGNvbnZlcnQgdmlldyA8YSBjbGFzcz0ibWVudGlvbiIgaHJlZj0iIiBkYXRhLWl0ZW0taWQ9IiI+CiAgICAgICAgLy8gZWxlbWVudHMgdG8gdGhlIG1vZGVsICdtZW50aW9uJyB0ZXh0IGF0dHJpYnV0ZS4KICAgICAgICBlZGl0b3IuY29udmVyc2lvbi5mb3IoICd1cGNhc3QnICkuZWxlbWVudFRvQXR0cmlidXRlKCB7CiAgICAgICAgICAgIHZpZXc6IHsKICAgICAgICAgICAgICAgIG5hbWU6ICdhJywKICAgICAgICAgICAgICAgIGtleTogJ2RhdGEtbWVudGlvbicsCiAgICAgICAgICAgICAgICBjbGFzc2VzOiAnbWVudGlvbicsCiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICAgICAgICAgaHJlZjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAnZGF0YS1pdGVtLWlkJzogdHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBtb2RlbDogewogICAgICAgICAgICAgICAga2V5OiAnbWVudGlvbicsCiAgICAgICAgICAgICAgICB2YWx1ZTogdmlld0l0ZW0gPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBtZW50aW9uIGZlYXR1cmUgZXhwZWN0cyB0aGF0IHRoZSBtZW50aW9uIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtb2RlbCBpcyBhIHBsYWluIG9iamVjdCB3aXRoIGEgc2V0IG9mIGFkZGl0aW9uYWwgYXR0cmlidXRlcy4KICAgICAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBjcmVhdGUgYSBwcm9wZXIgb2JqZWN0IHVzZSB0aGUgdG9NZW50aW9uQXR0cmlidXRlKCkgaGVscGVyIG1ldGhvZDoKICAgICAgICAgICAgICAgICAgICBjb25zdCBtZW50aW9uQXR0cmlidXRlID0gZWRpdG9yLnBsdWdpbnMuZ2V0KCAnTWVudGlvbicgKS50b01lbnRpb25BdHRyaWJ1dGUoIHZpZXdJdGVtLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBhbnkgb3RoZXIgcHJvcGVydGllcyB0aGF0IHlvdSBuZWVkLgogICAgICAgICAgICAgICAgICAgICAgICBsaW5rOiB2aWV3SXRlbS5nZXRBdHRyaWJ1dGUoICdocmVmJyApLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtX2lkOiB2aWV3SXRlbS5nZXRBdHRyaWJ1dGUoICdkYXRhLWl0ZW0taWQnICkKICAgICAgICAgICAgICAgICAgICB9ICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW50aW9uQXR0cmlidXRlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBjb252ZXJ0ZXJQcmlvcml0eTogJ2hpZ2gnCiAgICAgICAgfSApOwoKICAgICAgICAvLyBEb3duY2FzdCB0aGUgbW9kZWwgJ21lbnRpb24nIHRleHQgYXR0cmlidXRlIHRvIGEgdmlldyA8YT4gZWxlbWVudC4KICAgICAgICBlZGl0b3IuY29udmVyc2lvbi5mb3IoICdkb3duY2FzdCcgKS5hdHRyaWJ1dGVUb0VsZW1lbnQoIHsKICAgICAgICAgICAgbW9kZWw6ICdtZW50aW9uJywKICAgICAgICAgICAgdmlldzogKCBtb2RlbEF0dHJpYnV0ZVZhbHVlLCB7IHdyaXRlciB9ICkgPT4gewogICAgICAgICAgICAgICAgLy8gRG8gbm90IGNvbnZlcnQgZW1wdHkgYXR0cmlidXRlcyAobGFjayBvZiB2YWx1ZSBtZWFucyBubyBtZW50aW9uKS4KICAgICAgICAgICAgICAgIGlmICggIW1vZGVsQXR0cmlidXRlVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB3cml0ZXIuY3JlYXRlQXR0cmlidXRlRWxlbWVudCggJ2EnLCB7CiAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdtZW50aW9uJywKICAgICAgICAgICAgICAgICAgICAnZGF0YS1tZW50aW9uJzogbW9kZWxBdHRyaWJ1dGVWYWx1ZS50ZXh0LAogICAgICAgICAgICAgICAgICAgICdkYXRhLWl0ZW0taWQnOiBtb2RlbEF0dHJpYnV0ZVZhbHVlLml0ZW1faWQsCiAgICAgICAgICAgICAgICAgICAgJ2hyZWYnOiBtb2RlbEF0dHJpYnV0ZVZhbHVlLmxpbmsKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIG1lbnRpb24gYXR0cmlidXRlIHRvIGJlIHdyYXBwZWQgYnkgb3RoZXIgYXR0cmlidXRlIGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiAyMCwKICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG1lcmdpbmcgbWVudGlvbnMgdG9nZXRoZXIuCiAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZGVsQXR0cmlidXRlVmFsdWUudWlkCiAgICAgICAgICAgICAgICB9ICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNvbnZlcnRlclByaW9yaXR5OiAnaGlnaCcKICAgICAgICB9ICk7CiAgICB9ICAKLy8gRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbgoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdEFsbEVkaXRvcnMKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGFzIGEgcmljaCB0ZXh0IGVkaXRvciBldmVyeSB0ZXh0YXJlYSBlbGVtZW50IHRoYXQgY29udGFpbmluZyB0aGUgUmljaFRleHQgY2xhc3MuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRBbGxFZGl0b3JzID0gZnVuY3Rpb24gKCkgewoKICAgICAgICBpZiAoIXdpbmRvdy5DS0VkaXRvcjVXcmFwcGVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICQoJ3RleHRhcmVhLlJpY2hUZXh0JykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIFRhcmdldE5TLkluaXRFZGl0b3IoJCh0aGlzKSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgSlMgZnVuY3Rpb25hbGl0eS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgaWYgKCF3aW5kb3cuQ0tFZGl0b3I1V3JhcHBlciB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09ICdBZG1pbkdlbmVyaWNJbnRlcmZhY2VNYXBwaW5nWFNMVCcpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIEN1c3RvbWVySW50ZXJmYWNlID0gKENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbk5hbWUnKSA9PT0gQ29yZS5Db25maWcuR2V0KCdDdXN0b21lclBhbmVsU2Vzc2lvbk5hbWUnKSk7CgogICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgKyBDb3JlLkNvbmZpZy5HZXQoJ1dlYlBhdGgnKSArIENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuRWRpdG9yU3R5bGVzUGF0aCcpICsgJyI+Jyk7CiAgICAgICAgJCgiaGVhZCIpLmFwcGVuZCgnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyArIENvcmUuQ29uZmlnLkdldCgnV2ViUGF0aCcpICsgQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Db250ZW50U3R5bGVzUGF0aCcpICsgJyI+Jyk7CiAgICAgICAgaWYgKEN1c3RvbWVySW50ZXJmYWNlKSB7CiAgICAgICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgKyBDb3JlLkNvbmZpZy5HZXQoJ1dlYlBhdGgnKSArICcvc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvQ0tFZGl0b3JDdXN0b21TdHlsZXMuY3NzIj4nKTsKICAgICAgICAgICAgJCgiaGVhZCIpLmFwcGVuZCgnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyArIENvcmUuQ29uZmlnLkdldCgnV2ViUGF0aCcpICsgJy9za2lucy9DdXN0b21lci9kZWZhdWx0L2Nzcy9SaWNoVGV4dEFydGljbGVDb250ZW50LmNzcyI+Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgiaGVhZCIpLmFwcGVuZCgnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyArIENvcmUuQ29uZmlnLkdldCgnV2ViUGF0aCcpICsgJy9za2lucy9BZ2VudC9kZWZhdWx0L2Nzcy9DS0VkaXRvckN1c3RvbVN0eWxlcy5jc3MiPicpOwogICAgICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInICsgQ29yZS5Db25maWcuR2V0KCdXZWJQYXRoJykgKyAnL3NraW5zL0FnZW50L2RlZmF1bHQvY3NzL1JpY2hUZXh0QXJ0aWNsZUNvbnRlbnQuY3NzIj4nKTsKICAgICAgICB9CgogICAgICAgIGxldCBDdXN0b21TdHlsZXMgPSBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LkN1c3RvbUNTUycpIHx8ICcnOwogICAgICAgIGlmIChDdXN0b21TdHlsZXMgIT0gJycpIHsKICAgICAgICAgICAgJCgiaGVhZCIpLmFwcGVuZCgnPHN0eWxlIHR5cGU9InRleHQvY3NzIj4gLmNrLWNvbnRlbnQgeycgKyBDdXN0b21TdHlsZXMgKyAnfSA8L3N0eWxlPicpOwogICAgICAgIH0KCiAgICAgICAgVGFyZ2V0TlMuSW5pdEFsbEVkaXRvcnMoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRSVEUKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtqUXVlcnlPYmplY3R9IGpRdWVyeSBvYmplY3Qgb2YgdGhlIGNvcnJlc3BvbmRpbmcgUlRFIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVkaXRvckFyZWEgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBHZXQgUlRFIGpRdWVyeSBlbGVtZW50LgogICAgICovCiAgICBUYXJnZXROUy5HZXRSVEUgPSBmdW5jdGlvbiAoJEVkaXRvckFyZWEpIHsKICAgICAgICB2YXIgJFJURTsKCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFZGl0b3JBcmVhKSkgewogICAgICAgICAgICAkUlRFID0gJCgkRWRpdG9yQXJlYS5hdHRyKCdpZCcpKTsKICAgICAgICAgICAgcmV0dXJuICgkUlRFLmxlbmd0aCA/ICRSVEUgOiB1bmRlZmluZWQpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBVcGRhdGVMaW5rZWRGaWVsZAogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFZGl0b3JBcmVhIC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBsaW5rZWQgZmllbGQgZm9yIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqLwogICAgVGFyZ2V0TlMuVXBkYXRlTGlua2VkRmllbGQgPSBmdW5jdGlvbiAoJEVkaXRvckFyZWEpIHsKICAgICAgICB2YXIgRWRpdG9ySUQgPSAnJywKICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgU3RyaXBwZWRDb250ZW50OwoKICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJEVkaXRvckFyZWEpICYmICRFZGl0b3JBcmVhLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBFZGl0b3JJRCA9ICRFZGl0b3JBcmVhLmF0dHIoJ2lkJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoRWRpdG9ySUQgPT09ICcnKSB7CiAgICAgICAgICAgIENvcmUuRXhjZXB0aW9uLlRocm93KCdSaWNoVGV4dEVkaXRvcjogTmVlZCBleGFjdGx5IG9uZSBFZGl0b3JBcmVhIScsICdUeXBlRXJyb3InKTsKICAgICAgICB9CgogICAgICAgIERhdGEgPSB3aW5kb3cuZWRpdG9yLmdldERhdGEoKTsKICAgICAgICBTdHJpcHBlZENvbnRlbnQgPSBEYXRhLnJlcGxhY2UoL1xzK3wmbmJzcDt8PFwvP1x3K1tePl0qXC8/Pi9nLCAnJyk7CgogICAgICAgIGlmIChTdHJpcHBlZENvbnRlbnQubGVuZ3RoID09PSAwICYmICFEYXRhLm1hdGNoKC88aW1nLykpIHsKICAgICAgICAgICAgJEVkaXRvckFyZWEudmFsKCcnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFZGl0b3JBcmVhLnZhbChEYXRhKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSXNFbmFibGVkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBSVEUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVkaXRvckFyZWEgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrIGlmIGEgcmljaCB0ZXh0IGVkaXRvciBpcyBlbmFibGUgaW4gdGhpcyBtb21lbnQuCiAgICAgKi8KICAgIFRhcmdldE5TLklzRW5hYmxlZCA9IGZ1bmN0aW9uICgkRWRpdG9yQXJlYSkgewogICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmVkaXRvciA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFZGl0b3JBcmVhKSAmJiAkRWRpdG9yQXJlYS5sZW5ndGggJiYgJEVkaXRvckFyZWEuaGFzQ2xhc3MoJ1JpY2hUZXh0JykpIHsKICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cuZWRpdG9yID8gdHJ1ZSA6IGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEZvY3VzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVkaXRvckFyZWEgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGZvY3Vzc2VzIHRoZSBnaXZlbiBSVEUuCiAgICAgKi8KICAgIFRhcmdldE5TLkZvY3VzID0gZnVuY3Rpb24gKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgdmFyIEVkaXRvcklEID0gJyc7CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIEVkaXRvcklEID0gJEVkaXRvckFyZWEuYXR0cignaWQnKTsKICAgICAgICB9CgogICAgICAgIGlmIChFZGl0b3JJRCA9PT0gJycpIHsKICAgICAgICAgICAgQ29yZS5FeGNlcHRpb24uVGhyb3coJ1JpY2hUZXh0RWRpdG9yOiBOZWVkIGV4YWN0bHkgb25lIEVkaXRvckFyZWEhJywgJ1R5cGVFcnJvcicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR5cGVvZiBDbGFzc2ljRWRpdG9yICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIENLRWRpdG9ySW5zdGFuY2VzWyRFZGl0b3JBcmVhLmF0dHIoJ2lkJyldLmZvY3VzKCk7CiAgICAgICAgfQogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuVUkuUmljaFRleHRFZGl0b3IgfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/js/FAQ.Agent.Sidebar.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNSBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgRkFRLkFnZW50LlNpZGViYXIKICogQG1lbWJlcm9mIEZBUS5BZ2VudAogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBGQVEgU2lkZWJhciBzZXR0aW5ncyBtb2R1bGUuCiAqLwpGQVEuQWdlbnQuU2lkZWJhciA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICBsZXQgc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKICAgIGNvbnN0IGxpc3QgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnSXRlbUxpc3QnKTsKICAgIGNvbnN0IGJ0blVwICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVXAnKTsKICAgIGNvbnN0IGJ0bkRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuRG93bicpOwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIEZBUS5BZ2VudC5TaWRlYmFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIG1vZHVsZS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgnI0ZpbHRlcicpLCAkKCcjU2V0dGluZ3MnKSk7ICAgICAgICAKCiAgICAgICAgJCgnLkJ0bkVkaXQnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgiI0xhbmdTZWxlY3Rpb24iKS5zdWJtaXQoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLlJlbW92ZUJ1dHRvbicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgQnV0dG9uSUQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7CiAgICAgICAgICAgIHZhciBSZW1vdmVJRCA9IEJ1dHRvbklELnNwbGl0KCdfJykucG9wKCk7CiAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBNYXhJRCA9IDA7CgogICAgICAgICAgICAkKCdbaWRePSJGaWVsZF9BcnRpY2xlXyJdJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBDdXJyZW50SUQgPSBwYXJzZUludCgkKHRoaXMpLmF0dHIoJ2lkJykuc3BsaXQoJ18nKS5wb3AoKSk7CgogICAgICAgICAgICAgICAgaWYgKEN1cnJlbnRJRCA+IE1heElEKSB7CiAgICAgICAgICAgICAgICAgICAgTWF4SUQgPSBDdXJyZW50SUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgCiAgICAgICAgICAgICQoIiNBcnRpY2xlQ291bnQiKS52YWwocGFyc2VJbnQoTWF4SUQgLSAxKSk7CgogICAgICAgICAgICAkKCcjRmllbGRfQXJ0aWNsZV8nICsgUmVtb3ZlSUQpLnJlbW92ZSgpOwogICAgICAgICAgICAkKCdsYWJlbFtmb3I9IkFydGljbGVfJyArIFJlbW92ZUlEICsgJyJdJykucmVtb3ZlKCk7ICAgICAgICAgICAKICAgICAgICAgICAgc3luY0dyb3VwT3JkZXIoKTsKICAgICAgICAgICAgUmVidWlsZExpc3RJdGVtcygpOwogICAgICAgIH0pOwoKICAgICAgICAkKCcjQnRuQWRkRW50cnknKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQWRkTmV3QXJ0aWNsZSgpOwogICAgICAgIH0pOyAKCiAgICAgICAgJCgnI2J0blVwJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgbW92ZVVwKCk7CiAgICAgICAgfSk7IAoKICAgICAgICAkKCcjYnRuRG93bicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG1vdmVEb3duKCk7CiAgICAgICAgfSk7IAoKICAgICAgICAkKCcjQnRuUmVzZXQnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgVGl0bGU6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXYXJuaW5nJyksCiAgICAgICAgICAgICAgICBIVE1MOiAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1Jlc3RvcmluZyB0aGVzZSBzZXR0aW5ncyB3aWxsIGVyYXNlIGFsbCBkYXRhLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZD8nKSwKICAgICAgICAgICAgICAgIFBvc2l0aW9uVG9wOiAnMjAlJywKICAgICAgICAgICAgICAgIFBvc2l0aW9uTGVmdDogJ0NlbnRlcicsCiAgICAgICAgICAgICAgICBDbG9zZU9uRXNjYXBlOiBmYWxzZSwKICAgICAgICAgICAgICAgIENsb3NlT25DbGlja091dHNpZGU6IGZhbHNlLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDbG9zZScpLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ0NhbGxGb3JBY3Rpb24nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2snKSwKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNTdWJhY3Rpb24iKS52YWwoIkRlbGV0ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI1NpZGViYXJTZXR0aW5nc0Zvcm0iKS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdDYWxsRm9yQWN0aW9uJwogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9KTsgICAgICAgICAgICAKICAgICAgICB9KTsKCiAgICAgICAgaWYgKCB0eXBlb2YgbGlzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgbGlzdCApIHsKICAgICAgICAgICAgbGlzdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdMaXN0SXRlbScpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50ID0gZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQnV0dG9ucygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsgICAgICAgIAogICAgICAgIH0KCiAgICAgICAgR2V0R3JvdXBPcmRlcigpOwoKICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgc3luY0dyb3VwT3JkZXIoKTsKICAgICAgICB9KTsKCiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7CiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSwKICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZQogICAgICAgIH0pOwoKICAgICAgICAkKGRvY3VtZW50KS5vbignYmx1cicsICdpbnB1dCcsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmlkICYmIGUudGFyZ2V0LmlkLnN0YXJ0c1dpdGgoJ0FydGljbGVfJykgJiYgIWUudGFyZ2V0LmlkLmluY2x1ZGVzKCdFcnJvcicpICYmICFlLnRhcmdldC5pZC5pbmNsdWRlcygnTmV4dElEJykpIHsKICAgICAgICAgICAgICAgIHN5bmNHcm91cE9yZGVyKCk7CiAgICAgICAgICAgICAgICBSZWJ1aWxkTGlzdEl0ZW1zKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsgICAgICAgIAoKICAgICAgICBzeW5jR3JvdXBPcmRlcigpOyAgICAgIAogICAgfTsKCiAgICBmdW5jdGlvbiBtb3ZlVXAoKSB7CiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAmJiBzZWxlY3RlZEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZykgewogICAgICAgICAgICBsaXN0Lmluc2VydEJlZm9yZShzZWxlY3RlZEVsZW1lbnQsIHNlbGVjdGVkRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTsKICAgICAgICAgICAgdXBkYXRlQnV0dG9ucygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlRG93bigpIHsKICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICYmIHNlbGVjdGVkRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHsKICAgICAgICAgICAgbGlzdC5pbnNlcnRCZWZvcmUoc2VsZWN0ZWRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZywgc2VsZWN0ZWRFbGVtZW50KTsKICAgICAgICAgICAgdXBkYXRlQnV0dG9ucygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVCdXR0b25zKCkgewogICAgICAgIGlmICghc2VsZWN0ZWRFbGVtZW50KSByZXR1cm47CgogICAgICAgIGJ0blVwLmRpc2FibGVkID0gIXNlbGVjdGVkRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICAgIGJ0bkRvd24uZGlzYWJsZWQgPSAhc2VsZWN0ZWRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZzsgICAgICAKCiAgICAgICAgc2VsZWN0ZWRFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnIH0pOwogICAgICAgIEdldEdyb3VwT3JkZXIoKTsKICAgIH0gICAgCgogICAgZnVuY3Rpb24gR2V0R3JvdXBPcmRlcigpIHsKICAgICAgICBjb25zdCBpdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNJdGVtTGlzdCAuTGlzdEl0ZW0nKTsKICAgICAgICAKICAgICAgICBjb25zdCBHcm91cE9yZGVyID0gQXJyYXkuZnJvbShpdGVtcykKICAgICAgICAgICAgLm1hcChpdGVtID0+IGl0ZW0udGV4dENvbnRlbnQudHJpbSgpLnJlcGxhY2UoLywvZywgIiIpKSAKICAgICAgICAgICAgLmpvaW4oIiwiKTsKCiAgICAgICAgJCgnI0N1c3RvbUdyb3VwT3JkZXInKS52YWwoR3JvdXBPcmRlcik7CiAgICB9ICAgCiAgICAgICAKICAgIGZ1bmN0aW9uIGNsZWFuTmFtZSh0ZXh0KSB7CiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gIiI7CiAgICAgICAgcmV0dXJuIHRleHQuc3BsaXQoJzo6JylbMF0udHJpbSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN5bmNHcm91cE9yZGVyKCkgewogICAgICAgIGNvbnN0IG9yZGVySW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnQ3VzdG9tR3JvdXBPcmRlcicpOwogICAgICAgIGlmICghb3JkZXJJbnB1dCkgcmV0dXJuOwoKICAgICAgICBjb25zdCBhbGxBcnRpY2xlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49IkFydGljbGVfIl0nKTsKICAgICAgICAKICAgICAgICBjb25zdCB2YWxpZEFydGljbGVzID0gQXJyYXkuZnJvbShhbGxBcnRpY2xlcykuZmlsdGVyKGVsID0+IHsKICAgICAgICAgICAgcmV0dXJuICFlbC5pZC5pbmNsdWRlcygnRXJyb3InKTsgCiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IGN1cnJlbnROYW1lcyA9IHZhbGlkQXJ0aWNsZXMKICAgICAgICAgICAgLm1hcChlbCA9PiBjbGVhbk5hbWUoZWwudGV4dENvbnRlbnQgfHwgZWwudmFsdWUpKQogICAgICAgICAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZSAhPT0gIiIpOwoKICAgICAgICBsZXQgZXhpc3RpbmdPcmRlciA9IG9yZGVySW5wdXQudmFsdWUgPyBvcmRlcklucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpIDogW107CgogICAgICAgIGV4aXN0aW5nT3JkZXIgPSBleGlzdGluZ09yZGVyLmZpbHRlcihuYW1lID0+IGN1cnJlbnROYW1lcy5pbmNsdWRlcyhuYW1lKSk7CgogICAgICAgIGN1cnJlbnROYW1lcy5mb3JFYWNoKG5hbWUgPT4gewogICAgICAgICAgICBpZiAoIWV4aXN0aW5nT3JkZXIuaW5jbHVkZXMobmFtZSkpIHsKICAgICAgICAgICAgICAgIGV4aXN0aW5nT3JkZXIucHVzaChuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBvcmRlcklucHV0LnZhbHVlID0gZXhpc3RpbmdPcmRlci5qb2luKCcsJyk7CiAgICB9IAoKICAgIGZ1bmN0aW9uIFJlYnVpbGRMaXN0SXRlbXMoKSB7CiAgICAgICAgY29uc3Qgb3JkZXJJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdDdXN0b21Hcm91cE9yZGVyJyk7CiAgICAgICAgY29uc3QgbGlzdENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdJdGVtTGlzdCcpOyAvLyBFbCA8dWw+IGRvbmRlIGVzdMOhbiBsb3MgaXRlbXMKICAgICAgICAKICAgICAgICBpZiAoIW9yZGVySW5wdXQgfHwgIWxpc3RDb250YWluZXIgfHwgIW9yZGVySW5wdXQudmFsdWUpIHJldHVybjsKICAgICAgICBjb25zdCBvcmRlbk5vbWJyZXMgPSBvcmRlcklucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpOwoKICAgICAgICBjb25zdCBhbGxBcnRpY2xlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXj0iQXJ0aWNsZV8iXScpKQogICAgICAgICAgICAuZmlsdGVyKGVsID0+ICFlbC5pZC5pbmNsdWRlcygnRXJyb3InKSkuZmlsdGVyKGVsID0+ICFlbC5pZC5pbmNsdWRlcygnTmV4dElEJykpOwogICAgICAgIGxpc3RDb250YWluZXIuaW5uZXJIVE1MID0gJyc7CgogICAgICAgIG9yZGVuTm9tYnJlcy5mb3JFYWNoKG5vbWJyZUVuQ1NWID0+IHsKICAgICAgICAgICAgY29uc3QgYXJ0aWN1bG9FbmNvbnRyYWRvID0gYWxsQXJ0aWNsZXMuZmluZChlbCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBub21icmVMaW1waW8gPSAoZWwudGV4dENvbnRlbnQgfHwgZWwudmFsdWUpLnNwbGl0KCc6OicpWzBdLnRyaW0oKTsKICAgICAgICAgICAgICAgIHJldHVybiBub21icmVMaW1waW8gPT09IG5vbWJyZUVuQ1NWOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChhcnRpY3Vsb0VuY29udHJhZG8pIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpKTsKICAgICAgICAgICAgICAgIGxpLmNsYXNzTmFtZSA9ICdMaXN0SXRlbSc7CiAgICAgICAgICAgICAgICBsaS50ZXh0Q29udGVudCA9IG5vbWJyZUVuQ1NWOwogICAgICAgICAgICAgICAgbGkuZGF0YXNldC5pZCA9IGFydGljdWxvRW5jb250cmFkby5pZDsgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyLmFwcGVuZENoaWxkKGxpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBhbGxBcnRpY2xlcy5mb3JFYWNoKGVsID0+IHsKICAgICAgICAgICAgY29uc3Qgbm9tYnJlTGltcGlvID0gKGVsLnRleHRDb250ZW50IHx8IGVsLnZhbHVlKS5zcGxpdCgnOjonKVswXS50cmltKCk7CiAgICAgICAgICAgIGlmICghb3JkZW5Ob21icmVzLmluY2x1ZGVzKG5vbWJyZUxpbXBpbykpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgICAgICAgICAgICAgIGxpLmNsYXNzTmFtZSA9ICdMaXN0SXRlbSc7CiAgICAgICAgICAgICAgICBsaS50ZXh0Q29udGVudCA9IG5vbWJyZUxpbXBpbzsKICAgICAgICAgICAgICAgIGxpLmRhdGFzZXQuaWQgPSBlbC5pZDsKICAgICAgICAgICAgICAgIGxpc3RDb250YWluZXIuYXBwZW5kQ2hpbGQobGkpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQWRkTmV3QXJ0aWNsZQogICAgICogQG1lbWJlcm9mIEZBUS5BZ2VudC5TaWRlYmFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSAKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgIEZ1bmN0aW9uIGZvciBhZGQgbmV3IGFydGljbGUgbGluZS4KICAgICAqLyAgICAKICAgIGZ1bmN0aW9uIEFkZE5ld0FydGljbGUoKSB7CiAgICAgICAgdmFyIE1heElEID0gMDsKCiAgICAgICAgJCgnW2lkXj0iRmllbGRfQXJ0aWNsZV8iXScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBDdXJyZW50SUQgPSBwYXJzZUludCgkKHRoaXMpLmF0dHIoJ2lkJykuc3BsaXQoJ18nKS5wb3AoKSk7CgogICAgICAgICAgICBpZiAoQ3VycmVudElEID4gTWF4SUQpIHsKICAgICAgICAgICAgICAgIE1heElEID0gQ3VycmVudElEOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHZhciBOZXh0SUQgPSBwYXJzZUludChNYXhJRCArIDEpOwogICAgICAgICQoIiNBcnRpY2xlQ291bnQiKS52YWwoTmV4dElEKTsKCiAgICAgICAgdmFyIFRlbXBsYXRlSFRNTCA9ICQoIiNBcnRpY2xlVGVtcGxhdGUiKS5odG1sKCkucmVwbGFjZSgvTmV4dElEL2csIE5leHRJRCk7CiAgICAgICAgdmFyIExhc3RBcnRpY2xlID0gJCgnI0ZpZWxkX0FydGljbGVfJyArIHBhcnNlSW50KE1heElEKSk7CiAgICAgICAgTGFzdEFydGljbGUuYWZ0ZXIoVGVtcGxhdGVIVE1MKTsKCiAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgiI1NpZGViYXJTZXR0aW5ncyIpOwogICAgfSAgICAKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KEZBUS5BZ2VudC5TaWRlYmFyIHx8IHt9KSk7Cg==</File>
        <File Location="var/httpd/htdocs/skins/Agent/default/css/FAQExtendedNavigation.Agent.Default.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIERlZmF1bHQgU2V0dGluZ3MKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKOnJvb3QgewogICAgLS1GQVFTaWRlYmFySWNvblNpemU6IDIwcHg7CiAgICAtLUZBUVNpZGViYXJJY29uTWFyZ2luOiA0cHg7CiAgICAtLUZBUVNpZGViYXJVbmV4cGxhaW5lZFdoaXRlc3BhY2U6IDRweDsKfQoKLk1haW5TaWRlQmFyIHsKICAgIG1hcmdpbi1ib3R0b206IDE1cHg7Cn0KCi5vb29TaWRlQmFySWNvbkhvbWUsCi5vb29TaWRlQmFySWNvbkV4cGxvcmVyIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tRkFRU2lkZWJhckljb25TaXplKSAhaW1wb3J0YW50OwogICAgd2lkdGg6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5vb29TaWRlQmFySWNvbkV4cGxvcmVyIHsKICAgIGZpbGw6IHZhcigtLWNvbFRleHREYXJrKTsKfQoKLm9vb0ZBUVNpZGViYXJIZWFkZXIgewogICAgY29sb3I6IHZhcigtLWNvbFRleHREYXJrKTsKICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5vb29GQVFTaWRlYmFySGVhZGVyOmZpcnN0LWNoaWxkLAoub29vRkFRVE9DSGVhZGVyOmZpcnN0LWNoaWxkCnsKICAgIHBhZGRpbmctdG9wOiAyMHB4Owp9Cgoub29vRkFRTGlua3MgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgIAp9Cgoub29vRkFRTGlua1Bvc2l0aW9uIHsKICAgIG1hcmdpbi10b3A6IDE0cHg7CiAgICBtYXJnaW4tYm90dG9tOiAwcHggIWltcG9ydGFudDsKfQoKLm9vb0ZBUUxpbmtzPmxpOmZpcnN0LWNoaWxkOmhhcyhhOm5vdCgub29vRkFRTGlua1Bvc2l0aW9uKSkKewogICAgbWFyZ2luLXRvcDogNXB4Owp9Cgoub29vRkFRTGlua3M+bGk6Zmlyc3QtY2hpbGQ6aGFzKGE6bm90KC5vb29GQVFMaW5rRmlyc3QpKSB7CiAgICBtYXJnaW4tdG9wOiAwOwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9Cgoub29vRkFRU2lkZWJhciB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1pbi1oZWlnaHQ6IDUwdmg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xCR1NpZGVCYXIpOwogICAgcGFkZGluZzogMHB4IDE2cHggMTZweCAxNnB4Owp9Cgoub29vRkFRU2lkZWJhckFydGljbGUsCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOiAiaWNvbiB0ZXh0IjsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tRkFRU2lkZWJhckljb25TaXplKSBhdXRvOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tRkFRU2lkZWJhckljb25NYXJnaW4pOwogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIHBhZGRpbmctdG9wOiAwLjI1cmVtOwogICAgcGFkZGluZy1sZWZ0OiAwLjFyZW07CiAgICBtaW4taGVpZ2h0OiB2YXIoLS1GQVFTaWRlYmFySWNvblNpemUpOwp9Cgoub29vRkFRQm94IHN2ZyB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgdG9wOiAtMnB4OwogICAgZmlsdGVyOiBicmlnaHRuZXNzKDApIG9wYWNpdHkoMC41KTsKfQoKLm9vb0ZBUVNpZGViYXJMaXN0IGxpOmxhc3QtY2hpbGQgewogIHBhZGRpbmctYm90dG9tOiAyMHB4Owp9Cgoub29vRkFRU2lkZWJhckFydGljbGUrLm9vb0ZBUVNpZGViYXJIZWFkZXIgewogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlOWU4ZTg4YzsKICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICBwYWRkaW5nLXRvcDogMjVweDsKICAgIHBhZGRpbmctYm90dG9tOiA1cHg7Cn0KCi5vb29TaWRlQmFySWNvbiwKLm9vb0ZBUVNpZGViYXIgLm9vb0ljb25TdWJIZWFkZXIsCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBzdmcgewogICAgd2lkdGg6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbik7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5vb29GQVFTaWRlYmFyIC5vb29JY29uU3ViSGVhZGVyIHsKICAgIGdyaWQtYXJlYTogaWNvbjsKICAgIGZvbnQtc2l6ZTogMTdweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBzdmcgewogICAgZmlsbDogdmFyKC0tY29sVGV4dE1lZGl1bSk7Cn0KCi5vb29GQVFUT0NBcnRpY2xlIGEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgY29sb3I6IHZhcigtLWNvbFRleHRGQVFUT0NMaXN0KTsKICAgIHdpZHRoOiA4MCU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlIGEsCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyIHNwYW4gewogICAgZ3JpZC1hcmVhOiB0ZXh0OwogICAgdG9wOiA1cHg7CiAgICB3aWR0aDogODUlOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBhIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0TGluayk7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZTpob3ZlciBhIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7Cn0KCi5CYWNrVG9wIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsb2F0OiByaWdodDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHotaW5kZXg6IDIwMDA7Cn0KCi5CYWNrVG9wICA+IGkgewogICAgY29sb3I6IHZhcigtLWNvbEJHRGFyayk7Cn0KCi5vb29GQVFFeHBsb3JlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBsZWZ0OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCByZ2JhKDQsIDAsIDcxLCAuMTYpOwogICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgdmFyKC0tY29sU2hhZG93RGFyayk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgcGFkZGluZzogMTZweDsKfQoKLm9vb0ZBUVRPQyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBhZGRpbmc6IDhweCAxNnB4IDE2cHggMTBweDsKfQoKLm9vb0ZBUVNpZGViYXJMaXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwogICAgbWF4LXdpZHRoOiAzMjBweDsKfQoKLm9vb0ZBUUhlYWRlciB7CiAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgZm9udC1zaXplOiAxM3B4Owp9Cgoub29vRkFRVE9DQXJ0aWNsZSB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5vb29GQVFUT0NBcnRpY2xlIGEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgY29sb3I6IHZhcigtLWNvbFRleHRGQVFUT0NMaXN0KTsKICAgIHdpZHRoOiA4NSU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLlRPQ0xldmVsMSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0b3A6IC0ycHg7Cn0KCi5UT0NMZXZlbDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAtMnB4OwogICAgbGVmdDogMTBweDsKfQoKLkxpbmtMZXZlbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nLWxlZnQ6IDZweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDsKfQoKLkxpbmtMZXZlbDIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1sZWZ0OiAxNnB4Owp9CgouTGlua0FuY2hvclNpbmdsZSB7CiAgICBsZWZ0OiAxMHB4Owp9CgouTGlua0ZBUUV4cGxvcmVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgouQXJ0aWNsZUFyZWE+LldpZGdldFNpbXBsZSwKLlRhYmxlT2ZDb250ZW50cz4uV2lkZ2V0U2ltcGxlLAouU2lkZWJhckFyZWE+LldpZGdldFNpbXBsZQp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi5IZWFkbGluZSBzdmcgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGZpbGw6IHZhcigtLWNvbFRleHRNZWRpdW0pOwp9CgouSGVhZGxpbmUgaDEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouSWNvbkZpZWxkIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5JY29uQm94IHsKICAgIGhlaWdodDogMzJweDsgCiAgICB3aWR0aDogMzJweDsgCiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOyAKICAgIG1hcmdpbi1ib3R0b206IDFweDsgIAogICAgYmFja2dyb3VuZC1zaXplOmNvdmVyOwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7IAogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKI0J0blVwbG9hZEljb24gewogICAgd2lkdGg6IGF1dG87CiAgICBsaW5lLWJyZWFrOiB1bnNldDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBtYXJnaW4tbGVmdDogMTJweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZS5vb29GQVFTdWJIZWFkZXJTcGFjaW5nIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2U7CiAgICBwYWRkaW5nLWxlZnQ6IGNhbGMoIAogICAgICAgIHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSkgKyAKICAgICAgICB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbikKICAgICk7IAp9Cgoub29vRkFRU2lkZWJhckFydGljbGUub29vLWlzLXZpc2libGUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIG9wYWNpdHk6IDE7Cn0KCn0K</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">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qIEFkZGVkIGZyb20gdmFyL2h0dHBkL2h0ZG9jcy9za2lucy9BZ2VudC9kZWZhdWx0L2Nzcy9Db3JlLlJlc2V0LmNzcyB0byBlbnN1cmUgY29uc2lzdGVudCBzdHlsaW5nICovCgouY2stY29udGVudCBodG1sLCAuY2stY29udGVudCBib2R5LCAuY2stY29udGVudCBkaXYsCi5jay1jb250ZW50IHNwYW4sIC5jay1jb250ZW50IGgxLCAuY2stY29udGVudCBoMiwKLmNrLWNvbnRlbnQgaDMsIC5jay1jb250ZW50IGg0LCAuY2stY29udGVudCBoNSwKLmNrLWNvbnRlbnQgaDYsIC5jay1jb250ZW50IHAsIC5jay1jb250ZW50IGJsb2NrcXVvdGUsCi5jay1jb250ZW50IGNpdGUsIC5jay1jb250ZW50IGNvZGUsCi5jay1jb250ZW50IGVtLCAuY2stY29udGVudCBpbWcsCi5jay1jb250ZW50IHEsIC5jay1jb250ZW50IHMsCi5jay1jb250ZW50IHNtYWxsLCAuY2stY29udGVudCBzdHJpa2UsIC5jay1jb250ZW50IHN0cm9uZywKLmNrLWNvbnRlbnQgc3ViLCAuY2stY29udGVudCBzdXAsIC5jay1jb250ZW50IHR0LAouY2stY29udGVudCB2YXIsIC5jay1jb250ZW50IGRsLCAuY2stY29udGVudCBkdCwKLmNrLWNvbnRlbnQgZGQsIC5jay1jb250ZW50IG9sLCAuY2stY29udGVudCB1bCwKLmNrLWNvbnRlbnQgbGksIC5jay1jb250ZW50IGZpZWxkc2V0LCAuY2stY29udGVudCBmb3JtLAouY2stY29udGVudCBsYWJlbCwgLmNrLWNvbnRlbnQgbGVnZW5kLCAuY2stY29udGVudCB0YWJsZSwKLmNrLWNvbnRlbnQgY2FwdGlvbiwgLmNrLWNvbnRlbnQgdGJvZHksIC5jay1jb250ZW50IHRmb290LAouY2stY29udGVudCB0aGVhZCwgLmNrLWNvbnRlbnQgdHIsIC5jay1jb250ZW50IHRoLAouY2stY29udGVudCB0ZCwgLmNrLWNvbnRlbnQgaHIgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMDsKICAgIG91dGxpbmU6IDA7CiAgICBmb250LXdlaWdodDogaW5oZXJpdDsKICAgIGZvbnQtc3R5bGU6IGluaGVyaXQ7CiAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgICBkaXJlY3Rpb246IGluaGVyaXQ7Cn0KCi8qIEVuZCBvZiBhZGRpdGlvbnMgZnJvbSBDb3JlLlJlc2V0LmNzcyAqLwoKLmNrLWNvbnRlbnQgewogICAgdGV4dC13cmFwOiB3cmFwOwogICAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS4yZW07CiAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgY29sb3I6ICMwMDAwMDA7CiAgICBtYXJnaW4tYm90dG9tOiAwcHg7Cn0KCi8qIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCi5jay1jb250ZW50IGEsCi5jay1jb250ZW50IGEubWVudGlvbiB7Ci8qIEVPIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24gKi8KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLyogUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24gKi8KICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwovKiBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCiAgICBjb2xvcjogIzAwMWJmZjsKfQoKLmNrLWNvbnRlbnQgYTpob3ZlciwKLyogUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24gKi8KLmNrLWNvbnRlbnQgYS5tZW50aW9uOmhvdmVyLAouY2stY29udGVudCBhOmZvY3VzLAouY2stY29udGVudCBhLm1lbnRpb246Zm9jdXMgewovKiBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCiAgICBjb2xvcjogIzAwMDIzYzsKLyogUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24gKi8KICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwovKiBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCn0KCi5jay1jb250ZW50ICo6dmlzaXRlZCB7CiAgICBjb2xvcjogIzAwMWJmZjsKLyogUm90aGVyIE9TUyAvIEZBUS1FeHRlbmRlZE5hdmlnYXRpb24gKi8KICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwovKiBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCn0KCi5jay1jb250ZW50IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoKLmNrLWNvbnRlbnQgZW0gewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgouY2stY29udGVudCBmaWd1cmUudGFibGUgewogICAgbWFyZ2luOiAwIDAgMCAwOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5jay1jb250ZW50IHAgewogICAgbWFyZ2luLXRvcDogMHB4OwogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouY2stY29udGVudCBoMSB7CiAgICBmb250LXNpemU6IDJlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgIGNvbG9yOiBpbmhlcml0Owp9IAoKLmNrLWNvbnRlbnQgaDIgewogICAgZm9udC1zaXplOiAxLjVlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgIGNvbG9yOiBpbmhlcml0Owp9CgouY2stY29udGVudCBoMyB7CiAgICBmb250LXNpemU6IDEuMTdlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgY29sb3I6IGluaGVyaXQ7Cn0KCi5jay1jb250ZW50IGg0IHsKICAgIGZvbnQtc2l6ZTogMWVtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICBjb2xvcjogaW5oZXJpdDsKfQoKLmNrLWNvbnRlbnQgaDUgewogICAgZm9udC1zaXplOiAwLjgzZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgIGNvbG9yOiBpbmhlcml0Owp9IAoKLmNrLWNvbnRlbnQgaDYgewogICAgZm9udC1zaXplOiAwLjY3ZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGNvbG9yOiBpbmhlcml0Owp9IAoKLmNrLWNvbnRlbnQgYmxvY2txdW90ZSB7CiAgICBmb250LXN0eWxlOiBub3JtYWwgIWltcG9ydGFudDsKICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjMDAwMDk5IDEuNXB0ICFpbXBvcnRhbnQ7IAogICAgcGFkZGluZzogMGNtIDBjbSAwY20gNHB0ICFpbXBvcnRhbnQ7CiAgICBtYXJnaW46IDA7Cn0KCi5jay1jb250ZW50IHVsLAouY2stY29udGVudCBvbCAgCnsKICAgIHBhZGRpbmc6IDAgNTBweDsKfQoKLyogZGVmYXVsdCBpbWFnZSBzdHlsZSAqLwouY2stY29udGVudCBmaWd1cmUuaW1hZ2U6bm90KCAgIC5pbWFnZS1zdHlsZS1hbGlnbi1jZW50ZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbWFnZS1zdHlsZS1ibG9jay1hbGlnbi1yaWdodCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmltYWdlLXN0eWxlLWFsaWduLWxlZnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbWFnZS1zdHlsZS1hbGlnbi1yaWdodCkgCnsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gdmFyKC0tY2staW1hZ2Utc3R5bGUtc3BhY2luZykpOwogICAgbWFyZ2luLWxlZnQ6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IGF1dG8KfQoKLmNrLWNvbnRlbnQgY29kZSB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwp9Cg==</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/FAQExtendedNavigation.Customer.Default.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCjpyb290IHsKICAgIC0tRkFRU2lkZWJhckljb25TaXplOiAyMHB4OwogICAgLS1GQVFTaWRlYmFySWNvbk1hcmdpbjogNHB4OwogICAgLS1GQVFTaWRlYmFyVW5leHBsYWluZWRXaGl0ZXNwYWNlOiA0cHg7Cn0KCi5GQVFIb21lIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7Cn0KCiNvb29TZWFyY2hCb3guRkFRU2VhcmNoQm94IHsKICAgIHBhZGRpbmctcmlnaHQ6IDA7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKI29vb1NlYXJjaC5vb29TZWFyY2hGQVEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbGVmdDogMDsKICAgIHdpZHRoOiBjYWxjKCAxMDAlIC0gMzZweCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xCR0xpZ2h0KTsKfQoKLm9vb1NlYXJjaEZBUSArICNvb29TZWFyY2hMYWJlbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBsZWZ0OiBjYWxjKCAtMTAwJSArIDI4cHggKTsKfQoKLldpZGdldENvbHVtbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMjRweDsKfQoKLkFydGljbGVBcmVhPi5XaWRnZXRTaW1wbGUsCi5UYWJsZU9mQ29udGVudHM+LldpZGdldFNpbXBsZSwKLlNpZGViYXJBcmVhPi5XaWRnZXRTaW1wbGUKewogICAgbWFyZ2luLXRvcDogMHB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5BZGRpdGlvbmFsRGF0YT4uV2lkZ2V0U2ltcGxlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLlJhdGluZz4uV2lkZ2V0U2ltcGxlIHsKICAgIG1hcmdpbi10b3A6IDI0cHg7Cn0KCiNSYXRlU3VibWl0QnV0dG9uIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMTVweDsKfQoKLlZvdGluZ0NvbnRhaW5lciB7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouS2V5d29yZCB7CiAgICBjb2xvcjogdmFyKC0tY29sVGV4dExpZ2h0KQp9Cgoub29vRkFRSW5kZXggewogICAgbWFyZ2luLXRvcDogMHB4ICFpbXBvcnRhbnQ7Cn0KCi5Db250ZW50SW5kZXggPiBhIHsKICAgIHNjcm9sbC1tYXJnaW4tdG9wOiAxNTVweDsKfQoKLm9vb0ZBUVRPQyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1pbi1oZWlnaHQ6IDIwdmg7CiAgICBib3JkZXItcmFkaXVzOiAyMHB4OwogICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgcmdiYSg0LCAwLCA3MSwgLjE2KTsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHZhcigtLWNvbFNoYWRvd0RhcmspOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDE2cHggMjRweCAxNnB4IDE2cHg7Cn0KCi5UT0NMZXZlbDEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAtNnB4Owp9CgouVE9DTGV2ZWwyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogLTZweDsKICAgIGxlZnQ6IDEwcHg7Cn0KCi5MaW5rTGV2ZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1sZWZ0OiA2cHg7CiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7Cn0KCi5MaW5rTGV2ZWwyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHBhZGRpbmctbGVmdDogMTZweDsKfQoKLkxpbmtBbmNob3JTaW5nbGUgewogICAgbGVmdDogMTBweDsKfQoKLktleXdvcmQgPiBhIHsgCiAgICBjb2xvcjogIzAwMWJmZjsKfQoKLm9vb0ZBUUFkZGl0aW9uYWxEYXRhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9Cgoub29vRkFRUmF0aW5nIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9CgouVm90aW5nQm94IHsKICAgIG1hcmdpbi10b3A6IDBweCAhaW1wb3J0YW50Owp9CgouUmF0ZUJ1dHRvbiB7CiAgICB3aWR0aDogMjBweDsKfQoKLlJhdGVMYWJlbEJlZm9yZSB7CiAgICBtYXJnaW4tbGVmdDogMHB4OwogICAgcGFkZGluZy1yaWdodDogM3B4Owp9CgouUmF0ZUxhYmVsQWZ0ZXIgewogICAgbWFyZ2luLXJpZ2h0OiAwcHg7Cn0KCiNNZXNzZW5nZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm9vb0ZBUUV4cGxvcmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9Cgoub29vU2lkZUJhckljb25FeHBsb3JlciB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZpbGw6IHZhcigtLWNvbFRleHREYXJrKTsKfQoKLm9vb1NpZGVCYXJJY29uSG9tZSB7CiAgICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMXB4OwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7Cn0KCi5vb29JbmRleEljb25FeHBsb3JlciB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMnB4OwogICAgY29udGVudDogdXJsKCAnLi4vaW1nL2ZhcS5zdmcnICk7Cn0KCi5MaW5rRkFRRXhwbG9yZXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgoub29vRkFRU2lkZWJhciB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCByZ2JhKDQsIDAsIDcxLCAuMTYpOwogICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgdmFyKC0tY29sU2hhZG93RGFyayk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgcGFkZGluZzogMTZweCAxNnB4IDE2cHggMTZweDsKfQoKLm9vb0ZBUVNpZGViYXJMaXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwogICAgbWF4LXdpZHRoOiAzMjBweDsKfQoKLm9vb0ZBUVNpZGViYXJIZWFkZXIgewogICAgY29sb3I6IHZhcigtLWNvbFRleHREYXJrKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBwYWRkaW5nOiAyNXB4IDEwcHggMTBweCAwcHg7Cn0KCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBwYWRkaW5nLWxlZnQ6IC4ycmVtOwogICAgcGFkZGluZy10b3A6IDhweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm9vb0ZBUVNpZGViYXJTdWJIZWFkZXIgLmZhLWNoZXZyb24tcmlnaHQgewogICAgbWFyZ2luLXJpZ2h0OiAxM3B4Owp9Cgoub29vRkFRSGVhZGVyIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIHBhZGRpbmc6IDhweCAwIDEycHggMDsKfQoKLm9vb0ZBUVNpZGViYXJIZWFkZXI6Zmlyc3QtY2hpbGQsCi5vb29GQVFUT0NIZWFkZXI6Zmlyc3QtY2hpbGQKewogICAgcGFkZGluZy10b3A6IDhweDsKfQoKLm9vb0ZBUUxpbmtzOmZpcnN0LWNoaWxkIHsKICAgIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi5vb29GQVFMaW5rcyA+IGxpIHsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlLAoub29vRkFRU2lkZWJhclN1YkhlYWRlciB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogImljb24gdGV4dCI7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSkgYXV0bzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLUZBUVNpZGViYXJJY29uTWFyZ2luKTsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nLXRvcDogMC4yNXJlbTsKICAgIHBhZGRpbmctbGVmdDogMC4xcmVtOwogICAgbWluLWhlaWdodDogdmFyKC0tRkFRU2lkZWJhckljb25TaXplKTsKfQoKLm9vb0ZBUUJveCBzdmcgewogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHRvcDogLTJweDsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygwKSBvcGFjaXR5KDAuNSk7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBzdmcgewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBmaWxsOiB2YXIoLS1jb2xUZXh0RGFyayk7Cn0KCi5vb29GQVFTaWRlYmFyTGlzdCBsaTpsYXN0LWNoaWxkIHsKICBwYWRkaW5nLWJvdHRvbTogMjBweDsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlKy5vb29GQVFTaWRlYmFySGVhZGVyIHsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTllOGU4OGM7CiAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgcGFkZGluZy10b3A6IDIwcHg7Cn0KCi5vb29TaWRlQmFySWNvbiwKLm9vb0ZBUVNpZGViYXIgLm9vb0ljb25TdWJIZWFkZXIsCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBzdmcgewogICAgd2lkdGg6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbik7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5vb29GQVFTaWRlYmFyIC5vb29JY29uU3ViSGVhZGVyIHsKICAgIGdyaWQtYXJlYTogaWNvbjsKICAgIGZvbnQtc2l6ZTogMTdweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5vb29GQVFUT0NBcnRpY2xlIGEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDgwJTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9Cgoub29vRkFRU2lkZWJhckFydGljbGUgYSwKLm9vb0ZBUVNpZGViYXJTdWJIZWFkZXIgc3BhbiB7CiAgICBncmlkLWFyZWE6IHRleHQ7CiAgICB0b3A6IDVweDsKICAgIHdpZHRoOiA4NSU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlOmhvdmVyIGEgewogICAgY29sb3I6IHZhcigtLWNvbE1haW5Ib3Zlcik7Cn0KCi5CYWNrVG9wIHsKICAgIGZsb2F0OiByaWdodDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0TGlnaHQpOwogICAgb3BhY2l0eTogMC41Owp9CgouQ2FwdGlvbkxhYmVsIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKaHRtbCB7CiAgICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDsKICAgIHNjcm9sbC1wYWRkaW5nLXRvcDogMTQ1cHg7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZS5vb29GQVFTdWJIZWFkZXJTcGFjaW5nIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2U7CiAgICBwYWRkaW5nLWxlZnQ6IGNhbGMoIAogICAgICAgIHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSkgKyAKICAgICAgICB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbikKICAgICk7IAp9Cgoub29vRkFRU2lkZWJhckFydGljbGUub29vLWlzLXZpc2libGUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIG9wYWNpdHk6IDE7Cn0KCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyLmlzLWV4cGFuZGVkIC5mYS1jaGV2cm9uLXJpZ2h0IHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2U7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0b3A6IDJweDsKfQoKLldpZGdldFNpbXBsZSA+IGEub29vRkFRTm9JdGVtcyB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogNjAwcHg7CiAgICB6LWluZGV4OiAxMDAwOwp9Cg==</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/FAQExtendedNavigation.Customer.FAQZoom.Default.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCjpyb290IHsKICAgIC0tRkFRU2lkZWJhckljb25TaXplOiAyMHB4OwogICAgLS1GQVFTaWRlYmFySWNvbk1hcmdpbjogNHB4OwogICAgLS1GQVFTaWRlYmFyVW5leHBsYWluZWRXaGl0ZXNwYWNlOiA0cHg7Cn0KCi5GQVFIb21lIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7Cn0KCiNvb29TZWFyY2hCb3guRkFRU2VhcmNoQm94IHsKICAgIHBhZGRpbmctcmlnaHQ6IDA7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKI29vb1NlYXJjaC5vb29TZWFyY2hGQVEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbGVmdDogMDsKICAgIHdpZHRoOiBjYWxjKCAxMDAlIC0gMzZweCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xCR0xpZ2h0KTsKfQoKLm9vb1NlYXJjaEZBUSArICNvb29TZWFyY2hMYWJlbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBsZWZ0OiBjYWxjKCAtMTAwJSArIDI4cHggKTsKfQoKLldpZGdldENvbHVtbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMjRweDsKfQoKLkFydGljbGVBcmVhPi5XaWRnZXRTaW1wbGUsCi5UYWJsZU9mQ29udGVudHM+LldpZGdldFNpbXBsZSwKLlNpZGViYXJBcmVhPi5XaWRnZXRTaW1wbGUKewogICAgbWFyZ2luLXRvcDogMHB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5BZGRpdGlvbmFsRGF0YT4uV2lkZ2V0U2ltcGxlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLlJhdGluZz4uV2lkZ2V0U2ltcGxlIHsKICAgIG1hcmdpbi10b3A6IDI0cHg7Cn0KCiNSYXRlU3VibWl0QnV0dG9uIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMTVweDsKfQoKLlZvdGluZ0NvbnRhaW5lciB7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouS2V5d29yZCB7CiAgICBjb2xvcjogdmFyKC0tY29sVGV4dExpZ2h0KQp9Cgoub29vRkFRSW5kZXggewogICAgbWFyZ2luLXRvcDogMHB4ICFpbXBvcnRhbnQ7Cn0KCi5Db250ZW50SW5kZXggPiBhIHsKICAgIHNjcm9sbC1tYXJnaW4tdG9wOiAxNTVweDsKfQoKLm9vb0ZBUVRPQyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1pbi1oZWlnaHQ6IDIwdmg7CiAgICBib3JkZXItcmFkaXVzOiAyMHB4OwogICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgcmdiYSg0LCAwLCA3MSwgLjE2KTsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHZhcigtLWNvbFNoYWRvd0RhcmspOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDE2cHggMjRweCAxNnB4IDE2cHg7Cn0KCi5UT0NMZXZlbDEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAtNnB4Owp9CgouVE9DTGV2ZWwyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogLTZweDsKICAgIGxlZnQ6IDEwcHg7Cn0KCi5MaW5rTGV2ZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1sZWZ0OiA2cHg7CiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7Cn0KCi5MaW5rTGV2ZWwyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHBhZGRpbmctbGVmdDogMTZweDsKfQoKLkxpbmtBbmNob3JTaW5nbGUgewogICAgbGVmdDogMTBweDsKfQoKLktleXdvcmQgPiBhIHsgCiAgICBjb2xvcjogIzAwMWJmZjsKfQoKLm9vb0ZBUUFkZGl0aW9uYWxEYXRhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9Cgoub29vRkFRUmF0aW5nIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9CgouVm90aW5nQm94IHsKICAgIG1hcmdpbi10b3A6IDBweCAhaW1wb3J0YW50Owp9CgouUmF0ZUJ1dHRvbiB7CiAgICB3aWR0aDogMjBweDsKfQoKLlJhdGVMYWJlbEJlZm9yZSB7CiAgICBtYXJnaW4tbGVmdDogMHB4OwogICAgcGFkZGluZy1yaWdodDogM3B4Owp9CgouUmF0ZUxhYmVsQWZ0ZXIgewogICAgbWFyZ2luLXJpZ2h0OiAwcHg7Cn0KCiNNZXNzZW5nZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm9vb0ZBUUV4cGxvcmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIC4xNik7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCB2YXIoLS1jb2xTaGFkb3dEYXJrKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCAxNnB4Owp9Cgoub29vU2lkZUJhckljb25FeHBsb3JlciB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZpbGw6IHZhcigtLWNvbFRleHREYXJrKTsKfQoKLm9vb1NpZGVCYXJJY29uSG9tZSB7CiAgICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMXB4OwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7Cn0KCi5vb29JbmRleEljb25FeHBsb3JlciB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogMnB4OwogICAgY29udGVudDogdXJsKCAnLi4vaW1nL2ZhcS5zdmcnICk7Cn0KCi5MaW5rRkFRRXhwbG9yZXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgoub29vRkFRU2lkZWJhciB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCByZ2JhKDQsIDAsIDcxLCAuMTYpOwogICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgdmFyKC0tY29sU2hhZG93RGFyayk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgcGFkZGluZzogMTZweCAxNnB4IDE2cHggMTZweDsKfQoKLm9vb0ZBUVNpZGViYXJMaXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwogICAgbWF4LXdpZHRoOiAzMjBweDsKfQoKLm9vb0ZBUVNpZGViYXJIZWFkZXIgewogICAgY29sb3I6IHZhcigtLWNvbFRleHREYXJrKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBwYWRkaW5nOiAyNXB4IDEwcHggMTBweCAwcHg7Cn0KCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBwYWRkaW5nLWxlZnQ6IC4ycmVtOwogICAgcGFkZGluZy10b3A6IDhweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm9vb0ZBUVNpZGViYXJTdWJIZWFkZXIgLmZhLWNoZXZyb24tcmlnaHQgewogICAgbWFyZ2luLXJpZ2h0OiAxM3B4Owp9Cgoub29vRkFRSGVhZGVyIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIHBhZGRpbmc6IDhweCAwIDEycHggMDsKfQoKLm9vb0ZBUVNpZGViYXJIZWFkZXI6Zmlyc3QtY2hpbGQsCi5vb29GQVFUT0NIZWFkZXI6Zmlyc3QtY2hpbGQKewogICAgcGFkZGluZy10b3A6IDhweDsKfQoKLm9vb0ZBUUxpbmtzOmZpcnN0LWNoaWxkIHsKICAgIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi5vb29GQVFMaW5rcyA+IGxpIHsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlLAoub29vRkFRU2lkZWJhclN1YkhlYWRlciB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogImljb24gdGV4dCI7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSkgYXV0bzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLUZBUVNpZGViYXJJY29uTWFyZ2luKTsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nLXRvcDogMC4yNXJlbTsKICAgIHBhZGRpbmctbGVmdDogMC4xcmVtOwogICAgbWluLWhlaWdodDogdmFyKC0tRkFRU2lkZWJhckljb25TaXplKTsKfQoKLm9vb0ZBUUJveCBzdmcgewogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHRvcDogLTJweDsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygwKSBvcGFjaXR5KDAuNSk7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBzdmcgewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBmaWxsOiB2YXIoLS1jb2xUZXh0RGFyayk7Cn0KCi5vb29GQVFTaWRlYmFyTGlzdCBsaTpsYXN0LWNoaWxkIHsKICBwYWRkaW5nLWJvdHRvbTogMjBweDsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlKy5vb29GQVFTaWRlYmFySGVhZGVyIHsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTllOGU4OGM7CiAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgcGFkZGluZy10b3A6IDIwcHg7Cn0KCi5vb29TaWRlQmFySWNvbiwKLm9vb0ZBUVNpZGViYXIgLm9vb0ljb25TdWJIZWFkZXIsCi5vb29GQVFTaWRlYmFyQXJ0aWNsZSBzdmcgewogICAgd2lkdGg6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSk7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbik7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5vb29GQVFTaWRlYmFyIC5vb29JY29uU3ViSGVhZGVyIHsKICAgIGdyaWQtYXJlYTogaWNvbjsKICAgIGZvbnQtc2l6ZTogMTdweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0RGFyayk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5vb29GQVFUT0NBcnRpY2xlIGEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDgwJTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9Cgoub29vRkFRU2lkZWJhckFydGljbGUgYSwKLm9vb0ZBUVNpZGViYXJTdWJIZWFkZXIgc3BhbiB7CiAgICBncmlkLWFyZWE6IHRleHQ7CiAgICB0b3A6IDVweDsKICAgIHdpZHRoOiA4NSU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKfQoKLm9vb0ZBUVNpZGViYXJBcnRpY2xlOmhvdmVyIGEgewogICAgY29sb3I6IHZhcigtLWNvbE1haW5Ib3Zlcik7Cn0KCi5CYWNrVG9wIHsKICAgIGZsb2F0OiByaWdodDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xUZXh0TGlnaHQpOwogICAgb3BhY2l0eTogMC41Owp9CgouQ2FwdGlvbkxhYmVsIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKaHRtbCB7CiAgICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDsKICAgIHNjcm9sbC1wYWRkaW5nLXRvcDogMTQ1cHg7Cn0KCi5vb29GQVFTaWRlYmFyQXJ0aWNsZS5vb29GQVFTdWJIZWFkZXJTcGFjaW5nIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2U7CiAgICBwYWRkaW5nLWxlZnQ6IGNhbGMoIAogICAgICAgIHZhcigtLUZBUVNpZGViYXJJY29uU2l6ZSkgKyAKICAgICAgICB2YXIoLS1GQVFTaWRlYmFySWNvbk1hcmdpbikKICAgICk7IAp9Cgoub29vRkFRU2lkZWJhckFydGljbGUub29vLWlzLXZpc2libGUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIG9wYWNpdHk6IDE7Cn0KCi5vb29GQVFTaWRlYmFyU3ViSGVhZGVyLmlzLWV4cGFuZGVkIC5mYS1jaGV2cm9uLXJpZ2h0IHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2U7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0b3A6IDJweDsKfQoKLldpZGdldFNpbXBsZSA+IGEub29vRkFRTm9JdGVtcyB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogNjAwcHg7CiAgICB6LWluZGV4OiAxMDAwOwp9Cg==</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/FAQExtendedNavigation.Customer.FAQZoom.Detail.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIERlZmF1bHQgU2V0dGluZ3MKICovCgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7CiAgICAjb29vTWFpbkJveC5GQVFDb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtcm93LWdhcDogOHB4OwogICAgICAgIHdpZHRoOiBjYWxjKCAxMDAlIC0gMTZweCApOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gYXV0bzsKICAgIH0KCiAgICAjb29vSGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBncmlkOyAKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsgCiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiA0NXB4IDMwcHggMzZweDsKICAgICAgICBncmlkLXJvdy1nYXA6IDhweDsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgI0ZBUVNpZGViYXIgewogICAgICAgIGdyaWQtYXJlYTogMiAvIDEgLyAzIC8gMjsKICAgIH0KCiAgICAjb29vTWFpbkJveCA+IC5BcnRpY2xlQXJlYSB7CiAgICAgICAgZ3JpZC1hcmVhOiAxIC8gMSAvIDIgLyAyOwogICAgfQoKICAgICNvb29NYWluQm94ID4gLldpZGdldENvbHVtbiB7CiAgICAgICAgZGlzcGxheTogbm9uZQogICAgfQoKICAgICNNZXNzYWdlcyA+IGxpLAogICAgI1pvb21TaWRlYmFyIHsKICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICB9CgogICAgLk1haW5TaWRlQmFyIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICB9Cn0KCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICAgICNNZXNzYWdlcyA+IGxpLAogICAgI1pvb21TaWRlYmFyIHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgfQoKICAgIC5NYWluU2lkZUJhciB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgIH0KCgogICAgLkhlYWRlclJvd1RpdGxlIHsKICAgICAgZ3JpZC1yb3c6IHNwYW4gMjsKICAgIH0KCiAgICAuUHVibGljSGVhZGVyUm93VGl0bGUgewogICAgICBncmlkLXJvdzogc3BhbiAyOwogICAgICBwYWRkaW5nLWxlZnQ6IDE5MHB4OwogICAgfQp9CgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSBhbmQgKG1heC13aWR0aDogMTE3NXB4KSB7CiAgICAjb29vTWFpbkJveC5GQVFDb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgZ3JpZC1yb3ctZ2FwOiAyNHB4OwogICAgICAgIHdpZHRoOiBjYWxjKCAxMDAlIC0gMTA0cHggKTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDgwcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogMjRweDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gYXV0bzsKICAgIH0KCiAgICAjb29vSGVhZGVyIHsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDEwNHB4ICkgIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDgwcHggIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgZGlzcGxheTogZ3JpZDsgCiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzMzJweCAxZnI7IAogICAgICAgIGdyaWQtY29sdW1uLWdhcDogMjRweDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDQ4cHggNDhweDsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgI0ZBUVNpZGViYXIgewogICAgICAgIGdyaWQtYXJlYTogMiAvIDEgLyAzIC8gMjsKICAgIH0KCiAgICAjb29vTWFpbkJveCA+IC5BcnRpY2xlQXJlYSB7CiAgICAgICAgZ3JpZC1hcmVhOiAxIC8gMSAvIDIgLyAyOwogICAgfQoKICAgICNvb29NYWluQm94ID4gLldpZGdldENvbHVtbiB7CiAgICAgICAgZGlzcGxheTogbm9uZQogICAgfQp9CgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDExNzZweCApIGFuZCAobWF4LXdpZHRoOiAxNDM5cHgpIHsKICAgICNvb29NYWluQm94LkZBUUNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgICBncmlkLWNvbHVtbi1nYXA6IDI0cHg7CiAgICAgICAgd2lkdGg6IGNhbGMoIDEwMCUgLSAxMDRweCApOwogICAgICAgIHBhZGRpbmctbGVmdDogODBweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4OwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogY2FsYyggMTAwJSAtIDM0NHB4ICkgMzIwcHg7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBhdXRvIDFmcjsKICAgIH0KCiAgICAjb29vSGVhZGVyIHsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDEwNHB4ICkgIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDgwcHggIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgZGlzcGxheTogZ3JpZDsgCiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzMzJweCBjYWxjKCAxMDAlIC0gNDMycHggKTsgCiAgICAgICAgZ3JpZC1jb2x1bW4tZ2FwOiAyNHB4OwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogNDhweCA0OHB4OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAjRkFRU2lkZWJhciB7CiAgICAgICAgZ3JpZC1hcmVhOiAyIC8gMiAvIDMgLyAzOwogICAgfQoKICAgICNvb29NYWluQm94ID4gLkFydGljbGVBcmVhIHsKICAgICAgICBncmlkLWFyZWE6IDEgLyAxIC8gMyAvIDI7CiAgICB9CgogICAgI29vb01haW5Cb3ggPiAuV2lkZ2V0Q29sdW1uIHsKICAgICAgICBncmlkLWFyZWE6IDEgLyAyIC8gMiAvIDM7CiAgICB9Cn0KCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTQ0MHB4ICkgYW5kIChtYXgtd2lkdGg6IDE3MjdweCkgewogICAgI29vb01haW5Cb3guRkFRQ29udGVudCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIGdyaWQtY29sdW1uLWdhcDogMjRweDsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDEwNHB4ICk7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA4MHB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDI0cHg7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyNDBweCBjYWxjKCAxMDAlIC0gNjA4cHggKSAzMjBweDsKICAgIH0KCiAgICAjb29vSGVhZGVyIHsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDEwNHB4ICkgIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDgwcHggIWltcG9ydGFudDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgZGlzcGxheTogZ3JpZDsgCiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzMzJweCBjYWxjKCAxMDAlIC0gNzkycHggKTsgCiAgICAgICAgZ3JpZC1jb2x1bW4tZ2FwOiAyNHB4OwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogNDhweCA0OHB4OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAub29vRkFRU2lkZWJhciB7CiAgICAgICAgbWluLWhlaWdodDogNTB2aDsKICAgIH0KfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxNzI4cHggKSB7CiAgICAjb29vTWFpbkJveC5GQVFDb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgZ3JpZC1jb2x1bW4tZ2FwOiAyNHB4OwogICAgICAgIHdpZHRoOiAxNjI0cHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiBjYWxjKCA1MCUgLSA3ODRweCApOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IGNhbGMoIDUwJSAtIDg0MHB4ICk7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyNDBweCAxMDE2cHggMzIwcHg7CiAgICB9CgogICAgI29vb0hlYWRlciB7CiAgICAgICAgd2lkdGg6IDE2MjRweCAhaW1wb3J0YW50OwogICAgICAgIHBhZGRpbmctbGVmdDogY2FsYyggNTAlIC0gNzg0cHggKSAhaW1wb3J0YW50OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IGNhbGMoIDUwJSAtIDg0MHB4ICkgIWltcG9ydGFudDsKICAgICAgICBkaXNwbGF5OiBncmlkOyAKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDMzMnB4IDgzMnB4OyAKICAgICAgICBncmlkLWNvbHVtbi1nYXA6IDI0cHg7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiA0OHB4IDQ4cHg7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5vb29GQVFTaWRlYmFyIHsKICAgICAgICBtaW4taGVpZ2h0OiA1MHZoOwogICAgfQp9CgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKICAgICNvb29IZWFkZXIgaSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDNweDsKICAgIH0KCiAgICAuQnJlYWRDcnVtYiB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIH0KCiAgICAuQnJlYWRDcnVtYiBhLAogICAgLkJyZWFkQ3J1bWIgaDMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIH0KCiAgICAuQnJlYWRDcnVtYiA+IGE6YWZ0ZXIgewogICAgICAgIC8qIHVzZSAhaW1wb3J0YW50IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggYnJvd3NlciBleHRlbnNpb25zIHRoYXQgY2hhbmdlIGZvbnRzICovCiAgICAgICAgZm9udC1mYW1pbHk6ICdvdG9ibycgIWltcG9ydGFudDsKICAgICAgICBzcGVhazogbm9uZTsKICAgICAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBsaW5lLWhlaWdodDogMTsKCiAgICAgICAgLyogQmV0dGVyIEZvbnQgUmVuZGVyaW5nID09PT09PT09PT09ICovCiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTsKCiAgICAgICAgY29udGVudDogIlxlOTA0IjsKICAgICAgICBjb2xvcjogIzdmODA5ZDsKICAgICAgICBjb2xvcjogdmFyKC0tY29sVGV4dExpZ2h0KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDRweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICB9CgogICAgI29vb0N1c3RvbWVyTm90aWZpY2F0aW9ucyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmOTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xCR0xpZ2h0KTsKICAgIH0KCiAgICAuSGVhZGVyIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMTZweDsKICAgIH0KCi8qIFN1YkNhdGVnb3JpZXMgKi8KICAgIC5vb29TdWJCb3ggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0b3A6IC01cHg7CiAgICAgICAgbGVmdDogLTVweDsKICAgICAgICBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7CiAgICAgICAgbWFyZ2luLXRvcDogOHB4OwoKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbWF4LWhlaWdodDogMjYwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIH0KCiAgICAub29vU3ViIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiA2NnB4OwogICAgICAgIHdpZHRoOiAyNTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIDAuMTYpOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHZhcigtLWNvbFNoYWRvd0RhcmspOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNnB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgcGFkZGluZzogMjRweCAyNHB4IDI0cHggMjRweDsKICAgIH0KCiAgICAub29vU3ViID4gaDMsCiAgICAub29vU3ViID4gcCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQoKICAgIC5vb29TdWIgPiBoMyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1heC13aWR0aDogMjIwcHg7CiAgICB9CgogICAgLm9vb1N1YkNvdW50IHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy10b3A6IDJweDsKICAgIH0KCiAgICAub29vQ29tbWVudCB7CiAgICAgICAgaGVpZ2h0OiA0MnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgfQoKLyogYXJ0aWNsZSBsaXN0ICovCiAgICAuSGVhZGVyID4gaDIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIH0KICAgIC5QYWdpbmF0aW9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogMzZweDsKICAgIH0KCiAgICAub29vRkFRIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDMwcHg7CiAgICAgICAgd2lkdGg6IGNhbGMoIDEwMCUgLSA3MnB4ICk7CiAgICAgICAgbWF4LXdpZHRoOiAxMDQ4cHg7IC8qIGNvbnNpZGVyIHJlbW92aW5nIHdoZW4gbWVyZ2luZyB3aXRoIEZBUSAqLwogICAgICAgIGJvcmRlci1yYWRpdXM6IDE1cHg7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgcmdiYSg0LCAwLCA3MSwgMC4xNik7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNHB4IDAgdmFyKC0tY29sU2hhZG93RGFyayk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgICBwYWRkaW5nOiAyNHB4IDM2cHggMjRweCAzNnB4OwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICB9CgogICAgLm9vb0ZBUSBoMiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1heC13aWR0aDogY2FsYyggMTAwJSAtIDQwcHggKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB9CgogICAgLm9vb0ZBUSBwIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgcGFkZGluZy10b3A6IDJweDsKICAgIH0KCi8qIGFydGljbGUgem9vbSAqLwoKICAgICNNZXNzYWdlcyA+IGxpLAogICAgI1pvb21TaWRlYmFyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogY2FsYyggMTAwJSAtIDcycHggKTsKICAgICAgICBtYXgtd2lkdGg6IDk3OHB4OyAvKiBjb25zaWRlciByZW1vdmluZyB3aGVuIG1lcmdpbmcgd2l0aCBGQVEgKi8KICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYmEoNCwgMCwgNzEsIDAuMTYpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICAgICAgcGFkZGluZzogMjRweCAzNnB4IDI0cHggMzZweDsKICAgIH0KCiAgICAjTWVzc2FnZXMgLk1lc3NhZ2VCb2R5IHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgIH0KCiAgICAuQXR0YWNobWVudHMsCiAgICAjTWV0YWRhdGEgewogICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICB9CgovKiBSYXRpbmcgKi8KICAgIC5SYXRlQnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMzBweDsKICAgICAgICB3aWR0aDogMjVweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgY29sb3I6ICMwMDAwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgfQogICAgCiAgICAuUlRMIC5SYXRlQnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICB9CiAgICAKICAgIC5SYXRlQnV0dG9uIGkgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICM3ZjgwOWQ7CiAgICAgICAgY29sb3I6IHZhcigtLWNvbFRleHRMaWdodCk7CiAgICB9CiAgICAKICAgIC5SYXRlQnV0dG9uIGkuZmEtc3RhciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KICAgIAogICAgLlJhdGVCdXR0b24uUmF0ZUNoZWNrZWQgaS5mYS1zdGFyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBjb2xvcjogIzAwMWJmZjsKICAgICAgICBjb2xvcjogdmFyKC0tY29sTWFpbkxpZ2h0KTsKICAgIH0KICAgIAogICAgLlJhdGVCdXR0b24uUmF0ZUNoZWNrZWQgaS5mYS1zdGFyLW8gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CiAgICAKICAgIC5SYXRlQnV0dG9uOmhvdmVyIGkuZmEtc3Rhci1vIHsKICAgICAgICBjb2xvcjogIzAwMDIzYzsKICAgICAgICBjb2xvcjogdmFyKC0tY29sTWFpbkRhcmspOwogICAgfQogICAgCiAgICAuUmF0ZVN0YXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxcHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgfQogICAgCiAgICAuUlRMIC5SYXRlU3RhciB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgfQogICAgCiAgICAuUmF0ZVN0YXJUZXh0IHsKICAgICAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgfQogICAgCiAgICAuUlRMIC5SYXRlU3RhclRleHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA2cHg7CiAgICB9CiAgICAKICAgIC5SYXRlTGFiZWxCZWZvcmUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICB9CiAgICAKICAgIC5SVEwgLlJhdGVMYWJlbEJlZm9yZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgfQogICAgCiAgICAuUmF0ZUxhYmVsQWZ0ZXIgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyNXB4OwogICAgfQogICAgCiAgICAuUlRMIC5SYXRlTGFiZWxBZnRlciB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDY1cHg7CiAgICB9CiAgICAKICAgIC5SYXRpbmdMYWJlbCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMnB4OwogICAgfQogICAgCiAgICAuUlRMIC5SYXRpbmdMYWJlbCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgfQoKICAgIC5Wb3RpbmdCb3ggewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICB9CgogICAgI0ZBUVZvdGluZyAuU3BhY2luZ1RvcCB7CiAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgfQp9Cg==</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/RichTextArticleContent.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8qIEFkZGVkIGZyb20gdmFyL2h0dHBkL2h0ZG9jcy9za2lucy9BZ2VudC9kZWZhdWx0L2Nzcy9Db3JlLlJlc2V0LmNzcyB0byBlbnN1cmUgY29uc2lzdGVudCBzdHlsaW5nICovCgouY2stY29udGVudCBodG1sLCAuY2stY29udGVudCBib2R5LCAuY2stY29udGVudCBkaXYsCi5jay1jb250ZW50IHNwYW4sIC5jay1jb250ZW50IGgxLCAuY2stY29udGVudCBoMiwKLmNrLWNvbnRlbnQgaDMsIC5jay1jb250ZW50IGg0LCAuY2stY29udGVudCBoNSwKLmNrLWNvbnRlbnQgaDYsIC5jay1jb250ZW50IHAsIC5jay1jb250ZW50IGJsb2NrcXVvdGUsCi5jay1jb250ZW50IGNpdGUsIC5jay1jb250ZW50IGNvZGUsCi5jay1jb250ZW50IGVtLCAuY2stY29udGVudCBpbWcsCi5jay1jb250ZW50IHEsIC5jay1jb250ZW50IHMsCi5jay1jb250ZW50IHNtYWxsLCAuY2stY29udGVudCBzdHJpa2UsIC5jay1jb250ZW50IHN0cm9uZywKLmNrLWNvbnRlbnQgc3ViLCAuY2stY29udGVudCBzdXAsIC5jay1jb250ZW50IHR0LAouY2stY29udGVudCB2YXIsIC5jay1jb250ZW50IGRsLCAuY2stY29udGVudCBkdCwKLmNrLWNvbnRlbnQgZGQsIC5jay1jb250ZW50IG9sLCAuY2stY29udGVudCB1bCwKLmNrLWNvbnRlbnQgbGksIC5jay1jb250ZW50IGZpZWxkc2V0LCAuY2stY29udGVudCBmb3JtLAouY2stY29udGVudCBsYWJlbCwgLmNrLWNvbnRlbnQgbGVnZW5kLCAuY2stY29udGVudCB0YWJsZSwKLmNrLWNvbnRlbnQgY2FwdGlvbiwgLmNrLWNvbnRlbnQgdGJvZHksIC5jay1jb250ZW50IHRmb290LAouY2stY29udGVudCB0aGVhZCwgLmNrLWNvbnRlbnQgdHIsIC5jay1jb250ZW50IHRoLAouY2stY29udGVudCB0ZCwgLmNrLWNvbnRlbnQgaHIgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMDsKICAgIG91dGxpbmU6IDA7CiAgICBmb250LXdlaWdodDogaW5oZXJpdDsKICAgIGZvbnQtc3R5bGU6IGluaGVyaXQ7CiAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgICBkaXJlY3Rpb246IGluaGVyaXQ7Cn0KCi8qIEVuZCBvZiBhZGRpdGlvbnMgZnJvbSBDb3JlLlJlc2V0LmNzcyAqLwoKLmNrLWNvbnRlbnQgewogICAgdGV4dC13cmFwOiB3cmFwOwogICAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgIGNvbG9yOiAjMDAwMjNjOwogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgovKiBSb3RoZXIgT1NTIC8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbiAqLwouY2stY29udGVudCBhLAouY2stY29udGVudCBhLm1lbnRpb24gewovKiBFTyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci8qIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLyogRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbiAqLwogICAgY29sb3I6ICMwMDFiZmY7Cn0KCi5jay1jb250ZW50IGE6aG92ZXIsCi8qIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCi5jay1jb250ZW50IGEubWVudGlvbjpob3ZlciwKLmNrLWNvbnRlbnQgYTpmb2N1cywKLmNrLWNvbnRlbnQgYS5tZW50aW9uOmZvY3VzIHsKLyogRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbiAqLwogICAgY29sb3I6ICMwMDAyM2M7Ci8qIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLyogRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbiAqLwp9CgouY2stY29udGVudCAqOnZpc2l0ZWQgewogICAgY29sb3I6ICMwMDFiZmY7Ci8qIFJvdGhlciBPU1MgLyBGQVEtRXh0ZW5kZWROYXZpZ2F0aW9uICovCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLyogRU8gRkFRLUV4dGVuZGVkTmF2aWdhdGlvbiAqLwp9CgouY2stY29udGVudCBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi5jay1jb250ZW50IGVtIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLmNrLWNvbnRlbnQuQ3VzdG9tZXJVSSB7CiAgICBmb250LWZhbWlseTogIlF1aWNrc2FuZCI7Cn0KCi5jay1jb250ZW50LkN1c3RvbWVyVUkgKiB7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKfQoKLmNrLWNvbnRlbnQgZmlndXJlLnRhYmxlIHsKICAgIG1hcmdpbjogMCAwIDAgMDsKICAgIHdpZHRoOiAxMDAlOwp9CgouY2stY29udGVudCBwIHsKICAgIG1hcmdpbi10b3A6IDBweDsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmNrLWNvbnRlbnQgaDEgewogICAgZm9udC1zaXplOiAyZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICBjb2xvcjogaW5oZXJpdDsKfSAKCi5jay1jb250ZW50IGgyIHsKICAgIGZvbnQtc2l6ZTogMS41ZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICBjb2xvcjogaW5oZXJpdDsKfQoKLmNrLWNvbnRlbnQgaDMgewogICAgZm9udC1zaXplOiAxLjE3ZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgIGNvbG9yOiBpbmhlcml0Owp9CgouY2stY29udGVudCBoNCB7CiAgICBmb250LXNpemU6IDFlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgY29sb3I6IGluaGVyaXQ7Cn0KCi5jay1jb250ZW50IGg1IHsKICAgIGZvbnQtc2l6ZTogMC44M2VtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICBjb2xvcjogaW5oZXJpdDsKfSAKCi5jay1jb250ZW50IGg2IHsKICAgIGZvbnQtc2l6ZTogMC42N2VtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBjb2xvcjogaW5oZXJpdDsKfSAKCi5jay1jb250ZW50IGJsb2NrcXVvdGUgewogICAgZm9udC1zdHlsZTogbm9ybWFsICFpbXBvcnRhbnQ7CiAgICBib3JkZXItbGVmdDogc29saWQgIzAwMDA5OSAxLjVwdCAhaW1wb3J0YW50OyAKICAgIHBhZGRpbmc6IDBjbSAwY20gMGNtIDRwdCAhaW1wb3J0YW50OwogICAgbWFyZ2luOiAwOwp9CgouY2stY29udGVudCB1bCwKLmNrLWNvbnRlbnQgb2wgIAp7CiAgICBwYWRkaW5nOiAwIDUwcHg7Cn0KCi8qIGRlZmF1bHQgaW1hZ2Ugc3R5bGUgKi8KLmNrLWNvbnRlbnQgZmlndXJlLmltYWdlOm5vdCggICAuaW1hZ2Utc3R5bGUtYWxpZ24tY2VudGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW1hZ2Utc3R5bGUtYmxvY2stYWxpZ24tcmlnaHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbWFnZS1zdHlsZS1hbGlnbi1sZWZ0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW1hZ2Utc3R5bGUtYWxpZ24tcmlnaHQpIAp7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIHZhcigtLWNrLWltYWdlLXN0eWxlLXNwYWNpbmcpKTsKICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgbWFyZ2luLXJpZ2h0OiBhdXRvCn0KCi5jay1jb250ZW50IGNvZGUgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKfQo=</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>