Fred
0.2.21
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Added 2.4 Framework as supported versions.
Fixed broken output when STDERR log contrains html brackets.
Implement a function which show the needed time per sql-statement.
Insert a mult used sql statement finder. Implement a new sort option in DProf. Make some sum rows for the result tables.
Resolve version dependencies because of Config.pm check in revision 1.67, Sat Dec 29 00:44:13 2007.
Fixed bug in STDERRLog feature.
Insert a benchmark function and hardening the activate and deactivate function.
Removed the spaces and insert real html-tags.
Backport Fred to OTRS 2.1.
Improved the code quality. And fixed erorrs cause in consequence of the OTRS recoding.
Improved the styling of the install intro.
Improved the styling of the install intro.
Insert new tags in opm-file for an easier installation.
Design improvements.
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.1.x
2.2.x
2.3.x
2.4.x
<br>
Welcome! <br>
<br>
First of all you should install the necessary perl modules <br>
<ul>
<li> Devel::SmallProf </li>
<li> Devel::DProf</li>
<li> HTML::Lint</li>
</ul>
<br>
<br>
What can Fred do?<br>
<br>
To date, Fred has the following features: <br>
<ul>
<li> HTMLCheck: <br>
the HTML output is checked by means of HTML::Lint </li>
<li> STDERRLog: <br>
every entry contained in STDERR is displayed </li>
<li> TranslationDebug: <br>
displays all translation attempts of the current request which failed. </li>
<li> SQLLog: <br>
lists all SQL statements of the current request </li>
<li> ConfigLog: <br>
lists all !ConfigGet requests, indicating their frequency </li>
<li> DProf: <br>
a profiling tool which evaluates the time required for each function to be executed </li>
<li> SmallProf: <br>
a profiling tool performing a line-by-line code evaluation </li>
</ul>
<br>
*Caution* : Please have a look at the possible config settings, which are easily accessible by clicking on "setting". <br>
<br>
<br>
What is Fred's current status?<br>
<br>
<ul>
<li> modular design: <br>
anybody can add a new module at any time </li>
<li> the modules' output is not yet sophisticated <br>
ideas for improving the output or sensible configurations will be very welcome </li>
<li> please extend Fred, if you have good ideas <br>
<li> if you have no time to implement your ideas yourselves, please enter them in dev mailinglist </li>
</ul>
<br>
2009-04-02 11:47:20
opms.otrs.com
IyAtLQojIEFBQUZyZWQucG0gLSB0aGUgY29uZmlnIHRvIGJpbmQgU1RERVJSIHRvIGFuIGxvZyBmaWxlIHVzYWJsZSBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQUFBRnJlZC5wbSx2IDEuOCAyMDA4LzA1LzIxIDEwOjExOjU2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCmlmICggJEVOVntIVFRQX1VTRVJfQUdFTlR9ICkgewoKICAgICMgY2hlY2sgaWYgdGhlIG5lZWRlZCBwYXRoIGlzIGF2YWlsYWJsZQogICAgbXkgJFBhdGggPSAkU2VsZi0+e0hvbWV9IC4gJy92YXIvZnJlZCc7CiAgICBpZiAoICEtZSAkUGF0aCApIHsKICAgICAgICBta2RpciAkUGF0aDsKICAgIH0KCiAgICBteSAkRmlsZSA9ICRTZWxmLT57SG9tZX0gLiAnL3Zhci9mcmVkL1NUREVSUi5sb2cnOwoKICAgICMgY2hlY2sgbG9nIGZpbGUgc2l6ZQogICAgaWYgKCAtcyAkRmlsZSA+IDIwICogMTAyNCAqIDEwMjQgKSB7CiAgICAgICAgdW5saW5rICRGaWxlOwogICAgfQoKICAgICMgbW92ZSBTVERPVVQgdG8gdG1wIGZpbGUKICAgIGlmICggIW9wZW4gU1RERVJSLCAnPj4nLCAkRmlsZSApIHsKICAgICAgICBwcmludCBTVERFUlIgIkVSUk9SOiBDYW4ndCB3cml0ZSAkRmlsZSEiOwogICAgfQp9CgoxOwo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEZyZWQueG1sLHYgMS4xOCAyMDA4LzAyLzAzIDA3OjM3OjU3IHRyIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50IyMjRnJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlN1YnNjcmliZSB0aGUgb3V0cHV0IGZpbHRlciBhdCB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NZWxkZXQgZGVuIE91dHB1dEZpbHRlckZyZWQgYW0gU3lzdGVtIGFuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlYnVnIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjQ29uc29sZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBmcmVkIGNvbnNvbGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiwgd2VubiBtYW4gZGllIEZyZWQtQ29uc29sZSBudXR6ZW4gbfZjaHRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI0JlbmNobWFyayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBmcmVkIGJlbmNobWFyayB0b29sIChvbmx5IGZvciBleHBlcnRzISkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiwgd2VubiBtYW4gZGFzIEZyZWQtQmVuY2htYXJrdG9vbCBudXR6ZW4gbfZjaHRlIChudXIgZvxyIEV4cGVydGVuKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNTbWFsbFByb2YiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU21hbGxQcm9mIHByb2ZpbGluZyBmdW5jdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuLCB3ZW5uIG1hbiBkaWUgU21hbGxQcm9mLVByb2ZpbGluZyBGdW5rdGlvbiBudXR6ZW4gbfZjaHRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI0RQcm9mIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIERQcm9mIHByb2ZpbGluZyBmdW5jdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuLCB3ZW5uIG1hbiBkaWUgRFByb2YtUHJvZmlsaW5nIEZ1bmt0aW9uIG51dHplbiBt9mNodGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjU1FMTG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCBhbiByZWFsdGltZSBTUUwgc3RhdGVtZW50IGxvZyBmdW5jdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuLCB3ZW5uIHp1ciBMYXVmemVpdCBkZXIgU1FMLVN0YXRlbWVudC1Mb2dnZXIgZ2VudXR6dCB3ZXJkZW4gc29sbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNIVE1MQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IGFuIHJlYWx0aW1lIEhUTUwtY2hlY2tlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHdlbm4genVyIExhdWZ6ZWl0IGVpbiBIVE1MLUNoZWNrZXIgYXVzZ2Vm/GhydCB3ZXJkZW4gc29sbC4gV0lDSFRJRzogRGFzIENwYW4tTW9kdWwgSFRNTDo6bGludCBpc3QgaGllcmb8ciBub3R3ZW5kaWcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjVHJhbnNsYXRpb25EZWJ1ZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdGhlIHRyYW5zbGF0aW9uIGRlYnVnZ2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4gd2VubiB6dXIgTGF1ZnplaXQgZGVyINxiZXJzZXR6dW5nc2RlYnVnZ2VyIGdlbnV0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjQ29uZmlnTG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGNvbmZpZyBsb2cgbWVjaGFuaXNtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4sIHdlbm4gbWFuIHp1ciBMYXVmemVpdCBDb25pZy1Mb2dtZWNoYW5pc211cyBudXR6ZW4gd2lsbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNTVERFUlJMb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgU1RERVJSTG9nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4gd2VubiBtYW4genVyIExhdWZ6ZWl0IGRhcyBTVERFUlJMb2cgc2VoZW4gd2lsbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjRGV2ZWxGcmVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGRldmVsIGZyZWQgb2JqZWN0IGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgRW50d2lja2xlci1PYmpla3RzIEZyZWQgaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8IS0tIDxHcm91cD5hZG1pbjwvR3JvdXA+IC0tPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5GcmVkLURldmVsb3BlcnRvb2xzPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkZyZWQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrNDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+OTk5PC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6U21hbGxQcm9mIyMjU2hvd25MaW5lcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBpbnNlcnQgdGhlIG51bWJlciBvZiBzaG93biBwcm9maWxpbmcgbGluZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga2FubiBkaWUgQW56YWhsIGRlciBhbmdlemVpZ3RlbiBhdXNnZXdlcnRldGVuIFplaWxlbiBhbmdlZ2ViZW4gd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5TbWFsbFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjE1PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6U21hbGxQcm9mIyMjT3JkZXJCeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPldoaWNoIG9yZGVyIHNob3VsZCB0aGUgcHJvZmlsaW5nIGRhdGEgaGF2ZT88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFjaCB3ZWxjaGVyIFJlaWhlbmZvbGdlIHNvbGxlbiBkaWUgUHJvZmlsaW5nZGF0ZW4gZ2VvcmRuZXQgd2VyZGVuPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5TbWFsbFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjQiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5MaW5lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj5DYWxsczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+VGltZSBleGVjdXRpbmc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPlRpbWUgZXhwZW5kZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OlNtYWxsUHJvZiMjI1BhY2thZ2VzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q2hlY2sgb25seSB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIGluIFNtYWxsUHJvZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXMgc29sbGVuIG51ciBmb2xnZW5kZSBQYWNrYWdlcyB2b24gU21hbGxQcm9mIGdlcHL8ZnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5TbWFsbFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0PC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkRQcm9mIyMjU2hvd25MaW5lcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBpbnNlcnQgdGhlIG51bWJlciBvZiBzaG93biBwcm9maWxpbmcgZnVuY3Rpb25zIChtYXggNDApLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGthbm4gZGllIEFuemFobCBkZXIgYW5nZXplaWd0ZW4gYXVzZ2V3ZXJ0ZXRlbiBGdW5rdGlvbmVuIGFuZ2VnZWJlbiB3ZXJkZW4gKG1heGltYWwgNDApLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5EUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpEUHJvZiMjI09yZGVyQnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5XaGljaCBvcmRlciBzaG91bGQgdGhlIHByb2ZpbGluZyBkYXRhIGhhdmU/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hY2ggd2VsY2hlciBSZWloZW5mb2xnZSBzb2xsZW4gZGllIFByb2ZpbGluZ2RhdGVuIGdlb3JkbmV0IHdlcmRlbj88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IkV4VGltZSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPk5hbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhbGxzIj5DYWxsczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXhUaW1lIj5FeGNsVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VUaW1lIj5DdW11bFNUaW1lPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpEUHJvZiMjI0Z1bmN0aW9uVHJlZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgdGhlIGZ1bmN0aW9uIHRyZWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlplaWdlIGRlbiBGdW5rdGlvbnNiYXVtLiBFcyB6ZWlndCBkaWUgQWJmb2xnZSB1bmQgxGJo5G5naWdrZWl0IGluIHdlbGNoZXIgZGllIEZ1bmt0aW9uZW4gYXVmZ2VydWZlbiB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkRQcm9mPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6RFByb2YjIyNEaXNhYmxlZFBhY2thZ2VzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RG9uJ3QgY2hlY2sgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBpbiBEUHJvZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXMgc29sbGVuIGZvbGdlbmRlIFBhY2thZ2VzIHZvbiBEUHJvZiBuaWNodCBnZXBy/GZ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5NSU1FOjpFbnRpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT51dGY4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q0dJPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QXV0b0xvYWRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkVuY29kZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkR5bmFMb2FkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5NYWlsOjpJbnRlcm5ldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPndhcm5pbmdzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RGF0ZTo6Rm9ybWF0OjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+REJJPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RGF0YTo6RHVtcGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TUlNRTo6SGVhZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPk1JTUU6OlRvb2xzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+REJEOjpteXNxbDo6ZGI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5NYWlsOjpGaWVsZDo6QWRkckxpc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5GaWxlOjpHbG9iPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGltZTo6TG9jYWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5NYWlsOjpGaWVsZDo6RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkZpbmRCaW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5NSU1FOjpQYXJzZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5FeHBvcnRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnN0cmljdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPk1haWw6OkZpZWxkPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OlNtYWxsUHJvZiMjI0Rpc2FibGVkRmlsZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Eb24ndCBjaGVjayB0aGUgZm9sbG93aW5nIHBlcmwgZmlsZXMgb3IgcGF0aCBpbiBTbWFsbFByb2YuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVzIHNvbGxlbiBmb2xnZW5kZSBEYXRlaWVuIHVuZCBQZmFkZSBpbiBTbWFsbFByb2YgbmljaHQgZ2VwcvxmdCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlNtYWxsUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPi91c3IvbGliL3Blcmw1PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Li4vLi4vL0tlcm5lbC9TeXN0ZW0vRnJlZC88L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6Q29uZmlnTG9nIyMjT3JkZXJCeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPldoaWNoIG9yZGVyIHNob3VsZCB0aGUgY29uZmlnIGxvZyBkYXRhIGhhdmU/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hY2ggd2VsY2hlciBSZWloZW5mb2xnZSBzb2xsZW4gZGllIENvbmZpZ2xvZ2RhdGVuIGdlb3JkbmV0IHdlcmRlbj88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29uZmlnTG9nPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIzIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+Q2FsbHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPkNvbmZpZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+UGFja2FnZTwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0RldmVsRnJlZC5wbSAtIGEgc3BlY2lhbCBkZXZlbG9wZXIgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWQucG0sdiAxLjEyIDIwMDgvMDUvMjEgMTA6MTE6NTYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkRldmVsRnJlZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTIgJCkgWzFdOwoKI3VzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICBPQkpFQ1Q6CiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoCiAgICAgICAgUGFyYW1PYmplY3QgREJPYmplY3QgICAgIExvZ09iamVjdCBDb25maWdPYmplY3QKICAgICAgICBNYWluT2JqZWN0ICBMYXlvdXRPYmplY3QgVGltZU9iamVjdAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH07CiAgICAgICAgICAgIG5leHQgT0JKRUNUOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgIH0KCiAgICAjICAgICRTZWxmLT57WE1MT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygleyRTZWxmfSk7CiAgICAkU2VsZi0+e0NvbmZpZ1Rvb2xPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNvbmZpZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntGcmVkT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1N1YmFjdGlvbn0gICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViYWN0aW9uJyApOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2hvdyB0aGUgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewogICAgICAgIG15ICRWZXJzaW9uID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1ZlcnNpb24nKTsKICAgICAgICBpZiAoICRWZXJzaW9uID1+IG17IF4yXC4xXC4gfW1zeCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fQWN0aXZhdGVGcmVkRm9yMjEoKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICJTb3JyeSwgdGhpcyBzaWRlIGlzIGN1cnJlbnRseSB1bmRlciBkZXZlbG9wbWVudCEiCiAgICAgICAgKTsKICAgIH0KCiAgICAjICAgICAgICBteSAkT3V0cHV0ICAgPSAnJzsKICAgICMKICAgICMgICAgICAgIG15IEBUcmFuc2xhdGlvbldoaXRlTGlzdCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKICAgICMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKICAgICMgICAgICAgICAgICBLZXkgID0+IDEsCiAgICAjICAgICAgICAgICAgQ2FjaGUgPT4gMCwKICAgICMgICAgICAgICk7CiAgICAjCiAgICAjICAgICAgICBteSAlV2hpdGVMaXN0OwogICAgIyAgICAgICAgZm9yIG15ICRDb250ZW50IChAeyRUcmFuc2xhdGlvbldoaXRlTGlzdFsxXXtUcmFuc2xhdGlvbn19KSB7CiAgICAjICAgICAgICAgICAgaWYgKCRDb250ZW50LT57Q29udGVudH0pIHsKICAgICMgICAgICAgICAgICAgICAgIyBhZGQgYWRkIGJsb2NrCiAgICAjICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAjICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5lJywKICAgICMgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgIyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQgPT4gJENvbnRlbnQtPntDb250ZW50fSwKICAgICMgICAgICAgICAgICAgICAgICAgIH0sCiAgICAjICAgICAgICAgICAgICAgICk7CiAgICAjICAgICAgICAgICAgfQogICAgIyAgICAgICAgfQogICAgIwogICAgIyAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIkZyZWQtT3ZlcnZpZXciKTsKICAgICMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAjICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgIyAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAjICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWQnLAogICAgIyAgICAgICAgKTsKICAgICMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICMgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgIyAgICB9CiAgICAjICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICAgICMgaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBsb2cKICAgICMgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVHJhbnNsYXRpb24nKSB7CiAgICAjICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ZhbHVlJyk7CiAgICAjCiAgICAjICAgICAgICBteSBARGF0YSA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKICAgICMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKICAgICMgICAgICAgICAgICBLZXkgID0+IDEsCiAgICAjICAgICAgICAgICAgQ2FjaGUgPT4gMCwKICAgICMgICAgICAgICk7CiAgICAjCiAgICAjICAgICAgICBpZiAoIUBEYXRhKSB7CiAgICAjICAgICAgICAgICAgbXkgQEhhc2g7CiAgICAjCiAgICAjICAgICAgICAgICAgJEhhc2hbMV17VHJhbnNsYXRpb259WzFde0NvbnRlbnR9ID0gJFZhbHVlOwogICAgIyAgICAgICAgICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEFkZCgKICAgICMgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiAgICAjICAgICAgICAgICAgICAgIEtleSAgICAgPT4gMSwKICAgICMgICAgICAgICAgICAgICAgWE1MSGFzaCA9PiBcQEhhc2gsCiAgICAjICAgICAgICAgICAgKTsKICAgICMgICAgICAgIH0KICAgICMgICAgICAgIGVsc2UgewogICAgIyAgICAgICAgICAgIHB1c2ggQHskRGF0YVsxXXtUcmFuc2xhdGlvbn19LCB7Q29udGVudCA9PiAkVmFsdWV9OwogICAgIyAgICAgICAgICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaFVwZGF0ZSgKICAgICMgICAgICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiAgICAjICAgICAgICAgICAgICAgIEtleSA9PiAnMScsCiAgICAjICAgICAgICAgICAgICAgIFhNTEhhc2ggPT4gXEBEYXRhLAogICAgIyAgICAgICAgICAgICk7CiAgICAjCiAgICAjICAgICAgICB9CiAgICAjCiAgICAjICAgICAgICBteSAkUmVmZXJlciA9ICRFTlZ7SFRUUF9SRUZFUkVSfTsKICAgICMgICAgICAgIGlmICgkUmVmZXJlciA9fiAvXD8oLispJC8pIHsKICAgICMgICAgICAgICAgICAkUmVmZXJlciA9ICQxOwogICAgIyAgICAgICAgfQogICAgIwogICAgIyAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFJlZmVyZXIpOwogICAgIyAgICB9CiAgICAjICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RyYW5zbGF0aW9uRGVsZXRlJykgewogICAgIyAgICAgICAgbXkgQERhdGEgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hEZWxldGUoCiAgICAjICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiAgICAjICAgICAgICAgICAgS2V5ICA9PiAxLAogICAgIyAgICAgICAgKTsKICAgICMKICAgICMgICAgICAgIG15ICRSZWZlcmVyID0gJEVOVntIVFRQX1JFRkVSRVJ9OwogICAgIyAgICAgICAgaWYgKCRSZWZlcmVyID1+IC9cPyguKykkLykgewogICAgIyAgICAgICAgICAgICRSZWZlcmVyID0gJDE7CiAgICAjICAgICAgICB9CiAgICAjCiAgICAjICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAkUmVmZXJlcik7CiAgICAjICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGZhc3QgaGFuZGxlIGZvciBmcmVkIHNldHRpbmdzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NldHRpbmcnICkgewogICAgICAgIG15ICRNb2R1bGVGb3JSZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6TW9kdWxlJyk7CiAgICAgICAgZGVsZXRlICRNb2R1bGVGb3JSZWYtPntDb25zb2xlfTsKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRNb2R1bGVGb3JSZWZ9ICkgewogICAgICAgICAgICBteSAkQ2hlY2tlZCA9ICcnOwogICAgICAgICAgICBpZiAoICRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2tlZCA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGcmVkTW9kdWxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEZyZWRNb2R1bGUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBDaGVja2VkICAgID0+ICRDaGVja2VkLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkZyZWQ6OiRNb2R1bGUiKSApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbmZpZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJGcmVkLVNldHRpbmciICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHslUGFyYW19LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNldHRpbmcnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZmFzdCBoYW5kbGUgZm9yIGZyZWQgc2V0dGluZ3MKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2V0dGluZ0FjdGlvbicgKSB7CiAgICAgICAgbXkgJE1vZHVsZUZvclJlZiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6TW9kdWxlJyk7CiAgICAgICAgbXkgQFNlbGVjdGVkRnJlZE1vZHVsZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdGcmVkTW9kdWxlJyApOwogICAgICAgIG15ICVTZWxlY3RlZE1vZHVsZXMgICAgID0gbWFwIHsgJF8gPT4gMTsgfSBAU2VsZWN0ZWRGcmVkTW9kdWxlczsKICAgICAgICBteSAkVXBkYXRlRmxhZzsKICAgICAgICBkZWxldGUgJE1vZHVsZUZvclJlZi0+e0NvbnNvbGV9OwoKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXskTW9kdWxlRm9yUmVmfSApIHsKCiAgICAgICAgICAgICMgdXBkYXRlIHRoZSBzeXNjb25maWcgc2V0dGluZ3MKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAhJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfQogICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICEkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICYmICRTZWxlY3RlZE1vZHVsZXN7JE1vZHVsZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fS0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICJGcmVkOjpNb2R1bGUjIyMkTW9kdWxlIiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdBY3RpdmUnID0+ICRTZWxlY3RlZE1vZHVsZXN7JE1vZHVsZX0gfHwgMCwKCiAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAnTW9kdWxlJyA9PiAkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVXBkYXRlRmxhZyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdGhpcyBmdW5jdGlvbiBpcyBuZXNlY2NhcnkgdG8gZmluaXNoIHRoZSBzeXNjb25maWcgdXBkYXRlCiAgICAgICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVmVyc2lvbicpOwogICAgICAgIGlmICggJFVwZGF0ZUZsYWcgJiYgJFZlcnNpb24gPX4gbXsgXjJcLlswMTJdXC4gfW1zeCApIHsKICAgICAgICAgICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fS0+Q29uZmlnSXRlbVVwZGF0ZUZpbmlzaCgpOwogICAgICAgIH0KCiAgICAgICAgIyBkZWFjdGl2YXRlIGZyZWRtb2R1bGUgdG9kb3MKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXskTW9kdWxlRm9yUmVmfSApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICYmICEkU2VsZWN0ZWRNb2R1bGVzeyRNb2R1bGV9ICkgewoKICAgICAgICAgICAgICAgICMgRXJyb3JoYW5kbGluZyBzaG91bGQgYmUgaW1wcm92ZWQhCiAgICAgICAgICAgICAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhY3RpdmUgZnJlZCBtb2R1bGUgdG9kb3MKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXskTW9kdWxlRm9yUmVmfSApIHsKICAgICAgICAgICAgaWYgKCAhJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAkU2VsZWN0ZWRNb2R1bGVzeyRNb2R1bGV9ICkgewoKICAgICAgICAgICAgICAgICMgRXJyb3JoYW5kbGluZyBzaG91bGQgYmUgaW1wcm92ZWQhCiAgICAgICAgICAgICAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPURldmVsRnJlZCZTdWJhY3Rpb249U2V0dGluZyIgKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX0FjdGl2YXRlRnJlZEZvcjIxIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJE1lc3NhZ2UgPSAnRmlsZSBhbHJlYWR5IGNoYW5nZWQhJzsKCiAgICBpZiAoICRTZWxmLT57RnJlZE9iamVjdH0tPkluc2VydExheW91dE9iamVjdDIxKCkgKSB7CiAgICAgICAgJE1lc3NhZ2UgPSAnRmlsZSBjaGFuZ2VkISc7CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICBJbmZvICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQmVuY2htYXJrLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkQmVuY2htYXJrLnBtLHYgMS4zIDIwMDgvMDUvMjEgMTA6MTE6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZEJlbmNobWFyazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRCZW5jaG1hcmsgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdGhlIGJlbmNobWFyayBvYmplY3QKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZEJlbmNobWFyay0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNUREVSUiBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBpZiAhJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSBuZSAnQVJSQVknOwoKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICAkSFRNTExpbmVzIC49ICc8dHI+JzsKICAgICAgICBmb3IgbXkgJENlbGwgKCBAeyRMaW5lfSApIHsKICAgICAgICAgICAgJEhUTUxMaW5lcyAuPSAiPHRkPiRDZWxsPC90ZD4iOwogICAgICAgIH0KICAgICAgICAkSFRNTExpbmVzIC49ICc8L3RyPic7CiAgICB9CgogICAgcmV0dXJuIGlmICEkSFRNTExpbmVzOwoKICAgICMgb3V0cHV0IHRoZSBodG1sCiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZEJlbmNobWFyaycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSFRNTExpbmVzID0+ICRIVE1MTGluZXMsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA4LzA1LzIxIDEwOjExOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQ29uc29sZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRnJlZENvbnNvbGUucG0sdiAxLjUgMjAwOC8wNS8yMSAxMDoxMTo1NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkQ29uc29sZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGUgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgY29uc29sZSBvYmplY3QKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGUtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBTVERFUlIgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGNvbnNvbGUgdGFibGUKICAgIG15ICRDb25zb2xlCiAgICAgICAgPSAnQWN0aXZhdGVkIG1vZHVsZXM6IDxiPicgLiAoIGpvaW4gJyAtICcsIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIC4gJzwvYj4nOwoKICAgIGlmICggJFBhcmFte01vZHVsZVJlZn0tPntTdGF0dXN9ICkgewogICAgICAgIGlmICggJFBhcmFte01vZHVsZVJlZn0tPntTZXR0aW5nfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NldHRpbmcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWRDb25zb2xlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnNvbGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMDgvMDUvMjEgMTA6MTE6NTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkSFRNTENoZWNrLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkSFRNTENoZWNrLnBtLHYgMS40IDIwMDgvMDUvMjEgMTA6MTE6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZEhUTUxDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZEhUTUxDaGVjayAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBIVE1MIGNoZWNrIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU1RERVJSIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSApIHsKICAgICAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICAgICAgJExpbmUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJExpbmUgKTsKICAgICAgICAgICAgJEhUTUxMaW5lcyAuPSAiICAgICAgICA8dHI+PHRkPiRMaW5lPC90ZD48L3RyPlxuIjsKICAgICAgICB9CgogICAgICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWRIVE1MQ2hlY2snLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDA4LzA1LzIxIDEwOjExOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1RERVJSTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkU1RERVJSTG9nLnBtLHYgMS45IDIwMDkvMDMvMzEgMTI6NDU6MTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIFNUREVSUiBsb2cgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU1RERVJSIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9IG5lICdBUlJBWSc7CgogICAgIyBjcmVhdGUgaHRtbCBzdHJpbmcKICAgIG15ICRIVE1MTGluZXM7CiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKCiAgICAgICAgIyBjb252ZXJ0IGFzY2lpIHRvIGh0bWwKICAgICAgICAkSFRNTExpbmVzIC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJExpbmUsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIGlmICEkSFRNTExpbmVzOwoKICAgICRIVE1MTGluZXMgPSAiPHRyPjx0ZD4kSFRNTExpbmVzPC90ZD48L3RyPiI7CgogICAgIyBvdXRwdXQgdGhlIGh0bWwKICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkU1RERVJSTG9nJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDA5LzAzLzMxIDEyOjQ1OjExICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU21hbGxQcm9mLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkU21hbGxQcm9mLnBtLHYgMS44IDIwMDgvMDUvMjEgMTA6MTE6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNtYWxsUHJvZjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNtYWxsUHJvZiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTbWFsbFByb2Ygb2JqZWN0Cgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTbWFsbFByb2YtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBTbWFsbFByb2YgcHJvZmlsaW5nIHRvb2wKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXBhcmUgdGhlIHByb2ZpbGluZyBkYXRhIGZvciBhIGJldHRlciByZWFkYWJpbGl0eQogICAgZm9yIG15ICRMaW5lICggQHsgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSB9ICkgewogICAgICAgIGZvciBteSAkVEQgKCBAeyRMaW5lfSApIHsKICAgICAgICAgICAgJFREID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRURCApOwogICAgICAgIH0KICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlsyXTwvdGQ+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bM108L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzRdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzBdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlsxXTo8L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bNV08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgIDwvdHI+IjsKICAgIH0KCiAgICAjIGdldCBhbGwgcGFja2FnZXMgd2hpY2ggU21hbGxQcm9mIGNoZWNrcwogICAgbXkgJFBhY2thZ2VzID0gJyc7CiAgICBpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57UGFja2FnZXN9ICkgewogICAgICAgICRQYWNrYWdlcyA9IGpvaW4gJyAtICcsIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57UGFja2FnZXN9IH07CiAgICB9CgogICAgIyBzaG93IHRoZSBwcm9maWxpbmcgZGF0YQogICAgaWYgKCRIVE1MTGluZXMpIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWRTbWFsbFByb2YnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgSFRNTExpbmVzID0+ICRIVE1MTGluZXMsCiAgICAgICAgICAgICAgICBUb3RhbENhbGwgPT4gJFBhcmFte01vZHVsZVJlZn0tPntUb3RhbENhbGx9LAogICAgICAgICAgICAgICAgUGFja2FnZXMgID0+ICRQYWNrYWdlcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjggJCAkRGF0ZTogMjAwOC8wNS8yMSAxMDoxMTo1NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkRFByb2YucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWREUHJvZi5wbSx2IDEuNyAyMDA4LzA1LzIxIDEwOjExOjU3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWREUHJvZjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZERQcm9mIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIERQcm9mIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkRFByb2YtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBEUHJvZiBwcm9maWxpbmcgdG9vbAoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcHJlcGFyZSB0aGUgcHJvZmlsaW5nIGRhdGEgZm9yIGEgYmV0dGVyIHJlYWRhYmlsaXR5CiAgICBpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gKSB7CiAgICAgICAgZm9yIG15ICRMaW5lICggQHsgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJFREICggQHskTGluZX0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkKCRURCkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFREID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkVEQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFREICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPlxuIgogICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlswXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzFdPC90ZD5cbiIKICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMl08L3RkPlxuIgogICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlszXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzRdPC90ZD5cbiIKICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bNV06PC90ZD5cbiIKICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPls2XTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAuICIgICAgICAgIDwvdHI+XG4iOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICAgICAgVG90YWxUaW1lID0+ICRQYXJhbXtNb2R1bGVSZWZ9LT57VG90YWxUaW1lfSwKICAgICAgICAgICAgICAgIFRvdGFsQ2FsbCA9PiAkUGFyYW17TW9kdWxlUmVmfS0+e1RvdGFsQ2FsbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte01vZHVsZVJlZn0tPntGdW5jdGlvblRyZWV9ICkgewogICAgICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RnVuY3Rpb25UcmVlfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJFREICggQHskTGluZX0gKSB7CiAgICAgICAgICAgICAgICAkVEQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFREICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpbmUtPlsxXSA9fiBzLyAvJm5ic3A7Jm5ic3A7L2c7CiAgICAgICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPlxuIgogICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlswXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMV08L3RkPlxuIgogICAgICAgICAgICAgICAgLiAiICAgICAgICA8L3RyPlxuIjsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRnVuY3Rpb25MaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aGUgcHJvZmlsaW5nIGRhdGEKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkRFByb2YnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA4LzA1LzIxIDEwOjExOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkVHJhbnNsYXRpb25EZWJ1Zy5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRnJlZFRyYW5zbGF0aW9uRGVidWcucG0sdiAxLjQgMjAwOC8wNS8yMSAxMDoxMTo1NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkVHJhbnNsYXRpb25EZWJ1ZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFRyYW5zbGF0aW9uRGVidWcgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdHJhbnNsYXRpb24gZGVidWcgbW9kdWxlCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRUcmFuc2xhdGlvbkRlYnVnLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgdHJhbnNsYXRpb25kZWJ1Z2dpbmcgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5lICggQHsgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSB9ICkgewogICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPjx0ZD4kTGluZTwvdGQ+PC90cj4iOwogICAgfQoKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkVHJhbnNsYXRpb25EZWJ1ZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOC8wNS8yMSAxMDoxMTo1NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1FMTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkU1FMTG9nLnBtLHYgMS43IDIwMDgvMDUvMjEgMTA6MTE6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNRTExvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNRTExvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTUUwgbG9nIG1vZHVsZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1FMTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgdHJhbnNsYXRpb25kZWJ1Z2dpbmcgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5lICggQHsgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSB9ICkgewogICAgICAgIGZvciBteSAkVEQgKCBAeyRMaW5lfSApIHsKICAgICAgICAgICAgJFREID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRURCApOwogICAgICAgIH0KICAgICAgICBteSAkQ2xhc3MgPSAnJzsKICAgICAgICBpZiAoICRMaW5lLT5bNF0gKSB7CiAgICAgICAgICAgICRDbGFzcyA9ICcgY2xhc3M9ImNvbnRlbnRrZXkiJzsKICAgICAgICB9CgogICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyJENsYXNzPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMV08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMl08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bM108L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bNF08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgIDwvdHI+IjsKICAgIH0KCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNRTExvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBIVE1MTGluZXMgICAgICAgID0+ICRIVE1MTGluZXMsCiAgICAgICAgICAgICAgICBBbGxTdGF0ZW1lbnRzICAgID0+ICRQYXJhbXtNb2R1bGVSZWZ9LT57QWxsU3RhdGVtZW50c30sCiAgICAgICAgICAgICAgICBEb1N0YXRlbWVudHMgICAgID0+ICRQYXJhbXtNb2R1bGVSZWZ9LT57RG9TdGF0ZW1lbnRzfSwKICAgICAgICAgICAgICAgIFNlbGVjdFN0YXRlbWVudHMgPT4gJFBhcmFte01vZHVsZVJlZn0tPntTZWxlY3RTdGF0ZW1lbnRzfSwKICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgICAgPT4gJFBhcmFte01vZHVsZVJlZn0tPntUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjcgJCAkRGF0ZTogMjAwOC8wNS8yMSAxMDoxMTo1NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQ29uZmlnTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkQ29uZmlnTG9nLnBtLHYgMS41IDIwMDgvMDUvMjEgMTA6MTE6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbmZpZ0xvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbmZpZ0xvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiB0aGUgY29uZmlnIGxvZyBtb2R1bGUKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbmZpZ0xvZy0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIHRyYW5zbGF0aW9uZGVidWdnaW5nIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICBmb3IgbXkgJFREICggQHskTGluZX0gKSB7CiAgICAgICAgICAgICRURCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkVEQgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkTGluZS0+WzFdIGVxICdUcnVlJyApIHsKICAgICAgICAgICAgJExpbmUtPlsxXSA9ICcnOwogICAgICAgIH0KICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlszXTwvdGQ+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPlswXTwvdGQ+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPlsxXTwvdGQ+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPlsyXTwvdGQ+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgPC90cj4iOwogICAgfQoKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkQ29uZmlnTG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNSAkICREYXRlOiAyMDA4LzA1LzIxIDEwOjExOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRGcmVkLnBtIC0gcHJvdmlkZXMgZ2VuZXJpYyBIVE1MIG91dHB1dCBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGF5b3V0RnJlZC5wbSx2IDEuMyAyMDA4LzA1LzIxIDEwOjExOjU3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dEZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBzZXZlcmFsIGZyZWQgbW9kdWxlcwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBGcmVkTW9kdWxlc1JlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTW9kdWxlTmFtZSAoIGtleXMgJXsgJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSB9ICkgewoKICAgICAgICAjIGxvYWQgYmFja2VuZAogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkTGF5b3V0QmFja2VuZCggTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSApOwoKICAgICAgICAjIGdldCBtb2R1bGUgZGF0YQogICAgICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCggTW9kdWxlUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0tPnskTW9kdWxlTmFtZX0gKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Mb2FkTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgc3BlY2lhbCBmcmVkIGxheW91dCBiYWNrZW5kcwoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0xvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWQnIC4gJFBhcmFte01vZHVsZU5hbWV9OwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwoKICAgICAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAgICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDgvMDUvMjEgMTA6MTE6NTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9PdXRwdXRGaWx0ZXJGcmVkLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBPdXRwdXRGaWx0ZXJGcmVkLnBtLHYgMS4xNiAyMDA4LzA1LzIxIDEwOjExOjU3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE2ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZAoKPWhlYWQxIFNZTk9QU0lTCgphIG91dHB1dCBmaWx0ZXIgbW9kdWxlIHNwZWNpYWxseSBmb3IgZGV2ZWxvcGVyCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KE1haW5PYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCApKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntGcmVkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgaWYgKCAkUGFyYW17TGF5b3V0T2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0gPSAkUGFyYW17TGF5b3V0T2JqZWN0fTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGluc2VydCBMYXlvdXRPYmplY3QgZW50cnkgaW4gRmlsdGVyQ29udGVudCBmdW5jdGlvbiBvZiB0aGUgTGF5b3V0LnBtCiAgICAgICAgIyB0aGlzIGhhcHBlbnMgb25seSBpbiBPVFJTIDIuMgogICAgICAgICRTZWxmLT57RnJlZE9iamVjdH0tPkluc2VydExheW91dE9iamVjdDIyKCk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBpcyBhIGNoZWNrIGJlY2F1c2UgT1RSUzIuMiBkb24ndCBkZWxpdmVyIGhlcmUgYSBMYXlvdXRPYmplY3QKICAgIGlmICggISRTZWxmLT57TGF5b3V0T2JqZWN0fSApIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIHBlcmhhcHMgbm8gb3V0cHV0IGlzIGdlbmVyYXRlZAogICAgaWYgKCAhJFBhcmFte0RhdGF9ICkgewogICAgICAgIGRpZSAnRnJlZDogQXQgdGhlIG1vbWVudCwgeW91ciBjb2RlIGdlbmVyYXRlcyBubyBvdXRwdXQhJzsKICAgIH0KCiAgICAjIGRvIG5vdGhpbmcgaWYgb3V0cHV0IGlzIGEgYXR0YWNobWVudAogICAgaWYgKAogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IC9eQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsvbWkKICAgICAgICB8fCAkeyAkUGFyYW17RGF0YX0gfSA9fiAvXkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsvbWkKICAgICAgICApCiAgICB7CiAgICAgICAgcHJpbnQgU1RERVJSICJBVFRBQ0hNRU5UIERPV05MT0FEXG4iOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZG8gbm90aGluZyBpZiBpdCBpcyBhIHJlZGlyZWN0CiAgICBpZiAoCiAgICAgICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gL15TdGF0dXM6IDMwMiBNb3ZlZC9taQogICAgICAgICYmICR7ICRQYXJhbXtEYXRhfSB9ID1+IC9ebG9jYXRpb246L21pCiAgICAgICAgJiYgbGVuZ3RoKCAkeyAkUGFyYW17RGF0YX0gfSApIDwgODAwCiAgICAgICAgKQogICAgewogICAgICAgIHByaW50IFNUREVSUiAiUkVESVJFQ1RcbiI7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBkbyBub3RoaW5nIGlmIGl0IGlzIGZyZWQgaXQgc2VsZgogICAgaWYgKCAkeyAkUGFyYW17RGF0YX0gfSA9fiBte0ZyZWQtU2V0dGluZzxcL3RpdGxlPn1tc3ggKSB7CiAgICAgICAgcHJpbnQgU1RERVJSICJDSEFOR0UgRlJFRCBTRVRUSU5HXG4iOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IGRhdGEgb2YgdGhlIGFjdGl2YXRlZCBtb2R1bGVzCiAgICBteSAkTW9kdWxlRm9yUmVmICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6TW9kdWxlJyk7CiAgICBteSAkTW9kdWxlc0RhdGFSZWYgPSB7fTsKICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAleyRNb2R1bGVGb3JSZWZ9ICkgewogICAgICAgIGlmICggJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSApIHsKICAgICAgICAgICAgJE1vZHVsZXNEYXRhUmVmLT57JE1vZHVsZX0gPSB7fTsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIHRoZSBhY3RpdmF0ZWQgbW9kdWxlcwogICAgJFNlbGYtPntGcmVkT2JqZWN0fS0+RGF0YUdldCgKICAgICAgICBGcmVkTW9kdWxlc1JlZiA9PiAkTW9kdWxlc0RhdGFSZWYsCiAgICAgICAgSFRNTERhdGFSZWYgICAgPT4gJFBhcmFte0RhdGF9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBmcmVkcyBvdXRwdXQKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3JlYXRlRnJlZE91dHB1dCggRnJlZE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNEYXRhUmVmICk7CgogICAgIyBidWlsZCB0aGUgY29udGVudCBzdHJpbmcKICAgIG15ICRPdXRwdXQgPSAnJzsKICAgIGlmICggJE1vZHVsZXNEYXRhUmVmLT57Q29uc29sZX0tPntPdXRwdXR9ICkgewogICAgICAgICRPdXRwdXQgLj0gJE1vZHVsZXNEYXRhUmVmLT57Q29uc29sZX0tPntPdXRwdXR9OwogICAgICAgIGRlbGV0ZSAkTW9kdWxlc0RhdGFSZWYtPntDb25zb2xlfTsKICAgIH0KICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAleyRNb2R1bGVzRGF0YVJlZn0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTW9kdWxlc0RhdGFSZWYtPnskTW9kdWxlfS0+e091dHB1dH0gfHwgJyc7CiAgICB9CgogICAgIyBpbmNsdWRlIHRoZSBmcmVkIG91dHB1dCBpbiB0aGUgb3JpZ2luYWwgb3V0cHV0CiAgICBpZiAoICR7ICRQYXJhbXtEYXRhfSB9ICF+IHMvKFw8Ym9keSh8Lis/KVw+KS8kMVxuJE91dHB1dFxuXG5cblxuL214ICkgewogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHMvXiguKS9cbiRPdXRwdXRcblxuXG5cbiQxL214OwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE2ICQgJERhdGU6IDIwMDgvMDUvMjEgMTA6MTE6NTcgJAoKPWN1dAo=
IyAtLQojIERldmVsRnJlZEJlbmNobWFyay5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNUREVSUiBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkQmVuY2htYXJrLmR0bCx2IDEuMSAyMDA3LzEyLzA1IDA2OjEwOjEyIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtQmVuY2htYXJrPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZT4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CiMganVzdCBhIHNtYWxsIHNwYWNlCjx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4=
IyAtLQojIERldmVsRnJlZENvbnNvbGUuZHRsIC0gYSBodG1sIGNvbnNvbGUgZm9yIGEgYmV0dGVyIGZyZWQgaGFuZGxpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkQ29uc29sZS5kdGwsdiAxLjIgMjAwNy8wOS8yNSAxMDowNToxMyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLUNvbnNvbGU8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJERhdGF7IlRleHQifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPURldmVsRnJlZCZTdWJhY3Rpb249U2V0dGluZyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9J1NldHRpbmcnOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbkNsaWNrPSJ3aW5kb3cub3BlbignJywgJ3NldHRpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NTAwLGhlaWdodD00NDAsbGVmdD0zMDAsdG9wPTI1MCcpOyIgdGFyZ2V0PSJzZXR0aW5nIj5zZXR0aW5nPC9hPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZEhUTUxDaGVjay5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIEhUTUwtQ2hlY2sgcmVzdWx0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRIVE1MQ2hlY2suZHRsLHYgMS4yIDIwMDcvMDkvMjYgMDY6NDk6NTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1IVE1MQ2hlY2s8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZFNUREVSUkxvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNUREVSUiBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU1RERVJSTG9nLmR0bCx2IDEuMyAyMDA3LzEyLzA1IDA2OjEwOjEyIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU1RERVJSTG9nPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CiMganVzdCBhIHNtYWxsIHNwYWNlCjx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4K
IyAtLQojIERldmVsRnJlZFNldHRpbmcuZHRsIC0gYSBmcm9udGVuZCBmb3IgYSBmYXN0IGZyZWQgc2V0dGluZyBoYW5kbGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRTZXR0aW5nLmR0bCx2IDEuNyAyMDA3LzA5LzI2IDEzOjE0OjEzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRGV2ZWxGcmVkU2V0dGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iRGV2ZWxGcmVkIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nQWN0aW9uIj4KICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVNldHRpbmc8L2ZvbnQ+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iRnJlZE1vZHVsZSIgdmFsdWU9IiRRRGF0YXsiRnJlZE1vZHVsZSJ9IiAkRGF0YXsiQ2hlY2tlZCJ9PgogICAgICAgICAgICAgICRRRGF0YXsiRnJlZE1vZHVsZSJ9CjwhLS0gZHRsOmJsb2NrOkNvbmZpZyAtLT4KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluU3lzQ29uZmlnJlN1YmFjdGlvbj1FZGl0JlN5c0NvbmZpZ1N1Ykdyb3VwPSREYXRheyJNb2R1bGVOYW1lIn0mU3lzQ29uZmlnR3JvdXA9RnJlZCIgIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSdTZXR0aW5nJzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25DbGljaz0id2luZG93LnJlc2l6ZVRvKDkwMCw1MDApIj4oJFRleHR7IkNvbmZpZyJ9KTwvYT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlnIC0tPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAkVGV4dHsiQXR0ZW50aW9uOiBZb3UgY2FuJ3QgdXNlIFNtYWxsUHJvZiBhbmQgRFByb2YgYXQgdGhlIHNhbWUgdGltZSEifQogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iIGNsYXNzPSJidXR0b24iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIERldmVsRnJlZFNtYWxsUHJvZi5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNtYWxsUHJvZiByZXN1bHQgdGFibGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZFNtYWxsUHJvZi5kdGwsdiAxLjQgMjAwOC8wMi8wMiAxMjo0NDoxNiB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2IiBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1TbWFsbFByb2Y8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgJFRleHR7IlByb2ZpbGVkIHBhY2thZ2VzOiJ9ICRRRGF0YXsiUGFja2FnZXMifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJFRleHR7IkNhbGxzIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJUaW1lIGV4ZWN1dGluZyAobXMpIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJUaW1lIGV4cGVuZGVkIChtcykifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJFRleHR7IkZpbGUifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJFRleHR7IkxpbmUifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJFRleHR7IlRleHQifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kRGF0YXsiVG90YWxDYWxsIn08L3RkPgogICAgICAgICAgPHRkIGNvbHNwYW49IjUiPiBDYWxsczwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICRUZXh0eyJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZXNwZWNpYWxseSAndGltZSBleGVjdXRpb24nIGFuZCAndGltZSBleHBlbmRlZCcgcmVhZCBwZXJsZG9jIFNtYWxsUHJvZiEifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgJFRleHR7IklmIHlvdSBjaGFuZ2UgdGhlIHBhY2thZ2UgY29uZmlnIHlvdSBoYXZlIHRvIHJlbG9hZCB0aGlzIHNpZGUgdHdvIHRpbWVzISJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CiMganVzdCBhIHNtYWxsIHNwYWNlCjx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4=
IyAtLQojIERldmVsRnJlZERQcm9mLmR0bCAtIGEgZnJvbnRlbmQgdG8gc2hvdyB0aGUgRFByb2YgcmVzdWx0IHRhYmxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWREUHJvZi5kdGwsdiAxLjMgMjAwOC8wMi8wMiAxMjo0NDoxNiB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI3IiBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1EUHJvZjwvZm9udD48L2I+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVUYWJsZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4lVGltZTwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5FeGNsU2VjPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkN1bXVsUzwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4jQ2FsbHM8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+c2VjL2NhbGw8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Q3NlYy9jOjwvdGQ+CiAgICAgICAgICA8dGQ+TmFtZTwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+VG90YWw6PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiREYXRheyJUb3RhbFRpbWUifTwvdGQ+CiAgICAgICAgICA8dGQ+U2Vjb25kczwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kRGF0YXsiVG90YWxDYWxsIn08L3RkPgogICAgICAgICAgPHRkIGNvbHNwYW49IjMiPiBDYWxsczwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVRhYmxlIC0tPgo8IS0tIGR0bDpibG9jazpGdW5jdGlvbkxpc3QgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+TnVtYmVyPC90ZD4KICAgICAgICAgIDx0ZD5OYW1lPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KPCEtLSBkdGw6YmxvY2s6RnVuY3Rpb25MaXN0IC0tPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgojIGp1c3QgYSBzbWFsbCBzcGFjZQo8dGFibGUgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPjx0ZD48L3RkPjwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIERldmVsRnJlZFRyYW5zbGF0aW9uRGVidWcuZHRsIC0gYSBmcm9udGVuZCB0byBzaG93IHRoZSB0cmFuc2xhdGlvbiBkZWJ1Z2dpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkVHJhbnNsYXRpb25EZWJ1Zy5kdGwsdiAxLjIgMjAwNy8wOS8yNiAwNjo0OTo1MSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVRyYW5zbGF0aW9uRGVidWc8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZFNRTExvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIHNxbCBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZFNRTExvZy5kdGwsdiAxLjQgMjAwOC8wMy8wNSAxMzowNTozNSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjUiIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVNRTC1Mb2c8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICA8dGQ+S2luZDwvdGQ+CiAgICAgICAgICA8dGQ+U3RhdGVtZW50PC90ZD4KICAgICAgICAgIDx0ZD5QYWNrYWdlPC90ZD4KICAgICAgICAgIDx0ZD5UaW1lIDEvMTAwIHNlYzwvdGQ+CiAgICAgICAgICA8dGQ+RXF1YWwgU3RhdGVtZW50czwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj4kRGF0YXsiQWxsU3RhdGVtZW50cyJ9IEFsbFN0YXRtZW50cyA9ICREYXRheyJTZWxlY3RTdGF0ZW1lbnRzIn0gU0VMRUNUUyArICREYXRheyJEb1N0YXRlbWVudHMifSBET3M8L3RkPgogICAgICAgICAgPHRkPiREYXRheyJUaW1lIn08L3RkPgogICAgICAgICAgPHRkPnNlYzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZENvbmZpZ0xvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIGNvbmZpZyBkZWJ1Z2dpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZENvbmZpZ0xvZy5kdGwsdiAxLjQgMjAwOC8wMi8wMyAwNzozNzo1NyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1Db25maWctTG9nPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CgogICAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Q2FsbHM8L3RkPgogICAgICAgICAgICAgICAgPHRkPkNvbmZpZzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+U3RhdHVzPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5QYWNrYWdlPC90ZD4KICAgICAgICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC5wbSAtIGFsbCBmcmVkIGNvcmUgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkLnBtLHYgMS45IDIwMDgvMDUvMjEgMTA6MTE6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS45ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZCAtIGZyZWQgY29yZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZyZWQgc3RhbmRhcmQgY29yZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKRXZhbHVhdGUgdGhlIHNldmVyYWwgZGF0YSBvZiBhbGwgZnJlZCBtb2R1bGVzIGFuZCBhZGQgdGhlbQpvbiB0aGUgRnJlZE1vZHVsZXMgcmVmZXJlbmNlLgoKICAgICRGcmVkT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRGcmVkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RnJlZE1vZHVsZXNSZWZ9IHx8IHJlZiggJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSApIG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgRnJlZE1vZHVsZXNSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICggISRQYXJhbXtIVE1MRGF0YVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEhUTUxEYXRhUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRNb2R1bGVOYW1lICgga2V5cyAleyAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9IH0gKSB7CgogICAgICAgICMgbG9hZCBiYWNrZW5kCiAgICAgICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKCBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lICk7CgogICAgICAgICMgZ2V0IG1vZHVsZSBkYXRhCiAgICAgICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgICAgICAgICAgTW9kdWxlUmVmICAgICAgPT4gJFBhcmFte0ZyZWRNb2R1bGVzUmVmfS0+eyRNb2R1bGVOYW1lfSwKICAgICAgICAgICAgICAgIEhUTUxEYXRhUmVmICAgID0+ICRQYXJhbXtIVE1MRGF0YVJlZn0sCiAgICAgICAgICAgICAgICBGcmVkTW9kdWxlc1JlZiA9PiAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIGEgZnJlZCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKCBNb2R1bGVOYW1lID0+ICRQYXJhbXtNb2R1bGVOYW1lfSApOwoKICAgICMgZ2V0IG1vZHVsZSBkYXRhCiAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKCiAgICAgICAgIyBGSVhNRSBFcnJvcmhhbmRsaW5nCiAgICAgICAgJEJhY2tlbmRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIGEgZnJlZCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZU5hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVOYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkQmFja2VuZCggTW9kdWxlTmFtZSA9PiAkUGFyYW17TW9kdWxlTmFtZX0gKTsKCiAgICAjIGdldCBtb2R1bGUgZGF0YQogICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CgogICAgICAgICMgRklYTUUgRXJyb3JoYW5kbGluZwogICAgICAgICRCYWNrZW5kT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBfTG9hZEJhY2tlbmQoKQoKbG9hZCBhIHhtbCBpdGVtIG1vZHVsZQoKICAgICRCYWNrZW5kT2JqZWN0ID0gJEZyZWRPYmplY3QtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBfTG9hZEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZU5hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVOYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRHZW5lcmljTW9kdWxlID0gJ0tlcm5lbDo6U3lzdGVtOjpGcmVkOjonIC4gJFBhcmFte01vZHVsZU5hbWV9OwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9LCAlUGFyYW0sICk7CgogICAgICAgIGlmICgkQmFja2VuZE9iamVjdCkgewoKICAgICAgICAgICAgIyByZXR1cm4gb2JqZWN0CiAgICAgICAgICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBJbnNlcnRMYXlvdXRPYmplY3QyMigpCgpGUkFNRVdPUkstMi4yIHNwZWNpZmljIGJlY2F1c2UgdGhlcmUgaXMgbm8gTGF5b3V0T2JqZWN0IGludGVncmF0aW9uIGZvcgpGUkVEIGluIE9UUlMyLjIgTGF5b3V0LnBtCgogICAgJEZyZWRPYmplY3QtPkluc2VydExheW91dE9iamVjdDIyKCk7Cgo9Y3V0CgpzdWIgSW5zZXJ0TGF5b3V0T2JqZWN0MjIgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSBATGluZXMgPSAoKTsKICAgIG15ICRGaWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXQucG0nOwoKICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiIGlmIC1sICRGaWxlOwoKICAgICMgcmVhZCBmaWxlCiAgICBteSAkSW5TdWI7CiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgICAgIGlmICggJExpbmUgPX4gL3N1YiBQcmludCB7LyApIHsKICAgICAgICAgICAgJEluU3ViID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkSW5TdWIgJiYgJExpbmUgPX4gL0RlYnVnID0+IFwkU2VsZi0+e0RlYnVnfSwvICkgewogICAgICAgICAgICBwdXNoIEBMaW5lcywgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwdXNoIEBMaW5lcywgIiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+IFwkU2VsZixcbiI7CiAgICAgICAgICAgIHB1c2ggQExpbmVzLCAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgICRJblN1YiA9IDA7CiAgICAgICAgfQogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgIyB3cml0ZSBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICAjIGxvZyB0aGUgbWFuaXB1bGF0aW9uCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEiLAogICAgKTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBJbnNlcnRMYXlvdXRPYmplY3QyMSgpCgpGUkFNRVdPUkstMi4xIHNwZWNpZmljIGJlY2F1c2UgdGhlcmUgaXMgbm8gTGF5b3V0T2JqZWN0IGludGVncmF0aW9uIGZvcgpGUkVEIGluIE9UUlMyLjEgSW50ZXJmYWNlQWdlbnQucG0KCiAgICAkRnJlZE9iamVjdC0+SW5zZXJ0TGF5b3V0T2JqZWN0MjEoKTsKCj1jdXQKCnN1YiBJbnNlcnRMYXlvdXRPYmplY3QyMSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15IEBMaW5lcyAgICAgICA9ICgpOwogICAgbXkgJEZpbGUgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL1N5c3RlbS9XZWIvSW50ZXJmYWNlQWdlbnQucG0nOwogICAgbXkgJEZpbGVDaGFuZ2VkID0gMDsKCiAgICBkaWUgIkNhbid0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshIiBpZiAtbCAkRmlsZTsKCiAgICAjIHJlYWQgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIGlmICggJExpbmUgPX4gL15ccypwcmludCBcJEdlbmVyaWNPYmplY3QtPlJ1blwoXCk7LyApIHsKICAgICAgICAgICAgbXkgJE1hbmlwdWxhdGVkID0gPDwnICAgICAgICAgICAgRU5EX01BTklQVUxBVEVEJzsKICAgICAgICAgICAgIyBGUkVEIC0gbWFuaXB1bGF0ZWQKICAgICAgICAgICAgbXkgJE91dHB1dFJlZiA9IFwkR2VuZXJpY09iamVjdC0+UnVuKCk7CgogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZCcgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fSA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZC0+bmV3KAogICAgICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRTZWxmLT57TWFpbk9iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRTZWxmLT57TG9nT2JqZWN0fSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oICV7ICRTZWxmIH0sIERhdGEgPT4gJE91dHB1dFJlZiApOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAkeyRPdXRwdXRSZWZ9OwogICAgICAgICAgICAjcHJpbnQgJEdlbmVyaWNPYmplY3QtPlJ1bigpOwogICAgICAgICAgICAjIEZSRUQgLSBtYW5pcHVsYXRlZAogICAgICAgICAgICBFTkRfTUFOSVBVTEFURUQKICAgICAgICAgICAgcHVzaCBATGluZXMsICRNYW5pcHVsYXRlZDsKICAgICAgICAgICAgJEZpbGVDaGFuZ2VkID0gMTsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgIyB3cml0ZSBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICAjIGxvZyB0aGUgbWFuaXB1bGF0aW9uCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEiLAogICAgKTsKICAgIHJldHVybiAkRmlsZUNoYW5nZWQ7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDA4LzA1LzIxIDEwOjExOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9CZW5jaG1hcmsucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEJlbmNobWFyay5wbSx2IDEuNCAyMDA4LzA1LzIxIDEwOjExOjU3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkJlbmNobWFyazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkJlbmNobWFyawoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIGJlbmNobWFyayBkYXRhCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkX1JlZiAocXcoIE1vZHVsZVJlZiApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRfUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZF9SZWYhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGFibGVSZWYgPSBbCiAgICAgICAgWwogICAgICAgICAgICAiQ2FuJ3QgZmluZCB0aGUgYmVuY2htYXJrIHRhYmxlLCBwbGVhc2UgY2hlY2sgeW91ciBjb2RlIGFuIHJlYWQgdGhlIEhPV1RPIGZvciB0aGUgYmVuY2htYXJrIG1vZHVsZS4iCiAgICAgICAgXQogICAgXTsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0JlbmNobWFyaycpICkgewogICAgICAgICRUYWJsZVJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdCZW5jaG1hcmsnKTsKICAgIH0KICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSAkVGFibGVSZWY7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDgvMDUvMjEgMTA6MTE6NTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9Db25zb2xlLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDb25zb2xlLnBtLHYgMS42IDIwMDgvMDUvMjEgMTA6MTE6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6Q29uc29sZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpnaXZlcyB5b3UgYWxsIGZ1bmN0aW9ucyB3aGljaCBhcmUgbmVlZGVkIGZvciB0aGUgY29uc29sZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJFJlZiAocXcoTW9kdWxlUmVmIEhUTUxEYXRhUmVmIEZyZWRNb2R1bGVzUmVmKSkgewogICAgICAgIGlmICggISRQYXJhbXskUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFJlZiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15IEBNb2R1bGVzID0gKCk7CiAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXsgJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSB9ICkgewogICAgICAgIGlmICggJE1vZHVsZSBuZSAnQ29uc29sZScgKSB7CiAgICAgICAgICAgIHB1c2ggQE1vZHVsZXMsICRNb2R1bGU7CiAgICAgICAgfQogICAgfQogICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxATW9kdWxlczsKCiAgICBpZiAoICR7ICRQYXJhbXtIVE1MRGF0YVJlZn0gfSAhfiAvRnJlZC1TZXR0aW5nLyAmJiAkeyAkUGFyYW17SFRNTERhdGFSZWZ9IH0gPX4gL1w8Ym9keS4qP1w+LyApIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e1N0YXR1c30gPSAxOwogICAgfQoKICAgIGlmICggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ICF+IC9uYW1lPSJBY3Rpb24iIHZhbHVlPSJMb2dpbiIvICkgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57U2V0dGluZ30gPSAxOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDA4LzA1LzIxIDEwOjExOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9IVE1MQ2hlY2sucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEhUTUxDaGVjay5wbSx2IDEuNiAyMDA4LzA1LzIxIDEwOjExOjU3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxDaGVjawoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIEhUTUw6OiBsaW50IGNoZWNrCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKR2V0IHRoZSBkYXRhIGZvciB0aGlzIGZyZWQgbW9kdWxlLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuCkFuZCBhZGQgdGhlIGRhdGEgdG8gdGhlIG1vZHVsZSByZWYuCgogICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgTW9kdWxlUmVmID0+ICRNb2R1bGVSZWYsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRQYXJhbVJlZiAocXcoIE1vZHVsZVJlZiBIVE1MRGF0YVJlZiApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRQYXJhbVJlZn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRQYXJhbVJlZiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgdGhlIEhUTUwtT3V0cHV0IHdpdGggSFRNTDo6TGludAogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnSFRNTDo6TGludCcpICkgewogICAgICAgIG15ICRUZXh0ID0gJ1RoZSBIVE1MLWNoZWNrZXIgb2YgRnJlZCByZXF1aXJlcyBIVE1MOjpMaW50IHRvIGJlIGluc3RhbGxlZCEnCiAgICAgICAgICAgIC4gJ1BsZWFzZSBpbnN0YWxsIEhUTUw6OkxpbnQgdmlhIENQQU4gb3IgZGVhY3RpdmF0ZSB0aGUgSFRNTC1jaGVja2VyIHZpYSBTeXNDb25maWcuJzsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gWyRUZXh0XTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgSFRNTDo6TGludC0+aW1wb3J0KCk7CiAgICBteSAkSFRNTExpbnRPYmplY3QgPSBIVE1MOjpMaW50LT5uZXcoIG9ubHlfdHlwZXMgPT4gSFRNTDo6TGludDo6RXJyb3ItPlNUUlVDVFVSRSApOwogICAgJEhUTUxMaW50T2JqZWN0LT5wYXJzZSggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ICk7CgogICAgbXkgJEVycm9yQ291bnRlciA9ICRIVE1MTGludE9iamVjdC0+ZXJyb3JzOwogICAgbXkgQEhUTUxMaW50TWVzc2FnZXM7CiAgICBmb3IgbXkgJEVycm9yICggJEhUTUxMaW50T2JqZWN0LT5lcnJvcnMgKSB7CiAgICAgICAgbXkgJFN0cmluZyAuPSAkRXJyb3ItPmFzX3N0cmluZzsKICAgICAgICBpZiAoICRTdHJpbmcgIX4gL0ludmFsaWQgY2hhcmFjdGVyIC4rIHNob3VsZCBiZSB3cml0dGVuIGFzIC8gKSB7CiAgICAgICAgICAgIHB1c2ggQEhUTUxMaW50TWVzc2FnZXMsICRTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChASFRNTExpbnRNZXNzYWdlcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSBcQEhUTUxMaW50TWVzc2FnZXM7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDgvMDUvMjEgMTA6MTE6NTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TVERFUlJMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNUREVSUkxvZy5wbSx2IDEuMTEgMjAwOC8wNS8yMSAxMDoxMTo1NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U1RERVJSTG9nCgo9aGVhZDEgU1lOT1BTSVMKCmhhbmRsZSB0aGUgU1RERVJSIGxvZyBkYXRhCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkX1JlZiAocXcoIE1vZHVsZVJlZikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZF9SZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkX1JlZiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgb3BlbiB0aGUgU1RERVJSLmxvZyBmaWxlIHRvIGdldCB0aGUgU1RERVJSIG1lc3NhZ2VzCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkL1NUREVSUi5sb2cnOwogICAgbXkgJEZpbGVoYW5kbGU7CiAgICBpZiAoICFvcGVuICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlICkgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSBbCiAgICAgICAgICAgICJQZXJoYXBzIHlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gYXQgL3Zhci9mcmVkLyBvciAvS2VybmVsL0NvbmZpZy9GaWxlcy9BQUFGcmVkLnBtLiIsCiAgICAgICAgICAgICJDYW4ndCByZWFkIC92YXIvZnJlZC9TVERFUlIubG9nIgogICAgICAgIF07CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBMb2dNZXNzYWdlczsKCiAgICAjIGdldCB0aGUgd2hvbGUgaW5mb3JtYXRpb24KICAgIExJTkU6CiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgbGFzdCBMSU5FIGlmICRMaW5lID1+IG17XkZSRUR9bXN4OwoKICAgICAgICAjIEF0dGVudGlvbjogdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIGJlY2F1c2Ugb2YgRFByb2YuIEkgaGF2ZSB0byBmb3JjZSB0aGUgcHJvY2Vzcy4KICAgICAgICAjIFNvIEkgZ2V0IHRoaXMgd2FybmluZ3MhCiAgICAgICAgaWYgKAogICAgICAgICAgICAkTGluZQogICAgICAgICAgICAhfiAvKFN1YnJvdXRpbmUgLis/IHJlZGVmaW5lZCBhdHxoYXMgLis/IHVuc3RhY2tlZCBjYWxsc3xGYWtpbmcgLis/IGV4aXQgdGltZXN0YW1wKS8KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcHVzaCBATG9nTWVzc2FnZXMsICRMaW5lOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwogICAgcHJpbnQgU1RERVJSICJGUkVEXG4iOwogICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxATG9nTWVzc2FnZXM7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMSAkICREYXRlOiAyMDA4LzA1LzIxIDEwOjExOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TbWFsbFByb2YucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNtYWxsUHJvZi5wbSx2IDEuMTEgMjAwOC8wNS8yMSAxMDoxMTo1NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U21hbGxQcm9mCgo9aGVhZDEgU1lOT1BTSVMKCmhhbmRsZSB0aGUgU21hbGxQcm9mIHByb2ZpbGluZyBkYXRhCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhdGggICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi8nOwogICAgbXkgJENvbmZpZ19SZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6U21hbGxQcm9mJyk7CiAgICBteSBATGluZXM7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkUmVmIChxdyhIVE1MRGF0YVJlZiBNb2R1bGVSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbiB0aGlzIHR3byBjYXNlcyBpdCBtYWtlcyBubyBzZW5zZSB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsaW5nIGxpc3QKICAgIGlmICggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ICF+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGlzIHBhZ2UgZGVsaXZlciB0aGUgSFRNTCBieSBtYW55IHNlcGFyYXRlIG91dHB1dCBjYWxscy4nCiAgICAgICAgICAgICAgICAuICcgUGxlYXNlIHVzZSB0aGUgdXN1YWwgd2F5IHRvIGludGVycHJldCBTbWFsbFByb2YnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ID1+IC9GcmVkLVNldHRpbmcvOwoKICAgICMgZmluZCBvdXQgd2hpY2ggcGFja2FnZXMgYXJlIGNoZWNrZWQgYnkgU21hbGxQcm9mCiAgICBteSBAUGFja2FnZXMgICAgICAgID0ga2V5cyAlREI6OnBhY2thZ2VzOwogICAgbXkgJENWU0NoZWNrUHJvYmxlbSA9IFwlREI6OnBhY2thZ2VzOyAgICAgICAjIHNvcnJ5LCB0aGlzIGlzIGJlY2F1c2Ugb2YgdGhlIENWU0NoZWNrZXIKICAgIGlmICggISRQYWNrYWdlc1swXSApIHsKICAgICAgICAkUGFja2FnZXNbMF0gPSAnYWxsJzsKICAgIH0KICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57UGFja2FnZXN9ID0gXEBQYWNrYWdlczsKCiAgICAjIGNhdGNoIHRoZSBuZWVkZWQgcHJvZmlsaW5nIGRhdGEKICAgIHN5c3RlbSAiY3AgJFBhdGgvc21hbGxwcm9mLm91dCAkUGF0aC9GcmVkU21hbGxQcm9mLm91dCI7CgogICAgaWYgKCBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRQYXRoIC4gJ0ZyZWRTbWFsbFByb2Yub3V0JyApIHsKCiAgICAgICAgIyBjb252ZXJ0IHRoZSBmaWxlIGluIHVzZWFibGUgZGF0YQogICAgICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgICAgICBpZiAoICRMaW5lID1+IC8oLis/KTooXGQrPyk6KFxkKz8pOihcZCs/KTooXGQrPyk6XHMqKC4qPykkLyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQExpbmVzLCBbICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkZWZpbmUgdGhlIG9yZGVyIG9mIHRoZSBwcm9maWxpbmcgZGF0YQogICAgICAgIEBMaW5lcyA9IHNvcnQgeyAkYi0+WyAkQ29uZmlnX1JlZi0+e09yZGVyQnl9IF0gPD0+ICRhLT5bICRDb25maWdfUmVmLT57T3JkZXJCeX0gXSB9IEBMaW5lczsKICAgICAgICBpZiAoICRDb25maWdfUmVmLT57T3JkZXJCeX0gPT0gMSApIHsKICAgICAgICAgICAgQExpbmVzID0gcmV2ZXJzZSBATGluZXM7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBkaXNhYmxlZCBmaWxlcyBvciBwYXRoIGlmIG5lY2Vzc2FyeQogICAgICAgIGlmICggJENvbmZpZ19SZWYtPntEaXNhYmxlZEZpbGVzfSApIHsKICAgICAgICAgICAgbXkgJERpc2FibGVkRmlsZXMgPSBqb2luICd8JywgQHsgJENvbmZpZ19SZWYtPntEaXNhYmxlZEZpbGVzfSB9OwogICAgICAgICAgICBATGluZXMgPSBncmVwIHsgJF8tPlswXSAhfiBte14oJERpc2FibGVkRmlsZXMpfXggfSBATGluZXM7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgb25seSBzbyBtYW55IGxpbmVzIGFzIHdhbnRlZAogICAgICAgIGlmIChATGluZXMpIHsKICAgICAgICAgICAgc3BsaWNlIEBMaW5lcywgJENvbmZpZ19SZWYtPntTaG93bkxpbmVzfTsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxATGluZXM7CiAgICAgICAgfQogICAgICAgIGNsb3NlICRGaWxlaGFuZGxlOwogICAgfQoKICAgICMgY29tcHV0ZSB0b3RhbCBjYWxscwogICAgbXkgJFRvdGFsQ2FsbCA9IDA7CiAgICBmb3IgbXkgJFRpbWUgKEBMaW5lcykgewogICAgICAgIGlmICggJFRpbWUtPlsyXSA9fiAvXGQvICkgewogICAgICAgICAgICAkVG90YWxDYWxsICs9ICRUaW1lLT5bMl07CiAgICAgICAgfQogICAgfQogICAgJFBhcmFte01vZHVsZVJlZn0tPntUb3RhbENhbGx9ID0gJFRvdGFsQ2FsbDsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvYmluL2NnaS1iaW4vaW5kZXgucGwnOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISIgaWYgLWwgJEZpbGU7CgogICAgIyB0byB1c2UgU21hbGxQcm9mIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgbXkgQExpbmVzID0gPCRGaWxlaGFuZGxlPjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIS91c3IvYmluL3BlcmwgLXcgLWQ6U21hbGxQcm9mXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwoKICAgICMgY3JlYXRlIGEgaW5mbyBmb3IgdGhlIHVzZXIKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gIkZSRUQgbWFuaXB1bGF0ZWQgdGhlICRGaWxlISIsCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBTbWFsbFByb2YgbW9kdWxlCiAgICBteSAkU21hbGxQcm9mRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL2Jpbi9jZ2ktYmluLy5zbWFsbHByb2YnOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJSSwgJz4nLCAkU21hbGxQcm9mRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRTbWFsbFByb2ZGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWQgZG9uJ3QgZWRpdCB0aGlzIGZpbGUhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiMgdXNlIC4uLy4uLyBhcyBsaWIgbG9jYXRpb25cbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIEZpbmRCaW4gcXcoXCRCaW4pO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJ1c2UgbGliIFwiXCRCaW4vLi4vLi5cIjtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIEtlcm5lbDo6Q29uZmlnO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJteSBcJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiaWYgKFwkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZyZWQ6OlNtYWxsUHJvZicpLT57UGFja2FnZXN9KSB7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkKICAgICAgICAiICAgIG15IFxAQXJyYXkgPSBcQHsgXCRDb25maWdPYmplY3QtPkdldCgnRnJlZDo6U21hbGxQcm9mJyktPntQYWNrYWdlc30gfTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiICAgIG15IFwlSGFzaCA9IG1hcCB7IFwkXyA9PiAxOyB9IFxAQXJyYXk7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiAgICBcJURCOjpwYWNrYWdlcyA9IFwlSGFzaDtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAifVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJcJERCOjpkcm9wX3plcm9zID0gMTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiXCREQjo6Z3JlcF9mb3JtYXQgPSAxO1xuIjsKICAgIGNsb3NlICRGaWxlaGFuZGxlSUlJOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL2Jpbi9jZ2ktYmluL2luZGV4LnBsJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiIGlmIC1sICRGaWxlOwoKICAgICMgcmVhZCB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIG15IEBMaW5lcyA9IDwkRmlsZWhhbmRsZT47CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICAjIHJlbW92ZSB0aGUgbWFuaXB1bGF0ZWQgbGluZXMKICAgIGlmICggJExpbmVzWzBdID1+IC8jIVwvdXNyXC9iaW5cL3BlcmwgLXcgLWQ6U21hbGxQcm9mLyApIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CiAgICBpZiAoICRMaW5lc1swXSA9fiAvIyBGUkVEIC0gbWFuaXB1bGF0ZWQvICkgewogICAgICAgIHNoaWZ0IEBMaW5lczsKICAgIH0KCiAgICAjIHNhdmUgdGhlIGluZGV4LnBsIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiRlJFRCBtYW5pcHVsYXRlZCB0aGUgJEZpbGUhIiwKICAgICk7CgogICAgIyBkZWxldGUgdGhlIC5zbWFsbHByb2YgYmVjYXVzZSBpdCBpcyBubyBsb25nZXIgbmVlZGVkCiAgICBteSAkU21hbGxQcm9mRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL2Jpbi9jZ2ktYmluLy5zbWFsbHByb2YnOwogICAgdW5saW5rICRTbWFsbFByb2ZGaWxlOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjExICQgJERhdGU6IDIwMDgvMDUvMjEgMTA6MTE6NTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9EUHJvZi5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRFByb2YucG0sdiAxLjcgMjAwOC8wNS8yMSAxMDoxMTo1NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpEUHJvZjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkRQcm9mCgo9aGVhZDEgU1lOT1BTSVMKCmhhbmRsZSB0aGUgRFByb2YgcHJvZmlsaW5nIGRhdGEKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKR2V0IHRoZSBkYXRhIGZvciB0aGlzIGZyZWQgbW9kdWxlLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuCkFuZCBhZGQgdGhlIGRhdGEgdG8gdGhlIG1vZHVsZSByZWYuCgogICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgTW9kdWxlUmVmID0+ICRNb2R1bGVSZWYsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATGluZXM7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkUmVmIChxdyhIVE1MRGF0YVJlZiBNb2R1bGVSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbiB0aGlzIHR3byBjYXNlcyBpdCBtYWtlcyBubyBzZW5zZSB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsaW5nIGxpc3QKICAgIGlmICggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ICF+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGlzIHBhZ2UgZGVsaXZlciB0aGUgSFRNTCBieSBtYW55IHNlcGFyYXRlIG91dHB1dCBjYWxscy4nCiAgICAgICAgICAgICAgICAuICcgUGxlYXNlIHVzZSB0aGUgdXN1YWwgd2F5IHRvIGludGVycHJldCBEUHJvZicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmICggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ID1+IC9GcmVkLVNldHRpbmcvICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgY2F0Y2ggdGhlIG5lZWRlZCBwcm9maWxpbmcgZGF0YQogICAgbXkgJFBhdGggPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi8nOwogICAgc3lzdGVtICJjcCAkUGF0aC90bW9uLm91dCAkUGF0aC9EUHJvZi5vdXQiOwoKICAgIG15ICRDb25maWdfUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6OkRQcm9mJyk7CiAgICBteSBAUHJvZmlsaW5nUmVzdWx0czsKCiAgICAjIHJldHVybnMgdGhlIHRyZWUgcmVzdWx0cyBvZiBjb25maWd1cmVkCiAgICBpZiAoICRDb25maWdfUmVmLT57RnVuY3Rpb25UcmVlfSApIHsKICAgICAgICBpZiAoIG9wZW4gbXkgJEZpbGVoYW5kbGUsICJkcHJvZnBwIC1GVCAkUGF0aC9EUHJvZi5vdXQgfCIgKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgcHVzaCBAUHJvZmlsaW5nUmVzdWx0cywgWyAkQ291bnRlciwgJExpbmUgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntGdW5jdGlvblRyZWV9ID0gXEBQcm9maWxpbmdSZXN1bHRzOwoKICAgICAgICByZXR1cm4gMTsKCiAgICB9CgogICAgIyBzaG93IHRoZSBjb21tb24gcGVyZm9ybWFuY2UgcmVzdWx0cwogICAgbXkgJFNob3duTGluZXMgPSAkQ29uZmlnX1JlZi0+e1Nob3duTGluZXN9IDwgNDAgPyAkQ29uZmlnX1JlZi0+e1Nob3duTGluZXN9IDogNDA7CiAgICBteSAkT3B0aW9ucyA9ICItRiAtTyAkU2hvd25MaW5lcyAiOwogICAgJE9wdGlvbnMgLj0gJENvbmZpZ19SZWYtPntPcmRlckJ5fSBlcSAnTmFtZScKICAgICAgICA/ICctYScKICAgICAgICA6ICRDb25maWdfUmVmLT57T3JkZXJCeX0gZXEgJ0NhbGxzJyA/ICctbCcKICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnOwogICAgaWYgKCBvcGVuIG15ICRGaWxlaGFuZGxlLCAiZHByb2ZwcCAkT3B0aW9ucyAkUGF0aC9EUHJvZi5vdXQgfCIgKSB7CiAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRMaW5lCiAgICAgICAgICAgICAgICA9fiAvXlxzKj8oW15cc10rPylccys/KFteXHNdKz8pXHMrPyhbXlxzXSs/KVxzKz8oW15cc10rPylccys/KFteXHNdKz8pXHMrPyhbXlxzXSs/KVxzKz8oW15cc10rPykkLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBQcm9maWxpbmdSZXN1bHRzLCBbICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3IF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkTGluZSA9fiAvXlxzKj8oW15cc10rPykkLyApIHsKICAgICAgICAgICAgICAgICRQcm9maWxpbmdSZXN1bHRzWy0xXVs2XSAuPSAkMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgIH0KCiAgICBzaGlmdCBAUHJvZmlsaW5nUmVzdWx0czsKCiAgICBpZiAoICRDb25maWdfUmVmLT57T3JkZXJCeX0gZXEgJ0N1VGltZScgKSB7CiAgICAgICAgQFByb2ZpbGluZ1Jlc3VsdHMgPSBzb3J0IHsgJGItPlsyXSA8PT4gJGEtPlsyXSB9IEBQcm9maWxpbmdSZXN1bHRzOwogICAgfQoKICAgICMgcmVtb3ZlIGRpc2FibGVkIHBhY2thZ2VzIGlmIG5lY2Vzc2FyeQogICAgaWYgKCAkQ29uZmlnX1JlZi0+e0Rpc2FibGVkUGFja2FnZXN9ICkgewogICAgICAgIG15ICREaXNhYmxlZFBhY2thZ2VzID0gam9pbiAnfCcsIEB7ICRDb25maWdfUmVmLT57RGlzYWJsZWRQYWNrYWdlc30gfTsKICAgICAgICBAUHJvZmlsaW5nUmVzdWx0cyA9IGdyZXAgeyAkXy0+WzZdICF+IG17XigkRGlzYWJsZWRQYWNrYWdlcyk6On14IH0gQFByb2ZpbGluZ1Jlc3VsdHM7CiAgICB9CgogICAgIyBjb21wdXRlIHRvdGFsIHRpbWUKICAgIG15ICRUb3RhbFRpbWUgPSAwOwogICAgZm9yIG15ICRUaW1lIChAUHJvZmlsaW5nUmVzdWx0cykgewogICAgICAgIGlmICggJFRpbWUtPlsxXSBuZSAnLScgKSB7CiAgICAgICAgICAgICRUb3RhbFRpbWUgKz0gJFRpbWUtPlsxXTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRUb3RhbFRpbWUpIHsKICAgICAgICBmb3IgbXkgJFRpbWUgKEBQcm9maWxpbmdSZXN1bHRzKSB7CiAgICAgICAgICAgIGlmICggJFRpbWUtPlsxXSBuZSAnLScgKSB7CiAgICAgICAgICAgICAgICAkVGltZS0+WzBdID0gaW50KCAkVGltZS0+WzFdIC8gJFRvdGFsVGltZSAqIDEwMDAwICkgLyAxMDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjb21wdXRlIHRvdGFsIGNhbGxzCiAgICBteSAkVG90YWxDYWxsID0gMDsKICAgIGZvciBteSAkVGltZSAoQFByb2ZpbGluZ1Jlc3VsdHMpIHsKICAgICAgICBpZiAoICRUaW1lLT5bM10gPX4gL1xkLyApIHsKICAgICAgICAgICAgJFRvdGFsQ2FsbCArPSAkVGltZS0+WzNdOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ICAgICAgPSBcQFByb2ZpbGluZ1Jlc3VsdHM7CiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e1RvdGFsVGltZX0gPSAkVG90YWxUaW1lOwogICAgJFBhcmFte01vZHVsZVJlZn0tPntUb3RhbENhbGx9ID0gJFRvdGFsQ2FsbDsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvYmluL2NnaS1iaW4vaW5kZXgucGwnOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiOwogICAgfQoKICAgICMgdG8gdXNlIERQcm9mIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMhL3Vzci9iaW4vcGVybCAtdyAtZDpEUHJvZlxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICAjIGNyZWF0ZSBhIGluZm8gZm9yIHRoZSB1c2VyCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEiLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi9pbmRleC5wbCc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISI7CiAgICB9CgogICAgIyByZWFkIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgIyByZW1vdmUgdGhlIG1hbmlwdWxhdGVkIGxpbmVzCiAgICBpZiAoICRMaW5lc1swXSA9fiAvIyFcL3VzclwvYmluXC9wZXJsIC13IC1kOkRQcm9mLyApIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CiAgICBpZiAoICRMaW5lc1swXSA9fiAvIyBGUkVEIC0gbWFuaXB1bGF0ZWQvICkgewogICAgICAgIHNoaWZ0IEBMaW5lczsKICAgIH0KCiAgICAjIHNhdmUgdGhlIGluZGV4LnBsIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiRlJFRCBtYW5pcHVsYXRlZCB0aGUgJEZpbGUhIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA4LzA1LzIxIDEwOjExOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9UcmFuc2xhdGlvbkRlYnVnLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBUcmFuc2xhdGlvbkRlYnVnLnBtLHYgMS4xMSAyMDA5LzAzLzMxIDEyOjQ3OjUwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpUcmFuc2xhdGlvbkRlYnVnOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWcKCj1oZWFkMSBTWU5PUFNJUwoKaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBkZWJ1ZyBkYXRhCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvcGVuIHRoZSBUcmFuc2xhdGlvbkRlYnVnLmxvZyBmaWxlIHRvIGdldCB0aGUgdW50cmFuc2xhdGVkIHdvcmRzCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkL1RyYW5zbGF0aW9uRGVidWcubG9nJzsKICAgIG15ICRGaWxlaGFuZGxlOwogICAgaWYgKCAhb3BlbiAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSApIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gWwogICAgICAgICAgICAiUGVyaGFwcyB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIGF0IC92YXIvZnJlZC8iLAogICAgICAgICAgICAiQ2FuJ3QgcmVhZCAvdmFyL2ZyZWQvVHJhbnNsYXRpb25EZWJ1Zy5sb2ciCiAgICAgICAgXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBteSBATG9nTWVzc2FnZXM7CgogICAgIyBnZXQgdGhlIHdob2xlIGluZm9ybWF0aW9uCiAgICBMSU5FOgogICAgZm9yIG15ICRMaW5lICggcmV2ZXJzZSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIGxhc3QgTElORSBpZiAkTGluZSA9fiAvRlJFRC87CgogICAgICAgIGNob21wICRMaW5lOwogICAgICAgIG5leHQgTElORSBpZiAkTGluZSBlcSAnJzsKCiAgICAgICAgcHVzaCBATG9nTWVzc2FnZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgJFNlbGYtPkluc2VydFdvcmQoIFdoYXQgPT4gIkZSRURcbiIgKTsKCiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gXEBMb2dNZXNzYWdlczsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL0xhbmd1YWdlLnBtJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiIGlmIC1sICRGaWxlOwoKICAgICMgdG8gdXNlIFRyYW5zbGF0aW9uRGVidWcgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIExhbmd1YWdlLnBtIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICBteSBATGluZXMgPSA8JEZpbGVoYW5kbGU+OwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgICAgICBpZiAoICRMaW5lID1+IC8jIHdhcm4gaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWYvICkgewogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpUcmFuc2xhdGlvbkRlYnVnO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSQogICAgICAgICAgICAgICAgIm15IFwkVHJhbnNsYXRpb25EZWJ1Z09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpUcmFuc2xhdGlvbkRlYnVnLT5uZXcoXCV7XCRTZWxmfSk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJcJFRyYW5zbGF0aW9uRGVidWdPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcJFdoYXQpO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgfQogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvTGFuZ3VhZ2UucG0nOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISIgaWYgLWwgJEZpbGU7CgogICAgIyB0byB1c2UgVHJhbnNsYXRpb25EZWJ1Z2dlciBJIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgTGFuZ3VhZ2UucG0gZmlsZQogICAgIyBoZXJlIEkgdW5kbyBteSBtYW5pcHVsYXRpb24KICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICBteSBATGluZXMgPSA8JEZpbGVoYW5kbGU+OwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKCiAgICBteSAlUmVtb3ZlTGluZSA9ICgKICAgICAgICAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiIgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJ1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWc7XG4iID0+IDEsCiAgICAgICAgIm15IFwkVHJhbnNsYXRpb25EZWJ1Z09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpUcmFuc2xhdGlvbkRlYnVnLT5uZXcoXCV7XCRTZWxmfSk7XG4iCiAgICAgICAgICAgID0+IDEsCiAgICAgICAgIlwkVHJhbnNsYXRpb25EZWJ1Z09iamVjdC0+SW5zZXJ0V29yZChXaGF0ID0+IFwkV2hhdCk7XG4iID0+IDEsCiAgICApOwoKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgaWYgKCAhJFJlbW92ZUxpbmV7JExpbmV9ICkgewogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gSW5zZXJ0V29yZCgpCgpTYXZlIGEgd29yZCBpbiB0aGUgdHJhbnNsYXRpb24gZGVidWcgbG9nCgogICAgJEJhY2tlbmRPYmplY3QtPkluc2VydFdvcmQoCiAgICAgICAgV2hhdCA9PiAnYSB3b3JkJywKICAgICk7Cgo9Y3V0CgpzdWIgSW5zZXJ0V29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17V2hhdH0gKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV2hhdCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2F2ZSB0aGUgd29yZCBpbiBsb2cgZmlsZQogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvZnJlZC9UcmFuc2xhdGlvbkRlYnVnLmxvZyc7CiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPj4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZSAkUGFyYW17V2hhdH0gLiAiXG4iOwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjExICQgJERhdGU6IDIwMDkvMDMvMzEgMTI6NDc6NTAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TUUxMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNRTExvZy5wbSx2IDEuMTAgMjAwOC8wNS8yMSAxMDoxMTo1NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U1FMTG9nCgo9aGVhZDEgU1lOT1BTSVMKCmhhbmRsZSB0aGUgc3FsIGxvZwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb3BlbiB0aGUgVHJhbnNsYXRpb25EZWJ1Zy5sb2cgZmlsZSB0byBnZXQgdGhlIHVudHJhbnNsYXRlZCB3b3JkcwogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvZnJlZC9TUUwubG9nJzsKICAgIG15ICRGaWxlaGFuZGxlOwogICAgaWYgKCAhb3BlbiAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSApIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gWwogICAgICAgICAgICAiUGVyaGFwcyB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIGF0IC92YXIvZnJlZC8iLAogICAgICAgICAgICAiQ2FuJ3QgcmVhZCAvdmFyL2ZyZWQvU1FMLmxvZyIKICAgICAgICBdOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBATG9nTWVzc2FnZXM7CiAgICBteSAkRG9TdGF0ZW1lbnRzICAgICA9IDA7CiAgICBteSAkU2VsZWN0U3RhdGVtZW50cyA9IDA7CgogICAgIyBnZXQgdGhlIHdob2xlIGluZm9ybWF0aW9uCiAgICBMSU5FOgogICAgZm9yIG15ICRMaW5lICggcmV2ZXJzZSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIGxhc3QgTElORSBpZiAkTGluZSA9fiAvRlJFRC87CgogICAgICAgIG15IEBTcGxpdGVkTG9nID0gc3BsaXQgLzsvLCAkTGluZTsKICAgICAgICBpZiAoICRTcGxpdGVkTG9nWzBdIGVxICdTUUwtRE8nICYmICRTcGxpdGVkTG9nWzFdID1+IC9eU0VMRUNULyApIHsKICAgICAgICAgICAgJFNwbGl0ZWRMb2dbMF0gLj0gJyAtIFBlcmhhcHMgeW91IGhhdmUgYW4gZXJyb3IgeW91IHVzZSBETyBmb3IgYSBTRUxFQ1QtU3RhdGVtZW50Oic7CiAgICAgICAgfQogICAgICAgIHB1c2ggQExvZ01lc3NhZ2VzLCBcQFNwbGl0ZWRMb2c7CgogICAgICAgIGlmICggJFNwbGl0ZWRMb2dbMF0gZXEgJ1NRTC1ETycgKSB7CiAgICAgICAgICAgICREb1N0YXRlbWVudHMrKzsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNmZXIgaW4gMS8xMDAgc2VjCiAgICAgICAgaWYgKCAkU3BsaXRlZExvZ1szXSApIHsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntUaW1lfSArPSAkU3BsaXRlZExvZ1szXTsKICAgICAgICAgICAgJFNwbGl0ZWRMb2dbM10gKj0gMTAwOwogICAgICAgIH0KICAgIH0KCiAgICBwb3AgQExvZ01lc3NhZ2VzOwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgIyBmaW5kIG11bHRpIHVzZWQgc3RhdGVtZW50cwogICAgbXkgJU11bHRpVXNlZDsKICAgIGZvciBteSAkU3RhdGVtZW50UmVmIChATG9nTWVzc2FnZXMpIHsKICAgICAgICAkTXVsdGlVc2VkeyAkU3RhdGVtZW50UmVmLT5bMV0gfSsrOwogICAgfQogICAgZm9yIG15ICRTdGF0ZW1lbnRSZWYgKEBMb2dNZXNzYWdlcykgewogICAgICAgIHB1c2ggQHskU3RhdGVtZW50UmVmfSwgKCAkTXVsdGlVc2VkeyAkU3RhdGVtZW50UmVmLT5bMV0gfSAtIDEgKTsKICAgIH0KCiAgICAkU2VsZi0+SW5zZXJ0V29yZCggV2hhdCA9PiAiRlJFRFxuIiApOwogICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSAgICAgICAgICAgICA9IFxATG9nTWVzc2FnZXM7CiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0FsbFN0YXRlbWVudHN9ICAgID0gc2NhbGFyIEBMb2dNZXNzYWdlczsKICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RG9TdGF0ZW1lbnRzfSAgICAgPSAkRG9TdGF0ZW1lbnRzOwogICAgJFBhcmFte01vZHVsZVJlZn0tPntTZWxlY3RTdGF0ZW1lbnRzfSA9ICRQYXJhbXtNb2R1bGVSZWZ9LT57QWxsU3RhdGVtZW50c30gLSAkRG9TdGF0ZW1lbnRzOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvU3lzdGVtL0RCLnBtJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiIGlmIC1sICRGaWxlOwoKICAgICMgdG8gdXNlIFRyYW5zbGF0aW9uRGVidWcgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIExhbmd1YWdlLnBtIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICBteSBATGluZXMgPSA8JEZpbGVoYW5kbGU+OwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnbm90aWNlJywgTWVzc2FnZSA9PiAid3JpdGUgZmlsZSEiICk7CiAgICBteSAkUHJlcGFyZTsKICAgIG15ICREb1NRTDsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkTGluZSA9fiBtW14gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgIFwoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgIFwoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgIFwkU2VsZi0+e0N1cnMoZXxvKXJ9ICAgICAgICAgICAgXHMqICMgYmVjYXVzZSBvZiBhbiB0eXBvIGJ1Z2ZpeCBpbiAyLjMKICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgICAgICAgICAgXCRTZWxmLT57ZGJofS0+cHJlcGFyZVwoXCRTUUxcKSBccyoKICAgICAgICAgICAgICAgICAgICAgICAgXCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgICAgICAgICAgXCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICBdeAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ25vdGljZScsIE1lc3NhZ2UgPT4gImluc2VydCBmcmVkIGxvZyBQcmVwYXJlISIgKTsKICAgICAgICAgICAgJFByZXBhcmUgPSAxOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2c7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJ1c2UgVGltZTo6SGlSZXMgcXcoZ2V0dGltZW9mZGF5IHR2X2ludGVydmFsKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkdDAgPSBbZ2V0dGltZW9mZGF5XTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkKICAgICAgICAgICAgICAgICJteSBcJFNRTExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2ctPm5ldyhcJXtcJFNlbGZ9KTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkQ2FsbGVyID0gY2FsbGVyKCk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKCiAgICAgICAgfQogICAgICAgIGlmICggJExpbmUgPX4gbXteICAgICMgc2xvdyBsb2cgZmVhdHVyZX0gJiYgJFByZXBhcmUgKSB7CiAgICAgICAgICAgICRQcmVwYXJlID0gMDsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkRGlmZlRpbWUgPSB0dl9pbnRlcnZhbChcJHQwKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkKICAgICAgICAgICAgICAgICJcJFNRTExvZ09iamVjdC0+SW5zZXJ0V29yZChXaGF0ID0+IFwiU1FMLVNFTEVDVDtcJFNRTDtcJENhbGxlcjtcJERpZmZUaW1lXCIpO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRMaW5lID1+IC9eICAgICMgc2VuZCBzcWwgdG8gZGF0YWJhc2UvICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ25vdGljZScsIE1lc3NhZ2UgPT4gImluc2VydCBmcmVkIGxvZyBkbyEiICk7CiAgICAgICAgICAgICREb1NRTCA9IDE7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJ1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNRTExvZztcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgInVzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkgdHZfaW50ZXJ2YWwpO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAibXkgXCR0MCA9IFtnZXR0aW1lb2ZkYXldO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSQogICAgICAgICAgICAgICAgIm15IFwkU1FMTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNRTExvZy0+bmV3KFwle1wkU2VsZn0pO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAibXkgXCRDYWxsZXIgPSBjYWxsZXIoKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkTGluZSA9fiBte14gICAgcmV0dXJuIDE7fSAmJiAkRG9TUUwgKSB7CiAgICAgICAgICAgICREb1NRTCA9IDA7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJteSBcJERpZmZUaW1lID0gdHZfaW50ZXJ2YWwoXCR0MCk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJCiAgICAgICAgICAgICAgICAiXCRTUUxMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlNRTC1ETztcJFBhcmFte1NRTH07XCRDYWxsZXI7XCREaWZmVGltZVwiKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgIH0KCiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL1N5c3RlbS9EQi5wbSc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBkaWUgIkNhbid0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshIiBpZiAtbCAkRmlsZTsKCiAgICAjIHRvIHVzZSBUcmFuc2xhdGlvbkRlYnVnZ2VyIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBMYW5ndWFnZS5wbSBmaWxlCiAgICAjIGhlcmUgSSB1bmRvIG15IG1hbmlwdWxhdGlvbgogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIG15IEBMaW5lcyA9IDwkRmlsZWhhbmRsZT47CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwoKICAgIG15ICVSZW1vdmVMaW5lID0gKAogICAgICAgICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2c7XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgIm15IFwkU1FMTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNRTExvZy0+bmV3KFwle1wkU2VsZn0pO1xuIiAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJteSBcJENhbGxlciA9IGNhbGxlcigpO1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAiXCRTUUxMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlNRTC1ETztcJFBhcmFte1NRTH07XCRDYWxsZXJcO1wkRGlmZlRpbWVcIik7XG4iID0+IDEsCiAgICAgICAgIlwkU1FMTG9nT2JqZWN0LT5JbnNlcnRXb3JkKFdoYXQgPT4gXCJTUUwtU0VMRUNUO1wkU1FMO1wkQ2FsbGVyXDtcJERpZmZUaW1lXCIpO1xuIiAgICA9PiAxLAogICAgICAgICJ1c2UgVGltZTo6SGlSZXMgcXcoZ2V0dGltZW9mZGF5IHR2X2ludGVydmFsKTtcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAibXkgXCR0MCA9IFtnZXR0aW1lb2ZkYXldO1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgIm15IFwkRGlmZlRpbWUgPSB0dl9pbnRlcnZhbChcJHQwKTtcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIGlmICggISRSZW1vdmVMaW5leyRMaW5lfSApIHsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEluc2VydFdvcmQoKQoKU2F2ZSBhIHdvcmQgaW4gdGhlIHRyYW5zbGF0aW9uIGRlYnVnIGxvZwoKICAgICRCYWNrZW5kT2JqZWN0LT5JbnNlcnRXb3JkKAogICAgICAgIFdoYXQgPT4gJ2Egd29yZCcsCiAgICApOwoKPWN1dAoKc3ViIEluc2VydFdvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1doYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXaGF0IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzYXZlIHRoZSB3b3JkIGluIGxvZyBmaWxlCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkL1NRTC5sb2cnOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJz4+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGUgJFBhcmFte1doYXR9IC4gIlxuIjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEwICQgJERhdGU6IDIwMDgvMDUvMjEgMTA6MTE6NTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9Db25maWdMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENvbmZpZ0xvZy5wbSx2IDEuOCAyMDA4LzA1LzIxIDEwOjExOjU3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIGNvbmZpZyBsb2cgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICRQYXJhbXskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQExvZ01lc3NhZ2VzOwoKICAgICMgb3BlbiB0aGUgVHJhbnNsYXRpb25EZWJ1Zy5sb2cgZmlsZSB0byBnZXQgdGhlIHVudHJhbnNsYXRlZCB3b3JkcwogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvZnJlZC9Db25maWcubG9nJzsKICAgIG15ICRGaWxlaGFuZGxlOwogICAgaWYgKCAhb3BlbiAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSApIHsKICAgICAgICBwcmludCBTVERFUlIgIlBlcmhhcHMgeW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiBhdCAvdmFyL2ZyZWQvXG4iIC4KICAgICAgICAgICAgIkNhbid0IHJlYWQgL3Zhci9mcmVkL0NvbmZpZy5sb2ciOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgd2hvbGUgaW5mb3JtYXRpb24KICAgIExJTkU6CiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgbGFzdCBMSU5FIGlmICRMaW5lID1+IC9GUkVELzsKICAgICAgICBwdXNoIEBMb2dNZXNzYWdlcywgJExpbmU7CiAgICB9CgogICAgY2xvc2UgJEZpbGVoYW5kbGU7CiAgICBwb3AgQExvZ01lc3NhZ2VzOwogICAgJFNlbGYtPkluc2VydFdvcmQoIFdoYXQgPT4gIkZSRURcbiIgKTsKCiAgICBteSAlSW5kaXZpZHVhbENvbmZpZyA9ICgpOwoKICAgIGZvciBteSAkTGluZSAoQExvZ01lc3NhZ2VzKSB7CiAgICAgICAgJExpbmUgPX4gcy9cbi8vOwogICAgICAgICRJbmRpdmlkdWFsQ29uZmlneyRMaW5lfSsrOwogICAgfQoKICAgIEBMb2dNZXNzYWdlcyA9ICgpOwogICAgZm9yIG15ICRMaW5lICgga2V5cyAlSW5kaXZpZHVhbENvbmZpZyApIHsKICAgICAgICBteSBAU3BsaXRlZExpbmUgPSBzcGxpdCAvOy8sICRMaW5lOwogICAgICAgIHB1c2ggQFNwbGl0ZWRMaW5lLCAkSW5kaXZpZHVhbENvbmZpZ3skTGluZX07CiAgICAgICAgcHVzaCBATG9nTWVzc2FnZXMsIFxAU3BsaXRlZExpbmU7CiAgICB9CgogICAgIyBzb3J0IHRoZSBkYXRhCiAgICBteSAkQ29uZmlnX1JlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpDb25maWdMb2cnKTsKICAgIG15ICRPcmRlckJ5ID0gZGVmaW5lZCggJENvbmZpZ19SZWYtPntPcmRlckJ5fSApID8gJENvbmZpZ19SZWYtPntPcmRlckJ5fSA6IDM7CiAgICBpZiAoICRPcmRlckJ5ID09IDMgKSB7CiAgICAgICAgQExvZ01lc3NhZ2VzID0gc29ydCB7ICRiLT5bJE9yZGVyQnldIDw9PiAkYS0+WyRPcmRlckJ5XSB9IEBMb2dNZXNzYWdlczsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEBMb2dNZXNzYWdlcyA9IHNvcnQgeyAkYS0+WyRPcmRlckJ5XSBjbXAgJGItPlskT3JkZXJCeV0gfSBATG9nTWVzc2FnZXM7CiAgICB9CgogICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxATG9nTWVzc2FnZXM7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15IEBMaW5lcyA9ICgpOwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL0NvbmZpZy9EZWZhdWx0cy5wbSc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBkaWUgIkNhbid0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshIiBpZiAtbCAkRmlsZTsKCiAgICAjIHRvIHVzZSBUcmFuc2xhdGlvbkRlYnVnIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBMYW5ndWFnZS5wbSBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgQExpbmVzID0gPCRGaWxlaGFuZGxlPjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBteSAkU3ViR2V0ID0gJyc7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICAgICAgaWYgKCAkTGluZSA9fiAvc3ViIEdldC8gKSB7CiAgICAgICAgICAgICRTdWJHZXQgPSAiR2V0IjsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU3ViR2V0IGVxICdHZXQnICYmICRMaW5lID1+IC9teSBcJFNlbGYgPSBzaGlmdDsvICkgewogICAgICAgICAgICAkU3ViR2V0IC49ICdTZWxmJzsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICAoICRTdWJHZXQgZXEgJ0dldFNlbGYnICYmICRMaW5lID1+IC9teSBcJFdoYXQgPSBzaGlmdDsvICkgICAgIyBPVFJTIDIuMgogICAgICAgICAgICB8fCAkU3ViR2V0IGVxICdHZXQnICYmICRMaW5lID1+IC9teSBcKCBcJFNlbGYsIFwkV2hhdCBcKSA9IFxAXzsvCiAgICAgICAgICAgICkKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT1RSUyAyLjMKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgInVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6Q29uZmlnTG9nO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAibXkgXCRDb25maWdMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6Q29uZmlnTG9nLT5uZXcoKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkQ2FsbGVyID0gY2FsbGVyKCk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJpZiAoXCRTZWxmLT57XCRXaGF0fSkgeyAjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSQogICAgICAgICAgICAgICAgIiAgICBcJENvbmZpZ0xvZ09iamVjdC0+SW5zZXJ0V29yZChXaGF0ID0+IFwiXCRXaGF0O1RydWU7XCRDYWxsZXI7XCIsIEhvbWUgPT4gXCRTZWxmLT57SG9tZX0pO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAifSAgICAgICAgICAgICAgICAgICAgICMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJlbHNlIHsgICAgICAgICAgICAgICAgIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkKICAgICAgICAgICAgICAgICIgICAgXCRDb25maWdMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlwkV2hhdDtGYWxzZTtcJENhbGxlcjtcIiwgSG9tZSA9PiBcJFNlbGYtPntIb21lfSk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJ9ICAgICAgICAgICAgICAgICAgICAgIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL0NvbmZpZy9EZWZhdWx0cy5wbSc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISI7CiAgICB9CgogICAgIyB0byB1c2UgVHJhbnNsYXRpb25EZWJ1Z2dlciBJIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgTGFuZ3VhZ2UucG0gZmlsZQogICAgIyBoZXJlIEkgdW5kbyBteSBtYW5pcHVsYXRpb24KICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICB3aGlsZSAoIG15ICRMaW5lID0gPCRGaWxlaGFuZGxlPiApIHsKICAgICAgICBwdXNoIEBMaW5lcywgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwoKICAgIG15ICVSZW1vdmVMaW5lID0gKAogICAgICAgICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJ1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZztcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJteSBcJENvbmZpZ0xvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpDb25maWdMb2ctPm5ldygpO1xuIiA9PiAxLAogICAgICAgICJteSBcJENhbGxlciA9IGNhbGxlcigpO1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJpZiAoXCRTZWxmLT57XCRXaGF0fSkgeyAjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIiAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICIgICAgXCRDb25maWdMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlwkV2hhdDtUcnVlO1wkQ2FsbGVyO1wiLCBIb21lID0+IFwkU2VsZi0+e0hvbWV9KTtcbiIKICAgICAgICAgICAgPT4gMSwKICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iID0+IDEsCiAgICAgICAgImVsc2UgeyAgICAgICAgICAgICAgICAjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIiA9PiAxLAogICAgICAgICIgICAgXCRDb25maWdMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlwkV2hhdDtGYWxzZTtcJENhbGxlcjtcIiwgSG9tZSA9PiBcJFNlbGYtPntIb21lfSk7XG4iCiAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgaWYgKCAhJFJlbW92ZUxpbmV7JExpbmV9ICkgewogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gSW5zZXJ0V29yZCgpCgpTYXZlIGEgd29yZCBpbiB0aGUgdHJhbnNsYXRpb24gZGVidWcgbG9nCgogICAgJEJhY2tlbmRPYmplY3QtPkluc2VydFdvcmQoCiAgICAgICAgV2hhdCA9PiAnYSB3b3JkJywKICAgICk7Cgo9Y3V0CgpzdWIgSW5zZXJ0V29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtIb21lfSApIHsKICAgICAgICAkUGFyYW17SG9tZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgfQoKICAgICMgc2F2ZSB0aGUgd29yZCBpbiBsb2cgZmlsZQogICAgbXkgJEZpbGUgPSAkUGFyYW17SG9tZX0gLiAnL3Zhci9mcmVkL0NvbmZpZy5sb2cnOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJz4+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGUgJFBhcmFte1doYXR9IC4gIlxuIjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjggJCAkRGF0ZTogMjAwOC8wNS8yMSAxMDoxMTo1NyAkCgo9Y3V0Cg==