xiaomianao666

插件名:global_图片批量下载器

Apr 29th, 2025
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_图片批量下载器@base64://Ly8gPT1Vc2VyU2NyaXB0PT0NCi8vIEBuYW1lICAgICAgICAgICAgICAg5Zu+54mH5om56YeP5LiL6L295ZmoDQovLyBAbmFtZTp6aC1DTiAgICAgICAgIOWbvueJh+aJuemHj+S4i+i9veWZqA0KLy8gQG5hbWU6emgtVFcgICAgICAgICDlnJbniYfmibnph4/kuIvovInlmagNCi8vIEBuYW1lc3BhY2UgICAgICAgICAgamFzb256aw0KLy8gQHZlcnNpb24gICAgICAgICAgICAxLjAuMw0KLy8gQGF1dGhvciAgICAgICAgICAgICBKYXNvblpLDQovLyBAZGVzY3JpcHRpb24gICAgICAgIOS4gOS4queugOWNleWlveeUqOeahOWbvueJh+aJuemHj+S4i+i9veW3peWFt++8jOW4ruWKqeS9oOW/q+mAn+S4i+i9vee9kemhteS4iueahOWbvueJh+OAguaUr+aMgeWbvueJh+mihOiniOOAgg0KLy8gQGRlc2NyaXB0aW9uOnpoLUNOICDkuIDkuKrnroDljZXlpb3nlKjnmoTlm77niYfmibnph4/kuIvovb3lt6XlhbfvvIzluK7liqnkvaDlv6vpgJ/kuIvovb3nvZHpobXkuIrnmoTlm77niYfjgILmlK/mjIHlm77niYfpooTop4jjgIINCi8vIEBkZXNjcmlwdGlvbjp6aC1UVyAg5LiA5YCL57Ch5Zau5aW955So55qE5ZyW54mH5om56YeP5LiL6LyJ5bel5YW377yM5bmr5Yqp5L2g5b+r6YCf5LiL6LyJ57ay6aCB5LiK55qE5ZyW54mH44CC5pSv5oyB5ZyW54mH6aCQ6Ka944CCDQovLyBAbGljZW5zZSAgICAgICAgICAgIE5vbmUNCi8vIEBpY29uICAgICAgICAgICAgICAgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJZ1ptbHNiRDBpYm05dVpTSWdjM1J5YjJ0bFBTSmpkWEp5Wlc1MFEyOXNiM0lpSUhOMGNtOXJaUzEzYVdSMGFEMGlNaUlnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUluSnZkVzVrSWo0S0lDQThjbVZqZENCNFBTSXpJaUI1UFNJeklpQjNhV1IwYUQwaU1UZ2lJR2hsYVdkb2REMGlNVGdpSUhKNFBTSXlJaUJ5ZVQwaU1pSStQQzl5WldOMFBnb2dJRHh3YjJ4NWJHbHVaU0J3YjJsdWRITTlJamdnTVRJZ01USWdNVFlnTVRZZ01USWlQand2Y0c5c2VXeHBibVUrQ2lBZ1BHeHBibVVnZURFOUlqRXlJaUI1TVQwaU9DSWdlREk5SWpFeUlpQjVNajBpTVRZaVBqd3ZiR2x1WlQ0S1BDOXpkbWMrQ2c9PQ0KLy8gQG1hdGNoICAgICAgICAgICAgICAqOi8vKi8qDQovLyBAcmVxdWlyZSAgICAgICAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vZmZsYXRlQDAuOC4yL3VtZC9pbmRleC5taW4uanMNCi8vIEBjb25uZWN0ICAgICAgICAgICAgbG9jYWxob3N0DQovLyBAY29ubmVjdCAgICAgICAgICAgIGxvY2FsaG9zdDozMDAxDQovLyBAY29ubmVjdCAgICAgICAgICAgIDEyNy4wLjAuMQ0KLy8gQGNvbm5lY3QgICAgICAgICAgICAxMjcuMC4wLjE6MzAwMQ0KLy8gQGNvbm5lY3QgICAgICAgICAgICBhcGkyLmphc29uemsuY29tDQovLyBAZ3JhbnQgICAgICAgICAgICAgIEdNX2FkZFN0eWxlDQovLyBAZ3JhbnQgICAgICAgICAgICAgIEdNX2Rvd25sb2FkDQovLyBAZ3JhbnQgICAgICAgICAgICAgIEdNX2luZm8NCi8vIEBncmFudCAgICAgICAgICAgICAgR01fb3BlbkluVGFiDQovLyBAZ3JhbnQgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0DQovLyBAbm9mcmFtZXMNCi8vID09L1VzZXJTY3JpcHQ9PQ0KDQooZnVuY3Rpb24gKGZmbGF0ZSkgew0KICAndXNlIHN0cmljdCc7DQoNCiAgdmFyIF9hOw0KICBjb25zdCBERVYgPSBmYWxzZTsNCiAgdmFyIGlzX2FycmF5ID0gQXJyYXkuaXNBcnJheTsNCiAgdmFyIGluZGV4X29mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7DQogIHZhciBhcnJheV9mcm9tID0gQXJyYXkuZnJvbTsNCiAgdmFyIGRlZmluZV9wcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsNCiAgdmFyIGdldF9kZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsNCiAgdmFyIGdldF9kZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KICB2YXIgb2JqZWN0X3Byb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7DQogIHZhciBhcnJheV9wcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7DQogIHZhciBnZXRfcHJvdG90eXBlX29mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mOw0KICB2YXIgaXNfZXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7DQogIGZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7DQogICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJzsNCiAgfQ0KICBjb25zdCBub29wID0gKCkgPT4ge307DQogIGZ1bmN0aW9uIHJ1bihmbikgew0KICAgIHJldHVybiBmbigpOw0KICB9DQogIGZ1bmN0aW9uIHJ1bl9hbGwoYXJyKSB7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsNCiAgICAgIGFycltpXSgpOw0KICAgIH0NCiAgfQ0KICBjb25zdCBERVJJVkVEID0gMSA8PCAxOw0KICBjb25zdCBFRkZFQ1QgPSAxIDw8IDI7DQogIGNvbnN0IFJFTkRFUl9FRkZFQ1QgPSAxIDw8IDM7DQogIGNvbnN0IEJMT0NLX0VGRkVDVCA9IDEgPDwgNDsNCiAgY29uc3QgQlJBTkNIX0VGRkVDVCA9IDEgPDwgNTsNCiAgY29uc3QgUk9PVF9FRkZFQ1QgPSAxIDw8IDY7DQogIGNvbnN0IEJPVU5EQVJZX0VGRkVDVCA9IDEgPDwgNzsNCiAgY29uc3QgVU5PV05FRCA9IDEgPDwgODsNCiAgY29uc3QgRElTQ09OTkVDVEVEID0gMSA8PCA5Ow0KICBjb25zdCBDTEVBTiA9IDEgPDwgMTA7DQogIGNvbnN0IERJUlRZID0gMSA8PCAxMTsNCiAgY29uc3QgTUFZQkVfRElSVFkgPSAxIDw8IDEyOw0KICBjb25zdCBJTkVSVCA9IDEgPDwgMTM7DQogIGNvbnN0IERFU1RST1lFRCA9IDEgPDwgMTQ7DQogIGNvbnN0IEVGRkVDVF9SQU4gPSAxIDw8IDE1Ow0KICBjb25zdCBFRkZFQ1RfVFJBTlNQQVJFTlQgPSAxIDw8IDE2Ow0KICBjb25zdCBMRUdBQ1lfREVSSVZFRF9QUk9QID0gMSA8PCAxNzsNCiAgY29uc3QgSEVBRF9FRkZFQ1QgPSAxIDw8IDE5Ow0KICBjb25zdCBFRkZFQ1RfSEFTX0RFUklWRUQgPSAxIDw8IDIwOw0KICBjb25zdCBFRkZFQ1RfSVNfVVBEQVRJTkcgPSAxIDw8IDIxOw0KICBjb25zdCBTVEFURV9TWU1CT0wgPSBTeW1ib2woJyRzdGF0ZScpOw0KICBjb25zdCBMT0FESU5HX0FUVFJfU1lNQk9MID0gU3ltYm9sKCcnKTsNCiAgZnVuY3Rpb24gZXF1YWxzKHZhbHVlKSB7DQogICAgcmV0dXJuIHZhbHVlID09PSB0aGlzLnY7DQogIH0NCiAgZnVuY3Rpb24gc2FmZV9ub3RfZXF1YWwoYSwgYikgew0KICAgIHJldHVybiBhICE9IGENCiAgICAgID8gYiA9PSBiDQogICAgICA6IGEgIT09IGIgfHwNCiAgICAgICAgICAoYSAhPT0gbnVsbCAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHx8DQogICAgICAgICAgdHlwZW9mIGEgPT09ICdmdW5jdGlvbic7DQogIH0NCiAgZnVuY3Rpb24gc2FmZV9lcXVhbHModmFsdWUpIHsNCiAgICByZXR1cm4gIXNhZmVfbm90X2VxdWFsKHZhbHVlLCB0aGlzLnYpOw0KICB9DQogIGZ1bmN0aW9uIGVmZmVjdF9pbl90ZWFyZG93bihydW5lKSB7DQogICAgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBodHRwczovL3N2ZWx0ZS5kZXYvZS9lZmZlY3RfaW5fdGVhcmRvd25gKTsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gZWZmZWN0X2luX3Vub3duZWRfZGVyaXZlZCgpIHsNCiAgICB7DQogICAgICB0aHJvdyBuZXcgRXJyb3IoYGh0dHBzOi8vc3ZlbHRlLmRldi9lL2VmZmVjdF9pbl91bm93bmVkX2Rlcml2ZWRgKTsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gZWZmZWN0X29ycGhhbihydW5lKSB7DQogICAgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBodHRwczovL3N2ZWx0ZS5kZXYvZS9lZmZlY3Rfb3JwaGFuYCk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIGVmZmVjdF91cGRhdGVfZGVwdGhfZXhjZWVkZWQoKSB7DQogICAgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBodHRwczovL3N2ZWx0ZS5kZXYvZS9lZmZlY3RfdXBkYXRlX2RlcHRoX2V4Y2VlZGVkYCk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHN0YXRlX2Rlc2NyaXB0b3JzX2ZpeGVkKCkgew0KICAgIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcihgaHR0cHM6Ly9zdmVsdGUuZGV2L2Uvc3RhdGVfZGVzY3JpcHRvcnNfZml4ZWRgKTsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gc3RhdGVfcHJvdG90eXBlX2ZpeGVkKCkgew0KICAgIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcihgaHR0cHM6Ly9zdmVsdGUuZGV2L2Uvc3RhdGVfcHJvdG90eXBlX2ZpeGVkYCk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHN0YXRlX3Vuc2FmZV9tdXRhdGlvbigpIHsNCiAgICB7DQogICAgICB0aHJvdyBuZXcgRXJyb3IoYGh0dHBzOi8vc3ZlbHRlLmRldi9lL3N0YXRlX3Vuc2FmZV9tdXRhdGlvbmApOw0KICAgIH0NCiAgfQ0KICBsZXQgbGVnYWN5X21vZGVfZmxhZyA9IGZhbHNlOw0KICBsZXQgdHJhY2luZ19tb2RlX2ZsYWcgPSBmYWxzZTsNCiAgZnVuY3Rpb24gZW5hYmxlX2xlZ2FjeV9tb2RlX2ZsYWcoKSB7DQogICAgbGVnYWN5X21vZGVfZmxhZyA9IHRydWU7DQogIH0NCiAgY29uc3QgRUFDSF9JVEVNX1JFQUNUSVZFID0gMTsNCiAgY29uc3QgRUFDSF9JTkRFWF9SRUFDVElWRSA9IDEgPDwgMTsNCiAgY29uc3QgRUFDSF9JVEVNX0lNTVVUQUJMRSA9IDEgPDwgNDsNCiAgY29uc3QgVFJBTlNJVElPTl9HTE9CQUwgPSAxIDw8IDI7DQogIGNvbnN0IFRFTVBMQVRFX0ZSQUdNRU5UID0gMTsNCiAgY29uc3QgVEVNUExBVEVfVVNFX0lNUE9SVF9OT0RFID0gMSA8PCAxOw0KICBjb25zdCBVTklOSVRJQUxJWkVEID0gU3ltYm9sKCk7DQogIGNvbnN0IE5BTUVTUEFDRV9IVE1MID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnOw0KICBmdW5jdGlvbiBsaWZlY3ljbGVfb3V0c2lkZV9jb21wb25lbnQobmFtZSkgew0KICAgIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcihgaHR0cHM6Ly9zdmVsdGUuZGV2L2UvbGlmZWN5Y2xlX291dHNpZGVfY29tcG9uZW50YCk7DQogICAgfQ0KICB9DQogIGxldCBjb21wb25lbnRfY29udGV4dCA9IG51bGw7DQogIGZ1bmN0aW9uIHNldF9jb21wb25lbnRfY29udGV4dChjb250ZXh0KSB7DQogICAgY29tcG9uZW50X2NvbnRleHQgPSBjb250ZXh0Ow0KICB9DQogIGZ1bmN0aW9uIHB1c2gocHJvcHMsIHJ1bmVzID0gZmFsc2UsIGZuKSB7DQogICAgdmFyIGN0eCA9IChjb21wb25lbnRfY29udGV4dCA9IHsNCiAgICAgIHA6IGNvbXBvbmVudF9jb250ZXh0LA0KICAgICAgYzogbnVsbCwNCiAgICAgIGQ6IGZhbHNlLA0KICAgICAgZTogbnVsbCwNCiAgICAgIG06IGZhbHNlLA0KICAgICAgczogcHJvcHMsDQogICAgICB4OiBudWxsLA0KICAgICAgbDogbnVsbCwNCiAgICB9KTsNCiAgICBpZiAobGVnYWN5X21vZGVfZmxhZyAmJiAhcnVuZXMpIHsNCiAgICAgIGNvbXBvbmVudF9jb250ZXh0LmwgPSB7DQogICAgICAgIHM6IG51bGwsDQogICAgICAgIHU6IG51bGwsDQogICAgICAgIHIxOiBbXSwNCiAgICAgICAgcjI6IHNvdXJjZShmYWxzZSksDQogICAgICB9Ow0KICAgIH0NCiAgICB0ZWFyZG93bigoKSA9PiB7DQogICAgICBjdHguZCA9IHRydWU7DQogICAgfSk7DQogIH0NCiAgZnVuY3Rpb24gcG9wKGNvbXBvbmVudCkgew0KICAgIGNvbnN0IGNvbnRleHRfc3RhY2tfaXRlbSA9IGNvbXBvbmVudF9jb250ZXh0Ow0KICAgIGlmIChjb250ZXh0X3N0YWNrX2l0ZW0gIT09IG51bGwpIHsNCiAgICAgIGNvbnN0IGNvbXBvbmVudF9lZmZlY3RzID0gY29udGV4dF9zdGFja19pdGVtLmU7DQogICAgICBpZiAoY29tcG9uZW50X2VmZmVjdHMgIT09IG51bGwpIHsNCiAgICAgICAgdmFyIHByZXZpb3VzX2VmZmVjdCA9IGFjdGl2ZV9lZmZlY3Q7DQogICAgICAgIHZhciBwcmV2aW91c19yZWFjdGlvbiA9IGFjdGl2ZV9yZWFjdGlvbjsNCiAgICAgICAgY29udGV4dF9zdGFja19pdGVtLmUgPSBudWxsOw0KICAgICAgICB0cnkgew0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50X2VmZmVjdHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjb21wb25lbnRfZWZmZWN0ID0gY29tcG9uZW50X2VmZmVjdHNbaV07DQogICAgICAgICAgICBzZXRfYWN0aXZlX2VmZmVjdChjb21wb25lbnRfZWZmZWN0LmVmZmVjdCk7DQogICAgICAgICAgICBzZXRfYWN0aXZlX3JlYWN0aW9uKGNvbXBvbmVudF9lZmZlY3QucmVhY3Rpb24pOw0KICAgICAgICAgICAgZWZmZWN0KGNvbXBvbmVudF9lZmZlY3QuZm4pOw0KICAgICAgICAgIH0NCiAgICAgICAgfSBmaW5hbGx5IHsNCiAgICAgICAgICBzZXRfYWN0aXZlX2VmZmVjdChwcmV2aW91c19lZmZlY3QpOw0KICAgICAgICAgIHNldF9hY3RpdmVfcmVhY3Rpb24ocHJldmlvdXNfcmVhY3Rpb24pOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBjb21wb25lbnRfY29udGV4dCA9IGNvbnRleHRfc3RhY2tfaXRlbS5wOw0KICAgICAgY29udGV4dF9zdGFja19pdGVtLm0gPSB0cnVlOw0KICAgIH0NCiAgICByZXR1cm4gKA0KICAgICAgLyoqIEB0eXBlIHtUfSAqLw0KICAgICAge30NCiAgICApOw0KICB9DQogIGZ1bmN0aW9uIGlzX3J1bmVzKCkgew0KICAgIHJldHVybiAoDQogICAgICAhbGVnYWN5X21vZGVfZmxhZyB8fA0KICAgICAgKGNvbXBvbmVudF9jb250ZXh0ICE9PSBudWxsICYmIGNvbXBvbmVudF9jb250ZXh0LmwgPT09IG51bGwpDQogICAgKTsNCiAgfQ0KICBmdW5jdGlvbiBwcm94eSh2YWx1ZSkgew0KICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsIHx8IFNUQVRFX1NZTUJPTCBpbiB2YWx1ZSkgew0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIH0NCiAgICBjb25zdCBwcm90b3R5cGUgPSBnZXRfcHJvdG90eXBlX29mKHZhbHVlKTsNCiAgICBpZiAocHJvdG90eXBlICE9PSBvYmplY3RfcHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gYXJyYXlfcHJvdG90eXBlKSB7DQogICAgICByZXR1cm4gdmFsdWU7DQogICAgfQ0KICAgIHZhciBzb3VyY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsNCiAgICB2YXIgaXNfcHJveGllZF9hcnJheSA9IGlzX2FycmF5KHZhbHVlKTsNCiAgICB2YXIgdmVyc2lvbiA9IC8qIEBfX1BVUkVfXyAqLyBzdGF0ZSgwKTsNCiAgICB2YXIgcmVhY3Rpb24gPSBhY3RpdmVfcmVhY3Rpb247DQogICAgdmFyIHdpdGhfcGFyZW50ID0gKGZuKSA9PiB7DQogICAgICB2YXIgcHJldmlvdXNfcmVhY3Rpb24gPSBhY3RpdmVfcmVhY3Rpb247DQogICAgICBzZXRfYWN0aXZlX3JlYWN0aW9uKHJlYWN0aW9uKTsNCiAgICAgIHZhciByZXN1bHQgPSBmbigpOw0KICAgICAgc2V0X2FjdGl2ZV9yZWFjdGlvbihwcmV2aW91c19yZWFjdGlvbik7DQogICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH07DQogICAgaWYgKGlzX3Byb3hpZWRfYXJyYXkpIHsNCiAgICAgIHNvdXJjZXMuc2V0KA0KICAgICAgICAnbGVuZ3RoJywNCiAgICAgICAgLyogQF9fUFVSRV9fICovIHN0YXRlKA0KICAgICAgICAgIC8qKiBAdHlwZSB7YW55W119ICovDQogICAgICAgICAgdmFsdWUubGVuZ3RoLA0KICAgICAgICApLA0KICAgICAgKTsNCiAgICB9DQogICAgcmV0dXJuIG5ldyBQcm94eSgNCiAgICAgIC8qKiBAdHlwZSB7YW55fSAqLw0KICAgICAgdmFsdWUsDQogICAgICB7DQogICAgICAgIGRlZmluZVByb3BlcnR5KF8sIHByb3AsIGRlc2NyaXB0b3IpIHsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICAhKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgfHwNCiAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID09PSBmYWxzZSB8fA0KICAgICAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID09PSBmYWxzZSB8fA0KICAgICAgICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9PT0gZmFsc2UNCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIHN0YXRlX2Rlc2NyaXB0b3JzX2ZpeGVkKCk7DQogICAgICAgICAgfQ0KICAgICAgICAgIHZhciBzID0gc291cmNlcy5nZXQocHJvcCk7DQogICAgICAgICAgaWYgKHMgPT09IHZvaWQgMCkgew0KICAgICAgICAgICAgcyA9IHdpdGhfcGFyZW50KCgpID0+IC8qIEBfX1BVUkVfXyAqLyBzdGF0ZShkZXNjcmlwdG9yLnZhbHVlKSk7DQogICAgICAgICAgICBzb3VyY2VzLnNldChwcm9wLCBzKTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc2V0KA0KICAgICAgICAgICAgICBzLA0KICAgICAgICAgICAgICB3aXRoX3BhcmVudCgoKSA9PiBwcm94eShkZXNjcmlwdG9yLnZhbHVlKSksDQogICAgICAgICAgICApOw0KICAgICAgICAgIH0NCiAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfSwNCiAgICAgICAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wKSB7DQogICAgICAgICAgdmFyIHMgPSBzb3VyY2VzLmdldChwcm9wKTsNCiAgICAgICAgICBpZiAocyA9PT0gdm9pZCAwKSB7DQogICAgICAgICAgICBpZiAocHJvcCBpbiB0YXJnZXQpIHsNCiAgICAgICAgICAgICAgc291cmNlcy5zZXQoDQogICAgICAgICAgICAgICAgcHJvcCwNCiAgICAgICAgICAgICAgICB3aXRoX3BhcmVudCgoKSA9PiAvKiBAX19QVVJFX18gKi8gc3RhdGUoVU5JTklUSUFMSVpFRCkpLA0KICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoaXNfcHJveGllZF9hcnJheSAmJiB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgdmFyIGxzID0NCiAgICAgICAgICAgICAgICAvKiogQHR5cGUge1NvdXJjZTxudW1iZXI+fSAqLw0KICAgICAgICAgICAgICAgIHNvdXJjZXMuZ2V0KCdsZW5ndGgnKTsNCiAgICAgICAgICAgICAgdmFyIG4gPSBOdW1iZXIocHJvcCk7DQogICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIG4gPCBscy52KSB7DQogICAgICAgICAgICAgICAgc2V0KGxzLCBuKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0KHMsIFVOSU5JVElBTElaRUQpOw0KICAgICAgICAgICAgdXBkYXRlX3ZlcnNpb24odmVyc2lvbik7DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9LA0KICAgICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgew0KICAgICAgICAgIHZhciBfYTI7DQogICAgICAgICAgaWYgKHByb3AgPT09IFNUQVRFX1NZTUJPTCkgew0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgICAgICAgIH0NCiAgICAgICAgICB2YXIgcyA9IHNvdXJjZXMuZ2V0KHByb3ApOw0KICAgICAgICAgIHZhciBleGlzdHMgPSBwcm9wIGluIHRhcmdldDsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICBzID09PSB2b2lkIDAgJiYNCiAgICAgICAgICAgICghZXhpc3RzIHx8DQogICAgICAgICAgICAgICgoX2EyID0gZ2V0X2Rlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKSkgPT0gbnVsbA0KICAgICAgICAgICAgICAgID8gdm9pZCAwDQogICAgICAgICAgICAgICAgOiBfYTIud3JpdGFibGUpKQ0KICAgICAgICAgICkgew0KICAgICAgICAgICAgcyA9IHdpdGhfcGFyZW50KCgpID0+DQogICAgICAgICAgICAgIC8qIEBfX1BVUkVfXyAqLyBzdGF0ZSgNCiAgICAgICAgICAgICAgICBwcm94eShleGlzdHMgPyB0YXJnZXRbcHJvcF0gOiBVTklOSVRJQUxJWkVEKSwNCiAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICk7DQogICAgICAgICAgICBzb3VyY2VzLnNldChwcm9wLCBzKTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHMgIT09IHZvaWQgMCkgew0KICAgICAgICAgICAgdmFyIHYgPSBnZXQocyk7DQogICAgICAgICAgICByZXR1cm4gdiA9PT0gVU5JTklUSUFMSVpFRCA/IHZvaWQgMCA6IHY7DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTsNCiAgICAgICAgfSwNCiAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCkgew0KICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKTsNCiAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiAndmFsdWUnIGluIGRlc2NyaXB0b3IpIHsNCiAgICAgICAgICAgIHZhciBzID0gc291cmNlcy5nZXQocHJvcCk7DQogICAgICAgICAgICBpZiAocykgZGVzY3JpcHRvci52YWx1ZSA9IGdldChzKTsNCiAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IgPT09IHZvaWQgMCkgew0KICAgICAgICAgICAgdmFyIHNvdXJjZTIgPSBzb3VyY2VzLmdldChwcm9wKTsNCiAgICAgICAgICAgIHZhciB2YWx1ZTIgPSBzb3VyY2UyID09IG51bGwgPyB2b2lkIDAgOiBzb3VyY2UyLnY7DQogICAgICAgICAgICBpZiAoc291cmNlMiAhPT0gdm9pZCAwICYmIHZhbHVlMiAhPT0gVU5JTklUSUFMSVpFRCkgew0KICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsDQogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLA0KICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZTIsDQogICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsDQogICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICB9LA0KICAgICAgICBoYXModGFyZ2V0LCBwcm9wKSB7DQogICAgICAgICAgdmFyIF9hMjsNCiAgICAgICAgICBpZiAocHJvcCA9PT0gU1RBVEVfU1lNQk9MKSB7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgdmFyIHMgPSBzb3VyY2VzLmdldChwcm9wKTsNCiAgICAgICAgICB2YXIgaGFzID0NCiAgICAgICAgICAgIChzICE9PSB2b2lkIDAgJiYgcy52ICE9PSBVTklOSVRJQUxJWkVEKSB8fA0KICAgICAgICAgICAgUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKTsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICBzICE9PSB2b2lkIDAgfHwNCiAgICAgICAgICAgIChhY3RpdmVfZWZmZWN0ICE9PSBudWxsICYmDQogICAgICAgICAgICAgICghaGFzIHx8DQogICAgICAgICAgICAgICAgKChfYTIgPSBnZXRfZGVzY3JpcHRvcih0YXJnZXQsIHByb3ApKSA9PSBudWxsDQogICAgICAgICAgICAgICAgICA/IHZvaWQgMA0KICAgICAgICAgICAgICAgICAgOiBfYTIud3JpdGFibGUpKSkNCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIGlmIChzID09PSB2b2lkIDApIHsNCiAgICAgICAgICAgICAgcyA9IHdpdGhfcGFyZW50KCgpID0+DQogICAgICAgICAgICAgICAgLyogQF9fUFVSRV9fICovIHN0YXRlKA0KICAgICAgICAgICAgICAgICAgaGFzID8gcHJveHkodGFyZ2V0W3Byb3BdKSA6IFVOSU5JVElBTElaRUQsDQogICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgc291cmNlcy5zZXQocHJvcCwgcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgdmFsdWUyID0gZ2V0KHMpOw0KICAgICAgICAgICAgaWYgKHZhbHVlMiA9PT0gVU5JTklUSUFMSVpFRCkgew0KICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiBoYXM7DQogICAgICAgIH0sDQogICAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlMiwgcmVjZWl2ZXIpIHsNCiAgICAgICAgICB2YXIgX2EyOw0KICAgICAgICAgIHZhciBzID0gc291cmNlcy5nZXQocHJvcCk7DQogICAgICAgICAgdmFyIGhhcyA9IHByb3AgaW4gdGFyZ2V0Ow0KICAgICAgICAgIGlmIChpc19wcm94aWVkX2FycmF5ICYmIHByb3AgPT09ICdsZW5ndGgnKSB7DQogICAgICAgICAgICBmb3IgKA0KICAgICAgICAgICAgICB2YXIgaSA9IHZhbHVlMjsNCiAgICAgICAgICAgICAgaSA8IC8qKiBAdHlwZSB7U291cmNlPG51bWJlcj59ICovIHMudjsNCiAgICAgICAgICAgICAgaSArPSAxDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgdmFyIG90aGVyX3MgPSBzb3VyY2VzLmdldChpICsgJycpOw0KICAgICAgICAgICAgICBpZiAob3RoZXJfcyAhPT0gdm9pZCAwKSB7DQogICAgICAgICAgICAgICAgc2V0KG90aGVyX3MsIFVOSU5JVElBTElaRUQpOw0KICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgaW4gdGFyZ2V0KSB7DQogICAgICAgICAgICAgICAgb3RoZXJfcyA9IHdpdGhfcGFyZW50KCgpID0+DQogICAgICAgICAgICAgICAgICAvKiBAX19QVVJFX18gKi8gc3RhdGUoVU5JTklUSUFMSVpFRCksDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBzb3VyY2VzLnNldChpICsgJycsIG90aGVyX3MpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmIChzID09PSB2b2lkIDApIHsNCiAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgIWhhcyB8fA0KICAgICAgICAgICAgICAoKF9hMiA9IGdldF9kZXNjcmlwdG9yKHRhcmdldCwgcHJvcCkpID09IG51bGwNCiAgICAgICAgICAgICAgICA/IHZvaWQgMA0KICAgICAgICAgICAgICAgIDogX2EyLndyaXRhYmxlKQ0KICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgIHMgPSB3aXRoX3BhcmVudCgoKSA9PiAvKiBAX19QVVJFX18gKi8gc3RhdGUodm9pZCAwKSk7DQogICAgICAgICAgICAgIHNldCgNCiAgICAgICAgICAgICAgICBzLA0KICAgICAgICAgICAgICAgIHdpdGhfcGFyZW50KCgpID0+IHByb3h5KHZhbHVlMikpLA0KICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICBzb3VyY2VzLnNldChwcm9wLCBzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaGFzID0gcy52ICE9PSBVTklOSVRJQUxJWkVEOw0KICAgICAgICAgICAgc2V0KA0KICAgICAgICAgICAgICBzLA0KICAgICAgICAgICAgICB3aXRoX3BhcmVudCgoKSA9PiBwcm94eSh2YWx1ZTIpKSwNCiAgICAgICAgICAgICk7DQogICAgICAgICAgfQ0KICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKTsNCiAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsID8gdm9pZCAwIDogZGVzY3JpcHRvci5zZXQpIHsNCiAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlMik7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICghaGFzKSB7DQogICAgICAgICAgICBpZiAoaXNfcHJveGllZF9hcnJheSAmJiB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgdmFyIGxzID0NCiAgICAgICAgICAgICAgICAvKiogQHR5cGUge1NvdXJjZTxudW1iZXI+fSAqLw0KICAgICAgICAgICAgICAgIHNvdXJjZXMuZ2V0KCdsZW5ndGgnKTsNCiAgICAgICAgICAgICAgdmFyIG4gPSBOdW1iZXIocHJvcCk7DQogICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIG4gPj0gbHMudikgew0KICAgICAgICAgICAgICAgIHNldChscywgbiArIDEpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB1cGRhdGVfdmVyc2lvbih2ZXJzaW9uKTsNCiAgICAgICAgICB9DQogICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0sDQogICAgICAgIG93bktleXModGFyZ2V0KSB7DQogICAgICAgICAgZ2V0KHZlcnNpb24pOw0KICAgICAgICAgIHZhciBvd25fa2V5cyA9IFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpLmZpbHRlcigoa2V5MikgPT4gew0KICAgICAgICAgICAgdmFyIHNvdXJjZTMgPSBzb3VyY2VzLmdldChrZXkyKTsNCiAgICAgICAgICAgIHJldHVybiBzb3VyY2UzID09PSB2b2lkIDAgfHwgc291cmNlMy52ICE9PSBVTklOSVRJQUxJWkVEOw0KICAgICAgICAgIH0pOw0KICAgICAgICAgIGZvciAodmFyIFtrZXksIHNvdXJjZTJdIG9mIHNvdXJjZXMpIHsNCiAgICAgICAgICAgIGlmIChzb3VyY2UyLnYgIT09IFVOSU5JVElBTElaRUQgJiYgIShrZXkgaW4gdGFyZ2V0KSkgew0KICAgICAgICAgICAgICBvd25fa2V5cy5wdXNoKGtleSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiBvd25fa2V5czsNCiAgICAgICAgfSwNCiAgICAgICAgc2V0UHJvdG90eXBlT2YoKSB7DQogICAgICAgICAgc3RhdGVfcHJvdG90eXBlX2ZpeGVkKCk7DQogICAgICAgIH0sDQogICAgICB9LA0KICAgICk7DQogIH0NCiAgZnVuY3Rpb24gdXBkYXRlX3ZlcnNpb24oc2lnbmFsLCBkID0gMSkgew0KICAgIHNldChzaWduYWwsIHNpZ25hbC52ICsgZCk7DQogIH0NCiAgLy8gQF9fTk9fU0lERV9FRkZFQ1RTX18NCiAgZnVuY3Rpb24gZGVyaXZlZChmbikgew0KICAgIHZhciBmbGFncyA9IERFUklWRUQgfCBESVJUWTsNCiAgICB2YXIgcGFyZW50X2Rlcml2ZWQgPQ0KICAgICAgYWN0aXZlX3JlYWN0aW9uICE9PSBudWxsICYmIChhY3RpdmVfcmVhY3Rpb24uZiAmIERFUklWRUQpICE9PSAwDQogICAgICAgID8gLyoqIEB0eXBlIHtEZXJpdmVkfSAqLw0KICAgICAgICAgIGFjdGl2ZV9yZWFjdGlvbg0KICAgICAgICA6IG51bGw7DQogICAgaWYgKA0KICAgICAgYWN0aXZlX2VmZmVjdCA9PT0gbnVsbCB8fA0KICAgICAgKHBhcmVudF9kZXJpdmVkICE9PSBudWxsICYmIChwYXJlbnRfZGVyaXZlZC5mICYgVU5PV05FRCkgIT09IDApDQogICAgKSB7DQogICAgICBmbGFncyB8PSBVTk9XTkVEOw0KICAgIH0gZWxzZSB7DQogICAgICBhY3RpdmVfZWZmZWN0LmYgfD0gRUZGRUNUX0hBU19ERVJJVkVEOw0KICAgIH0NCiAgICBjb25zdCBzaWduYWwgPSB7DQogICAgICBjdHg6IGNvbXBvbmVudF9jb250ZXh0LA0KICAgICAgZGVwczogbnVsbCwNCiAgICAgIGVmZmVjdHM6IG51bGwsDQogICAgICBlcXVhbHMsDQogICAgICBmOiBmbGFncywNCiAgICAgIGZuLA0KICAgICAgcmVhY3Rpb25zOiBudWxsLA0KICAgICAgcnY6IDAsDQogICAgICB2Og0KICAgICAgICAvKiogQHR5cGUge1Z9ICovDQogICAgICAgIG51bGwsDQogICAgICB3djogMCwNCiAgICAgIHBhcmVudDogcGFyZW50X2Rlcml2ZWQgPz8gYWN0aXZlX2VmZmVjdCwNCiAgICB9Ow0KICAgIHJldHVybiBzaWduYWw7DQogIH0NCiAgLy8gQF9fTk9fU0lERV9FRkZFQ1RTX18NCiAgZnVuY3Rpb24gZGVyaXZlZF9zYWZlX2VxdWFsKGZuKSB7DQogICAgY29uc3Qgc2lnbmFsID0gLyogQF9fUFVSRV9fICovIGRlcml2ZWQoZm4pOw0KICAgIHNpZ25hbC5lcXVhbHMgPSBzYWZlX2VxdWFsczsNCiAgICByZXR1cm4gc2lnbmFsOw0KICB9DQogIGZ1bmN0aW9uIGRlc3Ryb3lfZGVyaXZlZF9lZmZlY3RzKGRlcml2ZWQyKSB7DQogICAgdmFyIGVmZmVjdHMgPSBkZXJpdmVkMi5lZmZlY3RzOw0KICAgIGlmIChlZmZlY3RzICE9PSBudWxsKSB7DQogICAgICBkZXJpdmVkMi5lZmZlY3RzID0gbnVsbDsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkgKz0gMSkgew0KICAgICAgICBkZXN0cm95X2VmZmVjdCgNCiAgICAgICAgICAvKiogQHR5cGUge0VmZmVjdH0gKi8NCiAgICAgICAgICBlZmZlY3RzW2ldLA0KICAgICAgICApOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBnZXRfZGVyaXZlZF9wYXJlbnRfZWZmZWN0KGRlcml2ZWQyKSB7DQogICAgdmFyIHBhcmVudCA9IGRlcml2ZWQyLnBhcmVudDsNCiAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7DQogICAgICBpZiAoKHBhcmVudC5mICYgREVSSVZFRCkgPT09IDApIHsNCiAgICAgICAgcmV0dXJuICgNCiAgICAgICAgICAvKiogQHR5cGUge0VmZmVjdH0gKi8NCiAgICAgICAgICBwYXJlbnQNCiAgICAgICAgKTsNCiAgICAgIH0NCiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7DQogICAgfQ0KICAgIHJldHVybiBudWxsOw0KICB9DQogIGZ1bmN0aW9uIGV4ZWN1dGVfZGVyaXZlZChkZXJpdmVkMikgew0KICAgIHZhciB2YWx1ZTsNCiAgICB2YXIgcHJldl9hY3RpdmVfZWZmZWN0ID0gYWN0aXZlX2VmZmVjdDsNCiAgICBzZXRfYWN0aXZlX2VmZmVjdChnZXRfZGVyaXZlZF9wYXJlbnRfZWZmZWN0KGRlcml2ZWQyKSk7DQogICAgew0KICAgICAgdHJ5IHsNCiAgICAgICAgZGVzdHJveV9kZXJpdmVkX2VmZmVjdHMoZGVyaXZlZDIpOw0KICAgICAgICB2YWx1ZSA9IHVwZGF0ZV9yZWFjdGlvbihkZXJpdmVkMik7DQogICAgICB9IGZpbmFsbHkgew0KICAgICAgICBzZXRfYWN0aXZlX2VmZmVjdChwcmV2X2FjdGl2ZV9lZmZlY3QpOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gdmFsdWU7DQogIH0NCiAgZnVuY3Rpb24gdXBkYXRlX2Rlcml2ZWQoZGVyaXZlZDIpIHsNCiAgICB2YXIgdmFsdWUgPSBleGVjdXRlX2Rlcml2ZWQoZGVyaXZlZDIpOw0KICAgIHZhciBzdGF0dXMgPQ0KICAgICAgKHNraXBfcmVhY3Rpb24gfHwgKGRlcml2ZWQyLmYgJiBVTk9XTkVEKSAhPT0gMCkgJiYgZGVyaXZlZDIuZGVwcyAhPT0gbnVsbA0KICAgICAgICA/IE1BWUJFX0RJUlRZDQogICAgICAgIDogQ0xFQU47DQogICAgc2V0X3NpZ25hbF9zdGF0dXMoZGVyaXZlZDIsIHN0YXR1cyk7DQogICAgaWYgKCFkZXJpdmVkMi5lcXVhbHModmFsdWUpKSB7DQogICAgICBkZXJpdmVkMi52ID0gdmFsdWU7DQogICAgICBkZXJpdmVkMi53diA9IGluY3JlbWVudF93cml0ZV92ZXJzaW9uKCk7DQogICAgfQ0KICB9DQogIGNvbnN0IG9sZF92YWx1ZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOw0KICBmdW5jdGlvbiBzb3VyY2Uodiwgc3RhY2spIHsNCiAgICB2YXIgc2lnbmFsID0gew0KICAgICAgZjogMCwNCiAgICAgIC8vIFRPRE8gaWRlYWxseSB3ZSBjb3VsZCBza2lwIHRoaXMgYWx0b2dldGhlciwgYnV0IGl0IGNhdXNlcyB0eXBlIGVycm9ycw0KICAgICAgdiwNCiAgICAgIHJlYWN0aW9uczogbnVsbCwNCiAgICAgIGVxdWFscywNCiAgICAgIHJ2OiAwLA0KICAgICAgd3Y6IDAsDQogICAgfTsNCiAgICByZXR1cm4gc2lnbmFsOw0KICB9DQogIC8vIEBfX05PX1NJREVfRUZGRUNUU19fDQogIGZ1bmN0aW9uIHN0YXRlKHYsIHN0YWNrKSB7DQogICAgY29uc3QgcyA9IHNvdXJjZSh2KTsNCiAgICBwdXNoX3JlYWN0aW9uX3ZhbHVlKHMpOw0KICAgIHJldHVybiBzOw0KICB9DQogIC8vIEBfX05PX1NJREVfRUZGRUNUU19fDQogIGZ1bmN0aW9uIG11dGFibGVfc291cmNlKGluaXRpYWxfdmFsdWUsIGltbXV0YWJsZSA9IGZhbHNlKSB7DQogICAgdmFyIF9hMjsNCiAgICBjb25zdCBzID0gc291cmNlKGluaXRpYWxfdmFsdWUpOw0KICAgIGlmICghaW1tdXRhYmxlKSB7DQogICAgICBzLmVxdWFscyA9IHNhZmVfZXF1YWxzOw0KICAgIH0NCiAgICBpZiAoDQogICAgICBsZWdhY3lfbW9kZV9mbGFnICYmDQogICAgICBjb21wb25lbnRfY29udGV4dCAhPT0gbnVsbCAmJg0KICAgICAgY29tcG9uZW50X2NvbnRleHQubCAhPT0gbnVsbA0KICAgICkgew0KICAgICAgKChfYTIgPSBjb21wb25lbnRfY29udGV4dC5sKS5zID8/IChfYTIucyA9IFtdKSkucHVzaChzKTsNCiAgICB9DQogICAgcmV0dXJuIHM7DQogIH0NCiAgZnVuY3Rpb24gbXV0YXRlKHNvdXJjZTIsIHZhbHVlKSB7DQogICAgc2V0KA0KICAgICAgc291cmNlMiwNCiAgICAgIHVudHJhY2soKCkgPT4gZ2V0KHNvdXJjZTIpKSwNCiAgICApOw0KICAgIHJldHVybiB2YWx1ZTsNCiAgfQ0KICBmdW5jdGlvbiBzZXQoc291cmNlMiwgdmFsdWUsIHNob3VsZF9wcm94eSA9IGZhbHNlKSB7DQogICAgaWYgKA0KICAgICAgYWN0aXZlX3JlYWN0aW9uICE9PSBudWxsICYmDQogICAgICAhdW50cmFja2luZyAmJg0KICAgICAgaXNfcnVuZXMoKSAmJg0KICAgICAgKGFjdGl2ZV9yZWFjdGlvbi5mICYgKERFUklWRUQgfCBCTE9DS19FRkZFQ1QpKSAhPT0gMCAmJg0KICAgICAgIShyZWFjdGlvbl9zb3VyY2VzID09IG51bGwgPyB2b2lkIDAgOiByZWFjdGlvbl9zb3VyY2VzLmluY2x1ZGVzKHNvdXJjZTIpKQ0KICAgICkgew0KICAgICAgc3RhdGVfdW5zYWZlX211dGF0aW9uKCk7DQogICAgfQ0KICAgIGxldCBuZXdfdmFsdWUgPSBzaG91bGRfcHJveHkgPyBwcm94eSh2YWx1ZSkgOiB2YWx1ZTsNCiAgICByZXR1cm4gaW50ZXJuYWxfc2V0KHNvdXJjZTIsIG5ld192YWx1ZSk7DQogIH0NCiAgZnVuY3Rpb24gaW50ZXJuYWxfc2V0KHNvdXJjZTIsIHZhbHVlKSB7DQogICAgaWYgKCFzb3VyY2UyLmVxdWFscyh2YWx1ZSkpIHsNCiAgICAgIHZhciBvbGRfdmFsdWUgPSBzb3VyY2UyLnY7DQogICAgICBpZiAoaXNfZGVzdHJveWluZ19lZmZlY3QpIHsNCiAgICAgICAgb2xkX3ZhbHVlcy5zZXQoc291cmNlMiwgdmFsdWUpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgb2xkX3ZhbHVlcy5zZXQoc291cmNlMiwgb2xkX3ZhbHVlKTsNCiAgICAgIH0NCiAgICAgIHNvdXJjZTIudiA9IHZhbHVlOw0KICAgICAgc291cmNlMi53diA9IGluY3JlbWVudF93cml0ZV92ZXJzaW9uKCk7DQogICAgICBpZiAoKHNvdXJjZTIuZiAmIERFUklWRUQpICE9PSAwKSB7DQogICAgICAgIGlmICgoc291cmNlMi5mICYgRElSVFkpICE9PSAwKSB7DQogICAgICAgICAgZXhlY3V0ZV9kZXJpdmVkKA0KICAgICAgICAgICAgLyoqIEB0eXBlIHtEZXJpdmVkfSAqLw0KICAgICAgICAgICAgc291cmNlMiwNCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIHNldF9zaWduYWxfc3RhdHVzKA0KICAgICAgICAgIHNvdXJjZTIsDQogICAgICAgICAgKHNvdXJjZTIuZiAmIFVOT1dORUQpID09PSAwID8gQ0xFQU4gOiBNQVlCRV9ESVJUWSwNCiAgICAgICAgKTsNCiAgICAgIH0NCiAgICAgIG1hcmtfcmVhY3Rpb25zKHNvdXJjZTIsIERJUlRZKTsNCiAgICAgIGlmICgNCiAgICAgICAgaXNfcnVuZXMoKSAmJg0KICAgICAgICBhY3RpdmVfZWZmZWN0ICE9PSBudWxsICYmDQogICAgICAgIChhY3RpdmVfZWZmZWN0LmYgJiBDTEVBTikgIT09IDAgJiYNCiAgICAgICAgKGFjdGl2ZV9lZmZlY3QuZiAmIChCUkFOQ0hfRUZGRUNUIHwgUk9PVF9FRkZFQ1QpKSA9PT0gMA0KICAgICAgKSB7DQogICAgICAgIGlmICh1bnRyYWNrZWRfd3JpdGVzID09PSBudWxsKSB7DQogICAgICAgICAgc2V0X3VudHJhY2tlZF93cml0ZXMoW3NvdXJjZTJdKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB1bnRyYWNrZWRfd3JpdGVzLnB1c2goc291cmNlMik7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHZhbHVlOw0KICB9DQogIGZ1bmN0aW9uIG1hcmtfcmVhY3Rpb25zKHNpZ25hbCwgc3RhdHVzKSB7DQogICAgdmFyIHJlYWN0aW9ucyA9IHNpZ25hbC5yZWFjdGlvbnM7DQogICAgaWYgKHJlYWN0aW9ucyA9PT0gbnVsbCkgcmV0dXJuOw0KICAgIHZhciBydW5lcyA9IGlzX3J1bmVzKCk7DQogICAgdmFyIGxlbmd0aCA9IHJlYWN0aW9ucy5sZW5ndGg7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHJlYWN0aW9uID0gcmVhY3Rpb25zW2ldOw0KICAgICAgdmFyIGZsYWdzID0gcmVhY3Rpb24uZjsNCiAgICAgIGlmICgoZmxhZ3MgJiBESVJUWSkgIT09IDApIGNvbnRpbnVlOw0KICAgICAgaWYgKCFydW5lcyAmJiByZWFjdGlvbiA9PT0gYWN0aXZlX2VmZmVjdCkgY29udGludWU7DQogICAgICBzZXRfc2lnbmFsX3N0YXR1cyhyZWFjdGlvbiwgc3RhdHVzKTsNCiAgICAgIGlmICgoZmxhZ3MgJiAoQ0xFQU4gfCBVTk9XTkVEKSkgIT09IDApIHsNCiAgICAgICAgaWYgKChmbGFncyAmIERFUklWRUQpICE9PSAwKSB7DQogICAgICAgICAgbWFya19yZWFjdGlvbnMoDQogICAgICAgICAgICAvKiogQHR5cGUge0Rlcml2ZWR9ICovDQogICAgICAgICAgICByZWFjdGlvbiwNCiAgICAgICAgICAgIE1BWUJFX0RJUlRZLA0KICAgICAgICAgICk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgc2NoZWR1bGVfZWZmZWN0KA0KICAgICAgICAgICAgLyoqIEB0eXBlIHtFZmZlY3R9ICovDQogICAgICAgICAgICByZWFjdGlvbiwNCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQogIGxldCBoeWRyYXRpbmcgPSBmYWxzZTsNCiAgdmFyICR3aW5kb3c7DQogIHZhciBpc19maXJlZm94Ow0KICB2YXIgZmlyc3RfY2hpbGRfZ2V0dGVyOw0KICB2YXIgbmV4dF9zaWJsaW5nX2dldHRlcjsNCiAgZnVuY3Rpb24gaW5pdF9vcGVyYXRpb25zKCkgew0KICAgIGlmICgkd2luZG93ICE9PSB2b2lkIDApIHsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgJHdpbmRvdyA9IHdpbmRvdzsNCiAgICBpc19maXJlZm94ID0gL0ZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7DQogICAgdmFyIGVsZW1lbnRfcHJvdG90eXBlID0gRWxlbWVudC5wcm90b3R5cGU7DQogICAgdmFyIG5vZGVfcHJvdG90eXBlID0gTm9kZS5wcm90b3R5cGU7DQogICAgdmFyIHRleHRfcHJvdG90eXBlID0gVGV4dC5wcm90b3R5cGU7DQogICAgZmlyc3RfY2hpbGRfZ2V0dGVyID0gZ2V0X2Rlc2NyaXB0b3Iobm9kZV9wcm90b3R5cGUsICdmaXJzdENoaWxkJykuZ2V0Ow0KICAgIG5leHRfc2libGluZ19nZXR0ZXIgPSBnZXRfZGVzY3JpcHRvcihub2RlX3Byb3RvdHlwZSwgJ25leHRTaWJsaW5nJykuZ2V0Ow0KICAgIGlmIChpc19leHRlbnNpYmxlKGVsZW1lbnRfcHJvdG90eXBlKSkgew0KICAgICAgZWxlbWVudF9wcm90b3R5cGUuX19jbGljayA9IHZvaWQgMDsNCiAgICAgIGVsZW1lbnRfcHJvdG90eXBlLl9fY2xhc3NOYW1lID0gdm9pZCAwOw0KICAgICAgZWxlbWVudF9wcm90b3R5cGUuX19hdHRyaWJ1dGVzID0gbnVsbDsNCiAgICAgIGVsZW1lbnRfcHJvdG90eXBlLl9fc3R5bGUgPSB2b2lkIDA7DQogICAgICBlbGVtZW50X3Byb3RvdHlwZS5fX2UgPSB2b2lkIDA7DQogICAgfQ0KICAgIGlmIChpc19leHRlbnNpYmxlKHRleHRfcHJvdG90eXBlKSkgew0KICAgICAgdGV4dF9wcm90b3R5cGUuX190ID0gdm9pZCAwOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBjcmVhdGVfdGV4dCh2YWx1ZSA9ICcnKSB7DQogICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsNCiAgfQ0KICAvLyBAX19OT19TSURFX0VGRkVDVFNfXw0KICBmdW5jdGlvbiBnZXRfZmlyc3RfY2hpbGQobm9kZSkgew0KICAgIHJldHVybiBmaXJzdF9jaGlsZF9nZXR0ZXIuY2FsbChub2RlKTsNCiAgfQ0KICAvLyBAX19OT19TSURFX0VGRkVDVFNfXw0KICBmdW5jdGlvbiBnZXRfbmV4dF9zaWJsaW5nKG5vZGUpIHsNCiAgICByZXR1cm4gbmV4dF9zaWJsaW5nX2dldHRlci5jYWxsKG5vZGUpOw0KICB9DQogIGZ1bmN0aW9uIGNoaWxkKG5vZGUsIGlzX3RleHQpIHsNCiAgICB7DQogICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGdldF9maXJzdF9jaGlsZChub2RlKTsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gZmlyc3RfY2hpbGQoZnJhZ21lbnQsIGlzX3RleHQpIHsNCiAgICB7DQogICAgICB2YXIgZmlyc3QgPQ0KICAgICAgICAvKiogQHR5cGUge0RvY3VtZW50RnJhZ21lbnR9ICovDQogICAgICAgIC8qIEBfX1BVUkVfXyAqLyBnZXRfZmlyc3RfY2hpbGQoDQogICAgICAgICAgLyoqIEB0eXBlIHtOb2RlfSAqLw0KICAgICAgICAgIGZyYWdtZW50LA0KICAgICAgICApOw0KICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQ29tbWVudCAmJiBmaXJzdC5kYXRhID09PSAnJykNCiAgICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBnZXRfbmV4dF9zaWJsaW5nKGZpcnN0KTsNCiAgICAgIHJldHVybiBmaXJzdDsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gc2libGluZyhub2RlLCBjb3VudCA9IDEsIGlzX3RleHQgPSBmYWxzZSkgew0KICAgIGxldCBuZXh0X3NpYmxpbmcgPSBub2RlOw0KICAgIHdoaWxlIChjb3VudC0tKSB7DQogICAgICBuZXh0X3NpYmxpbmcgPQ0KICAgICAgICAvKiogQHR5cGUge1RlbXBsYXRlTm9kZX0gKi8NCiAgICAgICAgLyogQF9fUFVSRV9fICovIGdldF9uZXh0X3NpYmxpbmcobmV4dF9zaWJsaW5nKTsNCiAgICB9DQogICAgew0KICAgICAgcmV0dXJuIG5leHRfc2libGluZzsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gY2xlYXJfdGV4dF9jb250ZW50KG5vZGUpIHsNCiAgICBub2RlLnRleHRDb250ZW50ID0gJyc7DQogIH0NCiAgZnVuY3Rpb24gdmFsaWRhdGVfZWZmZWN0KHJ1bmUpIHsNCiAgICBpZiAoYWN0aXZlX2VmZmVjdCA9PT0gbnVsbCAmJiBhY3RpdmVfcmVhY3Rpb24gPT09IG51bGwpIHsNCiAgICAgIGVmZmVjdF9vcnBoYW4oKTsNCiAgICB9DQogICAgaWYgKA0KICAgICAgYWN0aXZlX3JlYWN0aW9uICE9PSBudWxsICYmDQogICAgICAoYWN0aXZlX3JlYWN0aW9uLmYgJiBVTk9XTkVEKSAhPT0gMCAmJg0KICAgICAgYWN0aXZlX2VmZmVjdCA9PT0gbnVsbA0KICAgICkgew0KICAgICAgZWZmZWN0X2luX3Vub3duZWRfZGVyaXZlZCgpOw0KICAgIH0NCiAgICBpZiAoaXNfZGVzdHJveWluZ19lZmZlY3QpIHsNCiAgICAgIGVmZmVjdF9pbl90ZWFyZG93bigpOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBwdXNoX2VmZmVjdChlZmZlY3QyLCBwYXJlbnRfZWZmZWN0KSB7DQogICAgdmFyIHBhcmVudF9sYXN0ID0gcGFyZW50X2VmZmVjdC5sYXN0Ow0KICAgIGlmIChwYXJlbnRfbGFzdCA9PT0gbnVsbCkgew0KICAgICAgcGFyZW50X2VmZmVjdC5sYXN0ID0gcGFyZW50X2VmZmVjdC5maXJzdCA9IGVmZmVjdDI7DQogICAgfSBlbHNlIHsNCiAgICAgIHBhcmVudF9sYXN0Lm5leHQgPSBlZmZlY3QyOw0KICAgICAgZWZmZWN0Mi5wcmV2ID0gcGFyZW50X2xhc3Q7DQogICAgICBwYXJlbnRfZWZmZWN0Lmxhc3QgPSBlZmZlY3QyOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBjcmVhdGVfZWZmZWN0KHR5cGUsIGZuLCBzeW5jLCBwdXNoMiA9IHRydWUpIHsNCiAgICB2YXIgcGFyZW50ID0gYWN0aXZlX2VmZmVjdDsNCiAgICB2YXIgZWZmZWN0MiA9IHsNCiAgICAgIGN0eDogY29tcG9uZW50X2NvbnRleHQsDQogICAgICBkZXBzOiBudWxsLA0KICAgICAgbm9kZXNfc3RhcnQ6IG51bGwsDQogICAgICBub2Rlc19lbmQ6IG51bGwsDQogICAgICBmOiB0eXBlIHwgRElSVFksDQogICAgICBmaXJzdDogbnVsbCwNCiAgICAgIGZuLA0KICAgICAgbGFzdDogbnVsbCwNCiAgICAgIG5leHQ6IG51bGwsDQogICAgICBwYXJlbnQsDQogICAgICBwcmV2OiBudWxsLA0KICAgICAgdGVhcmRvd246IG51bGwsDQogICAgICB0cmFuc2l0aW9uczogbnVsbCwNCiAgICAgIHd2OiAwLA0KICAgIH07DQogICAgaWYgKHN5bmMpIHsNCiAgICAgIHRyeSB7DQogICAgICAgIHVwZGF0ZV9lZmZlY3QoZWZmZWN0Mik7DQogICAgICAgIGVmZmVjdDIuZiB8PSBFRkZFQ1RfUkFOOw0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBkZXN0cm95X2VmZmVjdChlZmZlY3QyKTsNCiAgICAgICAgdGhyb3cgZTsNCiAgICAgIH0NCiAgICB9IGVsc2UgaWYgKGZuICE9PSBudWxsKSB7DQogICAgICBzY2hlZHVsZV9lZmZlY3QoZWZmZWN0Mik7DQogICAgfQ0KICAgIHZhciBpbmVydCA9DQogICAgICBzeW5jICYmDQogICAgICBlZmZlY3QyLmRlcHMgPT09IG51bGwgJiYNCiAgICAgIGVmZmVjdDIuZmlyc3QgPT09IG51bGwgJiYNCiAgICAgIGVmZmVjdDIubm9kZXNfc3RhcnQgPT09IG51bGwgJiYNCiAgICAgIGVmZmVjdDIudGVhcmRvd24gPT09IG51bGwgJiYNCiAgICAgIChlZmZlY3QyLmYgJiAoRUZGRUNUX0hBU19ERVJJVkVEIHwgQk9VTkRBUllfRUZGRUNUKSkgPT09IDA7DQogICAgaWYgKCFpbmVydCAmJiBwdXNoMikgew0KICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkgew0KICAgICAgICBwdXNoX2VmZmVjdChlZmZlY3QyLCBwYXJlbnQpOw0KICAgICAgfQ0KICAgICAgaWYgKGFjdGl2ZV9yZWFjdGlvbiAhPT0gbnVsbCAmJiAoYWN0aXZlX3JlYWN0aW9uLmYgJiBERVJJVkVEKSAhPT0gMCkgew0KICAgICAgICB2YXIgZGVyaXZlZDIgPQ0KICAgICAgICAgIC8qKiBAdHlwZSB7RGVyaXZlZH0gKi8NCiAgICAgICAgICBhY3RpdmVfcmVhY3Rpb247DQogICAgICAgIChkZXJpdmVkMi5lZmZlY3RzID8/IChkZXJpdmVkMi5lZmZlY3RzID0gW10pKS5wdXNoKGVmZmVjdDIpOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZWZmZWN0MjsNCiAgfQ0KICBmdW5jdGlvbiB0ZWFyZG93bihmbikgew0KICAgIGNvbnN0IGVmZmVjdDIgPSBjcmVhdGVfZWZmZWN0KFJFTkRFUl9FRkZFQ1QsIG51bGwsIGZhbHNlKTsNCiAgICBzZXRfc2lnbmFsX3N0YXR1cyhlZmZlY3QyLCBDTEVBTik7DQogICAgZWZmZWN0Mi50ZWFyZG93biA9IGZuOw0KICAgIHJldHVybiBlZmZlY3QyOw0KICB9DQogIGZ1bmN0aW9uIHVzZXJfZWZmZWN0KGZuKSB7DQogICAgdmFsaWRhdGVfZWZmZWN0KCk7DQogICAgdmFyIGRlZmVyID0NCiAgICAgIGFjdGl2ZV9lZmZlY3QgIT09IG51bGwgJiYNCiAgICAgIChhY3RpdmVfZWZmZWN0LmYgJiBCUkFOQ0hfRUZGRUNUKSAhPT0gMCAmJg0KICAgICAgY29tcG9uZW50X2NvbnRleHQgIT09IG51bGwgJiYNCiAgICAgICFjb21wb25lbnRfY29udGV4dC5tOw0KICAgIGlmIChkZWZlcikgew0KICAgICAgdmFyIGNvbnRleHQgPQ0KICAgICAgICAvKiogQHR5cGUge0NvbXBvbmVudENvbnRleHR9ICovDQogICAgICAgIGNvbXBvbmVudF9jb250ZXh0Ow0KICAgICAgKGNvbnRleHQuZSA/PyAoY29udGV4dC5lID0gW10pKS5wdXNoKHsNCiAgICAgICAgZm4sDQogICAgICAgIGVmZmVjdDogYWN0aXZlX2VmZmVjdCwNCiAgICAgICAgcmVhY3Rpb246IGFjdGl2ZV9yZWFjdGlvbiwNCiAgICAgIH0pOw0KICAgIH0gZWxzZSB7DQogICAgICB2YXIgc2lnbmFsID0gZWZmZWN0KGZuKTsNCiAgICAgIHJldHVybiBzaWduYWw7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHVzZXJfcHJlX2VmZmVjdChmbikgew0KICAgIHZhbGlkYXRlX2VmZmVjdCgpOw0KICAgIHJldHVybiByZW5kZXJfZWZmZWN0KGZuKTsNCiAgfQ0KICBmdW5jdGlvbiBjb21wb25lbnRfcm9vdChmbikgew0KICAgIGNvbnN0IGVmZmVjdDIgPSBjcmVhdGVfZWZmZWN0KFJPT1RfRUZGRUNULCBmbiwgdHJ1ZSk7DQogICAgcmV0dXJuIChvcHRpb25zID0ge30pID0+IHsNCiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVsZmlsKSA9PiB7DQogICAgICAgIGlmIChvcHRpb25zLm91dHJvKSB7DQogICAgICAgICAgcGF1c2VfZWZmZWN0KGVmZmVjdDIsICgpID0+IHsNCiAgICAgICAgICAgIGRlc3Ryb3lfZWZmZWN0KGVmZmVjdDIpOw0KICAgICAgICAgICAgZnVsZmlsKHZvaWQgMCk7DQogICAgICAgICAgfSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgZGVzdHJveV9lZmZlY3QoZWZmZWN0Mik7DQogICAgICAgICAgZnVsZmlsKHZvaWQgMCk7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH07DQogIH0NCiAgZnVuY3Rpb24gZWZmZWN0KGZuKSB7DQogICAgcmV0dXJuIGNyZWF0ZV9lZmZlY3QoRUZGRUNULCBmbiwgZmFsc2UpOw0KICB9DQogIGZ1bmN0aW9uIGxlZ2FjeV9wcmVfZWZmZWN0KGRlcHMsIGZuKSB7DQogICAgdmFyIGNvbnRleHQgPQ0KICAgICAgLyoqIEB0eXBlIHtDb21wb25lbnRDb250ZXh0TGVnYWN5fSAqLw0KICAgICAgY29tcG9uZW50X2NvbnRleHQ7DQogICAgdmFyIHRva2VuID0geyBlZmZlY3Q6IG51bGwsIHJhbjogZmFsc2UgfTsNCiAgICBjb250ZXh0LmwucjEucHVzaCh0b2tlbik7DQogICAgdG9rZW4uZWZmZWN0ID0gcmVuZGVyX2VmZmVjdCgoKSA9PiB7DQogICAgICBkZXBzKCk7DQogICAgICBpZiAodG9rZW4ucmFuKSByZXR1cm47DQogICAgICB0b2tlbi5yYW4gPSB0cnVlOw0KICAgICAgc2V0KGNvbnRleHQubC5yMiwgdHJ1ZSk7DQogICAgICB1bnRyYWNrKGZuKTsNCiAgICB9KTsNCiAgfQ0KICBmdW5jdGlvbiBsZWdhY3lfcHJlX2VmZmVjdF9yZXNldCgpIHsNCiAgICB2YXIgY29udGV4dCA9DQogICAgICAvKiogQHR5cGUge0NvbXBvbmVudENvbnRleHRMZWdhY3l9ICovDQogICAgICBjb21wb25lbnRfY29udGV4dDsNCiAgICByZW5kZXJfZWZmZWN0KCgpID0+IHsNCiAgICAgIGlmICghZ2V0KGNvbnRleHQubC5yMikpIHJldHVybjsNCiAgICAgIGZvciAodmFyIHRva2VuIG9mIGNvbnRleHQubC5yMSkgew0KICAgICAgICB2YXIgZWZmZWN0MiA9IHRva2VuLmVmZmVjdDsNCiAgICAgICAgaWYgKChlZmZlY3QyLmYgJiBDTEVBTikgIT09IDApIHsNCiAgICAgICAgICBzZXRfc2lnbmFsX3N0YXR1cyhlZmZlY3QyLCBNQVlCRV9ESVJUWSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGNoZWNrX2RpcnRpbmVzcyhlZmZlY3QyKSkgew0KICAgICAgICAgIHVwZGF0ZV9lZmZlY3QoZWZmZWN0Mik7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW4ucmFuID0gZmFsc2U7DQogICAgICB9DQogICAgICBjb250ZXh0LmwucjIudiA9IGZhbHNlOw0KICAgIH0pOw0KICB9DQogIGZ1bmN0aW9uIHJlbmRlcl9lZmZlY3QoZm4pIHsNCiAgICByZXR1cm4gY3JlYXRlX2VmZmVjdChSRU5ERVJfRUZGRUNULCBmbiwgdHJ1ZSk7DQogIH0NCiAgZnVuY3Rpb24gdGVtcGxhdGVfZWZmZWN0KGZuLCB0aHVua3MgPSBbXSwgZCA9IGRlcml2ZWQpIHsNCiAgICBjb25zdCBkZXJpdmVkcyA9IHRodW5rcy5tYXAoZCk7DQogICAgY29uc3QgZWZmZWN0MiA9ICgpID0+IGZuKC4uLmRlcml2ZWRzLm1hcChnZXQpKTsNCiAgICByZXR1cm4gYmxvY2soZWZmZWN0Mik7DQogIH0NCiAgZnVuY3Rpb24gYmxvY2soZm4sIGZsYWdzID0gMCkgew0KICAgIHJldHVybiBjcmVhdGVfZWZmZWN0KFJFTkRFUl9FRkZFQ1QgfCBCTE9DS19FRkZFQ1QgfCBmbGFncywgZm4sIHRydWUpOw0KICB9DQogIGZ1bmN0aW9uIGJyYW5jaChmbiwgcHVzaDIgPSB0cnVlKSB7DQogICAgcmV0dXJuIGNyZWF0ZV9lZmZlY3QoUkVOREVSX0VGRkVDVCB8IEJSQU5DSF9FRkZFQ1QsIGZuLCB0cnVlLCBwdXNoMik7DQogIH0NCiAgZnVuY3Rpb24gZXhlY3V0ZV9lZmZlY3RfdGVhcmRvd24oZWZmZWN0Mikgew0KICAgIHZhciB0ZWFyZG93bjIgPSBlZmZlY3QyLnRlYXJkb3duOw0KICAgIGlmICh0ZWFyZG93bjIgIT09IG51bGwpIHsNCiAgICAgIGNvbnN0IHByZXZpb3VzbHlfZGVzdHJveWluZ19lZmZlY3QgPSBpc19kZXN0cm95aW5nX2VmZmVjdDsNCiAgICAgIGNvbnN0IHByZXZpb3VzX3JlYWN0aW9uID0gYWN0aXZlX3JlYWN0aW9uOw0KICAgICAgc2V0X2lzX2Rlc3Ryb3lpbmdfZWZmZWN0KHRydWUpOw0KICAgICAgc2V0X2FjdGl2ZV9yZWFjdGlvbihudWxsKTsNCiAgICAgIHRyeSB7DQogICAgICAgIHRlYXJkb3duMi5jYWxsKG51bGwpOw0KICAgICAgfSBmaW5hbGx5IHsNCiAgICAgICAgc2V0X2lzX2Rlc3Ryb3lpbmdfZWZmZWN0KHByZXZpb3VzbHlfZGVzdHJveWluZ19lZmZlY3QpOw0KICAgICAgICBzZXRfYWN0aXZlX3JlYWN0aW9uKHByZXZpb3VzX3JlYWN0aW9uKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gZGVzdHJveV9lZmZlY3RfY2hpbGRyZW4oc2lnbmFsLCByZW1vdmVfZG9tID0gZmFsc2UpIHsNCiAgICB2YXIgZWZmZWN0MiA9IHNpZ25hbC5maXJzdDsNCiAgICBzaWduYWwuZmlyc3QgPSBzaWduYWwubGFzdCA9IG51bGw7DQogICAgd2hpbGUgKGVmZmVjdDIgIT09IG51bGwpIHsNCiAgICAgIHZhciBuZXh0ID0gZWZmZWN0Mi5uZXh0Ow0KICAgICAgaWYgKChlZmZlY3QyLmYgJiBST09UX0VGRkVDVCkgIT09IDApIHsNCiAgICAgICAgZWZmZWN0Mi5wYXJlbnQgPSBudWxsOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZGVzdHJveV9lZmZlY3QoZWZmZWN0MiwgcmVtb3ZlX2RvbSk7DQogICAgICB9DQogICAgICBlZmZlY3QyID0gbmV4dDsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gZGVzdHJveV9ibG9ja19lZmZlY3RfY2hpbGRyZW4oc2lnbmFsKSB7DQogICAgdmFyIGVmZmVjdDIgPSBzaWduYWwuZmlyc3Q7DQogICAgd2hpbGUgKGVmZmVjdDIgIT09IG51bGwpIHsNCiAgICAgIHZhciBuZXh0ID0gZWZmZWN0Mi5uZXh0Ow0KICAgICAgaWYgKChlZmZlY3QyLmYgJiBCUkFOQ0hfRUZGRUNUKSA9PT0gMCkgew0KICAgICAgICBkZXN0cm95X2VmZmVjdChlZmZlY3QyKTsNCiAgICAgIH0NCiAgICAgIGVmZmVjdDIgPSBuZXh0Ow0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBkZXN0cm95X2VmZmVjdChlZmZlY3QyLCByZW1vdmVfZG9tID0gdHJ1ZSkgew0KICAgIHZhciByZW1vdmVkID0gZmFsc2U7DQogICAgaWYgKA0KICAgICAgKHJlbW92ZV9kb20gfHwgKGVmZmVjdDIuZiAmIEhFQURfRUZGRUNUKSAhPT0gMCkgJiYNCiAgICAgIGVmZmVjdDIubm9kZXNfc3RhcnQgIT09IG51bGwNCiAgICApIHsNCiAgICAgIHZhciBub2RlID0gZWZmZWN0Mi5ub2Rlc19zdGFydDsNCiAgICAgIHZhciBlbmQgPSBlZmZlY3QyLm5vZGVzX2VuZDsNCiAgICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7DQogICAgICAgIHZhciBuZXh0ID0NCiAgICAgICAgICBub2RlID09PSBlbmQNCiAgICAgICAgICAgID8gbnVsbA0KICAgICAgICAgICAgOiAvKiogQHR5cGUge1RlbXBsYXRlTm9kZX0gKi8NCiAgICAgICAgICAgICAgLyogQF9fUFVSRV9fICovIGdldF9uZXh0X3NpYmxpbmcobm9kZSk7DQogICAgICAgIG5vZGUucmVtb3ZlKCk7DQogICAgICAgIG5vZGUgPSBuZXh0Ow0KICAgICAgfQ0KICAgICAgcmVtb3ZlZCA9IHRydWU7DQogICAgfQ0KICAgIGRlc3Ryb3lfZWZmZWN0X2NoaWxkcmVuKGVmZmVjdDIsIHJlbW92ZV9kb20gJiYgIXJlbW92ZWQpOw0KICAgIHJlbW92ZV9yZWFjdGlvbnMoZWZmZWN0MiwgMCk7DQogICAgc2V0X3NpZ25hbF9zdGF0dXMoZWZmZWN0MiwgREVTVFJPWUVEKTsNCiAgICB2YXIgdHJhbnNpdGlvbnMgPSBlZmZlY3QyLnRyYW5zaXRpb25zOw0KICAgIGlmICh0cmFuc2l0aW9ucyAhPT0gbnVsbCkgew0KICAgICAgZm9yIChjb25zdCB0cmFuc2l0aW9uMiBvZiB0cmFuc2l0aW9ucykgew0KICAgICAgICB0cmFuc2l0aW9uMi5zdG9wKCk7DQogICAgICB9DQogICAgfQ0KICAgIGV4ZWN1dGVfZWZmZWN0X3RlYXJkb3duKGVmZmVjdDIpOw0KICAgIHZhciBwYXJlbnQgPSBlZmZlY3QyLnBhcmVudDsNCiAgICBpZiAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC5maXJzdCAhPT0gbnVsbCkgew0KICAgICAgdW5saW5rX2VmZmVjdChlZmZlY3QyKTsNCiAgICB9DQogICAgZWZmZWN0Mi5uZXh0ID0NCiAgICAgIGVmZmVjdDIucHJldiA9DQogICAgICBlZmZlY3QyLnRlYXJkb3duID0NCiAgICAgIGVmZmVjdDIuY3R4ID0NCiAgICAgIGVmZmVjdDIuZGVwcyA9DQogICAgICBlZmZlY3QyLmZuID0NCiAgICAgIGVmZmVjdDIubm9kZXNfc3RhcnQgPQ0KICAgICAgZWZmZWN0Mi5ub2Rlc19lbmQgPQ0KICAgICAgICBudWxsOw0KICB9DQogIGZ1bmN0aW9uIHVubGlua19lZmZlY3QoZWZmZWN0Mikgew0KICAgIHZhciBwYXJlbnQgPSBlZmZlY3QyLnBhcmVudDsNCiAgICB2YXIgcHJldiA9IGVmZmVjdDIucHJldjsNCiAgICB2YXIgbmV4dCA9IGVmZmVjdDIubmV4dDsNCiAgICBpZiAocHJldiAhPT0gbnVsbCkgcHJldi5uZXh0ID0gbmV4dDsNCiAgICBpZiAobmV4dCAhPT0gbnVsbCkgbmV4dC5wcmV2ID0gcHJldjsNCiAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7DQogICAgICBpZiAocGFyZW50LmZpcnN0ID09PSBlZmZlY3QyKSBwYXJlbnQuZmlyc3QgPSBuZXh0Ow0KICAgICAgaWYgKHBhcmVudC5sYXN0ID09PSBlZmZlY3QyKSBwYXJlbnQubGFzdCA9IHByZXY7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHBhdXNlX2VmZmVjdChlZmZlY3QyLCBjYWxsYmFjaykgew0KICAgIHZhciB0cmFuc2l0aW9ucyA9IFtdOw0KICAgIHBhdXNlX2NoaWxkcmVuKGVmZmVjdDIsIHRyYW5zaXRpb25zLCB0cnVlKTsNCiAgICBydW5fb3V0X3RyYW5zaXRpb25zKHRyYW5zaXRpb25zLCAoKSA9PiB7DQogICAgICBkZXN0cm95X2VmZmVjdChlZmZlY3QyKTsNCiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTsNCiAgICB9KTsNCiAgfQ0KICBmdW5jdGlvbiBydW5fb3V0X3RyYW5zaXRpb25zKHRyYW5zaXRpb25zLCBmbikgew0KICAgIHZhciByZW1haW5pbmcgPSB0cmFuc2l0aW9ucy5sZW5ndGg7DQogICAgaWYgKHJlbWFpbmluZyA+IDApIHsNCiAgICAgIHZhciBjaGVjayA9ICgpID0+IC0tcmVtYWluaW5nIHx8IGZuKCk7DQogICAgICBmb3IgKHZhciB0cmFuc2l0aW9uMiBvZiB0cmFuc2l0aW9ucykgew0KICAgICAgICB0cmFuc2l0aW9uMi5vdXQoY2hlY2spOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBmbigpOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBwYXVzZV9jaGlsZHJlbihlZmZlY3QyLCB0cmFuc2l0aW9ucywgbG9jYWwpIHsNCiAgICBpZiAoKGVmZmVjdDIuZiAmIElORVJUKSAhPT0gMCkgcmV0dXJuOw0KICAgIGVmZmVjdDIuZiBePSBJTkVSVDsNCiAgICBpZiAoZWZmZWN0Mi50cmFuc2l0aW9ucyAhPT0gbnVsbCkgew0KICAgICAgZm9yIChjb25zdCB0cmFuc2l0aW9uMiBvZiBlZmZlY3QyLnRyYW5zaXRpb25zKSB7DQogICAgICAgIGlmICh0cmFuc2l0aW9uMi5pc19nbG9iYWwgfHwgbG9jYWwpIHsNCiAgICAgICAgICB0cmFuc2l0aW9ucy5wdXNoKHRyYW5zaXRpb24yKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICB2YXIgY2hpbGQyID0gZWZmZWN0Mi5maXJzdDsNCiAgICB3aGlsZSAoY2hpbGQyICE9PSBudWxsKSB7DQogICAgICB2YXIgc2libGluZzIgPSBjaGlsZDIubmV4dDsNCiAgICAgIHZhciB0cmFuc3BhcmVudCA9DQogICAgICAgIChjaGlsZDIuZiAmIEVGRkVDVF9UUkFOU1BBUkVOVCkgIT09IDAgfHwNCiAgICAgICAgKGNoaWxkMi5mICYgQlJBTkNIX0VGRkVDVCkgIT09IDA7DQogICAgICBwYXVzZV9jaGlsZHJlbihjaGlsZDIsIHRyYW5zaXRpb25zLCB0cmFuc3BhcmVudCA/IGxvY2FsIDogZmFsc2UpOw0KICAgICAgY2hpbGQyID0gc2libGluZzI7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHJlc3VtZV9lZmZlY3QoZWZmZWN0Mikgew0KICAgIHJlc3VtZV9jaGlsZHJlbihlZmZlY3QyLCB0cnVlKTsNCiAgfQ0KICBmdW5jdGlvbiByZXN1bWVfY2hpbGRyZW4oZWZmZWN0MiwgbG9jYWwpIHsNCiAgICBpZiAoKGVmZmVjdDIuZiAmIElORVJUKSA9PT0gMCkgcmV0dXJuOw0KICAgIGVmZmVjdDIuZiBePSBJTkVSVDsNCiAgICBpZiAoKGVmZmVjdDIuZiAmIENMRUFOKSA9PT0gMCkgew0KICAgICAgZWZmZWN0Mi5mIF49IENMRUFOOw0KICAgIH0NCiAgICBpZiAoY2hlY2tfZGlydGluZXNzKGVmZmVjdDIpKSB7DQogICAgICBzZXRfc2lnbmFsX3N0YXR1cyhlZmZlY3QyLCBESVJUWSk7DQogICAgICBzY2hlZHVsZV9lZmZlY3QoZWZmZWN0Mik7DQogICAgfQ0KICAgIHZhciBjaGlsZDIgPSBlZmZlY3QyLmZpcnN0Ow0KICAgIHdoaWxlIChjaGlsZDIgIT09IG51bGwpIHsNCiAgICAgIHZhciBzaWJsaW5nMiA9IGNoaWxkMi5uZXh0Ow0KICAgICAgdmFyIHRyYW5zcGFyZW50ID0NCiAgICAgICAgKGNoaWxkMi5mICYgRUZGRUNUX1RSQU5TUEFSRU5UKSAhPT0gMCB8fA0KICAgICAgICAoY2hpbGQyLmYgJiBCUkFOQ0hfRUZGRUNUKSAhPT0gMDsNCiAgICAgIHJlc3VtZV9jaGlsZHJlbihjaGlsZDIsIHRyYW5zcGFyZW50ID8gbG9jYWwgOiBmYWxzZSk7DQogICAgICBjaGlsZDIgPSBzaWJsaW5nMjsNCiAgICB9DQogICAgaWYgKGVmZmVjdDIudHJhbnNpdGlvbnMgIT09IG51bGwpIHsNCiAgICAgIGZvciAoY29uc3QgdHJhbnNpdGlvbjIgb2YgZWZmZWN0Mi50cmFuc2l0aW9ucykgew0KICAgICAgICBpZiAodHJhbnNpdGlvbjIuaXNfZ2xvYmFsIHx8IGxvY2FsKSB7DQogICAgICAgICAgdHJhbnNpdGlvbjIuaW4oKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICBsZXQgbWljcm9fdGFza3MgPSBbXTsNCiAgZnVuY3Rpb24gcnVuX21pY3JvX3Rhc2tzKCkgew0KICAgIHZhciB0YXNrcyA9IG1pY3JvX3Rhc2tzOw0KICAgIG1pY3JvX3Rhc2tzID0gW107DQogICAgcnVuX2FsbCh0YXNrcyk7DQogIH0NCiAgZnVuY3Rpb24gcXVldWVfbWljcm9fdGFzayhmbikgew0KICAgIGlmIChtaWNyb190YXNrcy5sZW5ndGggPT09IDApIHsNCiAgICAgIHF1ZXVlTWljcm90YXNrKHJ1bl9taWNyb190YXNrcyk7DQogICAgfQ0KICAgIG1pY3JvX3Rhc2tzLnB1c2goZm4pOw0KICB9DQogIGxldCBpc190aHJvd2luZ19lcnJvciA9IGZhbHNlOw0KICBsZXQgaXNfZmx1c2hpbmcgPSBmYWxzZTsNCiAgbGV0IGxhc3Rfc2NoZWR1bGVkX2VmZmVjdCA9IG51bGw7DQogIGxldCBpc191cGRhdGluZ19lZmZlY3QgPSBmYWxzZTsNCiAgbGV0IGlzX2Rlc3Ryb3lpbmdfZWZmZWN0ID0gZmFsc2U7DQogIGZ1bmN0aW9uIHNldF9pc19kZXN0cm95aW5nX2VmZmVjdCh2YWx1ZSkgew0KICAgIGlzX2Rlc3Ryb3lpbmdfZWZmZWN0ID0gdmFsdWU7DQogIH0NCiAgbGV0IHF1ZXVlZF9yb290X2VmZmVjdHMgPSBbXTsNCiAgbGV0IGFjdGl2ZV9yZWFjdGlvbiA9IG51bGw7DQogIGxldCB1bnRyYWNraW5nID0gZmFsc2U7DQogIGZ1bmN0aW9uIHNldF9hY3RpdmVfcmVhY3Rpb24ocmVhY3Rpb24pIHsNCiAgICBhY3RpdmVfcmVhY3Rpb24gPSByZWFjdGlvbjsNCiAgfQ0KICBsZXQgYWN0aXZlX2VmZmVjdCA9IG51bGw7DQogIGZ1bmN0aW9uIHNldF9hY3RpdmVfZWZmZWN0KGVmZmVjdDIpIHsNCiAgICBhY3RpdmVfZWZmZWN0ID0gZWZmZWN0MjsNCiAgfQ0KICBsZXQgcmVhY3Rpb25fc291cmNlcyA9IG51bGw7DQogIGZ1bmN0aW9uIHNldF9yZWFjdGlvbl9zb3VyY2VzKHNvdXJjZXMpIHsNCiAgICByZWFjdGlvbl9zb3VyY2VzID0gc291cmNlczsNCiAgfQ0KICBmdW5jdGlvbiBwdXNoX3JlYWN0aW9uX3ZhbHVlKHZhbHVlKSB7DQogICAgaWYgKGFjdGl2ZV9yZWFjdGlvbiAhPT0gbnVsbCAmJiBhY3RpdmVfcmVhY3Rpb24uZiAmIEVGRkVDVF9JU19VUERBVElORykgew0KICAgICAgaWYgKHJlYWN0aW9uX3NvdXJjZXMgPT09IG51bGwpIHsNCiAgICAgICAgc2V0X3JlYWN0aW9uX3NvdXJjZXMoW3ZhbHVlXSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZWFjdGlvbl9zb3VyY2VzLnB1c2godmFsdWUpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICBsZXQgbmV3X2RlcHMgPSBudWxsOw0KICBsZXQgc2tpcHBlZF9kZXBzID0gMDsNCiAgbGV0IHVudHJhY2tlZF93cml0ZXMgPSBudWxsOw0KICBmdW5jdGlvbiBzZXRfdW50cmFja2VkX3dyaXRlcyh2YWx1ZSkgew0KICAgIHVudHJhY2tlZF93cml0ZXMgPSB2YWx1ZTsNCiAgfQ0KICBsZXQgd3JpdGVfdmVyc2lvbiA9IDE7DQogIGxldCByZWFkX3ZlcnNpb24gPSAwOw0KICBsZXQgc2tpcF9yZWFjdGlvbiA9IGZhbHNlOw0KICBsZXQgY2FwdHVyZWRfc2lnbmFscyA9IG51bGw7DQogIGZ1bmN0aW9uIGluY3JlbWVudF93cml0ZV92ZXJzaW9uKCkgew0KICAgIHJldHVybiArK3dyaXRlX3ZlcnNpb247DQogIH0NCiAgZnVuY3Rpb24gY2hlY2tfZGlydGluZXNzKHJlYWN0aW9uKSB7DQogICAgdmFyIF9hMjsNCiAgICB2YXIgZmxhZ3MgPSByZWFjdGlvbi5mOw0KICAgIGlmICgoZmxhZ3MgJiBESVJUWSkgIT09IDApIHsNCiAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgICBpZiAoKGZsYWdzICYgTUFZQkVfRElSVFkpICE9PSAwKSB7DQogICAgICB2YXIgZGVwZW5kZW5jaWVzID0gcmVhY3Rpb24uZGVwczsNCiAgICAgIHZhciBpc191bm93bmVkID0gKGZsYWdzICYgVU5PV05FRCkgIT09IDA7DQogICAgICBpZiAoZGVwZW5kZW5jaWVzICE9PSBudWxsKSB7DQogICAgICAgIHZhciBpOw0KICAgICAgICB2YXIgZGVwZW5kZW5jeTsNCiAgICAgICAgdmFyIGlzX2Rpc2Nvbm5lY3RlZCA9IChmbGFncyAmIERJU0NPTk5FQ1RFRCkgIT09IDA7DQogICAgICAgIHZhciBpc191bm93bmVkX2Nvbm5lY3RlZCA9DQogICAgICAgICAgaXNfdW5vd25lZCAmJiBhY3RpdmVfZWZmZWN0ICE9PSBudWxsICYmICFza2lwX3JlYWN0aW9uOw0KICAgICAgICB2YXIgbGVuZ3RoID0gZGVwZW5kZW5jaWVzLmxlbmd0aDsNCiAgICAgICAgaWYgKGlzX2Rpc2Nvbm5lY3RlZCB8fCBpc191bm93bmVkX2Nvbm5lY3RlZCkgew0KICAgICAgICAgIHZhciBkZXJpdmVkMiA9DQogICAgICAgICAgICAvKiogQHR5cGUge0Rlcml2ZWR9ICovDQogICAgICAgICAgICByZWFjdGlvbjsNCiAgICAgICAgICB2YXIgcGFyZW50ID0gZGVyaXZlZDIucGFyZW50Ow0KICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY2llc1tpXTsNCiAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgaXNfZGlzY29ubmVjdGVkIHx8DQogICAgICAgICAgICAgICEoKF9hMiA9IGRlcGVuZGVuY3kgPT0gbnVsbCA/IHZvaWQgMCA6IGRlcGVuZGVuY3kucmVhY3Rpb25zKSA9PQ0KICAgICAgICAgICAgICBudWxsDQogICAgICAgICAgICAgICAgPyB2b2lkIDANCiAgICAgICAgICAgICAgICA6IF9hMi5pbmNsdWRlcyhkZXJpdmVkMikpDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgKGRlcGVuZGVuY3kucmVhY3Rpb25zID8/IChkZXBlbmRlbmN5LnJlYWN0aW9ucyA9IFtdKSkucHVzaCgNCiAgICAgICAgICAgICAgICBkZXJpdmVkMiwNCiAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKGlzX2Rpc2Nvbm5lY3RlZCkgew0KICAgICAgICAgICAgZGVyaXZlZDIuZiBePSBESVNDT05ORUNURUQ7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICgNCiAgICAgICAgICAgIGlzX3Vub3duZWRfY29ubmVjdGVkICYmDQogICAgICAgICAgICBwYXJlbnQgIT09IG51bGwgJiYNCiAgICAgICAgICAgIChwYXJlbnQuZiAmIFVOT1dORUQpID09PSAwDQogICAgICAgICAgKSB7DQogICAgICAgICAgICBkZXJpdmVkMi5mIF49IFVOT1dORUQ7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmNpZXNbaV07DQogICAgICAgICAgaWYgKA0KICAgICAgICAgICAgY2hlY2tfZGlydGluZXNzKA0KICAgICAgICAgICAgICAvKiogQHR5cGUge0Rlcml2ZWR9ICovDQogICAgICAgICAgICAgIGRlcGVuZGVuY3ksDQogICAgICAgICAgICApDQogICAgICAgICAgKSB7DQogICAgICAgICAgICB1cGRhdGVfZGVyaXZlZCgNCiAgICAgICAgICAgICAgLyoqIEB0eXBlIHtEZXJpdmVkfSAqLw0KICAgICAgICAgICAgICBkZXBlbmRlbmN5LA0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKGRlcGVuZGVuY3kud3YgPiByZWFjdGlvbi53dikgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoIWlzX3Vub3duZWQgfHwgKGFjdGl2ZV9lZmZlY3QgIT09IG51bGwgJiYgIXNraXBfcmVhY3Rpb24pKSB7DQogICAgICAgIHNldF9zaWduYWxfc3RhdHVzKHJlYWN0aW9uLCBDTEVBTik7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCiAgfQ0KICBmdW5jdGlvbiBwcm9wYWdhdGVfZXJyb3IoZXJyb3IsIGVmZmVjdDIpIHsNCiAgICB2YXIgY3VycmVudCA9IGVmZmVjdDI7DQogICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHsNCiAgICAgIGlmICgoY3VycmVudC5mICYgQk9VTkRBUllfRUZGRUNUKSAhPT0gMCkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgIGN1cnJlbnQuZm4oZXJyb3IpOw0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfSBjYXRjaCB7DQogICAgICAgICAgY3VycmVudC5mIF49IEJPVU5EQVJZX0VGRkVDVDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Ow0KICAgIH0NCiAgICBpc190aHJvd2luZ19lcnJvciA9IGZhbHNlOw0KICAgIHRocm93IGVycm9yOw0KICB9DQogIGZ1bmN0aW9uIHNob3VsZF9yZXRocm93X2Vycm9yKGVmZmVjdDIpIHsNCiAgICByZXR1cm4gKA0KICAgICAgKGVmZmVjdDIuZiAmIERFU1RST1lFRCkgPT09IDAgJiYNCiAgICAgIChlZmZlY3QyLnBhcmVudCA9PT0gbnVsbCB8fCAoZWZmZWN0Mi5wYXJlbnQuZiAmIEJPVU5EQVJZX0VGRkVDVCkgPT09IDApDQogICAgKTsNCiAgfQ0KICBmdW5jdGlvbiBoYW5kbGVfZXJyb3IoZXJyb3IsIGVmZmVjdDIsIHByZXZpb3VzX2VmZmVjdCwgY29tcG9uZW50X2NvbnRleHQyKSB7DQogICAgaWYgKGlzX3Rocm93aW5nX2Vycm9yKSB7DQogICAgICBpZiAocHJldmlvdXNfZWZmZWN0ID09PSBudWxsKSB7DQogICAgICAgIGlzX3Rocm93aW5nX2Vycm9yID0gZmFsc2U7DQogICAgICB9DQogICAgICBpZiAoc2hvdWxkX3JldGhyb3dfZXJyb3IoZWZmZWN0MikpIHsNCiAgICAgICAgdGhyb3cgZXJyb3I7DQogICAgICB9DQogICAgICByZXR1cm47DQogICAgfQ0KICAgIGlmIChwcmV2aW91c19lZmZlY3QgIT09IG51bGwpIHsNCiAgICAgIGlzX3Rocm93aW5nX2Vycm9yID0gdHJ1ZTsNCiAgICB9DQogICAgew0KICAgICAgcHJvcGFnYXRlX2Vycm9yKGVycm9yLCBlZmZlY3QyKTsNCiAgICAgIHJldHVybjsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gc2NoZWR1bGVfcG9zc2libGVfZWZmZWN0X3NlbGZfaW52YWxpZGF0aW9uKA0KICAgIHNpZ25hbCwNCiAgICBlZmZlY3QyLA0KICAgIHJvb3QyID0gdHJ1ZSwNCiAgKSB7DQogICAgdmFyIHJlYWN0aW9ucyA9IHNpZ25hbC5yZWFjdGlvbnM7DQogICAgaWYgKHJlYWN0aW9ucyA9PT0gbnVsbCkgcmV0dXJuOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVhY3Rpb25zLmxlbmd0aDsgaSsrKSB7DQogICAgICB2YXIgcmVhY3Rpb24gPSByZWFjdGlvbnNbaV07DQogICAgICBpZiAocmVhY3Rpb25fc291cmNlcyA9PSBudWxsID8gdm9pZCAwIDogcmVhY3Rpb25fc291cmNlcy5pbmNsdWRlcyhzaWduYWwpKQ0KICAgICAgICBjb250aW51ZTsNCiAgICAgIGlmICgocmVhY3Rpb24uZiAmIERFUklWRUQpICE9PSAwKSB7DQogICAgICAgIHNjaGVkdWxlX3Bvc3NpYmxlX2VmZmVjdF9zZWxmX2ludmFsaWRhdGlvbigNCiAgICAgICAgICAvKiogQHR5cGUge0Rlcml2ZWR9ICovDQogICAgICAgICAgcmVhY3Rpb24sDQogICAgICAgICAgZWZmZWN0MiwNCiAgICAgICAgICBmYWxzZSwNCiAgICAgICAgKTsNCiAgICAgIH0gZWxzZSBpZiAoZWZmZWN0MiA9PT0gcmVhY3Rpb24pIHsNCiAgICAgICAgaWYgKHJvb3QyKSB7DQogICAgICAgICAgc2V0X3NpZ25hbF9zdGF0dXMocmVhY3Rpb24sIERJUlRZKTsNCiAgICAgICAgfSBlbHNlIGlmICgocmVhY3Rpb24uZiAmIENMRUFOKSAhPT0gMCkgew0KICAgICAgICAgIHNldF9zaWduYWxfc3RhdHVzKHJlYWN0aW9uLCBNQVlCRV9ESVJUWSk7DQogICAgICAgIH0NCiAgICAgICAgc2NoZWR1bGVfZWZmZWN0KA0KICAgICAgICAgIC8qKiBAdHlwZSB7RWZmZWN0fSAqLw0KICAgICAgICAgIHJlYWN0aW9uLA0KICAgICAgICApOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiB1cGRhdGVfcmVhY3Rpb24ocmVhY3Rpb24pIHsNCiAgICB2YXIgX2EyOw0KICAgIHZhciBwcmV2aW91c19kZXBzID0gbmV3X2RlcHM7DQogICAgdmFyIHByZXZpb3VzX3NraXBwZWRfZGVwcyA9IHNraXBwZWRfZGVwczsNCiAgICB2YXIgcHJldmlvdXNfdW50cmFja2VkX3dyaXRlcyA9IHVudHJhY2tlZF93cml0ZXM7DQogICAgdmFyIHByZXZpb3VzX3JlYWN0aW9uID0gYWN0aXZlX3JlYWN0aW9uOw0KICAgIHZhciBwcmV2aW91c19za2lwX3JlYWN0aW9uID0gc2tpcF9yZWFjdGlvbjsNCiAgICB2YXIgcHJldmlvdXNfcmVhY3Rpb25fc291cmNlcyA9IHJlYWN0aW9uX3NvdXJjZXM7DQogICAgdmFyIHByZXZpb3VzX2NvbXBvbmVudF9jb250ZXh0ID0gY29tcG9uZW50X2NvbnRleHQ7DQogICAgdmFyIHByZXZpb3VzX3VudHJhY2tpbmcgPSB1bnRyYWNraW5nOw0KICAgIHZhciBmbGFncyA9IHJlYWN0aW9uLmY7DQogICAgbmV3X2RlcHMgPSAvKiogQHR5cGUge251bGwgfCBWYWx1ZVtdfSAqLyBudWxsOw0KICAgIHNraXBwZWRfZGVwcyA9IDA7DQogICAgdW50cmFja2VkX3dyaXRlcyA9IG51bGw7DQogICAgc2tpcF9yZWFjdGlvbiA9DQogICAgICAoZmxhZ3MgJiBVTk9XTkVEKSAhPT0gMCAmJg0KICAgICAgKHVudHJhY2tpbmcgfHwgIWlzX3VwZGF0aW5nX2VmZmVjdCB8fCBhY3RpdmVfcmVhY3Rpb24gPT09IG51bGwpOw0KICAgIGFjdGl2ZV9yZWFjdGlvbiA9DQogICAgICAoZmxhZ3MgJiAoQlJBTkNIX0VGRkVDVCB8IFJPT1RfRUZGRUNUKSkgPT09IDAgPyByZWFjdGlvbiA6IG51bGw7DQogICAgcmVhY3Rpb25fc291cmNlcyA9IG51bGw7DQogICAgc2V0X2NvbXBvbmVudF9jb250ZXh0KHJlYWN0aW9uLmN0eCk7DQogICAgdW50cmFja2luZyA9IGZhbHNlOw0KICAgIHJlYWRfdmVyc2lvbisrOw0KICAgIHJlYWN0aW9uLmYgfD0gRUZGRUNUX0lTX1VQREFUSU5HOw0KICAgIHRyeSB7DQogICAgICB2YXIgcmVzdWx0ID0NCiAgICAgICAgLyoqIEB0eXBlIHtGdW5jdGlvbn0gKi8NCiAgICAgICAgKDAsIHJlYWN0aW9uLmZuKSgpOw0KICAgICAgdmFyIGRlcHMgPSByZWFjdGlvbi5kZXBzOw0KICAgICAgaWYgKG5ld19kZXBzICE9PSBudWxsKSB7DQogICAgICAgIHZhciBpOw0KICAgICAgICByZW1vdmVfcmVhY3Rpb25zKHJlYWN0aW9uLCBza2lwcGVkX2RlcHMpOw0KICAgICAgICBpZiAoZGVwcyAhPT0gbnVsbCAmJiBza2lwcGVkX2RlcHMgPiAwKSB7DQogICAgICAgICAgZGVwcy5sZW5ndGggPSBza2lwcGVkX2RlcHMgKyBuZXdfZGVwcy5sZW5ndGg7DQogICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5ld19kZXBzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBkZXBzW3NraXBwZWRfZGVwcyArIGldID0gbmV3X2RlcHNbaV07DQogICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlYWN0aW9uLmRlcHMgPSBkZXBzID0gbmV3X2RlcHM7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFza2lwX3JlYWN0aW9uKSB7DQogICAgICAgICAgZm9yIChpID0gc2tpcHBlZF9kZXBzOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgKChfYTIgPSBkZXBzW2ldKS5yZWFjdGlvbnMgPz8gKF9hMi5yZWFjdGlvbnMgPSBbXSkpLnB1c2gocmVhY3Rpb24pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkZXBzICE9PSBudWxsICYmIHNraXBwZWRfZGVwcyA8IGRlcHMubGVuZ3RoKSB7DQogICAgICAgIHJlbW92ZV9yZWFjdGlvbnMocmVhY3Rpb24sIHNraXBwZWRfZGVwcyk7DQogICAgICAgIGRlcHMubGVuZ3RoID0gc2tpcHBlZF9kZXBzOw0KICAgICAgfQ0KICAgICAgaWYgKA0KICAgICAgICBpc19ydW5lcygpICYmDQogICAgICAgIHVudHJhY2tlZF93cml0ZXMgIT09IG51bGwgJiYNCiAgICAgICAgIXVudHJhY2tpbmcgJiYNCiAgICAgICAgZGVwcyAhPT0gbnVsbCAmJg0KICAgICAgICAocmVhY3Rpb24uZiAmIChERVJJVkVEIHwgTUFZQkVfRElSVFkgfCBESVJUWSkpID09PSAwDQogICAgICApIHsNCiAgICAgICAgZm9yIChpID0gMDsgaSA8IC8qKiBAdHlwZSB7U291cmNlW119ICovIHVudHJhY2tlZF93cml0ZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBzY2hlZHVsZV9wb3NzaWJsZV9lZmZlY3Rfc2VsZl9pbnZhbGlkYXRpb24oDQogICAgICAgICAgICB1bnRyYWNrZWRfd3JpdGVzW2ldLA0KICAgICAgICAgICAgLyoqIEB0eXBlIHtFZmZlY3R9ICovDQogICAgICAgICAgICByZWFjdGlvbiwNCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAocHJldmlvdXNfcmVhY3Rpb24gIT09IHJlYWN0aW9uKSB7DQogICAgICAgIHJlYWRfdmVyc2lvbisrOw0KICAgICAgICBpZiAodW50cmFja2VkX3dyaXRlcyAhPT0gbnVsbCkgew0KICAgICAgICAgIGlmIChwcmV2aW91c191bnRyYWNrZWRfd3JpdGVzID09PSBudWxsKSB7DQogICAgICAgICAgICBwcmV2aW91c191bnRyYWNrZWRfd3JpdGVzID0gdW50cmFja2VkX3dyaXRlczsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcHJldmlvdXNfdW50cmFja2VkX3dyaXRlcy5wdXNoKA0KICAgICAgICAgICAgICAuLi4vKiogQHR5cGUge1NvdXJjZVtdfSAqLw0KICAgICAgICAgICAgICB1bnRyYWNrZWRfd3JpdGVzLA0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfSBmaW5hbGx5IHsNCiAgICAgIG5ld19kZXBzID0gcHJldmlvdXNfZGVwczsNCiAgICAgIHNraXBwZWRfZGVwcyA9IHByZXZpb3VzX3NraXBwZWRfZGVwczsNCiAgICAgIHVudHJhY2tlZF93cml0ZXMgPSBwcmV2aW91c191bnRyYWNrZWRfd3JpdGVzOw0KICAgICAgYWN0aXZlX3JlYWN0aW9uID0gcHJldmlvdXNfcmVhY3Rpb247DQogICAgICBza2lwX3JlYWN0aW9uID0gcHJldmlvdXNfc2tpcF9yZWFjdGlvbjsNCiAgICAgIHJlYWN0aW9uX3NvdXJjZXMgPSBwcmV2aW91c19yZWFjdGlvbl9zb3VyY2VzOw0KICAgICAgc2V0X2NvbXBvbmVudF9jb250ZXh0KHByZXZpb3VzX2NvbXBvbmVudF9jb250ZXh0KTsNCiAgICAgIHVudHJhY2tpbmcgPSBwcmV2aW91c191bnRyYWNraW5nOw0KICAgICAgcmVhY3Rpb24uZiBePSBFRkZFQ1RfSVNfVVBEQVRJTkc7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHJlbW92ZV9yZWFjdGlvbihzaWduYWwsIGRlcGVuZGVuY3kpIHsNCiAgICBsZXQgcmVhY3Rpb25zID0gZGVwZW5kZW5jeS5yZWFjdGlvbnM7DQogICAgaWYgKHJlYWN0aW9ucyAhPT0gbnVsbCkgew0KICAgICAgdmFyIGluZGV4ID0gaW5kZXhfb2YuY2FsbChyZWFjdGlvbnMsIHNpZ25hbCk7DQogICAgICBpZiAoaW5kZXggIT09IC0xKSB7DQogICAgICAgIHZhciBuZXdfbGVuZ3RoID0gcmVhY3Rpb25zLmxlbmd0aCAtIDE7DQogICAgICAgIGlmIChuZXdfbGVuZ3RoID09PSAwKSB7DQogICAgICAgICAgcmVhY3Rpb25zID0gZGVwZW5kZW5jeS5yZWFjdGlvbnMgPSBudWxsOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlYWN0aW9uc1tpbmRleF0gPSByZWFjdGlvbnNbbmV3X2xlbmd0aF07DQogICAgICAgICAgcmVhY3Rpb25zLnBvcCgpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIGlmICgNCiAgICAgIHJlYWN0aW9ucyA9PT0gbnVsbCAmJg0KICAgICAgKGRlcGVuZGVuY3kuZiAmIERFUklWRUQpICE9PSAwICYmIC8vIERlc3Ryb3lpbmcgYSBjaGlsZCBlZmZlY3Qgd2hpbGUgdXBkYXRpbmcgYSBwYXJlbnQgZWZmZWN0IGNhbiBjYXVzZSBhIGRlcGVuZGVuY3kgdG8gYXBwZWFyDQogICAgICAvLyB0byBiZSB1bnVzZWQsIHdoZW4gaW4gZmFjdCBpdCBpcyB1c2VkIGJ5IHRoZSBjdXJyZW50bHktdXBkYXRpbmcgcGFyZW50LiBDaGVja2luZyBgbmV3X2RlcHNgDQogICAgICAvLyBhbGxvd3MgdXMgdG8gc2tpcCB0aGUgZXhwZW5zaXZlIHdvcmsgb2YgZGlzY29ubmVjdGluZyBhbmQgaW1tZWRpYXRlbHkgcmVjb25uZWN0aW5nIGl0DQogICAgICAobmV3X2RlcHMgPT09IG51bGwgfHwgIW5ld19kZXBzLmluY2x1ZGVzKGRlcGVuZGVuY3kpKQ0KICAgICkgew0KICAgICAgc2V0X3NpZ25hbF9zdGF0dXMoZGVwZW5kZW5jeSwgTUFZQkVfRElSVFkpOw0KICAgICAgaWYgKChkZXBlbmRlbmN5LmYgJiAoVU5PV05FRCB8IERJU0NPTk5FQ1RFRCkpID09PSAwKSB7DQogICAgICAgIGRlcGVuZGVuY3kuZiBePSBESVNDT05ORUNURUQ7DQogICAgICB9DQogICAgICBkZXN0cm95X2Rlcml2ZWRfZWZmZWN0cygNCiAgICAgICAgLyoqIEB0eXBlIHtEZXJpdmVkfSAqKi8NCiAgICAgICAgZGVwZW5kZW5jeSwNCiAgICAgICk7DQogICAgICByZW1vdmVfcmVhY3Rpb25zKA0KICAgICAgICAvKiogQHR5cGUge0Rlcml2ZWR9ICoqLw0KICAgICAgICBkZXBlbmRlbmN5LA0KICAgICAgICAwLA0KICAgICAgKTsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gcmVtb3ZlX3JlYWN0aW9ucyhzaWduYWwsIHN0YXJ0X2luZGV4KSB7DQogICAgdmFyIGRlcGVuZGVuY2llcyA9IHNpZ25hbC5kZXBzOw0KICAgIGlmIChkZXBlbmRlbmNpZXMgPT09IG51bGwpIHJldHVybjsNCiAgICBmb3IgKHZhciBpID0gc3RhcnRfaW5kZXg7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlbW92ZV9yZWFjdGlvbihzaWduYWwsIGRlcGVuZGVuY2llc1tpXSk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHVwZGF0ZV9lZmZlY3QoZWZmZWN0Mikgew0KICAgIHZhciBmbGFncyA9IGVmZmVjdDIuZjsNCiAgICBpZiAoKGZsYWdzICYgREVTVFJPWUVEKSAhPT0gMCkgew0KICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICBzZXRfc2lnbmFsX3N0YXR1cyhlZmZlY3QyLCBDTEVBTik7DQogICAgdmFyIHByZXZpb3VzX2VmZmVjdCA9IGFjdGl2ZV9lZmZlY3Q7DQogICAgdmFyIHByZXZpb3VzX2NvbXBvbmVudF9jb250ZXh0ID0gY29tcG9uZW50X2NvbnRleHQ7DQogICAgdmFyIHdhc191cGRhdGluZ19lZmZlY3QgPSBpc191cGRhdGluZ19lZmZlY3Q7DQogICAgYWN0aXZlX2VmZmVjdCA9IGVmZmVjdDI7DQogICAgaXNfdXBkYXRpbmdfZWZmZWN0ID0gdHJ1ZTsNCiAgICB0cnkgew0KICAgICAgaWYgKChmbGFncyAmIEJMT0NLX0VGRkVDVCkgIT09IDApIHsNCiAgICAgICAgZGVzdHJveV9ibG9ja19lZmZlY3RfY2hpbGRyZW4oZWZmZWN0Mik7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBkZXN0cm95X2VmZmVjdF9jaGlsZHJlbihlZmZlY3QyKTsNCiAgICAgIH0NCiAgICAgIGV4ZWN1dGVfZWZmZWN0X3RlYXJkb3duKGVmZmVjdDIpOw0KICAgICAgdmFyIHRlYXJkb3duMiA9IHVwZGF0ZV9yZWFjdGlvbihlZmZlY3QyKTsNCiAgICAgIGVmZmVjdDIudGVhcmRvd24gPSB0eXBlb2YgdGVhcmRvd24yID09PSAnZnVuY3Rpb24nID8gdGVhcmRvd24yIDogbnVsbDsNCiAgICAgIGVmZmVjdDIud3YgPSB3cml0ZV92ZXJzaW9uOw0KICAgICAgdmFyIGRlcHMgPSBlZmZlY3QyLmRlcHM7DQogICAgICB2YXIgZGVwOw0KICAgICAgaWYgKA0KICAgICAgICBERVYgJiYNCiAgICAgICAgdHJhY2luZ19tb2RlX2ZsYWcgJiYNCiAgICAgICAgKGVmZmVjdDIuZiAmIERJUlRZKSAhPT0gMCAmJg0KICAgICAgICBkZXBzICE9PSBudWxsDQogICAgICApOw0KICAgICAgaWYgKERFVik7DQogICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgIGhhbmRsZV9lcnJvcigNCiAgICAgICAgZXJyb3IsDQogICAgICAgIGVmZmVjdDIsDQogICAgICAgIHByZXZpb3VzX2VmZmVjdCwNCiAgICAgICAgcHJldmlvdXNfY29tcG9uZW50X2NvbnRleHQgfHwgZWZmZWN0Mi5jdHgsDQogICAgICApOw0KICAgIH0gZmluYWxseSB7DQogICAgICBpc191cGRhdGluZ19lZmZlY3QgPSB3YXNfdXBkYXRpbmdfZWZmZWN0Ow0KICAgICAgYWN0aXZlX2VmZmVjdCA9IHByZXZpb3VzX2VmZmVjdDsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gaW5maW5pdGVfbG9vcF9ndWFyZCgpIHsNCiAgICB0cnkgew0KICAgICAgZWZmZWN0X3VwZGF0ZV9kZXB0aF9leGNlZWRlZCgpOw0KICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICBpZiAobGFzdF9zY2hlZHVsZWRfZWZmZWN0ICE9PSBudWxsKSB7DQogICAgICAgIHsNCiAgICAgICAgICBoYW5kbGVfZXJyb3IoZXJyb3IsIGxhc3Rfc2NoZWR1bGVkX2VmZmVjdCwgbnVsbCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRocm93IGVycm9yOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBmbHVzaF9xdWV1ZWRfcm9vdF9lZmZlY3RzKCkgew0KICAgIHZhciB3YXNfdXBkYXRpbmdfZWZmZWN0ID0gaXNfdXBkYXRpbmdfZWZmZWN0Ow0KICAgIHRyeSB7DQogICAgICB2YXIgZmx1c2hfY291bnQgPSAwOw0KICAgICAgaXNfdXBkYXRpbmdfZWZmZWN0ID0gdHJ1ZTsNCiAgICAgIHdoaWxlIChxdWV1ZWRfcm9vdF9lZmZlY3RzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgaWYgKGZsdXNoX2NvdW50KysgPiAxZTMpIHsNCiAgICAgICAgICBpbmZpbml0ZV9sb29wX2d1YXJkKCk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHJvb3RfZWZmZWN0cyA9IHF1ZXVlZF9yb290X2VmZmVjdHM7DQogICAgICAgIHZhciBsZW5ndGggPSByb290X2VmZmVjdHMubGVuZ3RoOw0KICAgICAgICBxdWV1ZWRfcm9vdF9lZmZlY3RzID0gW107DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB2YXIgY29sbGVjdGVkX2VmZmVjdHMgPSBwcm9jZXNzX2VmZmVjdHMocm9vdF9lZmZlY3RzW2ldKTsNCiAgICAgICAgICBmbHVzaF9xdWV1ZWRfZWZmZWN0cyhjb2xsZWN0ZWRfZWZmZWN0cyk7DQogICAgICAgIH0NCiAgICAgICAgb2xkX3ZhbHVlcy5jbGVhcigpOw0KICAgICAgfQ0KICAgIH0gZmluYWxseSB7DQogICAgICBpc19mbHVzaGluZyA9IGZhbHNlOw0KICAgICAgaXNfdXBkYXRpbmdfZWZmZWN0ID0gd2FzX3VwZGF0aW5nX2VmZmVjdDsNCiAgICAgIGxhc3Rfc2NoZWR1bGVkX2VmZmVjdCA9IG51bGw7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIGZsdXNoX3F1ZXVlZF9lZmZlY3RzKGVmZmVjdHMpIHsNCiAgICB2YXIgbGVuZ3RoID0gZWZmZWN0cy5sZW5ndGg7DQogICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgIHZhciBlZmZlY3QyID0gZWZmZWN0c1tpXTsNCiAgICAgIGlmICgoZWZmZWN0Mi5mICYgKERFU1RST1lFRCB8IElORVJUKSkgPT09IDApIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICBpZiAoY2hlY2tfZGlydGluZXNzKGVmZmVjdDIpKSB7DQogICAgICAgICAgICB1cGRhdGVfZWZmZWN0KGVmZmVjdDIpOw0KICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICBlZmZlY3QyLmRlcHMgPT09IG51bGwgJiYNCiAgICAgICAgICAgICAgZWZmZWN0Mi5maXJzdCA9PT0gbnVsbCAmJg0KICAgICAgICAgICAgICBlZmZlY3QyLm5vZGVzX3N0YXJ0ID09PSBudWxsDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgaWYgKGVmZmVjdDIudGVhcmRvd24gPT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICB1bmxpbmtfZWZmZWN0KGVmZmVjdDIpOw0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGVmZmVjdDIuZm4gPSBudWxsOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICAgIGhhbmRsZV9lcnJvcihlcnJvciwgZWZmZWN0MiwgbnVsbCwgZWZmZWN0Mi5jdHgpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHNjaGVkdWxlX2VmZmVjdChzaWduYWwpIHsNCiAgICBpZiAoIWlzX2ZsdXNoaW5nKSB7DQogICAgICBpc19mbHVzaGluZyA9IHRydWU7DQogICAgICBxdWV1ZU1pY3JvdGFzayhmbHVzaF9xdWV1ZWRfcm9vdF9lZmZlY3RzKTsNCiAgICB9DQogICAgdmFyIGVmZmVjdDIgPSAobGFzdF9zY2hlZHVsZWRfZWZmZWN0ID0gc2lnbmFsKTsNCiAgICB3aGlsZSAoZWZmZWN0Mi5wYXJlbnQgIT09IG51bGwpIHsNCiAgICAgIGVmZmVjdDIgPSBlZmZlY3QyLnBhcmVudDsNCiAgICAgIHZhciBmbGFncyA9IGVmZmVjdDIuZjsNCiAgICAgIGlmICgoZmxhZ3MgJiAoUk9PVF9FRkZFQ1QgfCBCUkFOQ0hfRUZGRUNUKSkgIT09IDApIHsNCiAgICAgICAgaWYgKChmbGFncyAmIENMRUFOKSA9PT0gMCkgcmV0dXJuOw0KICAgICAgICBlZmZlY3QyLmYgXj0gQ0xFQU47DQogICAgICB9DQogICAgfQ0KICAgIHF1ZXVlZF9yb290X2VmZmVjdHMucHVzaChlZmZlY3QyKTsNCiAgfQ0KICBmdW5jdGlvbiBwcm9jZXNzX2VmZmVjdHMocm9vdDIpIHsNCiAgICB2YXIgZWZmZWN0cyA9IFtdOw0KICAgIHZhciBlZmZlY3QyID0gcm9vdDI7DQogICAgd2hpbGUgKGVmZmVjdDIgIT09IG51bGwpIHsNCiAgICAgIHZhciBmbGFncyA9IGVmZmVjdDIuZjsNCiAgICAgIHZhciBpc19icmFuY2ggPSAoZmxhZ3MgJiAoQlJBTkNIX0VGRkVDVCB8IFJPT1RfRUZGRUNUKSkgIT09IDA7DQogICAgICB2YXIgaXNfc2tpcHBhYmxlX2JyYW5jaCA9IGlzX2JyYW5jaCAmJiAoZmxhZ3MgJiBDTEVBTikgIT09IDA7DQogICAgICBpZiAoIWlzX3NraXBwYWJsZV9icmFuY2ggJiYgKGZsYWdzICYgSU5FUlQpID09PSAwKSB7DQogICAgICAgIGlmICgoZmxhZ3MgJiBFRkZFQ1QpICE9PSAwKSB7DQogICAgICAgICAgZWZmZWN0cy5wdXNoKGVmZmVjdDIpOw0KICAgICAgICB9IGVsc2UgaWYgKGlzX2JyYW5jaCkgew0KICAgICAgICAgIGVmZmVjdDIuZiBePSBDTEVBTjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB2YXIgcHJldmlvdXNfYWN0aXZlX3JlYWN0aW9uID0gYWN0aXZlX3JlYWN0aW9uOw0KICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICBhY3RpdmVfcmVhY3Rpb24gPSBlZmZlY3QyOw0KICAgICAgICAgICAgaWYgKGNoZWNrX2RpcnRpbmVzcyhlZmZlY3QyKSkgew0KICAgICAgICAgICAgICB1cGRhdGVfZWZmZWN0KGVmZmVjdDIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICBoYW5kbGVfZXJyb3IoZXJyb3IsIGVmZmVjdDIsIG51bGwsIGVmZmVjdDIuY3R4KTsNCiAgICAgICAgICB9IGZpbmFsbHkgew0KICAgICAgICAgICAgYWN0aXZlX3JlYWN0aW9uID0gcHJldmlvdXNfYWN0aXZlX3JlYWN0aW9uOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB2YXIgY2hpbGQyID0gZWZmZWN0Mi5maXJzdDsNCiAgICAgICAgaWYgKGNoaWxkMiAhPT0gbnVsbCkgew0KICAgICAgICAgIGVmZmVjdDIgPSBjaGlsZDI7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHZhciBwYXJlbnQgPSBlZmZlY3QyLnBhcmVudDsNCiAgICAgIGVmZmVjdDIgPSBlZmZlY3QyLm5leHQ7DQogICAgICB3aGlsZSAoZWZmZWN0MiA9PT0gbnVsbCAmJiBwYXJlbnQgIT09IG51bGwpIHsNCiAgICAgICAgZWZmZWN0MiA9IHBhcmVudC5uZXh0Ow0KICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Ow0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZWZmZWN0czsNCiAgfQ0KICBmdW5jdGlvbiBnZXQoc2lnbmFsKSB7DQogICAgdmFyIGZsYWdzID0gc2lnbmFsLmY7DQogICAgdmFyIGlzX2Rlcml2ZWQgPSAoZmxhZ3MgJiBERVJJVkVEKSAhPT0gMDsNCiAgICBpZiAoY2FwdHVyZWRfc2lnbmFscyAhPT0gbnVsbCkgew0KICAgICAgY2FwdHVyZWRfc2lnbmFscy5hZGQoc2lnbmFsKTsNCiAgICB9DQogICAgaWYgKGFjdGl2ZV9yZWFjdGlvbiAhPT0gbnVsbCAmJiAhdW50cmFja2luZykgew0KICAgICAgaWYgKA0KICAgICAgICAhKHJlYWN0aW9uX3NvdXJjZXMgPT0gbnVsbCA/IHZvaWQgMCA6IHJlYWN0aW9uX3NvdXJjZXMuaW5jbHVkZXMoc2lnbmFsKSkNCiAgICAgICkgew0KICAgICAgICB2YXIgZGVwcyA9IGFjdGl2ZV9yZWFjdGlvbi5kZXBzOw0KICAgICAgICBpZiAoc2lnbmFsLnJ2IDwgcmVhZF92ZXJzaW9uKSB7DQogICAgICAgICAgc2lnbmFsLnJ2ID0gcmVhZF92ZXJzaW9uOw0KICAgICAgICAgIGlmICgNCiAgICAgICAgICAgIG5ld19kZXBzID09PSBudWxsICYmDQogICAgICAgICAgICBkZXBzICE9PSBudWxsICYmDQogICAgICAgICAgICBkZXBzW3NraXBwZWRfZGVwc10gPT09IHNpZ25hbA0KICAgICAgICAgICkgew0KICAgICAgICAgICAgc2tpcHBlZF9kZXBzKys7DQogICAgICAgICAgfSBlbHNlIGlmIChuZXdfZGVwcyA9PT0gbnVsbCkgew0KICAgICAgICAgICAgbmV3X2RlcHMgPSBbc2lnbmFsXTsNCiAgICAgICAgICB9IGVsc2UgaWYgKCFza2lwX3JlYWN0aW9uIHx8ICFuZXdfZGVwcy5pbmNsdWRlcyhzaWduYWwpKSB7DQogICAgICAgICAgICBuZXdfZGVwcy5wdXNoKHNpZ25hbCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlIGlmICgNCiAgICAgIGlzX2Rlcml2ZWQgJiYNCiAgICAgIC8qKiBAdHlwZSB7RGVyaXZlZH0gKi8NCiAgICAgIHNpZ25hbC5kZXBzID09PSBudWxsICYmDQogICAgICAvKiogQHR5cGUge0Rlcml2ZWR9ICovDQogICAgICBzaWduYWwuZWZmZWN0cyA9PT0gbnVsbA0KICAgICkgew0KICAgICAgdmFyIGRlcml2ZWQyID0NCiAgICAgICAgLyoqIEB0eXBlIHtEZXJpdmVkfSAqLw0KICAgICAgICBzaWduYWw7DQogICAgICB2YXIgcGFyZW50ID0gZGVyaXZlZDIucGFyZW50Ow0KICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCAmJiAocGFyZW50LmYgJiBVTk9XTkVEKSA9PT0gMCkgew0KICAgICAgICBkZXJpdmVkMi5mIF49IFVOT1dORUQ7DQogICAgICB9DQogICAgfQ0KICAgIGlmIChpc19kZXJpdmVkKSB7DQogICAgICBkZXJpdmVkMiA9IC8qKiBAdHlwZSB7RGVyaXZlZH0gKi8gc2lnbmFsOw0KICAgICAgaWYgKGNoZWNrX2RpcnRpbmVzcyhkZXJpdmVkMikpIHsNCiAgICAgICAgdXBkYXRlX2Rlcml2ZWQoZGVyaXZlZDIpOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNfZGVzdHJveWluZ19lZmZlY3QgJiYgb2xkX3ZhbHVlcy5oYXMoc2lnbmFsKSkgew0KICAgICAgcmV0dXJuIG9sZF92YWx1ZXMuZ2V0KHNpZ25hbCk7DQogICAgfQ0KICAgIHJldHVybiBzaWduYWwudjsNCiAgfQ0KICBmdW5jdGlvbiBjYXB0dXJlX3NpZ25hbHMoZm4pIHsNCiAgICB2YXIgcHJldmlvdXNfY2FwdHVyZWRfc2lnbmFscyA9IGNhcHR1cmVkX3NpZ25hbHM7DQogICAgY2FwdHVyZWRfc2lnbmFscyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7DQogICAgdmFyIGNhcHR1cmVkID0gY2FwdHVyZWRfc2lnbmFsczsNCiAgICB2YXIgc2lnbmFsOw0KICAgIHRyeSB7DQogICAgICB1bnRyYWNrKGZuKTsNCiAgICAgIGlmIChwcmV2aW91c19jYXB0dXJlZF9zaWduYWxzICE9PSBudWxsKSB7DQogICAgICAgIGZvciAoc2lnbmFsIG9mIGNhcHR1cmVkX3NpZ25hbHMpIHsNCiAgICAgICAgICBwcmV2aW91c19jYXB0dXJlZF9zaWduYWxzLmFkZChzaWduYWwpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBmaW5hbGx5IHsNCiAgICAgIGNhcHR1cmVkX3NpZ25hbHMgPSBwcmV2aW91c19jYXB0dXJlZF9zaWduYWxzOw0KICAgIH0NCiAgICByZXR1cm4gY2FwdHVyZWQ7DQogIH0NCiAgZnVuY3Rpb24gaW52YWxpZGF0ZV9pbm5lcl9zaWduYWxzKGZuKSB7DQogICAgdmFyIGNhcHR1cmVkID0gY2FwdHVyZV9zaWduYWxzKCgpID0+IHVudHJhY2soZm4pKTsNCiAgICBmb3IgKHZhciBzaWduYWwgb2YgY2FwdHVyZWQpIHsNCiAgICAgIGlmICgoc2lnbmFsLmYgJiBMRUdBQ1lfREVSSVZFRF9QUk9QKSAhPT0gMCkgew0KICAgICAgICAvKiogQHR5cGUge0Rlcml2ZWR9ICovDQogICAgICAgIGZvciAoY29uc3QgZGVwIG9mIHNpZ25hbC5kZXBzIHx8IFtdKSB7DQogICAgICAgICAgaWYgKChkZXAuZiAmIERFUklWRUQpID09PSAwKSB7DQogICAgICAgICAgICBpbnRlcm5hbF9zZXQoZGVwLCBkZXAudik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBpbnRlcm5hbF9zZXQoc2lnbmFsLCBzaWduYWwudik7DQogICAgICB9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHVudHJhY2soZm4pIHsNCiAgICB2YXIgcHJldmlvdXNfdW50cmFja2luZyA9IHVudHJhY2tpbmc7DQogICAgdHJ5IHsNCiAgICAgIHVudHJhY2tpbmcgPSB0cnVlOw0KICAgICAgcmV0dXJuIGZuKCk7DQogICAgfSBmaW5hbGx5IHsNCiAgICAgIHVudHJhY2tpbmcgPSBwcmV2aW91c191bnRyYWNraW5nOw0KICAgIH0NCiAgfQ0KICBjb25zdCBTVEFUVVNfTUFTSyA9IC03MTY5Ow0KICBmdW5jdGlvbiBzZXRfc2lnbmFsX3N0YXR1cyhzaWduYWwsIHN0YXR1cykgew0KICAgIHNpZ25hbC5mID0gKHNpZ25hbC5mICYgU1RBVFVTX01BU0spIHwgc3RhdHVzOw0KICB9DQogIGZ1bmN0aW9uIGRlZXBfcmVhZF9zdGF0ZSh2YWx1ZSkgew0KICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICF2YWx1ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSB7DQogICAgICByZXR1cm47DQogICAgfQ0KICAgIGlmIChTVEFURV9TWU1CT0wgaW4gdmFsdWUpIHsNCiAgICAgIGRlZXBfcmVhZCh2YWx1ZSk7DQogICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsNCiAgICAgIGZvciAobGV0IGtleSBpbiB2YWx1ZSkgew0KICAgICAgICBjb25zdCBwcm9wID0gdmFsdWVba2V5XTsNCiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnb2JqZWN0JyAmJiBwcm9wICYmIFNUQVRFX1NZTUJPTCBpbiBwcm9wKSB7DQogICAgICAgICAgZGVlcF9yZWFkKHByb3ApOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIGRlZXBfcmVhZCh2YWx1ZSwgdmlzaXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHsNCiAgICBpZiAoDQogICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmDQogICAgICB2YWx1ZSAhPT0gbnVsbCAmJiAvLyBXZSBkb24ndCB3YW50IHRvIHRyYXZlcnNlIERPTSBlbGVtZW50cw0KICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSAmJg0KICAgICAgIXZpc2l0ZWQuaGFzKHZhbHVlKQ0KICAgICkgew0KICAgICAgdmlzaXRlZC5hZGQodmFsdWUpOw0KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgew0KICAgICAgICB2YWx1ZS5nZXRUaW1lKCk7DQogICAgICB9DQogICAgICBmb3IgKGxldCBrZXkgaW4gdmFsdWUpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICBkZWVwX3JlYWQodmFsdWVba2V5XSwgdmlzaXRlZCk7DQogICAgICAgIH0gY2F0Y2ggKGUpIHt9DQogICAgICB9DQogICAgICBjb25zdCBwcm90byA9IGdldF9wcm90b3R5cGVfb2YodmFsdWUpOw0KICAgICAgaWYgKA0KICAgICAgICBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJg0KICAgICAgICBwcm90byAhPT0gQXJyYXkucHJvdG90eXBlICYmDQogICAgICAgIHByb3RvICE9PSBNYXAucHJvdG90eXBlICYmDQogICAgICAgIHByb3RvICE9PSBTZXQucHJvdG90eXBlICYmDQogICAgICAgIHByb3RvICE9PSBEYXRlLnByb3RvdHlwZQ0KICAgICAgKSB7DQogICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gZ2V0X2Rlc2NyaXB0b3JzKHByb3RvKTsNCiAgICAgICAgZm9yIChsZXQga2V5IGluIGRlc2NyaXB0b3JzKSB7DQogICAgICAgICAgY29uc3QgZ2V0MiA9IGRlc2NyaXB0b3JzW2tleV0uZ2V0Ow0KICAgICAgICAgIGlmIChnZXQyKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICBnZXQyLmNhbGwodmFsdWUpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZSkge30NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCiAgY29uc3QgUEFTU0lWRV9FVkVOVFMgPSBbJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJ107DQogIGZ1bmN0aW9uIGlzX3Bhc3NpdmVfZXZlbnQobmFtZSkgew0KICAgIHJldHVybiBQQVNTSVZFX0VWRU5UUy5pbmNsdWRlcyhuYW1lKTsNCiAgfQ0KICBsZXQgbGlzdGVuaW5nX3RvX2Zvcm1fcmVzZXQgPSBmYWxzZTsNCiAgZnVuY3Rpb24gYWRkX2Zvcm1fcmVzZXRfbGlzdGVuZXIoKSB7DQogICAgaWYgKCFsaXN0ZW5pbmdfdG9fZm9ybV9yZXNldCkgew0KICAgICAgbGlzdGVuaW5nX3RvX2Zvcm1fcmVzZXQgPSB0cnVlOw0KICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigNCiAgICAgICAgJ3Jlc2V0JywNCiAgICAgICAgKGV2dCkgPT4gew0KICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgdmFyIF9hMjsNCiAgICAgICAgICAgIGlmICghZXZ0LmRlZmF1bHRQcmV2ZW50ZWQpIHsNCiAgICAgICAgICAgICAgLyoqQHR5cGUge0hUTUxGb3JtRWxlbWVudH0gKi8NCiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGV2dC50YXJnZXQuZWxlbWVudHMpIHsNCiAgICAgICAgICAgICAgICAoX2EyID0gZS5fX29uX3IpID09IG51bGwgPyB2b2lkIDAgOiBfYTIuY2FsbChlKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pOw0KICAgICAgICB9LA0KICAgICAgICAvLyBJbiB0aGUgY2FwdHVyZSBwaGFzZSB0byBndWFyYW50ZWUgd2UgZ2V0IG5vdGljZWQgb2YgaXQgKG5vIHBvc3NpYmxpdHkgb2Ygc3RvcFByb3BhZ2F0aW9uKQ0KICAgICAgICB7IGNhcHR1cmU6IHRydWUgfSwNCiAgICAgICk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHdpdGhvdXRfcmVhY3RpdmVfY29udGV4dChmbikgew0KICAgIHZhciBwcmV2aW91c19yZWFjdGlvbiA9IGFjdGl2ZV9yZWFjdGlvbjsNCiAgICB2YXIgcHJldmlvdXNfZWZmZWN0ID0gYWN0aXZlX2VmZmVjdDsNCiAgICBzZXRfYWN0aXZlX3JlYWN0aW9uKG51bGwpOw0KICAgIHNldF9hY3RpdmVfZWZmZWN0KG51bGwpOw0KICAgIHRyeSB7DQogICAgICByZXR1cm4gZm4oKTsNCiAgICB9IGZpbmFsbHkgew0KICAgICAgc2V0X2FjdGl2ZV9yZWFjdGlvbihwcmV2aW91c19yZWFjdGlvbik7DQogICAgICBzZXRfYWN0aXZlX2VmZmVjdChwcmV2aW91c19lZmZlY3QpOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBsaXN0ZW5fdG9fZXZlbnRfYW5kX3Jlc2V0X2V2ZW50KA0KICAgIGVsZW1lbnQsDQogICAgZXZlbnQyLA0KICAgIGhhbmRsZXIsDQogICAgb25fcmVzZXQgPSBoYW5kbGVyLA0KICApIHsNCiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQyLCAoKSA9PiB3aXRob3V0X3JlYWN0aXZlX2NvbnRleHQoaGFuZGxlcikpOw0KICAgIGNvbnN0IHByZXYgPSBlbGVtZW50Ll9fb25fcjsNCiAgICBpZiAocHJldikgew0KICAgICAgZWxlbWVudC5fX29uX3IgPSAoKSA9PiB7DQogICAgICAgIHByZXYoKTsNCiAgICAgICAgb25fcmVzZXQodHJ1ZSk7DQogICAgICB9Ow0KICAgIH0gZWxzZSB7DQogICAgICBlbGVtZW50Ll9fb25fciA9ICgpID0+IG9uX3Jlc2V0KHRydWUpOw0KICAgIH0NCiAgICBhZGRfZm9ybV9yZXNldF9saXN0ZW5lcigpOw0KICB9DQogIGNvbnN0IGFsbF9yZWdpc3RlcmVkX2V2ZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7DQogIGNvbnN0IHJvb3RfZXZlbnRfaGFuZGxlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7DQogIGZ1bmN0aW9uIGNyZWF0ZV9ldmVudChldmVudF9uYW1lLCBkb20sIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkgew0KICAgIGZ1bmN0aW9uIHRhcmdldF9oYW5kbGVyKGV2ZW50Mikgew0KICAgICAgaWYgKCFvcHRpb25zLmNhcHR1cmUpIHsNCiAgICAgICAgaGFuZGxlX2V2ZW50X3Byb3BhZ2F0aW9uLmNhbGwoZG9tLCBldmVudDIpOw0KICAgICAgfQ0KICAgICAgaWYgKCFldmVudDIuY2FuY2VsQnViYmxlKSB7DQogICAgICAgIHJldHVybiB3aXRob3V0X3JlYWN0aXZlX2NvbnRleHQoKCkgPT4gew0KICAgICAgICAgIHJldHVybiBoYW5kbGVyID09IG51bGwgPyB2b2lkIDAgOiBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQyKTsNCiAgICAgICAgfSk7DQogICAgICB9DQogICAgfQ0KICAgIGlmICgNCiAgICAgIGV2ZW50X25hbWUuc3RhcnRzV2l0aCgncG9pbnRlcicpIHx8DQogICAgICBldmVudF9uYW1lLnN0YXJ0c1dpdGgoJ3RvdWNoJykgfHwNCiAgICAgIGV2ZW50X25hbWUgPT09ICd3aGVlbCcNCiAgICApIHsNCiAgICAgIHF1ZXVlX21pY3JvX3Rhc2soKCkgPT4gew0KICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcihldmVudF9uYW1lLCB0YXJnZXRfaGFuZGxlciwgb3B0aW9ucyk7DQogICAgICB9KTsNCiAgICB9IGVsc2Ugew0KICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRfbmFtZSwgdGFyZ2V0X2hhbmRsZXIsIG9wdGlvbnMpOw0KICAgIH0NCiAgICByZXR1cm4gdGFyZ2V0X2hhbmRsZXI7DQogIH0NCiAgZnVuY3Rpb24gZXZlbnQoZXZlbnRfbmFtZSwgZG9tLCBoYW5kbGVyLCBjYXB0dXJlLCBwYXNzaXZlKSB7DQogICAgdmFyIG9wdGlvbnMgPSB7IGNhcHR1cmUsIHBhc3NpdmUgfTsNCiAgICB2YXIgdGFyZ2V0X2hhbmRsZXIgPSBjcmVhdGVfZXZlbnQoZXZlbnRfbmFtZSwgZG9tLCBoYW5kbGVyLCBvcHRpb25zKTsNCiAgICBpZiAoZG9tID09PSBkb2N1bWVudC5ib2R5IHx8IGRvbSA9PT0gd2luZG93IHx8IGRvbSA9PT0gZG9jdW1lbnQpIHsNCiAgICAgIHRlYXJkb3duKCgpID0+IHsNCiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRfbmFtZSwgdGFyZ2V0X2hhbmRsZXIsIG9wdGlvbnMpOw0KICAgICAgfSk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIGhhbmRsZV9ldmVudF9wcm9wYWdhdGlvbihldmVudDIpIHsNCiAgICB2YXIgX2EyOw0KICAgIHZhciBoYW5kbGVyX2VsZW1lbnQgPSB0aGlzOw0KICAgIHZhciBvd25lcl9kb2N1bWVudCA9DQogICAgICAvKiogQHR5cGUge05vZGV9ICovDQogICAgICBoYW5kbGVyX2VsZW1lbnQub3duZXJEb2N1bWVudDsNCiAgICB2YXIgZXZlbnRfbmFtZSA9IGV2ZW50Mi50eXBlOw0KICAgIHZhciBwYXRoID0NCiAgICAgICgoX2EyID0gZXZlbnQyLmNvbXBvc2VkUGF0aCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5jYWxsKGV2ZW50MikpIHx8IFtdOw0KICAgIHZhciBjdXJyZW50X3RhcmdldCA9DQogICAgICAvKiogQHR5cGUge251bGwgfCBFbGVtZW50fSAqLw0KICAgICAgcGF0aFswXSB8fCBldmVudDIudGFyZ2V0Ow0KICAgIHZhciBwYXRoX2lkeCA9IDA7DQogICAgdmFyIGhhbmRsZWRfYXQgPSBldmVudDIuX19yb290Ow0KICAgIGlmIChoYW5kbGVkX2F0KSB7DQogICAgICB2YXIgYXRfaWR4ID0gcGF0aC5pbmRleE9mKGhhbmRsZWRfYXQpOw0KICAgICAgaWYgKA0KICAgICAgICBhdF9pZHggIT09IC0xICYmDQogICAgICAgIChoYW5kbGVyX2VsZW1lbnQgPT09IGRvY3VtZW50IHx8DQogICAgICAgICAgaGFuZGxlcl9lbGVtZW50ID09PSAvKiogQHR5cGUge2FueX0gKi8gd2luZG93KQ0KICAgICAgKSB7DQogICAgICAgIGV2ZW50Mi5fX3Jvb3QgPSBoYW5kbGVyX2VsZW1lbnQ7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIHZhciBoYW5kbGVyX2lkeCA9IHBhdGguaW5kZXhPZihoYW5kbGVyX2VsZW1lbnQpOw0KICAgICAgaWYgKGhhbmRsZXJfaWR4ID09PSAtMSkgew0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBpZiAoYXRfaWR4IDw9IGhhbmRsZXJfaWR4KSB7DQogICAgICAgIHBhdGhfaWR4ID0gYXRfaWR4Ow0KICAgICAgfQ0KICAgIH0NCiAgICBjdXJyZW50X3RhcmdldCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gcGF0aFtwYXRoX2lkeF0gfHwgZXZlbnQyLnRhcmdldDsNCiAgICBpZiAoY3VycmVudF90YXJnZXQgPT09IGhhbmRsZXJfZWxlbWVudCkgcmV0dXJuOw0KICAgIGRlZmluZV9wcm9wZXJ0eShldmVudDIsICdjdXJyZW50VGFyZ2V0Jywgew0KICAgICAgY29uZmlndXJhYmxlOiB0cnVlLA0KICAgICAgZ2V0KCkgew0KICAgICAgICByZXR1cm4gY3VycmVudF90YXJnZXQgfHwgb3duZXJfZG9jdW1lbnQ7DQogICAgICB9LA0KICAgIH0pOw0KICAgIHZhciBwcmV2aW91c19yZWFjdGlvbiA9IGFjdGl2ZV9yZWFjdGlvbjsNCiAgICB2YXIgcHJldmlvdXNfZWZmZWN0ID0gYWN0aXZlX2VmZmVjdDsNCiAgICBzZXRfYWN0aXZlX3JlYWN0aW9uKG51bGwpOw0KICAgIHNldF9hY3RpdmVfZWZmZWN0KG51bGwpOw0KICAgIHRyeSB7DQogICAgICB2YXIgdGhyb3dfZXJyb3I7DQogICAgICB2YXIgb3RoZXJfZXJyb3JzID0gW107DQogICAgICB3aGlsZSAoY3VycmVudF90YXJnZXQgIT09IG51bGwpIHsNCiAgICAgICAgdmFyIHBhcmVudF9lbGVtZW50ID0NCiAgICAgICAgICBjdXJyZW50X3RhcmdldC5hc3NpZ25lZFNsb3QgfHwNCiAgICAgICAgICBjdXJyZW50X3RhcmdldC5wYXJlbnROb2RlIHx8DQogICAgICAgICAgLyoqIEB0eXBlIHthbnl9ICovDQogICAgICAgICAgY3VycmVudF90YXJnZXQuaG9zdCB8fA0KICAgICAgICAgIG51bGw7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgdmFyIGRlbGVnYXRlZCA9IGN1cnJlbnRfdGFyZ2V0WydfXycgKyBldmVudF9uYW1lXTsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICBkZWxlZ2F0ZWQgIT0gbnVsbCAmJg0KICAgICAgICAgICAgKCEoLyoqIEB0eXBlIHthbnl9ICovIGN1cnJlbnRfdGFyZ2V0LmRpc2FibGVkKSB8fCAvLyBET00gY291bGQndmUgYmVlbiB1cGRhdGVkIGFscmVhZHkgYnkgdGhlIHRpbWUgdGhpcyBpcyByZWFjaGVkLCBzbyB3ZSBjaGVjayB0aGlzIGFzIHdlbGwNCiAgICAgICAgICAgICAgLy8gLT4gdGhlIHRhcmdldCBjb3VsZCBub3QgaGF2ZSBiZWVuIGRpc2FibGVkIGJlY2F1c2UgaXQgZW1pdHMgdGhlIGV2ZW50IGluIHRoZSBmaXJzdCBwbGFjZQ0KICAgICAgICAgICAgICBldmVudDIudGFyZ2V0ID09PSBjdXJyZW50X3RhcmdldCkNCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIGlmIChpc19hcnJheShkZWxlZ2F0ZWQpKSB7DQogICAgICAgICAgICAgIHZhciBbZm4sIC4uLmRhdGFdID0gZGVsZWdhdGVkOw0KICAgICAgICAgICAgICBmbi5hcHBseShjdXJyZW50X3RhcmdldCwgW2V2ZW50MiwgLi4uZGF0YV0pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgZGVsZWdhdGVkLmNhbGwoY3VycmVudF90YXJnZXQsIGV2ZW50Mik7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICAgIGlmICh0aHJvd19lcnJvcikgew0KICAgICAgICAgICAgb3RoZXJfZXJyb3JzLnB1c2goZXJyb3IpOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aHJvd19lcnJvciA9IGVycm9yOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoDQogICAgICAgICAgZXZlbnQyLmNhbmNlbEJ1YmJsZSB8fA0KICAgICAgICAgIHBhcmVudF9lbGVtZW50ID09PSBoYW5kbGVyX2VsZW1lbnQgfHwNCiAgICAgICAgICBwYXJlbnRfZWxlbWVudCA9PT0gbnVsbA0KICAgICAgICApIHsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICBjdXJyZW50X3RhcmdldCA9IHBhcmVudF9lbGVtZW50Ow0KICAgICAgfQ0KICAgICAgaWYgKHRocm93X2Vycm9yKSB7DQogICAgICAgIGZvciAobGV0IGVycm9yIG9mIG90aGVyX2Vycm9ycykgew0KICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHsNCiAgICAgICAgICAgIHRocm93IGVycm9yOw0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIHRocm93IHRocm93X2Vycm9yOw0KICAgICAgfQ0KICAgIH0gZmluYWxseSB7DQogICAgICBldmVudDIuX19yb290ID0gaGFuZGxlcl9lbGVtZW50Ow0KICAgICAgZGVsZXRlIGV2ZW50Mi5jdXJyZW50VGFyZ2V0Ow0KICAgICAgc2V0X2FjdGl2ZV9yZWFjdGlvbihwcmV2aW91c19yZWFjdGlvbik7DQogICAgICBzZXRfYWN0aXZlX2VmZmVjdChwcmV2aW91c19lZmZlY3QpOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnRfZnJvbV9odG1sKGh0bWwpIHsNCiAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7DQogICAgZWxlbS5pbm5lckhUTUwgPSBodG1sOw0KICAgIHJldHVybiBlbGVtLmNvbnRlbnQ7DQogIH0NCiAgZnVuY3Rpb24gYXNzaWduX25vZGVzKHN0YXJ0LCBlbmQpIHsNCiAgICB2YXIgZWZmZWN0MiA9DQogICAgICAvKiogQHR5cGUge0VmZmVjdH0gKi8NCiAgICAgIGFjdGl2ZV9lZmZlY3Q7DQogICAgaWYgKGVmZmVjdDIubm9kZXNfc3RhcnQgPT09IG51bGwpIHsNCiAgICAgIGVmZmVjdDIubm9kZXNfc3RhcnQgPSBzdGFydDsNCiAgICAgIGVmZmVjdDIubm9kZXNfZW5kID0gZW5kOw0KICAgIH0NCiAgfQ0KICAvLyBAX19OT19TSURFX0VGRkVDVFNfXw0KICBmdW5jdGlvbiB0ZW1wbGF0ZShjb250ZW50LCBmbGFncykgew0KICAgIHZhciBpc19mcmFnbWVudCA9IChmbGFncyAmIFRFTVBMQVRFX0ZSQUdNRU5UKSAhPT0gMDsNCiAgICB2YXIgdXNlX2ltcG9ydF9ub2RlID0gKGZsYWdzICYgVEVNUExBVEVfVVNFX0lNUE9SVF9OT0RFKSAhPT0gMDsNCiAgICB2YXIgbm9kZTsNCiAgICB2YXIgaGFzX3N0YXJ0ID0gIWNvbnRlbnQuc3RhcnRzV2l0aCgnPCE+Jyk7DQogICAgcmV0dXJuICgpID0+IHsNCiAgICAgIGlmIChub2RlID09PSB2b2lkIDApIHsNCiAgICAgICAgbm9kZSA9IGNyZWF0ZV9mcmFnbWVudF9mcm9tX2h0bWwoaGFzX3N0YXJ0ID8gY29udGVudCA6ICc8IT4nICsgY29udGVudCk7DQogICAgICAgIGlmICghaXNfZnJhZ21lbnQpDQogICAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gLyogQF9fUFVSRV9fICovIGdldF9maXJzdF9jaGlsZChub2RlKTsNCiAgICAgIH0NCiAgICAgIHZhciBjbG9uZSA9DQogICAgICAgIC8qKiBAdHlwZSB7VGVtcGxhdGVOb2RlfSAqLw0KICAgICAgICB1c2VfaW1wb3J0X25vZGUgfHwgaXNfZmlyZWZveA0KICAgICAgICAgID8gZG9jdW1lbnQuaW1wb3J0Tm9kZShub2RlLCB0cnVlKQ0KICAgICAgICAgIDogbm9kZS5jbG9uZU5vZGUodHJ1ZSk7DQogICAgICBpZiAoaXNfZnJhZ21lbnQpIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0NCiAgICAgICAgICAvKiogQHR5cGUge1RlbXBsYXRlTm9kZX0gKi8NCiAgICAgICAgICAvKiBAX19QVVJFX18gKi8gZ2V0X2ZpcnN0X2NoaWxkKGNsb25lKTsNCiAgICAgICAgdmFyIGVuZCA9DQogICAgICAgICAgLyoqIEB0eXBlIHtUZW1wbGF0ZU5vZGV9ICovDQogICAgICAgICAgY2xvbmUubGFzdENoaWxkOw0KICAgICAgICBhc3NpZ25fbm9kZXMoc3RhcnQsIGVuZCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBhc3NpZ25fbm9kZXMoY2xvbmUsIGNsb25lKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBjbG9uZTsNCiAgICB9Ow0KICB9DQogIGZ1bmN0aW9uIGNvbW1lbnQoKSB7DQogICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQogICAgdmFyIHN0YXJ0ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnJyk7DQogICAgdmFyIGFuY2hvciA9IGNyZWF0ZV90ZXh0KCk7DQogICAgZnJhZy5hcHBlbmQoc3RhcnQsIGFuY2hvcik7DQogICAgYXNzaWduX25vZGVzKHN0YXJ0LCBhbmNob3IpOw0KICAgIHJldHVybiBmcmFnOw0KICB9DQogIGZ1bmN0aW9uIGFwcGVuZChhbmNob3IsIGRvbSkgew0KICAgIGlmIChhbmNob3IgPT09IG51bGwpIHsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgYW5jaG9yLmJlZm9yZSgNCiAgICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi8NCiAgICAgIGRvbSwNCiAgICApOw0KICB9DQogIGxldCBzaG91bGRfaW50cm8gPSB0cnVlOw0KICBmdW5jdGlvbiBzZXRfdGV4dCh0ZXh0LCB2YWx1ZSkgew0KICAgIHZhciBzdHIgPQ0KICAgICAgdmFsdWUgPT0gbnVsbCA/ICcnIDogdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlICsgJycgOiB2YWx1ZTsNCiAgICBpZiAoc3RyICE9PSAodGV4dC5fX3QgPz8gKHRleHQuX190ID0gdGV4dC5ub2RlVmFsdWUpKSkgew0KICAgICAgdGV4dC5fX3QgPSBzdHI7DQogICAgICB0ZXh0Lm5vZGVWYWx1ZSA9IHN0ciArICcnOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBtb3VudChjb21wb25lbnQsIG9wdGlvbnMpIHsNCiAgICByZXR1cm4gX21vdW50KGNvbXBvbmVudCwgb3B0aW9ucyk7DQogIH0NCiAgY29uc3QgZG9jdW1lbnRfbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsNCiAgZnVuY3Rpb24gX21vdW50KA0KICAgIENvbXBvbmVudCwNCiAgICB7IHRhcmdldCwgYW5jaG9yLCBwcm9wcyA9IHt9LCBldmVudHMsIGNvbnRleHQsIGludHJvID0gdHJ1ZSB9LA0KICApIHsNCiAgICBpbml0X29wZXJhdGlvbnMoKTsNCiAgICB2YXIgcmVnaXN0ZXJlZF9ldmVudHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOw0KICAgIHZhciBldmVudF9oYW5kbGUgPSAoZXZlbnRzMikgPT4gew0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBldmVudF9uYW1lID0gZXZlbnRzMltpXTsNCiAgICAgICAgaWYgKHJlZ2lzdGVyZWRfZXZlbnRzLmhhcyhldmVudF9uYW1lKSkgY29udGludWU7DQogICAgICAgIHJlZ2lzdGVyZWRfZXZlbnRzLmFkZChldmVudF9uYW1lKTsNCiAgICAgICAgdmFyIHBhc3NpdmUgPSBpc19wYXNzaXZlX2V2ZW50KGV2ZW50X25hbWUpOw0KICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudF9uYW1lLCBoYW5kbGVfZXZlbnRfcHJvcGFnYXRpb24sIHsNCiAgICAgICAgICBwYXNzaXZlLA0KICAgICAgICB9KTsNCiAgICAgICAgdmFyIG4gPSBkb2N1bWVudF9saXN0ZW5lcnMuZ2V0KGV2ZW50X25hbWUpOw0KICAgICAgICBpZiAobiA9PT0gdm9pZCAwKSB7DQogICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudF9uYW1lLCBoYW5kbGVfZXZlbnRfcHJvcGFnYXRpb24sIHsNCiAgICAgICAgICAgIHBhc3NpdmUsDQogICAgICAgICAgfSk7DQogICAgICAgICAgZG9jdW1lbnRfbGlzdGVuZXJzLnNldChldmVudF9uYW1lLCAxKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBkb2N1bWVudF9saXN0ZW5lcnMuc2V0KGV2ZW50X25hbWUsIG4gKyAxKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH07DQogICAgZXZlbnRfaGFuZGxlKGFycmF5X2Zyb20oYWxsX3JlZ2lzdGVyZWRfZXZlbnRzKSk7DQogICAgcm9vdF9ldmVudF9oYW5kbGVzLmFkZChldmVudF9oYW5kbGUpOw0KICAgIHZhciBjb21wb25lbnQgPSB2b2lkIDA7DQogICAgdmFyIHVubW91bnQgPSBjb21wb25lbnRfcm9vdCgoKSA9PiB7DQogICAgICB2YXIgYW5jaG9yX25vZGUgPSBhbmNob3IgPz8gdGFyZ2V0LmFwcGVuZENoaWxkKGNyZWF0ZV90ZXh0KCkpOw0KICAgICAgYnJhbmNoKCgpID0+IHsNCiAgICAgICAgaWYgKGNvbnRleHQpIHsNCiAgICAgICAgICBwdXNoKHt9KTsNCiAgICAgICAgICB2YXIgY3R4ID0NCiAgICAgICAgICAgIC8qKiBAdHlwZSB7Q29tcG9uZW50Q29udGV4dH0gKi8NCiAgICAgICAgICAgIGNvbXBvbmVudF9jb250ZXh0Ow0KICAgICAgICAgIGN0eC5jID0gY29udGV4dDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZXZlbnRzKSB7DQogICAgICAgICAgcHJvcHMuJCRldmVudHMgPSBldmVudHM7DQogICAgICAgIH0NCiAgICAgICAgc2hvdWxkX2ludHJvID0gaW50cm87DQogICAgICAgIGNvbXBvbmVudCA9IENvbXBvbmVudChhbmNob3Jfbm9kZSwgcHJvcHMpIHx8IHt9Ow0KICAgICAgICBzaG91bGRfaW50cm8gPSB0cnVlOw0KICAgICAgICBpZiAoY29udGV4dCkgew0KICAgICAgICAgIHBvcCgpOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIHJldHVybiAoKSA9PiB7DQogICAgICAgIHZhciBfYTI7DQogICAgICAgIGZvciAodmFyIGV2ZW50X25hbWUgb2YgcmVnaXN0ZXJlZF9ldmVudHMpIHsNCiAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudF9uYW1lLCBoYW5kbGVfZXZlbnRfcHJvcGFnYXRpb24pOw0KICAgICAgICAgIHZhciBuID0NCiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLw0KICAgICAgICAgICAgZG9jdW1lbnRfbGlzdGVuZXJzLmdldChldmVudF9uYW1lKTsNCiAgICAgICAgICBpZiAoLS1uID09PSAwKSB7DQogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50X25hbWUsIGhhbmRsZV9ldmVudF9wcm9wYWdhdGlvbik7DQogICAgICAgICAgICBkb2N1bWVudF9saXN0ZW5lcnMuZGVsZXRlKGV2ZW50X25hbWUpOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkb2N1bWVudF9saXN0ZW5lcnMuc2V0KGV2ZW50X25hbWUsIG4pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByb290X2V2ZW50X2hhbmRsZXMuZGVsZXRlKGV2ZW50X2hhbmRsZSk7DQogICAgICAgIGlmIChhbmNob3Jfbm9kZSAhPT0gYW5jaG9yKSB7DQogICAgICAgICAgKF9hMiA9IGFuY2hvcl9ub2RlLnBhcmVudE5vZGUpID09IG51bGwNCiAgICAgICAgICAgID8gdm9pZCAwDQogICAgICAgICAgICA6IF9hMi5yZW1vdmVDaGlsZChhbmNob3Jfbm9kZSk7DQogICAgICAgIH0NCiAgICAgIH07DQogICAgfSk7DQogICAgbW91bnRlZF9jb21wb25lbnRzLnNldChjb21wb25lbnQsIHVubW91bnQpOw0KICAgIHJldHVybiBjb21wb25lbnQ7DQogIH0NCiAgbGV0IG1vdW50ZWRfY29tcG9uZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOw0KICBmdW5jdGlvbiBpZl9ibG9jayhub2RlLCBmbiwgW3Jvb3RfaW5kZXgsIGh5ZHJhdGVfaW5kZXhdID0gWzAsIDBdKSB7DQogICAgdmFyIGFuY2hvciA9IG5vZGU7DQogICAgdmFyIGNvbnNlcXVlbnRfZWZmZWN0ID0gbnVsbDsNCiAgICB2YXIgYWx0ZXJuYXRlX2VmZmVjdCA9IG51bGw7DQogICAgdmFyIGNvbmRpdGlvbiA9IFVOSU5JVElBTElaRUQ7DQogICAgdmFyIGZsYWdzID0gcm9vdF9pbmRleCA+IDAgPyBFRkZFQ1RfVFJBTlNQQVJFTlQgOiAwOw0KICAgIHZhciBoYXNfYnJhbmNoID0gZmFsc2U7DQogICAgY29uc3Qgc2V0X2JyYW5jaCA9IChmbjIsIGZsYWcgPSB0cnVlKSA9PiB7DQogICAgICBoYXNfYnJhbmNoID0gdHJ1ZTsNCiAgICAgIHVwZGF0ZV9icmFuY2goZmxhZywgZm4yKTsNCiAgICB9Ow0KICAgIGNvbnN0IHVwZGF0ZV9icmFuY2ggPSAobmV3X2NvbmRpdGlvbiwgZm4yKSA9PiB7DQogICAgICBpZiAoY29uZGl0aW9uID09PSAoY29uZGl0aW9uID0gbmV3X2NvbmRpdGlvbikpIHJldHVybjsNCiAgICAgIGlmIChjb25kaXRpb24pIHsNCiAgICAgICAgaWYgKGNvbnNlcXVlbnRfZWZmZWN0KSB7DQogICAgICAgICAgcmVzdW1lX2VmZmVjdChjb25zZXF1ZW50X2VmZmVjdCk7DQogICAgICAgIH0gZWxzZSBpZiAoZm4yKSB7DQogICAgICAgICAgY29uc2VxdWVudF9lZmZlY3QgPSBicmFuY2goKCkgPT4gZm4yKGFuY2hvcikpOw0KICAgICAgICB9DQogICAgICAgIGlmIChhbHRlcm5hdGVfZWZmZWN0KSB7DQogICAgICAgICAgcGF1c2VfZWZmZWN0KGFsdGVybmF0ZV9lZmZlY3QsICgpID0+IHsNCiAgICAgICAgICAgIGFsdGVybmF0ZV9lZmZlY3QgPSBudWxsOw0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBpZiAoYWx0ZXJuYXRlX2VmZmVjdCkgew0KICAgICAgICAgIHJlc3VtZV9lZmZlY3QoYWx0ZXJuYXRlX2VmZmVjdCk7DQogICAgICAgIH0gZWxzZSBpZiAoZm4yKSB7DQogICAgICAgICAgYWx0ZXJuYXRlX2VmZmVjdCA9IGJyYW5jaCgoKSA9Pg0KICAgICAgICAgICAgZm4yKGFuY2hvciwgW3Jvb3RfaW5kZXggKyAxLCBoeWRyYXRlX2luZGV4XSksDQogICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY29uc2VxdWVudF9lZmZlY3QpIHsNCiAgICAgICAgICBwYXVzZV9lZmZlY3QoY29uc2VxdWVudF9lZmZlY3QsICgpID0+IHsNCiAgICAgICAgICAgIGNvbnNlcXVlbnRfZWZmZWN0ID0gbnVsbDsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH07DQogICAgYmxvY2soKCkgPT4gew0KICAgICAgaGFzX2JyYW5jaCA9IGZhbHNlOw0KICAgICAgZm4oc2V0X2JyYW5jaCk7DQogICAgICBpZiAoIWhhc19icmFuY2gpIHsNCiAgICAgICAgdXBkYXRlX2JyYW5jaChudWxsLCBudWxsKTsNCiAgICAgIH0NCiAgICB9LCBmbGFncyk7DQogIH0NCiAgZnVuY3Rpb24gcGF1c2VfZWZmZWN0cyhzdGF0ZTIsIGl0ZW1zLCBjb250cm9sbGVkX2FuY2hvciwgaXRlbXNfbWFwKSB7DQogICAgdmFyIHRyYW5zaXRpb25zID0gW107DQogICAgdmFyIGxlbmd0aCA9IGl0ZW1zLmxlbmd0aDsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICBwYXVzZV9jaGlsZHJlbihpdGVtc1tpXS5lLCB0cmFuc2l0aW9ucywgdHJ1ZSk7DQogICAgfQ0KICAgIHZhciBpc19jb250cm9sbGVkID0NCiAgICAgIGxlbmd0aCA+IDAgJiYgdHJhbnNpdGlvbnMubGVuZ3RoID09PSAwICYmIGNvbnRyb2xsZWRfYW5jaG9yICE9PSBudWxsOw0KICAgIGlmIChpc19jb250cm9sbGVkKSB7DQogICAgICB2YXIgcGFyZW50X25vZGUgPQ0KICAgICAgICAvKiogQHR5cGUge0VsZW1lbnR9ICovDQogICAgICAgIC8qKiBAdHlwZSB7RWxlbWVudH0gKi8NCiAgICAgICAgY29udHJvbGxlZF9hbmNob3IucGFyZW50Tm9kZTsNCiAgICAgIGNsZWFyX3RleHRfY29udGVudChwYXJlbnRfbm9kZSk7DQogICAgICBwYXJlbnRfbm9kZS5hcHBlbmQoDQogICAgICAgIC8qKiBAdHlwZSB7RWxlbWVudH0gKi8NCiAgICAgICAgY29udHJvbGxlZF9hbmNob3IsDQogICAgICApOw0KICAgICAgaXRlbXNfbWFwLmNsZWFyKCk7DQogICAgICBsaW5rKHN0YXRlMiwgaXRlbXNbMF0ucHJldiwgaXRlbXNbbGVuZ3RoIC0gMV0ubmV4dCk7DQogICAgfQ0KICAgIHJ1bl9vdXRfdHJhbnNpdGlvbnModHJhbnNpdGlvbnMsICgpID0+IHsNCiAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBsZW5ndGg7IGkyKyspIHsNCiAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpMl07DQogICAgICAgIGlmICghaXNfY29udHJvbGxlZCkgew0KICAgICAgICAgIGl0ZW1zX21hcC5kZWxldGUoaXRlbS5rKTsNCiAgICAgICAgICBsaW5rKHN0YXRlMiwgaXRlbS5wcmV2LCBpdGVtLm5leHQpOw0KICAgICAgICB9DQogICAgICAgIGRlc3Ryb3lfZWZmZWN0KGl0ZW0uZSwgIWlzX2NvbnRyb2xsZWQpOw0KICAgICAgfQ0KICAgIH0pOw0KICB9DQogIGZ1bmN0aW9uIGVhY2goDQogICAgbm9kZSwNCiAgICBmbGFncywNCiAgICBnZXRfY29sbGVjdGlvbiwNCiAgICBnZXRfa2V5LA0KICAgIHJlbmRlcl9mbiwNCiAgICBmYWxsYmFja19mbiA9IG51bGwsDQogICkgew0KICAgIHZhciBhbmNob3IgPSBub2RlOw0KICAgIHZhciBzdGF0ZTIgPSB7IGZsYWdzLCBpdGVtczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgZmlyc3Q6IG51bGwgfTsNCiAgICB2YXIgZmFsbGJhY2sgPSBudWxsOw0KICAgIHZhciB3YXNfZW1wdHkgPSBmYWxzZTsNCiAgICB2YXIgZWFjaF9hcnJheSA9IC8qIEBfX1BVUkVfXyAqLyBkZXJpdmVkX3NhZmVfZXF1YWwoKCkgPT4gew0KICAgICAgdmFyIGNvbGxlY3Rpb24gPSBnZXRfY29sbGVjdGlvbigpOw0KICAgICAgcmV0dXJuIGlzX2FycmF5KGNvbGxlY3Rpb24pDQogICAgICAgID8gY29sbGVjdGlvbg0KICAgICAgICA6IGNvbGxlY3Rpb24gPT0gbnVsbA0KICAgICAgICAgID8gW10NCiAgICAgICAgICA6IGFycmF5X2Zyb20oY29sbGVjdGlvbik7DQogICAgfSk7DQogICAgYmxvY2soKCkgPT4gew0KICAgICAgdmFyIGFycmF5ID0gZ2V0KGVhY2hfYXJyYXkpOw0KICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsNCiAgICAgIGlmICh3YXNfZW1wdHkgJiYgbGVuZ3RoID09PSAwKSB7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIHdhc19lbXB0eSA9IGxlbmd0aCA9PT0gMDsNCiAgICAgIHsNCiAgICAgICAgcmVjb25jaWxlKA0KICAgICAgICAgIGFycmF5LA0KICAgICAgICAgIHN0YXRlMiwNCiAgICAgICAgICBhbmNob3IsDQogICAgICAgICAgcmVuZGVyX2ZuLA0KICAgICAgICAgIGZsYWdzLA0KICAgICAgICAgIGdldF9rZXksDQogICAgICAgICAgZ2V0X2NvbGxlY3Rpb24sDQogICAgICAgICk7DQogICAgICB9DQogICAgICBpZiAoZmFsbGJhY2tfZm4gIT09IG51bGwpIHsNCiAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgIGlmIChmYWxsYmFjaykgew0KICAgICAgICAgICAgcmVzdW1lX2VmZmVjdChmYWxsYmFjayk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZhbGxiYWNrID0gYnJhbmNoKCgpID0+IGZhbGxiYWNrX2ZuKGFuY2hvcikpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChmYWxsYmFjayAhPT0gbnVsbCkgew0KICAgICAgICAgIHBhdXNlX2VmZmVjdChmYWxsYmFjaywgKCkgPT4gew0KICAgICAgICAgICAgZmFsbGJhY2sgPSBudWxsOw0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBnZXQoZWFjaF9hcnJheSk7DQogICAgfSk7DQogIH0NCiAgZnVuY3Rpb24gcmVjb25jaWxlKA0KICAgIGFycmF5LA0KICAgIHN0YXRlMiwNCiAgICBhbmNob3IsDQogICAgcmVuZGVyX2ZuLA0KICAgIGZsYWdzLA0KICAgIGdldF9rZXksDQogICAgZ2V0X2NvbGxlY3Rpb24sDQogICkgew0KICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7DQogICAgdmFyIGl0ZW1zID0gc3RhdGUyLml0ZW1zOw0KICAgIHZhciBmaXJzdCA9IHN0YXRlMi5maXJzdDsNCiAgICB2YXIgY3VycmVudCA9IGZpcnN0Ow0KICAgIHZhciBzZWVuOw0KICAgIHZhciBwcmV2ID0gbnVsbDsNCiAgICB2YXIgbWF0Y2hlZCA9IFtdOw0KICAgIHZhciBzdGFzaGVkID0gW107DQogICAgdmFyIHZhbHVlOw0KICAgIHZhciBrZXk7DQogICAgdmFyIGl0ZW07DQogICAgdmFyIGk7DQogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7DQogICAgICB2YWx1ZSA9IGFycmF5W2ldOw0KICAgICAga2V5ID0gZ2V0X2tleSh2YWx1ZSwgaSk7DQogICAgICBpdGVtID0gaXRlbXMuZ2V0KGtleSk7DQogICAgICBpZiAoaXRlbSA9PT0gdm9pZCAwKSB7DQogICAgICAgIHZhciBjaGlsZF9hbmNob3IgPSBjdXJyZW50DQogICAgICAgICAgPyAvKiogQHR5cGUge1RlbXBsYXRlTm9kZX0gKi8NCiAgICAgICAgICAgIGN1cnJlbnQuZS5ub2Rlc19zdGFydA0KICAgICAgICAgIDogYW5jaG9yOw0KICAgICAgICBwcmV2ID0gY3JlYXRlX2l0ZW0oDQogICAgICAgICAgY2hpbGRfYW5jaG9yLA0KICAgICAgICAgIHN0YXRlMiwNCiAgICAgICAgICBwcmV2LA0KICAgICAgICAgIHByZXYgPT09IG51bGwgPyBzdGF0ZTIuZmlyc3QgOiBwcmV2Lm5leHQsDQogICAgICAgICAgdmFsdWUsDQogICAgICAgICAga2V5LA0KICAgICAgICAgIGksDQogICAgICAgICAgcmVuZGVyX2ZuLA0KICAgICAgICAgIGZsYWdzLA0KICAgICAgICAgIGdldF9jb2xsZWN0aW9uLA0KICAgICAgICApOw0KICAgICAgICBpdGVtcy5zZXQoa2V5LCBwcmV2KTsNCiAgICAgICAgbWF0Y2hlZCA9IFtdOw0KICAgICAgICBzdGFzaGVkID0gW107DQogICAgICAgIGN1cnJlbnQgPSBwcmV2Lm5leHQ7DQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KICAgICAgew0KICAgICAgICB1cGRhdGVfaXRlbShpdGVtLCB2YWx1ZSwgaSk7DQogICAgICB9DQogICAgICBpZiAoKGl0ZW0uZS5mICYgSU5FUlQpICE9PSAwKSB7DQogICAgICAgIHJlc3VtZV9lZmZlY3QoaXRlbS5lKTsNCiAgICAgIH0NCiAgICAgIGlmIChpdGVtICE9PSBjdXJyZW50KSB7DQogICAgICAgIGlmIChzZWVuICE9PSB2b2lkIDAgJiYgc2Vlbi5oYXMoaXRlbSkpIHsNCiAgICAgICAgICBpZiAobWF0Y2hlZC5sZW5ndGggPCBzdGFzaGVkLmxlbmd0aCkgew0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc3Rhc2hlZFswXTsNCiAgICAgICAgICAgIHZhciBqOw0KICAgICAgICAgICAgcHJldiA9IHN0YXJ0LnByZXY7DQogICAgICAgICAgICB2YXIgYSA9IG1hdGNoZWRbMF07DQogICAgICAgICAgICB2YXIgYiA9IG1hdGNoZWRbbWF0Y2hlZC5sZW5ndGggLSAxXTsNCiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYXRjaGVkLmxlbmd0aDsgaiArPSAxKSB7DQogICAgICAgICAgICAgIG1vdmUobWF0Y2hlZFtqXSwgc3RhcnQsIGFuY2hvcik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3Rhc2hlZC5sZW5ndGg7IGogKz0gMSkgew0KICAgICAgICAgICAgICBzZWVuLmRlbGV0ZShzdGFzaGVkW2pdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxpbmsoc3RhdGUyLCBhLnByZXYsIGIubmV4dCk7DQogICAgICAgICAgICBsaW5rKHN0YXRlMiwgcHJldiwgYSk7DQogICAgICAgICAgICBsaW5rKHN0YXRlMiwgYiwgc3RhcnQpOw0KICAgICAgICAgICAgY3VycmVudCA9IHN0YXJ0Ow0KICAgICAgICAgICAgcHJldiA9IGI7DQogICAgICAgICAgICBpIC09IDE7DQogICAgICAgICAgICBtYXRjaGVkID0gW107DQogICAgICAgICAgICBzdGFzaGVkID0gW107DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHNlZW4uZGVsZXRlKGl0ZW0pOw0KICAgICAgICAgICAgbW92ZShpdGVtLCBjdXJyZW50LCBhbmNob3IpOw0KICAgICAgICAgICAgbGluayhzdGF0ZTIsIGl0ZW0ucHJldiwgaXRlbS5uZXh0KTsNCiAgICAgICAgICAgIGxpbmsoc3RhdGUyLCBpdGVtLCBwcmV2ID09PSBudWxsID8gc3RhdGUyLmZpcnN0IDogcHJldi5uZXh0KTsNCiAgICAgICAgICAgIGxpbmsoc3RhdGUyLCBwcmV2LCBpdGVtKTsNCiAgICAgICAgICAgIHByZXYgPSBpdGVtOw0KICAgICAgICAgIH0NCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBtYXRjaGVkID0gW107DQogICAgICAgIHN0YXNoZWQgPSBbXTsNCiAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5rICE9PSBrZXkpIHsNCiAgICAgICAgICBpZiAoKGN1cnJlbnQuZS5mICYgSU5FUlQpID09PSAwKSB7DQogICAgICAgICAgICAoc2VlbiA/PyAoc2VlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKS5hZGQoY3VycmVudCk7DQogICAgICAgICAgfQ0KICAgICAgICAgIHN0YXNoZWQucHVzaChjdXJyZW50KTsNCiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Ow0KICAgICAgICB9DQogICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgaXRlbSA9IGN1cnJlbnQ7DQogICAgICB9DQogICAgICBtYXRjaGVkLnB1c2goaXRlbSk7DQogICAgICBwcmV2ID0gaXRlbTsNCiAgICAgIGN1cnJlbnQgPSBpdGVtLm5leHQ7DQogICAgfQ0KICAgIGlmIChjdXJyZW50ICE9PSBudWxsIHx8IHNlZW4gIT09IHZvaWQgMCkgew0KICAgICAgdmFyIHRvX2Rlc3Ryb3kgPSBzZWVuID09PSB2b2lkIDAgPyBbXSA6IGFycmF5X2Zyb20oc2Vlbik7DQogICAgICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkgew0KICAgICAgICBpZiAoKGN1cnJlbnQuZS5mICYgSU5FUlQpID09PSAwKSB7DQogICAgICAgICAgdG9fZGVzdHJveS5wdXNoKGN1cnJlbnQpOw0KICAgICAgICB9DQogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7DQogICAgICB9DQogICAgICB2YXIgZGVzdHJveV9sZW5ndGggPSB0b19kZXN0cm95Lmxlbmd0aDsNCiAgICAgIGlmIChkZXN0cm95X2xlbmd0aCA+IDApIHsNCiAgICAgICAgdmFyIGNvbnRyb2xsZWRfYW5jaG9yID0gbnVsbDsNCiAgICAgICAgcGF1c2VfZWZmZWN0cyhzdGF0ZTIsIHRvX2Rlc3Ryb3ksIGNvbnRyb2xsZWRfYW5jaG9yLCBpdGVtcyk7DQogICAgICB9DQogICAgfQ0KICAgIGFjdGl2ZV9lZmZlY3QuZmlyc3QgPSBzdGF0ZTIuZmlyc3QgJiYgc3RhdGUyLmZpcnN0LmU7DQogICAgYWN0aXZlX2VmZmVjdC5sYXN0ID0gcHJldiAmJiBwcmV2LmU7DQogIH0NCiAgZnVuY3Rpb24gdXBkYXRlX2l0ZW0oaXRlbSwgdmFsdWUsIGluZGV4LCB0eXBlKSB7DQogICAgew0KICAgICAgaW50ZXJuYWxfc2V0KGl0ZW0udiwgdmFsdWUpOw0KICAgIH0NCiAgICB7DQogICAgICBpbnRlcm5hbF9zZXQoDQogICAgICAgIC8qKiBAdHlwZSB7VmFsdWU8bnVtYmVyPn0gKi8NCiAgICAgICAgaXRlbS5pLA0KICAgICAgICBpbmRleCwNCiAgICAgICk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIGNyZWF0ZV9pdGVtKA0KICAgIGFuY2hvciwNCiAgICBzdGF0ZTIsDQogICAgcHJldiwNCiAgICBuZXh0LA0KICAgIHZhbHVlLA0KICAgIGtleSwNCiAgICBpbmRleCwNCiAgICByZW5kZXJfZm4sDQogICAgZmxhZ3MsDQogICAgZ2V0X2NvbGxlY3Rpb24sDQogICkgew0KICAgIHZhciByZWFjdGl2ZSA9IChmbGFncyAmIEVBQ0hfSVRFTV9SRUFDVElWRSkgIT09IDA7DQogICAgdmFyIG11dGFibGUgPSAoZmxhZ3MgJiBFQUNIX0lURU1fSU1NVVRBQkxFKSA9PT0gMDsNCiAgICB2YXIgdiA9IHJlYWN0aXZlDQogICAgICA/IG11dGFibGUNCiAgICAgICAgPyAvKiBAX19QVVJFX18gKi8gbXV0YWJsZV9zb3VyY2UodmFsdWUpDQogICAgICAgIDogc291cmNlKHZhbHVlKQ0KICAgICAgOiB2YWx1ZTsNCiAgICB2YXIgaSA9IChmbGFncyAmIEVBQ0hfSU5ERVhfUkVBQ1RJVkUpID09PSAwID8gaW5kZXggOiBzb3VyY2UoaW5kZXgpOw0KICAgIHZhciBpdGVtID0gew0KICAgICAgaSwNCiAgICAgIHYsDQogICAgICBrOiBrZXksDQogICAgICBhOiBudWxsLA0KICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcg0KICAgICAgZTogbnVsbCwNCiAgICAgIHByZXYsDQogICAgICBuZXh0LA0KICAgIH07DQogICAgdHJ5IHsNCiAgICAgIGl0ZW0uZSA9IGJyYW5jaCgoKSA9PiByZW5kZXJfZm4oYW5jaG9yLCB2LCBpLCBnZXRfY29sbGVjdGlvbiksIGh5ZHJhdGluZyk7DQogICAgICBpdGVtLmUucHJldiA9IHByZXYgJiYgcHJldi5lOw0KICAgICAgaXRlbS5lLm5leHQgPSBuZXh0ICYmIG5leHQuZTsNCiAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7DQogICAgICAgIHN0YXRlMi5maXJzdCA9IGl0ZW07DQogICAgICB9IGVsc2Ugew0KICAgICAgICBwcmV2Lm5leHQgPSBpdGVtOw0KICAgICAgICBwcmV2LmUubmV4dCA9IGl0ZW0uZTsNCiAgICAgIH0NCiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7DQogICAgICAgIG5leHQucHJldiA9IGl0ZW07DQogICAgICAgIG5leHQuZS5wcmV2ID0gaXRlbS5lOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGl0ZW07DQogICAgfSBmaW5hbGx5IHsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gbW92ZShpdGVtLCBuZXh0LCBhbmNob3IpIHsNCiAgICB2YXIgZW5kID0gaXRlbS5uZXh0DQogICAgICA/IC8qKiBAdHlwZSB7VGVtcGxhdGVOb2RlfSAqLw0KICAgICAgICBpdGVtLm5leHQuZS5ub2Rlc19zdGFydA0KICAgICAgOiBhbmNob3I7DQogICAgdmFyIGRlc3QgPSBuZXh0DQogICAgICA/IC8qKiBAdHlwZSB7VGVtcGxhdGVOb2RlfSAqLw0KICAgICAgICBuZXh0LmUubm9kZXNfc3RhcnQNCiAgICAgIDogYW5jaG9yOw0KICAgIHZhciBub2RlID0NCiAgICAgIC8qKiBAdHlwZSB7VGVtcGxhdGVOb2RlfSAqLw0KICAgICAgaXRlbS5lLm5vZGVzX3N0YXJ0Ow0KICAgIHdoaWxlIChub2RlICE9PSBlbmQpIHsNCiAgICAgIHZhciBuZXh0X25vZGUgPQ0KICAgICAgICAvKiogQHR5cGUge1RlbXBsYXRlTm9kZX0gKi8NCiAgICAgICAgLyogQF9fUFVSRV9fICovIGdldF9uZXh0X3NpYmxpbmcobm9kZSk7DQogICAgICBkZXN0LmJlZm9yZShub2RlKTsNCiAgICAgIG5vZGUgPSBuZXh0X25vZGU7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIGxpbmsoc3RhdGUyLCBwcmV2LCBuZXh0KSB7DQogICAgaWYgKHByZXYgPT09IG51bGwpIHsNCiAgICAgIHN0YXRlMi5maXJzdCA9IG5leHQ7DQogICAgfSBlbHNlIHsNCiAgICAgIHByZXYubmV4dCA9IG5leHQ7DQogICAgICBwcmV2LmUubmV4dCA9IG5leHQgJiYgbmV4dC5lOw0KICAgIH0NCiAgICBpZiAobmV4dCAhPT0gbnVsbCkgew0KICAgICAgbmV4dC5wcmV2ID0gcHJldjsNCiAgICAgIG5leHQuZS5wcmV2ID0gcHJldiAmJiBwcmV2LmU7DQogICAgfQ0KICB9DQogIGNvbnN0IHdoaXRlc3BhY2UgPSBbLi4uJyAJXG5cclxmwqBcdlx1RkVGRiddOw0KICBmdW5jdGlvbiB0b19jbGFzcyh2YWx1ZSwgaGFzaCwgZGlyZWN0aXZlcykgew0KICAgIHZhciBjbGFzc25hbWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiAnJyArIHZhbHVlOw0KICAgIGlmIChkaXJlY3RpdmVzKSB7DQogICAgICBmb3IgKHZhciBrZXkgaW4gZGlyZWN0aXZlcykgew0KICAgICAgICBpZiAoZGlyZWN0aXZlc1trZXldKSB7DQogICAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lID8gY2xhc3NuYW1lICsgJyAnICsga2V5IDoga2V5Ow0KICAgICAgICB9IGVsc2UgaWYgKGNsYXNzbmFtZS5sZW5ndGgpIHsNCiAgICAgICAgICB2YXIgbGVuID0ga2V5Lmxlbmd0aDsNCiAgICAgICAgICB2YXIgYSA9IDA7DQogICAgICAgICAgd2hpbGUgKChhID0gY2xhc3NuYW1lLmluZGV4T2Yoa2V5LCBhKSkgPj0gMCkgew0KICAgICAgICAgICAgdmFyIGIgPSBhICsgbGVuOw0KICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAoYSA9PT0gMCB8fCB3aGl0ZXNwYWNlLmluY2x1ZGVzKGNsYXNzbmFtZVthIC0gMV0pKSAmJg0KICAgICAgICAgICAgICAoYiA9PT0gY2xhc3NuYW1lLmxlbmd0aCB8fCB3aGl0ZXNwYWNlLmluY2x1ZGVzKGNsYXNzbmFtZVtiXSkpDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgY2xhc3NuYW1lID0NCiAgICAgICAgICAgICAgICAoYSA9PT0gMCA/ICcnIDogY2xhc3NuYW1lLnN1YnN0cmluZygwLCBhKSkgKw0KICAgICAgICAgICAgICAgIGNsYXNzbmFtZS5zdWJzdHJpbmcoYiArIDEpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgYSA9IGI7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiBjbGFzc25hbWUgPT09ICcnID8gbnVsbCA6IGNsYXNzbmFtZTsNCiAgfQ0KICBmdW5jdGlvbiBzZXRfY2xhc3MoZG9tLCBpc19odG1sLCB2YWx1ZSwgaGFzaCwgcHJldl9jbGFzc2VzLCBuZXh0X2NsYXNzZXMpIHsNCiAgICB2YXIgcHJldiA9IGRvbS5fX2NsYXNzTmFtZTsNCiAgICBpZiAocHJldiAhPT0gdmFsdWUgfHwgcHJldiA9PT0gdm9pZCAwKSB7DQogICAgICB2YXIgbmV4dF9jbGFzc19uYW1lID0gdG9fY2xhc3ModmFsdWUsIGhhc2gsIG5leHRfY2xhc3Nlcyk7DQogICAgICB7DQogICAgICAgIGlmIChuZXh0X2NsYXNzX25hbWUgPT0gbnVsbCkgew0KICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IG5leHRfY2xhc3NfbmFtZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZG9tLl9fY2xhc3NOYW1lID0gdmFsdWU7DQogICAgfSBlbHNlIGlmIChuZXh0X2NsYXNzZXMgJiYgcHJldl9jbGFzc2VzICE9PSBuZXh0X2NsYXNzZXMpIHsNCiAgICAgIGZvciAodmFyIGtleSBpbiBuZXh0X2NsYXNzZXMpIHsNCiAgICAgICAgdmFyIGlzX3ByZXNlbnQgPSAhIW5leHRfY2xhc3Nlc1trZXldOw0KICAgICAgICBpZiAocHJldl9jbGFzc2VzID09IG51bGwgfHwgaXNfcHJlc2VudCAhPT0gISFwcmV2X2NsYXNzZXNba2V5XSkgew0KICAgICAgICAgIGRvbS5jbGFzc0xpc3QudG9nZ2xlKGtleSwgaXNfcHJlc2VudCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIG5leHRfY2xhc3NlczsNCiAgfQ0KICBjb25zdCBJU19DVVNUT01fRUxFTUVOVCA9IFN5bWJvbCgnaXMgY3VzdG9tIGVsZW1lbnQnKTsNCiAgY29uc3QgSVNfSFRNTCA9IFN5bWJvbCgnaXMgaHRtbCcpOw0KICBmdW5jdGlvbiBzZXRfYXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUsIHNraXBfd2FybmluZykgew0KICAgIHZhciBhdHRyaWJ1dGVzID0gZ2V0X2F0dHJpYnV0ZXMoZWxlbWVudCk7DQogICAgaWYgKGF0dHJpYnV0ZXNbYXR0cmlidXRlXSA9PT0gKGF0dHJpYnV0ZXNbYXR0cmlidXRlXSA9IHZhbHVlKSkgcmV0dXJuOw0KICAgIGlmIChhdHRyaWJ1dGUgPT09ICdsb2FkaW5nJykgew0KICAgICAgZWxlbWVudFtMT0FESU5HX0FUVFJfU1lNQk9MXSA9IHZhbHVlOw0KICAgIH0NCiAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTsNCiAgICB9IGVsc2UgaWYgKA0KICAgICAgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyAmJg0KICAgICAgZ2V0X3NldHRlcnMoZWxlbWVudCkuaW5jbHVkZXMoYXR0cmlidXRlKQ0KICAgICkgew0KICAgICAgZWxlbWVudFthdHRyaWJ1dGVdID0gdmFsdWU7DQogICAgfSBlbHNlIHsNCiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBnZXRfYXR0cmlidXRlcyhlbGVtZW50KSB7DQogICAgcmV0dXJuICgNCiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj59ICoqLw0KICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcg0KICAgICAgZWxlbWVudC5fX2F0dHJpYnV0ZXMgPz8NCiAgICAgIChlbGVtZW50Ll9fYXR0cmlidXRlcyA9IHsNCiAgICAgICAgW0lTX0NVU1RPTV9FTEVNRU5UXTogZWxlbWVudC5ub2RlTmFtZS5pbmNsdWRlcygnLScpLA0KICAgICAgICBbSVNfSFRNTF06IGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBOQU1FU1BBQ0VfSFRNTCwNCiAgICAgIH0pDQogICAgKTsNCiAgfQ0KICB2YXIgc2V0dGVyc19jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7DQogIGZ1bmN0aW9uIGdldF9zZXR0ZXJzKGVsZW1lbnQpIHsNCiAgICB2YXIgc2V0dGVycyA9IHNldHRlcnNfY2FjaGUuZ2V0KGVsZW1lbnQubm9kZU5hbWUpOw0KICAgIGlmIChzZXR0ZXJzKSByZXR1cm4gc2V0dGVyczsNCiAgICBzZXR0ZXJzX2NhY2hlLnNldChlbGVtZW50Lm5vZGVOYW1lLCAoc2V0dGVycyA9IFtdKSk7DQogICAgdmFyIGRlc2NyaXB0b3JzOw0KICAgIHZhciBwcm90byA9IGVsZW1lbnQ7DQogICAgdmFyIGVsZW1lbnRfcHJvdG8gPSBFbGVtZW50LnByb3RvdHlwZTsNCiAgICB3aGlsZSAoZWxlbWVudF9wcm90byAhPT0gcHJvdG8pIHsNCiAgICAgIGRlc2NyaXB0b3JzID0gZ2V0X2Rlc2NyaXB0b3JzKHByb3RvKTsNCiAgICAgIGZvciAodmFyIGtleSBpbiBkZXNjcmlwdG9ycykgew0KICAgICAgICBpZiAoZGVzY3JpcHRvcnNba2V5XS5zZXQpIHsNCiAgICAgICAgICBzZXR0ZXJzLnB1c2goa2V5KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcHJvdG8gPSBnZXRfcHJvdG90eXBlX29mKHByb3RvKTsNCiAgICB9DQogICAgcmV0dXJuIHNldHRlcnM7DQogIH0NCiAgY29uc3Qgbm93ID0gKCkgPT4gcGVyZm9ybWFuY2Uubm93KCk7DQogIGNvbnN0IHJhZiA9IHsNCiAgICAvLyBkb24ndCBhY2Nlc3MgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGVhZ2VybHkgb3V0c2lkZSBtZXRob2QNCiAgICAvLyB0aGlzIGFsbG93cyBiYXNpYyB0ZXN0aW5nIG9mIHVzZXIgY29kZSB3aXRob3V0IEpTRE9NDQogICAgLy8gYnVuZGVyIHdpbGwgZXZhbCBhbmQgcmVtb3ZlIHRlcm5hcnkgd2hlbiB0aGUgdXNlcidzIGFwcCBpcyBidWlsdA0KICAgIHRpY2s6DQogICAgICAvKiogQHBhcmFtIHthbnl9IF8gKi8NCiAgICAgIChfKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXyksDQogICAgbm93OiAoKSA9PiBub3coKSwNCiAgICB0YXNrczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwNCiAgfTsNCiAgZnVuY3Rpb24gcnVuX3Rhc2tzKCkgew0KICAgIGNvbnN0IG5vdzIgPSByYWYubm93KCk7DQogICAgcmFmLnRhc2tzLmZvckVhY2goKHRhc2spID0+IHsNCiAgICAgIGlmICghdGFzay5jKG5vdzIpKSB7DQogICAgICAgIHJhZi50YXNrcy5kZWxldGUodGFzayk7DQogICAgICAgIHRhc2suZigpOw0KICAgICAgfQ0KICAgIH0pOw0KICAgIGlmIChyYWYudGFza3Muc2l6ZSAhPT0gMCkgew0KICAgICAgcmFmLnRpY2socnVuX3Rhc2tzKTsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gbG9vcChjYWxsYmFjaykgew0KICAgIGxldCB0YXNrOw0KICAgIGlmIChyYWYudGFza3Muc2l6ZSA9PT0gMCkgew0KICAgICAgcmFmLnRpY2socnVuX3Rhc2tzKTsNCiAgICB9DQogICAgcmV0dXJuIHsNCiAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKChmdWxmaWxsKSA9PiB7DQogICAgICAgIHJhZi50YXNrcy5hZGQoKHRhc2sgPSB7IGM6IGNhbGxiYWNrLCBmOiBmdWxmaWxsIH0pKTsNCiAgICAgIH0pLA0KICAgICAgYWJvcnQoKSB7DQogICAgICAgIHJhZi50YXNrcy5kZWxldGUodGFzayk7DQogICAgICB9LA0KICAgIH07DQogIH0NCiAgZnVuY3Rpb24gZGlzcGF0Y2hfZXZlbnQoZWxlbWVudCwgdHlwZSkgew0KICAgIHdpdGhvdXRfcmVhY3RpdmVfY29udGV4dCgoKSA9PiB7DQogICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHR5cGUpKTsNCiAgICB9KTsNCiAgfQ0KICBmdW5jdGlvbiBjc3NfcHJvcGVydHlfdG9fY2FtZWxjYXNlKHN0eWxlKSB7DQogICAgaWYgKHN0eWxlID09PSAnZmxvYXQnKSByZXR1cm4gJ2Nzc0Zsb2F0JzsNCiAgICBpZiAoc3R5bGUgPT09ICdvZmZzZXQnKSByZXR1cm4gJ2Nzc09mZnNldCc7DQogICAgaWYgKHN0eWxlLnN0YXJ0c1dpdGgoJy0tJykpIHJldHVybiBzdHlsZTsNCiAgICBjb25zdCBwYXJ0cyA9IHN0eWxlLnNwbGl0KCctJyk7DQogICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHBhcnRzWzBdOw0KICAgIHJldHVybiAoDQogICAgICBwYXJ0c1swXSArDQogICAgICBwYXJ0cw0KICAgICAgICAuc2xpY2UoMSkNCiAgICAgICAgLm1hcCgNCiAgICAgICAgICAvKiogQHBhcmFtIHthbnl9IHdvcmQgKi8NCiAgICAgICAgICAod29yZCkgPT4gd29yZFswXS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKSwNCiAgICAgICAgKQ0KICAgICAgICAuam9pbignJykNCiAgICApOw0KICB9DQogIGZ1bmN0aW9uIGNzc190b19rZXlmcmFtZShjc3MpIHsNCiAgICBjb25zdCBrZXlmcmFtZSA9IHt9Ow0KICAgIGNvbnN0IHBhcnRzID0gY3NzLnNwbGl0KCc7Jyk7DQogICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7DQogICAgICBjb25zdCBbcHJvcGVydHksIHZhbHVlXSA9IHBhcnQuc3BsaXQoJzonKTsNCiAgICAgIGlmICghcHJvcGVydHkgfHwgdmFsdWUgPT09IHZvaWQgMCkgYnJlYWs7DQogICAgICBjb25zdCBmb3JtYXR0ZWRfcHJvcGVydHkgPSBjc3NfcHJvcGVydHlfdG9fY2FtZWxjYXNlKHByb3BlcnR5LnRyaW0oKSk7DQogICAgICBrZXlmcmFtZVtmb3JtYXR0ZWRfcHJvcGVydHldID0gdmFsdWUudHJpbSgpOw0KICAgIH0NCiAgICByZXR1cm4ga2V5ZnJhbWU7DQogIH0NCiAgY29uc3QgbGluZWFyJDEgPSAodCkgPT4gdDsNCiAgZnVuY3Rpb24gdHJhbnNpdGlvbihmbGFncywgZWxlbWVudCwgZ2V0X2ZuLCBnZXRfcGFyYW1zKSB7DQogICAgdmFyIGlzX2dsb2JhbCA9IChmbGFncyAmIFRSQU5TSVRJT05fR0xPQkFMKSAhPT0gMDsNCiAgICB2YXIgZGlyZWN0aW9uID0gJ2JvdGgnOw0KICAgIHZhciBjdXJyZW50X29wdGlvbnM7DQogICAgdmFyIGluZXJ0ID0gZWxlbWVudC5pbmVydDsNCiAgICB2YXIgb3ZlcmZsb3cgPSBlbGVtZW50LnN0eWxlLm92ZXJmbG93Ow0KICAgIHZhciBpbnRybzsNCiAgICB2YXIgb3V0cm87DQogICAgZnVuY3Rpb24gZ2V0X29wdGlvbnMoKSB7DQogICAgICB2YXIgcHJldmlvdXNfcmVhY3Rpb24gPSBhY3RpdmVfcmVhY3Rpb247DQogICAgICB2YXIgcHJldmlvdXNfZWZmZWN0ID0gYWN0aXZlX2VmZmVjdDsNCiAgICAgIHNldF9hY3RpdmVfcmVhY3Rpb24obnVsbCk7DQogICAgICBzZXRfYWN0aXZlX2VmZmVjdChudWxsKTsNCiAgICAgIHRyeSB7DQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgY3VycmVudF9vcHRpb25zID8/DQogICAgICAgICAgKGN1cnJlbnRfb3B0aW9ucyA9IGdldF9mbigpKA0KICAgICAgICAgICAgZWxlbWVudCwNCiAgICAgICAgICAgIChnZXRfcGFyYW1zID09IG51bGwgPyB2b2lkIDAgOiBnZXRfcGFyYW1zKCkpID8/IC8qKiBAdHlwZSB7UH0gKi8ge30sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIGRpcmVjdGlvbiwNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgKSkNCiAgICAgICAgKTsNCiAgICAgIH0gZmluYWxseSB7DQogICAgICAgIHNldF9hY3RpdmVfcmVhY3Rpb24ocHJldmlvdXNfcmVhY3Rpb24pOw0KICAgICAgICBzZXRfYWN0aXZlX2VmZmVjdChwcmV2aW91c19lZmZlY3QpOw0KICAgICAgfQ0KICAgIH0NCiAgICB2YXIgdHJhbnNpdGlvbjIgPSB7DQogICAgICBpc19nbG9iYWwsDQogICAgICBpbigpIHsNCiAgICAgICAgZWxlbWVudC5pbmVydCA9IGluZXJ0Ow0KICAgICAgICBkaXNwYXRjaF9ldmVudChlbGVtZW50LCAnaW50cm9zdGFydCcpOw0KICAgICAgICBpbnRybyA9IGFuaW1hdGUoZWxlbWVudCwgZ2V0X29wdGlvbnMoKSwgb3V0cm8sIDEsICgpID0+IHsNCiAgICAgICAgICBkaXNwYXRjaF9ldmVudChlbGVtZW50LCAnaW50cm9lbmQnKTsNCiAgICAgICAgICBpbnRybyA9PSBudWxsID8gdm9pZCAwIDogaW50cm8uYWJvcnQoKTsNCiAgICAgICAgICBpbnRybyA9IGN1cnJlbnRfb3B0aW9ucyA9IHZvaWQgMDsNCiAgICAgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gb3ZlcmZsb3c7DQogICAgICAgIH0pOw0KICAgICAgfSwNCiAgICAgIG91dChmbikgew0KICAgICAgICBlbGVtZW50LmluZXJ0ID0gdHJ1ZTsNCiAgICAgICAgZGlzcGF0Y2hfZXZlbnQoZWxlbWVudCwgJ291dHJvc3RhcnQnKTsNCiAgICAgICAgb3V0cm8gPSBhbmltYXRlKGVsZW1lbnQsIGdldF9vcHRpb25zKCksIGludHJvLCAwLCAoKSA9PiB7DQogICAgICAgICAgZGlzcGF0Y2hfZXZlbnQoZWxlbWVudCwgJ291dHJvZW5kJyk7DQogICAgICAgICAgZm4gPT0gbnVsbCA/IHZvaWQgMCA6IGZuKCk7DQogICAgICAgIH0pOw0KICAgICAgfSwNCiAgICAgIHN0b3A6ICgpID0+IHsNCiAgICAgICAgaW50cm8gPT0gbnVsbCA/IHZvaWQgMCA6IGludHJvLmFib3J0KCk7DQogICAgICAgIG91dHJvID09IG51bGwgPyB2b2lkIDAgOiBvdXRyby5hYm9ydCgpOw0KICAgICAgfSwNCiAgICB9Ow0KICAgIHZhciBlID0NCiAgICAgIC8qKiBAdHlwZSB7RWZmZWN0fSAqLw0KICAgICAgYWN0aXZlX2VmZmVjdDsNCiAgICAoZS50cmFuc2l0aW9ucyA/PyAoZS50cmFuc2l0aW9ucyA9IFtdKSkucHVzaCh0cmFuc2l0aW9uMik7DQogICAgaWYgKHNob3VsZF9pbnRybykgew0KICAgICAgdmFyIHJ1bjIgPSBpc19nbG9iYWw7DQogICAgICBpZiAoIXJ1bjIpIHsNCiAgICAgICAgdmFyIGJsb2NrMiA9DQogICAgICAgICAgLyoqIEB0eXBlIHtFZmZlY3QgfCBudWxsfSAqLw0KICAgICAgICAgIGUucGFyZW50Ow0KICAgICAgICB3aGlsZSAoYmxvY2syICYmIChibG9jazIuZiAmIEVGRkVDVF9UUkFOU1BBUkVOVCkgIT09IDApIHsNCiAgICAgICAgICB3aGlsZSAoKGJsb2NrMiA9IGJsb2NrMi5wYXJlbnQpKSB7DQogICAgICAgICAgICBpZiAoKGJsb2NrMi5mICYgQkxPQ0tfRUZGRUNUKSAhPT0gMCkgYnJlYWs7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJ1bjIgPSAhYmxvY2syIHx8IChibG9jazIuZiAmIEVGRkVDVF9SQU4pICE9PSAwOw0KICAgICAgfQ0KICAgICAgaWYgKHJ1bjIpIHsNCiAgICAgICAgZWZmZWN0KCgpID0+IHsNCiAgICAgICAgICB1bnRyYWNrKCgpID0+IHRyYW5zaXRpb24yLmluKCkpOw0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gYW5pbWF0ZShlbGVtZW50LCBvcHRpb25zLCBjb3VudGVycGFydCwgdDIsIG9uX2ZpbmlzaCkgew0KICAgIHZhciBpc19pbnRybyA9IHQyID09PSAxOw0KICAgIGlmIChpc19mdW5jdGlvbihvcHRpb25zKSkgew0KICAgICAgdmFyIGE7DQogICAgICB2YXIgYWJvcnRlZCA9IGZhbHNlOw0KICAgICAgcXVldWVfbWljcm9fdGFzaygoKSA9PiB7DQogICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm47DQogICAgICAgIHZhciBvID0gb3B0aW9ucyh7IGRpcmVjdGlvbjogaXNfaW50cm8gPyAnaW4nIDogJ291dCcgfSk7DQogICAgICAgIGEgPSBhbmltYXRlKGVsZW1lbnQsIG8sIGNvdW50ZXJwYXJ0LCB0Miwgb25fZmluaXNoKTsNCiAgICAgIH0pOw0KICAgICAgcmV0dXJuIHsNCiAgICAgICAgYWJvcnQ6ICgpID0+IHsNCiAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTsNCiAgICAgICAgICBhID09IG51bGwgPyB2b2lkIDAgOiBhLmFib3J0KCk7DQogICAgICAgIH0sDQogICAgICAgIGRlYWN0aXZhdGU6ICgpID0+IGEuZGVhY3RpdmF0ZSgpLA0KICAgICAgICByZXNldDogKCkgPT4gYS5yZXNldCgpLA0KICAgICAgICB0OiAoKSA9PiBhLnQoKSwNCiAgICAgIH07DQogICAgfQ0KICAgIGNvdW50ZXJwYXJ0ID09IG51bGwgPyB2b2lkIDAgOiBjb3VudGVycGFydC5kZWFjdGl2YXRlKCk7DQogICAgaWYgKCEob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5kdXJhdGlvbikpIHsNCiAgICAgIG9uX2ZpbmlzaCgpOw0KICAgICAgcmV0dXJuIHsNCiAgICAgICAgYWJvcnQ6IG5vb3AsDQogICAgICAgIGRlYWN0aXZhdGU6IG5vb3AsDQogICAgICAgIHJlc2V0OiBub29wLA0KICAgICAgICB0OiAoKSA9PiB0MiwNCiAgICAgIH07DQogICAgfQ0KICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBjc3MsIHRpY2ssIGVhc2luZyA9IGxpbmVhciQxIH0gPSBvcHRpb25zOw0KICAgIHZhciBrZXlmcmFtZXMgPSBbXTsNCiAgICBpZiAoaXNfaW50cm8gJiYgY291bnRlcnBhcnQgPT09IHZvaWQgMCkgew0KICAgICAgaWYgKHRpY2spIHsNCiAgICAgICAgdGljaygwLCAxKTsNCiAgICAgIH0NCiAgICAgIGlmIChjc3MpIHsNCiAgICAgICAgdmFyIHN0eWxlcyA9IGNzc190b19rZXlmcmFtZShjc3MoMCwgMSkpOw0KICAgICAgICBrZXlmcmFtZXMucHVzaChzdHlsZXMsIHN0eWxlcyk7DQogICAgICB9DQogICAgfQ0KICAgIHZhciBnZXRfdCA9ICgpID0+IDEgLSB0MjsNCiAgICB2YXIgYW5pbWF0aW9uID0gZWxlbWVudC5hbmltYXRlKGtleWZyYW1lcywgeyBkdXJhdGlvbjogZGVsYXkgfSk7DQogICAgYW5pbWF0aW9uLm9uZmluaXNoID0gKCkgPT4gew0KICAgICAgdmFyIHQxID0gKGNvdW50ZXJwYXJ0ID09IG51bGwgPyB2b2lkIDAgOiBjb3VudGVycGFydC50KCkpID8/IDEgLSB0MjsNCiAgICAgIGNvdW50ZXJwYXJ0ID09IG51bGwgPyB2b2lkIDAgOiBjb3VudGVycGFydC5hYm9ydCgpOw0KICAgICAgdmFyIGRlbHRhID0gdDIgLSB0MTsNCiAgICAgIHZhciBkdXJhdGlvbiA9DQogICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLw0KICAgICAgICBvcHRpb25zLmR1cmF0aW9uICogTWF0aC5hYnMoZGVsdGEpOw0KICAgICAgdmFyIGtleWZyYW1lczIgPSBbXTsNCiAgICAgIGlmIChkdXJhdGlvbiA+IDApIHsNCiAgICAgICAgdmFyIG5lZWRzX292ZXJmbG93X2hpZGRlbiA9IGZhbHNlOw0KICAgICAgICBpZiAoY3NzKSB7DQogICAgICAgICAgdmFyIG4gPSBNYXRoLmNlaWwoZHVyYXRpb24gLyAoMWUzIC8gNjApKTsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBuOyBpICs9IDEpIHsNCiAgICAgICAgICAgIHZhciB0ID0gdDEgKyBkZWx0YSAqIGVhc2luZyhpIC8gbik7DQogICAgICAgICAgICB2YXIgc3R5bGVzMiA9IGNzc190b19rZXlmcmFtZShjc3ModCwgMSAtIHQpKTsNCiAgICAgICAgICAgIGtleWZyYW1lczIucHVzaChzdHlsZXMyKTsNCiAgICAgICAgICAgIG5lZWRzX292ZXJmbG93X2hpZGRlbiB8fA0KICAgICAgICAgICAgICAobmVlZHNfb3ZlcmZsb3dfaGlkZGVuID0gc3R5bGVzMi5vdmVyZmxvdyA9PT0gJ2hpZGRlbicpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAobmVlZHNfb3ZlcmZsb3dfaGlkZGVuKSB7DQogICAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOw0KICAgICAgICB9DQogICAgICAgIGdldF90ID0gKCkgPT4gew0KICAgICAgICAgIHZhciB0aW1lID0NCiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLw0KICAgICAgICAgICAgLyoqIEB0eXBlIHtnbG9iYWxUaGlzLkFuaW1hdGlvbn0gKi8NCiAgICAgICAgICAgIGFuaW1hdGlvbi5jdXJyZW50VGltZTsNCiAgICAgICAgICByZXR1cm4gdDEgKyBkZWx0YSAqIGVhc2luZyh0aW1lIC8gZHVyYXRpb24pOw0KICAgICAgICB9Ow0KICAgICAgICBpZiAodGljaykgew0KICAgICAgICAgIGxvb3AoKCkgPT4gew0KICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi5wbGF5U3RhdGUgIT09ICdydW5uaW5nJykgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgdmFyIHQzID0gZ2V0X3QoKTsNCiAgICAgICAgICAgIHRpY2sodDMsIDEgLSB0Myk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgYW5pbWF0aW9uID0gZWxlbWVudC5hbmltYXRlKGtleWZyYW1lczIsIHsgZHVyYXRpb24sIGZpbGw6ICdmb3J3YXJkcycgfSk7DQogICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoKSA9PiB7DQogICAgICAgIGdldF90ID0gKCkgPT4gdDI7DQogICAgICAgIHRpY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHRpY2sodDIsIDEgLSB0Mik7DQogICAgICAgIG9uX2ZpbmlzaCgpOw0KICAgICAgfTsNCiAgICB9Ow0KICAgIHJldHVybiB7DQogICAgICBhYm9ydDogKCkgPT4gew0KICAgICAgICBpZiAoYW5pbWF0aW9uKSB7DQogICAgICAgICAgYW5pbWF0aW9uLmNhbmNlbCgpOw0KICAgICAgICAgIGFuaW1hdGlvbi5lZmZlY3QgPSBudWxsOw0KICAgICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9IG5vb3A7DQogICAgICAgIH0NCiAgICAgIH0sDQogICAgICBkZWFjdGl2YXRlOiAoKSA9PiB7DQogICAgICAgIG9uX2ZpbmlzaCA9IG5vb3A7DQogICAgICB9LA0KICAgICAgcmVzZXQ6ICgpID0+IHsNCiAgICAgICAgaWYgKHQyID09PSAwKSB7DQogICAgICAgICAgdGljayA9PSBudWxsID8gdm9pZCAwIDogdGljaygxLCAwKTsNCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgIHQ6ICgpID0+IGdldF90KCksDQogICAgfTsNCiAgfQ0KICBmdW5jdGlvbiBiaW5kX2NoZWNrZWQoaW5wdXQsIGdldDIsIHNldDIgPSBnZXQyKSB7DQogICAgbGlzdGVuX3RvX2V2ZW50X2FuZF9yZXNldF9ldmVudChpbnB1dCwgJ2NoYW5nZScsIChpc19yZXNldCkgPT4gew0KICAgICAgdmFyIHZhbHVlID0gaXNfcmVzZXQgPyBpbnB1dC5kZWZhdWx0Q2hlY2tlZCA6IGlucHV0LmNoZWNrZWQ7DQogICAgICBzZXQyKHZhbHVlKTsNCiAgICB9KTsNCiAgICBpZiAoDQogICAgICAvLyBJZiB3ZSBhcmUgaHlkcmF0aW5nIGFuZCB0aGUgdmFsdWUgaGFzIHNpbmNlIGNoYW5nZWQsDQogICAgICAvLyB0aGVuIHVzZSB0aGUgdXBkYXRlIHZhbHVlIGZyb20gdGhlIGlucHV0IGluc3RlYWQuDQogICAgICAvLyBJZiBkZWZhdWx0Q2hlY2tlZCBpcyBzZXQsIHRoZW4gY2hlY2tlZCA9PSBkZWZhdWx0Q2hlY2tlZA0KICAgICAgdW50cmFjayhnZXQyKSA9PSBudWxsDQogICAgKSB7DQogICAgICBzZXQyKGlucHV0LmNoZWNrZWQpOw0KICAgIH0NCiAgICByZW5kZXJfZWZmZWN0KCgpID0+IHsNCiAgICAgIHZhciB2YWx1ZSA9IGdldDIoKTsNCiAgICAgIGlucHV0LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTsNCiAgICB9KTsNCiAgfQ0KICBmdW5jdGlvbiBpc19ib3VuZF90aGlzKGJvdW5kX3ZhbHVlLCBlbGVtZW50X29yX2NvbXBvbmVudCkgew0KICAgIHJldHVybiAoDQogICAgICBib3VuZF92YWx1ZSA9PT0gZWxlbWVudF9vcl9jb21wb25lbnQgfHwNCiAgICAgIChib3VuZF92YWx1ZSA9PSBudWxsID8gdm9pZCAwIDogYm91bmRfdmFsdWVbU1RBVEVfU1lNQk9MXSkgPT09DQogICAgICAgIGVsZW1lbnRfb3JfY29tcG9uZW50DQogICAgKTsNCiAgfQ0KICBmdW5jdGlvbiBiaW5kX3RoaXMoZWxlbWVudF9vcl9jb21wb25lbnQgPSB7fSwgdXBkYXRlLCBnZXRfdmFsdWUsIGdldF9wYXJ0cykgew0KICAgIGVmZmVjdCgoKSA9PiB7DQogICAgICB2YXIgb2xkX3BhcnRzOw0KICAgICAgdmFyIHBhcnRzOw0KICAgICAgcmVuZGVyX2VmZmVjdCgoKSA9PiB7DQogICAgICAgIG9sZF9wYXJ0cyA9IHBhcnRzOw0KICAgICAgICBwYXJ0cyA9IFtdOw0KICAgICAgICB1bnRyYWNrKCgpID0+IHsNCiAgICAgICAgICBpZiAoZWxlbWVudF9vcl9jb21wb25lbnQgIT09IGdldF92YWx1ZSguLi5wYXJ0cykpIHsNCiAgICAgICAgICAgIHVwZGF0ZShlbGVtZW50X29yX2NvbXBvbmVudCwgLi4ucGFydHMpOw0KICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICBvbGRfcGFydHMgJiYNCiAgICAgICAgICAgICAgaXNfYm91bmRfdGhpcyhnZXRfdmFsdWUoLi4ub2xkX3BhcnRzKSwgZWxlbWVudF9vcl9jb21wb25lbnQpDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgdXBkYXRlKG51bGwsIC4uLm9sZF9wYXJ0cyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0pOw0KICAgICAgcmV0dXJuICgpID0+IHsNCiAgICAgICAgcXVldWVfbWljcm9fdGFzaygoKSA9PiB7DQogICAgICAgICAgaWYgKA0KICAgICAgICAgICAgcGFydHMgJiYNCiAgICAgICAgICAgIGlzX2JvdW5kX3RoaXMoZ2V0X3ZhbHVlKC4uLnBhcnRzKSwgZWxlbWVudF9vcl9jb21wb25lbnQpDQogICAgICAgICAgKSB7DQogICAgICAgICAgICB1cGRhdGUobnVsbCwgLi4ucGFydHMpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9Ow0KICAgIH0pOw0KICAgIHJldHVybiBlbGVtZW50X29yX2NvbXBvbmVudDsNCiAgfQ0KICBmdW5jdGlvbiBiaW5kX3Byb3BlcnR5KHByb3BlcnR5LCBldmVudF9uYW1lLCBlbGVtZW50LCBzZXQyLCBnZXQyKSB7DQogICAgdmFyIGhhbmRsZXIgPSAoKSA9PiB7DQogICAgICBzZXQyKGVsZW1lbnRbcHJvcGVydHldKTsNCiAgICB9Ow0KICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudF9uYW1lLCBoYW5kbGVyKTsNCiAgICBpZiAoZ2V0Mikgew0KICAgICAgcmVuZGVyX2VmZmVjdCgoKSA9PiB7DQogICAgICAgIGVsZW1lbnRbcHJvcGVydHldID0gZ2V0MigpOw0KICAgICAgfSk7DQogICAgfSBlbHNlIHsNCiAgICAgIGhhbmRsZXIoKTsNCiAgICB9DQogICAgaWYgKA0KICAgICAgZWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSB8fA0KICAgICAgZWxlbWVudCA9PT0gd2luZG93IHx8DQogICAgICBlbGVtZW50ID09PSBkb2N1bWVudA0KICAgICkgew0KICAgICAgdGVhcmRvd24oKCkgPT4gew0KICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRfbmFtZSwgaGFuZGxlcik7DQogICAgICB9KTsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGZuKSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7DQogICAgICB2YXIgZXZlbnQyID0NCiAgICAgICAgLyoqIEB0eXBlIHtFdmVudH0gKi8NCiAgICAgICAgYXJnc1swXTsNCiAgICAgIGV2ZW50Mi5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgIHJldHVybiBmbiA9PSBudWxsID8gdm9pZCAwIDogZm4uYXBwbHkodGhpcywgYXJncyk7DQogICAgfTsNCiAgfQ0KICBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChmbikgew0KICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgew0KICAgICAgdmFyIGV2ZW50MiA9DQogICAgICAgIC8qKiBAdHlwZSB7RXZlbnR9ICovDQogICAgICAgIGFyZ3NbMF07DQogICAgICBldmVudDIucHJldmVudERlZmF1bHQoKTsNCiAgICAgIHJldHVybiBmbiA9PSBudWxsID8gdm9pZCAwIDogZm4uYXBwbHkodGhpcywgYXJncyk7DQogICAgfTsNCiAgfQ0KICBmdW5jdGlvbiBpbml0KGltbXV0YWJsZSA9IGZhbHNlKSB7DQogICAgY29uc3QgY29udGV4dCA9DQogICAgICAvKiogQHR5cGUge0NvbXBvbmVudENvbnRleHRMZWdhY3l9ICovDQogICAgICBjb21wb25lbnRfY29udGV4dDsNCiAgICBjb25zdCBjYWxsYmFja3MgPSBjb250ZXh0LmwudTsNCiAgICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuOw0KICAgIGxldCBwcm9wcyA9ICgpID0+IGRlZXBfcmVhZF9zdGF0ZShjb250ZXh0LnMpOw0KICAgIGlmIChpbW11dGFibGUpIHsNCiAgICAgIGxldCB2ZXJzaW9uID0gMDsNCiAgICAgIGxldCBwcmV2ID0NCiAgICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLw0KICAgICAgICB7fTsNCiAgICAgIGNvbnN0IGQgPSAvKiBAX19QVVJFX18gKi8gZGVyaXZlZCgoKSA9PiB7DQogICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7DQogICAgICAgIGNvbnN0IHByb3BzMiA9IGNvbnRleHQuczsNCiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMyKSB7DQogICAgICAgICAgaWYgKHByb3BzMltrZXldICE9PSBwcmV2W2tleV0pIHsNCiAgICAgICAgICAgIHByZXZba2V5XSA9IHByb3BzMltrZXldOw0KICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChjaGFuZ2VkKSB2ZXJzaW9uKys7DQogICAgICAgIHJldHVybiB2ZXJzaW9uOw0KICAgICAgfSk7DQogICAgICBwcm9wcyA9ICgpID0+IGdldChkKTsNCiAgICB9DQogICAgaWYgKGNhbGxiYWNrcy5iLmxlbmd0aCkgew0KICAgICAgdXNlcl9wcmVfZWZmZWN0KCgpID0+IHsNCiAgICAgICAgb2JzZXJ2ZV9hbGwoY29udGV4dCwgcHJvcHMpOw0KICAgICAgICBydW5fYWxsKGNhbGxiYWNrcy5iKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgICB1c2VyX2VmZmVjdCgoKSA9PiB7DQogICAgICBjb25zdCBmbnMgPSB1bnRyYWNrKCgpID0+IGNhbGxiYWNrcy5tLm1hcChydW4pKTsNCiAgICAgIHJldHVybiAoKSA9PiB7DQogICAgICAgIGZvciAoY29uc3QgZm4gb2YgZm5zKSB7DQogICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgZm4oKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH07DQogICAgfSk7DQogICAgaWYgKGNhbGxiYWNrcy5hLmxlbmd0aCkgew0KICAgICAgdXNlcl9lZmZlY3QoKCkgPT4gew0KICAgICAgICBvYnNlcnZlX2FsbChjb250ZXh0LCBwcm9wcyk7DQogICAgICAgIHJ1bl9hbGwoY2FsbGJhY2tzLmEpOw0KICAgICAgfSk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIG9ic2VydmVfYWxsKGNvbnRleHQsIHByb3BzKSB7DQogICAgaWYgKGNvbnRleHQubC5zKSB7DQogICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjb250ZXh0LmwucykgZ2V0KHNpZ25hbCk7DQogICAgfQ0KICAgIHByb3BzKCk7DQogIH0NCiAgZnVuY3Rpb24gYnViYmxlX2V2ZW50KCQkcHJvcHMsIGV2ZW50Mikgew0KICAgIHZhciBfYTI7DQogICAgdmFyIGV2ZW50cyA9DQogICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIEZ1bmN0aW9uW10gfCBGdW5jdGlvbj59ICovDQogICAgICAoX2EyID0gJCRwcm9wcy4kJGV2ZW50cykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMltldmVudDIudHlwZV07DQogICAgdmFyIGNhbGxiYWNrcyA9IGlzX2FycmF5KGV2ZW50cykNCiAgICAgID8gZXZlbnRzLnNsaWNlKCkNCiAgICAgIDogZXZlbnRzID09IG51bGwNCiAgICAgICAgPyBbXQ0KICAgICAgICA6IFtldmVudHNdOw0KICAgIGZvciAodmFyIGZuIG9mIGNhbGxiYWNrcykgew0KICAgICAgZm4uY2FsbCh0aGlzLCBldmVudDIpOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBvbk1vdW50KGZuKSB7DQogICAgaWYgKGNvbXBvbmVudF9jb250ZXh0ID09PSBudWxsKSB7DQogICAgICBsaWZlY3ljbGVfb3V0c2lkZV9jb21wb25lbnQoKTsNCiAgICB9DQogICAgaWYgKGxlZ2FjeV9tb2RlX2ZsYWcgJiYgY29tcG9uZW50X2NvbnRleHQubCAhPT0gbnVsbCkgew0KICAgICAgaW5pdF91cGRhdGVfY2FsbGJhY2tzKGNvbXBvbmVudF9jb250ZXh0KS5tLnB1c2goZm4pOw0KICAgIH0gZWxzZSB7DQogICAgICB1c2VyX2VmZmVjdCgoKSA9PiB7DQogICAgICAgIGNvbnN0IGNsZWFudXAgPSB1bnRyYWNrKGZuKTsNCiAgICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSAnZnVuY3Rpb24nKQ0KICAgICAgICAgIHJldHVybiAoDQogICAgICAgICAgICAvKiogQHR5cGUgeygpID0+IHZvaWR9ICovDQogICAgICAgICAgICBjbGVhbnVwDQogICAgICAgICAgKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KICBmdW5jdGlvbiBpbml0X3VwZGF0ZV9jYWxsYmFja3MoY29udGV4dCkgew0KICAgIHZhciBsID0NCiAgICAgIC8qKiBAdHlwZSB7Q29tcG9uZW50Q29udGV4dExlZ2FjeX0gKi8NCiAgICAgIGNvbnRleHQubDsNCiAgICByZXR1cm4gbC51ID8/IChsLnUgPSB7IGE6IFtdLCBiOiBbXSwgbTogW10gfSk7DQogIH0NCiAgY29uc3QgUFVCTElDX1ZFUlNJT04gPSAnNSc7DQogIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgew0KICAgICgNCiAgICAgIChfYSA9IHdpbmRvdy5fX3N2ZWx0ZSA/PyAod2luZG93Ll9fc3ZlbHRlID0ge30pKS52ID8/DQogICAgICAoX2EudiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpDQogICAgKS5hZGQoUFVCTElDX1ZFUlNJT04pOw0KICB9DQogIGVuYWJsZV9sZWdhY3lfbW9kZV9mbGFnKCk7DQogIHZhciBfR01fYWRkU3R5bGUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+DQogICAgdHlwZW9mIEdNX2FkZFN0eWxlICE9ICd1bmRlZmluZWQnID8gR01fYWRkU3R5bGUgOiB2b2lkIDApKCk7DQogIHZhciBfR01fb3BlbkluVGFiID0gLyogQF9fUFVSRV9fICovICgoKSA9Pg0KICAgIHR5cGVvZiBHTV9vcGVuSW5UYWIgIT0gJ3VuZGVmaW5lZCcgPyBHTV9vcGVuSW5UYWIgOiB2b2lkIDApKCk7DQogIHZhciBfR01feG1saHR0cFJlcXVlc3QgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+DQogICAgdHlwZW9mIEdNX3htbGh0dHBSZXF1ZXN0ICE9ICd1bmRlZmluZWQnID8gR01feG1saHR0cFJlcXVlc3QgOiB2b2lkIDApKCk7DQogIGNvbnN0IGJhc2VVcmwgPSAnaHR0cHM6Ly9hcGkyLmphc29uemsuY29tJzsNCiAgY29uc3QgZ2V0QWRzID0gYCR7YmFzZVVybH0vYWRzL2xpc3RgOw0KICBjb25zdCB0b3VjaFdlaWJvID0gYCR7YmFzZVVybH0vcmVkaXJlY3Qvd2VpYm9gOw0KICBjb25zdCBBUEkgPSB7DQogICAgZ2V0QWRzLA0KICAgIHRvdWNoV2VpYm8sDQogIH07DQogIGFzeW5jIGZ1bmN0aW9uIG9wZW5OZXdUYWIodXJsLCBhY3RpdmUgPSB0cnVlLCByZWwgPSAnaHR0cHM6Ly93d3cud2VpYm8uY29tJykgew0KICAgIGlmIChfR01fb3BlbkluVGFiKSB7DQogICAgICBfR01fb3BlbkluVGFiKHVybCwgeyBhY3RpdmUgfSk7DQogICAgfSBlbHNlIHsNCiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICBhLmhyZWYgPSB1cmw7DQogICAgICBhLnRhcmdldCA9ICdfYmxhbmsnOw0KICAgICAgYS5yZWwgPSByZWwgPz8gJ25vcmVmZXJyZXInOw0KICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsNCiAgICAgIGEuY2xpY2soKTsNCiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7DQogICAgfQ0KICB9DQogIHZhciByb290XzIkMSA9IC8qIEBfX1BVUkVfXyAqLyB0ZW1wbGF0ZShgPGRpdj4gPC9kaXY+YCk7DQogIHZhciByb290XzEkMSA9IC8qIEBfX1BVUkVfXyAqLyB0ZW1wbGF0ZSgNCiAgICBgPGRpdiBjbGFzcz0iaW1nLWRvd25sb2FkZXItYWQtY29udGFpbmVyIj48IT48L2Rpdj5gLA0KICApOw0KICBmdW5jdGlvbiBUZXh0QWQoJCRhbmNob3IsICQkcHJvcHMpIHsNCiAgICBwdXNoKCQkcHJvcHMsIGZhbHNlKTsNCiAgICBsZXQgY3VycmVudEluZGV4ID0gLyogQF9fUFVSRV9fICovIG11dGFibGVfc291cmNlKDApOw0KICAgIGxldCBpc0FuaW1hdGluZyA9IC8qIEBfX1BVUkVfXyAqLyBtdXRhYmxlX3NvdXJjZSh0cnVlKTsNCiAgICBsZXQgY29udGFpbmVyID0gLyogQF9fUFVSRV9fICovIG11dGFibGVfc291cmNlKCk7DQogICAgbGV0IHNob3cgPSAvKiBAX19QVVJFX18gKi8gbXV0YWJsZV9zb3VyY2UodHJ1ZSk7DQogICAgbGV0IGFkcyA9IC8qIEBfX1BVUkVfXyAqLyBtdXRhYmxlX3NvdXJjZShbXSk7DQogICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBZHMoKSB7DQogICAgICB0cnkgew0KICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICAgICAgICBfR01feG1saHR0cFJlcXVlc3Qoew0KICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywNCiAgICAgICAgICAgIHVybDogQVBJLmdldEFkcywNCiAgICAgICAgICAgIGhlYWRlcnM6IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicgfSwNCiAgICAgICAgICAgIG9ubG9hZDogcmVzb2x2ZSwNCiAgICAgICAgICAgIG9uZXJyb3I6IHJlamVjdCwNCiAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgew0KICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7DQogICAgICAgICAgY29uc3QgZGF0YSA9IGpzb24uZGF0YTsNCiAgICAgICAgICBzZXQoc2hvdywgZGF0YS5zaG93KTsNCiAgICAgICAgICBzZXQoYWRzLCBkYXRhLmxpc3QpOw0KICAgICAgICB9DQogICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggYWRzOicsIGVycm9yKTsNCiAgICAgIH0NCiAgICB9DQogICAgZnVuY3Rpb24gbmV4dEFkKCkgew0KICAgICAgc2V0KGlzQW5pbWF0aW5nLCB0cnVlKTsNCiAgICAgIHNldChjdXJyZW50SW5kZXgsIChnZXQoY3VycmVudEluZGV4KSArIDEpICUgZ2V0KGFkcykubGVuZ3RoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gb25BbmltYXRpb25FbmQoKSB7DQogICAgICBzZXQoaXNBbmltYXRpbmcsIGZhbHNlKTsNCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICBpZiAoZ2V0KGFkcykubGVuZ3RoID4gMSkgew0KICAgICAgICAgIG5leHRBZCgpOw0KICAgICAgICB9DQogICAgICB9LCA1ZTMpOw0KICAgIH0NCiAgICBmdW5jdGlvbiBoYW5kbGVDbGljaygpIHsNCiAgICAgIGlmIChnZXQoYWRzKVtnZXQoY3VycmVudEluZGV4KV0pIHsNCiAgICAgICAgX0dNX3htbGh0dHBSZXF1ZXN0KHsNCiAgICAgICAgICBtZXRob2Q6ICdHRVQnLA0KICAgICAgICAgIHVybDogYCR7QVBJLnRvdWNoV2VpYm99P3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChnZXQoYWRzKVtnZXQoY3VycmVudEluZGV4KV0ubGluayl9YCwNCiAgICAgICAgICBoZWFkZXJzOiB7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nIH0sDQogICAgICAgIH0pOw0KICAgICAgICBvcGVuTmV3VGFiKGdldChhZHMpW2dldChjdXJyZW50SW5kZXgpXS5saW5rKTsNCiAgICAgIH0NCiAgICB9DQogICAgb25Nb3VudCgoKSA9PiB7DQogICAgICBfR01fYWRkU3R5bGUoYA0KICAgICAgLmltZy1kb3dubG9hZGVyLWFkLWNvbnRhaW5lciB7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICBoZWlnaHQ6IDI0cHg7DQogICAgICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgICAgIGJhY2tncm91bmQ6ICNmOGY5ZmE7DQogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICAgICAgbWFyZ2luOiA4cHggMDsNCiAgICAgICAgY3Vyc29yOiBwb2ludGVyOw0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICB9DQoNCiAgICAgIC5pbWctZG93bmxvYWRlci1yb2xsLXRleHQgew0KICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgICAgIGNvbG9yOiAjNjY2Ow0KICAgICAgICBmb250LXNpemU6IDEzcHg7DQogICAgICAgIHBhZGRpbmc6IDRweCA4cHg7DQogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogICAgICB9DQoNCiAgICAgIC5pbWctZG93bmxvYWRlci1yb2xsLXRleHQuYW5pbWF0aW5nIHsNCiAgICAgICAgYW5pbWF0aW9uOiBpbWdEb3dubG9hZGVyTWFycXVlZSA4cyBsaW5lYXI7DQogICAgICB9DQoNCiAgICAgIC5pbWctZG93bmxvYWRlci1yb2xsLXRleHQ6aG92ZXIgew0KICAgICAgICBjb2xvcjogIzBkNmVmZDsNCiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQogICAgICB9DQoNCiAgICAgIEBrZXlmcmFtZXMgaW1nRG93bmxvYWRlck1hcnF1ZWUgew0KICAgICAgICAwJSB7DQogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOw0KICAgICAgICB9DQogICAgICAgIDEwMCUgew0KICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICBgKTsNCiAgICAgIGZldGNoQWRzKCk7DQogICAgfSk7DQogICAgaW5pdCgpOw0KICAgIHZhciBmcmFnbWVudCA9IGNvbW1lbnQoKTsNCiAgICB2YXIgbm9kZSA9IGZpcnN0X2NoaWxkKGZyYWdtZW50KTsNCiAgICB7DQogICAgICB2YXIgY29uc2VxdWVudF8xID0gKCQkYW5jaG9yMikgPT4gew0KICAgICAgICB2YXIgZGl2ID0gcm9vdF8xJDEoKTsNCiAgICAgICAgdmFyIG5vZGVfMSA9IGNoaWxkKGRpdik7DQogICAgICAgIHsNCiAgICAgICAgICB2YXIgY29uc2VxdWVudCA9ICgkJGFuY2hvcjMpID0+IHsNCiAgICAgICAgICAgIHZhciBkaXZfMSA9IHJvb3RfMiQxKCk7DQogICAgICAgICAgICBsZXQgY2xhc3NlczsNCiAgICAgICAgICAgIHZhciB0ZXh0ID0gY2hpbGQoZGl2XzEpOw0KICAgICAgICAgICAgdGVtcGxhdGVfZWZmZWN0KA0KICAgICAgICAgICAgICAoJDApID0+IHsNCiAgICAgICAgICAgICAgICBjbGFzc2VzID0gc2V0X2NsYXNzKA0KICAgICAgICAgICAgICAgICAgZGl2XzEsDQogICAgICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAgICAgJ2ltZy1kb3dubG9hZGVyLXJvbGwtdGV4dCcsDQogICAgICAgICAgICAgICAgICBudWxsLA0KICAgICAgICAgICAgICAgICAgY2xhc3NlcywNCiAgICAgICAgICAgICAgICAgICQwLA0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgc2V0X3RleHQodGV4dCwgZ2V0KGFkcylbZ2V0KGN1cnJlbnRJbmRleCldLnRleHQpOw0KICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICBbKCkgPT4gKHsgYW5pbWF0aW5nOiBnZXQoaXNBbmltYXRpbmcpIH0pXSwNCiAgICAgICAgICAgICAgZGVyaXZlZF9zYWZlX2VxdWFsLA0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIGV2ZW50KCdhbmltYXRpb25lbmQnLCBkaXZfMSwgb25BbmltYXRpb25FbmQpOw0KICAgICAgICAgICAgZXZlbnQoJ2NsaWNrJywgZGl2XzEsIGhhbmRsZUNsaWNrKTsNCiAgICAgICAgICAgIGFwcGVuZCgkJGFuY2hvcjMsIGRpdl8xKTsNCiAgICAgICAgICB9Ow0KICAgICAgICAgIGlmX2Jsb2NrKG5vZGVfMSwgKCQkcmVuZGVyKSA9PiB7DQogICAgICAgICAgICBpZiAoZ2V0KGFkcylbZ2V0KGN1cnJlbnRJbmRleCldKSAkJHJlbmRlcihjb25zZXF1ZW50KTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBiaW5kX3RoaXMoDQogICAgICAgICAgZGl2LA0KICAgICAgICAgICgkJHZhbHVlKSA9PiBzZXQoY29udGFpbmVyLCAkJHZhbHVlKSwNCiAgICAgICAgICAoKSA9PiBnZXQoY29udGFpbmVyKSwNCiAgICAgICAgKTsNCiAgICAgICAgYXBwZW5kKCQkYW5jaG9yMiwgZGl2KTsNCiAgICAgIH07DQogICAgICBpZl9ibG9jayhub2RlLCAoJCRyZW5kZXIpID0+IHsNCiAgICAgICAgaWYgKGdldChzaG93KSAmJiBnZXQoYWRzKS5sZW5ndGggPiAwKSAkJHJlbmRlcihjb25zZXF1ZW50XzEpOw0KICAgICAgfSk7DQogICAgfQ0KICAgIGFwcGVuZCgkJGFuY2hvciwgZnJhZ21lbnQpOw0KICAgIHBvcCgpOw0KICB9DQogIGNvbnN0IGxpbmVhciA9ICh4KSA9PiB4Ow0KICBmdW5jdGlvbiBmYWRlKG5vZGUsIHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDQwMCwgZWFzaW5nID0gbGluZWFyIH0gPSB7fSkgew0KICAgIGNvbnN0IG8gPSArZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5vcGFjaXR5Ow0KICAgIHJldHVybiB7DQogICAgICBkZWxheSwNCiAgICAgIGR1cmF0aW9uLA0KICAgICAgZWFzaW5nLA0KICAgICAgY3NzOiAodCkgPT4gYG9wYWNpdHk6ICR7dCAqIG99YCwNCiAgICB9Ow0KICB9DQogIHZhciByb290XzEgPSAvKiBAX19QVVJFX18gKi8gdGVtcGxhdGUoDQogICAgYDxkaXYgY2xhc3M9ImltYWdlLXByZXZpZXctb3ZlcmxheSI+PGRpdiBjbGFzcz0iaW1hZ2UtcHJldmlldy1jb250ZW50Ij48YnV0dG9uIGNsYXNzPSJwcmV2aWV3LWNsb3NlLWJ1dHRvbiIgdGl0bGU9IuWFs+mXremihOiniCI+4pyWPC9idXR0b24+IDxpbWcgYWx0PSJJbWFnZSBQcmV2aWV3Ij48L2Rpdj48L2Rpdj5gLA0KICApOw0KICB2YXIgcm9vdF8zID0gLyogQF9fUFVSRV9fICovIHRlbXBsYXRlKA0KICAgIGA8ZGl2IGNsYXNzPSJzZWxlY3QtYWxsLWNvbnRhaW5lciI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ic2VsZWN0LWFsbCI+IDxsYWJlbCBmb3I9InNlbGVjdC1hbGwiPiA8L2xhYmVsPjwvZGl2PmAsDQogICk7DQogIHZhciByb290XzYgPSAvKiBAX19QVVJFX18gKi8gdGVtcGxhdGUoDQogICAgYDxpbWcgYWx0PSJUaHVtYm5haWwiIGNsYXNzPSJ0aHVtYm5haWwiIGxvYWRpbmc9ImxhenkiIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7Ij5gLA0KICApOw0KICB2YXIgcm9vdF81ID0gLyogQF9fUFVSRV9fICovIHRlbXBsYXRlKA0KICAgIGA8bGFiZWwgY2xhc3M9ImltYWdlLWl0ZW0iPjxpbnB1dCB0eXBlPSJjaGVja2JveCI+IDwhPiA8c3BhbiBjbGFzcz0iaW1hZ2UtdXJsIj4gPC9zcGFuPjwvbGFiZWw+YCwNCiAgKTsNCiAgdmFyIHJvb3RfOCA9IC8qIEBfX1BVUkVfXyAqLyB0ZW1wbGF0ZSgNCiAgICBgPHAgc3R5bGU9InBhZGRpbmc6IDVweDsiPuacquaJvuWIsOWbvueJh+aIluWwmuacquafpeaJvuOAgjwvcD5gLA0KICApOw0KICB2YXIgcm9vdF85ID0gLyogQF9fUFVSRV9fICovIHRlbXBsYXRlKGA8cD7mraPlnKjmn6Xmib4uLi48L3A+YCk7DQogIHZhciByb290XzIgPSAvKiBAX19QVVJFX18gKi8gdGVtcGxhdGUoDQogICAgYDxkaXYgaWQ9ImltYWdlLWRvd25sb2FkZXItcGFuZWwiIHN0eWxlPSJyaWdodDogMjBweDsgYm90dG9tOiAyMHB4Ij48aDM+PHNwYW4+5Zu+54mH5LiL6L295ZmoPC9zcGFuPiA8ZGl2PjxidXR0b24gY2xhc3M9InRvZ2dsZS10aHVtYnMtYnV0dG9uIj4gPC9idXR0b24+IDxidXR0b24gY2xhc3M9ImNsb3NlLWJ1dHRvbiIgdGl0bGU9IuWFs+mXremdouadvyI+4pyWPC9idXR0b24+PC9kaXY+PC9oMz4gPCE+IDxkaXYgY2xhc3M9InBhbmVsLWNvbnRyb2xzIj48YnV0dG9uIGNsYXNzPSJwcmltYXJ5LWJ1dHRvbiI+5p+l5om+5Zu+54mHPC9idXR0b24+PC9kaXY+IDwhPiA8ZGl2IGNsYXNzPSJpbWFnZS1saXN0Ij48IT4gPCE+PC9kaXY+IDxidXR0b24gY2xhc3M9ImRvd25sb2FkLWJ1dHRvbiI+5LiL6L296YCJ5Lit5Zu+54mHPC9idXR0b24+IDxkaXYgY2xhc3M9InN0YXR1cy1iYXIiPiA8L2Rpdj48L2Rpdj5gLA0KICApOw0KICB2YXIgcm9vdF8xMCA9IC8qIEBfX1BVUkVfXyAqLyB0ZW1wbGF0ZSgNCiAgICBgPGJ1dHRvbiBjbGFzcz0iaW1hZ2UtZG93bmxvYWRlci10b2dnbGUtYnRuIiB0aXRsZT0i5omT5byA5Zu+54mH5LiL6L295ZmoIChBbHQgKyBIIOmakOiXjy9BbHQgKyBTIOaYvuekuikiPjxkaXYgY2xhc3M9ImNsb3NlLWljb24iIHRpdGxlPSLpmpDol4/mjInpkq4gKEFsdCArIFMg5Y+v6YeN5paw5pi+56S6KSI+w5c8L2Rpdj4gPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ij48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz0iNyAxMCAxMiAxNSAxNyAxMCI+PC9wb2x5bGluZT48bGluZSB4MT0iMTIiIHkxPSIxNSIgeDI9IjEyIiB5Mj0iMyI+PC9saW5lPjwvc3ZnPjwvYnV0dG9uPmAsDQogICk7DQogIHZhciByb290ID0gLyogQF9fUFVSRV9fICovIHRlbXBsYXRlKGA8IT4gPCE+IDwhPmAsIDEpOw0KICBmdW5jdGlvbiBBcHAoJCRhbmNob3IsICQkcHJvcHMpIHsNCiAgICBwdXNoKCQkcHJvcHMsIGZhbHNlKTsNCiAgICBjb25zdCBhbGxTZWxlY3RlZCA9IC8qIEBfX1BVUkVfXyAqLyBtdXRhYmxlX3NvdXJjZSgpOw0KICAgIGNvbnN0IGluZGV0ZXJtaW5hdGUgPSAvKiBAX19QVVJFX18gKi8gbXV0YWJsZV9zb3VyY2UoKTsNCiAgICBsZXQgaW1hZ2VzID0gLyogQF9fUFVSRV9fICovIG11dGFibGVfc291cmNlKFtdKTsNCiAgICBsZXQgc3RhdHVzID0gLyogQF9fUFVSRV9fICovIG11dGFibGVfc291cmNlKCfngrnlh7vigJzmn6Xmib7lm77niYfigJ3lvIDlp4snKTsNCiAgICBsZXQgbG9hZGluZyA9IC8qIEBfX1BVUkVfXyAqLyBtdXRhYmxlX3NvdXJjZShmYWxzZSk7DQogICAgbGV0IHBhbmVsVmlzaWJsZSA9IC8qIEBfX1BVUkVfXyAqLyBtdXRhYmxlX3NvdXJjZShmYWxzZSk7DQogICAgbGV0IHNob3dUaHVtYm5haWxzID0gLyogQF9fUFVSRV9fICovIG11dGFibGVfc291cmNlKHRydWUpOw0KICAgIGxldCBidXR0b25WaXNpYmxlID0gLyogQF9fUFVSRV9fICovIG11dGFibGVfc291cmNlKHRydWUpOw0KICAgIGxldCBwcmV2aWV3VmlzaWJsZSA9IC8qIEBfX1BVUkVfXyAqLyBtdXRhYmxlX3NvdXJjZShmYWxzZSk7DQogICAgbGV0IHByZXZpZXdJbWFnZVVybCA9IC8qIEBfX1BVUkVfXyAqLyBtdXRhYmxlX3NvdXJjZSgnJyk7DQogICAgbGV0IHBhbmVsRWxlbWVudCA9IC8qIEBfX1BVUkVfXyAqLyBtdXRhYmxlX3NvdXJjZSgpOw0KICAgIGxldCBpc0RyYWdnaW5nID0gLyogQF9fUFVSRV9fICovIG11dGFibGVfc291cmNlKGZhbHNlKTsNCiAgICBsZXQgc3RhcnRYLCBzdGFydFksIGluaXRpYWxSaWdodCwgaW5pdGlhbEJvdHRvbTsNCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQyKSB7DQogICAgICB2YXIgX2EyOw0KICAgICAgaWYgKA0KICAgICAgICAoX2EyID0gZXZlbnQyLnRhcmdldCkgPT0gbnVsbA0KICAgICAgICAgID8gdm9pZCAwDQogICAgICAgICAgOiBfYTIuY2xvc2VzdCgnYnV0dG9uLCBpbnB1dCwgbGFiZWwsIGltZycpDQogICAgICApIHsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KICAgICAgc2V0KGlzRHJhZ2dpbmcsIHRydWUpOw0KICAgICAgc3RhcnRYID0gZXZlbnQyLmNsaWVudFg7DQogICAgICBzdGFydFkgPSBldmVudDIuY2xpZW50WTsNCiAgICAgIGNvbnN0IHJlY3QgPSBnZXQocGFuZWxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICAgIGluaXRpYWxSaWdodCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcmVjdC5yaWdodDsNCiAgICAgIGluaXRpYWxCb3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbTsNCiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7DQogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudDIpIHsNCiAgICAgIGlmICghZ2V0KGlzRHJhZ2dpbmcpKSByZXR1cm47DQogICAgICBjb25zdCBkeCA9IHN0YXJ0WCAtIGV2ZW50Mi5jbGllbnRYOw0KICAgICAgY29uc3QgZHkgPSBzdGFydFkgLSBldmVudDIuY2xpZW50WTsNCiAgICAgIG11dGF0ZSgNCiAgICAgICAgcGFuZWxFbGVtZW50LA0KICAgICAgICAoZ2V0KHBhbmVsRWxlbWVudCkuc3R5bGUucmlnaHQgPSBgJHtpbml0aWFsUmlnaHQgKyBkeH1weGApLA0KICAgICAgKTsNCiAgICAgIG11dGF0ZSgNCiAgICAgICAgcGFuZWxFbGVtZW50LA0KICAgICAgICAoZ2V0KHBhbmVsRWxlbWVudCkuc3R5bGUuYm90dG9tID0gYCR7aW5pdGlhbEJvdHRvbSArIGR5fXB4YCksDQogICAgICApOw0KICAgIH0NCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKCkgew0KICAgICAgaWYgKCFnZXQoaXNEcmFnZ2luZykpIHJldHVybjsNCiAgICAgIHNldChpc0RyYWdnaW5nLCBmYWxzZSk7DQogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpOw0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApOw0KICAgIH0NCiAgICBmdW5jdGlvbiBmaW5kSW1hZ2VzKCkgew0KICAgICAgc2V0KGxvYWRpbmcsIHRydWUpOw0KICAgICAgc2V0KHN0YXR1cywgJ+ato+WcqOafpeaJvumhtemdouWbvueJhy4uLicpOw0KICAgICAgc2V0KGltYWdlcywgW10pOw0KICAgICAgY29uc3QgZm91bmRVcmxzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsNCiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpLmZvckVhY2goKGltZykgPT4gew0KICAgICAgICBpZiAoaW1nLnNyYyAmJiBpbWcubmF0dXJhbFdpZHRoID4gNTAgJiYgaW1nLm5hdHVyYWxIZWlnaHQgPiA1MCkgew0KICAgICAgICAgIGZvdW5kVXJscy5hZGQoaW1nLnNyYyk7DQogICAgICAgIH0NCiAgICAgICAgY29uc3QgZGF0YVNyYyA9DQogICAgICAgICAgaW1nLmdldEF0dHJpYnV0ZSgnZGF0YS1zcmMnKSB8fCBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWxhenktc3JjJyk7DQogICAgICAgIGlmIChkYXRhU3JjKSB7DQogICAgICAgICAgZm91bmRVcmxzLmFkZChuZXcgVVJMKGRhdGFTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5ocmVmKTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykuZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7DQogICAgICAgIGNvbnN0IGJnSW1hZ2UgPSBzdHlsZS5iYWNrZ3JvdW5kSW1hZ2U7DQogICAgICAgIGlmIChiZ0ltYWdlICYmIGJnSW1hZ2UgIT09ICdub25lJyAmJiBiZ0ltYWdlLnN0YXJ0c1dpdGgoJ3VybCgiJykpIHsNCiAgICAgICAgICBjb25zdCB1cmxNYXRjaCA9IGJnSW1hZ2UubWF0Y2goL3VybFwoIj8oLis/KSI/XCkvKTsNCiAgICAgICAgICBpZiAodXJsTWF0Y2ggJiYgdXJsTWF0Y2hbMV0pIHsNCiAgICAgICAgICAgIGZvdW5kVXJscy5hZGQobmV3IFVSTCh1cmxNYXRjaFsxXSwgd2luZG93LmxvY2F0aW9uLmhyZWYpLmhyZWYpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgICBzZXQoDQogICAgICAgIGltYWdlcywNCiAgICAgICAgQXJyYXkuZnJvbShmb3VuZFVybHMpLm1hcCgodXJsLCBpbmRleCkgPT4gKHsNCiAgICAgICAgICB1cmwsDQogICAgICAgICAgc2VsZWN0ZWQ6IHRydWUsDQogICAgICAgICAgbmFtZTogYGltYWdlXyR7aW5kZXggKyAxfS4ke2dldEV4dGVuc2lvbih1cmwpfWAsDQogICAgICAgIH0pKSwNCiAgICAgICk7DQogICAgICBzZXQoc3RhdHVzLCBg5om+5YiwICR7Z2V0KGltYWdlcykubGVuZ3RofSDlvKDlm77niYdgKTsNCiAgICAgIHNldChsb2FkaW5nLCBmYWxzZSk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGdldEV4dGVuc2lvbih1cmwpIHsNCiAgICAgIHZhciBfYTI7DQogICAgICB0cnkgew0KICAgICAgICBjb25zdCBwYXRobmFtZSA9IG5ldyBVUkwodXJsKS5wYXRobmFtZTsNCiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRobmFtZS5zcGxpdCgnLicpOw0KICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkgew0KICAgICAgICAgIGxldCBleHQgPQ0KICAgICAgICAgICAgKChfYTIgPSBwYXJ0cy5wb3AoKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi50b0xvd2VyQ2FzZSgpKSB8fCAnanBnJzsNCiAgICAgICAgICBleHQgPSBleHQuc3BsaXQoJz8nKVswXTsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICBbJ2pwZycsICdqcGVnJywgJ3BuZycsICdnaWYnLCAnd2VicCcsICdibXAnLCAnc3ZnJ10uaW5jbHVkZXMoZXh0KQ0KICAgICAgICAgICkgew0KICAgICAgICAgICAgcmV0dXJuIGV4dDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gY2F0Y2ggKGUpIHt9DQogICAgICByZXR1cm4gJ2pwZyc7DQogICAgfQ0KICAgIGZ1bmN0aW9uIG9wZW5QcmV2aWV3KGltYWdlVXJsKSB7DQogICAgICBzZXQocHJldmlld0ltYWdlVXJsLCBpbWFnZVVybCk7DQogICAgICBzZXQocHJldmlld1Zpc2libGUsIHRydWUpOw0KICAgIH0NCiAgICBhc3luYyBmdW5jdGlvbiBkb3dubG9hZFNlbGVjdGVkKCkgew0KICAgICAgY29uc3Qgc2VsZWN0ZWRJbWFnZXMgPSBnZXQoaW1hZ2VzKS5maWx0ZXIoKGltZykgPT4gaW1nLnNlbGVjdGVkKTsNCiAgICAgIGlmIChzZWxlY3RlZEltYWdlcy5sZW5ndGggPT09IDApIHsNCiAgICAgICAgc2V0KHN0YXR1cywgJ+ivt+iHs+WwkemAieaLqeS4gOW8oOWbvueJhycpOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBzZXQobG9hZGluZywgdHJ1ZSk7DQogICAgICBzZXQoc3RhdHVzLCBg5YeG5aSH5LiL6L29ICR7c2VsZWN0ZWRJbWFnZXMubGVuZ3RofSDlvKDlm77niYcuLi5gKTsNCiAgICAgIGxldCBwcm9jZXNzZWRDb3VudCA9IDA7DQogICAgICBjb25zdCBmaWxlUHJvbWlzZXMgPSBzZWxlY3RlZEltYWdlcy5tYXAoKGltZywgaW5kZXgpID0+IHsNCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICAgICAgICBjb25zb2xlLmxvZygNCiAgICAgICAgICAgIGBbSW1hZ2UgRG93bmxvYWRlcl0g5byA5aeL6K+35rGCOiAke2ltZy5uYW1lfSAoJHtpbmRleCArIDF9LyR7c2VsZWN0ZWRJbWFnZXMubGVuZ3RofSlgLA0KICAgICAgICAgICk7DQogICAgICAgICAgZmV0Y2goaW1nLnVybCwgew0KICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywNCiAgICAgICAgICAgIG1vZGU6ICdjb3JzJywNCiAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgc2V0IENPUlMgbW9kZSwgdGhvdWdoICduby1jb3JzJyBtaWdodCBiZSBuZWVkZWQgc29tZXRpbWVzICh3aXRoIGxpbWl0YXRpb25zKQ0KICAgICAgICAgIH0pDQogICAgICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHsNCiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7DQogICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTsNCiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKA0KICAgICAgICAgICAgICAgICAgICBgW0ltYWdlIERvd25sb2FkZXJdIOS4i+i9veaIkOWKn+W5tui9rOaNouS4uiBVaW50OEFycmF5OiAke2ltZy5uYW1lfWAsDQogICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkQ291bnQrKzsNCiAgICAgICAgICAgICAgICAgIHNldCgNCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLA0KICAgICAgICAgICAgICAgICAgICBg5aSE55CG5LitICR7cHJvY2Vzc2VkQ291bnR9LyR7c2VsZWN0ZWRJbWFnZXMubGVuZ3RofS4uLiAo5oiQ5YqfOiAke2ltZy5uYW1lfSlgLA0KICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBuYW1lOiBpbWcubmFtZSwgZGF0YTogdWludDhBcnJheSB9KTsNCiAgICAgICAgICAgICAgICB9IGNhdGNoIChjb252ZXJzaW9uRXJyb3IpIHsNCiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoDQogICAgICAgICAgICAgICAgICAgIGBbSW1hZ2UgRG93bmxvYWRlcl0gQmxvYiDovawgVWludDhBcnJheSDlpLHotKU6ICR7aW1nLm5hbWV9YCwNCiAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkVycm9yLA0KICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZENvdW50Kys7DQogICAgICAgICAgICAgICAgICBzZXQoDQogICAgICAgICAgICAgICAgICAgIHN0YXR1cywNCiAgICAgICAgICAgICAgICAgICAgYOWkhOeQhuS4rSAke3Byb2Nlc3NlZENvdW50fS8ke3NlbGVjdGVkSW1hZ2VzLmxlbmd0aH0uLi4gKOi9rOaNouWksei0pTogJHtpbWcubmFtZX0pYCwNCiAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBCbG9iIGNvbnZlcnNpb24gZmFpbGVkIGZvciAke2ltZy5uYW1lfWApKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKA0KICAgICAgICAgICAgICAgICAgYFtJbWFnZSBEb3dubG9hZGVyXSBGZXRjaCDlpLHotKU6ICR7aW1nLnVybH0gKOeKtuaAgTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0pYCwNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIHByb2Nlc3NlZENvdW50Kys7DQogICAgICAgICAgICAgICAgc2V0KA0KICAgICAgICAgICAgICAgICAgc3RhdHVzLA0KICAgICAgICAgICAgICAgICAgYOWkhOeQhuS4rSAke3Byb2Nlc3NlZENvdW50fS8ke3NlbGVjdGVkSW1hZ2VzLmxlbmd0aH0uLi4gKEZldGNoIOWksei0pSAke3Jlc3BvbnNlLnN0YXR1c306ICR7aW1nLm5hbWV9KWAsDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICByZWplY3QoDQogICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoDQogICAgICAgICAgICAgICAgICAgIGBGZXRjaCBmYWlsZWQgZm9yICR7aW1nLm5hbWV9IHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfWAsDQogICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gew0KICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKA0KICAgICAgICAgICAgICAgIGBbSW1hZ2UgRG93bmxvYWRlcl0gRmV0Y2gg572R57uc6ZSZ6K+vL0NPUlM6ICR7aW1nLnVybH1gLA0KICAgICAgICAgICAgICAgIGVyciwNCiAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgcHJvY2Vzc2VkQ291bnQrKzsNCiAgICAgICAgICAgICAgc2V0KA0KICAgICAgICAgICAgICAgIHN0YXR1cywNCiAgICAgICAgICAgICAgICBg5aSE55CG5LitICR7cHJvY2Vzc2VkQ291bnR9LyR7c2VsZWN0ZWRJbWFnZXMubGVuZ3RofS4uLiAo572R57ucL0NPUlMg6ZSZ6K+vOiAke2ltZy5uYW1lfSlgLA0KICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICByZWplY3QoDQogICAgICAgICAgICAgICAgbmV3IEVycm9yKA0KICAgICAgICAgICAgICAgICAgYEZldGNoIG5ldHdvcmsvQ09SUyBlcnJvciBmb3IgJHtpbWcubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCwNCiAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgfSk7DQogICAgICBzZXQoc3RhdHVzLCBg562J5b6FICR7c2VsZWN0ZWRJbWFnZXMubGVuZ3RofSDlvKDlm77niYflpITnkIblrozmiJAuLi5gKTsNCiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZmlsZVByb21pc2VzKTsNCiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxGaWxlcyA9IHt9Ow0KICAgICAgbGV0IGRvd25sb2FkZWRDb3VudCA9IDA7DQogICAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4gew0KICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHsNCiAgICAgICAgICBzdWNjZXNzZnVsRmlsZXNbcmVzdWx0LnZhbHVlLm5hbWVdID0gcmVzdWx0LnZhbHVlLmRhdGE7DQogICAgICAgICAgZG93bmxvYWRlZENvdW50Kys7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY29uc29sZS53YXJuKCdbSW1hZ2UgRG93bmxvYWRlcl0g5LiA5Liq5paH5Lu25aSE55CG5aSx6LSlOicsIHJlc3VsdC5yZWFzb24pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIGlmIChkb3dubG9hZGVkQ291bnQgPT09IDApIHsNCiAgICAgICAgc2V0KHN0YXR1cywgJ+ayoeacieWbvueJh+aIkOWKn+S4i+i9veaIluWkhOeQhuOAgicpOw0KICAgICAgICBzZXQobG9hZGluZywgZmFsc2UpOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBzZXQoc3RhdHVzLCBg5bey5oiQ5Yqf5aSE55CGICR7ZG93bmxvYWRlZENvdW50fSDlvKDlm77niYfvvIzmraPlnKjnlJ/miJAgWklQIOaWh+S7ti4uLmApOw0KICAgICAgY29uc29sZS5sb2coDQogICAgICAgICdbSW1hZ2UgRG93bmxvYWRlcl0g5paH5Lu25aSE55CG5a6M5oiQ77yM5YeG5aSH5L2/55SoIGZmbGF0ZSDnlJ/miJAgWklQLi4uJywNCiAgICAgICk7DQogICAgICB0cnkgew0KICAgICAgICBmZmxhdGUuemlwKHN1Y2Nlc3NmdWxGaWxlcywgeyBsZXZlbDogMSB9LCAoZXJyLCBkYXRhKSA9PiB7DQogICAgICAgICAgaWYgKGVycikgew0KICAgICAgICAgICAgY29uc29sZS5lcnJvcignW0ltYWdlIERvd25sb2FkZXJdIGZmbGF0ZSBaSVAg55Sf5oiQ6ZSZ6K+vOicsIGVycik7DQogICAgICAgICAgICBzZXQoc3RhdHVzLCBg55Sf5oiQIFpJUCDmlofku7bml7blh7rplJk6ICR7ZXJyLm1lc3NhZ2V9YCk7DQogICAgICAgICAgICBzZXQobG9hZGluZywgZmFsc2UpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgIH0NCiAgICAgICAgICBjb25zb2xlLmxvZygnW0ltYWdlIERvd25sb2FkZXJdIGZmbGF0ZSBaSVAg5paH5Lu255Sf5oiQ5a6M5q+VLicpOw0KICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcgfSk7DQogICAgICAgICAgY29uc29sZS5sb2coJ1tJbWFnZSBEb3dubG9hZGVyXSBCbG9iIHNpemU6JywgY29udGVudC5zaXplKTsNCiAgICAgICAgICBzZXQoc3RhdHVzLCAnWklQIOaWh+S7tueUn+aIkOWujOavle+8jOWHhuWkh+S4i+i9vS4uLicpOw0KICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpDQogICAgICAgICAgICAudG9JU09TdHJpbmcoKQ0KICAgICAgICAgICAgLnJlcGxhY2UoL1s6Ll0vZywgJy0nKTsNCiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGBpbWFnZXNfJHtkb2N1bWVudC50aXRsZX1fJHt0aW1lc3RhbXB9LnppcGA7DQogICAgICAgICAgY29uc3Qgb2JqZWN0VVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChjb250ZW50KTsNCiAgICAgICAgICBjb25zb2xlLmxvZyhgW0ltYWdlIERvd25sb2FkZXJdIOWHhuWkh+S9v+eUqCA8YT4g5qCH562+5LiL6L29ICR7ZmlsZW5hbWV9YCk7DQogICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICAgICAgICBhLmhyZWYgPSBvYmplY3RVUkw7DQogICAgICAgICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7DQogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgYS5jbGljaygpOw0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbSW1hZ2UgRG93bmxvYWRlcl0gPGE+IOagh+etvueCueWHu+inpuWPkTogJHtmaWxlbmFtZX1gKTsNCiAgICAgICAgICAgIHNldChzdGF0dXMsIGDlt7LkuIvovb0gJHtkb3dubG9hZGVkQ291bnR9IOW8oOWbvueJh+WIsCAke2ZpbGVuYW1lfWApOw0KICAgICAgICAgICAgc2V0KGxvYWRpbmcsIGZhbHNlKTsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVUkwpLCAxMDApOw0KICAgICAgICAgIH0gY2F0Y2ggKGRvd25sb2FkRXJyb3IpIHsNCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoDQogICAgICAgICAgICAgICdbSW1hZ2UgRG93bmxvYWRlcl0gPGE+IOagh+etvuS4i+i9vemUmeivrzonLA0KICAgICAgICAgICAgICBkb3dubG9hZEVycm9yLA0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHNldCgNCiAgICAgICAgICAgICAgc3RhdHVzLA0KICAgICAgICAgICAgICBg5LiL6L29IFpJUCDmlofku7bml7blh7rplJk6ICR7ZG93bmxvYWRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZG93bmxvYWRFcnJvci5tZXNzYWdlIDogJ+acquefpemUmeivryd9YCwNCiAgICAgICAgICAgICk7DQogICAgICAgICAgICBzZXQobG9hZGluZywgZmFsc2UpOw0KICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVUkwpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9IGNhdGNoIChvdXRlckVycm9yKSB7DQogICAgICAgIGNvbnNvbGUuZXJyb3IoDQogICAgICAgICAgJ1tJbWFnZSBEb3dubG9hZGVyXSDlpITnkIbmlofku7bmiJbosIPnlKggemlwIOaXtuWPkeeUn+aEj+WklumUmeivrzonLA0KICAgICAgICAgIG91dGVyRXJyb3IsDQogICAgICAgICk7DQogICAgICAgIHNldCgNCiAgICAgICAgICBzdGF0dXMsDQogICAgICAgICAgYOWkhOeQhuaWh+S7tuaXtuWPkeeUn+mUmeivrzogJHtvdXRlckVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBvdXRlckVycm9yLm1lc3NhZ2UgOiAn5pyq55+l6ZSZ6K+vJ31gLA0KICAgICAgICApOw0KICAgICAgICBzZXQobG9hZGluZywgZmFsc2UpOw0KICAgICAgfQ0KICAgIH0NCiAgICBmdW5jdGlvbiB0b2dnbGVTZWxlY3RBbGwoZXZlbnQyKSB7DQogICAgICBjb25zdCB0YXJnZXQgPSBldmVudDIudGFyZ2V0Ow0KICAgICAgY29uc3QgY2hlY2tlZCA9IHRhcmdldC5jaGVja2VkOw0KICAgICAgc2V0KA0KICAgICAgICBpbWFnZXMsDQogICAgICAgIGdldChpbWFnZXMpLm1hcCgoaW1nKSA9PiAoeyAuLi5pbWcsIHNlbGVjdGVkOiBjaGVja2VkIH0pKSwNCiAgICAgICk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGhhbmRsZVRodW1ibmFpbEVycm9yKGV2ZW50Mikgew0KICAgICAgY29uc3QgaW1nRWxlbWVudCA9IGV2ZW50Mi50YXJnZXQ7DQogICAgICBpbWdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50Mikgew0KICAgICAgaWYgKGV2ZW50Mi5hbHRLZXkpIHsNCiAgICAgICAgaWYgKGV2ZW50Mi5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3MnKSB7DQogICAgICAgICAgc2V0KGJ1dHRvblZpc2libGUsIHRydWUpOw0KICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Mi5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2gnKSB7DQogICAgICAgICAgc2V0KGJ1dHRvblZpc2libGUsIGZhbHNlKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBvbk1vdW50KCgpID0+IHsNCiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlQcmVzcyk7DQogICAgICBfR01fYWRkU3R5bGUoYA0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgew0KICAgICAgICBwb3NpdGlvbjogZml4ZWQ7DQogICAgICAgIGJvdHRvbTogMjBweDsNCiAgICAgICAgcmlnaHQ6IDIwcHg7DQogICAgICAgIHotaW5kZXg6IDk5OTk5Ow0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsNCiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2U0ZTdlZDsNCiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICAgICAgICBwYWRkaW5nOiAxNnB4Ow0KICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7DQogICAgICAgIHdpZHRoOiAzODBweDsNCiAgICAgICAgbWF4LWhlaWdodDogODB2aDsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCBzYW5zLXNlcmlmOw0KICAgICAgICBjb2xvcjogIzJjM2U1MDsNCiAgICAgICAgY3Vyc29yOiBncmFiOw0KICAgICAgfQ0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwuZHJhZ2dpbmcgew0KICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOw0KICAgICAgfQ0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgaDMgew0KICAgICAgICBtYXJnaW46IDAgMCAxMnB4IDA7DQogICAgICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlYmVlZjU7DQogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7DQogICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgY29sb3I6ICMzMDMxMzM7DQogICAgICB9DQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAucGFuZWwtY29udHJvbHMgew0KICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICBnYXA6IDhweDsNCiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsNCiAgICAgIH0NCiAgICAgICNpbWFnZS1kb3dubG9hZGVyLXBhbmVsIC5wYW5lbC1jb250cm9scyBidXR0b24sDQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAucHJpbWFyeS1idXR0b24sDQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAuZG93bmxvYWQtYnV0dG9uIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzQwOWVmZjsNCiAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICBib3JkZXI6IG5vbmU7DQogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4Ow0KICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7DQogICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7DQogICAgICB9DQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAucGFuZWwtY29udHJvbHMgYnV0dG9uOmhvdmVyOm5vdCg6ZGlzYWJsZWQpLA0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgLnByaW1hcnktYnV0dG9uOmhvdmVyOm5vdCg6ZGlzYWJsZWQpLA0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgLmRvd25sb2FkLWJ1dHRvbjpob3Zlcjpub3QoOmRpc2FibGVkKSB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM2NmIxZmY7DQogICAgICB9DQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAucGFuZWwtY29udHJvbHMgYnV0dG9uOmRpc2FibGVkLA0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgLnByaW1hcnktYnV0dG9uOmRpc2FibGVkLA0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgLmRvd25sb2FkLWJ1dHRvbjpkaXNhYmxlZCB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjMGM0Y2M7DQogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7DQogICAgICB9DQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAuaW1hZ2UtbGlzdCB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7DQogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlYmVlZjU7DQogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICAgICAgcGFkZGluZzogOHB4Ow0KICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4Ow0KICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsNCiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsNCiAgICAgIH0NCiAgICAgICNpbWFnZS1kb3dubG9hZGVyLXBhbmVsIC5zZWxlY3QtYWxsLWNvbnRhaW5lciB7DQogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsNCiAgICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgICBjb2xvcjogIzYwNjI2NjsNCiAgICAgIH0NCiAgICAgICNpbWFnZS1kb3dubG9hZGVyLXBhbmVsIC5zdGF0dXMtYmFyIHsNCiAgICAgICAgZm9udC1zaXplOiAxM3B4Ow0KICAgICAgICBjb2xvcjogIzkwOTM5OTsNCiAgICAgICAgbWFyZ2luLXRvcDogOHB4Ow0KICAgICAgICBtaW4taGVpZ2h0OiAyMHB4Ow0KICAgICAgfQ0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgLmNsb3NlLWJ1dHRvbiwNCiAgICAgICNpbWFnZS1kb3dubG9hZGVyLXBhbmVsIC50b2dnbGUtdGh1bWJzLWJ1dHRvbiB7DQogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7DQogICAgICAgIGJvcmRlcjogbm9uZTsNCiAgICAgICAgZm9udC1zaXplOiAxNnB4Ow0KICAgICAgICBjdXJzb3I6IHBvaW50ZXI7DQogICAgICAgIGNvbG9yOiAjOTA5Mzk5Ow0KICAgICAgICBwYWRkaW5nOiA0cHg7DQogICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7DQogICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMnM7DQogICAgICB9DQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAuY2xvc2UtYnV0dG9uOmhvdmVyLA0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgLnRvZ2dsZS10aHVtYnMtYnV0dG9uOmhvdmVyIHsNCiAgICAgICAgY29sb3I6ICM2MDYyNjY7DQogICAgICB9DQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAuaW1hZ2UtaXRlbSB7DQogICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsNCiAgICAgICAgcGFkZGluZzogNXB4IDA7DQogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOw0KICAgICAgICBjdXJzb3I6IHBvaW50ZXI7DQogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xcyBlYXNlLWluLW91dDsNCiAgICAgIH0NCiAgICAgICNpbWFnZS1kb3dubG9hZGVyLXBhbmVsIC5pbWFnZS1pdGVtOmhvdmVyIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsNCiAgICAgIH0NCiAgICAgICNpbWFnZS1kb3dubG9hZGVyLXBhbmVsIC5pbWFnZS1pdGVtOmxhc3QtY2hpbGQgew0KICAgICAgICBib3JkZXItYm90dG9tOiBub25lOw0KICAgICAgfQ0KICAgICAgI2ltYWdlLWRvd25sb2FkZXItcGFuZWwgLmltYWdlLWl0ZW0gaW5wdXRbdHlwZT0nY2hlY2tib3gnXSB7DQogICAgICAgIG1hcmdpbi1yaWdodDogMTBweCAhaW1wb3J0YW50Ow0KICAgICAgICBmbGV4LXNocmluazogMCAhaW1wb3J0YW50Ow0KICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50Ow0KICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDsNCiAgICAgICAgb3BhY2l0eTogMSAhaW1wb3J0YW50Ow0KICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7DQogICAgICAgIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7DQogICAgICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50Ow0KICAgICAgICBhcHBlYXJhbmNlOiBjaGVja2JveCAhaW1wb3J0YW50Ow0KICAgICAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7DQogICAgICB9DQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAuaW1hZ2UtaXRlbSBpbWcudGh1bWJuYWlsIHsNCiAgICAgICAgd2lkdGg6IDQwcHg7DQogICAgICAgIGhlaWdodDogNDBweDsNCiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7DQogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsNCiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2VlZTsNCiAgICAgICAgZmxleC1zaHJpbms6IDA7DQogICAgICB9DQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAuaW1hZ2UtaXRlbSAuaW1hZ2UtdXJsIHsNCiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOw0KICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgIGNvbG9yOiAjNDk1MDU3Ow0KICAgICAgICBmbGV4LWdyb3c6IDE7DQogICAgICB9DQogICAgICAuaW1hZ2UtZG93bmxvYWRlci10b2dnbGUtYnRuIHsNCiAgICAgICAgcG9zaXRpb246IGZpeGVkOyAvKiBDaGFuZ2VkIGZyb20gcmVsYXRpdmUgdG8gZml4ZWQgKi8NCiAgICAgICAgYm90dG9tOiAyMHB4Ow0KICAgICAgICByaWdodDogMjBweDsNCiAgICAgICAgei1pbmRleDogOTk5OTg7DQogICAgICAgIHdpZHRoOiA1MHB4Ow0KICAgICAgICBoZWlnaHQ6IDUwcHg7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDllZmY7DQogICAgICAgIGNvbG9yOiB3aGl0ZTsNCiAgICAgICAgYm9yZGVyOiBub25lOw0KICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7DQogICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgICAgIGZvbnQtc2l6ZTogMjRweDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IDE7DQogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4yczsNCiAgICAgIH0NCg0KICAgICAgLmltYWdlLWRvd25sb2FkZXItdG9nZ2xlLWJ0bjpob3ZlciB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM2NmIxZmY7DQogICAgICB9DQogICAgICANCiAgICAgIC5pbWFnZS1kb3dubG9hZGVyLXRvZ2dsZS1idG4gLmNsb3NlLWljb24gew0KICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgICAgIHRvcDogLTZweDsNCiAgICAgICAgbGVmdDogLTZweDsNCiAgICAgICAgd2lkdGg6IDE2cHg7DQogICAgICAgIGhlaWdodDogMTZweDsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOw0KICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7DQogICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzOw0KICAgICAgICBjdXJzb3I6IHBvaW50ZXI7DQogICAgICAgIHotaW5kZXg6IDEwMDAwMDsNCiAgICAgIH0NCg0KICAgICAgLmltYWdlLWRvd25sb2FkZXItdG9nZ2xlLWJ0bjpob3ZlciAuY2xvc2UtaWNvbiB7DQogICAgICAgIG9wYWNpdHk6IDE7DQogICAgICB9DQoNCiAgICAgIC5pbWFnZS1kb3dubG9hZGVyLXRvZ2dsZS1idG4gLmNsb3NlLWljb246aG92ZXIgew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7DQogICAgICB9DQoNCiAgICAgIC8qIFByZXZpZXcgTW9kYWwgU3R5bGVzICovDQogICAgICAuaW1hZ2UtcHJldmlldy1vdmVybGF5IHsNCiAgICAgICAgcG9zaXRpb246IGZpeGVkOw0KICAgICAgICB0b3A6IDA7DQogICAgICAgIGxlZnQ6IDA7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICBoZWlnaHQ6IDEwMCU7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC43KTsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgIHotaW5kZXg6IDEwMDAwMDsgLyogRW5zdXJlIGl0J3MgYWJvdmUgZXZlcnl0aGluZyAqLw0KICAgICAgICBjdXJzb3I6IHBvaW50ZXI7DQogICAgICB9DQoNCiAgICAgIC5pbWFnZS1wcmV2aWV3LWNvbnRlbnQgew0KICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgICAgIG1heC13aWR0aDogOTB2dzsNCiAgICAgICAgbWF4LWhlaWdodDogOTB2aDsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgLyogT3B0aW9uYWw6IGFkZCBiYWNrZ3JvdW5kIGlmIG5lZWRlZCAqLw0KICAgICAgICBwYWRkaW5nOiAxMHB4OyAvKiBBZGQgc29tZSBwYWRkaW5nIGFyb3VuZCB0aGUgaW1hZ2UgKi8NCiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICAgICAgICBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwwLDAsMC4zKTsNCiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OyAvKiBSZXNldCBjdXJzb3IgZm9yIHRoZSBjb250ZW50IGFyZWEgKi8NCiAgICAgICAgZGlzcGxheTogZmxleDsgLyogVXNlIGZsZXggdG8gaGVscCBjZW50ZXIgcG90ZW50aWFsbHkgc21hbGxlciBpbWFnZXMgKi8NCiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICB9DQoNCiAgICAgIC5pbWFnZS1wcmV2aWV3LWNvbnRlbnQgaW1nIHsNCiAgICAgICAgZGlzcGxheTogYmxvY2s7DQogICAgICAgIG1heC13aWR0aDogMTAwJTsNCiAgICAgICAgbWF4LWhlaWdodDogMTAwJTsNCiAgICAgICAgb2JqZWN0LWZpdDogY29udGFpbjsgLyogU2NhbGUgaW1hZ2Ugd2hpbGUgcHJlc2VydmluZyBhc3BlY3QgcmF0aW8gKi8NCiAgICAgIH0NCg0KICAgICAgLnByZXZpZXctY2xvc2UtYnV0dG9uIHsNCiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgICAgICB0b3A6IC0xNXB4OyAvKiBQb3NpdGlvbiBvdXRzaWRlIHRoZSB0b3AtcmlnaHQgY29ybmVyICovDQogICAgICAgIHJpZ2h0OiAtMTVweDsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpOw0KICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgIGJvcmRlcjogbm9uZTsNCiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOw0KICAgICAgICB3aWR0aDogMzBweDsNCiAgICAgICAgaGVpZ2h0OiAzMHB4Ow0KICAgICAgICBmb250LXNpemU6IDE2cHg7DQogICAgICAgIGxpbmUtaGVpZ2h0OiAzMHB4OyAvKiBDZW50ZXIgdGhlICfinJYnICovDQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICAgICAgY3Vyc29yOiBwb2ludGVyOw0KICAgICAgICB6LWluZGV4OiAxMDAwMDE7DQogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4yczsNCiAgICAgIH0NCiAgICAgIC5wcmV2aWV3LWNsb3NlLWJ1dHRvbjpob3ZlciB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC45KTsNCiAgICAgIH0NCg0KICAgICAgLyogQWRqdXN0IHRodW1ibmFpbCBjdXJzb3IgKi8NCiAgICAgICNpbWFnZS1kb3dubG9hZGVyLXBhbmVsIC5pbWFnZS1pdGVtIGltZy50aHVtYm5haWwsDQogICAgICAjaW1hZ2UtZG93bmxvYWRlci1wYW5lbCAuaW1hZ2UtaXRlbSAuaW1hZ2UtdXJsIHsNCiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7IC8qIEVuc3VyZSBwb2ludGVyIGN1cnNvciAqLw0KICAgICAgfQ0KICAgIGApOw0KICAgICAgcmV0dXJuICgpID0+IHsNCiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleVByZXNzKTsNCiAgICAgIH07DQogICAgfSk7DQogICAgbGVnYWN5X3ByZV9lZmZlY3QoDQogICAgICAoKSA9PiBnZXQoaW1hZ2VzKSwNCiAgICAgICgpID0+IHsNCiAgICAgICAgc2V0KA0KICAgICAgICAgIGFsbFNlbGVjdGVkLA0KICAgICAgICAgIGdldChpbWFnZXMpLmxlbmd0aCA+IDAgJiYgZ2V0KGltYWdlcykuZXZlcnkoKGltZykgPT4gaW1nLnNlbGVjdGVkKSwNCiAgICAgICAgKTsNCiAgICAgIH0sDQogICAgKTsNCiAgICBsZWdhY3lfcHJlX2VmZmVjdCgNCiAgICAgICgpID0+IChnZXQoaW1hZ2VzKSwgZ2V0KGFsbFNlbGVjdGVkKSksDQogICAgICAoKSA9PiB7DQogICAgICAgIHNldCgNCiAgICAgICAgICBpbmRldGVybWluYXRlLA0KICAgICAgICAgIGdldChpbWFnZXMpLmxlbmd0aCA+IDAgJiYNCiAgICAgICAgICAgICFnZXQoYWxsU2VsZWN0ZWQpICYmDQogICAgICAgICAgICBnZXQoaW1hZ2VzKS5zb21lKChpbWcpID0+IGltZy5zZWxlY3RlZCksDQogICAgICAgICk7DQogICAgICB9LA0KICAgICk7DQogICAgbGVnYWN5X3ByZV9lZmZlY3RfcmVzZXQoKTsNCiAgICBpbml0KCk7DQogICAgdmFyIGZyYWdtZW50ID0gcm9vdCgpOw0KICAgIHZhciBub2RlID0gZmlyc3RfY2hpbGQoZnJhZ21lbnQpOw0KICAgIHsNCiAgICAgIHZhciBjb25zZXF1ZW50ID0gKCQkYW5jaG9yMikgPT4gew0KICAgICAgICB2YXIgZGl2ID0gcm9vdF8xKCk7DQogICAgICAgIHZhciBkaXZfMSA9IGNoaWxkKGRpdik7DQogICAgICAgIHZhciBidXR0b24gPSBjaGlsZChkaXZfMSk7DQogICAgICAgIHZhciBpbWdfMSA9IHNpYmxpbmcoYnV0dG9uLCAyKTsNCiAgICAgICAgdGVtcGxhdGVfZWZmZWN0KCgpID0+DQogICAgICAgICAgc2V0X2F0dHJpYnV0ZShpbWdfMSwgJ3NyYycsIGdldChwcmV2aWV3SW1hZ2VVcmwpKSwNCiAgICAgICAgKTsNCiAgICAgICAgZXZlbnQoJ2NsaWNrJywgYnV0dG9uLCAoKSA9PiBzZXQocHJldmlld1Zpc2libGUsIGZhbHNlKSk7DQogICAgICAgIGV2ZW50KA0KICAgICAgICAgICdjbGljaycsDQogICAgICAgICAgZGl2XzEsDQogICAgICAgICAgc3RvcFByb3BhZ2F0aW9uKGZ1bmN0aW9uICgkJGFyZykgew0KICAgICAgICAgICAgYnViYmxlX2V2ZW50LmNhbGwodGhpcywgJCRwcm9wcywgJCRhcmcpOw0KICAgICAgICAgIH0pLA0KICAgICAgICApOw0KICAgICAgICBldmVudCgnY2xpY2snLCBkaXYsICgpID0+IHNldChwcmV2aWV3VmlzaWJsZSwgZmFsc2UpKTsNCiAgICAgICAgdHJhbnNpdGlvbigNCiAgICAgICAgICAzLA0KICAgICAgICAgIGRpdiwNCiAgICAgICAgICAoKSA9PiBmYWRlLA0KICAgICAgICAgICgpID0+ICh7IGR1cmF0aW9uOiAxNTAgfSksDQogICAgICAgICk7DQogICAgICAgIGFwcGVuZCgkJGFuY2hvcjIsIGRpdik7DQogICAgICB9Ow0KICAgICAgaWZfYmxvY2sobm9kZSwgKCQkcmVuZGVyKSA9PiB7DQogICAgICAgIGlmIChnZXQocHJldmlld1Zpc2libGUpKSAkJHJlbmRlcihjb25zZXF1ZW50KTsNCiAgICAgIH0pOw0KICAgIH0NCiAgICB2YXIgbm9kZV8xID0gc2libGluZyhub2RlLCAyKTsNCiAgICB7DQogICAgICB2YXIgY29uc2VxdWVudF82ID0gKCQkYW5jaG9yMikgPT4gew0KICAgICAgICB2YXIgZGl2XzIgPSByb290XzIoKTsNCiAgICAgICAgbGV0IGNsYXNzZXM7DQogICAgICAgIHZhciBoMyA9IGNoaWxkKGRpdl8yKTsNCiAgICAgICAgdmFyIGRpdl8zID0gc2libGluZyhjaGlsZChoMyksIDIpOw0KICAgICAgICB2YXIgYnV0dG9uXzEgPSBjaGlsZChkaXZfMyk7DQogICAgICAgIHZhciB0ZXh0ID0gY2hpbGQoYnV0dG9uXzEpOw0KICAgICAgICB2YXIgYnV0dG9uXzIgPSBzaWJsaW5nKGJ1dHRvbl8xLCAyKTsNCiAgICAgICAgdmFyIG5vZGVfMiA9IHNpYmxpbmcoaDMsIDIpOw0KICAgICAgICBUZXh0QWQobm9kZV8yLCB7fSk7DQogICAgICAgIHZhciBkaXZfNCA9IHNpYmxpbmcobm9kZV8yLCAyKTsNCiAgICAgICAgdmFyIGJ1dHRvbl8zID0gY2hpbGQoZGl2XzQpOw0KICAgICAgICB2YXIgbm9kZV8zID0gc2libGluZyhkaXZfNCwgMik7DQogICAgICAgIHsNCiAgICAgICAgICB2YXIgY29uc2VxdWVudF8xID0gKCQkYW5jaG9yMykgPT4gew0KICAgICAgICAgICAgdmFyIGRpdl81ID0gcm9vdF8zKCk7DQogICAgICAgICAgICB2YXIgaW5wdXQgPSBjaGlsZChkaXZfNSk7DQogICAgICAgICAgICB2YXIgbGFiZWwgPSBzaWJsaW5nKGlucHV0LCAyKTsNCiAgICAgICAgICAgIHZhciB0ZXh0XzEgPSBjaGlsZChsYWJlbCk7DQogICAgICAgICAgICB0ZW1wbGF0ZV9lZmZlY3QoDQogICAgICAgICAgICAgICgkMCkgPT4gew0KICAgICAgICAgICAgICAgIGlucHV0LmRpc2FibGVkID0gZ2V0KGxvYWRpbmcpOw0KICAgICAgICAgICAgICAgIHNldF90ZXh0KA0KICAgICAgICAgICAgICAgICAgdGV4dF8xLA0KICAgICAgICAgICAgICAgICAgYOWFqOmAiS/lj5bmtojlhajpgIkgKCR7JDAgPz8gJyd9LyR7Z2V0KGltYWdlcykubGVuZ3RoID8/ICcnfSlgLA0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgIFsoKSA9PiBnZXQoaW1hZ2VzKS5maWx0ZXIoKGltZykgPT4gaW1nLnNlbGVjdGVkKS5sZW5ndGhdLA0KICAgICAgICAgICAgICBkZXJpdmVkX3NhZmVfZXF1YWwsDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgYmluZF9jaGVja2VkKA0KICAgICAgICAgICAgICBpbnB1dCwNCiAgICAgICAgICAgICAgKCkgPT4gZ2V0KGFsbFNlbGVjdGVkKSwNCiAgICAgICAgICAgICAgKCQkdmFsdWUpID0+IHNldChhbGxTZWxlY3RlZCwgJCR2YWx1ZSksDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgYmluZF9wcm9wZXJ0eSgNCiAgICAgICAgICAgICAgJ2luZGV0ZXJtaW5hdGUnLA0KICAgICAgICAgICAgICAnY2hhbmdlJywNCiAgICAgICAgICAgICAgaW5wdXQsDQogICAgICAgICAgICAgICgkJHZhbHVlKSA9PiBzZXQoaW5kZXRlcm1pbmF0ZSwgJCR2YWx1ZSksDQogICAgICAgICAgICAgICgpID0+IGdldChpbmRldGVybWluYXRlKSwNCiAgICAgICAgICAgICk7DQogICAgICAgICAgICBldmVudCgnY2hhbmdlJywgaW5wdXQsIHRvZ2dsZVNlbGVjdEFsbCk7DQogICAgICAgICAgICBhcHBlbmQoJCRhbmNob3IzLCBkaXZfNSk7DQogICAgICAgICAgfTsNCiAgICAgICAgICBpZl9ibG9jayhub2RlXzMsICgkJHJlbmRlcikgPT4gew0KICAgICAgICAgICAgaWYgKGdldChpbWFnZXMpLmxlbmd0aCA+IDApICQkcmVuZGVyKGNvbnNlcXVlbnRfMSk7DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGRpdl82ID0gc2libGluZyhub2RlXzMsIDIpOw0KICAgICAgICB2YXIgbm9kZV80ID0gY2hpbGQoZGl2XzYpOw0KICAgICAgICB7DQogICAgICAgICAgdmFyIGNvbnNlcXVlbnRfMyA9ICgkJGFuY2hvcjMpID0+IHsNCiAgICAgICAgICAgIHZhciBmcmFnbWVudF8xID0gY29tbWVudCgpOw0KICAgICAgICAgICAgdmFyIG5vZGVfNSA9IGZpcnN0X2NoaWxkKGZyYWdtZW50XzEpOw0KICAgICAgICAgICAgZWFjaCgNCiAgICAgICAgICAgICAgbm9kZV81LA0KICAgICAgICAgICAgICAzLA0KICAgICAgICAgICAgICAoKSA9PiBnZXQoaW1hZ2VzKSwNCiAgICAgICAgICAgICAgKGltZykgPT4gaW1nLnVybCwNCiAgICAgICAgICAgICAgKCQkYW5jaG9yNCwgaW1nLCBpKSA9PiB7DQogICAgICAgICAgICAgICAgdmFyIGxhYmVsXzEgPSByb290XzUoKTsNCiAgICAgICAgICAgICAgICB2YXIgaW5wdXRfMSA9IGNoaWxkKGxhYmVsXzEpOw0KICAgICAgICAgICAgICAgIHZhciBub2RlXzYgPSBzaWJsaW5nKGlucHV0XzEsIDIpOw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIHZhciBjb25zZXF1ZW50XzIgPSAoJCRhbmNob3I1KSA9PiB7DQogICAgICAgICAgICAgICAgICAgIHZhciBpbWdfMiA9IHJvb3RfNigpOw0KICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9lZmZlY3QoKCkgPT4NCiAgICAgICAgICAgICAgICAgICAgICBzZXRfYXR0cmlidXRlKGltZ18yLCAnc3JjJywgZ2V0KGltZykudXJsKSwNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgZXZlbnQoJ2Vycm9yJywgaW1nXzIsIGhhbmRsZVRodW1ibmFpbEVycm9yKTsNCiAgICAgICAgICAgICAgICAgICAgZXZlbnQoDQogICAgICAgICAgICAgICAgICAgICAgJ2NsaWNrJywNCiAgICAgICAgICAgICAgICAgICAgICBpbWdfMiwNCiAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdCgoKSA9PiBvcGVuUHJldmlldyhnZXQoaW1nKS51cmwpKSwNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCQkYW5jaG9yNSwgaW1nXzIpOw0KICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgIGlmX2Jsb2NrKG5vZGVfNiwgKCQkcmVuZGVyKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnZXQoc2hvd1RodW1ibmFpbHMpKSAkJHJlbmRlcihjb25zZXF1ZW50XzIpOw0KICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBzcGFuID0gc2libGluZyhub2RlXzYsIDIpOw0KICAgICAgICAgICAgICAgIHZhciB0ZXh0XzIgPSBjaGlsZChzcGFuKTsNCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9lZmZlY3QoKCkgPT4gew0KICAgICAgICAgICAgICAgICAgc2V0X2F0dHJpYnV0ZShpbnB1dF8xLCAnaWQnLCBgaW1nLSR7Z2V0KGkpfWApOw0KICAgICAgICAgICAgICAgICAgaW5wdXRfMS5kaXNhYmxlZCA9IGdldChsb2FkaW5nKTsNCiAgICAgICAgICAgICAgICAgIHNldF90ZXh0KHRleHRfMiwgZ2V0KGltZykubmFtZSk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgYmluZF9jaGVja2VkKA0KICAgICAgICAgICAgICAgICAgaW5wdXRfMSwNCiAgICAgICAgICAgICAgICAgICgpID0+IGdldChpbWcpLnNlbGVjdGVkLA0KICAgICAgICAgICAgICAgICAgKCQkdmFsdWUpID0+ICgNCiAgICAgICAgICAgICAgICAgICAgKGdldChpbWcpLnNlbGVjdGVkID0gJCR2YWx1ZSksDQogICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVfaW5uZXJfc2lnbmFscygoKSA9PiBnZXQoaW1hZ2VzKSkNCiAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBhcHBlbmQoJCRhbmNob3I0LCBsYWJlbF8xKTsNCiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICk7DQogICAgICAgICAgICBhcHBlbmQoJCRhbmNob3IzLCBmcmFnbWVudF8xKTsNCiAgICAgICAgICB9Ow0KICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSAoJCRhbmNob3IzLCAkJGVsc2VpZikgPT4gew0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICB2YXIgY29uc2VxdWVudF80ID0gKCQkYW5jaG9yNCkgPT4gew0KICAgICAgICAgICAgICAgIHZhciBwID0gcm9vdF84KCk7DQogICAgICAgICAgICAgICAgYXBwZW5kKCQkYW5jaG9yNCwgcCk7DQogICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgIGlmX2Jsb2NrKA0KICAgICAgICAgICAgICAgICQkYW5jaG9yMywNCiAgICAgICAgICAgICAgICAoJCRyZW5kZXIpID0+IHsNCiAgICAgICAgICAgICAgICAgIGlmICghZ2V0KGxvYWRpbmcpKSAkJHJlbmRlcihjb25zZXF1ZW50XzQpOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJCRlbHNlaWYsDQogICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfTsNCiAgICAgICAgICBpZl9ibG9jayhub2RlXzQsICgkJHJlbmRlcikgPT4gew0KICAgICAgICAgICAgaWYgKGdldChpbWFnZXMpLmxlbmd0aCA+IDApICQkcmVuZGVyKGNvbnNlcXVlbnRfMyk7DQogICAgICAgICAgICBlbHNlICQkcmVuZGVyKGFsdGVybmF0ZSwgZmFsc2UpOw0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIHZhciBub2RlXzcgPSBzaWJsaW5nKG5vZGVfNCwgMik7DQogICAgICAgIHsNCiAgICAgICAgICB2YXIgY29uc2VxdWVudF81ID0gKCQkYW5jaG9yMykgPT4gew0KICAgICAgICAgICAgdmFyIHBfMSA9IHJvb3RfOSgpOw0KICAgICAgICAgICAgYXBwZW5kKCQkYW5jaG9yMywgcF8xKTsNCiAgICAgICAgICB9Ow0KICAgICAgICAgIGlmX2Jsb2NrKG5vZGVfNywgKCQkcmVuZGVyKSA9PiB7DQogICAgICAgICAgICBpZiAoZ2V0KGxvYWRpbmcpICYmIGdldChpbWFnZXMpLmxlbmd0aCA9PT0gMCkNCiAgICAgICAgICAgICAgJCRyZW5kZXIoY29uc2VxdWVudF81KTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgYnV0dG9uXzQgPSBzaWJsaW5nKGRpdl82LCAyKTsNCiAgICAgICAgdmFyIGRpdl83ID0gc2libGluZyhidXR0b25fNCwgMik7DQogICAgICAgIHZhciB0ZXh0XzMgPSBjaGlsZChkaXZfNyk7DQogICAgICAgIGJpbmRfdGhpcygNCiAgICAgICAgICBkaXZfMiwNCiAgICAgICAgICAoJCR2YWx1ZSkgPT4gc2V0KHBhbmVsRWxlbWVudCwgJCR2YWx1ZSksDQogICAgICAgICAgKCkgPT4gZ2V0KHBhbmVsRWxlbWVudCksDQogICAgICAgICk7DQogICAgICAgIHRlbXBsYXRlX2VmZmVjdCgNCiAgICAgICAgICAoJDAsICQxKSA9PiB7DQogICAgICAgICAgICBjbGFzc2VzID0gc2V0X2NsYXNzKGRpdl8yLCAxLCAnJywgbnVsbCwgY2xhc3NlcywgJDApOw0KICAgICAgICAgICAgc2V0X2F0dHJpYnV0ZSgNCiAgICAgICAgICAgICAgYnV0dG9uXzEsDQogICAgICAgICAgICAgICd0aXRsZScsDQogICAgICAgICAgICAgIGdldChzaG93VGh1bWJuYWlscykgPyAn6ZqQ6JeP57yp55Wl5Zu+JyA6ICfmmL7npLrnvKnnlaXlm74nLA0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHNldF90ZXh0KHRleHQsIGdldChzaG93VGh1bWJuYWlscykgPyAn8J+WvO+4jycgOiAn8J+aqycpOw0KICAgICAgICAgICAgYnV0dG9uXzMuZGlzYWJsZWQgPSBnZXQobG9hZGluZyk7DQogICAgICAgICAgICBidXR0b25fNC5kaXNhYmxlZCA9ICQxOw0KICAgICAgICAgICAgc2V0X3RleHQodGV4dF8zLCBnZXQoc3RhdHVzKSk7DQogICAgICAgICAgfSwNCiAgICAgICAgICBbDQogICAgICAgICAgICAoKSA9PiAoeyBkcmFnZ2luZzogZ2V0KGlzRHJhZ2dpbmcpIH0pLA0KICAgICAgICAgICAgKCkgPT4NCiAgICAgICAgICAgICAgZ2V0KGxvYWRpbmcpIHx8DQogICAgICAgICAgICAgIGdldChpbWFnZXMpLmZpbHRlcigoaW1nKSA9PiBpbWcuc2VsZWN0ZWQpLmxlbmd0aCA9PT0gMCwNCiAgICAgICAgICBdLA0KICAgICAgICAgIGRlcml2ZWRfc2FmZV9lcXVhbCwNCiAgICAgICAgKTsNCiAgICAgICAgZXZlbnQoJ2NsaWNrJywgYnV0dG9uXzEsICgpID0+DQogICAgICAgICAgc2V0KHNob3dUaHVtYm5haWxzLCAhZ2V0KHNob3dUaHVtYm5haWxzKSksDQogICAgICAgICk7DQogICAgICAgIGV2ZW50KCdjbGljaycsIGJ1dHRvbl8yLCAoKSA9PiBzZXQocGFuZWxWaXNpYmxlLCBmYWxzZSkpOw0KICAgICAgICBldmVudCgnY2xpY2snLCBidXR0b25fMywgZmluZEltYWdlcyk7DQogICAgICAgIGV2ZW50KCdjbGljaycsIGJ1dHRvbl80LCBkb3dubG9hZFNlbGVjdGVkKTsNCiAgICAgICAgZXZlbnQoJ21vdXNlZG93bicsIGRpdl8yLCBoYW5kbGVNb3VzZURvd24pOw0KICAgICAgICBhcHBlbmQoJCRhbmNob3IyLCBkaXZfMik7DQogICAgICB9Ow0KICAgICAgaWZfYmxvY2sobm9kZV8xLCAoJCRyZW5kZXIpID0+IHsNCiAgICAgICAgaWYgKGdldChwYW5lbFZpc2libGUpKSAkJHJlbmRlcihjb25zZXF1ZW50XzYpOw0KICAgICAgfSk7DQogICAgfQ0KICAgIHZhciBub2RlXzggPSBzaWJsaW5nKG5vZGVfMSwgMik7DQogICAgew0KICAgICAgdmFyIGNvbnNlcXVlbnRfNyA9ICgkJGFuY2hvcjIpID0+IHsNCiAgICAgICAgdmFyIGJ1dHRvbl81ID0gcm9vdF8xMCgpOw0KICAgICAgICB2YXIgZGl2XzggPSBjaGlsZChidXR0b25fNSk7DQogICAgICAgIGV2ZW50KA0KICAgICAgICAgICdjbGljaycsDQogICAgICAgICAgZGl2XzgsDQogICAgICAgICAgc3RvcFByb3BhZ2F0aW9uKCgpID0+IHNldChidXR0b25WaXNpYmxlLCBmYWxzZSkpLA0KICAgICAgICApOw0KICAgICAgICBldmVudCgnY2xpY2snLCBidXR0b25fNSwgKCkgPT4gc2V0KHBhbmVsVmlzaWJsZSwgdHJ1ZSkpOw0KICAgICAgICBhcHBlbmQoJCRhbmNob3IyLCBidXR0b25fNSk7DQogICAgICB9Ow0KICAgICAgaWZfYmxvY2sobm9kZV84LCAoJCRyZW5kZXIpID0+IHsNCiAgICAgICAgaWYgKCFnZXQocGFuZWxWaXNpYmxlKSAmJiBnZXQoYnV0dG9uVmlzaWJsZSkpICQkcmVuZGVyKGNvbnNlcXVlbnRfNyk7DQogICAgICB9KTsNCiAgICB9DQogICAgYXBwZW5kKCQkYW5jaG9yLCBmcmFnbWVudCk7DQogICAgcG9wKCk7DQogIH0NCiAgbW91bnQoQXBwLCB7DQogICAgdGFyZ2V0OiAoKCkgPT4gew0KICAgICAgY29uc3QgYXBwMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoYXBwMik7DQogICAgICByZXR1cm4gYXBwMjsNCiAgICB9KSgpLA0KICB9KTsNCn0pKGZmbGF0ZSk7DQo=
Add Comment
Please, Sign In to add comment