@vonage/ml-transformers 6.1.0 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{processor-worker-D0OBYSgD.js.map → processor-worker-CSxugEG1.js.map} +1 -1
- package/dist/ml-transformers.es.js +3 -3
- package/dist/ml-transformers.es.js.map +1 -1
- package/dist/ml-transformers.min.js +2 -2
- package/dist/ml-transformers.static.js +3 -3
- package/dist/ml-transformers.umd.js +2 -2
- package/dist/ml-transformers.umd.js.map +1 -1
- package/package.json +1 -1
|
@@ -20588,7 +20588,7 @@ class Uc {
|
|
|
20588
20588
|
};
|
|
20589
20589
|
}
|
|
20590
20590
|
}
|
|
20591
|
-
const Ec = "6.1.
|
|
20591
|
+
const Ec = "6.1.1";
|
|
20592
20592
|
class Bo {
|
|
20593
20593
|
constructor() {
|
|
20594
20594
|
const e = new OffscreenCanvas(0, 0), i = e.getContext("2d", { willReadFrequently: !0 });
|
|
@@ -23095,7 +23095,7 @@ const ms = class ms {
|
|
|
23095
23095
|
};
|
|
23096
23096
|
uc("ProcessorWorker", ms);
|
|
23097
23097
|
let Lo = ms;
|
|
23098
|
-
const s2 = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGd0KHQsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCByPWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHJbdF18fChyW3RdPWUpLHJbdF19Y29uc3QgX3I9Z3QoImdsb2JhbHMiLHt9KTt2YXIgb2U9KHQ9Pih0LklOSVQ9IklOSVQiLHQuRk9SV0FSRD0iRk9SV0FSRCIsdC5URVJNSU5BVEU9IlRFUk1JTkFURSIsdC5HTE9CQUxTX1NZTkM9IkdMT0JBTFNfU1lOQyIsdC5FVkVOVD0iRVZFTlQiLHQpKShvZXx8e30pO2Z1bmN0aW9uIGlzKHQpe3JldHVybltJbWFnZUJpdG1hcCxSZWFkYWJsZVN0cmVhbSxXcml0YWJsZVN0cmVhbV0uc29tZShyPT50IGluc3RhbmNlb2Ygcil9ZnVuY3Rpb24gYmUodCxlKXtjb25zdHtpZDpyLHR5cGU6bn09dCxzPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnIsdHlwZTpuLHJlc3VsdDplfSxzLmZpbHRlcihpPT5pcyhpKSkpfWd0KCJ3b3JrZXJpemVkIix7fSk7ZnVuY3Rpb24gVHIoKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWZ1bmN0aW9uIEJlKHQsZSl7aWYoQXJyYXkuaXNBcnJheShlKSllLnNwbGljZSgwLGUubGVuZ3RoKTtlbHNlIGlmKHR5cGVvZiBlPT0ib2JqZWN0Iilmb3IoY29uc3QgciBpbiBlKWRlbGV0ZSBlW3JdO2Zvcihjb25zdCByIGluIHQpQXJyYXkuaXNBcnJheSh0W3JdKT8oZVtyXT1bXSxCZSh0W3JdLGVbcl0pKTp0eXBlb2YgdFtyXT09Im9iamVjdCI/KGVbcl09e30sQmUodFtyXSxlW3JdKSk6ZVtyXT10W3JdfWNvbnN0IFU9bmV3IFdlYWtNYXAsWT1uZXcgV2Vha01hcCxCPW5ldyBXZWFrTWFwLERlPVN5bWJvbCgiYW55UHJvZHVjZXIiKSx3cj1Qcm9taXNlLnJlc29sdmUoKSxNZT1TeW1ib2woImxpc3RlbmVyQWRkZWQiKSxVZT1TeW1ib2woImxpc3RlbmVyUmVtb3ZlZCIpO2xldCBOZT0hMSx4dD0hMTtmdW5jdGlvbiBhZSh0KXtpZih0eXBlb2YgdCE9InN0cmluZyImJnR5cGVvZiB0IT0ic3ltYm9sIiYmdHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBUeXBlRXJyb3IoImBldmVudE5hbWVgIG11c3QgYmUgYSBzdHJpbmcsIHN5bWJvbCwgb3IgbnVtYmVyIil9ZnVuY3Rpb24gT2UodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gY2UodCxlKXtjb25zdCByPVkuZ2V0KHQpO2lmKHIuaGFzKGUpKXJldHVybiByLmdldChlKX1mdW5jdGlvbiBnZSh0LGUpe2NvbnN0IHI9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCJ8fHR5cGVvZiBlPT0ibnVtYmVyIj9lOkRlLG49Qi5nZXQodCk7aWYobi5oYXMocikpcmV0dXJuIG4uZ2V0KHIpfWZ1bmN0aW9uIG9zKHQsZSxyKXtjb25zdCBuPUIuZ2V0KHQpO2lmKG4uaGFzKGUpKWZvcihjb25zdCBzIG9mIG4uZ2V0KGUpKXMuZW5xdWV1ZShyKTtpZihuLmhhcyhEZSkpe2NvbnN0IHM9UHJvbWlzZS5hbGwoW2Uscl0pO2Zvcihjb25zdCBpIG9mIG4uZ2V0KERlKSlpLmVucXVldWUocyl9fWZ1bmN0aW9uIEFyKHQsZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCByPSExLG49KCk9Pnt9LHM9W107Y29uc3QgaT17ZW5xdWV1ZShhKXtzLnB1c2goYSksbigpfSxmaW5pc2goKXtyPSEwLG4oKX19O2Zvcihjb25zdCBhIG9mIGUpe2xldCBvPWdlKHQsYSk7b3x8KG89bmV3IFNldCxCLmdldCh0KS5zZXQoYSxvKSksby5hZGQoaSl9cmV0dXJue2FzeW5jIG5leHQoKXtyZXR1cm4gcz9zLmxlbmd0aD09PTA/cj8ocz12b2lkIDAsdGhpcy5uZXh0KCkpOihhd2FpdCBuZXcgUHJvbWlzZShhPT57bj1hfSksdGhpcy5uZXh0KCkpOntkb25lOiExLHZhbHVlOmF3YWl0IHMuc2hpZnQoKX06e2RvbmU6ITB9fSxhc3luYyByZXR1cm4oYSl7cz12b2lkIDA7Zm9yKGNvbnN0IG8gb2YgZSl7Y29uc3QgYz1nZSh0LG8pO2MmJihjLmRlbGV0ZShpKSxjLnNpemU9PT0wJiZCLmdldCh0KS5kZWxldGUobykpfXJldHVybiBuKCksYXJndW1lbnRzLmxlbmd0aD4wP3tkb25lOiEwLHZhbHVlOmF3YWl0IGF9Ontkb25lOiEwfX0sW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19ZnVuY3Rpb24gdnIodCl7aWYodD09PXZvaWQgMClyZXR1cm4gU3I7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MiKTtmb3IoY29uc3QgZSBvZiB0KWlmKCFTci5pbmNsdWRlcyhlKSl0aHJvdyB0eXBlb2YgZSE9InN0cmluZyI/bmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBlbGVtZW50IG11c3QgYmUgYSBzdHJpbmciKTpuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IEVtaXR0ZXJ5IG1ldGhvZGApO3JldHVybiB0fWNvbnN0IHVlPXQ9PnQ9PT1NZXx8dD09PVVlO2Z1bmN0aW9uIExlKHQsZSxyKXtpZih1ZShlKSl0cnl7TmU9ITAsdC5lbWl0KGUscil9ZmluYWxseXtOZT0hMX19Y2xhc3MgZmV7c3RhdGljIG1peGluKGUscil7cmV0dXJuIHI9dnIociksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgYSBvZiByKWlmKG4ucHJvdG90eXBlW2FdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHthfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBzKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IGZlfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6c30pO2NvbnN0IGk9YT0+ZnVuY3Rpb24oLi4ubyl7cmV0dXJuIHRoaXNbZV1bYV0oLi4ubyl9O2Zvcihjb25zdCBhIG9mIHIpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITEsdmFsdWU6aShhKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7dmFyIGUscjtpZih0eXBlb2YoKGU9Z2xvYmFsVGhpcy5wcm9jZXNzKT09bnVsbD92b2lkIDA6ZS5lbnYpIT0ib2JqZWN0IilyZXR1cm4geHQ7Y29uc3R7ZW52Om59PShyPWdsb2JhbFRoaXMucHJvY2VzcykhPW51bGw/cjp7ZW52Ont9fTtyZXR1cm4gbi5ERUJVRz09PSJlbWl0dGVyeSJ8fG4uREVCVUc9PT0iKiJ8fHh0fXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7eHQ9ZX1jb25zdHJ1Y3RvcihlPXt9KXt2YXIgcjtVLnNldCh0aGlzLG5ldyBTZXQpLFkuc2V0KHRoaXMsbmV3IE1hcCksQi5zZXQodGhpcyxuZXcgTWFwKSxCLmdldCh0aGlzKS5zZXQoRGUsbmV3IFNldCksdGhpcy5kZWJ1Zz0ocj1lLmRlYnVnKSE9bnVsbD9yOnt9LHRoaXMuZGVidWcuZW5hYmxlZD09PXZvaWQgMCYmKHRoaXMuZGVidWcuZW5hYmxlZD0hMSksdGhpcy5kZWJ1Zy5sb2dnZXJ8fCh0aGlzLmRlYnVnLmxvZ2dlcj0obixzLGksYSk9Pnt0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaHthPWBPYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXMgZmFpbGVkIHRvIHN0cmluZ2lmeTogJHtPYmplY3Qua2V5cyhhKS5qb2luKCIsIil9YH0odHlwZW9mIGk9PSJzeW1ib2wifHx0eXBlb2YgaT09Im51bWJlciIpJiYoaT1pLnRvU3RyaW5nKCkpO2NvbnN0IG89bmV3IERhdGUsYz1gJHtvLmdldEhvdXJzKCl9OiR7by5nZXRNaW51dGVzKCl9OiR7by5nZXRTZWNvbmRzKCl9LiR7by5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHtjfV1bZW1pdHRlcnk6JHtufV1bJHtzfV0gRXZlbnQgTmFtZTogJHtpfQoJZGF0YTogJHthfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSxyLG4peyhmZS5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUscixuKX1vbihlLHIpe09lKHIpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKXthZShuKTtsZXQgcz1jZSh0aGlzLG4pO3N8fChzPW5ldyBTZXQsWS5nZXQodGhpcykuc2V0KG4scykpLHMuYWRkKHIpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLHVlKG4pfHxMZSh0aGlzLE1lLHtldmVudE5hbWU6bixsaXN0ZW5lcjpyfSl9cmV0dXJuIHRoaXMub2ZmLmJpbmQodGhpcyxlLHIpfW9mZihlLHIpe09lKHIpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKXthZShuKTtjb25zdCBzPWNlKHRoaXMsbik7cyYmKHMuZGVsZXRlKHIpLHMuc2l6ZT09PTAmJlkuZ2V0KHRoaXMpLmRlbGV0ZShuKSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSx1ZShuKXx8TGUodGhpcyxVZSx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6cn0pfX1vbmNlKGUpe2xldCByO2NvbnN0IG49bmV3IFByb21pc2Uocz0+e3I9dGhpcy5vbihlLGk9PntyKCkscyhpKX0pfSk7cmV0dXJuIG4ub2ZmPXIsbn1ldmVudHMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCByIG9mIGUpYWUocik7cmV0dXJuIEFyKHRoaXMsZSl9YXN5bmMgZW1pdChlLHIpe3ZhciBuO2lmKGFlKGUpLHVlKGUpJiYhTmUpdGhyb3cgbmV3IFR5cGVFcnJvcigiYGV2ZW50TmFtZWAgY2Fubm90IGJlIG1ldGEgZXZlbnQgYGxpc3RlbmVyQWRkZWRgIG9yIGBsaXN0ZW5lclJlbW92ZWRgIik7dGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSxyKSxvcyh0aGlzLGUscik7Y29uc3Qgcz0obj1jZSh0aGlzLGUpKSE9bnVsbD9uOm5ldyBTZXQsaT1VLmdldCh0aGlzKSxhPVsuLi5zXSxvPXVlKGUpP1tdOlsuLi5pXTthd2FpdCB3cixhd2FpdCBQcm9taXNlLmFsbChbLi4uYS5tYXAoYXN5bmMgYz0+e2lmKHMuaGFzKGMpKXJldHVybiBjKHIpfSksLi4uby5tYXAoYXN5bmMgYz0+e2lmKGkuaGFzKGMpKXJldHVybiBjKGUscil9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSxyKXt2YXIgbjtpZihhZShlKSx1ZShlKSYmIU5lKXRocm93IG5ldyBUeXBlRXJyb3IoImBldmVudE5hbWVgIGNhbm5vdCBiZSBtZXRhIGV2ZW50IGBsaXN0ZW5lckFkZGVkYCBvciBgbGlzdGVuZXJSZW1vdmVkYCIpO3RoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUscik7Y29uc3Qgcz0obj1jZSh0aGlzLGUpKSE9bnVsbD9uOm5ldyBTZXQsaT1VLmdldCh0aGlzKSxhPVsuLi5zXSxvPVsuLi5pXTthd2FpdCB3cjtmb3IoY29uc3QgYyBvZiBhKXMuaGFzKGMpJiZhd2FpdCBjKHIpO2Zvcihjb25zdCBjIG9mIG8paS5oYXMoYykmJmF3YWl0IGMoZSxyKX1vbkFueShlKXtyZXR1cm4gT2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxVLmdldCh0aGlzKS5hZGQoZSksTGUodGhpcyxNZSx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBBcih0aGlzKX1vZmZBbnkoZSl7T2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLExlKHRoaXMsVWUse2xpc3RlbmVyOmV9KSxVLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCByIG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHIsdm9pZCAwKSx0eXBlb2Ygcj09InN0cmluZyJ8fHR5cGVvZiByPT0ic3ltYm9sInx8dHlwZW9mIHI9PSJudW1iZXIiKXtjb25zdCBuPWNlKHRoaXMscik7biYmbi5jbGVhcigpO2NvbnN0IHM9Z2UodGhpcyxyKTtpZihzKXtmb3IoY29uc3QgaSBvZiBzKWkuZmluaXNoKCk7cy5jbGVhcigpfX1lbHNle1UuZ2V0KHRoaXMpLmNsZWFyKCk7Zm9yKGNvbnN0W24sc11vZiBZLmdldCh0aGlzKS5lbnRyaWVzKCkpcy5jbGVhcigpLFkuZ2V0KHRoaXMpLmRlbGV0ZShuKTtmb3IoY29uc3RbbixzXW9mIEIuZ2V0KHRoaXMpLmVudHJpZXMoKSl7Zm9yKGNvbnN0IGkgb2YgcylpLmZpbmlzaCgpO3MuY2xlYXIoKSxCLmdldCh0aGlzKS5kZWxldGUobil9fX1saXN0ZW5lckNvdW50KGUpe3ZhciByLG4scyxpLGEsbztlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IGM9MDtmb3IoY29uc3QgdSBvZiBlKXtpZih0eXBlb2YgdT09InN0cmluZyIpe2MrPVUuZ2V0KHRoaXMpLnNpemUrKChuPShyPWNlKHRoaXMsdSkpPT1udWxsP3ZvaWQgMDpyLnNpemUpIT1udWxsP246MCkrKChpPShzPWdlKHRoaXMsdSkpPT1udWxsP3ZvaWQgMDpzLnNpemUpIT1udWxsP2k6MCkrKChvPShhPWdlKHRoaXMpKT09bnVsbD92b2lkIDA6YS5zaXplKSE9bnVsbD9vOjApO2NvbnRpbnVlfXR5cGVvZiB1PCJ1IiYmYWUodSksYys9VS5nZXQodGhpcykuc2l6ZTtmb3IoY29uc3QgZiBvZiBZLmdldCh0aGlzKS52YWx1ZXMoKSljKz1mLnNpemU7Zm9yKGNvbnN0IGYgb2YgQi5nZXQodGhpcykudmFsdWVzKCkpYys9Zi5zaXplfXJldHVybiBjfWJpbmRNZXRob2RzKGUscil7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3I9dnIocik7Zm9yKGNvbnN0IG4gb2Ygcil7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fWNvbnN0IFNyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZlLnByb3RvdHlwZSkuZmlsdGVyKHQ9PnQhPT0iY29uc3RydWN0b3IiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZmUsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpNZSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmZSwibGlzdGVuZXJSZW1vdmVkIix7dmFsdWU6VWUsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTtmdW5jdGlvbiBhcyh0KXtyZXR1cm4gdC5vbkFueSYmdC5lbWl0fWFzeW5jIGZ1bmN0aW9uIGNzKHQsZSl7Y29uc3R7ZnVuY3Rpb25OYW1lOnIsYXJnczpufT10O2lmKCFlLmluc3RhbmNlKXRocm93Imluc3RhbmNlIG5vdCBpbml0aWFsaXplZCI7aWYoIXIpdGhyb3cibWlzc2luZyBmdW5jdGlvbiBuYW1lIHRvIGNhbGwiO2lmKCFlLmluc3RhbmNlW3JdKXRocm93YHVuZGVmaW5lZCBmdW5jdGlvbiBbJHtyfV0gaW4gY2xhc3MgJHtlLmluc3RhbmNlLmNvbnN0cnVjdG9yLndvcmtlcklkfWA7YmUodCxhd2FpdCBlLmluc3RhbmNlW3JdKC4uLm4/P1tdKSl9Y29uc3QgSXI9Z3QoInJlZ2lzdGVyZWRXb3JrZXJzIix7fSk7ZnVuY3Rpb24gdXModCxlKXtlLndvcmtlcklkPXQsVHIoKSYmKElyW2Uud29ya2VySWRdPWUpfWZ1bmN0aW9uIGZzKHQsZSl7aWYoIXQuYXJncyl0aHJvdyJNaXNzaW5nIGNsYXNzTmFtZSB3aGlsZSBpbml0aWFsaXppbmcgd29ya2VyIjtjb25zdFtyLG5dPXQuYXJncyxzPUlyW3JdO2lmKHMpZS5pbnN0YW5jZT1uZXcgcyh0LmFyZ3Muc2xpY2UoMSkpO2Vsc2UgdGhyb3dgdW5rbm93biB3b3JrZXIgY2xhc3MgJHtyfWA7QmUobixfciksYXMoZS5pbnN0YW5jZSkmJmUuaW5zdGFuY2Uub25BbnkoKGksYSk9PntiZSh7dHlwZTpvZS5FVkVOVH0se25hbWU6aSxkYXRhOmF9KX0pLGJlKHQsdHlwZW9mIGUuaW5zdGFuY2UhPT12b2lkIDApfWFzeW5jIGZ1bmN0aW9uIGxzKHQsZSl7Y29uc3R7YXJnczpyfT10O2lmKCFlLmluc3RhbmNlKXRocm93Imluc3RhbmNlIG5vdCBpbml0aWFsaXplZCI7bGV0IG47ZS5pbnN0YW5jZS50ZXJtaW5hdGUmJihuPWF3YWl0IGUuaW5zdGFuY2UudGVybWluYXRlKC4uLnI/P1tdKSksYmUodCxuKX1mdW5jdGlvbiBkcyh0KXtpZighdC5hcmdzKXRocm93Ik1pc3NpbmcgZ2xvYmFscyB3aGlsZSBzeW5jaW5nIjtCZSh0LmFyZ3NbMF0sX3IpLGJlKHQse30pfWZ1bmN0aW9uIGhzKCl7Y29uc3QgdD17fTtvbm1lc3NhZ2U9YXN5bmMgZT0+e2NvbnN0IHI9ZS5kYXRhO3N3aXRjaChyLnR5cGUpe2Nhc2Ugb2UuSU5JVDpmcyhyLHQpO2JyZWFrO2Nhc2Ugb2UuRk9SV0FSRDpjcyhyLHQpO2JyZWFrO2Nhc2Ugb2UuVEVSTUlOQVRFOmxzKHIsdCk7YnJlYWs7Y2FzZSBvZS5HTE9CQUxTX1NZTkM6ZHMocik7YnJlYWt9fX1UcigpJiZocygpO2NsYXNzIER7fUQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxELmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTtmdW5jdGlvbiBtcyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fWNvbnN0IE49bmV3IFdlYWtNYXAsemU9bmV3IFdlYWtNYXAseGU9bmV3IFdlYWtNYXAsRXQ9U3ltYm9sKCJhbnlQcm9kdWNlciIpLFJyPVByb21pc2UucmVzb2x2ZSgpLEdlPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLCRlPVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IF90PSExO2Z1bmN0aW9uIGxlKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIiYmdHlwZW9mIHQhPSJzeW1ib2wiKXRocm93IG5ldyBUeXBlRXJyb3IoImV2ZW50TmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sIil9ZnVuY3Rpb24gVmUodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gZGUodCxlKXtjb25zdCByPXplLmdldCh0KTtyZXR1cm4gci5oYXMoZSl8fHIuc2V0KGUsbmV3IFNldCksci5nZXQoZSl9ZnVuY3Rpb24gRWUodCxlKXtjb25zdCByPXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6RXQsbj14ZS5nZXQodCk7cmV0dXJuIG4uaGFzKHIpfHxuLnNldChyLG5ldyBTZXQpLG4uZ2V0KHIpfWZ1bmN0aW9uIHBzKHQsZSxyKXtjb25zdCBuPXhlLmdldCh0KTtpZihuLmhhcyhlKSlmb3IoY29uc3QgcyBvZiBuLmdldChlKSlzLmVucXVldWUocik7aWYobi5oYXMoRXQpKXtjb25zdCBzPVByb21pc2UuYWxsKFtlLHJdKTtmb3IoY29uc3QgaSBvZiBuLmdldChFdCkpaS5lbnF1ZXVlKHMpfX1mdW5jdGlvbiBGcih0LGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgcj0hMSxuPSgpPT57fSxzPVtdO2NvbnN0IGk9e2VucXVldWUoYSl7cy5wdXNoKGEpLG4oKX0sZmluaXNoKCl7cj0hMCxuKCl9fTtmb3IoY29uc3QgYSBvZiBlKUVlKHQsYSkuYWRkKGkpO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIHM/cy5sZW5ndGg9PT0wP3I/KHM9dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoYT0+e249YX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBzLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGEpe3M9dm9pZCAwO2Zvcihjb25zdCBvIG9mIGUpRWUodCxvKS5kZWxldGUoaSk7cmV0dXJuIG4oKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgYX06e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBQcih0KXtpZih0PT09dm9pZCAwKXJldHVybiBrcjtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHQpaWYoIWtyLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHR9Y29uc3QgVHQ9dD0+dD09PUdlfHx0PT09JGU7bGV0IFdlPWNsYXNzIEVye3N0YXRpYyBtaXhpbihlLHIpe3JldHVybiByPVByKHIpLG49PntpZih0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGZ1bmN0aW9uIik7Zm9yKGNvbnN0IGEgb2YgcilpZihuLnByb3RvdHlwZVthXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7YX1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7ZnVuY3Rpb24gcygpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiExLHZhbHVlOm5ldyBFcn0pLHRoaXNbZV19T2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITEsZ2V0OnN9KTtjb25zdCBpPWE9PmZ1bmN0aW9uKC4uLm8pe3JldHVybiB0aGlzW2VdW2FdKC4uLm8pfTtmb3IoY29uc3QgYSBvZiByKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxhLHtlbnVtZXJhYmxlOiExLHZhbHVlOmkoYSl9KTtyZXR1cm4gbn19c3RhdGljIGdldCBpc0RlYnVnRW5hYmxlZCgpe2lmKHR5cGVvZiBwcm9jZXNzIT0ib2JqZWN0IilyZXR1cm4gX3Q7Y29uc3R7ZW52OmV9PXByb2Nlc3N8fHtlbnY6e319O3JldHVybiBlLkRFQlVHPT09ImVtaXR0ZXJ5Inx8ZS5ERUJVRz09PSIqInx8X3R9c3RhdGljIHNldCBpc0RlYnVnRW5hYmxlZChlKXtfdD1lfWNvbnN0cnVjdG9yKGU9e30pe04uc2V0KHRoaXMsbmV3IFNldCksemUuc2V0KHRoaXMsbmV3IE1hcCkseGUuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHIsbixzLGkpPT57dHJ5e2k9SlNPTi5zdHJpbmdpZnkoaSl9Y2F0Y2h7aT1gT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzIGZhaWxlZCB0byBzdHJpbmdpZnk6ICR7T2JqZWN0LmtleXMoaSkuam9pbigiLCIpfWB9dHlwZW9mIHM9PSJzeW1ib2wiJiYocz1zLnRvU3RyaW5nKCkpO2NvbnN0IGE9bmV3IERhdGUsbz1gJHthLmdldEhvdXJzKCl9OiR7YS5nZXRNaW51dGVzKCl9OiR7YS5nZXRTZWNvbmRzKCl9LiR7YS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHtvfV1bZW1pdHRlcnk6JHtyfV1bJHtufV0gRXZlbnQgTmFtZTogJHtzfQoJZGF0YTogJHtpfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSxyLG4peyhFci5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUscixuKX1vbihlLHIpe1ZlKHIpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKWxlKG4pLGRlKHRoaXMsbikuYWRkKHIpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLFR0KG4pfHx0aGlzLmVtaXQoR2Use2V2ZW50TmFtZTpuLGxpc3RlbmVyOnJ9KTtyZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUscil9b2ZmKGUscil7VmUociksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpbGUobiksZGUodGhpcyxuKS5kZWxldGUociksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxUdChuKXx8dGhpcy5lbWl0KCRlLHtldmVudE5hbWU6bixsaXN0ZW5lcjpyfSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IG49dGhpcy5vbihlLHM9PntuKCkscihzKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgciBvZiBlKWxlKHIpO3JldHVybiBGcih0aGlzLGUpfWFzeW5jIGVtaXQoZSxyKXtsZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0IixlLHIpLHBzKHRoaXMsZSxyKTtjb25zdCBuPWRlKHRoaXMsZSkscz1OLmdldCh0aGlzKSxpPVsuLi5uXSxhPVR0KGUpP1tdOlsuLi5zXTthd2FpdCBScixhd2FpdCBQcm9taXNlLmFsbChbLi4uaS5tYXAoYXN5bmMgbz0+e2lmKG4uaGFzKG8pKXJldHVybiBvKHIpfSksLi4uYS5tYXAoYXN5bmMgbz0+e2lmKHMuaGFzKG8pKXJldHVybiBvKGUscil9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSxyKXtsZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHIpO2NvbnN0IG49ZGUodGhpcyxlKSxzPU4uZ2V0KHRoaXMpLGk9Wy4uLm5dLGE9Wy4uLnNdO2F3YWl0IFJyO2Zvcihjb25zdCBvIG9mIGkpbi5oYXMobykmJmF3YWl0IG8ocik7Zm9yKGNvbnN0IG8gb2YgYSlzLmhhcyhvKSYmYXdhaXQgbyhlLHIpfW9uQW55KGUpe3JldHVybiBWZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLE4uZ2V0KHRoaXMpLmFkZChlKSx0aGlzLmVtaXQoR2Use2xpc3RlbmVyOmV9KSx0aGlzLm9mZkFueS5iaW5kKHRoaXMsZSl9YW55RXZlbnQoKXtyZXR1cm4gRnIodGhpcyl9b2ZmQW55KGUpe1ZlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSx0aGlzLmVtaXQoJGUse2xpc3RlbmVyOmV9KSxOLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCByIG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHIsdm9pZCAwKSx0eXBlb2Ygcj09InN0cmluZyJ8fHR5cGVvZiByPT0ic3ltYm9sIil7ZGUodGhpcyxyKS5jbGVhcigpO2NvbnN0IG49RWUodGhpcyxyKTtmb3IoY29uc3QgcyBvZiBuKXMuZmluaXNoKCk7bi5jbGVhcigpfWVsc2V7Ti5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3QgbiBvZiB6ZS5nZXQodGhpcykudmFsdWVzKCkpbi5jbGVhcigpO2Zvcihjb25zdCBuIG9mIHhlLmdldCh0aGlzKS52YWx1ZXMoKSl7Zm9yKGNvbnN0IHMgb2YgbilzLmZpbmlzaCgpO24uY2xlYXIoKX19fWxpc3RlbmVyQ291bnQoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCByPTA7Zm9yKGNvbnN0IG4gb2YgZSl7aWYodHlwZW9mIG49PSJzdHJpbmciKXtyKz1OLmdldCh0aGlzKS5zaXplK2RlKHRoaXMsbikuc2l6ZStFZSh0aGlzLG4pLnNpemUrRWUodGhpcykuc2l6ZTtjb250aW51ZX10eXBlb2YgbjwidSImJmxlKG4pLHIrPU4uZ2V0KHRoaXMpLnNpemU7Zm9yKGNvbnN0IHMgb2YgemUuZ2V0KHRoaXMpLnZhbHVlcygpKXIrPXMuc2l6ZTtmb3IoY29uc3QgcyBvZiB4ZS5nZXQodGhpcykudmFsdWVzKCkpcis9cy5zaXplfXJldHVybiByfWJpbmRNZXRob2RzKGUscil7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3I9UHIocik7Zm9yKGNvbnN0IG4gb2Ygcil7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fTtjb25zdCBrcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhXZS5wcm90b3R5cGUpLmZpbHRlcih0PT50IT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFdlLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6R2Usd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV2UsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOiRlLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSk7dmFyIHlzPVdlO2NvbnN0IHd0PW1zKHlzKTtmdW5jdGlvbiBicyh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJvYmplY3QiJiZ0IT09bnVsbCYmIm1lc3NhZ2UiaW4gdCYmdHlwZW9mIHQubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gZ3ModCl7aWYoYnModCkpcmV0dXJuIHQ7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodCkpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHQpKX19ZnVuY3Rpb24gQXQodCl7cmV0dXJuIGdzKHQpLm1lc3NhZ2V9dmFyIHhzPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxFcz0odCxlLHIpPT5lIGluIHQ/eHModCxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpyfSk6dFtlXT1yLF9zPSh0LGUscik9PihFcyh0LGUrIiIscikscik7Y29uc3QgVHM9ImhsZy50b2tib3guY29tL3Byb2QvbG9nZ2luZy92Y3Bfd2VicnRjIix3cz0iaHR0cHM6Ly8iLEFzPTFlNDtsZXQgSGU7Y29uc3QgdnM9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIFNzKCl7aWYoIUhlJiYoSGU9dHlwZW9mIGNyeXB0bzwidSImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pLCFIZSkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBIZSh2cyl9Y29uc3QgVD1bXTtmb3IobGV0IHQ9MDt0PDI1NjsrK3QpVC5wdXNoKCh0KzI1NikudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtmdW5jdGlvbiBJcyh0LGU9MCl7cmV0dXJuKFRbdFtlKzBdXStUW3RbZSsxXV0rVFt0W2UrMl1dK1RbdFtlKzNdXSsiLSIrVFt0W2UrNF1dK1RbdFtlKzVdXSsiLSIrVFt0W2UrNl1dK1RbdFtlKzddXSsiLSIrVFt0W2UrOF1dK1RbdFtlKzldXSsiLSIrVFt0W2UrMTBdXStUW3RbZSsxMV1dK1RbdFtlKzEyXV0rVFt0W2UrMTNdXStUW3RbZSsxNF1dK1RbdFtlKzE1XV0pLnRvTG93ZXJDYXNlKCl9Y29uc3QgUnM9dHlwZW9mIGNyeXB0bzwidSImJmNyeXB0by5yYW5kb21VVUlEJiZjcnlwdG8ucmFuZG9tVVVJRC5iaW5kKGNyeXB0byksQ3I9e3JhbmRvbVVVSUQ6UnN9O2Z1bmN0aW9uIEZzKHQsZSxyKXtpZihDci5yYW5kb21VVUlEJiYhZSYmIXQpcmV0dXJuIENyLnJhbmRvbVVVSUQoKTt0PXR8fHt9O2NvbnN0IG49dC5yYW5kb218fCh0LnJuZ3x8U3MpKCk7cmV0dXJuIG5bNl09bls2XSYxNXw2NCxuWzhdPW5bOF0mNjN8MTI4LElzKG4pfWZ1bmN0aW9uIHZ0KHQsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCByPWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHJbdF18fChyW3RdPWUpLHJbdF19Y29uc3QgTz12dCgiZ2xvYmFscyIse30pO3ZhciBRPSh0PT4odC5JTklUPSJJTklUIix0LkZPUldBUkQ9IkZPUldBUkQiLHQuVEVSTUlOQVRFPSJURVJNSU5BVEUiLHQuR0xPQkFMU19TWU5DPSJHTE9CQUxTX1NZTkMiLHQpKShRfHx7fSk7ZnVuY3Rpb24gQnIodCl7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKGU9PnQgaW5zdGFuY2VvZiBlKX1sZXQgUHM9MDtmdW5jdGlvbiBrcyh0LGUscixuLHMpe2NvbnN0IGk9UHMrKztyZXR1cm4gdC5wb3N0TWVzc2FnZSh7aWQ6aSx0eXBlOmUsZnVuY3Rpb25OYW1lOnIsYXJnczpufSxuLmZpbHRlcihhPT5CcihhKSkpLG5ldyBQcm9taXNlKGE9PntzPT1udWxsfHxzLnNldChpLGEpfSl9ZnVuY3Rpb24gX2UodCxlKXtjb25zdHtpZDpyLHR5cGU6bn09dCxzPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnIsdHlwZTpuLHJlc3VsdDplfSxzLmZpbHRlcihpPT5CcihpKSkpfWNvbnN0IERyPXZ0KCJ3b3JrZXJpemVkIix7fSk7ZnVuY3Rpb24gTXIoKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWFzeW5jIGZ1bmN0aW9uIENzKCl7aWYoTXIoKSlfZSh7dHlwZTpRLkdMT0JBTFNfU1lOQ30sTyk7ZWxzZXtjb25zdCB0PVtdO2Zvcihjb25zdCBlIGluIERyKXtjb25zdHt3b3JrZXI6cixyZXNvbHZlcnM6bn09RHJbZV0ud29ya2VyQ29udGV4dDtyJiZ0LnB1c2goa3MocixRLkdMT0JBTFNfU1lOQywiIixbT10sbikpfWF3YWl0IFByb21pc2UuYWxsKHQpfX1mdW5jdGlvbiBqZSh0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZS5zcGxpY2UoMCxlLmxlbmd0aCk7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpZm9yKGNvbnN0IHIgaW4gZSlkZWxldGUgZVtyXTtmb3IoY29uc3QgciBpbiB0KUFycmF5LmlzQXJyYXkodFtyXSk/KGVbcl09W10samUodFtyXSxlW3JdKSk6dHlwZW9mIHRbcl09PSJvYmplY3QiPyhlW3JdPXt9LGplKHRbcl0sZVtyXSkpOmVbcl09dFtyXX1hc3luYyBmdW5jdGlvbiBCcyh0LGUpe2NvbnN0e2Z1bmN0aW9uTmFtZTpyLGFyZ3M6bn09dDtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2lmKCFyKXRocm93Im1pc3NpbmcgZnVuY3Rpb24gbmFtZSB0byBjYWxsIjtpZighZS5pbnN0YW5jZVtyXSl0aHJvd2B1bmRlZmluZWQgZnVuY3Rpb24gWyR7cn1dIGluIGNsYXNzICR7ZS5pbnN0YW5jZS5jb25zdHJ1Y3Rvci53b3JrZXJJZH1gO19lKHQsYXdhaXQgZS5pbnN0YW5jZVtyXSguLi5uPz9bXSkpfWNvbnN0IERzPXZ0KCJyZWdpc3RlcmVkV29ya2VycyIse30pO2Z1bmN0aW9uIE1zKHQsZSl7aWYoIXQuYXJncyl0aHJvdyJNaXNzaW5nIGNsYXNzTmFtZSB3aGlsZSBpbml0aWFsaXppbmcgd29ya2VyIjtjb25zdFtyLG5dPXQuYXJncyxzPURzW3JdO2lmKHMpZS5pbnN0YW5jZT1uZXcgcyh0LmFyZ3Muc2xpY2UoMSkpO2Vsc2UgdGhyb3dgdW5rbm93biB3b3JrZXIgY2xhc3MgJHtyfWA7amUobixPKSxfZSh0LHR5cGVvZiBlLmluc3RhbmNlIT09dm9pZCAwKX1hc3luYyBmdW5jdGlvbiBVcyh0LGUpe2NvbnN0e2FyZ3M6cn09dDtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2xldCBuO2UuaW5zdGFuY2UudGVybWluYXRlJiYobj1hd2FpdCBlLmluc3RhbmNlLnRlcm1pbmF0ZSguLi5yPz9bXSkpLF9lKHQsbil9ZnVuY3Rpb24gTnModCl7aWYoIXQuYXJncyl0aHJvdyJNaXNzaW5nIGdsb2JhbHMgd2hpbGUgc3luY2luZyI7amUodC5hcmdzWzBdLE8pLF9lKHQse30pfWZ1bmN0aW9uIE9zKCl7Y29uc3QgdD17fTtvbm1lc3NhZ2U9YXN5bmMgZT0+e2NvbnN0IHI9ZS5kYXRhO3N3aXRjaChyLnR5cGUpe2Nhc2UgUS5JTklUOk1zKHIsdCk7YnJlYWs7Y2FzZSBRLkZPUldBUkQ6QnMocix0KTticmVhaztjYXNlIFEuVEVSTUlOQVRFOlVzKHIsdCk7YnJlYWs7Y2FzZSBRLkdMT0JBTFNfU1lOQzpOcyhyKTticmVha319fU1yKCkmJk9zKCk7ZnVuY3Rpb24gTHModCxlKXtyZXR1cm4gT1t0XXx8KE9bdF09ZSksWygpPT5PW3RdLGFzeW5jIHI9PntPW3RdPXIsYXdhaXQgQ3MoKX1dfWZ1bmN0aW9uIHpzKHQsZSl7cmV0dXJuIExzKHQsZSl9Y29uc3RbR3MsJHNdPXpzKCJtZXRhZGF0YSIpO2Z1bmN0aW9uIFZzKHQpeyRzKHQpfWZ1bmN0aW9uIFN0KCl7cmV0dXJuIEdzKCl9bGV0IEl0PWNsYXNze2NvbnN0cnVjdG9yKGUscil7X3ModGhpcywidXVpZCIpLHRoaXMuY29uZmlnPWUsdGhpcy51dWlkPXI/P0ZzKCl9YXN5bmMgc2VuZChlKXt2YXIgcixuLHM7Y29uc3R7YXBwSWQ6aSxzb3VyY2VUeXBlOmF9PShyPVN0KCkpIT1udWxsP3I6e307aWYoIWl8fCFhKXJldHVybiJtZXRhZGF0YSBtaXNzaW5nIjtjb25zdCBvPW5ldyBBYm9ydENvbnRyb2xsZXIsYz1zZXRUaW1lb3V0KCgpPT5vLmFib3J0KCksQXMpO3JldHVybiBhd2FpdCgocz0obj10aGlzLmNvbmZpZyk9PW51bGw/dm9pZCAwOm4uZmV0Y2gpIT1udWxsP3M6ZmV0Y2gpKHRoaXMuZ2V0VXJsKCkse21ldGhvZDoiUE9TVCIsaGVhZGVyczp0aGlzLmdldEhlYWRlcnMoKSxib2R5OkpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRSZXBvcnQoZSkpLHNpZ25hbDpvLnNpZ25hbH0pLGNsZWFyVGltZW91dChjKSwic3VjY2VzcyJ9Z2V0VXJsKCl7dmFyIGU7bGV0IHI9KGU9U3QoKS5wcm94eVVybCkhPW51bGw/ZTp3cztyZXR1cm4gcis9KHIuYXQoLTEpPT09Ii8iPyIiOiIvIikrVHMscn1nZXRIZWFkZXJzKCl7cmV0dXJueyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19YnVpbGRSZXBvcnQoZSl7Y29uc3Qgcj1TdCgpO3JldHVybntndWlkOnRoaXMudXVpZCwuLi5lLGFwcGxpY2F0aW9uSWQ6ci5hcHBJZCx0aW1lc3RhbXA6RGF0ZS5ub3coKSxwcm94eVVybDpyLnByb3h5VXJsLHNvdXJjZTpyLnNvdXJjZVR5cGV9fX07Y29uc3QgWGU9IjIuMC40IjtjbGFzcyBXc3tjb25zdHJ1Y3RvcihlLHIpe3RoaXMuY29uZmlnPWUsdGhpcy5mcmFtZVRyYW5zZm9ybWVkQ291bnQ9MCx0aGlzLmZyYW1lRnJvbVNvdXJjZUNvdW50PTAsdGhpcy5zdGFydEF0PTAsdGhpcy5yZXBvcnRlcj1uZXcgSXQoZSxyKX1hc3luYyBvbkZyYW1lRnJvbVNvdXJjZSgpe3RoaXMuZnJhbWVGcm9tU291cmNlQ291bnQrK31nZXQgZnBzKCl7Y29uc3R7c3RhcnRBdDplLGZyYW1lRnJvbVNvdXJjZUNvdW50OnJ9PXRoaXMsbj0oRGF0ZS5ub3coKS1lKS8xZTM7cmV0dXJuIHIvbn1hc3luYyBvbkZyYW1lVHJhbnNmb3JtZWQoZT17fSxyPSExKXt0aGlzLnN0YXJ0QXQ9PT0wJiYodGhpcy5zdGFydEF0PURhdGUubm93KCkpLHRoaXMuZnJhbWVUcmFuc2Zvcm1lZENvdW50Kys7Y29uc3R7c3RhcnRBdDpuLGZyYW1lVHJhbnNmb3JtZWRDb3VudDpzLGZyYW1lRnJvbVNvdXJjZUNvdW50Oml9PXRoaXMsYT1EYXRlLm5vdygpLG89KGEtbikvMWUzLGM9cy9vLHU9aS9vO3JldHVybiByfHx0aGlzLmZyYW1lVHJhbnNmb3JtZWRDb3VudD49dGhpcy5jb25maWcubG9nZ2luZ0ludGVydmFsRnJhbWVDb3VudD8odGhpcy5mcmFtZUZyb21Tb3VyY2VDb3VudD0wLHRoaXMuZnJhbWVUcmFuc2Zvcm1lZENvdW50PTAsdGhpcy5zdGFydEF0PWEsdGhpcy5yZXBvcnRlci5jb25maWc9dGhpcy5jb25maWcsdGhpcy5yZXBvcnRlci5zZW5kKHsuLi50aGlzLmNvbmZpZy5yZXBvcnQsdmFyaWF0aW9uOiJRb1MiLGZwczp1LHRyYW5zZm9ybWVkRnBzOmMsZnJhbWVzVHJhbnNmb3JtZWQ6cywuLi5lfSkpOiJzdWNjZXNzIn19dmFyIFJ0PSh0PT4odC5waXBlbGluZV9lbmRlZD0icGlwZWxpbmVfZW5kZWQiLHQucGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciIsdC5waXBlbGluZV9zdGFydGVkPSJwaXBlbGluZV9zdGFydGVkIix0LnBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIix0LnBpcGVsaW5lX3Jlc3RhcnRlZD0icGlwZWxpbmVfcmVzdGFydGVkIix0LnBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yPSJwaXBlbGluZV9yZXN0YXJ0ZWRfd2l0aF9lcnJvciIsdCkpKFJ0fHx7fSk7Y29uc3QgSHM9NTAwLGpzPS44O2NsYXNzIFhzIGV4dGVuZHMgd3R7Y29uc3RydWN0b3IoZSxyKXtzdXBlcigpLHRoaXMucmVwb3J0ZXJfPW5ldyBJdCx0aGlzLnJlcG9ydGVyUW9zXz1uZXcgV3Moe2xvZ2dpbmdJbnRlcnZhbEZyYW1lQ291bnQ6SHMscmVwb3J0Ont2ZXJzaW9uOlhlfX0pLHRoaXMuaW5kZXhfPXIsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLnZpZGVvSGVpZ2h0Xz0wLHRoaXMudmlkZW9XaWR0aF89MCx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMSx0aGlzLnRyYW5zZm9ybWVyVHlwZV89IkN1c3RvbSIsImdldFRyYW5zZm9ybWVyVHlwZSJpbiBlJiYodGhpcy50cmFuc2Zvcm1lclR5cGVfPWUuZ2V0VHJhbnNmb3JtZXJUeXBlKCkpLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkNyZWF0ZSJ9KX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lfWFzeW5jIHN0YXJ0KGUpe2lmKHRoaXMuY29udHJvbGxlcl89ZSx0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0PT0iZnVuY3Rpb24iKXRyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydChlKX1jYXRjaChyKXt0aGlzLnJlcG9ydCh7bWVzc2FnZTpELmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCx2YXJpYXRpb246IkVycm9yIixlcnJvcjpBdChyKX0pO2NvbnN0IG49e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnIsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsbil9fWFzeW5jIHRyYW5zZm9ybShlLHIpe3ZhciBuLHM7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSxlIGluc3RhbmNlb2YgVmlkZW9GcmFtZSYmKHRoaXMudmlkZW9IZWlnaHRfPShlPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpPz8wLHRoaXMudmlkZW9XaWR0aF89KGU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKT8/MCksdGhpcy5yZXBvcnRlclFvc18ub25GcmFtZUZyb21Tb3VyY2UoKSx0aGlzLnRyYW5zZm9ybWVyXylpZih0aGlzLnNob3VsZFN0b3BfKWNvbnNvbGUud2FybigiW1BpcGVsaW5lXSBmbHVzaCBmcm9tIHRyYW5zZm9ybSIpLGUuY2xvc2UoKSx0aGlzLmZsdXNoKHIpLHIudGVybWluYXRlKCk7ZWxzZXt0cnl7YXdhaXQoKHM9KG49dGhpcy50cmFuc2Zvcm1lcl8pLnRyYW5zZm9ybSk9PW51bGw/dm9pZCAwOnMuY2FsbChuLGUscikpLHRoaXMucmVwb3J0UW9zKCl9Y2F0Y2goaSl7dGhpcy5yZXBvcnQoe21lc3NhZ2U6RC5lcnJvcnMudHJhbnNmb3JtZXJfdHJhbnNmb3JtLHZhcmlhdGlvbjoiRXJyb3IiLGVycm9yOkF0KGkpfSk7Y29uc3QgYT17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6aSxmdW5jdGlvbjoidHJhbnNmb3JtIn07dGhpcy5lbWl0KCJlcnJvciIsYSl9aWYodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXypqcz50aGlzLnJlcG9ydGVyUW9zXy5mcHMpe2NvbnN0IGk9e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LHdhcm5pbmdUeXBlOiJmcHNfZHJvcCIsZHJvcEluZm86e3JlcXVlc3RlZDp0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyxjdXJyZW50OnRoaXMucmVwb3J0ZXJRb3NfLmZwc319O3RoaXMuZW1pdCgid2FybiIsaSl9fX1hc3luYyBmbHVzaChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoPT0iZnVuY3Rpb24iJiYhdGhpcy5pc0ZsYXNoZWRfKXt0aGlzLmlzRmxhc2hlZF89ITA7dHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoKGUpfWNhdGNoKHIpe3RoaXMucmVwb3J0KHttZXNzYWdlOkQuZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoLHZhcmlhdGlvbjoiRXJyb3IiLGVycm9yOkF0KHIpfSk7Y29uc3Qgbj17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6cixmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixuKX19dGhpcy5yZXBvcnRRb3MoITApLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkRlbGV0ZSJ9KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5jb250cm9sbGVyXyYmKHRoaXMuZmx1c2godGhpcy5jb250cm9sbGVyXyksdGhpcy5jb250cm9sbGVyXy50ZXJtaW5hdGUoKSksdGhpcy5zaG91bGRTdG9wXz0hMH1yZXBvcnQoZSl7dGhpcy5yZXBvcnRlcl8uc2VuZCh7dmVyc2lvbjpYZSxhY3Rpb246Ik1lZGlhVHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyVHlwZTp0aGlzLnRyYW5zZm9ybWVyVHlwZV8sLi4uZX0pfXJlcG9ydFFvcyhlPSExKXt0aGlzLnJlcG9ydGVyUW9zXy5jb25maWc9ey4uLnRoaXMucmVwb3J0ZXJRb3NfLmNvbmZpZ30sdGhpcy5yZXBvcnRlclFvc18ub25GcmFtZVRyYW5zZm9ybWVkKHt2ZXJzaW9uOlhlLGFjdGlvbjoiTWVkaWFUcmFuc2Zvcm1lciIsdHJhbnNmb3JtZXJUeXBlOnRoaXMudHJhbnNmb3JtZXJUeXBlXyx2aWRlb1dpZHRoOnRoaXMudmlkZW9XaWR0aF8sdmlkZW9IZWlnaHQ6dGhpcy52aWRlb0hlaWdodF99LGUpfX1jbGFzcyBZcyBleHRlbmRzIHd0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy50cmFuc2Zvcm1lcnNfPVtdLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXtsZXQgbj1uZXcgWHMoZVtyXSxyKTtuLm9uKCJlcnJvciIscz0+e3RoaXMuZW1pdCgiZXJyb3IiLHMpfSksbi5vbigid2FybiIscz0+e3RoaXMuZW1pdCgid2FybiIscyl9KSx0aGlzLnRyYW5zZm9ybWVyc18ucHVzaChuKX19c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZTtmb3IobGV0IHIgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKXIuc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfWFzeW5jIHN0YXJ0KGUscil7aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIE5vIHRyYW5zZm9ybWVycy4iKTtyZXR1cm59dHJ5e2xldCBuPWU7Zm9yKGxldCBzIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllPWUucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbShzKSk7ZS5waXBlVG8ocikudGhlbihhc3luYygpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2V0dXAuIiksYXdhaXQgci5hYm9ydCgpLGF3YWl0IG4uY2FuY2VsKCksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9lbmRlZCIpfSkuY2F0Y2goYXN5bmMgcz0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKGk9Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLGkpfSksYXdhaXQgci5hYm9ydChzKSxhd2FpdCBuLmNhbmNlbChzKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3IiKX0pfWNhdGNoe3RoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiksdGhpcy5kZXN0cm95KCk7cmV0dXJufXRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfc3RhcnRlZCIpLGNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgUXMgZXh0ZW5kcyB3dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5yZXBvcnRlcl89bmV3IEl0LHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkNyZWF0ZSJ9KX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lLHRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9dHJhbnNmb3JtKGUscil7cmV0dXJuIHRoaXMucmVhZGFibGVfPWUsdGhpcy53cml0YWJsZV89cix0aGlzLnRyYW5zZm9ybUludGVybmFsKCl9dHJhbnNmb3JtSW50ZXJuYWwoKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoZSxyKT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXt0aGlzLnJlcG9ydCh7bWVzc2FnZTpELmVycm9ycy50cmFuc2Zvcm1lcl9ub25lLHZhcmlhdGlvbjoiRXJyb3IifSkscigiW01lZGlhUHJvY2Vzc29yXSBOZWVkIHRvIHNldCB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufWlmKCF0aGlzLnJlYWRhYmxlXyl7dGhpcy5yZXBvcnQoe3ZhcmlhdGlvbjoiRXJyb3IiLG1lc3NhZ2U6RC5lcnJvcnMucmVhZGFibGVfbnVsbH0pLHIoIltNZWRpYVByb2Nlc3Nvcl0gUmVhZGFibGUgaXMgbnVsbC4iKTtyZXR1cm59aWYoIXRoaXMud3JpdGFibGVfKXt0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJFcnJvciIsbWVzc2FnZTpELmVycm9ycy53cml0YWJsZV9udWxsfSkscigiW01lZGlhUHJvY2Vzc29yXSBXcml0YWJsZSBpcyBudWxsLiIpO3JldHVybn1sZXQgbj0hMTt0aGlzLnBpcGVsaW5lXyYmKG49ITAsdGhpcy5waXBlbGluZV8uY2xlYXJMaXN0ZW5lcnMoKSx0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCkpLHRoaXMucGlwZWxpbmVfPW5ldyBZcyh0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixzPT57dGhpcy5lbWl0KCJ3YXJuIixzKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIscz0+e3RoaXMuZW1pdCgiZXJyb3IiLHMpfSksdGhpcy5waXBlbGluZV8ub24oInBpcGVsaW5lSW5mbyIscz0+e24mJihzPT09InBpcGVsaW5lX3N0YXJ0ZWQiP3M9UnQucGlwZWxpbmVfcmVzdGFydGVkOnM9PT0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiYmKHM9UnQucGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IpKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIscyl9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKHM9PntyKHMpfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7cmV0dXJuIHRoaXMucmVwb3J0KHt2YXJpYXRpb246IlVwZGF0ZSIsbWVzc2FnZTpELnVwZGF0ZXMudHJhbnNmb3JtZXJfbmV3fSksdGhpcy50cmFuc2Zvcm1lcnNfPWUsdGhpcy5yZWFkYWJsZV8mJnRoaXMud3JpdGFibGVfP3RoaXMudHJhbnNmb3JtSW50ZXJuYWwoKTpQcm9taXNlLnJlc29sdmUoKX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIGU9Pnt0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkRlbGV0ZSJ9KSxlKCl9KX1yZXBvcnQoZSl7dGhpcy5yZXBvcnRlcl8uc2VuZCh7dmVyc2lvbjpYZSxhY3Rpb246Ik1lZGlhUHJvY2Vzc29yIiwuLi5lfSl9fXZhciBxcz1PYmplY3QuZGVmaW5lUHJvcGVydHksS3M9KHQsZSxyKT0+ZSBpbiB0P3FzKHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6cn0pOnRbZV09cixKcz0odCxlLHIpPT4oS3ModCxlKyIiLHIpLHIpO2NvbnN0IFpzPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyIsZWk9Imh0dHBzOi8vIix0aT0xZTQ7bGV0IFllO2NvbnN0IHJpPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBuaSgpe2lmKCFZZSYmKFllPXR5cGVvZiBjcnlwdG88InUiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKSwhWWUpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gWWUocmkpfWNvbnN0IHc9W107Zm9yKGxldCB0PTA7dDwyNTY7Kyt0KXcucHVzaCgodCsyNTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7ZnVuY3Rpb24gc2kodCxlPTApe3JldHVybih3W3RbZSswXV0rd1t0W2UrMV1dK3dbdFtlKzJdXSt3W3RbZSszXV0rIi0iK3dbdFtlKzRdXSt3W3RbZSs1XV0rIi0iK3dbdFtlKzZdXSt3W3RbZSs3XV0rIi0iK3dbdFtlKzhdXSt3W3RbZSs5XV0rIi0iK3dbdFtlKzEwXV0rd1t0W2UrMTFdXSt3W3RbZSsxMl1dK3dbdFtlKzEzXV0rd1t0W2UrMTRdXSt3W3RbZSsxNV1dKS50b0xvd2VyQ2FzZSgpfWNvbnN0IGlpPXR5cGVvZiBjcnlwdG88InUiJiZjcnlwdG8ucmFuZG9tVVVJRCYmY3J5cHRvLnJhbmRvbVVVSUQuYmluZChjcnlwdG8pLFVyPXtyYW5kb21VVUlEOmlpfTtmdW5jdGlvbiBvaSh0LGUscil7aWYoVXIucmFuZG9tVVVJRCYmIWUmJiF0KXJldHVybiBVci5yYW5kb21VVUlEKCk7dD10fHx7fTtjb25zdCBuPXQucmFuZG9tfHwodC5ybmd8fG5pKSgpO3JldHVybiBuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxzaShuKX1mdW5jdGlvbiBGdCh0LGUpe2dsb2JhbFRoaXMudm9uYWdlfHwoZ2xvYmFsVGhpcy52b25hZ2U9e30pLGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXJ8fChnbG9iYWxUaGlzLnZvbmFnZS53b3JrZXJpemVyPXt9KTtsZXQgcj1nbG9iYWxUaGlzLnZvbmFnZS53b3JrZXJpemVyO3JldHVybiByW3RdfHwoclt0XT1lKSxyW3RdfWNvbnN0IEw9RnQoImdsb2JhbHMiLHt9KTt2YXIgcT0odD0+KHQuSU5JVD0iSU5JVCIsdC5GT1JXQVJEPSJGT1JXQVJEIix0LlRFUk1JTkFURT0iVEVSTUlOQVRFIix0LkdMT0JBTFNfU1lOQz0iR0xPQkFMU19TWU5DIix0KSkocXx8e30pO2Z1bmN0aW9uIE5yKHQpe3JldHVybltJbWFnZUJpdG1hcCxSZWFkYWJsZVN0cmVhbSxXcml0YWJsZVN0cmVhbV0uc29tZShlPT50IGluc3RhbmNlb2YgZSl9bGV0IGFpPTA7ZnVuY3Rpb24gY2kodCxlLHIsbixzKXtjb25zdCBpPWFpKys7cmV0dXJuIHQucG9zdE1lc3NhZ2Uoe2lkOmksdHlwZTplLGZ1bmN0aW9uTmFtZTpyLGFyZ3M6bn0sbi5maWx0ZXIoYT0+TnIoYSkpKSxuZXcgUHJvbWlzZShhPT57cz09bnVsbHx8cy5zZXQoaSxhKX0pfWZ1bmN0aW9uIFRlKHQsZSl7Y29uc3R7aWQ6cix0eXBlOm59PXQscz1BcnJheS5pc0FycmF5KGUpP2U6W2VdO3Bvc3RNZXNzYWdlKHtpZDpyLHR5cGU6bixyZXN1bHQ6ZX0scy5maWx0ZXIoaT0+TnIoaSkpKX1jb25zdCBPcj1GdCgid29ya2VyaXplZCIse30pO2Z1bmN0aW9uIExyKCl7cmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1hc3luYyBmdW5jdGlvbiB1aSgpe2lmKExyKCkpVGUoe3R5cGU6cS5HTE9CQUxTX1NZTkN9LEwpO2Vsc2V7Y29uc3QgdD1bXTtmb3IoY29uc3QgZSBpbiBPcil7Y29uc3R7d29ya2VyOnIscmVzb2x2ZXJzOm59PU9yW2VdLndvcmtlckNvbnRleHQ7ciYmdC5wdXNoKGNpKHIscS5HTE9CQUxTX1NZTkMsIiIsW0xdLG4pKX1hd2FpdCBQcm9taXNlLmFsbCh0KX19ZnVuY3Rpb24gUWUodCxlKXtpZihBcnJheS5pc0FycmF5KGUpKWUuc3BsaWNlKDAsZS5sZW5ndGgpO2Vsc2UgaWYodHlwZW9mIGU9PSJvYmplY3QiKWZvcihjb25zdCByIGluIGUpZGVsZXRlIGVbcl07Zm9yKGNvbnN0IHIgaW4gdClBcnJheS5pc0FycmF5KHRbcl0pPyhlW3JdPVtdLFFlKHRbcl0sZVtyXSkpOnR5cGVvZiB0W3JdPT0ib2JqZWN0Ij8oZVtyXT17fSxRZSh0W3JdLGVbcl0pKTplW3JdPXRbcl19YXN5bmMgZnVuY3Rpb24gZmkodCxlKXtjb25zdHtmdW5jdGlvbk5hbWU6cixhcmdzOm59PXQ7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtpZighcil0aHJvdyJtaXNzaW5nIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCI7aWYoIWUuaW5zdGFuY2Vbcl0pdGhyb3dgdW5kZWZpbmVkIGZ1bmN0aW9uIFske3J9XSBpbiBjbGFzcyAke2UuaW5zdGFuY2UuY29uc3RydWN0b3Iud29ya2VySWR9YDtUZSh0LGF3YWl0IGUuaW5zdGFuY2Vbcl0oLi4ubj8/W10pKX1jb25zdCBsaT1GdCgicmVnaXN0ZXJlZFdvcmtlcnMiLHt9KTtmdW5jdGlvbiBkaSh0LGUpe2lmKCF0LmFyZ3MpdGhyb3ciTWlzc2luZyBjbGFzc05hbWUgd2hpbGUgaW5pdGlhbGl6aW5nIHdvcmtlciI7Y29uc3RbcixuXT10LmFyZ3Mscz1saVtyXTtpZihzKWUuaW5zdGFuY2U9bmV3IHModC5hcmdzLnNsaWNlKDEpKTtlbHNlIHRocm93YHVua25vd24gd29ya2VyIGNsYXNzICR7cn1gO1FlKG4sTCksVGUodCx0eXBlb2YgZS5pbnN0YW5jZSE9PXZvaWQgMCl9YXN5bmMgZnVuY3Rpb24gaGkodCxlKXtjb25zdHthcmdzOnJ9PXQ7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtsZXQgbjtlLmluc3RhbmNlLnRlcm1pbmF0ZSYmKG49YXdhaXQgZS5pbnN0YW5jZS50ZXJtaW5hdGUoLi4ucj8/W10pKSxUZSh0LG4pfWZ1bmN0aW9uIG1pKHQpe2lmKCF0LmFyZ3MpdGhyb3ciTWlzc2luZyBnbG9iYWxzIHdoaWxlIHN5bmNpbmciO1FlKHQuYXJnc1swXSxMKSxUZSh0LHt9KX1mdW5jdGlvbiBwaSgpe2NvbnN0IHQ9e307b25tZXNzYWdlPWFzeW5jIGU9Pntjb25zdCByPWUuZGF0YTtzd2l0Y2goci50eXBlKXtjYXNlIHEuSU5JVDpkaShyLHQpO2JyZWFrO2Nhc2UgcS5GT1JXQVJEOmZpKHIsdCk7YnJlYWs7Y2FzZSBxLlRFUk1JTkFURTpoaShyLHQpO2JyZWFrO2Nhc2UgcS5HTE9CQUxTX1NZTkM6bWkocik7YnJlYWt9fX1McigpJiZwaSgpO2Z1bmN0aW9uIHlpKHQsZSl7cmV0dXJuIExbdF18fChMW3RdPWUpLFsoKT0+TFt0XSxhc3luYyByPT57TFt0XT1yLGF3YWl0IHVpKCl9XX1mdW5jdGlvbiBiaSh0LGUpe3JldHVybiB5aSh0LGUpfWNvbnN0W2dpLGZmXT1iaSgibWV0YWRhdGEiKTtmdW5jdGlvbiBQdCgpe3JldHVybiBnaSgpfWNsYXNzIHhpe2NvbnN0cnVjdG9yKGUpe0pzKHRoaXMsInV1aWQiLG9pKCkpLHRoaXMuY29uZmlnPWV9YXN5bmMgc2VuZChlKXt2YXIgcixuLHM7Y29uc3R7YXBwSWQ6aSxzb3VyY2VUeXBlOmF9PShyPVB0KCkpIT1udWxsP3I6e307aWYoIWl8fCFhKXJldHVybiJtZXRhZGF0YSBtaXNzaW5nIjtjb25zdCBvPW5ldyBBYm9ydENvbnRyb2xsZXIsYz1zZXRUaW1lb3V0KCgpPT5vLmFib3J0KCksdGkpO3JldHVybiBhd2FpdCgocz0obj10aGlzLmNvbmZpZyk9PW51bGw/dm9pZCAwOm4uZmV0Y2gpIT1udWxsP3M6ZmV0Y2gpKHRoaXMuZ2V0VXJsKCkse21ldGhvZDoiUE9TVCIsaGVhZGVyczp0aGlzLmdldEhlYWRlcnMoKSxib2R5OkpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRSZXBvcnQoZSkpLHNpZ25hbDpvLnNpZ25hbH0pLGNsZWFyVGltZW91dChjKSwic3VjY2VzcyJ9Z2V0VXJsKCl7dmFyIGU7bGV0IHI9KGU9UHQoKS5wcm94eVVybCkhPW51bGw/ZTplaTtyZXR1cm4gcis9KHIuYXQoLTEpPT09Ii8iPyIiOiIvIikrWnMscn1nZXRIZWFkZXJzKCl7cmV0dXJueyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19YnVpbGRSZXBvcnQoZSl7Y29uc3Qgcj1QdCgpO3JldHVybntndWlkOnRoaXMudXVpZCwuLi5lLGFwcGxpY2F0aW9uSWQ6ci5hcHBJZCx0aW1lc3RhbXA6RGF0ZS5ub3coKSxwcm94eVVybDpyLnByb3h5VXJsLHNvdXJjZTpyLnNvdXJjZVR5cGV9fX1jb25zdCBFaT0iNi4xLjAiO3ZhciBxZT0odD0+KHQuTG93PSJMb3ciLHQuSGlnaD0iSGlnaCIsdCkpKHFlfHx7fSksa3Q9KHQ9Pih0LkZBU1Q9IkZBU1QiLHQuUFJFQ0lTRT0iUFJFQ0lTRSIsdCkpKGt0fHx7fSksS2U9KHQ9Pih0LkNBTlZBUz0iQ0FOVkFTIix0LldFQkdMPSJXRUJHTCIsdCkpKEtlfHx7fSk7ZnVuY3Rpb24gX2koKXtjb25zdCBlPW5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKS5nZXRDb250ZXh0KCJ3ZWJnbDIiLHtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiEwfSk7aWYoZSl7Y29uc3Qgcj1lPT1udWxsP3ZvaWQgMDplLmdldEV4dGVuc2lvbigiV0VCR0xfbG9zZV9jb250ZXh0Iik7ciYmci5sb3NlQ29udGV4dCgpfWVsc2UgcmV0dXJue3N1cHBvcnRlZDohMSxtZXNzYWdlOiJZb3VyIGhhcmR3YXJlIGRvZXMgbm90IHBlcmZvcm0gZ29vZCBlbm91Z2ggdG8gcnVuIHRoZSBsaWJyYXJ5IGVmZmljaWVudGx5In07cmV0dXJue3N1cHBvcnRlZDohMH19Y2xhc3MgQ3R7Y29uc3RydWN0b3IoKXtjb25zdCBlPW5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKSxyPWUuZ2V0Q29udGV4dCgiMmQiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KTtpZighcil0aHJvdyJGYWlsIHRvIHJldHJpZXZlIDJkIGNvbnRleHQiO3RoaXMuY2FudmFzPWUsdGhpcy5jb250ZXh0PXJ9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7fWVuYWJsZVBvc3RQcm9jZXNzaW5nKCl7fWRpc2FibGVQb3N0UHJvY2Vzc2luZygpe31hc3luYyBwcm9maWxlV2ViZ2woZSl7cmV0dXJuW119YXN5bmMgcmVuZGVyKGUscil7cmV0dXJuIHRoaXMuY2FudmFzfXJlc2l6ZUNhbnZhcyhlKXtjb25zdHt3aWR0aDpyLGhlaWdodDpufT1lO3RoaXMuY2FudmFzLndpZHRoPXIsdGhpcy5jYW52YXMuaGVpZ2h0PW59cmVuZGVyU2lsaG91ZXR0ZShlLHIsbj0ibm9uZSIpe2NvbnN0e3dpZHRoOnMsaGVpZ2h0Oml9PWU7dGhpcy5jb250ZXh0LnNhdmUoKSx0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHIsMCwwLHIud2lkdGgsci5oZWlnaHQsMCwwLHMsaSksdGhpcy5jb250ZXh0LmZpbHRlcj0iYmx1cig1cHgpIix0aGlzLmNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UociwwLDAsci53aWR0aCxyLmhlaWdodCwwLDAscyxpKSx0aGlzLmNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iLHRoaXMuY29udGV4dC5maWx0ZXI9bix0aGlzLmNvbnRleHQuZHJhd0ltYWdlKGUsMCwwLHMsaSwwLDAsdGhpcy5jYW52YXMud2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0KSx0aGlzLmNvbnRleHQucmVzdG9yZSgpfWRlc3Ryb3koKXt9fWNsYXNzIFRpIGV4dGVuZHMgQ3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnJhZGl1cz1lfWFzeW5jIHJlbmRlcihlLHIpe3N1cGVyLnJlc2l6ZUNhbnZhcyhlKTtjb25zdCBuPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHIpO3JldHVybiB0aGlzLnJlbmRlclNpbGhvdWV0dGUoZSxuKSx0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5maWx0ZXI9YGJsdXIoJHt0aGlzLnJhZGl1c31weClgLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsZS53aWR0aCxlLmhlaWdodCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKSxzdXBlci5yZW5kZXIoZSxyKX19Y2xhc3Mgd2kgZXh0ZW5kcyBDdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMucmFkaXVzPWV9YXN5bmMgcmVuZGVyKGUscil7c3VwZXIucmVzaXplQ2FudmFzKGUpO2NvbnN0IG49YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAocik7cmV0dXJuIHRoaXMucmVuZGVyU2lsaG91ZXR0ZShlLG4sYGJsdXIoJHt0aGlzLnJhZGl1c31weClgKSx0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5maWx0ZXI9Im5vbmUiLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsZS53aWR0aCxlLmhlaWdodCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKSxzdXBlci5yZW5kZXIoZSxyKX19Y2xhc3MgQWkgZXh0ZW5kcyBDdHtzZXRCYWNrZ3JvdW5kSW1hZ2UoZSl7dGhpcy5iYWNrZ3JvdW5kSW1hZ2U9ZX1hc3luYyByZW5kZXIoZSxyKXtzdXBlci5yZXNpemVDYW52YXMoZSk7Y29uc3Qgbj1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChyKTtyZXR1cm4gdGhpcy5yZW5kZXJTaWxob3VldHRlKGUsbiksdGhpcy5iYWNrZ3JvdW5kSW1hZ2UmJih0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5maWx0ZXI9Im5vbmUiLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UodGhpcy5iYWNrZ3JvdW5kSW1hZ2UsMCwwLHRoaXMuYmFja2dyb3VuZEltYWdlLndpZHRoLHRoaXMuYmFja2dyb3VuZEltYWdlLmhlaWdodCwwLDAsZS53aWR0aCxlLmhlaWdodCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKSksc3VwZXIucmVuZGVyKGUscil9fS8qIEBsaWNlbnNlIHR3Z2wuanMgNS41LjEgQ29weXJpZ2h0IChjKSAyMDE1LCBHcmVnZyBUYXZhcmVzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkF2YWlsYWJsZSB2aWEgdGhlIE1JVCBsaWNlbnNlLgpzZWU6IGh0dHA6Ly9naXRodWIuY29tL2dyZWdnbWFuL3R3Z2wuanMgZm9yIGRldGFpbHMgKi9jb25zdCBCdD01MTIwLHdlPTUxMjEsRHQ9NTEyMixNdD01MTIzLFV0PTUxMjQsTnQ9NTEyNSxPdD01MTI2LHZpPTMyODE5LFNpPTMyODIwLElpPTMzNjM1LFJpPTUxMzEsRmk9MzM2NDAsUGk9MzU4OTksa2k9MzU5MDIsQ2k9MzYyNjksQmk9MzQwNDIsenI9e307e2NvbnN0IHQ9enI7dFtCdF09SW50OEFycmF5LHRbd2VdPVVpbnQ4QXJyYXksdFtEdF09SW50MTZBcnJheSx0W010XT1VaW50MTZBcnJheSx0W1V0XT1JbnQzMkFycmF5LHRbTnRdPVVpbnQzMkFycmF5LHRbT3RdPUZsb2F0MzJBcnJheSx0W3ZpXT1VaW50MTZBcnJheSx0W1NpXT1VaW50MTZBcnJheSx0W0lpXT1VaW50MTZBcnJheSx0W1JpXT1VaW50MTZBcnJheSx0W0ZpXT1VaW50MzJBcnJheSx0W1BpXT1VaW50MzJBcnJheSx0W2tpXT1VaW50MzJBcnJheSx0W0NpXT1VaW50MzJBcnJheSx0W0JpXT1VaW50MzJBcnJheX1mdW5jdGlvbiBMdCh0KXtpZih0IGluc3RhbmNlb2YgSW50OEFycmF5KXJldHVybiBCdDtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheXx8dCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiB3ZTtpZih0IGluc3RhbmNlb2YgSW50MTZBcnJheSlyZXR1cm4gRHQ7aWYodCBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXJldHVybiBNdDtpZih0IGluc3RhbmNlb2YgSW50MzJBcnJheSlyZXR1cm4gVXQ7aWYodCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBOdDtpZih0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KXJldHVybiBPdDt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiBHcih0KXtpZih0PT09SW50OEFycmF5KXJldHVybiBCdDtpZih0PT09VWludDhBcnJheXx8dD09PVVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiB3ZTtpZih0PT09SW50MTZBcnJheSlyZXR1cm4gRHQ7aWYodD09PVVpbnQxNkFycmF5KXJldHVybiBNdDtpZih0PT09SW50MzJBcnJheSlyZXR1cm4gVXQ7aWYodD09PVVpbnQzMkFycmF5KXJldHVybiBOdDtpZih0PT09RmxvYXQzMkFycmF5KXJldHVybiBPdDt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiAkcih0KXtjb25zdCBlPXpyW3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcigidW5rbm93biBnbCB0eXBlIik7cmV0dXJuIGV9Y29uc3QgSmU9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5idWZmZXImJihlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuYnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTtmdW5jdGlvbiBWciguLi50KXtjb25zb2xlLmVycm9yKC4uLnQpfWNvbnN0IFdyPW5ldyBNYXA7ZnVuY3Rpb24gWmUodCxlKXtpZighdHx8dHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiExO2xldCByPVdyLmdldChlKTtyfHwocj1uZXcgV2Vha01hcCxXci5zZXQoZSxyKSk7bGV0IG49ci5nZXQodCk7aWYobj09PXZvaWQgMCl7Y29uc3Qgcz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7bj1zLnN1YnN0cmluZyg4LHMubGVuZ3RoLTEpPT09ZSxyLnNldCh0LG4pfXJldHVybiBufWZ1bmN0aW9uIERpKHQsZSl7cmV0dXJuIHR5cGVvZiBXZWJHTEJ1ZmZlcjwidSImJlplKGUsIldlYkdMQnVmZmVyIil9ZnVuY3Rpb24gTWkodCxlKXtyZXR1cm4gdHlwZW9mIFdlYkdMUmVuZGVyYnVmZmVyPCJ1IiYmWmUoZSwiV2ViR0xSZW5kZXJidWZmZXIiKX1mdW5jdGlvbiB6dCh0LGUpe3JldHVybiB0eXBlb2YgV2ViR0xUZXh0dXJlPCJ1IiYmWmUoZSwiV2ViR0xUZXh0dXJlIil9ZnVuY3Rpb24gVWkodCxlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2FtcGxlcjwidSImJlplKGUsIldlYkdMU2FtcGxlciIpfWNvbnN0IEhyPTM1MDQ0LEs9MzQ5NjIsTmk9MzQ5NjMsT2k9MzQ2NjAsTGk9NTEyMCx6aT01MTIxLEdpPTUxMjIsJGk9NTEyMyxWaT01MTI0LFdpPTUxMjUsanI9NTEyNixYcj17YXR0cmliUHJlZml4OiIifTtmdW5jdGlvbiBIaSh0LGUscixuLHMpe3QuYmluZEJ1ZmZlcihlLHIpLHQuYnVmZmVyRGF0YShlLG4sc3x8SHIpfWZ1bmN0aW9uIFlyKHQsZSxyLG4pe2lmKERpKHQsZSkpcmV0dXJuIGU7cj1yfHxLO2NvbnN0IHM9dC5jcmVhdGVCdWZmZXIoKTtyZXR1cm4gSGkodCxyLHMsZSxuKSxzfWZ1bmN0aW9uIFFyKHQpe3JldHVybiB0PT09ImluZGljZXMifWZ1bmN0aW9uIGppKHQpe3JldHVybiB0PT09SW50OEFycmF5fHx0PT09VWludDhBcnJheX1mdW5jdGlvbiBYaSh0KXtyZXR1cm4gdC5sZW5ndGg/dDp0LmRhdGF9Y29uc3QgWWk9L2Nvb3JkfHRleHR1cmUvaSxRaT0vY29sb3J8Y29sb3VyL2k7ZnVuY3Rpb24gcWkodCxlKXtsZXQgcjtpZihZaS50ZXN0KHQpP3I9MjpRaS50ZXN0KHQpP3I9NDpyPTMsZSVyPjApdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGd1ZXNzIG51bUNvbXBvbmVudHMgZm9yIGF0dHJpYnV0ZSAnJHt0fScuIFRyaWVkICR7cn0gYnV0ICR7ZX0gdmFsdWVzIGlzIG5vdCBldmVubHkgZGl2aXNpYmxlIGJ5ICR7cn0uIFlvdSBzaG91bGQgc3BlY2lmeSBpdC5gKTtyZXR1cm4gcn1mdW5jdGlvbiBLaSh0LGUscil7cmV0dXJuIHQubnVtQ29tcG9uZW50c3x8dC5zaXplfHxxaShlLHJ8fFhpKHQpLmxlbmd0aCl9ZnVuY3Rpb24gcXIodCxlKXtpZihKZSh0KSlyZXR1cm4gdDtpZihKZSh0LmRhdGEpKXJldHVybiB0LmRhdGE7QXJyYXkuaXNBcnJheSh0KSYmKHQ9e2RhdGE6dH0pO2xldCByPXQudHlwZT9HdCh0LnR5cGUpOnZvaWQgMDtyZXR1cm4gcnx8KFFyKGUpP3I9VWludDE2QXJyYXk6cj1GbG9hdDMyQXJyYXkpLG5ldyByKHQuZGF0YSl9ZnVuY3Rpb24gSmkodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj90OnQ/R3IodCk6anJ9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj8kcih0KTp0fHxGbG9hdDMyQXJyYXl9ZnVuY3Rpb24gWmkodCxlKXtyZXR1cm57YnVmZmVyOmUuYnVmZmVyLG51bVZhbHVlczoyKjMqNCx0eXBlOkppKGUudHlwZSksYXJyYXlUeXBlOkd0KGUudHlwZSl9fWZ1bmN0aW9uIGVvKHQsZSl7Y29uc3Qgcj1lLmRhdGF8fGUsbj1HdChlLnR5cGUpLHM9cipuLkJZVEVTX1BFUl9FTEVNRU5ULGk9dC5jcmVhdGVCdWZmZXIoKTtyZXR1cm4gdC5iaW5kQnVmZmVyKEssaSksdC5idWZmZXJEYXRhKEsscyxlLmRyYXdUeXBlfHxIcikse2J1ZmZlcjppLG51bVZhbHVlczpyLHR5cGU6R3IobiksYXJyYXlUeXBlOm59fWZ1bmN0aW9uIHRvKHQsZSxyKXtjb25zdCBuPXFyKGUscik7cmV0dXJue2FycmF5VHlwZTpuLmNvbnN0cnVjdG9yLGJ1ZmZlcjpZcih0LG4sdm9pZCAwLGUuZHJhd1R5cGUpLHR5cGU6THQobiksbnVtVmFsdWVzOjB9fWZ1bmN0aW9uIHJvKHQsZSl7Y29uc3Qgcj17fTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXtpZighUXIobikpe2NvbnN0IHM9ZVtuXSxpPXMuYXR0cmlifHxzLm5hbWV8fHMuYXR0cmliTmFtZXx8WHIuYXR0cmliUHJlZml4K247aWYocy52YWx1ZSl7aWYoIUFycmF5LmlzQXJyYXkocy52YWx1ZSkmJiFKZShzLnZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoImFycmF5LnZhbHVlIGlzIG5vdCBhcnJheSBvciB0eXBlZGFycmF5Iik7cltpXT17dmFsdWU6cy52YWx1ZX19ZWxzZXtsZXQgYTtzLmJ1ZmZlciYmcy5idWZmZXIgaW5zdGFuY2VvZiBXZWJHTEJ1ZmZlcj9hPVppOnR5cGVvZiBzPT0ibnVtYmVyInx8dHlwZW9mIHMuZGF0YT09Im51bWJlciI/YT1lbzphPXRvO2NvbnN0e2J1ZmZlcjpvLHR5cGU6YyxudW1WYWx1ZXM6dSxhcnJheVR5cGU6Zn09YSh0LHMsbiksZD1zLm5vcm1hbGl6ZSE9PXZvaWQgMD9zLm5vcm1hbGl6ZTpqaShmKSxoPUtpKHMsbix1KTtyW2ldPXtidWZmZXI6byxudW1Db21wb25lbnRzOmgsdHlwZTpjLG5vcm1hbGl6ZTpkLHN0cmlkZTpzLnN0cmlkZXx8MCxvZmZzZXQ6cy5vZmZzZXR8fDAsZGl2aXNvcjpzLmRpdmlzb3I9PT12b2lkIDA/dm9pZCAwOnMuZGl2aXNvcixkcmF3VHlwZTpzLmRyYXdUeXBlfX19fSksdC5iaW5kQnVmZmVyKEssbnVsbCkscn1mdW5jdGlvbiBubyh0LGUpe3JldHVybiBlPT09TGl8fGU9PT16aT8xOmU9PT1HaXx8ZT09PSRpPzI6ZT09PVZpfHxlPT09V2l8fGU9PT1qcj80OjB9Y29uc3QgJHQ9WyJwb3NpdGlvbiIsInBvc2l0aW9ucyIsImFfcG9zaXRpb24iXTtmdW5jdGlvbiBzbyh0LGUpe2xldCByLG47Zm9yKG49MDtuPCR0Lmxlbmd0aCYmKHI9JHRbbl0sIShyIGluIGV8fChyPVhyLmF0dHJpYlByZWZpeCtyLHIgaW4gZSkpKTsrK24pO249PT0kdC5sZW5ndGgmJihyPU9iamVjdC5rZXlzKGUpWzBdKTtjb25zdCBzPWVbcl07aWYoIXMuYnVmZmVyKXJldHVybiAxO3QuYmluZEJ1ZmZlcihLLHMuYnVmZmVyKTtjb25zdCBpPXQuZ2V0QnVmZmVyUGFyYW1ldGVyKEssT2kpO3QuYmluZEJ1ZmZlcihLLG51bGwpO2NvbnN0IGE9bm8odCxzLnR5cGUpLG89aS9hLGM9cy5udW1Db21wb25lbnRzfHxzLnNpemUsdT1vL2M7aWYodSUxIT09MCl0aHJvdyBuZXcgRXJyb3IoYG51bUNvbXBvbmVudHMgJHtjfSBub3QgY29ycmVjdCBmb3IgbGVuZ3RoICR7bGVuZ3RofWApO3JldHVybiB1fWZ1bmN0aW9uIGlvKHQsZSxyKXtjb25zdCBuPXJvKHQsZSkscz1PYmplY3QuYXNzaWduKHt9LHJ8fHt9KTtzLmF0dHJpYnM9T2JqZWN0LmFzc2lnbih7fSxyP3IuYXR0cmliczp7fSxuKTtjb25zdCBpPWUuaW5kaWNlcztpZihpKXtjb25zdCBhPXFyKGksImluZGljZXMiKTtzLmluZGljZXM9WXIodCxhLE5pKSxzLm51bUVsZW1lbnRzPWEubGVuZ3RoLHMuZWxlbWVudFR5cGU9THQoYSl9ZWxzZSBzLm51bUVsZW1lbnRzfHwocy5udW1FbGVtZW50cz1zbyh0LHMuYXR0cmlicykpO3JldHVybiBzfWZ1bmN0aW9uIEFlKHQpe3JldHVybiEhdC50ZXhTdG9yYWdlMkR9Y29uc3QgS3I9ZnVuY3Rpb24oKXtjb25zdCB0PXt9LGU9e307ZnVuY3Rpb24gcihuKXtjb25zdCBzPW4uY29uc3RydWN0b3IubmFtZTtpZighdFtzXSl7Zm9yKGNvbnN0IGkgaW4gbilpZih0eXBlb2YgbltpXT09Im51bWJlciIpe2NvbnN0IGE9ZVtuW2ldXTtlW25baV1dPWE/YCR7YX0gfCAke2l9YDppfXRbc109ITB9fXJldHVybiBmdW5jdGlvbihzLGkpe3JldHVybiByKHMpLGVbaV18fCh0eXBlb2YgaT09Im51bWJlciI/YDB4JHtpLnRvU3RyaW5nKDE2KX1gOmkpfX0oKSx6PXt0ZXh0dXJlQ29sb3I6bmV3IFVpbnQ4QXJyYXkoWzEyOCwxOTIsMjU1LDI1NV0pLHRleHR1cmVPcHRpb25zOnt9LGNyb3NzT3JpZ2luOnZvaWQgMH0sdmU9SmUsSnI9ZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdD10fHwodHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3JlYXRlRWxlbWVudD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOm51bGwpLHR9fSgpLFZ0PTY0MDYsUD02NDA3LGc9NjQwOCxXdD02NDA5LEh0PTY0MTAsaGU9NjQwMixqdD0zNDA0MSxldD0zMzA3MSxvbz05NzI4LGFvPTk3MjksRz0zNTUzLCQ9MzQwNjcsSj0zMjg3OSxaPTM1ODY2LFh0PTM0MDY5LGNvPTM0MDcwLHVvPTM0MDcxLGZvPTM0MDcyLGxvPTM0MDczLGhvPTM0MDc0LFl0PTEwMjQxLFF0PTEwMjQwLHR0PTEwMjQyLHJ0PTEwMjQzLFpyPTMyODgyLG1vPTMzMDgyLHBvPTMzMDgzLHlvPTMzMDg0LGJvPTMzMDg1LGdvPTM0ODkyLHhvPTM0ODkzLHF0PTMzMTcsZW49MzMxNCx0bj0zMjg3OCxybj0zMzE2LG5uPTMzMTUsc249MzI4NzcsRW89Mzc0NDMsX289Mzc0NDEsVG89Mzc0NDAsd289MzMzMjEsQW89MzY3NTYsdm89MzMzMjUsU289MzMzMjYsSW89MzMzMzAsUm89MzMzMjksRm89MzMzMzgsUG89MzMzMzcsa289MzMzNDAsQ289MzMzMzksQm89MzMzMjMsRG89MzY3NTcsTW89MzMzMjcsVW89MzMzMjgsTm89MzMzMzYsT289MzMzMzUsTG89MzMzMzIsem89MzMzMzEsR289MzMzMzQsJG89MzMzMzMsVm89MzI4NDksV289MzU5MDUsSG89MzYxOTQsam89MzY3NTgsWG89MzU4OTgsWW89MzU5MDEsUW89MzQ4NDMscW89MzQ4MzcsS289MzYyMjEsSm89MzYyMzksWm89MzYyMTUsZWE9MzYyMzMsdGE9MzYyMDkscmE9MzYyMjcsbmE9MzI4NTYsc2E9MzU5MDcsaWE9MzY3NTksb2E9MzI4NTUsYWE9MzI4NTQsY2E9MzI4NTcsdWE9MzQ4NDIsZmE9MzQ4MzYsbGE9MzYyMjAsZGE9MzYyMzgsaGE9MzY5NzUsbWE9MzYyMTQscGE9MzYyMzIseWE9MzYyMjYsYmE9MzYyMDgsZ2E9MzMxODkseGE9MzMxOTAsRWE9MzYwMTIsX2E9MzYwMTMsVGE9MzUwNTYsVj01MTIwLEU9NTEyMSxudD01MTIyLG1lPTUxMjMsc3Q9NTEyNCxlZT01MTI1LEE9NTEyNixvbj0zMjgxOSxhbj0zMjgyMCxjbj0zMzYzNSxrPTUxMzEsU2U9MzYxOTMsS3Q9MzM2NDAsd2E9MzU4OTksQWE9MzU5MDIsdmE9MzYyNjksU2E9MzQwNDIsSWU9MzMzMTksdGU9MzMzMjAsUmU9NjQwMyxyZT0zNjI0NCxuZT0zNjI0OCxXPTM2MjQ5LElhPXt9O3tjb25zdCB0PUlhO3RbVnRdPXtudW1Db2xvckNvbXBvbmVudHM6MX0sdFtXdF09e251bUNvbG9yQ29tcG9uZW50czoxfSx0W0h0XT17bnVtQ29sb3JDb21wb25lbnRzOjJ9LHRbUF09e251bUNvbG9yQ29tcG9uZW50czozfSx0W2ddPXtudW1Db2xvckNvbXBvbmVudHM6NH0sdFtSZV09e251bUNvbG9yQ29tcG9uZW50czoxfSx0W3JlXT17bnVtQ29sb3JDb21wb25lbnRzOjF9LHRbSWVdPXtudW1Db2xvckNvbXBvbmVudHM6Mn0sdFt0ZV09e251bUNvbG9yQ29tcG9uZW50czoyfSx0W1BdPXtudW1Db2xvckNvbXBvbmVudHM6M30sdFtuZV09e251bUNvbG9yQ29tcG9uZW50czozfSx0W2ddPXtudW1Db2xvckNvbXBvbmVudHM6NH0sdFtXXT17bnVtQ29sb3JDb21wb25lbnRzOjR9LHRbaGVdPXtudW1Db2xvckNvbXBvbmVudHM6MX0sdFtqdF09e251bUNvbG9yQ29tcG9uZW50czoyfX1sZXQgSnQ7ZnVuY3Rpb24gaXQodCl7aWYoIUp0KXtjb25zdCBlPXt9O2VbVnRdPXt0ZXh0dXJlRm9ybWF0OlZ0LGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEsMiwyLDRdLHR5cGU6W0UsayxTZSxBXX0sZVtXdF09e3RleHR1cmVGb3JtYXQ6V3QsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMSwyLDIsNF0sdHlwZTpbRSxrLFNlLEFdfSxlW0h0XT17dGV4dHVyZUZvcm1hdDpIdCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyLDQsNCw4XSx0eXBlOltFLGssU2UsQV19LGVbUF09e3RleHR1cmVGb3JtYXQ6UCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszLDYsNiwxMiwyXSx0eXBlOltFLGssU2UsQSxjbl19LGVbZ109e3RleHR1cmVGb3JtYXQ6Zyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDgsOCwxNiwyLDJdLHR5cGU6W0UsayxTZSxBLG9uLGFuXX0sZVtoZV09e3RleHR1cmVGb3JtYXQ6aGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMiw0XSx0eXBlOltlZSxtZV19LGVbd29dPXt0ZXh0dXJlRm9ybWF0OlJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W0VdfSxlW0FvXT17dGV4dHVyZUZvcm1hdDpSZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxXSx0eXBlOltWXX0sZVt2b109e3RleHR1cmVGb3JtYXQ6UmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNCwyXSx0eXBlOltBLGtdfSxlW1NvXT17dGV4dHVyZUZvcm1hdDpSZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltBXX0sZVtJb109e3RleHR1cmVGb3JtYXQ6cmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbRV19LGVbUm9dPXt0ZXh0dXJlRm9ybWF0OnJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W1ZdfSxlW0xvXT17dGV4dHVyZUZvcm1hdDpyZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOlttZV19LGVbem9dPXt0ZXh0dXJlRm9ybWF0OnJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzJdLHR5cGU6W250XX0sZVtHb109e3RleHR1cmVGb3JtYXQ6cmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbZWVdfSxlWyRvXT17dGV4dHVyZUZvcm1hdDpyZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltzdF19LGVbQm9dPXt0ZXh0dXJlRm9ybWF0OkllLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzJdLHR5cGU6W0VdfSxlW0RvXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltWXX0sZVtNb109e3RleHR1cmVGb3JtYXQ6SWUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbOCw0XSx0eXBlOltBLGtdfSxlW1VvXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltBXX0sZVtOb109e3RleHR1cmVGb3JtYXQ6dGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbRV19LGVbT29dPXt0ZXh0dXJlRm9ybWF0OnRlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzJdLHR5cGU6W1ZdfSxlW0ZvXT17dGV4dHVyZUZvcm1hdDp0ZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOlttZV19LGVbUG9dPXt0ZXh0dXJlRm9ybWF0OnRlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W250XX0sZVtrb109e3RleHR1cmVGb3JtYXQ6dGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbZWVdfSxlW0NvXT17dGV4dHVyZUZvcm1hdDp0ZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltzdF19LGVbVm9dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbRV19LGVbV29dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbRV19LGVbSG9dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMywyXSx0eXBlOltFLGNuXX0sZVtqb109e3RleHR1cmVGb3JtYXQ6UCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOltWXX0sZVtYb109e3RleHR1cmVGb3JtYXQ6UCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxMiw2LDRdLHR5cGU6W0Esayx3YV19LGVbWW9dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMTIsNiw0XSx0eXBlOltBLGssQWFdfSxlW1FvXT17dGV4dHVyZUZvcm1hdDpQLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEyLDZdLHR5cGU6W0Esa119LGVbcW9dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTJdLHR5cGU6W0FdfSxlW0tvXT17dGV4dHVyZUZvcm1hdDpuZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOltFXX0sZVtKb109e3RleHR1cmVGb3JtYXQ6bmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbVl19LGVbWm9dPXt0ZXh0dXJlRm9ybWF0Om5lLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzZdLHR5cGU6W21lXX0sZVtlYV09e3RleHR1cmVGb3JtYXQ6bmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNl0sdHlwZTpbbnRdfSxlW3RhXT17dGV4dHVyZUZvcm1hdDpuZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsxMl0sdHlwZTpbZWVdfSxlW3JhXT17dGV4dHVyZUZvcm1hdDpuZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsxMl0sdHlwZTpbc3RdfSxlW25hXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0VdfSxlW3NhXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0VdfSxlW2lhXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W1ZdfSxlW29hXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsMiw0XSx0eXBlOltFLGFuLEt0XX0sZVthYV09e3RleHR1cmVGb3JtYXQ6Zyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDJdLHR5cGU6W0Usb25dfSxlW2NhXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0t0XX0sZVt1YV09e3RleHR1cmVGb3JtYXQ6Zyxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxNiw4XSx0eXBlOltBLGtdfSxlW2ZhXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltBXX0sZVtsYV09e3RleHR1cmVGb3JtYXQ6Vyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltFXX0sZVtkYV09e3RleHR1cmVGb3JtYXQ6Vyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltWXX0sZVtoYV09e3RleHR1cmVGb3JtYXQ6Vyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltLdF19LGVbbWFdPXt0ZXh0dXJlRm9ybWF0OlcsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbbWVdfSxlW3BhXT17dGV4dHVyZUZvcm1hdDpXLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W250XX0sZVt5YV09e3RleHR1cmVGb3JtYXQ6Vyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsxNl0sdHlwZTpbc3RdfSxlW2JhXT17dGV4dHVyZUZvcm1hdDpXLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltlZV19LGVbZ2FdPXt0ZXh0dXJlRm9ybWF0OmhlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzIsNF0sdHlwZTpbbWUsZWVdfSxlW3hhXT17dGV4dHVyZUZvcm1hdDpoZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltlZV19LGVbRWFdPXt0ZXh0dXJlRm9ybWF0OmhlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0FdfSxlW1RhXT17dGV4dHVyZUZvcm1hdDpqdCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltTYV19LGVbX2FdPXt0ZXh0dXJlRm9ybWF0Omp0LGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3ZhXX0sT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihyKXtjb25zdCBuPWVbcl07bi5ieXRlc1BlckVsZW1lbnRNYXA9e30sbi5ieXRlc1BlckVsZW1lbnQuZm9yRWFjaChmdW5jdGlvbihzLGkpe2NvbnN0IGE9bi50eXBlW2ldO24uYnl0ZXNQZXJFbGVtZW50TWFwW2FdPXN9KX0pLEp0PWV9cmV0dXJuIEp0W3RdfWZ1bmN0aW9uIFJhKHQsZSl7Y29uc3Qgcj1pdCh0KTtpZighcil0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7Y29uc3Qgbj1yLmJ5dGVzUGVyRWxlbWVudE1hcFtlXTtpZihuPT09dm9pZCAwKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm4gbn1mdW5jdGlvbiBGZSh0KXtjb25zdCBlPWl0KHQpO2lmKCFlKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm57Zm9ybWF0OmUudGV4dHVyZUZvcm1hdCx0eXBlOmUudHlwZVswXX19ZnVuY3Rpb24gdW4odCl7cmV0dXJuKHQmdC0xKT09PTB9ZnVuY3Rpb24gRmEodCxlLHIsbil7aWYoIUFlKHQpKXJldHVybiB1bihlKSYmdW4ocik7Y29uc3Qgcz1pdChuKTtpZighcyl0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7cmV0dXJuIHMuY29sb3JSZW5kZXJhYmxlJiZzLnRleHR1cmVGaWx0ZXJhYmxlfWZ1bmN0aW9uIFBhKHQpe2NvbnN0IGU9aXQodCk7aWYoIWUpdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybiBlLnRleHR1cmVGaWx0ZXJhYmxlfWZ1bmN0aW9uIGthKHQsZSxyKXtyZXR1cm4gdmUoZSk/THQoZSk6cnx8RX1mdW5jdGlvbiBvdCh0LGUscixuLHMpe2lmKHMlMSE9PTApdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7aWYoIXImJiFuKXtjb25zdCBpPU1hdGguc3FydChzLyhlPT09JD82OjEpKTtpJTE9PT0wPyhyPWksbj1pKToocj1zLG49MSl9ZWxzZSBpZihuKXtpZighciYmKHI9cy9uLHIlMSkpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyJ9ZWxzZSBpZihuPXMvcixuJTEpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7cmV0dXJue3dpZHRoOnIsaGVpZ2h0Om59fWZ1bmN0aW9uIHBlKHQsZSl7ZS5jb2xvcnNwYWNlQ29udmVyc2lvbiE9PXZvaWQgMCYmdC5waXhlbFN0b3JlaShFbyxlLmNvbG9yc3BhY2VDb252ZXJzaW9uKSxlLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJnQucGl4ZWxTdG9yZWkoX28sZS5wcmVtdWx0aXBseUFscGhhKSxlLmZsaXBZIT09dm9pZCAwJiZ0LnBpeGVsU3RvcmVpKFRvLGUuZmxpcFkpfWZ1bmN0aW9uIGZuKHQpe3QucGl4ZWxTdG9yZWkocXQsNCksQWUodCkmJih0LnBpeGVsU3RvcmVpKGVuLDApLHQucGl4ZWxTdG9yZWkodG4sMCksdC5waXhlbFN0b3JlaShybiwwKSx0LnBpeGVsU3RvcmVpKG5uLDApLHQucGl4ZWxTdG9yZWkoc24sMCkpfWZ1bmN0aW9uIENhKHQsZSxyLG4pe24ubWluTWFnJiYoci5jYWxsKHQsZSxZdCxuLm1pbk1hZyksci5jYWxsKHQsZSxRdCxuLm1pbk1hZykpLG4ubWluJiZyLmNhbGwodCxlLFl0LG4ubWluKSxuLm1hZyYmci5jYWxsKHQsZSxRdCxuLm1hZyksbi53cmFwJiYoci5jYWxsKHQsZSx0dCxuLndyYXApLHIuY2FsbCh0LGUscnQsbi53cmFwKSwoZT09PUp8fFVpKHQsZSkpJiZyLmNhbGwodCxlLFpyLG4ud3JhcCkpLG4ud3JhcFImJnIuY2FsbCh0LGUsWnIsbi53cmFwUiksbi53cmFwUyYmci5jYWxsKHQsZSx0dCxuLndyYXBTKSxuLndyYXBUJiZyLmNhbGwodCxlLHJ0LG4ud3JhcFQpLG4ubWluTG9kIT09dm9pZCAwJiZyLmNhbGwodCxlLG1vLG4ubWluTG9kKSxuLm1heExvZCE9PXZvaWQgMCYmci5jYWxsKHQsZSxwbyxuLm1heExvZCksbi5iYXNlTGV2ZWwhPT12b2lkIDAmJnIuY2FsbCh0LGUseW8sbi5iYXNlTGV2ZWwpLG4ubWF4TGV2ZWwhPT12b2lkIDAmJnIuY2FsbCh0LGUsYm8sbi5tYXhMZXZlbCksbi5jb21wYXJlRnVuYyE9PXZvaWQgMCYmci5jYWxsKHQsZSx4byxuLmNvbXBhcmVGdW5jKSxuLmNvbXBhcmVNb2RlIT09dm9pZCAwJiZyLmNhbGwodCxlLGdvLG4uY29tcGFyZU1vZGUpfWZ1bmN0aW9uIGxuKHQsZSxyKXtjb25zdCBuPXIudGFyZ2V0fHxHO3QuYmluZFRleHR1cmUobixlKSxDYSh0LG4sdC50ZXhQYXJhbWV0ZXJpLHIpfWZ1bmN0aW9uIEJhKHQpe3JldHVybiB0PXR8fHoudGV4dHVyZUNvbG9yLHZlKHQpP3Q6bmV3IFVpbnQ4QXJyYXkoW3RbMF0qMjU1LHRbMV0qMjU1LHRbMl0qMjU1LHRbM10qMjU1XSl9ZnVuY3Rpb24gWnQodCxlLHIsbixzLGkpe3I9cnx8ei50ZXh0dXJlT3B0aW9ucyxpPWl8fGc7Y29uc3QgYT1yLnRhcmdldHx8RztpZihuPW58fHIud2lkdGgscz1zfHxyLmhlaWdodCx0LmJpbmRUZXh0dXJlKGEsZSksRmEodCxuLHMsaSkpdC5nZW5lcmF0ZU1pcG1hcChhKTtlbHNle2NvbnN0IG89UGEoaSk/YW86b287dC50ZXhQYXJhbWV0ZXJpKGEsWXQsbyksdC50ZXhQYXJhbWV0ZXJpKGEsUXQsbyksdC50ZXhQYXJhbWV0ZXJpKGEsdHQsZXQpLHQudGV4UGFyYW1ldGVyaShhLHJ0LGV0KX19ZnVuY3Rpb24gUGUodCl7cmV0dXJuIHQuYXV0bz09PSEwfHx0LmF1dG89PT12b2lkIDAmJnQubGV2ZWw9PT12b2lkIDB9ZnVuY3Rpb24gZXIodCxlKXtyZXR1cm4gZT1lfHx7fSxlLmN1YmVGYWNlT3JkZXJ8fFtYdCxjbyx1byxmbyxsbyxob119ZnVuY3Rpb24gdHIodCxlKXtjb25zdCBuPWVyKHQsZSkubWFwKGZ1bmN0aW9uKHMsaSl7cmV0dXJue2ZhY2U6cyxuZHg6aX19KTtyZXR1cm4gbi5zb3J0KGZ1bmN0aW9uKHMsaSl7cmV0dXJuIHMuZmFjZS1pLmZhY2V9KSxufWZ1bmN0aW9uIGRuKHQsZSxyLG4pe249bnx8ei50ZXh0dXJlT3B0aW9ucztjb25zdCBzPW4udGFyZ2V0fHxHLGk9bi5sZXZlbHx8MDtsZXQgYT1yLndpZHRoLG89ci5oZWlnaHQ7Y29uc3QgYz1uLmludGVybmFsRm9ybWF0fHxuLmZvcm1hdHx8Zyx1PUZlKGMpLGY9bi5mb3JtYXR8fHUuZm9ybWF0LGQ9bi50eXBlfHx1LnR5cGU7aWYocGUodCxuKSx0LmJpbmRUZXh0dXJlKHMsZSkscz09PSQpe2NvbnN0IGg9ci53aWR0aCxwPXIuaGVpZ2h0O2xldCBsLHk7aWYoaC82PT09cClsPXAseT1bMCwwLDEsMCwyLDAsMywwLDQsMCw1LDBdO2Vsc2UgaWYocC82PT09aClsPWgseT1bMCwwLDAsMSwwLDIsMCwzLDAsNCwwLDVdO2Vsc2UgaWYoaC8zPT09cC8yKWw9aC8zLHk9WzAsMCwxLDAsMiwwLDAsMSwxLDEsMiwxXTtlbHNlIGlmKGgvMj09PXAvMylsPWgvMix5PVswLDAsMSwwLDAsMSwxLDEsMCwyLDEsMl07ZWxzZSB0aHJvdyJjYW4ndCBmaWd1cmUgb3V0IGN1YmUgbWFwIGZyb20gZWxlbWVudDogIisoci5zcmM/ci5zcmM6ci5ub2RlTmFtZSk7Y29uc3QgYj1KcigpO2I/KGIuY2FudmFzLndpZHRoPWwsYi5jYW52YXMuaGVpZ2h0PWwsYT1sLG89bCx0cih0LG4pLmZvckVhY2goZnVuY3Rpb24oeCl7Y29uc3QgUz15W3gubmR4KjIrMF0qbCxGPXlbeC5uZHgqMisxXSpsO2IuZHJhd0ltYWdlKHIsUyxGLGwsbCwwLDAsbCxsKSx0LnRleEltYWdlMkQoeC5mYWNlLGksYyxmLGQsYi5jYW52YXMpfSksYi5jYW52YXMud2lkdGg9MSxiLmNhbnZhcy5oZWlnaHQ9MSk6dHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwPCJ1IiYmKGE9bCxvPWwsdHIodCxuKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe2NvbnN0IFM9eVt4Lm5keCoyKzBdKmwsRj15W3gubmR4KjIrMV0qbDt0LnRleEltYWdlMkQoeC5mYWNlLGksYyxsLGwsMCxmLGQsbnVsbCksY3JlYXRlSW1hZ2VCaXRtYXAocixTLEYsbCxsLHtwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KS50aGVuKGZ1bmN0aW9uKFgpe3BlKHQsbiksdC5iaW5kVGV4dHVyZShzLGUpLHQudGV4SW1hZ2UyRCh4LmZhY2UsaSxjLGYsZCxYKSxQZShuKSYmWnQodCxlLG4sYSxvLGMpfSl9KSl9ZWxzZSBpZihzPT09Snx8cz09PVope2NvbnN0IGg9TWF0aC5taW4oci53aWR0aCxyLmhlaWdodCkscD1NYXRoLm1heChyLndpZHRoLHIuaGVpZ2h0KSxsPXAvaDtpZihsJTEhPT0wKXRocm93ImNhbiBub3QgY29tcHV0ZSAzRCBkaW1lbnNpb25zIG9mIGVsZW1lbnQiO2NvbnN0IHk9ci53aWR0aD09PXA/MTowLGI9ci5oZWlnaHQ9PT1wPzE6MDt0LnBpeGVsU3RvcmVpKHF0LDEpLHQucGl4ZWxTdG9yZWkoZW4sci53aWR0aCksdC5waXhlbFN0b3JlaSh0biwwKSx0LnBpeGVsU3RvcmVpKHNuLDApLHQudGV4SW1hZ2UzRChzLGksYyxoLGgsaCwwLGYsZCxudWxsKTtmb3IobGV0IHg9MDt4PGw7Kyt4KXtjb25zdCBTPXgqaCp5LEY9eCpoKmI7dC5waXhlbFN0b3JlaShybixTKSx0LnBpeGVsU3RvcmVpKG5uLEYpLHQudGV4U3ViSW1hZ2UzRChzLGksMCwwLHgsaCxoLDEsZixkLHIpfWZuKHQpfWVsc2UgdC50ZXhJbWFnZTJEKHMsaSxjLGYsZCxyKTtQZShuKSYmWnQodCxlLG4sYSxvLGMpLGxuKHQsZSxuKX1mdW5jdGlvbiBrZSgpe31mdW5jdGlvbiBEYSh0KXtpZih0eXBlb2YgZG9jdW1lbnQ8InUiKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gZS5ocmVmPXQsZS5ob3N0bmFtZT09PWxvY2F0aW9uLmhvc3RuYW1lJiZlLnBvcnQ9PT1sb2NhdGlvbi5wb3J0JiZlLnByb3RvY29sPT09bG9jYXRpb24ucHJvdG9jb2x9ZWxzZXtjb25zdCBlPW5ldyBVUkwobG9jYXRpb24uaHJlZikub3JpZ2luO3JldHVybiBuZXcgVVJMKHQsbG9jYXRpb24uaHJlZikub3JpZ2luPT09ZX19ZnVuY3Rpb24gTWEodCxlKXtyZXR1cm4gZT09PXZvaWQgMCYmIURhKHQpPyJhbm9ueW1vdXMiOmV9ZnVuY3Rpb24gVWEodCxlLHIpe3I9cnx8a2U7bGV0IG47aWYoZT1lIT09dm9pZCAwP2U6ei5jcm9zc09yaWdpbixlPU1hKHQsZSksdHlwZW9mIEltYWdlPCJ1Iil7bj1uZXcgSW1hZ2UsZSE9PXZvaWQgMCYmKG4uY3Jvc3NPcmlnaW49ZSk7Y29uc3Qgcz1mdW5jdGlvbigpe24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGkpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsYSksbj1udWxsfSxpPWZ1bmN0aW9uKCl7Y29uc3QgYz0iY291bGRuJ3QgbG9hZCBpbWFnZTogIit0O1ZyKGMpLHIoYyxuKSxzKCl9LGE9ZnVuY3Rpb24oKXtyKG51bGwsbikscygpfTtyZXR1cm4gbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsaSksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixhKSxuLnNyYz10LG59ZWxzZSBpZih0eXBlb2YgSW1hZ2VCaXRtYXA8InUiKXtsZXQgcyxpO2NvbnN0IGE9ZnVuY3Rpb24oKXtyKHMsaSl9LG89e307ZSYmKG8ubW9kZT0iY29ycyIpLGZldGNoKHQsbykudGhlbihmdW5jdGlvbihjKXtpZighYy5vayl0aHJvdyBjO3JldHVybiBjLmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGMse3ByZW11bHRpcGx5QWxwaGE6Im5vbmUiLGNvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn0pfSkudGhlbihmdW5jdGlvbihjKXtpPWMsc2V0VGltZW91dChhKX0pLmNhdGNoKGZ1bmN0aW9uKGMpe3M9YyxzZXRUaW1lb3V0KGEpfSksbj1udWxsfXJldHVybiBufWZ1bmN0aW9uIGhuKHQpe3JldHVybiB0eXBlb2YgSW1hZ2VCaXRtYXA8InUiJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXB8fHR5cGVvZiBJbWFnZURhdGE8InUiJiZ0IGluc3RhbmNlb2YgSW1hZ2VEYXRhfHx0eXBlb2YgSFRNTEVsZW1lbnQ8InUiJiZ0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR9ZnVuY3Rpb24gcnIodCxlLHIpe3JldHVybiBobih0KT8oc2V0VGltZW91dChmdW5jdGlvbigpe3IobnVsbCx0KX0pLHQpOlVhKHQsZSxyKX1mdW5jdGlvbiBucih0LGUscil7cj1yfHx6LnRleHR1cmVPcHRpb25zO2NvbnN0IG49ci50YXJnZXR8fEc7aWYodC5iaW5kVGV4dHVyZShuLGUpLHIuY29sb3I9PT0hMSlyZXR1cm47Y29uc3Qgcz1CYShyLmNvbG9yKTtpZihuPT09JClmb3IobGV0IGk9MDtpPDY7KytpKXQudGV4SW1hZ2UyRChYdCtpLDAsZywxLDEsMCxnLEUscyk7ZWxzZSBuPT09Snx8bj09PVo/dC50ZXhJbWFnZTNEKG4sMCxnLDEsMSwxLDAsZyxFLHMpOnQudGV4SW1hZ2UyRChuLDAsZywxLDEsMCxnLEUscyl9ZnVuY3Rpb24gTmEodCxlLHIsbil7cmV0dXJuIG49bnx8a2Uscj1yfHx6LnRleHR1cmVPcHRpb25zLG5yKHQsZSxyKSxyPU9iamVjdC5hc3NpZ24oe30scikscnIoci5zcmMsci5jcm9zc09yaWdpbixmdW5jdGlvbihpLGEpe2k/bihpLGUsYSk6KGRuKHQsZSxhLHIpLG4obnVsbCxlLGEpKX0pfWZ1bmN0aW9uIE9hKHQsZSxyLG4pe249bnx8a2U7Y29uc3Qgcz1yLnNyYztpZihzLmxlbmd0aCE9PTYpdGhyb3cidGhlcmUgbXVzdCBiZSA2IHVybHMgZm9yIGEgY3ViZW1hcCI7Y29uc3QgaT1yLmxldmVsfHwwLGE9ci5pbnRlcm5hbEZvcm1hdHx8ci5mb3JtYXR8fGcsbz1GZShhKSxjPXIuZm9ybWF0fHxvLmZvcm1hdCx1PXIudHlwZXx8RSxmPXIudGFyZ2V0fHxHO2lmKGYhPT0kKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfQ1VCRV9NQVAiO25yKHQsZSxyKSxyPU9iamVjdC5hc3NpZ24oe30scik7bGV0IGQ9Njtjb25zdCBoPVtdLHA9ZXIodCxyKTtsZXQgbDtmdW5jdGlvbiB5KGIpe3JldHVybiBmdW5jdGlvbih4LFMpey0tZCx4P2gucHVzaCh4KTpTLndpZHRoIT09Uy5oZWlnaHQ/aC5wdXNoKCJjdWJlbWFwIGZhY2UgaW1nIGlzIG5vdCBhIHNxdWFyZTogIitTLnNyYyk6KHBlKHQsciksdC5iaW5kVGV4dHVyZShmLGUpLGQ9PT01P2VyKCkuZm9yRWFjaChmdW5jdGlvbihGKXt0LnRleEltYWdlMkQoRixpLGEsYyx1LFMpfSk6dC50ZXhJbWFnZTJEKGIsaSxhLGMsdSxTKSxQZShyKSYmdC5nZW5lcmF0ZU1pcG1hcChmKSksZD09PTAmJm4oaC5sZW5ndGg/aDp2b2lkIDAsZSxsKX19bD1zLm1hcChmdW5jdGlvbihiLHgpe3JldHVybiBycihiLHIuY3Jvc3NPcmlnaW4seShwW3hdKSl9KX1mdW5jdGlvbiBMYSh0LGUscixuKXtuPW58fGtlO2NvbnN0IHM9ci5zcmMsaT1yLmludGVybmFsRm9ybWF0fHxyLmZvcm1hdHx8ZyxhPUZlKGkpLG89ci5mb3JtYXR8fGEuZm9ybWF0LGM9ci50eXBlfHxFLHU9ci50YXJnZXR8fFo7aWYodSE9PUomJnUhPT1aKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfM0Qgb3IgVEVYVFVSRV8yRF9BUlJBWSI7bnIodCxlLHIpLHI9T2JqZWN0LmFzc2lnbih7fSxyKTtsZXQgZj1zLmxlbmd0aDtjb25zdCBkPVtdO2xldCBoO2NvbnN0IHA9ci5sZXZlbHx8MDtsZXQgbD1yLndpZHRoLHk9ci5oZWlnaHQ7Y29uc3QgYj1zLmxlbmd0aDtsZXQgeD0hMDtmdW5jdGlvbiBTKEYpe3JldHVybiBmdW5jdGlvbihYLHNlKXtpZigtLWYsWClkLnB1c2goWCk7ZWxzZXtpZihwZSh0LHIpLHQuYmluZFRleHR1cmUodSxlKSx4KXt4PSExLGw9ci53aWR0aHx8c2Uud2lkdGgseT1yLmhlaWdodHx8c2UuaGVpZ2h0LHQudGV4SW1hZ2UzRCh1LHAsaSxsLHksYiwwLG8sYyxudWxsKTtmb3IobGV0IGllPTA7aWU8YjsrK2llKXQudGV4U3ViSW1hZ2UzRCh1LHAsMCwwLGllLGwseSwxLG8sYyxzZSl9ZWxzZXtsZXQgaWU9c2UsTTsoc2Uud2lkdGghPT1sfHxzZS5oZWlnaHQhPT15KSYmKE09SnIoKSxpZT1NLmNhbnZhcyxNLmNhbnZhcy53aWR0aD1sLE0uY2FudmFzLmhlaWdodD15LE0uZHJhd0ltYWdlKHNlLDAsMCxsLHkpKSx0LnRleFN1YkltYWdlM0QodSxwLDAsMCxGLGwseSwxLG8sYyxpZSksTSYmaWU9PT1NLmNhbnZhcyYmKE0uY2FudmFzLndpZHRoPTAsTS5jYW52YXMuaGVpZ2h0PTApfVBlKHIpJiZ0LmdlbmVyYXRlTWlwbWFwKHUpfWY9PT0wJiZuKGQubGVuZ3RoP2Q6dm9pZCAwLGUsaCl9fWg9cy5tYXAoZnVuY3Rpb24oRixYKXtyZXR1cm4gcnIoRixyLmNyb3NzT3JpZ2luLFMoWCkpfSl9ZnVuY3Rpb24gemEodCxlLHIsbil7bj1ufHx6LnRleHR1cmVPcHRpb25zO2NvbnN0IHM9bi50YXJnZXR8fEc7dC5iaW5kVGV4dHVyZShzLGUpO2xldCBpPW4ud2lkdGgsYT1uLmhlaWdodCxvPW4uZGVwdGg7Y29uc3QgYz1uLmxldmVsfHwwLHU9bi5pbnRlcm5hbEZvcm1hdHx8bi5mb3JtYXR8fGcsZj1GZSh1KSxkPW4uZm9ybWF0fHxmLmZvcm1hdCxoPW4udHlwZXx8a2EodCxyLGYudHlwZSk7aWYodmUocikpciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiYocj1uZXcgVWludDhBcnJheShyLmJ1ZmZlcikpO2Vsc2V7Y29uc3QgYj0kcihoKTtyPW5ldyBiKHIpfWNvbnN0IHA9UmEodSxoKSxsPXIuYnl0ZUxlbmd0aC9wO2lmKGwlMSl0aHJvdyJsZW5ndGggd3Jvbmcgc2l6ZSBmb3IgZm9ybWF0OiAiK0tyKHQsZCk7bGV0IHk7aWYocz09PUp8fHM9PT1aKWlmKCFpJiYhYSYmIW8pe2NvbnN0IGI9TWF0aC5jYnJ0KGwpO2lmKGIlMSE9PTApdGhyb3ciY2FuJ3QgZ3Vlc3MgY3ViZSBzaXplIG9mIGFycmF5IG9mIG51bUVsZW1lbnRzOiAiK2w7aT1iLGE9YixvPWJ9ZWxzZSBpJiYoIWF8fCFvKT8oeT1vdCh0LHMsYSxvLGwvaSksYT15LndpZHRoLG89eS5oZWlnaHQpOmEmJighaXx8IW8pPyh5PW90KHQscyxpLG8sbC9hKSxpPXkud2lkdGgsbz15LmhlaWdodCk6KHk9b3QodCxzLGksYSxsL28pLGk9eS53aWR0aCxhPXkuaGVpZ2h0KTtlbHNlIHk9b3QodCxzLGksYSxsKSxpPXkud2lkdGgsYT15LmhlaWdodDtpZihmbih0KSx0LnBpeGVsU3RvcmVpKHF0LG4udW5wYWNrQWxpZ25tZW50fHwxKSxwZSh0LG4pLHM9PT0kKXtjb25zdCBiPXAvci5CWVRFU19QRVJfRUxFTUVOVCx4PWwvNipiO3RyKHQsbikuZm9yRWFjaChTPT57Y29uc3QgRj14KlMubmR4LFg9ci5zdWJhcnJheShGLEYreCk7dC50ZXhJbWFnZTJEKFMuZmFjZSxjLHUsaSxhLDAsZCxoLFgpfSl9ZWxzZSBzPT09Snx8cz09PVo/dC50ZXhJbWFnZTNEKHMsYyx1LGksYSxvLDAsZCxoLHIpOnQudGV4SW1hZ2UyRChzLGMsdSxpLGEsMCxkLGgscik7cmV0dXJue3dpZHRoOmksaGVpZ2h0OmEsZGVwdGg6byx0eXBlOmh9fWZ1bmN0aW9uIEdhKHQsZSxyKXtjb25zdCBuPXIudGFyZ2V0fHxHO3QuYmluZFRleHR1cmUobixlKTtjb25zdCBzPXIubGV2ZWx8fDAsaT1yLmludGVybmFsRm9ybWF0fHxyLmZvcm1hdHx8ZyxhPUZlKGkpLG89ci5mb3JtYXR8fGEuZm9ybWF0LGM9ci50eXBlfHxhLnR5cGU7aWYocGUodCxyKSxuPT09JClmb3IobGV0IHU9MDt1PDY7Kyt1KXQudGV4SW1hZ2UyRChYdCt1LHMsaSxyLndpZHRoLHIuaGVpZ2h0LDAsbyxjLG51bGwpO2Vsc2Ugbj09PUp8fG49PT1aP3QudGV4SW1hZ2UzRChuLHMsaSxyLndpZHRoLHIuaGVpZ2h0LHIuZGVwdGgsMCxvLGMsbnVsbCk6dC50ZXhJbWFnZTJEKG4scyxpLHIud2lkdGgsci5oZWlnaHQsMCxvLGMsbnVsbCl9ZnVuY3Rpb24gbW4odCxlLHIpe3I9cnx8a2UsZT1lfHx6LnRleHR1cmVPcHRpb25zO2NvbnN0IG49dC5jcmVhdGVUZXh0dXJlKCkscz1lLnRhcmdldHx8RztsZXQgaT1lLndpZHRofHwxLGE9ZS5oZWlnaHR8fDE7Y29uc3Qgbz1lLmludGVybmFsRm9ybWF0fHxnO3QuYmluZFRleHR1cmUocyxuKSxzPT09JCYmKHQudGV4UGFyYW1ldGVyaShzLHR0LGV0KSx0LnRleFBhcmFtZXRlcmkocyxydCxldCkpO2xldCBjPWUuc3JjO2lmKGMpaWYodHlwZW9mIGM9PSJmdW5jdGlvbiImJihjPWModCxlKSksdHlwZW9mIGM9PSJzdHJpbmciKU5hKHQsbixlLHIpO2Vsc2UgaWYodmUoYyl8fEFycmF5LmlzQXJyYXkoYykmJih0eXBlb2YgY1swXT09Im51bWJlciJ8fEFycmF5LmlzQXJyYXkoY1swXSl8fHZlKGNbMF0pKSl7Y29uc3QgdT16YSh0LG4sYyxlKTtpPXUud2lkdGgsYT11LmhlaWdodH1lbHNlIEFycmF5LmlzQXJyYXkoYykmJih0eXBlb2YgY1swXT09InN0cmluZyJ8fGhuKGNbMF0pKT9zPT09JD9PYSh0LG4sZSxyKTpMYSh0LG4sZSxyKTooZG4odCxuLGMsZSksaT1jLndpZHRoLGE9Yy5oZWlnaHQpO2Vsc2UgR2EodCxuLGUpO3JldHVybiBQZShlKSYmWnQodCxuLGUsaSxhLG8pLGxuKHQsbixlKSxufWNvbnN0IHNyPVZyO2Z1bmN0aW9uIHBuKHQpe3JldHVybiB0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTpudWxsfWNvbnN0IGF0PTMzOTg0LGN0PTM0OTYyLCRhPTM0OTYzLFZhPTM1NzEzLFdhPTM1NzE0LEhhPTM1NjMyLGphPTM1NjMzLFhhPTM1OTgxLHluPTM1NzE4LFlhPTM1NzIxLFFhPTM1OTcxLHFhPTM1MzgyLEthPTM1Mzk2LEphPTM1Mzk4LFphPTM1MzkyLGVjPTM1Mzk1LHV0PTUxMjYsYm49MzU2NjQsZ249MzU2NjUseG49MzU2NjYsaXI9NTEyNCxFbj0zNTY2Nyxfbj0zNTY2OCxUbj0zNTY2OSx3bj0zNTY3MCxBbj0zNTY3MSx2bj0zNTY3MixTbj0zNTY3MyxJbj0zNTY3NCxSbj0zNTY3NSxGbj0zNTY3Nix0Yz0zNTY3OCxyYz0zNTY4MCxuYz0zNTY3OSxzYz0zNTY4MixpYz0zNTY4NSxvYz0zNTY4NixhYz0zNTY4NyxjYz0zNTY4OCx1Yz0zNTY4OSxmYz0zNTY5MCxsYz0zNjI4OSxkYz0zNjI5MixoYz0zNjI5Myxvcj01MTI1LFBuPTM2Mjk0LGtuPTM2Mjk1LENuPTM2Mjk2LG1jPTM2Mjk4LHBjPTM2Mjk5LHljPTM2MzAwLGJjPTM2MzAzLGdjPTM2MzA2LHhjPTM2MzA3LEVjPTM2MzA4LF9jPTM2MzExLGZ0PTM1NTMsbHQ9MzQwNjcsYXI9MzI4NzksZHQ9MzU4NjYsbT17fTtmdW5jdGlvbiBCbih0LGUpe3JldHVybiBtW2VdLmJpbmRQb2ludH1mdW5jdGlvbiBUYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm0xZihlLHIpfX1mdW5jdGlvbiB3Yyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm0xZnYoZSxyKX19ZnVuY3Rpb24gQWModCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtMmZ2KGUscil9fWZ1bmN0aW9uIHZjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybTNmdihlLHIpfX1mdW5jdGlvbiBTYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm00ZnYoZSxyKX19ZnVuY3Rpb24gRG4odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtMWkoZSxyKX19ZnVuY3Rpb24gTW4odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtMWl2KGUscil9fWZ1bmN0aW9uIFVuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybTJpdihlLHIpfX1mdW5jdGlvbiBObih0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm0zaXYoZSxyKX19ZnVuY3Rpb24gT24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtNGl2KGUscil9fWZ1bmN0aW9uIEljKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybTF1aShlLHIpfX1mdW5jdGlvbiBSYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm0xdWl2KGUscil9fWZ1bmN0aW9uIEZjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybTJ1aXYoZSxyKX19ZnVuY3Rpb24gUGModCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtM3VpdihlLHIpfX1mdW5jdGlvbiBrYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm00dWl2KGUscil9fWZ1bmN0aW9uIENjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDJmdihlLCExLHIpfX1mdW5jdGlvbiBCYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm1NYXRyaXgzZnYoZSwhMSxyKX19ZnVuY3Rpb24gRGModCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtTWF0cml4NGZ2KGUsITEscil9fWZ1bmN0aW9uIE1jKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDJ4M2Z2KGUsITEscil9fWZ1bmN0aW9uIFVjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDN4MmZ2KGUsITEscil9fWZ1bmN0aW9uIE5jKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDJ4NGZ2KGUsITEscil9fWZ1bmN0aW9uIE9jKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDR4MmZ2KGUsITEscil9fWZ1bmN0aW9uIExjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDN4NGZ2KGUsITEscil9fWZ1bmN0aW9uIHpjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDR4M2Z2KGUsITEscil9fWZ1bmN0aW9uIEkodCxlLHIsbil7Y29uc3Qgcz1Cbih0LGUpO3JldHVybiBBZSh0KT9mdW5jdGlvbihpKXtsZXQgYSxvOyFpfHx6dCh0LGkpPyhhPWksbz1udWxsKTooYT1pLnRleHR1cmUsbz1pLnNhbXBsZXIpLHQudW5pZm9ybTFpKG4sciksdC5hY3RpdmVUZXh0dXJlKGF0K3IpLHQuYmluZFRleHR1cmUocyxhKSx0LmJpbmRTYW1wbGVyKHIsbyl9OmZ1bmN0aW9uKGkpe3QudW5pZm9ybTFpKG4sciksdC5hY3RpdmVUZXh0dXJlKGF0K3IpLHQuYmluZFRleHR1cmUocyxpKX19ZnVuY3Rpb24gUih0LGUscixuLHMpe2NvbnN0IGk9Qm4odCxlKSxhPW5ldyBJbnQzMkFycmF5KHMpO2ZvcihsZXQgbz0wO288czsrK28pYVtvXT1yK287cmV0dXJuIEFlKHQpP2Z1bmN0aW9uKG8pe3QudW5pZm9ybTFpdihuLGEpLG8uZm9yRWFjaChmdW5jdGlvbihjLHUpe3QuYWN0aXZlVGV4dHVyZShhdCthW3VdKTtsZXQgZixkOyFjfHx6dCh0LGMpPyhmPWMsZD1udWxsKTooZj1jLnRleHR1cmUsZD1jLnNhbXBsZXIpLHQuYmluZFNhbXBsZXIocixkKSx0LmJpbmRUZXh0dXJlKGksZil9KX06ZnVuY3Rpb24obyl7dC51bmlmb3JtMWl2KG4sYSksby5mb3JFYWNoKGZ1bmN0aW9uKGMsdSl7dC5hY3RpdmVUZXh0dXJlKGF0K2FbdV0pLHQuYmluZFRleHR1cmUoaSxjKX0pfX1tW3V0XT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0LHNldHRlcjpUYyxhcnJheVNldHRlcjp3Y30sbVtibl09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6OCxzZXR0ZXI6QWMsY29sczoyfSxtW2duXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6dmMsY29sczozfSxtW3huXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6U2MsY29sczo0fSxtW2lyXT17VHlwZTpJbnQzMkFycmF5LHNpemU6NCxzZXR0ZXI6RG4sYXJyYXlTZXR0ZXI6TW59LG1bRW5dPXtUeXBlOkludDMyQXJyYXksc2l6ZTo4LHNldHRlcjpVbixjb2xzOjJ9LG1bX25dPXtUeXBlOkludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6Tm4sY29sczozfSxtW1RuXT17VHlwZTpJbnQzMkFycmF5LHNpemU6MTYsc2V0dGVyOk9uLGNvbHM6NH0sbVtvcl09e1R5cGU6VWludDMyQXJyYXksc2l6ZTo0LHNldHRlcjpJYyxhcnJheVNldHRlcjpSY30sbVtQbl09e1R5cGU6VWludDMyQXJyYXksc2l6ZTo4LHNldHRlcjpGYyxjb2xzOjJ9LG1ba25dPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6MTIsc2V0dGVyOlBjLGNvbHM6M30sbVtDbl09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6a2MsY29sczo0fSxtW3duXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjQsc2V0dGVyOkRuLGFycmF5U2V0dGVyOk1ufSxtW0FuXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjgsc2V0dGVyOlVuLGNvbHM6Mn0sbVt2bl09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6Tm4sY29sczozfSxtW1NuXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjE2LHNldHRlcjpPbixjb2xzOjR9LG1bSW5dPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpDYyxyb3dzOjIsY29sczoyfSxtW1JuXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0OCxzZXR0ZXI6QmMscm93czozLGNvbHM6M30sbVtGbl09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NjQsc2V0dGVyOkRjLHJvd3M6NCxjb2xzOjR9LG1baWNdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpNYyxyb3dzOjIsY29sczozfSxtW29jXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTozMixzZXR0ZXI6TmMscm93czoyLGNvbHM6NH0sbVthY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NDgsc2V0dGVyOlVjLHJvd3M6Myxjb2xzOjJ9LG1bY2NdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQ4LHNldHRlcjpMYyxyb3dzOjMsY29sczo0fSxtW3VjXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6T2Mscm93czo0LGNvbHM6Mn0sbVtmY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NjQsc2V0dGVyOnpjLHJvd3M6NCxjb2xzOjN9LG1bdGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50OmZ0fSxtW3JjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpsdH0sbVtuY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6YXJ9LG1bc2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50OmZ0fSxtW2xjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpkdH0sbVtkY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6ZHR9LG1baGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50Omx0fSxtW21jXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpmdH0sbVtwY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6YXJ9LG1beWNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50Omx0fSxtW2JjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpkdH0sbVtnY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6ZnR9LG1beGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50OmFyfSxtW0VjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpsdH0sbVtfY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6ZHR9O2Z1bmN0aW9uIGh0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2lmKHIudmFsdWUpc3dpdGNoKHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHIudmFsdWUubGVuZ3RoKXtjYXNlIDQ6dC52ZXJ0ZXhBdHRyaWI0ZnYoZSxyLnZhbHVlKTticmVhaztjYXNlIDM6dC52ZXJ0ZXhBdHRyaWIzZnYoZSxyLnZhbHVlKTticmVhaztjYXNlIDI6dC52ZXJ0ZXhBdHRyaWIyZnYoZSxyLnZhbHVlKTticmVhaztjYXNlIDE6dC52ZXJ0ZXhBdHRyaWIxZnYoZSxyLnZhbHVlKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBhIGZsb2F0IGNvbnN0YW50IHZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0ISIpfWVsc2UgdC5iaW5kQnVmZmVyKGN0LHIuYnVmZmVyKSx0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLHIubnVtQ29tcG9uZW50c3x8ci5zaXplLHIudHlwZXx8dXQsci5ub3JtYWxpemV8fCExLHIuc3RyaWRlfHwwLHIub2Zmc2V0fHwwKSx0LnZlcnRleEF0dHJpYkRpdmlzb3ImJnQudmVydGV4QXR0cmliRGl2aXNvcihlLHIuZGl2aXNvcnx8MCl9fWZ1bmN0aW9uIEgodCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7aWYoci52YWx1ZSlpZih0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZhbHVlLmxlbmd0aD09PTQpdC52ZXJ0ZXhBdHRyaWI0aXYoZSxyLnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHQuYmluZEJ1ZmZlcihjdCxyLmJ1ZmZlciksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZlcnRleEF0dHJpYklQb2ludGVyKGUsci5udW1Db21wb25lbnRzfHxyLnNpemUsci50eXBlfHxpcixyLnN0cmlkZXx8MCxyLm9mZnNldHx8MCksdC52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZ0LnZlcnRleEF0dHJpYkRpdmlzb3IoZSxyLmRpdmlzb3J8fDApfX1mdW5jdGlvbiBtdCh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtpZihyLnZhbHVlKWlmKHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHIudmFsdWUubGVuZ3RoPT09NCl0LnZlcnRleEF0dHJpYjR1aXYoZSxyLnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHQuYmluZEJ1ZmZlcihjdCxyLmJ1ZmZlciksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZlcnRleEF0dHJpYklQb2ludGVyKGUsci5udW1Db21wb25lbnRzfHxyLnNpemUsci50eXBlfHxvcixyLnN0cmlkZXx8MCxyLm9mZnNldHx8MCksdC52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZ0LnZlcnRleEF0dHJpYkRpdmlzb3IoZSxyLmRpdmlzb3J8fDApfX1mdW5jdGlvbiBjcih0LGUscil7Y29uc3Qgbj1yLnNpemUscz1yLmNvdW50O3JldHVybiBmdW5jdGlvbihpKXt0LmJpbmRCdWZmZXIoY3QsaS5idWZmZXIpO2NvbnN0IGE9aS5zaXplfHxpLm51bUNvbXBvbmVudHN8fG4sbz1hL3MsYz1pLnR5cGV8fHV0LGY9bVtjXS5zaXplKmEsZD1pLm5vcm1hbGl6ZXx8ITEsaD1pLm9mZnNldHx8MCxwPWYvcztmb3IobGV0IGw9MDtsPHM7KytsKXQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZStsKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoZStsLG8sYyxkLGYsaCtwKmwpLHQudmVydGV4QXR0cmliRGl2aXNvciYmdC52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUrbCxpLmRpdmlzb3J8fDApfX1jb25zdCBfPXt9O19bdXRdPXtzaXplOjQsc2V0dGVyOmh0fSxfW2JuXT17c2l6ZTo4LHNldHRlcjpodH0sX1tnbl09e3NpemU6MTIsc2V0dGVyOmh0fSxfW3huXT17c2l6ZToxNixzZXR0ZXI6aHR9LF9baXJdPXtzaXplOjQsc2V0dGVyOkh9LF9bRW5dPXtzaXplOjgsc2V0dGVyOkh9LF9bX25dPXtzaXplOjEyLHNldHRlcjpIfSxfW1RuXT17c2l6ZToxNixzZXR0ZXI6SH0sX1tvcl09e3NpemU6NCxzZXR0ZXI6bXR9LF9bUG5dPXtzaXplOjgsc2V0dGVyOm10fSxfW2tuXT17c2l6ZToxMixzZXR0ZXI6bXR9LF9bQ25dPXtzaXplOjE2LHNldHRlcjptdH0sX1t3bl09e3NpemU6NCxzZXR0ZXI6SH0sX1tBbl09e3NpemU6OCxzZXR0ZXI6SH0sX1t2bl09e3NpemU6MTIsc2V0dGVyOkh9LF9bU25dPXtzaXplOjE2LHNldHRlcjpIfSxfW0luXT17c2l6ZTo0LHNldHRlcjpjcixjb3VudDoyfSxfW1JuXT17c2l6ZTo5LHNldHRlcjpjcixjb3VudDozfSxfW0ZuXT17c2l6ZToxNixzZXR0ZXI6Y3IsY291bnQ6NH07Y29uc3QgR2M9L0VSUk9SOlxzKlxkKzooXGQrKS9naTtmdW5jdGlvbiAkYyh0LGU9IiIscj0wKXtjb25zdCBuPVsuLi5lLm1hdGNoQWxsKEdjKV0scz1uZXcgTWFwKG4ubWFwKChpLGEpPT57Y29uc3Qgbz1wYXJzZUludChpWzFdKSxjPW5bYSsxXSx1PWM/Yy5pbmRleDplLmxlbmd0aCxmPWUuc3Vic3RyaW5nKGkuaW5kZXgsdSk7cmV0dXJuW28tMSxmXX0pKTtyZXR1cm4gdC5zcGxpdChgCmApLm1hcCgoaSxhKT0+e2NvbnN0IG89cy5nZXQoYSk7cmV0dXJuYCR7YSsxK3J9OiAke2l9JHtvP2AKCl5eXiAke299YDoiIn1gfSkuam9pbihgCmApfWNvbnN0IExuPS9eWyBcdF0qXG4vO2Z1bmN0aW9uIHpuKHQpe2xldCBlPTA7cmV0dXJuIExuLnRlc3QodCkmJihlPTEsdD10LnJlcGxhY2UoTG4sIiIpKSx7bGluZU9mZnNldDplLHNoYWRlclNvdXJjZTp0fX1mdW5jdGlvbiBWYyh0LGUpe3JldHVybiB0LmVycm9yQ2FsbGJhY2soZSksdC5jYWxsYmFjayYmc2V0VGltZW91dCgoKT0+e3QuY2FsbGJhY2soYCR7ZX0KJHt0LmVycm9ycy5qb2luKGAKYCl9YCl9KSxudWxsfWZ1bmN0aW9uIFdjKHQsZSxyLG4pe2lmKG49bnx8c3IsIXQuZ2V0U2hhZGVyUGFyYW1ldGVyKHIsVmEpKXtjb25zdCBpPXQuZ2V0U2hhZGVySW5mb0xvZyhyKSx7bGluZU9mZnNldDphLHNoYWRlclNvdXJjZTpvfT16bih0LmdldFNoYWRlclNvdXJjZShyKSksYz1gJHskYyhvLGksYSl9CkVycm9yIGNvbXBpbGluZyAke0tyKHQsZSl9OiAke2l9YDtyZXR1cm4gbihjKSxjfXJldHVybiIifWZ1bmN0aW9uIHVyKHQsZSxyKXtsZXQgbixzLGk7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT12b2lkIDApLHR5cGVvZiB0PT0iZnVuY3Rpb24iKXI9dCx0PXZvaWQgMDtlbHNlIGlmKHQmJiFBcnJheS5pc0FycmF5KHQpKXtjb25zdCB1PXQ7cj11LmVycm9yQ2FsbGJhY2ssdD11LmF0dHJpYkxvY2F0aW9ucyxuPXUudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyxzPXUudHJhbnNmb3JtRmVlZGJhY2tNb2RlLGk9dS5jYWxsYmFja31jb25zdCBhPXJ8fHNyLG89W10sYz17ZXJyb3JDYWxsYmFjayh1LC4uLmYpe28ucHVzaCh1KSxhKHUsLi4uZil9LHRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3M6bix0cmFuc2Zvcm1GZWVkYmFja01vZGU6cyxjYWxsYmFjazppLGVycm9yczpvfTt7bGV0IHU9e307QXJyYXkuaXNBcnJheSh0KT90LmZvckVhY2goZnVuY3Rpb24oZixkKXt1W2ZdPWU/ZVtkXTpkfSk6dT10fHx7fSxjLmF0dHJpYkxvY2F0aW9ucz11fXJldHVybiBjfWNvbnN0IEhjPVsiVkVSVEVYX1NIQURFUiIsIkZSQUdNRU5UX1NIQURFUiJdO2Z1bmN0aW9uIGpjKHQsZSl7aWYoZS5pbmRleE9mKCJmcmFnIik+PTApcmV0dXJuIEhhO2lmKGUuaW5kZXhPZigidmVydCIpPj0wKXJldHVybiBqYX1mdW5jdGlvbiBYYyh0LGUscil7Y29uc3Qgbj10LmdldEF0dGFjaGVkU2hhZGVycyhlKTtmb3IoY29uc3QgcyBvZiBuKXIuaGFzKHMpJiZ0LmRlbGV0ZVNoYWRlcihzKTt0LmRlbGV0ZVByb2dyYW0oZSl9Y29uc3QgWWM9KHQ9MCk9Pm5ldyBQcm9taXNlKGU9PnNldFRpbWVvdXQoZSx0KSk7ZnVuY3Rpb24gUWModCxlLHIpe2NvbnN0IG49dC5jcmVhdGVQcm9ncmFtKCkse2F0dHJpYkxvY2F0aW9uczpzLHRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3M6aSx0cmFuc2Zvcm1GZWVkYmFja01vZGU6YX09dXIocik7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDsrK28pe2xldCBjPWVbb107aWYodHlwZW9mIGM9PSJzdHJpbmciKXtjb25zdCB1PXBuKGMpLGY9dT91LnRleHQ6YztsZXQgZD10W0hjW29dXTt1JiZ1LnR5cGUmJihkPWpjKHQsdS50eXBlKXx8ZCksYz10LmNyZWF0ZVNoYWRlcihkKSx0LnNoYWRlclNvdXJjZShjLHpuKGYpLnNoYWRlclNvdXJjZSksdC5jb21waWxlU2hhZGVyKGMpLHQuYXR0YWNoU2hhZGVyKG4sYyl9fU9iamVjdC5lbnRyaWVzKHMpLmZvckVhY2goKFtvLGNdKT0+dC5iaW5kQXR0cmliTG9jYXRpb24obixjLG8pKTt7bGV0IG89aTtvJiYoby5hdHRyaWJzJiYobz1vLmF0dHJpYnMpLEFycmF5LmlzQXJyYXkobyl8fChvPU9iamVjdC5rZXlzKG8pKSx0LnRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MobixvLGF8fFhhKSl9cmV0dXJuIHQubGlua1Byb2dyYW0obiksbn1mdW5jdGlvbiBxYyh0LGUscixuLHMpe2NvbnN0IGk9dXIocixuLHMpLGE9bmV3IFNldChlKSxvPVFjKHQsZSxpKTtmdW5jdGlvbiBjKHUsZil7Y29uc3QgZD1KYyh1LGYsaS5lcnJvckNhbGxiYWNrKTtyZXR1cm4gZCYmWGModSxmLGEpLGR9aWYoaS5jYWxsYmFjayl7S2ModCxvKS50aGVuKCgpPT57Y29uc3QgdT1jKHQsbyk7aS5jYWxsYmFjayh1LHU/dm9pZCAwOm8pfSk7cmV0dXJufXJldHVybiBjKHQsbyk/dm9pZCAwOm99YXN5bmMgZnVuY3Rpb24gS2ModCxlKXtjb25zdCByPXQuZ2V0RXh0ZW5zaW9uKCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSxuPXI/KGksYSk9PmkuZ2V0UHJvZ3JhbVBhcmFtZXRlcihhLHIuQ09NUExFVElPTl9TVEFUVVNfS0hSKTooKT0+ITA7bGV0IHM9MDtkbyBhd2FpdCBZYyhzKSxzPTFlMy82MDt3aGlsZSghbih0LGUpKX1mdW5jdGlvbiBKYyh0LGUscil7aWYocj1yfHxzciwhdC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsV2EpKXtjb25zdCBzPXQuZ2V0UHJvZ3JhbUluZm9Mb2coZSk7cihgRXJyb3IgaW4gcHJvZ3JhbSBsaW5raW5nOiAke3N9YCk7Y29uc3QgYT10LmdldEF0dGFjaGVkU2hhZGVycyhlKS5tYXAobz0+V2ModCx0LmdldFNoYWRlclBhcmFtZXRlcihvLHQuU0hBREVSX1RZUEUpLG8scikpO3JldHVybmAke3N9CiR7YS5maWx0ZXIobz0+bykuam9pbihgCmApfWB9fWZ1bmN0aW9uIFpjKHQsZSxyLG4scyl7cmV0dXJuIHFjKHQsZSxyLG4scyl9ZnVuY3Rpb24gR24odCl7Y29uc3QgZT10Lm5hbWU7cmV0dXJuIGUuc3RhcnRzV2l0aCgiZ2xfIil8fGUuc3RhcnRzV2l0aCgid2ViZ2xfIil9Y29uc3QgZXU9LyhcLnxcW3xdfFx3KykvZyx0dT10PT50Pj0iMCImJnQ8PSI5IjtmdW5jdGlvbiBydSh0LGUscixuKXtjb25zdCBzPXQuc3BsaXQoZXUpLmZpbHRlcihvPT5vIT09IiIpO2xldCBpPTAsYT0iIjtmb3IoOzspe2NvbnN0IG89c1tpKytdO2ErPW87Y29uc3QgYz10dShvWzBdKSx1PWM/cGFyc2VJbnQobyk6bztpZihjJiYoYSs9c1tpKytdKSxpPT09cy5sZW5ndGgpe3JbdV09ZTticmVha31lbHNle2NvbnN0IGQ9c1tpKytdLGg9ZD09PSJbIixwPXJbdV18fChoP1tdOnt9KTtyW3VdPXAscj1wLG5bYV09blthXXx8ZnVuY3Rpb24obCl7cmV0dXJuIGZ1bmN0aW9uKHkpeyRuKGwseSl9fShwKSxhKz1kfX19ZnVuY3Rpb24gbnUodCxlKXtsZXQgcj0wO2Z1bmN0aW9uIG4obyxjLHUpe2NvbnN0IGY9Yy5uYW1lLmVuZHNXaXRoKCJbMF0iKSxkPWMudHlwZSxoPW1bZF07aWYoIWgpdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHR5cGU6IDB4JHtkLnRvU3RyaW5nKDE2KX1gKTtsZXQgcDtpZihoLmJpbmRQb2ludCl7Y29uc3QgbD1yO3IrPWMuc2l6ZSxmP3A9aC5hcnJheVNldHRlcih0LGQsbCx1LGMuc2l6ZSk6cD1oLnNldHRlcih0LGQsbCx1LGMuc2l6ZSl9ZWxzZSBoLmFycmF5U2V0dGVyJiZmP3A9aC5hcnJheVNldHRlcih0LHUpOnA9aC5zZXR0ZXIodCx1KTtyZXR1cm4gcC5sb2NhdGlvbj11LHB9Y29uc3Qgcz17fSxpPXt9LGE9dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUseW4pO2ZvcihsZXQgbz0wO288YTsrK28pe2NvbnN0IGM9dC5nZXRBY3RpdmVVbmlmb3JtKGUsbyk7aWYoR24oYykpY29udGludWU7bGV0IHU9Yy5uYW1lO3UuZW5kc1dpdGgoIlswXSIpJiYodT11LnN1YnN0cigwLHUubGVuZ3RoLTMpKTtjb25zdCBmPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsYy5uYW1lKTtpZihmKXtjb25zdCBkPW4oZSxjLGYpO3NbdV09ZCxydSh1LGQsaSxzKX19cmV0dXJuIHN9ZnVuY3Rpb24gc3UodCxlKXtjb25zdCByPXt9LG49dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsUWEpO2ZvcihsZXQgcz0wO3M8bjsrK3Mpe2NvbnN0IGk9dC5nZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcoZSxzKTtyW2kubmFtZV09e2luZGV4OnMsdHlwZTppLnR5cGUsc2l6ZTppLnNpemV9fXJldHVybiByfWZ1bmN0aW9uIGl1KHQsZSl7Y29uc3Qgcj10LmdldFByb2dyYW1QYXJhbWV0ZXIoZSx5biksbj1bXSxzPVtdO2ZvcihsZXQgbz0wO288cjsrK28pe3MucHVzaChvKSxuLnB1c2goe30pO2NvbnN0IGM9dC5nZXRBY3RpdmVVbmlmb3JtKGUsbyk7bltvXS5uYW1lPWMubmFtZX1bWyJVTklGT1JNX1RZUEUiLCJ0eXBlIl0sWyJVTklGT1JNX1NJWkUiLCJzaXplIl0sWyJVTklGT1JNX0JMT0NLX0lOREVYIiwiYmxvY2tOZHgiXSxbIlVOSUZPUk1fT0ZGU0VUIiwib2Zmc2V0Il1dLmZvckVhY2goZnVuY3Rpb24obyl7Y29uc3QgYz1vWzBdLHU9b1sxXTt0LmdldEFjdGl2ZVVuaWZvcm1zKGUscyx0W2NdKS5mb3JFYWNoKGZ1bmN0aW9uKGYsZCl7bltkXVt1XT1mfSl9KTtjb25zdCBpPXt9LGE9dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUscWEpO2ZvcihsZXQgbz0wO288YTsrK28pe2NvbnN0IGM9dC5nZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lKGUsbyksdT17aW5kZXg6dC5nZXRVbmlmb3JtQmxvY2tJbmRleChlLGMpLHVzZWRCeVZlcnRleFNoYWRlcjp0LmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLG8sS2EpLHVzZWRCeUZyYWdtZW50U2hhZGVyOnQuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsbyxKYSksc2l6ZTp0LmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLG8sWmEpLHVuaWZvcm1JbmRpY2VzOnQuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsbyxlYyl9O3UudXNlZD11LnVzZWRCeVZlcnRleFNoYWRlcnx8dS51c2VkQnlGcmFnbWVudFNoYWRlcixpW2NdPXV9cmV0dXJue2Jsb2NrU3BlY3M6aSx1bmlmb3JtRGF0YTpufX1mdW5jdGlvbiAkbih0LGUpe2Zvcihjb25zdCByIGluIGUpe2NvbnN0IG49dFtyXTt0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGVbcl0pOiRuKHRbcl0sZVtyXSl9fWZ1bmN0aW9uIFZuKHQsLi4uZSl7Y29uc3Qgcj10LnVuaWZvcm1TZXR0ZXJzfHx0LG49ZS5sZW5ndGg7Zm9yKGxldCBzPTA7czxuOysrcyl7Y29uc3QgaT1lW3NdO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IGE9aS5sZW5ndGg7Zm9yKGxldCBvPTA7bzxhOysrbylWbihyLGlbb10pfWVsc2UgZm9yKGNvbnN0IGEgaW4gaSl7Y29uc3Qgbz1yW2FdO28mJm8oaVthXSl9fX1mdW5jdGlvbiBvdSh0LGUpe2NvbnN0IHI9e30sbj10LmdldFByb2dyYW1QYXJhbWV0ZXIoZSxZYSk7Zm9yKGxldCBzPTA7czxuOysrcyl7Y29uc3QgaT10LmdldEFjdGl2ZUF0dHJpYihlLHMpO2lmKEduKGkpKWNvbnRpbnVlO2NvbnN0IGE9dC5nZXRBdHRyaWJMb2NhdGlvbihlLGkubmFtZSksbz1fW2kudHlwZV0sYz1vLnNldHRlcih0LGEsbyk7Yy5sb2NhdGlvbj1hLHJbaS5uYW1lXT1jfXJldHVybiByfWZ1bmN0aW9uIGF1KHQsZSl7Zm9yKGNvbnN0IHIgaW4gZSl7Y29uc3Qgbj10W3JdO24mJm4oZVtyXSl9fWZ1bmN0aW9uIGN1KHQsZSxyKXtyLnZlcnRleEFycmF5T2JqZWN0P3QuYmluZFZlcnRleEFycmF5KHIudmVydGV4QXJyYXlPYmplY3QpOihhdShlLmF0dHJpYlNldHRlcnN8fGUsci5hdHRyaWJzKSxyLmluZGljZXMmJnQuYmluZEJ1ZmZlcigkYSxyLmluZGljZXMpKX1mdW5jdGlvbiBXbih0LGUpe2NvbnN0IHI9bnUodCxlKSxuPW91KHQsZSkscz17cHJvZ3JhbTplLHVuaWZvcm1TZXR0ZXJzOnIsYXR0cmliU2V0dGVyczpufTtyZXR1cm4gQWUodCkmJihzLnVuaWZvcm1CbG9ja1NwZWM9aXUodCxlKSxzLnRyYW5zZm9ybUZlZWRiYWNrSW5mbz1zdSh0LGUpKSxzfWNvbnN0IHV1PS9cc3x7fH18Oy87ZnVuY3Rpb24gZnUodCxlLHIsbixzKXtjb25zdCBpPXVyKHIsbixzKSxhPVtdO2lmKGU9ZS5tYXAoZnVuY3Rpb24odSl7aWYoIXV1LnRlc3QodSkpe2NvbnN0IGY9cG4odSk7aWYoZil1PWYudGV4dDtlbHNle2NvbnN0IGQ9YG5vIGVsZW1lbnQgd2l0aCBpZDogJHt1fWA7aS5lcnJvckNhbGxiYWNrKGQpLGEucHVzaChkKX19cmV0dXJuIHV9KSxhLmxlbmd0aClyZXR1cm4gVmMoaSwiIik7Y29uc3Qgbz1pLmNhbGxiYWNrO28mJihpLmNhbGxiYWNrPSh1LGYpPT57byh1LHU/dm9pZCAwOlduKHQsZikpfSk7Y29uc3QgYz1aYyh0LGUsaSk7cmV0dXJuIGM/V24odCxjKTpudWxsfWNvbnN0IGx1PTQsSG49NTEyMztmdW5jdGlvbiBkdSh0LGUscixuLHMsaSl7cj1yPT09dm9pZCAwP2x1OnI7Y29uc3QgYT1lLmluZGljZXMsbz1lLmVsZW1lbnRUeXBlLGM9bj09PXZvaWQgMD9lLm51bUVsZW1lbnRzOm47cz1zPT09dm9pZCAwPzA6cyxvfHxhP2khPT12b2lkIDA/dC5kcmF3RWxlbWVudHNJbnN0YW5jZWQocixjLG89PT12b2lkIDA/SG46ZS5lbGVtZW50VHlwZSxzLGkpOnQuZHJhd0VsZW1lbnRzKHIsYyxvPT09dm9pZCAwP0huOmUuZWxlbWVudFR5cGUscyk6aSE9PXZvaWQgMD90LmRyYXdBcnJheXNJbnN0YW5jZWQocixzLGMsaSk6dC5kcmF3QXJyYXlzKHIscyxjKX1jb25zdCBqbj0zNjE2MCxwdD0zNjE2MSxodT0zNTUzLG11PTUxMjEscHU9NjQwMix5dT02NDA4LGJ1PTMzMTkwLGd1PTM2MDEyLHh1PTM1MDU2LEV1PTM2MDEzLF91PTMyODU0LFR1PTMyODU1LHd1PTM2MTk0LFhuPTMzMTg5LFluPTY0MDEsUW49MzYxNjgsZnI9MzQwNDEsbHI9MzYwNjQseXQ9MzYwOTYscW49MzYxMjgsZHI9MzMzMDYsaHI9MzMwNzEsbXI9OTcyOSxBdT1be2Zvcm1hdDp5dSx0eXBlOm11LG1pbjptcix3cmFwOmhyfSx7Zm9ybWF0OmZyfV0sQz17fTtDW2ZyXT1kcixDW1luXT1xbixDW1FuXT1xbixDW3B1XT15dCxDW1huXT15dCxDW2J1XT15dCxDW2d1XT15dCxDW3h1XT1kcixDW0V1XT1kcjtmdW5jdGlvbiB2dSh0LGUpe3JldHVybiBDW3RdfHxDW2VdfWNvbnN0IGo9e307altfdV09ITAsaltUdV09ITAsalt3dV09ITAsaltmcl09ITAsaltYbl09ITAsaltZbl09ITAsaltRbl09ITA7ZnVuY3Rpb24gU3UodCl7cmV0dXJuIGpbdF19Y29uc3QgSXU9MzI7ZnVuY3Rpb24gUnUodCl7cmV0dXJuIHQ+PWxyJiZ0PGxyK0l1fWZ1bmN0aW9uIEtuKHQsZSxyLG4pe2NvbnN0IHM9am4saT10LmNyZWF0ZUZyYW1lYnVmZmVyKCk7dC5iaW5kRnJhbWVidWZmZXIocyxpKSxyPXJ8fHQuZHJhd2luZ0J1ZmZlcldpZHRoLG49bnx8dC5kcmF3aW5nQnVmZmVySGVpZ2h0LGU9ZXx8QXU7Y29uc3QgYT1bXSxvPXtmcmFtZWJ1ZmZlcjppLGF0dGFjaG1lbnRzOltdLHdpZHRoOnIsaGVpZ2h0Om59O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oYyx1KXtsZXQgZj1jLmF0dGFjaG1lbnQ7Y29uc3QgZD1jLnNhbXBsZXMsaD1jLmZvcm1hdDtsZXQgcD1jLmF0dGFjaG1lbnRQb2ludHx8dnUoaCxjLmludGVybmFsRm9ybWF0KTtpZihwfHwocD1scit1KSxSdShwKSYmYS5wdXNoKHApLCFmKWlmKGQhPT12b2lkIDB8fFN1KGgpKWY9dC5jcmVhdGVSZW5kZXJidWZmZXIoKSx0LmJpbmRSZW5kZXJidWZmZXIocHQsZiksZD4xP3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHB0LGQsaCxyLG4pOnQucmVuZGVyYnVmZmVyU3RvcmFnZShwdCxoLHIsbik7ZWxzZXtjb25zdCBsPU9iamVjdC5hc3NpZ24oe30sYyk7bC53aWR0aD1yLGwuaGVpZ2h0PW4sbC5hdXRvPT09dm9pZCAwJiYobC5hdXRvPSExLGwubWluPWwubWlufHxsLm1pbk1hZ3x8bXIsbC5tYWc9bC5tYWd8fGwubWluTWFnfHxtcixsLndyYXBTPWwud3JhcFN8fGwud3JhcHx8aHIsbC53cmFwVD1sLndyYXBUfHxsLndyYXB8fGhyKSxmPW1uKHQsbCl9aWYoTWkodCxmKSl0LmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHMscCxwdCxmKTtlbHNlIGlmKHp0KHQsZikpYy5sYXllciE9PXZvaWQgMD90LmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKHMscCxmLGMubGV2ZWx8fDAsYy5sYXllcik6dC5mcmFtZWJ1ZmZlclRleHR1cmUyRChzLHAsYy50YXJnZXR8fGh1LGYsYy5sZXZlbHx8MCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gYXR0YWNobWVudCB0eXBlIik7by5hdHRhY2htZW50cy5wdXNoKGYpfSksdC5kcmF3QnVmZmVycyYmdC5kcmF3QnVmZmVycyhhKSxvfWZ1bmN0aW9uIEZ1KHQsZSxyKXtyPXJ8fGpuLGU/KHQuYmluZEZyYW1lYnVmZmVyKHIsZS5mcmFtZWJ1ZmZlciksdC52aWV3cG9ydCgwLDAsZS53aWR0aCxlLmhlaWdodCkpOih0LmJpbmRGcmFtZWJ1ZmZlcihyLG51bGwpLHQudmlld3BvcnQoMCwwLHQuZHJhd2luZ0J1ZmZlcldpZHRoLHQuZHJhd2luZ0J1ZmZlckhlaWdodCkpfWZ1bmN0aW9uIHYodCxlKXtyZXR1cm4oKT0+ZSBpbnN0YW5jZW9mIFdlYkdMVGV4dHVyZT9lOm1uKHQse3NyYzplLHdyYXA6dC5DTEFNUF9UT19FREdFfSl9Y29uc3QgeWU9MjtjbGFzcyBDZXtjb25zdHJ1Y3RvcihlKXt0aGlzLmlkPSJfIjtjb25zdHtjb250ZXh0OnIsd2lkdGg6bixoZWlnaHQ6c309ZTt0aGlzLmNvbnRleHQ9cix0aGlzLm9wdGlvbnM9ZTtjb25zdCBpPXRoaXMuYnVpbGREZWZpbmVzKCk7dGhpcy5wcm9ncmFtSW5mbz1mdSh0aGlzLmNvbnRleHQsW2krdGhpcy5nZXRWZXJ0ZXhTaGFkZXIoKSxpK3RoaXMuZ2V0RnJhZ21lbnRTaGFkZXIoKV0pLHRoaXMuYnVmZmVySW5mbz1pbyh0aGlzLmNvbnRleHQsdGhpcy5nZXRCdWZmZXJzKCkpLHRoaXMuZmJpPUtuKHRoaXMuY29udGV4dCxbe2Zvcm1hdDp0aGlzLmNvbnRleHQuUkdCQSx0eXBlOnRoaXMuY29udGV4dC5VTlNJR05FRF9CWVRFLG1pbjp0aGlzLmNvbnRleHQuTElORUFSLHdyYXA6dGhpcy5jb250ZXh0LkNMQU1QX1RPX0VER0V9XSxuLHMpLHRoaXMub3V0cHV0PXRoaXMuZmJpLmF0dGFjaG1lbnRzWzBdfXJlc2l6ZU91dHB1dChlLHIpe3RoaXMuZmJpPUtuKHRoaXMuY29udGV4dCxbe2Zvcm1hdDp0aGlzLmNvbnRleHQuUkdCQSx0eXBlOnRoaXMuY29udGV4dC5VTlNJR05FRF9CWVRFLG1pbjp0aGlzLmNvbnRleHQuTElORUFSLHdyYXA6dGhpcy5jb250ZXh0LkNMQU1QX1RPX0VER0V9XSxlLHIpLHRoaXMub3B0aW9ucy53aWR0aD1lLHRoaXMub3B0aW9ucy5oZWlnaHQ9cix0aGlzLm91dHB1dD10aGlzLmZiaS5hdHRhY2htZW50c1swXX1nZXREZWZpbmVzKCl7cmV0dXJue319Z2V0QnVmZmVycygpe3JldHVybntwb3NpdGlvbjp7bnVtQ29tcG9uZW50czoyLGRhdGE6Wy0xLC0xLC0xLDEsMSwtMSwxLDEsLTEsMSwxLC0xXX0sdGV4dHVyZV9jb29yZDp7bnVtQ29tcG9uZW50czoyLGRhdGE6WzAsMCwwLDEsMSwwLDEsMSwwLDEsMSwwXX19fWJ1aWxkRGVmaW5lcygpe2xldCBlPSIiO2NvbnN0IHI9dGhpcy5nZXREZWZpbmVzKCk7Zm9yKGxldCBuIGluIHIpZSs9YCNkZWZpbmUgJHtufSAke3Jbbl0udG9GaXhlZCgxKX0KYDtyZXR1cm4gZX1ydW4oZSl7dmFyIHMsaSxhLG8sYyx1OyhzPXRoaXMucHJvZmlsZXIpPT1udWxsfHxzLnB1c2hDb250ZXh0KGBbJHt0aGlzLmlkfV0gUFJPRyA6ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApLChpPXRoaXMucHJvZmlsZXIpPT1udWxsfHxpLnB1c2hDb250ZXh0KGBbJHt0aGlzLmlkfV0gVU5JRk9STVNgKTtmb3IoY29uc3QgZiBpbiBlKXR5cGVvZiBlW2ZdPT0iZnVuY3Rpb24iJiYoKGE9dGhpcy5wcm9maWxlcik9PW51bGx8fGEucHVzaENvbnRleHQoYFske3RoaXMuaWR9XSBVTkkgOiAke2Z9YCksZVtmXT1lW2ZdKCksKG89dGhpcy5wcm9maWxlcik9PW51bGx8fG8ucG9wQ29udGV4dChgWyR7dGhpcy5pZH1dIFVOSSA6ICR7Zn1gKSk7KGM9dGhpcy5wcm9maWxlcik9PW51bGx8fGMucG9wQ29udGV4dChgWyR7dGhpcy5pZH1dIFVOSUZPUk1TYCk7Y29uc3Qgcj1EYXRlLm5vdygpO2xldCBuPTA7dGhpcy5sYXN0UnVuJiYobj0oci10aGlzLmxhc3RSdW4pLzFlMyksdGhpcy5sYXN0UnVuPXIsdGhpcy5jb250ZXh0LnZpZXdwb3J0KDAsMCx0aGlzLmNvbnRleHQuY2FudmFzLndpZHRoLHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0KSx0aGlzLmNvbnRleHQudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW1JbmZvLnByb2dyYW0pLGN1KHRoaXMuY29udGV4dCx0aGlzLnByb2dyYW1JbmZvLHRoaXMuYnVmZmVySW5mbyksVm4odGhpcy5wcm9ncmFtSW5mbyx7ZGVsdGE6bixjYW52YXM6W3RoaXMuY29udGV4dC5jYW52YXMud2lkdGgsdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHRdLC4uLmV9KSxGdSh0aGlzLmNvbnRleHQsdGhpcy5vcHRpb25zLmRpc2FibGVGcmFtZWJ1ZmZlcj9udWxsOnRoaXMuZmJpKSxkdSh0aGlzLmNvbnRleHQsdGhpcy5idWZmZXJJbmZvKSwodT10aGlzLnByb2ZpbGVyKT09bnVsbHx8dS5wb3BDb250ZXh0KGBbJHt0aGlzLmlkfV0gUFJPRyA6ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApfXNldFByb2ZpbGVyKGUpe3RoaXMucHJvZmlsZXI9ZX19dmFyIFB1PWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gc2FtcGxlcjJEIGJhY2tncm91bmQ7CnVuaWZvcm0gc2FtcGxlcjJEIGZvcmVncm91bmQ7CnVuaWZvcm0gc2FtcGxlcjJEIHRocmVzaG9sZDsKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGJhY2tncm91bmRDb2xvciA9IHRleHR1cmUyRChiYWNrZ3JvdW5kLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCBmb3JlZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlMkQoZm9yZWdyb3VuZCwgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgdHJlc2hvbGRDb2xvciA9IHRleHR1cmUyRCh0aHJlc2hvbGQsIF90ZXh0dXJlX2Nvb3JkKTsKICBnbF9GcmFnQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3IgKiB0cmVzaG9sZENvbG9yLmEgKwogICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvciAqICgxLiAtIHRyZXNob2xkQ29sb3IuYSk7Cn0KYCxrdT1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBfdGV4dHVyZV9jb29yZC55ID0gMS4gLSB0ZXh0dXJlX2Nvb3JkLnk7Cn0KYDtjbGFzcyBwciBleHRlbmRzIENle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFB1fWdldFZlcnRleFNoYWRlcigpe3JldHVybiBrdX19Y2xhc3MgeXJ7Y29uc3RydWN0b3IoKXt0aGlzLnN0ZXBzPVtdfWFkZFN0ZXAoZSl7dGhpcy5zdGVwcy5wdXNoKGUpfWFzeW5jIHJ1bigpe2Zvcihjb25zdCBlIG9mIHRoaXMuc3RlcHMpZS5wcm9ncmFtLnJ1bihlLmdldFVuaWZvcm1zKCkpfXJlc2l6ZU91dHB1dChlLHIpe3ZhciBuLHM7KG49dGhpcy5wcm9maWxlcik9PW51bGx8fG4ucHVzaENvbnRleHQoYFBJUCBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XWApO2Zvcihjb25zdCBpIG9mIHRoaXMuc3RlcHMpaS5wcmV2ZW50UmVzaXplfHxpLnByb2dyYW0ucmVzaXplT3V0cHV0KGUscik7KHM9dGhpcy5wcm9maWxlcik9PW51bGx8fHMucG9wQ29udGV4dChgUElQIFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dYCl9c2V0UHJvZmlsZXIoZSl7dGhpcy5wcm9maWxlcj1lO2Zvcihjb25zdCByIG9mIHRoaXMuc3RlcHMpci5wcm9ncmFtLnNldFByb2ZpbGVyKGUpfXNldElkKGUpe2Zvcihjb25zdCByIG9mIHRoaXMuc3RlcHMpci5wcm9ncmFtLmlkPWV9fWNsYXNzIGJyIGV4dGVuZHMgeXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucHJlY2lzZU1hc2tFbmFibGVkPSExfX1jbGFzcyBKbiBleHRlbmRzIGJye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5jb250ZXh0PWUsdGhpcy5wcmVjaXNlTWFza0VuYWJsZWQ9ITA7Y29uc3Qgcj17Y29udGV4dDplLGhlaWdodDplLmNhbnZhcy5oZWlnaHQsd2lkdGg6ZS5jYW52YXMud2lkdGh9LG49bmV3IHByKHsuLi5yLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpuLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6dihlLHRoaXMuaW5wdXRCYWNrZ3JvdW5kSW1hZ2UpLGZvcmVncm91bmQ6dihlLHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOnYoZSx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEoZSxyKXt0aGlzLmlucHV0SW1hZ2U9ZSx0aGlzLmlucHV0TWFzaz1yfX12YXIgQ3U9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOyB9CmAsQnU9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIGJvb2wgaW52ZXJ0X3k7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBpZiAoaW52ZXJ0X3kpIHsKICAgIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKICB9Cn0KYDtjbGFzcyBEdSBleHRlbmRzIENle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIEN1fWdldFZlcnRleFNoYWRlcigpe3JldHVybiBCdX19Y2xhc3MgTXUgZXh0ZW5kcyB5cntjb25zdHJ1Y3RvcihlLHIsbil7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBzPXtjb250ZXh0OmUsaGVpZ2h0Om4sd2lkdGg6cn07dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm5ldyBEdSh7Li4ucyxkaXNhYmxlRnJhbWVidWZmZXI6ITB9KSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOnYoZSx0aGlzLmlucHV0SW1hZ2UpLGludmVydF95OiEwfSl9KX1zZXREYXRhKGUpe3RoaXMuaW5wdXRJbWFnZT1lfX1hc3luYyBmdW5jdGlvbiBabih0KXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3NldFRpbWVvdXQoKCk9PntlKCl9LHQpfSl9dmFyIFV1PWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gdmVjMiBjYW52YXM7CnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7Cgp2ZWM0IGxvb3AoKTsKCnZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gbG9vcCgpOyB9CmAsTnU9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYCxncj0odD0+KHRbdC5MSU5FQVI9MF09IkxJTkVBUiIsdFt0LkdBVVNTSUFOPTFdPSJHQVVTU0lBTiIsdCkpKGdyfHx7fSk7Y2xhc3MgZXMgZXh0ZW5kcyBDZXtnZXREZWZpbmVzKCl7cmV0dXJue1JBRElVUzp0aGlzLm9wdGlvbnMucmFkaXVzPz8xfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBVdSt0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBOdX1jcmVhdGVMb29wRnVuY3Rpb24oKXtsZXQgZT10aGlzLm9wdGlvbnMucmFkaXVzPz8xO3JldHVybmAKCiAgICAgICAgdmVjNCBsb29wKCkgeyAKICAgICAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAsMCwwLDApOwogICAgICAgICAgICBmbG9hdCBmYWN0b3JTdW0gPSAwLjsKCiAgICAgICAgICAgIHZlYzIgbm9ybWFsaXplZFJhZGl1cyA9IHZlYzIoLSR7ZX0uKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkSW5jcmVtZW50ID0gdmVjMigxLikgLyBjYW52YXM7CiAgICAgICAgICAgIHZlYzIgZGlmZiA9IG5vcm1hbGl6ZWRSYWRpdXM7CgogICAgICAgICAgICBmb3IoaW50IHk9LSR7ZX07IHk8JHtlKzF9OyArK3kpIHsKICAgICAgICAgICAgICAgIGZvcihpbnQgeD0tJHtlfTsgeDwke2UrMX07ICsreCkgewogICAgICAgICAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9IDEuOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBmYWN0b3IgKiB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQgKyBkaWZmKTsKICAgICAgICAgICAgICAgICAgICBmYWN0b3JTdW0gKz0gZmFjdG9yOwogICAgICAgICAgICAgICAgICAgIGRpZmYueCArPSBub3JtYWxpemVkSW5jcmVtZW50Lng7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkaWZmLnkgKz0gbm9ybWFsaXplZEluY3JlbWVudC55OwogICAgICAgICAgICAgICAgZGlmZi54ID0gbm9ybWFsaXplZFJhZGl1cy54OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQgLyBmYWN0b3JTdW07CiAgICAgICAgfWB9Z2V0RmFjdG9yKGUscil7c3dpdGNoKHRoaXMub3B0aW9ucy50eXBlKXtjYXNlIDE6cmV0dXJuIHRoaXMuZ2V0TGluZWFyRmFjdG9yKGUscik7Y2FzZSAwOmRlZmF1bHQ6cmV0dXJuIHRoaXMuZ2V0TGluZWFyRmFjdG9yKGUscil9fWdldExpbmVhckZhY3RvcihlLHIpe3JldHVybiAxfWdldEdhdXNzaWFuRmFjdG9yKGUscil7Y29uc3Qgbj1NYXRoLlBJKjIscz1NYXRoLm1heCh0aGlzLm9wdGlvbnMucmFkaXVzPz8xLDEpLGk9MS8obipzKioyKSxhPS0oZSoqMityKioyKSxvPWkqYTtyZXR1cm4gaSpNYXRoLkUqKm99fXZhciBPdT1gI3ZlcnNpb24gMzAwIGVzCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Wb2xjb21peC92aXJ0dWFsLWJhY2tncm91bmQvYmxvYi9tYWluL3NyYy9waXBlbGluZXMvd2ViZ2wyL2pvaW50QmlsYXRlcmFsRmlsdGVyU3RhZ2UudHMKCnByZWNpc2lvbiBoaWdocCBmbG9hdDsKdW5pZm9ybSBzYW1wbGVyMkQgaW5wdXRfZnJhbWU7CnVuaWZvcm0gc2FtcGxlcjJEIHNlZ21lbnRhdGlvbl9tYXNrOwp1bmlmb3JtIHNhbXBsZXIyRCB0aHJlc2hvbGQ7CnVuaWZvcm0gdmVjMiB0ZXhlbF9zaXplOwp1bmlmb3JtIGZsb2F0IHN0ZXA7CnVuaWZvcm0gZmxvYXQgcmFkaXVzOwp1bmlmb3JtIGZsb2F0IG9mZnNldDsKdW5pZm9ybSBmbG9hdCBzaWdtYV90ZXhlbDsKdW5pZm9ybSBmbG9hdCBzaWdtYV9jb2xvcjsKCmluIHZlYzIgX3RleHR1cmVfY29vcmQ7Cm91dCB2ZWM0IG91dENvbG9yOwoKZmxvYXQgZ2F1c3NpYW4oZmxvYXQgeCwgZmxvYXQgc2lnbWEpIHsKICBmbG9hdCBjb2VmZiA9IC0wLjUgLyAoc2lnbWEgKiBzaWdtYSAqIDQuMCArIDEuMGUtNik7CiAgcmV0dXJuIGV4cCgoeCAqIHgpICogY29lZmYpOwp9Cgp2b2lkIG1haW4oKSB7CiAgdmVjMiBjZW50ZXJDb29yZCA9IF90ZXh0dXJlX2Nvb3JkOwogIHZlYzMgY2VudGVyQ29sb3IgPSB0ZXh0dXJlKGlucHV0X2ZyYW1lLCBjZW50ZXJDb29yZCkucmdiOwogIGZsb2F0IG5ld1ZhbCA9IDAuMDsKICBmbG9hdCBzcGFjZVdlaWdodCA9IDAuMDsKICBmbG9hdCBjb2xvcldlaWdodCA9IDAuMDsKICBmbG9hdCB0b3RhbFdlaWdodCA9IDAuMDsKICAvLyBTdWJzYW1wbGUga2VybmVsIHNwYWNlLgogIGZvciAoZmxvYXQgaSA9IC1yYWRpdXMgKyBvZmZzZXQ7IGkgPD0gcmFkaXVzOyBpICs9IHN0ZXApIHsKICAgIGZvciAoZmxvYXQgaiA9IC1yYWRpdXMgKyBvZmZzZXQ7IGogPD0gcmFkaXVzOyBqICs9IHN0ZXApIHsKICAgICAgdmVjMiBzaGlmdCA9IHZlYzIoaiwgaSkgKiB0ZXhlbF9zaXplOwogICAgICB2ZWMyIGNvb3JkID0gdmVjMihjZW50ZXJDb29yZCArIHNoaWZ0KTsKICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZShpbnB1dF9mcmFtZSwgY29vcmQpLnJnYjsKICAgICAgZmxvYXQgdGhyZXNob2xkID0gdGV4dHVyZSh0aHJlc2hvbGQsIGNvb3JkKS5hOwogICAgICBmbG9hdCBvdXRWYWwgPSB0ZXh0dXJlKHNlZ21lbnRhdGlvbl9tYXNrLCBjb29yZCkuYTsKCiAgICAgIHNwYWNlV2VpZ2h0ID0gZ2F1c3NpYW4oZGlzdGFuY2UoY2VudGVyQ29vcmQsIGNvb3JkKSwgc2lnbWFfdGV4ZWwpOwogICAgICBjb2xvcldlaWdodCA9IGdhdXNzaWFuKGRpc3RhbmNlKGNlbnRlckNvbG9yLCBmcmFtZUNvbG9yKSwgc2lnbWFfY29sb3IpOwogICAgICB0b3RhbFdlaWdodCArPSBzcGFjZVdlaWdodCAqIGNvbG9yV2VpZ2h0OwogICAgICBuZXdWYWwgKz0gc3BhY2VXZWlnaHQgKiBjb2xvcldlaWdodCAqIG91dFZhbCAqIHRocmVzaG9sZDsKICAgIH0KICB9CiAgbmV3VmFsIC89IHRvdGFsV2VpZ2h0OwogIG91dENvbG9yID0gdmVjNCh2ZWMzKDAuKSwgbmV3VmFsKTsKfWAsTHU9YCN2ZXJzaW9uIDMwMCBlcwppbiB2ZWMyIHBvc2l0aW9uOwppbiB2ZWMyIHRleHR1cmVfY29vcmQ7Cm91dCB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9YDtjbGFzcyB6dSBleHRlbmRzIENle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIE91fWdldFZlcnRleFNoYWRlcigpe3JldHVybiBMdX19Y2xhc3MgR3UgZXh0ZW5kcyB5cntjb25zdHJ1Y3RvcihlLHIsbil7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBzPXtjb250ZXh0OmUsaGVpZ2h0Om4sd2lkdGg6cn0saT1uZXcgZXMoey4uLnMscmFkaXVzOjEsdHlwZTpnci5HQVVTU0lBTn0pO3RoaXMuam9pbnRCaWxhdGVyYWw9bmV3IHp1KHMpLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe2lucHV0czp2KGUsdGhpcy5pbnB1dE1hc2spfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06dGhpcy5qb2ludEJpbGF0ZXJhbCxnZXRVbmlmb3JtczooKT0+e3ZhciBwLGwseSxiO2NvbnN0IG89KChwPXRoaXMuaW5wdXRJbWFnZSk9PW51bGw/dm9pZCAwOnAud2lkdGgpPz8xLGM9KChsPXRoaXMuaW5wdXRJbWFnZSk9PW51bGw/dm9pZCAwOmwuaGVpZ2h0KT8/MTsoeT10aGlzLmlucHV0TWFzayk9PW51bGx8fHkud2lkdGgsKGI9dGhpcy5pbnB1dE1hc2spPT1udWxsfHxiLmhlaWdodDtjb25zdCB1PTMsZj1NYXRoLm1heCgxLE1hdGguc3FydCh1KSouNjYpLGQ9MS9vLGg9MS9jO3JldHVybntpbnB1dF9mcmFtZTp2KGUsdGhpcy5pbnB1dEltYWdlKSxzZWdtZW50YXRpb25fbWFzazp2KGUsdGhpcy5pbnB1dE1hc2spLHRleGVsX3NpemU6W2QsaF0sc3RlcDpmLHJhZGl1czp1LG9mZnNldDpmPjE/ZiouNTowLHNpZ21hX3RleGVsOk1hdGgubWF4KGQsaCkqdSxzaWdtYV9jb2xvcjp1fX19KSx0aGlzLm91dHB1dD10aGlzLmpvaW50QmlsYXRlcmFsLm91dHB1dH1zZXREYXRhKGUscil7dGhpcy5wcmV2aW91c0lucHV0SW1hZ2U9dGhpcy5pbnB1dEltYWdlP3RoaXMuaW5wdXRJbWFnZTplLHRoaXMucHJldmlvdXNJbnB1dE1hc2s9dGhpcy5pbnB1dE1hc2s/dGhpcy5pbnB1dE1hc2s6cix0aGlzLmlucHV0SW1hZ2U9ZSx0aGlzLmlucHV0TWFzaz1yfXJlc2l6ZU91dHB1dChlLHIpe3N1cGVyLnJlc2l6ZU91dHB1dChlLHIpLHRoaXMub3V0cHV0PXRoaXMuam9pbnRCaWxhdGVyYWwub3V0cHV0fX1jbGFzcyAkdXtjb25zdHJ1Y3RvcihlKXt0aGlzLnF1ZXJpZXM9W10sdGhpcy5jb250ZXh0PWUsdGhpcy5leHRlbnNpb249ZS5nZXRFeHRlbnNpb24oIkVYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDIiKX1zdGFydCgpe31zdG9wKCl7dGhpcy5hY3RpdmVRdWVyeSYmdGhpcy5jb250ZXh0LmVuZFF1ZXJ5KHRoaXMuZXh0ZW5zaW9uLlRJTUVfRUxBUFNFRF9FWFQpfXB1c2hDb250ZXh0KGUpe3RoaXMuY3JlYXRlUXVlcnkoIlBVU0giLGUpfXBvcENvbnRleHQoZSl7dGhpcy5jcmVhdGVRdWVyeSgiUE9QIixlKX1jcmVhdGVRdWVyeShlLHIpe3RoaXMuYWN0aXZlUXVlcnkmJnRoaXMuY29udGV4dC5lbmRRdWVyeSh0aGlzLmV4dGVuc2lvbi5USU1FX0VMQVBTRURfRVhUKSx0aGlzLmFjdGl2ZVF1ZXJ5PXRoaXMuY29udGV4dC5jcmVhdGVRdWVyeSgpLHRoaXMuY29udGV4dC5iZWdpblF1ZXJ5KHRoaXMuZXh0ZW5zaW9uLlRJTUVfRUxBUFNFRF9FWFQsdGhpcy5hY3RpdmVRdWVyeSksdGhpcy5xdWVyaWVzLnB1c2goe25hbWU6cixhY3Rpb246ZSxxdWVyeTp0aGlzLmFjdGl2ZVF1ZXJ5fSl9YXN5bmMgZ2V0UmVzb2x2ZWRRdWVyaWVzKCl7Y29uc3QgZT0oYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnRoaXMucXVlcmllc10ubWFwKHI9PnRoaXMucmVzb2x2ZVF1ZXJ5KHIpKSkpLmZpbHRlcihyPT5yKTtmb3IobGV0IHI9MTtyPGUubGVuZ3RoOysrcillW3JdLnRpbWVzdGFtcCs9ZVtyLTFdLmR1cmF0aW9uK2Vbci0xXS50aW1lc3RhbXA7cmV0dXJuIGV9YXN5bmMgcmVzb2x2ZVF1ZXJ5KGUpe2lmKCFhd2FpdCB0aGlzLmF3YWl0UXVlcnlBdmFpbGFibGUoZSkpe2NvbnNvbGUubG9nKCJVbmF3YWl0YWJsZSBxdWVyeSIsZSk7cmV0dXJufWlmKHRoaXMuY29udGV4dC5nZXRQYXJhbWV0ZXIodGhpcy5leHRlbnNpb24uR1BVX0RJU0pPSU5UX0VYVCkpe2NvbnNvbGUubG9nKCJEaXNqb2ludGVkIHF1ZXJ5IixlKTtyZXR1cm59cmV0dXJuey4uLmUsZHVyYXRpb246dGhpcy5jb250ZXh0LmdldFF1ZXJ5UGFyYW1ldGVyKGUucXVlcnksdGhpcy5jb250ZXh0LlFVRVJZX1JFU1VMVCksdGltZXN0YW1wOjB9fWFzeW5jIGF3YWl0UXVlcnlBdmFpbGFibGUoZSl7Zm9yKGxldCByPTA7cjwxMDsrK3Ipe2lmKHRoaXMuY29udGV4dC5nZXRRdWVyeVBhcmFtZXRlcihlLnF1ZXJ5LHRoaXMuY29udGV4dC5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFKSlyZXR1cm4gZTthd2FpdCBabigyMDApfX19Y2xhc3MgYnR7Y29uc3RydWN0b3IoKXt0aGlzLnByZXZpb3VzSW1hZ2VXaWR0aD0wLHRoaXMucHJldmlvdXNJbWFnZUhlaWdodD0wLHRoaXMucHJldmlvdXNNYXNrV2lkdGg9eWUsdGhpcy5wcmV2aW91c01hc2tIZWlnaHQ9eWUsdGhpcy5wb3N0UHJvY2Vzc2luZ0VuYWJsZWQ9ITA7Y29uc3QgZT1uZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCkscj1lLmdldENvbnRleHQoIndlYmdsMiIpO2lmKCFyKXRocm93IkZhaWwgdG8gcmV0cmlldmUgd2ViZ2wyIGNvbnRleHQiO3RoaXMuY2FudmFzPWUsdGhpcy5jb250ZXh0PXIsdGhpcy5pbXByb3ZlTWFzaz1uZXcgR3UodGhpcy5jb250ZXh0LHllLHllKX1lbmFibGVQb3N0UHJvY2Vzc2luZygpe3RoaXMucG9zdFByb2Nlc3NpbmdFbmFibGVkPSEwfWRpc2FibGVQb3N0UHJvY2Vzc2luZygpe3RoaXMucG9zdFByb2Nlc3NpbmdFbmFibGVkPSExfWFzeW5jIHByb2ZpbGVXZWJnbChlKXtjb25zdCByPW5ldyAkdSh0aGlzLmNvbnRleHQpO3JldHVybiB0aGlzLnByb2ZpbGVyPXIsci5zdGFydCgpLGF3YWl0IFpuKGUpLHRoaXMucHJvZmlsZXI9dm9pZCAwLHIuc3RvcCgpLHIuZ2V0UmVzb2x2ZWRRdWVyaWVzKCl9YXN5bmMgcmVuZGVyKGUscil7dmFyIGEsbztpZighdGhpcy5waXBlbGluZSl0aHJvdyJtaXNzaW5nIHBpcGVsaW5lIjsodGhpcy5wcmV2aW91c0ltYWdlSGVpZ2h0IT09ZS5oZWlnaHR8fHRoaXMucHJldmlvdXNJbWFnZVdpZHRoIT09ZS53aWR0aCkmJnRoaXMucmVzaXplT3V0cHV0KGUud2lkdGgsZS5oZWlnaHQpLCh0aGlzLnByZXZpb3VzTWFza0hlaWdodCE9PXIuaGVpZ2h0fHx0aGlzLnByZXZpb3VzTWFza1dpZHRoIT09ci53aWR0aCkmJih0aGlzLmltcHJvdmVNYXNrLnJlc2l6ZU91dHB1dChyLndpZHRoLHIuaGVpZ2h0KSx0aGlzLnByZXZpb3VzTWFza1dpZHRoPXIud2lkdGgsdGhpcy5wcmV2aW91c01hc2tIZWlnaHQ9ci5oZWlnaHQpO2NvbnN0IG49InJlbmRlcmVyIjsoYT10aGlzLnByb2ZpbGVyKT09bnVsbHx8YS5wdXNoQ29udGV4dChuKSx0aGlzLmltcHJvdmVNYXNrLnNldFByb2ZpbGVyKHRoaXMucHJvZmlsZXIpLHRoaXMucGlwZWxpbmUuc2V0UHJvZmlsZXIodGhpcy5wcm9maWxlcik7Y29uc3Qgcz1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChyKTtsZXQgaT1zO3JldHVybiB0aGlzLnBvc3RQcm9jZXNzaW5nRW5hYmxlZCYmKHRoaXMuaW1wcm92ZU1hc2suc2V0RGF0YShlLHMpLHRoaXMuaW1wcm92ZU1hc2sucnVuKCksaT10aGlzLmltcHJvdmVNYXNrLm91dHB1dCksdGhpcy5waXBlbGluZS5zZXREYXRhKGUsaSksYXdhaXQgdGhpcy5waXBlbGluZS5ydW4oKSwobz10aGlzLnByb2ZpbGVyKT09bnVsbHx8by5wb3BDb250ZXh0KG4pLHRoaXMuY2FudmFzfXJlc2l6ZU91dHB1dChlLHIpe3ZhciBuO3RoaXMuY2FudmFzLndpZHRoPWUsdGhpcy5jYW52YXMuaGVpZ2h0PXIsKG49dGhpcy5waXBlbGluZSk9PW51bGx8fG4ucmVzaXplT3V0cHV0KGUsciksdGhpcy5wcmV2aW91c0ltYWdlV2lkdGg9ZSx0aGlzLnByZXZpb3VzSW1hZ2VIZWlnaHQ9cn1kZXN0cm95KCl7dmFyIHI7Y29uc3QgZT0ocj10aGlzLmNvbnRleHQpPT1udWxsP3ZvaWQgMDpyLmdldEV4dGVuc2lvbigiV0VCR0xfbG9zZV9jb250ZXh0Iik7ZSYmZS5sb3NlQ29udGV4dCgpfX1jbGFzcyB0cyBleHRlbmRzIGJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnBpcGVsaW5lPW5ldyBKbih0aGlzLmNvbnRleHQpO2NvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHI9ZS5nZXRDb250ZXh0KCJ3ZWJnbDIiKTtpZighcil0aHJvdyJGYWlsIHRvIHJldHJpZXZlIHdlYmdsIGNvbnRleHQiO3RoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNhbnZhcz1lLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNvbnRleHQ9cix0aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXI9bmV3IE11KHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNvbnRleHQsMCwwKX1zZXRCYWNrZ3JvdW5kSW1hZ2UoZSl7dGhpcy5iYWNrZ3JvdW5kSW1hZ2U9ZSx0aGlzLnVwZGF0ZUJhY2tncm91bmRJbWFnZSgpfXVwZGF0ZUJhY2tncm91bmRJbWFnZSgpe2NvbnN0e3dpZHRoOmUsaGVpZ2h0OnJ9PXRoaXMuY2FudmFzO3RoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplci5yZXNpemVPdXRwdXQoZSxyKSx0aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXIuc2V0RGF0YSh0aGlzLmJhY2tncm91bmRJbWFnZSksdGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyLnJ1bigpLHRoaXMucGlwZWxpbmUuaW5wdXRCYWNrZ3JvdW5kSW1hZ2U9dGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzfXJlc2l6ZU91dHB1dChlLHIpe3N1cGVyLnJlc2l6ZU91dHB1dChlLHIpLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNhbnZhcy53aWR0aD1lLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNhbnZhcy5oZWlnaHQ9cix0aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXIucmVzaXplT3V0cHV0KGUsciksdGhpcy51cGRhdGVCYWNrZ3JvdW5kSW1hZ2UoKX1kZXN0cm95KCl7dmFyIHI7Y29uc3QgZT0ocj10aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXJDb250ZXh0KT09bnVsbD92b2lkIDA6ci5nZXRFeHRlbnNpb24oIldFQkdMX2xvc2VfY29udGV4dCIpO2UmJmUubG9zZUNvbnRleHQoKSxzdXBlci5kZXN0cm95KCl9fWNsYXNzIFZ1IGV4dGVuZHMgdHN7c2V0QmFja2dyb3VuZFZpZGVvKGUpe3RoaXMuZnJhbWVSZWFkZXI9ZX1hc3luYyByZW5kZXIoZSxyKXtyZXR1cm4gYXdhaXQgdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSxzdXBlci5yZW5kZXIoZSxyKX1hc3luYyByZWFkTmV4dFZpZGVvRnJhbWUoKXt2YXIgcjtjb25zdCBlPWF3YWl0KChyPXRoaXMuZnJhbWVSZWFkZXIpPT1udWxsP3ZvaWQgMDpyLnJlYWQoKSk7aWYoZSE9bnVsbCYmZS52YWx1ZSl7Y29uc3Qgbj1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChlLnZhbHVlKTt0aGlzLnNldEJhY2tncm91bmRJbWFnZShuKSxlLnZhbHVlLmNsb3NlKCl9fX1jbGFzcyByc3tibHVyQmFja2dyb3VuZChlKXtyZXR1cm4gbmV3IFRpKGUpfWJsdXJTaWxob3VldHRlKGUpe3JldHVybiBuZXcgd2koZSl9aW1hZ2VCYWNrZ3JvdW5kKCl7cmV0dXJuIG5ldyBBaX12aWRlb0JhY2tncm91bmQoKXtyZXR1cm4gbmV3IFZ1fX12YXIgV3U9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKdW5pZm9ybSBzYW1wbGVyMkQgbWFzazsKCnZlYzQgbG9vcCgpOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSBsb29wKCk7IH0KYCxIdT1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIGp1IGV4dGVuZHMgQ2V7Z2V0RGVmaW5lcygpe3JldHVybntSQURJVVM6dGhpcy5vcHRpb25zLnJhZGl1cz8/MX19Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gV3UrdGhpcy5jcmVhdGVMb29wRnVuY3Rpb24oKX1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gSHV9Y3JlYXRlTG9vcEZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5vcHRpb25zLnJhZGl1cz8/MTtyZXR1cm5gCgogICAgICAgIHZlYzQgbG9vcCgpIHsgCiAgICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLDAsMCwwKTsKICAgICAgICAgICAgZmxvYXQgZmFjdG9yU3VtID0gMC47CgogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRSYWRpdXMgPSB2ZWMyKC0ke2V9LikgLyBjYW52YXM7CiAgICAgICAgICAgIHZlYzIgbm9ybWFsaXplZEluY3JlbWVudCA9IHZlYzIoMS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIGRpZmYgPSBub3JtYWxpemVkUmFkaXVzOwogICAgICAgICAgICBmbG9hdCBtYXhMZW5ndGggPSBsZW5ndGgobm9ybWFsaXplZFJhZGl1cyk7CgogICAgICAgICAgICBmb3IoaW50IHk9LSR7ZX07IHk8JHtlKzF9OyArK3kpIHsKICAgICAgICAgICAgICAgIGZvcihpbnQgeD0tJHtlfTsgeDwke2UrMX07ICsreCkgewogICAgICAgICAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9ICgxLi0gdGV4dHVyZTJEKG1hc2ssIF90ZXh0dXJlX2Nvb3JkICsgZGlmZikuYSkgKiAobWF4TGVuZ3RoIC0gbGVuZ3RoKGRpZmYpKSAvIG1heExlbmd0aDsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZmFjdG9yICogdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkICsgZGlmZik7CiAgICAgICAgICAgICAgICAgICAgZmFjdG9yU3VtICs9IGZhY3RvcjsKICAgICAgICAgICAgICAgICAgICBkaWZmLnggKz0gbm9ybWFsaXplZEluY3JlbWVudC54OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlmZi55ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueTsKICAgICAgICAgICAgICAgIGRpZmYueCA9IG5vcm1hbGl6ZWRSYWRpdXMueDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0IC8gZmFjdG9yU3VtOwogICAgICAgIH1gfX1jb25zdCBYdT0xMCxZdT0yLFF1PTg7Y2xhc3MgcXUgZXh0ZW5kcyBicntjb25zdHJ1Y3RvcihlLHIpe3N1cGVyKCksdGhpcy5jb250ZXh0PWUsdGhpcy5yYWRpdXM9cjtjb25zdCBuPXtjb250ZXh0OmUsaGVpZ2h0OmUuY2FudmFzLmhlaWdodCx3aWR0aDplLmNhbnZhcy53aWR0aH07dGhpcy5ibHVyPW5ldyBqdSh7Li4ubixyYWRpdXM6ciwuLi50aGlzLmdldEJsdXJUZXh0dXJlU2l6ZShlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpfSk7Y29uc3Qgcz1uZXcgcHIoey4uLm4sZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSk7dGhpcy5hZGRTdGVwKHtwcm9ncmFtOnRoaXMuYmx1cixwcmV2ZW50UmVzaXplOiEwLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6dihlLHRoaXMuaW5wdXRJbWFnZSksbWFzazp2KGUsdGhpcy5pbnB1dE1hc2spfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06cyxnZXRVbmlmb3JtczooKT0+KHtiYWNrZ3JvdW5kOnYoZSx0aGlzLmJsdXIub3V0cHV0KSxmb3JlZ3JvdW5kOnYoZSx0aGlzLmlucHV0SW1hZ2UpLHRocmVzaG9sZDp2KGUsdGhpcy5pbnB1dE1hc2spfSl9KX1nZXRCbHVyVGV4dHVyZVNpemUoZSxyKXtjb25zdCBuPXRoaXMucmFkaXVzPlh1P1F1Oll1O3JldHVybnt3aWR0aDpNYXRoLm1heCh5ZSxlL24pLGhlaWdodDpNYXRoLm1heCh5ZSxyL24pfX1zZXREYXRhKGUscil7dGhpcy5pbnB1dEltYWdlPWUsdGhpcy5pbnB1dE1hc2s9cn1yZXNpemVPdXRwdXQoZSxyKXtzdXBlci5yZXNpemVPdXRwdXQoZSxyKTtjb25zdCBuPXRoaXMuZ2V0Qmx1clRleHR1cmVTaXplKGUscik7dGhpcy5ibHVyLnJlc2l6ZU91dHB1dChuLndpZHRoLG4uaGVpZ2h0KX19Y2xhc3MgS3UgZXh0ZW5kcyBidHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMucGlwZWxpbmU9bmV3IHF1KHRoaXMuY29udGV4dCxlKSx0aGlzLmRpc2FibGVQb3N0UHJvY2Vzc2luZygpfX1jbGFzcyBKdSBleHRlbmRzIGJye2NvbnN0cnVjdG9yKGUscil7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBuPXtjb250ZXh0OmUsaGVpZ2h0OmUuY2FudmFzLmhlaWdodCx3aWR0aDplLmNhbnZhcy53aWR0aH0scz1uZXcgZXMoey4uLm4scmFkaXVzOnIsdHlwZTpnci5HQVVTU0lBTn0pLGk9bmV3IHByKHsuLi5uLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpzLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6dihlLHRoaXMuaW5wdXRJbWFnZSl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6dihlLHRoaXMuaW5wdXRJbWFnZSksZm9yZWdyb3VuZDp2KGUscy5vdXRwdXQpLHRocmVzaG9sZDp2KGUsdGhpcy5pbnB1dE1hc2spfSl9KX1zZXREYXRhKGUscil7dGhpcy5pbnB1dEltYWdlPWUsdGhpcy5pbnB1dE1hc2s9cn19Y2xhc3MgWnUgZXh0ZW5kcyBidHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMucGlwZWxpbmU9bmV3IEp1KHRoaXMuY29udGV4dCxlKSx0aGlzLmRpc2FibGVQb3N0UHJvY2Vzc2luZygpfX1jbGFzcyBlZiBleHRlbmRzIEpue2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnByZWNpc2VNYXNrRW5hYmxlZD0hMH1zZXQgcmVhZGVyKGUpe3RoaXMuZnJhbWVSZWFkZXI9ZX1hc3luYyBydW4oKXt0aGlzLmZyYW1lUmVhZGVyJiYoYXdhaXQgdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSxhd2FpdCBzdXBlci5ydW4oKSl9YXN5bmMgcmVhZE5leHRWaWRlb0ZyYW1lKCl7dmFyIHI7Y29uc3QgZT1hd2FpdCgocj10aGlzLmZyYW1lUmVhZGVyKT09bnVsbD92b2lkIDA6ci5yZWFkKCkpO2UhPW51bGwmJmUudmFsdWUmJih0aGlzLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGUudmFsdWUpLGUudmFsdWUuY2xvc2UoKSl9fWNsYXNzIHRmIGV4dGVuZHMgYnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMucGlwZWxpbmU9bmV3IGVmKHRoaXMuY29udGV4dCl9c2V0QmFja2dyb3VuZFZpZGVvKGUpe3RoaXMucGlwZWxpbmUucmVhZGVyPWV9fWNsYXNzIG5ze2JsdXJCYWNrZ3JvdW5kKGUpe3JldHVybiBuZXcgS3UoZSl9Ymx1clNpbGhvdWV0dGUoZSl7cmV0dXJuIG5ldyBadShlKX1pbWFnZUJhY2tncm91bmQoKXtyZXR1cm4gbmV3IHRzfXZpZGVvQmFja2dyb3VuZCgpe3JldHVybiBuZXcgdGZ9fWNsYXNzIHJme2NvbnN0cnVjdG9yKGUpe3N3aXRjaChlKXtjYXNlIEtlLkNBTlZBUzp0aGlzLmZhY3Rvcnk9bmV3IHJzO2JyZWFrO2Nhc2UgS2UuV0VCR0w6dGhpcy5mYWN0b3J5PW5ldyBuczticmVhaztkZWZhdWx0OmNvbnN0IHI9X2koKTt0aGlzLmZhY3Rvcnk9ci5zdXBwb3J0ZWQ/bmV3IG5zOm5ldyByc319Ymx1ckJhY2tncm91bmQoZSl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJsdXJCYWNrZ3JvdW5kKGUpfWJsdXJTaWxob3VldHRlKGUpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5ibHVyU2lsaG91ZXR0ZShlKX1pbWFnZUJhY2tncm91bmQoKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuaW1hZ2VCYWNrZ3JvdW5kKCl9dmlkZW9CYWNrZ3JvdW5kKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLnZpZGVvQmFja2dyb3VuZCgpfWdldEZhY3RvcnkoKXtpZighdGhpcy5mYWN0b3J5KXRocm93IkZhY3RvcnkgaXMgbm90IGluaXRpYWxpemVkIjtyZXR1cm4gdGhpcy5mYWN0b3J5fX1jbGFzcyBuZntzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgbixzO3RoaXMucmVuZGVyZXImJnRoaXMucmVuZGVyZXIuZGVzdHJveSgpO2NvbnN0IHI9bmV3IHJmKChuPWUucmVuZGVyaW5nT3B0aW9ucyk9PW51bGw/dm9pZCAwOm4udHlwZSk7c3dpdGNoKGUudHJhbnNmb3JtZXJUeXBlKXtjYXNlIkJhY2tncm91bmRCbHVyIjp0aGlzLnJlbmRlcmVyPXIuYmx1ckJhY2tncm91bmQodGhpcy5nZXRCbHVyU2l6ZShlLnJhZGl1cykpO2JyZWFrO2Nhc2UiU2lsaG91ZXR0ZUJsdXIiOnRoaXMucmVuZGVyZXI9ci5ibHVyU2lsaG91ZXR0ZSh0aGlzLmdldEJsdXJTaXplKGUucmFkaXVzKSk7YnJlYWs7Y2FzZSJWaWRlb0JhY2tncm91bmQiOmNvbnN0IGk9ci52aWRlb0JhY2tncm91bmQoKTt0aGlzLmJhY2tncm91bmRWaWRlbyYmaS5zZXRCYWNrZ3JvdW5kVmlkZW8odGhpcy5iYWNrZ3JvdW5kVmlkZW8pLHRoaXMucmVuZGVyZXI9aTticmVhaztjYXNlIlZpcnR1YWxCYWNrZ3JvdW5kIjpjb25zdCBhPXIuaW1hZ2VCYWNrZ3JvdW5kKCk7dGhpcy5iYWNrZ3JvdW5kSW1hZ2UmJmEuc2V0QmFja2dyb3VuZEltYWdlKHRoaXMuYmFja2dyb3VuZEltYWdlKSx0aGlzLnJlbmRlcmVyPWE7YnJlYWs7ZGVmYXVsdDp0aHJvd2BVbmtub3duIHJlbmRlcmluZyB0eXBlIFske2UudHJhbnNmb3JtZXJUeXBlfV1gfSgocz1lLnJlbmRlcmluZ09wdGlvbnMpPT1udWxsP3ZvaWQgMDpzLnR5cGUpPT09S2UuV0VCR0wmJihlLnJlbmRlcmluZ09wdGlvbnMuc2VsZmllU2VnbWVudGF0aW9uVHlwZT09PWt0LlBSRUNJU0U/dGhpcy5yZW5kZXJlci5lbmFibGVQb3N0UHJvY2Vzc2luZygpOmUucmVuZGVyaW5nT3B0aW9ucy5zZWxmaWVTZWdtZW50YXRpb25UeXBlPT09a3QuRkFTVCYmdGhpcy5yZW5kZXJlci5kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKSl9c2V0VmlkZW9CR1JlYWRhYmxlKGUpe3RoaXMuYmFja2dyb3VuZFZpZGVvPWUuZ2V0UmVhZGVyKCk7Y29uc3Qgcj10aGlzLnJlbmRlcmVyO3IhPW51bGwmJnIuc2V0QmFja2dyb3VuZFZpZGVvJiZyLnNldEJhY2tncm91bmRWaWRlbyh0aGlzLmJhY2tncm91bmRWaWRlbyl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7Y29uc3Qgcj10aGlzLnJlbmRlcmVyO3IhPW51bGwmJnIuc2V0QmFja2dyb3VuZEltYWdlJiZyLnNldEJhY2tncm91bmRJbWFnZShlKSx0aGlzLmJhY2tncm91bmRJbWFnZT1lfWFzeW5jIHByb2Nlc3MoZSxyKXtpZih0aGlzLnJlbmRlcmVyKXJldHVybiB0aGlzLnJlbmRlcmVyLnJlbmRlcihlLHIpfWFzeW5jIHJlc2l6ZUZvcmVncm91bmQoZSxyKXt9Z2V0Qmx1clNpemUoZT1xZS5Mb3cpe3N3aXRjaChlKXtjYXNlIHFlLkxvdzpyZXR1cm4gNTtjYXNlIHFlLkhpZ2g6cmV0dXJuIDEyfXJldHVybiBlfWFzeW5jIHByb2ZpbGUoZSl7dmFyIHI7cmV0dXJuKChyPXRoaXMucmVuZGVyZXIpPT1udWxsP3ZvaWQgMDpyLnByb2ZpbGVXZWJnbChlKSk/P1tdfX1jb25zdCBzZj0uMSxvZj0uNyxhZj0iaHR0cHM6Ly9kM29wcWptcXp4ZjA1Ny5jbG91ZGZyb250Lm5ldC9tbC92b25hZ2Vfc2VsZmllX3NlZ21lbnRlci9mbG9hdDE2L3YxL3ZvbmFnZV9zZWxmaWVfc2VnbWVudGVyLnRmbGl0ZSI7Y2xhc3MgY2Z7Y29uc3RydWN0b3IoKXt0aGlzLmNhbnZhcz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCksdGhpcy5jb250ZXh0PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSksdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5ncHVEZWxlZ2F0ZT0hMH1hc3luYyBjcmVhdGVJbWFnZVNlZ21lbnRlcigpe2lmKCF0aGlzLkltYWdlU2VnbWVudGVyfHwhdGhpcy53YXNtRmlsZXNldCl7Y29uc29sZS53YXJuKCJNZWRpYXBpcGUgb2JqZWN0cyBub3QgbG9hZGVkIik7cmV0dXJufXRoaXMuaW1hZ2VTZWdtZW50ZXI9YXdhaXQgdGhpcy5JbWFnZVNlZ21lbnRlci5jcmVhdGVGcm9tT3B0aW9ucyh0aGlzLndhc21GaWxlc2V0LHtiYXNlT3B0aW9uczp7bW9kZWxBc3NldFBhdGg6dGhpcy5tb2RlbEFzc2V0VXJpUGF0aCxkZWxlZ2F0ZTp0aGlzLmdwdURlbGVnYXRlPyJHUFUiOiJDUFUifSxydW5uaW5nTW9kZToiVklERU8iLG91dHB1dENhdGVnb3J5TWFzazohMCxvdXRwdXRDb25maWRlbmNlTWFza3M6ITB9KX1hc3luYyBsb2FkTWVkaWFwaXBlQXNzZXRzKGUscil7dGhpcy5tb2RlbEFzc2V0VXJpUGF0aD1lfHxhZjtjb25zdCBuPXI/YCR7cn0vdGFzay12aXNpb24uanNgOiJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BtZWRpYXBpcGUvdGFza3MtdmlzaW9uQDAuMTAuMjAvK2VzbSIscz1yP2Ake3J9L3dhc21gOiJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BtZWRpYXBpcGUvdGFza3MtdmlzaW9uQDAuMTAuMjAvd2FzbSIse0ZpbGVzZXRSZXNvbHZlcjppLEltYWdlU2VnbWVudGVyOmF9PWF3YWl0IGltcG9ydChuKTt0aGlzLkltYWdlU2VnbWVudGVyPWEsdGhpcy53YXNtRmlsZXNldD1hd2FpdCBpLmZvclZpc2lvblRhc2tzKHMpfWFzeW5jIGluaXQoZSxyLG4pe249PT0hMSYmKHRoaXMuZ3B1RGVsZWdhdGU9ITEpLGF3YWl0IHRoaXMubG9hZE1lZGlhcGlwZUFzc2V0cyhlLHIpLGdsb2JhbFRoaXMuZG9jdW1lbnQ9e30sYXdhaXQgdGhpcy5jcmVhdGVJbWFnZVNlZ21lbnRlcigpfWFzeW5jIHByb2Nlc3MoZSl7dmFyIGE7aWYoIXRoaXMuaW1hZ2VTZWdtZW50ZXIpe2NvbnNvbGUud2FybigiSW1hZ2VTZWdtZW50ZXIgaW5zdGFuY2Ugbm90IGF2YWlsYWJsZSIpO3JldHVybn0odGhpcy53aWR0aCE9PWUud2lkdGh8fHRoaXMuaGVpZ2h0IT09ZS5oZWlnaHQpJiYodGhpcy5jYW52YXMud2lkdGg9dGhpcy53aWR0aD1lLndpZHRoLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLmhlaWdodD1lLmhlaWdodCx0aGlzLm1hc2smJih0aGlzLm1hc2s9bmV3IEltYWdlRGF0YSh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSkpLHRoaXMubWFza3x8KHRoaXMubWFzaz1uZXcgSW1hZ2VEYXRhKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpKSx0aGlzLmNvbnRleHQuZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpO2NvbnN0IHI9RGF0ZS5ub3coKTtsZXQgbjt0cnl7KGE9dGhpcy5pbWFnZVNlZ21lbnRlcik9PW51bGx8fGEuc2VnbWVudEZvclZpZGVvKHRoaXMuY29udGV4dC5nZXRJbWFnZURhdGEoMCwwLGUud2lkdGgsZS5oZWlnaHQpLHIsbz0+e3ZhciB1O2NvbnN0IGM9KHU9by5jb25maWRlbmNlTWFza3MpPT1udWxsP3ZvaWQgMDp1WzBdO249Yz09bnVsbD92b2lkIDA6Yy5nZXRBc0Zsb2F0MzJBcnJheSgpfSl9Y2F0Y2h7YXdhaXQgdGhpcy5jcmVhdGVJbWFnZVNlZ21lbnRlcigpO3JldHVybn1pZighbilyZXR1cm47aWYoIXRoaXMucHJldmlvdXNDb25maWRlbmNlTWFzayl7dGhpcy5wcmV2aW91c0NvbmZpZGVuY2VNYXNrPW4uc2xpY2UoKTtyZXR1cm59Y29uc3Qgcz1uLm1hcCgobyxjKT0+e3ZhciBmO2NvbnN0IHU9KGY9dGhpcy5wcmV2aW91c0NvbmZpZGVuY2VNYXNrKT09bnVsbD92b2lkIDA6ZltjXTtyZXR1cm4gdSE9PXZvaWQgMD90aGlzLmJsZW5kKHUsbyk6b30pLGk9WzI1NSwwLDBdO2ZvcihsZXQgbz0wO288KHM9PW51bGw/dm9pZCAwOnMubGVuZ3RoKTtvKyspe2NvbnN0IGM9MS1zW29dO2M+c2Y/KGM8b2Y/KHRoaXMubWFzay5kYXRhW28qNF09aVswXSpjLHRoaXMubWFzay5kYXRhW28qNCszXT0yNTUqYyk6KHRoaXMubWFzay5kYXRhW28qNF09aVswXSx0aGlzLm1hc2suZGF0YVtvKjQrM109MjU1KSx0aGlzLm1hc2suZGF0YVtvKjQrMV09aVsxXSx0aGlzLm1hc2suZGF0YVtvKjQrMl09aVsyXSk6dGhpcy5tYXNrLmRhdGFbbyo0XT10aGlzLm1hc2suZGF0YVtvKjQrMV09dGhpcy5tYXNrLmRhdGFbbyo0KzJdPXRoaXMubWFzay5kYXRhW28qNCszXT0wfXJldHVybiB0aGlzLnByZXZpb3VzQ29uZmlkZW5jZU1hc2s9cy5zbGljZSgpLHRoaXMubWFza31pc0dwdVN1cHBvcnRlZCgpe3JldHVybiEwfWJsZW5kKGUscil7Y29uc3Qgcz0tLjc0ODY5OSxpPS01Ny44MDUxLGE9MjkxLjMwOSxvPS02MjQuNzE3LGM9ci0uNSx1PWMqYyxmPTEtTWF0aC5taW4oMSx1Kig1LjY4ODQyK3UqKHMrdSooaSt1KihhK3UqbykpKSkpO3JldHVybiByKyhlLXIpKihmKi45KX19Y2xhc3MgdWZ7Y29uc3RydWN0b3IoKXt0aGlzLnJlcG9ydGVyPW5ldyB4aSx0aGlzLmlzRW5hYmxlZD0hMH1hc3luYyBpbml0KGUscil7dmFyIG4sczt0aGlzLnNlbGZpZVNlZ21lbnRhdGlvbj1uZXcgY2YsYXdhaXQoKHM9dGhpcy5zZWxmaWVTZWdtZW50YXRpb24pPT1udWxsP3ZvaWQgMDpzLmluaXQoci5tb2RlbEFzc2V0VXJpUGF0aCxyLm1lZGlhcGlwZUJhc2VBc3NldHNVcmksKG49ci5zZWdtZW50YXRpb25PcHRpb25zKT09bnVsbD92b2lkIDA6bi5ncHVTdXBwb3J0KSksdGhpcy5iYWNrZ3JvdW5kRmlsdGVyPW5ldyBuZix0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJDcmVhdGUifSl9YXN5bmMgdHJhbnNmb3JtKGUscil7dmFyIG8sYztpZighdGhpcy5pc0VuYWJsZWQpcmV0dXJuIHIuZW5xdWV1ZShlKTtsZXQgbjtjb25zdCBzPWUudGltZXN0YW1wPz8wLGk9YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZSksYT1hd2FpdCgobz10aGlzLnNlbGZpZVNlZ21lbnRhdGlvbik9PW51bGw/dm9pZCAwOm8ucHJvY2VzcyhpKSk7YSYmKG49YXdhaXQoKGM9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6Yy5wcm9jZXNzKGksYSkpKSxuPyhlLmNsb3NlKCksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKG4se3RpbWVzdGFtcDpzLGFscGhhOiJkaXNjYXJkIn0pKSk6ci5lbnF1ZXVlKGUpfWFzeW5jIHNldEJhY2tncm91bmRPcHRpb25zKGUpe3ZhciByO3RoaXMuYmFja2dyb3VuZE9wdGlvbnM9ZSxhd2FpdCgocj10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpyLnNldEJhY2tncm91bmRPcHRpb25zKGUpKSx0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJVcGRhdGUifSl9YXN5bmMgc2V0VmlkZW9CR1JlYWRhYmxlKGUpe3ZhciByO2F3YWl0KChyPXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnIuc2V0VmlkZW9CR1JlYWRhYmxlKGUpKX1hc3luYyBzZXRWaXJ0dWFsQkdJbWFnZShlKXt2YXIgcjthd2FpdCgocj10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpyLnNldFZpcnR1YWxCR0ltYWdlKGUpKX1hc3luYyBwcm9maWxlKGUpe3ZhciByO3JldHVybigocj10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpyLnByb2ZpbGUoZSkpPz9bXX1nZXRUcmFuc2Zvcm1lclR5cGUoKXt2YXIgZTtyZXR1cm4oKGU9dGhpcy5iYWNrZ3JvdW5kT3B0aW9ucyk9PW51bGw/dm9pZCAwOmUudHJhbnNmb3JtZXJUeXBlKT8/IlVuZGVmaW5lZCJ9ZW5hYmxlKCl7dGhpcy5pc0VuYWJsZWQ9ITB9ZGlzYWJsZSgpe3RoaXMuaXNFbmFibGVkPSExfXJlcG9ydChlKXt2YXIgcjt0aGlzLnJlcG9ydGVyLnNlbmQoe3ZlcnNpb246RWksYWN0aW9uOiJNbFRyYW5zZm9ybWVycyIsdHJhbnNmb3JtZXJUeXBlOihyPXRoaXMuYmFja2dyb3VuZE9wdGlvbnMpPT1udWxsP3ZvaWQgMDpyLnRyYW5zZm9ybWVyVHlwZSxjb25maWc6SlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrZ3JvdW5kT3B0aW9ucyksLi4uZX0pfX1jb25zdCB4cj1jbGFzcyB4cntjb25zdHJ1Y3Rvcigpe3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyPW5ldyB1Zix0aGlzLm1lZGlhUHJvY2Vzc29yPW5ldyBRcyx0aGlzLnJhdGU9MzAsdGhpcy5ldmVudHNRdWV1ZT1bXSx0aGlzLmZyYW1lVHJhbnNmb3JtTGF0ZW5jeU1zPVtdfWFzeW5jIGluaXQoZSxyKXt0aGlzLmZyYW1lVHJhbnNmb3JtTGF0ZW5jeU1zPVtdLGF3YWl0IHRoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyLmluaXQoZSxyKSxhd2FpdCB0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYW5zZm9ybWVycyhbdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXJdKSx0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMucmF0ZSksdGhpcy5tZWRpYVByb2Nlc3Nvci5vbkFueSgobixzKT0+e3RoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I/KHRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3Ioe25hbWU6bixkYXRhOnN9KSx0aGlzLnJlc29sdmVPbk1lZGlhUHJvY2Vzc29yPXZvaWQgMCk6dGhpcy5ldmVudHNRdWV1ZS5wdXNoKHtuYW1lOm4sZGF0YTpzfSl9KX1lbmFibGUoKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5lbmFibGUoKX1kaXNhYmxlKCl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuZGlzYWJsZSgpfWFzeW5jIG9uTWVkaWFQcm9jZXNzb3JFdmVudCgpe3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZShlPT57dGhpcy5ldmVudHNRdWV1ZS5sZW5ndGg+MD9lKHRoaXMuZXZlbnRzUXVldWUuc2hpZnQoKSk6dGhpcy5yZXNvbHZlT25NZWRpYVByb2Nlc3Nvcj1lfSl9YXN5bmMgc2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy5yYXRlPWUsdGhpcy5tZWRpYVByb2Nlc3Nvci5zZXRUcmFja0V4cGVjdGVkUmF0ZShlKX1hc3luYyB0cmFuc2Zvcm0oZSxyKXtsZXQgbj1wZXJmb3JtYW5jZS5ub3coKTt0aGlzLm1lZGlhUHJvY2Vzc29yLnRyYW5zZm9ybShlLHIpLHRoaXMuZnJhbWVUcmFuc2Zvcm1MYXRlbmN5TXMucHVzaChwZXJmb3JtYW5jZS5ub3coKS1uKX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgcjthd2FpdCgocj10aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lcik9PW51bGw/dm9pZCAwOnIuc2V0QmFja2dyb3VuZE9wdGlvbnMoZSkpfXNldFZpZGVvQkdSZWFkYWJsZShlKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5zZXRWaWRlb0JHUmVhZGFibGUoZSl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0VmlydHVhbEJHSW1hZ2UoZSl9YXN5bmMgdGVybWluYXRlKCl7YXdhaXQgdGhpcy5tZWRpYVByb2Nlc3Nvci5kZXN0cm95KCk7Y29uc3Qgcj10aGlzLmZyYW1lVHJhbnNmb3JtTGF0ZW5jeU1zLnJlZHVjZSgobixzKT0+bitzLDApL3RoaXMuZnJhbWVUcmFuc2Zvcm1MYXRlbmN5TXMubGVuZ3RofHwwO2NvbnNvbGUubG9nKGBUcmFuc2Zvcm0gbGF0ZW5jeSBhdmVyYWdlIGlzOiAke3J9IG1zYCl9c2V0Vm9uYWdlTWV0YWRhdGEoZSl7VnMoZSl9YXN5bmMgcHJvZmlsZShlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIucHJvZmlsZShlKSl9fTt1cygiUHJvY2Vzc29yV29ya2VyIix4cik7bGV0IHNzPXhyfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvY2Vzc29yLXdvcmtlci1EME9CWVNnRC5qcy5tYXAK", V3 = (r) => Uint8Array.from(atob(r), (e) => e.charCodeAt(0)), Ks = typeof self < "u" && self.Blob && new Blob([V3(s2)], { type: "text/javascript;charset=utf-8" });
|
|
23098
|
+
const s2 = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGd0KHQsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCByPWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHJbdF18fChyW3RdPWUpLHJbdF19Y29uc3QgX3I9Z3QoImdsb2JhbHMiLHt9KTt2YXIgb2U9KHQ9Pih0LklOSVQ9IklOSVQiLHQuRk9SV0FSRD0iRk9SV0FSRCIsdC5URVJNSU5BVEU9IlRFUk1JTkFURSIsdC5HTE9CQUxTX1NZTkM9IkdMT0JBTFNfU1lOQyIsdC5FVkVOVD0iRVZFTlQiLHQpKShvZXx8e30pO2Z1bmN0aW9uIGlzKHQpe3JldHVybltJbWFnZUJpdG1hcCxSZWFkYWJsZVN0cmVhbSxXcml0YWJsZVN0cmVhbV0uc29tZShyPT50IGluc3RhbmNlb2Ygcil9ZnVuY3Rpb24gYmUodCxlKXtjb25zdHtpZDpyLHR5cGU6bn09dCxzPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnIsdHlwZTpuLHJlc3VsdDplfSxzLmZpbHRlcihpPT5pcyhpKSkpfWd0KCJ3b3JrZXJpemVkIix7fSk7ZnVuY3Rpb24gVHIoKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWZ1bmN0aW9uIEJlKHQsZSl7aWYoQXJyYXkuaXNBcnJheShlKSllLnNwbGljZSgwLGUubGVuZ3RoKTtlbHNlIGlmKHR5cGVvZiBlPT0ib2JqZWN0Iilmb3IoY29uc3QgciBpbiBlKWRlbGV0ZSBlW3JdO2Zvcihjb25zdCByIGluIHQpQXJyYXkuaXNBcnJheSh0W3JdKT8oZVtyXT1bXSxCZSh0W3JdLGVbcl0pKTp0eXBlb2YgdFtyXT09Im9iamVjdCI/KGVbcl09e30sQmUodFtyXSxlW3JdKSk6ZVtyXT10W3JdfWNvbnN0IFU9bmV3IFdlYWtNYXAsWT1uZXcgV2Vha01hcCxCPW5ldyBXZWFrTWFwLERlPVN5bWJvbCgiYW55UHJvZHVjZXIiKSx3cj1Qcm9taXNlLnJlc29sdmUoKSxNZT1TeW1ib2woImxpc3RlbmVyQWRkZWQiKSxVZT1TeW1ib2woImxpc3RlbmVyUmVtb3ZlZCIpO2xldCBOZT0hMSx4dD0hMTtmdW5jdGlvbiBhZSh0KXtpZih0eXBlb2YgdCE9InN0cmluZyImJnR5cGVvZiB0IT0ic3ltYm9sIiYmdHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBUeXBlRXJyb3IoImBldmVudE5hbWVgIG11c3QgYmUgYSBzdHJpbmcsIHN5bWJvbCwgb3IgbnVtYmVyIil9ZnVuY3Rpb24gT2UodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gY2UodCxlKXtjb25zdCByPVkuZ2V0KHQpO2lmKHIuaGFzKGUpKXJldHVybiByLmdldChlKX1mdW5jdGlvbiBnZSh0LGUpe2NvbnN0IHI9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCJ8fHR5cGVvZiBlPT0ibnVtYmVyIj9lOkRlLG49Qi5nZXQodCk7aWYobi5oYXMocikpcmV0dXJuIG4uZ2V0KHIpfWZ1bmN0aW9uIG9zKHQsZSxyKXtjb25zdCBuPUIuZ2V0KHQpO2lmKG4uaGFzKGUpKWZvcihjb25zdCBzIG9mIG4uZ2V0KGUpKXMuZW5xdWV1ZShyKTtpZihuLmhhcyhEZSkpe2NvbnN0IHM9UHJvbWlzZS5hbGwoW2Uscl0pO2Zvcihjb25zdCBpIG9mIG4uZ2V0KERlKSlpLmVucXVldWUocyl9fWZ1bmN0aW9uIEFyKHQsZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCByPSExLG49KCk9Pnt9LHM9W107Y29uc3QgaT17ZW5xdWV1ZShhKXtzLnB1c2goYSksbigpfSxmaW5pc2goKXtyPSEwLG4oKX19O2Zvcihjb25zdCBhIG9mIGUpe2xldCBvPWdlKHQsYSk7b3x8KG89bmV3IFNldCxCLmdldCh0KS5zZXQoYSxvKSksby5hZGQoaSl9cmV0dXJue2FzeW5jIG5leHQoKXtyZXR1cm4gcz9zLmxlbmd0aD09PTA/cj8ocz12b2lkIDAsdGhpcy5uZXh0KCkpOihhd2FpdCBuZXcgUHJvbWlzZShhPT57bj1hfSksdGhpcy5uZXh0KCkpOntkb25lOiExLHZhbHVlOmF3YWl0IHMuc2hpZnQoKX06e2RvbmU6ITB9fSxhc3luYyByZXR1cm4oYSl7cz12b2lkIDA7Zm9yKGNvbnN0IG8gb2YgZSl7Y29uc3QgYz1nZSh0LG8pO2MmJihjLmRlbGV0ZShpKSxjLnNpemU9PT0wJiZCLmdldCh0KS5kZWxldGUobykpfXJldHVybiBuKCksYXJndW1lbnRzLmxlbmd0aD4wP3tkb25lOiEwLHZhbHVlOmF3YWl0IGF9Ontkb25lOiEwfX0sW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19ZnVuY3Rpb24gdnIodCl7aWYodD09PXZvaWQgMClyZXR1cm4gU3I7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MiKTtmb3IoY29uc3QgZSBvZiB0KWlmKCFTci5pbmNsdWRlcyhlKSl0aHJvdyB0eXBlb2YgZSE9InN0cmluZyI/bmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBlbGVtZW50IG11c3QgYmUgYSBzdHJpbmciKTpuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IEVtaXR0ZXJ5IG1ldGhvZGApO3JldHVybiB0fWNvbnN0IHVlPXQ9PnQ9PT1NZXx8dD09PVVlO2Z1bmN0aW9uIExlKHQsZSxyKXtpZih1ZShlKSl0cnl7TmU9ITAsdC5lbWl0KGUscil9ZmluYWxseXtOZT0hMX19Y2xhc3MgZmV7c3RhdGljIG1peGluKGUscil7cmV0dXJuIHI9dnIociksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgYSBvZiByKWlmKG4ucHJvdG90eXBlW2FdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHthfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBzKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IGZlfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6c30pO2NvbnN0IGk9YT0+ZnVuY3Rpb24oLi4ubyl7cmV0dXJuIHRoaXNbZV1bYV0oLi4ubyl9O2Zvcihjb25zdCBhIG9mIHIpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITEsdmFsdWU6aShhKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7dmFyIGUscjtpZih0eXBlb2YoKGU9Z2xvYmFsVGhpcy5wcm9jZXNzKT09bnVsbD92b2lkIDA6ZS5lbnYpIT0ib2JqZWN0IilyZXR1cm4geHQ7Y29uc3R7ZW52Om59PShyPWdsb2JhbFRoaXMucHJvY2VzcykhPW51bGw/cjp7ZW52Ont9fTtyZXR1cm4gbi5ERUJVRz09PSJlbWl0dGVyeSJ8fG4uREVCVUc9PT0iKiJ8fHh0fXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7eHQ9ZX1jb25zdHJ1Y3RvcihlPXt9KXt2YXIgcjtVLnNldCh0aGlzLG5ldyBTZXQpLFkuc2V0KHRoaXMsbmV3IE1hcCksQi5zZXQodGhpcyxuZXcgTWFwKSxCLmdldCh0aGlzKS5zZXQoRGUsbmV3IFNldCksdGhpcy5kZWJ1Zz0ocj1lLmRlYnVnKSE9bnVsbD9yOnt9LHRoaXMuZGVidWcuZW5hYmxlZD09PXZvaWQgMCYmKHRoaXMuZGVidWcuZW5hYmxlZD0hMSksdGhpcy5kZWJ1Zy5sb2dnZXJ8fCh0aGlzLmRlYnVnLmxvZ2dlcj0obixzLGksYSk9Pnt0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaHthPWBPYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXMgZmFpbGVkIHRvIHN0cmluZ2lmeTogJHtPYmplY3Qua2V5cyhhKS5qb2luKCIsIil9YH0odHlwZW9mIGk9PSJzeW1ib2wifHx0eXBlb2YgaT09Im51bWJlciIpJiYoaT1pLnRvU3RyaW5nKCkpO2NvbnN0IG89bmV3IERhdGUsYz1gJHtvLmdldEhvdXJzKCl9OiR7by5nZXRNaW51dGVzKCl9OiR7by5nZXRTZWNvbmRzKCl9LiR7by5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHtjfV1bZW1pdHRlcnk6JHtufV1bJHtzfV0gRXZlbnQgTmFtZTogJHtpfQoJZGF0YTogJHthfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSxyLG4peyhmZS5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUscixuKX1vbihlLHIpe09lKHIpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKXthZShuKTtsZXQgcz1jZSh0aGlzLG4pO3N8fChzPW5ldyBTZXQsWS5nZXQodGhpcykuc2V0KG4scykpLHMuYWRkKHIpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLHVlKG4pfHxMZSh0aGlzLE1lLHtldmVudE5hbWU6bixsaXN0ZW5lcjpyfSl9cmV0dXJuIHRoaXMub2ZmLmJpbmQodGhpcyxlLHIpfW9mZihlLHIpe09lKHIpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKXthZShuKTtjb25zdCBzPWNlKHRoaXMsbik7cyYmKHMuZGVsZXRlKHIpLHMuc2l6ZT09PTAmJlkuZ2V0KHRoaXMpLmRlbGV0ZShuKSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSx1ZShuKXx8TGUodGhpcyxVZSx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6cn0pfX1vbmNlKGUpe2xldCByO2NvbnN0IG49bmV3IFByb21pc2Uocz0+e3I9dGhpcy5vbihlLGk9PntyKCkscyhpKX0pfSk7cmV0dXJuIG4ub2ZmPXIsbn1ldmVudHMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCByIG9mIGUpYWUocik7cmV0dXJuIEFyKHRoaXMsZSl9YXN5bmMgZW1pdChlLHIpe3ZhciBuO2lmKGFlKGUpLHVlKGUpJiYhTmUpdGhyb3cgbmV3IFR5cGVFcnJvcigiYGV2ZW50TmFtZWAgY2Fubm90IGJlIG1ldGEgZXZlbnQgYGxpc3RlbmVyQWRkZWRgIG9yIGBsaXN0ZW5lclJlbW92ZWRgIik7dGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSxyKSxvcyh0aGlzLGUscik7Y29uc3Qgcz0obj1jZSh0aGlzLGUpKSE9bnVsbD9uOm5ldyBTZXQsaT1VLmdldCh0aGlzKSxhPVsuLi5zXSxvPXVlKGUpP1tdOlsuLi5pXTthd2FpdCB3cixhd2FpdCBQcm9taXNlLmFsbChbLi4uYS5tYXAoYXN5bmMgYz0+e2lmKHMuaGFzKGMpKXJldHVybiBjKHIpfSksLi4uby5tYXAoYXN5bmMgYz0+e2lmKGkuaGFzKGMpKXJldHVybiBjKGUscil9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSxyKXt2YXIgbjtpZihhZShlKSx1ZShlKSYmIU5lKXRocm93IG5ldyBUeXBlRXJyb3IoImBldmVudE5hbWVgIGNhbm5vdCBiZSBtZXRhIGV2ZW50IGBsaXN0ZW5lckFkZGVkYCBvciBgbGlzdGVuZXJSZW1vdmVkYCIpO3RoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUscik7Y29uc3Qgcz0obj1jZSh0aGlzLGUpKSE9bnVsbD9uOm5ldyBTZXQsaT1VLmdldCh0aGlzKSxhPVsuLi5zXSxvPVsuLi5pXTthd2FpdCB3cjtmb3IoY29uc3QgYyBvZiBhKXMuaGFzKGMpJiZhd2FpdCBjKHIpO2Zvcihjb25zdCBjIG9mIG8paS5oYXMoYykmJmF3YWl0IGMoZSxyKX1vbkFueShlKXtyZXR1cm4gT2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxVLmdldCh0aGlzKS5hZGQoZSksTGUodGhpcyxNZSx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBBcih0aGlzKX1vZmZBbnkoZSl7T2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLExlKHRoaXMsVWUse2xpc3RlbmVyOmV9KSxVLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCByIG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHIsdm9pZCAwKSx0eXBlb2Ygcj09InN0cmluZyJ8fHR5cGVvZiByPT0ic3ltYm9sInx8dHlwZW9mIHI9PSJudW1iZXIiKXtjb25zdCBuPWNlKHRoaXMscik7biYmbi5jbGVhcigpO2NvbnN0IHM9Z2UodGhpcyxyKTtpZihzKXtmb3IoY29uc3QgaSBvZiBzKWkuZmluaXNoKCk7cy5jbGVhcigpfX1lbHNle1UuZ2V0KHRoaXMpLmNsZWFyKCk7Zm9yKGNvbnN0W24sc11vZiBZLmdldCh0aGlzKS5lbnRyaWVzKCkpcy5jbGVhcigpLFkuZ2V0KHRoaXMpLmRlbGV0ZShuKTtmb3IoY29uc3RbbixzXW9mIEIuZ2V0KHRoaXMpLmVudHJpZXMoKSl7Zm9yKGNvbnN0IGkgb2YgcylpLmZpbmlzaCgpO3MuY2xlYXIoKSxCLmdldCh0aGlzKS5kZWxldGUobil9fX1saXN0ZW5lckNvdW50KGUpe3ZhciByLG4scyxpLGEsbztlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IGM9MDtmb3IoY29uc3QgdSBvZiBlKXtpZih0eXBlb2YgdT09InN0cmluZyIpe2MrPVUuZ2V0KHRoaXMpLnNpemUrKChuPShyPWNlKHRoaXMsdSkpPT1udWxsP3ZvaWQgMDpyLnNpemUpIT1udWxsP246MCkrKChpPShzPWdlKHRoaXMsdSkpPT1udWxsP3ZvaWQgMDpzLnNpemUpIT1udWxsP2k6MCkrKChvPShhPWdlKHRoaXMpKT09bnVsbD92b2lkIDA6YS5zaXplKSE9bnVsbD9vOjApO2NvbnRpbnVlfXR5cGVvZiB1PCJ1IiYmYWUodSksYys9VS5nZXQodGhpcykuc2l6ZTtmb3IoY29uc3QgZiBvZiBZLmdldCh0aGlzKS52YWx1ZXMoKSljKz1mLnNpemU7Zm9yKGNvbnN0IGYgb2YgQi5nZXQodGhpcykudmFsdWVzKCkpYys9Zi5zaXplfXJldHVybiBjfWJpbmRNZXRob2RzKGUscil7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3I9dnIocik7Zm9yKGNvbnN0IG4gb2Ygcil7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fWNvbnN0IFNyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZlLnByb3RvdHlwZSkuZmlsdGVyKHQ9PnQhPT0iY29uc3RydWN0b3IiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZmUsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpNZSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmZSwibGlzdGVuZXJSZW1vdmVkIix7dmFsdWU6VWUsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTtmdW5jdGlvbiBhcyh0KXtyZXR1cm4gdC5vbkFueSYmdC5lbWl0fWFzeW5jIGZ1bmN0aW9uIGNzKHQsZSl7Y29uc3R7ZnVuY3Rpb25OYW1lOnIsYXJnczpufT10O2lmKCFlLmluc3RhbmNlKXRocm93Imluc3RhbmNlIG5vdCBpbml0aWFsaXplZCI7aWYoIXIpdGhyb3cibWlzc2luZyBmdW5jdGlvbiBuYW1lIHRvIGNhbGwiO2lmKCFlLmluc3RhbmNlW3JdKXRocm93YHVuZGVmaW5lZCBmdW5jdGlvbiBbJHtyfV0gaW4gY2xhc3MgJHtlLmluc3RhbmNlLmNvbnN0cnVjdG9yLndvcmtlcklkfWA7YmUodCxhd2FpdCBlLmluc3RhbmNlW3JdKC4uLm4/P1tdKSl9Y29uc3QgSXI9Z3QoInJlZ2lzdGVyZWRXb3JrZXJzIix7fSk7ZnVuY3Rpb24gdXModCxlKXtlLndvcmtlcklkPXQsVHIoKSYmKElyW2Uud29ya2VySWRdPWUpfWZ1bmN0aW9uIGZzKHQsZSl7aWYoIXQuYXJncyl0aHJvdyJNaXNzaW5nIGNsYXNzTmFtZSB3aGlsZSBpbml0aWFsaXppbmcgd29ya2VyIjtjb25zdFtyLG5dPXQuYXJncyxzPUlyW3JdO2lmKHMpZS5pbnN0YW5jZT1uZXcgcyh0LmFyZ3Muc2xpY2UoMSkpO2Vsc2UgdGhyb3dgdW5rbm93biB3b3JrZXIgY2xhc3MgJHtyfWA7QmUobixfciksYXMoZS5pbnN0YW5jZSkmJmUuaW5zdGFuY2Uub25BbnkoKGksYSk9PntiZSh7dHlwZTpvZS5FVkVOVH0se25hbWU6aSxkYXRhOmF9KX0pLGJlKHQsdHlwZW9mIGUuaW5zdGFuY2UhPT12b2lkIDApfWFzeW5jIGZ1bmN0aW9uIGxzKHQsZSl7Y29uc3R7YXJnczpyfT10O2lmKCFlLmluc3RhbmNlKXRocm93Imluc3RhbmNlIG5vdCBpbml0aWFsaXplZCI7bGV0IG47ZS5pbnN0YW5jZS50ZXJtaW5hdGUmJihuPWF3YWl0IGUuaW5zdGFuY2UudGVybWluYXRlKC4uLnI/P1tdKSksYmUodCxuKX1mdW5jdGlvbiBkcyh0KXtpZighdC5hcmdzKXRocm93Ik1pc3NpbmcgZ2xvYmFscyB3aGlsZSBzeW5jaW5nIjtCZSh0LmFyZ3NbMF0sX3IpLGJlKHQse30pfWZ1bmN0aW9uIGhzKCl7Y29uc3QgdD17fTtvbm1lc3NhZ2U9YXN5bmMgZT0+e2NvbnN0IHI9ZS5kYXRhO3N3aXRjaChyLnR5cGUpe2Nhc2Ugb2UuSU5JVDpmcyhyLHQpO2JyZWFrO2Nhc2Ugb2UuRk9SV0FSRDpjcyhyLHQpO2JyZWFrO2Nhc2Ugb2UuVEVSTUlOQVRFOmxzKHIsdCk7YnJlYWs7Y2FzZSBvZS5HTE9CQUxTX1NZTkM6ZHMocik7YnJlYWt9fX1UcigpJiZocygpO2NsYXNzIER7fUQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxELmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTtmdW5jdGlvbiBtcyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fWNvbnN0IE49bmV3IFdlYWtNYXAsemU9bmV3IFdlYWtNYXAseGU9bmV3IFdlYWtNYXAsRXQ9U3ltYm9sKCJhbnlQcm9kdWNlciIpLFJyPVByb21pc2UucmVzb2x2ZSgpLEdlPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLCRlPVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IF90PSExO2Z1bmN0aW9uIGxlKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIiYmdHlwZW9mIHQhPSJzeW1ib2wiKXRocm93IG5ldyBUeXBlRXJyb3IoImV2ZW50TmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sIil9ZnVuY3Rpb24gVmUodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gZGUodCxlKXtjb25zdCByPXplLmdldCh0KTtyZXR1cm4gci5oYXMoZSl8fHIuc2V0KGUsbmV3IFNldCksci5nZXQoZSl9ZnVuY3Rpb24gRWUodCxlKXtjb25zdCByPXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6RXQsbj14ZS5nZXQodCk7cmV0dXJuIG4uaGFzKHIpfHxuLnNldChyLG5ldyBTZXQpLG4uZ2V0KHIpfWZ1bmN0aW9uIHBzKHQsZSxyKXtjb25zdCBuPXhlLmdldCh0KTtpZihuLmhhcyhlKSlmb3IoY29uc3QgcyBvZiBuLmdldChlKSlzLmVucXVldWUocik7aWYobi5oYXMoRXQpKXtjb25zdCBzPVByb21pc2UuYWxsKFtlLHJdKTtmb3IoY29uc3QgaSBvZiBuLmdldChFdCkpaS5lbnF1ZXVlKHMpfX1mdW5jdGlvbiBGcih0LGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgcj0hMSxuPSgpPT57fSxzPVtdO2NvbnN0IGk9e2VucXVldWUoYSl7cy5wdXNoKGEpLG4oKX0sZmluaXNoKCl7cj0hMCxuKCl9fTtmb3IoY29uc3QgYSBvZiBlKUVlKHQsYSkuYWRkKGkpO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIHM/cy5sZW5ndGg9PT0wP3I/KHM9dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoYT0+e249YX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBzLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGEpe3M9dm9pZCAwO2Zvcihjb25zdCBvIG9mIGUpRWUodCxvKS5kZWxldGUoaSk7cmV0dXJuIG4oKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgYX06e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBQcih0KXtpZih0PT09dm9pZCAwKXJldHVybiBrcjtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHQpaWYoIWtyLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHR9Y29uc3QgVHQ9dD0+dD09PUdlfHx0PT09JGU7bGV0IFdlPWNsYXNzIEVye3N0YXRpYyBtaXhpbihlLHIpe3JldHVybiByPVByKHIpLG49PntpZih0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGZ1bmN0aW9uIik7Zm9yKGNvbnN0IGEgb2YgcilpZihuLnByb3RvdHlwZVthXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7YX1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7ZnVuY3Rpb24gcygpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiExLHZhbHVlOm5ldyBFcn0pLHRoaXNbZV19T2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITEsZ2V0OnN9KTtjb25zdCBpPWE9PmZ1bmN0aW9uKC4uLm8pe3JldHVybiB0aGlzW2VdW2FdKC4uLm8pfTtmb3IoY29uc3QgYSBvZiByKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxhLHtlbnVtZXJhYmxlOiExLHZhbHVlOmkoYSl9KTtyZXR1cm4gbn19c3RhdGljIGdldCBpc0RlYnVnRW5hYmxlZCgpe2lmKHR5cGVvZiBwcm9jZXNzIT0ib2JqZWN0IilyZXR1cm4gX3Q7Y29uc3R7ZW52OmV9PXByb2Nlc3N8fHtlbnY6e319O3JldHVybiBlLkRFQlVHPT09ImVtaXR0ZXJ5Inx8ZS5ERUJVRz09PSIqInx8X3R9c3RhdGljIHNldCBpc0RlYnVnRW5hYmxlZChlKXtfdD1lfWNvbnN0cnVjdG9yKGU9e30pe04uc2V0KHRoaXMsbmV3IFNldCksemUuc2V0KHRoaXMsbmV3IE1hcCkseGUuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHIsbixzLGkpPT57dHJ5e2k9SlNPTi5zdHJpbmdpZnkoaSl9Y2F0Y2h7aT1gT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzIGZhaWxlZCB0byBzdHJpbmdpZnk6ICR7T2JqZWN0LmtleXMoaSkuam9pbigiLCIpfWB9dHlwZW9mIHM9PSJzeW1ib2wiJiYocz1zLnRvU3RyaW5nKCkpO2NvbnN0IGE9bmV3IERhdGUsbz1gJHthLmdldEhvdXJzKCl9OiR7YS5nZXRNaW51dGVzKCl9OiR7YS5nZXRTZWNvbmRzKCl9LiR7YS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHtvfV1bZW1pdHRlcnk6JHtyfV1bJHtufV0gRXZlbnQgTmFtZTogJHtzfQoJZGF0YTogJHtpfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSxyLG4peyhFci5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUscixuKX1vbihlLHIpe1ZlKHIpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKWxlKG4pLGRlKHRoaXMsbikuYWRkKHIpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLFR0KG4pfHx0aGlzLmVtaXQoR2Use2V2ZW50TmFtZTpuLGxpc3RlbmVyOnJ9KTtyZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUscil9b2ZmKGUscil7VmUociksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpbGUobiksZGUodGhpcyxuKS5kZWxldGUociksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxUdChuKXx8dGhpcy5lbWl0KCRlLHtldmVudE5hbWU6bixsaXN0ZW5lcjpyfSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IG49dGhpcy5vbihlLHM9PntuKCkscihzKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgciBvZiBlKWxlKHIpO3JldHVybiBGcih0aGlzLGUpfWFzeW5jIGVtaXQoZSxyKXtsZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0IixlLHIpLHBzKHRoaXMsZSxyKTtjb25zdCBuPWRlKHRoaXMsZSkscz1OLmdldCh0aGlzKSxpPVsuLi5uXSxhPVR0KGUpP1tdOlsuLi5zXTthd2FpdCBScixhd2FpdCBQcm9taXNlLmFsbChbLi4uaS5tYXAoYXN5bmMgbz0+e2lmKG4uaGFzKG8pKXJldHVybiBvKHIpfSksLi4uYS5tYXAoYXN5bmMgbz0+e2lmKHMuaGFzKG8pKXJldHVybiBvKGUscil9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSxyKXtsZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHIpO2NvbnN0IG49ZGUodGhpcyxlKSxzPU4uZ2V0KHRoaXMpLGk9Wy4uLm5dLGE9Wy4uLnNdO2F3YWl0IFJyO2Zvcihjb25zdCBvIG9mIGkpbi5oYXMobykmJmF3YWl0IG8ocik7Zm9yKGNvbnN0IG8gb2YgYSlzLmhhcyhvKSYmYXdhaXQgbyhlLHIpfW9uQW55KGUpe3JldHVybiBWZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLE4uZ2V0KHRoaXMpLmFkZChlKSx0aGlzLmVtaXQoR2Use2xpc3RlbmVyOmV9KSx0aGlzLm9mZkFueS5iaW5kKHRoaXMsZSl9YW55RXZlbnQoKXtyZXR1cm4gRnIodGhpcyl9b2ZmQW55KGUpe1ZlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSx0aGlzLmVtaXQoJGUse2xpc3RlbmVyOmV9KSxOLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCByIG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHIsdm9pZCAwKSx0eXBlb2Ygcj09InN0cmluZyJ8fHR5cGVvZiByPT0ic3ltYm9sIil7ZGUodGhpcyxyKS5jbGVhcigpO2NvbnN0IG49RWUodGhpcyxyKTtmb3IoY29uc3QgcyBvZiBuKXMuZmluaXNoKCk7bi5jbGVhcigpfWVsc2V7Ti5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3QgbiBvZiB6ZS5nZXQodGhpcykudmFsdWVzKCkpbi5jbGVhcigpO2Zvcihjb25zdCBuIG9mIHhlLmdldCh0aGlzKS52YWx1ZXMoKSl7Zm9yKGNvbnN0IHMgb2YgbilzLmZpbmlzaCgpO24uY2xlYXIoKX19fWxpc3RlbmVyQ291bnQoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCByPTA7Zm9yKGNvbnN0IG4gb2YgZSl7aWYodHlwZW9mIG49PSJzdHJpbmciKXtyKz1OLmdldCh0aGlzKS5zaXplK2RlKHRoaXMsbikuc2l6ZStFZSh0aGlzLG4pLnNpemUrRWUodGhpcykuc2l6ZTtjb250aW51ZX10eXBlb2YgbjwidSImJmxlKG4pLHIrPU4uZ2V0KHRoaXMpLnNpemU7Zm9yKGNvbnN0IHMgb2YgemUuZ2V0KHRoaXMpLnZhbHVlcygpKXIrPXMuc2l6ZTtmb3IoY29uc3QgcyBvZiB4ZS5nZXQodGhpcykudmFsdWVzKCkpcis9cy5zaXplfXJldHVybiByfWJpbmRNZXRob2RzKGUscil7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3I9UHIocik7Zm9yKGNvbnN0IG4gb2Ygcil7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fTtjb25zdCBrcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhXZS5wcm90b3R5cGUpLmZpbHRlcih0PT50IT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFdlLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6R2Usd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV2UsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOiRlLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSk7dmFyIHlzPVdlO2NvbnN0IHd0PW1zKHlzKTtmdW5jdGlvbiBicyh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJvYmplY3QiJiZ0IT09bnVsbCYmIm1lc3NhZ2UiaW4gdCYmdHlwZW9mIHQubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gZ3ModCl7aWYoYnModCkpcmV0dXJuIHQ7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodCkpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHQpKX19ZnVuY3Rpb24gQXQodCl7cmV0dXJuIGdzKHQpLm1lc3NhZ2V9dmFyIHhzPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxFcz0odCxlLHIpPT5lIGluIHQ/eHModCxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpyfSk6dFtlXT1yLF9zPSh0LGUscik9PihFcyh0LGUrIiIscikscik7Y29uc3QgVHM9ImhsZy50b2tib3guY29tL3Byb2QvbG9nZ2luZy92Y3Bfd2VicnRjIix3cz0iaHR0cHM6Ly8iLEFzPTFlNDtsZXQgSGU7Y29uc3QgdnM9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIFNzKCl7aWYoIUhlJiYoSGU9dHlwZW9mIGNyeXB0bzwidSImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pLCFIZSkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBIZSh2cyl9Y29uc3QgVD1bXTtmb3IobGV0IHQ9MDt0PDI1NjsrK3QpVC5wdXNoKCh0KzI1NikudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtmdW5jdGlvbiBJcyh0LGU9MCl7cmV0dXJuKFRbdFtlKzBdXStUW3RbZSsxXV0rVFt0W2UrMl1dK1RbdFtlKzNdXSsiLSIrVFt0W2UrNF1dK1RbdFtlKzVdXSsiLSIrVFt0W2UrNl1dK1RbdFtlKzddXSsiLSIrVFt0W2UrOF1dK1RbdFtlKzldXSsiLSIrVFt0W2UrMTBdXStUW3RbZSsxMV1dK1RbdFtlKzEyXV0rVFt0W2UrMTNdXStUW3RbZSsxNF1dK1RbdFtlKzE1XV0pLnRvTG93ZXJDYXNlKCl9Y29uc3QgUnM9dHlwZW9mIGNyeXB0bzwidSImJmNyeXB0by5yYW5kb21VVUlEJiZjcnlwdG8ucmFuZG9tVVVJRC5iaW5kKGNyeXB0byksQ3I9e3JhbmRvbVVVSUQ6UnN9O2Z1bmN0aW9uIEZzKHQsZSxyKXtpZihDci5yYW5kb21VVUlEJiYhZSYmIXQpcmV0dXJuIENyLnJhbmRvbVVVSUQoKTt0PXR8fHt9O2NvbnN0IG49dC5yYW5kb218fCh0LnJuZ3x8U3MpKCk7cmV0dXJuIG5bNl09bls2XSYxNXw2NCxuWzhdPW5bOF0mNjN8MTI4LElzKG4pfWZ1bmN0aW9uIHZ0KHQsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCByPWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHJbdF18fChyW3RdPWUpLHJbdF19Y29uc3QgTz12dCgiZ2xvYmFscyIse30pO3ZhciBRPSh0PT4odC5JTklUPSJJTklUIix0LkZPUldBUkQ9IkZPUldBUkQiLHQuVEVSTUlOQVRFPSJURVJNSU5BVEUiLHQuR0xPQkFMU19TWU5DPSJHTE9CQUxTX1NZTkMiLHQpKShRfHx7fSk7ZnVuY3Rpb24gQnIodCl7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKGU9PnQgaW5zdGFuY2VvZiBlKX1sZXQgUHM9MDtmdW5jdGlvbiBrcyh0LGUscixuLHMpe2NvbnN0IGk9UHMrKztyZXR1cm4gdC5wb3N0TWVzc2FnZSh7aWQ6aSx0eXBlOmUsZnVuY3Rpb25OYW1lOnIsYXJnczpufSxuLmZpbHRlcihhPT5CcihhKSkpLG5ldyBQcm9taXNlKGE9PntzPT1udWxsfHxzLnNldChpLGEpfSl9ZnVuY3Rpb24gX2UodCxlKXtjb25zdHtpZDpyLHR5cGU6bn09dCxzPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnIsdHlwZTpuLHJlc3VsdDplfSxzLmZpbHRlcihpPT5CcihpKSkpfWNvbnN0IERyPXZ0KCJ3b3JrZXJpemVkIix7fSk7ZnVuY3Rpb24gTXIoKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWFzeW5jIGZ1bmN0aW9uIENzKCl7aWYoTXIoKSlfZSh7dHlwZTpRLkdMT0JBTFNfU1lOQ30sTyk7ZWxzZXtjb25zdCB0PVtdO2Zvcihjb25zdCBlIGluIERyKXtjb25zdHt3b3JrZXI6cixyZXNvbHZlcnM6bn09RHJbZV0ud29ya2VyQ29udGV4dDtyJiZ0LnB1c2goa3MocixRLkdMT0JBTFNfU1lOQywiIixbT10sbikpfWF3YWl0IFByb21pc2UuYWxsKHQpfX1mdW5jdGlvbiBqZSh0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZS5zcGxpY2UoMCxlLmxlbmd0aCk7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpZm9yKGNvbnN0IHIgaW4gZSlkZWxldGUgZVtyXTtmb3IoY29uc3QgciBpbiB0KUFycmF5LmlzQXJyYXkodFtyXSk/KGVbcl09W10samUodFtyXSxlW3JdKSk6dHlwZW9mIHRbcl09PSJvYmplY3QiPyhlW3JdPXt9LGplKHRbcl0sZVtyXSkpOmVbcl09dFtyXX1hc3luYyBmdW5jdGlvbiBCcyh0LGUpe2NvbnN0e2Z1bmN0aW9uTmFtZTpyLGFyZ3M6bn09dDtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2lmKCFyKXRocm93Im1pc3NpbmcgZnVuY3Rpb24gbmFtZSB0byBjYWxsIjtpZighZS5pbnN0YW5jZVtyXSl0aHJvd2B1bmRlZmluZWQgZnVuY3Rpb24gWyR7cn1dIGluIGNsYXNzICR7ZS5pbnN0YW5jZS5jb25zdHJ1Y3Rvci53b3JrZXJJZH1gO19lKHQsYXdhaXQgZS5pbnN0YW5jZVtyXSguLi5uPz9bXSkpfWNvbnN0IERzPXZ0KCJyZWdpc3RlcmVkV29ya2VycyIse30pO2Z1bmN0aW9uIE1zKHQsZSl7aWYoIXQuYXJncyl0aHJvdyJNaXNzaW5nIGNsYXNzTmFtZSB3aGlsZSBpbml0aWFsaXppbmcgd29ya2VyIjtjb25zdFtyLG5dPXQuYXJncyxzPURzW3JdO2lmKHMpZS5pbnN0YW5jZT1uZXcgcyh0LmFyZ3Muc2xpY2UoMSkpO2Vsc2UgdGhyb3dgdW5rbm93biB3b3JrZXIgY2xhc3MgJHtyfWA7amUobixPKSxfZSh0LHR5cGVvZiBlLmluc3RhbmNlIT09dm9pZCAwKX1hc3luYyBmdW5jdGlvbiBVcyh0LGUpe2NvbnN0e2FyZ3M6cn09dDtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2xldCBuO2UuaW5zdGFuY2UudGVybWluYXRlJiYobj1hd2FpdCBlLmluc3RhbmNlLnRlcm1pbmF0ZSguLi5yPz9bXSkpLF9lKHQsbil9ZnVuY3Rpb24gTnModCl7aWYoIXQuYXJncyl0aHJvdyJNaXNzaW5nIGdsb2JhbHMgd2hpbGUgc3luY2luZyI7amUodC5hcmdzWzBdLE8pLF9lKHQse30pfWZ1bmN0aW9uIE9zKCl7Y29uc3QgdD17fTtvbm1lc3NhZ2U9YXN5bmMgZT0+e2NvbnN0IHI9ZS5kYXRhO3N3aXRjaChyLnR5cGUpe2Nhc2UgUS5JTklUOk1zKHIsdCk7YnJlYWs7Y2FzZSBRLkZPUldBUkQ6QnMocix0KTticmVhaztjYXNlIFEuVEVSTUlOQVRFOlVzKHIsdCk7YnJlYWs7Y2FzZSBRLkdMT0JBTFNfU1lOQzpOcyhyKTticmVha319fU1yKCkmJk9zKCk7ZnVuY3Rpb24gTHModCxlKXtyZXR1cm4gT1t0XXx8KE9bdF09ZSksWygpPT5PW3RdLGFzeW5jIHI9PntPW3RdPXIsYXdhaXQgQ3MoKX1dfWZ1bmN0aW9uIHpzKHQsZSl7cmV0dXJuIExzKHQsZSl9Y29uc3RbR3MsJHNdPXpzKCJtZXRhZGF0YSIpO2Z1bmN0aW9uIFZzKHQpeyRzKHQpfWZ1bmN0aW9uIFN0KCl7cmV0dXJuIEdzKCl9bGV0IEl0PWNsYXNze2NvbnN0cnVjdG9yKGUscil7X3ModGhpcywidXVpZCIpLHRoaXMuY29uZmlnPWUsdGhpcy51dWlkPXI/P0ZzKCl9YXN5bmMgc2VuZChlKXt2YXIgcixuLHM7Y29uc3R7YXBwSWQ6aSxzb3VyY2VUeXBlOmF9PShyPVN0KCkpIT1udWxsP3I6e307aWYoIWl8fCFhKXJldHVybiJtZXRhZGF0YSBtaXNzaW5nIjtjb25zdCBvPW5ldyBBYm9ydENvbnRyb2xsZXIsYz1zZXRUaW1lb3V0KCgpPT5vLmFib3J0KCksQXMpO3JldHVybiBhd2FpdCgocz0obj10aGlzLmNvbmZpZyk9PW51bGw/dm9pZCAwOm4uZmV0Y2gpIT1udWxsP3M6ZmV0Y2gpKHRoaXMuZ2V0VXJsKCkse21ldGhvZDoiUE9TVCIsaGVhZGVyczp0aGlzLmdldEhlYWRlcnMoKSxib2R5OkpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRSZXBvcnQoZSkpLHNpZ25hbDpvLnNpZ25hbH0pLGNsZWFyVGltZW91dChjKSwic3VjY2VzcyJ9Z2V0VXJsKCl7dmFyIGU7bGV0IHI9KGU9U3QoKS5wcm94eVVybCkhPW51bGw/ZTp3cztyZXR1cm4gcis9KHIuYXQoLTEpPT09Ii8iPyIiOiIvIikrVHMscn1nZXRIZWFkZXJzKCl7cmV0dXJueyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19YnVpbGRSZXBvcnQoZSl7Y29uc3Qgcj1TdCgpO3JldHVybntndWlkOnRoaXMudXVpZCwuLi5lLGFwcGxpY2F0aW9uSWQ6ci5hcHBJZCx0aW1lc3RhbXA6RGF0ZS5ub3coKSxwcm94eVVybDpyLnByb3h5VXJsLHNvdXJjZTpyLnNvdXJjZVR5cGV9fX07Y29uc3QgWGU9IjIuMC40IjtjbGFzcyBXc3tjb25zdHJ1Y3RvcihlLHIpe3RoaXMuY29uZmlnPWUsdGhpcy5mcmFtZVRyYW5zZm9ybWVkQ291bnQ9MCx0aGlzLmZyYW1lRnJvbVNvdXJjZUNvdW50PTAsdGhpcy5zdGFydEF0PTAsdGhpcy5yZXBvcnRlcj1uZXcgSXQoZSxyKX1hc3luYyBvbkZyYW1lRnJvbVNvdXJjZSgpe3RoaXMuZnJhbWVGcm9tU291cmNlQ291bnQrK31nZXQgZnBzKCl7Y29uc3R7c3RhcnRBdDplLGZyYW1lRnJvbVNvdXJjZUNvdW50OnJ9PXRoaXMsbj0oRGF0ZS5ub3coKS1lKS8xZTM7cmV0dXJuIHIvbn1hc3luYyBvbkZyYW1lVHJhbnNmb3JtZWQoZT17fSxyPSExKXt0aGlzLnN0YXJ0QXQ9PT0wJiYodGhpcy5zdGFydEF0PURhdGUubm93KCkpLHRoaXMuZnJhbWVUcmFuc2Zvcm1lZENvdW50Kys7Y29uc3R7c3RhcnRBdDpuLGZyYW1lVHJhbnNmb3JtZWRDb3VudDpzLGZyYW1lRnJvbVNvdXJjZUNvdW50Oml9PXRoaXMsYT1EYXRlLm5vdygpLG89KGEtbikvMWUzLGM9cy9vLHU9aS9vO3JldHVybiByfHx0aGlzLmZyYW1lVHJhbnNmb3JtZWRDb3VudD49dGhpcy5jb25maWcubG9nZ2luZ0ludGVydmFsRnJhbWVDb3VudD8odGhpcy5mcmFtZUZyb21Tb3VyY2VDb3VudD0wLHRoaXMuZnJhbWVUcmFuc2Zvcm1lZENvdW50PTAsdGhpcy5zdGFydEF0PWEsdGhpcy5yZXBvcnRlci5jb25maWc9dGhpcy5jb25maWcsdGhpcy5yZXBvcnRlci5zZW5kKHsuLi50aGlzLmNvbmZpZy5yZXBvcnQsdmFyaWF0aW9uOiJRb1MiLGZwczp1LHRyYW5zZm9ybWVkRnBzOmMsZnJhbWVzVHJhbnNmb3JtZWQ6cywuLi5lfSkpOiJzdWNjZXNzIn19dmFyIFJ0PSh0PT4odC5waXBlbGluZV9lbmRlZD0icGlwZWxpbmVfZW5kZWQiLHQucGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciIsdC5waXBlbGluZV9zdGFydGVkPSJwaXBlbGluZV9zdGFydGVkIix0LnBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIix0LnBpcGVsaW5lX3Jlc3RhcnRlZD0icGlwZWxpbmVfcmVzdGFydGVkIix0LnBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yPSJwaXBlbGluZV9yZXN0YXJ0ZWRfd2l0aF9lcnJvciIsdCkpKFJ0fHx7fSk7Y29uc3QgSHM9NTAwLGpzPS44O2NsYXNzIFhzIGV4dGVuZHMgd3R7Y29uc3RydWN0b3IoZSxyKXtzdXBlcigpLHRoaXMucmVwb3J0ZXJfPW5ldyBJdCx0aGlzLnJlcG9ydGVyUW9zXz1uZXcgV3Moe2xvZ2dpbmdJbnRlcnZhbEZyYW1lQ291bnQ6SHMscmVwb3J0Ont2ZXJzaW9uOlhlfX0pLHRoaXMuaW5kZXhfPXIsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLnZpZGVvSGVpZ2h0Xz0wLHRoaXMudmlkZW9XaWR0aF89MCx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMSx0aGlzLnRyYW5zZm9ybWVyVHlwZV89IkN1c3RvbSIsImdldFRyYW5zZm9ybWVyVHlwZSJpbiBlJiYodGhpcy50cmFuc2Zvcm1lclR5cGVfPWUuZ2V0VHJhbnNmb3JtZXJUeXBlKCkpLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkNyZWF0ZSJ9KX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lfWFzeW5jIHN0YXJ0KGUpe2lmKHRoaXMuY29udHJvbGxlcl89ZSx0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0PT0iZnVuY3Rpb24iKXRyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydChlKX1jYXRjaChyKXt0aGlzLnJlcG9ydCh7bWVzc2FnZTpELmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCx2YXJpYXRpb246IkVycm9yIixlcnJvcjpBdChyKX0pO2NvbnN0IG49e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnIsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsbil9fWFzeW5jIHRyYW5zZm9ybShlLHIpe3ZhciBuLHM7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSxlIGluc3RhbmNlb2YgVmlkZW9GcmFtZSYmKHRoaXMudmlkZW9IZWlnaHRfPShlPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpPz8wLHRoaXMudmlkZW9XaWR0aF89KGU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKT8/MCksdGhpcy5yZXBvcnRlclFvc18ub25GcmFtZUZyb21Tb3VyY2UoKSx0aGlzLnRyYW5zZm9ybWVyXylpZih0aGlzLnNob3VsZFN0b3BfKWNvbnNvbGUud2FybigiW1BpcGVsaW5lXSBmbHVzaCBmcm9tIHRyYW5zZm9ybSIpLGUuY2xvc2UoKSx0aGlzLmZsdXNoKHIpLHIudGVybWluYXRlKCk7ZWxzZXt0cnl7YXdhaXQoKHM9KG49dGhpcy50cmFuc2Zvcm1lcl8pLnRyYW5zZm9ybSk9PW51bGw/dm9pZCAwOnMuY2FsbChuLGUscikpLHRoaXMucmVwb3J0UW9zKCl9Y2F0Y2goaSl7dGhpcy5yZXBvcnQoe21lc3NhZ2U6RC5lcnJvcnMudHJhbnNmb3JtZXJfdHJhbnNmb3JtLHZhcmlhdGlvbjoiRXJyb3IiLGVycm9yOkF0KGkpfSk7Y29uc3QgYT17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6aSxmdW5jdGlvbjoidHJhbnNmb3JtIn07dGhpcy5lbWl0KCJlcnJvciIsYSl9aWYodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXypqcz50aGlzLnJlcG9ydGVyUW9zXy5mcHMpe2NvbnN0IGk9e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LHdhcm5pbmdUeXBlOiJmcHNfZHJvcCIsZHJvcEluZm86e3JlcXVlc3RlZDp0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyxjdXJyZW50OnRoaXMucmVwb3J0ZXJRb3NfLmZwc319O3RoaXMuZW1pdCgid2FybiIsaSl9fX1hc3luYyBmbHVzaChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoPT0iZnVuY3Rpb24iJiYhdGhpcy5pc0ZsYXNoZWRfKXt0aGlzLmlzRmxhc2hlZF89ITA7dHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoKGUpfWNhdGNoKHIpe3RoaXMucmVwb3J0KHttZXNzYWdlOkQuZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoLHZhcmlhdGlvbjoiRXJyb3IiLGVycm9yOkF0KHIpfSk7Y29uc3Qgbj17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6cixmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixuKX19dGhpcy5yZXBvcnRRb3MoITApLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkRlbGV0ZSJ9KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5jb250cm9sbGVyXyYmKHRoaXMuZmx1c2godGhpcy5jb250cm9sbGVyXyksdGhpcy5jb250cm9sbGVyXy50ZXJtaW5hdGUoKSksdGhpcy5zaG91bGRTdG9wXz0hMH1yZXBvcnQoZSl7dGhpcy5yZXBvcnRlcl8uc2VuZCh7dmVyc2lvbjpYZSxhY3Rpb246Ik1lZGlhVHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyVHlwZTp0aGlzLnRyYW5zZm9ybWVyVHlwZV8sLi4uZX0pfXJlcG9ydFFvcyhlPSExKXt0aGlzLnJlcG9ydGVyUW9zXy5jb25maWc9ey4uLnRoaXMucmVwb3J0ZXJRb3NfLmNvbmZpZ30sdGhpcy5yZXBvcnRlclFvc18ub25GcmFtZVRyYW5zZm9ybWVkKHt2ZXJzaW9uOlhlLGFjdGlvbjoiTWVkaWFUcmFuc2Zvcm1lciIsdHJhbnNmb3JtZXJUeXBlOnRoaXMudHJhbnNmb3JtZXJUeXBlXyx2aWRlb1dpZHRoOnRoaXMudmlkZW9XaWR0aF8sdmlkZW9IZWlnaHQ6dGhpcy52aWRlb0hlaWdodF99LGUpfX1jbGFzcyBZcyBleHRlbmRzIHd0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy50cmFuc2Zvcm1lcnNfPVtdLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXtsZXQgbj1uZXcgWHMoZVtyXSxyKTtuLm9uKCJlcnJvciIscz0+e3RoaXMuZW1pdCgiZXJyb3IiLHMpfSksbi5vbigid2FybiIscz0+e3RoaXMuZW1pdCgid2FybiIscyl9KSx0aGlzLnRyYW5zZm9ybWVyc18ucHVzaChuKX19c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZTtmb3IobGV0IHIgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKXIuc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfWFzeW5jIHN0YXJ0KGUscil7aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIE5vIHRyYW5zZm9ybWVycy4iKTtyZXR1cm59dHJ5e2xldCBuPWU7Zm9yKGxldCBzIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllPWUucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbShzKSk7ZS5waXBlVG8ocikudGhlbihhc3luYygpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2V0dXAuIiksYXdhaXQgci5hYm9ydCgpLGF3YWl0IG4uY2FuY2VsKCksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9lbmRlZCIpfSkuY2F0Y2goYXN5bmMgcz0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKGk9Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLGkpfSksYXdhaXQgci5hYm9ydChzKSxhd2FpdCBuLmNhbmNlbChzKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3IiKX0pfWNhdGNoe3RoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiksdGhpcy5kZXN0cm95KCk7cmV0dXJufXRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfc3RhcnRlZCIpLGNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgUXMgZXh0ZW5kcyB3dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5yZXBvcnRlcl89bmV3IEl0LHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkNyZWF0ZSJ9KX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lLHRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9dHJhbnNmb3JtKGUscil7cmV0dXJuIHRoaXMucmVhZGFibGVfPWUsdGhpcy53cml0YWJsZV89cix0aGlzLnRyYW5zZm9ybUludGVybmFsKCl9dHJhbnNmb3JtSW50ZXJuYWwoKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoZSxyKT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXt0aGlzLnJlcG9ydCh7bWVzc2FnZTpELmVycm9ycy50cmFuc2Zvcm1lcl9ub25lLHZhcmlhdGlvbjoiRXJyb3IifSkscigiW01lZGlhUHJvY2Vzc29yXSBOZWVkIHRvIHNldCB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufWlmKCF0aGlzLnJlYWRhYmxlXyl7dGhpcy5yZXBvcnQoe3ZhcmlhdGlvbjoiRXJyb3IiLG1lc3NhZ2U6RC5lcnJvcnMucmVhZGFibGVfbnVsbH0pLHIoIltNZWRpYVByb2Nlc3Nvcl0gUmVhZGFibGUgaXMgbnVsbC4iKTtyZXR1cm59aWYoIXRoaXMud3JpdGFibGVfKXt0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJFcnJvciIsbWVzc2FnZTpELmVycm9ycy53cml0YWJsZV9udWxsfSkscigiW01lZGlhUHJvY2Vzc29yXSBXcml0YWJsZSBpcyBudWxsLiIpO3JldHVybn1sZXQgbj0hMTt0aGlzLnBpcGVsaW5lXyYmKG49ITAsdGhpcy5waXBlbGluZV8uY2xlYXJMaXN0ZW5lcnMoKSx0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCkpLHRoaXMucGlwZWxpbmVfPW5ldyBZcyh0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixzPT57dGhpcy5lbWl0KCJ3YXJuIixzKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIscz0+e3RoaXMuZW1pdCgiZXJyb3IiLHMpfSksdGhpcy5waXBlbGluZV8ub24oInBpcGVsaW5lSW5mbyIscz0+e24mJihzPT09InBpcGVsaW5lX3N0YXJ0ZWQiP3M9UnQucGlwZWxpbmVfcmVzdGFydGVkOnM9PT0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiYmKHM9UnQucGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IpKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIscyl9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKHM9PntyKHMpfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7cmV0dXJuIHRoaXMucmVwb3J0KHt2YXJpYXRpb246IlVwZGF0ZSIsbWVzc2FnZTpELnVwZGF0ZXMudHJhbnNmb3JtZXJfbmV3fSksdGhpcy50cmFuc2Zvcm1lcnNfPWUsdGhpcy5yZWFkYWJsZV8mJnRoaXMud3JpdGFibGVfP3RoaXMudHJhbnNmb3JtSW50ZXJuYWwoKTpQcm9taXNlLnJlc29sdmUoKX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIGU9Pnt0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkRlbGV0ZSJ9KSxlKCl9KX1yZXBvcnQoZSl7dGhpcy5yZXBvcnRlcl8uc2VuZCh7dmVyc2lvbjpYZSxhY3Rpb246Ik1lZGlhUHJvY2Vzc29yIiwuLi5lfSl9fXZhciBxcz1PYmplY3QuZGVmaW5lUHJvcGVydHksS3M9KHQsZSxyKT0+ZSBpbiB0P3FzKHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6cn0pOnRbZV09cixKcz0odCxlLHIpPT4oS3ModCxlKyIiLHIpLHIpO2NvbnN0IFpzPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyIsZWk9Imh0dHBzOi8vIix0aT0xZTQ7bGV0IFllO2NvbnN0IHJpPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBuaSgpe2lmKCFZZSYmKFllPXR5cGVvZiBjcnlwdG88InUiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKSwhWWUpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gWWUocmkpfWNvbnN0IHc9W107Zm9yKGxldCB0PTA7dDwyNTY7Kyt0KXcucHVzaCgodCsyNTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7ZnVuY3Rpb24gc2kodCxlPTApe3JldHVybih3W3RbZSswXV0rd1t0W2UrMV1dK3dbdFtlKzJdXSt3W3RbZSszXV0rIi0iK3dbdFtlKzRdXSt3W3RbZSs1XV0rIi0iK3dbdFtlKzZdXSt3W3RbZSs3XV0rIi0iK3dbdFtlKzhdXSt3W3RbZSs5XV0rIi0iK3dbdFtlKzEwXV0rd1t0W2UrMTFdXSt3W3RbZSsxMl1dK3dbdFtlKzEzXV0rd1t0W2UrMTRdXSt3W3RbZSsxNV1dKS50b0xvd2VyQ2FzZSgpfWNvbnN0IGlpPXR5cGVvZiBjcnlwdG88InUiJiZjcnlwdG8ucmFuZG9tVVVJRCYmY3J5cHRvLnJhbmRvbVVVSUQuYmluZChjcnlwdG8pLFVyPXtyYW5kb21VVUlEOmlpfTtmdW5jdGlvbiBvaSh0LGUscil7aWYoVXIucmFuZG9tVVVJRCYmIWUmJiF0KXJldHVybiBVci5yYW5kb21VVUlEKCk7dD10fHx7fTtjb25zdCBuPXQucmFuZG9tfHwodC5ybmd8fG5pKSgpO3JldHVybiBuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxzaShuKX1mdW5jdGlvbiBGdCh0LGUpe2dsb2JhbFRoaXMudm9uYWdlfHwoZ2xvYmFsVGhpcy52b25hZ2U9e30pLGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXJ8fChnbG9iYWxUaGlzLnZvbmFnZS53b3JrZXJpemVyPXt9KTtsZXQgcj1nbG9iYWxUaGlzLnZvbmFnZS53b3JrZXJpemVyO3JldHVybiByW3RdfHwoclt0XT1lKSxyW3RdfWNvbnN0IEw9RnQoImdsb2JhbHMiLHt9KTt2YXIgcT0odD0+KHQuSU5JVD0iSU5JVCIsdC5GT1JXQVJEPSJGT1JXQVJEIix0LlRFUk1JTkFURT0iVEVSTUlOQVRFIix0LkdMT0JBTFNfU1lOQz0iR0xPQkFMU19TWU5DIix0KSkocXx8e30pO2Z1bmN0aW9uIE5yKHQpe3JldHVybltJbWFnZUJpdG1hcCxSZWFkYWJsZVN0cmVhbSxXcml0YWJsZVN0cmVhbV0uc29tZShlPT50IGluc3RhbmNlb2YgZSl9bGV0IGFpPTA7ZnVuY3Rpb24gY2kodCxlLHIsbixzKXtjb25zdCBpPWFpKys7cmV0dXJuIHQucG9zdE1lc3NhZ2Uoe2lkOmksdHlwZTplLGZ1bmN0aW9uTmFtZTpyLGFyZ3M6bn0sbi5maWx0ZXIoYT0+TnIoYSkpKSxuZXcgUHJvbWlzZShhPT57cz09bnVsbHx8cy5zZXQoaSxhKX0pfWZ1bmN0aW9uIFRlKHQsZSl7Y29uc3R7aWQ6cix0eXBlOm59PXQscz1BcnJheS5pc0FycmF5KGUpP2U6W2VdO3Bvc3RNZXNzYWdlKHtpZDpyLHR5cGU6bixyZXN1bHQ6ZX0scy5maWx0ZXIoaT0+TnIoaSkpKX1jb25zdCBPcj1GdCgid29ya2VyaXplZCIse30pO2Z1bmN0aW9uIExyKCl7cmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1hc3luYyBmdW5jdGlvbiB1aSgpe2lmKExyKCkpVGUoe3R5cGU6cS5HTE9CQUxTX1NZTkN9LEwpO2Vsc2V7Y29uc3QgdD1bXTtmb3IoY29uc3QgZSBpbiBPcil7Y29uc3R7d29ya2VyOnIscmVzb2x2ZXJzOm59PU9yW2VdLndvcmtlckNvbnRleHQ7ciYmdC5wdXNoKGNpKHIscS5HTE9CQUxTX1NZTkMsIiIsW0xdLG4pKX1hd2FpdCBQcm9taXNlLmFsbCh0KX19ZnVuY3Rpb24gUWUodCxlKXtpZihBcnJheS5pc0FycmF5KGUpKWUuc3BsaWNlKDAsZS5sZW5ndGgpO2Vsc2UgaWYodHlwZW9mIGU9PSJvYmplY3QiKWZvcihjb25zdCByIGluIGUpZGVsZXRlIGVbcl07Zm9yKGNvbnN0IHIgaW4gdClBcnJheS5pc0FycmF5KHRbcl0pPyhlW3JdPVtdLFFlKHRbcl0sZVtyXSkpOnR5cGVvZiB0W3JdPT0ib2JqZWN0Ij8oZVtyXT17fSxRZSh0W3JdLGVbcl0pKTplW3JdPXRbcl19YXN5bmMgZnVuY3Rpb24gZmkodCxlKXtjb25zdHtmdW5jdGlvbk5hbWU6cixhcmdzOm59PXQ7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtpZighcil0aHJvdyJtaXNzaW5nIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCI7aWYoIWUuaW5zdGFuY2Vbcl0pdGhyb3dgdW5kZWZpbmVkIGZ1bmN0aW9uIFske3J9XSBpbiBjbGFzcyAke2UuaW5zdGFuY2UuY29uc3RydWN0b3Iud29ya2VySWR9YDtUZSh0LGF3YWl0IGUuaW5zdGFuY2Vbcl0oLi4ubj8/W10pKX1jb25zdCBsaT1GdCgicmVnaXN0ZXJlZFdvcmtlcnMiLHt9KTtmdW5jdGlvbiBkaSh0LGUpe2lmKCF0LmFyZ3MpdGhyb3ciTWlzc2luZyBjbGFzc05hbWUgd2hpbGUgaW5pdGlhbGl6aW5nIHdvcmtlciI7Y29uc3RbcixuXT10LmFyZ3Mscz1saVtyXTtpZihzKWUuaW5zdGFuY2U9bmV3IHModC5hcmdzLnNsaWNlKDEpKTtlbHNlIHRocm93YHVua25vd24gd29ya2VyIGNsYXNzICR7cn1gO1FlKG4sTCksVGUodCx0eXBlb2YgZS5pbnN0YW5jZSE9PXZvaWQgMCl9YXN5bmMgZnVuY3Rpb24gaGkodCxlKXtjb25zdHthcmdzOnJ9PXQ7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtsZXQgbjtlLmluc3RhbmNlLnRlcm1pbmF0ZSYmKG49YXdhaXQgZS5pbnN0YW5jZS50ZXJtaW5hdGUoLi4ucj8/W10pKSxUZSh0LG4pfWZ1bmN0aW9uIG1pKHQpe2lmKCF0LmFyZ3MpdGhyb3ciTWlzc2luZyBnbG9iYWxzIHdoaWxlIHN5bmNpbmciO1FlKHQuYXJnc1swXSxMKSxUZSh0LHt9KX1mdW5jdGlvbiBwaSgpe2NvbnN0IHQ9e307b25tZXNzYWdlPWFzeW5jIGU9Pntjb25zdCByPWUuZGF0YTtzd2l0Y2goci50eXBlKXtjYXNlIHEuSU5JVDpkaShyLHQpO2JyZWFrO2Nhc2UgcS5GT1JXQVJEOmZpKHIsdCk7YnJlYWs7Y2FzZSBxLlRFUk1JTkFURTpoaShyLHQpO2JyZWFrO2Nhc2UgcS5HTE9CQUxTX1NZTkM6bWkocik7YnJlYWt9fX1McigpJiZwaSgpO2Z1bmN0aW9uIHlpKHQsZSl7cmV0dXJuIExbdF18fChMW3RdPWUpLFsoKT0+TFt0XSxhc3luYyByPT57TFt0XT1yLGF3YWl0IHVpKCl9XX1mdW5jdGlvbiBiaSh0LGUpe3JldHVybiB5aSh0LGUpfWNvbnN0W2dpLGZmXT1iaSgibWV0YWRhdGEiKTtmdW5jdGlvbiBQdCgpe3JldHVybiBnaSgpfWNsYXNzIHhpe2NvbnN0cnVjdG9yKGUpe0pzKHRoaXMsInV1aWQiLG9pKCkpLHRoaXMuY29uZmlnPWV9YXN5bmMgc2VuZChlKXt2YXIgcixuLHM7Y29uc3R7YXBwSWQ6aSxzb3VyY2VUeXBlOmF9PShyPVB0KCkpIT1udWxsP3I6e307aWYoIWl8fCFhKXJldHVybiJtZXRhZGF0YSBtaXNzaW5nIjtjb25zdCBvPW5ldyBBYm9ydENvbnRyb2xsZXIsYz1zZXRUaW1lb3V0KCgpPT5vLmFib3J0KCksdGkpO3JldHVybiBhd2FpdCgocz0obj10aGlzLmNvbmZpZyk9PW51bGw/dm9pZCAwOm4uZmV0Y2gpIT1udWxsP3M6ZmV0Y2gpKHRoaXMuZ2V0VXJsKCkse21ldGhvZDoiUE9TVCIsaGVhZGVyczp0aGlzLmdldEhlYWRlcnMoKSxib2R5OkpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRSZXBvcnQoZSkpLHNpZ25hbDpvLnNpZ25hbH0pLGNsZWFyVGltZW91dChjKSwic3VjY2VzcyJ9Z2V0VXJsKCl7dmFyIGU7bGV0IHI9KGU9UHQoKS5wcm94eVVybCkhPW51bGw/ZTplaTtyZXR1cm4gcis9KHIuYXQoLTEpPT09Ii8iPyIiOiIvIikrWnMscn1nZXRIZWFkZXJzKCl7cmV0dXJueyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19YnVpbGRSZXBvcnQoZSl7Y29uc3Qgcj1QdCgpO3JldHVybntndWlkOnRoaXMudXVpZCwuLi5lLGFwcGxpY2F0aW9uSWQ6ci5hcHBJZCx0aW1lc3RhbXA6RGF0ZS5ub3coKSxwcm94eVVybDpyLnByb3h5VXJsLHNvdXJjZTpyLnNvdXJjZVR5cGV9fX1jb25zdCBFaT0iNi4xLjEiO3ZhciBxZT0odD0+KHQuTG93PSJMb3ciLHQuSGlnaD0iSGlnaCIsdCkpKHFlfHx7fSksa3Q9KHQ9Pih0LkZBU1Q9IkZBU1QiLHQuUFJFQ0lTRT0iUFJFQ0lTRSIsdCkpKGt0fHx7fSksS2U9KHQ9Pih0LkNBTlZBUz0iQ0FOVkFTIix0LldFQkdMPSJXRUJHTCIsdCkpKEtlfHx7fSk7ZnVuY3Rpb24gX2koKXtjb25zdCBlPW5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKS5nZXRDb250ZXh0KCJ3ZWJnbDIiLHtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiEwfSk7aWYoZSl7Y29uc3Qgcj1lPT1udWxsP3ZvaWQgMDplLmdldEV4dGVuc2lvbigiV0VCR0xfbG9zZV9jb250ZXh0Iik7ciYmci5sb3NlQ29udGV4dCgpfWVsc2UgcmV0dXJue3N1cHBvcnRlZDohMSxtZXNzYWdlOiJZb3VyIGhhcmR3YXJlIGRvZXMgbm90IHBlcmZvcm0gZ29vZCBlbm91Z2ggdG8gcnVuIHRoZSBsaWJyYXJ5IGVmZmljaWVudGx5In07cmV0dXJue3N1cHBvcnRlZDohMH19Y2xhc3MgQ3R7Y29uc3RydWN0b3IoKXtjb25zdCBlPW5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKSxyPWUuZ2V0Q29udGV4dCgiMmQiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KTtpZighcil0aHJvdyJGYWlsIHRvIHJldHJpZXZlIDJkIGNvbnRleHQiO3RoaXMuY2FudmFzPWUsdGhpcy5jb250ZXh0PXJ9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7fWVuYWJsZVBvc3RQcm9jZXNzaW5nKCl7fWRpc2FibGVQb3N0UHJvY2Vzc2luZygpe31hc3luYyBwcm9maWxlV2ViZ2woZSl7cmV0dXJuW119YXN5bmMgcmVuZGVyKGUscil7cmV0dXJuIHRoaXMuY2FudmFzfXJlc2l6ZUNhbnZhcyhlKXtjb25zdHt3aWR0aDpyLGhlaWdodDpufT1lO3RoaXMuY2FudmFzLndpZHRoPXIsdGhpcy5jYW52YXMuaGVpZ2h0PW59cmVuZGVyU2lsaG91ZXR0ZShlLHIsbj0ibm9uZSIpe2NvbnN0e3dpZHRoOnMsaGVpZ2h0Oml9PWU7dGhpcy5jb250ZXh0LnNhdmUoKSx0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHIsMCwwLHIud2lkdGgsci5oZWlnaHQsMCwwLHMsaSksdGhpcy5jb250ZXh0LmZpbHRlcj0iYmx1cig1cHgpIix0aGlzLmNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UociwwLDAsci53aWR0aCxyLmhlaWdodCwwLDAscyxpKSx0aGlzLmNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iLHRoaXMuY29udGV4dC5maWx0ZXI9bix0aGlzLmNvbnRleHQuZHJhd0ltYWdlKGUsMCwwLHMsaSwwLDAsdGhpcy5jYW52YXMud2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0KSx0aGlzLmNvbnRleHQucmVzdG9yZSgpfWRlc3Ryb3koKXt9fWNsYXNzIFRpIGV4dGVuZHMgQ3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnJhZGl1cz1lfWFzeW5jIHJlbmRlcihlLHIpe3N1cGVyLnJlc2l6ZUNhbnZhcyhlKTtjb25zdCBuPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHIpO3JldHVybiB0aGlzLnJlbmRlclNpbGhvdWV0dGUoZSxuKSx0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5maWx0ZXI9YGJsdXIoJHt0aGlzLnJhZGl1c31weClgLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsZS53aWR0aCxlLmhlaWdodCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKSxzdXBlci5yZW5kZXIoZSxyKX19Y2xhc3Mgd2kgZXh0ZW5kcyBDdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMucmFkaXVzPWV9YXN5bmMgcmVuZGVyKGUscil7c3VwZXIucmVzaXplQ2FudmFzKGUpO2NvbnN0IG49YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAocik7cmV0dXJuIHRoaXMucmVuZGVyU2lsaG91ZXR0ZShlLG4sYGJsdXIoJHt0aGlzLnJhZGl1c31weClgKSx0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5maWx0ZXI9Im5vbmUiLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsZS53aWR0aCxlLmhlaWdodCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKSxzdXBlci5yZW5kZXIoZSxyKX19Y2xhc3MgQWkgZXh0ZW5kcyBDdHtzZXRCYWNrZ3JvdW5kSW1hZ2UoZSl7dGhpcy5iYWNrZ3JvdW5kSW1hZ2U9ZX1hc3luYyByZW5kZXIoZSxyKXtzdXBlci5yZXNpemVDYW52YXMoZSk7Y29uc3Qgbj1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChyKTtyZXR1cm4gdGhpcy5yZW5kZXJTaWxob3VldHRlKGUsbiksdGhpcy5iYWNrZ3JvdW5kSW1hZ2UmJih0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5maWx0ZXI9Im5vbmUiLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UodGhpcy5iYWNrZ3JvdW5kSW1hZ2UsMCwwLHRoaXMuYmFja2dyb3VuZEltYWdlLndpZHRoLHRoaXMuYmFja2dyb3VuZEltYWdlLmhlaWdodCwwLDAsZS53aWR0aCxlLmhlaWdodCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKSksc3VwZXIucmVuZGVyKGUscil9fS8qIEBsaWNlbnNlIHR3Z2wuanMgNS41LjEgQ29weXJpZ2h0IChjKSAyMDE1LCBHcmVnZyBUYXZhcmVzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkF2YWlsYWJsZSB2aWEgdGhlIE1JVCBsaWNlbnNlLgpzZWU6IGh0dHA6Ly9naXRodWIuY29tL2dyZWdnbWFuL3R3Z2wuanMgZm9yIGRldGFpbHMgKi9jb25zdCBCdD01MTIwLHdlPTUxMjEsRHQ9NTEyMixNdD01MTIzLFV0PTUxMjQsTnQ9NTEyNSxPdD01MTI2LHZpPTMyODE5LFNpPTMyODIwLElpPTMzNjM1LFJpPTUxMzEsRmk9MzM2NDAsUGk9MzU4OTksa2k9MzU5MDIsQ2k9MzYyNjksQmk9MzQwNDIsenI9e307e2NvbnN0IHQ9enI7dFtCdF09SW50OEFycmF5LHRbd2VdPVVpbnQ4QXJyYXksdFtEdF09SW50MTZBcnJheSx0W010XT1VaW50MTZBcnJheSx0W1V0XT1JbnQzMkFycmF5LHRbTnRdPVVpbnQzMkFycmF5LHRbT3RdPUZsb2F0MzJBcnJheSx0W3ZpXT1VaW50MTZBcnJheSx0W1NpXT1VaW50MTZBcnJheSx0W0lpXT1VaW50MTZBcnJheSx0W1JpXT1VaW50MTZBcnJheSx0W0ZpXT1VaW50MzJBcnJheSx0W1BpXT1VaW50MzJBcnJheSx0W2tpXT1VaW50MzJBcnJheSx0W0NpXT1VaW50MzJBcnJheSx0W0JpXT1VaW50MzJBcnJheX1mdW5jdGlvbiBMdCh0KXtpZih0IGluc3RhbmNlb2YgSW50OEFycmF5KXJldHVybiBCdDtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheXx8dCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiB3ZTtpZih0IGluc3RhbmNlb2YgSW50MTZBcnJheSlyZXR1cm4gRHQ7aWYodCBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXJldHVybiBNdDtpZih0IGluc3RhbmNlb2YgSW50MzJBcnJheSlyZXR1cm4gVXQ7aWYodCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBOdDtpZih0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KXJldHVybiBPdDt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiBHcih0KXtpZih0PT09SW50OEFycmF5KXJldHVybiBCdDtpZih0PT09VWludDhBcnJheXx8dD09PVVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiB3ZTtpZih0PT09SW50MTZBcnJheSlyZXR1cm4gRHQ7aWYodD09PVVpbnQxNkFycmF5KXJldHVybiBNdDtpZih0PT09SW50MzJBcnJheSlyZXR1cm4gVXQ7aWYodD09PVVpbnQzMkFycmF5KXJldHVybiBOdDtpZih0PT09RmxvYXQzMkFycmF5KXJldHVybiBPdDt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiAkcih0KXtjb25zdCBlPXpyW3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcigidW5rbm93biBnbCB0eXBlIik7cmV0dXJuIGV9Y29uc3QgSmU9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5idWZmZXImJihlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuYnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTtmdW5jdGlvbiBWciguLi50KXtjb25zb2xlLmVycm9yKC4uLnQpfWNvbnN0IFdyPW5ldyBNYXA7ZnVuY3Rpb24gWmUodCxlKXtpZighdHx8dHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiExO2xldCByPVdyLmdldChlKTtyfHwocj1uZXcgV2Vha01hcCxXci5zZXQoZSxyKSk7bGV0IG49ci5nZXQodCk7aWYobj09PXZvaWQgMCl7Y29uc3Qgcz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7bj1zLnN1YnN0cmluZyg4LHMubGVuZ3RoLTEpPT09ZSxyLnNldCh0LG4pfXJldHVybiBufWZ1bmN0aW9uIERpKHQsZSl7cmV0dXJuIHR5cGVvZiBXZWJHTEJ1ZmZlcjwidSImJlplKGUsIldlYkdMQnVmZmVyIil9ZnVuY3Rpb24gTWkodCxlKXtyZXR1cm4gdHlwZW9mIFdlYkdMUmVuZGVyYnVmZmVyPCJ1IiYmWmUoZSwiV2ViR0xSZW5kZXJidWZmZXIiKX1mdW5jdGlvbiB6dCh0LGUpe3JldHVybiB0eXBlb2YgV2ViR0xUZXh0dXJlPCJ1IiYmWmUoZSwiV2ViR0xUZXh0dXJlIil9ZnVuY3Rpb24gVWkodCxlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2FtcGxlcjwidSImJlplKGUsIldlYkdMU2FtcGxlciIpfWNvbnN0IEhyPTM1MDQ0LEs9MzQ5NjIsTmk9MzQ5NjMsT2k9MzQ2NjAsTGk9NTEyMCx6aT01MTIxLEdpPTUxMjIsJGk9NTEyMyxWaT01MTI0LFdpPTUxMjUsanI9NTEyNixYcj17YXR0cmliUHJlZml4OiIifTtmdW5jdGlvbiBIaSh0LGUscixuLHMpe3QuYmluZEJ1ZmZlcihlLHIpLHQuYnVmZmVyRGF0YShlLG4sc3x8SHIpfWZ1bmN0aW9uIFlyKHQsZSxyLG4pe2lmKERpKHQsZSkpcmV0dXJuIGU7cj1yfHxLO2NvbnN0IHM9dC5jcmVhdGVCdWZmZXIoKTtyZXR1cm4gSGkodCxyLHMsZSxuKSxzfWZ1bmN0aW9uIFFyKHQpe3JldHVybiB0PT09ImluZGljZXMifWZ1bmN0aW9uIGppKHQpe3JldHVybiB0PT09SW50OEFycmF5fHx0PT09VWludDhBcnJheX1mdW5jdGlvbiBYaSh0KXtyZXR1cm4gdC5sZW5ndGg/dDp0LmRhdGF9Y29uc3QgWWk9L2Nvb3JkfHRleHR1cmUvaSxRaT0vY29sb3J8Y29sb3VyL2k7ZnVuY3Rpb24gcWkodCxlKXtsZXQgcjtpZihZaS50ZXN0KHQpP3I9MjpRaS50ZXN0KHQpP3I9NDpyPTMsZSVyPjApdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGd1ZXNzIG51bUNvbXBvbmVudHMgZm9yIGF0dHJpYnV0ZSAnJHt0fScuIFRyaWVkICR7cn0gYnV0ICR7ZX0gdmFsdWVzIGlzIG5vdCBldmVubHkgZGl2aXNpYmxlIGJ5ICR7cn0uIFlvdSBzaG91bGQgc3BlY2lmeSBpdC5gKTtyZXR1cm4gcn1mdW5jdGlvbiBLaSh0LGUscil7cmV0dXJuIHQubnVtQ29tcG9uZW50c3x8dC5zaXplfHxxaShlLHJ8fFhpKHQpLmxlbmd0aCl9ZnVuY3Rpb24gcXIodCxlKXtpZihKZSh0KSlyZXR1cm4gdDtpZihKZSh0LmRhdGEpKXJldHVybiB0LmRhdGE7QXJyYXkuaXNBcnJheSh0KSYmKHQ9e2RhdGE6dH0pO2xldCByPXQudHlwZT9HdCh0LnR5cGUpOnZvaWQgMDtyZXR1cm4gcnx8KFFyKGUpP3I9VWludDE2QXJyYXk6cj1GbG9hdDMyQXJyYXkpLG5ldyByKHQuZGF0YSl9ZnVuY3Rpb24gSmkodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj90OnQ/R3IodCk6anJ9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj8kcih0KTp0fHxGbG9hdDMyQXJyYXl9ZnVuY3Rpb24gWmkodCxlKXtyZXR1cm57YnVmZmVyOmUuYnVmZmVyLG51bVZhbHVlczoyKjMqNCx0eXBlOkppKGUudHlwZSksYXJyYXlUeXBlOkd0KGUudHlwZSl9fWZ1bmN0aW9uIGVvKHQsZSl7Y29uc3Qgcj1lLmRhdGF8fGUsbj1HdChlLnR5cGUpLHM9cipuLkJZVEVTX1BFUl9FTEVNRU5ULGk9dC5jcmVhdGVCdWZmZXIoKTtyZXR1cm4gdC5iaW5kQnVmZmVyKEssaSksdC5idWZmZXJEYXRhKEsscyxlLmRyYXdUeXBlfHxIcikse2J1ZmZlcjppLG51bVZhbHVlczpyLHR5cGU6R3IobiksYXJyYXlUeXBlOm59fWZ1bmN0aW9uIHRvKHQsZSxyKXtjb25zdCBuPXFyKGUscik7cmV0dXJue2FycmF5VHlwZTpuLmNvbnN0cnVjdG9yLGJ1ZmZlcjpZcih0LG4sdm9pZCAwLGUuZHJhd1R5cGUpLHR5cGU6THQobiksbnVtVmFsdWVzOjB9fWZ1bmN0aW9uIHJvKHQsZSl7Y29uc3Qgcj17fTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXtpZighUXIobikpe2NvbnN0IHM9ZVtuXSxpPXMuYXR0cmlifHxzLm5hbWV8fHMuYXR0cmliTmFtZXx8WHIuYXR0cmliUHJlZml4K247aWYocy52YWx1ZSl7aWYoIUFycmF5LmlzQXJyYXkocy52YWx1ZSkmJiFKZShzLnZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoImFycmF5LnZhbHVlIGlzIG5vdCBhcnJheSBvciB0eXBlZGFycmF5Iik7cltpXT17dmFsdWU6cy52YWx1ZX19ZWxzZXtsZXQgYTtzLmJ1ZmZlciYmcy5idWZmZXIgaW5zdGFuY2VvZiBXZWJHTEJ1ZmZlcj9hPVppOnR5cGVvZiBzPT0ibnVtYmVyInx8dHlwZW9mIHMuZGF0YT09Im51bWJlciI/YT1lbzphPXRvO2NvbnN0e2J1ZmZlcjpvLHR5cGU6YyxudW1WYWx1ZXM6dSxhcnJheVR5cGU6Zn09YSh0LHMsbiksZD1zLm5vcm1hbGl6ZSE9PXZvaWQgMD9zLm5vcm1hbGl6ZTpqaShmKSxoPUtpKHMsbix1KTtyW2ldPXtidWZmZXI6byxudW1Db21wb25lbnRzOmgsdHlwZTpjLG5vcm1hbGl6ZTpkLHN0cmlkZTpzLnN0cmlkZXx8MCxvZmZzZXQ6cy5vZmZzZXR8fDAsZGl2aXNvcjpzLmRpdmlzb3I9PT12b2lkIDA/dm9pZCAwOnMuZGl2aXNvcixkcmF3VHlwZTpzLmRyYXdUeXBlfX19fSksdC5iaW5kQnVmZmVyKEssbnVsbCkscn1mdW5jdGlvbiBubyh0LGUpe3JldHVybiBlPT09TGl8fGU9PT16aT8xOmU9PT1HaXx8ZT09PSRpPzI6ZT09PVZpfHxlPT09V2l8fGU9PT1qcj80OjB9Y29uc3QgJHQ9WyJwb3NpdGlvbiIsInBvc2l0aW9ucyIsImFfcG9zaXRpb24iXTtmdW5jdGlvbiBzbyh0LGUpe2xldCByLG47Zm9yKG49MDtuPCR0Lmxlbmd0aCYmKHI9JHRbbl0sIShyIGluIGV8fChyPVhyLmF0dHJpYlByZWZpeCtyLHIgaW4gZSkpKTsrK24pO249PT0kdC5sZW5ndGgmJihyPU9iamVjdC5rZXlzKGUpWzBdKTtjb25zdCBzPWVbcl07aWYoIXMuYnVmZmVyKXJldHVybiAxO3QuYmluZEJ1ZmZlcihLLHMuYnVmZmVyKTtjb25zdCBpPXQuZ2V0QnVmZmVyUGFyYW1ldGVyKEssT2kpO3QuYmluZEJ1ZmZlcihLLG51bGwpO2NvbnN0IGE9bm8odCxzLnR5cGUpLG89aS9hLGM9cy5udW1Db21wb25lbnRzfHxzLnNpemUsdT1vL2M7aWYodSUxIT09MCl0aHJvdyBuZXcgRXJyb3IoYG51bUNvbXBvbmVudHMgJHtjfSBub3QgY29ycmVjdCBmb3IgbGVuZ3RoICR7bGVuZ3RofWApO3JldHVybiB1fWZ1bmN0aW9uIGlvKHQsZSxyKXtjb25zdCBuPXJvKHQsZSkscz1PYmplY3QuYXNzaWduKHt9LHJ8fHt9KTtzLmF0dHJpYnM9T2JqZWN0LmFzc2lnbih7fSxyP3IuYXR0cmliczp7fSxuKTtjb25zdCBpPWUuaW5kaWNlcztpZihpKXtjb25zdCBhPXFyKGksImluZGljZXMiKTtzLmluZGljZXM9WXIodCxhLE5pKSxzLm51bUVsZW1lbnRzPWEubGVuZ3RoLHMuZWxlbWVudFR5cGU9THQoYSl9ZWxzZSBzLm51bUVsZW1lbnRzfHwocy5udW1FbGVtZW50cz1zbyh0LHMuYXR0cmlicykpO3JldHVybiBzfWZ1bmN0aW9uIEFlKHQpe3JldHVybiEhdC50ZXhTdG9yYWdlMkR9Y29uc3QgS3I9ZnVuY3Rpb24oKXtjb25zdCB0PXt9LGU9e307ZnVuY3Rpb24gcihuKXtjb25zdCBzPW4uY29uc3RydWN0b3IubmFtZTtpZighdFtzXSl7Zm9yKGNvbnN0IGkgaW4gbilpZih0eXBlb2YgbltpXT09Im51bWJlciIpe2NvbnN0IGE9ZVtuW2ldXTtlW25baV1dPWE/YCR7YX0gfCAke2l9YDppfXRbc109ITB9fXJldHVybiBmdW5jdGlvbihzLGkpe3JldHVybiByKHMpLGVbaV18fCh0eXBlb2YgaT09Im51bWJlciI/YDB4JHtpLnRvU3RyaW5nKDE2KX1gOmkpfX0oKSx6PXt0ZXh0dXJlQ29sb3I6bmV3IFVpbnQ4QXJyYXkoWzEyOCwxOTIsMjU1LDI1NV0pLHRleHR1cmVPcHRpb25zOnt9LGNyb3NzT3JpZ2luOnZvaWQgMH0sdmU9SmUsSnI9ZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdD10fHwodHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3JlYXRlRWxlbWVudD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOm51bGwpLHR9fSgpLFZ0PTY0MDYsUD02NDA3LGc9NjQwOCxXdD02NDA5LEh0PTY0MTAsaGU9NjQwMixqdD0zNDA0MSxldD0zMzA3MSxvbz05NzI4LGFvPTk3MjksRz0zNTUzLCQ9MzQwNjcsSj0zMjg3OSxaPTM1ODY2LFh0PTM0MDY5LGNvPTM0MDcwLHVvPTM0MDcxLGZvPTM0MDcyLGxvPTM0MDczLGhvPTM0MDc0LFl0PTEwMjQxLFF0PTEwMjQwLHR0PTEwMjQyLHJ0PTEwMjQzLFpyPTMyODgyLG1vPTMzMDgyLHBvPTMzMDgzLHlvPTMzMDg0LGJvPTMzMDg1LGdvPTM0ODkyLHhvPTM0ODkzLHF0PTMzMTcsZW49MzMxNCx0bj0zMjg3OCxybj0zMzE2LG5uPTMzMTUsc249MzI4NzcsRW89Mzc0NDMsX289Mzc0NDEsVG89Mzc0NDAsd289MzMzMjEsQW89MzY3NTYsdm89MzMzMjUsU289MzMzMjYsSW89MzMzMzAsUm89MzMzMjksRm89MzMzMzgsUG89MzMzMzcsa289MzMzNDAsQ289MzMzMzksQm89MzMzMjMsRG89MzY3NTcsTW89MzMzMjcsVW89MzMzMjgsTm89MzMzMzYsT289MzMzMzUsTG89MzMzMzIsem89MzMzMzEsR289MzMzMzQsJG89MzMzMzMsVm89MzI4NDksV289MzU5MDUsSG89MzYxOTQsam89MzY3NTgsWG89MzU4OTgsWW89MzU5MDEsUW89MzQ4NDMscW89MzQ4MzcsS289MzYyMjEsSm89MzYyMzksWm89MzYyMTUsZWE9MzYyMzMsdGE9MzYyMDkscmE9MzYyMjcsbmE9MzI4NTYsc2E9MzU5MDcsaWE9MzY3NTksb2E9MzI4NTUsYWE9MzI4NTQsY2E9MzI4NTcsdWE9MzQ4NDIsZmE9MzQ4MzYsbGE9MzYyMjAsZGE9MzYyMzgsaGE9MzY5NzUsbWE9MzYyMTQscGE9MzYyMzIseWE9MzYyMjYsYmE9MzYyMDgsZ2E9MzMxODkseGE9MzMxOTAsRWE9MzYwMTIsX2E9MzYwMTMsVGE9MzUwNTYsVj01MTIwLEU9NTEyMSxudD01MTIyLG1lPTUxMjMsc3Q9NTEyNCxlZT01MTI1LEE9NTEyNixvbj0zMjgxOSxhbj0zMjgyMCxjbj0zMzYzNSxrPTUxMzEsU2U9MzYxOTMsS3Q9MzM2NDAsd2E9MzU4OTksQWE9MzU5MDIsdmE9MzYyNjksU2E9MzQwNDIsSWU9MzMzMTksdGU9MzMzMjAsUmU9NjQwMyxyZT0zNjI0NCxuZT0zNjI0OCxXPTM2MjQ5LElhPXt9O3tjb25zdCB0PUlhO3RbVnRdPXtudW1Db2xvckNvbXBvbmVudHM6MX0sdFtXdF09e251bUNvbG9yQ29tcG9uZW50czoxfSx0W0h0XT17bnVtQ29sb3JDb21wb25lbnRzOjJ9LHRbUF09e251bUNvbG9yQ29tcG9uZW50czozfSx0W2ddPXtudW1Db2xvckNvbXBvbmVudHM6NH0sdFtSZV09e251bUNvbG9yQ29tcG9uZW50czoxfSx0W3JlXT17bnVtQ29sb3JDb21wb25lbnRzOjF9LHRbSWVdPXtudW1Db2xvckNvbXBvbmVudHM6Mn0sdFt0ZV09e251bUNvbG9yQ29tcG9uZW50czoyfSx0W1BdPXtudW1Db2xvckNvbXBvbmVudHM6M30sdFtuZV09e251bUNvbG9yQ29tcG9uZW50czozfSx0W2ddPXtudW1Db2xvckNvbXBvbmVudHM6NH0sdFtXXT17bnVtQ29sb3JDb21wb25lbnRzOjR9LHRbaGVdPXtudW1Db2xvckNvbXBvbmVudHM6MX0sdFtqdF09e251bUNvbG9yQ29tcG9uZW50czoyfX1sZXQgSnQ7ZnVuY3Rpb24gaXQodCl7aWYoIUp0KXtjb25zdCBlPXt9O2VbVnRdPXt0ZXh0dXJlRm9ybWF0OlZ0LGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEsMiwyLDRdLHR5cGU6W0UsayxTZSxBXX0sZVtXdF09e3RleHR1cmVGb3JtYXQ6V3QsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMSwyLDIsNF0sdHlwZTpbRSxrLFNlLEFdfSxlW0h0XT17dGV4dHVyZUZvcm1hdDpIdCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyLDQsNCw4XSx0eXBlOltFLGssU2UsQV19LGVbUF09e3RleHR1cmVGb3JtYXQ6UCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszLDYsNiwxMiwyXSx0eXBlOltFLGssU2UsQSxjbl19LGVbZ109e3RleHR1cmVGb3JtYXQ6Zyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDgsOCwxNiwyLDJdLHR5cGU6W0UsayxTZSxBLG9uLGFuXX0sZVtoZV09e3RleHR1cmVGb3JtYXQ6aGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMiw0XSx0eXBlOltlZSxtZV19LGVbd29dPXt0ZXh0dXJlRm9ybWF0OlJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W0VdfSxlW0FvXT17dGV4dHVyZUZvcm1hdDpSZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxXSx0eXBlOltWXX0sZVt2b109e3RleHR1cmVGb3JtYXQ6UmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNCwyXSx0eXBlOltBLGtdfSxlW1NvXT17dGV4dHVyZUZvcm1hdDpSZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltBXX0sZVtJb109e3RleHR1cmVGb3JtYXQ6cmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbRV19LGVbUm9dPXt0ZXh0dXJlRm9ybWF0OnJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W1ZdfSxlW0xvXT17dGV4dHVyZUZvcm1hdDpyZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOlttZV19LGVbem9dPXt0ZXh0dXJlRm9ybWF0OnJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzJdLHR5cGU6W250XX0sZVtHb109e3RleHR1cmVGb3JtYXQ6cmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbZWVdfSxlWyRvXT17dGV4dHVyZUZvcm1hdDpyZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltzdF19LGVbQm9dPXt0ZXh0dXJlRm9ybWF0OkllLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzJdLHR5cGU6W0VdfSxlW0RvXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltWXX0sZVtNb109e3RleHR1cmVGb3JtYXQ6SWUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbOCw0XSx0eXBlOltBLGtdfSxlW1VvXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltBXX0sZVtOb109e3RleHR1cmVGb3JtYXQ6dGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbRV19LGVbT29dPXt0ZXh0dXJlRm9ybWF0OnRlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzJdLHR5cGU6W1ZdfSxlW0ZvXT17dGV4dHVyZUZvcm1hdDp0ZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOlttZV19LGVbUG9dPXt0ZXh0dXJlRm9ybWF0OnRlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W250XX0sZVtrb109e3RleHR1cmVGb3JtYXQ6dGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbZWVdfSxlW0NvXT17dGV4dHVyZUZvcm1hdDp0ZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltzdF19LGVbVm9dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbRV19LGVbV29dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbRV19LGVbSG9dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMywyXSx0eXBlOltFLGNuXX0sZVtqb109e3RleHR1cmVGb3JtYXQ6UCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOltWXX0sZVtYb109e3RleHR1cmVGb3JtYXQ6UCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxMiw2LDRdLHR5cGU6W0Esayx3YV19LGVbWW9dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMTIsNiw0XSx0eXBlOltBLGssQWFdfSxlW1FvXT17dGV4dHVyZUZvcm1hdDpQLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEyLDZdLHR5cGU6W0Esa119LGVbcW9dPXt0ZXh0dXJlRm9ybWF0OlAsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTJdLHR5cGU6W0FdfSxlW0tvXT17dGV4dHVyZUZvcm1hdDpuZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOltFXX0sZVtKb109e3RleHR1cmVGb3JtYXQ6bmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbVl19LGVbWm9dPXt0ZXh0dXJlRm9ybWF0Om5lLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzZdLHR5cGU6W21lXX0sZVtlYV09e3RleHR1cmVGb3JtYXQ6bmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNl0sdHlwZTpbbnRdfSxlW3RhXT17dGV4dHVyZUZvcm1hdDpuZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsxMl0sdHlwZTpbZWVdfSxlW3JhXT17dGV4dHVyZUZvcm1hdDpuZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsxMl0sdHlwZTpbc3RdfSxlW25hXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0VdfSxlW3NhXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0VdfSxlW2lhXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W1ZdfSxlW29hXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsMiw0XSx0eXBlOltFLGFuLEt0XX0sZVthYV09e3RleHR1cmVGb3JtYXQ6Zyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDJdLHR5cGU6W0Usb25dfSxlW2NhXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0t0XX0sZVt1YV09e3RleHR1cmVGb3JtYXQ6Zyxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxNiw4XSx0eXBlOltBLGtdfSxlW2ZhXT17dGV4dHVyZUZvcm1hdDpnLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltBXX0sZVtsYV09e3RleHR1cmVGb3JtYXQ6Vyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltFXX0sZVtkYV09e3RleHR1cmVGb3JtYXQ6Vyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltWXX0sZVtoYV09e3RleHR1cmVGb3JtYXQ6Vyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltLdF19LGVbbWFdPXt0ZXh0dXJlRm9ybWF0OlcsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbbWVdfSxlW3BhXT17dGV4dHVyZUZvcm1hdDpXLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W250XX0sZVt5YV09e3RleHR1cmVGb3JtYXQ6Vyxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsxNl0sdHlwZTpbc3RdfSxlW2JhXT17dGV4dHVyZUZvcm1hdDpXLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltlZV19LGVbZ2FdPXt0ZXh0dXJlRm9ybWF0OmhlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzIsNF0sdHlwZTpbbWUsZWVdfSxlW3hhXT17dGV4dHVyZUZvcm1hdDpoZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltlZV19LGVbRWFdPXt0ZXh0dXJlRm9ybWF0OmhlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0FdfSxlW1RhXT17dGV4dHVyZUZvcm1hdDpqdCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltTYV19LGVbX2FdPXt0ZXh0dXJlRm9ybWF0Omp0LGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3ZhXX0sT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihyKXtjb25zdCBuPWVbcl07bi5ieXRlc1BlckVsZW1lbnRNYXA9e30sbi5ieXRlc1BlckVsZW1lbnQuZm9yRWFjaChmdW5jdGlvbihzLGkpe2NvbnN0IGE9bi50eXBlW2ldO24uYnl0ZXNQZXJFbGVtZW50TWFwW2FdPXN9KX0pLEp0PWV9cmV0dXJuIEp0W3RdfWZ1bmN0aW9uIFJhKHQsZSl7Y29uc3Qgcj1pdCh0KTtpZighcil0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7Y29uc3Qgbj1yLmJ5dGVzUGVyRWxlbWVudE1hcFtlXTtpZihuPT09dm9pZCAwKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm4gbn1mdW5jdGlvbiBGZSh0KXtjb25zdCBlPWl0KHQpO2lmKCFlKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm57Zm9ybWF0OmUudGV4dHVyZUZvcm1hdCx0eXBlOmUudHlwZVswXX19ZnVuY3Rpb24gdW4odCl7cmV0dXJuKHQmdC0xKT09PTB9ZnVuY3Rpb24gRmEodCxlLHIsbil7aWYoIUFlKHQpKXJldHVybiB1bihlKSYmdW4ocik7Y29uc3Qgcz1pdChuKTtpZighcyl0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7cmV0dXJuIHMuY29sb3JSZW5kZXJhYmxlJiZzLnRleHR1cmVGaWx0ZXJhYmxlfWZ1bmN0aW9uIFBhKHQpe2NvbnN0IGU9aXQodCk7aWYoIWUpdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybiBlLnRleHR1cmVGaWx0ZXJhYmxlfWZ1bmN0aW9uIGthKHQsZSxyKXtyZXR1cm4gdmUoZSk/THQoZSk6cnx8RX1mdW5jdGlvbiBvdCh0LGUscixuLHMpe2lmKHMlMSE9PTApdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7aWYoIXImJiFuKXtjb25zdCBpPU1hdGguc3FydChzLyhlPT09JD82OjEpKTtpJTE9PT0wPyhyPWksbj1pKToocj1zLG49MSl9ZWxzZSBpZihuKXtpZighciYmKHI9cy9uLHIlMSkpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyJ9ZWxzZSBpZihuPXMvcixuJTEpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7cmV0dXJue3dpZHRoOnIsaGVpZ2h0Om59fWZ1bmN0aW9uIHBlKHQsZSl7ZS5jb2xvcnNwYWNlQ29udmVyc2lvbiE9PXZvaWQgMCYmdC5waXhlbFN0b3JlaShFbyxlLmNvbG9yc3BhY2VDb252ZXJzaW9uKSxlLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJnQucGl4ZWxTdG9yZWkoX28sZS5wcmVtdWx0aXBseUFscGhhKSxlLmZsaXBZIT09dm9pZCAwJiZ0LnBpeGVsU3RvcmVpKFRvLGUuZmxpcFkpfWZ1bmN0aW9uIGZuKHQpe3QucGl4ZWxTdG9yZWkocXQsNCksQWUodCkmJih0LnBpeGVsU3RvcmVpKGVuLDApLHQucGl4ZWxTdG9yZWkodG4sMCksdC5waXhlbFN0b3JlaShybiwwKSx0LnBpeGVsU3RvcmVpKG5uLDApLHQucGl4ZWxTdG9yZWkoc24sMCkpfWZ1bmN0aW9uIENhKHQsZSxyLG4pe24ubWluTWFnJiYoci5jYWxsKHQsZSxZdCxuLm1pbk1hZyksci5jYWxsKHQsZSxRdCxuLm1pbk1hZykpLG4ubWluJiZyLmNhbGwodCxlLFl0LG4ubWluKSxuLm1hZyYmci5jYWxsKHQsZSxRdCxuLm1hZyksbi53cmFwJiYoci5jYWxsKHQsZSx0dCxuLndyYXApLHIuY2FsbCh0LGUscnQsbi53cmFwKSwoZT09PUp8fFVpKHQsZSkpJiZyLmNhbGwodCxlLFpyLG4ud3JhcCkpLG4ud3JhcFImJnIuY2FsbCh0LGUsWnIsbi53cmFwUiksbi53cmFwUyYmci5jYWxsKHQsZSx0dCxuLndyYXBTKSxuLndyYXBUJiZyLmNhbGwodCxlLHJ0LG4ud3JhcFQpLG4ubWluTG9kIT09dm9pZCAwJiZyLmNhbGwodCxlLG1vLG4ubWluTG9kKSxuLm1heExvZCE9PXZvaWQgMCYmci5jYWxsKHQsZSxwbyxuLm1heExvZCksbi5iYXNlTGV2ZWwhPT12b2lkIDAmJnIuY2FsbCh0LGUseW8sbi5iYXNlTGV2ZWwpLG4ubWF4TGV2ZWwhPT12b2lkIDAmJnIuY2FsbCh0LGUsYm8sbi5tYXhMZXZlbCksbi5jb21wYXJlRnVuYyE9PXZvaWQgMCYmci5jYWxsKHQsZSx4byxuLmNvbXBhcmVGdW5jKSxuLmNvbXBhcmVNb2RlIT09dm9pZCAwJiZyLmNhbGwodCxlLGdvLG4uY29tcGFyZU1vZGUpfWZ1bmN0aW9uIGxuKHQsZSxyKXtjb25zdCBuPXIudGFyZ2V0fHxHO3QuYmluZFRleHR1cmUobixlKSxDYSh0LG4sdC50ZXhQYXJhbWV0ZXJpLHIpfWZ1bmN0aW9uIEJhKHQpe3JldHVybiB0PXR8fHoudGV4dHVyZUNvbG9yLHZlKHQpP3Q6bmV3IFVpbnQ4QXJyYXkoW3RbMF0qMjU1LHRbMV0qMjU1LHRbMl0qMjU1LHRbM10qMjU1XSl9ZnVuY3Rpb24gWnQodCxlLHIsbixzLGkpe3I9cnx8ei50ZXh0dXJlT3B0aW9ucyxpPWl8fGc7Y29uc3QgYT1yLnRhcmdldHx8RztpZihuPW58fHIud2lkdGgscz1zfHxyLmhlaWdodCx0LmJpbmRUZXh0dXJlKGEsZSksRmEodCxuLHMsaSkpdC5nZW5lcmF0ZU1pcG1hcChhKTtlbHNle2NvbnN0IG89UGEoaSk/YW86b287dC50ZXhQYXJhbWV0ZXJpKGEsWXQsbyksdC50ZXhQYXJhbWV0ZXJpKGEsUXQsbyksdC50ZXhQYXJhbWV0ZXJpKGEsdHQsZXQpLHQudGV4UGFyYW1ldGVyaShhLHJ0LGV0KX19ZnVuY3Rpb24gUGUodCl7cmV0dXJuIHQuYXV0bz09PSEwfHx0LmF1dG89PT12b2lkIDAmJnQubGV2ZWw9PT12b2lkIDB9ZnVuY3Rpb24gZXIodCxlKXtyZXR1cm4gZT1lfHx7fSxlLmN1YmVGYWNlT3JkZXJ8fFtYdCxjbyx1byxmbyxsbyxob119ZnVuY3Rpb24gdHIodCxlKXtjb25zdCBuPWVyKHQsZSkubWFwKGZ1bmN0aW9uKHMsaSl7cmV0dXJue2ZhY2U6cyxuZHg6aX19KTtyZXR1cm4gbi5zb3J0KGZ1bmN0aW9uKHMsaSl7cmV0dXJuIHMuZmFjZS1pLmZhY2V9KSxufWZ1bmN0aW9uIGRuKHQsZSxyLG4pe249bnx8ei50ZXh0dXJlT3B0aW9ucztjb25zdCBzPW4udGFyZ2V0fHxHLGk9bi5sZXZlbHx8MDtsZXQgYT1yLndpZHRoLG89ci5oZWlnaHQ7Y29uc3QgYz1uLmludGVybmFsRm9ybWF0fHxuLmZvcm1hdHx8Zyx1PUZlKGMpLGY9bi5mb3JtYXR8fHUuZm9ybWF0LGQ9bi50eXBlfHx1LnR5cGU7aWYocGUodCxuKSx0LmJpbmRUZXh0dXJlKHMsZSkscz09PSQpe2NvbnN0IGg9ci53aWR0aCxwPXIuaGVpZ2h0O2xldCBsLHk7aWYoaC82PT09cClsPXAseT1bMCwwLDEsMCwyLDAsMywwLDQsMCw1LDBdO2Vsc2UgaWYocC82PT09aClsPWgseT1bMCwwLDAsMSwwLDIsMCwzLDAsNCwwLDVdO2Vsc2UgaWYoaC8zPT09cC8yKWw9aC8zLHk9WzAsMCwxLDAsMiwwLDAsMSwxLDEsMiwxXTtlbHNlIGlmKGgvMj09PXAvMylsPWgvMix5PVswLDAsMSwwLDAsMSwxLDEsMCwyLDEsMl07ZWxzZSB0aHJvdyJjYW4ndCBmaWd1cmUgb3V0IGN1YmUgbWFwIGZyb20gZWxlbWVudDogIisoci5zcmM/ci5zcmM6ci5ub2RlTmFtZSk7Y29uc3QgYj1KcigpO2I/KGIuY2FudmFzLndpZHRoPWwsYi5jYW52YXMuaGVpZ2h0PWwsYT1sLG89bCx0cih0LG4pLmZvckVhY2goZnVuY3Rpb24oeCl7Y29uc3QgUz15W3gubmR4KjIrMF0qbCxGPXlbeC5uZHgqMisxXSpsO2IuZHJhd0ltYWdlKHIsUyxGLGwsbCwwLDAsbCxsKSx0LnRleEltYWdlMkQoeC5mYWNlLGksYyxmLGQsYi5jYW52YXMpfSksYi5jYW52YXMud2lkdGg9MSxiLmNhbnZhcy5oZWlnaHQ9MSk6dHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwPCJ1IiYmKGE9bCxvPWwsdHIodCxuKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe2NvbnN0IFM9eVt4Lm5keCoyKzBdKmwsRj15W3gubmR4KjIrMV0qbDt0LnRleEltYWdlMkQoeC5mYWNlLGksYyxsLGwsMCxmLGQsbnVsbCksY3JlYXRlSW1hZ2VCaXRtYXAocixTLEYsbCxsLHtwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KS50aGVuKGZ1bmN0aW9uKFgpe3BlKHQsbiksdC5iaW5kVGV4dHVyZShzLGUpLHQudGV4SW1hZ2UyRCh4LmZhY2UsaSxjLGYsZCxYKSxQZShuKSYmWnQodCxlLG4sYSxvLGMpfSl9KSl9ZWxzZSBpZihzPT09Snx8cz09PVope2NvbnN0IGg9TWF0aC5taW4oci53aWR0aCxyLmhlaWdodCkscD1NYXRoLm1heChyLndpZHRoLHIuaGVpZ2h0KSxsPXAvaDtpZihsJTEhPT0wKXRocm93ImNhbiBub3QgY29tcHV0ZSAzRCBkaW1lbnNpb25zIG9mIGVsZW1lbnQiO2NvbnN0IHk9ci53aWR0aD09PXA/MTowLGI9ci5oZWlnaHQ9PT1wPzE6MDt0LnBpeGVsU3RvcmVpKHF0LDEpLHQucGl4ZWxTdG9yZWkoZW4sci53aWR0aCksdC5waXhlbFN0b3JlaSh0biwwKSx0LnBpeGVsU3RvcmVpKHNuLDApLHQudGV4SW1hZ2UzRChzLGksYyxoLGgsaCwwLGYsZCxudWxsKTtmb3IobGV0IHg9MDt4PGw7Kyt4KXtjb25zdCBTPXgqaCp5LEY9eCpoKmI7dC5waXhlbFN0b3JlaShybixTKSx0LnBpeGVsU3RvcmVpKG5uLEYpLHQudGV4U3ViSW1hZ2UzRChzLGksMCwwLHgsaCxoLDEsZixkLHIpfWZuKHQpfWVsc2UgdC50ZXhJbWFnZTJEKHMsaSxjLGYsZCxyKTtQZShuKSYmWnQodCxlLG4sYSxvLGMpLGxuKHQsZSxuKX1mdW5jdGlvbiBrZSgpe31mdW5jdGlvbiBEYSh0KXtpZih0eXBlb2YgZG9jdW1lbnQ8InUiKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gZS5ocmVmPXQsZS5ob3N0bmFtZT09PWxvY2F0aW9uLmhvc3RuYW1lJiZlLnBvcnQ9PT1sb2NhdGlvbi5wb3J0JiZlLnByb3RvY29sPT09bG9jYXRpb24ucHJvdG9jb2x9ZWxzZXtjb25zdCBlPW5ldyBVUkwobG9jYXRpb24uaHJlZikub3JpZ2luO3JldHVybiBuZXcgVVJMKHQsbG9jYXRpb24uaHJlZikub3JpZ2luPT09ZX19ZnVuY3Rpb24gTWEodCxlKXtyZXR1cm4gZT09PXZvaWQgMCYmIURhKHQpPyJhbm9ueW1vdXMiOmV9ZnVuY3Rpb24gVWEodCxlLHIpe3I9cnx8a2U7bGV0IG47aWYoZT1lIT09dm9pZCAwP2U6ei5jcm9zc09yaWdpbixlPU1hKHQsZSksdHlwZW9mIEltYWdlPCJ1Iil7bj1uZXcgSW1hZ2UsZSE9PXZvaWQgMCYmKG4uY3Jvc3NPcmlnaW49ZSk7Y29uc3Qgcz1mdW5jdGlvbigpe24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGkpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsYSksbj1udWxsfSxpPWZ1bmN0aW9uKCl7Y29uc3QgYz0iY291bGRuJ3QgbG9hZCBpbWFnZTogIit0O1ZyKGMpLHIoYyxuKSxzKCl9LGE9ZnVuY3Rpb24oKXtyKG51bGwsbikscygpfTtyZXR1cm4gbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsaSksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixhKSxuLnNyYz10LG59ZWxzZSBpZih0eXBlb2YgSW1hZ2VCaXRtYXA8InUiKXtsZXQgcyxpO2NvbnN0IGE9ZnVuY3Rpb24oKXtyKHMsaSl9LG89e307ZSYmKG8ubW9kZT0iY29ycyIpLGZldGNoKHQsbykudGhlbihmdW5jdGlvbihjKXtpZighYy5vayl0aHJvdyBjO3JldHVybiBjLmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGMse3ByZW11bHRpcGx5QWxwaGE6Im5vbmUiLGNvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn0pfSkudGhlbihmdW5jdGlvbihjKXtpPWMsc2V0VGltZW91dChhKX0pLmNhdGNoKGZ1bmN0aW9uKGMpe3M9YyxzZXRUaW1lb3V0KGEpfSksbj1udWxsfXJldHVybiBufWZ1bmN0aW9uIGhuKHQpe3JldHVybiB0eXBlb2YgSW1hZ2VCaXRtYXA8InUiJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXB8fHR5cGVvZiBJbWFnZURhdGE8InUiJiZ0IGluc3RhbmNlb2YgSW1hZ2VEYXRhfHx0eXBlb2YgSFRNTEVsZW1lbnQ8InUiJiZ0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR9ZnVuY3Rpb24gcnIodCxlLHIpe3JldHVybiBobih0KT8oc2V0VGltZW91dChmdW5jdGlvbigpe3IobnVsbCx0KX0pLHQpOlVhKHQsZSxyKX1mdW5jdGlvbiBucih0LGUscil7cj1yfHx6LnRleHR1cmVPcHRpb25zO2NvbnN0IG49ci50YXJnZXR8fEc7aWYodC5iaW5kVGV4dHVyZShuLGUpLHIuY29sb3I9PT0hMSlyZXR1cm47Y29uc3Qgcz1CYShyLmNvbG9yKTtpZihuPT09JClmb3IobGV0IGk9MDtpPDY7KytpKXQudGV4SW1hZ2UyRChYdCtpLDAsZywxLDEsMCxnLEUscyk7ZWxzZSBuPT09Snx8bj09PVo/dC50ZXhJbWFnZTNEKG4sMCxnLDEsMSwxLDAsZyxFLHMpOnQudGV4SW1hZ2UyRChuLDAsZywxLDEsMCxnLEUscyl9ZnVuY3Rpb24gTmEodCxlLHIsbil7cmV0dXJuIG49bnx8a2Uscj1yfHx6LnRleHR1cmVPcHRpb25zLG5yKHQsZSxyKSxyPU9iamVjdC5hc3NpZ24oe30scikscnIoci5zcmMsci5jcm9zc09yaWdpbixmdW5jdGlvbihpLGEpe2k/bihpLGUsYSk6KGRuKHQsZSxhLHIpLG4obnVsbCxlLGEpKX0pfWZ1bmN0aW9uIE9hKHQsZSxyLG4pe249bnx8a2U7Y29uc3Qgcz1yLnNyYztpZihzLmxlbmd0aCE9PTYpdGhyb3cidGhlcmUgbXVzdCBiZSA2IHVybHMgZm9yIGEgY3ViZW1hcCI7Y29uc3QgaT1yLmxldmVsfHwwLGE9ci5pbnRlcm5hbEZvcm1hdHx8ci5mb3JtYXR8fGcsbz1GZShhKSxjPXIuZm9ybWF0fHxvLmZvcm1hdCx1PXIudHlwZXx8RSxmPXIudGFyZ2V0fHxHO2lmKGYhPT0kKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfQ1VCRV9NQVAiO25yKHQsZSxyKSxyPU9iamVjdC5hc3NpZ24oe30scik7bGV0IGQ9Njtjb25zdCBoPVtdLHA9ZXIodCxyKTtsZXQgbDtmdW5jdGlvbiB5KGIpe3JldHVybiBmdW5jdGlvbih4LFMpey0tZCx4P2gucHVzaCh4KTpTLndpZHRoIT09Uy5oZWlnaHQ/aC5wdXNoKCJjdWJlbWFwIGZhY2UgaW1nIGlzIG5vdCBhIHNxdWFyZTogIitTLnNyYyk6KHBlKHQsciksdC5iaW5kVGV4dHVyZShmLGUpLGQ9PT01P2VyKCkuZm9yRWFjaChmdW5jdGlvbihGKXt0LnRleEltYWdlMkQoRixpLGEsYyx1LFMpfSk6dC50ZXhJbWFnZTJEKGIsaSxhLGMsdSxTKSxQZShyKSYmdC5nZW5lcmF0ZU1pcG1hcChmKSksZD09PTAmJm4oaC5sZW5ndGg/aDp2b2lkIDAsZSxsKX19bD1zLm1hcChmdW5jdGlvbihiLHgpe3JldHVybiBycihiLHIuY3Jvc3NPcmlnaW4seShwW3hdKSl9KX1mdW5jdGlvbiBMYSh0LGUscixuKXtuPW58fGtlO2NvbnN0IHM9ci5zcmMsaT1yLmludGVybmFsRm9ybWF0fHxyLmZvcm1hdHx8ZyxhPUZlKGkpLG89ci5mb3JtYXR8fGEuZm9ybWF0LGM9ci50eXBlfHxFLHU9ci50YXJnZXR8fFo7aWYodSE9PUomJnUhPT1aKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfM0Qgb3IgVEVYVFVSRV8yRF9BUlJBWSI7bnIodCxlLHIpLHI9T2JqZWN0LmFzc2lnbih7fSxyKTtsZXQgZj1zLmxlbmd0aDtjb25zdCBkPVtdO2xldCBoO2NvbnN0IHA9ci5sZXZlbHx8MDtsZXQgbD1yLndpZHRoLHk9ci5oZWlnaHQ7Y29uc3QgYj1zLmxlbmd0aDtsZXQgeD0hMDtmdW5jdGlvbiBTKEYpe3JldHVybiBmdW5jdGlvbihYLHNlKXtpZigtLWYsWClkLnB1c2goWCk7ZWxzZXtpZihwZSh0LHIpLHQuYmluZFRleHR1cmUodSxlKSx4KXt4PSExLGw9ci53aWR0aHx8c2Uud2lkdGgseT1yLmhlaWdodHx8c2UuaGVpZ2h0LHQudGV4SW1hZ2UzRCh1LHAsaSxsLHksYiwwLG8sYyxudWxsKTtmb3IobGV0IGllPTA7aWU8YjsrK2llKXQudGV4U3ViSW1hZ2UzRCh1LHAsMCwwLGllLGwseSwxLG8sYyxzZSl9ZWxzZXtsZXQgaWU9c2UsTTsoc2Uud2lkdGghPT1sfHxzZS5oZWlnaHQhPT15KSYmKE09SnIoKSxpZT1NLmNhbnZhcyxNLmNhbnZhcy53aWR0aD1sLE0uY2FudmFzLmhlaWdodD15LE0uZHJhd0ltYWdlKHNlLDAsMCxsLHkpKSx0LnRleFN1YkltYWdlM0QodSxwLDAsMCxGLGwseSwxLG8sYyxpZSksTSYmaWU9PT1NLmNhbnZhcyYmKE0uY2FudmFzLndpZHRoPTAsTS5jYW52YXMuaGVpZ2h0PTApfVBlKHIpJiZ0LmdlbmVyYXRlTWlwbWFwKHUpfWY9PT0wJiZuKGQubGVuZ3RoP2Q6dm9pZCAwLGUsaCl9fWg9cy5tYXAoZnVuY3Rpb24oRixYKXtyZXR1cm4gcnIoRixyLmNyb3NzT3JpZ2luLFMoWCkpfSl9ZnVuY3Rpb24gemEodCxlLHIsbil7bj1ufHx6LnRleHR1cmVPcHRpb25zO2NvbnN0IHM9bi50YXJnZXR8fEc7dC5iaW5kVGV4dHVyZShzLGUpO2xldCBpPW4ud2lkdGgsYT1uLmhlaWdodCxvPW4uZGVwdGg7Y29uc3QgYz1uLmxldmVsfHwwLHU9bi5pbnRlcm5hbEZvcm1hdHx8bi5mb3JtYXR8fGcsZj1GZSh1KSxkPW4uZm9ybWF0fHxmLmZvcm1hdCxoPW4udHlwZXx8a2EodCxyLGYudHlwZSk7aWYodmUocikpciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiYocj1uZXcgVWludDhBcnJheShyLmJ1ZmZlcikpO2Vsc2V7Y29uc3QgYj0kcihoKTtyPW5ldyBiKHIpfWNvbnN0IHA9UmEodSxoKSxsPXIuYnl0ZUxlbmd0aC9wO2lmKGwlMSl0aHJvdyJsZW5ndGggd3Jvbmcgc2l6ZSBmb3IgZm9ybWF0OiAiK0tyKHQsZCk7bGV0IHk7aWYocz09PUp8fHM9PT1aKWlmKCFpJiYhYSYmIW8pe2NvbnN0IGI9TWF0aC5jYnJ0KGwpO2lmKGIlMSE9PTApdGhyb3ciY2FuJ3QgZ3Vlc3MgY3ViZSBzaXplIG9mIGFycmF5IG9mIG51bUVsZW1lbnRzOiAiK2w7aT1iLGE9YixvPWJ9ZWxzZSBpJiYoIWF8fCFvKT8oeT1vdCh0LHMsYSxvLGwvaSksYT15LndpZHRoLG89eS5oZWlnaHQpOmEmJighaXx8IW8pPyh5PW90KHQscyxpLG8sbC9hKSxpPXkud2lkdGgsbz15LmhlaWdodCk6KHk9b3QodCxzLGksYSxsL28pLGk9eS53aWR0aCxhPXkuaGVpZ2h0KTtlbHNlIHk9b3QodCxzLGksYSxsKSxpPXkud2lkdGgsYT15LmhlaWdodDtpZihmbih0KSx0LnBpeGVsU3RvcmVpKHF0LG4udW5wYWNrQWxpZ25tZW50fHwxKSxwZSh0LG4pLHM9PT0kKXtjb25zdCBiPXAvci5CWVRFU19QRVJfRUxFTUVOVCx4PWwvNipiO3RyKHQsbikuZm9yRWFjaChTPT57Y29uc3QgRj14KlMubmR4LFg9ci5zdWJhcnJheShGLEYreCk7dC50ZXhJbWFnZTJEKFMuZmFjZSxjLHUsaSxhLDAsZCxoLFgpfSl9ZWxzZSBzPT09Snx8cz09PVo/dC50ZXhJbWFnZTNEKHMsYyx1LGksYSxvLDAsZCxoLHIpOnQudGV4SW1hZ2UyRChzLGMsdSxpLGEsMCxkLGgscik7cmV0dXJue3dpZHRoOmksaGVpZ2h0OmEsZGVwdGg6byx0eXBlOmh9fWZ1bmN0aW9uIEdhKHQsZSxyKXtjb25zdCBuPXIudGFyZ2V0fHxHO3QuYmluZFRleHR1cmUobixlKTtjb25zdCBzPXIubGV2ZWx8fDAsaT1yLmludGVybmFsRm9ybWF0fHxyLmZvcm1hdHx8ZyxhPUZlKGkpLG89ci5mb3JtYXR8fGEuZm9ybWF0LGM9ci50eXBlfHxhLnR5cGU7aWYocGUodCxyKSxuPT09JClmb3IobGV0IHU9MDt1PDY7Kyt1KXQudGV4SW1hZ2UyRChYdCt1LHMsaSxyLndpZHRoLHIuaGVpZ2h0LDAsbyxjLG51bGwpO2Vsc2Ugbj09PUp8fG49PT1aP3QudGV4SW1hZ2UzRChuLHMsaSxyLndpZHRoLHIuaGVpZ2h0LHIuZGVwdGgsMCxvLGMsbnVsbCk6dC50ZXhJbWFnZTJEKG4scyxpLHIud2lkdGgsci5oZWlnaHQsMCxvLGMsbnVsbCl9ZnVuY3Rpb24gbW4odCxlLHIpe3I9cnx8a2UsZT1lfHx6LnRleHR1cmVPcHRpb25zO2NvbnN0IG49dC5jcmVhdGVUZXh0dXJlKCkscz1lLnRhcmdldHx8RztsZXQgaT1lLndpZHRofHwxLGE9ZS5oZWlnaHR8fDE7Y29uc3Qgbz1lLmludGVybmFsRm9ybWF0fHxnO3QuYmluZFRleHR1cmUocyxuKSxzPT09JCYmKHQudGV4UGFyYW1ldGVyaShzLHR0LGV0KSx0LnRleFBhcmFtZXRlcmkocyxydCxldCkpO2xldCBjPWUuc3JjO2lmKGMpaWYodHlwZW9mIGM9PSJmdW5jdGlvbiImJihjPWModCxlKSksdHlwZW9mIGM9PSJzdHJpbmciKU5hKHQsbixlLHIpO2Vsc2UgaWYodmUoYyl8fEFycmF5LmlzQXJyYXkoYykmJih0eXBlb2YgY1swXT09Im51bWJlciJ8fEFycmF5LmlzQXJyYXkoY1swXSl8fHZlKGNbMF0pKSl7Y29uc3QgdT16YSh0LG4sYyxlKTtpPXUud2lkdGgsYT11LmhlaWdodH1lbHNlIEFycmF5LmlzQXJyYXkoYykmJih0eXBlb2YgY1swXT09InN0cmluZyJ8fGhuKGNbMF0pKT9zPT09JD9PYSh0LG4sZSxyKTpMYSh0LG4sZSxyKTooZG4odCxuLGMsZSksaT1jLndpZHRoLGE9Yy5oZWlnaHQpO2Vsc2UgR2EodCxuLGUpO3JldHVybiBQZShlKSYmWnQodCxuLGUsaSxhLG8pLGxuKHQsbixlKSxufWNvbnN0IHNyPVZyO2Z1bmN0aW9uIHBuKHQpe3JldHVybiB0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTpudWxsfWNvbnN0IGF0PTMzOTg0LGN0PTM0OTYyLCRhPTM0OTYzLFZhPTM1NzEzLFdhPTM1NzE0LEhhPTM1NjMyLGphPTM1NjMzLFhhPTM1OTgxLHluPTM1NzE4LFlhPTM1NzIxLFFhPTM1OTcxLHFhPTM1MzgyLEthPTM1Mzk2LEphPTM1Mzk4LFphPTM1MzkyLGVjPTM1Mzk1LHV0PTUxMjYsYm49MzU2NjQsZ249MzU2NjUseG49MzU2NjYsaXI9NTEyNCxFbj0zNTY2Nyxfbj0zNTY2OCxUbj0zNTY2OSx3bj0zNTY3MCxBbj0zNTY3MSx2bj0zNTY3MixTbj0zNTY3MyxJbj0zNTY3NCxSbj0zNTY3NSxGbj0zNTY3Nix0Yz0zNTY3OCxyYz0zNTY4MCxuYz0zNTY3OSxzYz0zNTY4MixpYz0zNTY4NSxvYz0zNTY4NixhYz0zNTY4NyxjYz0zNTY4OCx1Yz0zNTY4OSxmYz0zNTY5MCxsYz0zNjI4OSxkYz0zNjI5MixoYz0zNjI5Myxvcj01MTI1LFBuPTM2Mjk0LGtuPTM2Mjk1LENuPTM2Mjk2LG1jPTM2Mjk4LHBjPTM2Mjk5LHljPTM2MzAwLGJjPTM2MzAzLGdjPTM2MzA2LHhjPTM2MzA3LEVjPTM2MzA4LF9jPTM2MzExLGZ0PTM1NTMsbHQ9MzQwNjcsYXI9MzI4NzksZHQ9MzU4NjYsbT17fTtmdW5jdGlvbiBCbih0LGUpe3JldHVybiBtW2VdLmJpbmRQb2ludH1mdW5jdGlvbiBUYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm0xZihlLHIpfX1mdW5jdGlvbiB3Yyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm0xZnYoZSxyKX19ZnVuY3Rpb24gQWModCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtMmZ2KGUscil9fWZ1bmN0aW9uIHZjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybTNmdihlLHIpfX1mdW5jdGlvbiBTYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm00ZnYoZSxyKX19ZnVuY3Rpb24gRG4odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtMWkoZSxyKX19ZnVuY3Rpb24gTW4odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtMWl2KGUscil9fWZ1bmN0aW9uIFVuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybTJpdihlLHIpfX1mdW5jdGlvbiBObih0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm0zaXYoZSxyKX19ZnVuY3Rpb24gT24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtNGl2KGUscil9fWZ1bmN0aW9uIEljKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybTF1aShlLHIpfX1mdW5jdGlvbiBSYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm0xdWl2KGUscil9fWZ1bmN0aW9uIEZjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybTJ1aXYoZSxyKX19ZnVuY3Rpb24gUGModCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtM3VpdihlLHIpfX1mdW5jdGlvbiBrYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm00dWl2KGUscil9fWZ1bmN0aW9uIENjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDJmdihlLCExLHIpfX1mdW5jdGlvbiBCYyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXt0LnVuaWZvcm1NYXRyaXgzZnYoZSwhMSxyKX19ZnVuY3Rpb24gRGModCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7dC51bmlmb3JtTWF0cml4NGZ2KGUsITEscil9fWZ1bmN0aW9uIE1jKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDJ4M2Z2KGUsITEscil9fWZ1bmN0aW9uIFVjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDN4MmZ2KGUsITEscil9fWZ1bmN0aW9uIE5jKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDJ4NGZ2KGUsITEscil9fWZ1bmN0aW9uIE9jKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDR4MmZ2KGUsITEscil9fWZ1bmN0aW9uIExjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDN4NGZ2KGUsITEscil9fWZ1bmN0aW9uIHpjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3QudW5pZm9ybU1hdHJpeDR4M2Z2KGUsITEscil9fWZ1bmN0aW9uIEkodCxlLHIsbil7Y29uc3Qgcz1Cbih0LGUpO3JldHVybiBBZSh0KT9mdW5jdGlvbihpKXtsZXQgYSxvOyFpfHx6dCh0LGkpPyhhPWksbz1udWxsKTooYT1pLnRleHR1cmUsbz1pLnNhbXBsZXIpLHQudW5pZm9ybTFpKG4sciksdC5hY3RpdmVUZXh0dXJlKGF0K3IpLHQuYmluZFRleHR1cmUocyxhKSx0LmJpbmRTYW1wbGVyKHIsbyl9OmZ1bmN0aW9uKGkpe3QudW5pZm9ybTFpKG4sciksdC5hY3RpdmVUZXh0dXJlKGF0K3IpLHQuYmluZFRleHR1cmUocyxpKX19ZnVuY3Rpb24gUih0LGUscixuLHMpe2NvbnN0IGk9Qm4odCxlKSxhPW5ldyBJbnQzMkFycmF5KHMpO2ZvcihsZXQgbz0wO288czsrK28pYVtvXT1yK287cmV0dXJuIEFlKHQpP2Z1bmN0aW9uKG8pe3QudW5pZm9ybTFpdihuLGEpLG8uZm9yRWFjaChmdW5jdGlvbihjLHUpe3QuYWN0aXZlVGV4dHVyZShhdCthW3VdKTtsZXQgZixkOyFjfHx6dCh0LGMpPyhmPWMsZD1udWxsKTooZj1jLnRleHR1cmUsZD1jLnNhbXBsZXIpLHQuYmluZFNhbXBsZXIocixkKSx0LmJpbmRUZXh0dXJlKGksZil9KX06ZnVuY3Rpb24obyl7dC51bmlmb3JtMWl2KG4sYSksby5mb3JFYWNoKGZ1bmN0aW9uKGMsdSl7dC5hY3RpdmVUZXh0dXJlKGF0K2FbdV0pLHQuYmluZFRleHR1cmUoaSxjKX0pfX1tW3V0XT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0LHNldHRlcjpUYyxhcnJheVNldHRlcjp3Y30sbVtibl09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6OCxzZXR0ZXI6QWMsY29sczoyfSxtW2duXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6dmMsY29sczozfSxtW3huXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6U2MsY29sczo0fSxtW2lyXT17VHlwZTpJbnQzMkFycmF5LHNpemU6NCxzZXR0ZXI6RG4sYXJyYXlTZXR0ZXI6TW59LG1bRW5dPXtUeXBlOkludDMyQXJyYXksc2l6ZTo4LHNldHRlcjpVbixjb2xzOjJ9LG1bX25dPXtUeXBlOkludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6Tm4sY29sczozfSxtW1RuXT17VHlwZTpJbnQzMkFycmF5LHNpemU6MTYsc2V0dGVyOk9uLGNvbHM6NH0sbVtvcl09e1R5cGU6VWludDMyQXJyYXksc2l6ZTo0LHNldHRlcjpJYyxhcnJheVNldHRlcjpSY30sbVtQbl09e1R5cGU6VWludDMyQXJyYXksc2l6ZTo4LHNldHRlcjpGYyxjb2xzOjJ9LG1ba25dPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6MTIsc2V0dGVyOlBjLGNvbHM6M30sbVtDbl09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6a2MsY29sczo0fSxtW3duXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjQsc2V0dGVyOkRuLGFycmF5U2V0dGVyOk1ufSxtW0FuXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjgsc2V0dGVyOlVuLGNvbHM6Mn0sbVt2bl09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6Tm4sY29sczozfSxtW1NuXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjE2LHNldHRlcjpPbixjb2xzOjR9LG1bSW5dPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpDYyxyb3dzOjIsY29sczoyfSxtW1JuXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0OCxzZXR0ZXI6QmMscm93czozLGNvbHM6M30sbVtGbl09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NjQsc2V0dGVyOkRjLHJvd3M6NCxjb2xzOjR9LG1baWNdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpNYyxyb3dzOjIsY29sczozfSxtW29jXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTozMixzZXR0ZXI6TmMscm93czoyLGNvbHM6NH0sbVthY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NDgsc2V0dGVyOlVjLHJvd3M6Myxjb2xzOjJ9LG1bY2NdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQ4LHNldHRlcjpMYyxyb3dzOjMsY29sczo0fSxtW3VjXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6T2Mscm93czo0LGNvbHM6Mn0sbVtmY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NjQsc2V0dGVyOnpjLHJvd3M6NCxjb2xzOjN9LG1bdGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50OmZ0fSxtW3JjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpsdH0sbVtuY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6YXJ9LG1bc2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50OmZ0fSxtW2xjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpkdH0sbVtkY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6ZHR9LG1baGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50Omx0fSxtW21jXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpmdH0sbVtwY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6YXJ9LG1beWNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50Omx0fSxtW2JjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpkdH0sbVtnY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6ZnR9LG1beGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpJLGFycmF5U2V0dGVyOlIsYmluZFBvaW50OmFyfSxtW0VjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6SSxhcnJheVNldHRlcjpSLGJpbmRQb2ludDpsdH0sbVtfY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkksYXJyYXlTZXR0ZXI6UixiaW5kUG9pbnQ6ZHR9O2Z1bmN0aW9uIGh0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2lmKHIudmFsdWUpc3dpdGNoKHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHIudmFsdWUubGVuZ3RoKXtjYXNlIDQ6dC52ZXJ0ZXhBdHRyaWI0ZnYoZSxyLnZhbHVlKTticmVhaztjYXNlIDM6dC52ZXJ0ZXhBdHRyaWIzZnYoZSxyLnZhbHVlKTticmVhaztjYXNlIDI6dC52ZXJ0ZXhBdHRyaWIyZnYoZSxyLnZhbHVlKTticmVhaztjYXNlIDE6dC52ZXJ0ZXhBdHRyaWIxZnYoZSxyLnZhbHVlKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBhIGZsb2F0IGNvbnN0YW50IHZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0ISIpfWVsc2UgdC5iaW5kQnVmZmVyKGN0LHIuYnVmZmVyKSx0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLHIubnVtQ29tcG9uZW50c3x8ci5zaXplLHIudHlwZXx8dXQsci5ub3JtYWxpemV8fCExLHIuc3RyaWRlfHwwLHIub2Zmc2V0fHwwKSx0LnZlcnRleEF0dHJpYkRpdmlzb3ImJnQudmVydGV4QXR0cmliRGl2aXNvcihlLHIuZGl2aXNvcnx8MCl9fWZ1bmN0aW9uIEgodCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7aWYoci52YWx1ZSlpZih0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZhbHVlLmxlbmd0aD09PTQpdC52ZXJ0ZXhBdHRyaWI0aXYoZSxyLnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHQuYmluZEJ1ZmZlcihjdCxyLmJ1ZmZlciksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZlcnRleEF0dHJpYklQb2ludGVyKGUsci5udW1Db21wb25lbnRzfHxyLnNpemUsci50eXBlfHxpcixyLnN0cmlkZXx8MCxyLm9mZnNldHx8MCksdC52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZ0LnZlcnRleEF0dHJpYkRpdmlzb3IoZSxyLmRpdmlzb3J8fDApfX1mdW5jdGlvbiBtdCh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtpZihyLnZhbHVlKWlmKHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHIudmFsdWUubGVuZ3RoPT09NCl0LnZlcnRleEF0dHJpYjR1aXYoZSxyLnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHQuYmluZEJ1ZmZlcihjdCxyLmJ1ZmZlciksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZlcnRleEF0dHJpYklQb2ludGVyKGUsci5udW1Db21wb25lbnRzfHxyLnNpemUsci50eXBlfHxvcixyLnN0cmlkZXx8MCxyLm9mZnNldHx8MCksdC52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZ0LnZlcnRleEF0dHJpYkRpdmlzb3IoZSxyLmRpdmlzb3J8fDApfX1mdW5jdGlvbiBjcih0LGUscil7Y29uc3Qgbj1yLnNpemUscz1yLmNvdW50O3JldHVybiBmdW5jdGlvbihpKXt0LmJpbmRCdWZmZXIoY3QsaS5idWZmZXIpO2NvbnN0IGE9aS5zaXplfHxpLm51bUNvbXBvbmVudHN8fG4sbz1hL3MsYz1pLnR5cGV8fHV0LGY9bVtjXS5zaXplKmEsZD1pLm5vcm1hbGl6ZXx8ITEsaD1pLm9mZnNldHx8MCxwPWYvcztmb3IobGV0IGw9MDtsPHM7KytsKXQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZStsKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoZStsLG8sYyxkLGYsaCtwKmwpLHQudmVydGV4QXR0cmliRGl2aXNvciYmdC52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUrbCxpLmRpdmlzb3J8fDApfX1jb25zdCBfPXt9O19bdXRdPXtzaXplOjQsc2V0dGVyOmh0fSxfW2JuXT17c2l6ZTo4LHNldHRlcjpodH0sX1tnbl09e3NpemU6MTIsc2V0dGVyOmh0fSxfW3huXT17c2l6ZToxNixzZXR0ZXI6aHR9LF9baXJdPXtzaXplOjQsc2V0dGVyOkh9LF9bRW5dPXtzaXplOjgsc2V0dGVyOkh9LF9bX25dPXtzaXplOjEyLHNldHRlcjpIfSxfW1RuXT17c2l6ZToxNixzZXR0ZXI6SH0sX1tvcl09e3NpemU6NCxzZXR0ZXI6bXR9LF9bUG5dPXtzaXplOjgsc2V0dGVyOm10fSxfW2tuXT17c2l6ZToxMixzZXR0ZXI6bXR9LF9bQ25dPXtzaXplOjE2LHNldHRlcjptdH0sX1t3bl09e3NpemU6NCxzZXR0ZXI6SH0sX1tBbl09e3NpemU6OCxzZXR0ZXI6SH0sX1t2bl09e3NpemU6MTIsc2V0dGVyOkh9LF9bU25dPXtzaXplOjE2LHNldHRlcjpIfSxfW0luXT17c2l6ZTo0LHNldHRlcjpjcixjb3VudDoyfSxfW1JuXT17c2l6ZTo5LHNldHRlcjpjcixjb3VudDozfSxfW0ZuXT17c2l6ZToxNixzZXR0ZXI6Y3IsY291bnQ6NH07Y29uc3QgR2M9L0VSUk9SOlxzKlxkKzooXGQrKS9naTtmdW5jdGlvbiAkYyh0LGU9IiIscj0wKXtjb25zdCBuPVsuLi5lLm1hdGNoQWxsKEdjKV0scz1uZXcgTWFwKG4ubWFwKChpLGEpPT57Y29uc3Qgbz1wYXJzZUludChpWzFdKSxjPW5bYSsxXSx1PWM/Yy5pbmRleDplLmxlbmd0aCxmPWUuc3Vic3RyaW5nKGkuaW5kZXgsdSk7cmV0dXJuW28tMSxmXX0pKTtyZXR1cm4gdC5zcGxpdChgCmApLm1hcCgoaSxhKT0+e2NvbnN0IG89cy5nZXQoYSk7cmV0dXJuYCR7YSsxK3J9OiAke2l9JHtvP2AKCl5eXiAke299YDoiIn1gfSkuam9pbihgCmApfWNvbnN0IExuPS9eWyBcdF0qXG4vO2Z1bmN0aW9uIHpuKHQpe2xldCBlPTA7cmV0dXJuIExuLnRlc3QodCkmJihlPTEsdD10LnJlcGxhY2UoTG4sIiIpKSx7bGluZU9mZnNldDplLHNoYWRlclNvdXJjZTp0fX1mdW5jdGlvbiBWYyh0LGUpe3JldHVybiB0LmVycm9yQ2FsbGJhY2soZSksdC5jYWxsYmFjayYmc2V0VGltZW91dCgoKT0+e3QuY2FsbGJhY2soYCR7ZX0KJHt0LmVycm9ycy5qb2luKGAKYCl9YCl9KSxudWxsfWZ1bmN0aW9uIFdjKHQsZSxyLG4pe2lmKG49bnx8c3IsIXQuZ2V0U2hhZGVyUGFyYW1ldGVyKHIsVmEpKXtjb25zdCBpPXQuZ2V0U2hhZGVySW5mb0xvZyhyKSx7bGluZU9mZnNldDphLHNoYWRlclNvdXJjZTpvfT16bih0LmdldFNoYWRlclNvdXJjZShyKSksYz1gJHskYyhvLGksYSl9CkVycm9yIGNvbXBpbGluZyAke0tyKHQsZSl9OiAke2l9YDtyZXR1cm4gbihjKSxjfXJldHVybiIifWZ1bmN0aW9uIHVyKHQsZSxyKXtsZXQgbixzLGk7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT12b2lkIDApLHR5cGVvZiB0PT0iZnVuY3Rpb24iKXI9dCx0PXZvaWQgMDtlbHNlIGlmKHQmJiFBcnJheS5pc0FycmF5KHQpKXtjb25zdCB1PXQ7cj11LmVycm9yQ2FsbGJhY2ssdD11LmF0dHJpYkxvY2F0aW9ucyxuPXUudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyxzPXUudHJhbnNmb3JtRmVlZGJhY2tNb2RlLGk9dS5jYWxsYmFja31jb25zdCBhPXJ8fHNyLG89W10sYz17ZXJyb3JDYWxsYmFjayh1LC4uLmYpe28ucHVzaCh1KSxhKHUsLi4uZil9LHRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3M6bix0cmFuc2Zvcm1GZWVkYmFja01vZGU6cyxjYWxsYmFjazppLGVycm9yczpvfTt7bGV0IHU9e307QXJyYXkuaXNBcnJheSh0KT90LmZvckVhY2goZnVuY3Rpb24oZixkKXt1W2ZdPWU/ZVtkXTpkfSk6dT10fHx7fSxjLmF0dHJpYkxvY2F0aW9ucz11fXJldHVybiBjfWNvbnN0IEhjPVsiVkVSVEVYX1NIQURFUiIsIkZSQUdNRU5UX1NIQURFUiJdO2Z1bmN0aW9uIGpjKHQsZSl7aWYoZS5pbmRleE9mKCJmcmFnIik+PTApcmV0dXJuIEhhO2lmKGUuaW5kZXhPZigidmVydCIpPj0wKXJldHVybiBqYX1mdW5jdGlvbiBYYyh0LGUscil7Y29uc3Qgbj10LmdldEF0dGFjaGVkU2hhZGVycyhlKTtmb3IoY29uc3QgcyBvZiBuKXIuaGFzKHMpJiZ0LmRlbGV0ZVNoYWRlcihzKTt0LmRlbGV0ZVByb2dyYW0oZSl9Y29uc3QgWWM9KHQ9MCk9Pm5ldyBQcm9taXNlKGU9PnNldFRpbWVvdXQoZSx0KSk7ZnVuY3Rpb24gUWModCxlLHIpe2NvbnN0IG49dC5jcmVhdGVQcm9ncmFtKCkse2F0dHJpYkxvY2F0aW9uczpzLHRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3M6aSx0cmFuc2Zvcm1GZWVkYmFja01vZGU6YX09dXIocik7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDsrK28pe2xldCBjPWVbb107aWYodHlwZW9mIGM9PSJzdHJpbmciKXtjb25zdCB1PXBuKGMpLGY9dT91LnRleHQ6YztsZXQgZD10W0hjW29dXTt1JiZ1LnR5cGUmJihkPWpjKHQsdS50eXBlKXx8ZCksYz10LmNyZWF0ZVNoYWRlcihkKSx0LnNoYWRlclNvdXJjZShjLHpuKGYpLnNoYWRlclNvdXJjZSksdC5jb21waWxlU2hhZGVyKGMpLHQuYXR0YWNoU2hhZGVyKG4sYyl9fU9iamVjdC5lbnRyaWVzKHMpLmZvckVhY2goKFtvLGNdKT0+dC5iaW5kQXR0cmliTG9jYXRpb24obixjLG8pKTt7bGV0IG89aTtvJiYoby5hdHRyaWJzJiYobz1vLmF0dHJpYnMpLEFycmF5LmlzQXJyYXkobyl8fChvPU9iamVjdC5rZXlzKG8pKSx0LnRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MobixvLGF8fFhhKSl9cmV0dXJuIHQubGlua1Byb2dyYW0obiksbn1mdW5jdGlvbiBxYyh0LGUscixuLHMpe2NvbnN0IGk9dXIocixuLHMpLGE9bmV3IFNldChlKSxvPVFjKHQsZSxpKTtmdW5jdGlvbiBjKHUsZil7Y29uc3QgZD1KYyh1LGYsaS5lcnJvckNhbGxiYWNrKTtyZXR1cm4gZCYmWGModSxmLGEpLGR9aWYoaS5jYWxsYmFjayl7S2ModCxvKS50aGVuKCgpPT57Y29uc3QgdT1jKHQsbyk7aS5jYWxsYmFjayh1LHU/dm9pZCAwOm8pfSk7cmV0dXJufXJldHVybiBjKHQsbyk/dm9pZCAwOm99YXN5bmMgZnVuY3Rpb24gS2ModCxlKXtjb25zdCByPXQuZ2V0RXh0ZW5zaW9uKCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSxuPXI/KGksYSk9PmkuZ2V0UHJvZ3JhbVBhcmFtZXRlcihhLHIuQ09NUExFVElPTl9TVEFUVVNfS0hSKTooKT0+ITA7bGV0IHM9MDtkbyBhd2FpdCBZYyhzKSxzPTFlMy82MDt3aGlsZSghbih0LGUpKX1mdW5jdGlvbiBKYyh0LGUscil7aWYocj1yfHxzciwhdC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsV2EpKXtjb25zdCBzPXQuZ2V0UHJvZ3JhbUluZm9Mb2coZSk7cihgRXJyb3IgaW4gcHJvZ3JhbSBsaW5raW5nOiAke3N9YCk7Y29uc3QgYT10LmdldEF0dGFjaGVkU2hhZGVycyhlKS5tYXAobz0+V2ModCx0LmdldFNoYWRlclBhcmFtZXRlcihvLHQuU0hBREVSX1RZUEUpLG8scikpO3JldHVybmAke3N9CiR7YS5maWx0ZXIobz0+bykuam9pbihgCmApfWB9fWZ1bmN0aW9uIFpjKHQsZSxyLG4scyl7cmV0dXJuIHFjKHQsZSxyLG4scyl9ZnVuY3Rpb24gR24odCl7Y29uc3QgZT10Lm5hbWU7cmV0dXJuIGUuc3RhcnRzV2l0aCgiZ2xfIil8fGUuc3RhcnRzV2l0aCgid2ViZ2xfIil9Y29uc3QgZXU9LyhcLnxcW3xdfFx3KykvZyx0dT10PT50Pj0iMCImJnQ8PSI5IjtmdW5jdGlvbiBydSh0LGUscixuKXtjb25zdCBzPXQuc3BsaXQoZXUpLmZpbHRlcihvPT5vIT09IiIpO2xldCBpPTAsYT0iIjtmb3IoOzspe2NvbnN0IG89c1tpKytdO2ErPW87Y29uc3QgYz10dShvWzBdKSx1PWM/cGFyc2VJbnQobyk6bztpZihjJiYoYSs9c1tpKytdKSxpPT09cy5sZW5ndGgpe3JbdV09ZTticmVha31lbHNle2NvbnN0IGQ9c1tpKytdLGg9ZD09PSJbIixwPXJbdV18fChoP1tdOnt9KTtyW3VdPXAscj1wLG5bYV09blthXXx8ZnVuY3Rpb24obCl7cmV0dXJuIGZ1bmN0aW9uKHkpeyRuKGwseSl9fShwKSxhKz1kfX19ZnVuY3Rpb24gbnUodCxlKXtsZXQgcj0wO2Z1bmN0aW9uIG4obyxjLHUpe2NvbnN0IGY9Yy5uYW1lLmVuZHNXaXRoKCJbMF0iKSxkPWMudHlwZSxoPW1bZF07aWYoIWgpdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHR5cGU6IDB4JHtkLnRvU3RyaW5nKDE2KX1gKTtsZXQgcDtpZihoLmJpbmRQb2ludCl7Y29uc3QgbD1yO3IrPWMuc2l6ZSxmP3A9aC5hcnJheVNldHRlcih0LGQsbCx1LGMuc2l6ZSk6cD1oLnNldHRlcih0LGQsbCx1LGMuc2l6ZSl9ZWxzZSBoLmFycmF5U2V0dGVyJiZmP3A9aC5hcnJheVNldHRlcih0LHUpOnA9aC5zZXR0ZXIodCx1KTtyZXR1cm4gcC5sb2NhdGlvbj11LHB9Y29uc3Qgcz17fSxpPXt9LGE9dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUseW4pO2ZvcihsZXQgbz0wO288YTsrK28pe2NvbnN0IGM9dC5nZXRBY3RpdmVVbmlmb3JtKGUsbyk7aWYoR24oYykpY29udGludWU7bGV0IHU9Yy5uYW1lO3UuZW5kc1dpdGgoIlswXSIpJiYodT11LnN1YnN0cigwLHUubGVuZ3RoLTMpKTtjb25zdCBmPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsYy5uYW1lKTtpZihmKXtjb25zdCBkPW4oZSxjLGYpO3NbdV09ZCxydSh1LGQsaSxzKX19cmV0dXJuIHN9ZnVuY3Rpb24gc3UodCxlKXtjb25zdCByPXt9LG49dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsUWEpO2ZvcihsZXQgcz0wO3M8bjsrK3Mpe2NvbnN0IGk9dC5nZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcoZSxzKTtyW2kubmFtZV09e2luZGV4OnMsdHlwZTppLnR5cGUsc2l6ZTppLnNpemV9fXJldHVybiByfWZ1bmN0aW9uIGl1KHQsZSl7Y29uc3Qgcj10LmdldFByb2dyYW1QYXJhbWV0ZXIoZSx5biksbj1bXSxzPVtdO2ZvcihsZXQgbz0wO288cjsrK28pe3MucHVzaChvKSxuLnB1c2goe30pO2NvbnN0IGM9dC5nZXRBY3RpdmVVbmlmb3JtKGUsbyk7bltvXS5uYW1lPWMubmFtZX1bWyJVTklGT1JNX1RZUEUiLCJ0eXBlIl0sWyJVTklGT1JNX1NJWkUiLCJzaXplIl0sWyJVTklGT1JNX0JMT0NLX0lOREVYIiwiYmxvY2tOZHgiXSxbIlVOSUZPUk1fT0ZGU0VUIiwib2Zmc2V0Il1dLmZvckVhY2goZnVuY3Rpb24obyl7Y29uc3QgYz1vWzBdLHU9b1sxXTt0LmdldEFjdGl2ZVVuaWZvcm1zKGUscyx0W2NdKS5mb3JFYWNoKGZ1bmN0aW9uKGYsZCl7bltkXVt1XT1mfSl9KTtjb25zdCBpPXt9LGE9dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUscWEpO2ZvcihsZXQgbz0wO288YTsrK28pe2NvbnN0IGM9dC5nZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lKGUsbyksdT17aW5kZXg6dC5nZXRVbmlmb3JtQmxvY2tJbmRleChlLGMpLHVzZWRCeVZlcnRleFNoYWRlcjp0LmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLG8sS2EpLHVzZWRCeUZyYWdtZW50U2hhZGVyOnQuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsbyxKYSksc2l6ZTp0LmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLG8sWmEpLHVuaWZvcm1JbmRpY2VzOnQuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsbyxlYyl9O3UudXNlZD11LnVzZWRCeVZlcnRleFNoYWRlcnx8dS51c2VkQnlGcmFnbWVudFNoYWRlcixpW2NdPXV9cmV0dXJue2Jsb2NrU3BlY3M6aSx1bmlmb3JtRGF0YTpufX1mdW5jdGlvbiAkbih0LGUpe2Zvcihjb25zdCByIGluIGUpe2NvbnN0IG49dFtyXTt0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGVbcl0pOiRuKHRbcl0sZVtyXSl9fWZ1bmN0aW9uIFZuKHQsLi4uZSl7Y29uc3Qgcj10LnVuaWZvcm1TZXR0ZXJzfHx0LG49ZS5sZW5ndGg7Zm9yKGxldCBzPTA7czxuOysrcyl7Y29uc3QgaT1lW3NdO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IGE9aS5sZW5ndGg7Zm9yKGxldCBvPTA7bzxhOysrbylWbihyLGlbb10pfWVsc2UgZm9yKGNvbnN0IGEgaW4gaSl7Y29uc3Qgbz1yW2FdO28mJm8oaVthXSl9fX1mdW5jdGlvbiBvdSh0LGUpe2NvbnN0IHI9e30sbj10LmdldFByb2dyYW1QYXJhbWV0ZXIoZSxZYSk7Zm9yKGxldCBzPTA7czxuOysrcyl7Y29uc3QgaT10LmdldEFjdGl2ZUF0dHJpYihlLHMpO2lmKEduKGkpKWNvbnRpbnVlO2NvbnN0IGE9dC5nZXRBdHRyaWJMb2NhdGlvbihlLGkubmFtZSksbz1fW2kudHlwZV0sYz1vLnNldHRlcih0LGEsbyk7Yy5sb2NhdGlvbj1hLHJbaS5uYW1lXT1jfXJldHVybiByfWZ1bmN0aW9uIGF1KHQsZSl7Zm9yKGNvbnN0IHIgaW4gZSl7Y29uc3Qgbj10W3JdO24mJm4oZVtyXSl9fWZ1bmN0aW9uIGN1KHQsZSxyKXtyLnZlcnRleEFycmF5T2JqZWN0P3QuYmluZFZlcnRleEFycmF5KHIudmVydGV4QXJyYXlPYmplY3QpOihhdShlLmF0dHJpYlNldHRlcnN8fGUsci5hdHRyaWJzKSxyLmluZGljZXMmJnQuYmluZEJ1ZmZlcigkYSxyLmluZGljZXMpKX1mdW5jdGlvbiBXbih0LGUpe2NvbnN0IHI9bnUodCxlKSxuPW91KHQsZSkscz17cHJvZ3JhbTplLHVuaWZvcm1TZXR0ZXJzOnIsYXR0cmliU2V0dGVyczpufTtyZXR1cm4gQWUodCkmJihzLnVuaWZvcm1CbG9ja1NwZWM9aXUodCxlKSxzLnRyYW5zZm9ybUZlZWRiYWNrSW5mbz1zdSh0LGUpKSxzfWNvbnN0IHV1PS9cc3x7fH18Oy87ZnVuY3Rpb24gZnUodCxlLHIsbixzKXtjb25zdCBpPXVyKHIsbixzKSxhPVtdO2lmKGU9ZS5tYXAoZnVuY3Rpb24odSl7aWYoIXV1LnRlc3QodSkpe2NvbnN0IGY9cG4odSk7aWYoZil1PWYudGV4dDtlbHNle2NvbnN0IGQ9YG5vIGVsZW1lbnQgd2l0aCBpZDogJHt1fWA7aS5lcnJvckNhbGxiYWNrKGQpLGEucHVzaChkKX19cmV0dXJuIHV9KSxhLmxlbmd0aClyZXR1cm4gVmMoaSwiIik7Y29uc3Qgbz1pLmNhbGxiYWNrO28mJihpLmNhbGxiYWNrPSh1LGYpPT57byh1LHU/dm9pZCAwOlduKHQsZikpfSk7Y29uc3QgYz1aYyh0LGUsaSk7cmV0dXJuIGM/V24odCxjKTpudWxsfWNvbnN0IGx1PTQsSG49NTEyMztmdW5jdGlvbiBkdSh0LGUscixuLHMsaSl7cj1yPT09dm9pZCAwP2x1OnI7Y29uc3QgYT1lLmluZGljZXMsbz1lLmVsZW1lbnRUeXBlLGM9bj09PXZvaWQgMD9lLm51bUVsZW1lbnRzOm47cz1zPT09dm9pZCAwPzA6cyxvfHxhP2khPT12b2lkIDA/dC5kcmF3RWxlbWVudHNJbnN0YW5jZWQocixjLG89PT12b2lkIDA/SG46ZS5lbGVtZW50VHlwZSxzLGkpOnQuZHJhd0VsZW1lbnRzKHIsYyxvPT09dm9pZCAwP0huOmUuZWxlbWVudFR5cGUscyk6aSE9PXZvaWQgMD90LmRyYXdBcnJheXNJbnN0YW5jZWQocixzLGMsaSk6dC5kcmF3QXJyYXlzKHIscyxjKX1jb25zdCBqbj0zNjE2MCxwdD0zNjE2MSxodT0zNTUzLG11PTUxMjEscHU9NjQwMix5dT02NDA4LGJ1PTMzMTkwLGd1PTM2MDEyLHh1PTM1MDU2LEV1PTM2MDEzLF91PTMyODU0LFR1PTMyODU1LHd1PTM2MTk0LFhuPTMzMTg5LFluPTY0MDEsUW49MzYxNjgsZnI9MzQwNDEsbHI9MzYwNjQseXQ9MzYwOTYscW49MzYxMjgsZHI9MzMzMDYsaHI9MzMwNzEsbXI9OTcyOSxBdT1be2Zvcm1hdDp5dSx0eXBlOm11LG1pbjptcix3cmFwOmhyfSx7Zm9ybWF0OmZyfV0sQz17fTtDW2ZyXT1kcixDW1luXT1xbixDW1FuXT1xbixDW3B1XT15dCxDW1huXT15dCxDW2J1XT15dCxDW2d1XT15dCxDW3h1XT1kcixDW0V1XT1kcjtmdW5jdGlvbiB2dSh0LGUpe3JldHVybiBDW3RdfHxDW2VdfWNvbnN0IGo9e307altfdV09ITAsaltUdV09ITAsalt3dV09ITAsaltmcl09ITAsaltYbl09ITAsaltZbl09ITAsaltRbl09ITA7ZnVuY3Rpb24gU3UodCl7cmV0dXJuIGpbdF19Y29uc3QgSXU9MzI7ZnVuY3Rpb24gUnUodCl7cmV0dXJuIHQ+PWxyJiZ0PGxyK0l1fWZ1bmN0aW9uIEtuKHQsZSxyLG4pe2NvbnN0IHM9am4saT10LmNyZWF0ZUZyYW1lYnVmZmVyKCk7dC5iaW5kRnJhbWVidWZmZXIocyxpKSxyPXJ8fHQuZHJhd2luZ0J1ZmZlcldpZHRoLG49bnx8dC5kcmF3aW5nQnVmZmVySGVpZ2h0LGU9ZXx8QXU7Y29uc3QgYT1bXSxvPXtmcmFtZWJ1ZmZlcjppLGF0dGFjaG1lbnRzOltdLHdpZHRoOnIsaGVpZ2h0Om59O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oYyx1KXtsZXQgZj1jLmF0dGFjaG1lbnQ7Y29uc3QgZD1jLnNhbXBsZXMsaD1jLmZvcm1hdDtsZXQgcD1jLmF0dGFjaG1lbnRQb2ludHx8dnUoaCxjLmludGVybmFsRm9ybWF0KTtpZihwfHwocD1scit1KSxSdShwKSYmYS5wdXNoKHApLCFmKWlmKGQhPT12b2lkIDB8fFN1KGgpKWY9dC5jcmVhdGVSZW5kZXJidWZmZXIoKSx0LmJpbmRSZW5kZXJidWZmZXIocHQsZiksZD4xP3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHB0LGQsaCxyLG4pOnQucmVuZGVyYnVmZmVyU3RvcmFnZShwdCxoLHIsbik7ZWxzZXtjb25zdCBsPU9iamVjdC5hc3NpZ24oe30sYyk7bC53aWR0aD1yLGwuaGVpZ2h0PW4sbC5hdXRvPT09dm9pZCAwJiYobC5hdXRvPSExLGwubWluPWwubWlufHxsLm1pbk1hZ3x8bXIsbC5tYWc9bC5tYWd8fGwubWluTWFnfHxtcixsLndyYXBTPWwud3JhcFN8fGwud3JhcHx8aHIsbC53cmFwVD1sLndyYXBUfHxsLndyYXB8fGhyKSxmPW1uKHQsbCl9aWYoTWkodCxmKSl0LmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHMscCxwdCxmKTtlbHNlIGlmKHp0KHQsZikpYy5sYXllciE9PXZvaWQgMD90LmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKHMscCxmLGMubGV2ZWx8fDAsYy5sYXllcik6dC5mcmFtZWJ1ZmZlclRleHR1cmUyRChzLHAsYy50YXJnZXR8fGh1LGYsYy5sZXZlbHx8MCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gYXR0YWNobWVudCB0eXBlIik7by5hdHRhY2htZW50cy5wdXNoKGYpfSksdC5kcmF3QnVmZmVycyYmdC5kcmF3QnVmZmVycyhhKSxvfWZ1bmN0aW9uIEZ1KHQsZSxyKXtyPXJ8fGpuLGU/KHQuYmluZEZyYW1lYnVmZmVyKHIsZS5mcmFtZWJ1ZmZlciksdC52aWV3cG9ydCgwLDAsZS53aWR0aCxlLmhlaWdodCkpOih0LmJpbmRGcmFtZWJ1ZmZlcihyLG51bGwpLHQudmlld3BvcnQoMCwwLHQuZHJhd2luZ0J1ZmZlcldpZHRoLHQuZHJhd2luZ0J1ZmZlckhlaWdodCkpfWZ1bmN0aW9uIHYodCxlKXtyZXR1cm4oKT0+ZSBpbnN0YW5jZW9mIFdlYkdMVGV4dHVyZT9lOm1uKHQse3NyYzplLHdyYXA6dC5DTEFNUF9UT19FREdFfSl9Y29uc3QgeWU9MjtjbGFzcyBDZXtjb25zdHJ1Y3RvcihlKXt0aGlzLmlkPSJfIjtjb25zdHtjb250ZXh0OnIsd2lkdGg6bixoZWlnaHQ6c309ZTt0aGlzLmNvbnRleHQ9cix0aGlzLm9wdGlvbnM9ZTtjb25zdCBpPXRoaXMuYnVpbGREZWZpbmVzKCk7dGhpcy5wcm9ncmFtSW5mbz1mdSh0aGlzLmNvbnRleHQsW2krdGhpcy5nZXRWZXJ0ZXhTaGFkZXIoKSxpK3RoaXMuZ2V0RnJhZ21lbnRTaGFkZXIoKV0pLHRoaXMuYnVmZmVySW5mbz1pbyh0aGlzLmNvbnRleHQsdGhpcy5nZXRCdWZmZXJzKCkpLHRoaXMuZmJpPUtuKHRoaXMuY29udGV4dCxbe2Zvcm1hdDp0aGlzLmNvbnRleHQuUkdCQSx0eXBlOnRoaXMuY29udGV4dC5VTlNJR05FRF9CWVRFLG1pbjp0aGlzLmNvbnRleHQuTElORUFSLHdyYXA6dGhpcy5jb250ZXh0LkNMQU1QX1RPX0VER0V9XSxuLHMpLHRoaXMub3V0cHV0PXRoaXMuZmJpLmF0dGFjaG1lbnRzWzBdfXJlc2l6ZU91dHB1dChlLHIpe3RoaXMuZmJpPUtuKHRoaXMuY29udGV4dCxbe2Zvcm1hdDp0aGlzLmNvbnRleHQuUkdCQSx0eXBlOnRoaXMuY29udGV4dC5VTlNJR05FRF9CWVRFLG1pbjp0aGlzLmNvbnRleHQuTElORUFSLHdyYXA6dGhpcy5jb250ZXh0LkNMQU1QX1RPX0VER0V9XSxlLHIpLHRoaXMub3B0aW9ucy53aWR0aD1lLHRoaXMub3B0aW9ucy5oZWlnaHQ9cix0aGlzLm91dHB1dD10aGlzLmZiaS5hdHRhY2htZW50c1swXX1nZXREZWZpbmVzKCl7cmV0dXJue319Z2V0QnVmZmVycygpe3JldHVybntwb3NpdGlvbjp7bnVtQ29tcG9uZW50czoyLGRhdGE6Wy0xLC0xLC0xLDEsMSwtMSwxLDEsLTEsMSwxLC0xXX0sdGV4dHVyZV9jb29yZDp7bnVtQ29tcG9uZW50czoyLGRhdGE6WzAsMCwwLDEsMSwwLDEsMSwwLDEsMSwwXX19fWJ1aWxkRGVmaW5lcygpe2xldCBlPSIiO2NvbnN0IHI9dGhpcy5nZXREZWZpbmVzKCk7Zm9yKGxldCBuIGluIHIpZSs9YCNkZWZpbmUgJHtufSAke3Jbbl0udG9GaXhlZCgxKX0KYDtyZXR1cm4gZX1ydW4oZSl7dmFyIHMsaSxhLG8sYyx1OyhzPXRoaXMucHJvZmlsZXIpPT1udWxsfHxzLnB1c2hDb250ZXh0KGBbJHt0aGlzLmlkfV0gUFJPRyA6ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApLChpPXRoaXMucHJvZmlsZXIpPT1udWxsfHxpLnB1c2hDb250ZXh0KGBbJHt0aGlzLmlkfV0gVU5JRk9STVNgKTtmb3IoY29uc3QgZiBpbiBlKXR5cGVvZiBlW2ZdPT0iZnVuY3Rpb24iJiYoKGE9dGhpcy5wcm9maWxlcik9PW51bGx8fGEucHVzaENvbnRleHQoYFske3RoaXMuaWR9XSBVTkkgOiAke2Z9YCksZVtmXT1lW2ZdKCksKG89dGhpcy5wcm9maWxlcik9PW51bGx8fG8ucG9wQ29udGV4dChgWyR7dGhpcy5pZH1dIFVOSSA6ICR7Zn1gKSk7KGM9dGhpcy5wcm9maWxlcik9PW51bGx8fGMucG9wQ29udGV4dChgWyR7dGhpcy5pZH1dIFVOSUZPUk1TYCk7Y29uc3Qgcj1EYXRlLm5vdygpO2xldCBuPTA7dGhpcy5sYXN0UnVuJiYobj0oci10aGlzLmxhc3RSdW4pLzFlMyksdGhpcy5sYXN0UnVuPXIsdGhpcy5jb250ZXh0LnZpZXdwb3J0KDAsMCx0aGlzLmNvbnRleHQuY2FudmFzLndpZHRoLHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0KSx0aGlzLmNvbnRleHQudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW1JbmZvLnByb2dyYW0pLGN1KHRoaXMuY29udGV4dCx0aGlzLnByb2dyYW1JbmZvLHRoaXMuYnVmZmVySW5mbyksVm4odGhpcy5wcm9ncmFtSW5mbyx7ZGVsdGE6bixjYW52YXM6W3RoaXMuY29udGV4dC5jYW52YXMud2lkdGgsdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHRdLC4uLmV9KSxGdSh0aGlzLmNvbnRleHQsdGhpcy5vcHRpb25zLmRpc2FibGVGcmFtZWJ1ZmZlcj9udWxsOnRoaXMuZmJpKSxkdSh0aGlzLmNvbnRleHQsdGhpcy5idWZmZXJJbmZvKSwodT10aGlzLnByb2ZpbGVyKT09bnVsbHx8dS5wb3BDb250ZXh0KGBbJHt0aGlzLmlkfV0gUFJPRyA6ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApfXNldFByb2ZpbGVyKGUpe3RoaXMucHJvZmlsZXI9ZX19dmFyIFB1PWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gc2FtcGxlcjJEIGJhY2tncm91bmQ7CnVuaWZvcm0gc2FtcGxlcjJEIGZvcmVncm91bmQ7CnVuaWZvcm0gc2FtcGxlcjJEIHRocmVzaG9sZDsKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGJhY2tncm91bmRDb2xvciA9IHRleHR1cmUyRChiYWNrZ3JvdW5kLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCBmb3JlZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlMkQoZm9yZWdyb3VuZCwgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgdHJlc2hvbGRDb2xvciA9IHRleHR1cmUyRCh0aHJlc2hvbGQsIF90ZXh0dXJlX2Nvb3JkKTsKICBnbF9GcmFnQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3IgKiB0cmVzaG9sZENvbG9yLmEgKwogICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvciAqICgxLiAtIHRyZXNob2xkQ29sb3IuYSk7Cn0KYCxrdT1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBfdGV4dHVyZV9jb29yZC55ID0gMS4gLSB0ZXh0dXJlX2Nvb3JkLnk7Cn0KYDtjbGFzcyBwciBleHRlbmRzIENle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFB1fWdldFZlcnRleFNoYWRlcigpe3JldHVybiBrdX19Y2xhc3MgeXJ7Y29uc3RydWN0b3IoKXt0aGlzLnN0ZXBzPVtdfWFkZFN0ZXAoZSl7dGhpcy5zdGVwcy5wdXNoKGUpfWFzeW5jIHJ1bigpe2Zvcihjb25zdCBlIG9mIHRoaXMuc3RlcHMpZS5wcm9ncmFtLnJ1bihlLmdldFVuaWZvcm1zKCkpfXJlc2l6ZU91dHB1dChlLHIpe3ZhciBuLHM7KG49dGhpcy5wcm9maWxlcik9PW51bGx8fG4ucHVzaENvbnRleHQoYFBJUCBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XWApO2Zvcihjb25zdCBpIG9mIHRoaXMuc3RlcHMpaS5wcmV2ZW50UmVzaXplfHxpLnByb2dyYW0ucmVzaXplT3V0cHV0KGUscik7KHM9dGhpcy5wcm9maWxlcik9PW51bGx8fHMucG9wQ29udGV4dChgUElQIFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dYCl9c2V0UHJvZmlsZXIoZSl7dGhpcy5wcm9maWxlcj1lO2Zvcihjb25zdCByIG9mIHRoaXMuc3RlcHMpci5wcm9ncmFtLnNldFByb2ZpbGVyKGUpfXNldElkKGUpe2Zvcihjb25zdCByIG9mIHRoaXMuc3RlcHMpci5wcm9ncmFtLmlkPWV9fWNsYXNzIGJyIGV4dGVuZHMgeXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucHJlY2lzZU1hc2tFbmFibGVkPSExfX1jbGFzcyBKbiBleHRlbmRzIGJye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5jb250ZXh0PWUsdGhpcy5wcmVjaXNlTWFza0VuYWJsZWQ9ITA7Y29uc3Qgcj17Y29udGV4dDplLGhlaWdodDplLmNhbnZhcy5oZWlnaHQsd2lkdGg6ZS5jYW52YXMud2lkdGh9LG49bmV3IHByKHsuLi5yLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpuLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6dihlLHRoaXMuaW5wdXRCYWNrZ3JvdW5kSW1hZ2UpLGZvcmVncm91bmQ6dihlLHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOnYoZSx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEoZSxyKXt0aGlzLmlucHV0SW1hZ2U9ZSx0aGlzLmlucHV0TWFzaz1yfX12YXIgQ3U9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOyB9CmAsQnU9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIGJvb2wgaW52ZXJ0X3k7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBpZiAoaW52ZXJ0X3kpIHsKICAgIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKICB9Cn0KYDtjbGFzcyBEdSBleHRlbmRzIENle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIEN1fWdldFZlcnRleFNoYWRlcigpe3JldHVybiBCdX19Y2xhc3MgTXUgZXh0ZW5kcyB5cntjb25zdHJ1Y3RvcihlLHIsbil7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBzPXtjb250ZXh0OmUsaGVpZ2h0Om4sd2lkdGg6cn07dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm5ldyBEdSh7Li4ucyxkaXNhYmxlRnJhbWVidWZmZXI6ITB9KSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOnYoZSx0aGlzLmlucHV0SW1hZ2UpLGludmVydF95OiEwfSl9KX1zZXREYXRhKGUpe3RoaXMuaW5wdXRJbWFnZT1lfX1hc3luYyBmdW5jdGlvbiBabih0KXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3NldFRpbWVvdXQoKCk9PntlKCl9LHQpfSl9dmFyIFV1PWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gdmVjMiBjYW52YXM7CnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7Cgp2ZWM0IGxvb3AoKTsKCnZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gbG9vcCgpOyB9CmAsTnU9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYCxncj0odD0+KHRbdC5MSU5FQVI9MF09IkxJTkVBUiIsdFt0LkdBVVNTSUFOPTFdPSJHQVVTU0lBTiIsdCkpKGdyfHx7fSk7Y2xhc3MgZXMgZXh0ZW5kcyBDZXtnZXREZWZpbmVzKCl7cmV0dXJue1JBRElVUzp0aGlzLm9wdGlvbnMucmFkaXVzPz8xfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBVdSt0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBOdX1jcmVhdGVMb29wRnVuY3Rpb24oKXtsZXQgZT10aGlzLm9wdGlvbnMucmFkaXVzPz8xO3JldHVybmAKCiAgICAgICAgdmVjNCBsb29wKCkgeyAKICAgICAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAsMCwwLDApOwogICAgICAgICAgICBmbG9hdCBmYWN0b3JTdW0gPSAwLjsKCiAgICAgICAgICAgIHZlYzIgbm9ybWFsaXplZFJhZGl1cyA9IHZlYzIoLSR7ZX0uKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkSW5jcmVtZW50ID0gdmVjMigxLikgLyBjYW52YXM7CiAgICAgICAgICAgIHZlYzIgZGlmZiA9IG5vcm1hbGl6ZWRSYWRpdXM7CgogICAgICAgICAgICBmb3IoaW50IHk9LSR7ZX07IHk8JHtlKzF9OyArK3kpIHsKICAgICAgICAgICAgICAgIGZvcihpbnQgeD0tJHtlfTsgeDwke2UrMX07ICsreCkgewogICAgICAgICAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9IDEuOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBmYWN0b3IgKiB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQgKyBkaWZmKTsKICAgICAgICAgICAgICAgICAgICBmYWN0b3JTdW0gKz0gZmFjdG9yOwogICAgICAgICAgICAgICAgICAgIGRpZmYueCArPSBub3JtYWxpemVkSW5jcmVtZW50Lng7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkaWZmLnkgKz0gbm9ybWFsaXplZEluY3JlbWVudC55OwogICAgICAgICAgICAgICAgZGlmZi54ID0gbm9ybWFsaXplZFJhZGl1cy54OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQgLyBmYWN0b3JTdW07CiAgICAgICAgfWB9Z2V0RmFjdG9yKGUscil7c3dpdGNoKHRoaXMub3B0aW9ucy50eXBlKXtjYXNlIDE6cmV0dXJuIHRoaXMuZ2V0TGluZWFyRmFjdG9yKGUscik7Y2FzZSAwOmRlZmF1bHQ6cmV0dXJuIHRoaXMuZ2V0TGluZWFyRmFjdG9yKGUscil9fWdldExpbmVhckZhY3RvcihlLHIpe3JldHVybiAxfWdldEdhdXNzaWFuRmFjdG9yKGUscil7Y29uc3Qgbj1NYXRoLlBJKjIscz1NYXRoLm1heCh0aGlzLm9wdGlvbnMucmFkaXVzPz8xLDEpLGk9MS8obipzKioyKSxhPS0oZSoqMityKioyKSxvPWkqYTtyZXR1cm4gaSpNYXRoLkUqKm99fXZhciBPdT1gI3ZlcnNpb24gMzAwIGVzCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Wb2xjb21peC92aXJ0dWFsLWJhY2tncm91bmQvYmxvYi9tYWluL3NyYy9waXBlbGluZXMvd2ViZ2wyL2pvaW50QmlsYXRlcmFsRmlsdGVyU3RhZ2UudHMKCnByZWNpc2lvbiBoaWdocCBmbG9hdDsKdW5pZm9ybSBzYW1wbGVyMkQgaW5wdXRfZnJhbWU7CnVuaWZvcm0gc2FtcGxlcjJEIHNlZ21lbnRhdGlvbl9tYXNrOwp1bmlmb3JtIHNhbXBsZXIyRCB0aHJlc2hvbGQ7CnVuaWZvcm0gdmVjMiB0ZXhlbF9zaXplOwp1bmlmb3JtIGZsb2F0IHN0ZXA7CnVuaWZvcm0gZmxvYXQgcmFkaXVzOwp1bmlmb3JtIGZsb2F0IG9mZnNldDsKdW5pZm9ybSBmbG9hdCBzaWdtYV90ZXhlbDsKdW5pZm9ybSBmbG9hdCBzaWdtYV9jb2xvcjsKCmluIHZlYzIgX3RleHR1cmVfY29vcmQ7Cm91dCB2ZWM0IG91dENvbG9yOwoKZmxvYXQgZ2F1c3NpYW4oZmxvYXQgeCwgZmxvYXQgc2lnbWEpIHsKICBmbG9hdCBjb2VmZiA9IC0wLjUgLyAoc2lnbWEgKiBzaWdtYSAqIDQuMCArIDEuMGUtNik7CiAgcmV0dXJuIGV4cCgoeCAqIHgpICogY29lZmYpOwp9Cgp2b2lkIG1haW4oKSB7CiAgdmVjMiBjZW50ZXJDb29yZCA9IF90ZXh0dXJlX2Nvb3JkOwogIHZlYzMgY2VudGVyQ29sb3IgPSB0ZXh0dXJlKGlucHV0X2ZyYW1lLCBjZW50ZXJDb29yZCkucmdiOwogIGZsb2F0IG5ld1ZhbCA9IDAuMDsKICBmbG9hdCBzcGFjZVdlaWdodCA9IDAuMDsKICBmbG9hdCBjb2xvcldlaWdodCA9IDAuMDsKICBmbG9hdCB0b3RhbFdlaWdodCA9IDAuMDsKICAvLyBTdWJzYW1wbGUga2VybmVsIHNwYWNlLgogIGZvciAoZmxvYXQgaSA9IC1yYWRpdXMgKyBvZmZzZXQ7IGkgPD0gcmFkaXVzOyBpICs9IHN0ZXApIHsKICAgIGZvciAoZmxvYXQgaiA9IC1yYWRpdXMgKyBvZmZzZXQ7IGogPD0gcmFkaXVzOyBqICs9IHN0ZXApIHsKICAgICAgdmVjMiBzaGlmdCA9IHZlYzIoaiwgaSkgKiB0ZXhlbF9zaXplOwogICAgICB2ZWMyIGNvb3JkID0gdmVjMihjZW50ZXJDb29yZCArIHNoaWZ0KTsKICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZShpbnB1dF9mcmFtZSwgY29vcmQpLnJnYjsKICAgICAgZmxvYXQgdGhyZXNob2xkID0gdGV4dHVyZSh0aHJlc2hvbGQsIGNvb3JkKS5hOwogICAgICBmbG9hdCBvdXRWYWwgPSB0ZXh0dXJlKHNlZ21lbnRhdGlvbl9tYXNrLCBjb29yZCkuYTsKCiAgICAgIHNwYWNlV2VpZ2h0ID0gZ2F1c3NpYW4oZGlzdGFuY2UoY2VudGVyQ29vcmQsIGNvb3JkKSwgc2lnbWFfdGV4ZWwpOwogICAgICBjb2xvcldlaWdodCA9IGdhdXNzaWFuKGRpc3RhbmNlKGNlbnRlckNvbG9yLCBmcmFtZUNvbG9yKSwgc2lnbWFfY29sb3IpOwogICAgICB0b3RhbFdlaWdodCArPSBzcGFjZVdlaWdodCAqIGNvbG9yV2VpZ2h0OwogICAgICBuZXdWYWwgKz0gc3BhY2VXZWlnaHQgKiBjb2xvcldlaWdodCAqIG91dFZhbCAqIHRocmVzaG9sZDsKICAgIH0KICB9CiAgbmV3VmFsIC89IHRvdGFsV2VpZ2h0OwogIG91dENvbG9yID0gdmVjNCh2ZWMzKDAuKSwgbmV3VmFsKTsKfWAsTHU9YCN2ZXJzaW9uIDMwMCBlcwppbiB2ZWMyIHBvc2l0aW9uOwppbiB2ZWMyIHRleHR1cmVfY29vcmQ7Cm91dCB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9YDtjbGFzcyB6dSBleHRlbmRzIENle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIE91fWdldFZlcnRleFNoYWRlcigpe3JldHVybiBMdX19Y2xhc3MgR3UgZXh0ZW5kcyB5cntjb25zdHJ1Y3RvcihlLHIsbil7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBzPXtjb250ZXh0OmUsaGVpZ2h0Om4sd2lkdGg6cn0saT1uZXcgZXMoey4uLnMscmFkaXVzOjEsdHlwZTpnci5HQVVTU0lBTn0pO3RoaXMuam9pbnRCaWxhdGVyYWw9bmV3IHp1KHMpLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe2lucHV0czp2KGUsdGhpcy5pbnB1dE1hc2spfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06dGhpcy5qb2ludEJpbGF0ZXJhbCxnZXRVbmlmb3JtczooKT0+e3ZhciBwLGwseSxiO2NvbnN0IG89KChwPXRoaXMuaW5wdXRJbWFnZSk9PW51bGw/dm9pZCAwOnAud2lkdGgpPz8xLGM9KChsPXRoaXMuaW5wdXRJbWFnZSk9PW51bGw/dm9pZCAwOmwuaGVpZ2h0KT8/MTsoeT10aGlzLmlucHV0TWFzayk9PW51bGx8fHkud2lkdGgsKGI9dGhpcy5pbnB1dE1hc2spPT1udWxsfHxiLmhlaWdodDtjb25zdCB1PTMsZj1NYXRoLm1heCgxLE1hdGguc3FydCh1KSouNjYpLGQ9MS9vLGg9MS9jO3JldHVybntpbnB1dF9mcmFtZTp2KGUsdGhpcy5pbnB1dEltYWdlKSxzZWdtZW50YXRpb25fbWFzazp2KGUsdGhpcy5pbnB1dE1hc2spLHRleGVsX3NpemU6W2QsaF0sc3RlcDpmLHJhZGl1czp1LG9mZnNldDpmPjE/ZiouNTowLHNpZ21hX3RleGVsOk1hdGgubWF4KGQsaCkqdSxzaWdtYV9jb2xvcjp1fX19KSx0aGlzLm91dHB1dD10aGlzLmpvaW50QmlsYXRlcmFsLm91dHB1dH1zZXREYXRhKGUscil7dGhpcy5wcmV2aW91c0lucHV0SW1hZ2U9dGhpcy5pbnB1dEltYWdlP3RoaXMuaW5wdXRJbWFnZTplLHRoaXMucHJldmlvdXNJbnB1dE1hc2s9dGhpcy5pbnB1dE1hc2s/dGhpcy5pbnB1dE1hc2s6cix0aGlzLmlucHV0SW1hZ2U9ZSx0aGlzLmlucHV0TWFzaz1yfXJlc2l6ZU91dHB1dChlLHIpe3N1cGVyLnJlc2l6ZU91dHB1dChlLHIpLHRoaXMub3V0cHV0PXRoaXMuam9pbnRCaWxhdGVyYWwub3V0cHV0fX1jbGFzcyAkdXtjb25zdHJ1Y3RvcihlKXt0aGlzLnF1ZXJpZXM9W10sdGhpcy5jb250ZXh0PWUsdGhpcy5leHRlbnNpb249ZS5nZXRFeHRlbnNpb24oIkVYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDIiKX1zdGFydCgpe31zdG9wKCl7dGhpcy5hY3RpdmVRdWVyeSYmdGhpcy5jb250ZXh0LmVuZFF1ZXJ5KHRoaXMuZXh0ZW5zaW9uLlRJTUVfRUxBUFNFRF9FWFQpfXB1c2hDb250ZXh0KGUpe3RoaXMuY3JlYXRlUXVlcnkoIlBVU0giLGUpfXBvcENvbnRleHQoZSl7dGhpcy5jcmVhdGVRdWVyeSgiUE9QIixlKX1jcmVhdGVRdWVyeShlLHIpe3RoaXMuYWN0aXZlUXVlcnkmJnRoaXMuY29udGV4dC5lbmRRdWVyeSh0aGlzLmV4dGVuc2lvbi5USU1FX0VMQVBTRURfRVhUKSx0aGlzLmFjdGl2ZVF1ZXJ5PXRoaXMuY29udGV4dC5jcmVhdGVRdWVyeSgpLHRoaXMuY29udGV4dC5iZWdpblF1ZXJ5KHRoaXMuZXh0ZW5zaW9uLlRJTUVfRUxBUFNFRF9FWFQsdGhpcy5hY3RpdmVRdWVyeSksdGhpcy5xdWVyaWVzLnB1c2goe25hbWU6cixhY3Rpb246ZSxxdWVyeTp0aGlzLmFjdGl2ZVF1ZXJ5fSl9YXN5bmMgZ2V0UmVzb2x2ZWRRdWVyaWVzKCl7Y29uc3QgZT0oYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnRoaXMucXVlcmllc10ubWFwKHI9PnRoaXMucmVzb2x2ZVF1ZXJ5KHIpKSkpLmZpbHRlcihyPT5yKTtmb3IobGV0IHI9MTtyPGUubGVuZ3RoOysrcillW3JdLnRpbWVzdGFtcCs9ZVtyLTFdLmR1cmF0aW9uK2Vbci0xXS50aW1lc3RhbXA7cmV0dXJuIGV9YXN5bmMgcmVzb2x2ZVF1ZXJ5KGUpe2lmKCFhd2FpdCB0aGlzLmF3YWl0UXVlcnlBdmFpbGFibGUoZSkpe2NvbnNvbGUubG9nKCJVbmF3YWl0YWJsZSBxdWVyeSIsZSk7cmV0dXJufWlmKHRoaXMuY29udGV4dC5nZXRQYXJhbWV0ZXIodGhpcy5leHRlbnNpb24uR1BVX0RJU0pPSU5UX0VYVCkpe2NvbnNvbGUubG9nKCJEaXNqb2ludGVkIHF1ZXJ5IixlKTtyZXR1cm59cmV0dXJuey4uLmUsZHVyYXRpb246dGhpcy5jb250ZXh0LmdldFF1ZXJ5UGFyYW1ldGVyKGUucXVlcnksdGhpcy5jb250ZXh0LlFVRVJZX1JFU1VMVCksdGltZXN0YW1wOjB9fWFzeW5jIGF3YWl0UXVlcnlBdmFpbGFibGUoZSl7Zm9yKGxldCByPTA7cjwxMDsrK3Ipe2lmKHRoaXMuY29udGV4dC5nZXRRdWVyeVBhcmFtZXRlcihlLnF1ZXJ5LHRoaXMuY29udGV4dC5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFKSlyZXR1cm4gZTthd2FpdCBabigyMDApfX19Y2xhc3MgYnR7Y29uc3RydWN0b3IoKXt0aGlzLnByZXZpb3VzSW1hZ2VXaWR0aD0wLHRoaXMucHJldmlvdXNJbWFnZUhlaWdodD0wLHRoaXMucHJldmlvdXNNYXNrV2lkdGg9eWUsdGhpcy5wcmV2aW91c01hc2tIZWlnaHQ9eWUsdGhpcy5wb3N0UHJvY2Vzc2luZ0VuYWJsZWQ9ITA7Y29uc3QgZT1uZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCkscj1lLmdldENvbnRleHQoIndlYmdsMiIpO2lmKCFyKXRocm93IkZhaWwgdG8gcmV0cmlldmUgd2ViZ2wyIGNvbnRleHQiO3RoaXMuY2FudmFzPWUsdGhpcy5jb250ZXh0PXIsdGhpcy5pbXByb3ZlTWFzaz1uZXcgR3UodGhpcy5jb250ZXh0LHllLHllKX1lbmFibGVQb3N0UHJvY2Vzc2luZygpe3RoaXMucG9zdFByb2Nlc3NpbmdFbmFibGVkPSEwfWRpc2FibGVQb3N0UHJvY2Vzc2luZygpe3RoaXMucG9zdFByb2Nlc3NpbmdFbmFibGVkPSExfWFzeW5jIHByb2ZpbGVXZWJnbChlKXtjb25zdCByPW5ldyAkdSh0aGlzLmNvbnRleHQpO3JldHVybiB0aGlzLnByb2ZpbGVyPXIsci5zdGFydCgpLGF3YWl0IFpuKGUpLHRoaXMucHJvZmlsZXI9dm9pZCAwLHIuc3RvcCgpLHIuZ2V0UmVzb2x2ZWRRdWVyaWVzKCl9YXN5bmMgcmVuZGVyKGUscil7dmFyIGEsbztpZighdGhpcy5waXBlbGluZSl0aHJvdyJtaXNzaW5nIHBpcGVsaW5lIjsodGhpcy5wcmV2aW91c0ltYWdlSGVpZ2h0IT09ZS5oZWlnaHR8fHRoaXMucHJldmlvdXNJbWFnZVdpZHRoIT09ZS53aWR0aCkmJnRoaXMucmVzaXplT3V0cHV0KGUud2lkdGgsZS5oZWlnaHQpLCh0aGlzLnByZXZpb3VzTWFza0hlaWdodCE9PXIuaGVpZ2h0fHx0aGlzLnByZXZpb3VzTWFza1dpZHRoIT09ci53aWR0aCkmJih0aGlzLmltcHJvdmVNYXNrLnJlc2l6ZU91dHB1dChyLndpZHRoLHIuaGVpZ2h0KSx0aGlzLnByZXZpb3VzTWFza1dpZHRoPXIud2lkdGgsdGhpcy5wcmV2aW91c01hc2tIZWlnaHQ9ci5oZWlnaHQpO2NvbnN0IG49InJlbmRlcmVyIjsoYT10aGlzLnByb2ZpbGVyKT09bnVsbHx8YS5wdXNoQ29udGV4dChuKSx0aGlzLmltcHJvdmVNYXNrLnNldFByb2ZpbGVyKHRoaXMucHJvZmlsZXIpLHRoaXMucGlwZWxpbmUuc2V0UHJvZmlsZXIodGhpcy5wcm9maWxlcik7Y29uc3Qgcz1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChyKTtsZXQgaT1zO3JldHVybiB0aGlzLnBvc3RQcm9jZXNzaW5nRW5hYmxlZCYmKHRoaXMuaW1wcm92ZU1hc2suc2V0RGF0YShlLHMpLHRoaXMuaW1wcm92ZU1hc2sucnVuKCksaT10aGlzLmltcHJvdmVNYXNrLm91dHB1dCksdGhpcy5waXBlbGluZS5zZXREYXRhKGUsaSksYXdhaXQgdGhpcy5waXBlbGluZS5ydW4oKSwobz10aGlzLnByb2ZpbGVyKT09bnVsbHx8by5wb3BDb250ZXh0KG4pLHRoaXMuY2FudmFzfXJlc2l6ZU91dHB1dChlLHIpe3ZhciBuO3RoaXMuY2FudmFzLndpZHRoPWUsdGhpcy5jYW52YXMuaGVpZ2h0PXIsKG49dGhpcy5waXBlbGluZSk9PW51bGx8fG4ucmVzaXplT3V0cHV0KGUsciksdGhpcy5wcmV2aW91c0ltYWdlV2lkdGg9ZSx0aGlzLnByZXZpb3VzSW1hZ2VIZWlnaHQ9cn1kZXN0cm95KCl7dmFyIHI7Y29uc3QgZT0ocj10aGlzLmNvbnRleHQpPT1udWxsP3ZvaWQgMDpyLmdldEV4dGVuc2lvbigiV0VCR0xfbG9zZV9jb250ZXh0Iik7ZSYmZS5sb3NlQ29udGV4dCgpfX1jbGFzcyB0cyBleHRlbmRzIGJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnBpcGVsaW5lPW5ldyBKbih0aGlzLmNvbnRleHQpO2NvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHI9ZS5nZXRDb250ZXh0KCJ3ZWJnbDIiKTtpZighcil0aHJvdyJGYWlsIHRvIHJldHJpZXZlIHdlYmdsIGNvbnRleHQiO3RoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNhbnZhcz1lLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNvbnRleHQ9cix0aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXI9bmV3IE11KHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNvbnRleHQsMCwwKX1zZXRCYWNrZ3JvdW5kSW1hZ2UoZSl7dGhpcy5iYWNrZ3JvdW5kSW1hZ2U9ZSx0aGlzLnVwZGF0ZUJhY2tncm91bmRJbWFnZSgpfXVwZGF0ZUJhY2tncm91bmRJbWFnZSgpe2NvbnN0e3dpZHRoOmUsaGVpZ2h0OnJ9PXRoaXMuY2FudmFzO3RoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplci5yZXNpemVPdXRwdXQoZSxyKSx0aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXIuc2V0RGF0YSh0aGlzLmJhY2tncm91bmRJbWFnZSksdGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyLnJ1bigpLHRoaXMucGlwZWxpbmUuaW5wdXRCYWNrZ3JvdW5kSW1hZ2U9dGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzfXJlc2l6ZU91dHB1dChlLHIpe3N1cGVyLnJlc2l6ZU91dHB1dChlLHIpLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNhbnZhcy53aWR0aD1lLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNhbnZhcy5oZWlnaHQ9cix0aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXIucmVzaXplT3V0cHV0KGUsciksdGhpcy51cGRhdGVCYWNrZ3JvdW5kSW1hZ2UoKX1kZXN0cm95KCl7dmFyIHI7Y29uc3QgZT0ocj10aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXJDb250ZXh0KT09bnVsbD92b2lkIDA6ci5nZXRFeHRlbnNpb24oIldFQkdMX2xvc2VfY29udGV4dCIpO2UmJmUubG9zZUNvbnRleHQoKSxzdXBlci5kZXN0cm95KCl9fWNsYXNzIFZ1IGV4dGVuZHMgdHN7c2V0QmFja2dyb3VuZFZpZGVvKGUpe3RoaXMuZnJhbWVSZWFkZXI9ZX1hc3luYyByZW5kZXIoZSxyKXtyZXR1cm4gYXdhaXQgdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSxzdXBlci5yZW5kZXIoZSxyKX1hc3luYyByZWFkTmV4dFZpZGVvRnJhbWUoKXt2YXIgcjtjb25zdCBlPWF3YWl0KChyPXRoaXMuZnJhbWVSZWFkZXIpPT1udWxsP3ZvaWQgMDpyLnJlYWQoKSk7aWYoZSE9bnVsbCYmZS52YWx1ZSl7Y29uc3Qgbj1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChlLnZhbHVlKTt0aGlzLnNldEJhY2tncm91bmRJbWFnZShuKSxlLnZhbHVlLmNsb3NlKCl9fX1jbGFzcyByc3tibHVyQmFja2dyb3VuZChlKXtyZXR1cm4gbmV3IFRpKGUpfWJsdXJTaWxob3VldHRlKGUpe3JldHVybiBuZXcgd2koZSl9aW1hZ2VCYWNrZ3JvdW5kKCl7cmV0dXJuIG5ldyBBaX12aWRlb0JhY2tncm91bmQoKXtyZXR1cm4gbmV3IFZ1fX12YXIgV3U9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKdW5pZm9ybSBzYW1wbGVyMkQgbWFzazsKCnZlYzQgbG9vcCgpOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSBsb29wKCk7IH0KYCxIdT1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIGp1IGV4dGVuZHMgQ2V7Z2V0RGVmaW5lcygpe3JldHVybntSQURJVVM6dGhpcy5vcHRpb25zLnJhZGl1cz8/MX19Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gV3UrdGhpcy5jcmVhdGVMb29wRnVuY3Rpb24oKX1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gSHV9Y3JlYXRlTG9vcEZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5vcHRpb25zLnJhZGl1cz8/MTtyZXR1cm5gCgogICAgICAgIHZlYzQgbG9vcCgpIHsgCiAgICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLDAsMCwwKTsKICAgICAgICAgICAgZmxvYXQgZmFjdG9yU3VtID0gMC47CgogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRSYWRpdXMgPSB2ZWMyKC0ke2V9LikgLyBjYW52YXM7CiAgICAgICAgICAgIHZlYzIgbm9ybWFsaXplZEluY3JlbWVudCA9IHZlYzIoMS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIGRpZmYgPSBub3JtYWxpemVkUmFkaXVzOwogICAgICAgICAgICBmbG9hdCBtYXhMZW5ndGggPSBsZW5ndGgobm9ybWFsaXplZFJhZGl1cyk7CgogICAgICAgICAgICBmb3IoaW50IHk9LSR7ZX07IHk8JHtlKzF9OyArK3kpIHsKICAgICAgICAgICAgICAgIGZvcihpbnQgeD0tJHtlfTsgeDwke2UrMX07ICsreCkgewogICAgICAgICAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9ICgxLi0gdGV4dHVyZTJEKG1hc2ssIF90ZXh0dXJlX2Nvb3JkICsgZGlmZikuYSkgKiAobWF4TGVuZ3RoIC0gbGVuZ3RoKGRpZmYpKSAvIG1heExlbmd0aDsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZmFjdG9yICogdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkICsgZGlmZik7CiAgICAgICAgICAgICAgICAgICAgZmFjdG9yU3VtICs9IGZhY3RvcjsKICAgICAgICAgICAgICAgICAgICBkaWZmLnggKz0gbm9ybWFsaXplZEluY3JlbWVudC54OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlmZi55ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueTsKICAgICAgICAgICAgICAgIGRpZmYueCA9IG5vcm1hbGl6ZWRSYWRpdXMueDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0IC8gZmFjdG9yU3VtOwogICAgICAgIH1gfX1jb25zdCBYdT0xMCxZdT0yLFF1PTg7Y2xhc3MgcXUgZXh0ZW5kcyBicntjb25zdHJ1Y3RvcihlLHIpe3N1cGVyKCksdGhpcy5jb250ZXh0PWUsdGhpcy5yYWRpdXM9cjtjb25zdCBuPXtjb250ZXh0OmUsaGVpZ2h0OmUuY2FudmFzLmhlaWdodCx3aWR0aDplLmNhbnZhcy53aWR0aH07dGhpcy5ibHVyPW5ldyBqdSh7Li4ubixyYWRpdXM6ciwuLi50aGlzLmdldEJsdXJUZXh0dXJlU2l6ZShlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpfSk7Y29uc3Qgcz1uZXcgcHIoey4uLm4sZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSk7dGhpcy5hZGRTdGVwKHtwcm9ncmFtOnRoaXMuYmx1cixwcmV2ZW50UmVzaXplOiEwLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6dihlLHRoaXMuaW5wdXRJbWFnZSksbWFzazp2KGUsdGhpcy5pbnB1dE1hc2spfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06cyxnZXRVbmlmb3JtczooKT0+KHtiYWNrZ3JvdW5kOnYoZSx0aGlzLmJsdXIub3V0cHV0KSxmb3JlZ3JvdW5kOnYoZSx0aGlzLmlucHV0SW1hZ2UpLHRocmVzaG9sZDp2KGUsdGhpcy5pbnB1dE1hc2spfSl9KX1nZXRCbHVyVGV4dHVyZVNpemUoZSxyKXtjb25zdCBuPXRoaXMucmFkaXVzPlh1P1F1Oll1O3JldHVybnt3aWR0aDpNYXRoLm1heCh5ZSxlL24pLGhlaWdodDpNYXRoLm1heCh5ZSxyL24pfX1zZXREYXRhKGUscil7dGhpcy5pbnB1dEltYWdlPWUsdGhpcy5pbnB1dE1hc2s9cn1yZXNpemVPdXRwdXQoZSxyKXtzdXBlci5yZXNpemVPdXRwdXQoZSxyKTtjb25zdCBuPXRoaXMuZ2V0Qmx1clRleHR1cmVTaXplKGUscik7dGhpcy5ibHVyLnJlc2l6ZU91dHB1dChuLndpZHRoLG4uaGVpZ2h0KX19Y2xhc3MgS3UgZXh0ZW5kcyBidHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMucGlwZWxpbmU9bmV3IHF1KHRoaXMuY29udGV4dCxlKSx0aGlzLmRpc2FibGVQb3N0UHJvY2Vzc2luZygpfX1jbGFzcyBKdSBleHRlbmRzIGJye2NvbnN0cnVjdG9yKGUscil7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBuPXtjb250ZXh0OmUsaGVpZ2h0OmUuY2FudmFzLmhlaWdodCx3aWR0aDplLmNhbnZhcy53aWR0aH0scz1uZXcgZXMoey4uLm4scmFkaXVzOnIsdHlwZTpnci5HQVVTU0lBTn0pLGk9bmV3IHByKHsuLi5uLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpzLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6dihlLHRoaXMuaW5wdXRJbWFnZSl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6dihlLHRoaXMuaW5wdXRJbWFnZSksZm9yZWdyb3VuZDp2KGUscy5vdXRwdXQpLHRocmVzaG9sZDp2KGUsdGhpcy5pbnB1dE1hc2spfSl9KX1zZXREYXRhKGUscil7dGhpcy5pbnB1dEltYWdlPWUsdGhpcy5pbnB1dE1hc2s9cn19Y2xhc3MgWnUgZXh0ZW5kcyBidHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMucGlwZWxpbmU9bmV3IEp1KHRoaXMuY29udGV4dCxlKSx0aGlzLmRpc2FibGVQb3N0UHJvY2Vzc2luZygpfX1jbGFzcyBlZiBleHRlbmRzIEpue2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnByZWNpc2VNYXNrRW5hYmxlZD0hMH1zZXQgcmVhZGVyKGUpe3RoaXMuZnJhbWVSZWFkZXI9ZX1hc3luYyBydW4oKXt0aGlzLmZyYW1lUmVhZGVyJiYoYXdhaXQgdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSxhd2FpdCBzdXBlci5ydW4oKSl9YXN5bmMgcmVhZE5leHRWaWRlb0ZyYW1lKCl7dmFyIHI7Y29uc3QgZT1hd2FpdCgocj10aGlzLmZyYW1lUmVhZGVyKT09bnVsbD92b2lkIDA6ci5yZWFkKCkpO2UhPW51bGwmJmUudmFsdWUmJih0aGlzLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGUudmFsdWUpLGUudmFsdWUuY2xvc2UoKSl9fWNsYXNzIHRmIGV4dGVuZHMgYnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMucGlwZWxpbmU9bmV3IGVmKHRoaXMuY29udGV4dCl9c2V0QmFja2dyb3VuZFZpZGVvKGUpe3RoaXMucGlwZWxpbmUucmVhZGVyPWV9fWNsYXNzIG5ze2JsdXJCYWNrZ3JvdW5kKGUpe3JldHVybiBuZXcgS3UoZSl9Ymx1clNpbGhvdWV0dGUoZSl7cmV0dXJuIG5ldyBadShlKX1pbWFnZUJhY2tncm91bmQoKXtyZXR1cm4gbmV3IHRzfXZpZGVvQmFja2dyb3VuZCgpe3JldHVybiBuZXcgdGZ9fWNsYXNzIHJme2NvbnN0cnVjdG9yKGUpe3N3aXRjaChlKXtjYXNlIEtlLkNBTlZBUzp0aGlzLmZhY3Rvcnk9bmV3IHJzO2JyZWFrO2Nhc2UgS2UuV0VCR0w6dGhpcy5mYWN0b3J5PW5ldyBuczticmVhaztkZWZhdWx0OmNvbnN0IHI9X2koKTt0aGlzLmZhY3Rvcnk9ci5zdXBwb3J0ZWQ/bmV3IG5zOm5ldyByc319Ymx1ckJhY2tncm91bmQoZSl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJsdXJCYWNrZ3JvdW5kKGUpfWJsdXJTaWxob3VldHRlKGUpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5ibHVyU2lsaG91ZXR0ZShlKX1pbWFnZUJhY2tncm91bmQoKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuaW1hZ2VCYWNrZ3JvdW5kKCl9dmlkZW9CYWNrZ3JvdW5kKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLnZpZGVvQmFja2dyb3VuZCgpfWdldEZhY3RvcnkoKXtpZighdGhpcy5mYWN0b3J5KXRocm93IkZhY3RvcnkgaXMgbm90IGluaXRpYWxpemVkIjtyZXR1cm4gdGhpcy5mYWN0b3J5fX1jbGFzcyBuZntzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgbixzO3RoaXMucmVuZGVyZXImJnRoaXMucmVuZGVyZXIuZGVzdHJveSgpO2NvbnN0IHI9bmV3IHJmKChuPWUucmVuZGVyaW5nT3B0aW9ucyk9PW51bGw/dm9pZCAwOm4udHlwZSk7c3dpdGNoKGUudHJhbnNmb3JtZXJUeXBlKXtjYXNlIkJhY2tncm91bmRCbHVyIjp0aGlzLnJlbmRlcmVyPXIuYmx1ckJhY2tncm91bmQodGhpcy5nZXRCbHVyU2l6ZShlLnJhZGl1cykpO2JyZWFrO2Nhc2UiU2lsaG91ZXR0ZUJsdXIiOnRoaXMucmVuZGVyZXI9ci5ibHVyU2lsaG91ZXR0ZSh0aGlzLmdldEJsdXJTaXplKGUucmFkaXVzKSk7YnJlYWs7Y2FzZSJWaWRlb0JhY2tncm91bmQiOmNvbnN0IGk9ci52aWRlb0JhY2tncm91bmQoKTt0aGlzLmJhY2tncm91bmRWaWRlbyYmaS5zZXRCYWNrZ3JvdW5kVmlkZW8odGhpcy5iYWNrZ3JvdW5kVmlkZW8pLHRoaXMucmVuZGVyZXI9aTticmVhaztjYXNlIlZpcnR1YWxCYWNrZ3JvdW5kIjpjb25zdCBhPXIuaW1hZ2VCYWNrZ3JvdW5kKCk7dGhpcy5iYWNrZ3JvdW5kSW1hZ2UmJmEuc2V0QmFja2dyb3VuZEltYWdlKHRoaXMuYmFja2dyb3VuZEltYWdlKSx0aGlzLnJlbmRlcmVyPWE7YnJlYWs7ZGVmYXVsdDp0aHJvd2BVbmtub3duIHJlbmRlcmluZyB0eXBlIFske2UudHJhbnNmb3JtZXJUeXBlfV1gfSgocz1lLnJlbmRlcmluZ09wdGlvbnMpPT1udWxsP3ZvaWQgMDpzLnR5cGUpPT09S2UuV0VCR0wmJihlLnJlbmRlcmluZ09wdGlvbnMuc2VsZmllU2VnbWVudGF0aW9uVHlwZT09PWt0LlBSRUNJU0U/dGhpcy5yZW5kZXJlci5lbmFibGVQb3N0UHJvY2Vzc2luZygpOmUucmVuZGVyaW5nT3B0aW9ucy5zZWxmaWVTZWdtZW50YXRpb25UeXBlPT09a3QuRkFTVCYmdGhpcy5yZW5kZXJlci5kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKSl9c2V0VmlkZW9CR1JlYWRhYmxlKGUpe3RoaXMuYmFja2dyb3VuZFZpZGVvPWUuZ2V0UmVhZGVyKCk7Y29uc3Qgcj10aGlzLnJlbmRlcmVyO3IhPW51bGwmJnIuc2V0QmFja2dyb3VuZFZpZGVvJiZyLnNldEJhY2tncm91bmRWaWRlbyh0aGlzLmJhY2tncm91bmRWaWRlbyl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7Y29uc3Qgcj10aGlzLnJlbmRlcmVyO3IhPW51bGwmJnIuc2V0QmFja2dyb3VuZEltYWdlJiZyLnNldEJhY2tncm91bmRJbWFnZShlKSx0aGlzLmJhY2tncm91bmRJbWFnZT1lfWFzeW5jIHByb2Nlc3MoZSxyKXtpZih0aGlzLnJlbmRlcmVyKXJldHVybiB0aGlzLnJlbmRlcmVyLnJlbmRlcihlLHIpfWFzeW5jIHJlc2l6ZUZvcmVncm91bmQoZSxyKXt9Z2V0Qmx1clNpemUoZT1xZS5Mb3cpe3N3aXRjaChlKXtjYXNlIHFlLkxvdzpyZXR1cm4gNTtjYXNlIHFlLkhpZ2g6cmV0dXJuIDEyfXJldHVybiBlfWFzeW5jIHByb2ZpbGUoZSl7dmFyIHI7cmV0dXJuKChyPXRoaXMucmVuZGVyZXIpPT1udWxsP3ZvaWQgMDpyLnByb2ZpbGVXZWJnbChlKSk/P1tdfX1jb25zdCBzZj0uMSxvZj0uNyxhZj0iaHR0cHM6Ly9kM29wcWptcXp4ZjA1Ny5jbG91ZGZyb250Lm5ldC9tbC92b25hZ2Vfc2VsZmllX3NlZ21lbnRlci9mbG9hdDE2L3YxL3ZvbmFnZV9zZWxmaWVfc2VnbWVudGVyLnRmbGl0ZSI7Y2xhc3MgY2Z7Y29uc3RydWN0b3IoKXt0aGlzLmNhbnZhcz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCksdGhpcy5jb250ZXh0PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSksdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5ncHVEZWxlZ2F0ZT0hMH1hc3luYyBjcmVhdGVJbWFnZVNlZ21lbnRlcigpe2lmKCF0aGlzLkltYWdlU2VnbWVudGVyfHwhdGhpcy53YXNtRmlsZXNldCl7Y29uc29sZS53YXJuKCJNZWRpYXBpcGUgb2JqZWN0cyBub3QgbG9hZGVkIik7cmV0dXJufXRoaXMuaW1hZ2VTZWdtZW50ZXI9YXdhaXQgdGhpcy5JbWFnZVNlZ21lbnRlci5jcmVhdGVGcm9tT3B0aW9ucyh0aGlzLndhc21GaWxlc2V0LHtiYXNlT3B0aW9uczp7bW9kZWxBc3NldFBhdGg6dGhpcy5tb2RlbEFzc2V0VXJpUGF0aCxkZWxlZ2F0ZTp0aGlzLmdwdURlbGVnYXRlPyJHUFUiOiJDUFUifSxydW5uaW5nTW9kZToiVklERU8iLG91dHB1dENhdGVnb3J5TWFzazohMCxvdXRwdXRDb25maWRlbmNlTWFza3M6ITB9KX1hc3luYyBsb2FkTWVkaWFwaXBlQXNzZXRzKGUscil7dGhpcy5tb2RlbEFzc2V0VXJpUGF0aD1lfHxhZjtjb25zdCBuPXI/YCR7cn0vdGFzay12aXNpb24uanNgOiJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BtZWRpYXBpcGUvdGFza3MtdmlzaW9uQDAuMTAuMjAvK2VzbSIscz1yP2Ake3J9L3dhc21gOiJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BtZWRpYXBpcGUvdGFza3MtdmlzaW9uQDAuMTAuMjAvd2FzbSIse0ZpbGVzZXRSZXNvbHZlcjppLEltYWdlU2VnbWVudGVyOmF9PWF3YWl0IGltcG9ydChuKTt0aGlzLkltYWdlU2VnbWVudGVyPWEsdGhpcy53YXNtRmlsZXNldD1hd2FpdCBpLmZvclZpc2lvblRhc2tzKHMpfWFzeW5jIGluaXQoZSxyLG4pe249PT0hMSYmKHRoaXMuZ3B1RGVsZWdhdGU9ITEpLGF3YWl0IHRoaXMubG9hZE1lZGlhcGlwZUFzc2V0cyhlLHIpLGdsb2JhbFRoaXMuZG9jdW1lbnQ9e30sYXdhaXQgdGhpcy5jcmVhdGVJbWFnZVNlZ21lbnRlcigpfWFzeW5jIHByb2Nlc3MoZSl7dmFyIGE7aWYoIXRoaXMuaW1hZ2VTZWdtZW50ZXIpe2NvbnNvbGUud2FybigiSW1hZ2VTZWdtZW50ZXIgaW5zdGFuY2Ugbm90IGF2YWlsYWJsZSIpO3JldHVybn0odGhpcy53aWR0aCE9PWUud2lkdGh8fHRoaXMuaGVpZ2h0IT09ZS5oZWlnaHQpJiYodGhpcy5jYW52YXMud2lkdGg9dGhpcy53aWR0aD1lLndpZHRoLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLmhlaWdodD1lLmhlaWdodCx0aGlzLm1hc2smJih0aGlzLm1hc2s9bmV3IEltYWdlRGF0YSh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSkpLHRoaXMubWFza3x8KHRoaXMubWFzaz1uZXcgSW1hZ2VEYXRhKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpKSx0aGlzLmNvbnRleHQuZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpO2NvbnN0IHI9RGF0ZS5ub3coKTtsZXQgbjt0cnl7KGE9dGhpcy5pbWFnZVNlZ21lbnRlcik9PW51bGx8fGEuc2VnbWVudEZvclZpZGVvKHRoaXMuY29udGV4dC5nZXRJbWFnZURhdGEoMCwwLGUud2lkdGgsZS5oZWlnaHQpLHIsbz0+e3ZhciB1O2NvbnN0IGM9KHU9by5jb25maWRlbmNlTWFza3MpPT1udWxsP3ZvaWQgMDp1WzBdO249Yz09bnVsbD92b2lkIDA6Yy5nZXRBc0Zsb2F0MzJBcnJheSgpfSl9Y2F0Y2h7YXdhaXQgdGhpcy5jcmVhdGVJbWFnZVNlZ21lbnRlcigpO3JldHVybn1pZighbilyZXR1cm47aWYoIXRoaXMucHJldmlvdXNDb25maWRlbmNlTWFzayl7dGhpcy5wcmV2aW91c0NvbmZpZGVuY2VNYXNrPW4uc2xpY2UoKTtyZXR1cm59Y29uc3Qgcz1uLm1hcCgobyxjKT0+e3ZhciBmO2NvbnN0IHU9KGY9dGhpcy5wcmV2aW91c0NvbmZpZGVuY2VNYXNrKT09bnVsbD92b2lkIDA6ZltjXTtyZXR1cm4gdSE9PXZvaWQgMD90aGlzLmJsZW5kKHUsbyk6b30pLGk9WzI1NSwwLDBdO2ZvcihsZXQgbz0wO288KHM9PW51bGw/dm9pZCAwOnMubGVuZ3RoKTtvKyspe2NvbnN0IGM9MS1zW29dO2M+c2Y/KGM8b2Y/KHRoaXMubWFzay5kYXRhW28qNF09aVswXSpjLHRoaXMubWFzay5kYXRhW28qNCszXT0yNTUqYyk6KHRoaXMubWFzay5kYXRhW28qNF09aVswXSx0aGlzLm1hc2suZGF0YVtvKjQrM109MjU1KSx0aGlzLm1hc2suZGF0YVtvKjQrMV09aVsxXSx0aGlzLm1hc2suZGF0YVtvKjQrMl09aVsyXSk6dGhpcy5tYXNrLmRhdGFbbyo0XT10aGlzLm1hc2suZGF0YVtvKjQrMV09dGhpcy5tYXNrLmRhdGFbbyo0KzJdPXRoaXMubWFzay5kYXRhW28qNCszXT0wfXJldHVybiB0aGlzLnByZXZpb3VzQ29uZmlkZW5jZU1hc2s9cy5zbGljZSgpLHRoaXMubWFza31pc0dwdVN1cHBvcnRlZCgpe3JldHVybiEwfWJsZW5kKGUscil7Y29uc3Qgcz0tLjc0ODY5OSxpPS01Ny44MDUxLGE9MjkxLjMwOSxvPS02MjQuNzE3LGM9ci0uNSx1PWMqYyxmPTEtTWF0aC5taW4oMSx1Kig1LjY4ODQyK3UqKHMrdSooaSt1KihhK3UqbykpKSkpO3JldHVybiByKyhlLXIpKihmKi45KX19Y2xhc3MgdWZ7Y29uc3RydWN0b3IoKXt0aGlzLnJlcG9ydGVyPW5ldyB4aSx0aGlzLmlzRW5hYmxlZD0hMH1hc3luYyBpbml0KGUscil7dmFyIG4sczt0aGlzLnNlbGZpZVNlZ21lbnRhdGlvbj1uZXcgY2YsYXdhaXQoKHM9dGhpcy5zZWxmaWVTZWdtZW50YXRpb24pPT1udWxsP3ZvaWQgMDpzLmluaXQoci5tb2RlbEFzc2V0VXJpUGF0aCxyLm1lZGlhcGlwZUJhc2VBc3NldHNVcmksKG49ci5zZWdtZW50YXRpb25PcHRpb25zKT09bnVsbD92b2lkIDA6bi5ncHVTdXBwb3J0KSksdGhpcy5iYWNrZ3JvdW5kRmlsdGVyPW5ldyBuZix0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJDcmVhdGUifSl9YXN5bmMgdHJhbnNmb3JtKGUscil7dmFyIG8sYztpZighdGhpcy5pc0VuYWJsZWQpcmV0dXJuIHIuZW5xdWV1ZShlKTtsZXQgbjtjb25zdCBzPWUudGltZXN0YW1wPz8wLGk9YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZSksYT1hd2FpdCgobz10aGlzLnNlbGZpZVNlZ21lbnRhdGlvbik9PW51bGw/dm9pZCAwOm8ucHJvY2VzcyhpKSk7YSYmKG49YXdhaXQoKGM9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6Yy5wcm9jZXNzKGksYSkpKSxuPyhlLmNsb3NlKCksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKG4se3RpbWVzdGFtcDpzLGFscGhhOiJkaXNjYXJkIn0pKSk6ci5lbnF1ZXVlKGUpfWFzeW5jIHNldEJhY2tncm91bmRPcHRpb25zKGUpe3ZhciByO3RoaXMuYmFja2dyb3VuZE9wdGlvbnM9ZSxhd2FpdCgocj10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpyLnNldEJhY2tncm91bmRPcHRpb25zKGUpKSx0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJVcGRhdGUifSl9YXN5bmMgc2V0VmlkZW9CR1JlYWRhYmxlKGUpe3ZhciByO2F3YWl0KChyPXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnIuc2V0VmlkZW9CR1JlYWRhYmxlKGUpKX1hc3luYyBzZXRWaXJ0dWFsQkdJbWFnZShlKXt2YXIgcjthd2FpdCgocj10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpyLnNldFZpcnR1YWxCR0ltYWdlKGUpKX1hc3luYyBwcm9maWxlKGUpe3ZhciByO3JldHVybigocj10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpyLnByb2ZpbGUoZSkpPz9bXX1nZXRUcmFuc2Zvcm1lclR5cGUoKXt2YXIgZTtyZXR1cm4oKGU9dGhpcy5iYWNrZ3JvdW5kT3B0aW9ucyk9PW51bGw/dm9pZCAwOmUudHJhbnNmb3JtZXJUeXBlKT8/IlVuZGVmaW5lZCJ9ZW5hYmxlKCl7dGhpcy5pc0VuYWJsZWQ9ITB9ZGlzYWJsZSgpe3RoaXMuaXNFbmFibGVkPSExfXJlcG9ydChlKXt2YXIgcjt0aGlzLnJlcG9ydGVyLnNlbmQoe3ZlcnNpb246RWksYWN0aW9uOiJNbFRyYW5zZm9ybWVycyIsdHJhbnNmb3JtZXJUeXBlOihyPXRoaXMuYmFja2dyb3VuZE9wdGlvbnMpPT1udWxsP3ZvaWQgMDpyLnRyYW5zZm9ybWVyVHlwZSxjb25maWc6SlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrZ3JvdW5kT3B0aW9ucyksLi4uZX0pfX1jb25zdCB4cj1jbGFzcyB4cntjb25zdHJ1Y3Rvcigpe3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyPW5ldyB1Zix0aGlzLm1lZGlhUHJvY2Vzc29yPW5ldyBRcyx0aGlzLnJhdGU9MzAsdGhpcy5ldmVudHNRdWV1ZT1bXSx0aGlzLmZyYW1lVHJhbnNmb3JtTGF0ZW5jeU1zPVtdfWFzeW5jIGluaXQoZSxyKXt0aGlzLmZyYW1lVHJhbnNmb3JtTGF0ZW5jeU1zPVtdLGF3YWl0IHRoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyLmluaXQoZSxyKSxhd2FpdCB0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYW5zZm9ybWVycyhbdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXJdKSx0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMucmF0ZSksdGhpcy5tZWRpYVByb2Nlc3Nvci5vbkFueSgobixzKT0+e3RoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I/KHRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3Ioe25hbWU6bixkYXRhOnN9KSx0aGlzLnJlc29sdmVPbk1lZGlhUHJvY2Vzc29yPXZvaWQgMCk6dGhpcy5ldmVudHNRdWV1ZS5wdXNoKHtuYW1lOm4sZGF0YTpzfSl9KX1lbmFibGUoKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5lbmFibGUoKX1kaXNhYmxlKCl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuZGlzYWJsZSgpfWFzeW5jIG9uTWVkaWFQcm9jZXNzb3JFdmVudCgpe3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZShlPT57dGhpcy5ldmVudHNRdWV1ZS5sZW5ndGg+MD9lKHRoaXMuZXZlbnRzUXVldWUuc2hpZnQoKSk6dGhpcy5yZXNvbHZlT25NZWRpYVByb2Nlc3Nvcj1lfSl9YXN5bmMgc2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy5yYXRlPWUsdGhpcy5tZWRpYVByb2Nlc3Nvci5zZXRUcmFja0V4cGVjdGVkUmF0ZShlKX1hc3luYyB0cmFuc2Zvcm0oZSxyKXtsZXQgbj1wZXJmb3JtYW5jZS5ub3coKTt0aGlzLm1lZGlhUHJvY2Vzc29yLnRyYW5zZm9ybShlLHIpLHRoaXMuZnJhbWVUcmFuc2Zvcm1MYXRlbmN5TXMucHVzaChwZXJmb3JtYW5jZS5ub3coKS1uKX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgcjthd2FpdCgocj10aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lcik9PW51bGw/dm9pZCAwOnIuc2V0QmFja2dyb3VuZE9wdGlvbnMoZSkpfXNldFZpZGVvQkdSZWFkYWJsZShlKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5zZXRWaWRlb0JHUmVhZGFibGUoZSl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0VmlydHVhbEJHSW1hZ2UoZSl9YXN5bmMgdGVybWluYXRlKCl7YXdhaXQgdGhpcy5tZWRpYVByb2Nlc3Nvci5kZXN0cm95KCk7Y29uc3Qgcj10aGlzLmZyYW1lVHJhbnNmb3JtTGF0ZW5jeU1zLnJlZHVjZSgobixzKT0+bitzLDApL3RoaXMuZnJhbWVUcmFuc2Zvcm1MYXRlbmN5TXMubGVuZ3RofHwwO2NvbnNvbGUubG9nKGBUcmFuc2Zvcm0gbGF0ZW5jeSBhdmVyYWdlIGlzOiAke3J9IG1zYCl9c2V0Vm9uYWdlTWV0YWRhdGEoZSl7VnMoZSl9YXN5bmMgcHJvZmlsZShlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIucHJvZmlsZShlKSl9fTt1cygiUHJvY2Vzc29yV29ya2VyIix4cik7bGV0IHNzPXhyfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvY2Vzc29yLXdvcmtlci1DU3h1Z0VHMS5qcy5tYXAK", V3 = (r) => Uint8Array.from(atob(r), (e) => e.charCodeAt(0)), Ks = typeof self < "u" && self.Blob && new Blob([V3(s2)], { type: "text/javascript;charset=utf-8" });
|
|
23099
23099
|
function x3(r) {
|
|
23100
23100
|
let e;
|
|
23101
23101
|
try {
|
|
@@ -23173,7 +23173,7 @@ const Pi = class Pi extends qr {
|
|
|
23173
23173
|
!this.config || this.worker || (this.worker = await lc(Lo, x3), this.isEnabled || await this.worker.disable(), await this.worker.init(
|
|
23174
23174
|
`worker_${Pi.initCount++}`,
|
|
23175
23175
|
this.config
|
|
23176
|
-
), this.backgroundOptions
|
|
23176
|
+
), await this.worker.setVonageMetadata(yi()), this.backgroundOptions ? await this.setBackgroundOptions(this.backgroundOptions) : await this.setBackgroundOptions(this.config), this.listenWorker());
|
|
23177
23177
|
}
|
|
23178
23178
|
async updateBackgroundOptions(e) {
|
|
23179
23179
|
var m, v, S;
|