ITSMChangeManagementWorkflow
0.0.3
Nils Leideck
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
1. Ported to OTRS 3.0. 2. Image now created as SVG image and nodes are clickable in WorkOrder Workflow.
Added package dependencies.
New package.
Generating workflow images of Change and Workorder state machines.
Generiert dynamisch Bilder der State Machines fuer Changes und Workorders.
3.0.x
ITSMChangeManagement
GraphViz
MIME::Base64
2011-04-01 01:28:46
mole.localdomain
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMxOTAtV29ya09yZGVyV29ya2Zsb3ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIHNob3cgdGhlIFdvcmtvcmRlciBXb3JrZmxvdyBpbiB0aGUgd29ya29yZGVyIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVdvcmtPcmRlcjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNV29ya09yZGVyTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPldvcmtmbG93PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+U2hvdyBXb3Jrb3JkZXIgV29ya2Zsb3c8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNV29ya09yZGVyV29ya2Zsb3c8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJXb3JrZmxvdyZhbXA7V29ya09yZGVySUQ9JFFEYXRheyJXb3JrT3JkZXJJRCJ9PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVdvcmtPcmRlcldvcmtmbG93IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Xb3JrT3JkZXJXb3JrZmxvdyBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Xb3Jrb3JkZXIgV29ya2Zsb3c8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPldvcmtmbG93PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJXb3JrZmxvdyMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIHNlZSB0aGUgd29ya2Zsb3cgZm9yIHRoZSB3b3Jrb3JkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1dvcmtPcmRlcldvcmtmbG93PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4gICAgCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzE5MC1Xb3JrT3JkZXJXb3JrZmxvdyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gc2hvdyB0aGUgQ2hhbmdlIFdvcmtmbG93IGluIHRoZSB3b3Jrb3JkZXIgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2VNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+V29ya2Zsb3c8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5TaG93IENoYW5nZSBXb3JrZmxvdzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01DaGFuZ2VXb3JrZmxvdzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZVdvcmtmbG93JmFtcDtDaGFuZ2VJRD0kUURhdGF7IkNoYW5nZUlEIn08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+UG9wVXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+ICAgIAogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZVdvcmtmbG93IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01DaGFuZ2VXb3JrZmxvdyBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5DaGFuZ2UgV29ya2Zsb3c8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPldvcmtmbG93PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VXb3JrZmxvdyMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIHNlZSB0aGUgd29ya2Zsb3cgZm9yIHRoZSBjaGFuZ2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVdvcmtmbG93PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVdvcmtmbG93LnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgY2hhbmdlIHdvcmtmbG93IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VXb3JrZmxvdzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKCnVzZSBHcmFwaFZpejsKdXNlIE1JTUU6OkJhc2U2NDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNDggJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIENoYW5nZUlEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgY2hhbmdlIGlzIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDaGFuZ2UgJyRDaGFuZ2VJRCcgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBiYXNpYyBncmFwaCBkZXRhaWxzCiAgICBteSAkR3JhcGhPYmplY3QgPSBHcmFwaFZpei0+bmV3KAogICAgICAgIGxheW91dCA9PiAnZG90JywKICAgICAgICBkaXJlY3RlZCA9PiAxLAogICAgICAgIHJhbmtkaXIgPT4gJ0xSJywKIyAgICAgICAgc2l6ZSA9PiAxMCwKIyAgICAgICAgbm9kZSA9PiB7c2hhcGUgPT4gJ2NpcmNsZSd9LAojICAgICAgICBjb25jZW50cmF0ZSA9PiAxLAojICAgICAgICB3aWR0aCA9PiAxMCwKIyAgICAgICAgcmFuZG9tX3N0YXJ0ID0+IDEsCiMgICAgICAgYmdjb2xvciA9PiAnMC4wLDAuMCwwLjkzJywKICAgICk7CgogICAgIyBnZXQgY2hhbmdlIHN0YXRlIGlkCiAgICBteSAkQ2hhbmdlU3RhdGVJRCA9ICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfTsKCiAgICAjIGdldCAqU1RBUlQqIHN0YXRlIGlkCiAgICBteSAkU3RhcnRTdGF0ZUlEcyA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgIFN0YXRlSUQgPT4gMCwKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICk7CiAgICBteSAkU3RhcnRTdGF0ZUlEID0gJFN0YXJ0U3RhdGVJRHMtPlswXTsKCiAgICAjIGdldCAqU1RBUlQqIHN0YXRlIG5hbWUKICAgIG15ICRTdGFydFN0YXRlTmFtZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkU3RhcnRTdGF0ZUlELAogICAgKTsKCiAgICBpZiAoICRDaGFuZ2UtPntDaGFuZ2VTdGF0ZUlEfSA9PSAkU3RhcnRTdGF0ZUlEICkgewoKICAgICAgICAjIGJ1aWxkICpTVEFSVCogc3RhdGUgbm9kZQogICAgICAgICRHcmFwaE9iamVjdC0+YWRkX25vZGUoCiAgICAgICAgICAgICRTdGFydFN0YXRlSUQsCiAgICAgICAgICAgIGxhYmVsID0+ICRTdGFydFN0YXRlTmFtZS4nXG4oY3VycmVudCBzdGF0ZSknLAogICAgICAgICAgICBzaGFwZSA9PiAnY2lyY2xlJywKICAgICAgICAgICAgc3R5bGUgPT4gJ2ZpbGxlZCcsCiAgICAgICAgICAgIGZpbGxjb2xvciA9PiAnYmxhY2snLAogICAgICAgICAgICBmb250Y29sb3IgPT4gJ3doaXRlJywKICAgICAgICAgICAgZm9udG5hbWUgPT4gJ0hlbHZldGljYScsCiAgICAgICAgICAgIGZvbnRzaXplID0+ICc4JywKICAgICAgICAgICAgaGVpZ2h0ID0+IDEsCiAgICAgICAgKTsKCiAgICB9IGVsc2UgewoKICAgICAgICAjIGJ1aWxkICpTVEFSVCogc3RhdGUgbm9kZQogICAgICAgICRHcmFwaE9iamVjdC0+YWRkX25vZGUoCiAgICAgICAgICAgICRTdGFydFN0YXRlSUQsCiAgICAgICAgICAgIGxhYmVsID0+ICRTdGFydFN0YXRlTmFtZSwKICAgICAgICAgICAgc2hhcGUgPT4gJ2NpcmNsZScsCiAgICAgICAgICAgIHN0eWxlID0+ICdmaWxsZWQnLAogICAgICAgICAgICBmaWxsY29sb3IgPT4gJ2JsYWNrJywKICAgICAgICAgICAgZm9udGNvbG9yID0+ICd3aGl0ZScsCiAgICAgICAgICAgIGZvbnRuYW1lID0+ICdIZWx2ZXRpY2EnLAogICAgICAgICAgICBmb250c2l6ZSA9PiAnOCcsCiAgICAgICAgICAgIGhlaWdodCA9PiAxLAogICAgICAgICk7CgogICAgfQoKICAgIG15ICRTdGF0ZVRyYW5zaXRpb25zUmVmID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25MaXN0KAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKCiAgICBTVEFURUlEOgogICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJXskU3RhdGVUcmFuc2l0aW9uc1JlZn0gKSB7CgogICAgICAgIG15IEBOZXh0U3RhdGVzID0gQHsgJFN0YXRlVHJhbnNpdGlvbnNSZWYtPnskU3RhdGVJRH0gfTsKCiAgICAgICAgIyBza2lwICpTVEFSVCogc3RhdGVzCiAgICAgICAgbmV4dCBTVEFURUlEIGlmICEkU3RhdGVJRDsKCiAgICAgICAgRURHRToKICAgICAgICAjIGJ1aWxkIHRoZSBlZGdlcwogICAgICAgIGZvciBteSAkTmV4dFN0YXRlSUQgKCBATmV4dFN0YXRlcyApIHsKCiAgICAgICAgICAgICMgc2tpcCAqRU5EKiBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBFREdFIGlmICEkTmV4dFN0YXRlSUQ7CgogICAgICAgICAgICBpZiAoICRDaGFuZ2UtPntDaGFuZ2VTdGF0ZUlEfSA9PSAkU3RhdGVJRCApIHsKCiAgICAgICAgICAgICAgICAkR3JhcGhPYmplY3QtPmFkZF9lZGdlKAogICAgICAgICAgICAgICAgICAgICRTdGF0ZUlEID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9PiAnbmV4dCBzdGF0ZScsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPT4gJ2RhcmtncmVlbicsCiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPT4gJ2JvbGQnLAogICAgICAgICAgICAgICAgICAgIGZvbnRuYW1lID0+ICdIZWx2ZXRpY2EnLAogICAgICAgICAgICAgICAgICAgIGZvbnRzaXplID0+ICc4JywKICAgICAgICAgICAgICAgICAgICBmb250Y29sb3IgPT4gJ2RhcmtncmVlbicsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAkR3JhcGhPYmplY3QtPmFkZF9lZGdlKAogICAgICAgICAgICAgICAgICAgICRTdGF0ZUlEID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9PiAnZ3JheScsCiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPT4gJ2Rhc2hlZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICROZXh0U3RhdGVzWzBdICYmICRTdGF0ZUlEICE9ICRTdGFydFN0YXRlSUQgKSB7CgogICAgICAgICAgICAjIGdldCBub3JtYWwgU3RhdGVJRCBuYW1lcwogICAgICAgICAgICBteSAkU3RhdGVOYW1lID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRDaGFuZ2UtPntDaGFuZ2VTdGF0ZUlEfSA9PSAkU3RhdGVJRCApIHsKICAgICAgICAgICAgICAgICMgYnVpbGQgdGhlIGdyYXBoCiAgICAgICAgICAgICAgICAkR3JhcGhPYmplY3QtPmFkZF9ub2RlKAogICAgICAgICAgICAgICAgICAgICRTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0+ICRTdGF0ZU5hbWUgLiAnXG4oY3VycmVudCBzdGF0ZSknLAogICAgICAgICAgICAgICAgICAgIHNoYXBlID0+ICdjaXJjbGUnLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0+ICdkYXJrZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHN0eWxlID0+ICdmaWxsZWQnLAogICAgICAgICAgICAgICAgICAgIGZpbGxjb2xvciA9PiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIGZvbnRjb2xvciA9PiAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgIGZvbnRuYW1lID0+ICdIZWx2ZXRpY2EnLAogICAgICAgICAgICAgICAgICAgIGZvbnRzaXplID0+ICc4JywKICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgICMgYnVpbGQgdGhlIGdyYXBoCiAgICAgICAgICAgICAgICAkR3JhcGhPYmplY3QtPmFkZF9ub2RlKAogICAgICAgICAgICAgICAgICAgICRTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0+ICRTdGF0ZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPT4gJ2NpcmNsZScsCiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPT4gJ2ZpbGxlZCcsCiAgICAgICAgICAgICAgICAgICAgZmlsbGNvbG9yID0+ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgZm9udGNvbG9yID0+ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgZm9udG5hbWUgPT4gJ0hlbHZldGljYScsCiAgICAgICAgICAgICAgICAgICAgZm9udHNpemUgPT4gJzgnLAogICAgICAgICAgICAgICAgICAgIGhlaWdodCA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSBlbHNpZiAoICRTdGF0ZUlEICE9ICRTdGFydFN0YXRlSUQgKSB7CgogICAgICAgICAgICAjIGdldCAqRU5EKiBTdGF0ZUlEIG5hbWVzCiAgICAgICAgICAgIG15ICRTdGF0ZU5hbWUgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICMgc2V0IGEgZGVmYXVsdCBjb2xvciAKICAgICAgICAgICAgbXkgJGNvbG9yID0gJ3JlZCc7CgogICAgICAgICAgICAjIGNoZWNrIGlmIG90aGVyIGNvbG9yCiAgICAgICAgICAgIGlmICggJFN0YXRlTmFtZSBlcSAic3VjY2Vzc2Z1bCIgKSB7CiAgICAgICAgICAgICAgICAkY29sb3IgPSAnZGFya2dyZWVuJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IHN0YXRlCiAgICAgICAgICAgIGlmICggJENoYW5nZS0+e0NoYW5nZVN0YXRlSUR9ID09ICRTdGF0ZUlEICkgewogICAgICAgICAgICAgICAgIyBidWlsZCB0aGUgZ3JhcGgKICAgICAgICAgICAgICAgICRHcmFwaE9iamVjdC0+YWRkX25vZGUoCiAgICAgICAgICAgICAgICAgICAgJFN0YXRlSUQsCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPT4gJFN0YXRlTmFtZSAuICdcbihjdXJyZW50IHN0YXRlKScsCiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPT4gJ2RvdWJsZWNpcmNsZScsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPT4gJGNvbG9yLAogICAgICAgICAgICAgICAgICAgIHN0eWxlID0+ICdmaWxsZWQnLAogICAgICAgICAgICAgICAgICAgIGZpbGxjb2xvciA9PiAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgIGZvbnRjb2xvciA9PiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIGZvbnRuYW1lID0+ICdIZWx2ZXRpY2EnLAogICAgICAgICAgICAgICAgICAgIGZvbnRzaXplID0+ICc4JywKIyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIHRoZSBncmFwaAogICAgICAgICAgICAgICAgJEdyYXBoT2JqZWN0LT5hZGRfbm9kZSgKICAgICAgICAgICAgICAgICAgICAkU3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9PiAkU3RhdGVOYW1lLAogICAgICAgICAgICAgICAgICAgIHNoYXBlID0+ICdkb3VibGVjaXJjbGUnLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0+ICRjb2xvciwKICAgICAgICAgICAgICAgICAgICBzdHlsZSA9PiAnZmlsbGVkJywKICAgICAgICAgICAgICAgICAgICBmaWxsY29sb3IgPT4gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBmb250Y29sb3IgPT4gJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBmb250bmFtZSA9PiAnSGVsdmV0aWNhJywKICAgICAgICAgICAgICAgICAgICBmb250c2l6ZSA9PiAnOCcsCiMgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgojICAgIG15ICRXb3JrZmxvd0ltYWdlQmluYXJ5OwojICAgIG15ICRXb3JrZmxvd0ltYWdlWE1MOwojICAgICRHcmFwaE9iamVjdC0+YXNfc3ZnKFwkV29ya2Zsb3dJbWFnZUJpbmFyeSk7CiMgICAgJEdyYXBoT2JqZWN0LT5hc19zdmcoXCRXb3JrZmxvd0ltYWdlWE1MKTsKIyAgICBteSAkV29ya2Zsb3dJbWFnZSA9IGVuY29kZV9iYXNlNjQoJFdvcmtmbG93SW1hZ2VCaW5hcnksICcnKTsKCiAgICAjIFRPRE86IE9sZGVyIGJyb3dzZXJzIG1pZ2h0IGhhdmUgdHJvdWJsZSB3aXRoIGlubGluZSBYTUwsIHRoZXJlZm9yIHRoaXMgY291bGQgYmUgYSBTeXNDb25maWcgb3B0aW9uLgogICAgIyBnZW5lcmF0ZSBncmFwaCBpbWFnZSBiaW5hcnkKIyAgICBteSAkV29ya2Zsb3dJbWFnZUJpbmFyeTsKIyAgICAkR3JhcGhPYmplY3QtPmFzX3BuZyhcJFdvcmtmbG93SW1hZ2VCaW5hcnkpOwogICAgIyBjb252ZXJ0IGltYWdlIGJpbmFyeSBkYXRhIHRvIEJhc2U2NCBmb3IgdHJhbnNmZXIgdG8gdGVtcGxhdGUKIyAgICBteSAkV29ya2Zsb3dJbWFnZSA9IGVuY29kZV9iYXNlNjQoJFdvcmtmbG93SW1hZ2VCaW5hcnksICcnKTsKCiAgICAjIGdlbmVyYXRlIGdyYXBoIGltYWdlIFNWRwogICAgbXkgJFdvcmtmbG93SW1hZ2U7CiAgICAkR3JhcGhPYmplY3QtPmFzX3N2ZyhcJFdvcmtmbG93SW1hZ2UpOwogICAgIyByZW1vdmUgZmlyc3QgMyBsaW5lcyBvZiBYTUwgSGVhZGVyCiAgICAkV29ya2Zsb3dJbWFnZSA9fiBtLygoPzouKlxuKXszfSlcei87CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICBUaXRsZSA9PiAkQ2hhbmdlLT57Q2hhbmdlVGl0bGV9LAogICAgKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZVdvcmtmbG93JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgIFdvcmtmbG93SW1hZ2UgPT4gJFdvcmtmbG93SW1hZ2UsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlcldvcmtmbG93LnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgd29ya29yZGVyIHdvcmtmbG93IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJXb3JrZmxvdzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwoKdXNlIEdyYXBoVml6Owp1c2UgTUlNRTo6QmFzZTY0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yOCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1dvcmtPcmRlcklEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFdvcmtPcmRlcklEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJFdvcmtPcmRlcklEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIGJhc2ljIGdyYXBoIGRldGFpbHMKICAgIG15ICRHcmFwaE9iamVjdCA9IEdyYXBoVml6LT5uZXcoCiAgICAgICAgbGF5b3V0ID0+ICdkb3QnLAogICAgICAgIGRpcmVjdGVkID0+IDEsCiAgICAgICAgcmFua2RpciA9PiAnTFInLAojICAgICAgICBzaXplID0+IDEwLAojICAgICAgICBub2RlID0+IHtzaGFwZSA9PiAnY2lyY2xlJ30sCiMgICAgICAgIGNvbmNlbnRyYXRlID0+IDEsCiMgICAgICAgIHdpZHRoID0+IDEwLAojICAgICAgICByYW5kb21fc3RhcnQgPT4gMSwKIyAgICAgICBiZ2NvbG9yID0+ICcwLjAsMC4wLDAuOTMnLAogICAgKTsKCiAgICAjIGdldCB3b3Jrb3JkZXIgc3RhdGUgaWQKICAgIG15ICRXb3JrT3JkZXJTdGF0ZUlEID0gJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9OwoKICAgICMgZ2V0ICpTVEFSVCogc3RhdGUgaWQKICAgIG15ICRTdGFydFN0YXRlSURzID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25HZXQoCiAgICAgICAgU3RhdGVJRCA9PiAwLAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgKTsKICAgIG15ICRTdGFydFN0YXRlSUQgPSAkU3RhcnRTdGF0ZUlEcy0+WzBdOwoKICAgICMgZ2V0ICpTVEFSVCogc3RhdGUgbmFtZQogICAgbXkgJFN0YXJ0U3RhdGVOYW1lID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTdGFydFN0YXRlSUQsCiAgICApOwoKICAgIGlmICggJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9ID09ICRTdGFydFN0YXRlSUQgKSB7CgogICAgICAgICMgYnVpbGQgdGhlIFVSTAogICAgICAgIG15ICRVUkwgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSHR0cFR5cGUiKTsKICAgICAgICAkVVJMIC49ICI6Ly8iOwogICAgICAgICRVUkwgLj0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkZRRE4iKTsKICAgICAgICAkVVJMIC49ICIvIjsKICAgICAgICAkVVJMIC49ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTY3JpcHRBbGlhcyIpOwogICAgICAgICRVUkwgLj0gIi9pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyUmVwb3J0OyI7CiAgICAgICAgJFVSTCAuPSAiV29ya09yZGVySUQ9JFdvcmtPcmRlcklEOyI7CiAgICAgICAgJFVSTCAuPSAiV29ya09yZGVyU3RhdGVJRD0kU3RhcnRTdGF0ZUlEOyI7CgogICAgICAgICMgYnVpbGQgKlNUQVJUKiBzdGF0ZSBub2RlCiAgICAgICAgJEdyYXBoT2JqZWN0LT5hZGRfbm9kZSggCiAgICAgICAgICAgICRTdGFydFN0YXRlSUQsCiAgICAgICAgICAgIGxhYmVsID0+ICRTdGFydFN0YXRlTmFtZS4nXG4oY3VycmVudCBzdGF0ZSknLAogICAgICAgICAgICBzaGFwZSA9PiAnY2lyY2xlJywgCiAgICAgICAgICAgIGNvbG9yID0+ICdkYXJrZ3JlZW4nLAogICAgICAgICAgICBzdHlsZSA9PiAnZmlsbGVkJywKICAgICAgICAgICAgZmlsbGNvbG9yID0+ICdibGFjaycsCiAgICAgICAgICAgIGZvbnRjb2xvciA9PiAnd2hpdGUnLAogICAgICAgICAgICBmb250bmFtZSA9PiAnSGVsdmV0aWNhJywKICAgICAgICAgICAgZm9udHNpemUgPT4gJzgnLAogICAgICAgICAgICBoZWlnaHQgPT4gMSwKICAgICAgICAgICAgVVJMID0+ICRVUkwsCiAgICAgICAgKTsKCiAgICB9IGVsc2UgewoKICAgICAgICAjIGJ1aWxkIHRoZSBVUkwKICAgICAgICBteSAkVVJMID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkh0dHBUeXBlIik7CiAgICAgICAgJFVSTCAuPSAiOi8vIjsKICAgICAgICAkVVJMIC49ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJGUUROIik7CiAgICAgICAgJFVSTCAuPSAiLyI7CiAgICAgICAgJFVSTCAuPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiU2NyaXB0QWxpYXMiKTsKICAgICAgICAkVVJMIC49ICIvaW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclJlcG9ydDsiOwogICAgICAgICRVUkwgLj0gIldvcmtPcmRlcklEPSRXb3JrT3JkZXJJRDsiOwogICAgICAgICRVUkwgLj0gIldvcmtPcmRlclN0YXRlSUQ9JFN0YXJ0U3RhdGVJRDsiOwoKICAgICAgICAjIGJ1aWxkICpTVEFSVCogc3RhdGUgbm9kZQogICAgICAgICRHcmFwaE9iamVjdC0+YWRkX25vZGUoIAogICAgICAgICAgICAkU3RhcnRTdGF0ZUlELAogICAgICAgICAgICBsYWJlbCA9PiAkU3RhcnRTdGF0ZU5hbWUsCiAgICAgICAgICAgIHNoYXBlID0+ICdjaXJjbGUnLCAKICAgICAgICAgICAgY29sb3IgPT4gJ2JsYWNrJywKICAgICAgICAgICAgc3R5bGUgPT4gJ2ZpbGxlZCcsCiAgICAgICAgICAgIGZpbGxjb2xvciA9PiAnYmxhY2snLAogICAgICAgICAgICBmb250Y29sb3IgPT4gJ3doaXRlJywKICAgICAgICAgICAgZm9udG5hbWUgPT4gJ0hlbHZldGljYScsCiAgICAgICAgICAgIGZvbnRzaXplID0+ICc4JywKICAgICAgICAgICAgaGVpZ2h0ID0+IDEsCiAgICAgICAgICAgIFVSTCA9PiAkVVJMLAogICAgICAgICk7CgogICAgfQoKICAgIG15ICRTdGF0ZVRyYW5zaXRpb25zUmVmID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25MaXN0KAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgKTsKICAgIAogICAgU1RBVEVJRDoKICAgIGZvciBteSAkU3RhdGVJRCAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICV7JFN0YXRlVHJhbnNpdGlvbnNSZWZ9ICkgewogICAgICAgIAogICAgICAgIG15IEBOZXh0U3RhdGVzID0gQHsgJFN0YXRlVHJhbnNpdGlvbnNSZWYtPnskU3RhdGVJRH0gfTsKICAgICAgICAgICAgICAgCiAgICAgICAgIyBza2lwICpTVEFSVCogc3RhdGVzCiAgICAgICAgbmV4dCBTVEFURUlEIGlmICEkU3RhdGVJRDsKCiAgICAgICAgRURHRToKICAgICAgICAjIGJ1aWxkIHRoZSBlZGdlcwogICAgICAgIGZvciBteSAkTmV4dFN0YXRlSUQgKCBATmV4dFN0YXRlcyApIHsKCiAgICAgICAgICAgICMgc2tpcCAqRU5EKiBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBFREdFIGlmICEkTmV4dFN0YXRlSUQ7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZUlEfSA9PSAkU3RhdGVJRCApIHsKCiAgICAgICAgICAgICAgICAkR3JhcGhPYmplY3QtPmFkZF9lZGdlKAogICAgICAgICAgICAgICAgICAgICRTdGF0ZUlEID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9PiAnbmV4dCBzdGF0ZScsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPT4gJ2RhcmtncmVlbicsCiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPT4gJ2JvbGQnLAogICAgICAgICAgICAgICAgICAgIGZvbnRuYW1lID0+ICdIZWx2ZXRpY2EnLAogICAgICAgICAgICAgICAgICAgIGZvbnRzaXplID0+ICc4JywKICAgICAgICAgICAgICAgICAgICBmb250Y29sb3IgPT4gJ2RhcmtncmVlbicsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAkR3JhcGhPYmplY3QtPmFkZF9lZGdlKAogICAgICAgICAgICAgICAgICAgICRTdGF0ZUlEID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9PiAnZ3JheScsCiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPT4gJ2Rhc2hlZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICROZXh0U3RhdGVzWzBdICYmICRTdGF0ZUlEICE9ICRTdGFydFN0YXRlSUQgKSB7CgogICAgICAgICAgICAjIGdldCBub3JtYWwgU3RhdGVJRCBuYW1lcwogICAgICAgICAgICBteSAkU3RhdGVOYW1lID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZUlEfSA9PSAkU3RhdGVJRCApIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIHRoZSBVUkwKICAgICAgICAgICAgICAgIG15ICRVUkwgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSHR0cFR5cGUiKTsKICAgICAgICAgICAgICAgICRVUkwgLj0gIjovLyI7CiAgICAgICAgICAgICAgICAkVVJMIC49ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJGUUROIik7CiAgICAgICAgICAgICAgICAkVVJMIC49ICIvIjsKICAgICAgICAgICAgICAgICRVUkwgLj0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlNjcmlwdEFsaWFzIik7CiAgICAgICAgICAgICAgICAkVVJMIC49ICIvaW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclJlcG9ydDsiOwogICAgICAgICAgICAgICAgJFVSTCAuPSAiV29ya09yZGVySUQ9JFdvcmtPcmRlcklEOyI7CiAgICAgICAgICAgICAgICAkVVJMIC49ICJXb3JrT3JkZXJTdGF0ZUlEPSRTdGF0ZUlEOyI7CgogICAgICAgICAgICAgICAgIyBidWlsZCB0aGUgZ3JhcGgKICAgICAgICAgICAgICAgICRHcmFwaE9iamVjdC0+YWRkX25vZGUoCiAgICAgICAgICAgICAgICAgICAgJFN0YXRlSUQsCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPT4gJFN0YXRlTmFtZSAuICdcbihjdXJyZW50IHN0YXRlKScsCiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPT4gJ2NpcmNsZScsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPT4gJ2RhcmtncmVlbicsCiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPT4gJ2ZpbGxlZCcsCiAgICAgICAgICAgICAgICAgICAgZmlsbGNvbG9yID0+ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgZm9udGNvbG9yID0+ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgZm9udG5hbWUgPT4gJ0hlbHZldGljYScsCiAgICAgICAgICAgICAgICAgICAgZm9udHNpemUgPT4gJzgnLAogICAgICAgICAgICAgICAgICAgIGhlaWdodCA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAkVVJMLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCB0aGUgVVJMCiAgICAgICAgICAgICAgICBteSAkVVJMID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkh0dHBUeXBlIik7CiAgICAgICAgICAgICAgICAkVVJMIC49ICI6Ly8iOwogICAgICAgICAgICAgICAgJFVSTCAuPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiRlFETiIpOwogICAgICAgICAgICAgICAgJFVSTCAuPSAiLyI7CiAgICAgICAgICAgICAgICAkVVJMIC49ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTY3JpcHRBbGlhcyIpOwogICAgICAgICAgICAgICAgJFVSTCAuPSAiL2luZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ7IjsKICAgICAgICAgICAgICAgICRVUkwgLj0gIldvcmtPcmRlcklEPSRXb3JrT3JkZXJJRDsiOwogICAgICAgICAgICAgICAgJFVSTCAuPSAiV29ya09yZGVyU3RhdGVJRD0kU3RhdGVJRDsiOwoKICAgICAgICAgICAgICAgICMgYnVpbGQgdGhlIGdyYXBoCiAgICAgICAgICAgICAgICAkR3JhcGhPYmplY3QtPmFkZF9ub2RlKAogICAgICAgICAgICAgICAgICAgICRTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0+ICRTdGF0ZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPT4gJ2NpcmNsZScsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPT4gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBzdHlsZSA9PiAnZmlsbGVkJywKICAgICAgICAgICAgICAgICAgICBmaWxsY29sb3IgPT4gJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBmb250Y29sb3IgPT4gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBmb250bmFtZSA9PiAnSGVsdmV0aWNhJywKICAgICAgICAgICAgICAgICAgICBmb250c2l6ZSA9PiAnOCcsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVVJMID0+ICRVUkwsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQoKICAgICAgICB9IGVsc2lmICggJFN0YXRlSUQgIT0gJFN0YXJ0U3RhdGVJRCApIHsKCiAgICAgICAgICAgICMgZ2V0ICpFTkQqIFN0YXRlSUQgbmFtZXMKICAgICAgICAgICAgbXkgJFN0YXRlTmFtZSA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTdGF0ZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgYSBkZWZhdWx0IGNvbG9yCiAgICAgICAgICAgIG15ICRjb2xvciA9ICdyZWQnOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBvdGhlciBjb2xvcgogICAgICAgICAgICBpZiAoICRTdGF0ZU5hbWUgZXEgJ2Nsb3NlZCcgKSB7CiAgICAgICAgICAgICAgICAkY29sb3IgPSAnZGFya2dyZWVuJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IHN0YXRlICAgICAgICAKICAgICAgICAgICAgaWYgKCAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGVJRH0gPT0gJFN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCB0aGUgVVJMCiAgICAgICAgICAgICAgICBteSAkVVJMID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkh0dHBUeXBlIik7CiAgICAgICAgICAgICAgICAkVVJMIC49ICI6Ly8iOwogICAgICAgICAgICAgICAgJFVSTCAuPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiRlFETiIpOwogICAgICAgICAgICAgICAgJFVSTCAuPSAiLyI7CiAgICAgICAgICAgICAgICAkVVJMIC49ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTY3JpcHRBbGlhcyIpOwogICAgICAgICAgICAgICAgJFVSTCAuPSAiL2luZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ7IjsKICAgICAgICAgICAgICAgICRVUkwgLj0gIldvcmtPcmRlcklEPSRXb3JrT3JkZXJJRDsiOwogICAgICAgICAgICAgICAgJFVSTCAuPSAiV29ya09yZGVyU3RhdGVJRD0kU3RhdGVJRDsiOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgICMgYnVpbGQgdGhlIGdyYXBoCiAgICAgICAgICAgICAgICAkR3JhcGhPYmplY3QtPmFkZF9ub2RlKAogICAgICAgICAgICAgICAgICAgICRTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0+ICRTdGF0ZU5hbWUgLiAnXG4oY3VycmVudCBzdGF0ZSknLAogICAgICAgICAgICAgICAgICAgIHNoYXBlID0+ICdkb3VibGVjaXJjbGUnLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0+ICRjb2xvciwKICAgICAgICAgICAgICAgICAgICBzdHlsZSA9PiAnZmlsbGVkJywKICAgICAgICAgICAgICAgICAgICBmaWxsY29sb3IgPT4gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBmb250Y29sb3IgPT4gJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBmb250bmFtZSA9PiAnSGVsdmV0aWNhJywKICAgICAgICAgICAgICAgICAgICBmb250c2l6ZSA9PiAnOCcsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVVJMID0+ICRVUkwsCiAgICAgICAgICAgICAgICApOyAgICAgICAgCgogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgICMgYnVpbGQgdGhlIFVSTAogICAgICAgICAgICAgICAgbXkgJFVSTCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJIdHRwVHlwZSIpOwogICAgICAgICAgICAgICAgJFVSTCAuPSAiOi8vIjsKICAgICAgICAgICAgICAgICRVUkwgLj0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkZRRE4iKTsKICAgICAgICAgICAgICAgICRVUkwgLj0gIi8iOwogICAgICAgICAgICAgICAgJFVSTCAuPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiU2NyaXB0QWxpYXMiKTsKICAgICAgICAgICAgICAgICRVUkwgLj0gIi9pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyUmVwb3J0OyI7CiAgICAgICAgICAgICAgICAkVVJMIC49ICJXb3JrT3JkZXJJRD0kV29ya09yZGVySUQ7IjsKICAgICAgICAgICAgICAgICRVUkwgLj0gIldvcmtPcmRlclN0YXRlSUQ9JFN0YXRlSUQ7IjsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIHRoZSBncmFwaAogICAgICAgICAgICAgICAgJEdyYXBoT2JqZWN0LT5hZGRfbm9kZSgKICAgICAgICAgICAgICAgICAgICAkU3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9PiAkU3RhdGVOYW1lLAogICAgICAgICAgICAgICAgICAgIHNoYXBlID0+ICdkb3VibGVjaXJjbGUnLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0+ICRjb2xvciwKICAgICAgICAgICAgICAgICAgICBzdHlsZSA9PiAnZmlsbGVkJywKICAgICAgICAgICAgICAgICAgICBmaWxsY29sb3IgPT4gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBmb250Y29sb3IgPT4gJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBmb250bmFtZSA9PiAnSGVsdmV0aWNhJywKICAgICAgICAgICAgICAgICAgICBmb250c2l6ZSA9PiAnOCcsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVVJMID0+ICRVUkwsCiAgICAgICAgICAgICAgICApOyAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBUT0RPOiBPbGRlciBicm93c2VycyBtaWdodCBoYXZlIHRyb3VibGUgd2l0aCBpbmxpbmUgWE1MLCB0aGVyZWZvciB0aGlzIGNvdWxkIGJlIGEgU3lzQ29uZmlnIG9wdGlvbi4KICAgICMgZ2VuZXJhdGUgZ3JhcGggaW1hZ2UgYmluYXJ5CiMgICAgbXkgJFdvcmtmbG93SW1hZ2VCaW5hcnk7CiMgICAgJEdyYXBoT2JqZWN0LT5hc19wbmcoXCRXb3JrZmxvd0ltYWdlQmluYXJ5KTsKICAgICMgY29udmVydCBpbWFnZSBiaW5hcnkgZGF0YSB0byBCYXNlNjQgZm9yIHRyYW5zZmVyIHRvIHRlbXBsYXRlCiMgICAgbXkgJFdvcmtmbG93SW1hZ2UgPSBlbmNvZGVfYmFzZTY0KCRXb3JrZmxvd0ltYWdlQmluYXJ5LCAnJyk7CgogICAgIyBnZW5lcmF0ZSBncmFwaCBpbWFnZSBTVkcKICAgIG15ICRXb3JrZmxvd0ltYWdlOwogICAgJEdyYXBoT2JqZWN0LT5hc19zdmcoXCRXb3JrZmxvd0ltYWdlKTsKICAgICMgcmVtb3ZlIGZpcnN0IDMgbGluZXMgb2YgWE1MIEhlYWRlcgogICAgJFdvcmtmbG93SW1hZ2UgPX4gbS8oKD86Lipcbil7M30pXHovOwoKICAgICMgZ2V0IGNoYW5nZSB0aGF0IHRoZSB3b3Jrb3JkZXIgYmVsb25ncyB0bwogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIG5vIGNoYW5nZSBmb3VuZAogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGZpbmQgQ2hhbmdlIGZvciBXb3JrT3JkZXIgJFdvcmtPcmRlcklEISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclRpdGxlfSwKICAgICAgICBUeXBlICA9PiAnU21hbGwnLAogICAgKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVdvcmtPcmRlcldvcmtmbG93JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIFdvcmtmbG93SW1hZ2UgPT4gJFdvcmtmbG93SW1hZ2UsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEFnZW50SVRTTUNoYW5nZVdvcmtmbG93LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ2hhbmdlV29ya2Zsb3cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICA8aDE+JFRleHR7IldvcmtmbG93In0gJFRleHR7Im9mIn0gJENvbmZpZ3siSVRTTUNoYW5nZTo6SG9vayJ9ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn06ICRRRGF0YXsiQ2hhbmdlVGl0bGUifTwvaDE+CiAgICAgICAgPHA+CiAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIj4kVGV4dHsiQ2FuY2VsICYgY2xvc2Ugd2luZG93In08L2E+CiAgICAgICAgPC9wPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICA8ZGl2IGlkPSJXb3JrZmxvd0ltYWdlIj4KICAgICAgICAgICAgJERhdGF7IldvcmtmbG93SW1hZ2UifQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPjwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlcldvcmtmbG93LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNV29ya09yZGVyV29ya2Zsb3cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICA8aDE+JFRleHR7IldvcmtmbG93In0gJFRleHR7Im9mIn0gJENvbmZpZ3siSVRTTVdvcmtPcmRlcjo6SG9vayJ9ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gLSAkUURhdGF7IldvcmtPcmRlck51bWJlciJ9OiAkUURhdGF7IldvcmtPcmRlclRpdGxlIiwiNjAifTwvaDE+CiAgICAgICAgPHA+CiAgICAgICAgICAgIDxhIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIiBocmVmPSIjIj4kVGV4dHsiQ2FuY2VsICYgY2xvc2Ugd2luZG93In08L2E+CiAgICAgICAgPC9wPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICA8ZGl2IGlkPSJXb3JrZmxvd0ltYWdlIj4KICAgICAgICAgICAgJERhdGF7IldvcmtmbG93SW1hZ2UifQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPjwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclJlcG9ydC5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IHdvcmtvcmRlciByZXBvcnQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQucG0sdiAxLjM1IDIwMTAvMTIvMjAgMTQ6Mjc6MTMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMzUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCBHcm91cE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1dvcmtPcmRlcklEJyApOwoKIyMjIFhYWCBOaWxzIExlaWRlY2sgMzFNQVIyMDExCiMgcGF0Y2ggZm9yIHBhc3NpbmcgV29ya09yZGVyU3RhdGVJRCBvdmVyIFVSTAojCiAgICAjIGdldCBXb3JrT3JkZXJTdGF0ZUlEIGlmIGF2YWlsYWJsZSAKICAgIG15ICRXb3JrT3JkZXJTdGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnV29ya09yZGVyU3RhdGVJRCcgKTsKIyMjIFhYWAoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFdvcmtPcmRlcklEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJFdvcmtPcmRlcklEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIG5lZWRlZCBwYXJhbWV0ZXJzIGluICVHZXRQYXJhbSB0byBtYWtlIHRoaXMgcGFnZSByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoUmVwb3J0IFdvcmtPcmRlclN0YXRlSUQgQWNjb3VudGVkVGltZSkpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWd1cmVkIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZCBudW1iZXJzCiAgICBteSBAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzCiAgICAgICAgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcygpOwoKICAgICMgZ2V0IHdvcmtvcmRlciBmcmVldGV4dCBwYXJhbXMKICAgIG15ICVXb3JrT3JkZXJGcmVlVGV4dFBhcmFtOwogICAgTlVNQkVSOgogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgIyBjb25zaWRlciBvbmx5IGZyZWV0ZXh0IGZpZWxkcyB3aGljaCBhcmUgYWN0aXZhdGVkIGluIHRoaXMgZnJvbnRlbmQKICAgICAgICBuZXh0IE5VTUJFUiBpZiAhJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyRnJlZVRleHR9LT57JE51bWJlcn07CgogICAgICAgIG15ICRLZXkgICA9ICdXb3JrT3JkZXJGcmVlS2V5JyAuICROdW1iZXI7CiAgICAgICAgbXkgJFZhbHVlID0gJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXI7CgogICAgICAgICRXb3JrT3JkZXJGcmVlVGV4dFBhcmFteyRLZXl9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkV29ya09yZGVyRnJlZVRleHRQYXJhbXskVmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVmFsdWUgKTsKICAgIH0KCiAgICAjIHN0b3JlIGFjdHVhbCB0aW1lIHJlbGF0ZWQgZmllbGRzIGluICVHZXRQYXJhbQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY3R1YWxUaW1lU3Bhbn0gKSB7CiAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAocXcoQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CiAgICAgICAgICAgIGZvciBteSAkVGltZVBhcnQgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIFVzZWQpKSB7CiAgICAgICAgICAgICAgICBteSAkUGFyYW1OYW1lID0gJFRpbWVUeXBlIC4gJFRpbWVQYXJ0OwogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBwZXJmb21pbmcgdGhlIHN1YmFjdGlvbiB3YXMgbm90IGF0dGVtcHRlZC4KICAgICMgVGhlIGVudHJpZXMgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHRsIHZhbGlkYXRpb24gZXJyb3IgYmxvY2tzLgogICAgbXkgJVZhbGlkYXRpb25FcnJvcjsKCiAgICAjIHVwZGF0ZSB3b3Jrb3JkZXIKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyB2YWxpZGF0ZSB0aGUgYWN0dWFsIHRpbWUgcmVsYXRlZCBwYXJhbWV0ZXJzCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY3R1YWxUaW1lU3Bhbn0gKSB7CiAgICAgICAgICAgIG15ICVTeXN0ZW1UaW1lOwogICAgICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKCiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdVc2VkJyB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHdoZW4gdGhlIGJ1dHRvbiB3YXMgbm90IGNoZWNrZWQsIHRoZW4gY2xlYXIgdGhlIHRpbWUKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFRpbWVUeXBlfSA9IHVuZGVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1llYXInIH0KICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNb250aCcgfQogICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0RheScgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnSG91cicgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTWludXRlJyB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIGZvcm1hdCBhcyB0aW1lc3RhbXAsIHdoZW4gYWxsIHJlcXVpcmVkIHRpbWUgcGFyYW1zIHdlcmUgcGFzc2VkCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lVHlwZX0gPSBzcHJpbnRmICclMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNb250aCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnRGF5JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdIb3VyJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNaW51dGUnIH07CgogICAgICAgICAgICAgICAgICAgICMgc2FuaXR5IGNoZWNrIG9mIHRoZSBhc3NlbWJsZWQgdGltZXN0YW1wCiAgICAgICAgICAgICAgICAgICAgJFN5c3RlbVRpbWV7JFRpbWVUeXBlfSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFteyRUaW1lVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBkbyBub3Qgc2F2ZSBpZiB0aW1lIGlzIGludmFsaWQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3lzdGVtVGltZXskVGltZVR5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yeyAkVGltZVR5cGUgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgaXQgd2FzIGluZGljYXRlZCB0aGF0IHRoZSB0aW1lIHNob3VsZCBiZSBzZXQsCiAgICAgICAgICAgICAgICAgICAgIyBidXQgYXQgbGVhc3Qgb25lIG9mIHRoZSByZXF1aXJlZCB0aW1lIHBhcmFtcyBpcyBtaXNzaW5nCiAgICAgICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJFRpbWVUeXBlIC4gJ0ludmFsaWQnIH0gICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJFRpbWVUeXBlIC4gJ0Vycm9yVHlwZScgfSA9ICdHZW5lcmljU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBhY3R1YWwgc3RhcnQgYW5kIGVuZCB0aW1lcwogICAgICAgICAgICBpZiAoICRTeXN0ZW1UaW1le0FjdHVhbEVuZFRpbWV9ICYmICEkU3lzdGVtVGltZXtBY3R1YWxTdGFydFRpbWV9ICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntBY3R1YWxTdGFydFRpbWVJbnZhbGlkfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7QWN0dWFsU3RhcnRUaW1lRXJyb3JUeXBlfSA9ICdTZXRTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgKCAkU3lzdGVtVGltZXtBY3R1YWxFbmRUaW1lfSAmJiAkU3lzdGVtVGltZXtBY3R1YWxTdGFydFRpbWV9ICkKICAgICAgICAgICAgICAgICYmICggJFN5c3RlbVRpbWV7QWN0dWFsRW5kVGltZX0gPCAkU3lzdGVtVGltZXtBY3R1YWxTdGFydFRpbWV9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntBY3R1YWxTdGFydFRpbWVJbnZhbGlkfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7QWN0dWFsU3RhcnRUaW1lRXJyb3JUeXBlfSA9ICdCZWZvcmVUaGFuRW5kVGltZVNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB2YWxpZGF0ZSBmb3JtYXQgb2YgYWNjb3VudGVkIHRpbWUKICAgICAgICBpZiAoICRHZXRQYXJhbXtBY2NvdW50ZWRUaW1lfSAhfiBteyBcQSAtPyBcZCogKD86IFsuXSBcZHsxLDJ9ICk/IFx6IH14bXMgKSB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7J0FjY291bnRlZFRpbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgcmVxdWlyZWQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyAoaWYgY29uZmlndXJlZCkKICAgICAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcykgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntXb3JrT3JkZXJGcmVlVGV4dH0tPnskTnVtYmVyfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyRnJlZVRleHR9LT57JE51bWJlcn0gPT0gMgogICAgICAgICAgICAgICAgJiYgJFdvcmtPcmRlckZyZWVUZXh0UGFyYW17ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyIH0gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0UGFyYW17RXJyb3J9LT57JE51bWJlcn0gPSAxOwogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXIgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gaW5wdXQgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICBpZiAoICElVmFsaWRhdGlvbkVycm9yICkgewoKICAgICAgICAgICAgIyB0aGUgYWN0dWFsIHRpbWUgcmVsYXRlZCBmaWVsZHMgYXJlIGNvbmZpZ3VyYWJsZQogICAgICAgICAgICBteSAlQWRkaXRpb25hbFBhcmFtOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FjdHVhbFRpbWVTcGFufSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkVGltZVR5cGUgKHF3KEFjdHVhbFN0YXJ0VGltZSBBY3R1YWxFbmRUaW1lKSkgewoKICAgICAgICAgICAgICAgICAgICAjICRHZXRQYXJhbXskVGltZVR5cGV9IGlzIGVpdGhlciBhIHZhbGlkIHRpbWVzdGFtcCBvciB1bmRlZgogICAgICAgICAgICAgICAgICAgICRBZGRpdGlvbmFsUGFyYW17JFRpbWVUeXBlfSA9ICRHZXRQYXJhbXskVGltZVR5cGV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwZGF0ZSB0aGUgd29ya29yZGVyCiAgICAgICAgICAgIG15ICRDb3VsZFVwZGF0ZVdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgICA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgICA9PiAkR2V0UGFyYW17UmVwb3J0fSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJEdldFBhcmFte1dvcmtPcmRlclN0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBBY2NvdW50ZWRUaW1lICAgID0+ICRHZXRQYXJhbXtBY2NvdW50ZWRUaW1lfSwKICAgICAgICAgICAgICAgICVBZGRpdGlvbmFsUGFyYW0sCiAgICAgICAgICAgICAgICAlV29ya09yZGVyRnJlZVRleHRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaWYgd29ya29yZGVyIHVwZGF0ZSB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICBpZiAoJENvdWxkVXBkYXRlV29ya09yZGVyKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVyLT57V29ya09yZGVySUR9IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldhcyBub3QgYWJsZSB0byB1cGRhdGUgV29ya09yZGVyICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBpbml0aWFsaXplIHRoZSBhY3R1YWwgdGltZSByZWxhdGVkIGZpZWxkcwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QWN0dWFsVGltZVNwYW59ICkgewogICAgICAgICAgICBUSU1FVFlQRToKICAgICAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAocXcoQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CgogICAgICAgICAgICAgICAgbmV4dCBUSU1FVFlQRSBpZiAhJFdvcmtPcmRlci0+eyRUaW1lVHlwZX07CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIHRpbWUgZnJvbSB0aGUgd29ya29yZGVyCiAgICAgICAgICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkV29ya09yZGVyLT57JFRpbWVUeXBlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUgKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgcGFyYW1ldGVyIGhhc2ggZm9yIEJ1aWxkRGF0ZVNlbGVjdGlvbigpCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdVc2VkJyB9ICAgPSAxOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTWludXRlJyB9ID0gJE1pbnV0ZTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ01vbnRoJyB9ICA9ICRNb250aDsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB0aGF0IHRoZSB3b3Jrb3JkZXIgYmVsb25ncyB0bwogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIG5vIGNoYW5nZSBmb3VuZAogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGZpbmQgQ2hhbmdlIGZvciBXb3JrT3JkZXIgJFdvcmtPcmRlcklEISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIHN0YXRlIGxpc3QKICAgIG15ICRXb3JrT3JkZXJQb3NzaWJsZVN0YXRlcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBidWlsZCBkcm9wLWRvd24gd2l0aCB3b3Jrb3JkZXIgc3RhdGVzCiAgICAkUGFyYW17U3RhdGVTZWxlY3R9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRXb3JrT3JkZXJQb3NzaWJsZVN0YXRlcywKICAgICAgICBOYW1lICAgICAgID0+ICdXb3JrT3JkZXJTdGF0ZUlEJywKIyMjIFhYWCBOaWxzIExlaWRlY2sgMzFNQVIyMDExCiMgcGF0Y2ggZm9yIHVzaW5nIHRoZSBXb3JrT3JkZXJTdGF0ZUlEIHRoYXQgaGFzIGJlZW4gcGFzc2VkIGJ5IFVSTAojCiMgICAgICAgIFNlbGVjdGVkSUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFdvcmtPcmRlclN0YXRlSUQgfHwgJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9LAojIyMgWFhYCiAgICApOwoKICAgICMgc2hvdyBzdGF0ZSBkcm9wZG93bgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAkV29ya09yZGVyLT57V29ya09yZGVyVGl0bGV9LAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICApOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSB3b3Jrb3JkZXIgZnJlZXRleHQgY29uZmlnIGFuZCBmaWxsdXAgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyBmcm9tIHdvcmtvcmRlciBkYXRhCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRDb25maWc7CiAgICBOVU1CRVI6CiAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoV29ya09yZGVyRnJlZUtleSBXb3JrT3JkZXJGcmVlVGV4dCkpIHsKCiAgICAgICAgICAgICMgZ2V0IHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgZnJvbSB3b3Jrb3JkZXIgaWYgcGFnZSBpcyBsb2FkZWQgdGhlIGZpcnN0IHRpbWUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewoKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJGcmVlVGV4dFBhcmFteyAkVHlwZSAuICROdW1iZXIgfSB8fD0gJFdvcmtPcmRlci0+eyAkVHlwZSAuICROdW1iZXIgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgY29uZmlnCiAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJFR5cGUgLiAkTnVtYmVyICk7CgogICAgICAgICAgICBuZXh0IFRZUEUgaWYgISRDb25maWc7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiByZWYgJENvbmZpZyBuZSAnSEFTSCc7CgogICAgICAgICAgICAjIHN0b3JlIHRoZSB3b3Jrb3JkZXIgZnJlZXRleHQgY29uZmlnCiAgICAgICAgICAgICRXb3JrT3JkZXJGcmVlVGV4dENvbmZpZ3sgJFR5cGUgLiAkTnVtYmVyIH0gPSAkQ29uZmlnOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgcmVxdWlyZWQgZW50cnkgaW4gdGhlIGhhc2ggKGlmIGNvbmZpZ3VyZWQgZm9yIHRoaXMgZnJlZSB0ZXh0IGZpZWxkKQogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyRnJlZVRleHR9LT57JE51bWJlcn0KICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyRnJlZVRleHR9LT57JE51bWJlcn0gPT0gMgogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRDb25maWd7UmVxdWlyZWR9LT57JE51bWJlcn0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHRoZSB3b3Jrb3JkZXIgZnJlZXRleHQgSFRNTAogICAgbXkgJVdvcmtPcmRlckZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRGcmVlVGV4dEhUTUwoCiAgICAgICAgQ29uZmlnICAgICAgICAgICAgICAgICAgID0+IFwlV29ya09yZGVyRnJlZVRleHRDb25maWcsCiAgICAgICAgV29ya09yZGVyRGF0YSAgICAgICAgICAgID0+IFwlV29ya09yZGVyRnJlZVRleHRQYXJhbSwKICAgICAgICBDb25maWd1cmVkRnJlZVRleHRGaWVsZHMgPT4gXEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMsCiAgICApOwoKICAgICMgc2hvdyB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgZnJlZXRleHQgZmllbGQgc2hvdWxkIGJlIHNob3duIGluIHRoaXMgZnJvbnRlbmQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9ICkgewoKICAgICAgICAgICAgIyBzaG93IHNpbmdsZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVdvcmtPcmRlckZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgYWxsIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVLZXlGaWVsZCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRIVE1MeyAnV29ya09yZGVyRnJlZUtleUZpZWxkJyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dEZpZWxkID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRXb3JrT3JkZXJGcmVlVGV4dEhUTUx7ICdXb3JrT3JkZXJGcmVlVGV4dEZpZWxkJyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYWN0dWFsIHRpbWVzIHNob3VsZCBiZSBzaG93bgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY3R1YWxUaW1lU3Bhbn0gKSB7CgogICAgICAgIGZvciBteSAkVGltZVR5cGUgKHF3KEFjdHVhbEVuZFRpbWUgQWN0dWFsU3RhcnRUaW1lKSkgewoKICAgICAgICAgICAgIyB0aW1lIHBlcmlvZCB0aGF0IGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoZSBHVUkKICAgICAgICAgICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgICAgICAgICAjIGFkZCBzZWxlY3Rpb24gZm9yIHRoZSB0aW1lCiAgICAgICAgICAgIG15ICRUaW1lU2VsZWN0aW9uU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgID0+ICRUaW1lVHlwZSwKICAgICAgICAgICAgICAgICIke1RpbWVUeXBlfU9wdGlvbmFsIiA9PiAxLAogICAgICAgICAgICAgICAgJFRpbWVUeXBlIC4gJ0NsYXNzJyA9PiAkVmFsaWRhdGlvbkVycm9yeyAkVGltZVR5cGUgLiAnSW52YWxpZCcgfSB8fCAnJywKICAgICAgICAgICAgICAgIFZhbGlkYXRlID0+IDEsCiAgICAgICAgICAgICAgICAlVGltZVBlcmlvZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyB0aW1lIGZpZWxkCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRUaW1lVHlwZSwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICRUaW1lVHlwZSAuICdTZWxlY3Rpb25TdHJpbmcnID0+ICRUaW1lU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGFjdHVhbCBzdGFydCB0aW1lCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0dWFsU3RhcnRUaW1lJwogICAgICAgICAgICAgICAgLiAoICRWYWxpZGF0aW9uRXJyb3J7QWN0dWFsU3RhcnRUaW1lRXJyb3JUeXBlfSB8fCAnR2VuZXJpY1NlcnZlckVycm9yJyApCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWNjb3VudGVkIHRpbWUgb25seSB3aGVuIGZvcm0gd2FzIHN1Ym1pdHRlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY2NvdW50ZWRUaW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93QWNjb3VudGVkVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQWNjb3VudGVkVGltZSA9PiAkR2V0UGFyYW17QWNjb3VudGVkVGltZX0sCiAgICAgICAgICAgICAgICAlVmFsaWRhdGlvbkVycm9yLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGFjY291bnRlZCB0aW1lIG9ubHkgd2hlbiBmb3JtIHdhcyBzdWJtaXR0ZWQKICAgIG15ICRBY2NvdW50ZWRUaW1lID0gJyc7CiAgICBpZiAoICRHZXRQYXJhbXtBY2NvdW50ZWRUaW1lfSApIHsKICAgICAgICAkQWNjb3VudGVkVGltZSA9ICRHZXRQYXJhbXtBY2NvdW50ZWRUaW1lfTsKICAgIH0KCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVdvcmtPcmRlclJlcG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICAlVmFsaWRhdGlvbkVycm9yLAogICAgICAgICAgICBBY2NvdW50ZWRUaW1lID0+ICRBY2NvdW50ZWRUaW1lLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==