UserImportExport
5.0.0
c.a.p.e. IT GmbH
http://www.cape-it.de/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
CR: T2015082690000553 (added changes for OTRS 5.0.x) (tlange).
CR: (added changes for use with OTRS 5.0.x beta 3)
Provides ImportExportBackend for Users.
5.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to INSTALL the UserImportExport extensions package for OTRS.<br/>
<br/>
<br/>
<b>Required OTRS packages:</b><br><br>
ImportExport 5.0.1 or higher
<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to UNINSTALL the UserImportExport extensions package for OTRS.<br/>
<br/>
<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to UPGRADE the UserImportExport extensions package for OTRS.<br/>
<br/>
<br/>
<b>Required OTRS packages:</b><br><br>
ImportExport 5.0.1 or higher
<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
ImportExport
$Kernel::OM->Get('var::packagesetup::UserImportExport')->CodeInstall();
$Kernel::OM->Get('var::packagesetup::UserImportExport')->CodeUpgrade();
$Kernel::OM->Get('var::packagesetup::UserImportExport')->CodeUninstall();
$Kernel::OM->Get('var::packagesetup::UserImportExport')->CodeReinstall();
2015-11-16 08:04:13
cvs.intra.cape-it.de
IyAkSWQ6IFVzZXJJbXBvcnRFeHBvcnQucG9kLHYgMS41IDIwMTMvMTAvMTYgMTQ6MTU6MDggdHRvIEV4cCAkCgo9aGVhZDEgR2VuZXJhbAoKVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFuIENTVi1iYXNlZCBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIHVzZXIgKHdpdGggY3VzdG9tIHF1ZXVlcywgcm9sZXMgYW5kIHNvbWUgcHJlZmVyZW5jZXMpLgoKVGhpcyBwYWNrYWdlIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBpbXBvcnQtL2V4cG9ydCBtYXBwaW5nIGR1cmluZyByZS0vaW5zdGFsbGF0aW9uIGZvciBlYWNoIHJlZ2lzdGVyZWQgdXNlci4KCj1vdmVyIDQgCgo9aXRlbSAqICJEZWZhdWx0IEVtYWlsIgoKICAgICAgICBkZWZhdWx0IGVtYWlsIGFkZHJlc3MgaWYgbm90IHNwZWNpZmllZCBpbiBpbXBvcnQgZGF0YQoKPWl0ZW0gKiAiRGVmYXVsdCBQYXNzd29yZC1TdWZmaXgiCgogICAgICAgIGEgcGFzc3dvcmQgd2lsbCBiZSBpZGVudGljYWwgd2l0aCB0aGUgbG9naW4gZm9sbG93ZWQgYnkgdGhpcyBzdWZmaXggaWYgbm90IHNwZWNpZmllZCBpbiBpbXBvcnQgZGF0YQoKPWl0ZW0gKiAiTWF4LiBudW1iZXIgb2YgQ3VzdG9tIFF1ZXVlcwoKICAgICAgICBzcGVjaWZpZXMgaG93IG1hbnkgY3VzdG9tIHF1ZXVlcyBtaWdodCBiZSBpbXBvcnRlZCBvciBleHBvcnRlZCAobnVtYmVyIG9mIGNvbHVtbnMpCgo9aXRlbSAqICJNYXguIG51bWJlciBvZiByb2xlcyIKCiAgICAgICAgc3BlY2lmaWVzIGhvdyBtYW55IHJvbGVzIG1pZ2h0IGJlIGltcG9ydGVkIG9yIGV4cG9ydGVkIChudW1iZXIgb2YgY29sdW1ucykKCj1pdGVtICogIkRlZmF1bHQgVmFsaWRpdHkiCgogICAgICAgIGlmIG5vIHZhbGlkIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGluIGltcG9ydCBkYXRhLCB0aGlzIHZhbGlkIGluZm9ybWF0aW9uIGlzIHVzZWQKCj1iYWNrCgo9aGVhZDEgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUvCgpUaGUgZm9sbG93aW5nIHBlcnNvbnMgaGF2ZSBjb250cmlidXRlZCB0byB0aGlzIGV4dGVuc2lvbjoKCj1vdmVyIDQKCj1pdGVtICogUmlja3koZG90KUthaXNlcihhdCljYXBlKGRhc2gpaXQoZG90KWRlCgo9aXRlbSAqIEZyYW5rKGRvdClPYmVyZW5kZXIoYXQpY2FwZShkYXNoKWl0KGRvdClkZQoKPWl0ZW0gKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKCj1iYWNrCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZSB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cg==
IyBDaGFuZ2UgbG9nIG9mIFVzZXJJbXBvcnRFeHBvcnQKKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUvCiogJElkOiBDSEFOR0VTX1VzZXJJbXBvcnRFeHBvcnQubWQsdiAxLjkgMjAxNS8xMS8xNiAwNzowMDoxMCB0bGFuZ2UgRXhwICQKCiMgUk9BRE1BUCBUQVNLUwoKIzUuMC4wICgyMDE1LzExLzE2KQoqICgyMDE1LzExLzExKSAtIENSOiBUMjAxNTA4MjY5MDAwMDU1MyAoYWRkZWQgY2hhbmdlcyBmb3IgT1RSUyA1LjAueCkgKHRsYW5nZSkKIAojIHI0LjAuMCAoMjAxNS8wOC8yNikKKiAoMjAxNS8wNC8xNikgLSBCdWdmaXg6IFQyMDE1MDQxNTkwMDAwNjA3IChmaXggRGVzY3JpcHRpb24gaW4gc29wbSkgKHNyZWlzcykKCiMgcjEuMy4wICgyMDE0LzEyLzAyKQoqICgyMDE0LzEyLzAyKSAtIENSOiBUMjAxNDEwMjk5MDAwMDUyNyAoYWRkZWQgZnJhbWV3b3JrIDQuMCkgKGFsaXR2aW5vdmEpCgojICAxLjIuMCAoMjAxMy8xMC8/PykKKiAoMjAxMy8xMC8xNikgLSBDUjogVDIwMTMxMDE0OTAwMDA4NDIgKGFkZGVkIGZyYW1ld29yayAzLjMpICh0dG8pCiogKDIwMTMvMTAvMTYpIC0gQ1I6IFQyMDEzMTAxNDkwMDAwODQyIChhZGRlZCBhbmQgbW92ZWQgQ0hBTkdFUy1maWxlKSAodHRvKQoKIyAgMS4xLjAgKDIwMTMvMDIvMTgpCiogKDIwMTMvMDIvMTgpIC0gQ1I6IFQyMDEzMDIxMjkwMDAwMTU2IChhZGRlZCBTeXNjb25maWcgb3B0aW9uIGZvciBhdW90bS4gQ1NWLW1hcHBpbmcgY3JlYXRpb24gb24gcmVpbnN0YWxsL3VwZ3JhZGUpIChhbGl0dmlub3ZhKQoqICgyMDEzLzAyLzE4KSAtIENSOiBUMjAxMzAyMTI5MDAwMDE1NiAobW9kaWZpY2F0aW9ucyBmb3IgSVRTTTMuMS43IGFuZCBmcmFtZXdvcmsgT1RSUyAzLjIueCkgKGFsaXR2aW5vdmEpCiogKDIwMTIvMTIvMTcpIC0gQnVnZml4OiBjb3JyZWN0IHNvcG0tRmlsZSAoZm9iZXIpCgojICAxLjAuMCAoMjAxMi8xMi8xMikKKiAoMjAxMi8xMi8xMikgLSBDUjogZmlyc3QgcmVsZWFzZSBmb3IgcHJvZHVjdGl2ZSB1c2UgKHR0bykKKiAoMjAxMi8xMi8xMikgLSBDUjogY29kZSBjbGVhbnVwICh0dG8pICAKCiMgIDAuMS4xICgyMDExLzA5LzI5KQoqICgyMDExLzA5LzI5KSAtIENSOiBzbWFsbCBjaGFuZ2VzIGFib3V0IE91dE9mT2ZmaWNlIChya2Fpc2VyKQoKIyAgMC4xLjAgKDIwMTEvMDkvMjgpCiogKDIwMTEvMDkvMjgpIC0gQ1I6IGZpcnN0IHJlbGVhc2UgZm9yIHRlc3RpbmcgcHVycG9zZSAocmthaXNlcikKCg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFVzZXJJbXBvcnRFeHBvcnQueG1sLHYgMS4zIDIwMTMvMDIvMTggMDk6NDY6NTcgYWxpdHZpbm92YSBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uIyMjVXNlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk9iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5PYmpla3QtQmFja2VuZCBNb2R1bCBSZWdpc3RyYXRpb24gZGVzIEltcG9ydC9FeHBvcnQgTW9kdWxzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkltcG9ydEV4cG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk9iamVjdEJhY2tlbmQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlVzZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlVzZXI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVXNlckltcG9ydDo6RGVmYXVsdEVtYWlsQWRkcmVzcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgd2hpY2ggZW1haWwgYWRkcmVzcyB0byB1c2UgaWYgbm90IGRlZmluZWQgLSBzdHJvbmdseSBkZXBlbmRzIG9uIGJhY2tlbmQgY29uZmlndXJhdGlvbiEhITwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgd2VsY2hlIE1haWxhZHJlc3NlIGdlbnV0enQgd2lyZCwgd2VubiBuaWNodCBnZWdlYmVuIC0gc3RhcmsgYWJoYWVuZ2lnIHZvbiBCYWNrZW5ka29uZmlndXJhdGlvbiEhITwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkltcG9ydEV4cG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlVzZXJJbXBvcnRFeHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmR1bW15QGxvY2FsaG9zdC5jb208L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJVc2VySW1wb3J0OjpEZWZhdWx0UGFzc3dvcmQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHdoaWNoIGRlZmF1bHQgcGFzc3dvcmQtc3VmZml4IHRvIHVzZSBmb3IgaW1wb3J0IGlmIG5vdCBkZWZpbmVkIC0gc3Ryb25nbHkgZGVwZW5kcyBvbiBiYWNrZW5kIGNvbmZpZ3VyYXRpb24hISE8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IHdlbGNoZXMgU3RhbmRhcmQtUGFzc3dvcnQtU3VmZml4IGbDvHIgSW1wb3J0IGdlbnV0enQgd2lyZCwgd2VubiBuaWNodCBnZWdlYmVuIC0gc3RhcmsgYWJoYWVuZ2lnIHZvbiBCYWNrZW5ka29uZmlndXJhdGlvbiEhITwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkltcG9ydEV4cG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlVzZXJJbXBvcnRFeHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnBhc3MxMjM8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICAKICAgIDxDb25maWdJdGVtIE5hbWU9IlVzZXJJbXBvcnQ6OkZvcmNlQ1NWTWFwcGluZ1JlY3JlYXRpb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiBDU1YtbWFwcGluZ3MgYXJlIHJlLWNyZWF0ZWQgb24gbmV4dCBwYWNrYWdlIHJlaW5zdGFsbGF0aW9uIG9yIHVwZ3JhZGUgaWYgYWxyZWFkeSBleGlzdGVudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JbXBvcnRFeHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Vc2VySW1wb3J0RXhwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPiAgICAgICAgCiAgICAKPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvVXNlci5wbQojLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIFVzZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogUmlja3koZG90KUthaXNlcihhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIEFubmEoZG90KUxpdHZpbm92YShhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgLS0KIyAkSWQ6IFVzZXIucG0sdiAxLjggMjAxNS8wOS8wNyAxNToyOTowNCB0bGFuZ2UgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpVc2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpRdWV1ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKdXNlIFRpbWU6OkxvY2FsOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpDb25maWcnCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VXNlciAtIGltcG9ydC9leHBvcnQgYmFja2VuZCBmb3IgVXNlcgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IFVzZXIgZW50cmllcwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VXNlcjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIEltcG9ydEV4cG9ydE9iamVjdCA9PiAkSW1wb3J0RXhwb3J0T2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgb2JqZWN0IGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkT2JqZWN0QmFja2VuZC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpCiAgICAgICAgICAgIC0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVWYWxpZGxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnRGVmYXVsdFVzZXJFbWFpbCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdEZWZhdWx0IEVtYWlsJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDI1MCwKICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoCiAgICAgICAgICAgICAgICAgICAgJ1VzZXJJbXBvcnQ6OkRlZmF1bHRFbWFpbEFkZHJlc3MnLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0RlZmF1bHRQYXNzd29yZCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdQYXNzd29yZCBTdWZmaXggKHB3PWxvZ2luK3N1ZmZpeCAtIG9ubHkgaW1wb3J0KScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAyNTAsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KAogICAgICAgICAgICAgICAgICAgICdVc2VySW1wb3J0OjpEZWZhdWx0UGFzc3dvcmQnLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ051bWJlck9mQ3VzdG9tUXVldWVzJywKICAgICAgICAgICAgTmFtZSAgPT4gJ01heC4gbnVtYmVyIG9mIEN1c3RvbSBRdWV1ZXMnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gMywKICAgICAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAzLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICcxMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdOdW1iZXJPZlJvbGVzJywKICAgICAgICAgICAgTmFtZSAgPT4gJ01heC4gbnVtYmVyIG9mIHJvbGVzJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDMsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gMywKICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAnMTAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnRGVmYXVsdFZhbGlkJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0RlZmF1bHQgVmFsaWRpdHknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVWYWxpZGxpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgbWFwcGluZyBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJE9iamVjdEJhY2tlbmQtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIG15IEBFbGVtZW50TGlzdCA9IHF3e307CiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoVXNlclRpdGxlIFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSBVc2VyRW1haWwgVXNlclB3IFZhbGlkSUQKICAgICAgICBVc2VyVGhlbWUgVXNlckxhbmd1YWdlIFVzZXJDb21tZW50IFVzZXJTa2luIE91dE9mT2ZmaWNlIE91dE9mT2ZmaWNlU3RhcnRZZWFyIE91dE9mT2ZmaWNlU3RhcnRNb250aAogICAgICAgIE91dE9mT2ZmaWNlU3RhcnREYXkgT3V0T2ZPZmZpY2VFbmRZZWFyIE91dE9mT2ZmaWNlRW5kTW9udGggT3V0T2ZPZmZpY2VFbmREYXkgVXNlclNlbmRNb3ZlTm90aWZpY2F0aW9uCiAgICAgICAgVXNlclNlbmRGb2xsb3dVcE5vdGlmaWNhdGlvbiBVc2VyU2VuZE5ld1RpY2tldE5vdGlmaWNhdGlvbiBVc2VyU2VuZExvY2tUaW1lb3V0Tm90aWZpY2F0aW9uKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQ3VyckF0dHJpYnV0ZSA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFtZXRlciwKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFtZXRlciwKICAgICAgICB9OwoKICAgICAgICAjIGlmIFZhbGlkSUQgaXMgYXZhaWxhYmxlIC0gb2ZmZXIgVmFsaWQgaW5zdGVhZC4uCiAgICAgICAgaWYgKCAkUGFyYW1ldGVyIGVxICdWYWxpZElEJyApIHsKICAgICAgICAgICAgJEN1cnJBdHRyaWJ1dGUgPSB7IEtleSA9PiAnVmFsaWQnLCBWYWx1ZSA9PiAnVmFsaWRpdHknLCB9OwogICAgICAgIH0KCiAgICAgICAgIyBpZiBVc2VyUHcgaXMgYXZhaWxhYmxlIC0gYWRkIG5vdGUgdG8gbWFwcGluZy4uCiAgICAgICAgaWYgKCAkUGFyYW1ldGVyIGVxICdVc2VyUHcnICkgewogICAgICAgICAgICAkQ3VyckF0dHJpYnV0ZSA9IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVXNlclB3JywKICAgICAgICAgICAgICAgIFZhbHVlID0+CiAgICAgICAgICAgICAgICAgICAgJ1VzZXJQdyAobm90IGZpbGxlZCBpbiBleHBvcnQsIHJlbGV2YW50IG9ubHkgZm9yIGltcG9ydCBvZiBuZXcgZW50cmllcyknLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyByZXF1aXJlZCBtYXBwaW5nLWVsZW1lbnRzCiAgICAgICAgaWYgKCAkUGFyYW1ldGVyIGVxICdVc2VyTG9naW4nICkgewogICAgICAgICAgICAkQ3VyckF0dHJpYnV0ZSA9IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbWV0ZXIsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAiJFBhcmFtZXRlciAocmVxdWlyZWQgZm9yIGltcG9ydCkiLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbWV0ZXIgZXEgJ1VzZXJGaXJzdG5hbWUnIHx8ICRQYXJhbWV0ZXIgZXEgJ1VzZXJMYXN0bmFtZScgKSB7CiAgICAgICAgICAgICRDdXJyQXR0cmlidXRlID0gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFtZXRlciwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICIkUGFyYW1ldGVyIChyZXF1aXJlZCBmb3IgaW1wb3J0IG9mIG5ldyBlbnRyaWVzKSIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHB1c2goIEBFbGVtZW50TGlzdCwgJEN1cnJBdHRyaWJ1dGUgKTsKICAgIH0KCj1tb3JlIFByZWZlcmVuY2VzOgpVc2VyQ3JlYXRlTmV4dE1hc2sgVXNlclRpY2tldE92ZXJ2aWV3U21hbGxQYWdlU2hvd24gVXNlclRpY2tldE92ZXJ2aWV3UHJldmlld1BhZ2VTaG93bgpVc2VyQ29uZmlnSXRlbU92ZXJ2aWV3U21hbGxQYWdlU2hvd24gVXNlckNoYW5nZU92ZXJ2aWV3U21hbGxQYWdlU2hvd24gVXNlclJlZnJlc2hUaW1lIFVzZXJUaWNrZXRPdmVydmlld01lZGl1bVBhZ2VTaG93bgo9Y3V0CgogICAgIyBjb2x1bW5zIGZvciBDdXN0b21RdWV1ZXMKICAgIG15ICROdW1iZXJPZkN1c3RvbVF1ZXVlcyA9ICRPYmplY3REYXRhLT57TnVtYmVyT2ZDdXN0b21RdWV1ZXN9IHx8IDEwOwogICAgbXkgJEN1cnJJbmRleCA9IDA7CiAgICB3aGlsZSAoICRDdXJySW5kZXggPCAkTnVtYmVyT2ZDdXN0b21RdWV1ZXMgKSB7CgogICAgICAgIHB1c2goCiAgICAgICAgICAgIEBFbGVtZW50TGlzdCwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbVF1ZXVlJyAuIHNwcmludGYoICIlMDNkIiwgJEN1cnJJbmRleCApLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJ0N1c3RvbVF1ZXVlJyAuIHNwcmludGYoICIlMDNkIiwgJEN1cnJJbmRleCApLAogICAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgJEN1cnJJbmRleCsrOwogICAgfQoKICAgICMgY29sdW1ucyBmb3Igcm9sZXMKICAgIG15ICROdW1iZXJPZlJvbGVzID0gJE9iamVjdERhdGEtPntOdW1iZXJPZlJvbGVzfSB8fCAxMDsKICAgICRDdXJySW5kZXggPSAwOwogICAgd2hpbGUgKCAkQ3VyckluZGV4IDwgJE51bWJlck9mUm9sZXMgKSB7CgogICAgICAgIHB1c2goCiAgICAgICAgICAgIEBFbGVtZW50TGlzdCwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1JvbGUnIC4gc3ByaW50ZiggIiUwM2QiLCAkQ3VyckluZGV4ICksCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnUm9sZScgLiBzcHJpbnRmKCAiJTAzZCIsICRDdXJySW5kZXggKSwKICAgICAgICAgICAgfQogICAgICAgICk7CgogICAgICAgICRDdXJySW5kZXgrKzsKICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdLZXknLAogICAgICAgICAgICBOYW1lICA9PiAnS2V5JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxARWxlbWVudExpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJZGVudGlmaWVyJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0lkZW50aWZpZXInLAogICAgICAgICAgICBJbnB1dCA9PiB7IFR5cGUgPT4gJ0NoZWNrYm94JywgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggb2JqZWN0IGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSAkT2JqZWN0QmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm47Cn0KCj1pdGVtIEV4cG9ydERhdGFHZXQoKQoKZ2V0IGV4cG9ydCBkYXRhIGFzIDJELWFycmF5LWhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEV4cG9ydERhdGEgPSAkT2JqZWN0QmFja2VuZC0+RXhwb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBkYXRhCiAgICBpZiAoICEkT2JqZWN0RGF0YSB8fCByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBtYXBwaW5nIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0aGUgbWFwcGluZyBsaXN0CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbWFwcGluZyBvYmplY3QgbGlzdAogICAgbXkgQE1hcHBpbmdPYmplY3RMaXN0OwogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoICEkTWFwcGluZ09iamVjdERhdGEgfHwgcmVmICRNYXBwaW5nT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCggQE1hcHBpbmdPYmplY3RMaXN0LCAkTWFwcGluZ09iamVjdERhdGEgKTsKICAgIH0KCiAgICAjIHNlYXJjaCB0aGUgdXNlcnMuLi4KICAgIG15ICVVc2VyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJTZWFyY2goCiAgICAgICAgU2VhcmNoID0+ICcqJywKICAgICAgICBWYWxpZCAgPT4gMCwKICAgICk7CiAgICBteSBARXhwb3J0RGF0YTsKCiAgICAjIGV4cG9ydCB1c2VyIC4uLgogICAgZm9yIG15ICRDdXJyVXNlciAoIGtleXMoJVVzZXJMaXN0KSApIHsKICAgICAgICBteSAlVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkQ3VyclVzZXIsCiAgICAgICAgICAgIE5vT3V0T2ZPZmZpY2UgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgdmFsaWRpdHkuLi4KICAgICAgICBpZiAoICRVc2VyRGF0YXtWYWxpZElEfSApIHsKICAgICAgICAgICAgJFVzZXJEYXRhe1ZhbGlkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJEYXRhe1ZhbGlkSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVwYXJlIHBhc3N3b3JkLi4uCiAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlclB3fSApIHsKICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJQd30gPSAnLSc7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgcHJlZmVyZW5jZXMKICAgICAgICBmb3IgbXkgJEFyZ3VtZW50ICgKICAgICAgICAgICAgcXcoT3V0T2ZPZmZpY2UgVXNlclNlbmRNb3ZlTm90aWZpY2F0aW9uIFVzZXJTZW5kRm9sbG93VXBOb3RpZmljYXRpb24gVXNlclNlbmROZXdUaWNrZXROb3RpZmljYXRpb24gVXNlclNlbmRMb2NrVGltZW91dE5vdGlmaWNhdGlvbikKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgICAoICRVc2VyRGF0YXskQXJndW1lbnR9ICkgeyAkVXNlckRhdGF7JEFyZ3VtZW50fSA9ICd5ZXMnIH0KICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgeyAkVXNlckRhdGF7JEFyZ3VtZW50fSA9ICdubycgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgQ3VzdG9tUXVldWVzCiAgICAgICAgbXkgQFF1ZXVlSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldEFsbEN1c3RvbVF1ZXVlcygKICAgICAgICAgICAgVXNlcklEID0+ICRDdXJyVXNlciwKICAgICAgICApOwogICAgICAgIGlmIChAUXVldWVJRHMpIHsKICAgICAgICAgICAgbXkgJEN1cnJJbmRleCA9IDA7CiAgICAgICAgICAgIG15ICROdW1iZXJPZkN1c3RvbVF1ZXVlcyA9ICRPYmplY3REYXRhLT57TnVtYmVyT2ZDdXN0b21RdWV1ZXN9IHx8IDEwOwogICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKEBRdWV1ZUlEcykgewogICAgICAgICAgICAgICAgaWYgKCAkQ3VyckluZGV4IDwgJE51bWJlck9mQ3VzdG9tUXVldWVzICkgewogICAgICAgICAgICAgICAgICAgIG15ICRRdWV1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRVc2VyRGF0YXsgJ0N1c3RvbVF1ZXVlJyAuIHNwcmludGYoICIlMDNkIiwgJEN1cnJJbmRleCApIH0gPSAkUXVldWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ3VyckluZGV4Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJvbGVzCiAgICAgICAgbXkgQFJvbGVJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBVc2VyUm9sZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkQ3VyclVzZXIsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgICAgICk7CiAgICAgICAgaWYgKEBSb2xlSURzKSB7CiAgICAgICAgICAgIG15ICRDdXJySW5kZXggPSAwOwogICAgICAgICAgICBteSAkTnVtYmVyT2ZSb2xlcyA9ICRPYmplY3REYXRhLT57TnVtYmVyT2ZSb2xlc30gfHwgMTA7CiAgICAgICAgICAgIGZvciBteSAkUm9sZUlEIChAUm9sZUlEcykgewogICAgICAgICAgICAgICAgaWYgKCAkQ3VyckluZGV4IDwgJE51bWJlck9mUm9sZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFJvbGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKQogICAgICAgICAgICAgICAgICAgICAgICAtPlJvbGVMb29rdXAoIFJvbGVJRCA9PiAkUm9sZUlEICk7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJEYXRheyAnUm9sZScgLiBzcHJpbnRmKCAiJTAzZCIsICRDdXJySW5kZXggKSB9ID0gJFJvbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ3VyckluZGV4Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15IEBDdXJyUm93OwogICAgICAgIGZvciBteSAkTWFwcGluZ09iamVjdCAoQE1hcHBpbmdPYmplY3RMaXN0KSB7CiAgICAgICAgICAgIG15ICRLZXkgPSAkTWFwcGluZ09iamVjdC0+e0tleX07CiAgICAgICAgICAgIGlmICggISRLZXkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBDdXJyUm93LCAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2goIEBDdXJyUm93LCAkVXNlckRhdGF7JEtleX0gfHwgJycgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwdXNoIEBFeHBvcnREYXRhLCBcQEN1cnJSb3c7CgogICAgfQogICAgcmV0dXJuIFxARXhwb3J0RGF0YTsKfQoKPWl0ZW0gSW1wb3J0RGF0YVNhdmUoKQoKaW1wb3J0IG9uZSByb3cgb2YgdGhlIGltcG9ydCBkYXRhCgogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRPYmplY3RCYWNrZW5kLT5JbXBvcnREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBJbXBvcnREYXRhUm93ID0+ICRBcnJheVJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgSW1wb3J0RGF0YVJvdyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gKCB1bmRlZiwgJ0ZhaWxlZCcgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpbXBvcnQgZGF0YSByb3cKICAgIGlmICggcmVmICRQYXJhbXtJbXBvcnREYXRhUm93fSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW1wb3J0RGF0YVJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gKCB1bmRlZiwgJ0ZhaWxlZCcgKTsKICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBvYmplY3QgZGF0YQogICAgaWYgKCAhJE9iamVjdERhdGEgfHwgcmVmICRPYmplY3REYXRhIG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIG9iamVjdCBkYXRhIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybiAoIHVuZGVmLCAnRmFpbGVkJyApOwogICAgfQoKICAgICMgZ2V0IHRoZSBtYXBwaW5nIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0aGUgbWFwcGluZyBsaXN0CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybiAoIHVuZGVmLCAnRmFpbGVkJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIG9iamVjdCBsaXN0CiAgICBteSBATWFwcGluZ09iamVjdExpc3Q7CiAgICBteSAlSWRlbnRpZmllcjsKICAgIG15ICRDb3VudGVyICAgICA9IDA7CiAgICBteSAlTmV3VXNlckRhdGEgPSBxd3t9OwogICAgbXkgJFVzZXJLZXkgICAgID0gIiI7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjQlVJTEQgTUFQUElORyBUQUJMRS4uLgogICAgbXkgJElzSGVhZGxpbmUgPSAxOwogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoICEkTWFwcGluZ09iamVjdERhdGEgfHwgcmVmICRNYXBwaW5nT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gKCB1bmRlZiwgJ0ZhaWxlZCcgKTsKICAgICAgICB9CgogICAgICAgIHB1c2goIEBNYXBwaW5nT2JqZWN0TGlzdCwgJE1hcHBpbmdPYmplY3REYXRhICk7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkTWFwcGluZ09iamVjdERhdGEtPntJZGVudGlmaWVyfQogICAgICAgICAgICAmJiAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBpbXBvcnQgdGhpcyBlbnRpdHkuICIKICAgICAgICAgICAgICAgICAgICAuICInJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fScgaGFzIGJlZW4gdXNlZCBtdWx0aXBsZSAiCiAgICAgICAgICAgICAgICAgICAgLiAidGltZXMgYXMgaWRlbnRpZmllciAobGluZSAkUGFyYW17Q291bnRlcn0pLiEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRNYXBwaW5nT2JqZWN0RGF0YS0+e0lkZW50aWZpZXJ9ICkgewogICAgICAgICAgICAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ID0KICAgICAgICAgICAgICAgICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRDb3VudGVyXTsKICAgICAgICAgICAgJFVzZXJLZXkgPSAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9OwogICAgICAgIH0KICAgICAgICAkTmV3VXNlckRhdGF7ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gfSA9CiAgICAgICAgICAgICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRDb3VudGVyXTsKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgI0RPIFRIRSBJTVBPUlQuLi4KICAgICMoMCkgUHJlcHJvY2VzcyBkYXRhLi4uCiAgICAjIGxvb2t1cCBWYWxpZC1JRC4uLgoKICAgIGlmICggISROZXdVc2VyRGF0YXtWYWxpZElEfSAmJiAkTmV3VXNlckRhdGF7VmFsaWR9ICkgewogICAgICAgICROZXdVc2VyRGF0YXtWYWxpZElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWQgPT4gJE5ld1VzZXJEYXRhe1ZhbGlkfQogICAgICAgICk7CiAgICB9CiAgICBpZiAoICEkTmV3VXNlckRhdGF7VmFsaWRJRH0gKSB7CiAgICAgICAgJE5ld1VzZXJEYXRhe1ZhbGlkSUR9ID0gJE9iamVjdERhdGEtPntEZWZhdWx0VmFsaWR9IHx8IDE7CiAgICB9CgogICAgIygxKSBzZWFyY2ggdXNlcgogICAgbXkgJVVzZXJEYXRhID0gKCk7CiAgICBpZiAoICEkVXNlcktleSB8fCAkVXNlcktleSBuZSAnVXNlckxvZ2luJyApIHsKICAgICAgICAkVXNlcktleSA9ICJVc2VyTG9naW4iOwogICAgfQoKICAgIGlmICggJE5ld1VzZXJEYXRheyRVc2VyS2V5fSApIHsKICAgICAgICAlVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlciA9PiAkTmV3VXNlckRhdGF7JFVzZXJLZXl9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIG5vIHVwZGF0ZSBvZiByb290QGxvY2FsaG9zdAogICAgaWYgKCAkVXNlckRhdGF7VXNlcklEfSAmJiAkVXNlckRhdGF7VXNlcklEfSA9PSAxICkgewogICAgICAgIG5leHQ7CiAgICB9CgogICAgbXkgJE5ld1VzZXIgPSAxOwogICAgaWYgKCVVc2VyRGF0YSkgewogICAgICAgICROZXdVc2VyID0gMDsKICAgIH0KCiAgICBmb3IgbXkgJEtleSAoIGtleXMoJU5ld1VzZXJEYXRhKSApIHsKICAgICAgICAkVXNlckRhdGF7JEtleX0gPSAkTmV3VXNlckRhdGF7JEtleX07CiAgICB9CgogICAgaWYgKCAhJFVzZXJEYXRhe1ZhbGlkSUR9ICkgewogICAgICAgICRVc2VyRGF0YXtWYWxpZElEfSA9IDE7CiAgICB9CgogICAgIygxKSBQcmVwcm9jZXNzIGRhdGEuLi4KCiAgICAjZGVmYXVsdCBVc2VyRW1haWwuLi4KICAgIGlmICggISRVc2VyRGF0YXtVc2VyRW1haWx9ICkgewogICAgICAgICRVc2VyRGF0YXtVc2VyRW1haWx9ID0gJE9iamVjdERhdGEtPntEZWZhdWx0VXNlckVtYWlsfQogICAgICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoCiAgICAgICAgICAgICdVc2VySW1wb3J0OjpEZWZhdWx0RW1haWxBZGRyZXNzJwogICAgICAgICAgICApOwogICAgfQoKICAgICMoMikgaWYgdXNlciBET0VTIE5PVCBleGlzdCA9PiBjcmVhdGUKICAgIG15ICRSZXN1bHQgICAgID0gMDsKICAgIG15ICRSZXR1cm5Db2RlID0gIiI7ICAgICMgQ3JlYXRlZCB8IENoYW5nZWQgfCBGYWlsZWQKCiAgICBpZiAoJE5ld1VzZXIpIHsKCiAgICAgICAgIyBzZXQgZGVmYXVsdHMKICAgICAgICBkZWxldGUgJFVzZXJEYXRhe0lEfTsKCiAgICAgICAgIyBkZWZhdWx0IFVzZXJQdwogICAgICAgIGlmICggISRVc2VyRGF0YXtVc2VyUHd9IHx8ICRVc2VyRGF0YXtVc2VyUHd9IGVxICctJyApIHsKICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJQd30gPSAkVXNlckRhdGF7VXNlckxvZ2lufSAuICgKICAgICAgICAgICAgICAgICRPYmplY3REYXRhLT57RGVmYXVsdFBhc3N3b3JkfSB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoCiAgICAgICAgICAgICAgICAgICAgJ1VzZXJJbXBvcnQ6OkRlZmF1bHRQYXNzd29yZCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgfQogICAgICAgICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyQWRkKAogICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkUmVzdWx0ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0RGF0YVNhdmU6IGFkZGluZyBVc2VyICgiCiAgICAgICAgICAgICAgICAgICAgLiAiTG9naW4gIgogICAgICAgICAgICAgICAgICAgIC4gJFVzZXJEYXRhe1VzZXJMb2dpbn0KICAgICAgICAgICAgICAgICAgICAuICIpIGZhaWxlZCAobGluZSAkUGFyYW17Q291bnRlcn0pLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuQ29kZSA9ICJDcmVhdGVkIjsKICAgICAgICB9CiAgICB9CgogICAgIygzKSBpZiB1c2VyIERPRVMgZXhpc3QgPT4gdXBkYXRlLi4uCiAgICBlbHNlIHsKICAgICAgICAkVXNlckRhdGF7SUR9ID0gJE5ld1VzZXJEYXRheyRVc2VyS2V5fTsKCiAgICAgICAgZGVsZXRlICRVc2VyRGF0YXtVc2VyUHd9OwogICAgICAgICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyVXBkYXRlKAogICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkUmVzdWx0ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0RGF0YVNhdmU6IHVwZGF0aW5nIFVzZXIgKCIKICAgICAgICAgICAgICAgICAgICAuICJMb2dpbiAiCiAgICAgICAgICAgICAgICAgICAgLiAkVXNlckRhdGF7VXNlckxvZ2lufQogICAgICAgICAgICAgICAgICAgIC4gIikgZmFpbGVkIChsaW5lICRQYXJhbXtDb3VudGVyfSkuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXR1cm5Db2RlID0gIkNoYW5nZWQiOwogICAgICAgIH0KICAgIH0KCiAgICAjICg0KSBxdWV1ZXMsIHJvbGVzLCBwcmVmZXJlbmNlcwogICAgaWYgKCRSZXN1bHQpIHsKCiAgICAgICAgIyBnZXQgVXNlcklECiAgICAgICAgbXkgJFVzZXJJRDsKICAgICAgICBpZiAoJE5ld1VzZXIpIHsKICAgICAgICAgICAgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVXNlcklEID0gJFVzZXJEYXRhe1VzZXJJRH07CiAgICAgICAgfQoKICAgICAgICAjIHNldCBDdXN0b21RdWV1ZXMKICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBlbnRyaWVzCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBwZXJzb25hbF9xdWV1ZXMgV0hFUkUgdXNlcl9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRVc2VySUQgXSwKICAgICAgICApOwoKICAgICAgICBteSAkQ3VyckluZGV4ID0gMDsKICAgICAgICBteSAkTnVtYmVyT2ZDdXN0b21RdWV1ZXMgPSAkT2JqZWN0RGF0YS0+e051bWJlck9mQ3VzdG9tUXVldWVzfSB8fCAxMDsKICAgICAgICB3aGlsZSAoICRDdXJySW5kZXggPCAkTnVtYmVyT2ZDdXN0b21RdWV1ZXMgKSB7CiAgICAgICAgICAgIGlmICggJFVzZXJEYXRheyAnQ3VzdG9tUXVldWUnIC4gc3ByaW50ZiggIiUwM2QiLCAkQ3VyckluZGV4ICkgfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBRdWV1ZUlECiAgICAgICAgICAgICAgICBteSAkUXVldWVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkVXNlckRhdGF7ICdDdXN0b21RdWV1ZScgLiBzcHJpbnRmKCAiJTAzZCIsICRDdXJySW5kZXggKSB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBlbnRyeQogICAgICAgICAgICAgICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gcGVyc29uYWxfcXVldWVzICh1c2VyX2lkLCBxdWV1ZV9pZCkgVkFMVUVTICgnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRVc2VySUQgLiAnLCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyknLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFJldHVybkNvZGUgPSAiUGFydGlhbGx5IGNoYW5nZWQgLSBzZWUgbG9nIGZvciBkZXRhaWxzIiBpZiAoICEkU3VjY2VzcyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFJldHVybkNvZGUgPSAiUGFydGlhbGx5IGNoYW5nZWQgLSBzZWUgbG9nIGZvciBkZXRhaWxzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VyckluZGV4Kys7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBQcmVmZXJlbmNlcwogICAgICAgICMgY2hlY2sgT3V0T2ZPZmZpY2UtRGF0ZQogICAgICAgIGlmICggJFVzZXJEYXRhe091dE9mT2ZmaWNlfSApIHsKICAgICAgICAgICAgbXkgJENoZWNrOwogICAgICAgICAgICBmb3IgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgICAgIG15ICRDaGVja0RhdGU7CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyRGF0YXsgJ091dE9mT2ZmaWNlJyAuICRfIC4gJ1llYXInIH0gPX4gbS9cZHs0fS8gKSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrRGF0ZSA9IGV2YWwgewogICAgICAgICAgICAgICAgICAgICAgICB0aW1lbG9jYWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAkVXNlckRhdGF7ICdPdXRPZk9mZmljZScgLiAkXyAuICdEYXknIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRVc2VyRGF0YXsgJ091dE9mT2ZmaWNlJyAuICRfIC4gJ01vbnRoJyB9IC0gMSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJEYXRheyAnT3V0T2ZPZmZpY2UnIC4gJF8gLiAnWWVhcicgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tEYXRlICkgewogICAgICAgICAgICAgICAgICAgICRVc2VyRGF0YXsgJ091dE9mT2ZmaWNlJyAuICRfIC4gJ1llYXInIH0gID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJEYXRheyAnT3V0T2ZPZmZpY2UnIC4gJF8gLiAnTW9udGgnIH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAkVXNlckRhdGF7ICdPdXRPZk9mZmljZScgLiAkXyAuICdEYXknIH0gICA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJEYXRhe091dE9mT2ZmaWNlfSBuZSAnbm8nICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ltcG9ydDogSW52YWxpZCBPdXRPZk9mZmljZScgLiAkXyAuICctRGF0ZSBmb3IgVXNlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkVXNlckRhdGF7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRDaGVjayA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRDaGVjaykgeyAkVXNlckRhdGF7T3V0T2ZPZmZpY2V9ID0gJ25vJyB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgKAogICAgICAgICAgICAgICAgcXcoT3V0T2ZPZmZpY2VTdGFydFllYXIgT3V0T2ZPZmZpY2VTdGFydE1vbnRoIE91dE9mT2ZmaWNlU3RhcnREYXkKICAgICAgICAgICAgICAgIE91dE9mT2ZmaWNlRW5kWWVhciBPdXRPZk9mZmljZUVuZE1vbnRoIE91dE9mT2ZmaWNlRW5kRGF5KQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVXNlckRhdGF7JF99ID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIG15ICRQcmVmZXJlbmNlICgKICAgICAgICAgICAgcXcoVXNlclRoZW1lIFVzZXJMYW5ndWFnZSBVc2VyQ29tbWVudCBVc2VyU2tpbiBPdXRPZk9mZmljZVN0YXJ0WWVhciBPdXRPZk9mZmljZVN0YXJ0TW9udGggT3V0T2ZPZmZpY2VTdGFydERheQogICAgICAgICAgICBPdXRPZk9mZmljZUVuZFllYXIgT3V0T2ZPZmZpY2VFbmRNb250aCBPdXRPZk9mZmljZUVuZERheSBPdXRPZk9mZmljZSBVc2VyU2VuZE1vdmVOb3RpZmljYXRpb24KICAgICAgICAgICAgVXNlclNlbmRGb2xsb3dVcE5vdGlmaWNhdGlvbiBVc2VyU2VuZE5ld1RpY2tldE5vdGlmaWNhdGlvbiBVc2VyU2VuZExvY2tUaW1lb3V0Tm90aWZpY2F0aW9uKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7JFByZWZlcmVuY2V9ICkgewoKICAgICAgICAgICAgICAgICNjaGVjayBPdXRPZk9mZmljZSBhbmQgVXNlclNlbmQuLi5Ob3RpZmljYXRpb25zCiAgICAgICAgICAgICAgICBpZiAoICRQcmVmZXJlbmNlID1+IG0vXlVzZXJTZW5kLisvIHx8ICRQcmVmZXJlbmNlID1+IG0vXk91dE9mT2ZmaWNlJC8gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7JFByZWZlcmVuY2V9IGVxICdubycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyRGF0YXskUHJlZmVyZW5jZX0gPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsgJFVzZXJEYXRheyRQcmVmZXJlbmNlfSA9IDE7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgICAgIEtleSAgICA9PiAkUHJlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFVzZXJEYXRheyRQcmVmZXJlbmNlfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9Cgo9bW9yZSBQcmVmZXJlbmNlczoKVXNlckNyZWF0ZU5leHRNYXNrIFVzZXJUaWNrZXRPdmVydmlld1NtYWxsUGFnZVNob3duIFVzZXJUaWNrZXRPdmVydmlld1ByZXZpZXdQYWdlU2hvd24KVXNlckNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsUGFnZVNob3duIFVzZXJDaGFuZ2VPdmVydmlld1NtYWxsUGFnZVNob3duIFVzZXJSZWZyZXNoVGltZSBVc2VyVGlja2V0T3ZlcnZpZXdNZWRpdW1QYWdlU2hvd24KPWN1dAoKICAgICAgICAjIHNldCByb2xlcwogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIGVudHJpZXMKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHJvbGVfdXNlciBXSEVSRSB1c2VyX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFVzZXJJRCBdLAogICAgICAgICk7CgogICAgICAgICRDdXJySW5kZXggPSAwOwogICAgICAgIG15ICROdW1iZXJPZlJvbGVzID0gJE9iamVjdERhdGEtPntOdW1iZXJPZlJvbGVzfSB8fCAxMDsKICAgICAgICB3aGlsZSAoICRDdXJySW5kZXggPCAkTnVtYmVyT2ZSb2xlcyApIHsKICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7ICdSb2xlJyAuIHNwcmludGYoICIlMDNkIiwgJEN1cnJJbmRleCApIH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUm9sZUlECiAgICAgICAgICAgICAgICBteSAkUm9sZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlJvbGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgUm9sZSA9PiAkVXNlckRhdGF7ICdSb2xlJyAuIHNwcmludGYoICIlMDNkIiwgJEN1cnJJbmRleCApIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICNjcmVhdGUgbmV3IGVudHJ5CiAgICAgICAgICAgICAgICBpZiAoJFJvbGVJRCkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwVXNlclJvbGVNZW1iZXJBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVJRCAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBSSUQgICAgPT4gJFJvbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRSZXR1cm5Db2RlID0gIlBhcnRpYWxseSBjaGFuZ2VkIC0gc2VlIGxvZyBmb3IgZGV0YWlscyIgaWYgKCAhJFN1Y2Nlc3MgKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUmV0dXJuQ29kZSA9ICJQYXJ0aWFsbHkgY2hhbmdlZCAtIHNlZSBsb2cgZm9yIGRldGFpbHMiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXJySW5kZXgrKzsKICAgICAgICB9CiAgICB9CgogICAgIwogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgcmV0dXJuICggJFJlc3VsdCwgJFJldHVybkNvZGUgKTsKfQoKMTs=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9Vc2VySW1wb3J0RXhwb3J0LnBtIC0gcHJvdmlkZXMgZ2VybWFuIGxhbmd1YWdlCiMgdHJhbnNsYXRpb24gZm9yIFVzZXJJbXBvcnRFeHBvcnQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFJpY2t5KGRvdClLYWlzZXIoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojICogVG9yc3Rlbihkb3QpVGhhdShhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBBbm5hKGRvdClMaXR2aW5vdmEoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojIC0tCiMgJElkOiBkZV9Vc2VySW1wb3J0RXhwb3J0LnBtLHYgMS43IDIwMTUvMDkvMDcgMTU6Mjk6MDQgdGxhbmdlIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfVXNlckltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS43ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgojIC0tCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAjIHBvc3NpYmxlIGNoYXJzZXRzCiAgICAkU2VsZi0+e0NoYXJzZXR9ID0gWyd1dGYtOCcsIF07CgogICAgIyAkJFNUQVJUJCQKCiAgICAjIHRyYW5zbGF0aW9ucyBtaXNzaW5nIGluIEltcG9ydEV4cG9ydC4uLgogICAgJExhbmctPnsnQ29sdW1uIFNlcGVyYXRvcid9ICAgICAgICAgICA9ICdTcGFsdGVudHJlbm5lcic7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ1plaWNoZW5zYXR6JzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnRXhwb3J0IG1pdHRlbHMgU3VjaGUgZWluc2NocsOkbmtlbic7CiAgICAkTGFuZy0+eydWYWxpZElEIChub3QgdXNlZCBpbiBpbXBvcnQgYW55bW9yZSwgdXNlIFZhbGlkaXR5IGluc3RlYWQpJ30KICAgICAgICA9ICdWYWxpZElEICh3aXJkIG5pY2h0IGltIEltcG9ydCB2ZXJ3ZW5kZXQsIGJpdHRlIHN0YXR0ZGVzc2VuIFZhbGlkaXR5IG51dHplbic7CiAgICAkTGFuZy0+eydEZWZhdWx0IEVtYWlsJ30gICAgPSAnU3RhbmRhcmQgRW1haWwnOwogICAgJExhbmctPnsnRGVmYXVsdCBWYWxpZGl0eSd9ID0gJ1N0YW5kYXJkIEfDvGx0aWdrZWl0JzsKICAgICRMYW5nLT57J1Bhc3N3b3JkIFN1ZmZpeCAocHc9bG9naW4rc3VmZml4IC0gb25seSBpbXBvcnQpJ30gPSAnUGFzc3dvcnRzdWZmaXggKHB3PUxvZ2luK1N1ZmZpeCknOwogICAgJExhbmctPnsnTWF4LiBudW1iZXIgb2YgQ3VzdG9tIFF1ZXVlcyd9ICAgICAgICAgICAgPSAnTWF4LiBBbnphaGwgTWVpbmUgUXVldWVzJzsKICAgICRMYW5nLT57J01heC4gbnVtYmVyIG9mIHJvbGVzJ30gICAgICAgICAgICAgICAgICAgID0gJ01heC4gQW56YWhsIGRlciBSb2xsZW4nOwogICAgJExhbmctPnsnUGFydGlhbGx5IGNoYW5nZWQgLSBzZWUgbG9nIGZvciBkZXRhaWxzJ30gPSAnVGVpbHdlaXNlIGdlw6RuZGVydCAtIHNpZWhlIExvZyc7CiAgICAkTGFuZy0+eycnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwoKICAgIHJldHVybiAwOwoKICAgICMgJCRTVE9QJCQKfQoKIyAtLQoxOwo=
IyAtLQojIFVzZXJJbXBvcnRFeHBvcnQucG0gLSBjb2RlIHJ1biBkdXJpbmcgcGFja2FnZSBkZS0vaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFJpY2t5KGRvdClLYWlzZXIoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojICogVG9yc3Rlbihkb3QpVGhhdShhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBBbm5hKGRvdClMaXR2aW5vdmEoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IFVzZXJJbXBvcnRFeHBvcnQucG0sdiAxLjggMjAxNS8wOS8wNyAxNToyOTowNCB0bGFuZ2UgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6VXNlckltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OkNvbmZpZycKKTsKCj1oZWFkMSBOQU1FCgpVc2VySW1wb3J0RXhwb3J0LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFhNTE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29kZU9iamVjdCA9IHZhcjo6cGFja2FnZXNldHVwOjpVc2VySW1wb3J0RXhwb3J0LnBtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFhNTE9iamVjdCAgICA9PiAkWE1MT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fQ3JlYXRlTWFwcGluZ3MoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9DcmVhdGVNYXBwaW5ncygpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9DcmVhdGVNYXBwaW5ncygpOwogICAgCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9SZW1vdmVSZWxhdGVkTWFwcGluZ3MoKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9SZW1vdmVSZWxhdGVkTWFwcGluZ3MoKSB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgT2JqZWN0ID0+ICdVc2VyJywKICAgICAgICBGb3JtYXQgPT4gJ0NTVicsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIGlmICggcmVmKCRUZW1wbGF0ZUxpc3QpIGVxICdBUlJBWScgJiYgQHskVGVtcGxhdGVMaXN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPlRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUxpc3QsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0NyZWF0ZU1hcHBpbmdzKCkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGVtcGxhdGVPYmplY3QgPSAiVXNlciI7CiAgICBteSAkVGVtcGxhdGVOYW1lICAgPSAiVXNlciAtIEltcG9ydEV4cG9ydCAoYXV0by1jcmVhdGVkIG1hcCkiOwogICAgbXkgJVRlbXBsYXRlTGlzdCAgID0gKCk7CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbgogICAgbXkgJEZvcmNlQ1NWTWFwcGluZ0NvbmZpZ3VyYXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoCiAgICAgICAgJ1VzZXJJbXBvcnQ6OkZvcmNlQ1NWTWFwcGluZ1JlY3JlYXRpb24nCiAgICApIHx8ICcwJzsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGFkZCBhIHRlbXBsYXRlIHVzZXIKICAgICMgZ2V0IGxpc3Qgb2YgYWxsIHRlbXBsYXRlcwogICAgbXkgJFRlbXBsYXRlTGlzdFJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+VGVtcGxhdGVMaXN0KAogICAgICAgIE9iamVjdCA9PiAkVGVtcGxhdGVPYmplY3QsCiAgICAgICAgRm9ybWF0ID0+ICdDU1YnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBkYXRhIGZvciBlYWNoIHRlbXBsYXRlIGFuZCBidWlsZCBoYXNoIHdpdGgga2V5ID0gdGVtcGxhdGUgbmFtZTsgdmFsdWUgPSB0ZW1wbGF0ZSBJRAogICAgaWYgKCAkVGVtcGxhdGVMaXN0UmVmICYmIHJlZigkVGVtcGxhdGVMaXN0UmVmKSBlcSAnQVJSQVknICkgewogICAgICAgIGZvciBteSAkQ3VyclRlbXBsYXRlSUQgKCBAeyRUZW1wbGF0ZUxpc3RSZWZ9ICkgewogICAgICAgICAgICBteSAkVGVtcGxhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEN1cnJUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVEYXRhUmVmCiAgICAgICAgICAgICAgICAmJiByZWYoJFRlbXBsYXRlRGF0YVJlZikgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAmJiAkVGVtcGxhdGVEYXRhUmVmLT57T2JqZWN0fQogICAgICAgICAgICAgICAgJiYgJFRlbXBsYXRlRGF0YVJlZi0+e05hbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUxpc3R7ICRUZW1wbGF0ZURhdGFSZWYtPntPYmplY3R9IC4gJzo6JyAuICRUZW1wbGF0ZURhdGFSZWYtPntOYW1lfSB9CiAgICAgICAgICAgICAgICAgICAgPSAkQ3VyclRlbXBsYXRlSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBhZGQgYSB0ZW1wbGF0ZSB1c2VyCiAgICBteSAkVGVtcGxhdGVJRDsKCiAgICAjIGNoZWNrIGlmIHRlbXBsYXRlIGFscmVhZHkgZXhpc3RzLi4uCiAgICBpZiAoICRUZW1wbGF0ZUxpc3R7ICRUZW1wbGF0ZU9iamVjdCAuICc6OicgLiAkVGVtcGxhdGVOYW1lIH0gKSB7CiAgICAgICAgaWYgKCRGb3JjZUNTVk1hcHBpbmdDb25maWd1cmF0aW9uKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSBvbGQgdGVtcGxhdGUKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlTGlzdHsgJFRlbXBsYXRlT2JqZWN0IC4gJzo6JyAuICRUZW1wbGF0ZU5hbWUgfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDU1YgbWFwcGluZyBkZWxldGVkIGZvciByZS1jcmVhdGlvbiA8IgogICAgICAgICAgICAgICAgICAgIC4gJFRlbXBsYXRlTmFtZQogICAgICAgICAgICAgICAgICAgIC4gIj4uIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG5ldyB0ZW1wbGF0ZQogICAgICAgICAgICAkVGVtcGxhdGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICBPYmplY3QgID0+ICRUZW1wbGF0ZU9iamVjdCwKICAgICAgICAgICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWUsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICJBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZHVyaW5nIFVzZXJJbXBvcnRFeHBvcnQgaW5zdGFsbGF0aW9uIiwKICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDU1YgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBhbmQgbm90IHJlLWNyZWF0ZWQgPCIKICAgICAgICAgICAgICAgICAgICAuICRUZW1wbGF0ZU5hbWUKICAgICAgICAgICAgICAgICAgICAuICI+LiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgdGVtcGxhdGUKICAgICAgICAkVGVtcGxhdGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgIE9iamVjdCAgPT4gJFRlbXBsYXRlT2JqZWN0LAogICAgICAgICAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWUsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIkF1dG9tYXRpY2FsbHkgY3JlYXRlZCBkdXJpbmcgVXNlckltcG9ydEV4cG9ydCBpbnN0YWxsYXRpb24iLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgYXR0cmlidXRlIG1hcHBpbmcuLi4KICAgIG15IEBFbGVtZW50TGlzdCA9IHF3e307CiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoVXNlclRpdGxlIFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSBVc2VyRW1haWwgVXNlclB3IFZhbGlkSUQgVXNlclRoZW1lIFVzZXJMYW5ndWFnZQogICAgICAgIFVzZXJDb21tZW50IFVzZXJTa2luIE91dE9mT2ZmaWNlIE91dE9mT2ZmaWNlU3RhcnRZZWFyIE91dE9mT2ZmaWNlU3RhcnRNb250aAogICAgICAgIE91dE9mT2ZmaWNlU3RhcnREYXkgT3V0T2ZPZmZpY2VFbmRZZWFyIE91dE9mT2ZmaWNlRW5kTW9udGggT3V0T2ZPZmZpY2VFbmREYXkgVXNlclNlbmRNb3ZlTm90aWZpY2F0aW9uCiAgICAgICAgVXNlclNlbmRGb2xsb3dVcE5vdGlmaWNhdGlvbiBVc2VyU2VuZE5ld1RpY2tldE5vdGlmaWNhdGlvbiBVc2VyU2VuZExvY2tUaW1lb3V0Tm90aWZpY2F0aW9uKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQ3VyckF0dHJpYnV0ZSA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFtZXRlciwKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFtZXRlciwKICAgICAgICB9OwoKICAgICAgICAjIGlmIFZhbGlkSUQgaXMgYXZhaWxhYmxlIC0gb2ZmZXIgVmFsaWQgaW5zdGVhZC4uCiAgICAgICAgaWYgKCAkUGFyYW1ldGVyIGVxICdWYWxpZElEJyApIHsKICAgICAgICAgICAgJEN1cnJBdHRyaWJ1dGUgPSB7IEtleSA9PiAnVmFsaWQnLCBWYWx1ZSA9PiAnVmFsaWRpdHknLCB9OwogICAgICAgIH0KCiAgICAgICAgcHVzaCggQEVsZW1lbnRMaXN0LCAkQ3VyckF0dHJpYnV0ZSApOwoKICAgIH0KCiAgICAjIGZvciBDdXN0b21RdWV1ZXMKICAgIGZvciBteSAkUGFyYW1ldGVyICggMCAuLiA5ICkgewogICAgICAgICRQYXJhbWV0ZXIgPSAnQ3VzdG9tUXVldWUnIC4gc3ByaW50ZiggIiUwM2QiLCAkUGFyYW1ldGVyICk7CiAgICAgICAgbXkgJEN1cnJBdHRyaWJ1dGUgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbWV0ZXIsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbWV0ZXIsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBARWxlbWVudExpc3QsICRDdXJyQXR0cmlidXRlICk7CiAgICB9CgogICAgIyBmb3Igcm9sZXMKICAgIGZvciBteSAkUGFyYW1ldGVyICggMCAuLiA5ICkgewogICAgICAgICRQYXJhbWV0ZXIgPSAnUm9sZScgLiBzcHJpbnRmKCAiJTAzZCIsICRQYXJhbWV0ZXIgKTsKICAgICAgICBteSAkQ3VyckF0dHJpYnV0ZSA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFtZXRlciwKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFtZXRlciwKICAgICAgICB9OwogICAgICAgIHB1c2goIEBFbGVtZW50TGlzdCwgJEN1cnJBdHRyaWJ1dGUgKTsKICAgIH0KCiAgICBteSAkRXhwb3J0RGF0YVNldHMgPSBbCiAgICAgICAgewogICAgICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciAgICAgID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgICAgICAgICAgSW5jbHVkZUNvbHVtbkhlYWRlcnMgPT4gMSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gXEBFbGVtZW50TGlzdCwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfQogICAgXTsKCiAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgbXkgJE9iamVjdEF0dHJpYnV0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkRXhwb3J0RGF0YVNldHMtPlswXS0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhR2V0Li4uCiAgICBFWFBPUlREQVRBU0VUOgogICAgZm9yIG15ICRDdXJyZW50RXhwb3J0RGF0YVNldCAoIEB7JEV4cG9ydERhdGFTZXRzfSApIHsKCiAgICAgICAgIyBjaGVjayBTb3VyY2VFeHBvcnREYXRhIGF0dHJpYnV0ZQogICAgICAgIGlmICgKICAgICAgICAgICAgISRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9CiAgICAgICAgICAgIHx8IHJlZiAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfSBuZSAnSEFTSCcKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgIG5leHQgRVhQT1JUREFUQVNFVDsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRoZSBmb3JtYXQgZGF0YQogICAgICAgIGlmICgKICAgICAgICAgICAgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfQogICAgICAgICAgICAmJiByZWYgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIHNhdmUgZm9ybWF0IGRhdGEKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4KICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICBGb3JtYXREYXRhID0+ICRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9LT57Rm9ybWF0RGF0YX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIGlmICgKICAgICAgICAgICAgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0KICAgICAgICAgICAgJiYgcmVmICRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9LT57TWFwcGluZ09iamVjdERhdGF9IGVxICdBUlJBWScKICAgICAgICAgICAgJiYgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGRlbGV0ZSBhbGwgZXhpc3RpbmcgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4KICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIHRoZSBtYXBwaW5nIG9iamVjdCByb3dzCiAgICAgICAgICAgIE1BUFBJTkdPQkpFQ1REQVRBOgogICAgICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3REYXRhICgKICAgICAgICAgICAgICAgIEB7ICRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9LT57TWFwcGluZ09iamVjdERhdGF9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgYWRkIGEgbmV3IG1hcHBpbmcgcm93CiAgICAgICAgICAgICAgICBteSAkTWFwcGluZ0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5NYXBwaW5nQWRkKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fQogICAgICAgICAgICAgICAgICAgICAgICAtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gJE1hcHBpbmdPYmplY3REYXRhLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gMTsKCn0KCjE7