Fred
0.2.7
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Fixed some little bugs.
Insert the config log function.
Insert the DProf profiling function.
Insert the translation debug log.
Improved the handling of the profiler.
Insert a profiling function.
Improved the package settings.
First modular version.
Remove modperl reload informations from the fred log.
Added Database::SlowLog feature.
Improved the config description.
No longer crashes if HTML::Lint is not installed but HTML-checker is active.
Improved output.
First version especially for testing and as proof of concept.
A tool to support the developer by his development.
Ein Entwicklertool welches dem Entwickler zur Laufzeit bei der Entwicklung unterstützen soll.
2.2.x
2.3.x
2007-09-26 15:00:56
opms.otrs.com
IyAtLQojIEFBQUZyZWQucG0gLSB0aGUgY29uZmlnIHRvIGJpbmQgU1RERVJSIHRvIGFuIGxvZyBmaWxlIHVzYWJsZSBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBQUFGcmVkLnBtLHYgMS43IDIwMDcvMDkvMjYgMTA6MDI6NTggbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgppZiAoJEVOVntIVFRQX1VTRVJfQUdFTlR9KSB7CgogICAgIyBjaGVjayBpZiB0aGUgbmVlZGVkIHBhdGggaXMgYXZhaWxhYmxlCiAgICBteSAkUGF0aCA9ICRTZWxmLT57SG9tZX0gLiAnL3Zhci9mcmVkJzsKICAgIGlmICghLWUgJFBhdGgpIHsKICAgICAgICBta2RpciAkUGF0aDsKICAgIH0KCiAgICBteSAkRmlsZSA9ICRTZWxmLT57SG9tZX0gLiAnL3Zhci9mcmVkL1NUREVSUi5sb2cnOwoKICAgICMgY2hlY2sgbG9nIGZpbGUgc2l6ZQogICAgaWYgKCAtcyAkRmlsZSA+IDIwICogMTAyNCAqIDEwMjQgKSB7CiAgICAgICAgdW5saW5rICRGaWxlOwogICAgfQoKICAgICMgbW92ZSBTVERPVVQgdG8gdG1wIGZpbGUKICAgIGlmICggIW9wZW4gU1RERVJSLCAnPj4nLCAkRmlsZSApIHsKICAgICAgICBwcmludCBTVERFUlIgIkVSUk9SOiBDYW4ndCB3cml0ZSAkRmlsZSEiOwogICAgfQp9CgoxOw==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEZyZWQueG1sLHYgMS4xNCAyMDA3LzA5LzI2IDExOjI5OjUxIG1oIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50IyMjRnJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlN1YnNjcmliZSB0aGUgb3V0cHV0IGZpbHRlciBhdCB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NZWxkZXQgZGVuIE91dHB1dEZpbHRlckZyZWQgYW0gU3lzdGVtIGFuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlYnVnIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjQ29uc29sZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBmcmVkIGNvbnNvbGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiwgd2VubiBtYW4gZGllIEZyZWQtQ29uc29sZSBudXR6ZW4gbfZjaHRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI1NtYWxsUHJvZiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBTbWFsbFByb2YgcHJvZmlsaW5nIGZ1bmN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4sIHdlbm4gbWFuIGRpZSBTbWFsbFByb2YtUHJvZmlsaW5nIEZ1bmt0aW9uIG51dHplbiBt9mNodGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjRFByb2YiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgRFByb2YgcHJvZmlsaW5nIGZ1bmN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4sIHdlbm4gbWFuIGRpZSBEUHJvZi1Qcm9maWxpbmcgRnVua3Rpb24gbnV0emVuIG32Y2h0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNTUUxMb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IGFuIHJlYWx0aW1lIFNRTCBzdGF0ZW1lbnQgbG9nIGZ1bmN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4sIHdlbm4genVyIExhdWZ6ZWl0IGRlciBTUUwtU3RhdGVtZW50LUxvZ2dlciBnZW51dHp0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI0hUTUxDaGVjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgYW4gcmVhbHRpbWUgSFRNTC1jaGVja2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4gd2VubiB6dXIgTGF1ZnplaXQgZWluIEhUTUwtQ2hlY2tlciBhdXNnZWb8aHJ0IHdlcmRlbiBzb2xsLiBXSUNIVElHOiBEYXMgQ3Bhbi1Nb2R1bCBIVE1MOjpsaW50IGlzdCBoaWVyZvxyIG5vdHdlbmRpZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNUcmFuc2xhdGlvbkRlYnVnIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0aGUgdHJhbnNsYXRpb24gZGVidWdnZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiB3ZW5uIHp1ciBMYXVmemVpdCBkZXIg3GJlcnNldHp1bmdzZGVidWdnZXIgZ2VudXR6dCB3ZXJkZW4gc29sbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNDb25maWdMb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgY29uZmlnIGxvZyBtZWNoYW5pc20uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiwgd2VubiBtYW4genVyIExhdWZ6ZWl0IENvbmlnLUxvZ21lY2hhbmlzbXVzIG51dHplbiB3aWxsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI1NUREVSUkxvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBTVERFUlJMb2cuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiB3ZW5uIG1hbiB6dXIgTGF1ZnplaXQgZGFzIFNUREVSUkxvZyBzZWhlbiB3aWxsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNEZXZlbEZyZWQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgZGV2ZWwgZnJlZCBvYmplY3QgaW4gdGhlIGFkbWluIGFyZWEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBFbnR3aWNrbGVyLU9iamVrdHMgRnJlZCBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDwhLS0gPEdyb3VwPmFkbWluPC9Hcm91cD4gLS0+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkZyZWQtRGV2ZWxvcGVydG9vbHM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RnJlZDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2s0PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45OTk8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpTbWFsbFByb2YjIyNTaG93bkxpbmVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGVyZSB5b3UgY2FuIGluc2VydCB0aGUgbnVtYmVyIG9mIHNob3duIHByb2ZpbGluZyBsaW5lcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBrYW5uIGRpZSBBbnphaGwgZGVyIGFuZ2V6ZWlndGVuIGF1c2dld2VydGV0ZW4gWmVpbGVuIGFuZ2VnZWJlbiB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlNtYWxsUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpTbWFsbFByb2YjIyNPcmRlckJ5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V2hpY2ggb3JkZXIgc2hvdWxkIHRoZSBwcm9maWxpbmcgZGF0YSBoYXZlPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYWNoIHdlbGNoZXIgUmVpaGVuZm9sZ2Ugc29sbGVuIGRpZSBQcm9maWxpbmdkYXRlbiBnZW9yZG5ldCB3ZXJkZW4/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlNtYWxsUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iNCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPkxpbmU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPkNhbGxzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj5UaW1lIGV4ZWN1dGluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+VGltZSBleHBlbmRlZDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6U21hbGxQcm9mIyMjUGFja2FnZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5DaGVjayBvbmx5IHRoZSBmb2xsb3dpbmcgcGFja2FnZXMgaW4gU21hbGxQcm9mLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FcyBzb2xsZW4gbnVyIGZvbGdlbmRlIFBhY2thZ2VzIHZvbiBTbWFsbFByb2YgZ2VwcvxmdCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlNtYWxsUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6RFByb2YjIyNTaG93bkxpbmVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGVyZSB5b3UgY2FuIGluc2VydCB0aGUgbnVtYmVyIG9mIHNob3duIHByb2ZpbGluZyBmdW5jdGlvbnMgKG1heCA0MCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga2FubiBkaWUgQW56YWhsIGRlciBhbmdlemVpZ3RlbiBhdXNnZXdlcnRldGVuIEZ1bmt0aW9uZW4gYW5nZWdlYmVuIHdlcmRlbiAobWF4aW1hbCA0MCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkRQcm9mPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4xNTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkRQcm9mIyMjT3JkZXJCeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPldoaWNoIG9yZGVyIHNob3VsZCB0aGUgcHJvZmlsaW5nIGRhdGEgaGF2ZT88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFjaCB3ZWxjaGVyIFJlaWhlbmZvbGdlIHNvbGxlbiBkaWUgUHJvZmlsaW5nZGF0ZW4gZ2VvcmRuZXQgd2VyZGVuPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5EUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iVGltZSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPk5hbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhbGxzIj5DYWxsczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGltZSI+RXhjbFRpbWU8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkRQcm9mIyMjRnVuY3Rpb25UcmVlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB0aGUgZnVuY3Rpb24gdHJlZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+WmVpZ2UgZGVuIEZ1bmt0aW9uc2JhdW0uIEVzIHplaWd0IGRpZSBBYmZvbGdlIHVuZCDEYmjkbmdpZ2tlaXQgaW4gd2VsY2hlciBkaWUgRnVua3Rpb25lbiBhdWZnZXJ1ZmVuIHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0RldmVsRnJlZC5wbSAtIGEgc3BlY2lhbCBkZXZlbG9wZXIgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZC5wbSx2IDEuNSAyMDA3LzA5LzI2IDEyOjA3OjIyIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkRldmVsRnJlZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjUgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiN1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgICMgY2hlY2sgbmVlZGVkIE9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdygKICAgICAgICBQYXJhbU9iamVjdCBEQk9iamVjdCAgICAgTG9nT2JqZWN0IENvbmZpZ09iamVjdAogICAgICAgIE1haW5PYmplY3QgIExheW91dE9iamVjdCBUaW1lT2JqZWN0CiAgICApKSB7CiAgICAgICAgaWYgKCRQYXJhbXskT2JqZWN0fSkgewogICAgICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIpOwogICAgICAgIH0KICAgIH0KIyAgICAkU2VsZi0+e1hNTE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoJXskU2VsZn0pOwogICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDb25maWctPm5ldygleyRTZWxmfSk7CiAgICAkU2VsZi0+e0ZyZWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU3ViYWN0aW9uJyk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgdGhlIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCEkU2VsZi0+e1N1YmFjdGlvbn0pIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiU29ycnksIHRoaXMgc2lkZSBpcyBjdXJyZW50bHkgdW5kZXIgZGV2ZWxvcG1lbnQhIik7CiAgICB9CiMgICAgICAgIG15ICRPdXRwdXQgICA9ICcnOwojCiMgICAgICAgIG15IEBUcmFuc2xhdGlvbldoaXRlTGlzdCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKIyAgICAgICAgICAgIFR5cGUgPT4gJ0ZyZWQtVHJhbnNsYXRpb24nLAojICAgICAgICAgICAgS2V5ICA9PiAxLAojICAgICAgICAgICAgQ2FjaGUgPT4gMCwKIyAgICAgICAgKTsKIwojICAgICAgICBteSAlV2hpdGVMaXN0OwojICAgICAgICBmb3IgbXkgJENvbnRlbnQgKEB7JFRyYW5zbGF0aW9uV2hpdGVMaXN0WzFde1RyYW5zbGF0aW9ufX0pIHsKIyAgICAgICAgICAgIGlmICgkQ29udGVudC0+e0NvbnRlbnR9KSB7CiMgICAgICAgICAgICAgICAgIyBhZGQgYWRkIGJsb2NrCiMgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKIyAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluZScsCiMgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewojICAgICAgICAgICAgICAgICAgICAgICAgV29yZCA9PiAkQ29udGVudC0+e0NvbnRlbnR9LAojICAgICAgICAgICAgICAgICAgICB9LAojICAgICAgICAgICAgICAgICk7CiMgICAgICAgICAgICB9CiMgICAgICAgIH0KIwojICAgICAgICAjIGJ1aWxkIG91dHB1dAojICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICJGcmVkLU92ZXJ2aWV3Iik7CiMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiMgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAojICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWQnLAojICAgICAgICApOwojICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiMgICAgICAgIHJldHVybiAkT3V0cHV0OwojICAgIH0KIyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojICAgICMgaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBsb2cKIyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RyYW5zbGF0aW9uJykgewojICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ZhbHVlJyk7CiMKIyAgICAgICAgbXkgQERhdGEgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hHZXQoCiMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKIyAgICAgICAgICAgIEtleSAgPT4gMSwKIyAgICAgICAgICAgIENhY2hlID0+IDAsCiMgICAgICAgICk7CiMKIyAgICAgICAgaWYgKCFARGF0YSkgewojICAgICAgICAgICAgbXkgQEhhc2g7CiMKIyAgICAgICAgICAgICRIYXNoWzFde1RyYW5zbGF0aW9ufVsxXXtDb250ZW50fSA9ICRWYWx1ZTsKIyAgICAgICAgICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEFkZCgKIyAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKIyAgICAgICAgICAgICAgICBLZXkgICAgID0+IDEsCiMgICAgICAgICAgICAgICAgWE1MSGFzaCA9PiBcQEhhc2gsCiMgICAgICAgICAgICApOwojICAgICAgICB9CiMgICAgICAgIGVsc2UgewojICAgICAgICAgICAgcHVzaCBAeyREYXRhWzFde1RyYW5zbGF0aW9ufX0sIHtDb250ZW50ID0+ICRWYWx1ZX07CiMgICAgICAgICAgICAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hVcGRhdGUoCiMgICAgICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiMgICAgICAgICAgICAgICAgS2V5ID0+ICcxJywKIyAgICAgICAgICAgICAgICBYTUxIYXNoID0+IFxARGF0YSwKIyAgICAgICAgICAgICk7CiMKIyAgICAgICAgfQojCiMgICAgICAgIG15ICRSZWZlcmVyID0gJEVOVntIVFRQX1JFRkVSRVJ9OwojICAgICAgICBpZiAoJFJlZmVyZXIgPX4gL1w/KC4rKSQvKSB7CiMgICAgICAgICAgICAkUmVmZXJlciA9ICQxOwojICAgICAgICB9CiMKIyAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFJlZmVyZXIpOwojICAgIH0KIyAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdUcmFuc2xhdGlvbkRlbGV0ZScpIHsKIyAgICAgICAgbXkgQERhdGEgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hEZWxldGUoCiMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKIyAgICAgICAgICAgIEtleSAgPT4gMSwKIyAgICAgICAgKTsKIwojICAgICAgICBteSAkUmVmZXJlciA9ICRFTlZ7SFRUUF9SRUZFUkVSfTsKIyAgICAgICAgaWYgKCRSZWZlcmVyID1+IC9cPyguKykkLykgewojICAgICAgICAgICAgJFJlZmVyZXIgPSAkMTsKIyAgICAgICAgfQojCiMgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICRSZWZlcmVyKTsKIyAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBmYXN0IGhhbmRsZSBmb3IgZnJlZCBzZXR0aW5ncwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NldHRpbmcnKSB7CiAgICAgICAgbXkgJE1vZHVsZUZvclJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpNb2R1bGUnKTsKICAgICAgICBkZWxldGUgJE1vZHVsZUZvclJlZi0+e0NvbnNvbGV9OwogICAgICAgIGZvciBteSAkTW9kdWxlIChrZXlzICV7JE1vZHVsZUZvclJlZn0pIHsKICAgICAgICAgICAgbXkgJENoZWNrZWQgPSAnJzsKICAgICAgICAgICAgaWYgKCRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0pIHsKICAgICAgICAgICAgICAgICRDaGVja2VkID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZyZWRNb2R1bGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRnJlZE1vZHVsZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIENoZWNrZWQgICAgPT4gJENoZWNrZWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkZyZWQ6OiRNb2R1bGUiKSkgewoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICJGcmVkLVNldHRpbmciKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNldHRpbmcnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBmYXN0IGhhbmRsZSBmb3IgZnJlZCBzZXR0aW5ncwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NldHRpbmdBY3Rpb24nKSB7CiAgICAgICAgbXkgJE1vZHVsZUZvclJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpNb2R1bGUnKTsKICAgICAgICBteSBAU2VsZWN0ZWRGcmVkTW9kdWxlcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAnRnJlZE1vZHVsZScpOwogICAgICAgIG15ICVTZWxlY3RlZE1vZHVsZXMgPSBtYXAgeyAkXyA9PiAxOyB9IEBTZWxlY3RlZEZyZWRNb2R1bGVzOwogICAgICAgIG15ICRVcGRhdGVGbGFnOwogICAgICAgIGRlbGV0ZSAkTW9kdWxlRm9yUmVmLT57Q29uc29sZX07CgogICAgICAgIGZvciBteSAkTW9kdWxlIChrZXlzICV7JE1vZHVsZUZvclJlZn0pIHsKICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHN5c2NvbmZpZyBzZXR0aW5ncwogICAgICAgICAgICBpZiAoJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAhJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfSB8fAogICAgICAgICAgICAgICAgISRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gJiYgJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnVG9vbE9iamVjdH0tPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gIkZyZWQ6Ok1vZHVsZSMjIyRNb2R1bGUiLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGl2ZScgPT4gJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAjICdNb2R1bGUnID0+ICRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRVcGRhdGVGbGFnID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhY3RpdmUgZnJlZCBtb2R1bGUgdG9kb3MKICAgICAgICAgICAgaWYgKCEkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICYmICRTZWxlY3RlZE1vZHVsZXN7JE1vZHVsZX0pIHsKICAgICAgICAgICAgICAgICMgRklYTUUgRXJyb3JoYW5kbGluZyEKICAgICAgICAgICAgICAgICRTZWxmLT57RnJlZE9iamVjdH0tPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkZWFjdGl2YXRlIGZyZWRtb2R1bGUgdG9kb3MKICAgICAgICAgICAgaWYgKCRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gJiYgISRTZWxlY3RlZE1vZHVsZXN7JE1vZHVsZX0pIHsKICAgICAgICAgICAgICAgICMgRklYTUUgRXJyb3JoYW5kbGluZyEKICAgICAgICAgICAgICAgICRTZWxmLT57RnJlZE9iamVjdH0tPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgdGhpcyBmdW5jdGlvbiBpcyBuZXNlY2NhcnkgdG8gZmluaXNoIHRoZSBzeXNjb25maWcgdXBkYXRlCiAgICAgICAgaWYgKCRVcGRhdGVGbGFnKSB7CiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnVG9vbE9iamVjdH0tPkNvbmZpZ0l0ZW1VcGRhdGVGaW5pc2goKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj1EZXZlbEZyZWQmU3ViYWN0aW9uPVNldHRpbmciKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQ29uc29sZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkQ29uc29sZS5wbSx2IDEuMyAyMDA3LzA5LzI2IDEwOjA4OjIxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjMgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGUgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgY29uc29sZSBvYmplY3QKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkQ29uc29sZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNUREVSUiBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgJFNlbGYgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICA9IEBfOwogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGNvbnNvbGUgdGFibGUKICAgIG15ICRDb25zb2xlID0gJ0FjdGl2YXRlZCBtb2R1bGVzOiA8Yj4nIC4gKCBqb2luICcgLSAnLCBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9IH0gKSAuICc8L2I+JzsKCiAgICBpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57U3RhdHVzfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57U2V0dGluZ30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZXR0aW5nJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkQ29uc29sZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb25zb2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDcvMDkvMjYgMTA6MDg6MjEgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkSFRNTENoZWNrLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRIVE1MQ2hlY2sucG0sdiAxLjIgMjAwNy8wOS8yNiAxMDowMjo1OCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZEhUTUxDaGVjayAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBIVE1MIGNoZWNrIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2ctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBTVERFUlIgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgPSBAXzsKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9KSB7CiAgICAgICAgZm9yIG15ICRMaW5lICggcmV2ZXJzZSBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9IH0gKSB7CiAgICAgICAgICAgICRMaW5lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKFRleHQgPT4gJExpbmUpOwogICAgICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj48dGQ+JExpbmU8L3RkPjwvdHI+XG4iOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRIVE1MTGluZXMpIHsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZEhUTUxDaGVjaycsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAwNy8wOS8yNiAxMDowMjo1OCAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1RERVJSTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRTVERFUlJMb2cucG0sdiAxLjIgMjAwNy8wOS8yNiAxMDowMjo1OCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNUREVSUkxvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTVERFUlIgbG9nIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU1RERVJSIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAkU2VsZiAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgID0gQF87CiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj48dGQ+JExpbmU8L3RkPjwvdHI+IjsKICAgIH0KCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNUREVSUkxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA3LzA5LzI2IDEwOjAyOjU4ICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU21hbGxQcm9mLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRTbWFsbFByb2YucG0sdiAxLjUgMjAwNy8wOS8yNiAxMDoyODowOSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjUgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNtYWxsUHJvZiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTbWFsbFByb2Ygb2JqZWN0Cgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNtYWxsUHJvZi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNtYWxsUHJvZiBwcm9maWxpbmcgdG9vbAoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAkU2VsZiAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgID0gQF87CiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXBhcmUgdGhlIHByb2ZpbGluZyBkYXRhIGZvciBhIGJldHRlciByZWFkYWJpbGl0eQogICAgZm9yIG15ICRMaW5lICggQHsgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSB9ICkgewogICAgICAgIGZvciBteSAkVEQgKEB7JExpbmV9KSB7CiAgICAgICAgICAgICRURCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbChUZXh0ID0+ICRURCk7CiAgICAgICAgfQogICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMl08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bM108L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bNF08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPlswXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlsxXTo8L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPls1XTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICA8L3RyPiI7CiAgICB9CgogICAgIyBnZXQgYWxsIHBhY2thZ2VzIHdoaWNoIFNtYWxsUHJvZiBjaGVja3MKICAgIG15ICRQYWNrYWdlcyA9ICcnOwogICAgaWYgKCRQYXJhbXtNb2R1bGVSZWZ9LT57UGFja2FnZXN9KSB7CiAgICAgICAgJFBhY2thZ2VzID0gam9pbiAnIC0gJywgQHsgJFBhcmFte01vZHVsZVJlZn0tPntQYWNrYWdlc30gfTsKICAgIH0KCiAgICAjIHNob3cgdGhlIHByb2ZpbGluZyBkYXRhCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNtYWxsUHJvZicsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICAgICAgICAgIFBhY2thZ2VzICA9PiAkUGFja2FnZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUgJCAkRGF0ZTogMjAwNy8wOS8yNiAxMDoyODowOSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkRFByb2YucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRnJlZERQcm9mLnBtLHYgMS4zIDIwMDcvMDkvMjYgMTA6Mjg6MDkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkRFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjMgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZERQcm9mIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIERQcm9mIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWREUHJvZi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIERQcm9mIHByb2ZpbGluZyB0b29sCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgPSBAXzsKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcHJlcGFyZSB0aGUgcHJvZmlsaW5nIGRhdGEgZm9yIGEgYmV0dGVyIHJlYWRhYmlsaXR5CiAgICBpZiAoJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSkgewogICAgICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRURCAoQHskTGluZX0pIHsKICAgICAgICAgICAgICAgICRURCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbChUZXh0ID0+ICRURCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEhUTUxMaW5lcyAuPSAiICAgICAgICA8dHI+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzFdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlsyXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bM108L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzRdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPls1XTo8L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bNl08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgIDwvdHI+XG4iOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICAgICAgVG90YWxUaW1lID0+ICRQYXJhbXtNb2R1bGVSZWZ9LT57VG90YWxUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCRQYXJhbXtNb2R1bGVSZWZ9LT57RnVuY3Rpb25UcmVlfSkgewogICAgICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RnVuY3Rpb25UcmVlfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJFREIChAeyRMaW5lfSkgewogICAgICAgICAgICAgICAgJFREID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKFRleHQgPT4gJFREKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGluZS0+WzFdID1+IHMvIC8mbmJzcDsmbmJzcDsvZzsKICAgICAgICAgICAgJEhUTUxMaW5lcyAuPSAiICAgICAgICA8dHI+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMV08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgIDwvdHI+XG4iOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGdW5jdGlvbkxpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICAjIHNob3cgdGhlIHByb2ZpbGluZyBkYXRhCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZERQcm9mJywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA3LzA5LzI2IDEwOjI4OjA5ICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkVHJhbnNsYXRpb25EZWJ1Zy5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkVHJhbnNsYXRpb25EZWJ1Zy5wbSx2IDEuMiAyMDA3LzA5LzI2IDEwOjAyOjU4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFRyYW5zbGF0aW9uRGVidWc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFRyYW5zbGF0aW9uRGVidWcgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdHJhbnNsYXRpb24gZGVidWcgbW9kdWxlCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFRyYW5zbGF0aW9uRGVidWctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSB0cmFuc2xhdGlvbmRlYnVnZ2luZyBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgJFNlbGYgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICA9IEBfOwogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5lICggQHsgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSB9ICkgewogICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPjx0ZD4kTGluZTwvdGQ+PC90cj4iOwogICAgfQoKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkVHJhbnNsYXRpb25EZWJ1ZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA3LzA5LzI2IDEwOjAyOjU4ICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1FMTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRTUUxMb2cucG0sdiAxLjMgMjAwNy8wOS8yNiAxMDoyODowOSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTUUxMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjMgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNRTExvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTUUwgbG9nIG1vZHVsZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTUUxMb2ctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSB0cmFuc2xhdGlvbmRlYnVnZ2luZyBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgJFNlbGYgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICA9IEBfOwogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5lICggQHsgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSB9ICkgewogICAgICAgIGZvciBteSAkVEQgKEB7JExpbmV9KSB7CiAgICAgICAgICAgICRURCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbChUZXh0ID0+ICRURCk7CiAgICAgICAgfQogICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPlswXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzFdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMl08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgPC90cj4iOwogICAgfQoKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkU1FMTG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDcvMDkvMjYgMTA6Mjg6MDkgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQ29uZmlnTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRDb25maWdMb2cucG0sdiAxLjIgMjAwNy8wOS8yNiAxMDo1NjozNyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRDb25maWdMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbmZpZ0xvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiB0aGUgY29uZmlnIGxvZyBtb2R1bGUKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkQ29uZmlnTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgdHJhbnNsYXRpb25kZWJ1Z2dpbmcgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgPSBAXzsKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICBmb3IgbXkgJFREIChAeyRMaW5lfSkgewogICAgICAgICAgICAkVEQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoVGV4dCA9PiAkVEQpOwogICAgICAgIH0KICAgICAgICBpZiAoJExpbmUtPlsxXSBlcSAnVHJ1ZScpIHsKICAgICAgICAgICAgJExpbmUtPlsxXSA9ICcnOwogICAgICAgIH0KICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj5cbiIKICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzJdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPlsxXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICA8L3RyPiI7CiAgICB9CgogICAgaWYgKCRIVE1MTGluZXMpIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWRDb25maWdMb2cnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgSFRNTExpbmVzID0+ICRIVE1MTGluZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAwNy8wOS8yNiAxMDo1NjozNyAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRGcmVkLnBtIC0gcHJvdmlkZXMgZ2VuZXJpYyBIVE1MIG91dHB1dCBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMYXlvdXRGcmVkLnBtLHYgMS4yIDIwMDcvMDkvMjUgMjE6NTI6MDkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRGcmVkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBzZXZlcmFsIGZyZWQgbW9kdWxlcwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBGcmVkTW9kdWxlc1JlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTW9kdWxlTmFtZSAoIGtleXMgJXsgJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSB9ICkgewoKICAgICAgICAjIGxvYWQgYmFja2VuZAogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkTGF5b3V0QmFja2VuZCggTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSApOwoKICAgICAgICAjIGdldCBtb2R1bGUgZGF0YQogICAgICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCggTW9kdWxlUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0tPnskTW9kdWxlTmFtZX0gKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Mb2FkTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgc3BlY2lhbCBmcmVkIGxheW91dCBiYWNrZW5kcwoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0xvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWQnIC4gJFBhcmFte01vZHVsZU5hbWV9OwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwoKICAgICAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAgICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAwNy8wOS8yNSAyMTo1MjowOSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9PdXRwdXRGaWx0ZXJGcmVkLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE91dHB1dEZpbHRlckZyZWQucG0sdiAxLjExIDIwMDcvMDkvMjYgMTI6MDc6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpPdXRwdXRGaWx0ZXJGcmVkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMTEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZAoKPWhlYWQxIFNZTk9QU0lTCgphIG91dHB1dCBmaWx0ZXIgbW9kdWxlIHNwZWNpYWxseSBmb3IgZGV2ZWxvcGVyCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KE1haW5PYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCApKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntGcmVkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgaWYgKCAkUGFyYW17TGF5b3V0T2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0gPSAkUGFyYW17TGF5b3V0T2JqZWN0fTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGluc2VydCBMYXlvdXRPYmplY3QgZW50cnkgaW4gRmlsdGVyQ29udGVudCBmdW5jdGlvbiBvZiB0aGUgTGF5b3V0LnBtCiAgICAgICAgIyB0aGlzIGhhcHBlbnMgb25seSBpbiBPVFJTIDIuMgogICAgICAgICRTZWxmLT57RnJlZE9iamVjdH0tPkluc2VydExheW91dE9iamVjdCgpOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgaXMgYSBjaGVjayBiZWNhdXNlIE9UUlMyLjIgZG9uJ3QgZGVsaXZlciBoZXJlIGEgTGF5b3V0T2JqZWN0CiAgICBpZiAoICEkU2VsZi0+e0xheW91dE9iamVjdH0gKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBkbyBub3RoaW5nIGlmIG91dHB1dCBpcyBhIGF0dGFjaG1lbnQKICAgIGlmICgkeyAkUGFyYW17RGF0YX0gfSA9fiAvXkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7L21pCiAgICAgICAgfHwgJHsgJFBhcmFte0RhdGF9IH0gPX4gL15Db250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7L21pCiAgICApIHsKICAgICAgICBwcmludCBTVERFUlIgIkFUVEFDSE1FTlRcbiI7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBkbyBub3RoaW5nIGlmIGl0IGlzIGEgcmVkaXJlY3QKICAgIGlmICggICAkeyAkUGFyYW17RGF0YX0gfSA9fiAvXlN0YXR1czogMzAyIE1vdmVkL21pCiAgICAgICAgJiYgJHsgJFBhcmFte0RhdGF9IH0gPX4gL15sb2NhdGlvbjovbWkKICAgICAgICAmJiBsZW5ndGgoICR7ICRQYXJhbXtEYXRhfSB9ICkgPCA4MDAgKQogICAgewogICAgICAgIHByaW50IFNUREVSUiAiUkVESVJFQ1RcbiI7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBnZXQgZGF0YSBvZiB0aGUgYWN0aXZhdGVkIG1vZHVsZXMKICAgIG15ICRNb2R1bGVGb3JSZWYgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpNb2R1bGUnKTsKICAgIG15ICRNb2R1bGVzRGF0YVJlZiA9IHt9OwogICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICV7JE1vZHVsZUZvclJlZn0gKSB7CiAgICAgICAgaWYgKCAkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICkgewogICAgICAgICAgICAkTW9kdWxlc0RhdGFSZWYtPnskTW9kdWxlfSA9IHt9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgdGhlIGFjdGl2YXRlZCBtb2R1bGVzCiAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5EYXRhR2V0KAogICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRNb2R1bGVzRGF0YVJlZiwKICAgICAgICBIVE1MRGF0YVJlZiAgICA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgICMgY3JlYXRlIGZyZWRzIG91dHB1dAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DcmVhdGVGcmVkT3V0cHV0KCBGcmVkTW9kdWxlc1JlZiA9PiAkTW9kdWxlc0RhdGFSZWYgKTsKCiAgICAjIGJ1aWxkIHRoZSBjb250ZW50IHN0cmluZwogICAgbXkgJE91dHB1dCA9ICcnOwogICAgaWYgKCRNb2R1bGVzRGF0YVJlZi0+e0NvbnNvbGV9LT57T3V0cHV0fSkgewogICAgICAgICRPdXRwdXQgLj0gJE1vZHVsZXNEYXRhUmVmLT57Q29uc29sZX0tPntPdXRwdXR9OwogICAgICAgIGRlbGV0ZSAkTW9kdWxlc0RhdGFSZWYtPntDb25zb2xlfTsKICAgIH0KICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAleyRNb2R1bGVzRGF0YVJlZn0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTW9kdWxlc0RhdGFSZWYtPnskTW9kdWxlfS0+e091dHB1dH0gfHwgJyc7CiAgICB9CgogICAgIyBpbmNsdWRlIHRoZSBmcmVkIG91dHB1dCBpbiB0aGUgb3JpZ2luYWwgb3V0cHV0CiAgICBpZiAoICR7ICRQYXJhbXtEYXRhfSB9ICF+IHMvKFw8Ym9keSh8Lis/KVw+KS8kMVxuJE91dHB1dFxuXG5cblxuL214ICkgewogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHMvXiguKS9cbiRPdXRwdXRcblxuXG5cbiQxL214OwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTEgJCAkRGF0ZTogMjAwNy8wOS8yNiAxMjowNzo1NyAkCgo9Y3V0
IyAtLQojIERldmVsRnJlZENvbnNvbGUuZHRsIC0gYSBodG1sIGNvbnNvbGUgZm9yIGEgYmV0dGVyIGZyZWQgaGFuZGxpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkQ29uc29sZS5kdGwsdiAxLjIgMjAwNy8wOS8yNSAxMDowNToxMyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLUNvbnNvbGU8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJERhdGF7IlRleHQifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPURldmVsRnJlZCZTdWJhY3Rpb249U2V0dGluZyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9J1NldHRpbmcnOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbkNsaWNrPSJ3aW5kb3cub3BlbignJywgJ3NldHRpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NTAwLGhlaWdodD00NDAsbGVmdD0zMDAsdG9wPTI1MCcpOyIgdGFyZ2V0PSJzZXR0aW5nIj5zZXR0aW5nPC9hPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZEhUTUxDaGVjay5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIEhUTUwtQ2hlY2sgcmVzdWx0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRIVE1MQ2hlY2suZHRsLHYgMS4yIDIwMDcvMDkvMjYgMDY6NDk6NTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1IVE1MQ2hlY2s8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZFNUREVSUkxvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNUREVSUiBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU1RERVJSTG9nLmR0bCx2IDEuMiAyMDA3LzA5LzI2IDA2OjQ5OjUxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU1RERVJSTG9nPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CiMganVzdCBhIHNtYWxsIHNwYWNlCjx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4=
IyAtLQojIERldmVsRnJlZFNldHRpbmcuZHRsIC0gYSBmcm9udGVuZCBmb3IgYSBmYXN0IGZyZWQgc2V0dGluZyBoYW5kbGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRTZXR0aW5nLmR0bCx2IDEuNiAyMDA3LzA5LzI2IDEyOjA3OjIyIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRGV2ZWxGcmVkU2V0dGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iRGV2ZWxGcmVkIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nQWN0aW9uIj4KICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVNldHRpbmc8L2ZvbnQ+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iRnJlZE1vZHVsZSIgdmFsdWU9IiRRRGF0YXsiRnJlZE1vZHVsZSJ9IiAkRGF0YXsiQ2hlY2tlZCJ9PgogICAgICAgICAgICAgICRRRGF0YXsiRnJlZE1vZHVsZSJ9CjwhLS0gZHRsOmJsb2NrOkNvbmZpZyAtLT4KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluU3lzQ29uZmlnJlN1YmFjdGlvbj1FZGl0JlN5c0NvbmZpZ1N1Ykdyb3VwPSREYXRheyJNb2R1bGVOYW1lIn0mU3lzQ29uZmlnR3JvdXA9RnJlZCIgIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSdTZXR0aW5nJzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25DbGljaz0id2luZG93LnJlc2l6ZVRvKDkwMCw1MDApIj4oJFRleHR7IkNvbmZpZyJ9KTwvYT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlnIC0tPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICRUZXh0eyJBdHRlbnRpb246IFlvdSBjYW4ndCB1c2UgU21hbGxQcm9mIGFuZCBEUHJvZiBhdCB0aGUgc2FtZSB0aW1lISJ9CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNhdmUifSIgY2xhc3M9ImJ1dHRvbiI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIERldmVsRnJlZFNtYWxsUHJvZi5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNtYWxsUHJvZiByZXN1bHQgdGFibGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU21hbGxQcm9mLmR0bCx2IDEuMyAyMDA3LzA5LzI2IDA2OjQ5OjUxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNiIgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU21hbGxQcm9mPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICRUZXh0eyJQcm9maWxlZCBwYWNrYWdlczoifSAkUURhdGF7IlBhY2thZ2VzIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJDYWxscyJ9CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiVGltZSBleGVjdXRpbmcgKG1zKSJ9CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiVGltZSBleHBlbmRlZCAobXMpIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJGaWxlIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJMaW5lIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJUZXh0In0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAkVGV4dHsiRm9yIG1vcmUgaW5mb3JtYXRpb24sIGVzcGVjaWFsbHkgJ3RpbWUgZXhlY3V0aW9uJyBhbmQgJ3RpbWUgZXhwZW5kZWQnIHJlYWQgcGVybGRvYyBTbWFsbFByb2YhIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICRUZXh0eyJJZiB5b3UgY2hhbmdlIHRoZSBwYWNrYWdlIGNvbmZpZyB5b3UgaGF2ZSB0byByZWxvYWQgdGhpcyBzaWRlIHR3byB0aW1lcyEifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgojIGp1c3QgYSBzbWFsbCBzcGFjZQo8dGFibGUgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPjx0ZD48L3RkPjwvdHI+CjwvdGFibGU+
IyAtLQojIERldmVsRnJlZERQcm9mLmR0bCAtIGEgZnJvbnRlbmQgdG8gc2hvdyB0aGUgRFByb2YgcmVzdWx0IHRhYmxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZERQcm9mLmR0bCx2IDEuMiAyMDA3LzA5LzI2IDA2OjQ5OjUxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNyIgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtRFByb2Y8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lVGFibGUgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JVRpbWU8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RXhjbFNlYzwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5DdW11bFM8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+I0NhbGxzPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPnNlYy9jYWxsPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkNzZWMvYzo8L3RkPgogICAgICAgICAgPHRkPk5hbWU8L3RkPgogICAgICAgIDwvdHI+CiREYXRheyJIVE1MTGluZXMifQogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPlRvdGFsIFRpbWU6PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiREYXRheyJUb3RhbFRpbWUifTwvdGQ+CiAgICAgICAgICA8dGQgIGNvbHNwYW49IjUiPlNlY29uZHM8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVUYWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6RnVuY3Rpb25MaXN0IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPk51bWJlcjwvdGQ+CiAgICAgICAgICA8dGQ+TmFtZTwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CjwhLS0gZHRsOmJsb2NrOkZ1bmN0aW9uTGlzdCAtLT4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPgo=
IyAtLQojIERldmVsRnJlZFRyYW5zbGF0aW9uRGVidWcuZHRsIC0gYSBmcm9udGVuZCB0byBzaG93IHRoZSB0cmFuc2xhdGlvbiBkZWJ1Z2dpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkVHJhbnNsYXRpb25EZWJ1Zy5kdGwsdiAxLjIgMjAwNy8wOS8yNiAwNjo0OTo1MSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVRyYW5zbGF0aW9uRGVidWc8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZFNRTExvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIHNxbCBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU1FMTG9nLmR0bCx2IDEuMiAyMDA3LzA5LzI2IDEwOjAyOjU4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU1FMLUxvZzwvZm9udD48L2I+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPktpbmQ8L3RoPgogICAgICAgICAgPHRoPlN0YXRlbWVudDwvdGg+CiAgICAgICAgICA8dGg+UGFja2FnZTwvdGg+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CiMganVzdCBhIHNtYWxsIHNwYWNlCjx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4=
IyAtLQojIERldmVsRnJlZENvbmZpZ0xvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIGNvbmZpZyBkZWJ1Z2dpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkQ29uZmlnTG9nLmR0bCx2IDEuMSAyMDA3LzA5LzI2IDEwOjM3OjQxIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtQ29uZmlnLUxvZzwvZm9udD48L2I+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgoKICAgICAgICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+TnVtYmVyPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5Db25maWc8L3RkPgogICAgICAgICAgICAgICAgPHRkPlN0YXR1czwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CiMganVzdCBhIHNtYWxsIHNwYWNlCjx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC5wbSAtIGFsbCBmcmVkIGNvcmUgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWQucG0sdiAxLjUgMjAwNy8wOS8yNiAwOTozMzowNyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjUgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZCAtIGZyZWQgY29yZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZyZWQgc3RhbmRhcmQgY29yZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpFdmFsdWF0ZSB0aGUgc2V2ZXJhbCBkYXRhIG9mIGFsbCBmcmVkIG1vZHVsZXMgYW5kIGFkZCB0aGVtCm9uIHRoZSBGcmVkTW9kdWxlcyByZWZlcmVuY2UuCgogICAgJEZyZWRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBGcmVkTW9kdWxlc1JlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCAhJFBhcmFte0hUTUxEYXRhUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSFRNTERhdGFSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJE1vZHVsZU5hbWUgKCBrZXlzICV7ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfSApIHsKCiAgICAgICAgIyBsb2FkIGJhY2tlbmQKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUgKTsKCiAgICAgICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgICAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgICAgICAgICBNb2R1bGVSZWYgICAgICA9PiAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9LT57JE1vZHVsZU5hbWV9LAogICAgICAgICAgICAgICAgSFRNTERhdGFSZWYgICAgPT4gJFBhcmFte0hUTUxEYXRhUmVmfSwKICAgICAgICAgICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgYSBmcmVkIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJFBhcmFte01vZHVsZU5hbWV9ICk7CgogICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgIGlmICgkQmFja2VuZE9iamVjdCkgewoKICAgICAgICAjIEZJWE1FIEVycm9yaGFuZGxpbmcKICAgICAgICAkQmFja2VuZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgYSBmcmVkIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKCBNb2R1bGVOYW1lID0+ICRQYXJhbXtNb2R1bGVOYW1lfSApOwoKICAgICMgZ2V0IG1vZHVsZSBkYXRhCiAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKCiAgICAgICAgIyBGSVhNRSBFcnJvcmhhbmRsaW5nCiAgICAgICAgJEJhY2tlbmRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIF9Mb2FkQmFja2VuZCgpCgpsb2FkIGEgeG1sIGl0ZW0gbW9kdWxlCgogICAgJEJhY2tlbmRPYmplY3QgPSAkRnJlZE9iamVjdC0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkQmFja2VuZCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAnS2VybmVsOjpTeXN0ZW06OkZyZWQ6OicgLiAkUGFyYW17TW9kdWxlTmFtZX07CiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0sICVQYXJhbSwgKTsKCiAgICAgICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgICAgICMgcmV0dXJuIG9iamVjdAogICAgICAgICAgICByZXR1cm4gJEJhY2tlbmRPYmplY3Q7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gSW5zZXJ0TGF5b3V0T2JqZWN0KCkKCkZSQU1FV09SSy0yLjIgc3BlY2lmaWMgYmVjYXVzZSB0aGVyZSBpcyBubyBMYXlvdXRPYmplY3QgaW50ZWdyYXRpb24gZm9yCkZSRUQgaW4gT1RSUzIuMiBMYXlvdXQucG0KCiAgICAkRnJlZE9iamVjdC0+SW5zZXJ0TGF5b3V0T2JqZWN0KCk7Cgo9Y3V0CgojIEZSQU1FV09SSy0yLjIgc3BlY2lmaWMgYmVjYXVzZSB0aGVyZSBpcyBubyBMYXlvdXRPYmplY3QgaW50ZWdyYXRpb24gZm9yCiMgRlJFRCBpbiBPVFJTMi4yIExheW91dC5wbQoKc3ViIEluc2VydExheW91dE9iamVjdCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL091dHB1dC9IVE1ML0xheW91dC5wbSc7CgogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiOwogICAgfQoKICAgICMgcmVhZCBmaWxlCiAgICBteSAkSW5TdWI7CiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgICAgIGlmICggJExpbmUgPX4gL3N1YiBQcmludCB7LyApIHsKICAgICAgICAgICAgJEluU3ViID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkSW5TdWIgJiYgJExpbmUgPX4gL0RlYnVnID0+IFwkU2VsZi0+e0RlYnVnfSwvICkgewogICAgICAgICAgICBwdXNoIEBMaW5lcywgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwdXNoIEBMaW5lcywgIiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+IFwkU2VsZixcbiI7CiAgICAgICAgICAgIHB1c2ggQExpbmVzLCAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgICRJblN1YiA9IDA7CiAgICAgICAgfQogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgIyB3cml0ZSBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICAjIGxvZyB0aGUgbWFuaXB1bGF0aW9uCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEiLAogICAgKTsKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNSAkICREYXRlOiAyMDA3LzA5LzI2IDA5OjMzOjA3ICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9Db25zb2xlLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENvbnNvbGUucG0sdiAxLjQgMjAwNy8wOS8yNiAwODoxMTo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbnNvbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS40ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpnaXZlcyB5b3UgYWxsIGZ1bmN0aW9ucyB3aGljaCBhcmUgbmVlZGVkIGZvciB0aGUgY29uc29sZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkUmVmIChxdyhNb2R1bGVSZWYgSFRNTERhdGFSZWYgRnJlZE1vZHVsZXNSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQE1vZHVsZXMgPSAoKTsKICAgIGZvciBteSAkTW9kdWxlIChrZXlzICV7JFBhcmFte0ZyZWRNb2R1bGVzUmVmfX0pIHsKICAgICAgICBpZiAoJE1vZHVsZSBuZSAnQ29uc29sZScpIHsKICAgICAgICAgICAgcHVzaCBATW9kdWxlcywgJE1vZHVsZTsKICAgICAgICB9CiAgICB9CiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gXEBNb2R1bGVzOwoKICAgIGlmICgkeyRQYXJhbXtIVE1MRGF0YVJlZn19ICF+IC9GcmVkLVNldHRpbmcvICYmICR7JFBhcmFte0hUTUxEYXRhUmVmfX0gPX4gL1w8Ym9keS4qP1w+LyApIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e1N0YXR1c30gPSAxOwogICAgfQoKICAgIGlmICggJHskUGFyYW17SFRNTERhdGFSZWZ9fSAhfiAvbmFtZT0iQWN0aW9uIiB2YWx1ZT0iTG9naW4iLyApIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e1NldHRpbmd9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDA3LzA5LzI2IDA4OjExOjUyICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9IVE1MQ2hlY2sucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSFRNTENoZWNrLnBtLHYgMS4zIDIwMDcvMDkvMjYgMDg6MTE6NTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxDaGVjawoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIEhUTUw6OiBsaW50IGNoZWNrCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJFBhcmFtUmVmIChxdyggTW9kdWxlUmVmIEhUTUxEYXRhUmVmICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayB0aGUgSFRNTC1PdXRwdXQgd2l0aCBIVE1MOjpMaW50CiAgICBteSBASFRNTExpbnRNZXNzYWdlczsKICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdIVE1MOjpMaW50JykpIHsKICAgICAgICBIVE1MOjpMaW50LT5pbXBvcnQoKTsKICAgICAgICBteSAkSFRNTExpbnRPYmplY3QgPSBIVE1MOjpMaW50LT5uZXcoIG9ubHlfdHlwZXMgPT4gSFRNTDo6TGludDo6RXJyb3ItPlNUUlVDVFVSRSApOwogICAgICAgICRIVE1MTGludE9iamVjdC0+cGFyc2UgKCR7ICRQYXJhbXtIVE1MRGF0YVJlZn0gfSk7CgogICAgICAgIG15ICRFcnJvckNvdW50ZXIgPSAkSFRNTExpbnRPYmplY3QtPmVycm9yczsKICAgICAgICBmb3IgbXkgJEVycm9yICgkSFRNTExpbnRPYmplY3QtPmVycm9ycykgewogICAgICAgICAgICBteSAkU3RyaW5nIC49ICRFcnJvci0+YXNfc3RyaW5nOwogICAgICAgICAgICBpZiAoJFN0cmluZyAhfiAvSW52YWxpZCBjaGFyYWN0ZXIgLisgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgLykgewogICAgICAgICAgICAgICAgcHVzaCBASFRNTExpbnRNZXNzYWdlcywgJFN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgbXkgJFRleHQgPSAnVGhlIEhUTUwtY2hlY2tlciBvZiBGcmVkIHJlcXVpcmVzIEhUTUw6OkxpbnQgdG8gYmUgaW5zdGFsbGVkIScKICAgICAgICAgICAgLiAnUGxlYXNlIGluc3RhbGwgSFRNTDo6TGludCB2aWEgQ1BBTiBvciBkZWFjdGl2YXRlIHRoZSBIVE1MLWNoZWNrZXIgdmlhIFN5c0NvbmZpZy4nOwogICAgICAgIHB1c2ggQEhUTUxMaW50TWVzc2FnZXMsICRUZXh0OwogICAgfQoKICAgIGlmIChASFRNTExpbnRNZXNzYWdlcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSBcQEhUTUxMaW50TWVzc2FnZXM7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwNy8wOS8yNiAwODoxMTo1MiAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TVERFUlJMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU1RERVJSTG9nLnBtLHYgMS42IDIwMDcvMDkvMjYgMTE6Mjk6NTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS42ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNUREVSUkxvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNUREVSUiBsb2cgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkX1JlZiAocXcoIE1vZHVsZVJlZikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZF9SZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkX1JlZiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgb3BlbiB0aGUgU1RERVJSLmxvZyBmaWxlIHRvIGdldCB0aGUgU1RERVJSIG1lc3NhZ2VzCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkL1NUREVSUi5sb2cnOwogICAgaWYgKCBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlICkgewogICAgICAgIG15IEBSb3cgICAgICAgID0gPCRGaWxlaGFuZGxlPjsKICAgICAgICBteSBAUmV2ZXJzZVJvdyA9IHJldmVyc2UgQFJvdzsKICAgICAgICBteSBATG9nTWVzc2FnZXM7CgogICAgICAgICMgZ2V0IHRoZSB3aG9sZSBpbmZvcm1hdGlvbgogICAgICAgIGZvciBteSAkTGluZSAoQFJldmVyc2VSb3cpIHsKICAgICAgICAgICAgaWYgKCAkTGluZSA9fiAvRlJFRC8gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEF0dGVudGlvbjogdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIGJlY2F1c2Ugb2YgRFByb2YuIEkgaGF2ZSB0byBmb3JjZSB0aGUgcHJvY2Vzcy4KICAgICAgICAgICAgIyBTbyBJIGdldCB0aGlzIHdhcm5pbmdzIQogICAgICAgICAgICBpZiAoICRMaW5lICF+IC8oU3Vicm91dGluZSAuKz8gcmVkZWZpbmVkIGF0fGhhcyAuKz8gdW5zdGFja2VkIGNhbGxzfEZha2luZyAuKz8gZXhpdCB0aW1lc3RhbXApLyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQExvZ01lc3NhZ2VzLCAkTGluZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJpbnQgU1RERVJSICJGUkVEXG4iOwogICAgICAgIGNsb3NlICRGaWxlaGFuZGxlOwogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSBcQExvZ01lc3NhZ2VzOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAwNy8wOS8yNiAxMToyOTo1MSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TbWFsbFByb2YucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU21hbGxQcm9mLnBtLHYgMS42IDIwMDcvMDkvMjYgMDk6MzM6MDcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS42ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNtYWxsUHJvZiBwcm9maWxpbmcgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgICA9IEBfOwogICAgbXkgJFBhdGggICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi8nOwogICAgbXkgJENvbmZpZ19SZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6U21hbGxQcm9mJyk7CiAgICBteSBATGluZXM7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkUmVmIChxdyhIVE1MRGF0YVJlZiBNb2R1bGVSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbiB0aGlzIHR3byBjYXNlcyBpdCBtYWtlcyBubyBzZW5zZSB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsaW5nIGxpc3QKICAgIGlmICgkeyRQYXJhbXtIVE1MRGF0YVJlZn19ICF+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGlzIHBhZ2UgZGVsaXZlciB0aGUgSFRNTCBieSBtYW55IHNlcGFyYXRlIG91dHB1dCBjYWxscy4nCiAgICAgICAgICAgICAgICAuICcgUGxlYXNlIHVzZSB0aGUgdXN1YWwgd2F5IHRvIGludGVycHJldCBTbWFsbFByb2YnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoJHskUGFyYW17SFRNTERhdGFSZWZ9fSA9fiAvRnJlZC1TZXR0aW5nLykgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZmluZCBvdXQgd2hpY2ggcGFja2FnZXMgYXJlIGNoZWNrZWQgYnkgU21hbGxQcm9mCiAgICBteSBAUGFja2FnZXMgPSBrZXlzICVEQjo6cGFja2FnZXM7CiAgICBteSAkQ1ZTQ2hlY2tQcm9ibGVtID0gXCVEQjo6cGFja2FnZXM7ICMgc29ycnksIHRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgQ1ZTQ2hlY2tlcgogICAgaWYgKCAhJFBhY2thZ2VzWzBdICkgewogICAgICAgICRQYWNrYWdlc1swXSA9ICdhbGwnOwogICAgfQogICAgJFBhcmFte01vZHVsZVJlZn0tPntQYWNrYWdlc30gPSBcQFBhY2thZ2VzOwoKICAgICMgY2F0Y2ggdGhlIG5lZWRlZCBwcm9maWxpbmcgZGF0YQogICAgc3lzdGVtICJjcCAkUGF0aC9zbWFsbHByb2Yub3V0ICRQYXRoL0ZyZWRTbWFsbFByb2Yub3V0IjsKCiAgICBpZiAoIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJFBhdGggLiAnRnJlZFNtYWxsUHJvZi5vdXQnICkgewoKICAgICAgICAjIGNvbnZlcnQgdGhlIGZpbGUgaW4gdXNlYWJsZSBkYXRhCiAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gLyguKz8pOihcZCs/KTooXGQrPyk6KFxkKz8pOihcZCs/KTpccyooLio/KSQvICkgewogICAgICAgICAgICAgICAgcHVzaCBATGluZXMsIFsgJDEsICQyLCAkMywgJDQsICQ1LCAkNiBdOwogICAgICAgICAgICB9CgojICAgICAgICAgICAgIyBhbHRlcm5hdGl2ZSBzb2x1dGlvbiAyCiMgICAgICAgICAgICBteSBARWxlbWVudHMgPSBzcGxpdCAoJzonLCRMaW5lKTsKIyAgICAgICAgICAgICRFbGVtZW50c1swXSA9fiBzL14uKj9jZ2ktYmluXC9cLlwuXC9cLlwuXC8vLzsKIyAgICAgICAgICAgIHB1c2ggQExpbmVzLCBcQEVsZW1lbnRzOwogICAgICAgIH0KCiAgICAgICAgIyBkZWZpbmUgdGhlIG9yZGVyIG9mIHRoZSBwcm9maWxpbmcgZGF0YQogICAgICAgIEBMaW5lcyA9IHNvcnQgeyAkYi0+WyAkQ29uZmlnX1JlZi0+e09yZGVyQnl9IF0gPD0+ICRhLT5bICRDb25maWdfUmVmLT57T3JkZXJCeX0gXSB9IEBMaW5lczsKICAgICAgICBpZiAoICRDb25maWdfUmVmLT57T3JkZXJCeX0gPT0gMSApIHsKICAgICAgICAgICAgQExpbmVzID0gcmV2ZXJzZSBATGluZXM7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgb25seSBzbyBtYW55IGxpbmVzIGFzIHdhbnRlZAogICAgICAgIGlmIChATGluZXMpIHsKICAgICAgICAgICAgc3BsaWNlIEBMaW5lcywgJENvbmZpZ19SZWYtPntTaG93bkxpbmVzfTsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxATGluZXM7CiAgICAgICAgfQoKIyAgICAgICAgIyBhbHRlcm5hdGl2ZSBzb2x1dGlvbiAxCiMgICAgICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewojICAgICAgICAgICAgaWYgKCRMaW5lID1+IC9eXHMqP1sxLTldLykgewojICAgICAgICAgICAgICAgIGlmICgkTGluZSA9fiAvXlxzKj8oXGQrPylccys/KFxkLis/KVxzKz8oXGQuKz8pXHMrPyhcZCs/KTooLio/KSQvKSB7CiMgICAgICAgICAgICAgICAgICAgIHB1c2ggQExpbmVzLCBbJDEsICQyLCAkMywgJDQsICQ1XTsKIyAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICB9CiMgICAgICAgIH0KIyAgICAgICAgQExpbmVzID0gc29ydCB7JGItPlsxXSA8PT4gJGEtPlsxXX0gQExpbmVzOwojICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gXEBMaW5lczsKCiAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSBATGluZXMgPSAoKTsKICAgIG15ICRGaWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL2Jpbi9jZ2ktYmluL2luZGV4LnBsJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGlmICggLWwgIiRGaWxlIiApIHsKICAgICAgICBkaWUgIkNhbid0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshIjsKICAgIH0KCiAgICAjIHRvIHVzZSBTbWFsbFByb2YgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIGluZGV4LnBsIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICB3aGlsZSAoIG15ICRMaW5lID0gPCRGaWxlaGFuZGxlPiApIHsKICAgICAgICBwdXNoIEBMaW5lcywgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyEvdXNyL2Jpbi9wZXJsIC13IC1kOlNtYWxsUHJvZlxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICAjIGNyZWF0ZSBhIGluZm8gZm9yIHRoZSB1c2VyCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEiLAogICAgKTsKCiAgICAjIGNyZWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgU21hbGxQcm9mIG1vZHVsZQogICAgbXkgJFNtYWxsUHJvZkZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi8uc21hbGxwcm9mJzsKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSUksICc+JywgJFNtYWxsUHJvZkZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkU21hbGxQcm9mRmlsZSAhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkIGRvbid0IGVkaXQgdGhpcyBmaWxlIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICIjIHVzZSAuLi8uLi8gYXMgbGliIGxvY2F0aW9uXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgInVzZSBGaW5kQmluIHF3KFwkQmluKTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIGxpYiBcIlwkQmluLy4uLy4uXCI7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgInVzZSBLZXJuZWw6OkNvbmZpZztcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAibXkgXCRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgImlmIChcJENvbmZpZ09iamVjdC0+R2V0KCdGcmVkOjpTbWFsbFByb2YnKS0+e1BhY2thZ2VzfSkge1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICIgICAgbXkgXEBBcnJheSA9IFxAeyBcJENvbmZpZ09iamVjdC0+R2V0KCdGcmVkOjpTbWFsbFByb2YnKS0+e1BhY2thZ2VzfSB9O1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICIgICAgbXkgXCVIYXNoID0gbWFwIHsgXCRfID0+IDE7IH0gXEBBcnJheTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiICAgIFwlREI6OnBhY2thZ2VzID0gXCVIYXNoO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJ9XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIlwkREI6OmRyb3BfemVyb3MgPSAxO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJcJERCOjpncmVwX2Zvcm1hdCA9IDE7XG4iOwogICAgY2xvc2UgJEZpbGVoYW5kbGVJSUk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvYmluL2NnaS1iaW4vaW5kZXgucGwnOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiOwogICAgfQoKICAgICMgcmVhZCB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICMgcmVtb3ZlIHRoZSBtYW5pcHVsYXRlZCBsaW5lcwogICAgaWYgKCAkTGluZXNbMF0gPX4gLyMhXC91c3JcL2JpblwvcGVybCAtdyAtZDpTbWFsbFByb2YvICkgewogICAgICAgIHNoaWZ0IEBMaW5lczsKICAgIH0KICAgIGlmICggJExpbmVzWzBdID1+IC8jIEZSRUQgLSBtYW5pcHVsYXRlZC8gKSB7CiAgICAgICAgc2hpZnQgQExpbmVzOwogICAgfQoKICAgICMgc2F2ZSB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEiLAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgLnNtYWxscHJvZiBiZWNhdXNlIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKICAgIG15ICRTbWFsbFByb2ZGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvYmluL2NnaS1iaW4vLnNtYWxscHJvZic7CiAgICB1bmxpbmsgJFNtYWxsUHJvZkZpbGU7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDcvMDkvMjYgMDk6MzM6MDcgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9EUHJvZi5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEUHJvZi5wbSx2IDEuMyAyMDA3LzA5LzI2IDA5OjMzOjA3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6RFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkRQcm9mCgo9aGVhZDEgU1lOT1BTSVMKCmhhbmRsZSB0aGUgRFByb2YgcHJvZmlsaW5nIGRhdGEKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpbmVzOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZFJlZiAocXcoSFRNTERhdGFSZWYgTW9kdWxlUmVmKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZFJlZiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgaW4gdGhpcyB0d28gY2FzZXMgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gZ2VuZXJhdGUgdGhlIHByb2ZpbGluZyBsaXN0CiAgICBpZiAoJHskUGFyYW17SFRNTERhdGFSZWZ9fSAhfiAvXDxib2R5Lio/XD4vICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhpcyBwYWdlIGRlbGl2ZXIgdGhlIEhUTUwgYnkgbWFueSBzZXBhcmF0ZSBvdXRwdXQgY2FsbHMuJwogICAgICAgICAgICAgICAgLiAnIFBsZWFzZSB1c2UgdGhlIHVzdWFsIHdheSB0byBpbnRlcnByZXQgRFByb2YnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoJHskUGFyYW17SFRNTERhdGFSZWZ9fSA9fiAvRnJlZC1TZXR0aW5nLykgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgY2F0Y2ggdGhlIG5lZWRlZCBwcm9maWxpbmcgZGF0YQogICAgbXkgJFBhdGggPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi8nOwogICAgc3lzdGVtICJjcCAkUGF0aC90bW9uLm91dCAkUGF0aC9EUHJvZi5vdXQiOwoKICAgIG15ICRDb25maWdfUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6OkRQcm9mJyk7CiAgICBteSBAUHJvZmlsaW5nUmVzdWx0czsKICAgIGlmICghJENvbmZpZ19SZWYtPntGdW5jdGlvblRyZWV9KSB7CiAgICAgICAgbXkgJFNob3duTGluZXMgPSAkQ29uZmlnX1JlZi0+e1Nob3duTGluZXN9IDwgNDAgPyAkQ29uZmlnX1JlZi0+e1Nob3duTGluZXN9IDogNDA7CiAgICAgICAgbXkgJE9wdGlvbnMgPSAiLUYgLU8gJFNob3duTGluZXMiOwogICAgICAgICRPcHRpb25zIC49ICAgJENvbmZpZ19SZWYtPntPcmRlckJ5fSBlcSAnTmFtZScgID8gJyAtYScKICAgICAgICAgICAgICAgICAgICA6ICRDb25maWdfUmVmLT57T3JkZXJCeX0gZXEgJ0NhbGxzJyA/ICcgLWwnCiAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnOwogICAgICAgIGlmIChvcGVuIG15ICRGaWxlaGFuZGxlLCAiZHByb2ZwcCAkT3B0aW9ucyAkUGF0aC9EUHJvZi5vdXQgfCIpIHsKICAgICAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMaW5lID1+IC9eXHMqPyhbXlxzXSs/KVxzKz8oW15cc10rPylccys/KFteXHNdKz8pXHMrPyhbXlxzXSs/KVxzKz8oW15cc10rPylccys/KFteXHNdKz8pXHMrPyhbXlxzXSs/KSQvICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFByb2ZpbGluZ1Jlc3VsdHMsIFsgJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcgXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgICAgICB9CgogICAgICAgIHNoaWZ0IEBQcm9maWxpbmdSZXN1bHRzOwoKICAgICAgICBteSAkVG90YWxUaW1lID0gMDsKICAgICAgICBmb3IgbXkgJFRpbWUgKEBQcm9maWxpbmdSZXN1bHRzKSB7CiAgICAgICAgICAgIGlmICgkVGltZS0+WzFdIG5lICctJykgewogICAgICAgICAgICAgICAgJFRvdGFsVGltZSArPSAkVGltZS0+WzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFRvdGFsVGltZSkgewogICAgICAgICAgICBmb3IgbXkgJFRpbWUgKEBQcm9maWxpbmdSZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRpbWUtPlsxXSBuZSAnLScpIHsKICAgICAgICAgICAgICAgICAgICAkVGltZS0+WzBdID0gaW50KCRUaW1lLT5bMV0gLyAkVG90YWxUaW1lICogMTAwMDApIC8gMTAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSBcQFByb2ZpbGluZ1Jlc3VsdHM7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntUb3RhbFRpbWV9ID0gJFRvdGFsVGltZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChvcGVuIG15ICRGaWxlaGFuZGxlLCAiZHByb2ZwcCAtRlQgJFBhdGgvRFByb2Yub3V0IHwiKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgcHVzaCBAUHJvZmlsaW5nUmVzdWx0cywgWyRDb3VudGVyLCAkTGluZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RnVuY3Rpb25UcmVlfSA9IFxAUHJvZmlsaW5nUmVzdWx0czsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvYmluL2NnaS1iaW4vaW5kZXgucGwnOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiOwogICAgfQoKICAgICMgdG8gdXNlIERQcm9mIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMhL3Vzci9iaW4vcGVybCAtdyAtZDpEUHJvZlxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICAjIGNyZWF0ZSBhIGluZm8gZm9yIHRoZSB1c2VyCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEiLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi9pbmRleC5wbCc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISI7CiAgICB9CgogICAgIyByZWFkIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgIyByZW1vdmUgdGhlIG1hbmlwdWxhdGVkIGxpbmVzCiAgICBpZiAoICRMaW5lc1swXSA9fiAvIyFcL3VzclwvYmluXC9wZXJsIC13IC1kOkRQcm9mLyApIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CiAgICBpZiAoICRMaW5lc1swXSA9fiAvIyBGUkVEIC0gbWFuaXB1bGF0ZWQvICkgewogICAgICAgIHNoaWZ0IEBMaW5lczsKICAgIH0KCiAgICAjIHNhdmUgdGhlIGluZGV4LnBsIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiRlJFRCBtYW5pcHVsYXRlZCB0aGUgJEZpbGUhIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDcvMDkvMjYgMDk6MzM6MDcgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9UcmFuc2xhdGlvbkRlYnVnLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRyYW5zbGF0aW9uRGVidWcucG0sdiAxLjQgMjAwNy8wOS8yNiAxMToyOTo1MSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS40ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWcKCj1oZWFkMSBTWU5PUFNJUwoKaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBkZWJ1ZyBkYXRhCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKR2V0IHRoZSBkYXRhIGZvciB0aGlzIGZyZWQgbW9kdWxlLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuCkFuZCBhZGQgdGhlIGRhdGEgdG8gdGhlIG1vZHVsZSByZWYuCgogICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgTW9kdWxlUmVmID0+ICRNb2R1bGVSZWYsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIG9wZW4gdGhlIFRyYW5zbGF0aW9uRGVidWcubG9nIGZpbGUgdG8gZ2V0IHRoZSB1bnRyYW5zbGF0ZWQgd29yZHMKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL2ZyZWQvVHJhbnNsYXRpb25EZWJ1Zy5sb2cnOwogICAgaWYgKCBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlICkgewogICAgICAgIG15IEBSb3cgICAgICAgID0gPCRGaWxlaGFuZGxlPjsKICAgICAgICBteSBAUmV2ZXJzZVJvdyA9IHJldmVyc2UgQFJvdzsKICAgICAgICBteSBATG9nTWVzc2FnZXM7CgogICAgICAgICMgZ2V0IHRoZSB3aG9sZSBpbmZvcm1hdGlvbgogICAgICAgIGZvciBteSAkTGluZSAoQFJldmVyc2VSb3cpIHsKICAgICAgICAgICAgaWYgKCAkTGluZSA9fiAvRlJFRC8gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQExvZ01lc3NhZ2VzLCAkTGluZTsKICAgICAgICB9CiAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgICAgICRTZWxmLT5JbnNlcnRXb3JkKFdoYXQgPT4gIkZSRURcbiIpOwogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSBcQExvZ01lc3NhZ2VzOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgQExpbmVzID0gKCk7CgogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL0xhbmd1YWdlLnBtJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGlmICggLWwgIiRGaWxlIiApIHsKICAgICAgICBkaWUgIkNhbid0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshIjsKICAgIH0KCiAgICAjIHRvIHVzZSBUcmFuc2xhdGlvbkRlYnVnIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBMYW5ndWFnZS5wbSBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgICAgICBpZiAoICRMaW5lID1+IC8jIHdhcm4gaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWYvICkgewogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpUcmFuc2xhdGlvbkRlYnVnO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAibXkgXCRUcmFuc2xhdGlvbkRlYnVnT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWctPm5ldyhcJXtcJFNlbGZ9KTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIlwkVHJhbnNsYXRpb25EZWJ1Z09iamVjdC0+SW5zZXJ0V29yZChXaGF0ID0+IFwkV2hhdCk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSBATGluZXMgPSAoKTsKICAgIG15ICRGaWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9MYW5ndWFnZS5wbSc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISI7CiAgICB9CgogICAgIyB0byB1c2UgVHJhbnNsYXRpb25EZWJ1Z2dlciBJIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgTGFuZ3VhZ2UucG0gZmlsZQogICAgIyBoZXJlIEkgdW5kbyBteSBtYW5pcHVsYXRpb24KICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICB3aGlsZSAoIG15ICRMaW5lID0gPCRGaWxlaGFuZGxlPiApIHsKICAgICAgICBwdXNoIEBMaW5lcywgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwoKICAgIG15ICVSZW1vdmVMaW5lID0gKAogICAgICAgICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJ1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWc7XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJteSBcJFRyYW5zbGF0aW9uRGVidWdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6VHJhbnNsYXRpb25EZWJ1Zy0+bmV3KFwle1wkU2VsZn0pO1xuIiA9PiAxLAogICAgICAgICJcJFRyYW5zbGF0aW9uRGVidWdPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcJFdoYXQpO1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIGlmICggISRSZW1vdmVMaW5leyRMaW5lfSApIHsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEluc2VydFdvcmQoKQoKU2F2ZSBhIHdvcmQgaW4gdGhlIHRyYW5zbGF0aW9uIGRlYnVnIGxvZwoKICAgICRCYWNrZW5kT2JqZWN0LT5JbnNlcnRXb3JkKAogICAgICAgIFdoYXQgPT4gJ2Egd29yZCcsCiAgICApOwoKPWN1dAoKc3ViIEluc2VydFdvcmQgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1doYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXaGF0IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzYXZlIHRoZSB3b3JkIGluIGxvZyBmaWxlCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkL1RyYW5zbGF0aW9uRGVidWcubG9nJzsKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc+PicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlICRQYXJhbXtXaGF0fSAuICJcbiI7CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwNy8wOS8yNiAxMToyOTo1MSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TUUxMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU1FMTG9nLnBtLHYgMS4zIDIwMDcvMDkvMjYgMTE6Mjk6NTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNRTExvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIHNxbCBsb2cKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgb3BlbiB0aGUgVHJhbnNsYXRpb25EZWJ1Zy5sb2cgZmlsZSB0byBnZXQgdGhlIHVudHJhbnNsYXRlZCB3b3JkcwogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvZnJlZC9TUUwubG9nJzsKICAgIGlmICggb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSApIHsKICAgICAgICBteSBAUm93ICAgICAgICA9IDwkRmlsZWhhbmRsZT47CiAgICAgICAgbXkgQFJldmVyc2VSb3cgPSByZXZlcnNlIEBSb3cgOwogICAgICAgIG15IEBMb2dNZXNzYWdlczsKCiAgICAgICAgIyBnZXQgdGhlIHdob2xlIGluZm9ybWF0aW9uCiAgICAgICAgZm9yIG15ICRMaW5lIChAUmV2ZXJzZVJvdykgewogICAgICAgICAgICBpZiAoICRMaW5lID1+IC9GUkVELyApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgQFNwbGl0ZWRMb2cgPSBzcGxpdCAvOy8sICRMaW5lOwogICAgICAgICAgICBpZiAoJFNwbGl0ZWRMb2dbMF0gZXEgJ1NRTC1ETycgJiYgJFNwbGl0ZWRMb2dbMV0gPX4gL15TRUxFQ1QvKSB7CiAgICAgICAgICAgICAgICAkU3BsaXRlZExvZ1swXSAuPSAnIC0gUGVyaGFwcyB5b3UgaGF2ZSBhbiBlcnJvciB5b3UgdXNlIERPIGZvciBhIFNFTEVDVC1TdGF0ZW1lbnQ6JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBMb2dNZXNzYWdlcywgXEBTcGxpdGVkTG9nOwogICAgICAgIH0KCiAgICAgICAgcG9wIEBMb2dNZXNzYWdlczsKICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICAgICAgJFNlbGYtPkluc2VydFdvcmQoIFdoYXQgPT4gIkZSRURcbiIgKTsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gXEBMb2dNZXNzYWdlczsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL1N5c3RlbS9EQi5wbSc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISI7CiAgICB9CgogICAgIyB0byB1c2UgVHJhbnNsYXRpb25EZWJ1ZyBJIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgTGFuZ3VhZ2UucG0gZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAid3JpdGUgZmlsZSEiICk7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewoKICAgICAgICBpZiAoICRMaW5lID1+IC9eICAgIGlmIFwoIVwoXCRTZWxmLT57Q3Vyc2VyfSA9IFwkU2VsZi0+e2RiaH0tPnByZXBhcmVcKFwkU1FMXClcKVwpIHsvICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiaW5zZXJ0IGZyZWQgbG9nIFByZXBhcmUhIiApOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2c7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJteSBcJFNRTExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2ctPm5ldyhcJXtcJFNlbGZ9KTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkQ2FsbGVyID0gY2FsbGVyKCk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJcJFNRTExvZ09iamVjdC0+SW5zZXJ0V29yZChXaGF0ID0+IFwiU1FMLVNFTEVDVDtcJFNRTDtcJENhbGxlclwiKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgIH0KICAgICAgICBpZiAoICRMaW5lID1+IC9eICAgICMgc2VuZCBzcWwgdG8gZGF0YWJhc2UvICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiaW5zZXJ0IGZyZWQgbG9nIGRvISIgKTsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgInVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U1FMTG9nO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAibXkgXCRTUUxMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U1FMTG9nLT5uZXcoXCV7XCRTZWxmfSk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJteSBcJENhbGxlciA9IGNhbGxlcigpO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiXCRTUUxMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlNRTC1ETztcJFBhcmFte1NRTH07XCRDYWxsZXJcIik7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICB9CgogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSBATGluZXMgPSAoKTsKICAgIG15ICRGaWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9TeXN0ZW0vREIucG0nOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiOwogICAgfQoKICAgICMgdG8gdXNlIFRyYW5zbGF0aW9uRGVidWdnZXIgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIExhbmd1YWdlLnBtIGZpbGUKICAgICMgaGVyZSBJIHVuZG8gbXkgbWFuaXB1bGF0aW9uCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKCiAgICBteSAlUmVtb3ZlTGluZSA9ICgKICAgICAgICAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgInVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U1FMTG9nO1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJteSBcJFNRTExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2ctPm5ldyhcJXtcJFNlbGZ9KTtcbiIgICAgPT4gMSwKICAgICAgICAibXkgXCRDYWxsZXIgPSBjYWxsZXIoKTtcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgIlwkU1FMTG9nT2JqZWN0LT5JbnNlcnRXb3JkKFdoYXQgPT4gXCJTUUwtRE87XCRQYXJhbXtTUUx9O1wkQ2FsbGVyXCIpO1xuIiA9PiAxLAogICAgICAgICJcJFNRTExvZ09iamVjdC0+SW5zZXJ0V29yZChXaGF0ID0+IFwiU1FMLVNFTEVDVDtcJFNRTDtcJENhbGxlclwiKTtcbiIgICAgPT4gMSwKICAgICk7CgogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBpZiAoICEkUmVtb3ZlTGluZXskTGluZX0gKSB7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICAgICAgfQogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBJbnNlcnRXb3JkKCkKClNhdmUgYSB3b3JkIGluIHRoZSB0cmFuc2xhdGlvbiBkZWJ1ZyBsb2cKCiAgICAkQmFja2VuZE9iamVjdC0+SW5zZXJ0V29yZCgKICAgICAgICBXaGF0ID0+ICdhIHdvcmQnLAogICAgKTsKCj1jdXQKCnN1YiBJbnNlcnRXb3JkIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtXaGF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV2hhdCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2F2ZSB0aGUgd29yZCBpbiBsb2cgZmlsZQogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvZnJlZC9TUUwubG9nJzsKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc+PicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlICRQYXJhbXtXaGF0fSAuICJcbiI7CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwNy8wOS8yNiAxMToyOTo1MSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9Db25maWdMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ29uZmlnTG9nLnBtLHYgMS4zIDIwMDcvMDkvMjYgMTE6Mjk6NTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpDb25maWdMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIGNvbmZpZyBsb2cgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggJFBhcmFteyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKR2V0IHRoZSBkYXRhIGZvciB0aGlzIGZyZWQgbW9kdWxlLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuCkFuZCBhZGQgdGhlIGRhdGEgdG8gdGhlIG1vZHVsZSByZWYuCgogICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgTW9kdWxlUmVmID0+ICRNb2R1bGVSZWYsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBMb2dNZXNzYWdlczsKCiAgICAjIG9wZW4gdGhlIFRyYW5zbGF0aW9uRGVidWcubG9nIGZpbGUgdG8gZ2V0IHRoZSB1bnRyYW5zbGF0ZWQgd29yZHMKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL2ZyZWQvQ29uZmlnLmxvZyc7CiAgICBpZiAoIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgKSB7CiAgICAgICAgbXkgQFJvdyAgICAgICAgPSA8JEZpbGVoYW5kbGU+OwogICAgICAgIG15IEBSZXZlcnNlUm93ID0gcmV2ZXJzZShAUm93KTsKCiAgICAgICAgIyBnZXQgdGhlIHdob2xlIGluZm9ybWF0aW9uCiAgICAgICAgZm9yIG15ICRMaW5lIChAUmV2ZXJzZVJvdykgewogICAgICAgICAgICBpZiAoICRMaW5lID1+IC9GUkVELyApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBATG9nTWVzc2FnZXMsICRMaW5lOwogICAgICAgIH0KICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgICAgICBwb3AgQExvZ01lc3NhZ2VzOwogICAgICAgICRTZWxmLT5JbnNlcnRXb3JkKCBXaGF0ID0+ICJGUkVEXG4iICk7CiAgICB9CgogICAgbXkgJUluZGl2aWR1YWxDb25maWcgPSAoKTsKCiAgICBmb3IgbXkgJExpbmUgKEBMb2dNZXNzYWdlcykgewogICAgICAgICRMaW5lID1+IHMvXG4vLzsKICAgICAgICAkSW5kaXZpZHVhbENvbmZpZ3skTGluZX0rKzsKICAgIH0KCiAgICBATG9nTWVzc2FnZXMgPSAoKTsKICAgIGZvciBteSAkTGluZSAoa2V5cyAlSW5kaXZpZHVhbENvbmZpZykgewogICAgICAgIG15IEBTcGxpdGVkTGluZSA9IHNwbGl0IC87LywgJExpbmU7CiAgICAgICAgcHVzaCBAU3BsaXRlZExpbmUsICRJbmRpdmlkdWFsQ29uZmlneyRMaW5lfTsKICAgICAgICBwdXNoIEBMb2dNZXNzYWdlcywgXEBTcGxpdGVkTGluZTsKICAgIH0KCiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gXEBMb2dNZXNzYWdlcyA7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL0NvbmZpZy9EZWZhdWx0cy5wbSc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISI7CiAgICB9CgogICAgIyB0byB1c2UgVHJhbnNsYXRpb25EZWJ1ZyBJIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgTGFuZ3VhZ2UucG0gZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBteSAkU3ViR2V0ID0gJyc7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICAgICAgaWYgKCAkTGluZSA9fiAvc3ViIEdldC8gKSB7CiAgICAgICAgICAgICRTdWJHZXQgPSAiR2V0IjsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU3ViR2V0IGVxICdHZXQnICYmICRMaW5lID1+IC9teSBcJFNlbGYgPSBzaGlmdDsvICkgewogICAgICAgICAgICAkU3ViR2V0IC49ICdTZWxmJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU3ViR2V0IGVxICdHZXRTZWxmJyAmJiAkTGluZSA9fiAvbXkgXCRXaGF0ID0gc2hpZnQ7LyApIHsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgInVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6Q29uZmlnTG9nO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAibXkgXCRDb25maWdMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6Q29uZmlnTG9nLT5uZXcoKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgImlmIChcJFNlbGYtPntcJFdoYXR9KSB7ICMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIgICAgXCRDb25maWdMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlwkV2hhdDtUcnVlXCIsIEhvbWUgPT4gXCRTZWxmLT57SG9tZX0pO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAifSAgICAgICAgICAgICAgICAgICAgICMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJlbHNlIHsgICAgICAgICAgICAgICAgIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkKICAgICAgICAgICAgICAgICIgICAgXCRDb25maWdMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlwkV2hhdDtGYWxzZVwiLCBIb21lID0+IFwkU2VsZi0+e0hvbWV9KTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIn0gICAgICAgICAgICAgICAgICAgICAjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgfQogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvQ29uZmlnL0RlZmF1bHRzLnBtJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGlmICggLWwgIiRGaWxlIiApIHsKICAgICAgICBkaWUgIkNhbid0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshIjsKICAgIH0KCiAgICAjIHRvIHVzZSBUcmFuc2xhdGlvbkRlYnVnZ2VyIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBMYW5ndWFnZS5wbSBmaWxlCiAgICAjIGhlcmUgSSB1bmRvIG15IG1hbmlwdWxhdGlvbgogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CgogICAgbXkgJVJlbW92ZUxpbmUgPSAoCiAgICAgICAgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJ1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZztcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAibXkgXCRDb25maWdMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6Q29uZmlnTG9nLT5uZXcoKTtcbiIgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgImlmIChcJFNlbGYtPntcJFdoYXR9KSB7ICMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICIgICAgXCRDb25maWdMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlwkV2hhdDtUcnVlXCIsIEhvbWUgPT4gXCRTZWxmLT57SG9tZX0pO1xuIiAgPT4gMSwKICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgImVsc2UgeyAgICAgICAgICAgICAgICAjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICIgICAgXCRDb25maWdMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlwkV2hhdDtGYWxzZVwiLCBIb21lID0+IFwkU2VsZi0+e0hvbWV9KTtcbiIgPT4gMSwKICAgICk7CgogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBpZiAoICEkUmVtb3ZlTGluZXskTGluZX0gKSB7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICAgICAgfQogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBJbnNlcnRXb3JkKCkKClNhdmUgYSB3b3JkIGluIHRoZSB0cmFuc2xhdGlvbiBkZWJ1ZyBsb2cKCiAgICAkQmFja2VuZE9iamVjdC0+SW5zZXJ0V29yZCgKICAgICAgICBXaGF0ID0+ICdhIHdvcmQnLAogICAgKTsKCj1jdXQKCnN1YiBJbnNlcnRXb3JkIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgaWYgKCAhJFBhcmFte0hvbWV9ICkgewogICAgICAgICRQYXJhbXtIb21lfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICB9CgogICAgIyBzYXZlIHRoZSB3b3JkIGluIGxvZyBmaWxlCiAgICBteSAkRmlsZSA9ICRQYXJhbXtIb21lfSAuICcvdmFyL2ZyZWQvQ29uZmlnLmxvZyc7CiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPj4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZSAkUGFyYW17V2hhdH0gLiAiXG4iOwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDcvMDkvMjYgMTE6Mjk6NTEgJAoKPWN1dA==