ITSMLocation 1.0.6 OTRS AG http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Build for OTRS::ITSM 1.0.6. Build for OTRS::ITSM 1.0.5. Build for OTRS::ITSM 1.0.4. Build for OTRS::ITSM 1.0.3. Build for OTRS::ITSM 1.0.2. Build for OTRS::ITSM 1.0.1. Build for OTRS::ITSM 1.0.0 rc2. Build for OTRS::ITSM 1.0.0 rc1. Build for OTRS::ITSM 1.0.0 beta4. Build for OTRS::ITSM 1.0.0 beta3. Update version number of package. Testbuild for OTRS::ITSM 1.0.0 beta2. Init release. The OTRS::ITSM location package. Das OTRS::ITSM Location Paket. 2.2.6 <br> WELCOME<br> <br> You are about to install the OTRS module ITSMLocation.<br> <br> <br> REQUIRED OTRS PACKAGES <ul> <li>GeneralCatalog 1.0.6</li> <li>LinkObject 1.0.6</li> <li>ITSMCore 1.0.6</li> <li>ITSMService 1.0.6</li> <li>ITSMTicket 1.0.6</li> <li>ITSMConfigItem 1.0.6</li> </ul> <br> ATTENTION<br> <br> Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WILLKOMMEN<br> <br> Sie sind im Begriff das OTRS-Modul ITSMLocation zu installieren.<br> <br> <br> BENÖTIGTE OTRS-PAKETE <ul> <li>GeneralCatalog 1.0.6</li> <li>LinkObject 1.0.6</li> <li>ITSMCore 1.0.6</li> <li>ITSMService 1.0.6</li> <li>ITSMTicket 1.0.6</li> <li>ITSMConfigItem 1.0.6</li> </ul> <br> ACHTUNG<br> <br> Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WELCOME<br> <br> You are about to upgrade the OTRS module ITSMLocation.<br> <br> <br> REQUIRED OTRS PACKAGES <ul> <li>GeneralCatalog 1.0.6</li> <li>LinkObject 1.0.6</li> <li>ITSMCore 1.0.6</li> <li>ITSMService 1.0.6</li> <li>ITSMTicket 1.0.6</li> <li>ITSMConfigItem 1.0.6</li> </ul> <br> ATTENTION<br> <br> Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WILLKOMMEN<br> <br> Sie sind im Begriff das OTRS-Modul ITSMLocation zu aktualisieren.<br> <br> <br> BENÖTIGTE OTRS-PAKETE <ul> <li>GeneralCatalog 1.0.6</li> <li>LinkObject 1.0.6</li> <li>ITSMCore 1.0.6</li> <li>ITSMService 1.0.6</li> <li>ITSMTicket 1.0.6</li> <li>ITSMConfigItem 1.0.6</li> </ul> <br> ACHTUNG<br> <br> Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br> <br> <br> ((enjoy))<br> <br> GeneralCatalog ITSMCore ITSMConfigItem LinkObject2 2008-03-29 23:08:20 opms.otrs.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNTG9jYXRpb24ueG1sLHYgMS42LjIuMiAyMDA4LzAxLzE0IDEzOjMzOjE4IG1oIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5JVFNNTG9jYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5JVFNNTG9jYXRpb24gY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSVRTTUxvY2F0aW9uIEtvbmZpZ3VyYXRpb24gaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5Mb2NhdGlvbjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5BZG1pbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE1vZHVsZT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyTW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5Mb2NhdGlvbjwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2szPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDEwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUxvY2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUxvY2F0aW9uIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNTG9jYXRpb24tT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPklUU00gTG9jYXRpb24gT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+TG9jYXRpb248L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+TG9jYXRpb248L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TG9jYXRpb24tQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+TG9jYXRpb248L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5pdHNtX2xvY2F0aW9uLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUxvY2F0aW9uPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+TG9jYXRpb248L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMzMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNTG9jYXRpb248L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+TG9jYXRpb248L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjEwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Mb2NhdGlvblpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNTG9jYXRpb25ab29tIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNTG9jYXRpb25ab29tLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Mb2NhdGlvbiBab29tPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5ab29tPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkxvY2F0aW9uPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Mb2NhdGlvbjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGJhY2sgbGluayBpbiBsb2NhdGlvbiBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBadXL8Y2stTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgTG9jYXRpb24tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUxvY2F0aW9uOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Mb2NhdGlvbk1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPiRFbnZ7IklUU01Mb2NhdGlvbkxhc3RTY3JlZW5PdmVydmlldyJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUxvY2F0aW9uOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzIwMC1MaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlIGxpbmsgbGluayBpbiBsb2NhdGlvbiBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBWZXJrbvxwZmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIExvY2F0aW9uLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Mb2NhdGlvbjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNTG9jYXRpb25NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRMaW5rT2JqZWN0MiZhbXA7U291cmNlQ2xhc3M9SVRTTUxvY2F0aW9uJmFtcDtTb3VyY2VLZXk9JFFEYXRheyJMb2NhdGlvbklEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0Mjo6UG9zc2libGVQYXJ0bmVyIyMjSVRTTUxvY2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UG9zc2libGUgcGFydG5lciBmcm9tIElUU01Mb2NhdGlvbiBvYmplY3QgdG8gb3RoZXIgb2JqZWN0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TfZnbGljaGUgUGFydG5lciB2b20gSVRTTUxvY2F0aW9uIHp1IGFuZGVyZW4gT2JqZWt0ZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDI6OlBvc3NpYmxlUGFydG5lcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNQ29uZmlnSXRlbSI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5EZXBlbmRzT248L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkFsdGVybmF0aXZlVG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNTG9jYXRpb24ucG0gLSB0aGUgYnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIElUU01Mb2NhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBiZ19JVFNNTG9jYXRpb24ucG0sdiAxLjEuMi4yIDIwMDgvMDEvMTQgMTM6MzM6MTggbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0lUU01Mb2NhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9jYXRpb24nfSA9ICfL7urg9uj/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvY2F0aW9uLUFyZWEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9jYXRpb24gTWFuYWdlbWVudCd9ID0gJ9Pv8ODi6+Xt6OUg7eAg6+7q4Pbo6PLlIC0gzOXx8u7v7uvu5uXt6P/y4Cc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTG9jYXRpb24nfSA9ICfE7uHg4ugg6+7q4Pbo/yc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBuZXcgTG9jYXRpb24uJ30gPSAnzO7m5fLlIOTgIOTu4eDi6PLlIO3u4uAg6+7q4Pbo/yc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWItTG9jYXRpb24gb2YnfSA9ICfP7uQt6+7q4Pbo/yDt4Cc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAnwOTw5fEnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAn0ePw4OTgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnxfLg5ic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ8jSINH67vD65uXt6OUvz+7s5fnl7ejlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09mZmljZSd9ID0gJ8706PEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICfE8PPj6Cc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdXRsZXQnfSA9ICfI5+Lu5C3w7ufl8urgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICfY6uD0LfDg6ic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAn0fLg/yc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrcGxhY2UnfSA9ICfQ4OHu8u3uIOz/8fLuJzsKCiAgICByZXR1cm4gMTsKfQoKMTs= IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNTG9jYXRpb24ucG0gLSB0aGUgY3plY2ggdHJhbnNsYXRpb24gb2YgSVRTTUxvY2F0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGN6X0lUU01Mb2NhdGlvbi5wbSx2IDEuMS4yLjIgMjAwOC8wMS8xNCAxMzozMzoxOCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3pfSVRTTUxvY2F0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2NhdGlvbid9ID0gJ0xva2FsaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvY2F0aW9uLUFyZWEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9jYXRpb24gTWFuYWdlbWVudCd9ID0gJ8WYw616ZW7DrSBsb2thbGl0eSAtIG3DrXN0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBMb2NhdGlvbid9ID0gJ0RvZGF0IGxva2FsaXR1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIG5ldyBMb2NhdGlvbi4nfSA9ICdNxa/FvmV0ZSBkb2RhdCBub3ZvdSBsb2thbGl0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWItTG9jYXRpb24gb2YnfSA9ICdTdWJsb2thbGl0YSAtIMSNZWhvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZHJlc3MnfSA9ICdBZHJlc2EnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnQnVkb3ZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnUGF0cm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICdJVCB6YcWZw616ZW7DrSAvcHJvc3Rvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPZmZpY2UnfSA9ICdLYW5jZWzDocWZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnT3N0YXRuw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAnVsO9c3R1cCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYWNrJ30gPSAnU2vFmcOtxYggPSByYWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICdNw61zdG5vc3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnUHJhY292acWhdMSbJzsKCiAgICByZXR1cm4gMTsKfQoKMTs= IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNTG9jYXRpb24ucG0gLSB0aGUgZ2VybWFuIHRyYW5zbGF0aW9uIG9mIElUU01Mb2NhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9JVFNNTG9jYXRpb24ucG0sdiAxLjguMi4xIDIwMDgvMDEvMTQgMTM6MzM6MTggbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01Mb2NhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9jYXRpb24nfSA9ICdMb2thdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2NhdGlvbi1BcmVhJ30gPSAnTG9rYXRpb24tQmVyZWljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2NhdGlvbiBNYW5hZ2VtZW50J30gPSAnTG9rYXRpb24gVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTG9jYXRpb24nfSA9ICdMb2thdGlvbiBoaW56dWb8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIG5ldyBMb2NhdGlvbi4nfSA9ICdFaW5lIG5ldWUgTG9rYXRpb24gaGluenVm/Gdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3ViLUxvY2F0aW9uIG9mJ30gPSAnVW50ZXJsb2thdGlvbiB2b24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0FkcmVzc2UnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnR2Vi5HVkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJ0V0YWdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAnSVQgRWlucmljaHR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2ZmaWNlJ30gPSAnQvxybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ1NvbnN0aWdlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdXRsZXQnfSA9ICdBbnNjaGx1c3Nkb3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICdSYWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICdSYXVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ0FyYmVpdHNwbGF0eic7CgogICAgcmV0dXJuIDE7Cn0KCjE7 IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUxvY2F0aW9uLnBtIC0gYWRtaW4gZnJvbnRlbmQgdG8gbWFuYWdlIGxvY2F0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbklUU01Mb2NhdGlvbi5wbSx2IDEuMTAgMjAwNy8wOC8wMiAxMjo0Njo1NSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01Mb2NhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMTAgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgICMgZ2V0IGNvbW1vbiBvYmplY3RzCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoISRTZWxmLT57JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIik7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMb2NhdGlvbk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbG9jYXRpb24gZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTG9jYXRpb25FZGl0JykgewogICAgICAgIG15ICVMb2NhdGlvbkRhdGE7CiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgJExvY2F0aW9uRGF0YXtMb2NhdGlvbklEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiTG9jYXRpb25JRCIpOwogICAgICAgIGlmICgkTG9jYXRpb25EYXRhe0xvY2F0aW9uSUR9IG5lICdORVcnKSB7CiAgICAgICAgICAgICVMb2NhdGlvbkRhdGEgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICBMb2NhdGlvbklEID0+ICRMb2NhdGlvbkRhdGF7TG9jYXRpb25JRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAjIGdlbmVyYXRlIFBhcmVudE9wdGlvblN0cmcKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScpIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CiAgICAgICAgbXkgJUxvY2F0aW9uTGlzdCA9ICRTZWxmLT57TG9jYXRpb25PYmplY3R9LT5Mb2NhdGlvbkxpc3QoCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkTG9jYXRpb25EYXRhe1BhcmVudE9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiBcJUxvY2F0aW9uTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnUGFyZW50SUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRMb2NhdGlvbkRhdGF7UGFyZW50SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIERpc2FibGVkQnJhbmNoID0+ICRMb2NhdGlvbkRhdGF7TmFtZX0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKICAgICAgICAjIGdlbmVyYXRlIFR5cGVPcHRpb25TdHJnCiAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6TG9jYXRpb246OlR5cGUnLAogICAgICAgICk7CiAgICAgICAgJExvY2F0aW9uRGF0YXtUeXBlT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+ICRUeXBlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkTG9jYXRpb25EYXRhe1R5cGVJRH0sCiAgICAgICAgKTsKICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgJExvY2F0aW9uRGF0YXtWYWxpZE9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiBcJVZhbGlkTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJExvY2F0aW9uRGF0YXtWYWxpZElEfSwKICAgICAgICApOwogICAgICAgICMgb3V0cHV0IGxvY2F0aW9uIGVkaXQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb2NhdGlvbkVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVMb2NhdGlvbkRhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNTG9jYXRpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsb2NhdGlvbiBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdMb2NhdGlvblNhdmUnKSB7CiAgICAgICAgbXkgJUxvY2F0aW9uRGF0YTsKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3JlYWNoIChxdyhMb2NhdGlvbklEIFBhcmVudElEIE5hbWUgVHlwZUlEIFBob25lMSBQaG9uZTIgRmF4IEVtYWlsIEFkZHJlc3MgVmFsaWRJRCBDb21tZW50KSkgewogICAgICAgICAgICAkTG9jYXRpb25EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiJF8iKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgaWYgKCRMb2NhdGlvbkRhdGF7TG9jYXRpb25JRH0gZXEgJ05FVycpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25BZGQoCiAgICAgICAgICAgICAgICAlTG9jYXRpb25EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCEkU3VjY2VzcykgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25VcGRhdGUoCiAgICAgICAgICAgICAgICAlTG9jYXRpb25EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCEkU3VjY2VzcykgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbG9jYXRpb24gb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAjIGdldCBsb2NhdGlvbiB0eXBlcwogICAgICAgIG15ICRUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkxvY2F0aW9uOjpUeXBlJywKICAgICAgICApOwogICAgICAgICMgZ2V0IGxvY2F0aW9uIGxpc3QKICAgICAgICBteSAlTG9jYXRpb25MaXN0ID0gJFNlbGYtPntMb2NhdGlvbk9iamVjdH0tPkxvY2F0aW9uTGlzdCgKICAgICAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICAgICAgZm9yZWFjaCAoa2V5cyAlTG9jYXRpb25MaXN0KSB7CiAgICAgICAgICAgICRMb2NhdGlvbkxpc3R7JF99IC49ICc6Oic7CiAgICAgICAgfQogICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICBmb3JlYWNoIG15ICRMb2NhdGlvbklEIChzb3J0IHskTG9jYXRpb25MaXN0eyRhfSBjbXAgJExvY2F0aW9uTGlzdHskYn19IGtleXMgJUxvY2F0aW9uTGlzdCkgewogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgaWYgKCRDc3NDbGFzcyAmJiAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScpIHsKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgZ2V0IGxvY2F0aW9uIGRhdGEKICAgICAgICAgICAgbXkgJUxvY2F0aW9uRGF0YSA9ICRTZWxmLT57TG9jYXRpb25PYmplY3R9LT5Mb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgIExvY2F0aW9uSUQgPT4gJExvY2F0aW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlTG9jYXRpb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRMb2NhdGlvbkRhdGF7TmFtZVNob3J0fSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZUxpc3QtPnskTG9jYXRpb25EYXRhe1R5cGVJRH19LAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7JExvY2F0aW9uRGF0YXtWYWxpZElEfX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBARnJhZ21lbnQgPSBzcGxpdCgnOjonLCAkTG9jYXRpb25EYXRhe05hbWV9KTsKICAgICAgICAgICAgICAgIHBvcChARnJhZ21lbnQpOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoQEZyYWdtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93U3BhY2UnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVMb2NhdGlvbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGVMaXN0LT57JExvY2F0aW9uRGF0YXtUeXBlSUR9fSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAkVmFsaWRMaXN0eyRMb2NhdGlvbkRhdGF7VmFsaWRJRH19LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01Mb2NhdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7 IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUxvY2F0aW9uLnBtIC0gdGhlIE9UUlM6OklUU00gTG9jYXRpb24gbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUxvY2F0aW9uLnBtLHYgMS41IDIwMDcvMDgvMDIgMTI6NDY6NTUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNTG9jYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjUgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99OwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICghJFNlbGYtPnskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKQogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TG9jYXRpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKICAgICMgZ2V0IHR5cGUgbGlzdAogICAgbXkgJFR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpMb2NhdGlvbjo6VHlwZScsCiAgICApOwogICAgIyBnZXQgbG9jYXRpb24gbGlzdAogICAgbXkgJUxvY2F0aW9uTGlzdCA9ICRTZWxmLT57TG9jYXRpb25PYmplY3R9LT5Mb2NhdGlvbkxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAjIGFkZCBzdWZmaXggZm9yIGNvcnJlY3Qgc29ydGluZwogICAgZm9yZWFjaCAoa2V5cyAlTG9jYXRpb25MaXN0KSB7CiAgICAgICAgJExvY2F0aW9uTGlzdHskX30gLj0gJzo6JzsKICAgIH0KICAgIG15ICRDc3NDbGFzczsKICAgIGZvcmVhY2ggbXkgJExvY2F0aW9uSUQgKHNvcnQgeyRMb2NhdGlvbkxpc3R7JGF9IGNtcCAkTG9jYXRpb25MaXN0eyRifX0ga2V5cyAlTG9jYXRpb25MaXN0KSB7CiAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgaWYgKCRDc3NDbGFzcyAmJiAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaHBhc3NpdmUnKSB7CiAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgIH0KICAgICAgICAjIGdldCBsb2NhdGlvbiBkYXRhCiAgICAgICAgbXkgJUxvY2F0aW9uID0gJFNlbGYtPntMb2NhdGlvbk9iamVjdH0tPkxvY2F0aW9uR2V0KAogICAgICAgICAgICBMb2NhdGlvbklEID0+ICRMb2NhdGlvbklELAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJExvY2F0aW9ue05hbWVTaG9ydH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZUxpc3QtPnskTG9jYXRpb257VHlwZUlEfX0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQEZyYWdtZW50ID0gc3BsaXQoJzo6JywgJExvY2F0aW9ue05hbWV9KTsKICAgICAgICAgICAgcG9wKEBGcmFnbWVudCk7CiAgICAgICAgICAgIGZvcmVhY2ggKEBGcmFnbWVudCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jvd1NwYWNlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlTG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkTG9jYXRpb257TmFtZVNob3J0fSwKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlTGlzdC0+eyRMb2NhdGlvbntUeXBlSUR9fSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNTG9jYXRpb24nLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAjIHNldCBsYXN0IHNjcmVlbiB2aWV3CiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgPT4gJ0lUU01Mb2NhdGlvbkxhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgVmFsdWUgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iLAogICAgKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOw== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUxvY2F0aW9uWm9vbS5wbSAtIHRoZSBPVFJTOjpJVFNNIExvY2F0aW9uIHpvb20gbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUxvY2F0aW9uWm9vbS5wbSx2IDEuOCAyMDA3LzA4LzAyIDEyOjQ2OjU1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUxvY2F0aW9uWm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuOCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkU2VsZi0+eyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpCiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMb2NhdGlvbk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdDJ9ID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJE91dHB1dDsKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJExvY2F0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkxvY2F0aW9uSUQiKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoISRMb2NhdGlvbklEKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIExvY2F0aW9uSUQgaXMgZ2l2ZW4hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KICAgICMgb3V0cHV0IGhlYWRlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICMgZ2V0IGxvY2F0aW9uCiAgICBteSAlTG9jYXRpb24gPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25HZXQoCiAgICAgICAgTG9jYXRpb25JRCA9PiAkTG9jYXRpb25JRCwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICghJExvY2F0aW9ue0xvY2F0aW9uSUR9KSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkxvY2F0aW9uSUQgJExvY2F0aW9uSUQgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CiAgICAjIGdldCB0eXBlIGxpc3QKICAgIG15ICRUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6TG9jYXRpb246OlR5cGUnLAogICAgKTsKICAgICRMb2NhdGlvbntUeXBlfSA9ICRUeXBlTGlzdC0+eyRMb2NhdGlvbntUeXBlSUR9fTsKICAgICRMb2NhdGlvbntBZGRyZXNzfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICBUZXh0ID0+ICRMb2NhdGlvbntBZGRyZXNzfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgKTsKICAgICMgcnVuIGNvbmZpZyBpdGVtIG1lbnUgbW9kdWxlcwogICAgaWYgKHJlZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUxvY2F0aW9uOjpGcm9udGVuZDo6TWVudU1vZHVsZScpKSBlcSAnSEFTSCcpIHsKICAgICAgICBteSAlTWVudXMgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNTG9jYXRpb246OkZyb250ZW5kOjpNZW51TW9kdWxlJyl9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3JlYWNoIG15ICRNZW51IChzb3J0IGtleXMgJU1lbnVzKSB7CiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1lbnVzeyRNZW51fS0+e01vZHVsZX0pKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbklEID0+ICRTZWxmLT57TG9jYXRpb25JRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gPT4gXCVMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICMgZ2V0IHBhcnRuZXIgbGluayBkYXRhIGxpc3QKICAgIG15ICRQYXJ0bmVyTGlua0RhdGFMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlBhcnRuZXJMaW5rRGF0YUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU01Mb2NhdGlvbicsCiAgICAgICAgS2V5ID0+ICRMb2NhdGlvbklELAogICAgKTsKICAgICMgZ2VuZXJhdGUgYmxvY2sgbGlzdAogICAgbXkgJEJsb2NrTGlzdCA9IHt9OwogICAgZm9yZWFjaCBteSAkSXRlbSAoQHskUGFydG5lckxpbmtEYXRhTGlzdH0pIHsKICAgICAgICAkQmxvY2tMaXN0LT57JEl0ZW0tPntCbG9ja25hbWUxfX0tPnskSXRlbS0+e0Jsb2NrbmFtZTJ9fS0+eyRJdGVtLT57TGlua0lEfX0gPSAkSXRlbTsKICAgIH0KICAgICMgc3RhcnQgcGFydG5lciBvdXRwdXQKICAgIG15ICRPdXRwdXRIb3Jpem9udGFsUnVsZXIgPSAxOwogICAgZm9yZWFjaCBteSAkQmxvY2tuYW1lMSAoc29ydCBrZXlzICV7JEJsb2NrTGlzdH0pIHsKICAgICAgICBmb3JlYWNoIG15ICRCbG9ja25hbWUyIChzb3J0IGtleXMgJXskQmxvY2tMaXN0LT57JEJsb2NrbmFtZTF9fSkgewogICAgICAgICAgICBteSAkSXRlbUxpc3QgPSAkQmxvY2tMaXN0LT57JEJsb2NrbmFtZTF9LT57JEJsb2NrbmFtZTJ9OwogICAgICAgICAgICAjIGdldCBwYXJ0bmVyIHRhYmxlIGNvbHVtbnMKICAgICAgICAgICAgbXkgQExpbmtJRHMgPSBrZXlzKCV7JEl0ZW1MaXN0fSk7CiAgICAgICAgICAgIG15ICRQYXJ0bmVyVGFibGVDb2x1bW4gPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lclRhYmxlQ29sdW1uR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1MaXN0LT57JExpbmtJRHNbMF19LT57UGFydG5lckNsYXNzfSwKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW1MaXN0LT57JExpbmtJRHNbMF19LAogICAgICAgICAgICAgICAgTGlua1R5cGVDb2x1bW4gPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBjb3VudCBjb2x1bW5zCiAgICAgICAgICAgIG15ICRDb2x1bW5Db3VudCA9IEB7JFBhcnRuZXJUYWJsZUNvbHVtbn07CiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQmxvY2tuYW1lMSA9PiAkQmxvY2tuYW1lMSwKICAgICAgICAgICAgICAgICAgICBCbG9ja25hbWUyID0+ICRCbG9ja25hbWUyLAogICAgICAgICAgICAgICAgICAgIENvbHNwYW4gPT4gJENvbHVtbkNvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBvdXRwdXQgaG9yaXpvbnRhbCBydWxlcgogICAgICAgICAgICBpZiAoJE91dHB1dEhvcml6b250YWxSdWxlcikgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rSG9yaXpvbnRhbFJ1bGVyJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0SG9yaXpvbnRhbFJ1bGVyID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIG91dHB1dCBjb2x1bW4gd2lkdGggYmxvY2sKICAgICAgICAgICAgZm9yZWFjaCBteSAkQ29sdW1uIChAeyRQYXJ0bmVyVGFibGVDb2x1bW59KSB7CiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGhlYWRlciBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua0NvbHVtbldpZHRoJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGggPT4gJENvbHVtbi0+e0hUTUxPdXRwdXR9LT57VGFibGVXaWR0aH0gfHwgJyonLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgb3V0cHV0IGhlYWRsaW5lIGNvbHVtbiBibG9jawogICAgICAgICAgICBmb3JlYWNoIG15ICRDb2x1bW4gKEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0pIHsKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgaGVhZGVyIGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rSGVhZGVyQ29sdW1uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29sdW1uLT57SGVhZGxpbmV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICAgICAgZm9yZWFjaCBteSAkTGlua0RhdGEgKHNvcnQga2V5cyAleyRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0tPnskQmxvY2tuYW1lMn19KSB7CiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgICAgIGlmICgkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rUm93JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRDb2x1bW5EYXRhIChAeyRQYXJ0bmVyVGFibGVDb2x1bW59KSB7CiAgICAgICAgICAgICAgICAgICAgIyBsb29rdXAgY29udGVudAogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0tPnskQmxvY2tuYW1lMn0tPnskTGlua0RhdGF9LT57UGFydG5lckNsYXNzfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRGF0YSA9PiAkQ29sdW1uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgTGlua0RhdGEgPT4gJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfS0+eyRMaW5rRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIHJvdyBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rUm93Q29sdW1uJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRDb250ZW50U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjIGdldCBjcmVhdGUgdXNlciBkYXRhCiAgICBteSAlQ3JlYXRlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkTG9jYXRpb257Q3JlYXRlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvcmVhY2ggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAkTG9jYXRpb257J0NyZWF0ZScgLiAkX30gPSAkQ3JlYXRlVXNlcnskX307CiAgICB9CiAgICAjIGdldCBjaGFuZ2UgdXNlciBkYXRhCiAgICBteSAlQ2hhbmdlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkTG9jYXRpb257Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvcmVhY2ggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAkTG9jYXRpb257J0NoYW5nZScgLiAkX30gPSAkQ2hhbmdlVXNlcnskX307CiAgICB9CiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUxvY2F0aW9uWm9vbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUxvY2F0aW9uLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgIyBzZXQgbGFzdCBzY3JlZW4gdmlldyAoSVRTTUxvY2F0aW9uKQogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdJVFNNQ29uZmlnSXRlbUxhc3RTY3JlZW5WaWV3JywKICAgICAgICBWYWx1ZSA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZMb2NhdGlvbklEPSRMb2NhdGlvbklEIiwKICAgICk7CiAgICAjIHNldCBsYXN0IHNjcmVlbiB2aWV3IChMaW5rT2JqZWN0MikKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSA9PiAnTGlua09iamVjdDJMYXN0U2NyZWVuJywKICAgICAgICBWYWx1ZSA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZMb2NhdGlvbklEPSRMb2NhdGlvbklEIiwKICAgICk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTs= IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNTG9jYXRpb25NZW51R2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNTG9jYXRpb25NZW51R2VuZXJpYy5wbSx2IDEuMiAyMDA3LzA3LzAyIDE1OjM5OjM4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUxvY2F0aW9uTWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9jYXRpb25PYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCEkUGFyYW17TG9jYXRpb259KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCBMb2NhdGlvbiEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51JywKICAgICAgICBEYXRhID0+IHt9LAogICAgKTsKICAgIGlmICgkUGFyYW17Q291bnRlcn0pIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbVNwbGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskUGFyYW17TG9jYXRpb259fSwKICAgICAgICAgICAgJXskUGFyYW17Q29uZmlnfX0sCiAgICAgICAgfSwKICAgICk7CiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOw== IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0MkxheW91dElUU01Mb2NhdGlvbi5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMaW5rT2JqZWN0MkxheW91dElUU01Mb2NhdGlvbi5wbSx2IDEuNiAyMDA3LzA3LzAyIDE1OjM5OjM4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDJMYXlvdXRJVFNNTG9jYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS42ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3QyTGF5b3V0SVRTTUxvY2F0aW9uIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGxvY2F0aW9uIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0MkxheW91dElUU01Mb2NhdGlvbi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgTGF5b3V0T2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgUGFyYW1PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCV7JFNlbGZ9KTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvbnRlbnRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIG91dHB1dCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgQ29sdW1uRGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBMaW5rRGF0YSA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ29udGVudFN0cmluZ0NyZWF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkQ29udGVudFN0cmluZyA9ICcnOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENvbHVtbkRhdGEgTGlua0RhdGEpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ0RhdGVUaW1lJykgewogICAgICAgICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiRRRGF0YXsiRGF0ZSJ9In0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERhdGUgPT4gJFBhcmFte0xpbmtEYXRhfS0+e0RhdGF9LT57JFBhcmFte0NvbHVtbkRhdGF9LT57S2V5fX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgkUGFyYW17Q29sdW1uRGF0YX0tPntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSInIC4gJFBhcmFte0NvbHVtbkRhdGF9LT57SFRNTE91dHB1dH0tPntOYW1lfSAuJyIgJy4KICAgICAgICAgICAgJ3ZhbHVlPSInLiAkUGFyYW17TGlua0RhdGF9LT57JFBhcmFte0NvbHVtbkRhdGF9LT57S2V5fX0gLiciPic7CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ0dlbmVyYWxDYXRhbG9nJykgewogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkUGFyYW17Q29sdW1uRGF0YX0tPntEYXRhfS0+e0NsYXNzfSwKICAgICAgICApOwogICAgICAgICRDb250ZW50U3RyaW5nID0gJENsYXNzTGlzdC0+eyRQYXJhbXtMaW5rRGF0YX0tPntEYXRhfS0+eyRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX19fTsKICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICgkUGFyYW17Q29sdW1uRGF0YX0tPntIVE1MT3V0cHV0fS0+e1RyYW5zbGF0aW9ufSkgewogICAgICAgICAgICAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRDb250ZW50U3RyaW5nKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ0xpbmsnICYmCiAgICAgICAgJFBhcmFte0NvbHVtbkRhdGF9LT57RGF0YX0tPntMaW5rVHlwZX0gJiYgJFBhcmFte0NvbHVtbkRhdGF9LT57RGF0YX0tPntMaW5rVHlwZX0gZXEgJ1pvb20nCiAgICApIHsKICAgICAgICAkQ29udGVudFN0cmluZyA9ICc8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUxvY2F0aW9uWm9vbSZMb2NhdGlvbklEPScuCiAgICAgICAgICAgICRQYXJhbXtMaW5rRGF0YX0tPntEYXRhfS0+e0xvY2F0aW9uSUR9IC4gJyI+Jy4KICAgICAgICAgICAgJFBhcmFte0xpbmtEYXRhfS0+e0RhdGF9LT57JFBhcmFte0NvbHVtbkRhdGF9LT57S2V5fX0gLiAnPC9hPic7CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ1RleHQnICYmICRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57TWF4TGVuZ3RofSkgewogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtMaW5rRGF0YX0tPntEYXRhfS0+eyRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX19IHx8ICcnOwogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57VHJhbnNsYXRpb259KSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRWYWx1ZSk7CiAgICAgICAgfQogICAgICAgICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICckUURhdGF7IkRhdGUiLCInLiAkUGFyYW17Q29sdW1uRGF0YX0tPntIVE1MT3V0cHV0fS0+e01heExlbmd0aH0gLicifScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGF0ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgkUGFyYW17Q29sdW1uRGF0YX0tPntUeXBlfSBlcSAnTGlua1R5cGUnKSB7CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMaW5rT2JqZWN0Mjo6VHlwZScpOwogICAgICAgIG15ICRMaW5rVHlwZSA9ICRQYXJhbXtMaW5rRGF0YX0tPnskUGFyYW17Q29sdW1uRGF0YX0tPntLZXl9fTsKCiAgICAgICAgaWYgKCRMaW5rVHlwZUxpc3QtPnskTGlua1R5cGV9ICYmCiAgICAgICAgICAgICRMaW5rVHlwZUxpc3QtPnskTGlua1R5cGV9LT57Tm9ybWFsTmFtZX0gJiYKICAgICAgICAgICAgJExpbmtUeXBlTGlzdC0+eyRMaW5rVHlwZX0tPntSZXZlcnNlTmFtZX0KICAgICAgICApIHsKICAgICAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAkTGlua1R5cGVMaXN0LT57JExpbmtUeXBlfS0+e05vcm1hbE5hbWV9OwogICAgICAgICAgICBpZiAoJFBhcmFte0xpbmtEYXRhfS0+e1BhcnRuZXJDb21iaW5hdGlvbn0gZXEgJ1JldmVyc2UnKSB7CiAgICAgICAgICAgICAgICAkQ29udGVudFN0cmluZyA9ICRMaW5rVHlwZUxpc3QtPnskTGlua1R5cGV9LT57UmV2ZXJzZU5hbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57VHJhbnNsYXRpb259KSB7CiAgICAgICAgICAgICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJENvbnRlbnRTdHJpbmcpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRDb250ZW50U3RyaW5nID0gJFBhcmFte0xpbmtEYXRhfS0+e0RhdGF9LT57JFBhcmFte0NvbHVtbkRhdGF9LT57S2V5fX0gfHwgJyc7CiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoJFBhcmFte0NvbHVtbkRhdGF9LT57SFRNTE91dHB1dH0tPntUcmFuc2xhdGlvbn0pIHsKICAgICAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkQ29udGVudFN0cmluZyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRDb250ZW50U3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBJdGVtID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkSW5wdXRTdHJpbmcgPSAnJzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtIFVzZXJJRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0gZXEgJ1RleHQnKSB7CiAgICAgICAgJElucHV0U3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17SXRlbX0tPntLZXl9XCIgc2l6ZT1cIjYwXCI+Ijs7CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0gZXEgJ0dlbmVyYWxDYXRhbG9nJykgewogICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBsaXN0CiAgICAgICAgbXkgJFNlbGVjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICAgICApOwogICAgICAgICMgZ2VuZXJhdGUgc3RyaW5nCiAgICAgICAgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkU2VsZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgICAgICAgICBTaXplID0+IDUsCiAgICAgICAgICAgIE11bHRpcGxlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJElucHV0U3RyaW5nOwp9Cgo9aXRlbSBQYXJ0bmVyU2VhcmNoRm9ybUdldCgpCgpnZXQgYWxsIHNlYXJjaCBmb3JtIGRhdGEgYW5kIHJldHVybiBpdCBhcyAyZCBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5QYXJ0bmVyU2VhcmNoRm9ybUdldCgpOwoKPWN1dAoKc3ViIFBhcnRuZXJTZWFyY2hGb3JtR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRm9ybURhdGEgPSB7fTsKICAgICMgZ2V0IHZhbHVlcwogICAgZm9yZWFjaCAocXcoTmFtZSBQaG9uZTEgRW1haWwgQWRkcmVzcykpIHsKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIiRfIik7CiAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICAkVmFsdWUgPX4gcy9cKi8lL2c7CiAgICAgICAgICAgICRGb3JtRGF0YS0+eyRffSA9ICRWYWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAjIGdldCBhcnJheXMKICAgIGZvcmVhY2ggKHF3KFR5cGVJRHMpKSB7CiAgICAgICAgbXkgQEFycmF5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KFBhcmFtID0+ICIkXyIpOwogICAgICAgIGlmIChAQXJyYXkpIHsKICAgICAgICAgICAgJEZvcm1EYXRhLT57JF99ID0gXEBBcnJheTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAwNy8wNy8wMiAxNTozOTozOCAkCgo9Y3V0 IyAtLQojIEFkbWluSVRTTUxvY2F0aW9uLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JVFNNTG9jYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5JVFNNTG9jYXRpb24uZHRsLHYgMS44IDIwMDcvMDcvMDIgMTU6Mzk6MzggbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJMb2NhdGlvbiBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJMb2NhdGlvbkVkaXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkxvY2F0aW9uSUQiIHZhbHVlPSJORVciPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBMb2NhdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kVGV4dHsiQWRkIGEgbmV3IExvY2F0aW9uLiJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjcwJSIgY2xhc3M9Im1haW5ib2R5Ij4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikxpc3QifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjYwJSI+JFRleHR7IkxvY2F0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7InZhbGlkIn0vJFRleHR7ImludmFsaWQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93U3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3dTcGFjZSAtLT4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249TG9jYXRpb25FZGl0JkxvY2F0aW9uSUQ9JFFEYXRheyJMb2NhdGlvbklEIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJUeXBlIn0ifQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgo8IS0tIGR0bDpibG9jazpMb2NhdGlvbkVkaXQgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iTG9jYXRpb25TYXZlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJMb2NhdGlvbklEIiB2YWx1ZT0iJFFEYXRheyJMb2NhdGlvbklEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkVkaXQifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTG9jYXRpb24ifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lU2hvcnQifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1Yi1Mb2NhdGlvbiBvZiJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlBhcmVudE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZU9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQaG9uZSJ9IDE6IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUGhvbmUxIiB2YWx1ZT0iJFFEYXRheyJQaG9uZTEifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBob25lIn0gMjogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJQaG9uZTIiIHZhbHVlPSIkUURhdGF7IlBob25lMiJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRmF4In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRmF4IiB2YWx1ZT0iJFFEYXRheyJGYXgifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkVtYWlsIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRW1haWwiIHZhbHVlPSIkUURhdGF7IkVtYWlsIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjIwMCI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBZGRyZXNzIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQWRkcmVzcyIgY29scz0iNDAiIHJvd3M9IjYiPiRRRGF0YXsiQWRkcmVzcyJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNjAiIG1heGxlbmd0aD0iMTUwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6TG9jYXRpb25FZGl0IC0tPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGVuZCBmb3JtIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4K IyAtLQojIEFnZW50SVRTTUxvY2F0aW9uLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNTG9jYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNTG9jYXRpb24uZHRsLHYgMS40IDIwMDcvMDYvMDYgMTQ6MjE6NTYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJPdmVydmlldyJ9OiAkVGV4dHsiTG9jYXRpb24ifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMb2NhdGlvbiJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJMYXN0IENoYW5nZSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdSb3dTcGFjZSAtLT4KICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Um93U3BhY2UgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNTG9jYXRpb25ab29tJkxvY2F0aW9uSUQ9JFFEYXRheyJMb2NhdGlvbklEIn0iPgogICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUZXh0eyIkUURhdGF7IlR5cGUifSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiB3aWR0aD0iMTUwIj4kVGltZUxvbmd7IiRRRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Um93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo= IyAtLQojIEFnZW50SVRTTUxvY2F0aW9uWm9vbS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTUxvY2F0aW9uWm9vbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Mb2NhdGlvblpvb20uZHRsLHYgMS4xMCAyMDA3LzA2LzE1IDE2OjMxOjU5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJab29tIn06ICRUZXh0eyJMb2NhdGlvbiJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KICAgIDwvdGQ+CiAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjUlIiBjbGFzcz0ibWVudSI+PC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMb2NhdGlvbiJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQaG9uZSJ9IDE6IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJQaG9uZTEifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQaG9uZSJ9IDI6IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJQaG9uZTIifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGYXgifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkZheCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkVtYWlsIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJFbWFpbCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFkZHJlc3MifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQWRkcmVzcyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgo8IS0tIGR0bDpibG9jazpMaW5rSG9yaXpvbnRhbFJ1bGVyIC0tPgogICAgICA8aHIgc2l6ZT0iMiI+CjwhLS0gZHRsOmJsb2NrOkxpbmtIb3Jpem9udGFsUnVsZXIgLS0+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8Y29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICA8Y29sIHdpZHRoPSIkUURhdGF7IldpZHRoIn0iPgo8IS0tIGR0bDpibG9jazpMaW5rQ29sdW1uV2lkdGggLS0+CiAgICAgICAgPC9jb2xncm91cD4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iJFFEYXRheyJDb2xzcGFuIn0iPgogICAgICAgICAgICA8Yj48aT4kVGV4dHsiUmVsYXRlZCBPYmplY3RzIn06ICRUZXh0eyIkUURhdGF7IkJsb2NrbmFtZTEifSJ9ICRRRGF0YXsiQmxvY2tuYW1lMiJ9PC9pPjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtIZWFkZXJDb2x1bW4gLS0+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiJFFEYXRheyJDb250ZW50In0ifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkxpbmtIZWFkZXJDb2x1bW4gLS0+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6TGlua1Jvd0NvbHVtbiAtLT4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kRGF0YXsiQ29udGVudCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6TGlua1Jvd0NvbHVtbiAtLT4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rUm93IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjI1JSIgY2xhc3M9Im1lbnUiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDcmVhdGVVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICRRRGF0YXsiQ3JlYXRlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo= IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUxvY2F0aW9uLnBtIC0gYWxsIGl0c20gbG9jYXRpb24gZnVuY3Rpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUxvY2F0aW9uLnBtLHYgMS43LjIuMiAyMDA3LzA4LzI3IDE0OjQwOjAxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNy4yLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uIC0gaXRzbSBsb2NhdGlvbiBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGl0c20gbG9jYXRpb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9jYXRpb25PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTG9jYXRpb25MaXN0KCkKCnJldHVybiBhIGhhc2ggbGlzdCBvZiBsb2NhdGlvbnMKCiAgICBteSAlTG9jYXRpb25MaXN0ID0gJExvY2F0aW9uT2JqZWN0LT5Mb2NhdGlvbkxpc3QoCiAgICAgICAgVmFsaWQgPT4gMCwgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExvY2F0aW9uTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlTG9jYXRpb25MaXN0OwogICAgbXkgJUxvY2F0aW9uVmFsaWRMaXN0OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFVzZXJJRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY2hlY2sgdmFsaWQgcGFyYW0KICAgIGlmICghZGVmaW5lZCgkUGFyYW17VmFsaWR9KSkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVXNlcklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgbmFtZSwgdmFsaWRfaWQgRlJPTSBsb2NhdGlvbiIsCiAgICApOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJExvY2F0aW9uTGlzdHskUm93WzBdfSA9ICRSb3dbMV07CiAgICAgICAgJExvY2F0aW9uVmFsaWRMaXN0eyRSb3dbMF19ID0gJFJvd1syXTsKICAgIH0KICAgIGlmICgkUGFyYW17VmFsaWR9KSB7CiAgICAgICAgIyBnZXQgdmFsaWQgaWRzCiAgICAgICAgbXkgQFZhbGlkSURzID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkSURzR2V0KCk7CiAgICAgICAgIyBkdXBsaWNhdGUgbG9jYXRpb24gbGlzdAogICAgICAgIG15ICVMb2NhdGlvbkxpc3RUbXAgPSAlTG9jYXRpb25MaXN0OwogICAgICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICAgICAgZm9yZWFjaCBteSAkTG9jYXRpb25JRCAoa2V5cyAlTG9jYXRpb25MaXN0VG1wKSB7CiAgICAgICAgICAgICRMb2NhdGlvbkxpc3RUbXB7JExvY2F0aW9uSUR9IC49ICc6Oic7CiAgICAgICAgfQogICAgICAgIG15ICVMb2NhdGlvbkludmFsaWRMaXN0OwogICAgICAgIGZvcmVhY2ggbXkgJExvY2F0aW9uSUQgKHNvcnQgeyRMb2NhdGlvbkxpc3RUbXB7JGF9IGNtcCAkTG9jYXRpb25MaXN0VG1weyRifX0ga2V5cyAlTG9jYXRpb25MaXN0VG1wKSB7CiAgICAgICAgICAgIG15ICRJbnZhbGlkID0gMTsKICAgICAgICAgICAgZm9yZWFjaCBteSAkVmFsaWRJRCAoQFZhbGlkSURzKSB7CiAgICAgICAgICAgICAgICBpZiAoJExvY2F0aW9uVmFsaWRMaXN0eyRMb2NhdGlvbklEfSBlcSAkVmFsaWRJRCkgewogICAgICAgICAgICAgICAgICAgICRJbnZhbGlkID0gMDsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkSW52YWxpZCkgewogICAgICAgICAgICAgICAgJExvY2F0aW9uSW52YWxpZExpc3R7JExvY2F0aW9uTGlzdHskTG9jYXRpb25JRH19ID0gMTsKICAgICAgICAgICAgICAgIGRlbGV0ZSgkTG9jYXRpb25MaXN0eyRMb2NhdGlvbklEfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBkZWxldGUgaW52YWxpZCBsb2NhdGlvbnMgYW4gY2hpbGRzCiAgICAgICAgZm9yZWFjaCBteSAkTG9jYXRpb25JRCAoa2V5cyAlTG9jYXRpb25MaXN0KSB7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEludmFsaWROYW1lIChrZXlzICVMb2NhdGlvbkludmFsaWRMaXN0KSB7CiAgICAgICAgICAgICAgICBpZiAoJExvY2F0aW9uTGlzdHskTG9jYXRpb25JRH0gPX4gL14oJEludmFsaWROYW1lKTo6LykgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSgkTG9jYXRpb25MaXN0eyRMb2NhdGlvbklEfSk7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAlTG9jYXRpb25MaXN0Owp9Cgo9aXRlbSBMb2NhdGlvbkdldCgpCgpyZXR1cm4gYSBsb2NhdGlvbiBhcyBoYXNoCgpSZXR1cm4KICAgICRMb2NhdGlvbkRhdGF7TG9jYXRpb25JRH0KICAgICRMb2NhdGlvbkRhdGF7UGFyZW50SUR9CiAgICAkTG9jYXRpb25EYXRhe05hbWV9CiAgICAkTG9jYXRpb25EYXRhe05hbWVTaG9ydH0KICAgICRMb2NhdGlvbkRhdGF7VHlwZUlEfQogICAgJExvY2F0aW9uRGF0YXtQaG9uZTF9CiAgICAkTG9jYXRpb25EYXRhe1Bob25lMn0KICAgICRMb2NhdGlvbkRhdGF7RmF4fQogICAgJExvY2F0aW9uRGF0YXtFbWFpbH0KICAgICRMb2NhdGlvbkRhdGF7QWRkcmVzc30KICAgICRMb2NhdGlvbkRhdGF7VmFsaWRJRH0KICAgICRMb2NhdGlvbkRhdGF7Q29tbWVudH0KICAgICRMb2NhdGlvbkRhdGF7Q3JlYXRlVGltZX0KICAgICRMb2NhdGlvbkRhdGF7Q3JlYXRlQnl9CiAgICAkTG9jYXRpb25EYXRhe0NoYW5nZVRpbWV9CiAgICAkTG9jYXRpb25EYXRhe0NoYW5nZUJ5fQoKICAgIG15ICVMb2NhdGlvbkRhdGEgPSAkTG9jYXRpb25PYmplY3QtPkxvY2F0aW9uR2V0KAogICAgICAgIExvY2F0aW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMb2NhdGlvbkdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTG9jYXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhMb2NhdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGdldCBsb2NhdGlvbiBmcm9tIGRiCiAgICBteSAlTG9jYXRpb25EYXRhID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgbmFtZSwgdHlwZV9pZCwgcGhvbmUxLCBwaG9uZTIsIGZheCwgZW1haWwsIGFkZHJlc3MsICIuCiAgICAgICAgICAgICJ2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgIi4KICAgICAgICAgICAgIkZST00gbG9jYXRpb24gV0hFUkUgaWQgPSAkUGFyYW17TG9jYXRpb25JRH0iLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJExvY2F0aW9uRGF0YXtMb2NhdGlvbklEfSA9ICRSb3dbMF07CiAgICAgICAgJExvY2F0aW9uRGF0YXtOYW1lfSA9ICRSb3dbMV07CiAgICAgICAgJExvY2F0aW9uRGF0YXtUeXBlSUR9ID0gJFJvd1syXTsKICAgICAgICAkTG9jYXRpb25EYXRhe1Bob25lMX0gPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRMb2NhdGlvbkRhdGF7UGhvbmUyfSA9ICRSb3dbNF0gfHwgJyc7CiAgICAgICAgJExvY2F0aW9uRGF0YXtGYXh9ID0gJFJvd1s1XSB8fCAnJzsKICAgICAgICAkTG9jYXRpb25EYXRhe0VtYWlsfSA9ICRSb3dbNl0gfHwgJyc7CiAgICAgICAgJExvY2F0aW9uRGF0YXtBZGRyZXNzfSA9ICRSb3dbN10gfHwgJyc7CiAgICAgICAgJExvY2F0aW9uRGF0YXtWYWxpZElEfSA9ICRSb3dbOF07CiAgICAgICAgJExvY2F0aW9uRGF0YXtDb21tZW50fSA9ICRSb3dbOV0gfHwgJyc7CiAgICAgICAgJExvY2F0aW9uRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbMTBdOwogICAgICAgICRMb2NhdGlvbkRhdGF7Q3JlYXRlQnl9ID0gJFJvd1sxMV07CiAgICAgICAgJExvY2F0aW9uRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbMTJdOwogICAgICAgICRMb2NhdGlvbkRhdGF7Q2hhbmdlQnl9ID0gJFJvd1sxM107CiAgICB9CiAgICAjIGNoZWNrIGxvY2F0aW9uCiAgICBpZiAoISRMb2NhdGlvbkRhdGF7TG9jYXRpb25JRH0pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gc3VjaCBMb2NhdGlvbklEICgkUGFyYW17TG9jYXRpb25JRH0pISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAjIGNyZWF0ZSBzaG9ydCBuYW1lIGFuZCBwYXJlbnRpZAogICAgJExvY2F0aW9uRGF0YXtOYW1lU2hvcnR9ID0gJExvY2F0aW9uRGF0YXtOYW1lfTsKICAgIGlmICgkTG9jYXRpb25EYXRhe05hbWV9ID1+IC9eKC4qKTo6KC4rPykkLykgewogICAgICAgICRMb2NhdGlvbkRhdGF7TmFtZVNob3J0fSA9ICQyOwogICAgICAgICMgbG9va3VwIHBhcmVudAogICAgICAgIG15ICRMb2NhdGlvbklEID0gJFNlbGYtPkxvY2F0aW9uTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICQxLAogICAgICAgICk7CiAgICAgICAgJExvY2F0aW9uRGF0YXtQYXJlbnRJRH0gPSAkTG9jYXRpb25JRDsKICAgIH0KICAgIHJldHVybiAlTG9jYXRpb25EYXRhOwp9Cgo9aXRlbSBMb2NhdGlvbkxvb2t1cCgpCgpyZXR1cm4gYSBsb2NhdGlvbiBuYW1lIGFuZCBpZAoKICAgIG15ICRMb2NhdGlvbk5hbWUgPSAkTG9jYXRpb25PYmplY3QtPkxvY2F0aW9uTG9va3VwKAogICAgICAgIExvY2F0aW9uSUQgPT4gMTIzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRMb2NhdGlvbklEID0gJExvY2F0aW9uT2JqZWN0LT5Mb2NhdGlvbkxvb2t1cCgKICAgICAgICBOYW1lID0+ICdMb2NhdGlvbjo6U3ViTG9jYXRpb24nLAogICAgKTsKCj1jdXQKCnN1YiBMb2NhdGlvbkxvb2t1cCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCEkUGFyYW17TG9jYXRpb25JRH0gJiYgISRQYXJhbXtOYW1lfSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgTG9jYXRpb25JRCBvciBOYW1lISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICgkUGFyYW17TG9jYXRpb25JRH0pIHsKICAgICAgICBteSAkTG9jYXRpb25OYW1lOwogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TG9jYXRpb25JRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte0xvY2F0aW9uSUR9LCAnSW50ZWdlcicpOwogICAgICAgICMgbG9va3VwCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIG5hbWUgRlJPTSBsb2NhdGlvbiBXSEVSRSBpZCA9ICRQYXJhbXtMb2NhdGlvbklEfSIsCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJExvY2F0aW9uTmFtZSA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIHJldHVybiAkTG9jYXRpb25OYW1lOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJExvY2F0aW9uSUQ7CiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtOYW1lfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17TmFtZX0pOwogICAgICAgICMgbG9va3VwCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gbG9jYXRpb24gV0hFUkUgbmFtZSA9ICckUGFyYW17TmFtZX0nIiwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAkTG9jYXRpb25JRCA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIHJldHVybiAkTG9jYXRpb25JRDsKICAgIH0KfQoKPWl0ZW0gTG9jYXRpb25BZGQoKQoKYWRkIGEgbG9jYXRpb24KCiAgICBteSAkVHJ1ZSA9ICRMb2NhdGlvbk9iamVjdC0+TG9jYXRpb25BZGQoCiAgICAgICAgTmFtZSA9PiAnTG9jYXRpb24gTmFtZScsCiAgICAgICAgUGFyZW50SUQgPT4gMSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVHlwZUlEID0+IDEyMywKICAgICAgICBQaG9uZTEgPT4gJzAxMDEwMTAxJywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBQaG9uZTIgPT4gJzAxMDEwMTAxJywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBGYXggPT4gJzExMTExMjIyMjInLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBFbWFpbCA9PiAnbXlAZW1haWwuZGUnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBBZGRyZXNzID0+ICdUaGUgQWRkcmVzcycsICAjIChvcHRpb25hbCkKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgQ29tbWVudCA9PiAnQ29tbWVudCcsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExvY2F0aW9uQWRkIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhOYW1lIFR5cGVJRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBmb3JlYWNoIChxdyhQaG9uZTEgUGhvbmUyIEZheCBFbWFpbCBBZGRyZXNzIENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRQYXJhbXskX30gfHwgJyc7CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhOYW1lIFBob25lMSBQaG9uZTIgRmF4IEVtYWlsIEFkZHJlc3MgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVHlwZUlEIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgIGNob21wKCRQYXJhbXtOYW1lfSk7CiAgICAjIGNoZWNrIGxvY2F0aW9uIG5hbWUKICAgIGlmICgkUGFyYW17TmFtZX0gPX4gLzo6LykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+ICJDYW4ndCBhZGQgbG9jYXRpb24hIEludmFsaWQgTG9jYXRpb24gbmFtZSAnJFBhcmFte05hbWV9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgIyBjcmVhdGUgZnVsbCBuYW1lCiAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFBhcmFte05hbWV9OwogICAgIyBnZXQgcGFyZW50IG5hbWUKICAgIGlmICgkUGFyYW17UGFyZW50SUR9KSB7CiAgICAgICAgbXkgJFBhcmVudE5hbWUgPSAkU2VsZi0+TG9jYXRpb25Mb29rdXAoCiAgICAgICAgICAgIExvY2F0aW9uSUQgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICApOwogICAgICAgIGlmICgkUGFyZW50TmFtZSkgewogICAgICAgICAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJlbnROYW1lKSAuICc6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgfQogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17UGFyZW50SUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXtQYXJlbnRJRH0sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGZpbmQgZXhpc3RpbmcgbG9jYXRpb24KICAgIG15ICRFeGlzdHM7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGxvY2F0aW9uIFdIRVJFIG5hbWUgPSAnJFBhcmFte0Z1bGxOYW1lfSciLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwogICAgd2hpbGUgKCRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRXhpc3RzID0gMTsKICAgIH0KICAgICMgYWRkIGxvY2F0aW9uIHRvIGRhdGFiYXNlCiAgICBteSAkUmV0dXJuOwogICAgaWYgKCEkRXhpc3RzKSB7CiAgICAgICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+IklOU0VSVCBJTlRPIGxvY2F0aW9uICIuCiAgICAgICAgICAgICAgICAiKG5hbWUsIHR5cGVfaWQsIHBob25lMSwgcGhvbmUyLCBmYXgsIGVtYWlsLCBhZGRyZXNzLCB2YWxpZF9pZCwgIi4KICAgICAgICAgICAgICAgICJjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICIuCiAgICAgICAgICAgICAgICAiKCckUGFyYW17RnVsbE5hbWV9JywgJFBhcmFte1R5cGVJRH0sICckUGFyYW17UGhvbmUxfScsICckUGFyYW17UGhvbmUyfScsICckUGFyYW17RmF4fScsICIuCiAgICAgICAgICAgICAgICAiJyRQYXJhbXtFbWFpbH0nLCAnJFBhcmFte0FkZHJlc3N9JywgJFBhcmFte1ZhbGlkSUR9LCAnJFBhcmFte0NvbW1lbnR9JywgIi4KICAgICAgICAgICAgICAgICJjdXJyZW50X3RpbWVzdGFtcCwgJFBhcmFte1VzZXJJRH0sIGN1cnJlbnRfdGltZXN0YW1wLCAkUGFyYW17VXNlcklEfSkiLAogICAgICAgICkpIHsKICAgICAgICAgICAgIyBnZXQgbG9jYXRpb24gaWQKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGxvY2F0aW9uIFdIRVJFIG5hbWUgPSAnJFBhcmFte0Z1bGxOYW1lfSciLAogICAgICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJExvY2F0aW9uSUQ7CiAgICAgICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAgICAgJExvY2F0aW9uSUQgPSAkUm93WzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkTG9jYXRpb25JRDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3QgYWRkIGxvY2F0aW9uISBMb2NhdGlvbiB3aXRoIHNhbWUgbmFtZSBhbmQgcGFyZW50IGFscmVhZHkgZXhpc3RzLiIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gTG9jYXRpb25VcGRhdGUoKQoKdXBkYXRlIGEgZXhpc3RpbmcgbG9jYXRpb24KCiAgICBteSAkVHJ1ZSA9ICRMb2NhdGlvbk9iamVjdC0+TG9jYXRpb25VcGRhdGUoCiAgICAgICAgTG9jYXRpb25JRCA9PiAxMjMsCiAgICAgICAgUGFyZW50SUQgPT4gMSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSA9PiAnTG9jYXRpb24gTmFtZScsCiAgICAgICAgVHlwZUlEID0+IDEyMywKICAgICAgICBQaG9uZTEgPT4gJzAxMDEwMTAxJywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBQaG9uZTIgPT4gJzAxMDEwMTAxJywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBGYXggPT4gJzExMTExMjIyMjInLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBFbWFpbCA9PiAnbXlAZW1haWwuZGUnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBBZGRyZXNzID0+ICdUaGUgQWRkcmVzcycsICAjIChvcHRpb25hbCkKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgQ29tbWVudCA9PiAnQ29tbWVudCcsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExvY2F0aW9uVXBkYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhMb2NhdGlvbklEIE5hbWUgVHlwZUlEIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvcmVhY2ggKHF3KFBob25lMSBQaG9uZTIgRmF4IEVtYWlsIEFkZHJlc3MgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFBhcmFteyRffSB8fCAnJzsKICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KE5hbWUgUGhvbmUxIFBob25lMiBGYXggRW1haWwgQWRkcmVzcyBDb21tZW50KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhMb2NhdGlvbklEIFR5cGVJRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICBjaG9tcCgkUGFyYW17TmFtZX0pOwogICAgIyBjaGVjayBsb2NhdGlvbiBuYW1lCiAgICBpZiAoJFBhcmFte05hbWV9ID1+IC86Oi8pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3QgdXBkYXRlIGxvY2F0aW9uISBJbnZhbGlkIExvY2F0aW9uIG5hbWUgJyRQYXJhbXtOYW1lfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IG9sZCBuYW1lIG9mIGxvY2F0aW9uCiAgICBteSAkT2xkTG9jYXRpb25OYW1lID0gJFNlbGYtPkxvY2F0aW9uTG9va3VwKAogICAgICAgIExvY2F0aW9uSUQgPT4gJFBhcmFte0xvY2F0aW9uSUR9LAogICAgKTsKICAgICMgY3JlYXRlIGZ1bGwgbmFtZQogICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJhbXtOYW1lfTsKICAgICMgZ2V0IHBhcmVudCBuYW1lCiAgICBpZiAoJFBhcmFte1BhcmVudElEfSkgewogICAgICAgIG15ICRQYXJlbnROYW1lID0gJFNlbGYtPkxvY2F0aW9uTG9va3VwKAogICAgICAgICAgICBMb2NhdGlvbklEID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFBhcmVudE5hbWUpIHsKICAgICAgICAgICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyZW50TmFtZSkgLiAnOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIH0KICAgICAgICAjIGNoZWNrLCBpZiBzZWxlY3RlZCBwYXJlbnQgd2FzIGEgY2hpbGQgb2YgdGhpcyBsb2NhdGlvbgogICAgICAgIGlmICgkUGFyYW17RnVsbE5hbWV9ID1+IC9eKCRPbGRMb2NhdGlvbk5hbWUpOjovKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IHVwZGF0ZSBsb2NhdGlvbiEgSW52YWxpZCBwYXJlbnQgd2FzIHNlbGVjdGVkLiIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte1BhcmVudElEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17UGFyZW50SUR9LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBmaW5kIGV4aXN0aW5nIGxvY2F0aW9uCiAgICBteSAkRXhpc3RzOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBsb2NhdGlvbiBXSEVSRSBuYW1lID0gJyRQYXJhbXtGdWxsTmFtZX0nIiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIGlmICgkUGFyYW17TG9jYXRpb25JRH0gbmUgJFJvd1swXSkgewogICAgICAgICAgICAkRXhpc3RzID0gMTsKICAgICAgICB9CiAgICB9CiAgICAjIHVwZGF0ZSBsb2NhdGlvbgogICAgbXkgJFJldHVybjsKICAgIGlmICghJEV4aXN0cykgewogICAgICAgICMgdXBkYXRlIGxvY2F0aW9uCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBsb2NhdGlvbiBTRVQgbmFtZSA9ICckUGFyYW17RnVsbE5hbWV9JywgdHlwZV9pZCA9ICRQYXJhbXtUeXBlSUR9LCAiLgogICAgICAgICAgICAgICAgInBob25lMSA9ICckUGFyYW17UGhvbmUxfScsIHBob25lMiA9ICckUGFyYW17UGhvbmUyfScsIGZheCA9ICckUGFyYW17RmF4fScsICIuCiAgICAgICAgICAgICAgICAiZW1haWwgPSAnJFBhcmFte0VtYWlsfScsIGFkZHJlc3MgPSAnJFBhcmFte0FkZHJlc3N9JywgdmFsaWRfaWQgPSAkUGFyYW17VmFsaWRJRH0sICIuCiAgICAgICAgICAgICAgICAiY29tbWVudHMgPSAnJFBhcmFte0NvbW1lbnR9JywgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gJFBhcmFte1VzZXJJRH0gIi4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtMb2NhdGlvbklEfSIsCiAgICAgICAgKTsKICAgICAgICAjIGZpbmQgYWxsIGNoaWxkcwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIGxvY2F0aW9uIFdIRVJFIG5hbWUgTElLRSAnIi4gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRPbGRMb2NhdGlvbk5hbWUpIC4iOjolJyIsCiAgICAgICAgKTsKICAgICAgICBteSBAQ2hpbGRzOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICBteSAlQ2hpbGQ7CiAgICAgICAgICAgICRDaGlsZHtMb2NhdGlvbklEfSA9ICRSb3dbMF07CiAgICAgICAgICAgICRDaGlsZHtOYW1lfSA9ICRSb3dbMV07CiAgICAgICAgICAgIHB1c2goQENoaWxkcywgXCVDaGlsZCk7CiAgICAgICAgfQogICAgICAgICMgdXBkYXRlIGNoaWxkcwogICAgICAgIGZvcmVhY2ggbXkgJENoaWxkIChAQ2hpbGRzKSB7CiAgICAgICAgICAgICRDaGlsZC0+e05hbWV9ID1+IHMvXigkT2xkTG9jYXRpb25OYW1lKTo6LyRQYXJhbXtGdWxsTmFtZX06Oi87CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIGxvY2F0aW9uIFNFVCBuYW1lID0gJyRDaGlsZC0+e05hbWV9JyBXSEVSRSBpZCA9ICRDaGlsZC0+e0xvY2F0aW9uSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFJldHVybiA9IDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3QgdXBkYXRlIGxvY2F0aW9uISBMb2NhdGlvbiB3aXRoIHNhbWUgbmFtZSBhbmQgcGFyZW50IGFscmVhZHkgZXhpc3RzLiIKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRSZXR1cm47Cn0KCj1pdGVtIExvY2F0aW9uU2VhcmNoKCkKCnJldHVybiBhIGxvY2F0aW9uIGlkcyBhcyBhbiBhcnJheQoKICAgIG15IEBMb2NhdGlvbkxpc3QgPSAkTG9jYXRpb25PYmplY3QtPkxvY2F0aW9uU2VhcmNoKAogICAgICAgIE5hbWUgPT4gJ0xvY2F0aW9uIE5hbWUnLCAgICMgKG9wdGlvbmFsKQogICAgICAgIFR5cGVJRHMgPT4gWzEyMywgMTExXSwgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFBob25lMSA9PiAnMDEwMTAxMDEnLCAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFBob25lMiA9PiAnMDEwMTAxMDEnLCAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEZheCA9PiAnMTExMTEyMjIyMicsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEVtYWlsID0+ICdteUBlbWFpbC5kZScsICAgICMgKG9wdGlvbmFsKQogICAgICAgIEFkZHJlc3MgPT4gJ1RoZSBBZGRyZXNzJywgICMgKG9wdGlvbmFsKQogICAgICAgIExpbWl0ID0+IDEyMiwgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEwMDAKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTG9jYXRpb25TZWFyY2ggewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFVzZXJJRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICRQYXJhbXtMaW1pdH0gPSAkUGFyYW17TGltaXR9IHx8IDEwMDA7CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBsb2NhdGlvbiBXSEVSRSB2YWxpZF9pZCA9IDEgIjsKICAgIGlmICgkUGFyYW17TmFtZX0pIHsKICAgICAgICAkU1FMIC49ICJBTkQgbmFtZSBMSUtFICckUGFyYW17TmFtZX0nICI7CiAgICB9CiAgICBpZiAoJFBhcmFte1Bob25lMX0pIHsKICAgICAgICAkU1FMIC49ICJBTkQgcGhvbmUxIExJS0UgJyRQYXJhbXtQaG9uZTF9JyAiOwogICAgfQogICAgaWYgKCRQYXJhbXtQaG9uZTJ9KSB7CiAgICAgICAgJFNRTCAuPSAiQU5EIHBob25lMiBMSUtFICckUGFyYW17UGhvbmUyfScgIjsKICAgIH0KICAgIGlmICgkUGFyYW17RmF4fSkgewogICAgICAgICRTUUwgLj0gIkFORCBmYXggTElLRSAnJFBhcmFte0ZheH0nICI7CiAgICB9CiAgICBpZiAoJFBhcmFte0VtYWlsfSkgewogICAgICAgICRTUUwgLj0gIkFORCBlbWFpbCBMSUtFICckUGFyYW17RW1haWx9JyAiOwogICAgfQogICAgaWYgKCRQYXJhbXtBZGRyZXNzfSkgewogICAgICAgICRTUUwgLj0gIkFORCBhZGRyZXNzIExJS0UgJyRQYXJhbXtBZGRyZXNzfScgIjsKICAgIH0KICAgICMgYWRkIHR5cGUgaWRzCiAgICBpZiAoJFBhcmFte1R5cGVJRHN9ICYmIHJlZigkUGFyYW17VHlwZUlEc30pIGVxICdBUlJBWScgJiYgJFBhcmFte1R5cGVJRHN9LT5bMF0pIHsKICAgICAgICAkU1FMIC49ICJBTkQgdHlwZV9pZCBJTiAoIiAuIGpvaW4oJywgJywgQHskUGFyYW17VHlwZUlEc319KSAuICIpICI7CiAgICB9CiAgICAjIHNlYXJjaCBsb2NhdGlvbiBpbiBkYgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgbXkgQExvY2F0aW9uTGlzdDsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIHB1c2ggKEBMb2NhdGlvbkxpc3QsICRSb3dbMF0pOwogICAgfQogICAgcmV0dXJuIEBMb2NhdGlvbkxpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS43LjIuMiAkICREYXRlOiAyMDA3LzA4LzI3IDE0OjQwOjAxICQKCj1jdXQ= IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdDIvSVRTTUxvY2F0aW9uLnBtIC0gbGluayBiYWNrZW5kIGZvciBJVFNNTG9jYXRpb24gb2JqZWN0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Mb2NhdGlvbi5wbSx2IDEuNi4yLjEgMjAwNy8wOC8yMSAxMzowNjowNyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOjpJVFNNTG9jYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNi4yLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDI6OklUU01Mb2NhdGlvbiAtIGxpbmsgYmFja2VuZCBmb3IgSVRTTUxvY2F0aW9uIG9iamVjdAoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGxpbmsgSVRTTUxvY2F0aW9uIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgJFNlbGYtPntMb2NhdGlvbk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE9iamVjdE92ZXJ2aWV3R2V0KCkKCnJldHVybiBhIGFycmF5IGhhc2ggcmVmZXJlbmNlIG9mIG9iamVjdCBvdmVydmlldyBkYXRhCgogICAgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPk9iamVjdE92ZXJ2aWV3R2V0KAogICAgICAgIEtleSA9PiAnMTIzJywKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0T3ZlcnZpZXdHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBmb3JlYWNoIChxdyhLZXkpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGdldCBsb2NhdGlvbgogICAgbXkgJUxvY2F0aW9uID0gJFNlbGYtPntMb2NhdGlvbk9iamVjdH0tPkxvY2F0aW9uR2V0KAogICAgICAgIExvY2F0aW9uSUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgIyBnZXQgdHlwZSBsaXN0CiAgICBteSAkVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkxvY2F0aW9uOjpUeXBlJywKICAgICk7CiAgICAjIG92ZXJ2aWV3IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnTG9jYXRpb24nLAogICAgICAgICAgICBDb250ZW50ID0+ICRMb2NhdGlvbntOYW1lfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIENvbnRlbnQgPT4gJFR5cGVMaXN0LT57JExvY2F0aW9ue1R5cGVJRH19LAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICdQaG9uZSAxJywKICAgICAgICAgICAgQ29udGVudCA9PiAkTG9jYXRpb257UGhvbmUxfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnRS1NYWlsJywKICAgICAgICAgICAgQ29udGVudCA9PiAkTG9jYXRpb257RW1haWx9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICdBZGRyZXNzJywKICAgICAgICAgICAgQ29udGVudCA9PiAkTG9jYXRpb257QWRkcmVzc30sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRPYmplY3REYXRhOwp9Cgo9aXRlbSBDbGFzc05hbWVHZXQoKQoKcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MKCiAgICAkQ2xhc3NOYW1lID0gJExpbmtPYmplY3QyLT5DbGFzc05hbWVHZXQoKTsKCj1jdXQKCnN1YiBDbGFzc05hbWVHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRDbGFzc05hbWUgPSAnTG9jYXRpb24nOwoKICAgIHJldHVybiAkQ2xhc3NOYW1lOwp9Cgo9aXRlbSBQYXJ0bmVyTGlua0RhdGFBZGQoKQoKYWRkIGl0ZW0gZGF0YSB0byBpdGVtIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJFRydWUgPSAkTGlua09iamVjdDItPlBhcnRuZXJMaW5rRGF0YUFkZCgKICAgICAgICBJdGVtID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBQYXJ0bmVyTGlua0RhdGFBZGQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBmb3JlYWNoIChxdyhJdGVtKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17SXRlbX0pIG5lICdIQVNIJykgewogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IGxvY2F0aW9uCiAgICBteSAlTG9jYXRpb24gPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25HZXQoCiAgICAgICAgTG9jYXRpb25JRCA9PiAkUGFyYW17SXRlbX0tPntQYXJ0bmVyS2V5fSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBpZiAoJUxvY2F0aW9uKSB7CiAgICAgICAgIyBzZXQgYmxvY2sgbmFtZXMKICAgICAgICAkUGFyYW17SXRlbX0tPntCbG9ja25hbWUxfSA9ICRTZWxmLT5DbGFzc05hbWVHZXQoKTsKICAgICAgICAkUGFyYW17SXRlbX0tPntCbG9ja25hbWUyfSA9ICcnOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0RhdGF9ID0gXCVMb2NhdGlvbjsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybjsKfQoKPWl0ZW0gUGFydG5lclRhYmxlQ29sdW1uR2V0KCkKCnJldHVybnMgYSBhcnJheSBoYXNoIHJlZmVyZW5jZSB3aXRoIGNvbHVtbiBkYXRhCgogICAgJEFycmF5UmVmID0gJExpbmtPYmplY3QyLT5QYXJ0bmVyVGFibGVDb2x1bW5HZXQoKTsKCj1jdXQKCnN1YiBQYXJ0bmVyVGFibGVDb2x1bW5HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHRhYmxlIGNvbHVtbiBEYXRhCiAgICBteSAkVGFibGVDb2x1bW5EYXRhID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgSGVhZGxpbmUgPT4gJ05hbWUnLAogICAgICAgICAgICBUeXBlID0+ICdMaW5rJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVHlwZSA9PiAnWm9vbScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEhUTUxPdXRwdXQgPT4gewogICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIEhlYWRsaW5lID0+ICdUeXBlJywKICAgICAgICAgICAgVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpMb2NhdGlvbjo6VHlwZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEhUTUxPdXRwdXQgPT4gewogICAgICAgICAgICAgICAgVGFibGVXaWR0aCA9PiAxMDAsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1Bob25lMScsCiAgICAgICAgICAgIEhlYWRsaW5lID0+ICdQaG9uZSAxJywKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIEhUTUxPdXRwdXQgPT4gewogICAgICAgICAgICAgICAgVGFibGVXaWR0aCA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnRW1haWwnLAogICAgICAgICAgICBIZWFkbGluZSA9PiAnRS1NYWlsJywKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIEhUTUxPdXRwdXQgPT4gewogICAgICAgICAgICAgICAgVGFibGVXaWR0aCA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnQ2hhbmdlVGltZScsCiAgICAgICAgICAgIEhlYWRsaW5lID0+ICdMYXN0IENoYW5nZScsCiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGVUaW1lJywKICAgICAgICAgICAgSFRNTE91dHB1dCA9PiB7CiAgICAgICAgICAgICAgICBUYWJsZVdpZHRoID0+IDE1MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJFRhYmxlQ29sdW1uRGF0YTsKfQoKPWl0ZW0gUGFydG5lck9iamVjdExpc3QoKQoKcmV0dXJucyBhIGFycmF5IGhhc2ggcmVmZXJlbmNlIHdpdGggY2xhc3MgYW5kIHN1YmNsYXNzZXMKCiAgICAkQXJyYXlIYXNoUmVmID0gJExpbmtPYmplY3QyLT5QYXJ0bmVyT2JqZWN0TGlzdCgKICAgICAgICBTZWxlY3RlZEtleSA9PiAnVGlja2V0JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBQYXJ0bmVyT2JqZWN0TGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIG1haW4gb2JqZWN0CiAgICBteSAkUGFydG5lck9iamVjdExpc3QgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0lUU01Mb2NhdGlvbicsCiAgICAgICAgICAgIFZhbHVlID0+ICdMb2NhdGlvbicsCiAgICAgICAgfSwKICAgIF07CiAgICAjIGFkZCBzZWxlY3RlZAogICAgaWYgKCRQYXJhbXtTZWxlY3RlZEtleX0gJiYgJFBhcmFte1NlbGVjdGVkS2V5fSBlcSAnSVRTTUxvY2F0aW9uJykgewogICAgICAgICRQYXJ0bmVyT2JqZWN0TGlzdC0+WzBdLT57U2VsZWN0ZWR9ID0gMTsKICAgIH0KICAgIHJldHVybiAkUGFydG5lck9iamVjdExpc3Q7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZUxpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBzZWFyY2ggYXR0cmlidXRlcyBhcyBhcnJheSBoYXNoIHJlZmVyZW5jZQoKICAgICRBcnJheUhhc2hSZWYgPSAkTGlua09iamVjdDItPlNlYXJjaEF0dHJpYnV0ZUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0xvY2F0aW9uJywKICAgICAgICBPYmplY3QgPT4gJ0xvY2F0aW9uJywKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoQXR0cmlidXRlTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGZvcmVhY2ggKHF3KENsYXNzIE9iamVjdCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgc2VhcmNoIGF0dHJpYnV0ZXMKICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgTmFtZSA9PiAnTG9jYXRpb24nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUeXBlSURzJywKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpMb2NhdGlvbjo6VHlwZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1Bob25lMScsCiAgICAgICAgICAgIE5hbWUgPT4gJ1Bob25lIDEnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdFbWFpbCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ0UtTWFpbCcsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FkZHJlc3MnLAogICAgICAgICAgICBOYW1lID0+ICdBZGRyZXNzJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRTZWFyY2hBdHRyaWJ1dGVMaXN0Owp9Cgo9aXRlbSBQYXJ0bmVyT2JqZWN0U2VhcmNoKCkKCnJldHVybiBhIGxpc3Qgb2Ygc2VhcmNoIHJlc3VsdCBpZHMgYXMgYXJyYXkgaGFzaCByZWZlcmVuY2UKCiAgICAkQXJyYXlIYXNoUmVmID0gJExpbmtPYmplY3QyLT5QYXJ0bmVyT2JqZWN0U2VhcmNoKAogICAgICAgIEZvcm1EYXRhID0+ICRGb3JtRGF0YVJlZiwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUGFydG5lck9iamVjdFNlYXJjaCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGZvcmVhY2ggKHF3KEZvcm1EYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgc2VhcmNoIGxvY2F0aW9ucwogICAgbXkgQFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57TG9jYXRpb25PYmplY3R9LT5Mb2NhdGlvblNlYXJjaCgKICAgICAgICAleyRQYXJhbXtGb3JtRGF0YX19LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFxAU2VhcmNoUmVzdWx0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNi4yLjEgJCAkRGF0ZTogMjAwNy8wOC8yMSAxMzowNjowNyAkCgo9Y3V0 IyAtLQojIElUU01Mb2NhdGlvbi50IC0gTG9jYXRpb24gdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUxvY2F0aW9uLnQsdiAxLjEuMi4yIDIwMDcvMDgvMjEgMTQ6MzU6NDcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbjsKCiRTZWxmLT57TG9jYXRpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbi0+bmV3KCV7JFNlbGZ9KTsKCm15ICRMb2NhdGlvblJhbmQgPSAnU29tZUxvY2F0aW9uJy5pbnQocmFuZCgxMDAwMDAwKSk7Cm15ICRMb2NhdGlvbklEID0gJFNlbGYtPntMb2NhdGlvbk9iamVjdH0tPkxvY2F0aW9uQWRkKAogICAgTmFtZSA9PiAkTG9jYXRpb25SYW5kLAogICAgVHlwZUlEID0+IDEyMywKICAgIENvbW1lbnQgPT4gJ1NvbWUgQ29tbWVudCcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJExvY2F0aW9uSUQsCiAgICAnTG9jYXRpb25BZGQoKScsCik7CgpteSAlTG9jYXRpb25HZXQgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25HZXQoCiAgICBMb2NhdGlvbklEID0+ICRMb2NhdGlvbklELAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+SXMoCiAgICAkTG9jYXRpb25HZXR7TmFtZX0gfHwgJycsCiAgICAkTG9jYXRpb25SYW5kLAogICAgJ0xvY2F0aW9uR2V0KCkgLSBOYW1lJywKKTsKJFNlbGYtPklzKAogICAgJExvY2F0aW9uR2V0e1ZhbGlkSUR9IHx8ICcnLAogICAgMSwKICAgICdMb2NhdGlvbkdldCgpIC0gVmFsaWRJRCcsCik7CiRTZWxmLT5JcygKICAgICRMb2NhdGlvbkdldHtDb21tZW50fSB8fCAnJywKICAgICdTb21lIENvbW1lbnQnLAogICAgJ0xvY2F0aW9uR2V0KCkgLSBDb21tZW50JywKKTsKCm15ICRMb2NhdGlvblVwZGF0ZSA9ICRTZWxmLT57TG9jYXRpb25PYmplY3R9LT5Mb2NhdGlvblVwZGF0ZSgKICAgIExvY2F0aW9uSUQgPT4gJExvY2F0aW9uSUQsCiAgICBOYW1lID0+ICRMb2NhdGlvblJhbmQuIjEiLAogICAgVHlwZUlEID0+IDEyMywKICAgIFZhbGlkSUQgPT4gMiwKICAgIFVzZXJJRCA9PiAxLAogICAgQ29tbWVudCA9PiAnU29tZSBDb21tZW50MScsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRMb2NhdGlvblVwZGF0ZSwKICAgICdMb2NhdGlvblVwZGF0ZSgpJywKKTsKCiVMb2NhdGlvbkdldCA9ICRTZWxmLT57TG9jYXRpb25PYmplY3R9LT5Mb2NhdGlvbkdldCgKICAgIExvY2F0aW9uSUQgPT4gJExvY2F0aW9uSUQsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5JcygKICAgICRMb2NhdGlvbkdldHtOYW1lfSB8fCAnJywKICAgICRMb2NhdGlvblJhbmQuIjEiLAogICAgJ0xvY2F0aW9uR2V0KCkgLSBOYW1lJywKKTsKJFNlbGYtPklzKAogICAgJExvY2F0aW9uR2V0e1ZhbGlkSUR9IHx8ICcnLAogICAgMiwKICAgICdMb2NhdGlvbkdldCgpIC0gVmFsaWRJRCcsCik7CiRTZWxmLT5JcygKICAgICRMb2NhdGlvbkdldHtDb21tZW50fSB8fCAnJywKICAgICdTb21lIENvbW1lbnQxJywKICAgICdMb2NhdGlvbkdldCgpIC0gQ29tbWVudCcsCik7CgpteSAkTG9jYXRpb25JRDIgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25BZGQoCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb2NhdGlvbklEMiwKICAgICdMb2NhdGlvbkFkZDIoKScsCik7CgpteSAkTG9jYXRpb25SYW5kMyA9ICdTb21lTG9jYXRpb24nLmludChyYW5kKDEwMDAwMDApKTsKbXkgJExvY2F0aW9uSUQzID0gJFNlbGYtPntMb2NhdGlvbk9iamVjdH0tPkxvY2F0aW9uQWRkKAogICAgTmFtZSA9PiAkTG9jYXRpb25SYW5kMywKICAgIFR5cGVJRCA9PiAxMjMsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJExvY2F0aW9uSUQzLAogICAgJ0xvY2F0aW9uQWRkMygpJywKKTsKCm15ICRMb2NhdGlvblVwZGF0ZTIgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25VcGRhdGUoCiAgICBMb2NhdGlvbklEID0+ICRMb2NhdGlvbklEMywKICAgIFZhbGlkSUQgPT4gMiwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvY2F0aW9uVXBkYXRlMiwKICAgICdMb2NhdGlvblVwZGF0ZTIoKScsCik7CgpteSAkTG9jYXRpb25VcGRhdGUzID0gJFNlbGYtPntMb2NhdGlvbk9iamVjdH0tPkxvY2F0aW9uVXBkYXRlKAogICAgTG9jYXRpb25JRCA9PiAkTG9jYXRpb25JRDMsCiAgICBOYW1lID0+ICRMb2NhdGlvblJhbmQzLiIxIiwKICAgIFR5cGVJRCA9PiAxMjMsCiAgICBWYWxpZElEID0+IDIsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJExvY2F0aW9uVXBkYXRlMywKICAgICdMb2NhdGlvblVwZGF0ZTMoKScsCik7CgoxOw== iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAANjr9RwUqgAAACBjSFJNAABtmAAAc44AAPJxAACDbAAAg7sAANTIAAAx7AAAGbyeiMU/AAAFGUlEQVR42qyUTWxcVxXHf/d9zrz5cjxjO544SZO0MbGapCBY0OAFFSpSpUZCsEIVoiwqFkWISrBBRWLFBiEEZIEqREUbCapAoqSlagrUbdXEqWKniZ20/sjY49jj8Yxnxp6Z92bmfdzLwiQCStoN/9W9V+f8z9XROT+DT5Qm0PtH6N+7J5MdHmx1AiGbtSpeaY3e5hqE4f0yjf/9PDBsH33ymSdOnvzayN6Rhx4ZzTtj+3ZxbWmLUs1ltVzrXptdWv5oauJ8b+bcKYLyCp+mg+Pf+cGPfz9VuXC9qUKlVLUVqIlbm+rs+2tqdrWlrszX1eR8Xc2suurPVxvq+Zeu10ZOfPenYFj3sdTtx77985eqnrqn5Y22+tO7RfXWrZqa+LCu/n6rpv52vaJOv72iLlwt3YureEqdePrUq2DG77ndPTz+9M9ePPvCD5/qs3fuxarL+akyW12JYZpIIfAj6ASSPlvnyL40V283KFZdhlIG3zz5xcNvFpLHy7NvvAIoAWCNfOnrM1NvnTk8aDBfaiEVXCk0kbpBwjZQKJTaKRhKyDoa44fSdEPJjeI2Xjfk84d24SmTz41/43vbt879Rgf05Phzv0sN5EfyaZ0rhSaX5mqkkjGEbtCJIJSCUAl8KTB1ja+O9ZGM6Ti2zoHBBIfzKba8gP1Zi7oYGL3015df0LCHDh0+evyY1AS/nSjRaPkcGUkT+AGGULRDgSs1OpGgozR6EWhKfnyO0jaT83WC+O6DOAe/YODkRp10X1wCyUyCO11JfwTPPLYPCSxs+rxT7FFvdNBlRLMb8Is3tklbcGjI4YnPDgFgmxq7MzYf1aQQffnPaJou7A1XMln0WN0O8YVBIhHbWQ9gNGfxreNJHh3to2vGUApCH1abgslSRKMdAKCU4rlXbnNzM8CKm5YhNE2ZpknTh4V6SCY0KU43SWgRjx/N7fzGECxWungND93toABdKnQVIjQBQMMNefTIAJm+gD+clkKTocQ0DeIxk3jMRNN1pJNiumnf69/Z6SpTLZswmaKrW7QTGRqZAZZ8i/XtHgAvX6nQ6XRxOxFSSmmodmXdqzei3fn9uhBg2SbCsshn44Di4o1N/rEcMHxARzPT+CkLz4wRBaASaU5fq7LvZpULCxE9CfUNF1rlsoZfmV+dmV5xnASmZWCYBoZlMBiDy/NbnF/XGR0bYjChMeBALhujPwZJE9KOwe0gyV9KMZxMkuGhLNW52TqtwjUd8Pymmxd7xk8cOzpMqMC0LeI9l6YfkdmTJZfQyDiCuAmGttOeSIEvBWgalqnTn7JYnKux+PqpM7I28+LOSndWC9VW/5Nm7sFdx8eyWLbBnbZko+Ex9kCKbBxyMXBM0DRA7BRo9gChkUtqFG43+ODN16ru+79+FhmW/sUK1aAxu7zmDX3FtwYTDx9I8NDeOA/0x/E2t9hjRoymTfIxgRGEuPUWmtsmMgxsLWLqRoUPJ991q68//2zk1S/+B4SIOnOUL89su/ojK15uMAgEGcfE1ATbPUUvZtMWgoXNiFIzZKNnsrDWZvpmmTuT55eK537yfX+r9MeP0W3HvLfor7z3Tq+yqNVaane5bafbvkMYxmg3dVbWFcWKz1LNZ355neWZS9XCq788U3jtVz8KO62L/24l7gNnCzjmDB748sDD4yf69j64P5ZIJExDAxl0mqXCyp3pictbxbm3lVJTQPe/DQSfLgfIAHch3gW2AfeTkoS6C9r/s/45AM8abwE55dPUAAAAAElFTkSuQmCC ITSM::Location::Type Building 1 current_timestamp 1 current_timestamp 1 ITSM::Location::Type Office 1 current_timestamp 1 current_timestamp 1 ITSM::Location::Type Floor 1 current_timestamp 1 current_timestamp 1 ITSM::Location::Type Room 1 current_timestamp 1 current_timestamp 1 ITSM::Location::Type Rack 1 current_timestamp 1 current_timestamp 1 ITSM::Location::Type Workplace 1 current_timestamp 1 current_timestamp 1 ITSM::Location::Type Outlet 1 current_timestamp 1 current_timestamp 1 ITSM::Location::Type IT Facility 1 current_timestamp 1 current_timestamp 1 ITSM::Location::Type Other 1 current_timestamp 1 current_timestamp 1