<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>DiscreteSystemAddresses</Name>
    <Version>10.1.11</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-04-24 09:01:26" Version="10.1.11">Updated to OTOBO 10.1.17.</ChangeLog>
    <ChangeLog Date="2025-05-06 12:14:22" Version="10.1.10">Update to OTOBO 10.1.13.</ChangeLog>
    <ChangeLog Date="2023-03-09 13:25:18" Version="10.1.9">- Optionally clean all ticket numbers.
- Allow multiple parsing of emails with same message-id (bounce/dispatch via queue).
- Take dispatched queue id into consideration.</ChangeLog>
    <ChangeLog Date="2023-03-02 15:45:50" Version="10.1.8">Fix case mismatch in email addresses. Do not log if no message id is found.</ChangeLog>
    <ChangeLog Date="2023-02-27 16:23:08" Version="10.1.7">Disable dispatching via queue for mailaccounts if multiple pools are addressed. (Missing in 10.1.6)</ChangeLog>
    <ChangeLog Date="2023-02-24 14:54:25" Version="10.1.6">Fix sending form one pool to multiple other pools. Disable dispatching via queue for mailaccounts if multiple pools are addressed.</ChangeLog>
    <ChangeLog Date="2023-02-23 09:50:00" Version="10.1.5">Add ITSMIncidentProblemManagement compatibility to AgentTicketEmail.</ChangeLog>
    <ChangeLog Date="2023-02-22 13:44:50" Version="10.1.4">Add additional address pools. Introduce SysConfig for custom email headers.</ChangeLog>
    <ChangeLog Date="2023-02-21 14:03:26" Version="10.1.3">Handle mails sent by the system correctly.</ChangeLog>
    <ChangeLog Date="2023-02-21 10:20:07" Version="10.1.2">Improve documentation.</ChangeLog>
    <ChangeLog Date="2023-02-21 09:34:46" Version="10.1.1">Initial Release.</ChangeLog>
    <Description Lang="en">This extension facilitates communication between system addresses within OTOBO (e.g. in cc), by linking tickets in different queues to each other and using address pools to ensure a new article is added to all relevant tickets within the system (e.g. one in the IT Queue and one in HR).</Description>
    <Description Lang="de">Diese Erweiterung erleichtert die Kommunikation zwischen Systemadressen innerhalb von OTOBO (z. B. in cc), indem sie Tickets in verschiedenen Queues miteinander verknüpft und Adress-Bereiche verwendet, um sicherzustellen, dass ein neuer Artikel zu allen relevanten Tickets innerhalb des Systems hinzugefügt wird (z. B. eines in der IT-Queue und eine in der Personalabteilung).</Description>
    <Framework Minimum="10.1.13">10.1.x</Framework>
    <IntroInstall Lang="en" Title="Install Information" Type="pre">
        &lt;br/&gt;
        &lt;strong&gt;WELCOME&lt;/strong&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        You are about to install the OTOBO package DiscreteSystemAddresses.&lt;br/&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        ((enjoy))&lt;br/&gt;
        &lt;br/&gt;
    </IntroInstall>
    <IntroInstall Lang="de" Title="Installation Information" Type="pre">
        &lt;br/&gt;
        &lt;strong&gt;WILLKOMMEN&lt;/strong&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        Sie sind im Begriff das OTOBO-Paket DiscreteSystemAddresses zu installieren.&lt;br/&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        ((enjoy))&lt;br/&gt;
        &lt;br/&gt;
    </IntroInstall>
    <BuildCommitID>b6317c8ab72167ae24967aad22bfa09bf6b66f05</BuildCommitID>
    <BuildDate>2026-04-24 09:01:29</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Kernel/Autoload/TicketSubjectCleanInterdivisional.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDIyIFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5kZS8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7ICAgICMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsgICAgIyMgbm8gY3JpdGljIChNb2R1bGVzOjpSZXF1aXJlRmlsZW5hbWVNYXRjaGVzUGFja2FnZSkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAopOwoKIyBkaXNhYmxlIHJlZGVmaW5lIHdhcm5pbmdzIGluIHRoaXMgc2NvcGUKewogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsgICAgIyMgbm8gY3JpdGljIHF3KFRlc3RpbmdBbmREZWJ1Z2dpbmc6OlByb2hpYml0Tm9XYXJuaW5ncykKCiAgICAjIGJhY2t1cCBvcmlnaW5hbCByb3V0aW5lcwogICAgbXkgJFRpY2tldFN1YmplY3RDbGVhbiA9IFwmS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6VGlja2V0U3ViamVjdENsZWFuOwoKICAgICMgUmVtb3ZlIGludGVyZGl2aXNpb25hbCB0aWNrZXQgbnVtYmVycwogICAgKktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OlRpY2tldFN1YmplY3RDbGVhbiA9IHN1YiB7CiAgICAgICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAgICAgIyBzdGFuZGFyZCBjbGVhbmVkIHN1YmplY3QKICAgICAgICBteSAkU3ViamVjdCA9ICZ7JFRpY2tldFN1YmplY3RDbGVhbn0oQF8pOwoKICAgICAgICByZXR1cm4gaWYgIWRlZmluZWQgJFN1YmplY3Q7CgogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAjIGdldCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICRUaWNrZXRIb29rICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJyk7CiAgICAgICAgbXkgJFRpY2tldEhvb2tEaXZpZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyk7CgogICAgICAgIHJldHVybiAkU3ViamVjdCBpZiAkU3ViamVjdCAhfiAvJFRpY2tldEhvb2svOwogICAgICAgIHJldHVybiAkU3ViamVjdCBpZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U3ViamVjdENsZWFuQWxsTnVtYmVycycpOwoKICAgICAgICBteSAkVGlja2V0SUQgPSAkU2VsZi0+VGlja2V0SURMb29rdXAoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkUGFyYW17VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbGlua2VkIHRpY2tldHMKICAgICAgICBteSAlTGlua2VkVGlja2V0cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtLZXlMaXN0V2l0aERhdGEoCiAgICAgICAgICAgIE9iamVjdDEgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIEtleTEgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBPYmplY3QyID0+ICdUaWNrZXQnLAogICAgICAgICAgICBTdGF0ZSAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ0ludGVyZGl2aXNpb25hbCcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFN1YmplY3QgaWYgISVMaW5rZWRUaWNrZXRzOwoKICAgICAgICBmb3IgbXkgJFRpY2tldCAoIHZhbHVlcyAlTGlua2VkVGlja2V0cyApIHsKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHBvc3NpYmxlIHRpY2tldCBob29rIGZvcm1hdHMgd2l0aCBbXQogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xbXHMqXFEkVGlja2V0SG9vazogJFRpY2tldC0+e1RpY2tldE51bWJlcn1cRVxzKlxdXHMqLy9nOwogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xbXHMqXFEkVGlja2V0SG9vazokVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqXF1ccyovL2c7CiAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXFtccypcUSRUaWNrZXRIb29rJFRpY2tldEhvb2tEaXZpZGVyJFRpY2tldC0+e1RpY2tldE51bWJlcn1cRVxzKlxdXHMqLy9nOwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHBvc3NpYmxlIHRpY2tldCBob29rIGZvcm1hdHMgd2l0aG91dCBbXQogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xRJFRpY2tldEhvb2s6ICRUaWNrZXQtPntUaWNrZXROdW1iZXJ9XEVccyovL2c7CiAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXFEkVGlja2V0SG9vazokVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqLy9nOwogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xRJFRpY2tldEhvb2skVGlja2V0SG9va0RpdmlkZXIkVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqLy9nOwogICAgICAgIH0KCiAgICAgICAgIyB0cmltIHdoaXRlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kCiAgICAgICAgJFN1YmplY3QgPX4gcy8oXlxzK3xccyskKS8vOwoKICAgICAgICByZXR1cm4gJFN1YmplY3Q7CiAgICB9Owp9CgoxOwo=</File>
        <File Location="Kernel/Config/Files/XML/AddressPool.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sOjpFbWFpbEhlYWRlcnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW1haWwgaGVhZGVycyB1c2VkIGZvciBhZGRyZXNzLXBvb2wgYXNzaWdubWVudC4gU2Vjb25kYXJ5IGhlYWRlcnMgYXJlIG5vdCBldmFsdWF0ZWQgaWYgcG9vbHMgY291bGQgYmUgYXNzaWduZWQgdmlhIHRoZSBwcmltYXJ5IGhlYWRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3RlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmltYXJ5Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlJlc2VudC1UbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RW52ZWxvcGUtVG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5DYzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZWNvbmRhcnkiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RGVsaXZlcmVkLVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5YLU9yaWdpbmFsLVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDAyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDA1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDA4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwOSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDExIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDE0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDE3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxOCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDIwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wyMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMjIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDIzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wyNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMjUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNJbnRlcmRpdmlzaW9uYWwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnSW50ZXJkaXZpc2lvbmFsJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb3VyY2VOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkludGVyZGl2aXNpb25hbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5JbnRlcmRpdmlzaW9uYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMjIwMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaW5rcyAyIHRpY2tldHMgd2l0aCBhICJJbnRlcmRpdmlzaW9uYWwiIHR5cGUgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkludGVyZGl2aXNpb25hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUjIyMwMDAtU2tpcFZpYU1lc3NhZ2VJRCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gY2hlY2sgaWYgYW4gYXJ0aWNsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgaWQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHN5c3RlbS4gKEUuZy4gaWYgdGhlIG1haWwgd2FzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQgdGhyb3VnaCBhIGRpZmZlcmVudCBlbWFpbCBpbmJveC4pIE11bHRpcGxlIHBhcnNpbmcgY2FuIGJlIGFsbG93ZWQuIFBvb2xzIHdoaWNoIGFscmVhZHkgY29udGFpbiBhbiBhcnRpY2xlIHdpdGggdGhlIHJlc3BlY3RpdmUgbWVzc2FnZSBpZCB3aWxsIHN0aWxsIGJlIGlnbm9yZWQuIE9wdGlvbnMgYXJlICJBbHdheXMiLCAiQm91bmNlZEVtYWlsIiAobXVsdGlwbGUgcGFyc2luZyB3aWxsIG9ubHkgYmUgZG9uZSBmb3IgRW1haWxzIHdpdGggIlJlc2VudC1UbyItaGVhZGVyLCBlLmcuIFBvb2xBIGJvdW5jZWQgYSBtYWlsIHRvIFBvb2xCKSBhbmQgIk1haWxBY2NvdW50UXVldWUiIChpZiBkaXNwYXRjaGluZyB2aWEgcXVldWUgaXMgZW5hYmxlZCBmb3IgYSBtYWlsIGFjY291bnQsIGFuIGVtYWlsIGNhbiBiZSBtb3ZlZCB0byB0aGUgcmVzcGVjdGl2ZSBpbmJveCwgdG8gYmUgZXZhbHVhdGVkIGFnYWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U2tpcFZpYU1lc3NhZ2VJRDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWxsb3dNdWx0aVBhcnNlIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBbHdheXMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFpbEFjY291bnRRdWV1ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCb3VuY2VkRW1haWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkF1dG9sb2FkUGVybFBhY2thZ2VzIyMjMTAwMC1UaWNrZXRTdWJqZWN0Q2xlYW5JbnRlcmRpdmlzaW9uYWxUaWNrZXROdW1iZXJzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlbW92ZSB0aWNrZXQgbnVtYmVycyBvZiBhbGwgaW50ZXJkaXZpc2lvbmFsbHkgbGlua2VkIHRpY2tldHMgd2hlbiBzdWJqZWN0IGlzIGNsZWFuZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRvbG9hZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIj5LZXJuZWw6OkF1dG9sb2FkOjpUaWNrZXRTdWJqZWN0Q2xlYW5JbnRlcmRpdmlzaW9uYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cg==</File>
        <File Location="Kernel/Language/de_DiscreteSystemAddresses.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0Rpc2NyZXRlU3lzdGVtQWRkcmVzc2VzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWFpbCBoZWFkZXJzIHVzZWQgZm9yIGFkZHJlc3MtcG9vbCBhc3NpZ25tZW50LiBTZWNvbmRhcnkgaGVhZGVycyBhcmUgbm90IGV2YWx1YXRlZCBpZiBwb29scyBjb3VsZCBiZSBhc3NpZ25lZCB2aWEgdGhlIHByaW1hcnkgaGVhZGVycy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRlcmRpdmlzaW9uYWwnfSA9ICdCZXJlaWNoc8O8YmVyZ3JlaWZlbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgMiB0aWNrZXRzIHdpdGggYSAiSW50ZXJkaXZpc2lvbmFsIiB0eXBlIGxpbmsuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayBpZiBhbiBhcnRpY2xlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBpZCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3lzdGVtLiAoRS5nLiBpZiB0aGUgbWFpbCB3YXMgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZCB0aHJvdWdoIGEgZGlmZmVyZW50IGVtYWlsIGluYm94LikgTXVsdGlwbGUgcGFyc2luZyBjYW4gYmUgYWxsb3dlZC4gUG9vbHMgd2hpY2ggYWxyZWFkeSBjb250YWluIGFuIGFydGljbGUgd2l0aCB0aGUgcmVzcGVjdGl2ZSBtZXNzYWdlIGlkIHdpbGwgc3RpbGwgYmUgaWdub3JlZC4gT3B0aW9ucyBhcmUgIkFsd2F5cyIsICJCb3VuY2VkRW1haWwiIChtdWx0aXBsZSBwYXJzaW5nIHdpbGwgb25seSBiZSBkb25lIGZvciBFbWFpbHMgd2l0aCAiUmVzZW50LVRvIi1oZWFkZXIsIGUuZy4gUG9vbEEgYm91bmNlZCBhIG1haWwgdG8gUG9vbEIpIGFuZCAiTWFpbEFjY291bnRRdWV1ZSIgKGlmIGRpc3BhdGNoaW5nIHZpYSBxdWV1ZSBpcyBlbmFibGVkIGZvciBhIG1haWwgYWNjb3VudCwgYW4gZW1haWwgY2FuIGJlIG1vdmVkIHRvIHRoZSByZXNwZWN0aXZlIGluYm94LCB0byBiZSBldmFsdWF0ZWQgYWdhaW4pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbW92ZSB0aWNrZXQgbnVtYmVycyBvZiBhbGwgaW50ZXJkaXZpc2lvbmFsbHkgbGlua2VkIHRpY2tldHMgd2hlbiBzdWJqZWN0IGlzIGNsZWFuZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSBcJ0ludGVyZGl2aXNpb25hbFwnLiBJZiB0aGUgc291cmNlIG5hbWUgYW5kIHRoZSB0YXJnZXQgbmFtZSBjb250YWluIHRoZSBzYW1lIHZhbHVlLCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBub24tZGlyZWN0aW9uYWwgb25lLiBJZiB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIGRpcmVjdGlvbmFsIGxpbmsuJ30gPQogICAgICAgICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICk7Cgp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/PostMaster.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9Qb3N0TWFzdGVyLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyOwojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3Nlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sOwojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCnVzZSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RGVzdFF1ZXVlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6Ok5ld1RpY2tldDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGb2xsb3dVcDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpSZWplY3Q7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoSXNIYXNoUmVmV2l0aERhdGEpOwoKb3VyICVPYmplY3RNYW5hZ2VyRmxhZ3MgPSAoCiAgICBOb25TaW5nbGV0b24gPT4gMSwKKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyIC0gcG9zdG1hc3RlciBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIHBvc3RtYXN0ZXIgZnVuY3Rpb25zLiBFLiBnLiB0byBwcm9jZXNzIGVtYWlscy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRQb3N0TWFzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIEVtYWlsICAgICAgICA9PiBcQEFycmF5T2ZFbWFpbENvbnRlbnQsCiAgICAgICAgICAgIFRydXN0ZWQgICAgICA9PiAxLCAjIDF8MCBpZ25vcmUgWC1PVE9CTyBoZWFkZXIgaWYgZmFsc2UKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntFbWFpbH0gICAgICAgICAgICAgICAgICA9ICRQYXJhbXtFbWFpbH0gICAgICAgICAgICAgICAgICB8fCBkaWUgIkdvdCBubyBFbWFpbCEiOwogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRQYXJhbXtDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBDb21tdW5pY2F0aW9uTG9nT2JqZWN0ISI7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgJFNlbGYtPntPcmlnaW5Db21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH07CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKCiAgICAkU2VsZi0+e1BhcnNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICBFbWFpbCA9PiAkUGFyYW17RW1haWx9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpEZXN0UXVldWUtPm5ldyggJXskU2VsZn0gKTsKIyAgICAkU2VsZi0+e05ld1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6TmV3VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7CiMgICAgJFNlbGYtPntGb2xsb3dVcE9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZvbGxvd1VwLT5uZXcoICV7JFNlbGZ9ICk7CiMgICAgJFNlbGYtPntSZWplY3RPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OlJlamVjdC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPl9DcmVhdGVNYWlsT2JqZWN0cygKICAgICAgICBEYXRhID0+ICRTZWxmLAogICAgKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIGNvbmZpZyBvcHRpb25zCiAgICBmb3IgbXkgJE9wdGlvbiAocXcoUG9zdG1hc3RlclVzZXJJRCBQb3N0bWFzdGVyWC1IZWFkZXIpKSB7CiAgICAgICAgJFNlbGYtPnskT3B0aW9ufSA9ICRDb25maWdPYmplY3QtPkdldCgkT3B0aW9uKQogICAgICAgICAgICB8fCBkaWUgIkZvdW5kIG5vICckT3B0aW9uJyBvcHRpb24gaW4gY29uZmlndXJhdGlvbiEiOwogICAgfQoKICAgICMgc2hvdWxkIEkgdXNlIHgtb3RvYm8gaGVhZGVycz8KICAgICRTZWxmLT57VHJ1c3RlZH0gPSBkZWZpbmVkICRQYXJhbXtUcnVzdGVkfSA/ICRQYXJhbXtUcnVzdGVkfSA6IDE7CgogICAgaWYgKCAkU2VsZi0+e1RydXN0ZWR9ICkgewoKICAgICAgICAjIGdldCBkeW5hbWljIGZpZWxkIG9iamVjdHMKICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICAgICAjIGFkZCBEeW5hbWljIEZpZWxkIGhlYWRlcnMKICAgICAgICBteSAkRHluYW1pY0ZpZWxkcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3QoCiAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICAgICAgUmVzdWx0VHlwZSA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSBsb29rdXAgdGFibGUKICAgICAgICBteSAlSGVhZGVyTG9va3VwID0gbWFwIHsgJF8gPT4gMSB9IEB7ICRTZWxmLT57J1Bvc3RtYXN0ZXJYLUhlYWRlcid9IH07CgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggdmFsdWVzICUkRHluYW1pY0ZpZWxkcyApIHsKICAgICAgICAgICAgZm9yIG15ICRIZWFkZXIgKAogICAgICAgICAgICAgICAgJ1gtT1RPQk8tRHluYW1pY0ZpZWxkLScgLiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgJ1gtT1RPQk8tRm9sbG93VXAtRHluYW1pY0ZpZWxkLScgLiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBvbmx5IGFkZCB0aGUgaGVhZGVyIGlmIGlzIG5vdCBhbHJlZGF5IGluIHRoZSBjb25maWcKICAgICAgICAgICAgICAgIGlmICggISRIZWFkZXJMb29rdXB7JEhlYWRlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkU2VsZi0+eydQb3N0bWFzdGVyWC1IZWFkZXInfSB9LCAkSGVhZGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgp0byBleGVjdXRlIHRoZSBydW4gcHJvY2VzcwoKICAgICRQb3N0TWFzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgUXVldWUgICA9PiAnSnVuaycsICAjIG9wdGlvbmFsLCBzcGVjaWZ5IHRhcmdldCBxdWV1ZSBmb3IgbmV3IHRpY2tldHMKICAgICAgICBRdWV1ZUlEID0+IDEsICAgICAgICMgb3B0aW9uYWwsIHNwZWNpZnkgdGFyZ2V0IHF1ZXVlIGZvciBuZXcgdGlja2V0cwogICAgKTsKCnJldHVybiBwYXJhbXMKCiAgICAwID0gZXJyb3IgKGFsc28gZmFsc2UpCiAgICAxID0gbmV3IHRpY2tldCBjcmVhdGVkCiAgICAyID0gZm9sbG93IHVwIC8gb3Blbi9yZW9wZW4KICAgIDMgPSBmb2xsb3cgdXAgLyBjbG9zZSAtPiBuZXcgdGlja2V0CiAgICA0ID0gZm9sbG93IHVwIC8gY2xvc2UgLT4gcmVqZWN0CiAgICA1ID0gaWdub3JlZCAoYmVjYXVzZSBvZiBYLU9UT0JPLUlnbm9yZSBoZWFkZXIpCgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFJldHVybjsKCiAgICAjIENvbmZpZ09iamVjdCBzZWN0aW9uIC8gZ2V0IHBhcmFtcwojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgbXkgJEdldFBhcmFtID0gJFNlbGYtPkdldEVtYWlsUGFyYW1zKCk7CiMKIyAgICAjIGNoZWNrIGlmIGZvbGxvdyB1cAojICAgIG15ICggJFRuLCAkVGlja2V0SUQgKSA9ICRTZWxmLT5DaGVja0ZvbGxvd1VwKCBHZXRQYXJhbSA9PiAkR2V0UGFyYW0gKTsKCiAgICBteSAkR2V0UGFyYW0gPSAkUGFyYW17RW1haWxQYXJhbXN9IHx8ICRTZWxmLT5HZXRFbWFpbFBhcmFtcygpOwoKICAgIG15ICggJFRuLCAkVGlja2V0SUQgKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICBteSAkTGlua09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CgogICAgbXkgQFRpY2tldElEc1RvTGluazsKICAgIGlmICggISRQYXJhbXtBZGRyZXNzUG9vbH0gKSB7CiAgICAgICAgKCAkVG4sICRUaWNrZXRJRCApID0gJFNlbGYtPkNoZWNrRm9sbG93VXAoIEdldFBhcmFtID0+ICRHZXRQYXJhbSApOwojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgogICAgICAgICMgcnVuIGFsbCBQcmVGaWx0ZXJNb2R1bGVzIChtb2RpZnkgZW1haWwgcGFyYW1zKQogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlRmlsdGVyTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Bvc3RNYXN0ZXI6OlByZUZpbHRlck1vZHVsZScpIH07CgogICAgICAgICAgICAjIGdldCBtYWluIG9iamVjdHMKICAgICAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICAgICAgSk9COgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICAgICBteSAkRmlsdGVyT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRGaWx0ZXJPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIm5ldygpIG9mIFByZUZpbHRlck1vZHVsZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBKT0I7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBtb2RpZnkgcGFyYW1zCiAgICAgICAgICAgICAgICBteSAkUnVuID0gJEZpbHRlck9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgSm9iQ29uZmlnID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgID0+ICRQYXJhbXtRdWV1ZUlEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRSdW4gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkV4ZWN1dGUgUnVuKCkgb2YgUHJlRmlsdGVyTW9kdWxlICRKb2JzeyRKb2J9LT57TW9kdWxlfSBub3Qgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG91bGQgSSBpZ25vcmUgdGhlIGluY29taW5nIG1haWw/CiAgICAgICAgaWYgKCAkR2V0UGFyYW0tPnsnWC1PVE9CTy1JZ25vcmUnfSAmJiAkR2V0UGFyYW0tPnsnWC1PVE9CTy1JZ25vcmUnfSA9fiAvKHllc3x0cnVlKS9pICkgewogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0luZm8nLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICJJZ25vcmVkIEVtYWlsIChGcm9tOiAkR2V0UGFyYW0tPnsnRnJvbSd9LCBNZXNzYWdlLUlEOiAkR2V0UGFyYW0tPnsnTWVzc2FnZS1JRCd9KSAiCiAgICAgICAgICAgICAgICAgICAgLiAiYmVjYXVzZSB0aGUgWC1PVE9CTy1JZ25vcmUgaXMgc2V0IChYLU9UT0JPLUlnbm9yZTogJEdldFBhcmFtLT57J1gtT1RPQk8tSWdub3JlJ30pLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAoNSk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyB0aWNrZXQgc2VjdGlvbgogICAgICAgICMKCiAgICAgICAgIyBjaGVjayBpZiBmb2xsb3cgdXAgKGFnYWluLCB3aXRoIG5ldyBHZXRQYXJhbSkKICAgICAgICAoICRUbiwgJFRpY2tldElEICkgPSAkU2VsZi0+Q2hlY2tGb2xsb3dVcCggR2V0UGFyYW0gPT4gJEdldFBhcmFtICk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICAgICAjIGJ1aWxkIG1haWwgYWRkcmVzcyBsaXN0CiAgICAgICAgbXkgQEFkZHJlc3NlZFBvb2xzID0gJFNlbGYtPntBZGRyZXNzUG9vbE9iamVjdH0tPkZpbHRlclBvb2xzKAogICAgICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggQEFkZHJlc3NlZFBvb2xzICkgewogICAgICAgICAgICAjIGdldCB0aGUgUG9vbCBmb3IgUXVldWVJRCBmcm9tIE1haWxBY2NvdW50LCBpbiBjYXNlIG9mIGRpc3BhdGNoaW5nIHZpYSBRdWV1ZQogICAgICAgICAgICBteSAkTWFpbEFjY291bnRQb29sOwogICAgICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17UXVldWV9ICkgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ICAgICAgfHw9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgUXVldWUgICA9PiAkUGFyYW17UXVldWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVNYWlsQWNjb3VudEFkZHJlc3MgPSAkUXVldWVPYmplY3QtPkdldFN5c3RlbUFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE1haWxBY2NvdW50UG9vbCAgICAgICA9ICRTZWxmLT57QWRkcmVzc1Bvb2xPYmplY3R9LT5Qb29sTG9va3VwKAogICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJE1haWxBY2NvdW50QWRkcmVzc3tFbWFpbH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBQb29sLCBpZiBub3QgYWRkcmVzc2VkCiAgICAgICAgICAgICAgICBpZiAoICRNYWlsQWNjb3VudFBvb2wgJiYgKCAhZ3JlcCB7ICRfIGVxICRNYWlsQWNjb3VudFBvb2wgfSBAQWRkcmVzc2VkUG9vbHMgKSApIHsKICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0IEBBZGRyZXNzZWRQb29scywgJE1haWxBY2NvdW50UG9vbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB3ZSBhcmUgcmVwcm9jZXNzaW5nIGFuIGVtYWlsIGZpbHRlciBvdXQgcG9vbHMgd2hpY2ggYWxyZWFkeSBoYXZlIGFuIGFydGljbGUgd2l0aCB0aGlzIG1lc3NhZ2UgaWQKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9ICkgewogICAgICAgICAgICAgICAgQEFkZHJlc3NlZFBvb2xzID0gZ3JlcCB7ICEkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9eyRffSB9IEBBZGRyZXNzZWRQb29sczsKCiAgICAgICAgICAgICAgICBpZiAoICFAQWRkcmVzc2VkUG9vbHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnSW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yZWQgRW1haWwgKEZyb206ICRHZXRQYXJhbS0+eydGcm9tJ30sIE1lc3NhZ2UtSUQ6ICRHZXRQYXJhbS0+eydNZXNzYWdlLUlEJ30pICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gImJlY2F1c2UgYWxsIGFkZHJlc3NlZCBwb29scyBhbHJlYWR5IGhvbGQgYW4gYXJ0aWNsZSBmb3IgaXQuIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciBmb2xsb3ctdXBzCiAgICAgICAgICAgIGlmICggJFRpY2tldElEICkgewogICAgICAgICAgICAgICAgbXkgJFBvb2wgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+UG9vbExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFBvb2wgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJFBvb2wgfSBAQWRkcmVzc2VkUG9vbHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBZGRyZXNzUG9vbH0gPSAkUG9vbDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgaWYgYSBmb2xsb3cgdXAgaW4gYSBub3QgYWRkcmVzc2VkIHBvb2wgZXhpc3RzLCBsb29rIGZvciBsaW5rZWQgdGlja2V0cyBhbHNvIGluIHRoZSBwYXJlbnQgcnVuCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiBwb29scyBhcmUgYWRkcmVzc2VkLCBub24gcG9vbCB0aWNrZXRzIGFyZSBpZ25vcmVkCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVG4gICAgICAgPSB1bmRlZjsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQgPSB1bmRlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0FkZHJlc3NQb29sfSAvLz0gc2hpZnQgQEFkZHJlc3NlZFBvb2xzOwoKICAgICAgICAgICAgQUREUkVTUzoKICAgICAgICAgICAgZm9yIG15ICRQb29sICggQEFkZHJlc3NlZFBvb2xzICkgewogICAgICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICRQb29sIGVxICRQYXJhbXtBZGRyZXNzUG9vbH07CgogICAgICAgICAgICAgICAgbXkgJUVtYWlsUGFyYW1zICA9ICV7JEdldFBhcmFtfTsKICAgICAgICAgICAgICAgIG15ICRSZWN1VGlja2V0SUQgPSAkU2VsZi0+UmVjdXJzaXZlUG9zdE1hc3RlclJ1bigKICAgICAgICAgICAgICAgICAgICBFbWFpbFBhcmFtcyAgICAgID0+IFwlRW1haWxQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgQWRkcmVzc1Bvb2wgICAgICA9PiAkUG9vbCwKICAgICAgICAgICAgICAgICAgICBGb2xsb3dVcFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICggJE1haWxBY2NvdW50UG9vbCAmJiAkTWFpbEFjY291bnRQb29sIGVxICRQb29sICkgPyAkUGFyYW17UXVldWVJRH0gOiB1bmRlZiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzVG9MaW5rLCAkUmVjdVRpY2tldElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRha2UgcXVldWUgYnkgbWFpbCBhY2NvdW50IG9ubHkgaW50byBjb25zaWRlcmF0aW9uIGZvciBpdHMgcmVzcGVjdGl2ZSBwb29sCiAgICAgICAgICAgIGlmICggISRNYWlsQWNjb3VudFBvb2wgfHwgJE1haWxBY2NvdW50UG9vbCBuZSAkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtRdWV1ZX07CiAgICAgICAgICAgICAgICBkZWxldGUgJFBhcmFte1F1ZXVlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBjb21tdW5pY2F0aW9uIGxvZyB0byBvcmlnaW4KICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH07CiAgICAgICAgICAgICRTZWxmLT5fQ3JlYXRlTWFpbE9iamVjdHMoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRTZWxmLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSApIHsKICAgICAgICAoICRUbiwgJFRpY2tldElEICkgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+RmluZExpbmtlZFRpY2tldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFBhcmFte0ZvbGxvd1VwVGlja2V0SUR9LAogICAgICAgICAgICBBZGRyZXNzUG9vbCA9PiAkUGFyYW17QWRkcmVzc1Bvb2x9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1Bvc3RtYXN0ZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICRHZXRQYXJhbS0+e0FkZHJlc3NQb29sfSA9ICRQYXJhbXtBZGRyZXNzUG9vbH07CgogICAgICAgIFhRVUVVRUhFQURFUjoKICAgICAgICBmb3IgbXkgJFhRdWV1ZUhlYWRlciAocXcoWC1PVE9CTy1RdWV1ZSBYLU9UT0JPLUZvbGxvd1VwLVF1ZXVlKSkgewoKICAgICAgICAgICAgbmV4dCBYUVVFVUVIRUFERVIgaWYgISRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9OwoKICAgICAgICAgICAgbXkgJFF1ZXVlRXhpc3QgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+UXVldWVDaGVjaygKICAgICAgICAgICAgICAgIFF1ZXVlICAgICAgID0+ICRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9LAogICAgICAgICAgICAgICAgQWRkcmVzc1Bvb2wgPT4gJEdldFBhcmFtLT57QWRkcmVzc1Bvb2x9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFF1ZXVlRXhpc3QgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUoICRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgogICAgIyBydW4gYWxsIFByZUNyZWF0ZUZpbHRlck1vZHVsZXMKICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlQ3JlYXRlRmlsdGVyTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlQ3JlYXRlRmlsdGVyTW9kdWxlJykgfTsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgIG15ICRGaWx0ZXJPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEZpbHRlck9iamVjdCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIm5ldygpIG9mIFByZUNyZWF0ZUZpbHRlck1vZHVsZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgSk9COwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vZGlmeSBwYXJhbXMKICAgICAgICAgICAgbXkgJFJ1biA9ICRGaWx0ZXJPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgIEdldFBhcmFtICA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBKb2JDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSdW4gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJFeGVjdXRlIFJ1bigpIG9mIFByZUNyZWF0ZUZpbHRlck1vZHVsZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0J3MgYSBmb2xsb3cgdXAgLi4uCiAgICBpZiAoICRUbiAmJiAkVGlja2V0SUQgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcXVldWUgb2JqZWN0CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgY2hlY2sgaWYgaXQgaXMgcG9zc2libGUgdG8gZG8gdGhlIGZvbGxvdyB1cAogICAgICAgICMgZ2V0IGZvbGxvdyB1cCBvcHRpb24gKHBvc3NpYmxlIG9yIG5vdCkKICAgICAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBPcHRpb24oCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsb2NrIG9wdGlvbiAoc2hvdWxkIGJlIHRoZSB0aWNrZXQgbG9ja2VkIC0gaWYgY2xvc2VkIC0gYWZ0ZXIgdGhlIGZvbGxvdyB1cCkKICAgICAgICBteSAkTG9jayA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBMb2NrT3B0aW9uKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3RhdGUgZGV0YWlscwogICAgICAgIG15ICVTdGF0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJFRpY2tldHtTdGF0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gdHJlYXQgYSBib3VuY2UgZS1tYWlsIGFsd2F5cyBhcyBhIG5vcm1hbCBmb2xsb3ctdXAgKHRvIHJlb3BlbiB0aGUgdGlja2V0IGlmIG5lZWRlZCkuCiAgICAgICAgbXkgJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCA9IDA7CiAgICAgICAgaWYgKCAkR2V0UGFyYW0tPnsnWC1PVE9CTy1Cb3VuY2UnfSApIHsKICAgICAgICAgICAgJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCA9ICRDb25maWdPYmplY3QtPkdldCgnUG9zdG1hc3RlckJvdW5jZUVtYWlsQXNGb2xsb3dVcCcpOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgdGlja2V0CiAgICAgICAgaWYgKCAhJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCAmJiAkRm9sbG93VXBQb3NzaWJsZSA9fiAvbmV3IHRpY2tldC9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL14ocmVtb3ZlZHxjbG9zZSkvaSApCiAgICAgICAgewoKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdJbmZvJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkZvbGxvdyB1cCBmb3IgWyRUbl0gYnV0IGZvbGxvdyB1cCBub3QgcG9zc2libGUgKCRUaWNrZXR7U3RhdGV9KS4gQ3JlYXRlIG5ldyB0aWNrZXQuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VuZCBtYWlsICYmIGNyZWF0ZSBuZXcgYXJ0aWNsZQogICAgICAgICAgICAjIGdldCBxdWV1ZSBpZiBvZiBGcm9tOiBhbmQgVG86CiAgICAgICAgICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fS0+R2V0UXVldWVJRCgKICAgICAgICAgICAgICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB0cnVzdGVkIHJldHVybnMgYSBuZXcgcXVldWUgaWQKICAgICAgICAgICAgbXkgJFRRdWV1ZUlEID0gJFNlbGYtPntEZXN0UXVldWVPYmplY3R9LT5HZXRUcnVzdGVkUXVldWVJRCgKICAgICAgICAgICAgICAgIFBhcmFtcyA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkVFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRUUXVldWVJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDbGVhbiBvdXQgdGhlIG9sZCBUaWNrZXROdW1iZXIgZnJvbSB0aGUgc3ViamVjdCAoc2VlIGJ1ZyM5MTA4KS4KICAgICAgICAgICAgIyBUaGlzIGF2b2lkcyBmYWxzZSB0aWNrZXQgbnVtYmVyIGRldGVjdGlvbiBvbiBjdXN0b21lciByZXBsaWVzLgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFtLT57U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUbiwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFtLT57U3ViamVjdH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVGlja2V0SUQgPSAkU2VsZi0+e05ld1RpY2tldE9iamVjdH0tPlJ1bigKICAgICAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgICAgID0+ICJCZWNhdXNlIHRoZSBvbGQgdGlja2V0IFskVG5dIGlzICckU3RhdGV7TmFtZX0nIiwKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gcmVwbHkvbmV3IHRpY2tldCcsCiAgICAgICAgICAgICAgICBMaW5rVG9UaWNrZXRJRCAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRUaWNrZXRJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFJldHVybiA9ICggMywgJFRpY2tldElEICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlamVjdCBmb2xsb3cgdXAKICAgICAgICBlbHNpZiAoICEkQm91bmNlRW1haWxBc0ZvbGxvd1VwICYmICRGb2xsb3dVcFBvc3NpYmxlID1+IC9yZWplY3QvaSAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eKHJlbW92ZWR8Y2xvc2UpL2kgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0luZm8nLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiRm9sbG93IHVwIGZvciBbJFRuXSBidXQgZm9sbG93IHVwIG5vdCBwb3NzaWJsZS4gRm9sbG93IHVwIHJlamVjdGVkLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlbmQgcmVqZWN0IG1haWwgYW5kIGFkZCBhcnRpY2xlIHRvIHRpY2tldAogICAgICAgICAgICBteSAkUnVuID0gJFNlbGYtPntSZWplY3RPYmplY3R9LT5SdW4oCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgTG9jayAgICAgICAgICAgICA9PiAkTG9jaywKICAgICAgICAgICAgICAgIFRuICAgICAgICAgICAgICAgPT4gJFRuLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICA9PiAnRm9sbG93IHVwIHJlamVjdGVkLicsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlamVjdCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUnVuICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAUmV0dXJuID0gKCA0LCAkVGlja2V0SUQgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5vcm1hbCBmb2xsb3cgdXAKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15ICRSdW4gPSAkU2VsZi0+e0ZvbGxvd1VwT2JqZWN0fS0+UnVuKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBJbm1haWxVc2VySUQgICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICAgICAgPT4gJExvY2ssCiAgICAgICAgICAgICAgICBUbiAgICAgICAgICAgICAgID0+ICRUbiwKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gZm9sbG93IHVwJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSdW4gKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBSZXR1cm4gPSAoIDIsICRUaWNrZXRJRCApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgdGlja2V0CiAgICBlbHNlIHsKCiAgICAgICAgaWYgKCAkUGFyYW17UXVldWV9ICYmICEkUGFyYW17UXVldWVJRH0gKSB7CgogICAgICAgICAgICAjIHF1ZXVlIGxvb2t1cCBpZiBxdWV1ZSBuYW1lIGlzIGdpdmVuCiAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRQYXJhbXtRdWV1ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBxdWV1ZSBmcm9tIEZyb206IG9yIFRvOgogICAgICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ID0gJFNlbGYtPntEZXN0UXVldWVPYmplY3R9LT5HZXRRdWV1ZUlEKCBQYXJhbXMgPT4gJEdldFBhcmFtICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRydXN0ZWQgcmV0dXJucyBhIG5ldyBxdWV1ZSBpZAogICAgICAgIG15ICRUUXVldWVJRCA9ICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fS0+R2V0VHJ1c3RlZFF1ZXVlSUQoCiAgICAgICAgICAgIFBhcmFtcyA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFRRdWV1ZUlEKSB7CiAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRUUXVldWVJRDsKICAgICAgICB9CiAgICAgICAgJFRpY2tldElEID0gJFNlbGYtPntOZXdUaWNrZXRPYmplY3R9LT5SdW4oCiAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgICAgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlcGx5JywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRUaWNrZXRJRDsKCiAgICAgICAgQFJldHVybiA9ICggMSwgJFRpY2tldElEICk7CiAgICB9CgogICAgIyBydW4gYWxsIFBvc3RGaWx0ZXJNb2R1bGVzIChtb2RpZnkgZW1haWwgcGFyYW1zKQogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdQb3N0TWFzdGVyOjpQb3N0RmlsdGVyTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UG9zdEZpbHRlck1vZHVsZScpIH07CgogICAgICAgICMgZ2V0IG1haW4gb2JqZWN0cwogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgSk9COgogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgcmV0dXJuIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICBteSAkRmlsdGVyT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRGaWx0ZXJPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJuZXcoKSBvZiBQb3N0RmlsdGVyTW9kdWxlICRKb2JzeyRKb2J9LT57TW9kdWxlfSBub3Qgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBKT0I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW9kaWZ5IHBhcmFtcwogICAgICAgICAgICBteSAkUnVuID0gJEZpbHRlck9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEdldFBhcmFtICA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBKb2JDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICBSZXR1cm4gICAgPT4gJFJldHVyblswXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1Bvc3RtYXN0ZXJVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJ1biApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkV4ZWN1dGUgUnVuKCkgb2YgUG9zdEZpbHRlck1vZHVsZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAjIGNyZWF0ZSBsaW5rIG9mIHR5cGUgJ0ludGVyZGl2aXNpb25hbCcgdG8gdGlja2V0cwogICAgaWYgKCAkUGFyYW17QWRkcmVzc1Bvb2x9CiAgICAgICAgJiYgKCBAVGlja2V0SURzVG9MaW5rIHx8ICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSB8fCAkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9ICkgKSB7CgogICAgICAgICMgYWRkIGFsbCB0aWNrZXQgaWRzIHRvIHRoZSByZXR1cm4gLSBtYWlubHkgdXNlZCBmb3IgdW5pdCB0ZXN0cwogICAgICAgIHB1c2ggQFJldHVybiwgQFRpY2tldElEc1RvTGluazsKCiAgICAgICAgIyBhZGQgdGhlIHRpY2tldCBJRCBvZiB0aGUgZmlyc3QgdGlja2V0CiAgICAgICAgcHVzaCBAVGlja2V0SURzVG9MaW5rLCAkUmV0dXJuWzFdOwoKICAgICAgICAjIGFkZCB0aGUgb3JpZ2luYWwgZm9sbG93IHVwIElELCBpZiBpdCB3YXMgaW4gYSBwb29sIG5vdCBhZGRyZXNzZWQKICAgICAgICBpZiAoICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSApIHsKICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzVG9MaW5rLCAkUGFyYW17Rm9sbG93VXBUaWNrZXRJRH07CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoaXMgaXMgYW4gZW1haWwgcGFyc2VkIGFuIGFkZGl0aW9uYWwgdGltZSwgbGluayBhbGwgcHJldmlvdXNseSBjcmVhdGVkIHRpY2tldHMKICAgICAgICBpZiAoICRHZXRQYXJhbS0+e0lnbm9yZUFkZHJlc3NQb29sc30gKSB7CiAgICAgICAgICAgIHB1c2ggQFRpY2tldElEc1RvTGluaywgKCB2YWx1ZXMgJEdldFBhcmFtLT57SWdub3JlQWRkcmVzc1Bvb2xzfS0+JSogKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGFsbCB0aWNrZXRzIGFscmVhZHkgbGlua2VkCiAgICAgICAgbXkgJUxpbmtlZFRpY2tldHMgPSAkTGlua09iamVjdC0+TGlua0tleUxpc3QoCiAgICAgICAgICAgIE9iamVjdDEgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIEtleTEgICAgPT4gJFBhcmFte0ZvbGxvd1VwVGlja2V0SUR9IHx8ICRUaWNrZXRJRCwKICAgICAgICAgICAgT2JqZWN0MiA9PiAnVGlja2V0JywKICAgICAgICAgICAgU3RhdGUgICA9PiAnVmFsaWQnLAogICAgICAgICAgICBUeXBlICAgID0+ICdJbnRlcmRpdmlzaW9uYWwnLAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVGlja2V0SURzVG9MaW5rLCBrZXlzICVMaW5rZWRUaWNrZXRzOwoKICAgICAgICAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+SW50ZXJkaXZpc2lvbmFsVGlja2V0TGlua0FkZCgKICAgICAgICAgICAgVGlja2V0SURzID0+IFxAVGlja2V0SURzVG9MaW5rLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICApOwogICAgfQojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgogICAgcmV0dXJuIEBSZXR1cm47Cn0KCj1oZWFkMiBDaGVja0ZvbGxvd1VwKCkKCnRvIGRldGVjdCB0aGUgdGlja2V0IG51bWJlciBpbiBwcm9jZXNzaW5nIGVtYWlsCgogICAgbXkgKCRUaWNrZXROdW1iZXIsICRUaWNrZXRJRCkgPSAkUG9zdE1hc3Rlck9iamVjdC0+Q2hlY2tGb2xsb3dVcCgKICAgICAgICBTdWJqZWN0ID0+ICdSZTogW1RpY2tldDojMTIzNDU2XSBTb21lIFN1YmplY3QnLAogICAgKTsKCj1jdXQKCnN1YiBDaGVja0ZvbGxvd1VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBMb2FkIENoZWNrRm9sbG93VXAgTW9kdWxlcwogICAgbXkgJEpvYnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Bvc3RNYXN0ZXI6OkNoZWNrRm9sbG93VXBNb2R1bGUnKTsKCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRKb2JzKSApIHsKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICAgICAgSk9COgogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICUkSm9icyApIHsKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRKb2JzLT57JEpvYn07CgogICAgICAgICAgICByZXR1cm4gaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9icy0+eyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgbXkgJENoZWNrT2JqZWN0ID0gJEpvYnMtPnskSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJENoZWNrT2JqZWN0ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAibmV3KCkgb2YgQ2hlY2tGb2xsb3dVcCAkSm9icy0+eyRKb2J9LT57TW9kdWxlfSBub3Qgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBKT0I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJFRpY2tldElEID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRUaWNrZXRJRCkgewogICAgICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCVUaWNrZXQpIHsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBmb2xsb3cgdXAgdGlja2V0IHdpdGggVGlja2V0TnVtYmVyICckVGlja2V0e1RpY2tldE51bWJlcn0nIGFuZCBUaWNrZXRJRCAnJFRpY2tldElEJy4iLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAoICRUaWNrZXR7VGlja2V0TnVtYmVyfSwgJFRpY2tldElEICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgR2V0RW1haWxQYXJhbXMoKQoKdG8gZ2V0IGFsbCBjb25maWd1cmVkIFBvc3RtYXN0ZXJYLUhlYWRlciBlbWFpbCBoZWFkZXJzCgogICAgbXkgJUhlYWRlciA9ICRQb3N0TWFzdGVyT2JqZWN0LT5HZXRFbWFpbFBhcmFtcygpOwoKPWN1dAoKc3ViIEdldEVtYWlsUGFyYW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUdldFBhcmFtOwoKICAgICMgcGFyc2Ugc2VjdGlvbgogICAgSEVBREVSOgogICAgZm9yIG15ICRQYXJhbSAoIEB7ICRTZWxmLT57J1Bvc3RtYXN0ZXJYLUhlYWRlcid9IH0gKSB7CgogICAgICAgICMgZG8gbm90IHNjYW4geC1vdG9ibyBoZWFkZXJzIGlmIG1haWxib3ggaXMgbm90IG1hcmtlZCBhcyB0cnVzdGVkCiAgICAgICAgbmV4dCBIRUFERVIgaWYgKCAhJFNlbGYtPntUcnVzdGVkfSAmJiAkUGFyYW0gPX4gL154LW90b2JvL2kgKTsKCiAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldFBhcmFtKCBXSEFUID0+ICRQYXJhbSApOwoKICAgICAgICBuZXh0IEhFQURFUiBpZiAhJEdldFBhcmFteyRQYXJhbX07CgogICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICIkUGFyYW06ICIgLiAkR2V0UGFyYW17JFBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IGNvbXBhdC4gaGVhZGVycwogICAgaWYgKCAkR2V0UGFyYW17J01lc3NhZ2UtSWQnfSApIHsKICAgICAgICAkR2V0UGFyYW17J01lc3NhZ2UtSUQnfSA9ICRHZXRQYXJhbXsnTWVzc2FnZS1JZCd9OwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17J1JlcGx5LVRvJ30gKSB7CiAgICAgICAgJEdldFBhcmFteydSZXBseVRvJ30gPSAkR2V0UGFyYW17J1JlcGx5LVRvJ307CiAgICB9CiAgICBpZiAoCiAgICAgICAgJEdldFBhcmFteydNYWlsaW5nLUxpc3QnfQogICAgICAgIHx8ICRHZXRQYXJhbXsnUHJlY2VkZW5jZSd9CiAgICAgICAgfHwgJEdldFBhcmFteydYLUxvb3AnfQogICAgICAgIHx8ICRHZXRQYXJhbXsnWC1Oby1Mb29wJ30KICAgICAgICB8fCAkR2V0UGFyYW17J1gtT1RPQk8tTG9vcCd9CiAgICAgICAgfHwgKAogICAgICAgICAgICAkR2V0UGFyYW17J0F1dG8tU3VibWl0dGVkJ30KICAgICAgICAgICAgJiYgc3Vic3RyKCAkR2V0UGFyYW17J0F1dG8tU3VibWl0dGVkJ30sIDAsIDUgKSBlcSAnYXV0by0nCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17J1gtT1RPQk8tTG9vcCd9ID0gJ3llcyc7CiAgICB9CiAgICBpZiAoICEkR2V0UGFyYW17J1gtU2VuZGVyJ30gKSB7CgogICAgICAgICMgZ2V0IHNlbmRlciBlbWFpbAogICAgICAgIG15IEBFbWFpbEFkZHJlc3NlcyA9ICRTZWxmLT57UGFyc2VyT2JqZWN0fS0+U3BsaXRBZGRyZXNzTGluZSgKICAgICAgICAgICAgTGluZSA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEVtYWlsIChARW1haWxBZGRyZXNzZXMpIHsKICAgICAgICAgICAgJEdldFBhcmFteydYLVNlbmRlcid9ID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRFbWFpbEFkZHJlc3MoCiAgICAgICAgICAgICAgICBFbWFpbCA9PiAkRW1haWwsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICMgc2V0IHNlbmRlciB0eXBlIGlmIG5vdCBnaXZlbgogICAgZm9yIG15ICRLZXkgKHF3KFgtT1RPQk8tU2VuZGVyVHlwZSBYLU9UT0JPLUZvbGxvd1VwLVNlbmRlclR5cGUpKSB7CgogICAgICAgIGlmICggISRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJ2N1c3RvbWVyJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgWC1PVE9CTy1TZW5kZXJUeXBlIGV4aXN0cywgaWYgbm90LCBzZXQgY3VzdG9tZXIKICAgICAgICBpZiAoICEkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZVNlbmRlclR5cGVMb29rdXAoIFNlbmRlclR5cGUgPT4gJEdldFBhcmFteyRLZXl9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiQ2FuJ3QgZmluZCBzZW5kZXIgdHlwZSAnJEdldFBhcmFteyRLZXl9JyBpbiBkYiwgdGFrZSAnY3VzdG9tZXInIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJ2N1c3RvbWVyJzsKICAgICAgICB9CiAgICB9CgogICAgIyBTZXQgYXJ0aWNsZSBjdXN0b21lciB2aXNpYmlsaXR5IGlmIG5vdCBnaXZlbi4KICAgIGZvciBteSAkS2V5IChxdyhYLU9UT0JPLUlzVmlzaWJsZUZvckN1c3RvbWVyIFgtT1RPQk8tRm9sbG93VXAtSXNWaXNpYmxlRm9yQ3VzdG9tZXIpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IGJvZHkuCiAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldE1lc3NhZ2VCb2R5KCk7CgogICAgIyBHZXQgY29udGVudCB0eXBlLCBkaXNwb3NpdGlvbiBhbmQgY2hhcnNldC4KICAgICRHZXRQYXJhbXsnQ29udGVudC1UeXBlJ30gICAgICAgID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRSZXR1cm5Db250ZW50VHlwZSgpOwogICAgJEdldFBhcmFteydDb250ZW50LURpc3Bvc2l0aW9uJ30gPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldENvbnRlbnREaXNwb3NpdGlvbigpOwogICAgJEdldFBhcmFte0NoYXJzZXR9ICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldFJldHVybkNoYXJzZXQoKTsKCiAgICAjIEdldCBhdHRhY2htZW50cy4KICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57UGFyc2VyT2JqZWN0fS0+R2V0QXR0YWNobWVudHMoKTsKICAgICRHZXRQYXJhbXtBdHRhY2htZW50fSA9IFxAQXR0YWNobWVudHM7CgogICAgcmV0dXJuIFwlR2V0UGFyYW07Cn0KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgo9aGVhZDIgUmVjdXJzaXZlUG9zdE1hc3RlclJ1bigpCgpSZWN1cnNpdmUgcG9zdG1hc3RlciBydW4gZm9yIGFkZHJlc3MgcG9vbAoKICAgIG15ICRUaWNrZXRJRCA9ICRQb3N0TWFzdGVyT2JqZWN0LT5SZWN1cnNpdmVQb3N0TWFzdGVyUnVuKAogICAgICAgIEVtYWlsUGFyYW1zICAgICAgPT4gXCVFbWFpbFBhcmFtcywgICMgKG9wdGlvbmFsKQogICAgICAgIEFkZHJlc3NQb29sICAgICAgPT4gJ1Bvb2wxJywgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEZvbGxvd1VwVGlja2V0SUQgPT4gNCwgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKClJldHVybjoKCiAgICBUaWNrZXRJRCA9IDUKCj1jdXQKCnN1YiBSZWN1cnNpdmVQb3N0TWFzdGVyUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldElEOwoKICAgICMgZ2V0IG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjcmVhdGUgbmV3IGNvbW11bmljYXRpb24gbG9nIGZvciBldmVyeSBhcnRpY2xlCiAgICBteSAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpDb21tdW5pY2F0aW9uTG9nJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBUcmFuc3BvcnQgICA9PiAnRW1haWwnLAogICAgICAgICAgICBEaXJlY3Rpb24gICA9PiAnSW5jb21pbmcnLAogICAgICAgICAgICBBY2NvdW50VHlwZSA9PiAnU1RESU4nLAogICAgICAgIH0sCiAgICApOwogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZ1N0YXJ0KCBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJyApOwoKICAgICMgY3JlYXRlIGNvbm5lY3Rpb24gZGV0YWlscyBsaW5rCiAgICBteSAkT3JpZ2luQ29ubmVjdGlvbklEICAgID0gJFNlbGYtPntPcmlnaW5Db21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+e0N1cnJlbnR9LT57Q29ubmVjdGlvbn07CiAgICBteSAkT3JpZ2luQ29tbXVuaWNhdGlvbklEID0gJFNlbGYtPntPcmlnaW5Db21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+e0NvbW11bmljYXRpb25JRH07CiAgICBpZiAoICRPcmlnaW5Db25uZWN0aW9uSUQgJiYgJE9yaWdpbkNvbW11bmljYXRpb25JRCApIHsKCiAgICAgICAgbXkgJERldGFpbHNMaW5rID0gJENvbmZpZ09iamVjdC0+e0h0dHBUeXBlfSAuICI6Ly8iIC4gJENvbmZpZ09iamVjdC0+e0ZRRE59IC4KICAgICAgICAgICAgIi9vdG9iby9pbmRleC5wbD9BY3Rpb249QWRtaW5Db21tdW5pY2F0aW9uTG9nO1N1YmFjdGlvbj1ab29tO0NvbW11bmljYXRpb25JRD0kT3JpZ2luQ29tbXVuaWNhdGlvbklEO09iamVjdExvZ0lEPSRPcmlnaW5Db25uZWN0aW9uSUQiOwoKICAgICAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w6Ok9yaWdpbmFsTWFpbCcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkZvciBtb3JlIGRldGFpbHMgc2VlOiAkRGV0YWlsc0xpbmsiLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmV3IGNvbW11bmljYXRpb24gbG9nCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJENvbW11bmljYXRpb25Mb2dPYmplY3Q7CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMgYWdhaW4KICAgICRTZWxmLT5fQ3JlYXRlTWFpbE9iamVjdHMoCiAgICAgICAgRGF0YSA9PiAkU2VsZiwKICAgICk7CgogICAgIyBzZXQgc3RhdHVzIG1lc3NhZ2UKICAgIG15ICRNZXNzYWdlU3RhdHVzID0gJ1N1Y2Nlc3NmdWwnOwoKICAgICMgcnVuIHBvc3QgbWFzdGVyCiAgICBteSBAU3VjY2VzcyA9IGV2YWwgewogICAgICAgICRTZWxmLT5SdW4oCiAgICAgICAgICAgIEVtYWlsUGFyYW1zICAgICAgPT4gJFBhcmFte0VtYWlsUGFyYW1zfSwKICAgICAgICAgICAgQWRkcmVzc1Bvb2wgICAgICA9PiAkUGFyYW17QWRkcmVzc1Bvb2x9LAogICAgICAgICAgICBGb2xsb3dVcFRpY2tldElEID0+ICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSwKICAgICAgICApOwogICAgfTsKICAgIGlmICggISRTdWNjZXNzWzBdICkgewogICAgICAgICRNZXNzYWdlU3RhdHVzID0gJ0ZhaWxlZCc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVGlja2V0SUQgPSAkU3VjY2Vzc1sxXTsKICAgIH0KCiAgICAjIHN0b3Agb2JqZWN0IC8gY29tbXVuaWNhdGlvbiBsb2cKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgIFN0YXR1cyAgICAgICAgPT4gJE1lc3NhZ2VTdGF0dXMsCiAgICApOwogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPkNvbW11bmljYXRpb25TdG9wKCBTdGF0dXMgPT4gJ1N1Y2Nlc3NmdWwnICk7CgogICAgcmV0dXJuICRUaWNrZXRJRDsKfQoKPWhlYWQyIF9DcmVhdGVNYWlsT2JqZWN0cygpCgpDcmVhdGUgbmV3IG1haWwgb2JqZWN0cyAoRGVzdFF1ZXVlLCBOZXdUaWNrZXQsIEZvbGxvd1VwLCBSZWplY3QsIEFkZHJlc3NQb29sKQoKICAgICRQb3N0TWFzdGVyT2JqZWN0LT5fQ3JlYXRlTWFpbE9iamVjdHMoCiAgICAgICAgRGF0YSA9PiAkU2VsZiwKICAgICk7Cgo9Y3V0CgpzdWIgX0NyZWF0ZU1haWxPYmplY3RzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtEYXRhfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRGF0YSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG1haWwgb2JqZWN0cwogICAgJFNlbGYtPntEZXN0UXVldWVPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RGVzdFF1ZXVlLT5uZXcoICRQYXJhbXtEYXRhfS0+JSogKTsKICAgICRTZWxmLT57TmV3VGlja2V0T2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6Ok5ld1RpY2tldC0+bmV3KCAkUGFyYW17RGF0YX0tPiUqICk7CiAgICAkU2VsZi0+e0ZvbGxvd1VwT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGb2xsb3dVcC0+bmV3KCAkUGFyYW17RGF0YX0tPiUqICk7CiAgICAkU2VsZi0+e1JlamVjdE9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpSZWplY3QtPm5ldyggJFBhcmFte0RhdGF9LT4lKiApOwogICAgJFNlbGYtPntBZGRyZXNzUG9vbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wtPm5ldyggJFBhcmFte0RhdGF9LT4lKiApOwoKICAgIHJldHVybiAxOwp9CgojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgoxOwo=</File>
        <File Location="Custom/Kernel/System/SystemAddress.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9TeXN0ZW1BZGRyZXNzLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3M7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCcsCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcyAtIGFsbCBzeXN0ZW0gYWRkcmVzcyBmdW5jdGlvbnMKCj1oZWFkMSBERVNDUklQVElPTgoKR2xvYmFsIG1vZHVsZSB0byBhZGQvZWRpdC91cGRhdGUgc3lzdGVtIGFkZHJlc3Nlcy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdTeXN0ZW1BZGRyZXNzJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFN5c3RlbUFkZHJlc3NBZGQoKQoKYWRkIHN5c3RlbSBhZGRyZXNzIHdpdGggYXR0cmlidXRlcwoKICAgIG15ICRJRCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzQWRkKAogICAgICAgIE5hbWUgICAgID0+ICdpbmZvQGV4YW1wbGUuY29tJywKICAgICAgICBSZWFsbmFtZSA9PiAnSG90bGluZScsCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBRdWV1ZUlEICA9PiAxMjMsCiAgICAgICAgQ29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhOYW1lIFZhbGlkSUQgUmVhbG5hbWUgUXVldWVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBhIHN5c3RlbSBhZGRyZXNzIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoICRTZWxmLT5OYW1lRXhpc3RzQ2hlY2soIE5hbWUgPT4gJFBhcmFte05hbWV9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBIHN5c3RlbSBhZGRyZXNzIHdpdGggdGhlIG5hbWUgJyRQYXJhbXtOYW1lfScgYWxyZWFkeSBleGlzdHMuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgaW5zZXJ0IG5ldyBzeXN0ZW0gYWRkcmVzcwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc3lzdGVtX2FkZHJlc3MgKHZhbHVlMCwgdmFsdWUxLCB2YWxpZF9pZCwgY29tbWVudHMsIHF1ZXVlX2lkLCAnCiAgICAgICAgICAgIC4gJyBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KScKICAgICAgICAgICAgLiAnIFZBTFVFUyAoPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgIFwkUGFyYW17UmVhbG5hbWV9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1F1ZXVlSUR9LCBcJFBhcmFte1VzZXJJRH0sICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZ2V0IHN5c3RlbSBhZGRyZXNzIGlkCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHN5c3RlbV9hZGRyZXNzIFdIRVJFIHZhbHVlMCA9ID8gQU5EIHZhbHVlMSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtSZWFsbmFtZX0sIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSUQgPSAkUm93WzBdOwogICAgfQoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJElEOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc0dldCgpCgpnZXQgc3lzdGVtIGFkZHJlc3Mgd2l0aCBhdHRyaWJ1dGVzCgogICAgbXkgJVN5c3RlbUFkZHJlc3MgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0dldCgKICAgICAgICBJRCA9PiAxLAogICAgKTsKCnJldHVybnM6CgogICAgJVN5c3RlbUFkZHJlc3MgPSAoCiAgICAgICAgSUQgICAgICAgICA9PiAxLAogICAgICAgIE5hbWUgICAgICAgPT4gJ2luZm9AZXhhbXBsZS5jb20nCiAgICAgICAgUmVhbG5hbWUgICA9PiAnSG90bGluZScsCiAgICAgICAgUXVldWVJRCAgICA9PiAxMjMsCiAgICAgICAgQ29tbWVudCAgICA9PiAnc29tZSBjb21tZW50JywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAxMC0xMS0yOSAxMTowNDowNCcsCiAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAxMC0xMi0wNyAxMjozMzo1NicsCiAgICApCgo9Y3V0CgpzdWIgU3lzdGVtQWRkcmVzc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDYWNoZUtleSA9ICdTeXN0ZW1BZGRyZXNzR2V0OjonIC4gJFBhcmFte0lEfTsKCiAgICBteSAkQ2FjaGVkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgcmV0dXJuICV7JENhY2hlZH0gaWYgcmVmICRDYWNoZWQgZXEgJ0hBU0gnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgc3lzdGVtIGFkZHJlc3MKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIHZhbHVlMCwgdmFsdWUxLCBjb21tZW50cywgdmFsaWRfaWQsIHF1ZXVlX2lkLCBjaGFuZ2VfdGltZSwgY3JlYXRlX3RpbWUgJwogICAgICAgICAgICAuICcgRlJPTSBzeXN0ZW1fYWRkcmVzcyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBARGF0YSA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICVEYXRhID0gKAogICAgICAgICAgICBJRCAgICAgICAgID0+ICRQYXJhbXtJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJERhdGFbMF0sCiAgICAgICAgICAgIFJlYWxuYW1lICAgPT4gJERhdGFbMV0sCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJERhdGFbMl0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gJERhdGFbM10sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJERhdGFbNF0sCiAgICAgICAgICAgIENoYW5nZVRpbWUgPT4gJERhdGFbNV0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgPT4gJERhdGFbNl0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVEYXRhLAogICAgKTsKCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBTeXN0ZW1BZGRyZXNzVXBkYXRlKCkKCnVwZGF0ZSBzeXN0ZW0gYWRkcmVzcyB3aXRoIGF0dHJpYnV0ZXMKCiAgICAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc1VwZGF0ZSgKICAgICAgICBJRCAgICAgICA9PiAxLAogICAgICAgIE5hbWUgICAgID0+ICdpbmZvQGV4YW1wbGUuY29tJywKICAgICAgICBSZWFsbmFtZSA9PiAnSG90bGluZScsCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBRdWV1ZUlEICA9PiAxMjMsCiAgICAgICAgQ29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBDaGVjayBuZWVkZWQgc3R1ZmYuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgTmFtZSBWYWxpZElEIFJlYWxuYW1lIFF1ZXVlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgaWYgYSBzeXN0ZW0gYWRkcmVzcyB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4KICAgIGlmICgKICAgICAgICAkU2VsZi0+TmFtZUV4aXN0c0NoZWNrKAogICAgICAgICAgICBJRCAgID0+ICRQYXJhbXtJRH0sCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte05hbWV9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgc3lzdGVtIGFkZHJlc3Mgd2l0aCB0aGUgbmFtZSAnJFBhcmFte05hbWV9JyBhbHJlYWR5IGV4aXN0cy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQ2hlY2sgaWYgYSBzeXN0ZW0gYWRkcmVzcyBpcyB1c2VkIGluIHNvbWUgcXVldWUncyBvciBhdXRvIHJlc3BvbnNlJ3MuCiAgICBpZiAoICRTZWxmLT5TeXN0ZW1BZGRyZXNzSXNVc2VkKCBTeXN0ZW1BZGRyZXNzSUQgPT4gJFBhcmFte0lEfSApICYmICRQYXJhbXtWYWxpZElEfSA+IDEgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgIlRoaXMgc3lzdGVtIGFkZHJlc3MgJyRQYXJhbXtOYW1lfScgY2Fubm90IGJlIHNldCB0byBpbnZhbGlkLCBiZWNhdXNlIGl0IGlzIHVzZWQgaW4gb25lIG9yIG1vcmUgcXVldWUocykgb3IgYXV0byByZXNwb25zZShzKS4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgVXBkYXRlIHN5c3RlbSBhZGRyZXNzLgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgc3lzdGVtX2FkZHJlc3MgU0VUIHZhbHVlMCA9ID8sIHZhbHVlMSA9ID8sIGNvbW1lbnRzID0gPywgdmFsaWRfaWQgPSA/LCAnCiAgICAgICAgICAgIC4gJyBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/LCBxdWV1ZV9pZCA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgICBcJFBhcmFte1JlYWxuYW1lfSwgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1F1ZXVlSUR9LCAgXCRQYXJhbXtJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc0xpc3QoKQoKZ2V0IGEgbGlzdCBvZiBzeXN0ZW0gYWRkcmVzc2VzCgogICAgbXkgJUxpc3QgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0xpc3QoCiAgICAgICAgVmFsaWQgPT4gMCwgICMgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIDEKICAgICk7CgpyZXR1cm5zOgoKICAgICVMaXN0ID0gKAogICAgICAgICcxJyA9PiAnc2FsZXNAZXhhbXBsZS5jb20nLAogICAgICAgICcyJyA9PiAncHVyY2hhc2luZ0BleGFtcGxlLmNvbScsCiAgICAgICAgJzMnID0+ICdzZXJ2aWNlQGV4YW1wbGUuY29tJywKICAgICk7Cgo9Y3V0CgpzdWIgU3lzdGVtQWRkcmVzc0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsaWQgPSAxOwogICAgaWYgKCAhJFBhcmFte1ZhbGlkfSAmJiBkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFZhbGlkID0gMDsKICAgIH0KCiAgICBteSAkQ2FjaGVLZXkgPSAnU3lzdGVtQWRkcmVzc0xpc3Q6OicgLiAkVmFsaWQ7CgogICAgbXkgJENhY2hlZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIHJldHVybiAleyRDYWNoZWR9IGlmIHJlZiAkQ2FjaGVkIGVxICdIQVNIJzsKCiAgICBteSAkVmFsaWRTUUwgPSAnJzsKICAgIGlmICgkVmFsaWQpIHsKICAgICAgICBteSAkVmFsaWRJRHMgPSBqb2luICcsJywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CiAgICAgICAgJFZhbGlkU1FMID0gIiBXSEVSRSB2YWxpZF9pZCBJTiAoJFZhbGlkSURzKSI7CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBzeXN0ZW0gYWRkcmVzcwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICIKICAgICAgICAgICAgU0VMRUNUIGlkLCB2YWx1ZTAKICAgICAgICAgICAgRlJPTSBzeXN0ZW1fYWRkcmVzcwogICAgICAgICAgICAkVmFsaWRTUUwiLAogICAgKTsKCiAgICBteSAlTGlzdDsKCiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJExpc3R7ICREYXRhWzBdIH0gPSAkRGF0YVsxXTsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVMaXN0LAogICAgKTsKCiAgICByZXR1cm4gJUxpc3Q7Cn0KCj1oZWFkMiBTeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoKQoKQ2hlY2tzIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGEgbG9jYWwgKHN5c3RlbSkgYWRkcmVzcy4gUmV0dXJucyB0cnVlCmZvciBsb2NhbCBhZGRyZXNzZXMuCgo9Zm9yIHN0b3B3b3JkcyBSb3RoZXIgT1NTIEVPCgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgIGlmICggJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcyggQWRkcmVzcyA9PiAnaW5mb0BleGFtcGxlLmNvbScgKSApIHsKICAgIG15ICRJc0xvY2FsID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICBBZGRyZXNzICA9PiAnaW5mb0BleGFtcGxlLmNvbScsCiAgICAgICAgUXVldWVJRCAgPT4gNCwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVGlja2V0SUQgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKICAgIGlmICggJElzTG9jYWwgKSB7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAjIGlzIGxvY2FsCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIGlzIG5vdCBsb2NhbAogICAgfQoKPWN1dAoKc3ViIFN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQWRkcmVzcykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAjIGdldCBvYmplY3RzCiAgICBteSAkUXVldWVPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRBZGRyZXNzUG9vbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCcpOwoKICAgICMgZ2V0IGFkZHJlc3MgcG9vbAogICAgbXkgJEFkZHJlc3NQb29sID0gJEFkZHJlc3NQb29sT2JqZWN0LT5Qb29sTG9va3VwKAogICAgICAgIEFkZHJlc3MgPT4gJFBhcmFte0FkZHJlc3N9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGFkZHJlc3MgZXhpc3QgaW4gc2FtZSBhZGRyZXNzIHBvb2wgb2YgdGlja2V0CiAgICBpZiAoCiAgICAgICAgJEFkZHJlc3NQb29sCiAgICAgICAgJiYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkUXVldWVJRCA9ICRQYXJhbXtRdWV1ZUlEfTsKICAgICAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVJRCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFF1ZXVlRXhpc3QgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPlF1ZXVlQ2hlY2soCiAgICAgICAgICAgIFF1ZXVlICAgICAgID0+ICRRdWV1ZSwKICAgICAgICAgICAgQWRkcmVzc1Bvb2wgPT4gJEFkZHJlc3NQb29sLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkUXVldWVFeGlzdDsKICAgIH0KIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgIHJldHVybiAkU2VsZi0+U3lzdGVtQWRkcmVzc1F1ZXVlSUQoJVBhcmFtKTsKfQoKPWhlYWQyIFN5c3RlbUFkZHJlc3NRdWV1ZUlEKCkKCmZpbmQgZGlzcGF0Y2hpbmcgcXVldWUgaWQgb2YgZW1haWwgYWRkcmVzcwoKICAgIG15ICRRdWV1ZUlEID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NRdWV1ZUlEKCBBZGRyZXNzID0+ICdpbmZvQGV4YW1wbGUuY29tJyApOwoKPWN1dAoKc3ViIFN5c3RlbUFkZHJlc3NRdWV1ZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBZGRyZXNzKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIHNwYWNlcwogICAgJFBhcmFte0FkZHJlc3N9ID1+IHMvXHMrLy9nOwoKICAgIG15ICRDYWNoZUtleSA9ICdTeXN0ZW1BZGRyZXNzUXVldWVJRDo6JyAuICRQYXJhbXtBZGRyZXNzfTsKICAgIG15ICRDYWNoZWQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIHJldHVybiAkeyRDYWNoZWR9IGlmIHJlZiAkQ2FjaGVkIGVxICdTQ0FMQVInOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAkREJPYmplY3QtPkdldERhdGFiYXNlRnVuY3Rpb24oJ0Nhc2VTZW5zaXRpdmUnKSApIHsKCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIHF1ZXVlX2lkIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgIgogICAgICAgICAgICAgICAgLiAidmFsaWRfaWQgSU4gKCAke1woam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSl9ICkgIgogICAgICAgICAgICAgICAgLiAiQU5EIExPV0VSKHZhbHVlMCkgPSBMT1dFUig/KSIsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtBZGRyZXNzfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgcXVldWVfaWQgRlJPTSBzeXN0ZW1fYWRkcmVzcyBXSEVSRSAiCiAgICAgICAgICAgICAgICAuICJ2YWxpZF9pZCBJTiAoICR7XChqb2luICcsICcsICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpKX0gKSAiCiAgICAgICAgICAgICAgICAuICJBTkQgdmFsdWUwID0gPyIsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtBZGRyZXNzfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkUXVldWVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRRdWV1ZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCRRdWV1ZUlELAogICAgKTsKCiAgICByZXR1cm4gJFF1ZXVlSUQ7Cn0KCj1oZWFkMiBTeXN0ZW1BZGRyZXNzUXVldWVMaXN0KCkKCmdldCBhIGxpc3Qgb2YgdGhlIHF1ZXVlcyBhbmQgdGhlaXIgc3lzdGVtIGFkZHJlc3NlcyBJRHMKCiAgICBteSAlTGlzdCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzUXVldWVMaXN0KAogICAgICAgIFZhbGlkID0+IDAsICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byAxCiAgICApOwoKcmV0dXJuczoKCiAgICAlTGlzdCA9ICgKICAgICAgICAnNScgPT4gMywKICAgICAgICAnNycgPT4gMSwKICAgICAgICAnOScgPT4gMiwKICAgICk7Cgo9Y3V0CgpzdWIgU3lzdGVtQWRkcmVzc1F1ZXVlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgIG15ICRWYWxpZCA9ICRQYXJhbXtWYWxpZH0gLy8gMTsKCiAgICAjIGNyZWF0ZSB0aGUgdmFsaWQgbGlzdAogICAgbXkgJFZhbGlkSURzID0gam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAjIGJ1aWxkIFNRTAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgcXVldWVfaWQsIGlkIEZST00gc3lzdGVtX2FkZHJlc3MnOwoKICAgICMgYWRkIFdIRVJFIHN0YXRlbWVudCBpbiBjYXNlIFZhbGlkIHBhcmFtIGlzIHNldCB0byAnMScsIGZvciB2YWxpZCBzeXN0ZW0gYWRkcmVzcwogICAgaWYgKCRWYWxpZCkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB2YWxpZF9pZCBJTiAoJyAuICRWYWxpZElEcyAuICcpJzsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGRhdGEgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICRTUUwsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVN5c3RlbUFkZHJlc3NRdWV1ZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU3lzdGVtQWRkcmVzc1F1ZXVlTGlzdHsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gJVN5c3RlbUFkZHJlc3NRdWV1ZUxpc3Q7Cgp9Cgo9aGVhZDIgTmFtZUV4aXN0c0NoZWNrKCkKCnJldHVybiAxIGlmIGFub3RoZXIgc3lzdGVtIGFkZHJlc3Mgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMKCiAgICAkRXhpc3QgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+TmFtZUV4aXN0c0NoZWNrKAogICAgICAgIE5hbWUgPT4gJ1NvbWUgQWRkcmVzcycsCiAgICAgICAgSUQgPT4gMSwgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBOYW1lRXhpc3RzQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGlkIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgdmFsdWUwID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkRmxhZzsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggISRQYXJhbXtJRH0gfHwgJFBhcmFte0lEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkRmxhZyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkRmxhZykgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc0lzVXNlZCgpCgpSZXR1cm4gMSBpZiBzeXN0ZW0gYWRkcmVzcyBpcyB1c2VkIGluIG9uZSBvZiB0aGUgcXVldWUncyBvciBhdXRvIHJlc3BvbnNlJ3MuCgogICAgJFN5dGVtQWRkcmVzc0lzVXNlZCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzSXNVc2VkKAogICAgICAgIFN5c3RlbUFkZHJlc3NJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzSXNVc2VkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBDaGVjayBuZWVkZWQgcGFyYW0uCiAgICBpZiAoICEkUGFyYW17U3lzdGVtQWRkcmVzc0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgU3lzdGVtQWRkcmVzc0lEISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEdldCBkYXRhYmFzZSBvYmplY3QuCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVCBzYS5pZCBGUk9NIHN5c3RlbV9hZGRyZXNzIHNhCiAgICAgICAgICAgIExFRlQgSk9JTiBxdWV1ZSBxIE9OIHEuc3lzdGVtX2FkZHJlc3NfaWQgPSBzYS5pZAogICAgICAgICAgICBMRUZUIEpPSU4gYXV0b19yZXNwb25zZSBhciBPTiBhci5zeXN0ZW1fYWRkcmVzc19pZCA9IHNhLmlkCiAgICAgICAgICAgIFdIRVJFIHEuc3lzdGVtX2FkZHJlc3NfaWQgPSA/IE9SIGFyLnN5c3RlbV9hZGRyZXNzX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1N5c3RlbUFkZHJlc3NJRH0sIFwkUGFyYW17U3lzdGVtQWRkcmVzc0lEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgRmV0Y2ggdGhlIHJlc3VsdC4KICAgIG15ICRTeXN0ZW1BZGRyZXNzSXNVc2VkOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFN5c3RlbUFkZHJlc3NJc1VzZWQgPSAkUm93WzBdID8gMSA6IDA7CiAgICB9CgogICAgcmV0dXJuICRTeXN0ZW1BZGRyZXNzSXNVc2VkOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/PostMaster/DestQueue.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9Qb3N0TWFzdGVyL0Rlc3RRdWV1ZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpEZXN0UXVldWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJywKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBwYXJzZXIgb2JqZWN0CiAgICAkU2VsZi0+e1BhcnNlck9iamVjdH0gPSAkUGFyYW17UGFyc2VyT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBQYXJzZXJPYmplY3QhIjsKCiAgICAjIEdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QuCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJFBhcmFte0NvbW11bmljYXRpb25Mb2dPYmplY3R9IHx8IGRpZSAiR290IG5vIENvbW11bmljYXRpb25Mb2dPYmplY3QhIjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRRdWV1ZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZW1haWwgaGVhZGVycwogICAgbXkgJUdldFBhcmFtID0gJXsgJFBhcmFte1BhcmFtc30gfTsKCiAgICAjIGNoZWNrIHBvc3NpYmxlIHRvLCBjYyBhbmQgcmVzZW50LXRvIGVtYWlsYWRkcmVzc2VzCiAgICBteSAkUmVjaXBpZW50ID0gJyc7CiAgICBSRUNJUElFTlQ6CiAgICBmb3IgbXkgJEtleSAocXcoUmVzZW50LVRvIEVudmVsb3BlLVRvIFRvIENjIERlbGl2ZXJlZC1UbyBYLU9yaWdpbmFsLVRvKSkgewoKICAgICAgICBuZXh0IFJFQ0lQSUVOVCBpZiAhJEdldFBhcmFteyRLZXl9OwoKICAgICAgICBpZiAoJFJlY2lwaWVudCkgewogICAgICAgICAgICAkUmVjaXBpZW50IC49ICcsICc7CiAgICAgICAgfQoKICAgICAgICAkUmVjaXBpZW50IC49ICRHZXRQYXJhbXskS2V5fTsKICAgIH0KCiAgICAjIGdldCBzeXN0ZW0gYWRkcmVzcyBvYmplY3QKICAgIG15ICRTeXN0ZW1BZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICBteSAkQWRkcmVzc1Bvb2xPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICMgZ2V0IGFkZHJlc3NlcwogICAgbXkgQEVtYWlsQWRkcmVzc2VzID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5TcGxpdEFkZHJlc3NMaW5lKCBMaW5lID0+ICRSZWNpcGllbnQgKTsKCiAgICAjIGNoZWNrIGFkZHJlc3NlcwogICAgRU1BSUw6CiAgICBmb3IgbXkgJEVtYWlsIChARW1haWxBZGRyZXNzZXMpIHsKCiAgICAgICAgbmV4dCBFTUFJTCBpZiAhJEVtYWlsOwoKICAgICAgICBteSAkQWRkcmVzcyA9ICRTZWxmLT57UGFyc2VyT2JqZWN0fS0+R2V0RW1haWxBZGRyZXNzKCBFbWFpbCA9PiAkRW1haWwgKTsKCiAgICAgICAgbmV4dCBFTUFJTCBpZiAhJEFkZHJlc3M7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICMgY2hlY2sgaWYgZW1haWwgZXhpc3QgaW4gYWRkcmVzcyBwb29sCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QWRkcmVzc1Bvb2x9ICkgewoKICAgICAgICAgICAgbmV4dCBFTUFJTCBpZgogICAgICAgICAgICAgICAgKCAkQWRkcmVzc1Bvb2xPYmplY3QtPlBvb2xMb29rdXAoIEFkZHJlc3MgPT4gJEFkZHJlc3MgKSAvLyAnJyApIG5lICRHZXRQYXJhbXtBZGRyZXNzUG9vbH07CiAgICAgICAgfQojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgogICAgICAgICMgbG9va3VwIHF1ZXVlIGlkIGlmIHJlY2lwaWVuZCBhZGRyZXNzCiAgICAgICAgbXkgJFF1ZXVlSUQgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc1F1ZXVlSUQoCiAgICAgICAgICAgIEFkZHJlc3MgPT4gJEFkZHJlc3MsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiByZWYoJFNlbGYpLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiTWF0Y2ggZW1haWw6ICRFbWFpbCB0byBRdWV1ZUlEICRRdWV1ZUlEIChNZXNzYWdlSUQ6JEdldFBhcmFteydNZXNzYWdlLUlEJ30pISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFF1ZXVlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIEFkZHJlc3MvRW1haWwgbm90IG1hdGNoZWQgd2l0aCBhbnkgdGhhdCBpcyBjb25maWd1cmVkIGluIHRoZSBzeXN0ZW0KICAgICAgICAjICAgb3IgYW55IGVycm9yIG9jY3VycmVkIHdoaWxlIGNoZWNraW5nIGl0LgoKICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gcmVmKCRTZWxmKSwKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiTm8gbWF0Y2ggZm9yIGVtYWlsOiAkRW1haWwgKE1lc3NhZ2VJRDokR2V0UGFyYW17J01lc3NhZ2UtSUQnfSkhIiwKICAgICAgICApOwogICAgfQoKICAgICMgSWYgd2UgZ2V0IGhlcmUgbWVhbnMgdGhhdCBub25lIG9mIHRoZSBhZGRyZXNzZXMgaW4gdGhlIG1lc3NhZ2UgaXMgZGVmaW5lZCBhcyBhIHN5c3RlbSBhZGRyZXNzCiAgICAjICAgb3IgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY2hlY2tpbmcgaXQuCgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgIG15ICRRdWV1ZSAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdQb3N0bWFzdGVyRGVmYXVsdFF1ZXVlJyk7CiAgICBteSAkUXVldWU7CgogICAgaWYgKCAkR2V0UGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICRRdWV1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKS0+eyAkR2V0UGFyYW17QWRkcmVzc1Bvb2x9IH17J0RlZmF1bHRRdWV1ZSd9OwogICAgfQoKICAgICRRdWV1ZSAvLz0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdQb3N0bWFzdGVyRGVmYXVsdFF1ZXVlJyk7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKCiAgICBteSAkUXVldWVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCgKICAgICAgICBRdWV1ZSA9PiAkUXVldWUsCiAgICApOwoKICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiByZWYoJFNlbGYpLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJNZXNzYWdlSUQ6JEdldFBhcmFteydNZXNzYWdlLUlEJ30gdG8gJ1Bvc3RtYXN0ZXJEZWZhdWx0UXVldWUnICggUXVldWVJRDoke1F1ZXVlSUR9ICkuIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFF1ZXVlSUQ7CiAgICB9CgogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICBLZXkgICAgICAgICAgID0+IHJlZigkU2VsZiksCiAgICAgICAgVmFsdWUgICAgICAgICA9PiAiQ291bGRuJ3QgZ2V0IFF1ZXVlSUQgZm9yICdQb3N0bWFzdGVyRGVmYXVsdFF1ZXVlJyAoJHtRdWV1ZX0pICEiLAogICAgKTsKCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgIEtleSAgICAgICAgICAgPT4gcmVmKCRTZWxmKSwKICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJNZXNzYWdlSUQ6JEdldFBhcmFteydNZXNzYWdlLUlEJ30gdG8gUXVldWVJRDoxISIsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgR2V0VHJ1c3RlZFF1ZXVlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBlbWFpbCBoZWFkZXJzCiAgICBteSAlR2V0UGFyYW0gPSAleyAkUGFyYW17UGFyYW1zfSB9OwoKICAgIHJldHVybiBpZiAhJEdldFBhcmFteydYLU9UT0JPLVF1ZXVlJ307CgogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RGVzdFF1ZXVlJywKICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJFeGlzdGluZyBYLU9UT0JPLVF1ZXVlIGhlYWRlcjogJEdldFBhcmFteydYLU9UT0JPLVF1ZXVlJ30gKE1lc3NhZ2VJRDokR2V0UGFyYW17J01lc3NhZ2UtSUQnfSkhIiwKICAgICk7CgogICAgIyBnZXQgZGVzdCBxdWV1ZQogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCgKICAgICAgICBRdWV1ZSA9PiAkR2V0UGFyYW17J1gtT1RPQk8tUXVldWUnfSwKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/Ticket/Article/Backend/Email.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9UaWNrZXQvQXJ0aWNsZS9CYWNrZW5kL0VtYWlsLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6RW1haWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKdXNlIE1haWw6OkFkZHJlc3M7CgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIHBhcmVudCAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6TUlNRUJhc2UnOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVtYWlsJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6Okxvb3BQcm90ZWN0aW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbFF1ZXVlJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlOjpCYWNrZW5kOjpFbWFpbCAtIGJhY2tlbmQgY2xhc3MgZm9yIGVtYWlsIGJhc2VkIGFydGljbGVzCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgZW1haWwgYmFzZWQgYXJ0aWNsZXMgaW4gdGhlIGRhdGFiYXNlLgoKSW5oZXJpdHMgZnJvbSBMPEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGU6OkJhY2tlbmQ6Ok1JTUVCYXNlPiwgcGxlYXNlIGhhdmUgYSBsb29rIHRoZXJlIGZvciBpdHMgYmFzZSBBUEksCmFuZCBiZWxvdyBmb3IgdGhlIGFkZGl0aW9uYWwgZnVuY3Rpb25zIHRoaXMgYmFja2VuZCBwcm92aWRlcy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9Y3V0CgpzdWIgQ2hhbm5lbE5hbWVHZXQgewogICAgcmV0dXJuICdFbWFpbCc7Cn0KCj1oZWFkMiBBcnRpY2xlR2V0QnlNZXNzYWdlSUQoKQoKUmV0dXJuIGFydGljbGUgZGF0YSBieSBzdXBwbGllZCBtZXNzYWdlIElELgoKICAgIG15ICVBcnRpY2xlID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0QnlNZXNzYWdlSUQoCiAgICAgICAgTWVzc2FnZUlEICAgICA9PiAnPDEzMjMxMjMxLjEyMzEyMzEuMzIxMzEyMzFAZXhhbXBsZS5jb20+JywgICAgICMgKHJlcXVpcmVkKQogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVG8gaW5jbHVkZSB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZXMgZm9yIHRoaXMgYXJ0aWNsZSBvbiB0aGUgcmV0dXJuIHN0cnVjdHVyZS4KICAgICAgICBSZWFsTmFtZXMgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRvIGluY2x1ZGUgdGhlIEZyb20vVG8vQ2MvQmNjIGZpZWxkcyB3aXRoIHJlYWwgbmFtZXMuCiAgICApOwoKPWN1dAoKc3ViIEFydGljbGVHZXRCeU1lc3NhZ2VJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtNZXNzYWdlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNZXNzYWdlSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkTUQ1ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+TUQ1c3VtKCBTdHJpbmcgPT4gJFBhcmFte01lc3NhZ2VJRH0gKTsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIEdldCB0aWNrZXQgYW5kIGFydGljbGUgSUQgZnJvbSBtZXRhIGFydGljbGUgdGFibGUuCgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiMgICAgICAgU1FMID0+ICcKIyAgICAgICAgICAgU0VMRUNUIHNhLmlkLCBzYS50aWNrZXRfaWQgRlJPTSBhcnRpY2xlIHNhCiMgICAgICAgICAgIExFRlQgSk9JTiBhcnRpY2xlX2RhdGFfbWltZSBzYWRtIE9OIHNhLmlkID0gc2FkbS5hcnRpY2xlX2lkCiMgICAgICAgICAgIFdIRVJFIHNhZG0uYV9tZXNzYWdlX2lkX21kNSA9ID8KIyAgICAgICAnLAojICAgICAgIEJpbmQgID0+IFsgXCRNRDUgXSwKIyAgICAgICBMaW1pdCA9PiAxMCwKIyAgICk7CiMKIyAgICBteSAkQ291bnQgPSAwOwojICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewojICAgICAgICAkUGFyYW17QXJ0aWNsZUlEfSA9ICRSb3dbMF07CiMgICAgICAgICRQYXJhbXtUaWNrZXRJRH0gID0gJFJvd1sxXTsKIyAgICAgICAgJENvdW50Kys7CiMgICAgfQojCiMgICAgIyBObyByZWZlcmVuY2UgZm91bmQuCiMgICAgcmV0dXJuIGlmICRDb3VudCA9PSAwOwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIHNhLmlkLCBzYS50aWNrZXRfaWQgRlJPTSBhcnRpY2xlIHNhCiAgICAgICAgICAgIExFRlQgSk9JTiBhcnRpY2xlX2RhdGFfbWltZSBzYWRtIE9OIHNhLmlkID0gc2FkbS5hcnRpY2xlX2lkCiAgICAgICAgICAgIFdIRVJFIHNhZG0uYV9tZXNzYWdlX2lkX21kNSA9ID8KICAgICAgICAgICAgT1JERVIgQlkgc2EuaWQgREVTQwogICAgICAgICcsCiAgICAgICAgQmluZCAgPT4gWyBcJE1ENSBdLAogICAgKTsKCiAgICBteSBAVGlja2V0SURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBhcmFte0FydGljbGVJRH0gLy89ICRSb3dbMF07CiAgICAgICAgJFBhcmFte1RpY2tldElEfSAgLy89ICRSb3dbMV07CiAgICAgICAgcHVzaCBAVGlja2V0SURzLCAkUm93WzFdOwogICAgfQoKICAgICMgTm8gcmVmZXJlbmNlIGZvdW5kLgogICAgcmV0dXJuIGlmICFAVGlja2V0SURzOwojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICByZXR1cm4gaWYgISRQYXJhbXtUaWNrZXRJRH0gfHwgISRQYXJhbXtBcnRpY2xlSUR9OwoKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKIyAgICMgTW9yZSB0aGFuIG9uZSByZWZlcmVuY2UgZm91bmQhIFRoYXQgc2hvdWxkIG5vdCBoYXBwZW4sIHNpbmNlICdhIG1lc3NhZ2VfaWQnIHNob3VsZCBiZSB1bmlxdWUhCiMgICBpZiAoICRDb3VudCA+IDEgKSB7CiMgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiMgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAojICAgICAgICAgICBNZXNzYWdlICA9PgojICAgICAgICAgICAgICAgIlRoZSBNZXNzYWdlSUQgJyRQYXJhbXtNZXNzYWdlSUR9JyBpcyBpbiB5b3VyIGRhdGFiYXNlIG1vcmUgdGhhbiBvbmUgdGltZSEgVGhhdCBzaG91bGQgbm90IGhhcHBlbiwgc2luY2UgJ2EgbWVzc2FnZV9pZCcgc2hvdWxkIGJlIHVuaXF1ZSEiLAojICAgICAgICk7CiMgICAgICAgcmV0dXJuOwojICAgfQojCiMgICAgcmV0dXJuICRTZWxmLT5BcnRpY2xlR2V0KAojICAgICAgICAlUGFyYW0sCiMgICAgKTsKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPkFydGljbGVHZXQoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICBpZiAoIHNjYWxhciBAVGlja2V0SURzID4gMSApIHsKICAgICAgICAkQXJ0aWNsZXtBbWJpZ3VvdXNUaWNrZXRJRHN9ID0gXEBUaWNrZXRJRHM7CiAgICB9CgogICAgcmV0dXJuICVBcnRpY2xlOwojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCn0KCj1oZWFkMiBBcnRpY2xlU2VuZCgpCgpTZW5kIGFydGljbGUgdmlhIGVtYWlsIGFuZCBjcmVhdGUgYXJ0aWNsZSB3aXRoIGF0dGFjaG1lbnRzLgoKICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIGFnZW50fHN5c3RlbXxjdXN0b21lcgogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgSXMgYXJ0aWNsZSB2aXNpYmxlIGZvciBjdXN0b21lcj8KICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCgogICAgICAgIEZyb20gICAgICAgID0+ICdTb21lIEFnZW50IDxlbWFpbEBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAgICAgICAgICAgIyByZXF1aXJlZAogICAgICAgIFRvICAgICAgICAgID0+ICdTb21lIEN1c3RvbWVyIEEgPGN1c3RvbWVyLWFAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgIyByZXF1aXJlZCBpZiBib3RoIENjIGFuZCBCY2MgYXJlIG5vdCBwcmVzZW50CiAgICAgICAgQ2MgICAgICAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQiA8Y3VzdG9tZXItYkBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAjIHJlcXVpcmVkIGlmIGJvdGggVG8gYW5kIEJjYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBCY2MgICAgICAgICA9PiAnU29tZSBDdXN0b21lciBDIDxjdXN0b21lci1jQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgcmVxdWlyZWQgaWYgYm90aCBUbyBhbmQgQ2MgYXJlIG5vdCBwcmVzZW50CiAgICAgICAgUmVwbHlUbyAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQiA8Y3VzdG9tZXItYkBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCwgaXMgcG9zc2libGUgdG8gdXNlICdSZXBseS1UbycgaW5zdGVhZAogICAgICAgIFN1YmplY3QgICAgID0+ICdzb21lIHNob3J0IGRlc2NyaXB0aW9uJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXF1aXJlZAogICAgICAgIEJvZHkgICAgICAgID0+ICd0aGUgbWVzc2FnZSB0ZXh0JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXF1aXJlZAogICAgICAgIEluUmVwbHlUbyAgID0+ICc8YXNkYXNkYXNkLjEyQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3QgcmVxdWlyZWQgYnV0IHVzZWZ1bAogICAgICAgIFJlZmVyZW5jZXMgID0+ICc8YXNkYXNkYXNkLjFAZXhhbXBsZS5jb20+IDxhc2Rhc2Rhc2QuMTJAZXhhbXBsZS5jb20+JywgIyBub3QgcmVxdWlyZWQgYnV0IHVzZWZ1bAogICAgICAgIENoYXJzZXQgICAgID0+ICdpc28tODg1OS0xNScKICAgICAgICBNaW1lVHlwZSAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgTG9vcCAgICAgICAgPT4gMCwgIyAxfDAgdXNlZCBmb3IgYnVsayBlbWFpbHMKICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnbGFsYS50eHQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdsYWxhMS50eHQnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgRW1haWxTZWN1cml0eSA9PiB7CiAgICAgICAgICAgIEJhY2tlbmQgICAgID0+ICdQR1AnLCAgICAgICAgICAgICAgICAgICAgICAgIyBQR1Agb3IgU01JTUUKICAgICAgICAgICAgTWV0aG9kICAgICAgPT4gJ0RldGFjaGVkJywgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsIERldGFjaGVkIG9yIElubGluZSAoZGVmYXVsdHMgdG8gRGV0YWNoZWQpCiAgICAgICAgICAgIFNpZ25LZXkgICAgID0+ICc4MTg3N0Y1RScsICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbAogICAgICAgICAgICBFbmNyeXB0S2V5cyA9PiBbICc4MTg3N0Y1RScsICczYjYzMGM4MCcgXSwgICMgT3B0aW9uYWwKICAgICAgICB9CiAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJ093bmVyVXBkYXRlJywgICMgTW92ZXxBZGROb3RlfFByaW9yaXR5VXBkYXRlfFdlYlJlcXVlc3RDdXN0b21lcnwuLi4KICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAnU29tZSBmcmVlIHRleHQhJywKICAgICAgICBOb0FnZW50Tm90aWZ5ICA9PiAwLCAgICAgICAgICAgICMgaWYgeW91IGRvbid0IHdhbnQgdG8gc2VuZCBhZ2VudCBub3RpZmljYXRpb25zCiAgICApOwoKCiAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlU2VuZCggICAgICAgICAgICAgICAgKEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KQogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIGFnZW50fHN5c3RlbXxjdXN0b21lcgogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgSXMgYXJ0aWNsZSB2aXNpYmxlIGZvciBjdXN0b21lcj8KICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCgogICAgICAgIEZyb20gICAgICAgID0+ICdTb21lIEFnZW50IDxlbWFpbEBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAgICAgICAgICAgIyByZXF1aXJlZAogICAgICAgIFRvICAgICAgICAgID0+ICdTb21lIEN1c3RvbWVyIEEgPGN1c3RvbWVyLWFAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgIyByZXF1aXJlZCBpZiBib3RoIENjIGFuZCBCY2MgYXJlIG5vdCBwcmVzZW50CiAgICAgICAgQ2MgICAgICAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQiA8Y3VzdG9tZXItYkBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAjIHJlcXVpcmVkIGlmIGJvdGggVG8gYW5kIEJjYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBCY2MgICAgICAgICA9PiAnU29tZSBDdXN0b21lciBDIDxjdXN0b21lci1jQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgcmVxdWlyZWQgaWYgYm90aCBUbyBhbmQgQ2MgYXJlIG5vdCBwcmVzZW50CiAgICAgICAgUmVwbHlUbyAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQiA8Y3VzdG9tZXItYkBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCwgaXMgcG9zc2libGUgdG8gdXNlICdSZXBseS1UbycgaW5zdGVhZAogICAgICAgIFN1YmplY3QgICAgID0+ICdzb21lIHNob3J0IGRlc2NyaXB0aW9uJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXF1aXJlZAogICAgICAgIEJvZHkgICAgICAgID0+ICd0aGUgbWVzc2FnZSB0ZXh0JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXF1aXJlZAogICAgICAgIEluUmVwbHlUbyAgID0+ICc8YXNkYXNkYXNkLjEyQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3QgcmVxdWlyZWQgYnV0IHVzZWZ1bAogICAgICAgIFJlZmVyZW5jZXMgID0+ICc8YXNkYXNkYXNkLjFAZXhhbXBsZS5jb20+IDxhc2Rhc2Rhc2QuMTJAZXhhbXBsZS5jb20+JywgIyBub3QgcmVxdWlyZWQgYnV0IHVzZWZ1bAogICAgICAgIENoYXJzZXQgICAgID0+ICdpc28tODg1OS0xNScKICAgICAgICBNaW1lVHlwZSAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgTG9vcCAgICAgICAgPT4gMCwgIyAxfDAgdXNlZCBmb3IgYnVsayBlbWFpbHMKICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnbGFsYS50eHQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdsYWxhMS50eHQnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgU2lnbiA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgPT4gJ1BHUCcsCiAgICAgICAgICAgIFN1YlR5cGUgPT4gJ0lubGluZXxEZXRhY2hlZCcsCiAgICAgICAgICAgIEtleSAgICAgPT4gJzgxODc3RjVFJywKICAgICAgICAgICAgVHlwZSAgICA9PiAnU01JTUUnLAogICAgICAgICAgICBLZXkgICAgID0+ICczYjYzMGM4MCcsCiAgICAgICAgfSwKICAgICAgICBDcnlwdCA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgPT4gJ1BHUCcsCiAgICAgICAgICAgIFN1YlR5cGUgPT4gJ0lubGluZXxEZXRhY2hlZCcsCiAgICAgICAgICAgIEtleSAgICAgPT4gJzgxODc3RjVFJywKICAgICAgICAgICAgVHlwZSAgICA9PiAnU01JTUUnLAogICAgICAgICAgICBLZXkgICAgID0+ICczYjYzMGM4MCcsCiAgICAgICAgfSwKICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAnT3duZXJVcGRhdGUnLCAgIyBNb3ZlfEFkZE5vdGV8UHJpb3JpdHlVcGRhdGV8V2ViUmVxdWVzdEN1c3RvbWVyfC4uLgogICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICdTb21lIGZyZWUgdGV4dCEnLAogICAgICAgIE5vQWdlbnROb3RpZnkgID0+IDAsICAgICAgICAgICAgIyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzZW5kIGFnZW50IG5vdGlmaWNhdGlvbnMKICAgICk7CgpFdmVudHM6CiAgICBBcnRpY2xlU2VuZAoKPWN1dAoKc3ViIEFydGljbGVTZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRvT3JpZyAgICAgID0gJFBhcmFte1RvfSAgICAgICAgICB8fCAnJzsKICAgIG15ICRMb29wICAgICAgICA9ICRQYXJhbXtMb29wfSAgICAgICAgfHwgMDsKICAgIG15ICRIaXN0b3J5VHlwZSA9ICRQYXJhbXtIaXN0b3J5VHlwZX0gfHwgJ1NlbmRBbnN3ZXInOwoKICAgIG15ICRBcnRpY2xlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICMgTG9va3VwIGlmIG5vIElEIGlzIHBhc3NlZC4KICAgIGlmICggJFBhcmFte1NlbmRlclR5cGV9ICYmICEkUGFyYW17U2VuZGVyVHlwZUlEfSApIHsKICAgICAgICAkUGFyYW17U2VuZGVyVHlwZUlEfSA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlU2VuZGVyVHlwZUxvb2t1cCggU2VuZGVyVHlwZSA9PiAkUGFyYW17U2VuZGVyVHlwZX0gKTsKICAgIH0KCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgVXNlcklEIFNlbmRlclR5cGVJRCBGcm9tIEJvZHkgQ2hhcnNldCBNaW1lVHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIElzVmlzaWJsZUZvckN1c3RvbWVyISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBNYXAgUmVwbHlUbyBpbnRvIFJlcGx5LVRvIGlmIHByZXNlbnQuCiAgICBpZiAoICRQYXJhbXtSZXBseVRvfSApIHsKICAgICAgICAkUGFyYW17J1JlcGx5LVRvJ30gPSAkUGFyYW17UmVwbHlUb307CiAgICB9CgogICAgIyBDbGVhbiB1cCBib2R5IHN0cmluZy4KICAgICRQYXJhbXtCb2R5fSA9fiBzLyhcclxufFxuXHIpL1xuL2c7CiAgICAkUGFyYW17Qm9keX0gPX4gcy9cci9cbi9nOwoKICAgICMgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgZm9yIGF0dGFjaG1lbnRzLCBzbyB0aGF0IHRoZSBjb250ZW50IHB1c2hlZCBpbnRvIHRoYXQgcmVmIGZyb20KICAgICMgRW1iZWRkZWRJbWFnZXNFeHRyYWN0IHdpbGwgc3RheSBhdmFpbGFibGUKICAgIGlmICggISRQYXJhbXtBdHRhY2htZW50fSApIHsKICAgICAgICAkUGFyYW17QXR0YWNobWVudH0gPSBbXTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBiYXNlNjQgaW1hZ2VzIGluIGJvZHkgYW5kIHByb2Nlc3MgdGhlbQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5FbWJlZGRlZEltYWdlc0V4dHJhY3QoCiAgICAgICAgRG9jdW1lbnRSZWYgICAgPT4gXCRQYXJhbXtCb2R5fSwKICAgICAgICBBdHRhY2htZW50c1JlZiA9PiAkUGFyYW17QXR0YWNobWVudH0sCiAgICApOwoKICAgICMgY3JlYXRlIGFydGljbGUKICAgIG15ICRUaW1lICAgICAgPSAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKTsKICAgIG15ICRSYW5kb20gICAgPSByYW5kIDk5OTk5OTsKICAgIG15ICRGUUROICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZRRE4nKTsKICAgIG15ICRNZXNzYWdlSUQgPSAiPCRUaW1lLiRSYW5kb21cQCRGUUROPiI7CiAgICBteSAkQXJ0aWNsZUlEID0gJFNlbGYtPkFydGljbGVDcmVhdGUoCiAgICAgICAgJVBhcmFtLAogICAgICAgIE1lc3NhZ2VJRCA9PiAkTWVzc2FnZUlELAogICAgKTsKICAgIHJldHVybiBpZiAhJEFydGljbGVJRDsKCiAgICAjIFNlbmQgdGhlIG1haWwKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKS0+U2VuZCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQXJ0aWNsZUlEICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgJ01lc3NhZ2UtSUQnID0+ICRNZXNzYWdlSUQsCiAgICApOwoKICAgICMgcmV0dXJuIGlmIG1haWwgd2Fzbid0IHNlbnQKICAgIGlmICggISRSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkltcG9zc2libGUgdG8gc2VuZCBtZXNzYWdlIHRvOiAkUGFyYW17J1RvJ30gLiIsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB3cml0ZSBhcnRpY2xlIHRvIGZpbGUgc3lzdGVtCiAgICBteSAkUGxhaW4gPSAkU2VsZi0+QXJ0aWNsZVdyaXRlUGxhaW4oCiAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgRW1haWwgICAgID0+IHNwcmludGYoICIlc1xuJXMiLCAkUmVzdWx0LT57RGF0YX0tPntIZWFkZXJ9LCAkUmVzdWx0LT57RGF0YX0tPntCb2R5fSApLAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRQbGFpbjsKCiAgICAjIGxvZwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYoCiAgICAgICAgICAgICJRdWV1ZWQgZW1haWwgdG8gJyVzJyBmcm9tICclcycuIEhpc3RvcnlUeXBlID0+ICVzLCBTdWJqZWN0ID0+ICVzOyIsCiAgICAgICAgICAgICRQYXJhbXtUb30sCiAgICAgICAgICAgICRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgJEhpc3RvcnlUeXBlLAogICAgICAgICAgICAkUGFyYW17U3ViamVjdH0sCiAgICAgICAgKSwKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZVNlbmQnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEFydGljbGVJRDsKfQoKPWhlYWQyIEFydGljbGVCb3VuY2UoKQoKQm91bmNlIGFuIGFydGljbGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVCb3VuY2UoCiAgICAgICAgRnJvbSAgICAgID0+ICdzb21lQGV4YW1wbGUuY29tJywKICAgICAgICBUbyAgICAgICAgPT4gJ3dlYm1hc3RlckBleGFtcGxlLmNvbScsCiAgICAgICAgVGlja2V0SUQgID0+IDEyMywKICAgICAgICBBcnRpY2xlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxMjMsCiAgICApOwoKRXZlbnRzOgogICAgQXJ0aWNsZUJvdW5jZQoKPWN1dAoKc3ViIEFydGljbGVCb3VuY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEl0ZW0gKHF3KFRpY2tldElEIEFydGljbGVJRCBGcm9tIFRvIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEl0ZW19ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkSXRlbSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICMgY3JlYXRlIG1lc3NhZ2UgaWQKICAgIG15ICRUaW1lICAgICAgICAgPSAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKTsKICAgIG15ICRSYW5kb20gICAgICAgPSByYW5kIDk5OTk5OTsKICAgIG15ICRGUUROICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZRRE4nKTsKICAgIG15ICROZXdNZXNzYWdlSUQgPSAiPCRUaW1lLiRSYW5kb20uMFxAJEZRRE4+IjsKICAgIG15ICRFbWFpbCAgICAgICAgPSAkU2VsZi0+QXJ0aWNsZVBsYWluKCBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0gKTsKCiAgICAjIGNoZWNrIGlmIHBsYWluIGVtYWlsIGV4aXN0cwogICAgaWYgKCAhJEVtYWlsICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBwbGFpbiBhcnRpY2xlIGZvciBBcnRpY2xlSUQgKCRQYXJhbXtBcnRpY2xlSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcGlwZSBhbGwgaW50byBzZW5kbWFpbAogICAgbXkgJEJvdW5jZVNlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKS0+Qm91bmNlKAogICAgICAgICdNZXNzYWdlLUlEJyA9PiAkTmV3TWVzc2FnZUlELAogICAgICAgIEZyb20gICAgICAgICA9PiAkUGFyYW17RnJvbX0sCiAgICAgICAgVG8gICAgICAgICAgID0+ICRQYXJhbXtUb30sCiAgICAgICAgRW1haWwgICAgICAgID0+ICRFbWFpbCwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQm91bmNlU2VudC0+e1N1Y2Nlc3N9OwoKICAgICMgd3JpdGUgaGlzdG9yeQogICAgbXkgJEhpc3RvcnlUeXBlID0gJFBhcmFte0hpc3RvcnlUeXBlfSB8fCAnQm91bmNlJzsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+SGlzdG9yeUFkZCgKICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgICAgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgSGlzdG9yeVR5cGUgID0+ICRIaXN0b3J5VHlwZSwKICAgICAgICBOYW1lICAgICAgICAgPT4gIlwlXCUkUGFyYW17VG99IiwKICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FydGljbGVCb3VuY2UnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBTZW5kQXV0b1Jlc3BvbnNlKCkKClNlbmQgYW4gYXV0byByZXNwb25zZSB0byBhIGN1c3RvbWVyIHZpYSBlbWFpbC4KCiAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5TZW5kQXV0b1Jlc3BvbnNlKAogICAgICAgIFRpY2tldElEICAgICAgICAgPT4gMTIzLAogICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgIE9yaWdIZWFkZXIgICAgICAgPT4gewogICAgICAgICAgICBGcm9tICAgID0+ICdzb21lQGV4YW1wbGUuY29tJywKICAgICAgICAgICAgU3ViamVjdCA9PiAnRm9yIHRoZSBtZXNzYWdlIScsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCkV2ZW50czoKICAgIEFydGljbGVBdXRvUmVzcG9uc2UKCj1jdXQKCnN1YiBTZW5kQXV0b1Jlc3BvbnNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkSXRlbSAocXcoVGlja2V0SUQgVXNlcklEIE9yaWdIZWFkZXIgQXV0b1Jlc3BvbnNlVHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEl0ZW19ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkSXRlbSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIG5vdGlmaWNhdGlvbiBpcyBhY3RpdmUKICAgIHJldHVybiAxIGlmICRTZWxmLT57U2VuZE5vTm90aWZpY2F0aW9ufTsKCiAgICAjIGdldCBvcmlnIGVtYWlsIGhlYWRlcgogICAgbXkgJU9yaWdIZWFkZXIgPSAleyAkUGFyYW17T3JpZ0hlYWRlcn0gfTsKCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IHRpY2tldAogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLCAgICAgICAgICAgICAgICAgICMgbm90IG5lZWRlZCBoZXJlLCBUZW1wbGF0ZUdlbmVyYXRvciB3aWxsIGZldGNoIHRoZSB0aWNrZXQgb24gaXRzIG93bgogICAgKTsKCiAgICAjIGdldCBhdXRvIGRlZmF1bHQgcmVzcG9uc2VzCiAgICBteSAlQXV0b1Jlc3BvbnNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPkF1dG9SZXNwb25zZSgKICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSA9PiAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0sCiAgICAgICAgT3JpZ0hlYWRlciAgICAgICA9PiAkUGFyYW17T3JpZ0hlYWRlcn0sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgbm8gdmFsaWQgYXV0byByZXNwb25zZSBleGlzdHMKICAgIHJldHVybiBpZiAhJEF1dG9SZXNwb25zZXtUZXh0fTsKICAgIHJldHVybiBpZiAhJEF1dG9SZXNwb25zZXtTZW5kZXJSZWFsbmFtZX07CiAgICByZXR1cm4gaWYgISRBdXRvUmVzcG9uc2V7U2VuZGVyQWRkcmVzc307CgogICAgIyBzZW5kIGlmIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgc2VudCAobm90IGZvciBjbG9zZWQgdGlja2V0cykhPwogICAgbXkgJVN0YXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0KCBJRCA9PiAkVGlja2V0e1N0YXRlSUR9ICk7CiAgICBpZiAoCiAgICAgICAgJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9IGVxICdhdXRvIHJlcGx5JwogICAgICAgICYmICggJFN0YXRle1R5cGVOYW1lfSBlcSAnY2xvc2VkJyB8fCAkU3RhdGV7VHlwZU5hbWV9IGVxICdyZW1vdmVkJyApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGFkZCBoaXN0b3J5IHJvdwogICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICdNaXNjJywKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlNlbnQgbm8gYXV0byByZXNwb25zZSBvciBhZ2VudCBub3RpZmljYXRpb24gYmVjYXVzZSB0aWNrZXQgaXMgIgogICAgICAgICAgICAgICAgLiAic3RhdGUtdHlwZSAnJFN0YXRle1R5cGVOYW1lfSchIiwKICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9nIHRoYXQgbm8gYXV0byByZXNwb25zZSB3YXMgc2VudCEKICAgIGlmICggJE9yaWdIZWFkZXJ7J1gtT1RPQk8tTG9vcCd9ICYmICRPcmlnSGVhZGVyeydYLU9UT0JPLUxvb3AnfSAhfiAvXihmYWxzZXxubykkL2kgKSB7CgogICAgICAgICMgYWRkIGhpc3Rvcnkgcm93CiAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJ01pc2MnLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAiU2VudCBubyBhdXRvLXJlc3BvbnNlIGJlY2F1c2UgdGhlIHNlbmRlciBkb2Vzbid0IHdhbnQgIgogICAgICAgICAgICAgICAgLiAiYW4gYXV0by1yZXNwb25zZSAoZS4gZy4gbG9vcCBvciBwcmVjZWRlbmNlIGhlYWRlcikiLAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VudCBubyAnJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9JyBmb3IgVGlja2V0IFsiCiAgICAgICAgICAgICAgICAuICIkVGlja2V0e1RpY2tldE51bWJlcn1dICgkT3JpZ0hlYWRlcntGcm9tfSkgYmVjYXVzZSB0aGUgIgogICAgICAgICAgICAgICAgLiAic2VuZGVyIGRvZXNuJ3Qgd2FudCBhbiBhdXRvLXJlc3BvbnNlIChlLiBnLiBsb29wIG9yIHByZWNlZGVuY2UgaGVhZGVyKSIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHJlcGx5IHRvIGZvciBhdXRvIHJlc3BvbnNlIHJlY2lwaWVudAogICAgaWYgKCAkT3JpZ0hlYWRlcntSZXBseVRvfSApIHsKICAgICAgICAkT3JpZ0hlYWRlcntGcm9tfSA9ICRPcmlnSGVhZGVye1JlcGx5VG99OwogICAgfQoKICAgICMgZ2V0IGxvb3AgcHJvdGVjdGlvbiBvYmplY3QKICAgIG15ICRMb29wUHJvdGVjdGlvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpMb29wUHJvdGVjdGlvbicpOwoKICAgICMgY3JlYXRlIGVtYWlsIHBhcnNlciBvYmplY3QKICAgIG15ICRFbWFpbFBhcnNlciA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgIE1vZGUgPT4gJ1N0YW5kYWxvbmUnLAogICAgKTsKCiAgICBteSBAQXV0b1JlcGx5QWRkcmVzc2VzOwogICAgbXkgQEFkZHJlc3NlcyA9ICRFbWFpbFBhcnNlci0+U3BsaXRBZGRyZXNzTGluZSggTGluZSA9PiAkT3JpZ0hlYWRlcntGcm9tfSApOwogICAgQUREUkVTUzoKICAgIGZvciBteSAkQWRkcmVzcyAoQEFkZHJlc3NlcykgewogICAgICAgIG15ICRFbWFpbCA9ICRFbWFpbFBhcnNlci0+R2V0RW1haWxBZGRyZXNzKCBFbWFpbCA9PiAkQWRkcmVzcyApOwogICAgICAgIGlmICggISRFbWFpbCApIHsKCiAgICAgICAgICAgICMgYWRkIGl0IHRvIHRpY2tldCBoaXN0b3J5CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gIlNlbnQgbm8gYXV0byByZXNwb25zZSB0byAnJEFkZHJlc3MnIC0gbm8gdmFsaWQgZW1haWwgYWRkcmVzcy4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBsb2cKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZW50IG5vIGF1dG8gcmVzcG9uc2UgdG8gJyRBZGRyZXNzJyBiZWNhdXNlIG9mIGludmFsaWQgYWRkcmVzcy4iLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IEFERFJFU1M7CgogICAgICAgIH0KICAgICAgICBpZiAoICEkTG9vcFByb3RlY3Rpb25PYmplY3QtPkNoZWNrKCBUbyA9PiAkRW1haWwgKSApIHsKCiAgICAgICAgICAgICMgYWRkIGhpc3Rvcnkgcm93CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTG9vcFByb3RlY3Rpb24nLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICJcJVwlJEVtYWlsIiwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9nCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VudCBubyAnJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9JyBmb3IgVGlja2V0IFsiCiAgICAgICAgICAgICAgICAgICAgLiAiJFRpY2tldHtUaWNrZXROdW1iZXJ9XSAoJEVtYWlsKSBiZWNhdXNlIG9mIGxvb3AgcHJvdGVjdGlvbi4iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgQUREUkVTUzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGluY3JlYXNlIGxvb3AgY291bnQKICAgICAgICAgICAgcmV0dXJuIGlmICEkTG9vcFByb3RlY3Rpb25PYmplY3QtPlNlbmRFbWFpbCggVG8gPT4gJEVtYWlsICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHNlbmRlciBpcyBlLiBnLiBNQUlMRVItREFFTU9OIG9yIFBvc3RtYXN0ZXIKICAgICAgICBteSAkTm9BdXRvUmVnRXhwID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTZW5kTm9BdXRvUmVzcG9uc2VSZWdFeHAnKTsKICAgICAgICBpZiAoICRFbWFpbCA9fiAvJE5vQXV0b1JlZ0V4cC9pICkgewoKICAgICAgICAgICAgIyBhZGQgaXQgdG8gdGlja2V0IGhpc3RvcnkKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiU2VudCBubyBhdXRvIHJlc3BvbnNlIHRvICckRW1haWwnLCBTZW5kTm9BdXRvUmVzcG9uc2VSZWdFeHAgbWF0Y2hlZC4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBsb2cKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VudCBubyBhdXRvIHJlc3BvbnNlIHRvICckRW1haWwnIGJlY2F1c2UgY29uZmlnIgogICAgICAgICAgICAgICAgICAgIC4gIiBvcHRpb24gU2VuZE5vQXV0b1Jlc3BvbnNlUmVnRXhwICgvJE5vQXV0b1JlZ0V4cC9pKSBtYXRjaGVkLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgQUREUkVTUzsKICAgICAgICB9CgogICAgICAgIHB1c2ggQEF1dG9SZXBseUFkZHJlc3NlcywgJEFkZHJlc3M7CiAgICB9CgogICAgbXkgJEF1dG9SZXBseUFkZHJlc3NlcyA9IGpvaW4oICcsICcsIEBBdXRvUmVwbHlBZGRyZXNzZXMgKTsKICAgIG15ICRDYzsKCiAgICAjIGFsc28gc2VuZCBDQyB0byBjdXN0b21lciB1c2VyIGlmIGN1c3RvbWVyIHVzZXIgaWQgaXMgdXNlZCBhbmQgYWRkcmVzc2VzIGRvIG5vdCBtYXRjaAogICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfQogICAgICAgICAgICAmJiAkT3JpZ0hlYWRlcntGcm9tfSAhfiAvXFEkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH1cRS9pCiAgICAgICAgICAgICYmICRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJENjID0gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBoaXN0b3J5IHR5cGUKICAgIG15ICRIaXN0b3J5VHlwZTsKICAgIGlmICggJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9ID1+IC9eYXV0byBmb2xsb3cgdXAkL2kgKSB7CiAgICAgICAgJEhpc3RvcnlUeXBlID0gJ1NlbmRBdXRvRm9sbG93VXAnOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0gPX4gL15hdXRvIHJlcGx5JC9pICkgewogICAgICAgICRIaXN0b3J5VHlwZSA9ICdTZW5kQXV0b1JlcGx5JzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9ID1+IC9eYXV0byByZXBseVwvbmV3IHRpY2tldCQvaSApIHsKICAgICAgICAkSGlzdG9yeVR5cGUgPSAnU2VuZEF1dG9SZXBseSc7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBdXRvUmVzcG9uc2VUeXBlfSA9fiAvXmF1dG8gcmVqZWN0JC9pICkgewogICAgICAgICRIaXN0b3J5VHlwZSA9ICdTZW5kQXV0b1JlamVjdCc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkSGlzdG9yeVR5cGUgPSAnTWlzYyc7CiAgICB9CgogICAgaWYgKCAhQEF1dG9SZXBseUFkZHJlc3NlcyAmJiAhJENjICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBhdXRvIHJlc3BvbnNlIGFkZHJlc3NlcyBmb3IgVGlja2V0IFskVGlja2V0e1RpY2tldE51bWJlcn1dIgogICAgICAgICAgICAgICAgLiAiIChUaWNrZXRJRD0kUGFyYW17VGlja2V0SUR9KS4iCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBGb3JtYXQgc2VuZGVyIHJlYWxuYW1lIGFuZCBhZGRyZXNzIGNvbXBsaWFudCB0byBSRkMgNTMyMi4gVGhpcyBpcyByZWxldmFudCB3aGVuIHRoZSByZWFsIG5hbWUgY29udGFpbiBjb21tYXMKICAgICMgb3Igb3RoZXIgc3BlY2lhbCBzeW1ib2xzLgogICAgbXkgJEZyb20gPSBNYWlsOjpBZGRyZXNzLT5uZXcoICRBdXRvUmVzcG9uc2V7U2VuZGVyUmVhbG5hbWV9LCAkQXV0b1Jlc3BvbnNle1NlbmRlckFkZHJlc3N9ICk7CgogICAgIyBzZW5kIGVtYWlsCiAgICBteSAkQXJ0aWNsZUlEID0gJFNlbGYtPkFydGljbGVTZW5kKAogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ3N5c3RlbScsCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAkSGlzdG9yeVR5cGUsCiAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gIlwlXCUkQXV0b1JlcGx5QWRkcmVzc2VzIiwKICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkRnJvbS0+Zm9ybWF0KCksCiAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEF1dG9SZXBseUFkZHJlc3NlcywKICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkQ2MsCiAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJ3V0Zi04JywKICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICA9PiAkQXV0b1Jlc3BvbnNle0NvbnRlbnRUeXBlfSwKICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkQXV0b1Jlc3BvbnNle1N1YmplY3R9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRBdXRvUmVzcG9uc2V7VGV4dH0sCiAgICAgICAgSW5SZXBseVRvICAgICAgICAgICAgPT4gJE9yaWdIZWFkZXJ7J01lc3NhZ2UtSUQnfSwKICAgICAgICBMb29wICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGxvZwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICJTZW50IGF1dG8gcmVzcG9uc2UgKCRIaXN0b3J5VHlwZSkgZm9yIFRpY2tldCBbJFRpY2tldHtUaWNrZXROdW1iZXJ9XSIKICAgICAgICAgICAgLiAiIChUaWNrZXRJRD0kUGFyYW17VGlja2V0SUR9LCBBcnRpY2xlSUQ9JEFydGljbGVJRCkgdG8gJyRBdXRvUmVwbHlBZGRyZXNzZXMnLiIKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZUF1dG9SZXNwb25zZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFydGljbGVUcmFuc21pc3Npb25TdGF0dXMoKQoKR2V0IHRoZSB0cmFuc21pc3Npb24gc3RhdHVzIGZvciBvbmUgYXJ0aWNsZS4KCiAgICBteSAkVHJhbnNtaXNzaW9uU3RhdHVzID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlVHJhbnNtaXNzaW9uU3RhdHVzKAogICAgICAgIEFydGljbGVJRCA9PiAxMjMsICAgIyByZXF1aXJlZAogICAgKTsKClRoaXMgcmV0dXJucyBzb21ldGhpbmcgbGlrZToKCiAgICAkVHJhbnNtaXNzaW9uU3RhdHVzID0gewogICAgICAgIEFydGljbGVJRCAgPT4gMTIzLAogICAgICAgIE1lc3NhZ2VJRCAgPT4gNDU2LAogICAgICAgIE1lc3NhZ2UgICAgPT4gJ0Rlc2NyaXB0aXZlIG1lc3NhZ2Ugb2YgbGFzdCBjb21tdW5pY2F0aW9uJywgICMgb25seSBpbiBjYXNlIG9mIGZhaWxlZCBzdGF0dXMKICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDE3LTAxLTAxIDEyOjM0OjU2JywKICAgICAgICBTdGF0dXMgICAgID0+IFtQcm9jZXNzaW5nfEZhaWxlZF0sCiAgICAgICAgQXR0ZW1wdHMgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGluIGNhc2Ugb2YgcHJvY2Vzc2luZyBzdGF0dXMKICAgICAgICBEdWVUaW1lICAgID0+ICcyMDE3LTAxLTAyIDEyOjM0OjU2JywgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgaW4gY2FzZSBvZiBwcm9jZXNzaW5nIHN0YXR1cwogICAgfQoKPWN1dAoKc3ViIEFydGljbGVUcmFuc21pc3Npb25TdGF0dXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQXJ0aWNsZUlEJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPkFydGljbGVHZXRUcmFuc21pc3Npb25FcnJvciggJVBhcmFtLCApOwogICAgcmV0dXJuICRSZXN1bHQgaWYgJFJlc3VsdCAmJiAleyRSZXN1bHR9OwoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGFydGljbGVfaWQsIGNyZWF0ZV90aW1lLCBhdHRlbXB0cywgZHVlX3RpbWUgRlJPTSBtYWlsX3F1ZXVlIFdIRVJFIGFydGljbGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtBcnRpY2xlSUR9IF0sCiAgICApOwoKICAgIGlmICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIEFydGljbGVJRCAgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAkUm93WzFdLAogICAgICAgICAgICBBdHRlbXB0cyAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIER1ZVRpbWUgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgU3RhdHVzICAgICA9PiAnUHJvY2Vzc2luZycsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBBcnRpY2xlQ3JlYXRlVHJhbnNtaXNzaW9uRXJyb3IoKQoKQ3JlYXRlcyBhIFRyYW5zbWlzc2lvbiBFcnJvciBlbnRyeSBmb3Igb25lIGFydGljbGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGVUcmFuc21pc3Npb25FcnJvcigKICAgICAgICBBcnRpY2xlSUQgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAjIFJlcXVpcmVkCiAgICAgICAgTWVzc2FnZUlEID0+IDQ1NiwgICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbAogICAgICAgIE1lc3NhZ2UgICA9PiAnJywgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgQXJ0aWNsZUNyZWF0ZVRyYW5zbWlzc2lvbkVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkRmllbGQgKHF3e0FydGljbGVJRH0pIHsKICAgICAgICBpZiAoICEkUGFyYW17JEZpZWxkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJHtGaWVsZH0hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTUUwgPSAnSU5TRVJUIElOVE8gYXJ0aWNsZV9kYXRhX21pbWVfc2VuZF9lcnJvcignOwoKICAgIG15IEBGaWVsZHM7CiAgICBteSBAQmluZDsKCiAgICBteSAlTWFwREIgPSAoCiAgICAgICAgQXJ0aWNsZUlEID0+ICdhcnRpY2xlX2lkJywKICAgICAgICBNZXNzYWdlSUQgPT4gJ21lc3NhZ2VfaWQnLAogICAgICAgIE1lc3NhZ2UgICA9PiAnbG9nX21lc3NhZ2UnLAogICAgKTsKCiAgICBteSBAUGxhY2VIb2xkZXI7CgogICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlTWFwREIgKSB7CiAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17JEZpZWxkfSApICkgewogICAgICAgICAgICBwdXNoIEBGaWVsZHMsICAgICAgJE1hcERCeyRGaWVsZH07CiAgICAgICAgICAgIHB1c2ggQFBsYWNlSG9sZGVyLCAnPyc7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsICAgICAgICBcJFBhcmFteyRGaWVsZH07CiAgICAgICAgfQogICAgfQogICAgcHVzaCBARmllbGRzLCAnY3JlYXRlX3RpbWUnOwoKICAgICRTUUwgLj0gam9pbiggJywgJywgQEZpZWxkcyApCiAgICAgICAgLiAnKSB2YWx1ZXMoJzsKCiAgICAkU1FMIC49IGpvaW4gJywgJywgQFBsYWNlSG9sZGVyOwoKICAgICRTUUwgLj0gJywgY3VycmVudF90aW1lc3RhbXApJzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJFRpY2tldElEICAgICAgPSAkQXJ0aWNsZU9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgKTsKCiAgICAjIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcnRpY2xlVHJhbnNtaXNzaW9uRXJyb3JDcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9IHx8IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQXJ0aWNsZUdldFRyYW5zbWlzc2lvbkVycm9yKCkKCkdldCB0aGUgVHJhbnNtaXNzaW9uIEVycm9yIGVudHJ5IGZvciBhIGdpdmVuIGFydGljbGUuCgogICAgbXkgJVRyYW5zbWlzc2lvbkVycm9yID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0VHJhbnNtaXNzaW9uRXJyb3IoCiAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywgICAjIFJlcXVpcmVkCiAgICApOwoKICAgIFJldHVybnM6CiAgICB7CiAgICAgICAgQXJ0aWNsZUlEICA9PiAxMjMsCiAgICAgICAgTWVzc2FnZUlEICA9PiA0NTYsCiAgICAgICAgTWVzc2FnZSAgICA9PiAnRGVzY3JpcHRpdmUgbWVzc2FnZSBvZiBsYXN0IGNvbW11bmljYXRpb24nLAogICAgICAgIENyZWF0ZVRpbWUgPT4gJzIwMTctMDEtMDEgMDE6MDI6MDMnLAogICAgICAgIFN0YXR1cyAgICAgPT4gJ0ZhaWxlZCcsCiAgICB9CiAgICBvciB1bmRlZiBpbiBjYXNlIG9mIGZhaWx1cmUgdG8gcmV0cml2ZSBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZS4KCj1jdXQKCnN1YiBBcnRpY2xlR2V0VHJhbnNtaXNzaW9uRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0FydGljbGVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEFydGljbGVJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmVwYXJlL2ZpbHRlciBBcnRpY2xlSUQKICAgICRQYXJhbXtBcnRpY2xlSUR9ID0gcXVvdGVtZXRhKCAkUGFyYW17QXJ0aWNsZUlEfSApOwogICAgJFBhcmFte0FydGljbGVJRH0gPX4gcy9cMC8vZzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgY2FuJ3Qgb3BlbiBhcnRpY2xlLCB0cnkgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGFydGljbGVfaWQsIG1lc3NhZ2VfaWQsIGxvZ19tZXNzYWdlLCBjcmVhdGVfdGltZSBGUk9NIGFydGljbGVfZGF0YV9taW1lX3NlbmRfZXJyb3IgV0hFUkUgYXJ0aWNsZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0FydGljbGVJRH0gXSwKICAgICk7CgogICAgbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpOwogICAgaWYgKEBSb3cpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnQXJ0aWNsZUlEJyAgPT4gJFJvd1swXSwKICAgICAgICAgICAgJ01lc3NhZ2VJRCcgID0+ICRSb3dbMV0sCiAgICAgICAgICAgICdNZXNzYWdlJyAgICA9PiAkUm93WzJdLAogICAgICAgICAgICAnQ3JlYXRlVGltZScgPT4gJFJvd1szXSwKICAgICAgICAgICAgJ1N0YXR1cycgICAgID0+ICdGYWlsZWQnLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQXJ0aWNsZVVwZGF0ZVRyYW5zbWlzc2lvbkVycm9yKCkKClVwZGF0ZXMgdGhlIFRyYW5zbWlzc2lvbiBFcnJvci4KCiAgICBteSAkUmVzdWx0ID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlVXBkYXRlVHJhbnNtaXNzaW9uRXJyb3IoCiAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlcXVpcmVkCiAgICAgICAgTWVzc2FnZUlEID0+IDQ1NiwgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsCiAgICAgICAgTWVzc2FnZSAgID0+ICdTaG9ydCBkZXNjcmlwdGl2ZSBtZXNzYWdlJywgICAjIE9wdGlvbmFsCiAgICApOwoKUmV0dXJucyAxIG9uIFN1Y2Nlc3MsIHVuZGVmIG9uIGZhaWx1cmUuCgo9Y3V0CgpzdWIgQXJ0aWNsZVVwZGF0ZVRyYW5zbWlzc2lvbkVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBBcnRpY2xlSUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBGaWVsZHNUb1VwZGF0ZTsKICAgIG15IEBCaW5kOwoKICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte01lc3NhZ2VJRH0gKSApIHsKICAgICAgICBwdXNoIEBGaWVsZHNUb1VwZGF0ZSwgJ21lc3NhZ2VfaWQgPSA/JzsKICAgICAgICBwdXNoIEBCaW5kLCAgICAgICAgICAgXCRQYXJhbXtNZXNzYWdlSUR9OwogICAgfQoKICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte01lc3NhZ2V9ICkgKSB7CiAgICAgICAgcHVzaCBARmllbGRzVG9VcGRhdGUsICdsb2dfbWVzc2FnZSA9ID8nOwogICAgICAgIHB1c2ggQEJpbmQsICAgICAgICAgICBcJFBhcmFte01lc3NhZ2V9OwogICAgfQoKICAgIHJldHVybiBpZiAhc2NhbGFyIEBCaW5kOwoKICAgIG15ICRTUUwgPSAnVVBEQVRFIGFydGljbGVfZGF0YV9taW1lX3NlbmRfZXJyb3IgU0VUICcKICAgICAgICAuIGpvaW4oICcsICcsIEBGaWVsZHNUb1VwZGF0ZSApCiAgICAgICAgLiAnIFdIRVJFIGFydGljbGVfaWQgPSA/JzsKCiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0FydGljbGVJRH07CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHVwZGF0ZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15ICRUaWNrZXRJRCAgICAgID0gJEFydGljbGVPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZVRyYW5zbWlzc2lvbkVycm9yVXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSB8fCAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Kernel/System/PostMaster/AddressPool.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjMgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyhJc0hhc2hSZWZXaXRoRGF0YSBJc0FycmF5UmVmV2l0aERhdGEpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBwYXJzZXIgb2JqZWN0CiAgICAkU2VsZi0+e1BhcnNlck9iamVjdH0gPSAkUGFyYW17UGFyc2VyT2JqZWN0fSB8fCAnJzsKCiAgICAjIEdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QuCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJFBhcmFte0NvbW11bmljYXRpb25Mb2dPYmplY3R9IHx8ICcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEZpbHRlclBvb2xzKCkKClJldHVybiBwb29scyBhZGRyZXNzZWQgaW4gdGhlIGFkZHJlc3MgbGlzdCBvZiBUbywgQ2MgLi4uCgogICAgbXkgQEFkZHJlc3NlZFBvb2xzID0gJEFkZHJlc3NQb29sT2JqZWN0LT5GaWx0ZXJQb29scygKICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBGaWx0ZXJQb29scyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1BhcnNlck9iamVjdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFBhcnNlck9iamVjdCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17UGFyYW1zfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBQYXJhbXMgYXMgaGFzaCByZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBoZWFkZXJzCiAgICBteSAlR2V0UGFyYW0gICAgICAgID0gJFBhcmFte1BhcmFtc30tPiUqOwogICAgbXkgJEVtYWlsSGVhZGVyICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w6OkVtYWlsSGVhZGVycycpOwogICAgbXkgQFByaW1hcnlIZWFkZXIgICA9IEB7ICRFbWFpbEhlYWRlci0+e1ByaW1hcnl9IHx8IFtdIH07CiAgICBteSBAU2Vjb25kYXJ5SGVhZGVyID0gQHsgJEVtYWlsSGVhZGVyLT57U2Vjb25kYXJ5fSB8fCBbXSB9OwoKICAgICMgY2hlY2sgcG9zc2libGUgYWRkcmVzcyBoZWFkZXJzCiAgICBteSAlUG9vbHNTZWVuOwogICAgbXkgQFBvb2xzOwogICAgSEVBREVSOgogICAgZm9yIG15ICRIZWFkZXIgKCBAUHJpbWFyeUhlYWRlciApIHsKCiAgICAgICAgbmV4dCBIRUFERVIgaWYgISRHZXRQYXJhbXskSGVhZGVyfTsKCiAgICAgICAgbXkgQEVtYWlscyA9ICRTZWxmLT57UGFyc2VyT2JqZWN0fS0+U3BsaXRBZGRyZXNzTGluZSggTGluZSA9PiAkR2V0UGFyYW17JEhlYWRlcn0gKTsKICAgICAgICBFTUFJTDoKICAgICAgICBmb3IgbXkgJEVtYWlsIChARW1haWxzKSB7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmICEkRW1haWw7CgogICAgICAgICAgICBteSAkQWRkcmVzcyA9ICRTZWxmLT57UGFyc2VyT2JqZWN0fS0+R2V0RW1haWxBZGRyZXNzKCBFbWFpbCA9PiAkRW1haWwgKTsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgISRBZGRyZXNzOwoKICAgICAgICAgICAgbXkgJEFkZHJlc3NQb29sID0gJFNlbGYtPlBvb2xMb29rdXAoCiAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmICEkQWRkcmVzc1Bvb2w7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmICRQb29sc1NlZW57ICRBZGRyZXNzUG9vbCB9Kys7CgogICAgICAgICAgICBwdXNoIEBQb29scywgJEFkZHJlc3NQb29sOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFBvb2xzIGlmIEBQb29sczsKCiAgICAjIGlmIG5vIHBvb2xzIGFyZSBhZGRyZXNzZWQgaW4gdGhlIGFib3ZlIHNldCBvZiBoZWFkZXJzLCBhbHNvIGxvb2sgZm9yIHNlY29uZGFyeSBvbmVzCiAgICBIRUFERVI6CiAgICBmb3IgbXkgJEhlYWRlciAoIEBTZWNvbmRhcnlIZWFkZXIgKSB7CgogICAgICAgIG5leHQgSEVBREVSIGlmICEkR2V0UGFyYW17JEhlYWRlcn07CgogICAgICAgIG15IEBFbWFpbHMgPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPlNwbGl0QWRkcmVzc0xpbmUoIExpbmUgPT4gJEdldFBhcmFteyRIZWFkZXJ9ICk7CiAgICAgICAgRU1BSUw6CiAgICAgICAgZm9yIG15ICRFbWFpbCAoQEVtYWlscykgewoKICAgICAgICAgICAgbmV4dCBFTUFJTCBpZiAhJEVtYWlsOwoKICAgICAgICAgICAgbXkgJEFkZHJlc3MgPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldEVtYWlsQWRkcmVzcyggRW1haWwgPT4gJEVtYWlsICk7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmICEkQWRkcmVzczsKCiAgICAgICAgICAgIG15ICRBZGRyZXNzUG9vbCA9ICRTZWxmLT5Qb29sTG9va3VwKAogICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkQWRkcmVzcwogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBFTUFJTCBpZiAhJEFkZHJlc3NQb29sOwoKICAgICAgICAgICAgbmV4dCBFTUFJTCBpZiAkUG9vbHNTZWVueyAkQWRkcmVzc1Bvb2wgfSsrOwoKICAgICAgICAgICAgcHVzaCBAUG9vbHMsICRBZGRyZXNzUG9vbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBQb29sczsKfQoKPWhlYWQyIEFkZHJlc3NMaXN0KCkKCkdldCBhbGwgYWRkcmVzc2VzIGRlZmluZWQgaW4gYWRkcmVzc3Bvb2xzCgogICAgbXkgJUFkZHJlc3NUb1Bvb2wgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPkFkZHJlc3NMaXN0KCk7CgpSZXR1cm46CgogICAgJUFkZHJlc3NUb1Bvb2wgPSAoCiAgICAgICAgICAgICAgJ3Rlc3QxQGV4YW1wbGUuY29tJyA9PiAnUG9vbDEnLAogICAgICAgICAgICAgICd0ZXN0MkBleGFtcGxlLmNvbScgPT4gJ1Bvb2wyJywKICAgICAgICAgICAgICAndGVzdDNAZXhhbXBsZS5jb20nID0+ICdQb29sMycsCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICkKCj1jdXQKCnN1YiBBZGRyZXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0FkZHJlc3NUb1Bvb2x9LT4lKiBpZiAkU2VsZi0+e0FkZHJlc3NUb1Bvb2x9OwoKICAgICRTZWxmLT57QWRkcmVzc1RvUG9vbH0gPSB7fTsKICAgIG15ICRQb29sQ29uZmlncyAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJyk7CgogICAgaWYgKCAhJFBvb2xDb25maWdzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gcG9vbHMgZGVmaW5lZCBpbiBQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbC4iLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAoKTsKICAgIH0KCiAgICBQT09MOgogICAgZm9yIG15ICRQb29sICgga2V5cyAkUG9vbENvbmZpZ3MtPiUqICkgewogICAgICAgIG5leHQgUE9PTCBpZiAhJFBvb2xDb25maWdzLT57ICRQb29sIH17RW1haWxzfTsKCiAgICAgICAgZm9yIG15ICRBZGRyZXNzICggJFBvb2xDb25maWdzLT57ICRQb29sIH17RW1haWxzfS0+QCogKSB7CiAgICAgICAgICAgICRTZWxmLT57QWRkcmVzc1RvUG9vbH17IGxjKCAkQWRkcmVzcyApIH0gPSAkUG9vbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57QWRkcmVzc1RvUG9vbH0tPiUqOwp9Cgo9aGVhZDIgUG9vbExvb2t1cCgpCgpHZXQgYWRkcmVzcyBwb29sIGJ5IGFkZHJlc3Mgb3IgdGlja2V0IGlkCgogICAgbXkgJFBvb2xOYW1lID0gJEFkZHJlc3NQb29sT2JqZWN0LT5OYW1lTG9va3VwKAogICAgICAgIEFkZHJlc3MgID0+ICd0ZXN0MUBleGFtcGxlLmNvbScsCiAgICApOwoKICAgIG15ICRQb29sTmFtZSA9ICRBZGRyZXNzUG9vbE9iamVjdC0+TmFtZUxvb2t1cCgKICAgICAgICBUaWNrZXRJRCA9PiA0LAogICAgKTsKClJldHVybjoKCiAgICAkUG9vbE5hbWUgPSAiUG9vbDEiCgo9Y3V0CgpzdWIgUG9vbExvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17QWRkcmVzc30gJiYgISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEFkZHJlc3Mgb3IgVGlja2V0SUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhZGRyZXNzIHBvb2wgbmFtZSBsaXN0CiAgICBteSAlQWRkcmVzc1RvUG9vbCA9ICRTZWxmLT5BZGRyZXNzTGlzdCgpOwoKICAgIHJldHVybiAkQWRkcmVzc1RvUG9vbHsgbGMoICRQYXJhbXtBZGRyZXNzfSApIH0gaWYgJFBhcmFte0FkZHJlc3N9OwoKICAgICMgZ2V0IG9iamVjdHMKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgdGlja2V0IHF1ZXVlIGlkCiAgICBteSAkUXVldWVJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFF1ZXVlSUQoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICk7CgogICAgIyBzZXQgYWRkcmVzcyBwb29sIG5hbWUKICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KAogICAgICAgIElEID0+ICRRdWV1ZUlELAogICAgKTsKCiAgICByZXR1cm4gaWYgISRRdWV1ZURhdGF7RW1haWx9OwoKICAgIHJldHVybiAkQWRkcmVzc1RvUG9vbHsgbGMoICRRdWV1ZURhdGF7RW1haWx9ICkgfTsKfQoKPWhlYWQyIFF1ZXVlQ2hlY2soKQoKQ2hlY2sgaWYgcXVldWUgZXhpc3RzIGluIGFkZHJlc3MgcG9vbAoKICAgIG15ICRRdWV1ZUV4aXN0ID0gJEFkZHJlc3NQb29sT2JqZWN0LT5RdWV1ZUNoZWNrKAogICAgICAgIFF1ZXVlICAgICAgID0+ICdKdW5rJywKICAgICAgICBBZGRyZXNzUG9vbCA9PiAnUG9vbDEnLAogICAgKTsKClJldHVybjoKCiAgICAkUXVldWVFeGlzdCA9IDEKCiAgICBPcgoKICAgICRRdWV1ZUV4aXN0ID0gMAoKPWN1dAoKc3ViIFF1ZXVlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFF1ZXVlIEFkZHJlc3NQb29sKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHF1ZXVlCiAgICBteSAlUXVldWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoCiAgICAgICAgTmFtZSA9PiAkUGFyYW17UXVldWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISVRdWV1ZTsKCiAgICBteSAkUG9vbCA9ICRTZWxmLT5Qb29sTG9va3VwKAogICAgICAgIEFkZHJlc3MgPT4gJFF1ZXVle0VtYWlsfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkUG9vbDsKICAgIHJldHVybiBpZiAkUG9vbCBuZSAkUGFyYW17QWRkcmVzc1Bvb2x9OwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRmluZExpbmtlZFRpY2tldCgpCgpGaW5kIGxpbmtlZCB0aWNrZXQgd2l0aCAnSW50ZXJkaXZpc2lvbmFsJyB0eXBlIGluIGFkZHJlc3MgcG9vbAoKICAgIG15ICggJExUVGlja2V0TnVtYmVyLCAkTFRUaWNrZXRJRCApID0gJEFkZHJlc3NQb29sT2JqZWN0LT5GaW5kTGlua2VkVGlja2V0KAogICAgICAgIFRpY2tldElEICAgID0+IDQsCiAgICAgICAgQWRkcmVzc1Bvb2wgPT4gJ1Bvb2wxJywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClJldHVybjoKCiAgICAoICRMVFRpY2tldE51bWJlciwgJExUVGlja2V0SUQgKSA9ICgiMjAyMzAxMjMzODAwMDA3NCIsIDUpCgo9Y3V0CgpzdWIgRmluZExpbmtlZFRpY2tldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgQWRkcmVzc1Bvb2wgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdAogICAgbXkgJExpbmtPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwoKICAgICMgZ2V0IGxpbmtlZCB0aWNrZXRzCiAgICBteSAlTGlua2VkVGlja2V0cyA9ICRMaW5rT2JqZWN0LT5MaW5rS2V5TGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdDEgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIE9iamVjdDIgPT4gJ1RpY2tldCcsCiAgICAgICAgU3RhdGUgICA9PiAnVmFsaWQnLAogICAgICAgIFR5cGUgICAgPT4gJ0ludGVyZGl2aXNpb25hbCcsCiAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgZm9yIG15ICRMaW5rZWRUaWNrZXQgKCBrZXlzICVMaW5rZWRUaWNrZXRzICkgewoKICAgICAgICAjIGdldCB0aWNrZXQgbnVtYmVyIC8gdGlja2V0IGlkCiAgICAgICAgbXkgJExUVGlja2V0SUQgICAgID0gJExpbmtlZFRpY2tldHN7ICRMaW5rZWRUaWNrZXQgfXtUaWNrZXRJRH07CiAgICAgICAgbXkgJExUVGlja2V0TnVtYmVyID0gJExpbmtlZFRpY2tldHN7ICRMaW5rZWRUaWNrZXQgfXtUaWNrZXROdW1iZXJ9OwoKICAgICAgICBteSAkTFRQb29sID0gJFNlbGYtPlBvb2xMb29rdXAoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRMVFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIGlmICggJExUUG9vbCAmJiAkTFRQb29sIGVxICRQYXJhbXtBZGRyZXNzUG9vbH0gKSB7CiAgICAgICAgICAgIHJldHVybiAoICRMVFRpY2tldE51bWJlciwgJExUVGlja2V0SUQgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgSW50ZXJkaXZpc2lvbmFsVGlja2V0TGlua0FkZCgpCgpBZGQgbGluayBmb3IgYWRkcmVzcyBwb29sIHRpY2tldHMgd2l0aCBuZXcgJ0ludGVyZGl2aXNpb25hbCcgdHlwZQoKICAgICRBZGRyZXNzUG9vbE9iamVjdC0+SW50ZXJkaXZpc2lvbmFsVGlja2V0TGlua0FkZCgKICAgICAgICBUaWNrZXRJRHMgPT4gWzEsIDUsIDhdLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbnRlcmRpdmlzaW9uYWxUaWNrZXRMaW5rQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRHMgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldElEc30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVGlja2V0SURzIGFzIGFycmF5IHJlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBUaWNrZXRJRHM7CiAgICBteSAlU2VlbjsKICAgIElEOgogICAgZm9yIG15ICRJRCAoICRQYXJhbXtUaWNrZXRJRHN9LT5AKiApIHsKICAgICAgICBuZXh0IElEIGlmICRTZWVueyAkSUQgfSsrOwoKICAgICAgICBwdXNoIEBUaWNrZXRJRHMsICRJRDsKICAgIH0KCiAgICBpZiAoIHNjYWxhcihAVGlja2V0SURzKSA8IDIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIGF0IGxlYXN0IDIgdGlja2V0IGlkcyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG9iamVjdAogICAgbXkgJExpbmtPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwoKICAgICMgbGluayB0aWNrZXRzCiAgICBmb3IgbXkgJFNvdXJjZSAoIDAgLi4gJCNUaWNrZXRJRHMgKSB7CgogICAgICAgIGZvciBteSAkVGFyZ2V0ICggJFNvdXJjZSArIDEgLi4gJCNUaWNrZXRJRHMgKSB7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRUaWNrZXRJRHNbJFNvdXJjZV0sCiAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRpY2tldElEc1skVGFyZ2V0XSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnSW50ZXJkaXZpc2lvbmFsJywKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCjE7Cg==</File>
        <File Location="Kernel/System/PostMaster/Filter/SkipViaMessageID.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjMgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlNraXBWaWFNZXNzYWdlSUQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTWFpbDo6QWRkcmVzczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBwYXJzZXIgb2JqZWN0CiAgICAkU2VsZi0+e1BhcnNlck9iamVjdH0gPSAkUGFyYW17UGFyc2VyT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBQYXJzZXJPYmplY3QhIjsKCiAgICAjIEdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QuCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJFBhcmFte0NvbW11bmljYXRpb25Mb2dPYmplY3R9IHx8IGRpZSAiR290IG5vIENvbW11bmljYXRpb25Mb2dPYmplY3QhIjsKCiAgICAjIEdldCBBcnRpY2xlIGJhY2tlbmQgb2JqZWN0LgogICAgJFNlbGYtPntBcnRpY2xlQmFja2VuZE9iamVjdH0gPQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdFbWFpbCcgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0FkZENvbW11bmljYXRpb25Mb2coIE1lc3NhZ2UgPT4gJ1NlYXJjaGluZyBmb3IgaGVhZGVyIE1lc3NhZ2UtSUQuJyApOwoKICAgIG15ICRNZXNzYWdlSUQgPSAkUGFyYW17R2V0UGFyYW19LT57J01lc3NhZ2UtSUQnfTsKCiAgICByZXR1cm4gMSBpZiAhJE1lc3NhZ2VJRDsKCiAgICAkU2VsZi0+X0FkZENvbW11bmljYXRpb25Mb2coCiAgICAgICAgTWVzc2FnZSA9PiBzcHJpbnRmKAogICAgICAgICAgICAnU2VhcmNoaW5nIGZvciBhcnRpY2xlIHdpdGggbWVzc2FnZSBpZCAiJXMiLicsCiAgICAgICAgICAgICRNZXNzYWdlSUQsCiAgICAgICAgKSwKICAgICk7CgogICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e0FydGljbGVCYWNrZW5kT2JqZWN0fS0+QXJ0aWNsZUdldEJ5TWVzc2FnZUlEKAogICAgICAgIE1lc3NhZ2VJRCA9PiAkTWVzc2FnZUlELAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAhJUFydGljbGU7CgogICAgaWYgKCAhJEFydGljbGV7QW1iaWd1b3VzVGlja2V0SURzfSApIHsKICAgICAgICBteSAoICRTZW5kZXJFbWFpbCApID0gTWFpbDo6QWRkcmVzcy0+cGFyc2UoICRBcnRpY2xle0Zyb219ICk7CgogICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICBBZGRyZXNzID0+ICRTZW5kZXJFbWFpbC0+YWRkcmVzcygpLAogICAgICAgICk7CgogICAgICAgICMgaWYgd2UgYXJlIHJlYWRpbmcgYSBtZXNzYWdlIHNlbnQgdmlhIG91ciBPVE9CTyBpdHNlbGYgZm9yIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgaWYgKCAkSXNMb2NhbCApIHsKICAgICAgICAgICAgJFNlbGYtPl9BZGRDb21tdW5pY2F0aW9uTG9nKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICdFbWFpbCB3aXRoIG1lc3NhZ2UgaWQgIiVzIiB3YXMgc2VudCBhcyBuZXcgYXJ0aWNsZSBmcm9tIGEgbG9jYWwgYWRkcmVzcy4nLAogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlSUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtKb2JDb25maWd9IHx8ICEkUGFyYW17Sm9iQ29uZmlnfXtBbGxvd011bHRpUGFyc2V9ICkgewogICAgICAgICRTZWxmLT5fQWRkQ29tbXVuaWNhdGlvbkxvZygKICAgICAgICAgICAgTWVzc2FnZSA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgJ0FydGljbGUgd2l0aCBtZXNzYWdlIGlkICIlcyIgYWxyZWFkeSBleGlzdHMsIHNldHRpbmcgWC1PVE9CTy1JZ25vcmUuJywKICAgICAgICAgICAgICAgICRNZXNzYWdlSUQsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17R2V0UGFyYW19eydYLU9UT0JPLUlnbm9yZSd9ID0gJ3llcyc7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRNdWx0aVBhcnNlID0gJFBhcmFte0pvYkNvbmZpZ317QWxsb3dNdWx0aVBhcnNlfXtBbHdheXN9ID8gMSA6IDA7CgogICAgaWYgKCAhJE11bHRpUGFyc2UgJiYgJFBhcmFte0pvYkNvbmZpZ317QWxsb3dNdWx0aVBhcnNlfXtNYWlsQWNjb3VudFF1ZXVlfSAmJiAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJFNlbGYtPl9BZGRDb21tdW5pY2F0aW9uTG9nKAogICAgICAgICAgICBNZXNzYWdlID0+IHNwcmludGYoCiAgICAgICAgICAgICAgICAnQXJ0aWNsZSB3aXRoIG1lc3NhZ2UgaWQgIiVzIiBhbHJlYWR5IGV4aXN0cywgcGFyc2UgYWdhaW4gYXMgZXhwbGljaXQgUXVldWVJRCBpcyBwcm92aWRlZC4nLAogICAgICAgICAgICAgICAgJE1lc3NhZ2VJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICAkTXVsdGlQYXJzZSA9IDE7CiAgICB9CgogICAgaWYgKCAhJE11bHRpUGFyc2UgJiYgJFBhcmFte0pvYkNvbmZpZ317QWxsb3dNdWx0aVBhcnNlfXtCb3VuY2VkRW1haWx9ICYmICRQYXJhbXtHZXRQYXJhbX17J1Jlc2VudC1Ubyd9ICkgewogICAgICAgICRTZWxmLT5fQWRkQ29tbXVuaWNhdGlvbkxvZygKICAgICAgICAgICAgTWVzc2FnZSA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgJ0FydGljbGUgd2l0aCBtZXNzYWdlIGlkICIlcyIgYWxyZWFkeSBleGlzdHMsIHBhcnNlIGFnYWluIGFzIGVtYWlsIHdhcyBib3VuY2VkLicsCiAgICAgICAgICAgICAgICAkTWVzc2FnZUlELAogICAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgICRNdWx0aVBhcnNlID0gMTsKICAgIH0KCiAgICBpZiAoICEkTXVsdGlQYXJzZSApIHsKICAgICAgICAkU2VsZi0+X0FkZENvbW11bmljYXRpb25Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICdBcnRpY2xlIHdpdGggbWVzc2FnZSBpZCAiJXMiIGFscmVhZHkgZXhpc3RzLCBzZXR0aW5nIFgtT1RPQk8tSWdub3JlLicsCiAgICAgICAgICAgICAgICAkTWVzc2FnZUlELAogICAgICAgICAgICApLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXsnWC1PVE9CTy1JZ25vcmUnfSA9ICd5ZXMnOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkQWRkcmVzc1Bvb2xPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKTsKICAgIFRJQ0tFVElEOgogICAgZm9yIG15ICRUaWNrZXRJRCAoICRBcnRpY2xle0FtYmlndW91c1RpY2tldElEc30tPkAqICkgewogICAgICAgIG15ICRQb29sID0gJEFkZHJlc3NQb29sT2JqZWN0LT5Qb29sTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAhJFBvb2w7CgogICAgICAgICRQYXJhbXtHZXRQYXJhbX17SWdub3JlQWRkcmVzc1Bvb2xzfXsgJFBvb2wgfSA9ICRUaWNrZXRJRDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BZGRDb21tdW5pY2F0aW9uTG9nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgIFByaW9yaXR5ICAgICAgPT4gJFBhcmFte1ByaW9yaXR5fSB8fCAnRGVidWcnLAogICAgICAgIEtleSAgICAgICAgICAgPT4gcmVmKCRTZWxmKSwKICAgICAgICBWYWx1ZSAgICAgICAgID0+ICRQYXJhbXtNZXNzYWdlfSwKICAgICk7CgogICAgcmV0dXJuOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AgentTicketBounce.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRCb3VuY2UucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0Qm91bmNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgTWFpbDo6QWRkcmVzczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgYXJ0aWNsZSBJRAogICAgJFNlbGYtPntBcnRpY2xlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FydGljbGVJRCcgKSB8fCAnJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXJ0aWNsZUlEIFRpY2tldElEIFF1ZXVlSUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGlzIG5lZWRlZCEnLCAkTmVlZGVkICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJVRpY2tldCAgICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDb25maWcgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJUFjbEFjdGlvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICggJEFDTCB8fCBJc0hhc2hSZWZXaXRoRGF0YSggXCVBY2xBY3Rpb24gKSApIHsKCiAgICAgICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKCiAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICAgICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbG9jayBzdGF0ZSAmJiB3cml0ZSAobG9jaykgcGVybWlzc2lvbnMKICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKCiAgICAgICAgICAgIG15ICRMb2NrID0gJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJExvY2spIHsKCiAgICAgICAgICAgICAgICAjIFNldCBuZXcgb3duZXIgaWYgdGlja2V0IG93bmVyIGlzIGRpZmZlcmVudCB0aGVuIGxvZ2dlZCB1c2VyLgogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0e093bmVySUR9ICE9ICRTZWxmLT57VXNlcklEfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBSZW1lbWJlciBwcmV2aW91cyBvd25lciwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc3RvcmUgdGlja2V0IG93bmVyIG9uIHVuZG8gYWN0aW9uLgogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXNMb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e051bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIHRpY2tldCBvd25lciB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2hvdyBzY3JlZW4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgcGxhaW4gYXJ0aWNsZSBleGlzdHMKICAgICAgICBpZiAoICEkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVQbGFpbiggQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSApICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnUGxhaW4gYXJ0aWNsZSBub3QgZm91bmQgZm9yIGFydGljbGUgJXMhJywKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0FydGljbGVJRH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhcnRpY2xlIGRhdGEKICAgICAgICBteSAlQXJ0aWNsZSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIGFydGljbGUgaXMgZnJvbSB0aGUgc2FtZSBUaWNrZXRJRCBhcyB3ZSBjaGVja2VkIHBlcm1pc3Npb25zIGZvci4KICAgICAgICBpZiAoICRBcnRpY2xle1RpY2tldElEfSBuZSAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0FydGljbGUgZG9lcyBub3QgYmVsb25nIHRvIHRpY2tldCAlcyEnLAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0SUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVwYXJlIHRvIChSZXBseVRvISkgLi4uCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtSZXBseVRvfSApIHsKICAgICAgICAgICAgJEFydGljbGV7VG99ID0gJEFydGljbGV7UmVwbHlUb307CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZXtUb30gPSAkQXJ0aWNsZXtGcm9tfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGdlbmVyYXRvciBvYmplY3QKICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InID0+IHsgJXskU2VsZn0gfQogICAgICAgICk7CiAgICAgICAgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICMgcHJlcGFyZSBzYWx1dGF0aW9uCiAgICAgICAgJFBhcmFte1NhbHV0YXRpb259ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TYWx1dGF0aW9uKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIERhdGEgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBzaWduYXR1cmUKICAgICAgICAkUGFyYW17U2lnbmF0dXJlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIERhdGEgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBib3VuY2UgdGV4dAogICAgICAgICRQYXJhbXtCb3VuY2VUZXh0fSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Qm91bmNlVGV4dCcpIHx8ICcnOwoKICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjIHByZXBhcmUgYm91bmNlIHRhZ3MKICAgICAgICAgICAgJFBhcmFte0JvdW5jZVRleHR9ID1+IHMvPE9UT0JPX1RJQ0tFVD4vJmx0O09UT0JPX1RJQ0tFVCZndDsvZzsKICAgICAgICAgICAgJFBhcmFte0JvdW5jZVRleHR9ID1+IHMvPE9UT0JPX0JPVU5DRV9UTz4vJmx0O09UT0JPX0JPVU5DRV9UTyZndDsvZzsKCiAgICAgICAgICAgICRQYXJhbXtCb3VuY2VUZXh0fSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtCb3VuY2VUZXh0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSW5mb3JtYXRpb25Gb3JtYXQKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkUGFyYW17SW5mb3JtYXRpb25Gb3JtYXR9ID0gIiRQYXJhbXtTYWx1dGF0aW9ufTxici8+Cjxici8+CiRQYXJhbXtCb3VuY2VUZXh0fTxici8+Cjxici8+CiRQYXJhbXtTaWduYXR1cmV9IjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtJbmZvcm1hdGlvbkZvcm1hdH0gPSAiJFBhcmFte1NhbHV0YXRpb259CgokUGFyYW17Qm91bmNlVGV4dH0KCiRQYXJhbXtTaWduYXR1cmV9IjsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBzZW5kZXIgb2YgYm91bmNlIGVtYWlsCiAgICAgICAgbXkgJUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0U3lzdGVtQWRkcmVzcygKICAgICAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7RnJvbX0gPSAiJEFkZHJlc3N7UmVhbE5hbWV9IDwkQWRkcmVzc3tFbWFpbH0+IjsKCiAgICAgICAgIyBnZXQgbmV4dCBzdGF0ZXMKICAgICAgICBteSAlTmV4dFN0YXRlcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgaWYgKCAhJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICROZXh0U3RhdGVzeycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlTmV4dFN0YXRlcywKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnQm91bmNlU3RhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0sCiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmludCBmb3JtIC4uLgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Qm91bmNlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBib3VuY2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhCb3VuY2VUbyBUbyBTdWJqZWN0IEJvZHkgSW5mb3JtU2VuZGVyIEJvdW5jZVN0YXRlSUQpKSB7CiAgICAgICAgICAgICRQYXJhbXskUGFyYW1ldGVyfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIE1ha2Ugc3VyZSBzZW5kZXIgaXMgY29ycmVjdCBvbmUuCiAgICAgICAgJFBhcmFte0Zyb219ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPlNlbmRlcigKICAgICAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgY2hlY2sgZm9yd2FyZCBlbWFpbCBhZGRyZXNzCiAgICAgICAgaWYgKCAhJFBhcmFte0JvdW5jZVRvfSApIHsKICAgICAgICAgICAgJEVycm9yeydCb3VuY2VUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdCb3VuY2VUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgICAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICRQYXJhbXtCb3VuY2VUb30gKSApIHsKICAgICAgICAgICAgbXkgJEFkZHJlc3MgPSAkRW1haWwtPmFkZHJlc3MoKTsKCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICAgICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcyggQWRkcmVzcyA9PiAkQWRkcmVzcyApICkKICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICBBZGRyZXNzICA9PiAkQWRkcmVzcywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJElzTG9jYWwpCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0JvdW5jZVRvQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnICk7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0JvdW5jZVRvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIGVsc2lmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEFkZHJlc3MgKSApIHsKICAgICAgICAgICAgICAgIG15ICRCb3VuY2VUb0Vycm9yTXNnID0KICAgICAgICAgICAgICAgICAgICAnQm91bmNlVG8nCiAgICAgICAgICAgICAgICAgICAgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJEJvdW5jZVRvRXJyb3JNc2cgKTsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm91bmNlVG9JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtJbmZvcm1TZW5kZXJ9ICkgewogICAgICAgICAgICBpZiAoICEkUGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnVG9DdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZycgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MoZXMpCiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICRQYXJhbXtUb30gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUb0Vycm9yTXNnID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAkVG9FcnJvck1zZyApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdEludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydCb2R5SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgI2NoZWNrIGZvciBlcnJvcgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2V0IG5leHQgc3RhdGVzCiAgICAgICAgICAgIG15ICVOZXh0U3RhdGVzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgICAgICBpZiAoICEkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICROZXh0U3RhdGVzeycnfSA9ICctJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0JvdW5jZVN0YXRlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Qm91bmNlU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcHJlcGFyZSBib3VuY2UgdGFncyBpZiBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgcHJlcGFyZSBib3VuY2UgdGFncwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvJmx0O09UT0JPX1RJQ0tFVCZndDsvJmFtcDtsdDtPVE9CT19USUNLRVQmYW1wO2d0Oy9naTsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzLyZsdDtPVE9CT19CT1VOQ0VfVE8mZ3Q7LyZhbXA7bHQ7T1RPQk9fQk9VTkNFX1RPJmFtcDtndDsvZ2k7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtJbmZvcm1hdGlvbkZvcm1hdH0gICA9ICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgJFBhcmFte0luZm9ybVNlbmRlckNoZWNrZWR9ID0gJFBhcmFte0luZm9ybVNlbmRlcn0gPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJyc7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Qm91bmNlJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEJvdW5jZSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUJvdW5jZSgKICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUbyAgICAgICAgICA9PiAkUGFyYW17Qm91bmNlVG99LAogICAgICAgICAgICBGcm9tICAgICAgICA9PiAkUGFyYW17RnJvbX0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICdCb3VuY2UnLAogICAgICAgICk7CgogICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgIGlmICggISRCb3VuY2UgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3QgYm91bmNlIGVtYWlsIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZW5kIGN1c3RvbWVyIGluZm8/CiAgICAgICAgaWYgKCAkUGFyYW17SW5mb3JtU2VuZGVyfSApIHsKCiAgICAgICAgICAgICMgc2V0IG1pbWUgdHlwZQogICAgICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVwbGFjZSBwbGFjZWhvbGRlcnMKICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvKCZsdDt8PClPVE9CT19USUNLRVQoJmd0O3w+KS8kVGlja2V0e1RpY2tldE51bWJlcn0vZzsKICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvKCZsdDt8PClPVE9CT19CT1VOQ0VfVE8oJmd0O3w+KS8kUGFyYW17Qm91bmNlVG99L2c7CgogICAgICAgICAgICAjIHNlbmQKICAgICAgICAgICAgbXkgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVNlbmQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJ0JvdW5jZScsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiQm91bmNlZCBpbmZvIHRvICckUGFyYW17VG99Jy4iLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Zyb219LAogICAgICAgICAgICAgICAgRW1haWwgICAgICAgICAgICAgICAgPT4gJFBhcmFte0VtYWlsfSwKICAgICAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUb30sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkUGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkUGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NhblwndCBzZW5kIGVtYWlsIScpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBjaG9zZW4gYm91bmNlIHN0YXRlIGlkCiAgICAgICAgaWYgKCAkUGFyYW17Qm91bmNlU3RhdGVJRH0gKSB7CgogICAgICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJFBhcmFte0JvdW5jZVN0YXRlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgPT4gJFBhcmFte0JvdW5jZVN0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdWxkIGkgc2V0IGFuIHVubG9jaz8KICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pCiAgICAgICAgICAgICAgICAmJiAhJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpSZWRpcmVjdEFmdGVyQ2xvc2VEaXNhYmxlZCcpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSB8fCAnQWN0aW9uPUFnZW50RGFzaGJvYXJkJyApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRTZWxmLT57VGlja2V0SUR9O0FydGljbGVJRD0kU2VsZi0+e0FydGljbGVJRH0iLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1dyb25nIFN1YmFjdGlvbiEnKSwKICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICApOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AgentTicketCompose.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRDb21wb3NlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldENvbXBvc2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBNYWlsOjpBZGRyZXNzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIFRyeSB0byBsb2FkIGRyYWZ0IGlmIHJlcXVlc3RlZC4KICAgIGlmICgKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpLT57Rm9ybURyYWZ0fQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2FkRm9ybURyYWZ0JyApCiAgICAgICAgJiYgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5Mb2FkRm9ybURyYWZ0KAogICAgICAgICAgICBGb3JtRHJhZnRJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybURyYWZ0SUQnICksCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFRpY2tldElEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdFbWFpbCcgKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICMgY2hlY2sgaWYgQUNMIHJlc3RyaWN0aW9ucyBleGlzdAogICAgaWYgKCAkQUNMIHx8IElzSGFzaFJlZldpdGhEYXRhKCBcJUFjbEFjdGlvbiApICkgewoKICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuIGlmIEFDTCBwcm9oaWJpdHMgdGhpcyBhY3Rpb24KICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICAjIENoZWNrIGZvciBmYWlsZWQgZHJhZnQgbG9hZGluZyByZXF1ZXN0LgogICAgaWYgKAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2FkRm9ybURyYWZ0JyApCiAgICAgICAgJiYgISRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0xvYWRpbmcgZHJhZnQgZmFpbGVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIG15ICRUaWNrZXRCYWNrVHlwZSA9ICdUaWNrZXRCYWNrJzsKICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKCiAgICAgICAgICAgIG15ICRMb2NrID0gJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNldCBuZXcgb3duZXIgaWYgdGlja2V0IG93bmVyIGlzIGRpZmZlcmVudCB0aGVuIGxvZ2dlZCB1c2VyLgogICAgICAgICAgICBpZiAoICRMb2NrICYmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSApIHsKCiAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHByZXZpb3VzIG93bmVyLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVzdG9yZSB0aWNrZXQgb3duZXIgb24gdW5kbyBhY3Rpb24uCiAgICAgICAgICAgICAgICAkVGlja2V0e1ByZXZpb3VzT3duZXJ9ID0gJFRpY2tldHtPd25lcklEfTsKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2hvdyBsb2NrIHN0YXRlLgogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFRpY2tldEJhY2tUeXBlIC49ICdVbmRvJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSB0aWNrZXQgb3duZXIgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICAgICAgVG8gQ2MgQmNjIFN1YmplY3QgQm9keSBJblJlcGx5VG8gUmVmZXJlbmNlcyBSZXNwb25zZUlEIFJlcGx5QXJ0aWNsZUlEIFN0YXRlSUQgQXJ0aWNsZUlECiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudCBJc1Zpc2libGVGb3JDdXN0b21lciBUaW1lVW5pdHMgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgRm9ybUlEIFJlcGx5QWxsCiAgICAgICAgICAgIEZvcm1EcmFmdElEIFRpdGxlCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KCiAgICAjIE1ha2Ugc3VyZSBzZW5kZXIgaXMgY29ycmVjdCBvbmUuIFNlZSBidWcjMTQ4NzIgKCBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTE0ODcyICkuCiAgICAkR2V0UGFyYW17RnJvbX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKS0+U2VuZGVyKAogICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBoYXNoIGZvciBjaGVjayBkdXBsaWNhdGVkIGVudHJpZXMKICAgIG15ICVBZGRyZXNzZXNMaXN0OwoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyOwogICAgbXkgJEN1c3RvbWVyc051bWJlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyU2VsZWN0ZWQnICkgICAgICAgICAgICAgICAgfHwgJyc7CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXIpIHsKCiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXIgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnQpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50KSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eCAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZSBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZSA9ICRDb3VudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJDYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJDYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudENjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWVDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50Q2MpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDY30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSA9ICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQ2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnRDYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSAmJiAkQ3VzdG9tZXJFcnJvckNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQ2MgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICRDb3VudEF1eENjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWVDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUNjID0gJENvdW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJDYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4Q2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQ2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0NjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQ2MsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJCY2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlckJjYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudEJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlCY2MgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50QmNjKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QmNjfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQmNjICAgID0gJyc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudEJjYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSAmJiAkQ3VzdG9tZXJFcnJvckJjYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQmNjID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWVCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWVCY2MgPSAkQ291bnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckJjYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQmNjLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEeW5hbWljIGZpZWxkcyBmb3JtIFBhcmFtT2JqZWN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgICMgZ2V0IGJhY2tlbmQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkSXRlbSAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkSXRlbTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRJdGVtIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBzZW5kIGVtYWlsCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VuZEVtYWlsJyB8fCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgIGlmICggISRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB2YWxpZCBzdGF0ZSBpZAogICAgICAgIGlmICggISRHZXRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte1N0YXRlSUR9ID0gJFRpY2tldHtTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgIG15ICVTdGF0ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtTdGF0ZUlEfSApOwoKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICAgICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAgICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgICAgIExJTkU6CiAgICAgICAgZm9yIG15ICRMaW5lIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgICAgIG5leHQgTElORSBpZiAhJEdldFBhcmFteyRMaW5lfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkR2V0UGFyYW17JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdFcnJvclR5cGUnIH0gPSAkTGluZSAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkSXNMb2NhbCkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFcnJvcntUb0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRXJyb3J7Q2NJc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEVycm9ye0JjY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIEdldCBhbmQgdmFsaWRhdGUgZHJhZnQgYWN0aW9uLgogICAgICAgIG15ICRGb3JtRHJhZnRBY3Rpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybURyYWZ0QWN0aW9uJyApOwogICAgICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiAmJiAhJENvbmZpZy0+e0Zvcm1EcmFmdH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdGb3JtRHJhZnQgZnVuY3Rpb25hbGl0eSBkaXNhYmxlZCEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVGb3JtRHJhZnRSZXNwb25zZTsKCiAgICAgICAgIyBDaGVjayBkcmFmdCBuYW1lLgogICAgICAgIGlmICgKICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbgogICAgICAgICAgICAmJiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgfHwgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRUaXRsZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRUaXRsZScgKTsKCiAgICAgICAgICAgICMgQSBkcmFmdCBuYW1lIGlzIHJlcXVpcmVkLgogICAgICAgICAgICBpZiAoICEkVGl0bGUgKSB7CgogICAgICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgiRHJhZnQgbmFtZSBpcyByZXF1aXJlZCEiKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hvc2VuIGRyYWZ0IG5hbWUgbXVzdCBiZSB1bmlxdWUuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJEZvcm1EcmFmdExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdExpc3RHZXQoCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIERSQUZUOgogICAgICAgICAgICAgICAgZm9yIG15ICRGb3JtRHJhZnQgKCBAeyRGb3JtRHJhZnRMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBObyBleGlzdGluZyBkcmFmdCB3aXRoIHNhbWUgbmFtZS4KICAgICAgICAgICAgICAgICAgICBuZXh0IERSQUZUIGlmICRUaXRsZSBuZSAkRm9ybURyYWZ0LT57VGl0bGV9OwoKICAgICAgICAgICAgICAgICAgICAjIFNhbWUgbmFtZSBmb3IgdXBkYXRlIG9uIGV4aXN0aW5nIGRyYWZ0LgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRm9ybURyYWZ0QWN0aW9uIGVxICdVcGRhdGUnCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gZXEgJEZvcm1EcmFmdC0+e0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IERSQUZUOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBBbm90aGVyIGRyYWZ0IHdpdGggdGhlIGNob3NlbiBuYW1lIGFscmVhZHkgZXhpc3RzLgogICAgICAgICAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSggIkZvcm1EcmFmdCBuYW1lICVzIGlzIGFscmVhZHkgaW4gdXNlISIsICRUaXRsZSApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBEUkFGVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBQZXJmb3JtIGRyYWZ0IGFjdGlvbiBpbnN0ZWFkIG9mIHNhdmluZyBmb3JtIGRhdGEgaW4gdGlja2V0L2FydGljbGUuCiAgICAgICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uICYmICElRm9ybURyYWZ0UmVzcG9uc2UgKSB7CgogICAgICAgICAgICAjIFJlc2V0IEZvcm1EcmFmdElEIHRvIHByZXZlbnQgdXBkYXRpbmcgZXhpc3RpbmcgZHJhZnQuCiAgICAgICAgICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT57UXVlcnl9LT5wYXJhbSgKICAgICAgICAgICAgICAgICAgICAtbmFtZSAgPT4gJ0Zvcm1EcmFmdElEJywKICAgICAgICAgICAgICAgICAgICAtdmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRm9ybURyYWZ0QWN0aW9uT2s7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcKICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRQYXJhbU9iamVjdC0+U2F2ZUZvcm1EcmFmdCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnRGVsZXRlJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbk9rID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJEZvcm1EcmFmdEFjdGlvbk9rKSB7CiAgICAgICAgICAgICAgICAkRm9ybURyYWZ0UmVzcG9uc2V7U3VjY2Vzc30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAnQ291bGQgbm90IHBlcmZvcm0gcmVxdWVzdGVkIGRyYWZ0IGFjdGlvbiEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVGb3JtRHJhZnRSZXNwb25zZSkgewoKICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlRm9ybURyYWZ0UmVzcG9uc2UsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGVuZGluZyBkYXRlCiAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICMgY29udmVydCBwZW5kaW5nIGRhdGUgdG8gYSBkYXRldGltZSBvYmplY3QKICAgICAgICAgICAgbXkgJFBlbmRpbmdEYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIGVwb2NoCiAgICAgICAgICAgIG15ICRDdXJTeXN0ZW1EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKCAhJFBlbmRpbmdEYXRlVGltZU9iamVjdCB8fCAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IDwgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9ye0RhdGVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIHJlY2lwaWVudCBoYXMgYmVlbiBjaG9zZW4KICAgICAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgc29tZSB2YWx1ZXMKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISRHZXRQYXJhbXskTGluZX07CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFteyRMaW5lfSApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEVycm9ye1N1YmplY3RJbnZhbGlkfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAkRXJyb3J7Qm9keUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRpbWUgdW5pdHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9ye1RpbWVVbml0c0ludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAgICAgbXkgJFRuID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUbiwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSB8fCAnJywKICAgICAgICApOwoKICAgICAgICBteSAlQXJ0aWNsZVBhcmFtOwoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9ICk7CgogICAgICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0b3JlTmV3ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgb3B0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgIyBhbmQgYWRkIHRoZW0gYmFjayB0byB0aGUgc2VsZWN0aW9uIHNvIHRoYXQgdGhlIHN1Ym1pdAogICAgICAgICAgICAgICAgIyB3aWxsIGNvbnRhaW4gb3B0aW9ucyB0aGF0IHdlcmUgaGlkZGVuIGZyb20gdGhlIGFnZW50CiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRPcHRpb25zVG9SZW1vdmVBSkFYJykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQFJlbW92ZWRPcHRpb25zID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwogICAgICAgICAgICAgICAgICAgIGlmIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRNdWx0aXBsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdmVkT3B0aW9uIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRHZXRQYXJhbXskS2V5fSB9LCAkUmVtb3ZlZE9wdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9IHNoaWZ0IEBSZW1vdmVkT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sICVBcnRpY2xlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgICAgICVFcnJvciA9ICgKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGRIVE1MOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICB8fCAnJywKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgICAgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntFcnJvck1lc3NhZ2V9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2F2ZSBmb3JtIGlmIGEgZHJhZnQgd2FzIGxvYWRlZC4KICAgICAgICAgICAgJUVycm9yID0gKCBMb2FkZWRGb3JtRHJhZnQgPT4gMSApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvcgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgV2hlbiBhIGRyYWZ0IGlzIGxvYWRlZCwgaW5mb3JtIGEgdXNlciB0aGF0IGFydGljbGUgc3ViamVjdCB3aWxsIGJlIGVtcHR5CiAgICAgICAgICAgICMgaWYgY29udGFpbnMgb25seSB0aGUgdGlja2V0IGhvb2sgKGlmIG5vdGhpbmcgaXMgbW9kaWZpZWQpLgogICAgICAgICAgICBpZiAoICRFcnJvcntMb2FkZWRGb3JtRHJhZnR9ICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdBcnRpY2xlIHN1YmplY3Qgd2lsbCBiZSBlbXB0eSBpZiB0aGUgc3ViamVjdCBjb250YWlucyBvbmx5IHRoZSB0aWNrZXQgaG9vayEnCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlfSA9ICRHZXRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFJlc3BvbnNlRm9ybWF0ICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17Qm9keX0gKSwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0QmFja1R5cGUgICAgICA9PiAkVGlja2V0QmFja1R5cGUsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSA8T1RPQk9fVElDS0VUX1NUQVRFPiB3aXRoIG5leHQgdGlja2V0IHN0YXRlIG5hbWUKICAgICAgICBpZiAoICRTdGF0ZURhdGF7TmFtZX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLzxPVE9CT19USUNLRVRfU1RBVEU+LyRTdGF0ZURhdGF7TmFtZX0vZzsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvJmx0O09UT0JPX1RJQ0tFVF9TVEFURSZndDsvJFN0YXRlRGF0YXtOYW1lfS9nOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZWNpcGllbnRzCiAgICAgICAgbXkgJFJlY2lwaWVudHMgPSAnJzsKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewoKICAgICAgICAgICAgbmV4dCBMSU5FIGlmICEkR2V0UGFyYW17JExpbmV9OwoKICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAnLCAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICRHZXRQYXJhbXskTGluZX07CiAgICAgICAgfQoKICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgaWYgKCAkQ29udGVudElEICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICAgICAjIElGIHRoZSBpbWFnZSBpcyByZWZlcmVuY2VkIGluIHRoZSBib2R5IHNldCBpdCBhcyBpbmxpbmUuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gPX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gPSAnaW5saW5lJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5LgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBBdHRhY2htZW50RGF0YSA9IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgICMgdmVyaWZ5IEhUTUwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgICAgIGlmICggJEdldFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudH0gKSB7CiAgICAgICAgICAgICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRHZXRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0gPyAxIDogMDsKICAgICAgICB9CgogICAgICAgICMgR2V0IGF0dHJpYnV0ZXMgbGlrZSBzZW5kZXIgYWRkcmVzcwogICAgICAgIG15ICVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPkF0dHJpYnV0ZXMoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBEYXRhICAgICA9PiB7fSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2VuZCBlbWFpbAogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnU2VuZEFuc3dlcicsCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICJcJVwlJFJlY2lwaWVudHMiLAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkRGF0YXtGcm9tfSwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgQ2MgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NjfSwKICAgICAgICAgICAgQmNjICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JjY30sCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIEluUmVwbHlUbyAgICAgICAgICAgID0+ICRHZXRQYXJhbXtJblJlcGx5VG99LAogICAgICAgICAgICBSZWZlcmVuY2VzICAgICAgICAgICA9PiAkR2V0UGFyYW17UmVmZXJlbmNlc30sCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgQXR0YWNobWVudCAgICAgICAgICAgPT4gXEBBdHRhY2htZW50RGF0YSwKICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBzZXQgdGhlIG9iamVjdCBJRCAoVGlja2V0SUQgb3IgQXJ0aWNsZUlEKSBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIGNvbmZpZ3JhdGlvbgogICAgICAgICAgICBteSAkT2JqZWN0SUQgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnID8gJEFydGljbGVJRCA6ICRTZWxmLT57VGlja2V0SUR9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIFN0YXRlSUQgICA9PiAkR2V0UGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG91bGQgSSBzZXQgYW4gdW5sb2NrPwogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBZZWFyICAgICA9PiAkR2V0UGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCAgICA9PiAkR2V0UGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJEdldFBhcmFte0RheX0sCiAgICAgICAgICAgICAgICBIb3VyICAgICA9PiAkR2V0UGFyYW17SG91cn0sCiAgICAgICAgICAgICAgICBNaW51dGUgICA9PiAkR2V0UGFyYW17TWludXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbG9nIHVzZSByZXNwb25zZSBpZCBhbmQgcmVwbHkgYXJ0aWNsZSBpZCAodXNlZnVsIGZvciByZXNwb25zZSBkaWFnbm9zdGljcykKICAgICAgICAkVGlja2V0T2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gIlJlc3BvbnNlVGVtcGxhdGUgKCRHZXRQYXJhbXtSZXNwb25zZUlEfS8kR2V0UGFyYW17UmVwbHlBcnRpY2xlSUR9LyRBcnRpY2xlSUQpIiwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJEdldFBhcmFte0Zvcm1JRH0gKTsKCiAgICAgICAgIyBJZiBmb3JtIHdhcyBjYWxsZWQgYmFzZWQgb24gYSBkcmFmdCwKICAgICAgICAjICAgZGVsZXRlIGRyYWZ0IHNpbmNlIGl0cyBjb250ZW50IGhhcyBub3cgYmVlbiB1c2VkLgogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICAgICAmJiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnREZWxldGUoCiAgICAgICAgICAgICAgICBGb3JtRHJhZnRJRCA9PiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgZGVsZXRlIGRyYWZ0IScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIGlmICgKICAgICAgICAgICAgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pCiAgICAgICAgICAgICYmICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlJlZGlyZWN0QWZ0ZXJDbG9zZURpc2FibGVkJykKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgICAgICBVUkwgPT4gKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCcgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcHVwCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBTTUlNRSAvIFBHUCBpZiBjdXN0b21lciBoYXMgY2hhbmdlZAogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICBteSBARXh0ZW5kZWREYXRhOwoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIG5leHQgSk9CIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkTXVsdGlwbGU7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIGdldCBBSkFYIHBhcmFtIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldFBhcmFtQUpBWCcpICkgewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IG9wdGlvbnMgdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIHZpc2libGUKICAgICAgICAgICAgICAgICMgdG8gdGhlIGFnZW50LiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAT3B0aW9uc1RvUmVtb3ZlID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskT3B0aW9uVG9SZW1vdmV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgaWYgKCRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAkTXVsdGlwbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTUwLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSBEeW5hbWljIEZpZWxkcyBQb3NzaWJsZSBWYWx1ZXMgdmlhIEFKQVgKICAgICAgICBteSBARHluYW1pY0ZpZWxkQUpBWDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc30gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCgogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN0ZCBhdHRhY2htZW50IG9iamVjdAogICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byBlbWFpbAogICAgICAgIGlmICggJEdldFBhcmFte1Jlc3BvbnNlSUR9ICkgewogICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtSZXNwb25zZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUgb3Igc2VsZWN0ZWQgYXJ0aWNsZSAuLi4KICAgICAgICBteSBAQXJ0aWNsZUxpc3Q7CgogICAgICAgIGlmICggJEdldFBhcmFte0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICBAQXJ0aWNsZUxpc3QgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgQEFydGljbGVMaXN0ID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgT25seUxhc3QgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVEYXRhOwoKICAgICAgICBBUlRJQ0xFTUVUQURBVEE6CiAgICAgICAgZm9yIG15ICRBcnRpY2xlTWV0YURhdGEgKEBBcnRpY2xlTGlzdCkgewoKICAgICAgICAgICAgbmV4dCBBUlRJQ0xFTUVUQURBVEEgaWYgISRBcnRpY2xlTWV0YURhdGE7CiAgICAgICAgICAgIG5leHQgQVJUSUNMRU1FVEFEQVRBIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkQXJ0aWNsZU1ldGFEYXRhKTsKCiAgICAgICAgICAgIG15ICRDdXJyZW50QXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGVNZXRhRGF0YX0gKTsKCiAgICAgICAgICAgICVEYXRhID0gJEN1cnJlbnRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZU1ldGFEYXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREYXRhe0NvbW11bmljYXRpb25DaGFubmVsTmFtZX0gPSAkQ3VycmVudEFydGljbGVCYWNrZW5kT2JqZWN0LT5DaGFubmVsTmFtZUdldCgpOwoKICAgICAgICAgICAgbGFzdCBBUlRJQ0xFTUVUQURBVEE7CiAgICAgICAgfQoKICAgICAgICAjIE1lcmdlIHRpY2tldCBkYXRhIHdpdGggYXJ0aWNsZSBkYXRhLCBzZWUgYnVnIzEzOTk1IChodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTEzOTk1KS4KICAgICAgICAlRGF0YSA9ICggJVRpY2tldCwgJURhdGEgKTsKCiAgICAgICAgIyBJZiBhcnRpY2xlIGlzIG5vdCBhIE1JTUVCYXNlIGFydGljbGUsIGdldCBjdXN0b21lciByZWNpcGllbnRzIGZyb20gdGhlIGJhY2tlbmQuCiAgICAgICAgaWYgKCAhJERhdGF7VG99ICYmICEkRGF0YXtGcm9tfSApIHsKICAgICAgICAgICAgbXkgQEN1c3RvbWVyVXNlcklEcyA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVDdXN0b21lclJlY2lwaWVudHNHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICAgICAgICAgbXkgQEN1c3RvbWVyUmVjaXBpZW50czsKCiAgICAgICAgICAgIENVU1RPTUVSX1VTRVJfSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VySUQgKEBDdXN0b21lclVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUl9VU0VSX0lEIGlmICElQ3VzdG9tZXI7CgogICAgICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJSZWNpcGllbnRzLCAiXCIkQ3VzdG9tZXJ7VXNlckZpcnN0bmFtZX0gJEN1c3RvbWVye1VzZXJMYXN0bmFtZX1cIiA8JEN1c3RvbWVye1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERhdGF7VG99ID0gam9pbiggJywnLCBAQ3VzdG9tZXJSZWNpcGllbnRzICkgLy8gJyc7CgogICAgICAgICAgICAjIEluY2x1ZGUgc2VuZGVyIG5hbWUgaW4gJ0Zyb20nIGZpZWxkIGZvciBjb3JyZWN0IHF1b3RpbmcuCiAgICAgICAgICAgIG15ICVBcnRpY2xlRmllbGRzID0gJExheW91dE9iamVjdC0+QXJ0aWNsZUZpZWxkcygKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkRGF0YXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRGF0YXtGcm9tfSA9ICRBcnRpY2xlRmllbGRze1NlbmRlcn0tPntWYWx1ZX0gLy8gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBPcmlnRnJvbSBmb3IgY29ycmVjdCBlbWFpbCBxdW90aW5nICh4eHh4IHdyb3RlKQogICAgICAgICREYXRhe09yaWdGcm9tfSA9ICREYXRhe0Zyb219OwoKICAgICAgICAjIGNoZWNrIGFydGljbGUgdHlwZSBhbmQgcmVwbGFjZSBUbyB3aXRoIEZyb20gKGluIGNhc2UpCiAgICAgICAgaWYgKCAkRGF0YXtTZW5kZXJUeXBlfSAhfiAvY3VzdG9tZXIvICkgewoKICAgICAgICAgICAgIyByZXBsYWNlIEZyb20vVG8sIFRvL0Zyb20gYmVjYXVzZSBzZW5kZXIgaXMgYWdlbnQKICAgICAgICAgICAgbXkgJFRvID0gJERhdGF7VG99OwogICAgICAgICAgICAkRGF0YXtUb30gICA9ICREYXRhe0Zyb219OwogICAgICAgICAgICAkRGF0YXtGcm9tfSA9ICRUbzsKCiAgICAgICAgICAgICREYXRhe1JlcGx5VG99ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIE9yaWdGcm9tTmFtZSAodG8gb25seSB1c2UgdGhlIHJlYWxuYW1lKQogICAgICAgICREYXRhe09yaWdGcm9tTmFtZX0gPSAkRGF0YXtPcmlnRnJvbX07CiAgICAgICAgJERhdGF7T3JpZ0Zyb21OYW1lfSA9fiBzLzwuKj58XCguKlwpfFwifDt8LC8vZzsKICAgICAgICAkRGF0YXtPcmlnRnJvbU5hbWV9ID1+IHMvKCAkKXwoICAkKS8vZzsKCiAgICAgICAgIyBGYWxsYmFjayB0byBPcmlnRnJvbSBpZiByZWFsbmFtZSBwYXJ0IGlzIGVtcHR5LgogICAgICAgIGlmICggISREYXRhe09yaWdGcm9tTmFtZX0gKSB7CiAgICAgICAgICAgICREYXRhe09yaWdGcm9tTmFtZX0gPSAkRGF0YXtPcmlnRnJvbX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjdXN0b21lciBkYXRhCiAgICAgICAgbXkgJUN1c3RvbWVyOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFydGljbGUgdG8gcXVvdGUKICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVRdW90ZSgKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgVXBsb2FkQ2FjaGVPYmplY3QgPT4gJFVwbG9hZENhY2hlT2JqZWN0LAogICAgICAgICk7CgogICAgICAgIG15ICVTYWZldHlDaGVja1Jlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+U2FmZXR5KAogICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7Qm9keX0sCgogICAgICAgICAgICAjIFN0cmlwIG91dCBleHRlcm5hbCBjb250ZW50IGlmIEJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQgaXMgZW5hYmxlZC4KICAgICAgICAgICAgTm9FeHRTcmNMb2FkID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QmxvY2tMb2FkaW5nUmVtb3RlQ29udGVudCcpLAoKICAgICAgICAgICAgIyBEaXNhbGxvdyBwb3RlbnRpYWxseSB1bnNhZmUgY29udGVudC4KICAgICAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgICAgIE5vT2JqZWN0ICAgICA9PiAxLAogICAgICAgICAgICBOb0VtYmVkICAgICAgPT4gMSwKICAgICAgICAgICAgTm9TVkcgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vSmF2YVNjcmlwdCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJERhdGF7Qm9keX0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKCiAgICAgICAgIyByZXN0cmljdCBudW1iZXIgb2YgYm9keSBsaW5lcyBpZiBjb25maWd1cmVkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkRGF0YXtCb2R5fQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlUXVvdGVNYXhMaW5lcycpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRNYXhMaW5lcyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VRdW90ZU1heExpbmVzJyk7CgogICAgICAgICAgICAjIHNwbGl0IGJvZHkgLSBvbmUgZWxlbWVudCBwZXIgbGluZQogICAgICAgICAgICBteSBAQm9keSA9IHNwbGl0ICJcbiIsICREYXRhe0JvZHl9OwoKICAgICAgICAgICAgIyBvbmx5IG1vZGlmeSBpZiBib2R5IGlzIGxvbmdlciB0aGFuIGFsbG93ZWQKICAgICAgICAgICAgaWYgKCBzY2FsYXIgQEJvZHkgPiAkTWF4TGluZXMgKSB7CgogICAgICAgICAgICAgICAgIyBzcGxpY2UgdG8gbWF4LiBhbGxvd2VkIGxpbmVzIGFuZCByZWFzc2VtYmxlCiAgICAgICAgICAgICAgICBAQm9keSAgICAgICA9IEBCb2R5WyAwIC4uICggJE1heExpbmVzIC0gMSApIF07CiAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9IGpvaW4gIlxuIiwgQEJvZHk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjIHByZXBhcmUgYm9keSwgc3ViamVjdCwgUmVwbHlUbyAuLi4KICAgICAgICAgICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgICAgICAgICAgaWYgKCAkRGF0YXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID1+IHMvXHQvIC9nOwogICAgICAgICAgICAgICAgbXkgJFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJykgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJFF1b3RlKSB7CgogICAgICAgICAgICAgICAgICAgICMgcXVvdGUgdGV4dAogICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIjxibG9ja3F1b3RlIHR5cGU9XCJjaXRlXCI+JERhdGF7Qm9keX08L2Jsb2NrcXVvdGU+XG4iOwoKICAgICAgICAgICAgICAgICAgICAjIGNsZWFudXAgbm90IGNvbXBhdC4gdGFncwogICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENsZWFudXAoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtCb2R5fSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIjxici8+IiAuICREYXRhe0JvZHl9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRhe0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICREYXRhe0NyZWF0ZVRpbWV9PGJyLz4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmb3IgKHF3KFN1YmplY3QgUmVwbHlUbyBSZXBseS1UbyBDYyBUbyBGcm9tKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogJERhdGF7JF99PGJyLz4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRGcm9tID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtGcm9tfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAkTWVzc2FnZUZyb20gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ01lc3NhZ2UgZnJvbScpOwogICAgICAgICAgICAgICAgICAgIG15ICRFbmRNZXNzYWdlICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRW5kIG1lc3NhZ2UnKTsKCiAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAiPGJyLz4tLS0tICRNZXNzYWdlRnJvbSAkRnJvbSAtLS08YnIvPjxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9IC49ICI8YnIvPi0tLS0gJEVuZE1lc3NhZ2UgLS0tPGJyLz4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBwcmVwYXJlIGJvZHksIHN1YmplY3QsIFJlcGx5VG8gLi4uCiAgICAgICAgICAgICMgcmUtd3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgICAgICBpZiAoICREYXRhe0JvZHl9ICkgewogICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPX4gcy9cdC8gL2c7CiAgICAgICAgICAgICAgICBteSAkUXVvdGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJyk7CiAgICAgICAgICAgICAgICBpZiAoJFF1b3RlKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPX4gcy9cbi9cbiRRdW90ZSAvZzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbiRRdW90ZSAiIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRhe0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICREYXRhe0NyZWF0ZVRpbWV9XG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmb3IgKHF3KFN1YmplY3QgUmVwbHlUbyBSZXBseS1UbyBDYyBUbyBGcm9tKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogJERhdGF7JF99XG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlRnJvbSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWVzc2FnZSBmcm9tJyk7CiAgICAgICAgICAgICAgICAgICAgbXkgJEVuZE1lc3NhZ2UgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdFbmQgbWVzc2FnZScpOwoKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbi0tLS0gJE1lc3NhZ2VGcm9tICREYXRhe0Zyb219IC0tLVxuXG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gLj0gIlxuLS0tLSAkRW5kTWVzc2FnZSAtLS1cbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHN5c3RlbSBhZGRyZXNzIG9iamVjdAogICAgICAgIG15ICRTeXN0ZW1BZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKCiAgICAgICAgIyBhZGQgbm90IGxvY2FsIFRvIGFkZHJlc3NlcyB0byBDYwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJERhdGF7VG99ICkgKSB7CiAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJFN5c3RlbUFkZHJlc3MtPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCksCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkSXNMb2NhbCApIHsKICAgICAgICAgICAgICAgIGlmICggJERhdGF7Q2N9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0NjfSAuPSAnLCAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJERhdGF7Q2N9IC49ICRFbWFpbC0+Zm9ybWF0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgUmVwbHlUbwogICAgICAgIGlmICggJERhdGF7UmVwbHlUb30gKSB7CiAgICAgICAgICAgICREYXRhe1RvfSA9ICREYXRhe1JlcGx5VG99OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7VG99ID0gJERhdGF7RnJvbX07CgogICAgICAgICAgICAjIHRyeSB0byByZW1vdmUgc29tZSB3cm9uZyB0ZXh0IHRvIGZyb20gbGluZSAoYnkgd2F5IG9mIC4uLikKICAgICAgICAgICAgIyBhZGRlZCBieSBzb21lIHN0cmFuZ2UgbWFpbCBwcm9ncmFtcyBvbiBib3VuY2UKICAgICAgICAgICAgJERhdGF7VG99ID1+IHMvKC4rP1w8Lis/XEAuKz9cPilccytcKGJ5XHMrd2F5XHMrb2ZccysuKz9cKS8kMS9pZzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRvIGVtYWlsIChqdXN0ICJzb21lQGV4YW1wbGUuY29tIikKICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICREYXRhe1RvfSApICkgewogICAgICAgICAgICAkRGF0YXtUb0VtYWlsfSA9ICRFbWFpbC0+YWRkcmVzcygpOwogICAgICAgIH0KCiAgICAgICAgIyBvbmx5IHJlcGx5IHRvIHNlbmRlcgogICAgICAgIGlmICggISRHZXRQYXJhbXtSZXBseUFsbH0gKSB7CiAgICAgICAgICAgICREYXRhe0NjfSAgPSAnJzsKICAgICAgICAgICAgJERhdGF7QmNjfSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyB1c2UgY3VzdG9tZXIgZGF0YWJhc2UgZW1haWwKICAgICAgICAjIGRvIG5vdCBhZGQgY3VzdG9tZXIgZW1haWwgdG8gY2MsIGlmIGFydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXIKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q29tcG9zZUFkZEN1c3RvbWVyQWRkcmVzcycpCiAgICAgICAgICAgICYmICREYXRhe0lzVmlzaWJsZUZvckN1c3RvbWVyfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGNoZWNrIGlmIGN1c3RvbWVyIGlzIGluIHJlY2lwaWVudCBsaXN0CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVye1VzZXJFbWFpbH0gJiYgJERhdGF7VG9FbWFpbH0gIX4gL15cUSRDdXN0b21lcntVc2VyRW1haWx9XEUkL2kgKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtTZW5kZXJUeXBlfSBlcSAnYWdlbnQnICYmICEkRGF0YXtJc1Zpc2libGVGb3JDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtUb30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVye1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtUb30gPSAkQ3VzdG9tZXJ7VXNlckVtYWlsfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIFRvIHdpdGggY3VzdG9tZXJzIGRhdGFiYXNlIGFkZHJlc3MKICAgICAgICAgICAgICAgIGVsc2lmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDb21wb3NlUmVwbGFjZVNlbmRlckFkZHJlc3MnKSApIHsKCiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkZHJlc3MgJXMgcmVwbGFjZWQgd2l0aCByZWdpc3RlcmVkIGN1c3RvbWVyIGFkZHJlc3MuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1RvRW1haWx9LAogICAgICAgICAgICAgICAgICAgICAgICApLAoKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICREYXRhe1RvfSA9ICRDdXN0b21lcntVc2VyRW1haWx9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYWRkIGN1c3RvbWVycyBkYXRhYmFzZSBhZGRyZXNzIHRvIENjCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiBUcmFuc2xhdGFibGUoIkN1c3RvbWVyIHVzZXIgYXV0b21hdGljYWxseSBhZGRlZCBpbiBDYy4iKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7Q2N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtDY30gLj0gJywgJyAuICRDdXN0b21lcntVc2VyRW1haWx9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Q2N9ID0gJEN1c3RvbWVye1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGZpbmQgZHVwbGljYXRlIGFkZHJlc3NlcwogICAgICAgIG15ICVSZWNpcGllbnQ7CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JFR5cGV9ICkgewogICAgICAgICAgICAgICAgbXkgJE5ld0xpbmUgPSAnJzsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJERhdGF7JFR5cGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFkZHJlc3MgPSBsYyAkRW1haWwtPmFkZHJlc3MoKTsKCiAgICAgICAgICAgICAgICAgICAgIyBvbmx5IHVzZSBlbWFpbCBhZGRyZXNzZXMgd2l0aCBAIGluc2lkZQogICAgICAgICAgICAgICAgICAgIGlmICggJEFkZHJlc3MgJiYgJEFkZHJlc3MgPX4gL0AvICYmICEkUmVjaXBpZW50eyRBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJlY2lwaWVudHskQWRkcmVzc30gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRTeXN0ZW1BZGRyZXNzLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJElzTG9jYWwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE5ld0xpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3TGluZSAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0xpbmUgLj0gJEVtYWlsLT5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheyRUeXBlfSA9ICROZXdMaW5lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0ZW1wbGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAjIHVzZSBrZXkgU3RkUmVzcG9uc2UgdG8gcGFzcyB0aGUgZGF0YSB0byB0aGUgdGVtcGxhdGUgZm9yIGxlZ2FjeSByZWFzb25zLAogICAgICAgICMgICBiZWNhdXNlIGV4aXN0aW5nIHN5c3RlbXMgbWF5IGhhdmUgaXQgaW4gdGhlaXIgY29uZmlndXJhdGlvbiBhcyB0aGF0IHdhcwogICAgICAgICMgICB0aGUga2V5IHVzZWQgYmVmb3JlIHRoZSBpbnRlcm5hbCBzd2l0Y2ggdG8gU3RhbmRhcmRSZXNwb25zZSBBbmQgU3RhbmRhcmRUZW1wbGF0ZQoKICAgICAgICAkRGF0YXtTdGRSZXNwb25zZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtSZXNwb25zZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNhbHV0YXRpb24KICAgICAgICAkRGF0YXtTYWx1dGF0aW9ufSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2FsdXRhdGlvbigKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNpZ25hdHVyZQogICAgICAgICREYXRhe1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgJFRlbXBsYXRlR2VuZXJhdG9yLT5BdHRyaWJ1dGVzKCkgZG9lcyBub3Qgb3ZlcndyaXRlICVEYXRhLCBidXQgaXQgYWRkcyBtb3JlIGtleXMKICAgICAgICAlRGF0YSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+QXR0cmlidXRlcygKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgIERhdGEgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlc3BvbnNlRm9ybWF0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpSZXNwb25zZUZvcm1hdCcpOwoKICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgIG15ICVEYXRhSFRNTCA9ICVEYXRhOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgIGlmICgkUmVzcG9uc2VGb3JtYXQpIHsKICAgICAgICAgICAgICAgICRSZXNwb25zZUZvcm1hdCA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUmVzcG9uc2VGb3JtYXQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVzdG9yZSBxZGF0YSBmb3JtYXR0aW5nIGZvciBPdXRwdXQgcmVwbGFjZW1lbnQKICAgICAgICAgICAgICAgICRSZXNwb25zZUZvcm1hdCA9fiBzLyZxdW90Oy8iL2dpOwoKICAgICAgICAgICAgICAgICMgaHRtbCBxdW90ZSB0byBoYXZlIGl0IGNvcnJlY3QgaW4gZWRpdCBhcmVhCiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJFJlc3BvbnNlRm9ybWF0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlc3RvcmUgcWRhdGEgZm9ybWF0dGluZyBmb3IgT3V0cHV0IHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQgPX4gcy8mcXVvdDsvIi9naTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBxdW90ZSBhbGwgbm9uIGh0bWwgY29udGVudCB0byBoYXZlIGl0IGNvcnJlY3QgaW4gZWRpdCBhcmVhCiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJURhdGFIVE1MICkgewogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISREYXRhSFRNTHskS2V5fTsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1NhbHV0YXRpb24nOwogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQm9keSc7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdTdGRSZXNwb25zZSc7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdTaWduYXR1cmUnOwogICAgICAgICAgICAgICAgJERhdGFIVE1MeyRLZXl9ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhSFRNTHskS2V5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV3IHJlcHNvbnNlIGZvcm1hdCBiYXNlZCBvbiB0ZW1wbGF0ZQogICAgICAgICREYXRhe1Jlc3BvbnNlRm9ybWF0fSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFJlc3BvbnNlRm9ybWF0LAogICAgICAgICAgICBEYXRhICAgICA9PiB7ICVQYXJhbSwgJURhdGFIVE1MIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISREYXRheyRMaW5lfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkRGF0YXskTGluZX0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRMaW5lIC4gIkludmFsaWQiIH0gPSAiIFNlcnZlckVycm9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICREYXRhe0Zyb219ICkgewogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICREYXRhe0Zyb219ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJGcm9tSW52YWxpZCJ9IC49ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgb25seSBnZXQgdmFsdWVzIGZvciBUaWNrZXQgZmllbGRzIChhbGwgc2NyZWVucyBiYXNlZCBvbiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgICAgICAgICAjIGdlbmVyYXRlIGEgbmV3IGFydGljbGUsIHRoZW4gYXJ0aWNsZSBmaWVsZHMgd2lsbCBiZSBhbHdheXMgZW1wdHkgYXQgdGhlIGJlZ2luaWduKQogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlIGZyb20gVGlja2V0CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4KICAgICAgICAgICAgICAgICAgICAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHJlZmVyZW5jZXMgaWYgZXhpc3QKICAgICAgICBteSAkUmVmZXJlbmNlcyA9ICggJERhdGF7TWVzc2FnZUlEfSB8fCAnJyApIC4gKCAkRGF0YXtSZWZlcmVuY2VzfSB8fCAnJyApOwoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9ICk7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICROZXdQYXJhbXMgPSAkT2JqZWN0LT5SdW4oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCROZXdQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJE5ld1BhcmFtczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICAgICAlRXJyb3IgPSAoCiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCB2aWV3IC4uLgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBOZXh0U3RhdGVzID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICBSZXNwb25zZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtSZXNwb25zZUlEfSwKICAgICAgICAgICAgUmVwbHlBcnRpY2xlSUQgICAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgIEluUmVwbHlUbyAgICAgICAgPT4gJERhdGF7TWVzc2FnZUlEfSwKICAgICAgICAgICAgUmVmZXJlbmNlcyAgICAgICA9PiAiJFJlZmVyZW5jZXMiLAogICAgICAgICAgICBUaWNrZXRCYWNrVHlwZSAgID0+ICRUaWNrZXRCYWNrVHlwZSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5leHQgc3RhdGVzCiAgICBteSAlTmV4dFN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMQogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAlU3RhdGU7CiAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntTdGF0ZUlEfSApIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17R2V0UGFyYW19LT57U3RhdGVJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fTsKICAgIH0KICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte05leHRTdGF0ZXN9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgJVN0YXRlLAogICAgICAgICVQYXJhbSwKICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgbXkgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnR9ICkgewogICAgICAgICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRQYXJhbXtHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lcn0gPyAxIDogMDsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJc1Zpc2libGVGb3JDdXN0b21lcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRJc1Zpc2libGVGb3JDdXN0b21lciwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskRXJyb3J9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskRXJyb3J9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB1c2VkIGNhbGVuZGFyCiAgICBteSAkQ2FsZW5kYXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldENhbGVuZGFyR2V0KAogICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgIFNMQUlEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIERpZmZUaW1lICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICcgJywKICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICA9PiAxLAogICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICAgPT4gJENhbGVuZGFyLAogICAgKTsKCiAgICAjIE11bHRpcGxlLUF1dG9jb21wbGV0ZQogICAgJFBhcmFte1RvfSA9ICggc2NhbGFyIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSB9ID8gJycgOiAkUGFyYW17VG99ICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1RvfSAmJiAkUGFyYW17VG99IG5lICcnICkgewogICAgICAgICRQYXJhbXtUb0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgJFBhcmFte0NjfSA9ICggc2NhbGFyIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9IH0gPyAnJyA6ICRQYXJhbXtDY30gKTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17Q2N9ICYmICRQYXJhbXtDY30gbmUgJycgKSB7CiAgICAgICAgJFBhcmFte0NjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICAjIENjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjJyAuICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDY0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJDYyApIHsKICAgICAgICAkUGFyYW17Q2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJDYywKICAgICAgICB9LAogICAgKTsKCiAgICAjIEJjYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjJyAuICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckJjYyApIHsKICAgICAgICAkUGFyYW17QmNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckJjYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgVG8KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RvSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RvU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIHNldCBwcmVzZWxlY3RlZCB2YWx1ZXMgZm9yIENjIGZpZWxkCiAgICBpZiAoICRQYXJhbXtDY30gJiYgJFBhcmFte0NjfSBuZSAnJyAmJiAhJEN1c3RvbWVyQ291bnRlckNjICkgewoKICAgICAgICAjIHNwbGl0IENjIHZhbHVlcwogICAgICAgIG15IEBFbWFpbEFkZHJlc3Nlc0NjOwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJFBhcmFte0NjfSApICkgewoKICAgICAgICAgICAgbXkgJUN1c3RvbWVyU2VhcmNoID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRFbWFpbC0+YWRkcmVzcygpLAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBDdXN0b21lclNlYXJjaCBoYXNoIGNvdWxkIGhhdmUgb25lIGl0ZW0gZnJvbSBlYWNoIGJhY2tlbmQsIHNvIGluc2VydCBqdXN0IHRoZSBmaXJzdCBvbmUuCiAgICAgICAgICAgIGlmICglQ3VzdG9tZXJTZWFyY2gpIHsKICAgICAgICAgICAgICAgIENVU1RPTUVSVVNFUklEOgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJTZWFyY2ggKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNDYywgewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEN1c3RvbWVyU2VhcmNoeyRDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IENVU1RPTUVSVVNFUklEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNDYywgewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEVtYWlsLT5bMF0gPyAiJEVtYWlsLT5bMF0gPCRFbWFpbC0+WzFdPiIgOiAiJEVtYWlsLT5bMV0iLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRW1haWxBZGRyZXNzZXNDYycsCiAgICAgICAgICAgIFZhbHVlID0+IFxARW1haWxBZGRyZXNzZXNDYywKICAgICAgICApOwoKICAgICAgICAkUGFyYW17Q2N9ID0gJyc7CiAgICB9CgogICAgIyBzZXQgcHJlc2VsZWN0ZWQgdmFsdWVzIGZvciBUbyBmaWVsZAogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUb30gJiYgJFBhcmFte1RvfSBuZSAnJyAmJiAhJEN1c3RvbWVyQ291bnRlciApIHsKCiAgICAgICAgIyBzcGxpdCBUbyB2YWx1ZXMKICAgICAgICBteSBARW1haWxBZGRyZXNzZXNUbzsKICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICRQYXJhbXtUb30gKSApIHsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclNlYXJjaCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWwtPmFkZHJlc3MoKSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ3VzdG9tZXJTZWFyY2ggaGFzaCBjb3VsZCBoYXZlIG9uZSBpdGVtIGZyb20gZWFjaCBiYWNrZW5kLCBzbyBpbnNlcnQganVzdCB0aGUgZmlyc3Qgb25lLgogICAgICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoKSB7CiAgICAgICAgICAgICAgICBDVVNUT01FUlVTRVJJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVyU2VhcmNoICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzVG8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICAgID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRDdXN0b21lclNlYXJjaHskQ3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgbGFzdCBDVVNUT01FUlVTRVJJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzVG8sIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRFbWFpbC0+WzBdID8gIiRFbWFpbC0+WzBdIDwkRW1haWwtPlsxXT4iIDogIiRFbWFpbC0+WzFdIiwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VtYWlsQWRkcmVzc2VzVG8nLAogICAgICAgICAgICBWYWx1ZSA9PiBcQEVtYWlsQWRkcmVzc2VzVG8sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte1RvfSA9ICcnOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte1RpY2tldEJhY2tUeXBlfSwKICAgICAgICBEYXRhID0+IHsKCiAgICAgICAgICAgICMgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIGZpZWxkcyB0aGF0IEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGh0bWwgc3RyaW5ncyBmb3JtICRQYXJhbQogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cgdGhlIGN1c3RvbWVyIHVzZXIgYWRkcmVzcyBib29rIGlmIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZCBhbmQgamF2YSBzY3JpcHQgc3VwcG9ydCBpcyBhdmFpbGFibGUuCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudEN1c3RvbWVyVXNlckFkZHJlc3NCb29rfQogICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9CiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtPcHRpb25DdXN0b21lclVzZXJBZGRyZXNzQm9va30gPSAxOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnRHluYW1pY0ZpZWxkTmFtZXMnLAogICAgICAgIFZhbHVlID0+ICREeW5hbWljRmllbGROYW1lcywKICAgICk7CgogICAgbXkgJExvYWRlZEZvcm1EcmFmdDsKICAgIGlmICggJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgJExvYWRlZEZvcm1EcmFmdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0R2V0KAogICAgICAgICAgICBGb3JtRHJhZnRJRCA9PiAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSwKICAgICAgICAgICAgR2V0Q29udGVudCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15IEBBcnRpY2xlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBPbmx5TGFzdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmIChAQXJ0aWNsZXMpIHsKICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlID0gJEFydGljbGVzWzBdOwoKICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlU3lzdGVtVGltZTsKICAgICAgICAgICAgaWYgKCAkTGFzdEFydGljbGUtPntDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTGFzdEFydGljbGUtPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgPSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdFN5c3RlbVRpbWUgPSAkRm9ybURyYWZ0U3lzdGVtVGltZU9iamVjdC0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgaWYgKCAhJExhc3RBcnRpY2xlU3lzdGVtVGltZSB8fCAkRm9ybURyYWZ0U3lzdGVtVGltZSA8PSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAgICAgJFBhcmFte0Zvcm1EcmFmdE91dGRhdGVkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkTG9hZGVkRm9ybURyYWZ0KSApIHsKCiAgICAgICAgJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZUJ5TmFtZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VCeX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgRm9ybURyYWZ0ICAgICAgPT4gJENvbmZpZy0+e0Zvcm1EcmFmdH0sCiAgICAgICAgICAgIEZvcm1EcmFmdElEICAgID0+ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9LAogICAgICAgICAgICBGb3JtRHJhZnRUaXRsZSA9PiAkTG9hZGVkRm9ybURyYWZ0ID8gJExvYWRlZEZvcm1EcmFmdC0+e1RpdGxlfSA6ICcnLAogICAgICAgICAgICBGb3JtRHJhZnRNZXRhICA9PiAkTG9hZGVkRm9ybURyYWZ0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwoKICAgICMgc2V0IHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRhYmxlIHZpYSBBSkFYVXBkYXRlCiAgICBpZiAoICEkUGFyYW17T25seUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIEBVcGRhdGFibGVGaWVsZHMgPSBxdyggU3RhdGVJRCApOwogICAgfQoKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgIHB1c2ggQFVwZGF0YWJsZUZpZWxkcywgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiBcQFVwZGF0YWJsZUZpZWxkczsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmail.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNYWlsOjpBZGRyZXNzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CgogICAgIyBDaGVjayBpZiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudCBpcyB1c2VkLgogICAgbXkgJE91dHB1dEZpbHRlckNvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyRWxlbWVudFBvc3QnKTsKICAgIGlmICggJE91dHB1dEZpbHRlckNvbmZpZy0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSApIHsKICAgICAgICAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSA9IDE7CiAgICB9CiMgRU8gSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKCiAgICAjIG1ldGhvZHMgd2hpY2ggYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHN0YW5kYXJkIGZpZWxkcwogICAgJFNlbGYtPntGaWVsZE1ldGhvZHN9ID0gWwogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnRGVzdCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0VG9zCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0VXNlcnMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0UmVzcG9uc2libGVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXROZXh0U3RhdGVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFByaW9yaXRpZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTZXJ2aWNlcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdTTEFJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U0xBcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFN0YW5kYXJkVGVtcGxhdGVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0VHlwZXMKICAgICAgICB9LAogICAgXTsKCiAgICAjIGRlcGVuZGFuY2llcyBvZiBzdGFuZGFyZCBmaWVsZHMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIHZpYSBBQ0xzCiAgICAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX0gPSB7CiAgICAgICAgRGVzdCA9PiB7CiAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOZXdSZXNwb25zaWJsZUlEICAgPT4gMSwKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEsCiAgICAgICAgfSwKICAgICAgICBTZXJ2aWNlSUQgPT4gewogICAgICAgICAgICBTTEFJRCAgICAgPT4gMSwKICAgICAgICAgICAgU2VydmljZUlEID0+IDEsICAgICNDdXN0b21lclVzZXIgdXBkYXRlcyBjYW4gYmUgc3VibWl0dGVkIGFzIEVsZW1lbnRDaGFuZ2VkOiBTZXJ2aWNlSUQKICAgICAgICB9LAogICAgICAgIEN1c3RvbWVyVXNlciA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3duZXJBbGwgPT4gewogICAgICAgICAgICBOZXdVc2VySUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlc3BvbnNpYmxlQWxsID0+IHsKICAgICAgICAgICAgTmV3UmVzcG9uc2libGVJRCA9PiAxLAogICAgICAgIH0sCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc3RvcmUgbGFzdCBxdWV1ZSBzY3JlZW4KICAgIGlmICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICYmICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwvICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICREZWJ1ZyA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBUbyBDYyBCY2MgVGltZVVuaXRzIFByaW9yaXR5SUQgU3ViamVjdCBCb2R5CiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBPd25lckFsbCBSZXNwb25zaWJsZUFsbCBOZXdSZXNwb25zaWJsZUlEIE5ld1VzZXJJRAogICAgICAgIE5leHRTdGF0ZUlEIFN0YW5kYXJkVGVtcGxhdGVJRCBEZXN0IEFydGljbGVJRCBMaW5rVGlja2V0SUQKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW07CiAgICAkQUNMQ29tcGF0R2V0UGFyYW17T3duZXJJRH0gPSAkR2V0UGFyYW17TmV3VXNlcklEfTsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CgogICAgIyBNdWx0aXBsZUN1c3RvbWVyIFRvLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyVG9DdXN0b21lcicgKSB8fCAwOwogICAgbXkgJFNlbGVjdGVkICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclNlbGVjdGVkJyApICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXIgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CgogICAgICAgICAgICBpZiAoJEN1c3RvbWVyRWxlbWVudCkgewoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50KSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTXVsdGlwbGVDdXN0b21lciBDYy1maWVsZAogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJDYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJDYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudENjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50Q2MpIHsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQ2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4Q2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJDYysrOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9ID0gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnRDYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ICYmICRDdXN0b21lckVycm9yQ2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckNjIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQ2MgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgJENvdW50QXV4Q2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQ2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZENjLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTXVsdGlwbGVDdXN0b21lciBCY2MtZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQmNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJCY2MgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5QmNjICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnRCY2MpIHsKCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JjY30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRCY2M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSA9ICRDdXN0b21lckVsZW1lbnRCY2M7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudEJjYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckJjYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZEJjYywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYW4gZW1wdHkgdmFsdWUgaWYgbm90IGRlZmluZWQKICAgICRHZXRQYXJhbXtDY30gID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0NjfTsKICAgICRHZXRQYXJhbXtCY2N9ID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0JjY307CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9ybSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAogICAgIyB0byBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkeW5hbWljIGZpZWxkIGZvciB0aGUgaW1wYWN0CiAgICBteSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnOwojIEVPIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RmllbGRSZXN0cmljdGlvbnMnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiAgICAgICAgIyBpbXBhY3QgZmllbGQgd2FzIGZvdW5kCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gZXEgJ0lUU01JbXBhY3QnICkgewoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbXBhY3QgZmllbGQKICAgICAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgfQojIEVPIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGQgfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAogICAgbXkgJVNlcnZpY2U7CgogICAgaWYgKCAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSApIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAnRHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eScpOwogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0Jyk7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpb3JpdHlSQycpOwogICAgICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJykgfHwgJyc7CgogICAgICAgICMgY2hlY2sgaWYgcHJpb3JpdHkgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnIHx8ICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JyB8fCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5JyApIHsKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgICAgICB9CgogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+ICRDb25maWctPntTaG93SW5jaWRlbnRTdGF0ZX0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9ID0gJFNlcnZpY2V7Q3JpdGljYWxpdHl9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlY2FsY3VsYXRlIGltcGFjdCBpZiBpbXBhY3QgaXMgbm90IHNldCB1bnRpbCBub3cKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IG5lICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAgICAgICAgIG15ICREZWZhdWx0U2VsZWN0aW9uID0gJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9OwoKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdFNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBkZWZhdWx0IGltcGFjdAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAkRGVmYXVsdFNlbGVjdGlvbjsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSB8fCAkU2VydmljZXtDcml0aWNhbGl0eX0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgbm8gc2VydmljZSB3YXMgc2VsZWN0ZWQKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZG8gbm90IHNob3cgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSA9ICcnOwoKICAgICAgICAgICAgIyBzaG93IG9ubHkgdGhlIGVtcHR5IHNlbGVjdGlvbgogICAgICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSA9IHt9OwogICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aGUgc2VsZWN0ZWQgaW1wYWN0IGFuZCBjcml0aWNhbGl0eQogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7SVRTTUNyaXRpY2FsaXR5fSA9ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fTsKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVze0lUU01JbXBhY3R9ICAgICAgPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwoKICAgICAgICAjIFNlbmQgY29uZmlnIGRhdGEgdG8gSlMuCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0FjdGlvbn0gLiAnU2hvd0luY2lkZW50U3RhdGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAkQ29uZmlnLT57U2hvd0luY2lkZW50U3RhdGV9LAogICAgICAgICk7CiAgICB9CiMgRU8gSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CiAgICAgICAgbXkgJVRpY2tldDsKICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBoZWFkZXIgYW5kIG5hdmlnYXRpb24gYmFyCiAgICAgICAgbXkgJE91dHB1dCA9IGpvaW4gJycsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigpLAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgaWYgdGhlcmUgaXMgbm8gdGlja2V0IGlkIQogICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVkJyApIHsKCiAgICAgICAgICAgICMgbm90aWZ5IGluZm8KICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnVGlja2V0ICIlcyIgY3JlYXRlZCEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBMaW5rID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPScKICAgICAgICAgICAgICAgICAgICAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9CiAgICAgICAgICAgICYmICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwvCiAgICAgICAgICAgICYmICRTZWxmLT57UmVxdWVzdGVkVVJMfSAgICAgICAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwuKkxpbmtUaWNrZXRJRD0vCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNwbGl0IGFydGljbGUgaWYgZ2l2ZW4KICAgICAgICAjIGdldCBBcnRpY2xlSUQKICAgICAgICBteSAlQXJ0aWNsZTsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIG15ICRBcnRpY2xlRnJvbSA9ICcnOwogICAgICAgIG15ICVTcGxpdFRpY2tldERhdGE7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKCiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IG5lZWQgcm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgaW5mb3JtYXRpb24gZnJvbSBvcmlnaW5hbCB0aWNrZXQgKFNwbGl0VGlja2V0KS4KICAgICAgICAgICAgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAlQXJ0aWNsZSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgYXJ0aWNsZSBpcyBmcm9tIHRoZSBzYW1lIFRpY2tldElEIGFzIHdlIGNoZWNrZWQgcGVybWlzc2lvbnMgZm9yLgogICAgICAgICAgICBpZiAoICRBcnRpY2xle1RpY2tldElEfSBuZSAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0FydGljbGUgZG9lcyBub3QgYmVsb25nIHRvIHRpY2tldCAlcyEnLCAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNhdmUgYXJ0aWNsZSBmcm9tIGZvciBhZGRyZXNzZXMgbGlzdAogICAgICAgICAgICAkQXJ0aWNsZUZyb20gPSAkQXJ0aWNsZXtGcm9tfTsKCiAgICAgICAgICAgICMgaWYgVG8gaXMgcHJlc2VudAogICAgICAgICAgICAjIGFuZCBpcyBubyBhIHF1ZXVlCiAgICAgICAgICAgICMgYW5kIGFsc28gaXMgbm8gYSBzeXN0ZW0gYWRkcmVzcwogICAgICAgICAgICAjIHNldCBUbyBhcyBhcnRpY2xlIGZyb20KICAgICAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkQXJ0aWNsZXtUb30gKSApIHsKICAgICAgICAgICAgICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWUgKCBzb3J0IGtleXMgJXsgJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPntDdXN0b21lclBhbmVsT3duU2VsZWN0aW9ufS0+eyRRdWV1ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRRdWV1ZXN7JFF1ZXVlfSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJVF1ZXVlTG9va3VwICAgICAgICAgPSByZXZlcnNlICVRdWV1ZXM7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0xvb2t1cCA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0xpc3QoKTsKICAgICAgICAgICAgICAgIG15IEBBcnRpY2xlRnJvbUFkZHJlc3M7CiAgICAgICAgICAgICAgICBteSAkU3lzdGVtQWRkcmVzc0VtYWlsOwoKICAgICAgICAgICAgICAgIGlmICgkQXJ0aWNsZUZyb20pIHsKICAgICAgICAgICAgICAgICAgICBAQXJ0aWNsZUZyb21BZGRyZXNzID0gTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEFydGljbGVGcm9tKTsKICAgICAgICAgICAgICAgICAgICAkU3lzdGVtQWRkcmVzc0VtYWlsID0gJEFydGljbGVGcm9tQWRkcmVzc1swXS0+YWRkcmVzcygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFF1ZXVlTG9va3VweyAkQXJ0aWNsZXtUb30gfSAmJiBkZWZpbmVkICRTeXN0ZW1BZGRyZXNzTG9va3VweyRTeXN0ZW1BZGRyZXNzRW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlRnJvbSA9ICRBcnRpY2xle1RvfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBib2R5IHByZXBhcmF0aW9uIGZvciBwbGFpbiB0ZXh0IHByb2Nlc3NpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlU2FmZXR5Q2hlY2tSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXJ0aWNsZXtCb2R5fSwKCiAgICAgICAgICAgICAgICAjIFN0cmlwIG91dCBleHRlcm5hbCBjb250ZW50IGlmIEJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQgaXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIE5vRXh0U3JjTG9hZCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQnKSwKCiAgICAgICAgICAgICAgICAjIERpc2FsbG93IHBvdGVudGlhbGx5IHVuc2FmZSBjb250ZW50LgogICAgICAgICAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgTm9TVkcgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKCiAgICAgICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yIG15ICRLZXlDdXN0b21lclVzZXJMaXN0ICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xle0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlckxpc3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG11bHRpcGxlIGFkZHJlc3NlcyBsaXN0CiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgbXkgJENvdW50RnJvbSA9IHNjYWxhciBATXVsdGlwbGVDdXN0b21lciB8fCAxOwogICAgICAgIG15ICVDdXN0b21lckRhdGFGcm9tOwogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJEYXRhRnJvbSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQXJ0aWNsZUZyb20pICkgewoKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gJENvdW50RnJvbSBlcSAnMScgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJyc7CiAgICAgICAgICAgIG15ICRFbWFpbEFkZHJlc3MgICAgID0gJEVtYWlsLT5hZGRyZXNzKCk7CiAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsQWRkcmVzcyApICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRFbWFpbH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50RnJvbSAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRQaHJhc2UgPSAnJzsKICAgICAgICAgICAgaWYgKCAkRW1haWwtPnBocmFzZSgpICkgewogICAgICAgICAgICAgICAgJFBocmFzZSA9ICRFbWFpbC0+cGhyYXNlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSA9ICcnOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRDdXN0b21lckRhdGFGcm9te1VzZXJFbWFpbH0KICAgICAgICAgICAgICAgICYmICRDdXN0b21lckRhdGFGcm9te1VzZXJFbWFpbH0gZXEgJEVtYWlsQWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJLZXkgPSAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRFbWFpbEFkZHJlc3MpIHsKICAgICAgICAgICAgICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWxBZGRyZXNzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJMb2dpbiAoIHNvcnQga2V5cyAlTGlzdCApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBTZXQgcmlnaHQgb25lIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY3VzdG9tZXIgdXNlciB3aXRoIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGhyYXNlICYmICRMaXN0eyRVc2VyTG9naW59ID1+IC8kUGhyYXNlLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyS2V5ID0gJFVzZXJMb2dpbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgPSAkRW1haWxBZGRyZXNzOwogICAgICAgICAgICBpZiAoJFBocmFzZSkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRWxlbWVudCA9ICRQaHJhc2UgLiAiIDwkRW1haWxBZGRyZXNzPiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyU2VsZWN0ZWQgJiYgJEN1c3RvbWVyS2V5ICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEVtYWlsQWRkcmVzc30gPSAxOwogICAgICAgICAgICAkQ291bnRGcm9tKys7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTcGxpdFRpY2tldFBhcmFtOwoKICAgICAgICAjIGluIGNhc2Ugb2Ygc3BsaXQgYSBUaWNrZXRJRCBhbmQgQXJ0aWNsZUlEIGFyZSBhbHdheXMgZ2l2ZW4sIHNlbmQgdGhlIFRpY2tldElEIHRvIGNhbGN1bGF0ZQogICAgICAgICMgQUNMcyBiYXNlZCBvbiBwYXJlbnQgaW5mb3JtYXRpb24KICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBmaXggdG8gYnVnIyA4MDY4IEZpZWxkICYgRHluYW1pY0ZpZWxkIHByZXNlbGVjdGlvbiBvbiBUaWNrZXRTcGxpdAogICAgICAgICMgd2hlbiBzcGxpdHRpbmcgYSB0aWNrZXQgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZXMgbXVzdCByZW1haW4gaW4gdGhlIG5ldyB0aWNrZXQgc2NyZWVuCiAgICAgICAgIyB0aGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBTcGxpdFRpY2tldFBhcmFtIGhhc2gKICAgICAgICBpZiAoICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGluZm9ybWF0aW9uIGZyb20gb3JpZ2luYWwgdGlja2V0IChTcGxpdFRpY2tldCkKICAgICAgICAgICAgbXkgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBzaW1wbGUgSURzIHRvIHBhc3MgdGhlbSB0byB0aGUgbWFzawogICAgICAgICAgICBmb3IgbXkgJFNwbGl0ZWRQYXJhbSAocXcoVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBQcmlvcml0eUlEKSkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17JFNwbGl0ZWRQYXJhbX0gPSAkU3BsaXRUaWNrZXREYXRheyRTcGxpdGVkUGFyYW19OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBTdGF0ZUlEIGFzIE5leHRTdGF0ZUlECiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte05leHRTdGF0ZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7U3RhdGVJRH07CgogICAgICAgICAgICAjIHNldCBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VXNlclNlbGVjdGVkfSAgICAgICAgICAgID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtSZXNwb25zaWJsZUlEfTsKCiAgICAgICAgICAgICMgc2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ICAgICAgID0gMTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CgogICAgICAgICAgICAjIHNldCB0aGUgc2VsZWN0ZWQgcXVldWUgaW4gZm9ybWF0IElEfHxOYW1lCiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0Zyb21TZWxlY3RlZH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9IC4gJ3x8JyAuICRTcGxpdFRpY2tldERhdGF7UXVldWV9OwoKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVNwbGl0VGlja2V0RGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggJEtleSA9fiAvRHluYW1pY0ZpZWxkXF8oLiopLyApIHsKICAgICAgICAgICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtEeW5hbWljRmllbGR9eyQxfSA9ICRTcGxpdFRpY2tldERhdGF7JEtleX07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTcGxpdFRpY2tldFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBzZWxlY3RlZCB2YWx1ZXMgYXQgdGhlIHN0YXJ0CgogICAgICAgICMgaW4gY2FzZSBvZiB0aWNrZXQgc3BsaXQgc2V0ICRTZWxmLT57UXVldWVJRH0gYXMgdGhlIFF1ZXVlSUQgb2YgdGhlIG9yaWdpbmFsIHRpY2tldCwKICAgICAgICAjIGluIG9yZGVyIHRvIHNldCBjb3JyZWN0IEFDTHMgb24gcGFnZSBsb2FkIChpbml0aWFsKS4gU2VlIGJ1ZyA4Njg3LgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlU3BsaXRUaWNrZXRQYXJhbSApCiAgICAgICAgICAgICYmICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9CiAgICAgICAgICAgICYmICEkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9OwogICAgICAgICAgICAkR2V0UGFyYW17RGVzdH0gICAgPSAkU3BsaXRUaWNrZXRQYXJhbXtGcm9tU2VsZWN0ZWR9OwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgcHJlZGVmaW5lZCBRdWV1ZUlEIChpZiBubyBxdWV1ZSBmcm9tIHNwbGl0IHRpY2tldCBpcyBzZXQpLgogICAgICAgIGVsc2lmICggISRTZWxmLT57UXVldWVJRH0gJiYgJEdldFBhcmFte0Rlc3R9ICkgewogICAgICAgICAgICBteSBAUXVldWVQYXJ0cyA9IHNwbGl0KCAvXHxcfC8sICRHZXRQYXJhbXtEZXN0fSApOwogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVQYXJ0c1swXTsKICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RGVzdH0gPSAiJEdldFBhcmFte1F1ZXVlSUR9fHwkVXNlckRlZmF1bHRRdWV1ZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZG9uJ3QgdXNlIHRoZSBzcGxpdCB0aWNrZXQgc3RhdGUsIGp1c3QgdGhlIGRlZmF1bHQKICAgICAgICBpZiAoICRDb25maWctPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICBteSAlTmV4dFN0YXRlczsKCiAgICAgICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSB8fCAxLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gPSB7IHJldmVyc2UgJU5leHRTdGF0ZXMgfS0+eyAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSB9IC8vICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzcGxpdCB0aWNrZXQgaW5mbyBmb3IgdGhlIHJlc3QKICAgICAgICBpZiAoICRTcGxpdFRpY2tldFBhcmFte1VzZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtOZXdVc2VySUR9ID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFNwbGl0ZWRQYXJhbSAocXcoVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBQcmlvcml0eUlEKSkgewogICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXskU3BsaXRlZFBhcmFtfSA9ICRTcGxpdFRpY2tldERhdGF7JFNwbGl0ZWRQYXJhbX07CiAgICAgICAgfQoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBzcGxpdCBhIFRpY2tldElEIGFuZCBBcnRpY2xlSUQgYXJlIGFsd2F5cyBnaXZlbiwgR2V0IHRoZSB2YWx1ZQogICAgICAgICAgICAjIGZyb20gREIgdGhpcyBjYXNlcwogICAgICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZWxlY3QgVGlja2V0SUQgb3IgQXJ0aWNsZUlEIHRvIGdldCB0aGUgdmFsdWUgZGVwZW5kaW5nIG9uIGR5bmFtaWMgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgbXkgJE9iamVjdElEID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnCiAgICAgICAgICAgICAgICAgICAgPyAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgIDogJEFydGljbGV7QXJ0aWNsZUlEfTsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlIChzcGxpdCkKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdGhlcndpc2UgKG9uIGEgbmV3IHRpY2tldCkuIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBkeW5hbWljIGZpZWxkIGNvbmZpZyAoaWYgYW55KQogICAgICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwoKICAgICAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKICAgICAgICAjIGdhdGhlciBmaWVsZHMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIGhpZGRlbiB3aGVuIGF1dG9zZWxlY3RlZAogICAgICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgICAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICAgICAgbXkgQEhpZGVBdXRvc2VsZWN0ZWQgPSBncmVwIHsgIXJlZiggJEF1dG9zZWxlY3QtPnskX30gKSAmJiAkQXV0b3NlbGVjdC0+eyRffSA9PSAyIH0ga2V5cyAleyRBdXRvc2VsZWN0fTsKICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIG1hcCB7ICJEeW5hbWljRmllbGRfIiAuICRfIH0KICAgICAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChASGlkZUF1dG9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAgICAgJEhpZGVBdXRvc2VsZWN0ZWRKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxASGlkZUF1dG9zZWxlY3RlZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Nlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgRGVzdCAgICAgICAgICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgTmV3UmVzcG9uc2libGVJRCAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICBOZXh0U3RhdGVJRCAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEFDTFByZXNlbGVjdGlvbiAmJiAhJEluaXRpYWxSdW4gKSB7CiAgICAgICAgICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZElEICggc29ydCBrZXlzICVDaGVjayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEZpZWxkSUQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57JEZpZWxkSUR9ICYmICRDaGFuZ2VkRWxlbWVudHN7JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBzb3J0IGtleXMgJUNoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uLT57UnVsZXN9e1RpY2tldH17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57SW50ZXJuYWxEZXBlbmRhbmN5fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRWxlbWVudCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHVuYWZmZWN0ZWQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQ2hlY2t7JEZpZWxkSUR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZvciBlYWNoIHN0YW5kYXJkIGZpZWxkIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkLCBydW4gdGhlIGRlZmluZWQgbWV0aG9kCiAgICAgICAgICAgICAgICBNRVRIT0Q6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggQHsgJFNlbGYtPntGaWVsZE1ldGhvZHN9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBNRVRIT0QgaWYgISRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfTsKCiAgICAgICAgICAgICAgICAgICAgIyB1c2UgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IGZvciBEZXN0PT5RdWV1ZUlECiAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVzeyAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfSA9ICRGaWVsZC0+e01ldGhvZH0tPigKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAgICMgbmVlZGVkIGZvciBTTEFJRAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgc3BlY2lhbCBzdHVmZiBmb3IgUXVldWVJRC9EZXN0OiBEZXN0IGlzICJRdWV1ZUlEfHxRdWV1ZU5hbWUiID0+ICJRdWV1ZU5hbWUiOwogICAgICAgICAgICAgICAgICAgIGlmICggJEZpZWxkLT57RmllbGRJRH0gZXEgJ0Rlc3QnICkgewogICAgICAgICAgICAgICAgICAgICAgICBUT3M6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAleyAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVE9zIGlmICggJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyRRdWV1ZUlEfSBlcSAnLScgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3tEZXN0fXsiJFF1ZXVlSUR8fCRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXsgJFF1ZXVlSUQgfSJ9ID0gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyRRdWV1ZUlEfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBjdXJyZW50IHNlbGVjdGlvbiBvZiBRdWV1ZUlEIChEZXN0IHdpbGwgYmUgZG9uZSB0b2dldGhlciB3aXRoIHRoZSBvdGhlciBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1F1ZXVlSUR9ICYmICEkU3RkRmllbGRWYWx1ZXN7RGVzdH17ICRHZXRQYXJhbXtEZXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkR2V0UGFyYW17UXVldWVJRH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPntEZXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgY3VycmVudCBzZWxlY3RlZCB2YWx1ZSBpcyBzdGlsbCB2YWxpZCBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfXsgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBub3QgZW1wdHkgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISVOZXdDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoICVDaGFuZ2VkRWxlbWVudHMgfHwgJEluaXRpYWxSdW4gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAlQ3VyRmllbGRTdGF0ZXMgPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkdldEZpZWxkU3RhdGVzKAogICAgICAgICAgICAgICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIENoYW5nZWRFbGVtZW50cyAgICAgICAgICAgPT4gXCVDaGFuZ2VkRWxlbWVudHMsICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCB0byByZWR1Y2UgQUNMIGV2YWx1YXRpb24KICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIyBzdG9yZSBuZXcgdmFsdWVzCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGR5bmFtaWMgZmllbGRzIGNoYW5nZWQsIGNoZWNrIHN0YW5kYXJkIGZpZWxkcyBhZ2FpbgogICAgICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMDsKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle0ZpZWxkc30gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkSW5pdGlhbFJ1biA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGRIVE1MOwogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJGkgKCAwIC4uICQjeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU2VsZi0+e0R5bmFtaWNGaWVsZH1bJGldICk7CgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGR9LT5bJGldOwoKICAgICAgICAgICAgIyBkb24ndCBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciBoaWRkZW4gZmllbGRzCiAgICAgICAgICAgIG15ICVVc2VEZWZhdWx0ID0gKCk7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifQogICAgICAgICAgICAgICAgJiYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57RmllbGRUeXBlfSBuZSAnRGF0ZScgfHwgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gbmUgJ0RhdGVUaW1lJyApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICVVc2VEZWZhdWx0ID0gKAogICAgICAgICAgICAgICAgICAgIFVzZURlZmF1bHRWYWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGVQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiBkZWZpbmVkICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRpfQogICAgICAgICAgICAgICAgPyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskaX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICA6IHVuZGVmLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgICVVc2VEZWZhdWx0LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgaWYgKAogICAgICAgICAgICByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxCiAgICAgICAgICAgICdIQVNIJwogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RGVzdH0gJiYgJEdldFBhcmFte0Rlc3R9ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkMTsKICAgICAgICAgICAgICAgIG15ICVRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkR2V0UGFyYW17UXVldWVJRH0gKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICRRdWV1ZXtFbWFpbH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkRGVidWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBteSAkTmV3UGFyYW1zID0gJE9iamVjdC0+UnVuKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgIGlmICgkTmV3UGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICROZXdQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICBteSAkU3ViamVjdCA9ICRBcnRpY2xle1N1YmplY3R9OwogICAgICAgIGlmICggISRTdWJqZWN0ICkgewogICAgICAgICAgICAkU3ViamVjdCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJEJvZHkgPSAkQXJ0aWNsZXtCb2R5fSB8fCAnJzsKICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgJEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dCAoaWYgYm9keSBpcyBiYXNlZCBvbiBjb25maWcpCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0FydGljbGVJRH0gJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEJvZHksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza0VtYWlsTmV3KAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIE5leHRTdGF0ZSAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gPyAkU3RkRmllbGRWYWx1ZXN7TmV4dFN0YXRlSUR9eyAkR2V0UGFyYW17TmV4dFN0YXRlSUR9IH0gOiAnJywKICAgICAgICAgICAgRnJvbVNlbGVjdGVkICAgICAgICAgICAgPT4gJEdldFBhcmFte0Rlc3R9LAogICAgICAgICAgICBVc2VyU2VsZWN0ZWQgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgUmVzcG9uc2libGVVc2VyU2VsZWN0ZWQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOZXh0U3RhdGVzICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7TmV4dFN0YXRlSUR9LAogICAgICAgICAgICBQcmlvcml0aWVzICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7UHJpb3JpdHlJRH0sCiAgICAgICAgICAgIFR5cGVzICAgICAgICAgICAgICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tUeXBlSUR9LAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBcyAgICAgICAgICAgICAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze1NMQUlEfSwKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZXMgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJzICAgICAgICAgICAgICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tOZXdVc2VySUR9LAogICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgIEZyb21MaXN0ICAgICAgICAgICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7RnJvbX0gLy8gJycsCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICA9PiAkQm9keSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgPT4gJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgID0+ICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyRGF0YSAgICAgICAgICAgID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBMaW5rVGlja2V0SUQgICAgICAgICAgICA9PiAkR2V0UGFyYW17TGlua1RpY2tldElEfSB8fCAnJywKICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCAgICAgICAgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICBIaWRlQXV0b3NlbGVjdGVkICAgICAgICA9PiAkSGlkZUF1dG9zZWxlY3RlZEpTT04sCiAgICAgICAgICAgIFZpc2liaWxpdHkgICAgICAgICAgICAgID0+ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSwKICAgICAgICAgICAgVGltZVVuaXRzICAgICAgICAgICAgICAgPT4gJFNlbGYtPl9HZXRUaW1lVW5pdHMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApLAogICAgICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICApLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBkZWxpdmVyIHNpZ25hdHVyZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NpZ25hdHVyZScgKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKSB8fCAnJzsKICAgICAgICBteSAkUXVldWVJRCAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1F1ZXVlSUQnICk7CiAgICAgICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgICAgIG15ICREZXN0ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgICAgICgkUXVldWVJRCkgPSBzcGxpdCggL1x8XHwvLCAkRGVzdCApOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCB3aXRoIGVtcHR5IHNpZ25hdHVyZSAobm8gcXVldWUgc2VsZWN0ZWQpIC0gaWYgd2UgaGF2ZSBhIHF1ZXVlLCBnZXQgdGhlIHNpZy4KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSAgPSAndGV4dC9odG1sJzsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRNaW1lVHlwZSAuICc7IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJFNpZ25hdHVyZSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgdGlja2V0IGFuZCBhcnRpY2xlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmVOZXcnICkgewoKICAgICAgICBteSAlRXJyb3I7CiAgICAgICAgbXkgJE5leHRTdGF0ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05leHRTdGF0ZUlEJyApIHx8ICcnOwogICAgICAgIG15ICVTdGF0ZURhdGE7CiAgICAgICAgaWYgKCROZXh0U3RhdGVJRCkgewogICAgICAgICAgICAlU3RhdGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJE5leHRTdGF0ZUlELAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkTmV4dFN0YXRlICAgICAgICA9ICRTdGF0ZURhdGF7TmFtZX07CiAgICAgICAgbXkgJE5ld1Jlc3BvbnNpYmxlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3UmVzcG9uc2libGVJRCcgKSB8fCAnJzsKICAgICAgICBteSAkTmV3VXNlcklEICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdVc2VySUQnICkgICAgICAgIHx8ICcnOwogICAgICAgIG15ICREZXN0ICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgICAgICAgICAgICAgfHwgJyc7CgogICAgICAgICMgc2VlIGlmIG9ubHkgYSBuYW1lIGhhcyBiZWVuIHBhc3NlZAogICAgICAgIGlmICggJERlc3QgJiYgJERlc3QgIX4gbXsgXEEgKFxkKyk/IFx8IFx8IC4rIFx6IH14bXMgKSB7CgogICAgICAgICAgICAjIHNlZSBpZiB3ZSBjYW4gZ2V0IGFuIElEIGZvciB0aGlzIHF1ZXVlIG5hbWUKICAgICAgICAgICAgbXkgJERlc3RJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkRGVzdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkRGVzdElEKSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICREZXN0SUQgLiAnfHwnIC4gJERlc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkRnJvbSApID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPkdldFN5c3RlbUFkZHJlc3MoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKTsKICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJFF1ZXVle0VtYWlsfTsKICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRFeHBhbmRDdXN0b21lck5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgbXkgJUZyb21FeHRlcm5hbEN1c3RvbWVyOwogICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gICAgICAgICAgICA9ICROZXdRdWV1ZUlEOwogICAgICAgICRHZXRQYXJhbXtFeHBhbmRDdXN0b21lck5hbWV9ID0gJEV4cGFuZEN1c3RvbWVyTmFtZTsKCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlcgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhclRvJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJFeHBhbmRDdXN0b21lck5hbWUkQ291bnQiICkgfHwgMDsKICAgICAgICAgICAgaWYgKCAkQ291bnQgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENvdW50ID09IDIgJiYgJEl0ZW0gKSB7CiAgICAgICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBza2lwIHZhbGlkYXRpb24gb2YgaGlkZGVuIGZpZWxkcwogICAgICAgIG15ICVWaXNpYmlsaXR5OwoKICAgICAgICAjIHRyYW5zZm9ybSBkeW5hbWljIGZpZWxkIGRhdGEgaW50byBERk5hbWUgPT4gREZOYW1lIHBhaXIKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQWNsID0gbWFwIHsgJF8tPntOYW1lfSA9PiAkXy0+e05hbWV9IH0gQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH07CgogICAgICAgICMgY2FsbCB0aWNrZXQgQUNMcyBmb3IgRHluYW1pY0ZpZWxkcyB0byBjaGVjayBmaWVsZCB2aXNpYmlsaXR5CiAgICAgICAgbXkgJEFDTFJlc3VsdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdGb3JtJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCRBQ0xSZXN1bHQpIHsKICAgICAgICAgICAgJVZpc2liaWxpdHkgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXy0+e05hbWV9ID0+IDAgfSBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfTsKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJUFjbERhdGEgKSB7CiAgICAgICAgICAgICAgICAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkIH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gPT4gMSB9IEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9OwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gaW52aXNpYmxlIGZpZWxkcwogICAgICAgICAgICBpZiAoICEkRXhwYW5kQ3VzdG9tZXJOYW1lICYmICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBwcm9wYWdhdGUgdmFsaWRhdGlvbiBlcnJvciB0byB0aGUgRXJyb3IgdmFyaWFibGUgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGZyb250ZW5kCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICAgICAgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICB8fCAnJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSAgICAgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzICAgICAgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGV4cGFuZCBjdXN0b21lciBuYW1lCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGE7CiAgICAgICAgaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDEgKSB7CgogICAgICAgICAgICAjIHNlYXJjaCBjdXN0b21lcgogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdDsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBqdXN0IG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cwogICAgICAgICAgICAjIGlmIGp1c3Qgb25lLCBmaWxsdXAgQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0gPSAwOwogICAgICAgICAgICBmb3IgbXkgJEtleUN1c3RvbWVyVXNlciAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9Kys7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9ICAgICA9ICRDdXN0b21lclVzZXJMaXN0eyRLZXlDdXN0b21lclVzZXJ9OwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0VXNlcn0gPSAkS2V5Q3VzdG9tZXJVc2VyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0gPT0gMSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gICAgICAgICAgICAgID0gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fTsKICAgICAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG1vcmUgdGhlIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cywgc2hvdyBsaXN0CiAgICAgICAgICAgICMgYW5kIGNsZWFuIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZG9uJ3QgY2hlY2sgZW1haWwgc3ludGF4IG9uIG11bHRpIGN1c3RvbWVyIHNlbGVjdAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAwCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAnJzsKCiAgICAgICAgICAgICAgICAjIGNsZWFyIHRvIGlmIHRoZXJlIGlzIG5vIGN1c3RvbWVyIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyb20gYW5kIGN1c3RvbWVyIGlkIGlmIGN1c3RvbWVyIHVzZXIgaXMgZ2l2ZW4KICAgICAgICAjIFRoaXMgaXMgdXNlZCBieSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJVc2VyCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDIgKSB7CiAgICAgICAgICAgICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEtleUN1c3RvbWVyVXNlciAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJVc2VyTGlzdHskS2V5Q3VzdG9tZXJVc2VyfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSApIHsKICAgICAgICAgICAgICAgIG15ICVFeHRlcm5hbEN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7RW1haWx9ID0gJEV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTWFpbFN0cmluZ307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBhIG5ldyBkZXN0aW5hdGlvbiBxdWV1ZSBpcyBzZWxlY3RlZAogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAzICkgewogICAgICAgICAgICAkRXJyb3J7Tm9TdWJtaXR9ID0gMTsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRTZWxlY3RlZEN1c3RvbWVyVXNlcjsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRDdXN0b21lcklEKSB7CiAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcklELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgUEFSQU1FVEVSOgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSIGlmICEkR2V0UGFyYW17JFBhcmFtZXRlcn07CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0Vycm9yVHlwZScgfSA9ICRQYXJhbWV0ZXIgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRQYXJhbWV0ZXIgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRQYXJhbWV0ZXIgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIGl0IGlzIG5vdCBhIHN1YmFjdGlvbiBhYm91dCBhdHRhY2htZW50cywgY2hlY2sgZm9yIHNlcnZlciBlcnJvcnMKICAgICAgICBpZiAoICEkRXhwYW5kQ3VzdG9tZXJOYW1lICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGVzdGluYXRpb25JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgZGF0ZSBpcyB2YWxpZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEV4cGFuZEN1c3RvbWVyTmFtZQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcGVuZGluZyBkYXRlIHRvIGEgZGF0ZXRpbWUgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIGVwb2NoCiAgICAgICAgICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IHx8ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPCAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNlcnZpY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNsYQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTTEFJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICEkR2V0UGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVHlwZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtUaW1lVW5pdHN9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgbXkgJUFydGljbGVQYXJhbTsKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJERlYnVnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU3RvcmVOZXcgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSm9ic3skSm9ifQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICAjIGFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgc3VibWl0CiAgICAgICAgICAgICAgICAjIHdpbGwgY29udGFpbiBvcHRpb25zIHRoYXQgd2VyZSBoaWRkZW4gZnJvbSB0aGUgYWdlbnQKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAUmVtb3ZlZE9wdGlvbnMgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW92ZWRPcHRpb24gKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gc2hpZnQgQFJlbW92ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdGlja2V0IHBhcmFtcwogICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkFydGljbGVPcHRpb24oICVHZXRQYXJhbSwgJUFydGljbGVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGVycm9ycwogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgIGlmICggJEVycm9ye1RvSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRFcnJvcntDY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRXJyb3J7QmNjSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQm9keSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IEJvZHkgYW5kIFN1YmplY3QgcGFyYW1ldGVycyBmb3IgT3V0cHV0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTdWJqZWN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkQm9keTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc2VydmljZXMKICAgICAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICEkU2VydmljZXMtPnsgJEdldFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaGVhZGVyIGFuZCBuYXZpZ2F0aW9uIGJhcgogICAgICAgICAgICBteSAkT3V0cHV0ID0gam9pbiAnJywKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigpLAogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza0VtYWlsTmV3KAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcnMgICA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJTZWxlY3RlZCAgICAgPT4gJE5ld1VzZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnMgPT4gJFNlbGYtPl9HZXRSZXNwb25zaWJsZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VyU2VsZWN0ZWQgPT4gJE5ld1Jlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBOZXh0U3RhdGUgID0+ICROZXh0U3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTTEFzICAgICAgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzID0+ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEN1c3RvbWVySUQgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgICAgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgRnJvbUxpc3QgICAgID0+ICRTZWxmLT5fR2V0VG9zKCksCiAgICAgICAgICAgICAgICBGcm9tU2VsZWN0ZWQgPT4gJERlc3QsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17U3ViamVjdH0gKSwKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRHZXRQYXJhbXtCb2R5fSApLAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFNpZ25hdHVyZSAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCAgICAgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICAgICBGcm9tRXh0ZXJuYWxDdXN0b21lciA9PiBcJUZyb21FeHRlcm5hbEN1c3RvbWVyLAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHRpY2tldCwgZG8gZGIgaW5zZXJ0CiAgICAgICAgbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFNMQUlEICAgICAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICBTdGF0ZUlEICAgICAgPT4gJE5leHRTdGF0ZUlELAogICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAogICAgICAgIGlmICggJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gJiYgJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHl9ICYmICEkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX0gKSB7CgogICAgICAgICAgICAjIGdldCBjb25maWcgZm9yIGNyaXRpY2FsaXR5IGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ3JpdGljYWxpdHknLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcG9zc2libGUgdmFsdWVzIGZvciBjcml0aWNhbGl0eQogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJldmVyc2UgdGhlIGxpc3QgdG8gZmluZCBvdXQgdGhlIGtleQogICAgICAgICAgICBteSAlUmV2ZXJzZUNyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSByZXZlcnNlICV7ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzIH07CgogICAgICAgICAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFJldmVyc2VDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzeyAkU2VydmljZXtDcml0aWNhbGl0eX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIEVPIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgc3ViamVjdAogICAgICAgIG15ICRUbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CiAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRuLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICc8YnIvPjxici8+JyAuICRTaWduYXR1cmU7CgogICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIHB1c2ggQE5ld0F0dGFjaG1lbnREYXRhLCBcJXskQXR0YWNobWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICJcblxuIiAuICRTaWduYXR1cmU7CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cCBzZW5kZXIKICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgICAgICBteSAkU2VuZGVyICAgICAgICAgICAgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNlbmRlcigKICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0VtYWlsJyApOwoKICAgICAgICAjIHNlbmQgZW1haWwKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlU2VuZCgKICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSAgICAgICAgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgIEF0dGFjaG1lbnQgICAgICAgICAgID0+IFxAQXR0YWNobWVudERhdGEsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkQ29uZmlnLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkU2VuZGVyLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9CiAgICAgICAgICAgICAgICB8fCAiXCVcJSRHZXRQYXJhbXtUb30sICRHZXRQYXJhbXtDY30sICRHZXRQYXJhbXtCY2N9IiwKICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmlzaWJpbGl0eXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUtc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBkZWxldGUgaGlkZGVuIGZpZWxkcyBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJ0hpZGRlbkZpZWxkcycsCiAgICAgICAgICAgIEtleSAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgbGluayB0aWNrZXRzCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17TGlua1RpY2tldElEfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9CiAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEdldFBhcmFte0xpbmtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkIHJvIHBlcm1pc3Npb24hIiwKICAgICAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNvdXJjZUtleSA9ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9OwogICAgICAgICAgICBteSAkVGFyZ2V0S2V5ID0gJFRpY2tldElEOwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0tPntEaXJlY3Rpb259IGVxICdTb3VyY2UnICkgewogICAgICAgICAgICAgICAgJFNvdXJjZUtleSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgPSAkR2V0UGFyYW17TGlua1RpY2tldElEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBsaW5rIHRoZSB0aWNrZXRzCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0xpbmtUeXBlfSB8fCAnTm9ybWFsJywKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IG93bmVyIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoJE5ld1VzZXJJRCkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJE5ld1VzZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVsc2Ugc2V0IG93bmVyIHRvIGN1cnJlbnQgYWdlbnQgYnV0IGRvIG5vdCBsb2NrIGl0CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBTZW5kTm9Ob3RpZmljYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCByZXNwb25zaWJsZSAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgaWYgKCROZXdSZXNwb25zaWJsZUlEKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2xvc2VkIHRpY2tldHMgZ2V0IHVubG9ja2VkCiAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CgogICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiAgICAgICAgaWYgKCAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wb3JhcmlseSBsaW5rcwogICAgICAgICAgICBteSAkVGVtcExpbmtMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3QoCiAgICAgICAgICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgU3RhdGUgID0+ICdUZW1wb3JhcnknLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFRlbXBMaW5rTGlzdCAmJiByZWYgJFRlbXBMaW5rTGlzdCBlcSAnSEFTSCcgJiYgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldE9iamVjdE9yZyAoIHNvcnQga2V5cyAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdHlwZWxpc3QKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZUxpc3QgPSAkVGVtcExpbmtMaXN0LT57JFRhcmdldE9iamVjdE9yZ307CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAoIHNvcnQga2V5cyAleyRUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkVHlwZUxpc3QtPnskVHlwZX07CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldEtleU9yZyAoIHNvcnQga2V5cyAleyAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB0ZW1wIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkxICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAkVGFyZ2V0T2JqZWN0T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRUYXJnZXRLZXlPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0S2V5ICAgID0gJFRpY2tldElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREaXJlY3Rpb24gZXEgJ1RhcmdldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSAgICA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldE9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBlcm1hbmVudGx5IGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAkU291cmNlT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRUYXJnZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKCiAgICAgICAgIyBnZXQgcmVkaXJlY3Qgc2NyZWVuCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e1Nlc3Npb259e1VzZXJDcmVhdGVOZXh0TWFza30gfHwgJ0FnZW50VGlja2V0RW1haWwnOwoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSROZXh0U2NyZWVuO1N1YmFjdGlvbj1DcmVhdGVkO1RpY2tldElEPSRUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICBteSAkRGVzdCAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICk7CiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApIHx8ICcnOwoKICAgICAgICAjIGdldCBGcm9tIGJhc2VkIG9uIHNlbGVjdGVkIHF1ZXVlCiAgICAgICAgbXkgJFF1ZXVlSUQgPSAnJzsKICAgICAgICBpZiAoICREZXN0ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJDE7CiAgICAgICAgICAgIG15ICVRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkUXVldWVJRCApOwogICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkUXVldWV7RW1haWx9OwogICAgICAgIH0KICAgICAgICAkR2V0UGFyYW17RGVzdH0gICAgPSAkRGVzdDsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVJRDsKCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkQXV0b3NlbGVjdCA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBdXRvc2VsZWN0JykgfHwgdW5kZWY7CiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzICAgICAgICA9ICRFbGVtZW50Q2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gJEVsZW1lbnRDaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKCAkRWxlbWVudENoYW5nZWQgPT4gMSApIDogKCk7CiAgICAgICAgbXkgJUNoYW5nZWRTdGRGaWVsZHMgICAgICAgPSAkRWxlbWVudENoYW5nZWQgJiYgJEVsZW1lbnRDaGFuZ2VkICF+IC9eRHluYW1pY0ZpZWxkXy8gPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKCiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwogICAgICAgIG15ICVTdGRGaWVsZFZhbHVlczsKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgICAgIFZpc2liaWxpdHkgPT4ge30sCiAgICAgICAgICAgIEZpZWxkcyAgICAgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHN0YW5kYXJkIGZpZWxkIGlucHV0CiAgICAgICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gKSB7CgogICAgICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICAgICAjIHdoaWNoIHN0YW5kYXJkIGZpZWxkcyB0byBjaGVjayAtIEZpZWxkSUQgPT4gR2V0UGFyYW1WYWx1ZSAobmVjY2Vzc2FyeSBmb3IgRGVzdCkKICAgICAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgICAgICBEZXN0ICAgICAgICAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBOZXdSZXNwb25zaWJsZUlEICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICAgICAgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJEdldFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7U2VydmljZUlEfSB8fCB1bmRlZiwgICAgIyBuZWVkZWQgZm9yIFNMQUlECiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9IGVxICctJyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyIkUXVldWVJRHx8JFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyAkUXVldWVJRCB9In0gPSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gJiYgISRTdGRGaWVsZFZhbHVlc3tEZXN0fXsgJEdldFBhcmFte0Rlc3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICAgICAgICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJU5ld0NoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gJU5ld0NoYW5nZWRFbGVtZW50czsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCwKICAgICAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRMb29wUHJvdGVjdGlvbi0tIDwgMSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJhbiBpbnRvIHVucmVzb2x2YWJsZSBsb29wISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzICAgICAgICA9ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgpOwoKICAgICAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBteSAlQ3VyRmllbGRTdGF0ZXM7CiAgICAgICAgICAgIGlmICglQ2hhbmdlZEVsZW1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAlQ3VyRmllbGRTdGF0ZXMgPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkdldEZpZWxkU3RhdGVzKAogICAgICAgICAgICAgICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIENoYW5nZWRFbGVtZW50cyAgICAgICAgICAgPT4gXCVDaGFuZ2VkRWxlbWVudHMsICAgICAgICAgICAgIyBvcHRpb25hbCB0byByZWR1Y2UgQUNMIGV2YWx1YXRpb24KICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjb21iaW5lIEZpZWxkU3RhdGVzCiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgZHluYW1pYyBmaWVsZHMgY2hhbmdlZCwgY2hlY2sgc3RhbmRhcmQgZmllbGRzIGFnYWluCiAgICAgICAgICAgIGlmICggJUN1ckZpZWxkU3RhdGVzICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSApICkgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAwOwogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9IG1hcCB7ICRfID0+IDEgfSBrZXlzICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7RmllbGRzfSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBEeW5hbWljIEZpZWxkcyBQb3NzaWJsZSBWYWx1ZXMgdmlhIEFKQVgKICAgICAgICBteSBARHluYW1pY0ZpZWxkQUpBWDsKCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkSW5kZXggKCBzb3J0IGtleXMgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+WyRJbmRleF07CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRJbmRleH17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICAgICAgPyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9CiAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskSW5kZXh9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHx8ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRJbmRleH17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ICkgKSB7CiAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3RyaWN0aW9uc19WaXNpYmlsaXR5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBBSkFYIHJldHVybiBmb3IgdGhlIHN0YW5kYXJkIGZpZWxkcwogICAgICAgIG15IEBTdGRGaWVsZEFKQVg7CiAgICAgICAgbXkgJUF0dHJpYnV0ZXMgPSAoCiAgICAgICAgICAgIERlc3QgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOZXdVc2VySUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU0xBSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVHlwZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgICAgICBkZWxldGUgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9OwogICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJVN0ZEZpZWxkVmFsdWVzICkgewogICAgICAgICAgICBwdXNoIEBTdGRGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7JEZpZWxkfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFteyRGaWVsZH0sCiAgICAgICAgICAgICAgICAleyAkQXR0cmlidXRlc3skRmllbGR9IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwoKICAgICAgICAjIHVwZGF0ZSB0aWNrZXQgYm9keSBhbmQgYXR0YWNoZW1lbnRzIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRDaGFuZ2VkU3RkRmllbGRze1N0YW5kYXJkVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgIG15IEBUaWNrZXRBdHRhY2htZW50czsKICAgICAgICAgICAgbXkgJFRlbXBsYXRlVGV4dDsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBhdHRhY2htZW50cyBmcm9tIHRoZSBVcGxvYWQgY2FjaGUKICAgICAgICAgICAgbXkgJFJlbW92ZVN1Y2Nlc3MgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSZW1vdmVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRm9ybSBhdHRhY2htZW50cyBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBsYXRlIHRleHQgYW5kIHNldCBuZXcgYXR0YWNobWVudHMgaWYgYSB0ZW1wbGF0ZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoIElzUG9zaXRpdmVJbnRlZ2VyKCAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSApICkgewogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBTdGRBdHRhY2htZW50T2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CgogICAgICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlbmQgYSBsaXN0IG9mIGF0dGFjaG1lbnRzIGluIHRoZSB1cGxvYWQgY2FjaGUgYmFjayB0byB0aGUgY2xpZW50c2lkZSBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAjIHdoaWNoIHJlbmRlcnMgdGhlbiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgdXBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEBUaWNrZXRBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQFRpY2tldEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0gPSAkTGF5b3V0T2JqZWN0LT5IdW1hblJlYWRhYmxlRGF0YVNpemUoCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPT4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZUNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15IEBFeHRlbmRlZERhdGE7CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIG5leHQgSk9CIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIERlYnVnID0+ICREZWJ1ZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRNdWx0aXBsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkT2JqZWN0LT5EYXRhKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgICMgZ2V0IEFKQVggcGFyYW0gdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0UGFyYW1BSkFYJykgKSB7CiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtID0gKCAlR2V0UGFyYW0sICRPYmplY3QtPkdldFBhcmFtQUpBWCglR2V0UGFyYW0pICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgb3B0aW9ucyB0aGF0IGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3Rpb24gdmlzaWJsZQogICAgICAgICAgICAgICAgIyB0byB0aGUgYWdlbnQuIFRoZXNlIG9wdGlvbnMgd2lsbCBiZSBhZGRlZCBhZ2FpbiBvbiBzdWJtaXQuCiAgICAgICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgICAgIG15IEBPcHRpb25zVG9SZW1vdmUgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkT3B0aW9uVG9SZW1vdmUgKEBPcHRpb25zVG9SZW1vdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyRPcHRpb25Ub1JlbW92ZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAkTXVsdGlwbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NpZ25hdHVyZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAU3RkRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFN1YmFjdGlvbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtPd25lckFsbH0gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkS2V5R3JvdXBNZW1iZXIgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkS2V5R3JvdXBNZW1iZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSBvd25lciBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skS2V5TWVtYmVyfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UmVzcG9uc2libGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1Jlc3BvbnNpYmxlQWxsfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRLZXlHcm91cE1lbWJlciApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRLZXlHcm91cE1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJlc3BvbnNpYmxlIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleU1lbWJlciAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2UgZGVmYXVsdCBRdWV1ZSBpZiBub25lIGlzIHByb3ZpZGVkCiAgICAkUGFyYW17UXVldWVJRH0gPSAkUGFyYW17UXVldWVJRH0gfHwgMTsKCiAgICAjIGdldCBwcmlvcml0eQogICAgbXkgJVByaW9yaXRpZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyB1c2UgZGVmYXVsdCBRdWV1ZSBpZiBub25lIGlzIHByb3ZpZGVkCiAgICAkUGFyYW17UXVldWVJRH0gPSAkUGFyYW17UXVldWVJRH0gfHwgMTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHNlcnZpY2VzIGlmIHRoZXkgd2VyZSBub3QgZGV0ZXJtaW5lZCBpbiBhbiBBSkFYIGNhbGwKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1NlcnZpY2VzfSApIHsKICAgICAgICAkUGFyYW17U2VydmljZXN9ID0gJFNlbGYtPl9HZXRTZXJ2aWNlcyglUGFyYW0pOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJU5ld1RvcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3M7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICVUb3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPk1vdmVMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVG9zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc1F1ZXVlTGlzdCgpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nCiAgICAgICAgUVVFVUVJRDoKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVRvcyApIHsKCiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgIGlmICggISRRdWV1ZURhdGF7Q29tbWVudH0gKSB7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwoKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTaWduYXR1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgIG15ICRTaWduYXR1cmUgICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgIERhdGEgICAgPT4gXCVQYXJhbSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTaWduYXR1cmU7Cn0KCnN1YiBfR2V0VGltZVVuaXRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEFjY291bnRlZFRpbWUgPSAnJzsKCiAgICAjIEdldCBhY2NvdW50ZWQgdGltZSBpZiBBY2NvdW50VGltZSBjb25maWcgaXRlbSBpcyBlbmFibGVkLgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgJiYgZGVmaW5lZCAkUGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICAkQWNjb3VudGVkVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QXJ0aWNsZUFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkQWNjb3VudGVkVGltZSA/ICRBY2NvdW50ZWRUaW1lIDogJyc7Cn0KCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGVtcGxhdGVzOwogICAgbXkgJFF1ZXVlSUQgPSAkUGFyYW17UXVldWVJRH0gfHwgJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgbXkgJFVzZXJEZWZhdWx0UXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlVzZXJEZWZhdWx0UXVldWUnKSB8fCAnJzsKCiAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFVzZXJEZWZhdWx0UXVldWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFF1ZXVlSUQgJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgaWYgKCAhJFF1ZXVlSUQgJiYgJFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBnZXQgUXVldWVJRCBmcm9tIHRoZSB0aWNrZXQKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRRdWV1ZUlEID0gJFRpY2tldHtRdWV1ZUlEfSB8fCAnJzsKICAgIH0KCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrRW1haWxOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2V0IEpTIGRhdGEKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgU2hvd0N1c3RvbWVyVGlja2V0cyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlNob3dDdXN0b21lclRpY2tldHMnKSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtIaWRlQXV0b3NlbGVjdGVkfSApIHsKCiAgICAgICAgIyBhZGQgQXV0b3NlbGVjdCBKUwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTT25Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBDb2RlID0+ICJDb3JlLkZvcm0uSW5pdEhpZGVBdXRvc2VsZWN0ZWQoeyBGaWVsZElEczogJFBhcmFte0hpZGVBdXRvc2VsZWN0ZWR9IH0pOyIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHN0cmluZwogICAgJFBhcmFte09wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtVc2Vyc30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICApOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte05leHRTdGF0ZX0gfHwgJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0sCiAgICApOwoKICAgICMgYnVpbGQgRGVzdGluYXRpb24gc3RyaW5nCiAgICBteSAlTmV3VG87CiAgICBpZiAoICRQYXJhbXtGcm9tTGlzdH0gKSB7CiAgICAgICAgZm9yIG15ICRLZXlGcm9tICggc29ydCBrZXlzICV7ICRQYXJhbXtGcm9tTGlzdH0gfSApIHsKICAgICAgICAgICAgJE5ld1RveyIkS2V5RnJvbXx8JFBhcmFte0Zyb21MaXN0fS0+eyRLZXlGcm9tfSJ9ID0gJFBhcmFte0Zyb21MaXN0fS0+eyRLZXlGcm9tfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17RnJvbVNlbGVjdGVkfSApIHsKICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwoKICAgICAgICBpZiAoJFVzZXJEZWZhdWx0UXVldWUpIHsKICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAgICAgJFBhcmFte0Zyb21TZWxlY3RlZH0gPSAiJFF1ZXVlSUR8fCRVc2VyRGVmYXVsdFF1ZXVlIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAkUGFyYW17RnJvbVN0cmd9ID0gJExheW91dE9iamVjdC0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPntEZXN0aW5hdGlvbkludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtGcm9tU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPntEZXN0aW5hdGlvbkludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgVHJlZVZpZXcgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0N1c3RvbWVyRGF0YX0sCiAgICAgICAgICAgIE1heCAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlTWF4U2l6ZScpLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEtleUVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5RXJyb3J9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRLZXlFcnJvcn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBGcm9tIGV4dGVybmFsCiAgICBteSAkU2hvd0Vycm9ycyA9IDE7CiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9ICYmCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57RW1haWx9ICYmCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57Q3VzdG9tZXJ9CiAgICAgICAgKQogICAgewogICAgICAgICRTaG93RXJyb3JzID0gMDsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRnJvbUV4dGVybmFsQ3VzdG9tZXInLAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRGF0YUVtYWlsJywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0VtYWlsfSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0RhdGFDdXN0b21lcicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0tPntDdXN0b21lcn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSB9ICkgewogICAgICAgICAgICBpZiAoICEkU2hvd0Vycm9ycyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBlbXB0eSB2YWx1ZXMgZm9yIGVycm9ycwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yfSAgICA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckRpc2FibGVkfSA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJDYysrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyQ2MgKSB7CiAgICAgICAgJFBhcmFte0NjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQ2MrKywKICAgICAgICB9LAogICAgKTsKCiAgICAjIEJjYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJCY2MgKSB7CiAgICAgICAgJFBhcmFte0JjY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJCY2MrKywKICAgICAgICB9LAogICAgKTsKCiAgICAjIFRvCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSB9ICkgewogICAgICAgICAgICBpZiAoICEkU2hvd0Vycm9ycyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBlbXB0eSB2YWx1ZXMgZm9yIGVycm9ycwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yfSAgICA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckRpc2FibGVkfSA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIrKywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtUb0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnVG9TZXJ2ZXJFcnJvck1zZycgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtUb0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17Q2NJbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIGlmICggJFBhcmFte0JjY0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JjY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtCY2NJbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMQogICAgKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdEeW5hbWljRmllbGROYW1lcycsCiAgICAgICAgVmFsdWUgPT4gJER5bmFtaWNGaWVsZE5hbWVzLAogICAgKTsKCiAgICAjIGJ1aWxkIHR5cGUgc3RyaW5nCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtUeXBlc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBzZXJ2aWNlIHN0cmluZwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgID0+ICRQYXJhbXtTZXJ2aWNlc30sCiAgICAgICAgICAgIE5hbWUgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplICcKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2VydmljZU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17U0xBc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgJwogICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTTEFNYW5kYXRvcnl9ID8gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgOiAnJyApCiAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTTEFJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU0xBTWFuZGF0b3J5ID0+ICRDb25maWctPntTTEFNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGV4aXN0cyBjcmVhdGUgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpLT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIFR5cGUgID0+ICdDcmVhdGUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CiAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfSB8fCB7fSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICBpZiAoICEkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5fSA9ICRDb25maWctPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17UHJpb3JpdGllc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkUGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIERpZmZUaW1lICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICcgJywKICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICA9PiAxLAogICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICApOwoKICAgICMgc2hvdyBvd25lciBzZWxlY3Rpb24KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdPd25lclNlbGVjdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lclNlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyByZXNwb25zaWJsZSBzZWxlY3Rpb24KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UmVzcG9uc2libGVTZWxlY3Rpb24nKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30tPnsnJ30gPSAnLSc7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlT3B0aW9uU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlclNlbGVjdGVkfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgIG15ICVIaWRkZW47CgogICAgICAgICMgaGlkZSBmaWVsZAogICAgICAgIGlmICggISRQYXJhbXtWaXNpYmlsaXR5fXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9ICkgewogICAgICAgICAgICAlSGlkZGVuID0gKAogICAgICAgICAgICAgICAgSGlkZGVuQ2xhc3MgPT4gJyBvb29BQ0xIaWRkZW4nLAogICAgICAgICAgICAgICAgSGlkZGVuU3R5bGUgPT4gJ3N0eWxlPWRpc3BsYXk6bm9uZTsnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBBQ0wgaGlkZGVuIGZpZWxkcyBjYW5ub3QgYmUgbWFuZGF0b3J5CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9ID1+IHMvKGNsYXNzPS4rP1ZhbGlkYXRlX1JlcXVpcmVkKS8kMV9JZlZpc2libGUvZzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgICVIaWRkZW4sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgICVIaWRkZW4sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cgdGhlIGN1c3RvbWVyIHVzZXIgYWRkcmVzcyBib29rIGlmIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZCBhbmQgamF2YSBzY3JpcHQgc3VwcG9ydCBpcyBhdmFpbGFibGUuCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudEN1c3RvbWVyVXNlckFkZHJlc3NCb29rfQogICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9CiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtPcHRpb25DdXN0b21lclVzZXJBZGRyZXNzQm9va30gPSAxOwogICAgfQoKICAgICMgc2hvdyBjdXN0b21lciBlZGl0IGxpbmsKICAgIG15ICRPcHRpb25DdXN0b21lciA9ICRMYXlvdXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICApOwoKICAgIG15ICRTaG93bk9wdGlvbnNCbG9jazsKCiAgICBpZiAoJE9wdGlvbkN1c3RvbWVyKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3B0aW9uQ3VzdG9tZXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiAgICAjIG1ha2Ugc3VyZSB0byBzaG93IHRoZSBvcHRpb25zIGJsb2NrIHNvIHRoYXQgdGhlICJMaW5rIFRpY2tldCIgb3B0aW9uIGlzIHNob3duCiAgICAjIGV2ZW4gaWYgc3BlbGxjaGVja2VyLCBhZGRyZXNzIGJvb2sgYW5kIE9wdGlvbkN1c3RvbWVyIGlzIHR1cm5lZCBvZmYKICAgIGlmICggJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gJiYgISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICB9CiMgRU8gSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICB9CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0RW1haWwnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgX0dldEZpZWxkc1RvVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFVwZGF0YWJsZUZpZWxkczsKCiAgICAjIHNldCB0aGUgZmllbGRzIHRoYXQgYXJlIHVwZGF0ZWFibGUgdmlhIEFKQVhVcGRhdGUKICAgIGlmICggISRQYXJhbXtPbmx5RHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgQFVwZGF0YWJsZUZpZWxkcyA9IHF3KAogICAgICAgICAgICBUeXBlSUQKICAgICAgICAgICAgRGVzdAogICAgICAgICAgICBOZXh0U3RhdGVJRAogICAgICAgICAgICBQcmlvcml0eUlECiAgICAgICAgICAgIFNlcnZpY2VJRAogICAgICAgICAgICBTTEFJRAogICAgICAgICAgICBTaWduS2V5SUQKICAgICAgICAgICAgQ3J5cHRLZXlJRAogICAgICAgICAgICBUbwogICAgICAgICAgICBDYwogICAgICAgICAgICBCY2MKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlECiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmailOutbound.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBNYWlsOjpBZGRyZXNzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIFRyeSB0byBsb2FkIGRyYWZ0IGlmIHJlcXVlc3RlZC4KICAgIGlmICgKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpLT57Rm9ybURyYWZ0fQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2FkRm9ybURyYWZ0JyApCiAgICAgICAgJiYgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5Mb2FkRm9ybURyYWZ0KAogICAgICAgICAgICBGb3JtRHJhZnRJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybURyYWZ0SUQnICksCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAnLScsCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlQWNsQWN0aW9uICkgKSB7CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggZGVmaW5lZCAkQWNsQWN0aW9ueyAkU2VsZi0+e0FjdGlvbn0gfSAmJiAkQWNsQWN0aW9ueyAkU2VsZi0+e0FjdGlvbn0gfSBlcSAnMCcgKSB7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgZm9yIGZhaWxlZCBkcmFmdCBsb2FkaW5nIHJlcXVlc3QuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xvYWRGb3JtRHJhZnQnICkKICAgICAgICAmJiAhJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTG9hZGluZyBkcmFmdCBmYWlsZWQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZW5kRW1haWwnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPlNlbmRFbWFpbCgpOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGVUZW1wbGF0ZScgKSB7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgICAgIHF3KAogICAgICAgICAgICAgICAgTmV3U3RhdGVJRCBOZXdQcmlvcml0eUlEIFRpbWVVbml0cyBJc1Zpc2libGVGb3JDdXN0b21lciBUaXRsZSBCb2R5IFN1YmplY3QgTmV3UXVldWVJRAogICAgICAgICAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZCBSZXBseVRvQXJ0aWNsZSBTdGFuZGFyZFRlbXBsYXRlSUQgQ3JlYXRlQXJ0aWNsZQogICAgICAgICAgICAgICAgRm9ybUlEIEVsZW1lbnRDaGFuZ2VkCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVRpY2tldCAgICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFRpY2tldHtDdXN0b21lclVzZXJJRH07CiAgICAgICAgbXkgJFF1ZXVlSUQgICAgICA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICApOwoKICAgICAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFRlbXBsYXRlQUpBWDsKCiAgICAgICAgIyBnZXQgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2htZW50cyBpZiBuZWVkZWQuCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTdGFuZGFyZFRlbXBsYXRlSUQnICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJEdldFBhcmFte0Zvcm1JRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSZW1vdmVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRm9ybSBhdHRhY2htZW50cyBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBsYXRlIHRleHQgYW5kIHNldCBuZXcgYXR0YWNobWVudHMgaWYgYSB0ZW1wbGF0ZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgU3RkQXR0YWNobWVudE9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwoKICAgICAgICAgICAgICAgICMgYWRkIHN0ZC4gYXR0YWNobWVudHMgdG8gdGlja2V0CiAgICAgICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRJRCApOwogICAgICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJEdldFBhcmFte0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnQgc2lkZSBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAjIHdoaWNoIHJlbmRlcnMgdGhlbiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgdXBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEBUaWNrZXRBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkR2V0UGFyYW17Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAVGlja2V0QXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9ICRMYXlvdXRPYmplY3QtPkh1bWFuUmVhZGFibGVEYXRhU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCB0aGUgZmlyc3QgYXJ0aWNsZSBvZiB0aGUgdGlja2V0LgogICAgICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgICAgICAgICAgbXkgQE1ldGFBcnRpY2xlcyAgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgT25seUZpcnN0ID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyAkTWV0YUFydGljbGVzWzBdIH0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgICV7ICRNZXRhQXJ0aWNsZXNbMF0gfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBzaWduYXR1cmUgZm9yIHRoZSBjdXJyZW50IHVzZXIKICAgICAgICAgICAgbXkgJFNpZ25hdHVyZSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYXBwZW5kIHRoZSBzaWduYXR1cmUgdG8gdGhlIGJvZHkgdGV4dAogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZVRleHQgLiAnPGJyPjxicj4nIC4gJFNpZ25hdHVyZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVUZXh0IC4gIlxuXG4iIC4gJFNpZ25hdHVyZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZU5vdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVGlja2V0QXR0YWNobWVudHMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAVGlja2V0QXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgS2VlcERhdGEgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRDb25maWctPntTdGF0ZURlZmF1bHR9ID8gMCA6IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCwKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT5BamF4VXBkYXRlKCk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+U2VuZEVtYWlsKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPkZvcm0oKTsKICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIEZvcm0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3I7CiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW07CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgJEFDTENvbXBhdEdldFBhcmFte05leHRTdGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXh0U3RhdGVJRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnR290IG5vIFRpY2tldElEIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnU3lzdGVtIEVycm9yIScpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgIyBnZXQgdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgIG15ICVHZXRQYXJhbUV4dGVuZGVkID0gJFNlbGYtPl9HZXRFeHRlbmRlZFBhcmFtcygpOwoKICAgIG15ICVHZXRQYXJhbSAgICAgICAgICAgID0gJXsgJEdldFBhcmFtRXh0ZW5kZWR7R2V0UGFyYW19IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lciAgICA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJ9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjICA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJDY30gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lckJjY30gfTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CgogICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRMb2NrKSB7CgogICAgICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJldmlvdXNPd25lcn0gPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTaG93IGxvY2sgc3RhdGUuCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICVEYXRhOwoKICAgICMgR2V0IHNlbGVjdGVkIGFydGljbGUuCiAgICBpZiAoICRHZXRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgKTsKICAgICAgICAlRGF0YSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgYXJ0aWNsZSBpcyBmcm9tIHRoZSBzYW1lIFRpY2tldElEIGFzIHdlIGNoZWNrZWQgcGVybWlzc2lvbnMgZm9yLgogICAgICAgIGlmICggJERhdGF7VGlja2V0SUR9IG5lICRTZWxmLT57VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdBcnRpY2xlIGRvZXMgbm90IGJlbG9uZyB0byB0aWNrZXQgJXMhJywgJFNlbGYtPntUaWNrZXRJRH0gKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgdGhlIGxhc3QgY3VzdG9tZXIgYXJ0aWNsZSBvZiB0aGUgdGlja2V0LgogICAgZWxzZSB7CiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICAgICAgbXkgQE1ldGFBcnRpY2xlcyAgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmIChATWV0YUFydGljbGVzKSB7CiAgICAgICAgICAgICVEYXRhID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyAkTWV0YUFydGljbGVzWzBdIH0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgJXsgJE1ldGFBcnRpY2xlc1swXSB9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgICREYXRhe1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZUlEID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgRGF0YSAgICAgID0+IFwlRGF0YSwKICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICRHZXRQYXJhbXtFbWFpbFRlbXBsYXRlSUR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZQogICAgICAgICREYXRhe1N0ZFRlbXBsYXRlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17RW1haWxUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNpZ25hdHVyZQogICAgICAgICREYXRhe1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBlbXB0eSB0aGUgYm9keSBmb3IgcHJlcGFyYXRpb24KICAgICREYXRhe0JvZHl9ID0gJyc7CgogICAgIyBwcmVwYXJlIGJvZHkgZm9yIHJpY2h0ZXh0IG9yIHBsYWludGV4dCBjb250ZW50CiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIGFkZCB0aGUgdGVtcAogICAgICAgIGlmICggJEdldFBhcmFte0VtYWlsVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7U3RkVGVtcGxhdGV9IC4gJzxici8+JyAuICREYXRhe0JvZHl9OwogICAgICAgIH0KCiAgICAgICAgJERhdGF7Qm9keX0gPSAkRGF0YXtCb2R5fSAuICREYXRhe1NpZ25hdHVyZX07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgdGhlIHRlbXAKICAgICAgICBpZiAoICRHZXRQYXJhbXtFbWFpbFRlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICREYXRhe1N0ZFRlbXBsYXRlfSAuICJcbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CgogICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7Qm9keX0gLiAkRGF0YXtTaWduYXR1cmV9OwoKICAgICAgICAjIHByZXBhcmUgYm9keSBmb3IgcGxhaW4gdGV4dAogICAgICAgICREYXRhe0JvZHl9ID1+IHMvXHQvIC9nOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byBlbWFpbAogICAgaWYgKCAkR2V0UGFyYW17RW1haWxUZW1wbGF0ZUlEfSApIHsKICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte0VtYWlsVGVtcGxhdGVJRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJElEICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkSUQgKTsKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRHZXRQYXJhbXtGb3JtSUR9LAogICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEF0dGFjaG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgIEZvcm1JRCA9PiAkR2V0UGFyYW17Rm9ybUlEfSwKICAgICk7CgogICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgZm9yIG15ICRSZWNpcGllbnQgKHF3KFRvIENjIEJjYyBTdWJqZWN0KSkgewogICAgICAgIGlmICggJERhdGF7JFJlY2lwaWVudH0gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskUmVjaXBpZW50fTsKICAgICAgICB9CiAgICB9CgogICAgIyBwdXQgJiBnZXQgYXR0cmlidXRlcyBsaWtlIHNlbmRlciBhZGRyZXNzCiAgICAlRGF0YSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+QXR0cmlidXRlcygKICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIERhdGEgICAgICA9PiBcJURhdGEsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBwcmVwYXJlIHRoZSBzdWJqZWN0CiAgICAkRGF0YXtTdWJqZWN0fSA9fiBzeyBcQSAoPzogLio/IDogXHMqKSB9e314bXM7CgogICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICBpZiAoIHJlZiggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpICkgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIHVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkVGlja2V0e1F1ZXVlSUR9OwoKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJE5ld1BhcmFtcyA9ICRPYmplY3QtPlJ1biggJURhdGEsICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoJE5ld1BhcmFtcykgewogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJE5ld1BhcmFtczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICVFcnJvciA9ICggJUVycm9yLCAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBIVE1MIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgbXkgJFZhbHVlOwoKICAgICAgICAjIG9ubHkgZ2V0IHZhbHVlcyBmb3IgVGlja2V0IGZpZWxkcyAoYWxsIHNjcmVlbnMgYmFzZWQgb24gQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICAgICAjIGNyZWF0ZSBhIG5ldyBhcnRpY2xlLCB0aGVuIGFydGljbGUgZmllbGRzIHdpbGwgYmUgYWx3YXlzIGVtcHR5IGF0IHRoZSBiZWdpbm5pbmcpCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgKSB7CgogICAgICAgICAgICAjIGdldCB2YWx1ZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlIGZyb20gVGlja2V0CiAgICAgICAgICAgICRWYWx1ZSA9ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZmllbGQgSFRNTAogICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4KICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCB2aWV3IC4uLgogICAgIyBzdGFydCB3aXRoIHBhZ2UgLi4uCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgKTsKCiAgICAjIEluZm9ybSBhIHVzZXIgdGhhdCBhcnRpY2xlIHN1YmplY3Qgd2lsbCBiZSBlbXB0eSBpZiBjb250YWlucyBvbmx5IHRoZSB0aWNrZXQgaG9vayAoaWYgbm90aGluZyBpcyBtb2RpZmllZCkuCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBEYXRhID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXJ0aWNsZSBzdWJqZWN0IHdpbGwgYmUgZW1wdHkgaWYgdGhlIHN1YmplY3QgY29udGFpbnMgb25seSB0aGUgdGlja2V0IGhvb2shJyksCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgVGlja2V0SUQgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFRpdGxlICAgICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBOZXh0U3RhdGVzICAgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICApLAogICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICA6ICcnCiAgICAgICAgKSwKICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgJURhdGEsCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIER5bmFtaWNGaWVsZEhUTUwgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBTZW5kRW1haWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3I7CiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW07CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgJEFDTENvbXBhdEdldFBhcmFte05leHRTdGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXh0U3RhdGVJRCcgKTsKCiAgICBteSAlR2V0UGFyYW1FeHRlbmRlZCA9ICRTZWxmLT5fR2V0RXh0ZW5kZWRQYXJhbXMoKTsKCiAgICBteSAlR2V0UGFyYW0gICAgICAgICAgICA9ICV7ICRHZXRQYXJhbUV4dGVuZGVke0dldFBhcmFtfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXIgICAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYyAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQ2N9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYyA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJCY2N9IH07CgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIEdldCBhbmQgdmFsaWRhdGUgZHJhZnQgYWN0aW9uLgogICAgbXkgJEZvcm1EcmFmdEFjdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRBY3Rpb24nICk7CiAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gJiYgISRDb25maWctPntGb3JtRHJhZnR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0Zvcm1EcmFmdCBmdW5jdGlvbmFsaXR5IGRpc2FibGVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlRm9ybURyYWZ0UmVzcG9uc2U7CgogICAgIyBDaGVjayBkcmFmdCBuYW1lLgogICAgaWYgKAogICAgICAgICRGb3JtRHJhZnRBY3Rpb24KICAgICAgICAmJiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgfHwgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJyApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRUaXRsZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRUaXRsZScgKTsKCiAgICAgICAgIyBBIGRyYWZ0IG5hbWUgaXMgcmVxdWlyZWQuCiAgICAgICAgaWYgKCAhJFRpdGxlICkgewoKICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoIkRyYWZ0IG5hbWUgaXMgcmVxdWlyZWQhIiksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENob3NlbiBkcmFmdCBuYW1lIG11c3QgYmUgdW5pcXVlLgogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkRm9ybURyYWZ0TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0TGlzdEdldCgKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgRFJBRlQ6CiAgICAgICAgICAgIGZvciBteSAkRm9ybURyYWZ0ICggQHskRm9ybURyYWZ0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgIyBObyBleGlzdGluZyBkcmFmdCB3aXRoIHNhbWUgbmFtZS4KICAgICAgICAgICAgICAgIG5leHQgRFJBRlQgaWYgJFRpdGxlIG5lICRGb3JtRHJhZnQtPntUaXRsZX07CgogICAgICAgICAgICAgICAgIyBTYW1lIG5hbWUgZm9yIHVwZGF0ZSBvbiBleGlzdGluZyBkcmFmdC4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJwogICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gZXEgJEZvcm1EcmFmdC0+e0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IERSQUZUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgQW5vdGhlciBkcmFmdCB3aXRoIHRoZSBjaG9zZW4gbmFtZSBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoICJGb3JtRHJhZnQgbmFtZSAlcyBpcyBhbHJlYWR5IGluIHVzZSEiLCAkVGl0bGUgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBsYXN0IERSQUZUOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgUGVyZm9ybSBkcmFmdCBhY3Rpb24gaW5zdGVhZCBvZiBzYXZpbmcgZm9ybSBkYXRhIGluIHRpY2tldC9hcnRpY2xlLgogICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uICYmICElRm9ybURyYWZ0UmVzcG9uc2UgKSB7CgogICAgICAgICMgUmVzZXQgRm9ybURyYWZ0SUQgdG8gcHJldmVudCB1cGRhdGluZyBleGlzdGluZyBkcmFmdC4KICAgICAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApIHsKICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT57UXVlcnl9LT5wYXJhbSgKICAgICAgICAgICAgICAgIC1uYW1lICA9PiAnRm9ybURyYWZ0SUQnLAogICAgICAgICAgICAgICAgLXZhbHVlID0+ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEZvcm1EcmFmdEFjdGlvbk9rOwogICAgICAgIGlmICgKICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJwogICAgICAgICAgICB8fAogICAgICAgICAgICAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRQYXJhbU9iamVjdC0+U2F2ZUZvcm1EcmFmdCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnRGVsZXRlJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uT2sgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEZvcm1EcmFmdEFjdGlvbk9rKSB7CiAgICAgICAgICAgICRGb3JtRHJhZnRSZXNwb25zZXtTdWNjZXNzfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAnQ291bGQgbm90IHBlcmZvcm0gcmVxdWVzdGVkIGRyYWZ0IGFjdGlvbiEnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJUZvcm1EcmFmdFJlc3BvbnNlKSB7CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gXCVGb3JtRHJhZnRSZXNwb25zZSwKICAgICAgICApOwoKICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRJdGVtICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRJdGVtOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZEl0ZW0gfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgbXkgJFF1ZXVlSUQgPSAkU2VsZi0+e1F1ZXVlSUR9OwogICAgbXkgJVN0YXRlRGF0YTsKCiAgICBpZiAoICRHZXRQYXJhbXtDb21wb3NlU3RhdGVJRH0gKSB7CiAgICAgICAgJVN0YXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICROZXh0U3RhdGUgPSAkU3RhdGVEYXRhe05hbWV9OwoKICAgICMgY2hlY2sgcGVuZGluZyBkYXRlCiAgICBpZiAoIGRlZmluZWQgJFN0YXRlRGF0YXtUeXBlTmFtZX0gJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICMgY29udmVydCBwZW5kaW5nIGRhdGUgdG8gYSBkYXRldGltZSBvYmplY3QKICAgICAgICBteSAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSBlcG9jaAogICAgICAgIG15ICRDdXJTeXN0ZW1EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICAgICBpZiAoICEkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IHx8ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPCAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICRFcnJvcnsnRGF0ZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgVG8KICAgIGlmICggISRHZXRQYXJhbXtUb30gKSB7CiAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBjaGVjayBib2R5CiAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgJEVycm9yeydCb2R5SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGNoZWNrIHN1YmplY3QKICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAkRXJyb3J7J1N1YmplY3RJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAmJiAkR2V0UGFyYW17VGltZVVuaXRzfSBlcSAnJwogICAgICAgICkKICAgIHsKICAgICAgICAkRXJyb3J7J1RpbWVVbml0c0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIHByZXBhcmUgc3ViamVjdAogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJEdldFBhcmFte0Zvcm1JRH0sCiAgICApOwoKICAgICMgY3JlYXRlIEhUTUwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PgogICAgICAgICAgICAgICAgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmaWVsZCBIVE1MCiAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PgogICAgICAgICAgICAgICAgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICAgICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSAgfHwgJycsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgICAgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntFcnJvck1lc3NhZ2V9IHx8ICcnLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICApOwogICAgfQoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICBMSU5FOgogICAgZm9yIG15ICRMaW5lIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgbmV4dCBMSU5FIGlmICEkR2V0UGFyYW17JExpbmV9OwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFteyRMaW5lfSApICkgewogICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7ICRMaW5lIC4gJ0Vycm9yVHlwZScgfSA9ICRMaW5lIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkRXJyb3J7ICRMaW5lIC4gJ0ludmFsaWQnIH0gICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTWFrZSBzdXJlIHNlbmRlciBpcyBjb3JyZWN0IG9uZS4gU2VlIGJ1ZyMxNDg3MiAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NzIgKS4KICAgICRHZXRQYXJhbXtGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewoKICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBzYXZlIGZvcm0gaWYgYSBkcmFmdCB3YXMgbG9hZGVkLgogICAgICAgICVFcnJvciA9ICggTG9hZGVkRm9ybURyYWZ0ID0+IDEgKTsKICAgIH0KCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIG15ICVBcnRpY2xlUGFyYW07CgogICAgaWYgKCByZWYoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSApIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKCiAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICRNdWx0aXBsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgU3RvcmVOZXcgPT4gMSwKICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRKb2JzeyRKb2J9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAgICMgYW5kIGFkZCB0aGVtIGJhY2sgdG8gdGhlIHNlbGVjdGlvbiBzbyB0aGF0IHRoZSBzdWJtaXQKICAgICAgICAgICAgIyB3aWxsIGNvbnRhaW4gb3B0aW9ucyB0aGF0IHdlcmUgaGlkZGVuIGZyb20gdGhlIGFnZW50CiAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgbXkgQFJlbW92ZWRPcHRpb25zID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwogICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGlmICgkTXVsdGlwbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdmVkT3B0aW9uIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSBzaGlmdCBAUmVtb3ZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sICVBcnRpY2xlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICVFcnJvciA9ICgKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGVycm9yCiAgICBpZiAoJUVycm9yKSB7CgogICAgICAgIG15ICRRdWV1ZUlEID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVJRCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICBteSAkT3V0cHV0ICA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgV2hlbiBhIGRyYWZ0IGlzIGxvYWRlZCwgaW5mb3JtIGEgdXNlciB0aGF0IGFydGljbGUgc3ViamVjdCB3aWxsIGJlIGVtcHR5CiAgICAgICAgIyBpZiBjb250YWlucyBvbmx5IHRoZSB0aWNrZXQgaG9vayAoaWYgbm90aGluZyBpcyBtb2RpZmllZCkuCiAgICAgICAgaWYgKCAkRXJyb3J7TG9hZGVkRm9ybURyYWZ0fSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQXJ0aWNsZSBzdWJqZWN0IHdpbGwgYmUgZW1wdHkgaWYgdGhlIHN1YmplY3QgY29udGFpbnMgb25seSB0aGUgdGlja2V0IGhvb2shJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBOZXh0U3RhdGVzICAgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICApLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MICAgID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgcmVwbGFjZSA8T1RPQk9fVElDS0VUX1NUQVRFPiB3aXRoIG5leHQgdGlja2V0IHN0YXRlIG5hbWUKICAgIGlmICgkTmV4dFN0YXRlKSB7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKCZsdDt8PClPVE9CT19USUNLRVRfU1RBVEUoJmd0O3w+KS8kTmV4dFN0YXRlL2c7CiAgICB9CgogICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50cwogICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgRm9ybUlEID0+ICRHZXRQYXJhbXtGb3JtSUR9LAogICAgKTsKCiAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgKTsKICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICBwdXNoIEBBdHRhY2htZW50RGF0YSwgXCVVcGxvYWRTdHVmZjsKICAgIH0KCiAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICBpZiAoICRDb250ZW50SUQgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApICkgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICB9CiAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAjIHZlcmlmeSBIVE1MIGRvY3VtZW50CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIGVtYWlsCiAgICBteSAkVG8gPSAnJzsKCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgIG5leHQgS0VZIGlmICEkR2V0UGFyYW17JEtleX07CiAgICAgICAgaWYgKCRUbykgewogICAgICAgICAgICAkVG8gLj0gJywgJzsKICAgICAgICB9CiAgICAgICAgJFRvIC49ICRHZXRQYXJhbXskS2V5fTsKICAgIH0KCiAgICAjIEdldCBhdHRyaWJ1dGVzIGxpa2Ugc2VuZGVyIGFkZHJlc3MuCiAgICBteSAlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5BdHRyaWJ1dGVzKAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIERhdGEgICAgID0+IHt9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICBteSAkQXJ0aWNsZUlEICAgICA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0VtYWlsJyApLT5BcnRpY2xlU2VuZCgKICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRHZXRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0gLy8gMCwKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnRW1haWxBZ2VudCcsCiAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gIlwlXCUkVG8iLAogICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICREYXRhe0Zyb219LAogICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgQ2MgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NjfSwKICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKCiAgICAgICAgIyBXZSBzdGFydCBhIG5ldyBjb21tdW5pY2F0aW9uIGhlcmUsIHNvIGRvbid0IHNlbmQgYW55IHJlZmVyZW5jZXMuCiAgICAgICAgIyAgIFRoaXMgbWlnaHQgbGVhZCB0byBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlIChkb21haW4gbmFtZXM7IHNlZSBidWcjMTEyNDYpLgogICAgICAgIEluUmVwbHlUbyAgPT4gJycsCiAgICAgICAgUmVmZXJlbmNlcyA9PiAnJywKICAgICAgICBDaGFyc2V0ICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgTWltZVR5cGUgICA9PiAkTWltZVR5cGUsCiAgICAgICAgQXR0YWNobWVudCA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICApOwoKICAgICMgZXJyb3IgcGFnZQogICAgaWYgKCAhJEFydGljbGVJRCApIHsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpbWUgYWNjb3VudGluZwogICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgZHluYW1pYyBmaWVsZHMKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBzZXQgdGhlIG9iamVjdCBJRCAoVGlja2V0SUQgb3IgQXJ0aWNsZUlEKSBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIGNvbmZpZ3VyYXRpb24KICAgICAgICBteSAkT2JqZWN0SUQgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnID8gJEFydGljbGVJRCA6ICRTZWxmLT57VGlja2V0SUR9OwoKICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkT2JqZWN0SUQsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHN0YXRlCiAgICBpZiAoJE5leHRTdGF0ZSkgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlU2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBTdGF0ZSAgICAgPT4gJE5leHRTdGF0ZSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3VsZCBJIHNldCBhbiB1bmxvY2s/CiAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyByZW1vdmUgcHJlLXN1Ym1pdHRlZCBhdHRhY2htZW50cwogICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkR2V0UGFyYW17Rm9ybUlEfSApOwoKICAgICMgSWYgZm9ybSB3YXMgY2FsbGVkIGJhc2VkIG9uIGEgZHJhZnQsCiAgICAjICAgZGVsZXRlIGRyYWZ0IHNpbmNlIGl0cyBjb250ZW50IGhhcyBub3cgYmVlbiB1c2VkLgogICAgaWYgKAogICAgICAgICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0KICAgICAgICAmJiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnREZWxldGUoCiAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkIG5vdCBkZWxldGUgZHJhZnQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVkaXJlY3QKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRTdGF0ZURhdGF7VHlwZU5hbWV9CiAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pCiAgICAgICAgJiYgISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVkaXJlY3RBZnRlckNsb3NlRGlzYWJsZWQnKQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgVVJMID0+ICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9IHx8ICdBY3Rpb249QWdlbnREYXNoYm9hcmQnICksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xlSUQiLAogICAgKTsKfQoKc3ViIEFqYXhVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3I7CiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW07CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgJEFDTENvbXBhdEdldFBhcmFte05leHRTdGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXh0U3RhdGVJRCcgKTsKCiAgICBteSAlR2V0UGFyYW1FeHRlbmRlZCA9ICRTZWxmLT5fR2V0RXh0ZW5kZWRQYXJhbXMoKTsKCiAgICBteSAlR2V0UGFyYW0gICAgICAgICAgICA9ICV7ICRHZXRQYXJhbUV4dGVuZGVke0dldFBhcmFtfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXIgICAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYyAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQ2N9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYyA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJCY2N9IH07CgogICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgICMgTWFrZSBzdXJlIHNlbmRlciBpcyBjb3JyZWN0IG9uZS4gU2VlIGJ1ZyMxNDg3MiAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NzIgKS4KICAgICRHZXRQYXJhbXtGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSBARXh0ZW5kZWREYXRhOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwoKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgSk9CIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkTXVsdGlwbGU7CgogICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICMgZ2V0IEFKQVggcGFyYW0gdmFsdWVzCiAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRQYXJhbUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbiB2aXNpYmxlCiAgICAgICAgICAgICMgdG8gdGhlIGFnZW50LiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgbXkgQE9wdGlvbnNUb1JlbW92ZSA9ICRPYmplY3QtPkdldE9wdGlvbnNUb1JlbW92ZUFKQVgoJUdldFBhcmFtKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyRPcHRpb25Ub1JlbW92ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgIGlmICgkS2V5KSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBFeHRlbmRlZERhdGEsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gJE11bHRpcGxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRJdGVtICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRJdGVtOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZEl0ZW0gfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICk7CgogICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICBteSBARHluYW1pY0ZpZWxkQUpBWDsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICApOwoKICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgIH0KCiAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICkgfHwgJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICBwdXNoKAogICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ29tcG9zZVN0YXRlSUQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtDb21wb3NlU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmV4dCBzdGF0ZXMKICAgIG15ICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMQogICAgKTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgIG15ICVTdGF0ZTsKICAgIGlmICggISRQYXJhbXtDb21wb3NlU3RhdGVJRH0gKSB7CiAgICAgICAgJFN0YXRle1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17Q29tcG9zZVN0YXRlSUR9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb21wb3NlU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICVTdGF0ZSwKICAgICk7CgogICAgaWYgKCAhJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudH0gKSB7CiAgICAgICAgJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSA9ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3IgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRFcnJvcn0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JEVycm9yfSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHBlbmRpbmcgZGF0YSBzdHJpbmcKICAgICRQYXJhbXtQZW5kaW5nRGF0ZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJVBhcmFtLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgID0+IDAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgPT4gNSwKICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgRGlmZlRpbWUgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKSB8fCAwLAogICAgICAgIENsYXNzICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFcnJvcnN9LT57RGF0ZUludmFsaWR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJyAnLAogICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICk7CgogICAgIyBNdWx0aXBsZS1BdXRvY29tcGxldGUKICAgICMgQ2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJCY2MgKSB7CiAgICAgICAgJFBhcmFte0JjY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJCY2MrKywKICAgICAgICB9LAogICAgKTsKCiAgICAjIFRvCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlcisrLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RvSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1RvSXNMb2NhbEFkZHJlc3N9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57QmNjRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgSFRNTCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyB0aGUgY3VzdG9tZXIgdXNlciBhZGRyZXNzIGJvb2sgaWYgdGhlIG1vZHVsZSBpcyByZWdpc3RlcmVkIGFuZCBqYXZhIHNjcmlwdCBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50Q3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2t9CiAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte09wdGlvbkN1c3RvbWVyVXNlckFkZHJlc3NCb29rfSA9IDE7CiAgICB9CgogICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKS0+U3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiAnRW1haWwnLAogICAgKTsKCiAgICBteSAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgJVBhcmFtLAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IHx8ICcnLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoCiAgICAgICAgICAgICRRdWV1ZVN0YW5kYXJkVGVtcGxhdGVzCiAgICAgICAgICAgICAgICB8fCAoICRQYXJhbXtRdWV1ZX0gJiYgSXNIYXNoUmVmV2l0aERhdGEoIFwlU3RhbmRhcmRUZW1wbGF0ZXMgKSApCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcyB8fCB7fSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdEeW5hbWljRmllbGROYW1lcycsCiAgICAgICAgVmFsdWUgPT4gJER5bmFtaWNGaWVsZE5hbWVzLAogICAgKTsKCiAgICBteSAkTG9hZGVkRm9ybURyYWZ0OwogICAgaWYgKCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKICAgICAgICAkTG9hZGVkRm9ybURyYWZ0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnRHZXQoCiAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9LAogICAgICAgICAgICBHZXRDb250ZW50ICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFydGljbGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIE9ubHlMYXN0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKEBBcnRpY2xlcykgewogICAgICAgICAgICBteSAkTGFzdEFydGljbGUgPSAkQXJ0aWNsZXNbMF07CgogICAgICAgICAgICBteSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lOwogICAgICAgICAgICBpZiAoICRMYXN0QXJ0aWNsZS0+e0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlU3lzdGVtVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRMYXN0QXJ0aWNsZS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RBcnRpY2xlU3lzdGVtVGltZSA9ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWVPYmplY3QtPlRvRXBvY2goKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdFN5c3RlbVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRm9ybURyYWZ0U3lzdGVtVGltZSA9ICRGb3JtRHJhZnRTeXN0ZW1UaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CgogICAgICAgICAgICBpZiAoICEkTGFzdEFydGljbGVTeXN0ZW1UaW1lIHx8ICRGb3JtRHJhZnRTeXN0ZW1UaW1lIDw9ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Rm9ybURyYWZ0T3V0ZGF0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRMb2FkZWRGb3JtRHJhZnQpICkgewoKICAgICAgICAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlQnlOYW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZUJ5fSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBGb3JtRHJhZnQgICAgICA9PiAkQ29uZmlnLT57Rm9ybURyYWZ0fSwKICAgICAgICAgICAgRm9ybURyYWZ0SUQgICAgPT4gJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgIEZvcm1EcmFmdFRpdGxlID0+ICRMb2FkZWRGb3JtRHJhZnQgPyAkTG9hZGVkRm9ybURyYWZ0LT57VGl0bGV9IDogJycsCiAgICAgICAgICAgIEZvcm1EcmFmdE1ldGEgID0+ICRMb2FkZWRGb3JtRHJhZnQsCiAgICAgICAgfSwKICAgICk7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwoKICAgICMgc2V0IHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRlYWJsZSB2aWEgQUpBWFVwZGF0ZQogICAgaWYgKCAhJFBhcmFte09ubHlEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBAVXBkYXRhYmxlRmllbGRzID0gcXcoIENvbXBvc2VTdGF0ZUlEICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCnN1YiBfR2V0RXh0ZW5kZWRQYXJhbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhUbyBDYyBCY2MgU3ViamVjdCBCb2R5IENvbXBvc2VTdGF0ZUlEIElzVmlzaWJsZUZvckN1c3RvbWVyIElzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudAogICAgICAgIEFydGljbGVJRCBUaW1lVW5pdHMgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgRm9ybUlEIEZvcm1EcmFmdElEIFRpdGxlKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgaWYgKCBkZWZpbmVkICRWYWx1ZSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFZhbHVlOwogICAgICAgIH0KICAgIH0KCiAgICAkR2V0UGFyYW17RW1haWxUZW1wbGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbWFpbFRlbXBsYXRlSUQnICkgfHwgJyc7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJEdldFBhcmFte0Zvcm1JRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyVG9DdXN0b21lcicgKSB8fCAwOwogICAgbXkgJFNlbGVjdGVkICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclNlbGVjdGVkJyApICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXIgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnQpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50KSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eCAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZSBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZSA9ICRDb3VudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJDYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJDYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudENjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWVDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50Q2MpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDY30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSA9ICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQ2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnRDYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSAmJiAkQ3VzdG9tZXJFcnJvckNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQ2MgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICRDb3VudEF1eENjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWVDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUNjID0gJENvdW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJDYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4Q2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQ2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0NjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQ2MsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJCY2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlckJjYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudEJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlCY2MgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50QmNjKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QmNjfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQmNjICAgID0gJyc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudEJjYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSAmJiAkQ3VzdG9tZXJFcnJvckJjYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQmNjID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWVCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWVCY2MgPSAkQ291bnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckJjYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQmNjLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgKTsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7RW1haWx9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tFbWFpbH07Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmailResend.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbFJlc2VuZC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbFJlc2VuZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIE1haWw6OkFkZHJlc3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIEdldCBmb3JtIElELgogICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIENyZWF0ZSBuZXcgZm9ybSBJRC4KICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFRpY2tldElEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0VtYWlsJyApOwoKICAgICMgR2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlLgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBDaGVjayBwZXJtaXNzaW9ucy4KICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBFcnJvciBzY3JlZW4sIGRvbid0IHNob3cgYXJ0aWNsZSBhY3Rpb24uCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJENvbmZpZy0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCBBQ0wgcmVzdHJpY3Rpb25zLgogICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBDaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0LgogICAgaWYgKCAkQUNMIHx8IElzSGFzaFJlZldpdGhEYXRhKCBcJUFjbEFjdGlvbiApICkgewoKICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAjIFNob3cgZXJyb3Igc2NyZWVuIGlmIEFDTCBwcm9oaWJpdHMgdGhpcyBhY3Rpb24uCiAgICAgICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMQogICAgKTsKCiAgICAjIEdldCBsb2NrIHN0YXRlLgogICAgbXkgJFRpY2tldEJhY2tUeXBlID0gJ1RpY2tldEJhY2snOwogICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewoKICAgICAgICAgICAgbXkgJExvY2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2V0IG5ldyBvd25lciBpZiB0aWNrZXQgb3duZXIgaXMgZGlmZmVyZW50IHRoZW4gbG9nZ2VkIHVzZXIuCiAgICAgICAgICAgIGlmICggJExvY2sgJiYgKCAkVGlja2V0e093bmVySUR9ICE9ICRTZWxmLT57VXNlcklEfSApICkgewoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICRUaWNrZXR7UHJldmlvdXNPd25lcn0gPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBTaG93IGxvY2sgc3RhdGUuCiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkVGlja2V0QmFja1R5cGUgLj0gJ1VuZG8nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e051bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIHRpY2tldCBvd25lciB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciAoCiAgICAgICAgcXcoCiAgICAgICAgICAgIEZyb20gVG8gQ2MgQmNjIFN1YmplY3QgQm9keSBJblJlcGx5VG8gUmVmZXJlbmNlcyBBcnRpY2xlSUQKICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50IElzVmlzaWJsZUZvckN1c3RvbWVyIFRpbWVVbml0cyBGb3JtSUQKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQoKICAgIGlmICggISRHZXRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIEFydGljbGVJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBIYXNoIGZvciBsb29rdXAgb2YgZHVwbGljYXRlZCBlbnRyaWVzLgogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXI7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlclRvQ3VzdG9tZXInICkgfHwgMDsKICAgIG15ICRTZWxlY3RlZCAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyKSB7CgogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAxOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uLiAkQ3VzdG9tZXJzTnVtYmVyICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJTZWxlY3RlZCA9ICggJFNlbGVjdGVkIGVxICRDb3VudCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXkgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50KSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIENoZWNrIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnQpICkgewogICAgICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzLgogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eCAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZSBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZSA9ICRDb3VudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJDYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJDYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudENjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWVDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50Q2MpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDY30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSA9ICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQ2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnRDYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSAmJiAkQ3VzdG9tZXJFcnJvckNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQ2MgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICRDb3VudEF1eENjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWVDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUNjID0gJENvdW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJDYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4Q2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQ2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0NjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQ2MsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJCY2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlckJjYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudEJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlCY2MgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50QmNjKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QmNjfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIENoZWNrIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICcnOwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnRCY2MpICkgewogICAgICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQmNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzLgogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eEJjYyAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUJjYyA9ICRDb3VudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQmNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0JjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyUXVldWUgICAgPT4gJEN1c3RvbWVyUXVldWVCY2MsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgU2VuZCBlbWFpbC4KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZW5kRW1haWwnICkgewoKICAgICAgICAjIENoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uLgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICAgICAjIENoZWNrIHNvbWUgdmFsdWVzLgogICAgICAgIExJTkU6CiAgICAgICAgZm9yIG15ICRMaW5lIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgICAgIG5leHQgTElORSBpZiAhJEdldFBhcmFteyRMaW5lfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkR2V0UGFyYW17JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdFcnJvclR5cGUnIH0gPSAkTGluZSAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkSXNMb2NhbCkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFcnJvcntUb0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRXJyb3J7Q2NJc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEVycm9ye0JjY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEuCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBzb21lIHZhbHVlcy4KICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISRHZXRQYXJhbXskTGluZX07CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFteyRMaW5lfSApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgc3ViamVjdC4KICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRFcnJvcntTdWJqZWN0SW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgYm9keS4KICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICRFcnJvcntCb2R5SW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgdGltZSB1bml0cy4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9ye1RpbWVVbml0c0ludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgUHJlcGFyZSBzdWJqZWN0LgogICAgICAgIG15ICRUbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVG4sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUFydGljbGVQYXJhbTsKCiAgICAgICAgIyBSdW4gY29tcG9zZSBtb2R1bGVzLgogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIFVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMuCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9ICk7CgogICAgICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBSdW4gbW9kdWxlLgogICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTdG9yZU5ldyA9PiAxLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIGFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUKICAgICAgICAgICAgICAgICMgICBzdWJtaXQgd2lsbCBjb250YWluIG9wdGlvbnMgdGhhdCB3ZXJlIGhpZGRlbiBmcm9tIHRoZSBhZ2VudC4KICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAUmVtb3ZlZE9wdGlvbnMgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW92ZWRPcHRpb24gKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gc2hpZnQgQFJlbW92ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgVGlja2V0IHBhcmFtcy4KICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sICVBcnRpY2xlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEdldCBlcnJvcnMuCiAgICAgICAgICAgICAgICAlRXJyb3IgPSAoCiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlfSA9ICRHZXRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXRCYWNrVHlwZSAgICAgID0+ICRUaWNrZXRCYWNrVHlwZSwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgR2V0IHByZS1sb2FkZWQgYXR0YWNobWVudHMuCiAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgc3VibWl0IGF0dGFjaG1lbnQuCiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIEdldCByZWNpcGllbnRzLgogICAgICAgIG15ICRSZWNpcGllbnRzID0gJyc7CiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKCiAgICAgICAgICAgIG5leHQgTElORSBpZiAhJEdldFBhcmFteyRMaW5lfTsKCiAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgJFJlY2lwaWVudHMgLj0gJywgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAkR2V0UGFyYW17JExpbmV9OwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyBSZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMuCiAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzLgogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkuCiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICRHZXRQYXJhbXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudERhdGEgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIFZlcmlmeSBIVE1MIGRvY3VtZW50LgogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICAgICAgaWYgKCAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50fSApIHsKICAgICAgICAgICAgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJEdldFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSA/IDEgOiAwOwogICAgICAgIH0KCiAgICAgICAgIyBTZW5kIGVtYWlsLgogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnRW1haWxSZXNlbmQnLAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiXCVcJSRSZWNpcGllbnRzIiwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0Zyb219LAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgSW5SZXBseVRvICAgICAgICAgICAgPT4gJEdldFBhcmFte0luUmVwbHlUb30sCiAgICAgICAgICAgIFJlZmVyZW5jZXMgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZWZlcmVuY2VzfSwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgRXJyb3IgcGFnZS4KICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgVGltZSBhY2NvdW50aW5nLgogICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBSZW1vdmUgcHJlLXN1Ym1pdHRlZCBhdHRhY2htZW50cy4KICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRHZXRQYXJhbXtGb3JtSUR9ICk7CgogICAgICAgICMgTG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcHVwLgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBmb3IgU01JTUUgLyBQR1AgaWYgY3VzdG9tZXIgaGFzIGNoYW5nZWQuCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgIG15IEBFeHRlbmRlZERhdGE7CgogICAgICAgICMgUnVuIGNvbXBvc2UgbW9kdWxlcy4KICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyBVc2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzLgogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkVGlja2V0e1F1ZXVlSUR9OwoKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgSk9COgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIExvYWQgbW9kdWxlLgogICAgICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKCiAgICAgICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFJ1biBtb2R1bGUuCiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICRPYmplY3QtPkRhdGEoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgIyBHZXQgQUpBWCBwYXJhbSB2YWx1ZXMuCiAgICAgICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0UGFyYW1BSkFYJykgKSB7CiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtID0gKCAlR2V0UGFyYW0sICRPYmplY3QtPkdldFBhcmFtQUpBWCglR2V0UGFyYW0pICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgb3B0aW9ucyB0aGF0IGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgYWdlbnQuIFRoZXNlIG9wdGlvbnMgd2lsbCBiZQogICAgICAgICAgICAgICAgIyAgIGFkZGVkIGFnYWluIG9uIHN1Ym1pdC4KICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRPcHRpb25zVG9SZW1vdmVBSkFYJykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQE9wdGlvbnNUb1JlbW92ZSA9ICRPYmplY3QtPkdldE9wdGlvbnNUb1JlbW92ZUFKQVgoJUdldFBhcmFtKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPcHRpb25Ub1JlbW92ZSAoQE9wdGlvbnNUb1JlbW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JE9wdGlvblRvUmVtb3ZlfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEtleSA9ICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICAgICAgICAgIGlmICgkS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gJE11bHRpcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDE1MCwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFydGljbGUgZGF0YS4KICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICk7CiAgICAgICAgbXkgJURhdGEgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFydGljbGUgdG8gcXVvdGUuCiAgICAgICAgJERhdGF7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgIEF0dGFjaG1lbnRzSW5jbHVkZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEuCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFN5c3RlbUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpOwoKICAgICAgICAjIEdldCBvbmx5IGVtYWlsIGFkZHJlc3MgaW4gJ1RvJyAoanVzdCAnc29tZUBleGFtcGxlLmNvbScpLgogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJERhdGF7VG99ICkgKSB7CiAgICAgICAgICAgICREYXRhe1RvRW1haWx9ID0gJEVtYWlsLT5hZGRyZXNzKCk7CiAgICAgICAgfQoKICAgICAgICAjIEZpbmQgZHVwbGljYXRlIGFkZHJlc3Nlcy4KICAgICAgICBteSAlUmVjaXBpZW50OwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBpZiAoICREYXRheyRUeXBlfSApIHsKICAgICAgICAgICAgICAgIG15ICROZXdMaW5lID0gJyc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICREYXRheyRUeXBlfSApICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBZGRyZXNzID0gbGMgJEVtYWlsLT5hZGRyZXNzKCk7CgogICAgICAgICAgICAgICAgICAgICMgT25seSB1c2UgZW1haWwgYWRkcmVzc2VzIHdpdGggJ0AnIGluc2lkZS4KICAgICAgICAgICAgICAgICAgICBpZiAoICRBZGRyZXNzICYmICRBZGRyZXNzID1+IC9ALyAmJiAhJFJlY2lwaWVudHskQWRkcmVzc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnR7JEFkZHJlc3N9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkU3lzdGVtQWRkcmVzcy0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkQWRkcmVzcywKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRJc0xvY2FsICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCROZXdMaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0xpbmUgLj0gJywgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdMaW5lIC49ICRFbWFpbC0+Zm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXskVHlwZX0gPSAkTmV3TGluZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBzb21lIHZhbHVlcy4KICAgICAgICBteSAlRXJyb3I7CiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBMSU5FIGlmICEkRGF0YXskTGluZX07CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJERhdGF7JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICJJbnZhbGlkIiB9ID0gIiBTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkRGF0YXtGcm9tfSApIHsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkRGF0YXtGcm9tfSApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRnJvbUludmFsaWQifSAuPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUnVuIGNvbXBvc2UgbW9kdWxlcy4KICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIExvYWQgbW9kdWxlLgogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSApOwoKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUnVuIG1vZHVsZS4KICAgICAgICAgICAgICAgIG15ICROZXdQYXJhbXMgPSAkT2JqZWN0LT5SdW4oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCROZXdQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJE5ld1BhcmFtczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgZXJyb3JzLgogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQnVpbGQgdmlldy4KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgVGlja2V0QmFja1R5cGUgPT4gJFRpY2tldEJhY2tUeXBlLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfTsKICAgIGlmICggJFBhcmFte0dldFBhcmFtfS0+e0lzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudH0gKSB7CiAgICAgICAgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJFBhcmFte0dldFBhcmFtfS0+e0lzVmlzaWJsZUZvckN1c3RvbWVyfSA/IDEgOiAwOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0lzVmlzaWJsZUZvckN1c3RvbWVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gJElzVmlzaWJsZUZvckN1c3RvbWVyLAogICAgICAgIH0sCiAgICApOwoKICAgICMgUHJlcGFyZSBlcnJvcnMgZm9yIHRoZSBvdXRwdXQuCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3IgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRFcnJvcn0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRFcnJvcn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgSGFuZGxlIG11bHRpcGxlIGF1dG9jb21wbGV0ZSBpbiByZWNpcGllbnQgZmllbGRzLgogICAgJFBhcmFte1RvfSA9ICggc2NhbGFyIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSB9ID8gJycgOiAkUGFyYW17VG99ICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1RvfSAmJiAkUGFyYW17VG99IG5lICcnICkgewogICAgICAgICRQYXJhbXtUb0ludmFsaWR9ID0gJyc7CiAgICB9CiAgICAkUGFyYW17Q2N9ID0gKCBzY2FsYXIgQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSA/ICcnIDogJFBhcmFte0NjfSApOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtDY30gJiYgJFBhcmFte0NjfSBuZSAnJyApIHsKICAgICAgICAkUGFyYW17Q2NJbnZhbGlkfSA9ICcnOwogICAgfQogICAgJFBhcmFte0JjY30gPSAoIHNjYWxhciBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gfSA/ICcnIDogJFBhcmFte0JjY30gKTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17QmNjfSAmJiAkUGFyYW17QmNjfSBuZSAnJyApIHsKICAgICAgICAkUGFyYW17QmNjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICAjIFByb2Nlc3MgdGhlICdDYycgZmllbGQuCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjJyAuICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDY0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJDYyApIHsKICAgICAgICAkUGFyYW17Q2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIFNldCBjdXN0b21lciBjb3VudGVyLgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQ2MsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBQcm9jZXNzIHRoZSAnQmNjJyBmaWVsZC4KICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJCY2MgKSB7CiAgICAgICAgJFBhcmFte0JjY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgU2V0IGN1c3RvbWVyIGNvdW50ZXIuCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjLAogICAgICAgIH0sCiAgICApOwoKICAgICMgUHJvY2VzcyB0aGUgJ1RvJyBmaWVsZC4KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIFNldCBjdXN0b21lciBjb3VudGVyLgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlciwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtUb0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgIyBTZXQgcHJlc2VsZWN0ZWQgdmFsdWVzIGZvciAnQmNjJyBmaWVsZC4KICAgIGlmICggJFBhcmFte0JjY30gJiYgJFBhcmFte0JjY30gbmUgJycgJiYgISRDdXN0b21lckNvdW50ZXJCY2MgKSB7CgogICAgICAgICMgc3BsaXQgQ2MgdmFsdWVzCiAgICAgICAgbXkgQEVtYWlsQWRkcmVzc2VzQmNjOwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJFBhcmFte0JjY30gKSApIHsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclNlYXJjaCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWwtPmFkZHJlc3MoKSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICglQ3VzdG9tZXJTZWFyY2gpIHsKICAgICAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVyU2VhcmNoICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzQmNjLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkQ3VzdG9tZXJTZWFyY2h7JEN1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNCY2MsIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRFbWFpbC0+WzBdID8gIiRFbWFpbC0+WzBdIDwkRW1haWwtPlsxXT4iIDogIiRFbWFpbC0+WzFdIiwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VtYWlsQWRkcmVzc2VzQmNjJywKICAgICAgICAgICAgVmFsdWUgPT4gXEBFbWFpbEFkZHJlc3Nlc0JjYywKICAgICAgICApOwoKICAgICAgICAkUGFyYW17QmNjfSA9ICcnOwogICAgfQoKICAgICMgc2V0IHByZXNlbGVjdGVkIHZhbHVlcyBmb3IgQ2MgZmllbGQKICAgIGlmICggJFBhcmFte0NjfSAmJiAkUGFyYW17Q2N9IG5lICcnICYmICEkQ3VzdG9tZXJDb3VudGVyQ2MgKSB7CgogICAgICAgICMgc3BsaXQgQ2MgdmFsdWVzCiAgICAgICAgbXkgQEVtYWlsQWRkcmVzc2VzQ2M7CiAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkUGFyYW17Q2N9ICkgKSB7CgogICAgICAgICAgICBteSAlQ3VzdG9tZXJTZWFyY2ggPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJEVtYWlsLT5hZGRyZXNzKCksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICggc29ydCBrZXlzICVDdXN0b21lclNlYXJjaCApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFbWFpbEFkZHJlc3Nlc0NjLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkQ3VzdG9tZXJTZWFyY2h7JEN1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNDYywgewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEVtYWlsLT5bMF0gPyAiJEVtYWlsLT5bMF0gPCRFbWFpbC0+WzFdPiIgOiAiJEVtYWlsLT5bMV0iLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRW1haWxBZGRyZXNzZXNDYycsCiAgICAgICAgICAgIFZhbHVlID0+IFxARW1haWxBZGRyZXNzZXNDYywKICAgICAgICApOwoKICAgICAgICAkUGFyYW17Q2N9ID0gJyc7CiAgICB9CgogICAgIyBzZXQgcHJlc2VsZWN0ZWQgdmFsdWVzIGZvciBUbyBmaWVsZAogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUb30gJiYgJFBhcmFte1RvfSBuZSAnJyAmJiAhJEN1c3RvbWVyQ291bnRlciApIHsKCiAgICAgICAgIyBzcGxpdCBUbyB2YWx1ZXMKICAgICAgICBteSBARW1haWxBZGRyZXNzZXNUbzsKICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICRQYXJhbXtUb30gKSApIHsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclNlYXJjaCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWwtPmFkZHJlc3MoKSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICglQ3VzdG9tZXJTZWFyY2gpIHsKICAgICAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVyU2VhcmNoICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzVG8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICAgID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRDdXN0b21lclNlYXJjaHskQ3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoIEBFbWFpbEFkZHJlc3Nlc1RvLCB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkRW1haWwtPlswXSA/ICIkRW1haWwtPlswXSA8JEVtYWlsLT5bMV0+IiA6ICIkRW1haWwtPlsxXSIsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdFbWFpbEFkZHJlc3Nlc1RvJywKICAgICAgICAgICAgVmFsdWUgPT4gXEBFbWFpbEFkZHJlc3Nlc1RvLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtUb30gPSAnJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtUaWNrZXRCYWNrVHlwZX0sCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIFNob3cgdGltZSBhY2NvdW50aW5nIGJveC4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICcnOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IHRoZSBjdXN0b21lciB1c2VyIGFkZHJlc3MgYm9vayBpZiB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQgYW5kIGphdmEgc2NyaXB0IHN1cHBvcnQgaXMgYXZhaWxhYmxlLgogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRDdXN0b21lclVzZXJBZGRyZXNzQm9va30KICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17T3B0aW9uQ3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2t9ID0gMTsKICAgIH0KCiAgICAjIEFkZCByaWNoIHRleHQgZWRpdG9yLgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyBVc2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuLgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBTZXQgdXAgcmljaCB0ZXh0IGVkaXRvci4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyBhdHRhY2htZW50cy4KICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICB9CgogICAgIyBDcmVhdGUgJiByZXR1cm4gb3V0cHV0LgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentTicketForward.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRGb3J3YXJkLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZvcndhcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBNYWlsOjpBZGRyZXNzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBUcnkgdG8gbG9hZCBkcmFmdCBpZiByZXF1ZXN0ZWQuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0Zvcm1EcmFmdH0KICAgICAgICAmJiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRJRCcgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+TG9hZEZvcm1EcmFmdCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgZm9yICgKICAgICAgICBxdyhUbyBDYyBCY2MgU3ViamVjdCBCb2R5IEluUmVwbHlUbyBSZWZlcmVuY2VzIENvbXBvc2VTdGF0ZUlEIElzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudAogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyIEFydGljbGVJRCBUaW1lVW5pdHMgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgRm9ybUlEIEZvcm1EcmFmdElEIFRpdGxlKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIGlmICggZGVmaW5lZCAkVmFsdWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57R2V0UGFyYW19LT57JF99ID0gJFZhbHVlOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0dldFBhcmFtfS0+e0ZvcndhcmRUZW1wbGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3J3YXJkVGVtcGxhdGVJRCcgKSB8fCAnJzsKCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICAkU2VsZi0+e0FDTENvbXBhdEdldFBhcmFtfS0+e05leHRTdGF0ZUlEfSA9ICRTZWxmLT57R2V0UGFyYW19LT57Q29tcG9zZVN0YXRlSUR9OwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57R2V0UGFyYW19LT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0dldFBhcmFtfS0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPntHZXRQYXJhbX0tPntGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICggJEFDTCB8fCBJc0hhc2hSZWZXaXRoRGF0YSggXCVBY2xBY3Rpb24gKSApIHsKCiAgICAgICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKCiAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICAgICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayBmb3IgZmFpbGVkIGRyYWZ0IGxvYWRpbmcgcmVxdWVzdC4KICAgIGlmICgKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICEkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdMb2FkaW5nIGRyYWZ0IGZhaWxlZCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlbmRFbWFpbCcgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+U2VuZEVtYWlsKCk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT5BamF4VXBkYXRlKCk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+U2VuZEVtYWlsKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPkZvcm0oKTsKICAgIH0KICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgRm9ybSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcjsKICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbSA9ICV7ICRTZWxmLT57QUNMQ29tcGF0R2V0UGFyYW19IH07CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnR290IG5vIFRpY2tldElEIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnU3lzdGVtIEVycm9yIScpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICBteSAlR2V0UGFyYW1FeHRlbmRlZCA9ICRTZWxmLT5fR2V0RXh0ZW5kZWRQYXJhbXMoKTsKCiAgICBteSAlR2V0UGFyYW0gICAgICAgICAgICA9ICV7ICRHZXRQYXJhbUV4dGVuZGVke0dldFBhcmFtfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXIgICAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYyAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQ2N9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYyA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJCY2N9IH07CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgbXkgJE91dHB1dCA9ICcnOwogICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewoKICAgICAgICAgICAgbXkgJExvY2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkTG9jaykgewoKICAgICAgICAgICAgICAgICMgU2V0IG5ldyBvd25lciBpZiB0aWNrZXQgb3duZXIgaXMgZGlmZmVyZW50IHRoZW4gbG9nZ2VkIHVzZXIuCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHByZXZpb3VzIG93bmVyLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVzdG9yZSB0aWNrZXQgb3duZXIgb24gdW5kbyBhY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1ByZXZpb3VzT3duZXJ9ID0gJFRpY2tldHtPd25lcklEfTsKCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgU2hvdyBsb2NrIHN0YXRlLgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgc2VsZWN0ZWQgb3IgbGFzdCBjdXN0b21lciBhcnRpY2xlLgogICAgbXkgJURhdGE7CiAgICBpZiAoICRHZXRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgKTsKICAgICAgICAlRGF0YSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgYXJ0aWNsZSBleGlzdHMuCiAgICAgICAgaWYgKCAhJURhdGEgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQXJ0aWNsZSAlcyBjb3VsZCBub3QgYmUgZm91bmQhJywgJEdldFBhcmFte0FydGljbGVJRH0gKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBHZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlLgogICAgICAgIG15IEBBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnY3VzdG9tZXInLAogICAgICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBJZiB0aGUgdGlja2V0IGhhcyBubyBjdXN0b21lciBhcnRpY2xlLCBnZXQgdGhlIGxhc3QgYWdlbnQgYXJ0aWNsZS4KICAgICAgICBpZiAoICFAQXJ0aWNsZXMgKSB7CiAgICAgICAgICAgIEBBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEZpbmFsbHksIGlmIGV2ZXJ5dGhpbmcgZmFpbGVkLCBnZXQgbGF0ZXN0IGFydGljbGUuCiAgICAgICAgaWYgKCAhQEFydGljbGVzICkgewogICAgICAgICAgICBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE9ubHlMYXN0ID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlcykgewogICAgICAgICAgICAlRGF0YSA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXskQXJ0aWNsZX0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgICV7JEFydGljbGV9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgICREYXRhe1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZUlEID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgRGF0YSAgICAgID0+IFwlRGF0YSwKICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICRHZXRQYXJhbXtGb3J3YXJkVGVtcGxhdGVJRH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlCiAgICAgICAgJERhdGF7U3RkVGVtcGxhdGV9ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICA9PiAkRGF0YXtBcnRpY2xlSUR9LAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtGb3J3YXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzaWduYXR1cmUKICAgICAgICAkRGF0YXtTaWduYXR1cmV9ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TaWduYXR1cmUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBEYXRhICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAjIGJvZHkgcHJlcGFyYXRpb24gZm9yIHBsYWluIHRleHQgcHJvY2Vzc2luZwogICAgJERhdGF7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICREYXRhe1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICBGb3JtSUQgICAgICAgICAgICAgPT4gJFNlbGYtPntHZXRQYXJhbX0tPntGb3JtSUR9LAogICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgQXR0YWNobWVudHNJbmNsdWRlID0+IDEsCiAgICApOwoKICAgIG15ICVTYWZldHlDaGVja1Jlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+U2FmZXR5KAogICAgICAgIFN0cmluZyA9PiAkRGF0YXtCb2R5fSwKCiAgICAgICAgIyBTdHJpcCBvdXQgZXh0ZXJuYWwgY29udGVudCBpZiBCbG9ja0xvYWRpbmdSZW1vdGVDb250ZW50IGlzIGVuYWJsZWQuCiAgICAgICAgTm9FeHRTcmNMb2FkID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QmxvY2tMb2FkaW5nUmVtb3RlQ29udGVudCcpLAoKICAgICAgICAjIERpc2FsbG93IHBvdGVudGlhbGx5IHVuc2FmZSBjb250ZW50LgogICAgICAgIE5vQXBwbGV0ICAgICA9PiAxLAogICAgICAgIE5vT2JqZWN0ICAgICA9PiAxLAogICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgIE5vU1ZHICAgICAgICA9PiAxLAogICAgICAgIE5vSmF2YVNjcmlwdCA9PiAxLAogICAgKTsKICAgICREYXRhe0JvZHl9ID0gJFNhZmV0eUNoZWNrUmVzdWx0e1N0cmluZ307CgogICAgIyBJZiBhcnRpY2xlIGlzIG5vdCBhIE1JTUVCYXNlIGFydGljbGUsIGluY2x1ZGUgc2VuZGVyIG5hbWUgZm9yIGNvcnJlY3QgcXVvdGluZy4KICAgIGlmICggISREYXRhe0Zyb219ICkgewogICAgICAgIG15ICVBcnRpY2xlRmllbGRzID0gJExheW91dE9iamVjdC0+QXJ0aWNsZUZpZWxkcygKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICApOwogICAgICAgICREYXRhe1NlbmRlcn0gPSAkQXJ0aWNsZUZpZWxkc3tTZW5kZXJ9LT57VmFsdWV9IC8vICcnOwogICAgfQoKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgcHJlcGFyZSBib2R5LCBzdWJqZWN0LCBSZXBseVRvIC4uLgogICAgICAgICREYXRhe0JvZHl9ID0gJzxici8+JyAuICREYXRhe0JvZHl9OwogICAgICAgIGlmICggJERhdGF7Q3JlYXRlVGltZX0gKSB7CiAgICAgICAgICAgICREYXRhe0NyZWF0ZVRpbWV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZyggJERhdGF7Q3JlYXRlVGltZX0gKTsKICAgICAgICAgICAgJERhdGF7Qm9keX0gICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RhdGUnKSAuCiAgICAgICAgICAgICAgICAiOiAkRGF0YXtDcmVhdGVUaW1lfTxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJEtleSAocXcoU3ViamVjdCBSZXBseVRvIFJlcGx5LVRvIENjIFRvIEZyb20gU2VuZGVyKSkgewogICAgICAgICAgICBpZiAoICREYXRheyRLZXl9ICkgewogICAgICAgICAgICAgICAgbXkgJEtleVRleHQgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEtleSk7CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRheyRLZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIiRLZXlUZXh0OiAkVmFsdWU8YnIvPiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJykgfHwgJycsCiAgICAgICAgKTsKICAgICAgICBpZiAoJFF1b3RlKSB7CgogICAgICAgICAgICAjIHF1b3RlIHRleHQKICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAiPGJsb2NrcXVvdGUgdHlwZT1cImNpdGVcIj4kRGF0YXtCb2R5fTwvYmxvY2txdW90ZT5cbiI7CgogICAgICAgICAgICAjIGNsZWFudXAgbm90IGNvbXBhdC4gdGFncwogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhe0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAiPGJyLz4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgfQogICAgICAgIG15ICRGcm9tID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtGcm9tfSB8fCAkRGF0YXtTZW5kZXJ9LAogICAgICAgICk7CgogICAgICAgIG15ICRGb3J3YXJkZWRNZXNzYWdlRnJvbSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRm9yd2FyZGVkIG1lc3NhZ2UgZnJvbScpOwogICAgICAgIG15ICRFbmRGb3J3YXJkZWRNZXNzYWdlICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRW5kIGZvcndhcmRlZCBtZXNzYWdlJyk7CgogICAgICAgICREYXRhe0JvZHl9ID0gIjxici8+LS0tLSAkRm9yd2FyZGVkTWVzc2FnZUZyb20gJEZyb20gLS0tPGJyLz48YnIvPiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAkRGF0YXtCb2R5fSAuPSAiPGJyLz4tLS0tICRFbmRGb3J3YXJkZWRNZXNzYWdlIC0tLTxici8+IjsKICAgICAgICAkRGF0YXtCb2R5fSA9ICREYXRhe1NpZ25hdHVyZX0gLiAkRGF0YXtCb2R5fTsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Rm9yd2FyZFRlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICREYXRhe1N0ZFRlbXBsYXRlfSAuICc8YnIvPicgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CgogICAgICAgICREYXRhe0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcHJlcGFyZSBib2R5LCBzdWJqZWN0LCBSZXBseVRvIC4uLgogICAgICAgICREYXRhe0JvZHl9ID1+IHMvXHQvIC9nOwogICAgICAgIG15ICRRdW90ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UXVvdGUnKTsKICAgICAgICBpZiAoJFF1b3RlKSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID1+IHMvXG4vXG4kUXVvdGUgL2c7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIlxuJFF1b3RlICIgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIlxuIiAuICREYXRhe0JvZHl9OwogICAgICAgIH0KICAgICAgICBpZiAoICREYXRhe0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAkRGF0YXtDcmVhdGVUaW1lfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICREYXRhe0NyZWF0ZVRpbWV9ICk7CiAgICAgICAgICAgICREYXRhe0JvZHl9ICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdEYXRlJykgLgogICAgICAgICAgICAgICAgIjogJERhdGF7Q3JlYXRlVGltZX1cbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CiAgICAgICAgZm9yIChxdyhTdWJqZWN0IFJlcGx5VG8gUmVwbHktVG8gQ2MgVG8gRnJvbSBTZW5kZXIpKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JF99ICkgewogICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJF8pIC4KICAgICAgICAgICAgICAgICAgICAiOiAkRGF0YXskX31cbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEZvcndhcmRlZE1lc3NhZ2VGcm9tID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdGb3J3YXJkZWQgbWVzc2FnZSBmcm9tJyk7CiAgICAgICAgbXkgJEVuZEZvcndhcmRlZE1lc3NhZ2UgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdFbmQgZm9yd2FyZGVkIG1lc3NhZ2UnKTsKCiAgICAgICAgbXkgJEZyb20gPSAkRGF0YXtGcm9tfSB8fCAkRGF0YXtTZW5kZXJ9OwoKICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbi0tLS0gJEZvcndhcmRlZE1lc3NhZ2VGcm9tICRGcm9tIC0tLVxuXG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgJERhdGF7Qm9keX0gLj0gIlxuLS0tLSAkRW5kRm9yd2FyZGVkTWVzc2FnZSAtLS1cbiI7CiAgICAgICAgJERhdGF7Qm9keX0gPSAkRGF0YXtTaWduYXR1cmV9IC4gJERhdGF7Qm9keX07CgogICAgICAgIGlmICggJEdldFBhcmFte0ZvcndhcmRUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAkRGF0YXtTdGRUZW1wbGF0ZX0gLiAiXG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHN0ZC4gYXR0YWNobWVudCBvYmplY3QKICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIGVtYWlsCiAgICBpZiAoICRHZXRQYXJhbXtGb3J3YXJkVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtGb3J3YXJkVGVtcGxhdGVJRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRHZXRQYXJhbXtGb3JtSUR9LAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRHZXRQYXJhbXtGb3JtSUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICBmb3IgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICBpZiAoICREYXRheyRffSApIHsKICAgICAgICAgICAgZGVsZXRlICREYXRheyRffTsKICAgICAgICB9CiAgICB9CgogICAgIyBwdXQgJiBnZXQgYXR0cmlidXRlcyBsaWtlIHNlbmRlciBhZGRyZXNzCiAgICAlRGF0YSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+QXR0cmlidXRlcygKICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIERhdGEgICAgICA9PiBcJURhdGEsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBBY3Rpb24gICAgPT4gJ0ZvcndhcmQnLAogICAgKTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIGlmICggcmVmKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgdXNlIHRpY2tldCBRdWV1ZUlEIGluIGNvbXBvc2UgbW9kdWxlcwogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJE5ld1BhcmFtcyA9ICRPYmplY3QtPlJ1biggJURhdGEsICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoJE5ld1BhcmFtcykgewogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJE5ld1BhcmFtczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICVFcnJvciA9ICggJUVycm9yLCAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgIyBnZXQgYmFja2VuZCBvYmplY3QKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgbXkgJFZhbHVlOwoKICAgICAgICAjIG9ubHkgZ2V0IHZhbHVlcyBmb3IgVGlja2V0IGZpZWxkcyAoYWxsIHNjcmVlbnMgYmFzZWQgb24gQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICAgICAjIGNyZWF0ZSBhIG5ldyBhcnRpY2xlLCB0aGVuIGFydGljbGUgZmllbGRzIHdpbGwgYmUgYWx3YXlzIGVtcHR5IGF0IHRoZSBiZWdpbm5pbmcpCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgKSB7CgogICAgICAgICAgICAjIGdldCB2YWx1ZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlIGZyb20gVGlja2V0CiAgICAgICAgICAgICRWYWx1ZSA9ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4KICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCB2aWV3IC4uLgogICAgIyBzdGFydCB3aXRoIHBhZ2UgLi4uCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgKTsKCiAgICAjIGJ1aWxkIHJlZmVyZW5jZXMgc3RyaW5nCiAgICBteSAkUmVmZXJlbmNlcyA9IGRlZmluZWQgJERhdGF7UmVmZXJlbmNlc30gPyAkRGF0YXtSZWZlcmVuY2VzfSAuICcgJyA6ICcnOwogICAgJFJlZmVyZW5jZXMgLj0gZGVmaW5lZCAkRGF0YXtNZXNzYWdlSUR9ID8gJERhdGF7TWVzc2FnZUlEfSA6ICcnOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgVGlja2V0SUQgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFRpdGxlICAgICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBTTEFJRCAgICAgICAgPT4gJFRpY2tldHtTTEFJRH0sCiAgICAgICAgTmV4dFN0YXRlcyAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgKSwKICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgOiAnJwogICAgICAgICksCiAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICVEYXRhLAogICAgICAgICVHZXRQYXJhbSwKICAgICAgICBJblJlcGx5VG8gICAgICAgID0+ICREYXRhe01lc3NhZ2VJRH0sCiAgICAgICAgUmVmZXJlbmNlcyAgICAgICA9PiAkUmVmZXJlbmNlcywKICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgU2VuZEVtYWlsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUVycm9yOwogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtID0gJXsgJFNlbGYtPntBQ0xDb21wYXRHZXRQYXJhbX0gfTsKCiAgICBteSAlR2V0UGFyYW1FeHRlbmRlZCA9ICRTZWxmLT5fR2V0RXh0ZW5kZWRQYXJhbXMoKTsKCiAgICBteSAlR2V0UGFyYW0gICAgICAgICAgICA9ICV7ICRHZXRQYXJhbUV4dGVuZGVke0dldFBhcmFtfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXIgICAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYyAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQ2N9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYyA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJCY2N9IH07CgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgR2V0IGFuZCB2YWxpZGF0ZSBkcmFmdCBhY3Rpb24uCiAgICBteSAkRm9ybURyYWZ0QWN0aW9uID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdEFjdGlvbicgKTsKICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiAmJiAhJENvbmZpZy0+e0Zvcm1EcmFmdH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnRm9ybURyYWZ0IGZ1bmN0aW9uYWxpdHkgZGlzYWJsZWQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIG15ICVGb3JtRHJhZnRSZXNwb25zZTsKCiAgICAjIENoZWNrIGRyYWZ0IG5hbWUuCiAgICBpZiAoCiAgICAgICAgJEZvcm1EcmFmdEFjdGlvbgogICAgICAgICYmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJyB8fCAkRm9ybURyYWZ0QWN0aW9uIGVxICdVcGRhdGUnICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFRpdGxlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdFRpdGxlJyApOwoKICAgICAgICAjIEEgZHJhZnQgbmFtZSBpcyByZXF1aXJlZC4KICAgICAgICBpZiAoICEkVGl0bGUgKSB7CgogICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgiRHJhZnQgbmFtZSBpcyByZXF1aXJlZCEiKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hvc2VuIGRyYWZ0IG5hbWUgbXVzdCBiZSB1bmlxdWUuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnRMaXN0R2V0KAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBEUkFGVDoKICAgICAgICAgICAgZm9yIG15ICRGb3JtRHJhZnQgKCBAeyRGb3JtRHJhZnRMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIE5vIGV4aXN0aW5nIGRyYWZ0IHdpdGggc2FtZSBuYW1lLgogICAgICAgICAgICAgICAgbmV4dCBEUkFGVCBpZiAkVGl0bGUgbmUgJEZvcm1EcmFmdC0+e1RpdGxlfTsKCiAgICAgICAgICAgICAgICAjIFNhbWUgbmFtZSBmb3IgdXBkYXRlIG9uIGV4aXN0aW5nIGRyYWZ0LgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0KICAgICAgICAgICAgICAgICAgICAmJiAkRm9ybURyYWZ0QWN0aW9uIGVxICdVcGRhdGUnCiAgICAgICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSBlcSAkRm9ybURyYWZ0LT57Rm9ybURyYWZ0SUR9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5leHQgRFJBRlQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBBbm90aGVyIGRyYWZ0IHdpdGggdGhlIGNob3NlbiBuYW1lIGFscmVhZHkgZXhpc3RzLgogICAgICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSggIkZvcm1EcmFmdCBuYW1lICVzIGlzIGFscmVhZHkgaW4gdXNlISIsICRUaXRsZSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGxhc3QgRFJBRlQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBQZXJmb3JtIGRyYWZ0IGFjdGlvbiBpbnN0ZWFkIG9mIHNhdmluZyBmb3JtIGRhdGEgaW4gdGlja2V0L2FydGljbGUuCiAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gJiYgISVGb3JtRHJhZnRSZXNwb25zZSApIHsKCiAgICAgICAgIyBSZXNldCBGb3JtRHJhZnRJRCB0byBwcmV2ZW50IHVwZGF0aW5nIGV4aXN0aW5nIGRyYWZ0LgogICAgICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAkUGFyYW1PYmplY3QtPntRdWVyeX0tPnBhcmFtKAogICAgICAgICAgICAgICAgLW5hbWUgID0+ICdGb3JtRHJhZnRJRCcsCiAgICAgICAgICAgICAgICAtdmFsdWUgPT4gJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRm9ybURyYWZ0QWN0aW9uT2s7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbk9rID0gJFBhcmFtT2JqZWN0LT5TYXZlRm9ybURyYWZ0KAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdEZWxldGUnICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0RGVsZXRlKAogICAgICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkRm9ybURyYWZ0QWN0aW9uT2spIHsKICAgICAgICAgICAgJEZvcm1EcmFmdFJlc3BvbnNle1N1Y2Nlc3N9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdDb3VsZCBub3QgcGVyZm9ybSByZXF1ZXN0ZWQgZHJhZnQgYWN0aW9uIScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICglRm9ybURyYWZ0UmVzcG9uc2UpIHsKCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJUZvcm1EcmFmdFJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZEl0ZW0gKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkSXRlbSB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICBteSAkUXVldWVJRCA9ICRTZWxmLT57UXVldWVJRH07CiAgICBteSAlU3RhdGVEYXRhOwoKICAgIGlmICggJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSApIHsKICAgICAgICAlU3RhdGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17Q29tcG9zZVN0YXRlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE5leHRTdGF0ZSA9ICRTdGF0ZURhdGF7TmFtZX07CgogICAgIyBjaGVjayBwZW5kaW5nIGRhdGUKICAgIGlmICggZGVmaW5lZCAkU3RhdGVEYXRhe1R5cGVOYW1lfSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgIyBjcmVhdGUgYSBkYXRldGltZSBvYmplY3QgYnNlZCBvbiBwZW5kaW5nIGRhdGUKICAgICAgICBteSAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSBlcG9jaAogICAgICAgIG15ICRDdXJTeXN0ZW1EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICAgICBpZiAoICEkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IHx8ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPCAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICRFcnJvcnsnRGF0ZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgVG8KICAgIGlmICggISRHZXRQYXJhbXtUb30gKSB7CiAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBjaGVjayBib2R5CiAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgJEVycm9yeydCb2R5SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGNoZWNrIHN1YmplY3QKICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAkRXJyb3J7J1N1YmplY3RJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAmJiAkR2V0UGFyYW17VGltZVVuaXRzfSBlcSAnJwogICAgICAgICkKICAgIHsKICAgICAgICAkRXJyb3J7J1RpbWVVbml0c0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIHByZXBhcmUgc3ViamVjdAogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgQWN0aW9uICAgICAgID0+ICdGb3J3YXJkJywKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgKTsKCiAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CgogICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4KICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PgogICAgICAgICAgICAgICAgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgU2VydmVyRXJyb3IgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICB8fCAnJywKICAgICAgICAgICAgRXJyb3JNZXNzYWdlICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICA9PiAxLAogICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmFuc2Zvcm0gcGVuZGluZyB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17WWVhcn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNb250aH0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtEYXl9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17SG91cn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNaW51dGV9CiAgICAgICAgKQogICAgewogICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICMgY2hlY2sgc29tZSB2YWx1ZXMKICAgIExJTkU6CiAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICBuZXh0IExJTkUgaWYgISRHZXRQYXJhbXskTGluZX07CiAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkR2V0UGFyYW17JExpbmV9ICkgKSB7CiAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnRXJyb3JUeXBlJyB9ID0gJExpbmUgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCksCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0xvY2FsKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7ICRMaW5lIC4gJ0lzTG9jYWxBZGRyZXNzJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIE1ha2Ugc3VyZSBzZW5kZXIgaXMgY29ycmVjdCBvbmUuIFNlZSBidWcjMTQ4NzIgKCBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTE0ODcyICkuCiAgICAkR2V0UGFyYW17RnJvbX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKS0+U2VuZGVyKAogICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKCiAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2F2ZSBmb3JtIGlmIGEgZHJhZnQgd2FzIGxvYWRlZC4KICAgICAgICAlRXJyb3IgPSAoIExvYWRlZEZvcm1EcmFmdCA9PiAxICk7CiAgICB9CgogICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICBteSAlQXJ0aWNsZVBhcmFtOwogICAgaWYgKCByZWYoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSApIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKCiAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICRNdWx0aXBsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgU3RvcmVOZXcgPT4gMSwKICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgb3B0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbgogICAgICAgICAgICAjIGFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgc3VibWl0CiAgICAgICAgICAgICMgd2lsbCBjb250YWluIG9wdGlvbnMgdGhhdCB3ZXJlIGhpZGRlbiBmcm9tIHRoZSBhZ2VudAogICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgIG15IEBSZW1vdmVkT3B0aW9ucyA9ICRPYmplY3QtPkdldE9wdGlvbnNUb1JlbW92ZUFKQVgoJUdldFBhcmFtKTsKICAgICAgICAgICAgICAgIGlmIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJE11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUmVtb3ZlZE9wdGlvbiAoQFJlbW92ZWRPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRHZXRQYXJhbXskS2V5fSB9LCAkUmVtb3ZlZE9wdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gc2hpZnQgQFJlbW92ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aWNrZXQgcGFyYW1zCiAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgJE9iamVjdC0+QXJ0aWNsZU9wdGlvbigKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICVFcnJvciA9ICgKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgIEZvcm1JRCA9PiAkR2V0UGFyYW17Rm9ybUlEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvcgogICAgaWYgKCVFcnJvcikgewoKICAgICAgICBteSAkUXVldWVJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFF1ZXVlSUQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgbXkgJE91dHB1dCAgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJFRpY2tldHtTTEFJRH0sCiAgICAgICAgICAgIE5leHRTdGF0ZXMgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZEhUTUwgICAgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyByZXBsYWNlIDxPVE9CT19USUNLRVRfU1RBVEU+IHdpdGggbmV4dCB0aWNrZXQgc3RhdGUgbmFtZQogICAgaWYgKCROZXh0U3RhdGUpIHsKICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oJmx0O3w8KU9UT0JPX1RJQ0tFVF9TVEFURSgmZ3Q7fD4pLyROZXh0U3RhdGUvZzsKICAgIH0KCiAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnRzCiAgICBteSBAQXR0YWNobWVudERhdGEgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICBGb3JtSUQgPT4gJEdldFBhcmFte0Zvcm1JRH0sCiAgICApOwoKICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICApOwogICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgfQoKICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgaWYgKCAkQ29udGVudElEICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSApIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICMgSUYgdGhlIGltYWdlIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGJvZHkgc2V0IGl0IGFzIGlubGluZS4KICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ID1+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gPSAnaW5saW5lJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSB7CgogICAgICAgICAgICAgICAgICAgICMgSWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5LgogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICB9CiAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAjIHZlcmlmeSBIVE1MIGRvY3VtZW50CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIGVtYWlsCiAgICBteSAkVG8gPSAnJzsKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRHZXRQYXJhbXskS2V5fTsKICAgICAgICBpZiAoJFRvKSB7CiAgICAgICAgICAgICRUbyAuPSAnLCAnOwogICAgICAgIH0KICAgICAgICAkVG8gLj0gJEdldFBhcmFteyRLZXl9OwogICAgfQoKICAgIG15ICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgaWYgKCAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50fSApIHsKICAgICAgICAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPSAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID8gMSA6IDA7CiAgICB9CgogICAgbXkgJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKAogICAgICAgIENoYW5uZWxOYW1lID0+ICdFbWFpbCcsCiAgICApOwoKICAgICMgR2V0IGF0dHJpYnV0ZXMgbGlrZSBzZW5kZXIgYWRkcmVzcy4KICAgIG15ICVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPkF0dHJpYnV0ZXMoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRGF0YSAgICAgPT4ge30sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkQXJ0aWNsZUlEID0gJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gJElzVmlzaWJsZUZvckN1c3RvbWVyLAogICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdGb3J3YXJkJywKICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiXCVcJSRUbyIsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJERhdGF7RnJvbX0sCiAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgIEJjYyAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCY2N9LAogICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgIEluUmVwbHlUbyAgICAgICAgICAgID0+ICRHZXRQYXJhbXtJblJlcGx5VG99LAogICAgICAgIFJlZmVyZW5jZXMgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZWZlcmVuY2VzfSwKICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICApOwoKICAgICMgZXJyb3IgcGFnZQogICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgdGltZSBhY2NvdW50aW5nCiAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBkeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNldCB0aGUgb2JqZWN0IElEIChUaWNrZXRJRCBvciBBcnRpY2xlSUQpIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgIG15ICRPYmplY3RJRCA9ICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgPyAkQXJ0aWNsZUlEIDogJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc3RhdGUKICAgIGlmICgkTmV4dFN0YXRlKSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIFN0YXRlICAgICA9PiAkTmV4dFN0YXRlLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdWxkIEkgc2V0IGFuIHVubG9jaz8KICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSBwcmUtc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRHZXRQYXJhbXtGb3JtSUR9ICk7CgogICAgIyBJZiBmb3JtIHdhcyBjYWxsZWQgYmFzZWQgb24gYSBkcmFmdCwKICAgICMgICBkZWxldGUgZHJhZnQgc2luY2UgaXRzIGNvbnRlbnQgaGFzIG5vdyBiZWVuIHVzZWQuCiAgICBpZiAoCiAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGQgbm90IGRlbGV0ZSBkcmFmdCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyByZWRpcmVjdAogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kKICAgICAgICAmJiAhJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpSZWRpcmVjdEFmdGVyQ2xvc2VEaXNhYmxlZCcpCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCcgKSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCIsCiAgICApOwp9CgpzdWIgQWpheFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcjsKICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbSA9ICV7ICRTZWxmLT57QUNMQ29tcGF0R2V0UGFyYW19IH07CgogICAgbXkgJUdldFBhcmFtRXh0ZW5kZWQgPSAkU2VsZi0+X0dldEV4dGVuZGVkUGFyYW1zKCk7CgogICAgbXkgJUdldFBhcmFtICAgICAgICAgICAgPSAleyAkR2V0UGFyYW1FeHRlbmRlZHtHZXRQYXJhbX0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyICAgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lcn0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2MgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lckNjfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2MgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9OwoKICAgIG15IEBFeHRlbmRlZERhdGE7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgSk9CIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkTXVsdGlwbGU7CgogICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICMgZ2V0IEFKQVggcGFyYW0gdmFsdWVzCiAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRQYXJhbUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbiB2aXNpYmxlCiAgICAgICAgICAgICMgdG8gdGhlIGFnZW50LiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgbXkgQE9wdGlvbnNUb1JlbW92ZSA9ICRPYmplY3QtPkdldE9wdGlvbnNUb1JlbW92ZUFKQVgoJUdldFBhcmFtKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyRPcHRpb25Ub1JlbW92ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoJEtleSkgewogICAgICAgICAgICAgICAgcHVzaCBARXh0ZW5kZWREYXRhLCB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAkTXVsdGlwbGUsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRJdGVtICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRJdGVtOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZEl0ZW0gfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICk7CgogICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICBteSBARHluYW1pY0ZpZWxkQUpBWDsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICB9CgogICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICApIHx8ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb21wb3NlU3RhdGVJRCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICBdLAogICAgKTsKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5leHQgc3RhdGVzCiAgICBteSAlTmV4dFN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMQogICAgKTsKCiAgICAjIGNyZWF0ZSBhIHN0cmluZyB3aXRoIHRoZSBxdW90ZWQgZHluYW1pYyBmaWVsZCBuYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkTmFtZXMpICkgewogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyREeW5hbWljRmllbGROYW1lc30gKSB7CiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGROYW1lc1N0cmd9IC49ICIsICciIC4gJEZpZWxkIC4gIiciOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgIG15ICVTdGF0ZTsKICAgIGlmICggISRQYXJhbXtDb21wb3NlU3RhdGVJRH0gKSB7CiAgICAgICAgJFN0YXRle1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17Q29tcG9zZVN0YXRlSUR9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb21wb3NlU3RhdGVJRCcsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICVTdGF0ZSwKICAgICk7CgogICAgJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSA9ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgaWYgKCAkU2VsZi0+e0dldFBhcmFtfS0+e0lzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudH0gKSB7CiAgICAgICAgJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSA9ICRTZWxmLT57R2V0UGFyYW19LT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID8gMSA6IDA7CiAgICB9CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yIG15ICRFcnJvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEVycm9yfSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JEVycm9yfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdXNlZCBjYWxlbmRhcgogICAgbXkgJENhbGVuZGFyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRDYWxlbmRhckdldCgKICAgICAgICBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICBTTEFJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICApOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgIENhbGVuZGFyICAgICAgICAgICAgID0+ICRDYWxlbmRhciwKICAgICk7CgogICAgIyBNdWx0aXBsZS1BdXRvY29tcGxldGUKICAgICMgQ2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJCY2MgKSB7CiAgICAgICAgJFBhcmFte0JjY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJCY2MrKywKICAgICAgICB9LAogICAgKTsKCiAgICAjIFRvCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlcisrLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RvSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1RvSXNMb2NhbEFkZHJlc3N9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57QmNjRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyB0aGUgY3VzdG9tZXIgdXNlciBhZGRyZXNzIGJvb2sgaWYgdGhlIG1vZHVsZSBpcyByZWdpc3RlcmVkIGFuZCBqYXZhIHNjcmlwdCBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50Q3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2t9CiAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte09wdGlvbkN1c3RvbWVyVXNlckFkZHJlc3NCb29rfSA9IDE7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRBdHRhY2htZW50LT57Q29udGVudElEfSApOwogICAgICAgICAgICBpZiAoICRQYXJhbXtCb2R5fSA9fiAvQ29udGVudElEPVxRJENvbnRlbnRJRExpbmtFbmNvZGVcRS9pICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICB9CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ0R5bmFtaWNGaWVsZE5hbWVzJywKICAgICAgICBWYWx1ZSA9PiAkRHluYW1pY0ZpZWxkTmFtZXMsCiAgICApOwoKICAgIG15ICRMb2FkZWRGb3JtRHJhZnQ7CiAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewogICAgICAgICRMb2FkZWRGb3JtRHJhZnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdEdldCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgIEdldENvbnRlbnQgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSBAQXJ0aWNsZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgT25seUxhc3QgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoQEFydGljbGVzKSB7CiAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZSA9ICRBcnRpY2xlc1swXTsKCiAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWU7CiAgICAgICAgICAgIGlmICggJExhc3RBcnRpY2xlLT57Q3JlYXRlVGltZX0gKSB7CiAgICAgICAgICAgICAgICBteSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExhc3RBcnRpY2xlLT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdEFydGljbGVTeXN0ZW1UaW1lID0gJExhc3RBcnRpY2xlU3lzdGVtVGltZU9iamVjdC0+VG9FcG9jaCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRm9ybURyYWZ0U3lzdGVtVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRTeXN0ZW1UaW1lID0gJEZvcm1EcmFmdFN5c3RlbVRpbWVPYmplY3QtPlRvRXBvY2goKTsKCiAgICAgICAgICAgIGlmICggISRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgfHwgJEZvcm1EcmFmdFN5c3RlbVRpbWUgPD0gJExhc3RBcnRpY2xlU3lzdGVtVGltZSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtGb3JtRHJhZnRPdXRkYXRlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJExvYWRlZEZvcm1EcmFmdCkgKSB7CgogICAgICAgICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VCeU5hbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlck5hbWUoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlQnl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRGb3J3YXJkJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEZvcm1EcmFmdCAgICAgID0+ICRDb25maWctPntGb3JtRHJhZnR9LAogICAgICAgICAgICBGb3JtRHJhZnRJRCAgICA9PiAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSwKICAgICAgICAgICAgRm9ybURyYWZ0VGl0bGUgPT4gJExvYWRlZEZvcm1EcmFmdCA/ICRMb2FkZWRGb3JtRHJhZnQtPntUaXRsZX0gOiAnJywKICAgICAgICAgICAgRm9ybURyYWZ0TWV0YSAgPT4gJExvYWRlZEZvcm1EcmFmdCwKICAgICAgICB9LAogICAgKTsKfQoKc3ViIF9HZXRGaWVsZHNUb1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBVcGRhdGFibGVGaWVsZHM7CgogICAgIyBzZXQgdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSB1cGRhdGVhYmxlIHZpYSBBSkFYVXBkYXRlCiAgICBpZiAoICEkUGFyYW17T25seUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIEBVcGRhdGFibGVGaWVsZHMgPSBxdyggQ29tcG9zZVN0YXRlSUQgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgIHB1c2ggQFVwZGF0YWJsZUZpZWxkcywgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiBcQFVwZGF0YWJsZUZpZWxkczsKfQoKc3ViIF9HZXRFeHRlbmRlZFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVHZXRQYXJhbSA9ICV7ICRTZWxmLT57R2V0UGFyYW19IH07CgogICAgIyBoYXNoIGZvciBjaGVjayBkdXBsaWNhdGVkIGVudHJpZXMKICAgIG15ICVBZGRyZXNzZXNMaXN0OwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyOwogICAgbXkgJEN1c3RvbWVyc051bWJlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyU2VsZWN0ZWQnICkgICAgICAgICAgICAgICAgfHwgJyc7CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXIpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlciApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRTZWxlY3RlZCBlcSAkQ291bnQgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJRdWV1ZV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgICAgICBpZiAoJEN1c3RvbWVyRWxlbWVudCkgewoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnQpICkgewogICAgICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclF1ZXVlIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlID0gJENvdW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXIsIHsKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAkQ3VzdG9tZXJTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2csCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlckNjICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlDYyAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZUNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJRdWV1ZV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnRDYykgewoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9ID0gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckNjICAgID0gJyc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudENjKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ICYmICRDdXN0b21lckVycm9yQ2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4Q2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJDYysrOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckNjIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQ2MgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgJENvdW50QXV4Q2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUNjIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlQ2MgPSAkQ291bnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQ2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZENjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyUXVldWUgICAgPT4gJEN1c3RvbWVyUXVldWVDYywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyQmNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckJjYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAxOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uLiAkQ3VzdG9tZXJzTnVtYmVyQmNjICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50QmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleUJjYyAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWVCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJRdWV1ZV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnRCY2MpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtCY2N9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gPSAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnJzsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50QmNjKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eEJjYyAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUJjYyA9ICRDb3VudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQmNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0JjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyUXVldWUgICAgPT4gJEN1c3RvbWVyUXVldWVCY2MsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoCiAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICApOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AgentTicketMerge.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRNZXJnZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRNZXJnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIE1haWw6OkFkZHJlc3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwogICAgbXkgJUVycm9yOwogICAgbXkgJUdldFBhcmFtOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gVGlja2V0SUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCBjb25maWcgcGFyYW0KICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJUFjbEFjdGlvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICggJEFDTCB8fCBJc0hhc2hSZWZXaXRoRGF0YSggXCVBY2xBY3Rpb24gKSApIHsKCiAgICAgICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKCiAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICAgICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZSAmJiB3cml0ZSAobG9jaykgcGVybWlzc2lvbnMKICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKCiAgICAgICAgICAgIG15ICRMb2NrID0gJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNldCBuZXcgb3duZXIgaWYgdGlja2V0IG93bmVyIGlzIGRpZmZlcmVudCB0aGVuIGxvZ2dlZCB1c2VyLgogICAgICAgICAgICBpZiAoICRMb2NrICYmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSApIHsKCiAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHByZXZpb3VzIG93bmVyLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVzdG9yZSB0aWNrZXQgb3duZXIgb24gdW5kbyBhY3Rpb24uCiAgICAgICAgICAgICAgICAkUGFyYW17UHJldmlvdXNPd25lcn0gPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBTaG93IGxvY2sgc3RhdGUuCiAgICAgICAgICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e051bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIHRpY2tldCBvd25lciB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBiYWNrIGxpbmsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgc2hvdyBiYWNrIGxpbmsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG1lcmdlIGFjdGlvbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ01lcmdlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgYWxsIHBhcmFtZXRlcnMKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoIEZyb20gVG8gU3ViamVjdCBCb2R5IEluZm9ybVNlbmRlciBNYWluVGlja2V0TnVtYmVyICkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgbm8gcmljaCB0ZXh0IGlzIHVzZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgICAgICAgICBNYXhDaGFyYWN0ZXJzID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyksCiAgICAgICAgICAgICAgICBQbGFpblRleHQgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICAgICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAgICAgIyByZW1vdmluZyBibGFuayBzcGFjZXMgZnJvbSB0aGUgdGlja2V0IG51bWJlcgogICAgICAgICRDaGVja0l0ZW1PYmplY3QtPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgPT4gXCRHZXRQYXJhbXsnTWFpblRpY2tldE51bWJlcid9LAogICAgICAgICAgICBUcmltTGVmdCAgPT4gMSwKICAgICAgICAgICAgVHJpbVJpZ2h0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzb21lIHN0dWZmCiAgICAgICAgbXkgJE1haW5UaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEdldFBhcmFteydNYWluVGlja2V0TnVtYmVyJ30sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzb3VyY2UgYW5kIHRhcmdldCBUaWNrZXRJRCBhcmUgdGhlIHNhbWUgKGJ1ZyM4NjY3KQogICAgICAgIGlmICggJE1haW5UaWNrZXRJRCAmJiAkTWFpblRpY2tldElEID09ICRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NhblwndCBtZXJnZSB0aWNrZXQgd2l0aCBpdHNlbGYhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBlcnJvcnMKICAgICAgICBpZiAoICEkTWFpblRpY2tldElEICkgewogICAgICAgICAgICAkRXJyb3J7J01haW5UaWNrZXROdW1iZXJJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17SW5mb3JtU2VuZGVyfSApIHsKICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KCBUbyBTdWJqZWN0IEJvZHkgKSkgewogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyRQYXJhbWV0ZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtZXRlciAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3J3YXJkIGVtYWlsIGFkZHJlc3MoZXMpCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFte1RvfSApICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBZGRyZXNzID0gJEVtYWlsLT5hZGRyZXNzKCk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgICAgICAgICAgICAgICAgICBpZiAoCiMgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoIEFkZHJlc3MgPT4gJEFkZHJlc3MgKQojICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzICA9PiAkQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJElzTG9jYWwpCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEFkZHJlc3MgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRvRXJyb3JNc2cgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICRUb0Vycm9yTXNnICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsnVG9JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17SW5mb3JtU2VuZGVyQ2hlY2tlZH0gPSAkR2V0UGFyYW17SW5mb3JtU2VuZGVyfSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJzsKCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE1lcmdlJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJUdldFBhcmFtLCAlVGlja2V0LCAlRXJyb3IgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRNYWluVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICBteSAkVGlja2V0TWVyZ2VSZXN1bHQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRNZXJnZSgKICAgICAgICAgICAgTWFpblRpY2tldElEICA9PiAkTWFpblRpY2tldElELAogICAgICAgICAgICBNZXJnZVRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVycm9ycwogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRJRH0gPT0gJE1haW5UaWNrZXRJRAogICAgICAgICAgICB8fCAhJFRpY2tldE1lcmdlUmVzdWx0CiAgICAgICAgICAgIHx8ICRUaWNrZXRNZXJnZVJlc3VsdCBlcSAnTm9WYWxpZE1lcmdlU3RhdGVzJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFRpY2tldE1lcmdlUmVzdWx0IGVxICdOb1ZhbGlkTWVyZ2VTdGF0ZXMnICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICBJbmZvICAgICA9PiAnTm8gbWVyZ2Ugc3RhdGUgZm91bmQhIFBsZWFzZSBhZGQgYSB2YWxpZCBtZXJnZSBzdGF0ZSBiZWZvcmUgbWVyZ2UgYWN0aW9uLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0TWVyZ2UnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHNlbmQgY3VzdG9tZXIgaW5mbz8KICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17SW5mb3JtU2VuZGVyfSApIHsKICAgICAgICAgICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oJmx0O3w8KU9UT0JPX1RJQ0tFVCgmZ3Q7fD4pLyRUaWNrZXR7VGlja2V0TnVtYmVyfS9nOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9CiAgICAgICAgICAgICAgICAgICAgPX4gcy8oJmx0O3w8KU9UT0JPX01FUkdFX1RPX1RJQ0tFVCgmZ3Q7fD4pLyRHZXRQYXJhbXsnTWFpblRpY2tldE51bWJlcid9L2c7CgogICAgICAgICAgICAgICAgbXkgJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKAogICAgICAgICAgICAgICAgICAgIENoYW5uZWxOYW1lID0+ICdFbWFpbCcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRBcnRpY2xlSUQgPSAkRW1haWxBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVNlbmQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdTZW5kQW5zd2VyJywKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiTWVyZ2UgaW5mbyB0byAnJEdldFBhcmFte1RvfScuIiwKICAgICAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICAgICAgRW1haWwgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0VtYWlsfSwKICAgICAgICAgICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIG1lcmdlZCB0aWNrZXQKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JE1haW5UaWNrZXRJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgICAgICMgR2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZS4KICAgICAgICBteSBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgSWYgdGhlIHRpY2tldCBoYXMgbm8gY3VzdG9tZXIgYXJ0aWNsZSwgZ2V0IHRoZSBsYXN0IGFnZW50IGFydGljbGUuCiAgICAgICAgaWYgKCAhQEFydGljbGVzICkgewogICAgICAgICAgICBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBGaW5hbGx5LCBpZiBldmVyeXRoaW5nIGZhaWxlZCwgZ2V0IGxhdGVzdCBhcnRpY2xlLgogICAgICAgIGlmICggIUBBcnRpY2xlcyApIHsKICAgICAgICAgICAgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPbmx5TGFzdCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUFydGljbGU7CiAgICAgICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZXMpIHsKICAgICAgICAgICAgJUFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGV9ICktPkFydGljbGVHZXQoCiAgICAgICAgICAgICAgICAleyRBcnRpY2xlfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWVyZ2UgYm94CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBzYWx1dGF0aW9uCiAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CiAgICAgICAgbXkgJFNhbHV0YXRpb24gICAgICAgID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TYWx1dGF0aW9uKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgPT4gewogICAgICAgICAgICAgICAgJUFydGljbGUsCgogICAgICAgICAgICAgICAgIyBOT1RFIGluIGNhc2UgdGhhdCB3ZSBhbnN3ZXIgdG8gYSBjdXN0b21lciwgdGhlIGZvcm1lciBzZW5kZXIgKHRoZSBjdXN0b21lcikKICAgICAgICAgICAgICAgICMgICBub3cgYmVjb21lcyB0aGUgbmV3IHJlY2lwaWVudCBhbmQgdGhlIGZvcm1lciByZWNpcGllbnQgKHRoZSBPVE9CTyBzeXN0ZW0pCiAgICAgICAgICAgICAgICAjICAgbm93IGJlY29tZXMgdGhlIG5ldyBzZW5kZXIKICAgICAgICAgICAgICAgIEZyb20gPT4gJEFydGljbGV7U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyA/ICRBcnRpY2xle1RvfSAgIDogJEFydGljbGV7RnJvbX0sCiAgICAgICAgICAgICAgICBUbyAgID0+ICRBcnRpY2xle1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgPyAkQXJ0aWNsZXtGcm9tfSA6ICRBcnRpY2xle1RvfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICAgICAgbXkgJFNpZ25hdHVyZSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgPT4geyVBcnRpY2xlfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgc3ViamVjdCAuLi4KICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBmcm9tIC4uLgogICAgICAgIGlmICggJEFydGljbGV7U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyApIHsKICAgICAgICAgICAgJEFydGljbGV7VG99ID0gJEFydGljbGV7RnJvbX07CiAgICAgICAgfQoKICAgICAgICBteSAlQWRkcmVzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRTeXN0ZW1BZGRyZXNzKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAkQXJ0aWNsZXtGcm9tfSA9ICIkQWRkcmVzc3tSZWFsTmFtZX0gPCRBZGRyZXNze0VtYWlsfT4iOwoKICAgICAgICAjIGFkZCBzYWx1dGF0aW9uIGFuZCBzaWduYXR1cmUgdG8gYm9keQogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgIG15ICRCb2R5ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNZXJnZVRleHQnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2FsdXRhdGlvbgogICAgICAgICAgICAgICAgLiAnPGJyLz48YnIvPicKICAgICAgICAgICAgICAgIC4gJEJvZHkKICAgICAgICAgICAgICAgIC4gJzxici8+PGJyLz4nCiAgICAgICAgICAgICAgICAuICRTaWduYXR1cmU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTYWx1dGF0aW9uCiAgICAgICAgICAgICAgICAuICJcblxuIgogICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1lcmdlVGV4dCcpCiAgICAgICAgICAgICAgICAuICJcblxuIgogICAgICAgICAgICAgICAgLiAkU2lnbmF0dXJlOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRNZXJnZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJVRpY2tldCwgJUFydGljbGUsIH0KICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK</File>
        <File Location="Custom/Kernel/Output/HTML/ArticleAction/AgentTicketCompose.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL091dHB1dC9IVE1ML0FydGljbGVBY3Rpb24vQWdlbnRUaWNrZXRDb21wb3NlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkFydGljbGVBY3Rpb246OkFnZW50VGlja2V0Q29tcG9zZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKIyBvcHRpb25hbCBBY2xBY3Rpb25Mb29rdXAKc3ViIENoZWNrQWNjZXNzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBDaGVjayBuZWVkZWQgc3R1ZmYuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0IEFydGljbGUgQ2hhbm5lbE5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFBhcmFte0NoYW5uZWxOYW1lfSBlcSAnRW1haWwnICYmICRQYXJhbXtBcnRpY2xlfS0+e1NlbmRlclR5cGV9IGVxICdzeXN0ZW0nICkgewoKICAgICAgICAjIHNraXAgZW1haWwgbm90aWZpY2F0aW9ucwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIGlmIG1vZHVsZSBpcyByZWdpc3RlcmVkCiAgICByZXR1cm4gaWYgISRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfTsKCiAgICAjIGNoZWNrIEFjbAogICAgcmV0dXJuIGlmICEkUGFyYW17QWNsQWN0aW9uTG9va3VwfS0+e0FnZW50VGlja2V0Q29tcG9zZX07CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENvbXBvc2UnKTsKICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgIG15ICRPayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldH0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGlmICEkT2s7CiAgICB9CiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIG15ICRMb2NrZWQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0fS0+e1RpY2tldElEfQogICAgICAgICk7CiAgICAgICAgaWYgKCRMb2NrZWQpIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXR9LT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBpZiAhJEFjY2Vzc09rOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIEdldENvbmZpZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQ2hlY2sgbmVlZGVkIHN0dWZmLgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpY2tldCBBcnRpY2xlIFN0YW5kYXJkVGVtcGxhdGVzIFR5cGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZXQgU3RhbmRhcmRSZXNwb25zZXNTdHJnCiAgICAjIG15ICVTdGFuZGFyZFJlc3BvbnNlSGFzaCA9ICV7ICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30gfHwge30gfTsKICAgIG15ICVTdGFuZGFyZFJlc3BvbnNlSGFzaCA9ICV7ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlc30tPntBbnN3ZXJ9IHx8IHt9IH07CgogICAgIyBnZXQgcmV2ZXJzIFN0YW5kYXJkUmVzcG9uc2VIYXNoIGJlY2F1c2Ugd2UgbmVlZCB0byBzb3J0IGJ5IFZhbHVlcwogICAgIyBmcm9tICVSZXZlcnNlU3RhbmRhcmRSZXNwb25zZUhhc2ggd2UgZ2V0IHZhbHVlIG9mIEtleSBieSAlU3RhbmRhcmRSZXNwb25zZUhhc2ggVmFsdWUKICAgICMgYW5kIEBTdGFuZGFyZFJlc3BvbnNlQXJyYXkgaXMgY3JlYXRlZCBhcyBhcnJheSBvZiBoYXNoZXMgd2l0aCBlbGVtZW50cyBLZXkgYW5kIFZhbHVlCgogICAgbXkgJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCA9IHJldmVyc2UgJVN0YW5kYXJkUmVzcG9uc2VIYXNoOwogICAgbXkgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSAgICAgICA9IG1hcCB7CiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoeyRffSwKICAgICAgICAgICAgVmFsdWUgPT4gJF8KICAgICAgICB9CiAgICB9IHNvcnQgdmFsdWVzICVTdGFuZGFyZFJlc3BvbnNlSGFzaDsKCiAgICAjIHVzZSB0aGlzIGFycmF5IHR3aWNlIChhbHNvIGZvciBSZXBseSBBbGwpLCBzbyBjb3B5IGl0IGZpcnN0CiAgICBteSBAU3RhbmRhcmRSZXNwb25zZUFycmF5UmVwbHlBbGwgPSBAU3RhbmRhcmRSZXNwb25zZUFycmF5OwoKICAgICMgYnVpbGQgSFRNTCBzdHJpbmcKICAgIG15ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgIElEICAgICAgICAgICA9PiAnUmVzcG9uc2VJRCcgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFNtYWxsJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXEBTdGFuZGFyZFJlc3BvbnNlQXJyYXksCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICApOwoKICAgIG15IEBNZW51SXRlbXM7CgogICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgSXRlbVR5cGUgICAgICAgICAgICAgID0+ICdEcm9wZG93bicsCiAgICAgICAgRHJvcGRvd25UeXBlICAgICAgICAgID0+ICdSZXBseScsCiAgICAgICAgU3RhbmRhcmRSZXNwb25zZXNTdHJnID0+ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcsCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnUmVwbHknKSwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICA9PiAnUmVwbHknIC4gJFBhcmFte0FydGljbGV9LT57QXJ0aWNsZUlEfSwKICAgICAgICBSZXNwb25zZUVsZW1lbnRJRCAgICAgPT4gJ1Jlc3BvbnNlSUQnIC4gJFBhcmFte0FydGljbGV9LT57QXJ0aWNsZUlEfSwKICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgfTsKCiAgICAjIGNoZWNrIGlmIHJlcGx5IGFsbCBpcyBuZWVkZWQKICAgIG15ICRSZWNpcGllbnRzID0gJyc7CiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAocXcoRnJvbSBUbyBDYykpIHsKICAgICAgICBuZXh0IEtFWSBpZiAhJFBhcmFte0FydGljbGV9LT57JEtleX07CiAgICAgICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICcsICc7CiAgICAgICAgfQogICAgICAgICRSZWNpcGllbnRzIC49ICRQYXJhbXtBcnRpY2xlfS0+eyRLZXl9OwogICAgfQogICAgbXkgJFJlY2lwaWVudENvdW50ID0gMDsKICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgIG15ICRFbWFpbFBhcnNlciA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgTW9kZSA9PiAnU3RhbmRhbG9uZScsCiAgICAgICAgKTsKICAgICAgICBteSBAQWRkcmVzc2VzID0gJEVtYWlsUGFyc2VyLT5TcGxpdEFkZHJlc3NMaW5lKCBMaW5lID0+ICRSZWNpcGllbnRzICk7CiAgICAgICAgQUREUkVTUzoKICAgICAgICBmb3IgbXkgJEFkZHJlc3MgKEBBZGRyZXNzZXMpIHsKICAgICAgICAgICAgbXkgJEVtYWlsID0gJEVtYWlsUGFyc2VyLT5HZXRFbWFpbEFkZHJlc3MoIEVtYWlsID0+ICRBZGRyZXNzICk7CiAgICAgICAgICAgIG5leHQgQUREUkVTUyBpZiAhJEVtYWlsOwogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJEVtYWlsLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldH0tPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICRJc0xvY2FsOwogICAgICAgICAgICAkUmVjaXBpZW50Q291bnQrKzsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRSZWNpcGllbnRDb3VudCA+IDEgKSB7CgogICAgICAgICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgSUQgICAgICAgICAgID0+ICdSZXNwb25zZUlEQWxsJyAuICRQYXJhbXtBcnRpY2xlfS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFNtYWxsJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAU3RhbmRhcmRSZXNwb25zZUFycmF5UmVwbHlBbGwsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICAgICAgICAgICAgPT4gJ0Ryb3Bkb3duJywKICAgICAgICAgICAgRHJvcGRvd25UeXBlICAgICAgICAgID0+ICdSZXBseScsCiAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZXBseSBBbGwnKSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgPT4gJ0FnZW50VGlja2V0Q29tcG9zZScsCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICA9PiAnUmVwbHlBbGwnIC4gJFBhcmFte0FydGljbGV9LT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgUmVwbHlBbGwgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlc3BvbnNlRWxlbWVudElEICAgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBNZW51SXRlbXM7Cn0KCjE7Cg==</File>
        <File Location="scripts/test/PostMaster/AddressPool.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjMgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6TW9ja1RpbWUgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlJlZ2lzdGVyRHJpdmVyOwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCm15ICRRdWV1ZU9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwpteSAkQXJ0aWNsZU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKbXkgJFN5c3RlbUFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgID0+IDEsCiAgICAgICAgVXNlVG1wQXJ0aWNsZURpciA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CkZpeGVkVGltZVNldCgpOwoKIyBQb29sIHwgICAgICAgIEFkZHJlc3MgfCBRdWV1ZQojICAgUDEgICBhMXAxQG90b2JvLm9yZyAgICAgIHExCiMgICBQMSAgIGEycDFAb3RvYm8ub3JnCiMgICBQMiAgIGExcDJAb3RvYm8ub3JnICAgICAgcTIKIyAgIFAyICAgYTJwMkBvdG9iby5vcmcgICAgICBxNQojICAgUDMgICBhMXAzQG90b2JvLm9yZyAgICAgIHEzCiMgICBQMyAgIGEycDNAb3RvYm8ub3JnCiMgICAgICAgICAgYXhAb3RvYm8ub3JnCgojIFBvb2wgfCBEZWZRdWV1ZQojICAgUDEgICAgICAgICBxNAojICAgUDIgICAgICAgICBxNQojICAgUDMgICAgICAgICBxMwojICAgICAgICAgICAgICBxNQoKIyBhZGQgc3lzdGVtIGFkZHJlc3NlcwpteSAlU3lzdGVtQWRkcmVzc0lEczsKZm9yIG15ICRBZGRyZXNzICggcXcvYTFQMUBvdG9iby5vcmcgYTFwMkBvdG9Cby5vcmcgYTFwM0BvdG9iby5vcmcgYTJwMkBvdG9iby5vcmcgdW51c2VkQG90b2JvLm9yZy8gKSB7CiAgICBteSAkU3lzdGVtQWRkcmVzc0lEID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NBZGQoCiAgICAgICAgTmFtZSAgICAgPT4gJEFkZHJlc3MsCiAgICAgICAgUmVhbG5hbWUgPT4gJ0FQVGVzdCcsCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBRdWV1ZUlEICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICRTeXN0ZW1BZGRyZXNzSURzeyAkQWRkcmVzcyB9ID0gJFN5c3RlbUFkZHJlc3NJRDsKfQoKbXkgJVF1ZXVlQWRkcmVzc2VzID0gKAogICAgcTEgPT4gJ2ExUDFAb3RvYm8ub3JnJywKICAgIHEyID0+ICdhMXAyQG90b0JvLm9yZycsCiAgICBxMyA9PiAnYTFwM0BvdG9iby5vcmcnLAogICAgcTQgPT4gJ3VudXNlZEBvdG9iby5vcmcnLAogICAgcTUgPT4gJ2EycDJAb3RvYm8ub3JnJywKKTsKCiMgYWRkIHF1ZXVlcwpteSAlUXVldWVJRHM7CmZvciBteSAkUXVldWUgKCBrZXlzICVRdWV1ZUFkZHJlc3NlcyApIHsKICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUFkZCgKICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJFF1ZXVlLAogICAgICAgIFZhbGlkSUQgICAgICAgICA9PiAxLAogICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgIFN5c3RlbUFkZHJlc3NJRCA9PiAkU3lzdGVtQWRkcmVzc0lEc3sgJFF1ZXVlQWRkcmVzc2VzeyAkUXVldWUgfSB9LAogICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAkUXVldWVJRHN7ICRRdWV1ZSB9ID0gJFF1ZXVlSUQ7CgogICAgIyB1cGRhdGUgc3lzdGVtIGFkZHJlc3MKICAgIG15ICVTeXN0ZW1BZGRyZXNzRGF0YSA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgIElEID0+ICRTeXN0ZW1BZGRyZXNzSURzeyAkUXVldWVBZGRyZXNzZXN7ICRRdWV1ZSB9IH0sCiAgICApOwoKICAgICRTeXN0ZW1BZGRyZXNzRGF0YXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwoKICAgICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzVXBkYXRlKAogICAgICAgICVTeXN0ZW1BZGRyZXNzRGF0YSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKfQoKIyBzZXQgYWRkcmVzcyBwb29scwp7CiAgICBteSAlQWRkcmVzc1Bvb2xEYXRhID0gKAogICAgICAgIFBvb2wwMSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnUDEnLAogICAgICAgICAgICBFbWFpbHMgPT4gWwogICAgICAgICAgICAgICAgJ2ExcDFAb3RvYm8ub3JnJywKICAgICAgICAgICAgICAgICdhMnAxQG90b2JvLm9yZycsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERlZmF1bHRRdWV1ZSA9PiAncTQnLAogICAgICAgIH0sCiAgICAgICAgUG9vbDAyID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdQMicsCiAgICAgICAgICAgIEVtYWlscyA9PiBbCiAgICAgICAgICAgICAgICAnYTFwMkBvdG9iby5vcmcnLAogICAgICAgICAgICAgICAgJ2EycDJAb3RvYm8ub3JnJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGVmYXVsdFF1ZXVlID0+ICdxNScsCiAgICAgICAgfSwKICAgICAgICBQb29sMDMgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ1AzJywKICAgICAgICAgICAgRW1haWxzID0+IFsKICAgICAgICAgICAgICAgICdBMXAzQG90b2JvLm9yZycsCiAgICAgICAgICAgICAgICAnQTJwM0BvdG9iby5vcmcnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBEZWZhdWx0UXVldWUgPT4gJ3EzJywKICAgICAgICB9LAogICAgKTsKCiAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgS2V5ICAgPT4gJ1Bvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJywKICAgICAgICBWYWx1ZSA9PiBcJUFkZHJlc3NQb29sRGF0YSwKICAgICk7Cn0KCiMgU3RhcnQgdGVzdHMKCiMgVGVzdDogVGlja2V0I3ggaW4gcTEgKGlnbm9yZSBkZWZxdWV1ZSBvZiBhMnAxKSwgVGlja2V0I3kgaW4gcTIsIG5vdGhpbmcgaW4gcTUKbXkgJEVtYWlsID0gR2VuZXJhdGVFbWFpbCgKICAgIFRvICAgICAgICA9PiAnYTJwMUBvdG9iby5vckcsIGExcDFAb3RvYm8ub3JHLCBhMXAyQG90b2JvLm9yRywgbm90QG91cnMuY29tJywKICAgIFN1YmplY3QgICA9PiAnSW5pdGlhbCcsCiAgICBNZXNzYWdlSUQgPT4gJzwyMDIzMDIxNDAwMjgxNC5BZGRyZXNzUG9vbHMxQHRlc3Q+JywKKTsKCm15ICggJFJldHVybiwgQFRpY2tldElEcyApID0gUmVhZEVtYWlsKCAkRW1haWwsIDEgKTsKCiMgdHdvIHRpY2tldHMgc2hvdWxkIGJlIGNyZWF0ZWQuLi4KJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAyLAogICAgIk1haWwxIC0gY3JlYXRlIHR3byB0aWNrZXRzLiIsCik7CgpteSBAVGVzdFRpY2tldHM7CmZvciBteSAkSUQgKCBAVGlja2V0SURzICkgewogICAgcHVzaCBAVGVzdFRpY2tldHMsIHsKICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRJRCApCiAgICB9Owp9CgojIHRpY2tldCAxIHNob3VsZCBiZSBpbiBxMQokU2VsZi0+SXMoCiAgICAkVGVzdFRpY2tldHNbMF17UXVldWV9IC8vICcnLAogICAgJ3ExJywKICAgICJNYWlsMSAtIFRpY2tldDEgaXMgaW4gcTEuIiwKKTsKCiMgdGlja2V0IDIgc2hvdWxkIGJlIGluIHEyCiRTZWxmLT5JcygKICAgICRUZXN0VGlja2V0c1sxXXtRdWV1ZX0gLy8gJycsCiAgICAncTInLAogICAgIk1haWwxIC0gVGlja2V0MiBpcyBpbiBxMi4iLAopOwoKbXkgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgVGlja2V0SUQgPT4gJFRlc3RUaWNrZXRzWzBde1RpY2tldElEfSwKKTsKCiMgdGlja2V0IDEgc2hvdWxkIGhhdmUgZXhhY3RseSAxIGFydGljbGUKJFNlbGYtPklzKAogICAgc2NhbGFyIEBBcnRpY2xlcywKICAgIDEsCiAgICAiTWFpbDEgLSBUaWNrZXQxIGhhcyAxIGFydGljbGUuIiwKKTsKCiMgVGVzdDogVGlja2V0MSNOdW1iZXIgLT4gRm9sbG93VXAgaW4gcTIsIE5ldyBpbiBxMyAoZGVmcXVldWUpCm15ICROZXdTdWJqZWN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgVGlja2V0TnVtYmVyID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXROdW1iZXJ9LAogICAgU3ViamVjdCAgICAgID0+ICdJbml0aWFsJywKICAgIEFjdGlvbiAgICAgICA9PiAnUmVwbHknLAopOwoKJEVtYWlsID0gR2VuZXJhdGVFbWFpbCgKICAgIFRvICAgICAgICA9PiAnYTFwMkBvVG9iby5vcmcsIGEycDNAb3RvYm8ub3JHJywKICAgIFN1YmplY3QgICA9PiAkTmV3U3ViamVjdCwKICAgIE1lc3NhZ2VJRCA9PiAnPDIwMjMwMjE0MDAyODE0LkFkZHJlc3NQb29sczJAdGVzdD4nLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoICRFbWFpbCApOwoKIyB0d28gYXJ0aWNsZXMgc2hvdWxkIGJlIGNyZWF0ZWQuLi4KJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAyLAogICAgIk1haWwyIC0gY3JlYXRlIHR3byBhcnRpY2xlcy4iLAopOwoKIyB0aWNrZXQgMSBzaG91bGQgYmUgdGlja2V0IDIgb2YgbGFzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzBdLAogICAgJFRlc3RUaWNrZXRzWzFde1RpY2tldElEfSwKICAgICJNYWlsMiAtIFRpY2tldDEgaXMgb2xkIFRpY2tldDIuIiwKKTsKCnB1c2ggQFRlc3RUaWNrZXRzLCB7CiAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRUaWNrZXRJRHNbMV0gKSwKfTsKCiMgdGlja2V0IDMgc2hvdWxkIGJlIGluIHEzCiRTZWxmLT5JcygKICAgICRUZXN0VGlja2V0c1syXXtRdWV1ZX0gLy8gJycsCiAgICAncTMnLAogICAgIk1haWwyIC0gVGlja2V0MiBpcyBpbiBxMy4iLAopOwoKIyBrZWVwIGZvciBsYXRlcgpteSAkRW1haWwyID0gJEVtYWlsOwoKIyBUZXN0OiBSZSBUaWNrZXQzI051bWJlciBjcmVhdGVzIGFydGljbGUgaW4gVGlja2V0MQokTmV3U3ViamVjdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgIFRpY2tldE51bWJlciA9PiAkVGVzdFRpY2tldHNbMl17VGlja2V0TnVtYmVyfSwKICAgIFN1YmplY3QgICAgICA9PiAnSW5pdGlhbCcsCiAgICBBY3Rpb24gICAgICAgPT4gJ1JlcGx5JywKKTsKCiRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2ExcDFAb3RvYm8ub3JnJywKICAgIFN1YmplY3QgICA9PiAkTmV3U3ViamVjdCwKICAgIE1lc3NhZ2VJRCA9PiAnPDIwMjMwMjE0MDAyODE0LkFkZHJlc3NQb29sczNAdGVzdD4nLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoICRFbWFpbCApOwoKIyB0aWNrZXQgMSBzaG91bGQgYmUgdGlja2V0IDEgb2YgdGhlIGZpcnN0IGVtYWlsCiRTZWxmLT5JcygKICAgICRUaWNrZXRJRHNbMF0sCiAgICAkVGVzdFRpY2tldHNbMF17VGlja2V0SUR9LAogICAgIk1haWwzIC0gVGlja2V0MSBpcyBvbGQgVGlja2V0MS4iLAopOwoKQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgVGlja2V0SUQgPT4gJFRlc3RUaWNrZXRzWzBde1RpY2tldElEfSwKKTsKCiMgdGlja2V0IDEgc2hvdWxkIGhhdmUgMiBhcnRpY2xlcwokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFydGljbGVzLAogICAgMiwKICAgICJNYWlsMyAtIFRpY2tldDEgaGFzIDIgYXJ0aWNsZXMuIiwKKTsKCiMgY2xlYW4gYWxsIFRpY2tldG51bWJlcnMKbXkgJENsZWFuZWRTdWJqZWN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdENsZWFuKAogICAgVGlja2V0TnVtYmVyID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXROdW1iZXJ9LAogICAgU3ViamVjdCAgICAgID0+ICcnCiAgICAgICAgLiAnWycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgLiAkVGVzdFRpY2tldHNbMF17VGlja2V0TnVtYmVyfSAuICddJwogICAgICAgIC4gJ1snIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpIC4gJFRlc3RUaWNrZXRzWzFde1RpY2tldE51bWJlcn0gLiAnXScKICAgICAgICAuICdbJyAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJykgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKSAuICRUZXN0VGlja2V0c1syXXtUaWNrZXROdW1iZXJ9IC4gJ10nCiAgICAgICAgLiAnWycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgLiAnMjAwMzAzMDExMjM0MTIzNDAwMDFdIFRlc3QnLAogICAgU2l6ZSAgICAgICAgID0+IDAsCik7CgojIGFsbCBsaW5rZWQgdGlja2V0IG51bWJlcnMgYXJlIGNsZWFuZWQKJFNlbGYtPklzKAogICAgJENsZWFuZWRTdWJqZWN0LAogICAgJ1snIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpIC4gJzIwMDMwMzAxMTIzNDEyMzQwMDAxXSBUZXN0JywKICAgICJUaWNrZXRTdWJqZWN0Q2xlYW4gaW5jbHVkZXMgaW50ZXJkaXYgdGlja2V0IG51bWJlcnMuIiwKKTsKCiMgVGVzdDogc3RhbmRhcmQgY2FzZQokRW1haWwgPSBHZW5lcmF0ZUVtYWlsKAogICAgVG8gICAgICAgID0+ICdheEBvdG9iby5vcmcnLAogICAgU3ViamVjdCAgID0+ICdLZWluIFBvb2wnLAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzNEB0ZXN0PicsCik7CgooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsICk7CgojIG9uZSB0aWNrZXQgc2hvdWxkIGJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAxLAogICAgIk1haWw0IC0gYSB0aWNrZXQgaXMgY3JlYXRlZC4iLAopOwoKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFRpY2tldElEc1swXSApOwoKIyB0aWNrZXQgaXMgaW4gZGVmYXVsdCBxdWV1ZQokU2VsZi0+SXMoCiAgICAkVGlja2V0e1F1ZXVlfSwKICAgICRDb25maWdPYmplY3QtPkdldCgnUG9zdG1hc3RlckRlZmF1bHRRdWV1ZScpLAogICAgIk1haWw0IC0gdGlja2V0IGlzIGNyZWF0ZWQgaW4gZGVmIHF1ZXVlLiIsCik7CgojIFRlc3Q6IGlnbm9yZSBhbHJlYWR5IHJlY2VpdmVkIG1haWxzCiggJFJldHVybiwgQFRpY2tldElEcyApID0gUmVhZEVtYWlsKCAkRW1haWwyICk7CgojIG5vIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICAkUmV0dXJuLAogICAgNSwKICAgICJNYWlsNSAtIG1haWwgaWdub3JlZC4iLAopOwoKIyBubyB0aWNrZXQgc2hvdWxkIGJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAwLAogICAgIk1haWw1IC0gbm8gYXJ0aWNsZS4iLAopOwoKIyBUZXN0OiBSZSBUaWNrZXQzI051bWJlciBjcmVhdGVzIGFydGljbGUgaW4gVGlja2V0MQokTmV3U3ViamVjdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgIFRpY2tldE51bWJlciA9PiAkVGVzdFRpY2tldHNbMl17VGlja2V0TnVtYmVyfSwKICAgIFN1YmplY3QgICAgICA9PiAnSW5pdGlhbCcsCiAgICBBY3Rpb24gICAgICAgPT4gJ1JlcGx5JywKKTsKCiRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2ExcDFAb3RvYm8ub3JnLCBhMXAyQG90b2JvLm9yZycsCiAgICBTdWJqZWN0ICAgPT4gJE5ld1N1YmplY3QsCiAgICBNZXNzYWdlSUQgPT4gJzwyMDIzMDIxNDAwMjgxNC5BZGRyZXNzUG9vbHM2QHRlc3Q+JywKICAgIFhIZWFkZXIgICA9PiAiXG5YLU9UT0JPLUZvbGxvd1VwLVF1ZXVlOiBxNSIsCik7CgooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsICk7CgojIHRpY2tldCAxIHNob3VsZCBiZSB0aWNrZXQgMSBvZiB0aGUgZmlyc3QgZW1haWwKJFNlbGYtPklzKAogICAgJFRpY2tldElEc1swXSwKICAgICRUZXN0VGlja2V0c1swXXtUaWNrZXRJRH0sCiAgICAiTWFpbDYgLSBUaWNrZXQxIGlzIG9sZCBUaWNrZXQxLiIsCik7CgojIHRpY2tldCAyIHNob3VsZCBiZSB0aWNrZXQgMiBvZiB0aGUgZmlyc3QgZW1haWwKJFNlbGYtPklzKAogICAgJFRpY2tldElEc1sxXSwKICAgICRUZXN0VGlja2V0c1sxXXtUaWNrZXRJRH0sCiAgICAiTWFpbDYgLSBUaWNrZXQyIGlzIG9sZCBUaWNrZXQyLiIsCik7Cgpmb3IgbXkgJGkgKCAwLCAxICkgewogICAgJFRlc3RUaWNrZXRzWyRpXSA9IHsgJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkVGlja2V0SURzWyRpXSApIH07Cn0KCiMgdGlja2V0cXVldWUgMSBzaG91bGQgc3RpbGwgYmUgcTEKJFNlbGYtPklzKAogICAgJFRlc3RUaWNrZXRzWzBdLT57UXVldWV9LAogICAgJ3ExJywKICAgICJNYWlsNiAtIFF1ZXVlIG9mIFRpY2tldCAxIGlzIHExLiIsCik7CgojIHRpY2tldHF1ZXVlIDIgc2hvdWxkIG5vdyBiZSBxNSBvZiB0aGUgWC1PVE9CTy1Gb2xsb3dVcC1RdWV1ZSBoZWFkZXIKJFNlbGYtPklzKAogICAgJFRlc3RUaWNrZXRzWzFdLT57UXVldWV9LAogICAgJ3E1JywKICAgICJNYWlsNiAtIFF1ZXVlIG9mIFRpY2tldCAyIGlzIHE1LiIsCik7CgojIFRlc3Q6IERvIG5vdCBpZ25vcmUgbWFpbHMgc2VudCBmcm9tIHRoZSBzeXN0ZW0KbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5CYWNrZW5kRm9yQ2hhbm5lbChDaGFubmVsTmFtZSA9PiAnRW1haWwnKTsKJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXRJRH0sCiAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgRnJvbSAgICAgICAgICAgPT4gJyJQMSIgPGExcDFAb3RvYm8ub3JnPicsCiAgICAgICAgVG8gICAgICAgICAgICAgPT4gJyJQMiIgPGExcDJAb3RvYm8ub3JnPicsCiAgICAgICAgU3ViamVjdCAgICAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLAogICAgICAgIEJvZHkgICAgICAgICAgID0+ICd0aGUgbWVzc2FnZSB0ZXh0JywKICAgICAgICBNZXNzYWdlSUQgICAgICA9PiAnPDIwMjMwMjE0MDAyODE0LkFkZHJlc3NQb29sczdAdGVzdD4nLAogICAgICAgIENvbnRlbnRUeXBlICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1JywKICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAnQWRkTm90ZScsCiAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJ1NvbWUgZnJlZSB0ZXh0IScsCiAgICAgICAgTm9BZ2VudE5vdGlmeSAgPT4gMSwKKTsKCiROZXdTdWJqZWN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgVGlja2V0TnVtYmVyID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXROdW1iZXJ9LAogICAgU3ViamVjdCAgICAgID0+ICdzb21lIHNob3J0IGRlc2NyaXB0aW9uJywKICAgIEFjdGlvbiAgICAgICA9PiAnUmVwbHknLAopOwoKJEVtYWlsID0gR2VuZXJhdGVFbWFpbCgKICAgIFRvICAgICAgICA9PiAnYTFwMkBvdG9iby5vcmcnLAogICAgU3ViamVjdCAgID0+ICROZXdTdWJqZWN0LAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzN0B0ZXN0PicsCik7CgooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsICk7CgojIG9uZSBhcnRpY2xlIHNob3VsZCBiZSBjcmVhdGVkCiRTZWxmLT5JcygKICAgIHNjYWxhciBAVGlja2V0SURzLAogICAgMSwKICAgICJNYWlsNyAtIG9uZSBhcnRpY2xlLiIsCik7CgojIHRpY2tldCAxIHNob3VsZCBiZSB0aWNrZXQgMiBvZiB0aGUgZmlyc3QgZW1haWwKJFNlbGYtPklzKAogICAgJFRpY2tldElEc1swXSwKICAgICRUZXN0VGlja2V0c1sxXXtUaWNrZXRJRH0sCiAgICAiTWFpbDcgLSBUaWNrZXQxIGlzIG9sZCBUaWNrZXQyLiIsCik7CgooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsICk7CgojIG9uIHNlY29uZCByb3VuZCB0aG91Z2gsIG1haWwgc2hvdWxkIGJlIGlnbm9yZWQKJFNlbGYtPklzKAogICAgJFJldHVybiwKICAgIDUsCiAgICAiTWFpbDcuNSAtIG1haWwgaWdub3JlZC4iLAopOwoKIyBubyB0aWNrZXQgc2hvdWxkIGJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAwLAogICAgIk1haWw3LjUgLSBubyBhcnRpY2xlLiIsCik7CgojIFRlc3Q6IERpc3BhdGNoaW5nIHZpYSBRdWV1ZQokRW1haWwgPSBHZW5lcmF0ZUVtYWlsKAogICAgVG8gICAgICAgID0+ICdhMXAxQG90b2JvLm9yZycsCiAgICBTdWJqZWN0ICAgPT4gJ05ldycsCiAgICBNZXNzYWdlSUQgPT4gJzwyMDIzMDIxNDAwMjgxNC5BZGRyZXNzUG9vbHM4QHRlc3Q+JywKKTsKCiggJFJldHVybiwgQFRpY2tldElEcyApID0gUmVhZEVtYWlsKCAkRW1haWwsICRRdWV1ZUlEc3txMn0gKTsKCiMgdHdvIHRpY2tldHMgc2hvdWxkIGJlIGNyZWF0ZWQuLi4KJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAyLAogICAgIk1haWw4IC0gY3JlYXRlIHR3byB0aWNrZXRzLiIsCik7CgpteSBAVGVzdDhUaWNrZXRzOwpmb3IgbXkgJElEICggQFRpY2tldElEcyApIHsKICAgIHB1c2ggQFRlc3Q4VGlja2V0cywgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJElEICkKICAgIH07Cn0KCiMgdGlja2V0IDEgc2hvdWxkIGJlIGluIHEyCiRTZWxmLT5JcygKICAgICRUZXN0OFRpY2tldHNbMF17UXVldWV9IC8vICcnLAogICAgJ3EyJywKICAgICJNYWlsOCAtIFRpY2tldDEgaXMgaW4gcTIuIiwKKTsKCiMgdGlja2V0IDIgc2hvdWxkIGJlIGluIHExCiRTZWxmLT5JcygKICAgICRUZXN0OFRpY2tldHNbMV17UXVldWV9IC8vICcnLAogICAgJ3ExJywKICAgICJNYWlsOCAtIFRpY2tldDIgaXMgaW4gcTEuIiwKKTsKCiMgVGVzdDogRGlzcGF0Y2hpbmcgdmlhIFF1ZXVlIHNlY29uZCByb3VuZAooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsLCAkUXVldWVJRHN7cTN9ICk7CgojIG9uZSBhZGRpdGlvbmFsIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZC4uLgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDEsCiAgICAiTWFpbDguNSAtIG9uZSB0aWNrZXQuIiwKKTsKCm15ICggJExpbmtlZFRpY2tldE51bWJlciwgJExpbmtlZFRpY2tldElEICkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKS0+RmluZExpbmtlZFRpY2tldCgKICAgIFRpY2tldElEICAgID0+ICRUaWNrZXRJRHNbMF0sCiAgICBBZGRyZXNzUG9vbCA9PiAnUG9vbDAyJywKICAgIFVzZXJJRCAgICAgID0+IDEsCik7CgojIC4uLmFuZCBiZSBsaW5rZWQgdG8gdGhlIGZvcm1lciBvbmVzCiRTZWxmLT5JcygKICAgICRMaW5rZWRUaWNrZXRJRCwKICAgICRUZXN0OFRpY2tldHNbMF17VGlja2V0SUR9LAogICAgIk1haWw4LjUgLSBjb3JyZWN0bHkgbGlua2VkLiIsCik7CgojIFRlc3Q6IERpc3BhdGNoaW5nIHZpYSBRdWV1ZSB0aGlyZCB0aW1lIHVubHVja3kKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoICRFbWFpbCwgJFF1ZXVlSURze3EzfSApOwoKIyBvbiB0aGlyZCByb3VuZCB0aG91Z2gsIG1haWwgc2hvdWxkIGJlIGlnbm9yZWQsIGFzIGFsbCBwb29scyBhcmUgZnVsbAokU2VsZi0+SXMoCiAgICAkUmV0dXJuLAogICAgNSwKICAgICJNYWlsOC42IC0gbWFpbCBpZ25vcmVkLiIsCik7CgojIG5vIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDAsCiAgICAiTWFpbDguNiAtIG5vIGFydGljbGUuIiwKKTsKCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KJFNlbGYtPkRvbmVUZXN0aW5nKCk7CgoKc3ViIEdlbmVyYXRlRW1haWwgewogICAgbXkgJVBhcmFtID0gQF87CgogICAgJFBhcmFte1hIZWFkZXJ9IC8vPSAnJzsKCiAgICByZXR1cm4gPDxFTkQKRnJvbSBza3l3YWxrZXJcQG90b2JvLm9yZyBGcmkgRGVjIDIxIDIzOjU5OjI0IDIwMDEKUmV0dXJuLVBhdGg6IDxza3l3YWxrZXJcQG90b2JvLm9yZz4KUmVjZWl2ZWQ6IChmcm9tIHNreXdhbGtlclxAbG9jYWxob3N0KQogICAgYnkgYXZyby5kZSAoOC4xMS4zLzguMTEuMy9TdVNFIExpbnV4IDguMTEuMS0wLjUpIGlkIGYzTU1TRTMwMzY5NAogICAgZm9yIG1hcnRpblxAbG9jYWxob3N0OyBGcmksIDIxIERlYyAyMDAxIDIzOjU5OjI0ICswMjAwCkRhdGU6IEZyaSwgMjEgRGVjIDIwMDEgMjM6NTk6MjQgKzAyMDAKRnJvbTogU2t5d2Fsa2VyIEF0dGFjaG1lbnQgPHNreXdhbGtlclxAb3RvYm8ub3JnPgpUbzogJFBhcmFte1RvfQpTdWJqZWN0OiAkUGFyYW17U3ViamVjdH0KTWVzc2FnZS1JRDogJFBhcmFte01lc3NhZ2VJRH0KTWltZS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZSRQYXJhbXtYSGVhZGVyfQpYLU9wZXJhdGluZy1TeXN0ZW06IExpbnV4IDIuNC4xMC00R0IgaTY4NgpYLVVwdGltZTogMTI6MjNhbSAgdXAgIDU6MTksICA2IHVzZXJzLCAgbG9hZCBhdmVyYWdlOiAwLjExLCAwLjEzLCAwLjE4CkNvbnRlbnQtTGVuZ3RoOiAxMzkKTGluZXM6IDExCgpUaGlzIGlzIHRoZSBmaXJzdCB0ZXN0LgoKQWRpb3MgLi4uCgogIExpdHRsZSAiU2t5d2Fsa2VyIgoKLS0KU3lzdGVtIFRlc3RlciBJIC0gPHNreXdhbGtlclxAb3RvYm8ub3JnPgotLQpPbGQgcHJvZ3JhbW1lcnMgbmV2ZXIgZGllLiBUaGV5IGp1c3QgYnJhbmNoIHRvIGEgbmV3IGFkZHJlc3MuCkVORAp9CgpzdWIgUmVhZEVtYWlsIHsKICAgICMgc3RhcnQgYSBuZXcgaW5jb21pbmcgY29tbXVuaWNhdGlvbgogICAgbXkgJENvbW11bmljYXRpb25Mb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6Q29tbXVuaWNhdGlvbkxvZycsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgVHJhbnNwb3J0ICAgPT4gJ0VtYWlsJywKICAgICAgICAgICAgRGlyZWN0aW9uICAgPT4gJ0luY29taW5nJywKICAgICAgICAgICAgQWNjb3VudFR5cGUgPT4gJ1NURElOJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIHN0YXJ0IG9iamVjdCBsb2cgZm9yIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uCiAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nU3RhcnQoIE9iamVjdExvZ1R5cGUgPT4gJ0Nvbm5lY3Rpb24nICk7CgogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdDb25uZWN0aW9uJywKICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpQb3N0TWFzdGVyOjpSZWFkJywKICAgICAgICBWYWx1ZSAgICAgICAgID0+ICdSZWFkIEVtYWlsIGZyb20gQWRkcmVzc1Bvb2xUZXN0LicsCiAgICApOwoKICAgICMgc3RhcnQgb2JqZWN0IGxvZyBmb3IgdGhlIGVtYWlsIHByb2Nlc3NpbmcKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdGFydCggT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScgKTsKCiAgICAjIHJlbWVtYmVyIHRoZSByZXR1cm4gY29kZSB0byBzdG9wIHRoZSBjb21tdW5pY3RhaW9uIGxhdGVyIHdpdGggYSBwcm9wZXIgc3RhdHVzCiAgICBteSAkUG9zdE1hc3RlclJldHVybkNvZGUgPSAwOwogICAgbXkgQFJldHVybjsKCiAgICAjIFdyYXAgdGhlIG1haW4gcGFydCBvZiB0aGUgc2NyaXB0IGluIGFuICJldmFsIiBibG9jayBzbyB0aGF0IGFueQogICAgIyB1bmV4cGVjdGVkIChidXQgcHJvYmFibHkgdHJhbnNpZW50KSBmYXRhbCBlcnJvcnMgKHN1Y2ggYXMgdGhlCiAgICAjIGRhdGFiYXNlIGJlaW5nIHVuYXZhaWxhYmxlKSBjYW4gYmUgdHJhcHBlZCB3aXRob3V0IGNhdXNpbmcgYQogICAgIyBib3VuY2UKICAgIGV2YWwgewoKICAgICAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OlBvc3RNYXN0ZXI6OlJlYWQnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICdQcm9jZXNzaW5nIGVtYWlsIHdpdGggUG9zdE1hc3RlciBtb2R1bGUuJywKICAgICAgICApOwoKICAgICAgICBteSAkUG9zdE1hc3Rlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3RlcicsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uTG9nT2JqZWN0ID0+ICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LAogICAgICAgICAgICAgICAgRW1haWwgICAgICAgICAgICAgICAgICA9PiBbIHNwbGl0KCJcbiIsICRfWzBdKSBdLAogICAgICAgICAgICAgICAgVHJ1c3RlZCAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIEBSZXR1cm4gPSAkUG9zdE1hc3Rlck9iamVjdC0+UnVuKCBRdWV1ZUlEID0+ICRfWzFdICk7CgogICAgICAgIGlmICggISRSZXR1cm5bMF0gKSB7CgogICAgICAgICAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OlBvc3RNYXN0ZXI6OlJlYWQnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAnUG9zdE1hc3RlciBtb2R1bGUgZXhpdGVkIHdpdGggZXJyb3JzLCBjb3VsZCBub3QgcHJvY2VzcyBlbWFpbC4gUGxlYXNlIHJlZmVyIHRvIHRoZSBsb2chJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPkNvbW11bmljYXRpb25TdG9wKCBTdGF0dXMgPT4gJ0ZhaWxlZCcgKTsKCiAgICAgICAgICAgIGRpZSAiQ291bGQgbm90IHByb2Nlc3MgZW1haWwuIFBsZWFzZSByZWZlciB0byB0aGUgbG9nIVxuIjsKICAgICAgICB9CgogICAgICAgIG15ICREdW1wID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RHVtcCggXEBSZXR1cm4gKTsKICAgICAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OlBvc3RNYXN0ZXI6OlJlYWQnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJFbWFpbCBwcm9jZXNzaW5nIHdpdGggUG9zdE1hc3RlciBtb2R1bGUgY29tcGxldGVkLCByZXR1cm4gZGF0YTogJER1bXAiLAogICAgICAgICk7CgogICAgICAgICRQb3N0TWFzdGVyUmV0dXJuQ29kZSA9ICRSZXR1cm5bMF07CiAgICB9OwoKICAgIGlmICgkQCkgewoKICAgICAgICAjIEFuIHVuZXhwZWN0ZWQgcHJvYmxlbSBvY2N1cnJlZCAoZm9yIGV4YW1wbGUsIHRoZSBkYXRhYmFzZSB3YXMKICAgICAgICAjIHVuYXZhaWxhYmxlKS4gUmV0dXJuIGFuIEVYX1RFTVBGQUlMIGVycm9yIHRvIGNhdXNlIHRoZSBtYWlsCiAgICAgICAgIyBwcm9ncmFtIHRvIHJlcXVldWUgdGhlIG1lc3NhZ2UgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSBib3VuY2luZwogICAgICAgICMgaXQ7IHNlZSBzeXNleGl0cy5oLiBNb3N0IG1haWwgcHJvZ3JhbXMgd2lsbCByZXRyeSBhbgogICAgICAgICMgRVhfVEVNUEZBSUwgZGVsaXZlcnkgZm9yIGFib3V0IGZvdXIgZGF5cywgdGhlbiBib3VuY2UgdGhlCiAgICAgICAgIyBtZXNzYWdlLikKICAgICAgICBteSAkTWVzc2FnZSA9ICRAOwoKICAgICAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OlBvc3RNYXN0ZXI6OlJlYWQnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLCBtZXNzYWdlOiAkTWVzc2FnZSIsCiAgICAgICAgKTsKCiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZ1N0b3AoCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBTdGF0dXMgICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgICk7CiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZ1N0b3AoCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ0Nvbm5lY3Rpb24nLAogICAgICAgICAgICBTdGF0dXMgICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgICk7CiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPkNvbW11bmljYXRpb25TdG9wKCBTdGF0dXMgPT4gJ0ZhaWxlZCcgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2coCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnQ29ubmVjdGlvbicsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6UG9zdE1hc3Rlcjo6UmVhZCcsCiAgICAgICAgVmFsdWUgICAgICAgICA9PiAnQ2xvc2luZyBjb25uZWN0aW9uIGZyb20gU1RESU4uJywKICAgICk7CgogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZ1N0b3AoCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgU3RhdHVzICAgICAgICA9PiAnU3VjY2Vzc2Z1bCcsCiAgICApOwogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZ1N0b3AoCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnQ29ubmVjdGlvbicsCiAgICAgICAgU3RhdHVzICAgICAgICA9PiAnU3VjY2Vzc2Z1bCcsCiAgICApOwoKICAgIG15ICVSZXR1cm5Db2RlTWFwID0gKAogICAgICAgIDAgPT4gJ0ZhaWxlZCcsICAgICAgICAjIGVycm9yIChhbHNvIGZhbHNlKQogICAgICAgIDEgPT4gJ1N1Y2Nlc3NmdWwnLCAgICAjIG5ldyB0aWNrZXQgY3JlYXRlZAogICAgICAgIDIgPT4gJ1N1Y2Nlc3NmdWwnLCAgICAjIGZvbGxvdyB1cCAvIG9wZW4vcmVvcGVuCiAgICAgICAgMyA9PiAnU3VjY2Vzc2Z1bCcsICAgICMgZm9sbG93IHVwIC8gY2xvc2UgLT4gbmV3IHRpY2tldAogICAgICAgIDQgPT4gJ0ZhaWxlZCcsICAgICAgICAjIGZvbGxvdyB1cCAvIGNsb3NlIC0+IHJlamVjdAogICAgICAgIDUgPT4gJ1N1Y2Nlc3NmdWwnLCAgICAjIGlnbm9yZWQgKGJlY2F1c2Ugb2YgWC1PVE9CTy1JZ25vcmUgaGVhZGVyKQogICAgKTsKCiAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+Q29tbXVuaWNhdGlvblN0b3AoCiAgICAgICAgU3RhdHVzID0+ICRSZXR1cm5Db2RlTWFweyRQb3N0TWFzdGVyUmV0dXJuQ29kZX0gLy8gJ0ZhaWxlZCcsCiAgICApOwoKICAgIHJldHVybiBAUmV0dXJuOwp9Cgo=</File>
        <File Location="doc/en/DiscreteSystemAddresses.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
</otrs_package>