Fred
0.2.5
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Insert the DProf profiling function.
Insert the translation debug log.
Improved the handling of the profiler.
Insert a profiling function.
Improved the package settings.
First modular version.
Remove modperl reload informations from the fred log.
Added Database::SlowLog feature.
Improved the config description.
No longer crashes if HTML::Lint is not installed but HTML-checker is active.
Improved output.
First version especially for testing and as proof of concept.
A tool to support the developer by his development.
Ein Entwicklertool welches dem Entwickler zur Laufzeit bei der Entwicklung unterstützen soll.
2.2.x
2.3.x
2007-09-26 08:11:08
opms.otrs.com
IyAtLQojIEFBQUZyZWQucG0gLSB0aGUgY29uZmlnIHRvIGJpbmQgU1RERVJSIHRvIGFuIGxvZyBmaWxlIHVzYWJsZSBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBQUFGcmVkLnBtLHYgMS42IDIwMDcvMDkvMjYgMDY6MDg6MzAgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgppZiAoJEVOVntIVFRQX1VTRVJfQUdFTlR9KSB7CgogICAgIyBjaGVjayBpZiB0aGUgbmVlZGVkIHBhdGggaXMgYXZhaWxhYmxlCiAgICBteSAkUGF0aCA9ICRTZWxmLT57J0hvbWUnfSAuICcvdmFyL2ZyZWQnOwogICAgaWYgKCEtZSAkUGF0aCkgewogICAgICAgIHN5c3RlbSAibWtkaXIgJFBhdGgiOwogICAgfQoKICAgIG15ICRGaWxlID0gJFNlbGYtPntIb21lfSAuICcvdmFyL2ZyZWQvU1RERVJSLmxvZyc7CgogICAgIyBjaGVjayBsb2cgZmlsZSBzaXplCiAgICBpZiAoIC1zICRGaWxlID4gMjAgKiAxMDI0ICogMTAyNCApIHsKICAgICAgICB1bmxpbmsgJEZpbGU7CiAgICB9CgogICAgIyBtb3ZlIFNURE9VVCB0byB0bXAgZmlsZQogICAgaWYgKCAhb3BlbiBTVERFUlIsICc+PicsICRGaWxlICkgewogICAgICAgIHByaW50IFNUREVSUiAiRVJST1I6IENhbid0IHdyaXRlICRGaWxlISI7CiAgICB9Cn0KCjE7
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEZyZWQueG1sLHYgMS4xMSAyMDA3LzA5LzI2IDA2OjA4OjMwIHRyIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50IyMjRnJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlN1YnNjcmliZSB0aGUgb3V0cHV0IGZpbHRlciBhdCB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NZWxkZXQgZGVuIE91dHB1dEZpbHRlckZyZWQgYW0gU3lzdGVtIGFuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlYnVnIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjQ29uc29sZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBmcmVkIGNvbnNvbGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiwgd2VubiBtYW4gZGllIEZyZWQtQ29uc29sZSBudXR6ZW4gbfZjaHRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8IS0tPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpPdXRwdXRGaWx0ZXJGcmVkPC9JdGVtPi0tPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNTbWFsbFByb2YiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU21hbGxQcm9mIHByb2ZpbGluZyBmdW5jdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuLCB3ZW5uIG1hbiBkaWUgU21hbGxQcm9mLVByb2ZpbGluZyBGdW5rdGlvbiBudXR6ZW4gbfZjaHRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8IS0tPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpPdXRwdXRGaWx0ZXJGcmVkPC9JdGVtPi0tPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNEUHJvZiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBEUHJvZiBwcm9maWxpbmcgZnVuY3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiwgd2VubiBtYW4gZGllIERQcm9mLVByb2ZpbGluZyBGdW5rdGlvbiBudXR6ZW4gbfZjaHRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8IS0tPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpPdXRwdXRGaWx0ZXJGcmVkPC9JdGVtPi0tPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNIVE1MQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IGFuIHJlYWx0aW1lIEhUTUwtY2hlY2tlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHdlbm4genVyIExhdWZ6ZWl0IGVpbiBIVE1MLUNoZWNrZXIgYXVzZ2Vm/GhydCB3ZXJkZW4gc29sbC4gV0lDSFRJRzogRGFzIENwYW4tTW9kdWwgSFRNTDo6bGludCBpc3QgaGllcmb8ciBub3R3ZW5kaWcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDwhLS08SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+LS0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI1RyYW5zbGF0aW9uRGVidWciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRoZSB0cmFuc2xhdGlvbiBkZWJ1Z2dlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHdlbm4genVyIExhdWZ6ZWl0IGRlciDcYmVyc2V0enVuZ3NkZWJ1Z2dlciBnZW51dHp0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8IS0tPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpPdXRwdXRGaWx0ZXJGcmVkPC9JdGVtPi0tPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNTVERFUlJMb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgU1RERVJSTG9nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4gd2VubiBtYW4genVyIExhdWZ6ZWl0IGRhcyBTVERFUlJMb2cgc2VoZW4gd2lsbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPCEtLTxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZDwvSXRlbT4tLT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0RldmVsRnJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBkZXZlbCBmcmVkIG9iamVjdCBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEVudHdpY2tsZXItT2JqZWt0cyBGcmVkIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPCEtLSA8R3JvdXA+YWRtaW48L0dyb3VwPiAtLT4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+RnJlZC1EZXZlbG9wZXJ0b29sczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5BZG1pbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE1vZHVsZT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyTW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5GcmVkPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazQ8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjk5OTwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OlNtYWxsUHJvZiMjI1Nob3duTGluZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IZXJlIHlvdSBjYW4gaW5zZXJ0IHRoZSBudW1iZXIgb2Ygc2hvd24gcHJvZmlsaW5nIGxpbmVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGthbm4gZGllIEFuemFobCBkZXIgYW5nZXplaWd0ZW4gYXVzZ2V3ZXJ0ZXRlbiBaZWlsZW4gYW5nZWdlYmVuIHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+U21hbGxQcm9mPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4xNTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OlNtYWxsUHJvZiMjI09yZGVyQnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5XaGljaCBvcmRlciBzaG91bGQgdGhlIHByb2ZpbGluZyBkYXRhIGhhdmU/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hY2ggd2VsY2hlciBSZWloZW5mb2xnZSBzb2xsZW4gZGllIFByb2ZpbGluZ2RhdGVuIGdlb3JkbmV0IHdlcmRlbj88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+U21hbGxQcm9mPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSI0Ij4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+TGluZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+Q2FsbHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPlRpbWUgZXhlY3V0aW5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij5UaW1lIGV4cGVuZGVkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpTbWFsbFByb2YjIyNQYWNrYWdlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNoZWNrIG9ubHkgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBpbiBTbWFsbFByb2YuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVzIHNvbGxlbiBudXIgZm9sZ2VuZGUgUGFja2FnZXMgdm9uIFNtYWxsUHJvZiBnZXBy/GZ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+U21hbGxQcm9mPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpEUHJvZiMjI1Nob3duTGluZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IZXJlIHlvdSBjYW4gaW5zZXJ0IHRoZSBudW1iZXIgb2Ygc2hvd24gcHJvZmlsaW5nIGZ1bmN0aW9ucyAobWF4IDQwKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBrYW5uIGRpZSBBbnphaGwgZGVyIGFuZ2V6ZWlndGVuIGF1c2dld2VydGV0ZW4gRnVua3Rpb25lbiBhbmdlZ2ViZW4gd2VyZGVuIChtYXhpbWFsIDQwKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjE1PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6RFByb2YjIyNPcmRlckJ5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V2hpY2ggb3JkZXIgc2hvdWxkIHRoZSBwcm9maWxpbmcgZGF0YSBoYXZlPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYWNoIHdlbGNoZXIgUmVpaGVuZm9sZ2Ugc29sbGVuIGRpZSBQcm9maWxpbmdkYXRlbiBnZW9yZG5ldCB3ZXJkZW4/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkRQcm9mPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJUaW1lIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TmFtZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FsbHMiPkNhbGxzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaW1lIj5FeGNsVGltZTwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6RFByb2YjIyNGdW5jdGlvblRyZWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHRoZSBmdW5jdGlvbiB0cmVlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5aZWlnZSBkZW4gRnVua3Rpb25zYmF1bS4gRXMgemVpZ3QgZGllIEFiZm9sZ2UgdW5kIMRiaORuZ2lna2VpdCBpbiB3ZWxjaGVyIGRpZSBGdW5rdGlvbmVuIGF1ZmdlcnVmZW4gd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5EUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPCEtLSAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpDVlNGaWx0ZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIGFsbG93IHRoZSBDVlNGaWx0ZXIgcmVhbHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiB1bSB6dXIgTGF1ZnplaXQgYmVyZWl0cyBkaWUgQ1ZTLUZpbHRlciB6dSB0ZXN0ZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpQYXRoVG9DVlNGaWx0ZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5QYXRoIHRvIHRoZSBjdnMgZmlsdGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5QZmFkIHp1bSBDVlMtRmlsdGVyLiBCZWltIENWUy1GaWx0ZXIgaGFuZGVsdCBlcyBzaWNoIHVtIGRpZSBmaWx0ZXItZXh0ZW5kZWQucGwgZGVzIENWU1JPT1QtUmVwb3NpdGlvcnkgZGVzIGludGVybmVuIENWUy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+L2hvbWUvdHIvc3JjL0NWU1JPT1QtaW50PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRGF0YWJhc2U6OlNsb3dMb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UbyBlbmFibGUgc2xvdyBzcWwgbG9nICh0byBsb2cgYWxsIHNxbCBxdWVyaWVzIHdoaWNoIHRha2UgbG9uZ2VyIHRoZSA0IHNlYy4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5VbSBTbG93IFNRTCB6dSBha3RpdmllcmVuIChtaXRzY2huZWlkZXIgYWxsZXIgU1FMLUFiZnJhZ2VuIHdlbGNoZSBsYWVuZ2VyIDQgU2VrLiBicmF1Y2hlbikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+IC0tPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0RldmVsRnJlZC5wbSAtIGEgc3BlY2lhbCBkZXZlbG9wZXIgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZC5wbSx2IDEuNCAyMDA3LzA5LzI2IDA2OjA4OjMwIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkRldmVsRnJlZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjQgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiN1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgICMgY2hlY2sgbmVlZGVkIE9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdygKICAgICAgICBQYXJhbU9iamVjdCBEQk9iamVjdCAgICAgTG9nT2JqZWN0IENvbmZpZ09iamVjdAogICAgICAgIE1haW5PYmplY3QgIExheW91dE9iamVjdCBUaW1lT2JqZWN0CiAgICApKSB7CiAgICAgICAgaWYgKCRQYXJhbXskT2JqZWN0fSkgewogICAgICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIpOwogICAgICAgIH0KICAgIH0KIyAgICAkU2VsZi0+e1hNTE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoJXskU2VsZn0pOwogICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDb25maWctPm5ldygleyRTZWxmfSk7CiAgICAkU2VsZi0+e0ZyZWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU3ViYWN0aW9uJyk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgdGhlIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCEkU2VsZi0+e1N1YmFjdGlvbn0pIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiU29ycnksIHRoaXMgc2lkZSBpcyBjdXJyZW50bHkgdW5kZXIgZGV2ZWxvcG1lbnQhIik7CiAgICB9CiMgICAgICAgIG15ICRPdXRwdXQgICA9ICcnOwojCiMgICAgICAgIG15IEBUcmFuc2xhdGlvbldoaXRlTGlzdCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKIyAgICAgICAgICAgIFR5cGUgPT4gJ0ZyZWQtVHJhbnNsYXRpb24nLAojICAgICAgICAgICAgS2V5ICA9PiAxLAojICAgICAgICAgICAgQ2FjaGUgPT4gMCwKIyAgICAgICAgKTsKIwojICAgICAgICBteSAlV2hpdGVMaXN0OwojICAgICAgICBmb3IgbXkgJENvbnRlbnQgKEB7JFRyYW5zbGF0aW9uV2hpdGVMaXN0WzFde1RyYW5zbGF0aW9ufX0pIHsKIyAgICAgICAgICAgIGlmICgkQ29udGVudC0+e0NvbnRlbnR9KSB7CiMgICAgICAgICAgICAgICAgIyBhZGQgYWRkIGJsb2NrCiMgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKIyAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluZScsCiMgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewojICAgICAgICAgICAgICAgICAgICAgICAgV29yZCA9PiAkQ29udGVudC0+e0NvbnRlbnR9LAojICAgICAgICAgICAgICAgICAgICB9LAojICAgICAgICAgICAgICAgICk7CiMgICAgICAgICAgICB9CiMgICAgICAgIH0KIwojICAgICAgICAjIGJ1aWxkIG91dHB1dAojICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICJGcmVkLU92ZXJ2aWV3Iik7CiMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiMgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAojICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWQnLAojICAgICAgICApOwojICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiMgICAgICAgIHJldHVybiAkT3V0cHV0OwojICAgIH0KIyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojICAgICMgaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBsb2cKIyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RyYW5zbGF0aW9uJykgewojICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ZhbHVlJyk7CiMKIyAgICAgICAgbXkgQERhdGEgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hHZXQoCiMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKIyAgICAgICAgICAgIEtleSAgPT4gMSwKIyAgICAgICAgICAgIENhY2hlID0+IDAsCiMgICAgICAgICk7CiMKIyAgICAgICAgaWYgKCFARGF0YSkgewojICAgICAgICAgICAgbXkgQEhhc2g7CiMKIyAgICAgICAgICAgICRIYXNoWzFde1RyYW5zbGF0aW9ufVsxXXtDb250ZW50fSA9ICRWYWx1ZTsKIyAgICAgICAgICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEFkZCgKIyAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKIyAgICAgICAgICAgICAgICBLZXkgICAgID0+IDEsCiMgICAgICAgICAgICAgICAgWE1MSGFzaCA9PiBcQEhhc2gsCiMgICAgICAgICAgICApOwojICAgICAgICB9CiMgICAgICAgIGVsc2UgewojICAgICAgICAgICAgcHVzaCBAeyREYXRhWzFde1RyYW5zbGF0aW9ufX0sIHtDb250ZW50ID0+ICRWYWx1ZX07CiMgICAgICAgICAgICAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hVcGRhdGUoCiMgICAgICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiMgICAgICAgICAgICAgICAgS2V5ID0+ICcxJywKIyAgICAgICAgICAgICAgICBYTUxIYXNoID0+IFxARGF0YSwKIyAgICAgICAgICAgICk7CiMKIyAgICAgICAgfQojCiMgICAgICAgIG15ICRSZWZlcmVyID0gJEVOVntIVFRQX1JFRkVSRVJ9OwojICAgICAgICBpZiAoJFJlZmVyZXIgPX4gL1w/KC4rKSQvKSB7CiMgICAgICAgICAgICAkUmVmZXJlciA9ICQxOwojICAgICAgICB9CiMKIyAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFJlZmVyZXIpOwojICAgIH0KIyAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdUcmFuc2xhdGlvbkRlbGV0ZScpIHsKIyAgICAgICAgbXkgQERhdGEgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hEZWxldGUoCiMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKIyAgICAgICAgICAgIEtleSAgPT4gMSwKIyAgICAgICAgKTsKIwojICAgICAgICBteSAkUmVmZXJlciA9ICRFTlZ7SFRUUF9SRUZFUkVSfTsKIyAgICAgICAgaWYgKCRSZWZlcmVyID1+IC9cPyguKykkLykgewojICAgICAgICAgICAgJFJlZmVyZXIgPSAkMTsKIyAgICAgICAgfQojCiMgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICRSZWZlcmVyKTsKIyAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBmYXN0IGhhbmRsZSBmb3IgZnJlZCBzZXR0aW5ncwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NldHRpbmcnKSB7CiAgICAgICAgbXkgJE1vZHVsZUZvclJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpNb2R1bGUnKTsKICAgICAgICBkZWxldGUgJE1vZHVsZUZvclJlZi0+e0NvbnNvbGV9OwogICAgICAgIGZvciBteSAkTW9kdWxlIChrZXlzICV7JE1vZHVsZUZvclJlZn0pIHsKICAgICAgICAgICAgbXkgJENoZWNrZWQgPSAnJzsKICAgICAgICAgICAgaWYgKCRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0pIHsKICAgICAgICAgICAgICAgICRDaGVja2VkID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZyZWRNb2R1bGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRnJlZE1vZHVsZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIENoZWNrZWQgICAgPT4gJENoZWNrZWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkZyZWQ6OiRNb2R1bGUiKSkgewoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICJGcmVkLVNldHRpbmciKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNldHRpbmcnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBmYXN0IGhhbmRsZSBmb3IgZnJlZCBzZXR0aW5ncwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NldHRpbmdBY3Rpb24nKSB7CiAgICAgICAgbXkgJE1vZHVsZUZvclJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpNb2R1bGUnKTsKICAgICAgICBteSBAU2VsZWN0ZWRGcmVkTW9kdWxlcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAnRnJlZE1vZHVsZScpOwogICAgICAgIG15ICVTZWxlY3RlZE1vZHVsZXMgPSBtYXAgeyAkXyA9PiAxOyB9IEBTZWxlY3RlZEZyZWRNb2R1bGVzOwogICAgICAgIG15ICRVcGRhdGVGbGFnOwogICAgICAgIGRlbGV0ZSAkTW9kdWxlRm9yUmVmLT57Q29uc29sZX07CgogICAgICAgIGZvciBteSAkTW9kdWxlIChrZXlzICV7JE1vZHVsZUZvclJlZn0pIHsKICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHN5c2NvbmZpZyBzZXR0aW5ncwogICAgICAgICAgICBpZiAoJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAhJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfSB8fAogICAgICAgICAgICAgICAgISRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gJiYgJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnVG9vbE9iamVjdH0tPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gIkZyZWQ6Ok1vZHVsZSMjIyRNb2R1bGUiLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGl2ZScgPT4gJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAjICdNb2R1bGUnID0+ICRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRVcGRhdGVGbGFnID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhY3RpdmUgZnJlZCBtb2R1bGUgdG9kb3MKICAgICAgICAgICAgaWYgKCEkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICYmICRTZWxlY3RlZE1vZHVsZXN7JE1vZHVsZX0pIHsKICAgICAgICAgICAgICAgICMgRklYTUUgRXJyb3JoYW5kbGluZyEKICAgICAgICAgICAgICAgICRTZWxmLT57RnJlZE9iamVjdH0tPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkZWFjdGl2YXRlIGZyZWRtb2R1bGUgdG9kb3MKICAgICAgICAgICAgaWYgKCRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gJiYgISRTZWxlY3RlZE1vZHVsZXN7JE1vZHVsZX0pIHsKICAgICAgICAgICAgICAgICMgRklYTUUgRXJyb3JoYW5kbGluZyEKICAgICAgICAgICAgICAgICRTZWxmLT57RnJlZE9iamVjdH0tPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgdGhpcyBmdW5jdGlvbiBpcyBuZXNlY2NhcnkgdG8gZmluaXNoIHRoZSBzeXNjb25maWcgdXBkYXRlCiAgICAgICAgaWYgKCRVcGRhdGVGbGFnKSB7CiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnVG9vbE9iamVjdH0tPkNvbmZpZ0l0ZW1VcGRhdGVGaW5pc2goKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5vdyB0aGUgYnJvd3NlciBzaG91bGQgYmUgY2xvc2VkIik7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQ29uc29sZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkQ29uc29sZS5wbSx2IDEuMSAyMDA3LzA5LzI0IDE0OjMyOjU0IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGUgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgY29uc29sZSBvYmplY3QKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkQ29uc29sZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNUREVSUiBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgJFNlbGYgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICA9IEBfOwogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgTW9kdWxlUmVmISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGNvbnNvbGUgdGFibGUKICAgIG15ICRDb25zb2xlID0gJ0FjdGl2YXRlZCBtb2R1bGVzOiAnOwogICAgZm9yIG15ICRNb2R1bGUgKEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSkgewogICAgICAgICRDb25zb2xlIC49ICRNb2R1bGUgLiAiIC0gIjsKICAgIH0KICAgICRDb25zb2xlID1+IHMvIC0gJC8vOwoKICAgIGlmICggJHsgJFBhcmFte01vZHVsZVJlZn0gfXtTdGF0dXN9ICkgewogICAgICAgIGlmICggJHsgJFBhcmFte01vZHVsZVJlZn0gfXtTZXR0aW5nfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NldHRpbmcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkQ29uc29sZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUZXh0ICAgID0+ICRDb25zb2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDcvMDkvMjQgMTQ6MzI6NTQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkSFRNTENoZWNrLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRIVE1MQ2hlY2sucG0sdiAxLjEgMjAwNy8wOS8yMSAwNzo0NjowOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZEhUTUxDaGVjayAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBIVE1MIGNoZWNrIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2ctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBTVERFUlIgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgPSBAXzsKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE1vZHVsZVJlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgkeyRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0pIHsKICAgICAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSApIHsKICAgICAgICAgICAgJExpbmUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoVGV4dCA9PiAkTGluZSk7CiAgICAgICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPjx0ZD4kTGluZTwvdGQ+PC90cj5cbiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICAgICAkeyAkUGFyYW17TW9kdWxlUmVmfSB9e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkSFRNTENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA3LzA5LzIxIDA3OjQ2OjA5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1RERVJSTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRTVERFUlJMb2cucG0sdiAxLjEgMjAwNy8wOS8yMSAwODowOTowOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNUREVSUkxvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTVERFUlIgbG9nIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU1RERVJSIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAkU2VsZiAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgID0gQF87CiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBNb2R1bGVSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSApIHsKICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj48dGQ+JExpbmU8L3RkPjwvdHI+IjsKICAgIH0KCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNUREVSUkxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLCB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDcvMDkvMjEgMDg6MDk6MDkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU21hbGxQcm9mLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRTbWFsbFByb2YucG0sdiAxLjMgMjAwNy8wOS8yNiAwNDozODowOCB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjMgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNtYWxsUHJvZiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTbWFsbFByb2Ygb2JqZWN0Cgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNtYWxsUHJvZi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNtYWxsUHJvZiBwcm9maWxpbmcgdG9vbAoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAkU2VsZiAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgID0gQF87CiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBNb2R1bGVSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXBhcmUgdGhlIHByb2ZpbGluZyBkYXRhIGZvciBhIGJldHRlciByZWFkYWJpbGl0eQogICAgZm9yIG15ICRMaW5lICggQHsgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSB9ICkgewogICAgICAgIGZvciBteSAkVEQgKEB7JExpbmV9KSB7CiAgICAgICAgICAgICRURCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbChUZXh0ID0+ICRURCk7CiAgICAgICAgfQogICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMl08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bM108L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bNF08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPlswXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlsxXTo8L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPls1XTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICA8L3RyPiI7CiAgICB9CgogICAgIyBnZXQgYWxsIHBhY2thZ2VzIHdoaWNoIFNtYWxsUHJvZiBjaGVja3MKICAgIG15ICRQYWNrYWdlcyA9ICcnOwogICAgZm9yIG15ICRQYWNrYWdlICggQHsgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtQYWNrYWdlc30gfSApIHsKICAgICAgICAkUGFja2FnZXMgLj0gIiRQYWNrYWdlIC0gIjsKICAgIH0KICAgICRQYWNrYWdlcyA9fiBze1xzLVxzJH17fW14OwoKICAgICMgc2hvdyB0aGUgcHJvZmlsaW5nIGRhdGEKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkU21hbGxQcm9mJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICAgICAgUGFja2FnZXMgID0+ICRQYWNrYWdlcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA3LzA5LzI2IDA0OjM4OjA4ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkRFByb2YucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRnJlZERQcm9mLnBtLHYgMS4xIDIwMDcvMDkvMjYgMDY6MDg6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkRFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZERQcm9mIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIERQcm9mIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWREUHJvZi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIERQcm9mIHByb2ZpbGluZyB0b29sCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgPSBAXzsKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE1vZHVsZVJlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcHJlcGFyZSB0aGUgcHJvZmlsaW5nIGRhdGEgZm9yIGEgYmV0dGVyIHJlYWRhYmlsaXR5CiAgICBpZiAoJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSkgewogICAgICAgIGZvciBteSAkTGluZSAoIEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRURCAoQHskTGluZX0pIHsKICAgICAgICAgICAgICAgICRURCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbChUZXh0ID0+ICRURCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEhUTUxMaW5lcyAuPSAiICAgICAgICA8dHI+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzFdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlsyXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bM108L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzRdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPls1XTo8L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bNl08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgIDwvdHI+XG4iOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICAgICAgVG90YWxUaW1lID0+ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17VG90YWxUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RnVuY3Rpb25UcmVlfSkgewogICAgICAgIGZvciBteSAkTGluZSAoIEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RnVuY3Rpb25UcmVlfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJFREIChAeyRMaW5lfSkgewogICAgICAgICAgICAgICAgJFREID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKFRleHQgPT4gJFREKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGluZS0+WzFdID1+IHMvIC8mbmJzcDsmbmJzcDsvZzsKICAgICAgICAgICAgJEhUTUxMaW5lcyAuPSAiICAgICAgICA8dHI+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMV08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgIDwvdHI+XG4iOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGdW5jdGlvbkxpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICAjIHNob3cgdGhlIHByb2ZpbGluZyBkYXRhCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZERQcm9mJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDcvMDkvMjYgMDY6MDg6MjkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkVHJhbnNsYXRpb25EZWJ1Zy5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkVHJhbnNsYXRpb25EZWJ1Zy5wbSx2IDEuMSAyMDA3LzA5LzI1IDEyOjMwOjM5IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFRyYW5zbGF0aW9uRGVidWc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFRyYW5zbGF0aW9uRGVidWcgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdHJhbnNsYXRpb24gZGVidWcgbW9kdWxlCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFRyYW5zbGF0aW9uRGVidWctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSB0cmFuc2xhdGlvbmRlYnVnZ2luZyBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgJFNlbGYgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICA9IEBfOwogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgTW9kdWxlUmVmISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5lICggQHsgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSB9ICkgewogICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPjx0ZD4kTGluZTwvdGQ+PC90cj4iOwogICAgfQoKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkVHJhbnNsYXRpb25EZWJ1ZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLCB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDcvMDkvMjUgMTI6MzA6MzkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRGcmVkLnBtIC0gcHJvdmlkZXMgZ2VuZXJpYyBIVE1MIG91dHB1dCBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMYXlvdXRGcmVkLnBtLHYgMS4yIDIwMDcvMDkvMjUgMjE6NTI6MDkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRGcmVkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBzZXZlcmFsIGZyZWQgbW9kdWxlcwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBGcmVkTW9kdWxlc1JlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTW9kdWxlTmFtZSAoIGtleXMgJXsgJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSB9ICkgewoKICAgICAgICAjIGxvYWQgYmFja2VuZAogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkTGF5b3V0QmFja2VuZCggTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSApOwoKICAgICAgICAjIGdldCBtb2R1bGUgZGF0YQogICAgICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCggTW9kdWxlUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0tPnskTW9kdWxlTmFtZX0gKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Mb2FkTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgc3BlY2lhbCBmcmVkIGxheW91dCBiYWNrZW5kcwoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0xvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWQnIC4gJFBhcmFte01vZHVsZU5hbWV9OwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwoKICAgICAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAgICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAwNy8wOS8yNSAyMTo1MjowOSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9PdXRwdXRGaWx0ZXJGcmVkLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE91dHB1dEZpbHRlckZyZWQucG0sdiAxLjggMjAwNy8wOS8yNSAyMTo1MjowOSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS44ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQKCj1oZWFkMSBTWU5PUFNJUwoKYSBvdXRwdXQgZmlsdGVyIG1vZHVsZSBzcGVjaWFsbHkgZm9yIGRldmVsb3BlcgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhNYWluT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgKSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57RnJlZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RnJlZC0+bmV3KCAleyRTZWxmfSApOwoKICAgIGlmICggJFBhcmFte0xheW91dE9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gJFBhcmFte0xheW91dE9iamVjdH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBpbnNlcnQgTGF5b3V0T2JqZWN0IGVudHJ5IGluIEZpbHRlckNvbnRlbnQgZnVuY3Rpb24gb2YgdGhlIExheW91dC5wbQogICAgICAgICMgdGhpcyBoYXBwZW5zIG9ubHkgaW4gT1RSUyAyLjIKICAgICAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5JbnNlcnRMYXlvdXRPYmplY3QoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGlzIGEgY2hlY2sgYmVjYXVzZSBPVFJTMi4yIGRvbid0IGRlbGl2ZXIgaGVyZSBhIExheW91dE9iamVjdAogICAgaWYgKCAhJFNlbGYtPntMYXlvdXRPYmplY3R9ICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZG8gbm90aGluZyBpZiBpdCBpcyBhIHJlZGlyZWN0CiAgICBpZiAoICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gL15TdGF0dXM6IDMwMiBNb3ZlZC9taQogICAgICAgICYmICR7ICRQYXJhbXtEYXRhfSB9ID1+IC9ebG9jYXRpb246L21pCiAgICAgICAgJiYgbGVuZ3RoKCAkeyAkUGFyYW17RGF0YX0gfSApIDwgODAwICkKICAgIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGdldCBkYXRhIG9mIHRoZSBhY3RpdmF0ZWQgbW9kdWxlcwogICAgbXkgJE1vZHVsZUZvclJlZiAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6Ok1vZHVsZScpOwogICAgbXkgJE1vZHVsZXNEYXRhUmVmID0ge307CiAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXskTW9kdWxlRm9yUmVmfSApIHsKICAgICAgICBpZiAoICRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gKSB7CiAgICAgICAgICAgICRNb2R1bGVzRGF0YVJlZi0+eyRNb2R1bGV9ID0ge307CiAgICAgICAgfQogICAgfQoKICAgICMgbG9hZCB0aGUgYWN0aXZhdGVkIG1vZHVsZXMKICAgICRTZWxmLT57RnJlZE9iamVjdH0tPkRhdGFHZXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNEYXRhUmVmLAogICAgICAgIEhUTUxEYXRhUmVmICAgID0+ICRQYXJhbXtEYXRhfSwKICAgICk7CgogICAgIyBjcmVhdGUgZnJlZHMgb3V0cHV0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNyZWF0ZUZyZWRPdXRwdXQoIEZyZWRNb2R1bGVzUmVmID0+ICRNb2R1bGVzRGF0YVJlZiApOwoKICAgICMgYnVpbGQgdGhlIGNvbnRlbnQgc3RyaW5nCiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICBpZiAoJE1vZHVsZXNEYXRhUmVmLT57Q29uc29sZX0tPntPdXRwdXR9KSB7CiAgICAgICAgJE91dHB1dCAuPSAkTW9kdWxlc0RhdGFSZWYtPntDb25zb2xlfS0+e091dHB1dH07CiAgICAgICAgZGVsZXRlICRNb2R1bGVzRGF0YVJlZi0+e0NvbnNvbGV9OwogICAgfQogICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICV7JE1vZHVsZXNEYXRhUmVmfSApIHsKICAgICAgICAkT3V0cHV0IC49ICRNb2R1bGVzRGF0YVJlZi0+eyRNb2R1bGV9LT57T3V0cHV0fSB8fCAnJzsKICAgIH0KCiAgICAjIGluY2x1ZGUgdGhlIGZyZWQgb3V0cHV0IGluIHRoZSBvcmlnaW5hbCBvdXRwdXQKICAgIGlmICggJHsgJFBhcmFte0RhdGF9IH0gIX4gcy8oXDxib2R5KHwuKz8pXD4pLyQxXG4kT3V0cHV0XG5cblxuXG4vbXggKSB7CiAgICAgICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gcy9eKC4pL1xuJE91dHB1dFxuXG5cblxuJDEvbXgKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjggJCAkRGF0ZTogMjAwNy8wOS8yNSAyMTo1MjowOSAkCgo9Y3V0
IyAtLQojIERldmVsRnJlZENvbnNvbGUuZHRsIC0gYSBodG1sIGNvbnNvbGUgZm9yIGEgYmV0dGVyIGZyZWQgaGFuZGxpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkQ29uc29sZS5kdGwsdiAxLjIgMjAwNy8wOS8yNSAxMDowNToxMyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLUNvbnNvbGU8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJERhdGF7IlRleHQifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPURldmVsRnJlZCZTdWJhY3Rpb249U2V0dGluZyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9J1NldHRpbmcnOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbkNsaWNrPSJ3aW5kb3cub3BlbignJywgJ3NldHRpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NTAwLGhlaWdodD00NDAsbGVmdD0zMDAsdG9wPTI1MCcpOyIgdGFyZ2V0PSJzZXR0aW5nIj5zZXR0aW5nPC9hPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZEhUTUxDaGVjay5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIEhUTUwtQ2hlY2sgcmVzdWx0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRIVE1MQ2hlY2suZHRsLHYgMS4xIDIwMDcvMDkvMjEgMDc6NTE6MDYgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1IVE1MQ2hlY2s8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIERldmVsRnJlZFNUREVSUkxvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNUREVSUiBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU1RERVJSTG9nLmR0bCx2IDEuMSAyMDA3LzA5LzIxIDA3OjQ5OjI2IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU1RERVJSTG9nPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIERldmVsRnJlZFNldHRpbmcuZHRsIC0gYSBmcm9udGVuZCBmb3IgYSBmYXN0IGZyZWQgc2V0dGluZyBoYW5kbGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRTZXR0aW5nLmR0bCx2IDEuNSAyMDA3LzA5LzI2IDA2OjA4OjMwIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRGV2ZWxGcmVkU2V0dGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iRGV2ZWxGcmVkIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nQWN0aW9uIj4KICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVNldHRpbmc8L2ZvbnQ+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iRnJlZE1vZHVsZSIgdmFsdWU9IiRRRGF0YXsiRnJlZE1vZHVsZSJ9IiAkRGF0YXsiQ2hlY2tlZCJ9PgogICAgICAgICAgICAgICRRRGF0YXsiRnJlZE1vZHVsZSJ9CjwhLS0gZHRsOmJsb2NrOkNvbmZpZyAtLT4KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluU3lzQ29uZmlnJlN1YmFjdGlvbj1FZGl0JlN5c0NvbmZpZ1N1Ykdyb3VwPSREYXRheyJNb2R1bGVOYW1lIn0mU3lzQ29uZmlnR3JvdXA9RnJlZCIgIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSdTZXR0aW5nJzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25DbGljaz0id2luZG93LnJlc2l6ZVRvKDkwMCw1MDApIj4oJFRleHR7IkNvbmZpZyJ9KTwvYT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlnIC0tPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICRUZXh0eyJBdHRlbnRpb246IFlvdSBjYW4ndCB1c2UgU21hbGxQcm9mIGFuZCBEUHJvZiBhdCB0aGUgc2FtZSB0aW1lISJ9CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNhdmUifSIgY2xhc3M9ImJ1dHRvbiIgb25DbGljaz0id2luZG93LmNsb3NlKCkiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIERldmVsRnJlZFNtYWxsUHJvZi5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNtYWxsUHJvZiByZXN1bHQgdGFibGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU21hbGxQcm9mLmR0bCx2IDEuMiAyMDA3LzA5LzI1IDEwOjA1OjEzIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNiIgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU21hbGxQcm9mPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICRUZXh0eyJQcm9maWxlZCBwYWNrYWdlczoifSAkUURhdGF7IlBhY2thZ2VzIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJDYWxscyJ9CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiVGltZSBleGVjdXRpbmcgKG1zKSJ9CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiVGltZSBleHBlbmRlZCAobXMpIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJGaWxlIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJMaW5lIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJUZXh0In0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAkVGV4dHsiRm9yIG1vcmUgaW5mb3JtYXRpb24sIGVzcGVjaWFsbHkgJ3RpbWUgZXhlY3V0aW9uJyBhbmQgJ3RpbWUgZXhwZW5kZWQnIHJlYWQgcGVybGRvYyBTbWFsbFByb2YhIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICRUZXh0eyJJZiB5b3UgY2hhbmdlIHRoZSBwYWNrYWdlIGNvbmZpZyB5b3UgaGF2ZSB0byByZWxvYWQgdGhpcyBzaWRlIHR3byB0aW1lcyEifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIERldmVsRnJlZERQcm9mLmR0bCAtIGEgZnJvbnRlbmQgdG8gc2hvdyB0aGUgRFByb2YgcmVzdWx0IHRhYmxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZERQcm9mLmR0bCx2IDEuMSAyMDA3LzA5LzI2IDA2OjA4OjMwIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNyIgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtRFByb2Y8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lVGFibGUgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JVRpbWU8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RXhjbFNlYzwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5DdW11bFM8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+I0NhbGxzPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPnNlYy9jYWxsPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkNzZWMvYzo8L3RkPgogICAgICAgICAgPHRkPk5hbWU8L3RkPgogICAgICAgIDwvdHI+CiREYXRheyJIVE1MTGluZXMifQogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPlRvdGFsIFRpbWU6PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiREYXRheyJUb3RhbFRpbWUifTwvdGQ+CiAgICAgICAgICA8dGQgIGNvbHNwYW49IjUiPlNlY29uZHM8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVUYWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6RnVuY3Rpb25MaXN0IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPk51bWJlcjwvdGQ+CiAgICAgICAgICA8dGQ+TmFtZTwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CjwhLS0gZHRsOmJsb2NrOkZ1bmN0aW9uTGlzdCAtLT4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIERldmVsRnJlZFRyYW5zbGF0aW9uRGVidWcuZHRsIC0gYSBmcm9udGVuZCB0byBzaG93IHRoZSB0cmFuc2xhdGlvbiBkZWJ1Z2dpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkVHJhbnNsYXRpb25EZWJ1Zy5kdGwsdiAxLjEgMjAwNy8wOS8yNSAxMjozMDozOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVRyYW5zbGF0aW9uRGVidWc8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC5wbSAtIGFsbCBmcmVkIGNvcmUgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWQucG0sdiAxLjQgMjAwNy8wOS8yNSAyMTozMjo0MyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjQgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZCAtIGZyZWQgY29yZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZyZWQgc3RhbmRhcmQgY29yZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpFdmFsdWF0ZSB0aGUgc2V2ZXJhbCBkYXRhIG9mIGFsbCBmcmVkIG1vZHVsZXMgYW5kIGFkZCB0aGVtCm9uIHRoZSBGcmVkTW9kdWxlcyByZWZlcmVuY2UuCgogICAgJEZyZWRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBGcmVkTW9kdWxlc1JlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCAhJFBhcmFte0hUTUxEYXRhUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSFRNTERhdGFSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJE1vZHVsZU5hbWUgKCBrZXlzICV7ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfSApIHsKCiAgICAgICAgIyBsb2FkIGJhY2tlbmQKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUgKTsKCiAgICAgICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgICAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgICAgICAgICBNb2R1bGVSZWYgICAgICA9PiAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9LT57JE1vZHVsZU5hbWV9LAogICAgICAgICAgICAgICAgSFRNTERhdGFSZWYgICAgPT4gJFBhcmFte0hUTUxEYXRhUmVmfSwKICAgICAgICAgICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgYSBmcmVkIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJFBhcmFte01vZHVsZU5hbWV9ICk7CgogICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgIGlmICgkQmFja2VuZE9iamVjdCkgewoKICAgICAgICAjIEZJWE1FIEVycm9yaGFuZGxpbmcKICAgICAgICAkQmFja2VuZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgYSBmcmVkIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKCBNb2R1bGVOYW1lID0+ICRQYXJhbXtNb2R1bGVOYW1lfSApOwoKICAgICMgZ2V0IG1vZHVsZSBkYXRhCiAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKCiAgICAgICAgIyBGSVhNRSBFcnJvcmhhbmRsaW5nCiAgICAgICAgJEJhY2tlbmRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIF9Mb2FkQmFja2VuZCgpCgpsb2FkIGEgeG1sIGl0ZW0gbW9kdWxlCgogICAgJEJhY2tlbmRPYmplY3QgPSAkRnJlZE9iamVjdC0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkQmFja2VuZCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAnS2VybmVsOjpTeXN0ZW06OkZyZWQ6OicgLiAkUGFyYW17TW9kdWxlTmFtZX07CiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0sICVQYXJhbSwgKTsKCiAgICAgICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgICAgICMgcmV0dXJuIG9iamVjdAogICAgICAgICAgICByZXR1cm4gJEJhY2tlbmRPYmplY3Q7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gSW5zZXJ0TGF5b3V0T2JqZWN0KCkKCkZSQU1FV09SSy0yLjIgc3BlY2lmaWMgYmVjYXVzZSB0aGVyZSBpcyBubyBMYXlvdXRPYmplY3QgaW50ZWdyYXRpb24gZm9yCkZSRUQgaW4gT1RSUzIuMiBMYXlvdXQucG0KCiAgICAkRnJlZE9iamVjdC0+SW5zZXJ0TGF5b3V0T2JqZWN0KCk7Cgo9Y3V0CgojIEZSQU1FV09SSy0yLjIgc3BlY2lmaWMgYmVjYXVzZSB0aGVyZSBpcyBubyBMYXlvdXRPYmplY3QgaW50ZWdyYXRpb24gZm9yCiMgRlJFRCBpbiBPVFJTMi4yIExheW91dC5wbQoKc3ViIEluc2VydExheW91dE9iamVjdCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL091dHB1dC9IVE1ML0xheW91dC5wbSc7CgogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAnQ2FuXCd0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshJzsKICAgIH0KCiAgICAjIHJlYWQgZmlsZQogICAgbXkgJEluU3ViOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgICAgICBpZiAoICRMaW5lID1+IC9zdWIgUHJpbnQgey8gKSB7CiAgICAgICAgICAgICRJblN1YiA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICggJEluU3ViICYmICRMaW5lID1+IC9EZWJ1ZyA9PiBcJFNlbGYtPntEZWJ1Z30sLyApIHsKICAgICAgICAgICAgcHVzaCBATGluZXMsICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHVzaCBATGluZXMsICIgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiBcJFNlbGYsXG4iOwogICAgICAgICAgICBwdXNoIEBMaW5lcywgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICAkSW5TdWIgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICMgd3JpdGUgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CgogICAgIyBsb2cgdGhlIG1hbmlwdWxhdGlvbgogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiRlJFRCBtYW5pcHVsYXRlZCB0aGUgJEZpbGUhIiwKICAgICk7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwNy8wOS8yNSAyMTozMjo0MyAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9Db25zb2xlLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENvbnNvbGUucG0sdiAxLjMgMjAwNy8wOS8yNSAxMjozMDozOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbnNvbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpnaXZlcyB5b3UgYWxsIGZ1bmN0aW9ucyB3aGljaCBhcmUgbmVlZGVkIGZvciB0aGUgY29uc29sZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkUmVmIChxdyhNb2R1bGVSZWYgSFRNTERhdGFSZWYgRnJlZE1vZHVsZXNSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQE1vZHVsZXMgPSAoKTsKICAgIGZvciBteSAkTW9kdWxlIChrZXlzICV7JFBhcmFte0ZyZWRNb2R1bGVzUmVmfX0pIHsKICAgICAgICBpZiAoJE1vZHVsZSBuZSAnQ29uc29sZScpIHsKICAgICAgICAgICAgcHVzaCBATW9kdWxlcywgJE1vZHVsZTsKICAgICAgICB9CiAgICB9CgogICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSA9IFxATW9kdWxlczsKCiAgICBpZiAoJHskUGFyYW17SFRNTERhdGFSZWZ9fSAhfiAvRnJlZC1TZXR0aW5nLyAmJiAkeyRQYXJhbXtIVE1MRGF0YVJlZn19ID1+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtTdGF0dXN9ID0gMTsKICAgIH0KCiAgICBpZiAoICR7JFBhcmFte0hUTUxEYXRhUmVmfX0gIX4gL25hbWU9IkFjdGlvbiIgdmFsdWU9IkxvZ2luIi8gKSB7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtTZXR0aW5nfSA9IDE7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwNy8wOS8yNSAxMjozMDozOSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9IVE1MQ2hlY2sucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSFRNTENoZWNrLnBtLHYgMS4yIDIwMDcvMDkvMjQgMTQ6MzI6MTkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxDaGVjawoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIEhUTUw6OiBsaW50IGNoZWNrCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJFBhcmFtUmVmIChxdyggTW9kdWxlUmVmIEhUTUxEYXRhUmVmICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayB0aGUgSFRNTC1PdXRwdXQgd2l0aCBIVE1MOjpMaW50CiAgICBteSBASFRNTExpbnRNZXNzYWdlczsKICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdIVE1MOjpMaW50JykpIHsKICAgICAgICBIVE1MOjpMaW50LT5pbXBvcnQoKTsKICAgICAgICBteSAkSFRNTExpbnRPYmplY3QgPSBIVE1MOjpMaW50LT5uZXcoIG9ubHlfdHlwZXMgPT4gSFRNTDo6TGludDo6RXJyb3ItPlNUUlVDVFVSRSApOwogICAgICAgICRIVE1MTGludE9iamVjdC0+cGFyc2UgKCR7ICRQYXJhbXtIVE1MRGF0YVJlZn0gfSk7CgogICAgICAgIG15ICRFcnJvckNvdW50ZXIgPSAkSFRNTExpbnRPYmplY3QtPmVycm9yczsKICAgICAgICBmb3IgbXkgJEVycm9yICgkSFRNTExpbnRPYmplY3QtPmVycm9ycykgewogICAgICAgICAgICBteSAkU3RyaW5nIC49ICRFcnJvci0+YXNfc3RyaW5nOwogICAgICAgICAgICBpZiAoJFN0cmluZyAhfiAvSW52YWxpZCBjaGFyYWN0ZXIgLisgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgLykgewogICAgICAgICAgICAgICAgcHVzaCBASFRNTExpbnRNZXNzYWdlcywgJFN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgbXkgJFRleHQgPSAnVGhlIEhUTUwtY2hlY2tlciBvZiBGcmVkIHJlcXVpcmVzIEhUTUw6OkxpbnQgdG8gYmUgaW5zdGFsbGVkIScKICAgICAgICAgICAgLiAnUGxlYXNlIGluc3RhbGwgSFRNTDo6TGludCB2aWEgQ1BBTiBvciBkZWFjdGl2YXRlIHRoZSBIVE1MLWNoZWNrZXIgdmlhIFN5c0NvbmZpZy4nOwogICAgICAgIHB1c2ggQEhUTUxMaW50TWVzc2FnZXMsICRUZXh0OwogICAgfQoKICAgIGlmIChASFRNTExpbnRNZXNzYWdlcykgewogICAgICAgICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gPSBcQEhUTUxMaW50TWVzc2FnZXM7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA3LzA5LzI0IDE0OjMyOjE5ICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TVERFUlJMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU1RERVJSTG9nLnBtLHYgMS40IDIwMDcvMDkvMjYgMDY6MDg6MzAgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS40ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNUREVSUkxvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNUREVSUiBsb2cgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkX1JlZiAocXcoIE1vZHVsZVJlZikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZF9SZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkX1JlZiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgb3BlbiB0aGUgU1RERVJSLmxvZyBmaWxlIHRvIGdldCB0aGUgU1RERVJSIG1lc3NhZ2VzCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiL3Zhci9mcmVkL1NUREVSUi5sb2ciOwogICAgaWYgKCBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlICkgewogICAgICAgIG15IEBSb3cgICAgICAgID0gPCRGaWxlaGFuZGxlPjsKICAgICAgICBteSBAUmV2ZXJzZVJvdyA9IHJldmVyc2UoQFJvdyk7CiAgICAgICAgbXkgQExvZ01lc3NhZ2VzOwoKICAgICAgICAjIGdldCB0aGUgd2hvbGUgaW5mb3JtYXRpb24KICAgICAgICBmb3IgbXkgJExpbmUgKEBSZXZlcnNlUm93KSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gL0ZSRUQvICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBBdHRlbnRpb246IHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBiZWNhdXNlIG9mIERQcm9mLiBJIGhhdmUgdG8gZm9yY2UgdGhlIHByb2Nlc3MuCiAgICAgICAgICAgICMgU28gSSBnZXQgdGhpcyB3YXJuaW5ncyEKICAgICAgICAgICAgaWYgKCAkTGluZSAhfiAvKFN1YnJvdXRpbmUgLis/IHJlZGVmaW5lZCBhdHxoYXMgLis/IHVuc3RhY2tlZCBjYWxsc3xGYWtpbmcgLis/IGV4aXQgdGltZXN0YW1wKS8gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBMb2dNZXNzYWdlcywgJExpbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaW50IFNUREVSUiAiRlJFRFxuIjsKICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgICAgICAkeyAkUGFyYW17TW9kdWxlUmVmfSB9e0RhdGF9ID0gXEBMb2dNZXNzYWdlczsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwoKICAgICMgY2hlY2sgaWYgdGhlIG5lZWRlZCBwYXRoIGlzIGF2YWlsYWJsZQogICAgbXkgJFBhdGggPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvZnJlZCc7CiAgICBpZiAoIS1lICRQYXRoKSB7CiAgICAgICAgc3lzdGVtICJta2RpciAkUGF0aCI7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDcvMDkvMjYgMDY6MDg6MzAgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TbWFsbFByb2YucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU21hbGxQcm9mLnBtLHYgMS40IDIwMDcvMDkvMjUgMTI6MzA6MzkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS40ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNtYWxsUHJvZiBwcm9maWxpbmcgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgICA9IEBfOwogICAgbXkgJFBhdGggICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi9iaW4vY2dpLWJpbi8iOwogICAgbXkgJENvbmZpZ19SZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6U21hbGxQcm9mJyk7CiAgICBteSBATGluZXM7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkUmVmIChxdyhIVE1MRGF0YVJlZiBNb2R1bGVSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbiB0aGlzIHR3byBjYXNlcyBpdCBtYWtlcyBubyBzZW5zZSB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsaW5nIGxpc3QKICAgIGlmICgkeyRQYXJhbXtIVE1MRGF0YVJlZn19ICF+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGlzIHBhZ2UgZGVsaXZlciB0aGUgSFRNTCBieSBtYW55IHNlcGFyYXRlIG91dHB1dCBjYWxscy4nCiAgICAgICAgICAgICAgICAuICcgUGxlYXNlIHVzZSB0aGUgdXN1YWwgd2F5IHRvIGludGVycHJldCBTbWFsbFByb2YnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoJHskUGFyYW17SFRNTERhdGFSZWZ9fSA9fiAvRnJlZC1TZXR0aW5nLykgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZmluZCBvdXQgd2hpY2ggcGFja2FnZXMgYXJlIGNoZWNrZWQgYnkgU21hbGxQcm9mCiAgICBteSBAUGFja2FnZXMgPSBrZXlzICVEQjo6cGFja2FnZXM7CiAgICBteSAkQ1ZTQ2hlY2tQcm9ibGVtID0gXCVEQjo6cGFja2FnZXM7ICMgc29ycnksIHRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgQ1ZTQ2hlY2tlcgogICAgaWYgKCAhJFBhY2thZ2VzWzBdICkgewogICAgICAgICRQYWNrYWdlc1swXSA9ICdhbGwnOwogICAgfQogICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtQYWNrYWdlc30gPSBcQFBhY2thZ2VzOwoKICAgICMgY2F0Y2ggdGhlIG5lZWRlZCBwcm9maWxpbmcgZGF0YQogICAgc3lzdGVtICJjcCAkUGF0aC9zbWFsbHByb2Yub3V0ICRQYXRoL0ZyZWRTbWFsbFByb2Yub3V0IjsKCiAgICBpZiAoIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJFBhdGggLiAnRnJlZFNtYWxsUHJvZi5vdXQnICkgewoKICAgICAgICAjIGNvbnZlcnQgdGhlIGZpbGUgaW4gdXNlYWJsZSBkYXRhCiAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gLyguKz8pOihcZCs/KTooXGQrPyk6KFxkKz8pOihcZCs/KTpccyooLio/KSQvICkgewogICAgICAgICAgICAgICAgcHVzaCBATGluZXMsIFsgJDEsICQyLCAkMywgJDQsICQ1LCAkNiBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFsdGVybmF0aXZlIHNvbHV0aW9uIDIKICAgICAgICAgICAgIyBteSBARWxlbWVudHMgPSBzcGxpdCAoJzonLCRMaW5lKTsKICAgICAgICAgICAgIyAkRWxlbWVudHNbMF0gPX4gcy9eLio/Y2dpLWJpblwvXC5cLlwvXC5cLlwvLy87CiAgICAgICAgICAgICMgcHVzaCBATGluZXMsIFxARWxlbWVudHM7CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIHByb2ZpbGluZyBkYXRhCiAgICAgICAgQExpbmVzID0gc29ydCB7ICRiLT5bICRDb25maWdfUmVmLT57T3JkZXJCeX0gXSA8PT4gJGEtPlsgJENvbmZpZ19SZWYtPntPcmRlckJ5fSBdIH0gQExpbmVzOwogICAgICAgIGlmICggJENvbmZpZ19SZWYtPntPcmRlckJ5fSA9PSAxICkgewogICAgICAgICAgICBATGluZXMgPSByZXZlcnNlIEBMaW5lczsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBvbmx5IHNvIG1hbnkgbGluZXMgYXMgd2FudGVkCiAgICAgICAgaWYgKEBMaW5lcykgewogICAgICAgICAgICBzcGxpY2UgQExpbmVzLCAkQ29uZmlnX1JlZi0+e1Nob3duTGluZXN9OwogICAgICAgICAgICAkeyAkUGFyYW17TW9kdWxlUmVmfSB9e0RhdGF9ID0gXEBMaW5lczsKICAgICAgICB9CgogICAgICAgICMgYWx0ZXJuYXRpdmUgc29sdXRpb24gMQogICAgICAgICMgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgIyAgICAgaWYgKCRMaW5lID1+IC9eXHMqP1sxLTldLykgewogICAgICAgICMgICAgICAgICBpZiAoJExpbmUgPX4gL15ccyo/KFxkKz8pXHMrPyhcZC4rPylccys/KFxkLis/KVxzKz8oXGQrPyk6KC4qPykkLykgewogICAgICAgICMgICAgICAgICAgICAgcHVzaCBATGluZXMsIFskMSwgJDIsICQzLCAkNCwgJDVdOwogICAgICAgICMgICAgICAgICB9CiAgICAgICAgIyAgICAgfQogICAgICAgICMgfQogICAgICAgICMgQExpbmVzID0gc29ydCB7JGItPlsxXSA8PT4gJGEtPlsxXX0gQExpbmVzOwogICAgICAgICMgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSA9IFxATGluZXM7CgogICAgICAgIGNsb3NlICRGaWxlaGFuZGxlOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi9iaW4vY2dpLWJpbi9pbmRleC5wbCI7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICdDYW5cJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEnOwogICAgfQoKICAgICMgdG8gdXNlIFNtYWxsUHJvZiBJIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIS91c3IvYmluL3BlcmwgLXcgLWQ6U21hbGxQcm9mXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwoKICAgICMgY3JlYXRlIGEgaW5mbyBmb3IgdGhlIHVzZXIKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0ZSRUQgbWFuaXB1bGF0ZWQgdGhlICRGaWxlIScsCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBTbWFsbFByb2YgbW9kdWxlCiAgICBteSAkU21hbGxQcm9mRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiL2Jpbi9jZ2ktYmluLy5zbWFsbHByb2YiOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJSSwgJz4nLCAkU21hbGxQcm9mRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRTbWFsbFByb2ZGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWQgZG9uJ3QgZWRpdCB0aGlzIGZpbGUhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiMgdXNlIC4uLy4uLyBhcyBsaWIgbG9jYXRpb25cbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIEZpbmRCaW4gcXcoXCRCaW4pO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJ1c2UgbGliIFwiXCRCaW4vLi4vLi5cIjtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIEtlcm5lbDo6Q29uZmlnO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJteSBcJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiaWYgKFwkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZyZWQ6OlNtYWxsUHJvZicpLT57UGFja2FnZXN9KSB7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiAgICBteSBcQEFycmF5ID0gXEB7IFwkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZyZWQ6OlNtYWxsUHJvZicpLT57UGFja2FnZXN9IH07XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiAgICBteSBcJUhhc2ggPSBtYXAgeyBcJF8gPT4gMTsgfSBcQEFycmF5O1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICIgICAgXCVEQjo6cGFja2FnZXMgPSBcJUhhc2g7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIn1cbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiXCREQjo6ZHJvcF96ZXJvcyA9IDE7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIlwkREI6OmdyZXBfZm9ybWF0ID0gMTtcbiI7CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJSTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi9iaW4vY2dpLWJpbi9pbmRleC5wbCI7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICdDYW5cJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEnOwogICAgfQoKICAgICMgcmVhZCB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICMgcmVtb3ZlIHRoZSBtYW5pcHVsYXRlZCBsaW5lcwogICAgaWYgKCAkTGluZXNbMF0gPX4gLyMhXC91c3JcL2JpblwvcGVybCAtdyAtZDpTbWFsbFByb2YvICkgewogICAgICAgIHNoaWZ0IEBMaW5lczsKICAgIH0KICAgIGlmICggJExpbmVzWzBdID1+IC8jIEZSRUQgLSBtYW5pcHVsYXRlZC8gKSB7CiAgICAgICAgc2hpZnQgQExpbmVzOwogICAgfQoKICAgICMgc2F2ZSB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEnLAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgLnNtYWxscHJvZiBiZWNhdXNlIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKICAgIG15ICRTbWFsbFByb2ZGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvYmluL2NnaS1iaW4vLnNtYWxscHJvZiI7CiAgICBzeXN0ZW0oInJtICRTbWFsbFByb2ZGaWxlIik7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDcvMDkvMjUgMTI6MzA6MzkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TbWFsbFByb2YucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU21hbGxQcm9mLnBtLHYgMS40IDIwMDcvMDkvMjUgMTI6MzA6MzkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS40ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNtYWxsUHJvZiBwcm9maWxpbmcgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgICA9IEBfOwogICAgbXkgJFBhdGggICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi9iaW4vY2dpLWJpbi8iOwogICAgbXkgJENvbmZpZ19SZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6U21hbGxQcm9mJyk7CiAgICBteSBATGluZXM7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkUmVmIChxdyhIVE1MRGF0YVJlZiBNb2R1bGVSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbiB0aGlzIHR3byBjYXNlcyBpdCBtYWtlcyBubyBzZW5zZSB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsaW5nIGxpc3QKICAgIGlmICgkeyRQYXJhbXtIVE1MRGF0YVJlZn19ICF+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGlzIHBhZ2UgZGVsaXZlciB0aGUgSFRNTCBieSBtYW55IHNlcGFyYXRlIG91dHB1dCBjYWxscy4nCiAgICAgICAgICAgICAgICAuICcgUGxlYXNlIHVzZSB0aGUgdXN1YWwgd2F5IHRvIGludGVycHJldCBTbWFsbFByb2YnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoJHskUGFyYW17SFRNTERhdGFSZWZ9fSA9fiAvRnJlZC1TZXR0aW5nLykgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZmluZCBvdXQgd2hpY2ggcGFja2FnZXMgYXJlIGNoZWNrZWQgYnkgU21hbGxQcm9mCiAgICBteSBAUGFja2FnZXMgPSBrZXlzICVEQjo6cGFja2FnZXM7CiAgICBteSAkQ1ZTQ2hlY2tQcm9ibGVtID0gXCVEQjo6cGFja2FnZXM7ICMgc29ycnksIHRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgQ1ZTQ2hlY2tlcgogICAgaWYgKCAhJFBhY2thZ2VzWzBdICkgewogICAgICAgICRQYWNrYWdlc1swXSA9ICdhbGwnOwogICAgfQogICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtQYWNrYWdlc30gPSBcQFBhY2thZ2VzOwoKICAgICMgY2F0Y2ggdGhlIG5lZWRlZCBwcm9maWxpbmcgZGF0YQogICAgc3lzdGVtICJjcCAkUGF0aC9zbWFsbHByb2Yub3V0ICRQYXRoL0ZyZWRTbWFsbFByb2Yub3V0IjsKCiAgICBpZiAoIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJFBhdGggLiAnRnJlZFNtYWxsUHJvZi5vdXQnICkgewoKICAgICAgICAjIGNvbnZlcnQgdGhlIGZpbGUgaW4gdXNlYWJsZSBkYXRhCiAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gLyguKz8pOihcZCs/KTooXGQrPyk6KFxkKz8pOihcZCs/KTpccyooLio/KSQvICkgewogICAgICAgICAgICAgICAgcHVzaCBATGluZXMsIFsgJDEsICQyLCAkMywgJDQsICQ1LCAkNiBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFsdGVybmF0aXZlIHNvbHV0aW9uIDIKICAgICAgICAgICAgIyBteSBARWxlbWVudHMgPSBzcGxpdCAoJzonLCRMaW5lKTsKICAgICAgICAgICAgIyAkRWxlbWVudHNbMF0gPX4gcy9eLio/Y2dpLWJpblwvXC5cLlwvXC5cLlwvLy87CiAgICAgICAgICAgICMgcHVzaCBATGluZXMsIFxARWxlbWVudHM7CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIHByb2ZpbGluZyBkYXRhCiAgICAgICAgQExpbmVzID0gc29ydCB7ICRiLT5bICRDb25maWdfUmVmLT57T3JkZXJCeX0gXSA8PT4gJGEtPlsgJENvbmZpZ19SZWYtPntPcmRlckJ5fSBdIH0gQExpbmVzOwogICAgICAgIGlmICggJENvbmZpZ19SZWYtPntPcmRlckJ5fSA9PSAxICkgewogICAgICAgICAgICBATGluZXMgPSByZXZlcnNlIEBMaW5lczsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBvbmx5IHNvIG1hbnkgbGluZXMgYXMgd2FudGVkCiAgICAgICAgaWYgKEBMaW5lcykgewogICAgICAgICAgICBzcGxpY2UgQExpbmVzLCAkQ29uZmlnX1JlZi0+e1Nob3duTGluZXN9OwogICAgICAgICAgICAkeyAkUGFyYW17TW9kdWxlUmVmfSB9e0RhdGF9ID0gXEBMaW5lczsKICAgICAgICB9CgogICAgICAgICMgYWx0ZXJuYXRpdmUgc29sdXRpb24gMQogICAgICAgICMgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgIyAgICAgaWYgKCRMaW5lID1+IC9eXHMqP1sxLTldLykgewogICAgICAgICMgICAgICAgICBpZiAoJExpbmUgPX4gL15ccyo/KFxkKz8pXHMrPyhcZC4rPylccys/KFxkLis/KVxzKz8oXGQrPyk6KC4qPykkLykgewogICAgICAgICMgICAgICAgICAgICAgcHVzaCBATGluZXMsIFskMSwgJDIsICQzLCAkNCwgJDVdOwogICAgICAgICMgICAgICAgICB9CiAgICAgICAgIyAgICAgfQogICAgICAgICMgfQogICAgICAgICMgQExpbmVzID0gc29ydCB7JGItPlsxXSA8PT4gJGEtPlsxXX0gQExpbmVzOwogICAgICAgICMgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSA9IFxATGluZXM7CgogICAgICAgIGNsb3NlICRGaWxlaGFuZGxlOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi9iaW4vY2dpLWJpbi9pbmRleC5wbCI7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICdDYW5cJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEnOwogICAgfQoKICAgICMgdG8gdXNlIFNtYWxsUHJvZiBJIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIS91c3IvYmluL3BlcmwgLXcgLWQ6U21hbGxQcm9mXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwoKICAgICMgY3JlYXRlIGEgaW5mbyBmb3IgdGhlIHVzZXIKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0ZSRUQgbWFuaXB1bGF0ZWQgdGhlICRGaWxlIScsCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBTbWFsbFByb2YgbW9kdWxlCiAgICBteSAkU21hbGxQcm9mRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiL2Jpbi9jZ2ktYmluLy5zbWFsbHByb2YiOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJSSwgJz4nLCAkU21hbGxQcm9mRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRTbWFsbFByb2ZGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWQgZG9uJ3QgZWRpdCB0aGlzIGZpbGUhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiMgdXNlIC4uLy4uLyBhcyBsaWIgbG9jYXRpb25cbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIEZpbmRCaW4gcXcoXCRCaW4pO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJ1c2UgbGliIFwiXCRCaW4vLi4vLi5cIjtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIEtlcm5lbDo6Q29uZmlnO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJteSBcJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiaWYgKFwkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZyZWQ6OlNtYWxsUHJvZicpLT57UGFja2FnZXN9KSB7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiAgICBteSBcQEFycmF5ID0gXEB7IFwkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZyZWQ6OlNtYWxsUHJvZicpLT57UGFja2FnZXN9IH07XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiAgICBteSBcJUhhc2ggPSBtYXAgeyBcJF8gPT4gMTsgfSBcQEFycmF5O1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICIgICAgXCVEQjo6cGFja2FnZXMgPSBcJUhhc2g7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIn1cbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiXCREQjo6ZHJvcF96ZXJvcyA9IDE7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIlwkREI6OmdyZXBfZm9ybWF0ID0gMTtcbiI7CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJSTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi9iaW4vY2dpLWJpbi9pbmRleC5wbCI7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICdDYW5cJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEnOwogICAgfQoKICAgICMgcmVhZCB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICMgcmVtb3ZlIHRoZSBtYW5pcHVsYXRlZCBsaW5lcwogICAgaWYgKCAkTGluZXNbMF0gPX4gLyMhXC91c3JcL2JpblwvcGVybCAtdyAtZDpTbWFsbFByb2YvICkgewogICAgICAgIHNoaWZ0IEBMaW5lczsKICAgIH0KICAgIGlmICggJExpbmVzWzBdID1+IC8jIEZSRUQgLSBtYW5pcHVsYXRlZC8gKSB7CiAgICAgICAgc2hpZnQgQExpbmVzOwogICAgfQoKICAgICMgc2F2ZSB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEnLAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgLnNtYWxscHJvZiBiZWNhdXNlIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKICAgIG15ICRTbWFsbFByb2ZGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvYmluL2NnaS1iaW4vLnNtYWxscHJvZiI7CiAgICBzeXN0ZW0oInJtICRTbWFsbFByb2ZGaWxlIik7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDcvMDkvMjUgMTI6MzA6MzkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9UcmFuc2xhdGlvbkRlYnVnLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRyYW5zbGF0aW9uRGVidWcucG0sdiAxLjEgMjAwNy8wOS8yNSAxMjozMDozOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWcKCj1oZWFkMSBTWU5PUFNJUwoKaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBkZWJ1ZyBkYXRhCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKR2V0IHRoZSBkYXRhIGZvciB0aGlzIGZyZWQgbW9kdWxlLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuCkFuZCBhZGQgdGhlIGRhdGEgdG8gdGhlIG1vZHVsZSByZWYuCgogICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgTW9kdWxlUmVmID0+ICRNb2R1bGVSZWYsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIG9wZW4gdGhlIFRyYW5zbGF0aW9uRGVidWcubG9nIGZpbGUgdG8gZ2V0IHRoZSB1bnRyYW5zbGF0ZWQgd29yZHMKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvdmFyL2ZyZWQvVHJhbnNsYXRpb25EZWJ1Zy5sb2ciOwogICAgaWYgKCBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlICkgewogICAgICAgIG15IEBSb3cgICAgICAgID0gPCRGaWxlaGFuZGxlPjsKICAgICAgICBteSBAUmV2ZXJzZVJvdyA9IHJldmVyc2UoQFJvdyk7CiAgICAgICAgbXkgQExvZ01lc3NhZ2VzOwoKICAgICAgICAjIGdldCB0aGUgd2hvbGUgaW5mb3JtYXRpb24KICAgICAgICBmb3IgbXkgJExpbmUgKEBSZXZlcnNlUm93KSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gL0ZSRUQvICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBMb2dNZXNzYWdlcywgJExpbmU7CiAgICAgICAgfQogICAgICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICAgICAkU2VsZi0+SW5zZXJ0V29yZChXaGF0ID0+ICJGUkVEXG4iKTsKICAgICAgICAkeyAkUGFyYW17TW9kdWxlUmVmfSB9e0RhdGF9ID0gXEBMb2dNZXNzYWdlczsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwoKICAgIG15ICRGaWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiL0tlcm5lbC9MYW5ndWFnZS5wbSI7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICdDYW5cJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEnOwogICAgfQoKICAgICMgdG8gdXNlIFRyYW5zbGF0aW9uRGVidWcgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIExhbmd1YWdlLnBtIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICB3aGlsZSAoIG15ICRMaW5lID0gPCRGaWxlaGFuZGxlPiApIHsKICAgICAgICBwdXNoIEBMaW5lcywgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgICAgIGlmICggJExpbmUgPX4gLyMgd2FybiBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZi8gKSB7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJ1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWc7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJteSBcJFRyYW5zbGF0aW9uRGVidWdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6VHJhbnNsYXRpb25EZWJ1Zy0+bmV3KFwle1wkU2VsZn0pO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiXCRUcmFuc2xhdGlvbkRlYnVnT2JqZWN0LT5JbnNlcnRXb3JkKFdoYXQgPT4gXCRXaGF0KTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CgogICAgIyBjaGVjayBpZiB0aGUgbmVlZGVkIHBhdGggaXMgYXZhaWxhYmxlCiAgICBteSAkUGF0aCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkJzsKICAgIGlmICghLWUgJFBhdGgpIHsKICAgICAgICBzeXN0ZW0gIm1rZGlyICRQYXRoIjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi9LZXJuZWwvTGFuZ3VhZ2UucG0iOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAnQ2FuXCd0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshJzsKICAgIH0KCiAgICAjIHRvIHVzZSBUcmFuc2xhdGlvbkRlYnVnZ2VyIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBMYW5ndWFnZS5wbSBmaWxlCiAgICAjIGhlcmUgSSB1bmRvIG15IG1hbmlwdWxhdGlvbgogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CgogICAgbXkgJVJlbW92ZUxpbmUgPSAoCiAgICAgICAgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgInVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6VHJhbnNsYXRpb25EZWJ1ZztcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgIm15IFwkVHJhbnNsYXRpb25EZWJ1Z09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpUcmFuc2xhdGlvbkRlYnVnLT5uZXcoXCV7XCRTZWxmfSk7XG4iID0+IDEsCiAgICAgICAgIlwkVHJhbnNsYXRpb25EZWJ1Z09iamVjdC0+SW5zZXJ0V29yZChXaGF0ID0+IFwkV2hhdCk7XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgaWYgKCAhJFJlbW92ZUxpbmV7JExpbmV9ICkgewogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gSW5zZXJ0V29yZCgpCgpTYXZlIGEgd29yZCBpbiB0aGUgdHJhbnNsYXRpb24gZGVidWcgbG9nCgogICAgJEJhY2tlbmRPYmplY3QtPkluc2VydFdvcmQoCiAgICAgICAgV2hhdCA9PiAnYSB3b3JkJywKICAgICk7Cgo9Y3V0CgpzdWIgSW5zZXJ0V29yZCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17V2hhdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFdoYXQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNhdmUgdGhlIHdvcmQgaW4gbG9nIGZpbGUKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL2ZyZWQvVHJhbnNsYXRpb25EZWJ1Zy5sb2cnOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJz4+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGUgJFBhcmFte1doYXR9IC4gIlxuIjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA3LzA5LzI1IDEyOjMwOjM5ICQKCj1jdXQK