Ozs7IHBvLWNvbXBhdC5lbCAtLS0gYmFzaWMgc3VwcG9ydCBvZiBQTyB0cmFuc2xhdGlvbiBmaWxlcyAtKi0gY29kaW5nOiBsYXRpbi0xOyAtKi0KCjs7IENvcHlyaWdodCAoQykgMTk5NS0yMDAyLCAyMDEwLCAyMDE2LCAyMDE5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKOzsgQXV0aG9yczogRnJhbudvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sCjs7ICAgICAgICAgIEdyZWcgTWNHYXJ5IDxna21AbWFnaWxsYS5jaWNobGlkLmNvbT4sCjs7ICAgICAgICAgIEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4KOzsgS2V5d29yZHM6IGkxOG4sIGZpbGVzCgo7OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgZ2V0dGV4dC4KCjs7IEdOVSBnZXR0ZXh0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKOzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQo7OyBhbnkgbGF0ZXIgdmVyc2lvbi4KCjs7IEdOVSBnZXR0ZXh0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCjs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCjs7IGFsb25nIHdpdGggR05VIEVtYWNzOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgc2VlCjs7IDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7OzsgQ29tbWVudGFyeToKCjs7IEVtYWNzIDIxLjIgYW5kIG5ld2VyIGFscmVhZHkgY29udGFpbiB0aGlzIGZpbGUsIHVuZGVyIHRoZSBuYW1lIHBvLmVsLAo7OyBhbmQgd2l0aG91dCBwb3J0YWJpbGl0eSBoYXNzbGVzLgoKOzsgVGhpcyBwYWNrYWdlIG1ha2VzIHN1cmUgdmlzaXRpbmcgUE8gZmlsZXMgZGVjb2RlcyB0aGVtIGNvcnJlY3RseSwKOzsgYWNjb3JkaW5nIHRvIHRoZSBDaGFyc2V0PSBoZWFkZXIgaW4gdGhlIFBPIGZpbGUuICBGb3IgbW9yZSBzdXBwb3J0Cjs7IGZvciBlZGl0aW5nIFBPIGZpbGVzLCBzZWUgcG8tbW9kZS5lbC4KCjs7OyBDb2RlOgoMCjs7OyBFbWFjcyBwb3J0YWJpbGl0eSBtYXR0ZXJzLgoKKGRlZmNvbnN0IHBvLWNvbnRlbnQtdHlwZS1jaGFyc2V0LWFsaXN0CiAgJyg7IE5vdGU6IEVtYWNzIDIxIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgZW5jb2RpbmdzLCB0aHVzIHRoZSBtaXNzaW5nIGVudHJpZXMuCiAgICAoIkFTQ0lJIiAuIHVuZGVjaWRlZCkKICAgICgiQU5TSV9YMy40LTE5NjgiIC4gdW5kZWNpZGVkKQogICAgKCJVUy1BU0NJSSIgLiB1bmRlY2lkZWQpCiAgICAoIklTTy04ODU5LTEiIC4gaXNvLTg4NTktMSkKICAgICgiSVNPXzg4NTktMSIgLiBpc28tODg1OS0xKQogICAgKCJJU08tODg1OS0yIiAuIGlzby04ODU5LTIpCiAgICAoIklTT184ODU5LTIiIC4gaXNvLTg4NTktMikKICAgICgiSVNPLTg4NTktMyIgLiBpc28tODg1OS0zKQogICAgKCJJU09fODg1OS0zIiAuIGlzby04ODU5LTMpCiAgICAoIklTTy04ODU5LTQiIC4gaXNvLTg4NTktNCkKICAgICgiSVNPXzg4NTktNCIgLiBpc28tODg1OS00KQogICAgKCJJU08tODg1OS01IiAuIGlzby04ODU5LTUpCiAgICAoIklTT184ODU5LTUiIC4gaXNvLTg4NTktNSkKICAgIDsoIklTTy04ODU5LTYiIC4gPz8pCiAgICA7KCJJU09fODg1OS02IiAuID8/KQogICAgKCJJU08tODg1OS03IiAuIGlzby04ODU5LTcpCiAgICAoIklTT184ODU5LTciIC4gaXNvLTg4NTktNykKICAgICgiSVNPLTg4NTktOCIgLiBpc28tODg1OS04KQogICAgKCJJU09fODg1OS04IiAuIGlzby04ODU5LTgpCiAgICAoIklTTy04ODU5LTkiIC4gaXNvLTg4NTktOSkKICAgICgiSVNPXzg4NTktOSIgLiBpc28tODg1OS05KQogICAgOygiSVNPLTg4NTktMTMiIC4gPz8pCiAgICA7KCJJU09fODg1OS0xMyIgLiA/PykKICAgIDsoIklTTy04ODU5LTE0IiAuID8/KQogICAgOygiSVNPXzg4NTktMTQiIC4gPz8pCiAgICAoIklTTy04ODU5LTE1IiAuIGlzby04ODU5LTE1KQogICAgKCJJU09fODg1OS0xNSIgLiBpc28tODg1OS0xNSkKICAgICgiS09JOC1SIiAuIGtvaTgtcikKICAgIDsoIktPSTgtVSIgLiA/PykKICAgIDsoIktPSTgtVCIgLiA/PykKICAgICgiQ1A0MzciIC4gY3A0MzcpCiAgICAoIkNQNzc1IiAuIGNwNzc1KQogICAgKCJDUDg1MCIgLiBjcDg1MCkKICAgICgiQ1A4NTIiIC4gY3A4NTIpCiAgICAoIkNQODU1IiAuIGNwODU1KQogICAgOygiQ1A4NTYiIC4gPz8pCiAgICAoIkNQODU3IiAuIGNwODU3KQogICAgKCJDUDg2MSIgLiBjcDg2MSkKICAgICgiQ1A4NjIiIC4gY3A4NjIpCiAgICAoIkNQODY0IiAuIGNwODY0KQogICAgKCJDUDg2NSIgLiBjcDg2NSkKICAgICgiQ1A4NjYiIC4gY3A4NjYpCiAgICAoIkNQODY5IiAuIGNwODY5KQogICAgOygiQ1A4NzQiIC4gPz8pCiAgICA7KCJDUDkyMiIgLiA/PykKICAgIDsoIkNQOTMyIiAuID8/KQogICAgOygiQ1A5NDMiIC4gPz8pCiAgICA7KCJDUDk0OSIgLiA/PykKICAgIDsoIkNQOTUwIiAuID8/KQogICAgOygiQ1AxMDQ2IiAuID8/KQogICAgOygiQ1AxMTI0IiAuID8/KQogICAgOygiQ1AxMTI5IiAuID8/KQogICAgKCJDUDEyNTAiIC4gY3AxMjUwKQogICAgKCJDUDEyNTEiIC4gY3AxMjUxKQogICAgKCJDUDEyNTIiIC4gaXNvLTg4NTktMSkgOyBhcHByb3hpbWF0aW9uCiAgICAoIkNQMTI1MyIgLiBjcDEyNTMpCiAgICAoIkNQMTI1NCIgLiBpc28tODg1OS05KSA7IGFwcHJveGltYXRpb24KICAgICgiQ1AxMjU1IiAuIGlzby04ODU5LTgpIDsgYXBwcm94aW1hdGlvbgogICAgOygiQ1AxMjU2IiAuID8/KQogICAgKCJDUDEyNTciIC4gY3AxMjU3KQogICAgKCJHQjIzMTIiIC4gY24tZ2ItMjMxMikgIDsgYWxzbyBuYW1lZCAnZ2IyMzEyJyBhbmQgJ2V1Yy1jbicKICAgICgiRVVDLUpQIiAuIGV1Yy1qcCkKICAgICgiRVVDLUtSIiAuIGV1Yy1rcikKICAgIDsoIkVVQy1UVyIgLiA/PykKICAgICgiQklHNSIgLiBiaWc1KQogICAgOygiQklHNS1IS1NDUyIgLiA/PykKICAgIDsoIkdCSyIgLiA/PykKICAgIDsoIkdCMTgwMzAiIC4gPz8pCiAgICAoIlNISUZUX0pJUyIgLiBzaGlmdF9qaXMpCiAgICA7KCJKT0hBQiIgLiA/PykKICAgICgiVElTLTYyMCIgLiB0aXMtNjIwKQogICAgKCJWSVNDSUkiIC4gdmlzY2lpKQogICAgOygiR0VPUkdJQU4tUFMiIC4gPz8pCiAgICAoIlVURi04IiAuIHV0Zi04KQogICAgKQogICJIb3cgdG8gY29udmVydCBhIEdOVSBsaWJjL2xpYmljb252IGNhbm9uaWNhbCBjaGFyc2V0IG5hbWUgYXMgc2VlbiBpbgpDb250ZW50LVR5cGUgaW50byBhIE11bGUgY29kaW5nIHN5c3RlbS4iKQoKKGRlZnVuIHBvLWZpbmQtY2hhcnNldCAoZmlsZW5hbWUpCiAgIlJldHVybiBQTyBmaWxlIGNoYXJzZXQgdmFsdWUuIgogIChpbnRlcmFjdGl2ZSkKICAobGV0ICgoY2hhcnNldC1yZWdleHAKICAgICAgICAgIl5cIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtbIFx0XSpjaGFyc2V0PVxcKC4qXFwpXFxcXG5cIiIpCiAgICAgICAgKHNob3J0LXJlYWQgbmlsKSkKICAgIDs7IFRyeSB0aGUgZmlyc3QgNDA5NiBieXRlcy4gIEluIGNhc2Ugd2UgY2Fubm90IGZpbmQgdGhlIGNoYXJzZXQgdmFsdWUKICAgIDs7IHdpdGhpbiB0aGUgZmlyc3QgNDA5NiBieXRlcyAodGhlIFBPIGZpbGUgbWlnaHQgc3RhcnQgd2l0aCBhIGxvbmcKICAgIDs7IGNvbW1lbnQpIHRyeSB0aGUgbmV4dCA0MDk2IGJ5dGVzIHJlcGVhdGVkbHkgdW50aWwgd2UnbGwga25vdyBmb3Igc3VyZQogICAgOzsgd2UndmUgY2hlY2tlZCB0aGUgZW1wdHkgaGVhZGVyIGVudHJ5IGVudGlyZWx5LgogICAgKHdoaWxlIChub3QgKG9yIHNob3J0LXJlYWQgKHJlLXNlYXJjaC1mb3J3YXJkICJebXNnaWQiIG5pbCB0KSkpCiAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCiAgICAgICAgKGxldCAoKHBhaXIgKGluc2VydC1maWxlLWNvbnRlbnRzLWxpdGVyYWxseSBmaWxlbmFtZSBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLSAocG9pbnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEtICgrIChwb2ludCkgNDA5NikpKSkpCiAgICAgICAgICAoc2V0cSBzaG9ydC1yZWFkICg8IChudGggMSBwYWlyKSA0MDk2KSkpKSkKICAgIChjb25kICgocmUtc2VhcmNoLWZvcndhcmQgY2hhcnNldC1yZWdleHAgbmlsIHQpIChtYXRjaC1zdHJpbmcgMSkpCiAgICAgICAgICAoc2hvcnQtcmVhZCBuaWwpCiAgICAgICAgICA7OyBXZSd2ZSBmb3VuZCB0aGUgZmlyc3QgbXNnaWQ7IG1heWJlLCBvbmx5IGEgcGFydCBvZiB0aGUgbXNnc3RyCiAgICAgICAgICA7OyB2YWx1ZSB3YXMgbG9hZGVkLiAgTG9hZCB0aGUgbmV4dCAxMDI0IGJ5dGVzOyBpZiBjaGFyc2V0IHN0aWxsCiAgICAgICAgICA7OyBpc24ndCBhdmFpbGFibGUsIGdpdmUgdXAuCiAgICAgICAgICAodCAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkKICAgICAgICAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzLWxpdGVyYWxseSBmaWxlbmFtZSBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS0gKHBvaW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS0gKCsgKHBvaW50KSAxMDI0KSkpKQogICAgICAgICAgICAgKGlmIChyZS1zZWFyY2gtZm9yd2FyZCBjaGFyc2V0LXJlZ2V4cCBuaWwgdCkKICAgICAgICAgICAgICAgICAobWF0Y2gtc3RyaW5nIDEpKSkpKSkKCjs7OyMjI2F1dG9sb2FkIChhdXRvbG9hZCAncG8tZmluZC1maWxlLWNvZGluZy1zeXN0ZW0gInBvLWNvbXBhdCIpCgooZGVmdW4gcG8tZmluZC1maWxlLWNvZGluZy1zeXN0ZW0tZ3V0cyAob3BlcmF0aW9uIGZpbGVuYW1lKQogICJcClJldHVybiBhIE11bGUgKERFQ09ESU5HIC4gRU5DT0RJTkcpIHBhaXIsIGFjY29yZGluZyB0byBQTyBmaWxlIGNoYXJzZXQuCkNhbGxlZCB0aHJvdWdoIGZpbGUtY29kaW5nLXN5c3RlbS1hbGlzdCwgYmVmb3JlIHRoZSBmaWxlIGlzIHZpc2l0ZWQgZm9yIHJlYWwuIgogIChhbmQgKGVxIG9wZXJhdGlvbiAnaW5zZXJ0LWZpbGUtY29udGVudHMpCiAgICAgICAoZmlsZS1leGlzdHMtcCBmaWxlbmFtZSkKICAgICAgIChwby13aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgKGxldCogKChjb2Rpbmctc3lzdGVtLWZvci1yZWFkICduby1jb252ZXJzaW9uKQogICAgICAgICAgICAgICAoY2hhcnNldCAob3IgKHBvLWZpbmQtY2hhcnNldCBmaWxlbmFtZSkgImFzY2lpIikpCiAgICAgICAgICAgICAgIChjaGFyc2V0LXVwcGVyICh1cGNhc2UgY2hhcnNldCkpCiAgICAgICAgICAgICAgIChjaGFyc2V0LWxvd2VyIChkb3duY2FzZSBjaGFyc2V0KSkKICAgICAgICAgICAgICAgKGNhbmRpZGF0ZQogICAgICAgICAgICAgICAgKGNkciAoYXNzb2MgY2hhcnNldC11cHBlciBwby1jb250ZW50LXR5cGUtY2hhcnNldC1hbGlzdCkpKQogICAgICAgICAgICAgICAodHJ5LXN5bWJvbCAob3IgY2FuZGlkYXRlIChpbnRlcm4tc29mdCBjaGFyc2V0LWxvd2VyKSkpCiAgICAgICAgICAgICAgICh0cnktc3RyaW5nCiAgICAgICAgICAgICAgICAoaWYgdHJ5LXN5bWJvbCAoc3ltYm9sLW5hbWUgdHJ5LXN5bWJvbCkgY2hhcnNldC1sb3dlcikpKQogICAgICAgICAgKGxpc3QgKGNvbmQgKChhbmQgdHJ5LXN5bWJvbCAoY29kaW5nLXN5c3RlbS1wIHRyeS1zeW1ib2wpKQogICAgICAgICAgICAgICAgICAgICAgIHRyeS1zeW1ib2wpCiAgICAgICAgICAgICAgICAgICAgICAoKGFuZCAobm90IChzdHJpbmctbGVzc3AgIjIzIiBlbWFjcy12ZXJzaW9uKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctbWF0Y2ggIlxcYGNwWzEtOV1bMC05XVswLTldP1xcJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5LXN0cmluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3NvYyAoc3Vic3RyaW5nIHRyeS1zdHJpbmcgMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3Atc3VwcG9ydGVkLWNvZGVwYWdlcykpKQogICAgICAgICAgICAgICAgICAgICAgIChjb2RlcGFnZS1zZXR1cCAoc3Vic3RyaW5nIHRyeS1zdHJpbmcgMikpCiAgICAgICAgICAgICAgICAgICAgICAgKGludGVybiB0cnktc3RyaW5nKSkKICAgICAgICAgICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAgICAgJ25vLWNvbnZlcnNpb24pKSkpKSkpCgooZGVmdW4gcG8tZmluZC1maWxlLWNvZGluZy1zeXN0ZW0gKGFyZy1saXN0KQogICJcClJldHVybiBhIE11bGUgKERFQ09ESU5HIC4gRU5DT0RJTkcpIHBhaXIsIGFjY29yZGluZyB0byBQTyBmaWxlIGNoYXJzZXQuCkNhbGxlZCB0aHJvdWdoIGZpbGUtY29kaW5nLXN5c3RlbS1hbGlzdCwgYmVmb3JlIHRoZSBmaWxlIGlzIHZpc2l0ZWQgZm9yIHJlYWwuIgogIChwby1maW5kLWZpbGUtY29kaW5nLXN5c3RlbS1ndXRzIChjYXIgYXJnLWxpc3QpIChjYXIgKGNkciBhcmctbGlzdCkpKSkKCihwcm92aWRlICdwby1jb21wYXQpCgo7OzsgVGVzdGluZyB0aGlzIGZpbGU6Cgo7OyBGb3IgZWFjaCBwb2ZpbGUgaW4gewo7OyAgIGNzLnBvICAgICAgICAgICA7IGdldHRleHQvcG8vY3MuZWwsIGNoYXJzZXQ9SVNPLTg4NTktMgo7OyAgIGNzLW1vZGlmaWVkLnBvICA7IGdldHRleHQvcG8vY3MuZWwsIGNoYXJzZXQ9SVNPXzg4NTktMgo7OyAgIGRlLnBvICAgICAgICAgICA7IGdldHRleHQvcG8vZGUuZWwsIGNoYXJzZXQ9VVRGLTgsIGlmICRlbWFjc2ltcGwgPSBlbWFjcwo7OyB9IGRvCjs7ICAgU3RhcnQgJGVtYWNzaW1wbAo7OyAgIE0teCBsb2FkLWZpbGUgIHBvLWNvbXBhdC5lbCBSRVQKOzsgICBDLXggQy1mICAkcG9maWxlIFJFVAo7OyAgIFZlcmlmeSBjaGFyc2V0IG1hcmtlciBpbiBzdGF0dXMgbGluZSAoJzInID0gSVNPLTg4NTktMiwgJ3UnID0gVVRGLTgpLgoKOzs7IHBvLWNvbXBhdC5lbCBlbmRzIGhlcmUK