<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>ImportExportTicket</Name>
    <Version>11.0.6</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-10-30 08:09:15" Version="11.0.6">Do not limit ticket search (#10); add export completion check (#19); updated translations.</ChangeLog>
    <ChangeLog Date="2025-11-19 14:54:18" Version="11.0.5">This release fixes a glaring bug where the export command entered an infinite loop when chunked export was not active.
Also, the ticket state has been add to the list of possible mappings. Additionally, there was internal cleanup based on the changes done for OTOB 11.1.x.</ChangeLog>
    <ChangeLog Date="2024-10-07 08:56:22" Version="11.0.4">Update to OTOBO 11.0.6: Removed console commands, which were moved to the standard.</ChangeLog>
    <ChangeLog Date="2024-09-18 12:25:02" Version="11.0.3">- Add possibility to import and export tickets as batches.
- Optionally import only tickets that belong to a specific user on the importing system.
- Bugfixes and GUI improvements</ChangeLog>
    <ChangeLog Date="2024-05-13 14:16:51" Version="11.0.2">Added ExternalSource param to correctly handle import values for reference dynamic fields.</ChangeLog>
    <ChangeLog Date="2024-04-02 14:03:29" Version="11.0.1">Initial Release on OTOBO 11.</ChangeLog>
    <Description Lang="en">Ticket backend for the ImportExport module.</Description>
    <Framework>11.0.x</Framework>
    <BuildCommitID>bd072c35a135b37796f7d8b5219615f2e0e06731</BuildCommitID>
    <BuildDate>2026-10-30 08:09:19</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Kernel/Config/Files/XML/ImportExportTicket.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24jIyNUaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+T2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6U3luY2hyb25pemVXaXRoRm9yZWlnbkRCIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklmIGFjdGl2YXRlZCBhZGRpdGlvbmFsIGRhdGEgc3VjaCBhcyB0aGUgaGlzdG9yeSBhbmQgbGlua3Mgd2lsbCBiZSByZWFkIGZyb20gYSBmb3JlaWduIERCIGNvbnRhaW5pbmcgdGhlIGV4cG9ydGVkIHRpY2tldHMgYW5kIGFkZGVkIHRvIHRoZSBpbXBvcnRlZCB0aWNrZXRzIG9uIHRoaXMgc3lzdGVtLiBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBjcmVhdGVkLCBub3QgZm9yIHVwZGF0ZWQgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGFiYXNlRFNOIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGFiYXNlVXNlciI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEYXRhYmFzZVB3Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXAjIyMwMDEtQ3VzdG9tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlZhbHVlIG1hcC4gRGVmaW5lIGEga2V5IGFuZCBhIHZhbHVlIG1hcCBmcm9tIGltcG9ydCBmaWxlIHRvIE9UT0JPLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPlF1ZXVlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik90aGVyU3lzdGVtTWlzYyI+TWlzYzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDAyLUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij5BcnRpY2xlX0R5bmFtaWNGaWVsZF9Ob011bHRpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik90aGVyU3lzdGVtNSI+NzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDAzLUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcCI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCMjIzAwNC1DdXN0b20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VmFsdWUgbWFwLiBEZWZpbmUgYSBrZXkgYW5kIGEgdmFsdWUgbWFwIGZyb20gaW1wb3J0IGZpbGUgdG8gT1RPQk8uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXBzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXAjIyMwMDUtQ3VzdG9tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlZhbHVlIG1hcC4gRGVmaW5lIGEga2V5IGFuZCBhIHZhbHVlIG1hcCBmcm9tIGltcG9ydCBmaWxlIHRvIE9UT0JPLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFwIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDA2LUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcCI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCMjIzAwNy1DdXN0b20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VmFsdWUgbWFwLiBEZWZpbmUgYSBrZXkgYW5kIGEgdmFsdWUgbWFwIGZyb20gaW1wb3J0IGZpbGUgdG8gT1RPQk8uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXBzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXAjIyMwMDgtQ3VzdG9tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlZhbHVlIG1hcC4gRGVmaW5lIGEga2V5IGFuZCBhIHZhbHVlIG1hcCBmcm9tIGltcG9ydCBmaWxlIHRvIE9UT0JPLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFwIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDA5LUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcCI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCMjIzAxMC1DdXN0b20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VmFsdWUgbWFwLiBEZWZpbmUgYSBrZXkgYW5kIGEgdmFsdWUgbWFwIGZyb20gaW1wb3J0IGZpbGUgdG8gT1RPQk8uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXBzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXAjIyMwMTEtQ3VzdG9tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlZhbHVlIG1hcC4gRGVmaW5lIGEga2V5IGFuZCBhIHZhbHVlIG1hcCBmcm9tIGltcG9ydCBmaWxlIHRvIE9UT0JPLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFwIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDEyLUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcCI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCMjIzAxMy1DdXN0b20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VmFsdWUgbWFwLiBEZWZpbmUgYSBrZXkgYW5kIGEgdmFsdWUgbWFwIGZyb20gaW1wb3J0IGZpbGUgdG8gT1RPQk8uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXBzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXAjIyMwMTQtQ3VzdG9tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlZhbHVlIG1hcC4gRGVmaW5lIGEga2V5IGFuZCBhIHZhbHVlIG1hcCBmcm9tIGltcG9ydCBmaWxlIHRvIE9UT0JPLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFwIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDE1LUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcCI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCMjIzAxNi1DdXN0b20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VmFsdWUgbWFwLiBEZWZpbmUgYSBrZXkgYW5kIGEgdmFsdWUgbWFwIGZyb20gaW1wb3J0IGZpbGUgdG8gT1RPQk8uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXBzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXAjIyMwMTctQ3VzdG9tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlZhbHVlIG1hcC4gRGVmaW5lIGEga2V5IGFuZCBhIHZhbHVlIG1hcCBmcm9tIGltcG9ydCBmaWxlIHRvIE9UT0JPLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFwIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDE4LUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcCI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCMjIzAxOS1DdXN0b20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VmFsdWUgbWFwLiBEZWZpbmUgYSBrZXkgYW5kIGEgdmFsdWUgbWFwIGZyb20gaW1wb3J0IGZpbGUgdG8gT1RPQk8uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXBzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXAjIyMwMjAtQ3VzdG9tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlZhbHVlIG1hcC4gRGVmaW5lIGEga2V5IGFuZCBhIHZhbHVlIG1hcCBmcm9tIGltcG9ydCBmaWxlIHRvIE9UT0JPLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFwIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDIxLUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcCI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCMjIzAyMi1DdXN0b20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VmFsdWUgbWFwLiBEZWZpbmUgYSBrZXkgYW5kIGEgdmFsdWUgbWFwIGZyb20gaW1wb3J0IGZpbGUgdG8gT1RPQk8uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXBzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXAjIyMwMjMtQ3VzdG9tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlZhbHVlIG1hcC4gRGVmaW5lIGEga2V5IGFuZCBhIHZhbHVlIG1hcCBmcm9tIGltcG9ydCBmaWxlIHRvIE9UT0JPLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFwIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpUaWNrZXQ6OkltcG9ydFZhbHVlTWFwIyMjMDI0LUN1c3RvbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5WYWx1ZSBtYXAuIERlZmluZSBhIGtleSBhbmQgYSB2YWx1ZSBtYXAgZnJvbSBpbXBvcnQgZmlsZSB0byBPVE9CTy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcCI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCMjIzAyNS1DdXN0b20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VmFsdWUgbWFwLiBEZWZpbmUgYSBrZXkgYW5kIGEgdmFsdWUgbWFwIGZyb20gaW1wb3J0IGZpbGUgdG8gT1RPQk8uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDo6SW1wb3J0VmFsdWVNYXBzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXAiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/System/ImportExport/ObjectBackend/Ticket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldDsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgbmFtZXNwYWNlOjphdXRvY2xlYW47CnVzZSB1dGY4OwoKIyBjb3JlIG1vZHVsZXMKdXNlIEVuY29kZTsKdXNlIE1JTUU6OkJhc2U2NCBxdyhlbmNvZGVfYmFzZTY0IGRlY29kZV9iYXNlNjQpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KElzQXJyYXlSZWZXaXRoRGF0YSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvY2snLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U0xBJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VHlwZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldCAtIGltcG9ydC9leHBvcnQgYmFja2VuZCBmb3IgdGlja2V0cwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IHRpY2tldHMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwoKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIENoYW5naW5nIHRoZSBjb25maWcKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgRmlkZGxpbmcgd2l0aCBTeXNDb25maWcgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIGEgYml0IGhhY2tpc2guCiAgICAjIEl0IHNob3VsZCBiZSBmaW5lIGFzIHRoZSBJbXBvcnRFeHBvcnQgb2JqZWN0IGlzIG9ubHkgdXNlZCBpbiBjb25zb2xlIGNvbW1hbmRzCiAgICAjIGFuZCBpbiBhIHNpbmdsZSBmcm9udGVuZCBtb2R1bGUuIFRoZSBjaGFuZ2VkIGNvbmZpZyBvYmplY3QgaW4gdGhlIGZyb250ZW5kIG1vZHVsZQogICAgIyBpcyBmaW5lIGFzIHRoZSBjb25maWcgb2JqZWN0IGlzIHJlY3JlYXRlZCBmb3IgZWFjaCByZXF1ZXN0LgogICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgIEtleSAgID0+ICdTZW5kbWFpbE1vZHVsZScsCiAgICAgICAgVmFsdWUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbDo6RG9Ob3RTZW5kRW1haWwnLAogICAgKTsKICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gMCwKICAgICk7CgogICAgIyB0dXJuIG9mZiBzb21lIGV2ZW50IGhhbmRsZXJzCiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjOTUwLVRpY2tldEFwcG9pbnRtZW50cycsCiAgICAgICAgVmFsdWUgPT4gdW5kZWYsCiAgICApOwogICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzgwMDAtR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgVmFsdWUgPT4gdW5kZWYsCiAgICApOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgcmV0dXJuIGJsZXNzIHsKICAgICAgICBUaWNrZXRJRFJlbGF0aW9uICAgICAgID0+IHt9LAogICAgICAgIFRpY2tldE51bWJlcklEUmVsYXRpb24gPT4ge30sCiAgICAgICAgQWxsRm91bmRUaWNrZXRJRHMgICAgICA9PiB1bmRlZiwgICAgIyB3aWxsIGJlIGluaXRpYWxpemVkIGluIGZpcnN0IGNhbGwgdG8gRXhwb3J0RGF0YUdldCgpCiAgICAgICAgTGFzdEhhbmRsZWRJbmRleCAgICAgICA9PiAtMSwgICAgICAgIyB1c2VkIGZvciBjaHVua2luZwogICAgICAgIENodW5raW5nRmluaXNoZWQgICAgICAgPT4gIDEsICAgICAgICMgaW5kaWNhdGUgdGhhdCBjaHVua2luZyBpcyBmaW5pc2hlZCwgd2hpY2ggaXMga2luZCBvZiB0cnVlIHdoZW4gbm8gY2h1bmtpbmcgaXMgcmVxdWVzdGVkCiAgICB9LCAkVHlwZTsKfQoKPWhlYWQyIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBvYmplY3QgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYXMgYSByZWYgdG8gYW4gYXJyYXkgb2YgaGFzaCByZWZlcmVuY2VzCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkT2JqZWN0QmFja2VuZC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15IEBBdHRyaWJ1dGVzOyAgICAjIHdpbGwgYmUgcmV0dXJuZWQKCiAgICAjIHF1ZXVlCiAgICB7CiAgICAgICAgbXkgJVF1ZXVlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxpc3Q7CiAgICAgICAgcHVzaCBAQXR0cmlidXRlcywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEZWZhdWx0IFF1ZXVlJyksCiAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVRdWV1ZUxpc3QsCiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgbXkgJVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUxpc3QoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgewogICAgICAgICAgICBLZXkgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEZWZhdWx0IFR5cGUnKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVR5cGVMaXN0IHx8IHt9LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICBteSAlU2VydmljZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgewogICAgICAgICAgICBLZXkgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEZWZhdWx0IFNlcnZpY2UnKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZUxpc3QgfHwge30sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAgICAgbXkgJVNMQUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEZWZhdWx0IFNMQScpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEFMaXN0IHx8IHt9LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDAsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBTdGF0ZQogICAgewogICAgICAgIG15ICVTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0RlZmF1bHQgc3RhdGUnKSwKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgfQoKICAgICMgUHJpb3JpdHkKICAgIHsKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0RlZmF1bHQgcHJpb3JpdHknKSwKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgfQoKICAgICMgT3duZXIgYW5kIFJlc3BvbnNpYmxlCiAgICB7CiAgICAgICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3Q7CgogICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdPd25lcklEJywKICAgICAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnRGVmYXVsdCBvd25lcicpLAogICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSApIHsKICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlcywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnUmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEZWZhdWx0IHJlc3BvbnNpYmxlJyksCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIHsKICAgICAgICBteSAlTG9ja0xpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9jaycpLT5Mb2NrTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAQXR0cmlidXRlcywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0xvY2tJRCcsCiAgICAgICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0RlZmF1bHQgbG9jaycpLAogICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlTG9ja0xpc3QsCiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgIH0KCiAgICBwdXNoIEBBdHRyaWJ1dGVzLAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0RlZmF1bHQgQ3VzdG9tZXJJRCcpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgID0+IDAsCiAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjUwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJVc2VySUQnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0RlZmF1bHQgQ3VzdG9tZXJVc2VySUQnKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFJlcXVpcmVkICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDI1MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0FyY2hpdmVGbGFnJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEZWZhdWx0IEFyY2hpdmVGbGFnJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IG1hcCB7ICRfID0+ICRfIH0gcXcoIHkgbiApIH0sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICduJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0RlZmF1bHQgc3ViamVjdCcpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDAsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gMjUwLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SW1wb3J0OjpEZWZhdWx0U3ViamVjdCcpLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQm9keScsCiAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnRGVmYXVsdCBib2R5JyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAyNTAsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRJbXBvcnQ6OkRlZmF1bHRCb2R5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdTZW5kZXJUeXBlJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEZWZhdWx0IHNlbmRlciB0eXBlJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBhZ2VudCAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnSXNWaXNpYmxlVG9DdXN0b21lcicsCiAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnRGVmYXVsdCBpcyB2aXNpYmxlIHRvIGN1c3RvbWVyJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NoZWNrYm94JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0VtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCcpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdTa2lwRXhpc3RpbmdUaWNrZXRzJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEbyBub3QgdXBkYXRlIGV4aXN0aW5nIHRpY2tldHMnKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ2hlY2tib3gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQWxsb3dlZE93bmVySW5UYXJnZXQnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ09ubHkgdXBkYXRlIHRpY2tldHMgb2YgdGhpcyB1c2VyIGluIHRoZSB0YXJnZXQgc3lzdGVtJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAxOTEsICAgICAgIyBsZW5ndGggb2YgdXNlcnMubG9naW4gZmllbGQgaW4gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAjIGFydGljbGUgcmVsYXRlZCBvcHRpb25zCiAgICBwdXNoIEBBdHRyaWJ1dGVzLAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0luY2x1ZGVBcnRpY2xlcycsCiAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnSW1wb3J0L0V4cG9ydCBhcnRpY2xlcycpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdBcnRpY2xlQmFja2VuZCcsCiAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnRGVmYXVsdCBCYWNrZW5kJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IG1hcCB7ICRfID0+ICRfIH0gcXcoIEVtYWlsIFBob25lIEludGVybmFsICkgfSwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJ24nLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQXJ0aWNsZVNlcGFyYXRlTGluZXMnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ1N0b3JlIGFydGljbGVzIG9uIHNlcGFyYXRlIGxpbmVzIGluZGljYXRlZCBieSBhIGJsYW5rIGZpcnN0IGVudHJ5JyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NoZWNrYm94JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0luY2x1ZGVBdHRhY2htZW50cycsCiAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnSW1wb3J0L0V4cG9ydCBhdHRhY2htZW50cyAoYXMgdGhlIGxhc3QgZW50cmllcyBwZXIgbGluZSknKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ2hlY2tib3gnLAogICAgICAgICAgICB9LAogICAgICAgIH07CgogICAgcmV0dXJuIFxAQXR0cmlidXRlczsKfQoKPWhlYWQyIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldHMgdGhlIG1hcHBpbmcgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYXMgcmVmZXJlbmNlIHRvIGFuIGFycmF5IG9mIGhhc2ggcmVmZXJlbmNlcy4KCiAgICBteSAkQXR0cmlidXRlcyA9ICRPYmplY3RCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAjIFRPRE8KICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgICAgICAgICAgWy4uLl0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFtdIHVubGVzcyAkT2JqZWN0RGF0YTsKICAgIHJldHVybiBbXSB1bmxlc3MgcmVmICRPYmplY3REYXRhIGVxICdIQVNIJzsKCiAgICAjIHRoZSBwb3NzaWJsZSBtYXBwaW5ncyBkZXBlbmQgb24gdGhlIGFjdGl2YXRlZCBmZWF0dXJlIHNldAogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgQFR5cGVFbGVtZW50cyAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICAgICAgICA/IHF3KCBUeXBlIFR5cGVJRCApICAgICAgICAgICAgICAgICA6ICgpOwogICAgbXkgQFNlcnZpY2VFbGVtZW50cyAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICAgICA/IHF3KCBTZXJ2aWNlIFNlcnZpY2VJRCBTTEEgU0xBSUQgKSA6ICgpOwogICAgbXkgQFJlc3BvbnNpYmxlRWxlbWVudHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSA/IHF3KCBSZXNwb25zaWJsZSBSZXNwb25zaWJsZUlEICkgICA6ICgpOwogICAgbXkgQEVsZW1lbnRMaXN0ID0KICAgICAgICBtYXAgeyB7IEtleSA9PiAkXywgVmFsdWUgPT4gJF8gfSB9CiAgICAgICAgKAogICAgICAgICAgICBxdyggVGlja2V0SUQgVGlja2V0TnVtYmVyIFRpdGxlICksCiAgICAgICAgICAgIEBUeXBlRWxlbWVudHMsCiAgICAgICAgICAgIHF3KCBRdWV1ZSBRdWV1ZUlEICksCiAgICAgICAgICAgIEBTZXJ2aWNlRWxlbWVudHMsCiAgICAgICAgICAgIHF3KCBTdGF0ZSBTdGF0ZUlEIFByaW9yaXR5IFByaW9yaXR5SUQgQ3VzdG9tZXJJRCBDdXN0b21lclVzZXJJRCBPd25lciBPd25lcklEIExvY2sgTG9ja0lEICksCiAgICAgICAgICAgIEBSZXNwb25zaWJsZUVsZW1lbnRzLAogICAgICAgICAgICBxdyggQXJjaGl2ZUZsYWcgQ3JlYXRlZCApCiAgICAgICAgKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICMgY29sdW1ucyBmb3IgZHluYW1pYyBmaWVsZHMKICAgIHsKICAgICAgICBteSAkRHluRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdCgKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmVzdWx0VHlwZSA9PiAnSEFTSCcsCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBFbGVtZW50TGlzdCwKICAgICAgICAgICAgbWFwIHsgeyBLZXkgPT4gIkR5bmFtaWNGaWVsZF8kXyIsIFZhbHVlID0+ICJEeW5hbWljRmllbGRfJF8iIH0gfQogICAgICAgICAgICBzb3J0CiAgICAgICAgICAgIHZhbHVlcyAkRHluRmllbGRMaXN0LT4lKjsKICAgIH0KCiAgICBpZiAoICRPYmplY3REYXRhLT57SW5jbHVkZUFydGljbGVzfSApIHsKICAgICAgICBpZiAoICRPYmplY3REYXRhLT57QXJ0aWNsZVNlcGFyYXRlTGluZXN9ICkgewogICAgICAgICAgICBwdXNoIEBFbGVtZW50TGlzdCwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0FydGljbGVfVGlja2V0SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJ0FydGljbGVfVGlja2V0SUQnLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBjb2x1bW5zIGZvciBhcnRpY2xlcwogICAgICAgIHB1c2ggQEVsZW1lbnRMaXN0LCBtYXAgeyB7IEtleSA9PiAiQXJ0aWNsZV8kXyIsIFZhbHVlID0+ICJBcnRpY2xlXyRfIiB9IH0KICAgICAgICAgICAgcXcoIEFydGljbGVJRCBBcnRpY2xlQmFja2VuZCBGcm9tIFRvIENjIEJjYyBTdWJqZWN0IEJvZHkgU2VuZGVyVHlwZSBJc1Zpc2libGVGb3JDdXN0b21lcgogICAgICAgICAgICBNZXNzYWdlSUQgUmVwbHlUbyBJblJlcGx5VG8gUmVmZXJlbmNlcyBDaGFyc2V0IE1pbWVUeXBlIFBsYWluRW1haWwgQ3JlYXRlVGltZSApOwoKICAgICAgICAjIGNvbHVtbnMgZm9yIGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAkRHluRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdCgKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ0hBU0gnLAogICAgICAgICk7CiAgICAgICAgcHVzaCBARWxlbWVudExpc3QsCiAgICAgICAgICAgIG1hcCB7IHsgS2V5ID0+ICJBcnRpY2xlX0R5bmFtaWNGaWVsZF8kXyIsIFZhbHVlID0+ICJBcnRpY2xlX0R5bmFtaWNGaWVsZF8kXyIgfSB9CiAgICAgICAgICAgIHNvcnQKICAgICAgICAgICAgdmFsdWVzICREeW5GaWVsZExpc3QtPiUqOwogICAgfQoKICAgIHJldHVybiBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnS2V5JywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdLZXknKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxARWxlbWVudExpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJZGVudGlmaWVyJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdJZGVudGlmaWVyJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NoZWNrYm94JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKfQoKPWhlYWQyIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggb2JqZWN0IGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSAkT2JqZWN0QmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKCj1jdXQKCnN1YiBTZWFyY2hBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAgbm90ZSB0aGF0IHRoZXJlIGlzIG5vIHNlYXJjaCBieSBvd25lciBvciByZXNwb25zaWJsZQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgVE9ETzogd2h5IGlzIHRoZSBPYmplY3REYXRhIG5lZWRlZCBoZXJlPwogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7CiAgICBteSAkT2JqZWN0RGF0YSAgICAgICAgID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gW10gdW5sZXNzICRPYmplY3REYXRhOwogICAgcmV0dXJuIFtdIHVubGVzcyByZWYgJE9iamVjdERhdGEgZXEgJ0hBU0gnOwoKICAgIG15ICVRdWV1ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMaXN0KCk7CgogICAgbXkgJVN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIG15ICVQcmlvcml0eUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknKS0+UHJpb3JpdHlMaXN0KAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgIG15IEBBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1F1ZXVlSURzJywKICAgICAgICAgICAgTmFtZSAgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDAsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgbXkgJVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUxpc3QoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgewogICAgICAgICAgICBLZXkgICA9PiAnVHlwZUlEcycsCiAgICAgICAgICAgIE5hbWUgID0+ICdUeXBlJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZUxpc3QgfHwge30sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLCB7CiAgICAgICAgICAgIEtleSAgID0+ICdTZXJ2aWNlSURzJywKICAgICAgICAgICAgTmFtZSAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTZXJ2aWNlTGlzdCB8fCB7fSwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAwLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAgICAgbXkgJVNMQUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1NMQUlEcycsCiAgICAgICAgICAgIE5hbWUgID0+ICdTTEEnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEFMaXN0IHx8IHt9LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDAsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgIHB1c2ggQEF0dHJpYnV0ZXMsCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lICA9PiAnU3RhdGUnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBOYW1lICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyNTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAjIEZpbHRlciBieSBjcmVhdGUgb3IgY2hhbmdlIHRpbWUsIHNwZWNpZnkgaW4gbWludXRlcwogICAgewogICAgICAgIG15IEBLZXlBbmROYW1lcyA9ICgKICAgICAgICAgICAgWyBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJNaW51dGVzID0+ICdUaWNrZXQgQ3JlYXRlIFRpbWUgKG5ld2VyKSBbbWluXScgXSwKICAgICAgICAgICAgWyBUaWNrZXRDcmVhdGVUaW1lT2xkZXJNaW51dGVzID0+ICdUaWNrZXQgQ3JlYXRlIFRpbWUgKG9sZGVyKSBbbWluXScgXSwKICAgICAgICAgICAgWyBUaWNrZXRDaGFuZ2VUaW1lTmV3ZXJNaW51dGVzID0+ICdUaWNrZXQgQ2hhbmdlIFRpbWUgKG5ld2VyKSBbbWluXScgXSwKICAgICAgICAgICAgWyBUaWNrZXRDaGFuZ2VUaW1lT2xkZXJNaW51dGVzID0+ICdUaWNrZXQgQ2hhbmdlIFRpbWUgKG9sZGVyKSBbbWluXScgXSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkQXJyUmVmIChAS2V5QW5kTmFtZXMpIHsKICAgICAgICAgICAgbXkgKCAkS2V5LCAkTmFtZSApID0gJEFyclJlZi0+QCo7CiAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgOwogICAgICAgIH0KICAgIH0KCiAgICAjIEZpbHRlciBieSBjcmVhdGUgb3IgY2hhbmdlIHRpbWUsIHNwZWNpZnkgYnkgZGF0ZSBhbmQgdGltZQogICAgewogICAgICAgIG15IEBLZXlBbmROYW1lcyA9ICgKICAgICAgICAgICAgWyBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlICAgICA9PiAnVGlja2V0IENyZWF0ZSBUaW1lIChhZnRlciknIF0sCiAgICAgICAgICAgIFsgVGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZSAgICAgPT4gJ1RpY2tldCBDcmVhdGUgVGltZSAoYmVmb3JlKScgXSwKICAgICAgICAgICAgWyBUaWNrZXRMYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnVGlja2V0IExhc3QgQ2hhbmdlIFRpbWUgKGFmdGVyKScgXSwKICAgICAgICAgICAgWyBUaWNrZXRMYXN0Q2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAnVGlja2V0IExhc3QgQ2hhbmdlIFRpbWUgKGJlZm9yZSknIF0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEFyclJlZiAoQEtleUFuZE5hbWVzKSB7CiAgICAgICAgICAgIG15ICggJEtleSwgJE5hbWUgKSA9ICRBcnJSZWYtPkAqOwogICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBBdHRyaWJ1dGVzOwp9Cgo9aGVhZDIgRXhwb3J0RGF0YUdldCgpCgpnZXQgZXhwb3J0IGRhdGEgYXMgYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgZm9yIGFycmF5IHJlZmVyZW5jZXMsIHRoYXQgaXMgYSBDPDJELXRhYmxlPgoKICAgIG15ICRSb3dzID0gJE9iamVjdEJhY2tlbmQtPkV4cG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCldoZW4gdGhlIHBhcmFtZXRlciBDPENodW5rU2l6ZT4gaXMgcGFzc2VkIHRoZW4gY2h1bmtlZCBleHBvcnQgbW9kZSBpcyBhc3N1bWVkLgpPbiB0aGUgZmlyc3QgaW52b2NhdGlvbiB0aGUgY29tcGxldGUgc2VhcmNoIHJlc3VsdCBsaXN0IGlzIHJldHJpZXZlZAphbmQgc3RvcmVkIGluIHRoZSBpbnN0YW5jZS4gVGhlbiB0aGUgZGV0YWlsZWQgZGF0YSBmb3IgZmlyc3QgY2h1bmsgaXMgcmV0dXJuZWQuCkVhY2ggc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9ubHkgZ2V0cyB0aGUgZGV0YWlsZWQgZGF0YSBmb3IgdGhlIG5leHQgY2h1bmsuCgo9Y3V0CgpzdWIgRXhwb3J0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBkYXRhCiAgICBpZiAoICEkT2JqZWN0RGF0YSB8fCByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgbWFwcGluZyBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRoZSBtYXBwaW5nIGxpc3QKICAgIGlmICggISRNYXBwaW5nTGlzdCB8fCByZWYgJE1hcHBpbmdMaXN0IG5lICdBUlJBWScgfHwgIUB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIG9iamVjdCBsaXN0CiAgICBteSBATWFwcGluZ09iamVjdExpc3Q7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIGlmICggISRNYXBwaW5nT2JqZWN0RGF0YSB8fCByZWYgJE1hcHBpbmdPYmplY3REYXRhIG5lICdIQVNIJyApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBATWFwcGluZ09iamVjdExpc3QsICRNYXBwaW5nT2JqZWN0RGF0YTsKICAgIH0KCiAgICAjIExpc3Qgb2YgSURzIGZvciB0aWNrZXRzIHRoYXQgYXJlIHRvIGJlIGV4cG9ydGVkLgogICAgIyBJbiBjaHVua2VkIG1vZGUgdGhpcyBpcyBvbmx5IGNodW5rLiBJbiBub24tY2h1bmtlZCBtb2RlIHRoZXNlIGFyZSBhbGwgcmVsZXZhbnQgSURzLgogICAgbXkgQFRpY2tldElEczsKICAgIHsKICAgICAgICAjIFNlYXJjaCBhbGwgVGlja2V0X0lEcy4KICAgICAgICAjIFdoZW4gaW4gY2h1bmtlZCBtb2RlIHRoZW4gZ2V0IHRoZSBjb21wbGV0ZSBsaXN0IGluIHRoZSBmaXJzdCBpbnZvY2F0aW9uIGFuZCBzdG9yZSBpdCBhcyBpbnN0YW5jZSBkYXRhLgogICAgICAgICMgRm9yIHNpbXBsaWNpdGllcyBzYWtlIGFzc3VtZSB0aGF0IHRoZSB0ZW1wbGF0ZSBJRCBkb2VzIG5vdCBjaGFuZ2UgaW4gc3Vic2VxdWVudCBjYWxscy4KICAgICAgICBteSAlVGlja2V0U2VhcmNoUGFyYW0gPSAoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAoICRQYXJhbXtDaHVua1NpemV9IC8vIDAgKSA+PSAxICkgewoKICAgICAgICAgICAgIyBjaHVua2VkIG1vZGUsCiAgICAgICAgICAgICRTZWxmLT57Q2h1bmtpbmdGaW5pc2hlZH0gPSAwOwoKICAgICAgICAgICAgIyBzZWFyY2ggb25seSBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbgogICAgICAgICAgICAkU2VsZi0+e0FsbEZvdW5kVGlja2V0SURzfSAvLz0gWyAkU2VsZi0+X1RpY2tldFNlYXJjaCglVGlja2V0U2VhcmNoUGFyYW0pIF07CgogICAgICAgICAgICAjIGRvIHRoZSBjaHVua2luZwogICAgICAgICAgICBteSAkTmV3TGFzdEhhbmRsZWRJbmRleCA9ICRTZWxmLT57TGFzdEhhbmRsZWRJbmRleH0gKyAkUGFyYW17Q2h1bmtTaXplfTsKICAgICAgICAgICAgbXkgJEVuZEluZGV4ICAgICAgICAgICAgPSAkI3sgJFNlbGYtPntBbGxGb3VuZFRpY2tldElEc30gfTsKICAgICAgICAgICAgaWYgKCAkTmV3TGFzdEhhbmRsZWRJbmRleCA+PSAkRW5kSW5kZXggKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NodW5raW5nRmluaXNoZWR9ID0gMTsKICAgICAgICAgICAgICAgICROZXdMYXN0SGFuZGxlZEluZGV4ID0gJEVuZEluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBUaWNrZXRJRHMgPSBAeyAkU2VsZi0+e0FsbEZvdW5kVGlja2V0SURzfSB9WyAkU2VsZi0+e0xhc3RIYW5kbGVkSW5kZXh9ICsgMSAuLiAkTmV3TGFzdEhhbmRsZWRJbmRleCBdOwogICAgICAgICAgICAkU2VsZi0+e0xhc3RIYW5kbGVkSW5kZXh9ID0gJE5ld0xhc3RIYW5kbGVkSW5kZXg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBAVGlja2V0SURzID0gJFNlbGYtPl9UaWNrZXRTZWFyY2goJVRpY2tldFNlYXJjaFBhcmFtKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgbXkgQEV4cG9ydERhdGE7CiAgICBteSAlVGlja2V0RGF0YTsKCiAgICBteSBAVGlja2V0TWFwcGluZzsKICAgIG15IEBBcnRpY2xlTWFwcGluZzsKICAgIG15ICRUaWNrZXRNYXBwaW5nTGFzdDsKICAgIG15ICRBcnRpY2xlTWFwcGluZ0xhc3QgPSAwOyAgICAjIGluIGNhc2Ugb2Ygc2VwYXJhdGUgbGluZXMgYW4gZW1wdHkgZW50cnkgd2lsbCBwcmVjZWRlICh0aHVzIG5vdCAtMSkKICAgIG15ICRTdG9yZVBsYWluRW1haWwgICAgPSAwOwoKICAgIGZvciBteSAkaSAoIDAgLi4gJCNNYXBwaW5nT2JqZWN0TGlzdCApIHsKCiAgICAgICAgIyBoYW5kbGUgZW1wdHkga2V5CiAgICAgICAgaWYgKCAhJE1hcHBpbmdPYmplY3RMaXN0WyRpXXtLZXl9ICkgewogICAgICAgICAgICAkVGlja2V0TWFwcGluZ1skaV17S2V5fSA9ICcnOwogICAgICAgICAgICBpZiAoICEkT2JqZWN0RGF0YS0+e0FydGljbGVTZXBhcmF0ZUxpbmVzfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRNYXBwaW5nTGFzdCA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFydGljbGUga2V5cwogICAgICAgIGVsc2lmICggJE1hcHBpbmdPYmplY3RMaXN0WyRpXXtLZXl9ID1+IC9eQXJ0aWNsZV8oLispJC8gKSB7CiAgICAgICAgICAgIGlmICggJE9iamVjdERhdGEtPntBcnRpY2xlU2VwYXJhdGVMaW5lc30gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcnRpY2xlTWFwcGluZywgJE1hcHBpbmdPYmplY3RMaXN0WyRpXTsKICAgICAgICAgICAgICAgICRBcnRpY2xlTWFwcGluZ1sgKyskQXJ0aWNsZU1hcHBpbmdMYXN0IF17S2V5fSA9ICQxOwogICAgICAgICAgICAgICAgJFRpY2tldE1hcHBpbmdbJGlde0tleX0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlTWFwcGluZ1skaV0gICAgICA9ICRNYXBwaW5nT2JqZWN0TGlzdFskaV07CiAgICAgICAgICAgICAgICAkQXJ0aWNsZU1hcHBpbmdbJGlde0tleX0gPSAkMTsKICAgICAgICAgICAgICAgICRBcnRpY2xlTWFwcGluZ0xhc3QgICAgICA9ICRpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICQxIGVxICdQbGFpbkVtYWlsJyApIHsKICAgICAgICAgICAgICAgICRTdG9yZVBsYWluRW1haWwgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHRpY2tldCBrZXlzCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUaWNrZXRNYXBwaW5nWyRpXSA9ICRNYXBwaW5nT2JqZWN0TGlzdFskaV07CiAgICAgICAgICAgICRUaWNrZXRNYXBwaW5nTGFzdCA9ICRpOwogICAgICAgIH0KICAgIH0KCiAgICAjIGV4cG9ydCB0aWNrZXRzIC4uLgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRJRHMpIHsKCiAgICAgICAgJVRpY2tldERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBkYXRhIHRvIHRoZSBleHBvcnQgZGF0YSBhcnJheQogICAgICAgIG15IEBUaWNrZXRJdGVtOwogICAgICAgIGZvciBteSAkaSAoIDAgLi4gJFRpY2tldE1hcHBpbmdMYXN0ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGtleQogICAgICAgICAgICBteSAkS2V5ID0gJFRpY2tldE1hcHBpbmdbJGlde0tleX07CgogICAgICAgICAgICAkVGlja2V0SXRlbVskaV0gPSAkS2V5ICYmIGRlZmluZWQgJFRpY2tldERhdGF7JEtleX0KICAgICAgICAgICAgICAgID8gSXNBcnJheVJlZldpdGhEYXRhKCAkVGlja2V0RGF0YXskS2V5fSApCiAgICAgICAgICAgICAgICAgICAgPyBqb2luKCAnIyMjJywgKCBtYXAgeyBlbmNvZGVfYmFzZTY0KCBFbmNvZGU6OmVuY29kZSggJ1VURi04JywgJF8gKSApIH0gJFRpY2tldERhdGF7JEtleX0tPkAqICkgKQogICAgICAgICAgICAgICAgICAgIDogJFRpY2tldERhdGF7JEtleX0KICAgICAgICAgICAgICAgIDogJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkT2JqZWN0RGF0YS0+e0luY2x1ZGVBcnRpY2xlc30gfHwgJE9iamVjdERhdGEtPntBcnRpY2xlU2VwYXJhdGVMaW5lc30gKSB7CiAgICAgICAgICAgIHB1c2ggQEV4cG9ydERhdGEsIFxAVGlja2V0SXRlbTsKICAgICAgICB9CgogICAgICAgIGlmICggJE9iamVjdERhdGEtPntJbmNsdWRlQXJ0aWNsZXN9ICkgewoKICAgICAgICAgICAgIyBHZXQgYXJ0aWNsZSBkYXRhLgogICAgICAgICAgICBteSBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQXJ0aWNsZUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZXMpIHsKCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGV9ICk7CgogICAgICAgICAgICAgICAgbXkgJUFydGljbGVGdWxsID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJEFydGljbGUtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRBcnRpY2xlRnVsbHtBcnRpY2xlQmFja2VuZH0gPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkNoYW5uZWxOYW1lR2V0KCk7CgogICAgICAgICAgICAgICAgaWYgKCAkU3RvcmVQbGFpbkVtYWlsICYmICRBcnRpY2xlQmFja2VuZE9iamVjdC0+Y2FuKCdBcnRpY2xlUGxhaW4nKSApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUZ1bGx7UGxhaW5FbWFpbH0gPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVQbGFpbigKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBAQXJ0aWNsZUl0ZW0gPSAkT2JqZWN0RGF0YS0+e0FydGljbGVTZXBhcmF0ZUxpbmVzfSA/ICgnJykgOiBAVGlja2V0SXRlbTsKICAgICAgICAgICAgICAgIEFSVElDTEVNQVA6CiAgICAgICAgICAgICAgICBmb3IgbXkgJGkgKCAwIC4uICRBcnRpY2xlTWFwcGluZ0xhc3QgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZW1wdHkgZmllbGRzIGFyZSBkb25lIGluIHRoZSB0aWNrZXQgcGFydAogICAgICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRU1BUCB1bmxlc3MgJEFydGljbGVNYXBwaW5nWyRpXTsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGtleQogICAgICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkQXJ0aWNsZU1hcHBpbmdbJGlde0tleX07CgogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlSXRlbVskaV0gPSBkZWZpbmVkICRBcnRpY2xlRnVsbHskS2V5fQogICAgICAgICAgICAgICAgICAgICAgICA/IElzQXJyYXlSZWZXaXRoRGF0YSggJEFydGljbGVGdWxseyRLZXl9ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gam9pbiggJyMjIycsICggbWFwIHsgZW5jb2RlX2Jhc2U2NCggRW5jb2RlOjplbmNvZGUoICdVVEYtOCcsICRfICkgKSB9ICRBcnRpY2xlRnVsbHskS2V5fS0+QCogKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICRBcnRpY2xlRnVsbHskS2V5fQogICAgICAgICAgICAgICAgICAgICAgICA6ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJE9iamVjdERhdGEtPntJbmNsdWRlQXR0YWNobWVudHN9ICYmICRBcnRpY2xlQmFja2VuZE9iamVjdC0+Y2FuKCdBcnRpY2xlQXR0YWNobWVudEluZGV4JykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUluZGV4ID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGUtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVJbmRleCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkS2V5IChxdyggRmlsZW5hbWUgQ29udGVudFR5cGUgRGlzcG9zaXRpb24gKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnR7JEtleX0gPSBFbmNvZGU6OmVuY29kZSggJ1VURi04JywgJEF0dGFjaG1lbnR7JEtleX0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEF0dGFjaG1lbnRTdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkS2V5IChxdyggRmlsZW5hbWUgQ29udGVudElEIENvbnRlbnRUeXBlIERpc3Bvc2l0aW9uIENvbnRlbnQgQ29udGVudEFsdGVybmF0aXZlICkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50eyRLZXl9IC8vPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50U3RyaW5nIC49ICRBdHRhY2htZW50U3RyaW5nID8gJyMjIycgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50U3RyaW5nIC49ICRLZXkgLiAnIyMjJyAuIGVuY29kZV9iYXNlNjQoICRBdHRhY2htZW50eyRLZXl9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEFydGljbGVJdGVtLCAkQXR0YWNobWVudFN0cmluZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBARXhwb3J0RGF0YSwgXEBBcnRpY2xlSXRlbTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBFeHBvcnREYXRhOwp9Cgo9aGVhZDIgSXNFeHBvcnRDb21wbGV0ZSgpCgpJbmRpY2F0ZSB3aGV0aGVyIHRoZSBsYXN0IEM8RXhwb3J0RGF0YUdldCgpPiBoYXMgcmV0dXJuZWQgdGhlIGxhc3QgY2h1bmsgb2YgZGF0YS4KQSB0cnVlIHZhbHVlIGlzIGFsc28gcmV0dXJuZWQgd2hlbiBjaHVua2luZyBoYWQgbm90IGJlZW4gYWN0aXZhdGVkLgoKICAgIG15ICRDaHVua2luZ0ZpbmlzaGVkID0gJE9iamVjdEJhY2tlbmQtPklzRXhwb3J0Q29tcGxldGU7Cgo9Y3V0CgpzdWIgSXNFeHBvcnRDb21wbGV0ZSB7CiAgICBteSAoJFNlbGYpID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57Q2h1bmtpbmdGaW5pc2hlZH07Cn0KCj1oZWFkMiBJbXBvcnREYXRhU2F2ZSgpCgppbXBvcnRzIGEgc2luZ2xlIGVudGl0eSBvZiB0aGUgaW1wb3J0IGRhdGEuIEFuIGVudGl0eSBpcyBlaXRoZXIgYSB0aWNrZXQgb3IgYW4gYXJ0aWNsZS4KClRoZSBDPFRlbXBsYXRlSUQ+IHBvaW50cyB0byB0aGUgZGVmaW5pdGlvbgpvZiB0aGUgY3VycmVudCBpbXBvcnQuIEM8SW1wb3J0RGF0YVJvdz4gaG9sZHMgdGhlIGRhdGEuIEM8Q291bnRlcj4gaXMgb25seSB1c2VkIGluCmVycm9yIG1lc3NhZ2VzLCBmb3IgaW5kaWNhdGluZyB3aGljaCBpdGVtIHdhcyBub3QgaW1wb3J0ZWQgc3VjY2Vzc2Z1bGx5LgoKVGhlIGRlY2lzaW9uIHdoYXQgY29uc3RpdHV0ZSBhbiBlbXB0eSB2YWx1ZSBpcyBhIGJpdCBoYWlyeS4gSGVyZSBhcmUgdGhlIHJ1bGVzLgpGaWVsZHMgdGhhdCBhcmUgbm90IGV2ZW4gbWVudGlvbmVkIGluIHRoZSBJbXBvcnQgZGVmaW5pdGlvbiBhcmUgZW1wdHkuIFRoZXNlIGFyZSB0aGUgJ25vdCBkZWZpbmVkJyBmaWVsZHMuCkVtcHR5IHN0cmluZ3MgYW5kIHVuZGVmaW5lZCB2YWx1ZXMgY29uc3RpdHV0ZSBlbXB0eSBmaWVsZHMuCkZpZWxkcyB3aXRoIHdpdGggb25seSBvbmUgb3IgbW9yZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIG5vdCBlbXB0eS4KRmllbGRzIHdpdGggdGhlIGRpZ2l0ICcwJyBhcmUgbm90IGVtcHR5LgoKICAgIG15ICggJFRpY2tldElELCAkUmV0Q29kZSApID0gJE9iamVjdEJhY2tlbmQtPkltcG9ydERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gMTIzLAogICAgICAgIEltcG9ydERhdGFSb3cgPT4gJEFycmF5UmVmLAogICAgICAgIENvdW50ZXIgICAgICAgPT4gMzY3LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CgpBbiBlbXB0eSBDPFRpY2tldElEPiBpbmRpY2F0ZXMgZmFpbHVyZS4gT3RoZXJ3aXNlIGl0IGluZGljYXRlcyB0aGUKbG9jYXRpb24gb2YgdGhlIGltcG9ydGVkIGRhdGEuCkM8UmV0Q29kZT4gaXMgb25lIG9mOgoKPW92ZXIgNAoKPWl0ZW0gIlRpY2tldCBub3QgY2hhbmdlZCIgOiB0aGUgaW1wb3J0IGRpZCBub3QgY2hhbmdlIHRoZSB0aWNrZXQgZGF0YQoKPWl0ZW0gIlRpY2tldCBub3QgY2hhbmdlZCwgQXJ0aWNsZSBjcmVhdGVkIiA6IHRoZSBpbXBvcnQgZGlkIG5vdCBjaGFuZ2UgdGhlIHRpY2tldCBkYXRhLiBCdXQgYW4gYXJ0aWNsZSB3YXMgY3JlYXRlZC4KCj1pdGVtICJUaWNrZXQgY3JlYXRlZCIgOiBhIHRpY2tldCB3YXMgY3JlYXRlZAoKPWl0ZW0gIlRpY2tldCBjcmVhdGVkLCBBcnRpY2xlIGNyZWF0ZWQiIDogYSB0aWNrZXQgd2l0aCBhbiBhcnRpY2xlIHdhcyBjcmVhdGVkCgo9aXRlbSAiVGlja2V0IHVwZGF0ZWQiIDogYSB0aWNrZXQgd2FzIHVwZGF0ZWQKCj1pdGVtICJUaWNrZXQgc2tpcHBlZCIgOiBhIHRpY2tldCB3YXMgc2tpcHBlZCBiZWNhdXNlIG9mIGFuIGltcG9ydCBmaWx0ZXIuIHdhcyBzaHV0LgoKVGhlcmUgYXJlIHR3byBpbnB1dCBmaWx0ZXJzOiBBbGxvd2VkT3duZXJJblRhcmdldCBhbmQgU2tpcEV4aXN0aW5nVGlja2V0cy4KCj1pdGVtICJUaWNrZXQgdXBkYXRlZCwgQXJ0aWNsZSBjcmVhdGVkIiA6IGEgdGlja2V0IHdhcyB1cGRhdGVkIGFuZCBhbiBhcnRpY2xlIHdhcyBjcmVhdGVkCgo9aXRlbSAiQXJ0aWNsZSBjcmVhdGVkIiA6IGFuIGFydGljbGUgd2FzIGNyZWF0ZWQKCj1pdGVtICJBcnRpY2xlIHNraXBwZWQiIDogYW4gYXJ0aWNsZSB3YXMgc2tpcHBlZAoKRWl0aGVyIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgdGlja2V0IHdhcyBza2lwcGVkIG9yIGJlY2F1c2UgdGhlIGFydGljbGUKYWxyZWFkeSBoYWQgYmVlbiBpbXBvcnRlZC4KCj1iYWNrCgpObyBjb2RlcyBoYXZlIHlldCBiZWVuIGRlZmluZWQgZm9yIHRoZSBmYWlsdXJlIGNhc2UuCgo9Y3V0CgpzdWIgSW1wb3J0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBJbXBvcnREYXRhUm93IENvdW50ZXIgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpbXBvcnQgZGF0YSByb3cKICAgIGlmICggcmVmICRQYXJhbXtJbXBvcnREYXRhUm93fSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06IEltcG9ydERhdGFSb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwoKICAgICMgZ2V0IG9iamVjdCBkYXRhLCB0aGF0IGlzIHRoZSBjb25maWcgb2YgdGhpcyB0ZW1wbGF0ZQogICAgbXkgJE9iamVjdERhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgb2JqZWN0IGRhdGEKICAgIGlmICggISRPYmplY3REYXRhIHx8IHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIk5vIG9iamVjdCBkYXRhIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJyRQYXJhbXtUZW1wbGF0ZUlEfSciLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhbmQgY2hlY2sgdGhlIG1hcHBpbmcgbGlzdAogICAgIyBUT0RPOiB3aHkgaXMgdGhpcyBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBvZiB0aGUgaW1wb3J0IGZpbGUgPwogICAgbXkgJE1hcHBpbmdMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAuICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAnJFBhcmFte1RlbXBsYXRlSUR9JyIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIG9iamVjdCBsaXN0CiAgICAjIFRPRE86IHdoeSBpcyB0aGlzIGNhbGxlZCBmb3IgZXZlcnkgcm93IG9mIHRoZSBpbXBvcnQgZmlsZSA/CiAgICBteSBATWFwcGluZ09iamVjdExpc3Q7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoICRNYXBwaW5nTGlzdC0+QCogKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoICEkTWFwcGluZ09iamVjdERhdGEgfHwgcmVmICRNYXBwaW5nT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgIC4gIk5vIG1hcHBpbmcgb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSBtYXBwaW5nIGlkICckTWFwcGluZ0lEJyIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBNYXBwaW5nT2JqZWN0TGlzdCwgJE1hcHBpbmdPYmplY3REYXRhOwogICAgfQoKICAgICMgcHJlcGFyZSBpbXBvcnQgZGF0YQogICAgbXkgJVRpY2tldDsKICAgIG15ICVBcnRpY2xlOwogICAgbXkgJUlkZW50aWZpZXI7CgogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJE1hcHBpbmdDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ltcG9ydEV4cG9ydDo6VGlja2V0OjpJbXBvcnRWYWx1ZU1hcCcpIC8vIHt9OwogICAgbXkgJVZhbHVlTWFwID0KICAgICAgICBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntNYXB9IH0KICAgICAgICB2YWx1ZXMgJE1hcHBpbmdDb25maWctPiUqOwoKICAgICMgRGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhbiBhcnRpY2xlIG9uIGEgc2VwYXJhdGUgbGluZS4KICAgICMgVGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBjb2x1bW4gaXMgdGhlIG1hcmtlci4gV2hlbiBpdCBpcyBlbXB0eSwKICAgICMgcHIgaGFzIHRoZSB2YWx1ZSBDPDA+LCB0aGUgd2UgaGF2ZSBhbiBhcnRpY2xlIG9uIGEgc2VwYXJhdGUgbGluZS4KICAgIG15ICRBcnRpY2xlSXNPblNlcGFyYXRlTGluZSA9CiAgICAgICAgJE9iamVjdERhdGEtPntJbmNsdWRlQXJ0aWNsZXN9CiAgICAgICAgJiYKICAgICAgICAkT2JqZWN0RGF0YS0+e0FydGljbGVTZXBhcmF0ZUxpbmVzfQogICAgICAgICYmCiAgICAgICAgISRQYXJhbXtJbXBvcnREYXRhUm93fVswXQogICAgICAgICYmCiAgICAgICAgMTsKCiAgICBpZiAoICRBcnRpY2xlSXNPblNlcGFyYXRlTGluZSAmJiAkU2VsZi0+e0xhc3RUaWNrZXRXYXNTa2lwcGVkfSApIHsKCiAgICAgICAgIyBTa2lwIHRoaXMgYXJ0aWNsZSBiZWNhdXNlIHRoZSBsYXN0IHRpY2tldCB3YXMgaWdub3JlZC4KICAgICAgICAjIFJldHVybmluZyAtMSBhcyB0aGlzIGRvZXMgbm90IGNvdW50IGFzIGEgZmFpbHVyZSwKICAgICAgICAjIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGluZGljYXRlIHRoYXQgc29tZXRoaW5nIHNwZWNpYWwgaXMgZ29pbmcgb24uCiAgICAgICAgcmV0dXJuICggLTEsICdBcnRpY2xlIHNraXBwZWQnICk7CiAgICB9CiAgICBlbHNpZiAoJEFydGljbGVJc09uU2VwYXJhdGVMaW5lKSB7CgogICAgICAgICMgSGFuZGxpbmcgYW4gYXJ0aWNsZSBhbiBhIHNlcGFyYXRlIGxpbmUuIFRoZSBsYXN0IHRpY2tldCB3YXMgbm90IGlnbm9yZWQuCgogICAgICAgIG15ICRpID0gMTsKICAgICAgICBNQVBQSU5HT0JKRUNUREFUQToKICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3REYXRhIChATWFwcGluZ09iamVjdExpc3QpIHsKCiAgICAgICAgICAgIGlmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSA9fiAvXkFydGljbGVfKC4rKSQvICkgewogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFte0ltcG9ydERhdGFSb3d9WyAkaSsrIF07CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXskMX0gPSBkZWZpbmVkICRWYWx1ZSAmJiAkVmFsdWVNYXB7ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gfSAmJiBkZWZpbmVkICRWYWx1ZU1hcHsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9eyRWYWx1ZX0KICAgICAgICAgICAgICAgICAgICA/ICRWYWx1ZU1hcHsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9eyRWYWx1ZX0gOiAkVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1REQVRBOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1REQVRBIHVubGVzcyAkTWFwcGluZ09iamVjdERhdGEtPntJZGVudGlmaWVyfTsKCiAgICAgICAgICAgIGlmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSBuZSAnQXJ0aWNsZV9BcnRpY2xlSUQnICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiQXJ0aWNsZXMgY2FuIG9ubHkgYmUgaWRlbnRpZmllZCB2aWEgJ0FydGljbGVfQXJ0aWNsZUlEJyBub3QgYnkgJyRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0nLiIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICEkUGFyYW17SW1wb3J0RGF0YVJvd31bICRpIC0gMSBdICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiJ0FydGljbGVfQXJ0aWNsZUlEJyBjYW4gbm90IGJlIGVtcHR5IG9yIDAgd2hlbiB1c2VkIGFzIGlkZW50aWZpZXIuIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkSWRlbnRpZmllcntBcnRpY2xlfXtBcnRpY2xlSUR9ID0gMTsKICAgICAgICB9CgogICAgICAgIGlmICggJE9iamVjdERhdGEtPntJbmNsdWRlQXR0YWNobWVudHN9ICYmICRpIDw9ICQjeyAkUGFyYW17SW1wb3J0RGF0YVJvd30gfSApIHsKCiAgICAgICAgICAgICMgdGhlIGxhc3QgYW5kIHVubWFwcGVkIGVudHJpZXMgYXJlIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICRBcnRpY2xle0F0dGFjaG1lbnRzfSA9IFsgQHsgJFBhcmFte0ltcG9ydERhdGFSb3d9IH1bICRpIC4uICQjeyAkUGFyYW17SW1wb3J0RGF0YVJvd30gfSBdIF07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSGFuZGxpbmcgYSBsaW5lIHdpdGggdGlja2V0IGluZm9ybWF0aW9uLgogICAgICAgICMgVGhlIGRhdGEgZm9yIGFuIGFydGljbGUgbWlnaHQgYmUgaW5jbHVkZWQgaW4gdGhhdCBsaW5lLgogICAgICAgIE1BUFBJTkdPQkpFQ1REQVRBOgogICAgICAgIGZvciBteSAkaSAoIDAgLi4gJCNNYXBwaW5nT2JqZWN0TGlzdCApIHsKCiAgICAgICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRNYXBwaW5nT2JqZWN0TGlzdFskaV07CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17SW1wb3J0RGF0YVJvd31bJGldOwogICAgICAgICAgICAkVmFsdWUgPSBkZWZpbmVkICRWYWx1ZSAmJiAkVmFsdWVNYXB7ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gfSAmJiBkZWZpbmVkICRWYWx1ZU1hcHsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9eyRWYWx1ZX0KICAgICAgICAgICAgICAgID8gJFZhbHVlTWFweyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH17JFZhbHVlfSA6ICRWYWx1ZTsKCiAgICAgICAgICAgIGlmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSA9fiBtL15BcnRpY2xlXyguKykkLyApIHsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVERBVEEgaWYgJE9iamVjdERhdGEtPntBcnRpY2xlU2VwYXJhdGVMaW5lc307CiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1REQVRBIHVubGVzcyAkT2JqZWN0RGF0YS0+e0luY2x1ZGVBcnRpY2xlc307CgogICAgICAgICAgICAgICAgJEFydGljbGV7JDF9ID0gJFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRpY2tldHsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ID0gJFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlkZW50aWZpZXJzIGFyZSB1c3VhbGx5IFRpY2tldElEIG9yIFRpY2tldE51bWJlcgogICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1REQVRBIHVubGVzcyAkTWFwcGluZ09iamVjdERhdGEtPntJZGVudGlmaWVyfTsKCiAgICAgICAgICAgIGlmICggISRWYWx1ZSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIickTWFwcGluZ09iamVjdERhdGEtPntLZXl9JyBjYW4gbm90IGJlIGVtcHR5IG9yIDAgd2hlbiB1c2VkIGFzIGlkZW50aWZpZXIuIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gZXEgJ0FydGljbGVfQXJ0aWNsZUlEJyApIHsKICAgICAgICAgICAgICAgICRJZGVudGlmaWVye0FydGljbGV9e0FydGljbGVJRH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSA9fiAvXkFydGljbGVfLyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIkN1cnJlbnRseSBvbmx5IEFydGljbGVfQXJ0aWNsZUlEIGlzIGEgdmFsaWQgaWRlbnRpZmllciBmb3IgYXJ0aWNsZXMgKG5vdCAnJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fScpLiIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRJZGVudGlmaWVye1RpY2tldH17ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJUFydGljbGUgJiYgJE9iamVjdERhdGEtPntJbmNsdWRlQXR0YWNobWVudHN9ICYmICQjTWFwcGluZ09iamVjdExpc3QgPCAkI3sgJFBhcmFte0ltcG9ydERhdGFSb3d9IH0gKSB7CgogICAgICAgICAgICAjIHRoZSBsYXN0IGFuZCB1bm1hcHBlZCBlbnRyaWVzIGFyZSBhdHRhY2htZW50cwogICAgICAgICAgICAkQXJ0aWNsZXtBdHRhY2htZW50c30gPSBbIEB7ICRQYXJhbXtJbXBvcnREYXRhUm93fSB9WyAkI01hcHBpbmdPYmplY3RMaXN0ICsgMSAuLiAkI3sgJFBhcmFte0ltcG9ydERhdGFSb3d9IH0gXSBdOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3RhdHVzID0gJ1RpY2tldCBub3QgY2hhbmdlZCc7CiAgICAkU2VsZi0+e0Vycm9yfSA9ICcnOwogICAgaWYgKAogICAgICAgICVUaWNrZXQKICAgICAgICAmJgogICAgICAgICggISRUaWNrZXR7VGlja2V0SUR9IHx8ICFleGlzdHMgJFNlbGYtPntUaWNrZXRJRFJlbGF0aW9ufXsgJFRpY2tldHtUaWNrZXRJRH0gfSApCiAgICAgICAgKQogICAgewogICAgICAgICRTdGF0dXMgPSAkU2VsZi0+X0ltcG9ydFRpY2tldCgKICAgICAgICAgICAgVGlja2V0ICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgSWRlbnRpZmllciA9PiAkSWRlbnRpZmllcntUaWNrZXR9LAogICAgICAgICAgICBPYmplY3REYXRhID0+ICRPYmplY3REYXRhLAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdGF0dXMgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogVGlja2V0SW1wb3J0OiAkU2VsZi0+e0Vycm9yfSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgQW4gYXJ0aWNsZSBleGlzdHMgYmVjYXVzZSBhbiBhcnRpY2xlIHdhcyBkZWNsYXJlZCBpbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSB0aWNrZXQsCiAgICAjIG9yIGJlY2F1c2UgYW4gYXJ0aWNsZSB3YXMgZGVjbGFyZWQgaW4gYSBzZXBhcmF0ZSBsaW5lLgogICAgaWYgKCAlQXJ0aWNsZSAmJiAkT2JqZWN0RGF0YS0+e0luY2x1ZGVBcnRpY2xlc30gKSB7CiAgICAgICAgbXkgJEFydGljbGVTdGF0dXMgPSAkU2VsZi0+X0ltcG9ydEFydGljbGUoCiAgICAgICAgICAgIEFydGljbGUgICAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICBJZGVudGlmaWVyID0+ICRJZGVudGlmaWVye0FydGljbGV9LAogICAgICAgICAgICBPYmplY3REYXRhID0+ICRPYmplY3REYXRhLAogICAgICAgICk7CgogICAgICAgIGlmICggISRBcnRpY2xlU3RhdHVzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06IEFydGljbGVJbXBvcnQ6ICRTZWxmLT57RXJyb3J9IiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgT25seSB0aGUgYXJ0aWNsZSBzdGF0dXMgaXMgcmVsZXZhbnQgd2hlbiB0aGUgYXJ0aWNsZSBpcyBvbiBhIHNlcGVyYXRlIGxpbmUuCiAgICAgICAgIyBPdGhlcndpc2UgYm90aCB0aWNrZXQgc3RhdHVzIGFuZCBhcnRpY2xlIHN0YXR1cyBhcmUgcmVsZXZhbnQuCiAgICAgICAgaWYgKCRBcnRpY2xlSXNPblNlcGFyYXRlTGluZSkgewogICAgICAgICAgICAkU3RhdHVzID0gJEFydGljbGVTdGF0dXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhdHVzID0gam9pbiAnLCAnLCAkU3RhdHVzLCAkQXJ0aWNsZVN0YXR1czsKICAgICAgICB9CiAgICB9CgogICAgIyBTa2lwcGVkIHRpY2tldHMgYW5kIGFydGljbGVzIGFyZSBub3QgcmVwb3J0ZWQgYXMgZmFpbHVyZXMKICAgIHJldHVybiAoIC0xLCAkU3RhdHVzICkgaWYgJFN0YXR1cyA9fiBtL3NraXBwZWQvOwoKICAgICMgUmV0dXJuIHRoZSBsYXN0IHRpY2tldCBJRCBldmVuIGlmIHRoYXQgdmFsdWUgaXMgdXNlZCBvbmx5CiAgICAjIGFzIGEgZmFpbHVyZSBpbmRpY2F0b3IgaW4gSW1wb3J0RXhwb3J0LgogICAgcmV0dXJuICggJFNlbGYtPntMYXN0VGlja2V0SUR9LCAkU3RhdHVzICk7Cn0KCj1oZWFkMSBJbnRlcm5hbCBTdWJyb3V0aW5lcwoKPWhlYWQyIF9UaWNrZXRTZWFyY2gKCmp1c3QgYSB3cmFwcGVyIGFyb3VuZCBDPEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OlRpY2tldFNlYXJjaCgpPgoKPWN1dAoKc3ViIF9UaWNrZXRTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCBzZWFyY2ggZGF0YQogICAgbXkgJFNlYXJjaERhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVJc1NlbGVjdGlvbiA9IG1hcCB7ICRfID0+IDEgfSBxdyggVHlwZUlEcyBRdWV1ZUlEcyBTZXJ2aWNlSURzIFNMQUlEcyBTdGF0ZUlEcyBQcmlvcml0eUlEcyBDdXN0b21lcklEICk7CgogICAgbXkgJVNlYXJjaERhdGFQcmVwYXJlZDsKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyRTZWFyY2hEYXRhfSApIHsKICAgICAgICBuZXh0IEtFWSB1bmxlc3MgZGVmaW5lZCAkU2VhcmNoRGF0YS0+eyRLZXl9OwoKICAgICAgICAkU2VhcmNoRGF0YVByZXBhcmVkeyRLZXl9ID0gJElzU2VsZWN0aW9ueyRLZXl9ID8gWyBzcGxpdCAvIyMjIyMvLCAkU2VhcmNoRGF0YS0+eyRLZXl9IF0gOiAkU2VhcmNoRGF0YS0+eyRLZXl9OwogICAgfQoKICAgICMgQ3JlYXRlIGFuIGFycmF5IGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHNvcnQgaXMgbm90IGNhbGxlZCBpbiBzY2FsYXIgY29udGV4dC4KICAgICMKICAgICMgVGlja2V0U2VhcmNoKCkgaGFzIGEgZGVmYXVsdCBsaW1pdCBvZiAxMF8wMDAuIFRoaXMgaXMgZmluZSBpbiBhIHdlYmFwcCBidXQgbm90IGZvciBhIGNvbXBsZXRlIGV4cG9ydC4KICAgICMgQXMgYSB3b3JrYXJvdW5kIHNldCB0aGUgbGltaXQgdG8gYSBsYXJnZSBudW1iZXIgbGlrZSBvbmUgYmlsbGlvbi4KICAgIG15IEBTb3J0ZWRUaWNrZXRJRHMgPSBzb3J0IHsgJGEgPD0+ICRiIH0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICVTZWFyY2hEYXRhUHJlcGFyZWQsCiAgICAgICAgTGltaXQgID0+IDFfMDAwXzAwMF8wMDAsCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiBAU29ydGVkVGlja2V0SURzOwp9CgpzdWIgX0ltcG9ydFRpY2tldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgV2UgYXJlIGRlYWxpbmcgd2l0aCBhIG5ldyB0aWNrZXQuIFdlIGFzc3VtZSB0aGF0IHRoaXMgdGlja2V0CiAgICAjIHdvbid0IGJlIHNraXBwZWQgdW50aWwgd2UgY2hlY2sgdGhlIGltcG9ydCBmaWx0ZXJzLgogICAgdW5kZWYgJFNlbGYtPntMYXN0VGlja2V0V2FzU2tpcHBlZH07CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgbXkgJVRpY2tldCA9ICRQYXJhbXtUaWNrZXR9LT4lKjsgICAgIyBkYXRhIGZyb20gdGhlIGltcG9ydCBmaWxlCiAgICBteSAlREJUaWNrZXQ7ICAgICAgICAgICAgICAgICAgICAgICAjIFRpY2tldCBhcyByZXRyaWV2ZWQgZnJvbSB0aGUgZGF0YWJhc2UKICAgIG15ICRTdGF0dXMgPSAnVGlja2V0IG5vdCBjaGFuZ2VkJzsKCiAgICBpZiAoICRQYXJhbXtJZGVudGlmaWVyfSApIHsKICAgICAgICBteSAkREJUaWNrZXRJRDsKCiAgICAgICAgIyBUaWNrZXRJRCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgVGlja2V0TnVtYmVyCiAgICAgICAgaWYgKCAkUGFyYW17SWRlbnRpZmllcn17VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBwcmV2aW91c2x5IGltcG9ydGVkIHRpY2tldHMgb2YgdGhpcyBydW4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEUmVsYXRpb259eyAkVGlja2V0e1RpY2tldElEfSB9ICkgewoKICAgICAgICAgICAgICAgICMgd2Ugc2lsZW50bHkgc2tpcCB0aGlzIHRpY2tldCwgaWYgaXQgYWxyZWFkeSBoYXMgYmVlbiBpbXBvcnRlZAogICAgICAgICAgICAgICAgIyB0aGlzIHNpdHVhdGlvbiB3aWxsIGFsd2F5cyBvY2N1ciB3aGVuIGFydGljbGVzIGFyZSBub3QgaW1wb3J0ZWQgc2VwYXJhdGVseQogICAgICAgICAgICAgICAgIyBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3ksIHdlIHRyZWF0IG90aGVyIHNpdHVhdGlvbnMgdGhlIHNhbWUsIGFsdGhvdWdoIHRoZXkgYXJlIGxlc3MgY2xlYXIKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICMgQXJ0aWNsZXMgd2hpY2ggZm9sbG93IG9uIHNlcGFyYXRlIGxpbmVzIHdvdWxkIHN0aWxsIGJlIGltcG9ydGVkIGluIHRoaXMgY2FzZS4KICAgICAgICAgICAgICAgIG15ICRQcmlvID0gISRQYXJhbXtPYmplY3REYXRhfXtBcnRpY2xlU2VwYXJhdGVMaW5lc30KICAgICAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0xhc3RUaWNrZXRJRH0gPT0gJFNlbGYtPntUaWNrZXRJRFJlbGF0aW9ufXsgJFRpY2tldHtUaWNrZXRJRH0gfSA/ICdkZWJ1ZycgOiAnaW5mbyc7CiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJFByaW8sCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNraXBwaW5nIHRpY2tldCBjcmVhdGlvbiBmb3IgZW50aXR5ICRQYXJhbXtDb3VudGVyfSAoVGlja2V0SUQgJFRpY2tldHtUaWNrZXRJRH0pIGFzIGl0IHdhcyBoYW5kbGVkIGJlZm9yZS4iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXN0VGlja2V0SUR9ID0gJFNlbGYtPntUaWNrZXRJRFJlbGF0aW9ufXsgJFRpY2tldHtUaWNrZXRJRH0gfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJFN0YXR1czsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBleGlzdGluZyBidXQgdW5kZWZpbmVkIGVudHJ5IG1lYW5zIHByZXZpb3VzIGVycm9yIC0gd2Ugc2tpcCBhbmQgZG8gbm90aGluZwogICAgICAgICAgICBlbHNpZiAoIGV4aXN0cyAkU2VsZi0+e1RpY2tldElEUmVsYXRpb259eyAkVGlja2V0e1RpY2tldElEfSB9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlRpY2tldElEICRUaWNrZXR7VGlja2V0SUR9IHdhcyBpbmNvcnJlY3RseSBpbXBvcnRlZCBiZWZvcmUgY2FuY2VsaW5nIG5ldyB0cnkuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXhjbHVkZSB0aWNrZXRzIHdoaWNoIHdlcmUgY3JlYXRlZCBpbiB0aGlzIHJ1biBhbmQgYnkgY2hhbmNlIGdvdCB0aGUgY3VycmVudCBUaWNrZXRJRAogICAgICAgICAgICBlbHNpZiAoICF7IHJldmVyc2UgJFNlbGYtPntUaWNrZXRJRFJlbGF0aW9ufS0+JSogfS0+eyAkVGlja2V0e1RpY2tldElEfSB9ICkgewogICAgICAgICAgICAgICAgJERCVGlja2V0SUQgPSAkVGlja2V0e1RpY2tldElEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtJZGVudGlmaWVyfXtUaWNrZXROdW1iZXJ9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBwcmV2aW91c2x5IGltcG9ydGVkIHRpY2tldHMgb2YgdGhpcyBydW4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldE51bWJlcklEUmVsYXRpb259eyAkVGlja2V0e1RpY2tldE51bWJlcn0gfSApIHsKCiAgICAgICAgICAgICAgICAjIHdlIHNpbGVudGx5IHNraXAgdGhpcyB0aWNrZXQsIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4gaW1wb3J0ZWQKICAgICAgICAgICAgICAgICMgdGhpcyBzaXR1YXRpb24gd2lsbCBhbHdheXMgb2NjdXIgd2hlbiBhcnRpY2xlcyBhcmUgbm90IGltcG9ydGVkIHNlcGFyYXRlbHkKICAgICAgICAgICAgICAgICMgZm9yIHRoZSBzYWtlIG9mIGNvbnNpc3RlbmN5LCB3ZSB0cmVhdCBvdGhlciBzaXR1YXRpb25zIHRoZSBzYW1lLCBhbHRob3VnaCB0aGV5IGFyZSBsZXNzIGNsZWFyCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAjIEFydGljbGVzIHdoaWNoIGZvbGxvdyBvbiBzZXBhcmF0ZSBsaW5lcyB3b3VsZCBzdGlsbCBiZSBpbXBvcnRlZCBpbiB0aGlzIGNhc2UuCiAgICAgICAgICAgICAgICBteSAkUHJpbyA9ICEkUGFyYW17T2JqZWN0RGF0YX17QXJ0aWNsZVNlcGFyYXRlTGluZXN9CiAgICAgICAgICAgICAgICAgICAgJiYgJFNlbGYtPntMYXN0VGlja2V0SUR9ID09ICRTZWxmLT57VGlja2V0TnVtYmVySURSZWxhdGlvbn17ICRUaWNrZXR7VGlja2V0TnVtYmVyfSB9ID8gJ2RlYnVnJyA6ICdpbmZvJzsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAkUHJpbywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2tpcHBpbmcgdGlja2V0IGNyZWF0aW9uIGZvciBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9IChUaWNrZXROdW1iZXIgJFRpY2tldHtUaWNrZXROdW1iZXJ9KSBhcyBpdCB3YXMgaGFuZGxlZCBiZWZvcmUuIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGFzdFRpY2tldElEfSA9ICRTZWxmLT57VGlja2V0TnVtYmVySURSZWxhdGlvbn17ICRUaWNrZXR7VGlja2V0TnVtYmVyfSB9OwoKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xhc3RUaWNrZXRJRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXhpc3RpbmcgYnV0IHVuZGVmaW5lZCBlbnRyeSBtZWFucyBwcmV2aW91cyBlcnJvciAtIHdlIHNraXAgYW5kIGRvIG5vdGhpbmcKICAgICAgICAgICAgZWxzaWYgKCBleGlzdHMgJFNlbGYtPntUaWNrZXROdW1iZXJJRFJlbGF0aW9ufXsgJFRpY2tldHtUaWNrZXROdW1iZXJ9IH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9JbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiVGlja2V0TnVtYmVyICRUaWNrZXR7VGlja2V0TnVtYmVyfSB3YXMgaW5jb3JyZWN0bHkgaW1wb3J0ZWQgYmVmb3JlIGNhbmNlbGluZyBuZXcgdHJ5LiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGV4Y2x1ZGUgdGlja2V0cyB3aGljaCB3ZXJlIGNyZWF0ZWQgaW4gdGhpcyBydW4gYW5kIGJ5IGNoYW5jZSBnb3QgdGhlIGN1cnJlbnQgVGlja2V0TnVtYmVyCiAgICAgICAgICAgICMgVE9ETzogaG93IGlzIENyZWF0ZWROdW1iZXJzIHByb3ZpZGVkIHdpdGggY29udGVudCA/CiAgICAgICAgICAgIGVsc2lmICggISRTZWxmLT57Q3JlYXRlZE51bWJlcnN9eyAkVGlja2V0e1RpY2tldE51bWJlcn0gfSApIHsKICAgICAgICAgICAgICAgICREQlRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X0ltcG9ydEVycm9yKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICdGb3IgdGlja2V0IGNvcnJlbGF0aW9uIGNoZWNrcyBlaXRoZXIgVGlja2V0SUQgb3IgVGlja2V0TnVtYmVyIGhhcyB0byBiZSBpbmNsdWRlZCBhcyBpZGVudGlmaWVyLiAoVXNpbmcgbm8gaWRlbnRpZmllciB0byBqdXN0IGNyZWF0ZSBuZXcgdGlja2V0cyBpcyBhbHNvIHBvc3NpYmxlLiknLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCREQlRpY2tldElEKSB7CiAgICAgICAgICAgICVEQlRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJERCVGlja2V0SUQsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaWxlbnQgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdmVyaWZ5IHdoZXRoZXIgd2UgcmVhbGx5IGdvdCB0aGUgcmlnaHQgdGlja2V0LCBhbGwgaWRlbnRpZmllcnMgbXVzdCBtYXRjaAogICAgaWYgKCVEQlRpY2tldCkgewogICAgICAgIEFUVFI6CiAgICAgICAgZm9yIG15ICRBdHRyICgga2V5cyAkUGFyYW17SWRlbnRpZmllcn0tPiUqICkgewogICAgICAgICAgICBpZiAoICREQlRpY2tldHskQXR0cn0gbmUgJFRpY2tldHskQXR0cn0gKSB7CiAgICAgICAgICAgICAgICAlREJUaWNrZXQgPSAoKTsKCiAgICAgICAgICAgICAgICBsYXN0IEFUVFI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBqdXN0IHVwZGF0ZSB0aGUgdGlja2V0IGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudAogICAgaWYgKCVEQlRpY2tldCkgewoKICAgICAgICAjIFRoZXJlIGFyZSBjYXNlcyB3aGVuIGEgdGlja2V0IHVwZGF0ZSBzaG91bGQgbm90IHRha2UgcGxhY2UuIEN1cnJlbnRseSB0d28KICAgICAgICAjIG9mIHRoZXNlIGNhc2VzIGFyZSBzdXBwb3J0ZWQuIEluIGJvdGggb2YgdGhlc2UgY2FzZXMgbm8gYXJ0aWNsZXMKICAgICAgICAjIGFyZSBpbXBvcnRlZCB1bnRpbCBhIG5ldyB0aWNrZXQgaXMgZW5jb3VudGVyZWQuCiAgICAgICAgewogICAgICAgICAgICAjIFVwZGF0ZSBvbmx5IHRpY2tldHMgdGhhdCBhcmUgbm90IG93bmVkIGJ5IGEgc3BlY2lmaWMgYWdlbnQuIFVzdWFsbHkgdGhpcyBzcGVjaWFsIGFnZW50CiAgICAgICAgICAgICMgaXMgdGhlIGRlZmF1bHQgYWdlbnQgb2YgYSBwcmV2aW91cyBpbXBvcnQuIFRoZSB1c2UgY2FzZSBpcyB3aGVuIGFkZGl0aW9uYWwgdXNlcnMKICAgICAgICAgICAgIyBhcmUgYXJlIGFjdGl2YXRlZCBhZnRlciBhbiBpbml0aWFsIGltcG9ydCBvZiB0aGUgdGlja2V0cy4KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFBhcmFte09iamVjdERhdGF9LT57QWxsb3dlZE93bmVySW5UYXJnZXR9CiAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgJERCVGlja2V0e093bmVyfSBuZSAkUGFyYW17T2JqZWN0RGF0YX0tPntBbGxvd2VkT3duZXJJblRhcmdldH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdW5kZWYgJFNlbGYtPntMYXN0VGlja2V0SUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXN0VGlja2V0V2FzU2tpcHBlZH0gPSAxOwoKICAgICAgICAgICAgICAgIHJldHVybiAnVGlja2V0IHNraXBwZWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIERvbid0IG1lc3Mgd2l0aCBleGlzdGluZyB0aWNrZXRzLgogICAgICAgICAgICBpZiAoICRQYXJhbXtPYmplY3REYXRhfS0+e1NraXBFeGlzdGluZ1RpY2tldHN9ICkgewogICAgICAgICAgICAgICAgdW5kZWYgJFNlbGYtPntMYXN0VGlja2V0SUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXN0VGlja2V0V2FzU2tpcHBlZH0gPSAxOwoKICAgICAgICAgICAgICAgIHJldHVybiAnVGlja2V0IHNraXBwZWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU3RhdHVzID0gJ1RpY2tldCBub3QgY2hhbmdlZCc7CiAgICAgICAgbXkgJFRpY2tldFVwZGF0ZWRTdGF0dXMgPSAnVGlja2V0IHVwZGF0ZWQnOwoKICAgICAgICAjIGRlY2lkZSB3aGV0aGVyIHRoZSBvbGQgdmFsdWVzIHNob3VsZCBiZSBrZXB0CiAgICAgICAgbXkgJFNraXBFbXB0eSA9ICRQYXJhbXtPYmplY3REYXRhfXtFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzfTsKCiAgICAgICAgIyBjdXN0b21lcgogICAgICAgICRUaWNrZXR7Q3VzdG9tZXJJRH0gICAgIHx8PSAkU2tpcEVtcHR5ID8gJERCVGlja2V0e0N1c3RvbWVySUR9ICAgICA6ICRQYXJhbXtPYmplY3REYXRhfXtDdXN0b21lcklEfTsKICAgICAgICAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSB8fD0gJFNraXBFbXB0eSA/ICREQlRpY2tldHtDdXN0b21lclVzZXJJRH0gOiAkUGFyYW17T2JqZWN0RGF0YX17Q3VzdG9tZXJVc2VySUR9OwogICAgICAgICREQlRpY2tldHtDdXN0b21lcklEfSAgICAgLy89ICcnOwogICAgICAgICREQlRpY2tldHtDdXN0b21lclVzZXJJRH0gLy89ICcnOwoKICAgICAgICBpZiAoICggISRUaWNrZXR7Q3VzdG9tZXJJRH0gJiYgJERCVGlja2V0e0N1c3RvbWVySUR9ICkgfHwgKCAhJFRpY2tldHtDdXN0b21lclVzZXJJRH0gJiYgJERCVGlja2V0e0N1c3RvbWVyVXNlcklEfSApICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmV4cGVjdGVkIHN0YXRlIGVuY291bnRlcmVkIGZvciBleGlzdGluZyBUaWNrZXRJRCAkVGlja2V0e1RpY2tldElEfSAoRW50aXR5ICRQYXJhbXtDb3VudGVyfSk6ICIKICAgICAgICAgICAgICAgICAgICAuICJUaWNrZXQgY3VzdG9tZXIgY2FuIG5vdCBiZSBlbXB0aWVkIC0gbm90IGEgcmVhbCBjaHJvbm9sb2dpY2FsIHVwZGF0ZTsgaWdub3JpbmcgdGhpcywgYW5kIGtlZXBpbmcgQ3VzdG9tZXIoVXNlcilJRC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgewogICAgICAgICAgICBteSAkVXBkYXRlID0gJFRpY2tldHtDdXN0b21lcklEfSAmJiAkVGlja2V0e0N1c3RvbWVySUR9IG5lICREQlRpY2tldHtDdXN0b21lcklEfSA/IDEgOgogICAgICAgICAgICAgICAgJFRpY2tldHtDdXN0b21lclVzZXJJRH0gJiYgJFRpY2tldHtDdXN0b21lclVzZXJJRH0gbmUgJERCVGlja2V0e0N1c3RvbWVyVXNlcklEfSA/IDEgOiAwOwoKICAgICAgICAgICAgaWYgKCRVcGRhdGUpIHsKICAgICAgICAgICAgICAgICRTdGF0dXMgPSAkVGlja2V0VXBkYXRlZFN0YXR1czsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3VzdG9tZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgTm8gICAgICAgPT4gJFRpY2tldHtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VyICAgICA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkREJUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X0ltcG9ydEVycm9yKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIEN1c3RvbWVyKFVzZXIpIGZvciBUaWNrZXRJRCAkREJUaWNrZXR7VGlja2V0SUR9IiwKICAgICAgICAgICAgICAgICkgdW5sZXNzICRTdWNjZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHRpdGxlCiAgICAgICAgJFRpY2tldHtUaXRsZX0gfHw9CiAgICAgICAgICAgICggZGVmaW5lZCAkVGlja2V0e1RpdGxlfSAmJiAkVGlja2V0e1RpdGxlfSBlcSAnMCcgKSA/ICcwJyA6CiAgICAgICAgICAgICRTa2lwRW1wdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICREQlRpY2tldHtUaXRsZX0gOgogICAgICAgICAgICAkUGFyYW17T2JqZWN0RGF0YX17U3ViamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgPyAkUGFyYW17T2JqZWN0RGF0YX17U3ViamVjdH0gOiAnJzsKCiAgICAgICAgaWYgKCAkVGlja2V0e1RpdGxlfSBuZSAkREJUaWNrZXR7VGl0bGV9ICkgewogICAgICAgICAgICAkU3RhdHVzID0gJFRpY2tldFVwZGF0ZWRTdGF0dXM7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICREQlRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIFRpdGxlIGZvciBUaWNrZXRJRCAkREJUaWNrZXR7VGlja2V0SUR9IiwKICAgICAgICAgICAgKSB1bmxlc3MgJFN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICAjIHF1ZXVlCiAgICAgICAgaWYgKCAhJFRpY2tldHtRdWV1ZUlEfSAmJiAkVGlja2V0e1F1ZXVlfSApIHsKICAgICAgICAgICAgJFRpY2tldHtRdWV1ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRUaWNrZXR7UXVldWV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkVGlja2V0e1F1ZXVlSUR9IHx8PSAkU2tpcEVtcHR5ID8gJERCVGlja2V0e1F1ZXVlSUR9IDogJFBhcmFte09iamVjdERhdGF9e1F1ZXVlSUR9OwoKICAgICAgICBpZiAoICRUaWNrZXR7UXVldWVJRH0gbmUgJERCVGlja2V0e1F1ZXVlSUR9ICkgewogICAgICAgICAgICAkU3RhdHVzID0gJFRpY2tldFVwZGF0ZWRTdGF0dXM7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVTZXQoCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJERCVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9JbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCB1cGRhdGUgUXVldWUgZm9yIFRpY2tldElEICREQlRpY2tldHtUaWNrZXRJRH0iLAogICAgICAgICAgICApIHVubGVzcyAkU3VjY2VzczsKICAgICAgICB9CgogICAgICAgICMgbmVlZCBmb3IgY2hlY2tpbmcgdGhlIGFjdGl2YXRlZCBmZWF0dXJlczogVGlja2V0OjpUeXBlLCBUaWNrZXQ6OlJlc3BvbnNpYmxlLCBUaWNrZXQ6OlNlcnZpY2UKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyB0eXBlCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICAgICBpZiAoICEkVGlja2V0e1R5cGVJRH0gJiYgJFRpY2tldHtUeXBlfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXR7VHlwZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVGlja2V0e1R5cGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkVGlja2V0e1R5cGVJRH0gfHw9ICRTa2lwRW1wdHkgPyAkREJUaWNrZXR7VHlwZUlEfSA6ICRQYXJhbXtPYmplY3REYXRhfXtUeXBlSUR9OwoKICAgICAgICAgICAgaWYgKCAkVGlja2V0e1R5cGVJRH0gbmUgJERCVGlja2V0e1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdHVzID0gJFRpY2tldFVwZGF0ZWRTdGF0dXM7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgPT4gJFRpY2tldHtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICREQlRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCB1cGRhdGUgVHlwZSBmb3IgVGlja2V0SUQgJERCVGlja2V0e1RpY2tldElEfSIsCiAgICAgICAgICAgICAgICApIHVubGVzcyAkU3VjY2VzczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICAgICAgIyBzZXJ2aWNlCiAgICAgICAgICAgIGlmICggISRUaWNrZXR7U2VydmljZUlEfSAmJiAkVGlja2V0e1NlcnZpY2V9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldHtTZXJ2aWNlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRUaWNrZXR7U2VydmljZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRUaWNrZXR7U2VydmljZUlEfSB8fD0gJFNraXBFbXB0eSA/ICREQlRpY2tldHtTZXJ2aWNlSUR9IDogJFBhcmFte09iamVjdERhdGF9e1NlcnZpY2VJRH07CiAgICAgICAgICAgICREQlRpY2tldHtTZXJ2aWNlSUR9IC8vPSAnJzsKCiAgICAgICAgICAgIGlmICggISRUaWNrZXR7U2VydmljZUlEfSAmJiAkREJUaWNrZXR7U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5leHBlY3RlZCBzdGF0ZSBlbmNvdW50ZXJlZCBmb3IgZXhpc3RpbmcgVGlja2V0SUQgJFRpY2tldHtUaWNrZXRJRH0gKEVudGl0eSAkUGFyYW17Q291bnRlcn0pOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlNlcnZpY2VzIGNhbiBub3QgYmUgZW1wdGllZCAtIG5vdCBhIHJlYWwgY2hyb25vbG9naWNhbCB1cGRhdGU7IGlnbm9yaW5nIHRoaXMsIGFuZCBrZWVwaW5nIHRoZSBTZXJ2aWNlLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRUaWNrZXR7U2VydmljZUlEfSAmJiAkVGlja2V0e1NlcnZpY2VJRH0gbmUgJERCVGlja2V0e1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdHVzID0gJFRpY2tldFVwZGF0ZWRTdGF0dXM7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlcnZpY2VTZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRUaWNrZXR7U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJERCVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCB1cGRhdGUgU2VydmljZSBmb3IgVGlja2V0SUQgJERCVGlja2V0e1RpY2tldElEfSIsCiAgICAgICAgICAgICAgICApIHVubGVzcyAkU3VjY2VzczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTTEEKICAgICAgICAgICAgaWYgKCAhJFRpY2tldHtTTEFJRH0gJiYgJFRpY2tldHtTTEF9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldHtTTEFJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBTTEEgPT4gJFRpY2tldHtTTEF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkVGlja2V0e1NMQUlEfSB8fD0gJFNraXBFbXB0eSA/ICREQlRpY2tldHtTTEFJRH0gOiAkUGFyYW17T2JqZWN0RGF0YX17U0xBSUR9OwogICAgICAgICAgICAkREJUaWNrZXR7U0xBSUR9IC8vPSAnJzsKCiAgICAgICAgICAgIGlmICggISRUaWNrZXR7U0xBSUR9ICYmICREQlRpY2tldHtTTEFJRH0gKSB7CiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuZXhwZWN0ZWQgc3RhdGUgZW5jb3VudGVyZWQgZm9yIGV4aXN0aW5nIFRpY2tldElEICRUaWNrZXR7VGlja2V0SUR9IChFbnRpdHkgJFBhcmFte0NvdW50ZXJ9KTogIgogICAgICAgICAgICAgICAgICAgICAgICAuICJTTEFzIGNhbiBub3QgYmUgZW1wdGllZCAtIG5vdCBhIHJlYWwgY2hyb25vbG9naWNhbCB1cGRhdGU7IGlnbm9yaW5nIHRoaXMsIGFuZCBrZWVwaW5nIHRoZSBTTEEuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFRpY2tldHtTTEFJRH0gJiYgJFRpY2tldHtTTEFJRH0gbmUgJERCVGlja2V0e1NMQUlEfSApIHsKICAgICAgICAgICAgICAgICRTdGF0dXMgPSAkVGlja2V0VXBkYXRlZFN0YXR1czsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgID0+ICRUaWNrZXR7U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICREQlRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCB1cGRhdGUgU0xBIGZvciBUaWNrZXRJRCAkREJUaWNrZXR7VGlja2V0SUR9IiwKICAgICAgICAgICAgICAgICkgdW5sZXNzICRTdWNjZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG93bmVyCiAgICAgICAgaWYgKCAhJFRpY2tldHtPd25lcklEfSAmJiAkVGlja2V0e093bmVyfSApIHsKICAgICAgICAgICAgJFRpY2tldHtPd25lcklEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRpY2tldHtPd25lcn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRUaWNrZXR7T3duZXJJRH0gfHw9ICRTa2lwRW1wdHkgPyAkREJUaWNrZXR7T3duZXJJRH0gOiAkUGFyYW17T2JqZWN0RGF0YX17T3duZXJJRH07CgogICAgICAgIGlmICggISRUaWNrZXR7T3duZXJJRH0gJiYgJERCVGlja2V0e093bmVySUR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmV4cGVjdGVkIHN0YXRlIGVuY291bnRlcmVkIGZvciBleGlzdGluZyBUaWNrZXRJRCAkVGlja2V0e1RpY2tldElEfSAoRW50aXR5ICRQYXJhbXtDb3VudGVyfSk6ICIKICAgICAgICAgICAgICAgICAgICAuICJPd25lcnMgY2FuIG5vdCBiZSBlbXB0aWVkIC0gbm90IGEgcmVhbCBjaHJvbm9sb2dpY2FsIHVwZGF0ZTsgaWdub3JpbmcgdGhpcywgYW5kIGtlZXBpbmcgdGhlIE93bmVyLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gJiYgJFRpY2tldHtPd25lcklEfSBuZSAkREJUaWNrZXR7T3duZXJJRH0gKSB7CiAgICAgICAgICAgICRTdGF0dXMgPSAkVGlja2V0VXBkYXRlZFN0YXR1czsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkVGlja2V0e093bmVySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICREQlRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X0ltcG9ydEVycm9yKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IHVwZGF0ZSBPd25lciBmb3IgVGlja2V0SUQgJERCVGlja2V0e1RpY2tldElEfSIsCiAgICAgICAgICAgICkgdW5sZXNzICRTdWNjZXNzOwogICAgICAgIH0KCiAgICAgICAgIyBsb2NrCiAgICAgICAgaWYgKCAhJFRpY2tldHtMb2NrSUR9ICYmICRUaWNrZXR7TG9ja30gKSB7CiAgICAgICAgICAgICRUaWNrZXR7TG9ja0lEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2NrJyktPkxvY2tMb29rdXAoCiAgICAgICAgICAgICAgICBMb2NrID0+ICRUaWNrZXR7TG9ja30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRUaWNrZXR7TG9ja0lEfSB8fD0gJFNraXBFbXB0eSA/ICREQlRpY2tldHtMb2NrSUR9IDogJFBhcmFte09iamVjdERhdGF9e0xvY2tJRH07CgogICAgICAgICMgY2hlY2sgd2hldGhlciBhbiBvd25lciBleGlzdHMgaGVyZSAtIGlmIG5vdCB0cnlpbmcgdG8gbG9jayB3aWxsIGZhaWwKICAgICAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gJiYgJFRpY2tldHtMb2NrSUR9IG5lICREQlRpY2tldHtMb2NrSUR9ICkgewogICAgICAgICAgICAkU3RhdHVzID0gJFRpY2tldFVwZGF0ZWRTdGF0dXM7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIExvY2tJRCAgID0+ICRUaWNrZXR7TG9ja0lEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICREQlRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIExvY2sgZm9yIFRpY2tldElEICREQlRpY2tldHtUaWNrZXRJRH0iLAogICAgICAgICAgICApIHVubGVzcyAkU3VjY2VzczsKICAgICAgICB9CgogICAgICAgICMgcmVzcG9uc2libGUKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICkgewogICAgICAgICAgICBpZiAoICEkVGlja2V0e1Jlc3BvbnNpYmxlSUR9ICYmICRUaWNrZXR7UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldHtSZXNwb25zaWJsZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUaWNrZXR7UmVzcG9uc2libGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9IHx8PSAkU2tpcEVtcHR5ID8gJERCVGlja2V0e1Jlc3BvbnNpYmxlSUR9IDogJFBhcmFte09iamVjdERhdGF9e1Jlc3BvbnNpYmxlSUR9OwoKICAgICAgICAgICAgaWYgKCAhJFRpY2tldHtSZXNwb25zaWJsZUlEfSAmJiAkREJUaWNrZXR7UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuZXhwZWN0ZWQgc3RhdGUgZW5jb3VudGVyZWQgZm9yIGV4aXN0aW5nIFRpY2tldElEICRUaWNrZXR7VGlja2V0SUR9IChFbnRpdHkgJFBhcmFte0NvdW50ZXJ9KTogIgogICAgICAgICAgICAgICAgICAgICAgICAuICJSZXNwb25zaWJsZXMgY2FuIG5vdCBiZSBlbXB0aWVkIC0gbm90IGEgcmVhbCBjaHJvbm9sb2dpY2FsIHVwZGF0ZTsgaWdub3JpbmcgdGhpcywgYW5kIGtlZXBpbmcgdGhlIFJlc3BvbnNpYmxlLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRUaWNrZXR7UmVzcG9uc2libGVJRH0gJiYgJFRpY2tldHtSZXNwb25zaWJsZUlEfSBuZSAkREJUaWNrZXR7UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdHVzID0gJFRpY2tldFVwZGF0ZWRTdGF0dXM7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkREJUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9JbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IHVwZGF0ZSBSZXNwb25zaWJsZSBmb3IgVGlja2V0SUQgJERCVGlja2V0e1RpY2tldElEfSIsCiAgICAgICAgICAgICAgICApIHVubGVzcyAkU3VjY2VzczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwcmlvcml0eQogICAgICAgIGlmICggISRUaWNrZXR7UHJpb3JpdHlJRH0gJiYgJFRpY2tldHtQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7UHJpb3JpdHlJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknKS0+UHJpb3JpdHlMb29rdXAoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAkVGlja2V0e1ByaW9yaXR5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFRpY2tldHtQcmlvcml0eUlEfSB8fD0gJFNraXBFbXB0eSA/ICREQlRpY2tldHtQcmlvcml0eUlEfSA6ICRQYXJhbXtPYmplY3REYXRhfXtQcmlvcml0eUlEfTsKCiAgICAgICAgaWYgKCAkVGlja2V0e1ByaW9yaXR5SUR9IG5lICREQlRpY2tldHtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFN0YXR1cyA9ICRUaWNrZXRVcGRhdGVkU3RhdHVzOwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkREJUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIFByaW9yaXR5IGZvciBUaWNrZXRJRCAkREJUaWNrZXR7VGlja2V0SUR9IiwKICAgICAgICAgICAgKSB1bmxlc3MgJFN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXRlCiAgICAgICAgaWYgKCAhJFRpY2tldHtTdGF0ZUlEfSAmJiAkVGlja2V0e1N0YXRlfSApIHsKICAgICAgICAgICAgJFRpY2tldHtTdGF0ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFN0YXRlID0+ICRUaWNrZXR7U3RhdGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkVGlja2V0e1N0YXRlSUR9IHx8PSAkU2tpcEVtcHR5ID8gJERCVGlja2V0e1N0YXRlSUR9IDogJFBhcmFte09iamVjdERhdGF9e1N0YXRlSUR9OwoKICAgICAgICBpZiAoICRUaWNrZXR7U3RhdGVJRH0gbmUgJERCVGlja2V0e1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU3RhdHVzID0gJFRpY2tldFVwZGF0ZWRTdGF0dXM7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJERCVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9JbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCB1cGRhdGUgU3RhdGUgZm9yIFRpY2tldElEICREQlRpY2tldHtUaWNrZXRJRH0iLAogICAgICAgICAgICApIHVubGVzcyAkU3VjY2VzczsKICAgICAgICB9CgogICAgICAgICMgYXJjaGl2ZSBmbGFnCiAgICAgICAgJFRpY2tldHtBcmNoaXZlRmxhZ30gfHw9ICRTa2lwRW1wdHkgPyAkREJUaWNrZXR7QXJjaGl2ZUZsYWd9IDogJFBhcmFte09iamVjdERhdGF9e0FyY2hpdmVGbGFnfTsKCiAgICAgICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAkREJUaWNrZXR7QXJjaGl2ZUZsYWd9ICkgewogICAgICAgICAgICAkU3RhdHVzID0gJFRpY2tldFVwZGF0ZWRTdGF0dXM7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0QXJjaGl2ZUZsYWdTZXQoCiAgICAgICAgICAgICAgICBBcmNoaXZlRmxhZyA9PiAkVGlja2V0e0FyY2hpdmVGbGFnfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICREQlRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIEFyY2hpdmVGbGFnIGZvciBUaWNrZXRJRCAkREJUaWNrZXR7VGlja2V0SUR9IiwKICAgICAgICAgICAgKSB1bmxlc3MgJFN1Y2Nlc3M7CiAgICAgICAgfQogICAgfQoKICAgICMgQSBuZXcgdGlja2V0IHdpbGwgYmUgY3JlYXRlZC4gQ29sbGVjdCB0aGUgaW5wdXQgZm9yIFRpY2tldENyZWF0ZSBpbiAlREJUaWNrZXQuCiAgICBlbHNlIHsKICAgICAgICAkU3RhdHVzID0gJ1RpY2tldCBjcmVhdGVkJzsKCiAgICAgICAgIyBjdXN0b21lcgogICAgICAgICREQlRpY2tldHtDdXN0b21lcklEfSAgID0gJFRpY2tldHtDdXN0b21lcklEfSAgICAgfHwgJFBhcmFte09iamVjdERhdGF9e0N1c3RvbWVySUR9OwogICAgICAgICREQlRpY2tldHtDdXN0b21lclVzZXJ9ID0gJFRpY2tldHtDdXN0b21lclVzZXJJRH0gfHwgJFBhcmFte09iamVjdERhdGF9e0N1c3RvbWVyVXNlcklEfTsKCiAgICAgICAgIyB0aXRsZQogICAgICAgICREQlRpY2tldHtUaXRsZX0gPSAoICRUaWNrZXR7VGl0bGV9IHx8ICggZGVmaW5lZCAkVGlja2V0e1RpdGxlfSAmJiAkVGlja2V0e1RpdGxlfSBlcSAnMCcgKSApCiAgICAgICAgICAgID8KICAgICAgICAgICAgJFRpY2tldHtUaXRsZX0KICAgICAgICAgICAgOgogICAgICAgICAgICAkUGFyYW17T2JqZWN0RGF0YX17U3ViamVjdH07CgogICAgICAgICMgcXVldWUKICAgICAgICBpZiAoICEkVGlja2V0e1F1ZXVlSUR9ICYmICRUaWNrZXR7UXVldWV9ICkgewogICAgICAgICAgICAkVGlja2V0e1F1ZXVlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWUgPT4gJFRpY2tldHtRdWV1ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICREQlRpY2tldHtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJFBhcmFte09iamVjdERhdGF9e1F1ZXVlSUR9OwoKICAgICAgICAjIG5lZWQgZm9yIGNoZWNraW5nIHRoZSBhY3RpdmF0ZWQgZmVhdHVyZXM6IFRpY2tldDo6VHlwZSwgVGlja2V0OjpSZXNwb25zaWJsZSwgVGlja2V0OjpTZXJ2aWNlCiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgdHlwZQogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAgICAgaWYgKCAhJFRpY2tldHtUeXBlSUR9ICYmICRUaWNrZXR7VHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0e1R5cGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpLT5UeXBlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJFRpY2tldHtUeXBlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERCVGlja2V0e1R5cGVJRH0gPSAkVGlja2V0e1R5cGVJRH0gfHwgJFBhcmFte09iamVjdERhdGF9e1R5cGVJRH07CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CgogICAgICAgICAgICAjIHNlcnZpY2UKICAgICAgICAgICAgaWYgKCAhJFRpY2tldHtTZXJ2aWNlSUR9ICYmICRUaWNrZXR7U2VydmljZX0gKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0e1NlcnZpY2VJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFRpY2tldHtTZXJ2aWNlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERCVGlja2V0e1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH0gfHwgJFBhcmFte09iamVjdERhdGF9e1NlcnZpY2VJRH07CgogICAgICAgICAgICAjIHNsYQogICAgICAgICAgICBpZiAoICEkVGlja2V0e1NMQUlEfSAmJiAkVGlja2V0e1NMQX0gKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0e1NMQUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKS0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNMQSA9PiAkVGlja2V0e1NMQX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREQlRpY2tldHtTTEFJRH0gPSAkVGlja2V0e1NMQUlEfSB8fCAkUGFyYW17T2JqZWN0RGF0YX17U0xBSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBvd25lcgogICAgICAgIGlmICggISRUaWNrZXR7T3duZXJJRH0gJiYgJFRpY2tldHtPd25lcn0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7T3duZXJJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUaWNrZXR7T3duZXJ9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkREJUaWNrZXR7T3duZXJJRH0gPSAkVGlja2V0e093bmVySUR9IHx8ICRQYXJhbXtPYmplY3REYXRhfXtPd25lcklEfTsKCiAgICAgICAgIyBsb2NrCiAgICAgICAgaWYgKCAhJFRpY2tldHtMb2NrSUR9ICYmICRUaWNrZXR7TG9ja30gKSB7CiAgICAgICAgICAgICRUaWNrZXR7TG9ja0lEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2NrJyktPkxvY2tMb29rdXAoCiAgICAgICAgICAgICAgICBMb2NrID0+ICRUaWNrZXR7TG9ja30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICREQlRpY2tldHtMb2NrSUR9ID0gJFRpY2tldHtMb2NrSUR9IHx8ICRQYXJhbXtPYmplY3REYXRhfXtMb2NrSUR9OwoKICAgICAgICAjIHJlc3BvbnNpYmxlCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSApIHsKICAgICAgICAgICAgaWYgKCAhJFRpY2tldHtSZXNwb25zaWJsZUlEfSAmJiAkVGlja2V0e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXR7UmVzcG9uc2libGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGlja2V0e1Jlc3BvbnNpYmxlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERCVGlja2V0e1Jlc3BvbnNpYmxlSUR9ID0gJFRpY2tldHtSZXNwb25zaWJsZUlEfSB8fCAkUGFyYW17T2JqZWN0RGF0YX17UmVzcG9uc2libGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIHByaW9yaXR5CiAgICAgICAgaWYgKCAhJFRpY2tldHtQcmlvcml0eUlEfSAmJiAkVGlja2V0e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgJFRpY2tldHtQcmlvcml0eUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpLT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICRUaWNrZXR7UHJpb3JpdHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkREJUaWNrZXR7UHJpb3JpdHlJRH0gPSAkVGlja2V0e1ByaW9yaXR5SUR9IHx8ICRQYXJhbXtPYmplY3REYXRhfXtQcmlvcml0eUlEfTsKCiAgICAgICAgIyBzdGF0ZQogICAgICAgIGlmICggISRUaWNrZXR7U3RhdGVJRH0gJiYgJFRpY2tldHtTdGF0ZX0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7U3RhdGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBTdGF0ZSA9PiAkVGlja2V0e1N0YXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJERCVGlja2V0e1N0YXRlSUR9ID0gJFRpY2tldHtTdGF0ZUlEfSB8fCAkUGFyYW17T2JqZWN0RGF0YX17U3RhdGVJRH07CgogICAgICAgICMgYXJjaGl2ZSBmbGFnCiAgICAgICAgJERCVGlja2V0e0FyY2hpdmVGbGFnfSA9ICRUaWNrZXR7QXJjaGl2ZUZsYWd9IHx8ICRQYXJhbXtPYmplY3REYXRhfXtBcmNoaXZlRmxhZ307CgogICAgICAgICMgSGFuZGxlIHBlbmRpbmcgdHJhbnNhY3Rpb24gZXZlbnRzIG9mIHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgdGlja2V0CiAgICAgICAgIyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgdGlja2V0LgogICAgICAgICRUaWNrZXRPYmplY3QtPkV2ZW50SGFuZGxlclRyYW5zYWN0aW9uOwoKICAgICAgICAjIENyZWF0ZSBhIG5ldyB0aWNrZXQuIFRoZSB0cmFuc2FjdGlvbiBldmVudHMgZ2VuZXJhdGVkIGhlcmUgd2lsbCBiZSBoYW5kbGVkCiAgICAgICAgIyBiZWZvcmUgdGhlIG5leHQgdGlja2V0IGNyZWF0aW9uIG9yIGR1cmluZyBnbG9iYWwgZGVzdHJ1Y3Rpb24uCiAgICAgICAgJERCVGlja2V0e1RpY2tldElEfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgJURCVGlja2V0LAogICAgICAgICAgICBUTiAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9IC8vICcnLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPl9JbXBvcnRFcnJvcigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBNZXNzYWdlID0+ICdDb3VsZCBub3QgY3JlYXRlIG5ldyB0aWNrZXQnLAogICAgICAgICkgdW5sZXNzICREQlRpY2tldHtUaWNrZXRJRH07CgogICAgICAgICREQlRpY2tldHtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkREJUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFRpY2tldHtDcmVhdGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gLy89ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAgICAgcmV0dXJuIHVubGVzcyAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICJVUERBVEUgdGlja2V0IFNFVCBjcmVhdGVfdGltZSA9ID8gV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRpY2tldHtDcmVhdGVkfSwgXCREQlRpY2tldHtUaWNrZXRJRH0gXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRmV0Y2ggYWRkaXRpb25hbCBkYXRhIGZyb20gdGhlIHNvdXJjZSBpbnN0YWxsYXRpb24gaWYgY29uZmlndXJlZC4KICAgICAgICBteSAkU3luY0RCQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdJbXBvcnRFeHBvcnQ6OlRpY2tldDo6U3luY2hyb25pemVXaXRoRm9yZWlnbkRCJyk7CiAgICAgICAgaWYgKCRTeW5jREJDb25maWcpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+X1N5bmNocm9uaXplRXh0ZW5kZWREQkVudHJpZXMoCiAgICAgICAgICAgICAgICBGb3JlaWduREIgICAgICAgPT4gJFN5bmNEQkNvbmZpZywKICAgICAgICAgICAgICAgIEZvcmVpZ25UaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkREJUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3Qgc3luY2hyb25pemUgZXh0ZW5kZWQgREIgZW50cmllcyBmb3IgdGlja2V0ICREQlRpY2tldHtUaWNrZXRJRH0iLAogICAgICAgICAgICApIHVubGVzcyAkU3VjY2VzczsKICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICVTdGFuZGFyZE11bHRpU2VsZWN0ICAgICAgID0gbWFwIHsgJF8gPT4gMSB9IHF3KCBNdWx0aXNlbGVjdCBEYXRhYmFzZSBXZWJTZXJ2aWNlICk7CgogICAgIyBkeW5hbWljIGZpZWxkcwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICRBdHRyICgga2V5cyAlVGlja2V0ICkgewoKICAgICAgICAjIG9ubHkgaGFuZGxlIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRBdHRyID1+IG0vXkR5bmFtaWNGaWVsZF8oLispJC87CgogICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGN1cnJlbnQgdmFsdWUKICAgICAgICBteSAkREJWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkREJUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG11bHRpIHNlbGVjdCBmaWVsZHMgbmVlZCBzcGVjaWFsIHRyZWF0bWVudAogICAgICAgIGlmICggJFN0YW5kYXJkTXVsdGlTZWxlY3R7ICREeW5hbWljRmllbGRDb25maWctPntGaWVsZFR5cGV9IH0gfHwgcmVmICREQlZhbHVlIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICRUaWNrZXR7JEF0dHJ9ID0gJFRpY2tldHskQXR0cn0gPyBbIG1hcCB7IGRlY29kZSggJ1VURi04JywgZGVjb2RlX2Jhc2U2NCgkXykgKSB9IHNwbGl0KCAvIyMjLywgJFRpY2tldHskQXR0cn0gKSBdIDogW107CiAgICAgICAgfQoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlSXNEaWZmZXJlbnQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZTEgICAgICAgICAgICAgPT4gJFRpY2tldHskQXR0cn0sCiAgICAgICAgICAgIFZhbHVlMiAgICAgICAgICAgICA9PiAkREJWYWx1ZSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTdGF0dXMgZXEgJ1RpY2tldCBub3QgY2hhbmdlZCcgKSB7CiAgICAgICAgICAgICRTdGF0dXMgPSAnVGlja2V0IHVwZGF0ZWQnOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUaWNrZXR7JEF0dHJ9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgICAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICREQlRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRpY2tldHskQXR0cn0sCiAgICAgICAgICAgICAgICBFeHRlcm5hbFNvdXJjZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IHVwZGF0ZSAkQXR0ciB0byAnJFRpY2tldHskQXR0cn0nIGZvciBUaWNrZXRJRCAkREJUaWNrZXR7VGlja2V0SUR9IiwKICAgICAgICApIHVubGVzcyAkU3VjY2VzczsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtJZGVudGlmaWVyfXtUaWNrZXRJRH0gfHwgJFBhcmFte09iamVjdERhdGF9e0luY2x1ZGVBcnRpY2xlc30gKSB7CgogICAgICAgICMgVE9ETzogd2h5IHRoZSBjaGVjayBvbiBJbmNsdWRlQXJ0aWNsZXMKICAgICAgICBpZiAoICRUaWNrZXR7VGlja2V0SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldElEUmVsYXRpb259eyAkVGlja2V0e1RpY2tldElEfSB9ID0gJERCVGlja2V0e1RpY2tldElEfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtJZGVudGlmaWVyfXtUaWNrZXROdW1iZXJ9ICkgewogICAgICAgICRTZWxmLT57VGlja2V0TnVtYmVySURSZWxhdGlvbn17ICRUaWNrZXR7VGlja2V0TnVtYmVyfSB9ID0gJERCVGlja2V0e1RpY2tldElEfTsKICAgIH0KCiAgICAjIHJlbWVtYmVyIHRoZSB0aWNrZXQgSUQgc28gdGhhdCBhcnRpY2xlcyBjYW4gYmUgYXR0YWNoZWQgdG8gaXQKICAgICRTZWxmLT57TGFzdFRpY2tldElEfSA9ICREQlRpY2tldHtUaWNrZXRJRH07CgogICAgcmV0dXJuICRTdGF0dXM7Cn0KCnN1YiBfSW1wb3J0QXJ0aWNsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVBcnRpY2xlID0gJFBhcmFte0FydGljbGV9LT4lKjsKCiAgICBteSAkVGlja2V0SUQgPQogICAgICAgICRBcnRpY2xle1RpY2tldElEfSAmJiAkU2VsZi0+e1RpY2tldElEUmVsYXRpb259eyAkQXJ0aWNsZXtUaWNrZXRJRH0gfSA/ICRTZWxmLT57VGlja2V0SURSZWxhdGlvbn17ICRBcnRpY2xle1RpY2tldElEfSB9IDoKICAgICAgICAkU2VsZi0+e0xhc3RUaWNrZXRJRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAkU2VsZi0+e0xhc3RUaWNrZXRJRH0gOiAnJzsKCiAgICByZXR1cm4gJFNlbGYtPl9JbXBvcnRFcnJvcigKICAgICAgICAlUGFyYW0sCiAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGZpbmQgbmV3IFRpY2tldElEIGZvciBBcnRpY2xlIiwKICAgICkgdW5sZXNzICRUaWNrZXRJRDsKCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIGF2b2lkIGR1cGxpY2F0ZSBhcnRpY2xlcyBpZiBBcnRpY2xlSUQgaXMgZ2l2ZW4KICAgIGlmICggJFBhcmFte0lkZW50aWZpZXJ9ICYmICRQYXJhbXtJZGVudGlmaWVyfXtBcnRpY2xlSUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgbXkgQERCQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnQXJ0aWNsZSBza2lwcGVkJyBpZiBAREJBcnRpY2xlczsKICAgIH0KCiAgICBteSAlVmFsaWRJbXBvcnRDaGFubmVsID0gbWFwIHsgJF8gPT4gMSB9IHF3KCBFbWFpbCBJbnRlcm5hbCBQaG9uZSApOwogICAgbXkgJENoYW5uZWxOYW1lICAgICAgICA9ICRBcnRpY2xle0FydGljbGVCYWNrZW5kfSB8fCAkUGFyYW17T2JqZWN0RGF0YX17QXJ0aWNsZUJhY2tlbmR9OwoKICAgIHJldHVybiAkU2VsZi0+X0ltcG9ydEVycm9yKAogICAgICAgICVQYXJhbSwKICAgICAgICBNZXNzYWdlID0+ICInJENoYW5uZWxOYW1lJyBpcyAoY3VycmVudGx5KSBub3QgYSBzdXBwb3J0ZWQgQXJ0aWNsZUJhY2tlbmQiLAogICAgKSB1bmxlc3MgJFZhbGlkSW1wb3J0Q2hhbm5lbHskQ2hhbm5lbE5hbWV9OwoKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICRDaGFubmVsTmFtZSApOwoKICAgIGlmICggJENoYW5uZWxOYW1lIGVxICdFbWFpbCcgJiYgISRBcnRpY2xle01lc3NhZ2VJRH0gKSB7CiAgICAgICAgbXkgJFRpbWUgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCk7CiAgICAgICAgbXkgJFJhbmRvbSA9IHJhbmQgOTk5OTk5OwogICAgICAgIG15ICRGUUROICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZRRE4nKTsKICAgICAgICAkQXJ0aWNsZXtNZXNzYWdlSUR9ID0gIjwkVGltZS4kUmFuZG9tXEAkRlFETj4iOwogICAgfQoKICAgIG15ICRIaXN0b3J5Q29tbWVudCA9ICclJUltcG9ydGVkIEFydGljbGUnOwogICAgaWYgKCAkQXJ0aWNsZXtUaWNrZXRJRH0gfHwgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAkSGlzdG9yeUNvbW1lbnQgLj0gJyAtIExlZ2FjeSc7CiAgICAgICAgJEhpc3RvcnlDb21tZW50IC49ICRBcnRpY2xle1RpY2tldElEfSAgPyAiIFRJRDogJEFydGljbGV7VGlja2V0SUR9OyIgIDogJyc7CiAgICAgICAgJEhpc3RvcnlDb21tZW50IC49ICRBcnRpY2xle0FydGljbGVJRH0gPyAiIEFJRDogJEFydGljbGV7QXJ0aWNsZUlEfTsiIDogJyc7CiAgICB9CgogICAgIyBIYW5kbGUgcGVuZGluZyB0cmFuc2FjdGlvbiBldmVudHMgb2YgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBhcnRpY2xlCiAgICAjIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBhcnRpY2xlLgogICAgJEFydGljbGVCYWNrZW5kT2JqZWN0LT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbjsKICAgICRBcnRpY2xlT2JqZWN0LT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbjsKCiAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgIE5vQWdlbnROb3RpZnkgICAgICAgID0+IDEsCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICRBcnRpY2xle1NlbmRlclR5cGV9IHx8ICRQYXJhbXtPYmplY3REYXRhfXtTZW5kZXJUeXBlfSwKICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiBkZWZpbmVkICRBcnRpY2xle0lzVmlzaWJsZUZvckN1c3RvbWVyfQogICAgICAgICAgICAmJiAkQXJ0aWNsZXtJc1Zpc2libGVGb3JDdXN0b21lcn0gbmUgJycgPyAkQXJ0aWNsZXtJc1Zpc2libGVGb3JDdXN0b21lcn0gOiAkUGFyYW17T2JqZWN0RGF0YX17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9IC8vIDAsCiAgICAgICAgRnJvbSAgICAgICAgICAgPT4gJEFydGljbGV7RnJvbX0sCiAgICAgICAgVG8gICAgICAgICAgICAgPT4gJEFydGljbGV7VG99LAogICAgICAgIENjICAgICAgICAgICAgID0+ICRBcnRpY2xle0NjfSwKICAgICAgICBCY2MgICAgICAgICAgICA9PiAkQXJ0aWNsZXtCY2N9LAogICAgICAgIFJlcGx5VG8gICAgICAgID0+ICRBcnRpY2xle1JlcGx5VG99LAogICAgICAgIEluUmVwbHlUbyAgICAgID0+ICRBcnRpY2xle0luUmVwbHlUb30sCiAgICAgICAgUmVmZXJlbmNlcyAgICAgPT4gJEFydGljbGV7UmVmZXJlbmNlc30sCiAgICAgICAgU3ViamVjdCAgICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gIHx8ICRQYXJhbXtPYmplY3REYXRhfXtTdWJqZWN0fSwKICAgICAgICBCb2R5ICAgICAgICAgICA9PiAkQXJ0aWNsZXtCb2R5fSAgICAgfHwgJFBhcmFte09iamVjdERhdGF9e0JvZHl9LAogICAgICAgIENoYXJzZXQgICAgICAgID0+ICRBcnRpY2xle0NoYXJzZXR9ICB8fCAndXRmLTgnLAogICAgICAgIE1pbWVUeXBlICAgICAgID0+ICRBcnRpY2xle01pbWVUeXBlfSB8fCAndGV4dC9wbGFpbicsCiAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJ01pc2MnLAogICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICRIaXN0b3J5Q29tbWVudCwKICAgICAgICBNZXNzYWdlSUQgICAgICA9PiAkQXJ0aWNsZXtNZXNzYWdlSUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkU2VsZi0+X0ltcG9ydEVycm9yKAogICAgICAgICVQYXJhbSwKICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgY3JlYXRlIHRoZSBhcnRpY2xlIiwKICAgICkgdW5sZXNzICRBcnRpY2xlSUQ7CgogICAgaWYgKCAkQXJ0aWNsZXtDcmVhdGVUaW1lfSApIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fSAvLz0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgICAgIHJldHVybiB1bmxlc3MgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgID0+ICJVUERBVEUgYXJ0aWNsZSBTRVQgY3JlYXRlX3RpbWUgPSA/IFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEFydGljbGV7Q3JlYXRlVGltZX0sIFwkQXJ0aWNsZUlEIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkU3luY0RCQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdJbXBvcnRFeHBvcnQ6OlRpY2tldDo6U3luY2hyb25pemVXaXRoRm9yZWlnbkRCJyk7CiAgICBpZiAoJFN5bmNEQkNvbmZpZykgewogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9TeW5jaHJvbml6ZUV4dGVuZGVkREJFbnRyaWVzKAogICAgICAgICAgICBGb3JlaWduREIgICAgICAgID0+ICRTeW5jREJDb25maWcsCiAgICAgICAgICAgIEZvcmVpZ25BcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPl9JbXBvcnRFcnJvcigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3Qgc3luY2hyb25pemUgZXh0ZW5kZWQgREIgZW50cmllcyBmb3IgdGlja2V0ICRBcnRpY2xlSUQiLAogICAgICAgICkgdW5sZXNzICRTdWNjZXNzOwogICAgfQoKICAgICMgYXR0YWNobWVudHMKICAgIGlmICggJFBhcmFte09iamVjdERhdGF9e0luY2x1ZGVBdHRhY2htZW50c30gJiYgJEFydGljbGV7QXR0YWNobWVudHN9ICkgewogICAgICAgIGZvciBteSAkQXR0YWNobWVudFN0cmluZyAoICRBcnRpY2xle0F0dGFjaG1lbnRzfS0+QCogKSB7CiAgICAgICAgICAgIG15ICVBdHRhY2htZW50ID0gc3BsaXQoIC8jIyMvLCAkQXR0YWNobWVudFN0cmluZywgLTEgKTsKCiAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAlQXR0YWNobWVudCApIHsKICAgICAgICAgICAgICAgICRBdHRhY2htZW50eyRLZXl9ID0gJEF0dGFjaG1lbnR7JEtleX0gZXEgJycgPyAnJyA6IGRlY29kZV9iYXNlNjQoICRBdHRhY2htZW50eyRLZXl9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KCBGaWxlbmFtZSBDb250ZW50VHlwZSBEaXNwb3NpdGlvbiApKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSB1bmxlc3MgJEF0dGFjaG1lbnR7JEtleX07CgogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnR7JEtleX0gPSBFbmNvZGU6OmRlY29kZSggJ1VURi04JywgJEF0dGFjaG1lbnR7JEtleX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAlQXR0YWNobWVudCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9JbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkVycm9yIHdpdGggaW1wb3J0aW5nIGFuIGF0dGFjaG1lbnQgZm9yIGFydGljbGUgJEFydGljbGVJRCIsCiAgICAgICAgICAgICkgdW5sZXNzICRTdWNjZXNzOwogICAgICAgIH0KICAgIH0KCiAgICAjIHBsYWluIGVtYWlsCiAgICBpZiAoICRBcnRpY2xle1BsYWluRW1haWx9ICkgewogICAgICAgIG15ICRTdWNjZXNzID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlV3JpdGVQbGFpbigKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIEVtYWlsICAgICA9PiAkQXJ0aWNsZXtQbGFpbkVtYWlsfSwKICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgTWVzc2FnZSA9PiAiRXJyb3Igd2l0aCBpbXBvcnRpbmcgdGhlIHBsYWluIGVtYWlsIGZvciBhcnRpY2xlICRBcnRpY2xlSUQiLAogICAgICAgICkgdW5sZXNzICRTdWNjZXNzOwogICAgfQoKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAlU3RhbmRhcmRNdWx0aVNlbGVjdCAgICAgICA9IG1hcCB7ICRfID0+IDEgfSBxdyggTXVsdGlzZWxlY3QgRGF0YWJhc2UgV2ViU2VydmljZSApOwoKICAgICMgZHluYW1pYyBmaWVsZHMKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkQXR0ciAoIGtleXMgJUFydGljbGUgKSB7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICBpZiAoICRBdHRyID1+IC9eRHluYW1pY0ZpZWxkXyguKykkLyApIHsKICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBjdXJyZW50IHZhbHVlCiAgICAgICAgbXkgJERCVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBtdWx0aSBzZWxlY3QgZmllbGRzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQKICAgICAgICBpZiAoICRTdGFuZGFyZE11bHRpU2VsZWN0eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57RmllbGRUeXBlfSB9IHx8IHJlZiAkREJWYWx1ZSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAkQXJ0aWNsZXskQXR0cn0gPSAkQXJ0aWNsZXskQXR0cn0gPyBbIG1hcCB7IGRlY29kZSggJ1VURi04JywgZGVjb2RlX2Jhc2U2NCgkXykgKSB9IHNwbGl0KCAvIyMjLywgJEFydGljbGV7JEF0dHJ9ICkgXSA6IFtdOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUlzRGlmZmVyZW50KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUxICAgICAgICAgICAgID0+ICRBcnRpY2xleyRBdHRyfSwKICAgICAgICAgICAgVmFsdWUyICAgICAgICAgICAgID0+ICREQlZhbHVlLAogICAgICAgICk7CgogICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXskQXR0cn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXskQXR0cn0sCiAgICAgICAgICAgICAgICBFeHRlcm5hbFNvdXJjZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT5fSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IHVwZGF0ZSAkQXR0ciBmb3IgQXJ0aWNsZUlEICRBcnRpY2xlSUQiLAogICAgICAgICkgdW5sZXNzICRTdWNjZXNzOwogICAgfQoKICAgIHJldHVybiAnQXJ0aWNsZSBjcmVhdGVkJzsKfQoKc3ViIF9JbXBvcnRFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT57RXJyb3J9ID0gJFBhcmFte01lc3NhZ2V9IHx8ICcnOwoKICAgIGlmICggZXhpc3RzICRQYXJhbXtUaWNrZXR9ICkgewogICAgICAgICRTZWxmLT57TGFzdFRpY2tldElEfSA9IHVuZGVmOwoKICAgICAgICBpZiAoICRQYXJhbXtJZGVudGlmaWVyfSAmJiAkUGFyYW17SWRlbnRpZmllcn17VGlja2V0SUR9ICYmICRQYXJhbXtUaWNrZXR9e1RpY2tldElEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRJRFJlbGF0aW9ufXsgJFBhcmFte1RpY2tldH17VGlja2V0SUR9IH0gPSB1bmRlZjsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17SWRlbnRpZmllcn0gJiYgJFBhcmFte0lkZW50aWZpZXJ9e1RpY2tldE51bWJlcn0gJiYgJFBhcmFte1RpY2tldH17VGlja2V0TnVtYmVyfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXROdW1iZXJJRFJlbGF0aW9ufXsgJFBhcmFte1RpY2tldH17VGlja2V0TnVtYmVyfSB9ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgIGVsc2lmICggZXhpc3RzICRQYXJhbXtBcnRpY2xlfSApIHsKICAgICAgICBteSAkSW1wb3J0ZWRUSUQgPSAkUGFyYW17QXJ0aWNsZX17VGlja2V0SUR9ID8gJFNlbGYtPntUaWNrZXRJRFJlbGF0aW9ufXsgJFBhcmFte0FydGljbGV9e1RpY2tldElEfSB9IDogJFNlbGYtPntMYXN0VGlja2V0SUR9OwogICAgICAgIG15ICRFeHRyYUluZm8gICA9ICRQYXJhbXtBcnRpY2xlfXtUaWNrZXRJRH0gPyAiIE9yaWdpbmlhbCBUaWNrZXRJRDogJFBhcmFte0FydGljbGV9e1RpY2tldElEfTsiICAgICAgOiAnJzsKICAgICAgICAkRXh0cmFJbmZvICAgICAuPSAkSW1wb3J0ZWRUSUQgICAgICAgICAgICAgICA/ICIgSW1wb3J0ZWQgVGlja2V0SUQ6ICRJbXBvcnRlZFRJRDsiICAgICAgICAgICAgICAgICA6ICcnOwogICAgICAgICRFeHRyYUluZm8gICAgIC49ICRQYXJhbXtBcnRpY2xlfXtBcnRpY2xlSUR9ID8gIiBPcmlnaW5pYWwgQXJ0aWNsZUlEOiAkUGFyYW17QXJ0aWNsZX17QXJ0aWNsZUlEfTsiIDogJyc7CiAgICAgICAgJFNlbGYtPntFcnJvcn0gLj0gJEV4dHJhSW5mbzsKICAgIH0KCiAgICByZXR1cm47Cn0KCnN1YiBfU3luY2hyb25pemVFeHRlbmRlZERCRW50cmllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtGb3JlaWduREJ9e0RhdGFiYXNlRFNOfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgYSBEYXRhYmFzZURTTiBpbiB0aGUgRm9yZWlnbkRCIHNldHRpbmdzJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1RpY2tldElEfSB8fCAhKCAoICRQYXJhbXtBcnRpY2xlSUR9ICYmICRQYXJhbXtGb3JlaWduQXJ0aWNsZUlEfSB8fCAkUGFyYW17Rm9yZWlnblRpY2tldElEfSApICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpY2tldElEIGFuZCBlaXRoZXIgQXJ0aWNsZUlEIGFuZCBGb3JlaWduQXJ0aWNsZUlEIG9yIEZvcmVpZ25UaWNrZXRJRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e0ZEQk9iamVjdH0gfHwgISRTZWxmLT57REJPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgICRTZWxmLT57RkRCT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgICAgICAkUGFyYW17Rm9yZWlnbkRCfS0+JSosCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtBcnRpY2xlSUR9ICkgewoKICAgICAgICAjIGFydGljbGVfZmxhZwogICAgICAgIHJldHVybiB1bmxlc3MgJFNlbGYtPntGREJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgID0+ICdTRUxFQ1QgY3JlYXRlX2J5IEZST00gYXJ0aWNsZV9mbGFnIFdIRVJFIGFydGljbGVfaWQgPSA/IEFORCBhcnRpY2xlX2tleSA9ID8gQU5EIGFydGljbGVfdmFsdWUgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Rm9yZWlnbkFydGljbGVJRH0sIFwnU2VlbicsIFwxIF0sCiAgICAgICAgKTsKCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntGREJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBhcnRpY2xlX2ZsYWcgKGFydGljbGVfaWQsIGFydGljbGVfa2V5LCBhcnRpY2xlX3ZhbHVlLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KScgLgogICAgICAgICAgICAgICAgICAgICdWQUxVRVMgKD8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtBcnRpY2xlSUR9LCBcJ1NlZW4nLCBcMSwgXCRSb3dbMF0gXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYXJ0aWNsZV9oaXN0b3J5CiAgICAgICAgcmV0dXJuIHVubGVzcyAkU2VsZi0+e0ZEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIG5hbWUsIGhpc3RvcnlfdHlwZV9pZCwgdHlwZV9pZCwgcXVldWVfaWQsIG93bmVyX2lkLCBwcmlvcml0eV9pZCwgc3RhdGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgJyAuCiAgICAgICAgICAgICAgICAnRlJPTSB0aWNrZXRfaGlzdG9yeSBXSEVSRSBhcnRpY2xlX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0ZvcmVpZ25BcnRpY2xlSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntGREJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+CiAgICAgICAgICAgICAgICAgICAgJ0lOU0VSVCBJTlRPIHRpY2tldF9oaXN0b3J5ICh0aWNrZXRfaWQsIGFydGljbGVfaWQsIG5hbWUsIGhpc3RvcnlfdHlwZV9pZCwgdHlwZV9pZCwgcXVldWVfaWQsIG93bmVyX2lkLCBwcmlvcml0eV9pZCwgc3RhdGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpJwogICAgICAgICAgICAgICAgICAgIC4KICAgICAgICAgICAgICAgICAgICAnVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/KScsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXRJRH0sIFwkUGFyYW17QXJ0aWNsZUlEfSwgKCBtYXAgeyBcJF8gfSBAUm93ICkgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgdGlja2V0X2ZsYWcKICAgIHJldHVybiB1bmxlc3MgJFNlbGYtPntGREJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBjcmVhdGVfYnkgRlJPTSB0aWNrZXRfZmxhZyBXSEVSRSB0aWNrZXRfaWQgPSA/IEFORCB0aWNrZXRfa2V5ID0gPyBBTkQgdGlja2V0X3ZhbHVlID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Rm9yZWlnblRpY2tldElEfSwgXCdTZWVuJywgXDEgXSwKICAgICk7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntGREJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcmV0dXJuIHVubGVzcyAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gdGlja2V0X2ZsYWcgKHRpY2tldF9pZCwgdGlja2V0X2tleSwgdGlja2V0X3ZhbHVlLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KScgLgogICAgICAgICAgICAgICAgJ1ZBTFVFUyAoPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0SUR9LCBcJ1NlZW4nLCBcMSwgXCRSb3dbMF0gXSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0X2hpc3RvcnkKICAgIHJldHVybiB1bmxlc3MgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHRpY2tldF9oaXN0b3J5IFdIRVJFIHRpY2tldF9pZCA9ID8gQU5EIChhcnRpY2xlX2lkIElTIE5VTEwgT1IgYXJ0aWNsZV9pZCA9IDApJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXRJRH0gXSwKICAgICk7CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5IaXN0b3J5QWRkKAogICAgICAgIE5hbWUgICAgICAgICA9PiAiXCVcJUltcG9ydGVkIFRpY2tldCAtIExlZ2FjeSBUaWNrZXRJRDogJFBhcmFte0ZvcmVpZ25UaWNrZXRJRH0iLAogICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgQ3JlYXRlVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiB1bmxlc3MgJFNlbGYtPntGREJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIG5hbWUsIGhpc3RvcnlfdHlwZV9pZCwgdHlwZV9pZCwgcXVldWVfaWQsIG93bmVyX2lkLCBwcmlvcml0eV9pZCwgc3RhdGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgJyAuCiAgICAgICAgICAgICdGUk9NIHRpY2tldF9oaXN0b3J5IFdIRVJFIHRpY2tldF9pZCA9ID8gQU5EIChhcnRpY2xlX2lkIElTIE5VTEwgT1IgYXJ0aWNsZV9pZCA9IDApJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtGb3JlaWduVGlja2V0SUR9IF0sCiAgICApOwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57RkRCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHJldHVybiB1bmxlc3MgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4KICAgICAgICAgICAgICAgICdJTlNFUlQgSU5UTyB0aWNrZXRfaGlzdG9yeSAodGlja2V0X2lkLCBuYW1lLCBoaXN0b3J5X3R5cGVfaWQsIHR5cGVfaWQsIHF1ZXVlX2lkLCBvd25lcl9pZCwgcHJpb3JpdHlfaWQsIHN0YXRlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KScKICAgICAgICAgICAgICAgIC4KICAgICAgICAgICAgICAgICdWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0SUR9LCAoIG1hcCB7IFwkXyB9IEBSb3cgKSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBsaW5rX3JlbGF0aW9uCiAgICBteSAkTGlua09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CiAgICBteSAkRm9yZWlnblRpY2tldE9iamVjdElEOwoKICAgIG15ICVGb3JlaWduTGlua09iamVjdHM7CiAgICBteSAlTE9iamVjdElEczsKCiAgICByZXR1cm4gdW5sZXNzICRTZWxmLT57RkRCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICJTRUxFQ1QgaWQsbmFtZSBGUk9NIGxpbmtfb2JqZWN0ICIsCiAgICAgICAgQmluZCA9PiBbXSwKICAgICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0ZEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRm9yZWlnbkxpbmtPYmplY3RzeyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgICAgICRMT2JqZWN0SURzeyAkUm93WzFdIH0gICAgICAgICA9ICRMaW5rT2JqZWN0LT5PYmplY3RMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJFJvd1sxXSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRSb3dbMV0gZXEgJ1RpY2tldCcgKSB7CiAgICAgICAgICAgICRGb3JlaWduVGlja2V0T2JqZWN0SUQgPSAkUm93WzBdOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9yZWlnbkxpbmtUeXBlczsKICAgIG15ICVMVHlwZUlEczsKCiAgICByZXR1cm4gdW5sZXNzICRTZWxmLT57RkRCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICJTRUxFQ1QgaWQsbmFtZSBGUk9NIGxpbmtfdHlwZSAiLAogICAgICAgIEJpbmQgPT4gW10sCiAgICApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntGREJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEZvcmVpZ25MaW5rVHlwZXN7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICAgICAgJExUeXBlSURzeyAkUm93WzFdIH0gICAgICAgICA9ICRMaW5rT2JqZWN0LT5UeXBlTG9va3VwKAogICAgICAgICAgICBOYW1lICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlRGlyZWN0aW9uID0gKAogICAgICAgIHNvdXJjZSA9PiAndGFyZ2V0JywKICAgICAgICB0YXJnZXQgPT4gJ3NvdXJjZScsCiAgICApOwoKICAgIGZvciBteSAkS2V5ICgga2V5cyAlRGlyZWN0aW9uICkgewoKICAgICAgICByZXR1cm4gdW5sZXNzICRTZWxmLT57RkRCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgJEtleSIgLiAiX29iamVjdF9pZCwgJEtleSIgLiAiX2tleSwgdHlwZV9pZCwgc3RhdGVfaWQgRlJPTSBsaW5rX3JlbGF0aW9uICIgLgogICAgICAgICAgICAgICAgIldIRVJFICREaXJlY3Rpb257JEtleX1fb2JqZWN0X2lkID0gPyBBTkQgJERpcmVjdGlvbnskS2V5fV9rZXkgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkRm9yZWlnblRpY2tldE9iamVjdElELCBcJFBhcmFte0ZvcmVpZ25UaWNrZXRJRH0gXSwKICAgICAgICApOwoKICAgICAgICBMSU5LOgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57RkRCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgJFJvd1swXSA9ICRMT2JqZWN0SURzeyAkRm9yZWlnbkxpbmtPYmplY3RzeyAkUm93WzBdIH0gfTsKICAgICAgICAgICAgJFJvd1syXSA9ICRMVHlwZUlEc3sgJEZvcmVpZ25MaW5rVHlwZXN7ICRSb3dbMl0gfSB9OwoKICAgICAgICAgICAgIyBkZWFsIHdpdGggb3RoZXIgaW1wb3J0ZWQgdGlja2V0cwogICAgICAgICAgICBpZiAoICRSb3dbMF0gPT0gJExPYmplY3RJRHN7VGlja2V0fSApIHsKICAgICAgICAgICAgICAgIG5leHQgTElOSyBpZiAkUm93WzFdID4gJFBhcmFte0ZvcmVpZ25UaWNrZXRJRH07CgogICAgICAgICAgICAgICAgJFJvd1sxXSA9IGV4aXN0cyAkU2VsZi0+e1RpY2tldElEUmVsYXRpb259eyAkUm93WzFdIH0gPyAkU2VsZi0+e1RpY2tldElEUmVsYXRpb259eyAkUm93WzFdIH0gOiAkUm93WzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PgogICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyBsaW5rX3JlbGF0aW9uICgkRGlyZWN0aW9ueyRLZXl9X29iamVjdF9pZCwgJERpcmVjdGlvbnskS2V5fV9rZXksICRLZXlcX29iamVjdF9pZCwgJEtleVxfa2V5LCB0eXBlX2lkLCBzdGF0ZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSkgIiAuCiAgICAgICAgICAgICAgICAgICAgIlZBTFVFUyAoPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pIiwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJExPYmplY3RJRHN7VGlja2V0fSwgXCRQYXJhbXtUaWNrZXRJRH0sICggbWFwIHsgXCRfIH0gQFJvdyApLCBcMSBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldF93YXRjaGVyCiAgICAjIFRPRE8KCiAgICAjIGZvcm1fZHJhZnQKICAgICMgVE9ETwoKICAgICMgY2FsZW5kZXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAjIFRPRE8KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/ImportExport.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA1MDY0NGU1OTAwODFlZGQwYjY1ZmM4MTE3YWRiNDIyMTQ4OGI5NDY3IC0gS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKdXNlIHV0Zjg7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKdXNlIFRyeTo6VGlueTsKCiMgT1RPQk8gbW9kdWxlcwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0IC0gaW1wb3J0LCBleHBvcnQgbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBpbXBvcnQgYW5kIGV4cG9ydCBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWN1dAoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgcmV0dXJuIGJsZXNzIHt9LCAkVHlwZTsKfQoKPWhlYWQyIFRlbXBsYXRlTGlzdCgpCgpSZXR1cm4gYSBsaXN0IG9mIHRlbXBsYXRlcyBhcyBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywgICMgKG9wdGlvbmFsKQogICAgICAgIEZvcm1hdCA9PiAnQ1NWJyAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIDE9MSAnOwogICAgbXkgQEJJTkQ7CgogICAgaWYgKCAkUGFyYW17T2JqZWN0fSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgaW1leHBvcnRfb2JqZWN0ID0gPyAnOwogICAgICAgIHB1c2ggQEJJTkQsIFwkUGFyYW17T2JqZWN0fTsKICAgIH0KICAgIGlmICggJFBhcmFte0Zvcm1hdH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIGltZXhwb3J0X2Zvcm1hdCA9ID8gJzsKICAgICAgICBwdXNoIEBCSU5ELCBcJFBhcmFte0Zvcm1hdH07CiAgICB9CgogICAgIyBhZGQgb3JkZXIgb3B0aW9uCiAgICAkU1FMIC49ICdPUkRFUiBCWSBpZCc7CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgbXkgQFRlbXBsYXRlTGlzdCA9ICREQk9iamVjdC0+U2VsZWN0Q29sQXJyYXkoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKCiAgICByZXR1cm4gXEBUZW1wbGF0ZUxpc3Q7Cn0KCj1oZWFkMiBUZW1wbGF0ZUdldCgpCgpHZXQgYSBpbXBvcnQgZXhwb3J0IHRlbXBsYXRlIGFzIGEgaGFzaHJlZi4KCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH0KICAgICRUZW1wbGF0ZURhdGF7TnVtYmVyfQogICAgJFRlbXBsYXRlRGF0YXtPYmplY3R9CiAgICAkVGVtcGxhdGVEYXRhe0Zvcm1hdH0KICAgICRUZW1wbGF0ZURhdGF7TmFtZX0KICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0KICAgICRUZW1wbGF0ZURhdGF7Q29tbWVudH0KICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlVGltZX0KICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlQnl9CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZVRpbWV9CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZUJ5fQoKPWN1dAoKc3ViIFRlbXBsYXRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgIG15IEBSb3cgPSAkREJPYmplY3QtPlNlbGVjdFJvd0FycmF5KAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVUZW1wbGF0ZURhdGE7CiAgICAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9ID0gJFJvd1swXTsKICAgICRUZW1wbGF0ZURhdGF7T2JqZWN0fSAgICAgPSAkUm93WzFdOwogICAgJFRlbXBsYXRlRGF0YXtGb3JtYXR9ICAgICA9ICRSb3dbMl07CiAgICAkVGVtcGxhdGVEYXRhe05hbWV9ICAgICAgID0gJFJvd1szXTsKICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0gICAgPSAkUm93WzRdOwogICAgJFRlbXBsYXRlRGF0YXtDb21tZW50fSAgICA9ICRSb3dbNV0gfHwgJyc7CiAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1s2XTsKICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlQnl9ICAgPSAkUm93WzddOwogICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbOF07CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZUJ5fSAgID0gJFJvd1s5XTsKCiAgICAkVGVtcGxhdGVEYXRhe051bWJlcn0gPSBzcHJpbnRmICclMDZkJywgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfTsKCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ID0gXCVUZW1wbGF0ZURhdGE7CgogICAgcmV0dXJuIFwlVGVtcGxhdGVEYXRhOwp9Cgo9aGVhZDIgVGVtcGxhdGVBZGQoKQoKQWRkIGEgbmV3IGltcG9ydC9leHBvcnQgdGVtcGxhdGUKCiAgICBteSAkVGVtcGxhdGVJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ1RpY2tldCcsCiAgICAgICAgRm9ybWF0ICA9PiAnQ1NWJywKICAgICAgICBOYW1lICAgID0+ICdUZW1wbGF0ZSBOYW1lJywKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgQ29tbWVudCA9PiAnQ29tbWVudCcsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgRm9ybWF0IE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBnZXQgQ2hlY2tJdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgRm9ybWF0KSkgewogICAgICAgICRDaGVja0l0ZW1PYmplY3QtPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkQ2hlY2tJdGVtT2JqZWN0LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGZpbmQgZXhpdGluZyB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte09iamVjdH0sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROb0FkZDsKICAgIHdoaWxlICggJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgdGVtcGxhdGUsIGlmIHRlbXBsYXRlIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkTm9BZGQpIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyB0ZW1wbGF0ZSEgVGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBvYmplY3QuIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpbnNlcnQgbmV3IHRlbXBsYXRlCiAgICByZXR1cm4gdW5sZXNzICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+IDw8J0VORF9TUUwnLApJTlNFUlQgSU5UTyBpbWV4cG9ydF90ZW1wbGF0ZSAoCiAgICBpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLAogICAgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieQogICkKICBWQUxVRVMgKAogICAgPywgPywgPywgPywgPywKICAgIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPwogICkKRU5EX1NRTAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte09iamVjdH0sIFwkUGFyYW17Rm9ybWF0fSwgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyB0ZW1wbGF0ZQogICAgIyBUT0RPOiB1c2UgdGhlIGluc2VydF9pZCB3aGVuIHRoYXQgZnVuY3Rpb25hbGl0eSBiZWNvbWVzIGF2YWlsYWJsZQogICAgbXkgKCRUZW1wbGF0ZUlEKSA9ICREQk9iamVjdC0+U2VsZWN0Um93QXJyYXkoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGltZXhwb3J0X29iamVjdCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0fSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkVGVtcGxhdGVJRDsKfQoKPWhlYWQyIFRlbXBsYXRlVXBkYXRlKCkKClVwZGF0ZSBhIGV4aXN0aW5nIGltcG9ydC9leHBvcnQgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlVXBkYXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RlbXBsYXRlIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgID0+ICdDb21tZW50JywgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGhlIG9iamVjdCBvZiB0aGlzIHRlbXBsYXRlIGlkCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpbWV4cG9ydF9vYmplY3QgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE9iamVjdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRPYmplY3QgPSAkUm93WzBdOwogICAgfQoKICAgIGlmICggISRPYmplY3QgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIHRlbXBsYXRlIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4gZm91bmQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaW1leHBvcnRfb2JqZWN0ID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRPYmplY3QsIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAxOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgIkNhbid0IHVwZGF0ZSB0ZW1wbGF0ZSEgVGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBvYmplY3QuIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgdXBkYXRlIHRlbXBsYXRlCiAgICByZXR1cm4gJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF90ZW1wbGF0ZSBTRVQgbmFtZSA9ID8sJwogICAgICAgICAgICAuICd2YWxpZF9pZCA9ID8sIGNvbW1lbnRzID0gPywgJwogICAgICAgICAgICAuICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgICBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1oZWFkMiBUZW1wbGF0ZURlbGV0ZSgpCgpEZWxldGUgZXhpc3RpbmcgaW1wb3J0L2V4cG9ydCB0ZW1wbGF0ZXMKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHNlYXJjaCBkYXRhCiAgICAkU2VsZi0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBhbGwgbWFwcGluZyBkYXRhCiAgICBmb3IgbXkgJFRlbXBsYXRlSUQgKCBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfSApIHsKICAgICAgICAkU2VsZi0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBkYXRhCiAgICAkU2VsZi0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgZGF0YQogICAgJFNlbGYtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWhlYWQyIE9iamVjdExpc3QoKQoKUmV0dXJuIGEgbGlzdCBvZiBhdmFpbGFibGUgb2JqZWN0cyBhcyBoYXNoIHJlZmVyZW5jZS4KCiAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKClJldHVybiBhbiBlbXB0eSBsaXN0IHdoZW4gdGhlcmUgaXMgbm8sIG9yIGFuIGluY29ycmVjdCwgc2V0dGluZyBpbiB0aGUgU3lzQ29uZmlnLgoKPWN1dAoKc3ViIE9iamVjdExpc3QgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBiYWNrZW5kIHJlZ2lzdHJhdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIGFkZGVkIGJ5IG90aGVyIE9UT0JPIHBhY2thZ2VzCiAgICBteSAkTW9kdWxlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgogICAgcmV0dXJuIHVubGVzcyAkTW9kdWxlTGlzdDsKICAgIHJldHVybiB1bmxlc3MgcmVmICRNb2R1bGVMaXN0IGVxICdIQVNIJzsKCiAgICAjIGNyZWF0ZSB0aGUgb2JqZWN0IGxpc3QsIG1heSBiZSBlbXB0eQogICAgbXkgJUtleTJOYW1lID0KICAgICAgICBtYXAgeyAkXyA9PiAkTW9kdWxlTGlzdC0+eyRffS0+e05hbWV9IH0KICAgICAgICBrZXlzICRNb2R1bGVMaXN0LT4lKjsKCiAgICByZXR1cm4gXCVLZXkyTmFtZTsKfQoKPWhlYWQyIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQoKR2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fQogICAgKTsKCiAgICByZXR1cm4gdW5sZXNzICRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBvYmplY3QKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1oZWFkMiBPYmplY3REYXRhR2V0KCkKCkdldCB0aGUgb2JqZWN0IGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIGRhdGFiYXNlLCBtYXkgYmUgZW1wdHkKICAgIG15ICVPYmplY3REYXRhID0gJERCT2JqZWN0LT5TZWxlY3RNYXBwaW5nKAogICAgICAgIFNRTCA9PiA8PCdFTkRfU1FMJywKU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlCiAgRlJPTSBpbWV4cG9ydF9vYmplY3QKICBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8KRU5EX1NRTAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgIHJldHVybiBcJU9iamVjdERhdGE7Cn0KCj1oZWFkMiBPYmplY3REYXRhU2F2ZSgpCgpTYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIE9iamVjdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtPYmplY3REYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnT2JqZWN0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEKICAgICRTZWxmLT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte09iamVjdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17T2JqZWN0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9vYmplY3QgJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICcKICAgICAgICAgICAgICAgIC4gJyg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE9iamVjdERhdGFEZWxldGUoKQoKRGVsZXRlIHRoZSBleGlzdGluZyBvYmplY3QgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfb2JqZWN0IFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgRm9ybWF0TGlzdCgpCgpSZXR1cm4gYSBsaXN0IG9mIGF2YWlsYWJsZSBmb3JtYXRzIGFzIGhhc2ggcmVmZXJlbmNlLgoKICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKPWN1dAoKc3ViIEZvcm1hdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0aGUgcmVnaXN0ZXJlZCBmb3JtYXR0aW5nIGJhY2tlbmRzLCBlLmcuIGZvciBDU1YKICAgIG15ICRNb2R1bGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiAgICByZXR1cm4gdW5sZXNzICRNb2R1bGVMaXN0OwogICAgcmV0dXJuIHVubGVzcyByZWYgJE1vZHVsZUxpc3QgZXEgJ0hBU0gnOwoKICAgICMgY3JlYXRlIHRoZSBmb3JtYXQgbGlzdCwgbWF5IGJlIGVtcHR5CiAgICBteSAlS2V5Mk5hbWUgPQogICAgICAgIG1hcCB7ICRfID0+ICRNb2R1bGVMaXN0LT57JF99LT57TmFtZX0gfQogICAgICAgIGtleXMgJE1vZHVsZUxpc3QtPiUqOwoKICAgIHJldHVybiBcJUtleTJOYW1lOwp9Cgo9aGVhZDIgRm9ybWF0dGVyQ2FuSGFuZGxlUmVmZXJlbmNlcygpCgpJbmZvcm0gdGhlIGNhbGxlciB3aGV0aGVyIHRoZSBmb3JtYXR0ZXIgYmFja2VuZCBuZWVkcyBoZWxwIHdpdGggcmVmZXJlbmNlcy4KCiAgICBteSAkRm9ybWF0dGVyQ2FuSGFuZGxlUmVmZXJlbmNlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdHRlckNhbkhhbmRsZVJlZmVyZW5jZXMoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXR0ZXJDYW5IYW5kbGVSZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRGb3JtYXRCYWNrZW5kID0gdHJ5IHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICk7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgIyBpZ25vcmUgZXhjZXB0aW9uCiAgICAgICAgdW5kZWY7CiAgICB9OwoKICAgIHJldHVybiB1bmxlc3MgJEZvcm1hdEJhY2tlbmQ7CgogICAgIyBkZWxlZ2F0ZSB0byB0aGUgZm9ybWF0dGVyIGJhY2tlbmQKICAgIHJldHVybiAkRm9ybWF0QmFja2VuZC0+Q2FuSGFuZGxlUmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwp9Cgo9aGVhZDIgRm9ybWF0QXR0cmlidXRlc0dldCgpCgpHZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0KICAgICk7CgogICAgcmV0dXJuIHVubGVzcyAkQmFja2VuZDsKCiAgICAjIGRlbGVnYXRlIHRvIHRoZSBmb3JtYXR0ZXIgYmFja2VuZAogICAgcmV0dXJuICRCYWNrZW5kLT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7Cn0KCj1oZWFkMiBGb3JtYXREYXRhR2V0KCkKCkdldCB0aGUgZm9ybWF0IGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJEZvcm1hdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRGb3JtYXREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1hdERhdGE7Cn0KCj1oZWFkMiBGb3JtYXREYXRhU2F2ZSgpCgpTYXZlIHRoZSBmb3JtYXQgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBGb3JtYXREYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIEZvcm1hdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRm9ybWF0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEKICAgICRTZWxmLT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Zvcm1hdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17Rm9ybWF0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9mb3JtYXQgJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZvcm1hdERhdGFEZWxldGUoKQoKRGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgTWFwcGluZ0xpc3QoKQoKUmV0dXJuIGEgbGlzdCBvZiBtYXBwaW5nIGlkcyBzb3J0ZWQgYnkgcG9zaXRpb24gYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJE1hcHBpbmdJRHMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15IEBNYXBwaW5nSURzID0gJERCT2JqZWN0LT5TZWxlY3RDb2xBcnJheSgKICAgICAgICBTUUwgPT4gPDwnRU5EX1NRTCcsClNFTEVDVCBpZAogIEZST00gaW1leHBvcnRfbWFwcGluZwogIFdIRVJFIHRlbXBsYXRlX2lkID0gPwogIE9SREVSIEJZIHBvc2l0aW9uCkVORF9TUUwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICByZXR1cm4gXEBNYXBwaW5nSURzOwp9Cgo9aGVhZDIgTWFwcGluZ0FkZCgpCgpBZGQgYSBuZXcgbWFwcGluZyBkYXRhIHJvdwoKICAgIG15ICRNYXBwaW5nSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nQWRkKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBmaW5kIG1heGltdW0gcG9zaXRpb24KICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG1heChwb3NpdGlvbikgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTmV3UG9zaXRpb24gPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIGlmICggZGVmaW5lZCAkUm93WzBdICkgewogICAgICAgICAgICAkTmV3UG9zaXRpb24gPSAkUm93WzBdOwogICAgICAgICAgICAkTmV3UG9zaXRpb24rKzsKICAgICAgICB9CiAgICB9CgogICAgIyBpbnNlcnQgYSBuZXcgbWFwcGluZyBkYXRhIHJvdwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmcgKHRlbXBsYXRlX2lkLCBwb3NpdGlvbikgVkFMVUVTICg/LCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkTmV3UG9zaXRpb24gXSwKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyBtYXBwaW5nIGRhdGEgcm93CiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCROZXdQb3NpdGlvbiBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE1hcHBpbmdJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNYXBwaW5nSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkTWFwcGluZ0lEOwp9Cgo9aGVhZDIgTWFwcGluZ0RlbGV0ZSgpCgpEZWxldGUgZXhpc3RpbmcgbWFwcGluZyBkYXRhIHJvd3MKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17TWFwcGluZ0lEfSApIHsKCiAgICAgICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgb25lIG1hcHBpbmcgcm93CiAgICAgICAgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWJ1aWxkIG1hcHBpbmcgcG9zaXRpb25zCiAgICAgICAgJFNlbGYtPk1hcHBpbmdQb3NpdGlvblJlYnVpbGQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgbGlzdAogICAgICAgIG15ICRNYXBwaW5nSURzID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoICRNYXBwaW5nSURzLT5AKiApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYWxsIG1hcHBpbmcgcm93cyBvZiB0aGlzIHRlbXBsYXRlCiAgICAgICAgcmV0dXJuICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICApOwogICAgfQp9Cgo9aGVhZDIgTWFwcGluZ1VwKCkKCk1vdmUgYW4gbWFwcGluZyBkYXRhIHJvdyB1cAoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ1VwKAogICAgICAgIE1hcHBpbmdJRCAgPT4gMTIzLAogICAgICAgIFRlbXBsYXRlSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ1VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0lEcyA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAkUGFyYW17TWFwcGluZ0lEfSA9PSAkTWFwcGluZ0lEcy0+WzBdOwoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIDEgaWYgISRQb3NpdGlvbjsKCiAgICBteSAkUG9zaXRpb25VcHBlciA9ICRQb3NpdGlvbiAtIDE7CgogICAgIyB1cGRhdGUgcG9zaXRpb25zCiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uLCBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBvc2l0aW9uVXBwZXIgXSwKICAgICk7CiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQb3NpdGlvblVwcGVyLCBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBNYXBwaW5nRG93bigpCgpNb3ZlIGFuIG1hcHBpbmcgZGF0YSByb3cgZG93bgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Rvd24oCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRG93biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdJRHMgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdJRHMtPlstMV07CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBwb3NpdGlvbiBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFBvc2l0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBteSAkUG9zaXRpb25Eb3duID0gJFBvc2l0aW9uICsgMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb24sIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkUG9zaXRpb25Eb3duIF0sCiAgICApOwogICAgJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb25Eb3duLCBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBNYXBwaW5nUG9zaXRpb25SZWJ1aWxkKCkKClJlYnVpbGQgdGhlIHBvc2l0aW9ucyBvZiBhIG1hcHBpbmcgbGlzdAoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdQb3NpdGlvblJlYnVpbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdJRHMgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB1cGRhdGUgcG9zaXRpb24KICAgIG15ICRDb3VudGVyID0gMDsKICAgIGZvciBteSAkTWFwcGluZ0lEICggJE1hcHBpbmdJRHMtPkAqICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDb3VudGVyLCBcJE1hcHBpbmdJRCBdLAogICAgICAgICk7CiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCkdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fQogICAgKTsKCiAgICByZXR1cm4gdW5sZXNzICRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBvYmplY3QKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWhlYWQyIE1hcHBpbmdPYmplY3REYXRhRGVsZXRlKCkKCkRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17TWFwcGluZ0lEfSApIHsKICAgICAgICAkUGFyYW17TWFwcGluZ0lEfSA9IFsgJFBhcmFte01hcHBpbmdJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtNYXBwaW5nSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0lEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRNYXBwaW5nSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgV0hFUkUgbWFwcGluZ19pZCBJTiAoICRNYXBwaW5nSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgTWFwcGluZ09iamVjdERhdGFTYXZlKCkKClNhdmUgdGhlIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+IDEyMywKICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgTWFwcGluZ09iamVjdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdPYmplY3REYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgbWFwcGluZyBkYXRhCiAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSBtYXBwaW5nIG9iamVjdCByb3cKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgJwogICAgICAgICAgICAgICAgLiAnKG1hcHBpbmdfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBNYXBwaW5nT2JqZWN0RGF0YUdldCgpCgpnZXRzIHRoZSBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcuCgogICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRNYXBwaW5nT2JqZWN0RGF0YSA9Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICBteSAlTWFwcGluZ09iamVjdERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+U2VsZWN0TWFwcGluZygKICAgICAgICBTUUwgPT4gPDwnRU5EX1NRTCcsClNFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZQogIEZST00gaW1leHBvcnRfbWFwcGluZ19vYmplY3QKICBXSEVSRSBtYXBwaW5nX2lkID0gPwpFTkRfU1FMCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICByZXR1cm4gXCVNYXBwaW5nT2JqZWN0RGF0YTsKfQoKPWhlYWQyIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCkdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fQogICAgKTsKCiAgICByZXR1cm4gdW5sZXNzICRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBmb3JtYXQKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aGVhZDIgTWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoKQoKRGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtNYXBwaW5nSUR9ICkgewogICAgICAgICRQYXJhbXtNYXBwaW5nSUR9ID0gWyAkUGFyYW17TWFwcGluZ0lEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte01hcHBpbmdJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJE1hcHBpbmdJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBkZWxldGUgbWFwcGluZyBmb3JtYXQgZGF0YQogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCBXSEVSRSBtYXBwaW5nX2lkIElOICggJE1hcHBpbmdJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1oZWFkMiBNYXBwaW5nRm9ybWF0RGF0YVNhdmUoKQoKU2F2ZSB0aGUgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YVNhdmUoCiAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gMTIzLAogICAgICAgIE1hcHBpbmdGb3JtYXREYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXREYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBNYXBwaW5nRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0Zvcm1hdERhdGEgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gJFBhcmFte01hcHBpbmdJRH0sCiAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgZm9ybWF0IHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCAnCiAgICAgICAgICAgICAgICAuICcobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE1hcHBpbmdGb3JtYXREYXRhR2V0KCkKCkdldCB0aGUgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YUdldCgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X21hcHBpbmdfZm9ybWF0IFdIRVJFIG1hcHBpbmdfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU1hcHBpbmdGb3JtYXREYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdGb3JtYXREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJU1hcHBpbmdGb3JtYXREYXRhOwp9Cgo9aGVhZDIgU2VhcmNoQXR0cmlidXRlc0dldCgpCgpnZXRzIHRoZSBzZWFyY2ggYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiBoYXNoIHJlZmVyZW5jZXMuCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoQXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fQogICAgKTsKCiAgICByZXR1cm4gdW5sZXNzICRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIHNlYXJjaCBhdHRyaWJ1dGUgbGlzdCBvZiBhbiBvYmplY3QKICAgIHJldHVybiAkQmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKfQoKPWhlYWQyIFNlYXJjaERhdGFHZXQoKQoKR2V0IHRoZSBzZWFyY2ggZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkU2VhcmNoRGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9zZWFyY2ggV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZWFyY2hEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAeyAkU2VhcmNoRGF0YXsgJFJvd1swXSB9IH0sICRSb3dbMV07CiAgICB9CgojIFRPRE86IHJldHVybiBhbmQgdXNlIGFycmF5cyBpZiB0aGUgZGF0YSBjb250YWlucyBhcnJheXM7IHRoZXJlIHNob3VsZCBiZSBubyByZWFzb24gZm9yIHRoaXMgIyMjIyMtc3R1ZmYsIGV4Y2VwdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoYWxzbyBjaGFuZ2UgaW4gU2VhcmNoRGF0YVNhdmUoKSkKICAgIHJldHVybiB7IG1hcCB7ICRfID0+IGpvaW4oICcjIyMjIycsICRTZWFyY2hEYXRheyRffS0+QCogKSB9IGtleXMgJVNlYXJjaERhdGEgfTsKfQoKPWhlYWQyIFNlYXJjaERhdGFTYXZlKCkKClNhdmUgdGhlIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFNlYXJjaERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgU2VhcmNoRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte1NlYXJjaERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2hEYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBzZWFyY2ggZGF0YQogICAgJFNlbGYtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17U2VhcmNoRGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17U2VhcmNoRGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkRGF0YVZhbHVlOwoKICAgICAgICBWQUxVRToKICAgICAgICBmb3IgbXkgJFNpbmdsZVZhbHVlICggc3BsaXQgLyMjIyMjLywgJERhdGFWYWx1ZSApIHsKICAgICAgICAgICAgbmV4dCBWQUxVRSB1bmxlc3MgJFNpbmdsZVZhbHVlOyAgICAjIFRPRE86IHdoeSBpcyAnMCcgbm90IGFsbG93ZWQgPwoKICAgICAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X3NlYXJjaCAnCiAgICAgICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCREYXRhS2V5LCBcJFNpbmdsZVZhbHVlIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU2VhcmNoRGF0YURlbGV0ZSgpCgpEZWxldGUgdGhlIGV4aXN0aW5nIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9zZWFyY2ggV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1oZWFkMiBFeHBvcnQoKQoKRXhwb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkV4cG9ydCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgUm90aGVyIE9TUwogICAgICAgIENodW5rU2l6ZSAgPT4gMV8wMDAsICMgb3B0aW9uYWwsIGZvciBjaHVua2VkIGV4cG9ydAojIEVPIFJvdGhlciBPU1MKICAgICk7CgpyZXR1cm5zIHNvbWV0aGluZyBsaWtlCgogICAgJFJlc3VsdFJlZiA9IHsKICAgICAgICBTdWNjZXNzICAgPT4gMiwKICAgICAgICBGYWlsZWQgICAgPT4gMCwKICAgICAgICBEZXN0aW5hdGlvbkNvbnRlbnQgPT4gWwogICAgICAgICAgICBbICdBdHRyXzFhJywgJ0F0dHJfMWInLCAnQXR0cl8xYycsIF0sCiAgICAgICAgICAgIFsgJ0F0dHJfMmEnLCAnQXR0cl8yYicsICdBdHRyXzNjJywgXSwKICAgICAgICBdLAogICAgfTsKIyBSb3RoZXIgT1NTCgpUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHdoZW4gdGhlIGV4cG9ydCBpcyBtZWFudCB0byBiZSBpbiBjaHVua3MuCiMgRU8gUm90aGVyIE9TUwoKPWN1dAoKc3ViIEV4cG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgb2JqZWN0IGJhY2tlbmQKICAgIG15ICRPYmplY3RCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntPYmplY3R9CiAgICApOwoKICAgIHJldHVybiB1bmxlc3MgJE9iamVjdEJhY2tlbmQ7CgogICAgIyBsb2FkIGZvcm1hdCBiYWNrZW5kCiAgICBteSAkRm9ybWF0QmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fQogICAgKTsKCiAgICByZXR1cm4gdW5sZXNzICRGb3JtYXRCYWNrZW5kOwoKICAgICMgZ2V0IGV4cG9ydCBkYXRhLAojIFJvdGhlciBPU1MKICAgICMgT25seSB0aGUgY3VycmVudCBjaHVuaywgd2hlbiBDaHVua1NpemUgaXMgcGFzc2VkCiMgRU8gUm90aGVyIE9TUwogICAgIyBwYXNzaW5nIHRoZSB0ZW1wbGF0ZSBJRCBnaXZlcyB0aGUgYmFja2VuZCBhY2Nlc3MgdG8gdGhlIG1hcHBpbmcgbGlzdAogICAgIyBhbmQgdG8gdGhlIGV4cG9ydCBmb3JtYXQuCiAgICBteSAkRXhwb3J0RGF0YSA9ICRPYmplY3RCYWNrZW5kLT5FeHBvcnREYXRhR2V0KAojIFJvdGhlciBPU1MKICAgICAgICBDaHVua1NpemUgID0+ICRQYXJhbXtDaHVua1NpemV9LAojIEVPIFJvdGhlciBPU1MKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgbXkgJEZvcm1hdERhdGEgPSAkU2VsZi0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGlmIGNvbHVtbiBoZWFkZXJzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZXhwb3J0CiAgICBpZiAoICRGb3JtYXREYXRhLT57SW5jbHVkZUNvbHVtbkhlYWRlcnN9ICkgewoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcyAodGhlIG5hbWUgb2YgdGhlIGNvbHVtbnMpCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzID0gJFNlbGYtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGxvb2t1cCBoYXNoIGZvciB0aGUgb2JqZWN0IGF0dHJpYnV0ZSBuYW1lcwogICAgICAgIG15ICVBdHRyaWJ1dGVMb29rdXAgPSBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0gfSBAeyAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMtPlswXS0+e0lucHV0fS0+e0RhdGF9IH07CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdJRHMgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMKICAgICAgICBteSBAQ29sdW1uTmFtZXM7CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCAkTWFwcGluZ0lEcy0+QCogKSB7CgogICAgICAgICAgICAjIGdldCBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lCiAgICAgICAgICAgIG15ICRDb2x1bW5OYW1lID0gJEF0dHJpYnV0ZUxvb2t1cHsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9OwoKICAgICAgICAgICAgcHVzaCBAQ29sdW1uTmFtZXMsICRDb2x1bW5OYW1lOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgY29sdW1uIGhlYWRlcnMgYXMgZmlyc3Qgcm93CiAgICAgICAgdW5zaGlmdCBAeyRFeHBvcnREYXRhfSwgXEBDb2x1bW5OYW1lczsKICAgIH0KCiMgUm90aGVyIE9TUwogICAgIyBCYWNrZW5kcyB3aXRoIHN1cHBvcnQgZm9yIGNodW5raW5nIG11c3QgcHJvdmlkZSB0aGUgbWV0aG9kIElzRXhwb3J0Q29tcGxldGUoKS4KICAgICMgQmFja2VuZHMgd2l0aG91dCBzdXBwb3J0IGZvciBjaHVua2luZyBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHRoYXQgbWV0aG9kLiBBbiB1bmRlZmluZWQKICAgICMgdmFsdWUgZm9yIENodW5raW5nRmluaXNoZWQgaW5kaWNhdGVzIG5vIHN1cHBvcnQgZm9yIGNodW5raW5nLgogICAgbXkgJENodW5raW5nRmluaXNoZWQ7CiAgICBpZiAoICRPYmplY3RCYWNrZW5kLT5jYW4oJ0lzRXhwb3J0Q29tcGxldGUnKSApIHsKICAgICAgICAkQ2h1bmtpbmdGaW5pc2hlZCA9ICRPYmplY3RCYWNrZW5kLT5Jc0V4cG9ydENvbXBsZXRlOwogICAgfQoKIyBFTyBSb3RoZXIgT1NTCiAgICBteSAlUmVzdWx0ID0gKAogICAgICAgIFN1Y2Nlc3MgICAgICAgICAgICA9PiAwLAogICAgICAgIEZhaWxlZCAgICAgICAgICAgICA9PiAwLAogICAgICAgIERlc3RpbmF0aW9uQ29udGVudCA9PiBbXSwKIyBSb3RoZXIgT1NTCiAgICAgICAgQ2h1bmtpbmdGaW5pc2hlZCAgID0+ICRDaHVua2luZ0ZpbmlzaGVkLAojIEVPIFJvdGhlciBPU1MKICAgICk7CgogICAgRVhQT1JUREFUQVJPVzoKICAgIGZvciBteSAkRXhwb3J0RGF0YVJvdyAoIEB7JEV4cG9ydERhdGF9ICkgewoKICAgICAgICAjIGV4cG9ydCBvbmUgcm93CiAgICAgICAgbXkgJERlc3RpbmF0aW9uQ29udGVudFJvdyA9ICRGb3JtYXRCYWNrZW5kLT5FeHBvcnREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gJEV4cG9ydERhdGFSb3csCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkRGVzdGluYXRpb25Db250ZW50Um93ICkgewogICAgICAgICAgICAkUmVzdWx0e0ZhaWxlZH0rKzsKCiAgICAgICAgICAgIG5leHQgRVhQT1JUREFUQVJPVzsKICAgICAgICB9CgogICAgICAgICMgYWRkIHJvdyB0byBkZXN0aW5hdGlvbiBjb250ZW50CiAgICAgICAgcHVzaCBAeyAkUmVzdWx0e0Rlc3RpbmF0aW9uQ29udGVudH0gfSwgJERlc3RpbmF0aW9uQ29udGVudFJvdzsKICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4cG9ydCBvZiAkUmVzdWx0e0ZhaWxlZH0gcmVjb3JkcyAoJFRlbXBsYXRlRGF0YS0+e09iamVjdH0pOiBmYWlsZWQhIiwKICAgICk7CiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4cG9ydCBvZiAkUmVzdWx0e1N1Y2Nlc3N9IHJlY29yZHMgKCRUZW1wbGF0ZURhdGEtPntPYmplY3R9KTogc3VjY2Vzc2Z1bCEiLAogICAgKTsKCiAgICByZXR1cm4gXCVSZXN1bHQ7Cn0KCj1oZWFkMiBJbXBvcnQoKQoKSW1wb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTdHJpbmdSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgR2V0IHRoZSBjdXJyZW50IGNhY2hlIGNvbmZpZ3VyYXRpb25zIGJlZm9yZSBpbXBvcnQuCiAgICBteSAkQ29uZmlnQ2FjaGVJbk1lbW9yeSAgPSAkQ2FjaGVPYmplY3QtPntDYWNoZUluTWVtb3J5fTsKICAgIG15ICRDb25maWdDYWNoZUluQmFja2VuZCA9ICRDYWNoZU9iamVjdC0+e0NhY2hlSW5CYWNrZW5kfTsKCiAgICAjIFRlbXBvcmFyeSBkaXNhYmxlIHRoZSBjYWNoZSBjb25maWd1cmF0aW9ucyBmb3IgZmFzdGVyIGltcG9ydC4KICAgICRDYWNoZU9iamVjdC0+Q29uZmlndXJlKAogICAgICAgIENhY2hlSW5NZW1vcnkgID0+IDAsCiAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0KICAgICk7CgogICAgcmV0dXJuIHVubGVzcyAkT2JqZWN0QmFja2VuZDsKCiAgICAjIGxvYWQgZm9ybWF0IGJhY2tlbmQKICAgIG15ICRGb3JtYXRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9CiAgICApOwoKICAgIHJldHVybiB1bmxlc3MgJEZvcm1hdEJhY2tlbmQ7CgogICAgIyBnZXQgaW1wb3J0IGRhdGEKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkUGFyYW17U291cmNlQ29udGVudH0sCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHVubGVzcyAkSW1wb3J0RGF0YTsKCiAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgbXkgJEZvcm1hdERhdGEgPSAkU2VsZi0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGlmIGNvbHVtbiBoZWFkZXJzIGFyZSBhY3RpdmF0ZWQsIHRoZSBmaXJzdCByb3cgbXVzdCBiZSByZW1vdmVkCiAgICBpZiAoICRGb3JtYXREYXRhLT57SW5jbHVkZUNvbHVtbkhlYWRlcnN9ICkgewogICAgICAgIHNoaWZ0IEB7JEltcG9ydERhdGF9OwogICAgfQoKICAgICMgTnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBhbmQgbm90IHN1Y2Nlc3NmdWxseSBpbXBvcnRlZCByb3dzCiAgICBteSAlUmVzdWx0ID0gKAogICAgICAgIE9iamVjdCAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgIEZhaWxlZCAgPT4gMCwKICAgICAgICBSZXRDb2RlID0+IHt9LAogICAgICAgIENvdW50ZXIgPT4gMCwKICAgICk7CiAgICBJTVBPUlREQVRBUk9XOgogICAgZm9yIG15ICRJbXBvcnREYXRhUm93ICggJEltcG9ydERhdGEtPkAqICkgewoKICAgICAgICAkUmVzdWx0e0NvdW50ZXJ9Kys7CgogICAgICAgICMgaW1wb3J0IGEgc2luZ2xlIHJvdwogICAgICAgIG15ICggJElELCAkUmV0Q29kZSApID0gJE9iamVjdEJhY2tlbmQtPkltcG9ydERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiAkSW1wb3J0RGF0YVJvdywKICAgICAgICAgICAgQ291bnRlciAgICAgICA9PiAkUmVzdWx0e0NvdW50ZXJ9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRJRCApIHsKCiAgICAgICAgICAgICMgY291bnQgRHVwbGljYXRlTmFtZSBlbnRyaWVzIGFzIGVycm9ycwogICAgICAgICAgICBpZiAoICRSZXRDb2RlICYmICRSZXRDb2RlID1+IG17IFxBIER1cGxpY2F0ZU5hbWUgfXhtcyApIHsKICAgICAgICAgICAgICAgICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUmVzdWx0e0ZhaWxlZH0rKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0rKzsKICAgICAgICAgICAgJFJlc3VsdHtTdWNjZXNzfSsrOwogICAgICAgIH0KICAgIH0KCiAgICAjIFJlLWNvbmZpZ3VyZSB0aGUgY2FjaGUgYWZ0ZXIgaW1wb3J0LgogICAgJENhY2hlT2JqZWN0LT5Db25maWd1cmUoCiAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gJENvbmZpZ0NhY2hlSW5NZW1vcnksCiAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gJENvbmZpZ0NhY2hlSW5CYWNrZW5kLAogICAgKTsKCiAgICAjIGxvZyByZXN1bHQKICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAiSW1wb3J0IG9mICRSZXN1bHR7Q291bnRlcn0gJFJlc3VsdHtPYmplY3R9IHJlY29yZHM6ICIKICAgICAgICAgICAgLiAiJFJlc3VsdHtGYWlsZWR9IGZhaWxlZCwgJFJlc3VsdHtTdWNjZXNzfSBzdWNjZWVkZWQiLAogICAgKTsKICAgIGZvciBteSAkUmV0Q29kZSAoIHNvcnQga2V5cyAleyAkUmVzdWx0e1JldENvZGV9IH0gKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFJlc3VsdHtSZXRDb2RlfS0+eyRSZXRDb2RlfSB8fCAwOwogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAiSW1wb3J0IG9mICRSZXN1bHR7Q291bnRlcn0gJFJlc3VsdHtPYmplY3R9IHJlY29yZHM6ICRDb3VudCAkUmV0Q29kZSIsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFJlc3VsdHtGYWlsZWR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZTogJFJlc3VsdHtDb3VudGVyfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXCVSZXN1bHQ7Cn0KCjE7Cg==</File>
        <File Location="doc/en/ImportExportTicket.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
</otrs_package>