survey-pdf 1.9.20 → 1.9.21

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/survey.pdf.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * surveyjs - SurveyJS PDF library v1.9.20
2
+ * surveyjs - SurveyJS PDF library v1.9.21
3
3
  * Copyright (c) 2015-2022 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  * License: MIT (http://www.opensource.org/licenses/mit-license.php)
5
5
  */
@@ -11098,4 +11098,4 @@ var jspdf = __webpack_require__(18);
11098
11098
  /***/ })
11099
11099
  /******/ ]);
11100
11100
  });
11101
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBmMGI0NDFiYzY1M2Q0ODNlOTFhNSIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9Iiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9wZGYudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGZpZWxkLnRzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9Iiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZW1wdHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9maWxlLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbXVsdGlwbGV0ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhdGluZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfdGV4dGJveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY3VzdG9tLnRzIiwid2VicGFjazovLy8uL3NyYy9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vfi9ub2RlLWludGVydmFsLXRyZWUvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vc2hhbGxvd2VxdWFsL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbi50cyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbURBQTJDLGNBQWM7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUM5REE7QUFBQSxJQUFJLGFBQWEsR0FBRyxVQUFTLENBQU0sRUFBRSxDQUFNO0lBQ3ZD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QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xKLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUssU0FBVSxTQUFTLENBQUMsT0FBWSxFQUFFLFVBQWUsRUFBRSxDQUFNLEVBQUUsU0FBYztJQUMzRSxTQUFTLEtBQUssQ0FBQyxLQUFVLElBQUksT0FBTyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBWSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0SCxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLE9BQVksRUFBRSxNQUFXO1FBQy9ELFNBQVMsU0FBUyxDQUFDLEtBQVUsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUFFO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FBRSxDQUFDLENBQUM7UUFDaEcsU0FBUyxRQUFRLENBQUMsS0FBVSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FBRTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQUUsQ0FBQyxDQUFDO1FBQ25HLFNBQVMsSUFBSSxDQUFDLE1BQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVLLFNBQVUsV0FBVyxDQUFDLE9BQVksRUFBRSxJQUFTO0lBQy9DLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQU8sRUFBRSxFQUFFLEdBQUcsRUFBTyxFQUFFLEVBQUUsRUFBRSxDQUFNLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLENBQUM7SUFDL0ksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsY0FBYSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6SixTQUFTLElBQUksQ0FBQyxDQUFNLElBQUksT0FBTyxVQUFVLENBQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxTQUFTLElBQUksQ0FBQyxFQUFPO1FBQ2pCLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUM7WUFBRSxJQUFJO2dCQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNYLEtBQUssQ0FBQyxDQUFDO29CQUFDLEtBQUssQ0FBQzt3QkFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUFDLE1BQU07b0JBQzlCLEtBQUssQ0FBQzt3QkFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUN4RCxLQUFLLENBQUM7d0JBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQUMsU0FBUztvQkFDakQsS0FBSyxDQUFDO3dCQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQUMsU0FBUztvQkFDakQ7d0JBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTs0QkFBUSxDQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUFDLFNBQVM7eUJBQUU7d0JBQ25ILElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHlCQUF5QjtBQUN4RDtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IseUJBQXlCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxvQ0FBb0M7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLG1DQUFtQztBQUNwRTtBQUNBO0FBQ0EsaUNBQWlDLG1DQUFtQztBQUNwRTtBQUNBO0FBQ0EsNkRBQTZELGVBQWUsRUFBRTtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0Esc0RBQXNELGFBQWE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLHVEQUF1RCxhQUFhO0FBQ3BFO0FBQ0EsaUM7Ozs7OztBQ25zQkE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLG1CQUFtQixvQkFBb0I7QUFDdkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7O0FDN0NjLFNBQVUsa0JBQWtCLENBQUMsR0FBUTtJQUMvQyxJQUFNLHNCQUFzQixHQUFhLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUM3RixHQUFHLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBUyxVQUFlO1FBQzFFLElBQU0sSUFBSSxHQUFRLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELElBQU0sTUFBTSxHQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQU0sV0FBVyxHQUFXLEdBQUcsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLFdBQVcsR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDTixDQUFDOzs7Ozs7Ozs7Ozs7QUNSc0M7QUFFdkM7SUFBc0MsMEdBQVM7SUFDM0MsMEJBQW1CLFFBQW1CLEVBQUUsVUFBeUIsRUFDN0QsSUFBVyxFQUFFLElBQVk7ZUFDekIsa0JBQU0sUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFDTCx1QkFBQztBQUFELENBQUMsQ0FMcUMsNERBQVMsR0FLOUM7Ozs7Ozs7O0FDVEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUM7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGdCQUFnQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDLHdDQUF3QyxpRkFBaUY7QUFDekg7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDOztBQUVBO0FBQ0EsaUNBQWlDO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDLHNCQUFzQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLDZDQUE2QyxxQkFBcUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsWUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsMkRBQTJEO0FBQy9HLG9EQUFvRCwyREFBMkQ7QUFDL0csZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMseUVBQXlFO0FBQ25IO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdEQUFnRDs7QUFFdkY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QywyREFBMkQ7QUFDbEc7O0FBRUEsMENBQTBDLG9DQUFvQzs7QUFFOUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFGQUFxRjs7QUFFckY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQ0FBa0MsdURBQXVEO0FBQ3pGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQywwQ0FBMEM7QUFDekYseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSwrQ0FBK0Msd0NBQXdDO0FBQ3ZGLHlCQUF5QjtBQUN6QiwrQ0FBK0MseUJBQXlCO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLCtGQUErRjtBQUMvRjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxxR0FBcUc7QUFDckc7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxrQkFBa0I7QUFDaEMsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLG9CO0FBQ2QsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakMsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxxRzs7Ozs7OztBQzUyRkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEMsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsd0JBQXdCLE9BQU87QUFDL0IsaUJBQWlCLE9BQU87QUFDeEI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUciLCJmaWxlIjoiLi9wYWNrYWdlcy9zdXJ2ZXktcGRmL3N1cnZleS5wZGYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcImpzcGRmXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiU3VydmV5UERGXCIsIFtcInN1cnZleS1jb3JlXCIsIFwianNwZGZcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU3VydmV5UERGXCJdID0gZmFjdG9yeShyZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJqc3BkZlwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5UERGXCJdID0gZmFjdG9yeShyb290W1wiU3VydmV5XCJdLCByb290W1wianNwZGZcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV83X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxMyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZjBiNDQxYmM2NTNkNDgzZTkxYTUiLCJkZWNsYXJlIHZhciBSZWZsZWN0OiBhbnk7XG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZDogYW55LCBiOiBhbnkpOiBhbnkge1xuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZDogYW55LCBiOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIGIgIT09ICdmdW5jdGlvbicgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAnICsgU3RyaW5nKGIpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsJyk7XG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICAgIF9fYXNzaWduID0gKDxhbnk+T2JqZWN0KS5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odDogYW55KSB7XG4gICAgICAgIGZvciAodmFyIHM6IGFueSwgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzOiBhbnksIGU6IGFueSkge1xuICAgIHZhciB0OiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihxW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHFbaV0pKVxuICAgICAgICAgICAgICAgIHRbcVtpXV0gPSBzW3FbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnM6IGFueSwgdGFyZ2V0OiBhbnksIGtleTogYW55LCBkZXNjOiBhbnkpIHtcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09ICdmdW5jdGlvbicpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZzogYW55LCBfYXJndW1lbnRzOiBhbnksIFA6IGFueSwgZ2VuZXJhdG9yOiBhbnkpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZTogYW55KSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlOiBhbnkpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWU6IGFueSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWU6IGFueSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsndGhyb3cnXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0OiBhbnkpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZzogYW55LCBib2R5OiBhbnkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiA8YW55PltdLCBvcHM6IDxhbnk+W10gfSwgZjogYW55LCB5OiBhbnksIHQ6IGFueSwgZzogYW55O1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAndGhyb3cnOiB2ZXJiKDEpLCAncmV0dXJuJzogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobjogYW55KSB7IHJldHVybiBmdW5jdGlvbiAodjogYW55KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wOiBhbnkpIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4nKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WydyZXR1cm4nXSA6IG9wWzBdID8geVsndGhyb3cnXSB8fCAoKHQgPSB5WydyZXR1cm4nXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7ICg8YW55Pl8pID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSAodG86IGFueSwgZnJvbTogYW55LCBwYWNrOiBhbnkpIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjogYW55OyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvaGVscGVycy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24sIFF1ZXN0aW9uUmF0aW5nTW9kZWwsIFF1ZXN0aW9uRmlsZU1vZGVsLCBMb2NhbGl6YWJsZVN0cmluZywgUXVlc3Rpb25TZWxlY3RCYXNlLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgKiBhcyBTdXJ2ZXlQREZNb2R1bGUgZnJvbSAnLi9lbnRyaWVzL3BkZic7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IElIVE1MUmVuZGVyVHlwZSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBUaXRsZVBhbmVsQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwnO1xuaW1wb3J0IHsgRGVzY3JpcHRpb25CcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24nO1xuaW1wb3J0IHsgQ29tbWVudEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9jb21tZW50JztcbmltcG9ydCB7IExpbmtCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfbGluayc7XG5pbXBvcnQgeyBIVE1MQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2h0bWwnO1xuaW1wb3J0IHsgSW1hZ2VCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfaW1hZ2UnO1xuaW1wb3J0IHsgRW1wdHlCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuaW1wb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgQWRvcm5lcnNPcHRpb25zIH0gZnJvbSAnLi9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzJztcblxuZXhwb3J0IGNsYXNzIFN1cnZleUhlbHBlciB7XG4gICAgcHVibGljIHN0YXRpYyBFUFNJTE9OOiBudW1iZXIgPSAyLjIyMDQ0NjA0OTI1MDMxMzA4MDg0NzI2MzMzNjE4MTZlLTE1O1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfU1VSVkVZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS43O1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFHRV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuMztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgREVTQ1JJUFRJT05fRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAyLjAgLyAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBPVEhFUl9ST1dTX0NPVU5UOiBudW1iZXIgPSAyO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9XSURUSDogbnVtYmVyID0gMztcbiAgICBwdWJsaWMgc3RhdGljIFJBVElOR19NSU5fSEVJR0hUOiBudW1iZXIgPSAyO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIE1BVFJJWF9DT0xVTU5fV0lEVEg6IG51bWJlciA9IDU7XG4gICAgcHVibGljIHN0YXRpYyBJTUFHRVBJQ0tFUl9DT1VOVDogbnVtYmVyID0gNDtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX1JBVElPOiBudW1iZXIgPSA0LjAgLyAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBNVUxUSVBMRVRFWFRfVEVYVF9QRVJTOiBudW1iZXIgPSBNYXRoLkUgLyAxMC4wO1xuICAgIHB1YmxpYyBzdGF0aWMgSFRNTF9UQUlMX1RFWFRfU0NBTEU6IG51bWJlciA9IDAuMjQ7XG4gICAgcHVibGljIHN0YXRpYyBTRUxFQ1RfSVRFTV9GTEFUX1NDQUxFOiBudW1iZXIgPSAwLjk1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIEdBUF9CRVRXRUVOX0NPTFVNTlM6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIEdBUF9CRVRXRUVOX0lURU1fVEVYVDogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIEZPUk1fQk9SREVSX1ZJU0lCTEU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHB1YmxpYyBzdGF0aWMgQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjE7XG4gICAgcHVibGljIHN0YXRpYyBWSVNJQkxFX0JPUkRFUl9TQ0FMRTogbnVtYmVyID0gMC44O1xuICAgIHB1YmxpYyBzdGF0aWMgVU5WSVNJQkxFX0JPUkRFUl9TQ0FMRTogbnVtYmVyID0gMC4yO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFESVVTX1NDQUxFOiBudW1iZXIgPSAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9GT05UX1NDQUxFOiBudW1iZXIgPSAxLjE7XG4gICAgcHVibGljIHN0YXRpYyBWQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFOiBudW1iZXIgPSAwLjM7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RPX0lNQUdFX1FVQUxJVFk6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIEZPUk1fQk9SREVSX0NPTE9SOiBzdHJpbmcgPSAnIzlmOWY5Zic7XG4gICAgcHVibGljIHN0YXRpYyBURVhUX0NPTE9SOiBzdHJpbmcgPSAnIzQwNDA0MCc7XG4gICAgcHVibGljIHN0YXRpYyBCQUNLR1JPVU5EX0NPTE9SOiBzdHJpbmcgPSAnI0ZGRkZGRic7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9MT0NBVElPTl9NQVRSSVg6IHN0cmluZyA9ICdtYXRyaXgnO1xuICAgIHB1YmxpYyBzdGF0aWMgU1RBTkRBUkRfRk9OVDogc3RyaW5nID0gJ2hlbHZldGljYSc7XG4gICAgcHVibGljIHN0YXRpYyBDVVNUT01fRk9OVF9FTkNPRElORzogc3RyaW5nID0gJ0lkZW50aXR5LUgnO1xuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZVdpZHRoKHdpZHRoOiBzdHJpbmcsIG1heFdpZHRoOiBudW1iZXIsXG4gICAgICAgIGNvbHVtbnNDb3VudDogbnVtYmVyID0gMSk6IG51bWJlciB7XG4gICAgICAgIGlmICh3aWR0aC5pbmRleE9mKCdjYWxjJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtYXhXaWR0aCAvIGNvbHVtbnNDb3VudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZTogbnVtYmVyID0gcGFyc2VGbG9hdCh3aWR0aCk7XG4gICAgICAgIGNvbnN0IHVuaXQ6IHN0cmluZyA9IHdpZHRoLnJlcGxhY2UoL1teQS1aYS16XS9nLCAnJyk7XG4gICAgICAgIGxldCBrOiBudW1iZXI7XG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICAgICAgY2FzZSAncHQnOlxuICAgICAgICAgICAgICAgIGsgPSAxLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyAyNS40O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY20nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gMi41NDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3B4JzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDk2LjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwYyc6XG4gICAgICAgICAgICAgICAgayA9IDEyLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlbSc6XG4gICAgICAgICAgICAgICAgayA9IDEyLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdleCc6XG4gICAgICAgICAgICAgICAgayA9IDYuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgICAgICBrID0gbWF4V2lkdGggLyAxMDAuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5taW4odmFsdWUgKiBrLCBtYXhXaWR0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcHhUb1B0KHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh2YWx1ZSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlICogNzIuMCAvIDk2LjA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VSZWN0cyguLi5yZWN0czogSVJlY3RbXSk6IElSZWN0IHtcbiAgICAgICAgY29uc3QgcmVzdWx0UmVjdDogSVJlY3QgPSB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdHNbMF0ueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHJlY3RzWzBdLnhSaWdodCxcbiAgICAgICAgICAgIHlUb3A6IHJlY3RzWzBdLnlUb3AsXG4gICAgICAgICAgICB5Qm90OiByZWN0c1swXS55Qm90XG4gICAgICAgIH07XG4gICAgICAgIHJlY3RzLmZvckVhY2goKHJlY3Q6IElSZWN0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRSZWN0LnhMZWZ0ID0gTWF0aC5taW4ocmVzdWx0UmVjdC54TGVmdCwgcmVjdC54TGVmdCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnhSaWdodCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueFJpZ2h0LCByZWN0LnhSaWdodCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnlUb3AgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnlUb3AsIHJlY3QueVRvcCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnlCb3QgPSBNYXRoLm1heChyZXN1bHRSZWN0LnlCb3QsIHJlY3QueUJvdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0UmVjdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVQb2ludChyZWN0OiBJUmVjdCwgaXNMZWZ0OiBib29sZWFuID0gdHJ1ZSwgaXNUb3A6IGJvb2xlYW4gPSBmYWxzZSk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogaXNMZWZ0ID8gcmVjdC54TGVmdCA6IHJlY3QueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogaXNUb3AgPyByZWN0LnlUb3AgOiByZWN0LnlCb3RcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSZWN0KHBvaW50OiBJUG9pbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIHdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyBoZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIZWFkZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiAwLjAsXG4gICAgICAgICAgICB5Qm90OiBjb250cm9sbGVyLm1hcmdpbnMudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRm9vdGVyUmVjdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IDAuMCxcbiAgICAgICAgICAgIHhSaWdodDogY29udHJvbGxlci5wYXBlcldpZHRoLFxuICAgICAgICAgICAgeVRvcDogY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICB5Qm90OiBjb250cm9sbGVyLnBhcGVySGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hvb3NlSHRtbEZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ3N0YW5kYXJkJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNDdXN0b21Gb250KGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZm9udE5hbWUpID8gdGhpcy5TVEFOREFSRF9GT05UIDogY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci51c2VDdXN0b21Gb250SW5IdG1sID8gY29udHJvbGxlci5mb250TmFtZSA6IHRoaXMuU1RBTkRBUkRfRk9OVDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNzc1RleHRSdWxlKGZvbnRTaXplOiBudW1iZXIsIGZvbnRTdHlsZTogc3RyaW5nLCBmb250TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBcImZvbnQtc2l6ZTogJHtmb250U2l6ZX1wdDsgZm9udC13ZWlnaHQ6ICR7Zm9udFN0eWxlfTsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBjb2xvcjogJHt0aGlzLlRFWFRfQ09MT1J9O1wiYDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIdG1sQ29udGFpbmVyQmxvY2soaHRtbDogc3RyaW5nLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZm9udCA9IHRoaXMuY2hvb3NlSHRtbEZvbnQoY29udHJvbGxlciwgcmVuZGVyQXMpO1xuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJfX3N1cnZleXBkZl9odG1sXCIgc3R5bGU9JHt0aGlzLmdlbmVyYXRlQ3NzVGV4dFJ1bGUoXG4gICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplLCBjb250cm9sbGVyLmZvbnRTdHlsZSwgZm9udCl9PmAgK1xuICAgICAgICAgICAgYDxzdHlsZT4uX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiAwOyBsaW5lLWhlaWdodDogJHtjb250cm9sbGVyLmZvbnRTaXplfXB0IH0gYm9keSB7IG1hcmdpbjogMDsgfTwvc3R5bGU+JHtodG1sfTwvZGl2PmA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc3BsaXRIdG1sUmVjdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBodG1sQnJpY2s6IElQZGZCcmljayk6IElQZGZCcmljayB7XG4gICAgICAgIGNvbnN0IGJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgaHRtbEhlaWdodDogbnVtYmVyID0gaHRtbEJyaWNrLmhlaWdodDtcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpO1xuICAgICAgICBodG1sQnJpY2sueUJvdCA9IGh0bWxCcmljay55VG9wICsgbWluSGVpZ2h0O1xuICAgICAgICBjb25zdCBlbXB0eUJyaWNrQ291bnQ6IG51bWJlciA9IE1hdGguZmxvb3IoaHRtbEhlaWdodCAvIG1pbkhlaWdodCkgLSAxO1xuICAgICAgICBicmlja3MucHVzaChodG1sQnJpY2spO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoaHRtbEJyaWNrKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGVtcHR5QnJpY2tDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBicmlja3MucHVzaChuZXcgRW1wdHlCcmljayh0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBodG1sQnJpY2sud2lkdGgsIG1pbkhlaWdodCkpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IG1pbkhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW1haW5pbmdIZWlnaHQ6IG51bWJlciA9IGh0bWxIZWlnaHQgLSAoZW1wdHlCcmlja0NvdW50ICsgMSkgKiBtaW5IZWlnaHQ7XG4gICAgICAgIGlmIChyZW1haW5pbmdIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICBicmlja3MucHVzaChuZXcgRW1wdHlCcmljayh0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBodG1sQnJpY2sud2lkdGgsIHJlbWFpbmluZ0hlaWdodCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUGxhaW5UZXh0RmxhdDxUIGV4dGVuZHMgSVBkZkJyaWNrPihwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcsIGZhYnJpYzogbmV3IChxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykgPT4gVCk6IENvbXBvc2l0ZUJyaWNrIHtcbiAgICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gY29udHJvbGxlci5kb2Muc3BsaXRUZXh0VG9TaXplKHRleHQsXG4gICAgICAgICAgICBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBwb2ludC54TGVmdCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplOiBJU2l6ZSA9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQobGluZSk7XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sobmV3IGZhYnJpYyhxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBzaXplLndpZHRoLCBzaXplLmhlaWdodCksIGxpbmUpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IHNpemUuaGVpZ2h0O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUZXh0RmxhdDxUIGV4dGVuZHMgSVBkZkJyaWNrPihwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgZmFicmljOiBuZXcgKHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSA9PiBUKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyB8fCAhdGhpcy5oYXNIdG1sKHRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQbGFpblRleHRGbGF0KHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICB0ZXh0IDogdGhpcy5nZXRMb2NTdHJpbmcoPExvY2FsaXphYmxlU3RyaW5nPnRleHQpLCBmYWJyaWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRIdG1sUmVjdChjb250cm9sbGVyLCBhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KHBvaW50LCA8UXVlc3Rpb24+cXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2sodGhpcy5nZXRMb2NTdHJpbmcodGV4dCksIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgaGFzSHRtbCh0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuOiBSZWdFeHAgPSAvPFxcLz9bYS16XVtcXHNcXFNdKj4vaTtcbiAgICAgICAgcmV0dXJuIHRleHQuaGFzSHRtbCAmJiAocGF0dGVybi50ZXN0KCg8YW55PnRleHQpLnJlbmRlcmVkVGV4dCkgfHwgcGF0dGVybi50ZXN0KHRleHQucmVuZGVyZWRIdG1sKSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGdldEh0bWxNYXJnaW5zKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHBvaW50OiBJUG9pbnQpOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHBvaW50LnhMZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiBjb250cm9sbGVyLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgYm90dG9tOiBjb250cm9sbGVyLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoID4gY29udHJvbGxlci51bml0V2lkdGggPyB3aWR0aCA6IGNvbnRyb2xsZXIudW5pdFdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIVE1MUmVjdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9LCByZXN1bHRZOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVBhZ2VIZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJIZWlnaHQgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90IC0gY29udHJvbGxlci5tYXJnaW5zLnRvcDtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSAoY29udHJvbGxlci5oZWxwZXJEb2MuZ2V0TnVtYmVyT2ZQYWdlcygpIC0gMSkgKlxuICAgICAgICAgICAgKGNvbnRyb2xsZXIuZm9udFNpemUgKiBNYXRoLmZsb29yKGF2YWlsYWJsZVBhZ2VIZWlnaHQgLyBjb250cm9sbGVyLmZvbnRTaXplKSlcbiAgICAgICAgICAgICsgcmVzdWx0WSAtIG1hcmdpbnMudG9wICsgU3VydmV5SGVscGVyLkhUTUxfVEFJTF9URVhUX1NDQUxFICogY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZQYWdlczogbnVtYmVyID0gY29udHJvbGxlci5oZWxwZXJEb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5hZGRQYWdlKCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBudW1iZXJPZlBhZ2VzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmRlbGV0ZVBhZ2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCBtYXJnaW5zLndpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlSFRNTEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBodG1sOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9ID0gdGhpcy5nZXRIdG1sTWFyZ2lucyhjb250cm9sbGVyLCBwb2ludCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxJUGRmQnJpY2s+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5mcm9tSFRNTChodG1sLCBwb2ludC54TGVmdCwgbWFyZ2lucy50b3AsIHtcbiAgICAgICAgICAgICAgICBwYWdlc3BsaXQ6IHRydWUsIHdpZHRoOiBtYXJnaW5zLndpZHRoXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVIVE1MUmVjdChwb2ludCwgY29udHJvbGxlciwgbWFyZ2lucywgcmVzdWx0LnkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaHRtbCkpO1xuICAgICAgICAgICAgfSwgbWFyZ2lucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlRm9udEZhY2UoZm9udE5hbWU6IHN0cmluZywgZm9udEJhc2U2NDogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBgICtcbiAgICAgICAgICAgIGBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2ZvbnRCYXNlNjR9KSBmb3JtYXQoJ3dvZmYnKTsgYCArXG4gICAgICAgICAgICBgZm9udC13ZWlnaHQ6ICR7Zm9udFdlaWdodH07IH1gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlRm9udEZhY2VXaXRoSXRhbGljU3R5bGUoZm9udE5hbWU6IHN0cmluZywgZm9udEJhc2U2NDogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBgICtcbiAgICAgICAgICAgIGBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2ZvbnRCYXNlNjR9KSBmb3JtYXQoJ3dvZmYnKTsgYCArXG4gICAgICAgICAgICBgZm9udC13ZWlnaHQ6ICR7Zm9udFdlaWdodH07IGZvbnQtc3R5bGU6IGl0YWxpY31gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGh0bWxUb1htbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBodG1sRG9jOiBEb2N1bWVudCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7XG4gICAgICAgIGh0bWxEb2Mud3JpdGUoaHRtbC5yZXBsYWNlKC9cXCMvZywgJyUyMycpKTtcbiAgICAgICAgaHRtbERvYy5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd4bWxucycsIGh0bWxEb2MuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSk7XG4gICAgICAgIGh0bWxEb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAndW5zZXQnO1xuICAgICAgICByZXR1cm4gKG5ldyBYTUxTZXJpYWxpemVyKCkpLnNlcmlhbGl6ZVRvU3RyaW5nKGh0bWxEb2MuYm9keSkucmVwbGFjZSgvJTIzL2csICcjJyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnQ29udGVudChodG1sOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3Qgc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSAnLl9fc3VydmV5cGRmX2h0bWwgcCB7IG1hcmdpbjogdW5zZXQ7IGxpbmUtaGVpZ2h0OiAyMnB4OyB9IGJvZHkgeyBtYXJnaW46IHVuc2V0OyB9JztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgIGNvbnN0IGRpdjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdfX3N1cnZleXBkZl9odG1sJztcbiAgICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICBkaXYuc3R5bGUudG9wID0gJy0xMDAwMHB4JztcbiAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSAnLTEwMDAwcHgnO1xuICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAod2lkdGggLyA3Mi4wICogOTYuMCkgKyAncHgnO1xuICAgICAgICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuY29sb3IgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5mb250RmFtaWx5ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuZm9udCA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmxpbmVIZWlnaHQgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIGNvbnN0IGRpdldpZHRoOiBudW1iZXIgPSBkaXYub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IGRpdkhlaWdodDogbnVtYmVyID0gZGl2Lm9mZnNldEhlaWdodDtcbiAgICAgICAgZGl2LnJlbW92ZSgpO1xuICAgICAgICBzdHlsZS5yZW1vdmUoKTtcbiAgICAgICAgbGV0IGRlZnM6IHN0cmluZyA9ICcnO1xuICAgICAgICBpZiAoY29udHJvbGxlci51c2VDdXN0b21Gb250SW5IdG1sKSB7XG4gICAgICAgICAgICBkZWZzID0gYDxkZWZzPjxzdHlsZT4ke3RoaXMuZ2VuZXJhdGVGb250RmFjZShjb250cm9sbGVyLmZvbnROYW1lLCBjb250cm9sbGVyLmJhc2U2NE5vcm1hbCwgJ25vcm1hbCcpfWAgK1xuICAgICAgICAgICAgICAgIGAgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoY29udHJvbGxlci5mb250TmFtZSwgY29udHJvbGxlci5iYXNlNjRCb2xkLCAnYm9sZCcpfTwvc3R5bGU+PC9kZWZzPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzKS5mb3JFYWNoKGZvbnROYW1lID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250ID0gRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZm9udCkuZm9yRWFjaCgoZm9udFN0eWxlOiAnbm9ybWFsJyB8ICdib2xkJyB8ICdpdGFsaWMnIHwgJ2JvbGRpdGFsaWMnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb250U3R5bGUgPT09ICdub3JtYWwnIHx8IGZvbnRTdHlsZSA9PT0gJ2JvbGQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZzICs9IGAke3RoaXMuZ2VuZXJhdGVGb250RmFjZShmb250TmFtZSwgZm9udFtmb250U3R5bGVdLCBmb250U3R5bGUpfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZzICs9IGAke3RoaXMuZ2VuZXJhdGVGb250RmFjZVdpdGhJdGFsaWNTdHlsZShmb250TmFtZSwgZm9udFtmb250U3R5bGVdLCBmb250U3R5bGUgPT09ICdpdGFsaWMnID8gJ25vcm1hbCcgOiAnYm9sZCcpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWZzID0gJzxkZWZzPjxzdHlsZT4nICsgZGVmcyArICc8L3N0eWxlPjwvZGVmcz4nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ZnOiBzdHJpbmcgPSAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+JyArIGRlZnMgK1xuICAgICAgICAgICAgJzxzdHlsZT4uX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiB1bnNldDsgbGluZS1oZWlnaHQ6IDIycHg7IH08L3N0eWxlPicgK1xuICAgICAgICAgICAgYDxmb3JlaWduT2JqZWN0IHdpZHRoPVwiJHtkaXZXaWR0aH1weFwiIGhlaWdodD1cIiR7ZGl2SGVpZ2h0fXB4XCI+YCArXG4gICAgICAgICAgICB0aGlzLmh0bWxUb1htbChodG1sKSArICc8L2ZvcmVpZ25PYmplY3Q+PC9zdmc+JztcbiAgICAgICAgcmV0dXJuIHsgc3ZnLCBkaXZXaWR0aCwgZGl2SGVpZ2h0IH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgaHRtbFRvSW1hZ2UoaHRtbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ZnLCBkaXZXaWR0aCwgZGl2SGVpZ2h0IH0gPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlU3ZnQ29udGVudChodG1sLCB3aWR0aCwgY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGRhdGE6IHN0cmluZyA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdmcpKSk7XG4gICAgICAgIGNvbnN0IGltZzogSFRNTEltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuc3JjID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICBjYW52YXMud2lkdGggPSBkaXZXaWR0aDtcbiAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gZGl2SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gU3VydmV5SGVscGVyLkJBQ0tHUk9VTkRfQ09MT1I7XG4gICAgICAgICAgICAgICAgY29udGV4dC5maWxsUmVjdCgwLCAwLCBkaXZXaWR0aCwgZGl2SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFkpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdXJsOiB1cmwsIGFzcGVjdDogZGl2V2lkdGggLyBkaXZIZWlnaHQgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVybDogJ2RhdGE6LCcsIGFzcGVjdDogd2lkdGggLyB0aGlzLkVQU0lMT04gfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIFRleHRCb2xkQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSAqPSB0aGlzLlRJVExFX0ZPTlRfU0NBTEU7XG4gICAgICAgIGlmIChxdWVzdGlvbi5ubykge1xuICAgICAgICAgICAgY29uc3Qgbm9UZXh0OiBzdHJpbmcgPSBxdWVzdGlvbi5ubyArICcgJztcbiAgICAgICAgICAgIGxldCBub0ZsYXQ6IElQZGZCcmljaztcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0h0bWwocXVlc3Rpb24ubG9jVGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tZWFzdXJlVGV4dChub1RleHQsICdib2xkJykud2lkdGg7XG4gICAgICAgICAgICAgICAgbm9GbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhub1RleHQsIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9GbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiwgY29udHJvbGxlciwgbm9UZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhub0ZsYXQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogQ29tcG9zaXRlQnJpY2sgPSA8Q29tcG9zaXRlQnJpY2s+YXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoXG4gICAgICAgICAgICBjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBxdWVzdGlvbi5sb2NUaXRsZSk7XG4gICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayh0ZXh0RmxhdCk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBpZiAocXVlc3Rpb24uaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRUZXh0OiBzdHJpbmcgPSBxdWVzdGlvbi5yZXF1aXJlZFRleHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHF1ZXN0aW9uLmxvY1RpdGxlKSkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQodGV4dEZsYXQudW5mb2xkKClbMF0sIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tZWFzdXJlVGV4dChyZXF1aXJlZFRleHQsICdib2xkJykud2lkdGg7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQoY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2socmVxdWlyZWRUZXh0LCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSkpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KHRleHRGbGF0LnVuZm9sZCgpLnBvcCgpLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlcXVpcmVkVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGZvbnRTaXplU2NhbGU6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBmb250U2l6ZVNjYWxlO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KHBvaW50LCBudWxsLCBjb250cm9sbGVyLCB0ZXh0LCBUaXRsZVBhbmVsQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiB0aXRsZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQsIGNvbnRyb2xsZXIsIHRleHQsIHRoaXMuVElUTEVfU1VSVkVZX0ZPTlRfU0laRV9TQ0FMRSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVQYW5lbEZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGlzUGFnZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQsIGNvbnRyb2xsZXIsIHRleHQsXG4gICAgICAgICAgICBpc1BhZ2UgPyB0aGlzLlRJVExFX1BBR0VfRk9OVF9TSVpFX1NDQUxFIDogdGhpcy5USVRMRV9QQU5FTF9GT05UX1NJWkVfU0NBTEUpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZURlc2NGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqIHRoaXMuREVTQ1JJUFRJT05fRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIERlc2NyaXB0aW9uQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVhZG9ubHlSZW5kZXJBcyhxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nIHtcbiAgICAgICAgcmV0dXJuICg8YW55PnF1ZXN0aW9uKS5yZWFkb25seVJlbmRlckFzID09PSAnYXV0bycgPyBjb250cm9sbGVyLnJlYWRvbmx5UmVuZGVyQXMgOiAoPGFueT5xdWVzdGlvbikucmVhZG9ubHlSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVDb21tZW50RmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJvd3M6IG51bWJlciwgaXNRdWVzdGlvbjogYm9vbGVhbiwgaW5kZXg6IG51bWJlciA9IDApOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IHRoaXMuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgY29udHJvbGxlciwgcm93cyk7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWRPbmx5ICYmIHRoaXMuZ2V0UmVhZG9ubHlSZW5kZXJBcyhxdWVzdGlvbiwgY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcG9pbnQsIGNvbnRyb2xsZXIsIHF1ZXN0aW9uLCB0aGlzLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUocXVlc3Rpb24sIGlzUXVlc3Rpb24pLCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBwYWRkaW5nOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgICAgICBpZiAodGV4dEZsYXQueUJvdCArIHBhZGRpbmcgPiByZWN0LnlCb3QpIHJlY3QueUJvdCA9IHRleHRGbGF0LnlCb3QgKyBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWVudEJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLCBpbmRleCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyAocXVlc3Rpb24udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPT0gbnVsbCA/IHF1ZXN0aW9uLnZhbHVlIDogJycpIDpcbiAgICAgICAgICAgIChxdWVzdGlvbi5jb21tZW50ICE9PSB1bmRlZmluZWQgJiYgcXVlc3Rpb24uY29tbWVudCAhPT0gbnVsbCA/IHF1ZXN0aW9uLmNvbW1lbnQgOiAnJyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UXVlc3Rpb25PckNvbW1lbnREaXNwbGF5VmFsdWUocXVlc3Rpb246IFF1ZXN0aW9uLCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpc1F1ZXN0aW9uID8gcXVlc3Rpb24uZGlzcGxheVZhbHVlIDogU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUocXVlc3Rpb24sIGlzUXVlc3Rpb24pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGluQnJvd3NlciA9IHR5cGVvZiBJbWFnZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogYW55LFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZWxpbms6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuXG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuaW5Ccm93c2VyKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbGxlci5hcHBseUltYWdlRml0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3V2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgKj0gbmV3V2lkdGggLyB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwdFRvUHg6IG51bWJlciA9IDk2LjAgLyA3Mi4wO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpdFR5cGUgPSAhIXF1ZXN0aW9uICYmICEhcXVlc3Rpb24uaW1hZ2VGaXQgPyBxdWVzdGlvbi5pbWFnZUZpdCA6ICdjb250YWluJztcbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXNIdG1sOiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICBgPGRpdiBzdHlsZT0nb3ZlcmZsb3c6IGhpZGRlbjsgd2lkdGg6ICR7d2lkdGggKiBwdFRvUHh9cHg7IGhlaWdodDogJHtoZWlnaHQgKiBwdFRvUHh9cHg7Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPScke2ltYWdlbGlua30nIHN0eWxlPSdvYmplY3QtZml0OiAke2ZpdFR5cGV9OyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOycvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyB1cmwsIGFzcGVjdCB9OiB7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9ID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGNhbnZhc0h0bWwsIHdpZHRoLCBjb250cm9sbGVyKTtcblxuICAgICAgICAgICAgICAgIGltYWdlbGluayA9IHVybDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaHRtbDogc3RyaW5nID0gYDxpbWcgc3JjPScke2ltYWdlbGlua30nIHdpZHRoPScke3dpZHRofScgaGVpZ2h0PScke2hlaWdodH0nLz5gO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBIVE1MQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRoaXMuY3JlYXRlUmVjdChwb2ludCwgd2lkdGgsIGhlaWdodCksIGh0bWwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCBpbWFnZWxpbmssIHBvaW50LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjYW5QcmV2aWV3SW1hZ2UocXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsLCBpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfSwgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmNhblByZXZpZXdJbWFnZShpdGVtKTtcbiAgICAgICAgLy8gICYmICBhd2FpdCB0aGlzLmdldEltYWdlU2l6ZSh1cmwpICE9PSBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlU2l6ZSh1cmw6IHN0cmluZyk6IFByb21pc2U8SVNpemU+IHtcbiAgICAgICAgaWYgKCFTdXJ2ZXlIZWxwZXIuaW5Ccm93c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHdpZHRoOiB1bmRlZmluZWQsIGhlaWdodDogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZTogYW55ID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKG51bGwpOyB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSb3dsaW5lRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB3aWR0aD86IG51bWJlciwgY29sb3I/OiBzdHJpbmcpOiBJUGRmQnJpY2sge1xuICAgICAgICBsZXQgeFJpZ2h0OiBudW1iZXIgPSB0eXBlb2Ygd2lkdGggPT09ICd1bmRlZmluZWQnID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA6XG4gICAgICAgICAgICBwb2ludC54TGVmdCArIHdpZHRoO1xuICAgICAgICB4UmlnaHQgPSB4UmlnaHQgPiBwb2ludC54TGVmdCA/IHhSaWdodCA6IHBvaW50LnhMZWZ0ICsgdGhpcy5FUFNJTE9OO1xuICAgICAgICByZXR1cm4gbmV3IFJvd2xpbmVCcmljayhjb250cm9sbGVyLCB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHhSaWdodCxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3AgKyB0aGlzLkVQU0lMT04sXG4gICAgICAgICAgICB5Qm90OiBwb2ludC55VG9wICsgdGhpcy5FUFNJTE9OXG4gICAgICAgIH0sIHR5cGVvZiBjb2xvciA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogY29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUxpbmtGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nLCBsaW5rOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVUZXh0OiBDb21wb3NpdGVCcmljayA9IDxDb21wb3NpdGVCcmljaz5hd2FpdCB0aGlzLlxuICAgICAgICAgICAgY3JlYXRlVGV4dEZsYXQocG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVMaW5rOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb21wb3NpdGVUZXh0LnVuZm9sZCgpLmZvckVhY2goKHRleHQ6IFRleHRCcmljaykgPT4ge1xuICAgICAgICAgICAgY29tcG9zaXRlTGluay5hZGRCcmljayhuZXcgTGlua0JyaWNrKHRleHQsIGxpbmspKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVQb2ludDogSVBvaW50ID0gdGhpcy5jcmVhdGVQb2ludChjb21wb3NpdGVMaW5rKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUxpbmsuYWRkQnJpY2sodGhpcy5jcmVhdGVSb3dsaW5lRmxhdChsaW5lUG9pbnQsXG4gICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tcG9zaXRlTGluay53aWR0aCwgTGlua0JyaWNrLkNPTE9SKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlTGluaztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBY3JvZm9ybVJlY3QocmVjdDogSVJlY3QpOiBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgcmVjdC55VG9wLFxuICAgICAgICAgICAgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIF07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBsaW5lczogbnVtYmVyID0gMSk6IElSZWN0IHtcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBwb2ludC54TGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY29udHJvbGxlci51bml0V2lkdGgpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIGxpbmVzO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWN0KHBvaW50LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KHBvaW50OiBJUG9pbnQsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgdmFsdWU6IHN0cmluZywgb25seUZpcnN0TGluZTogYm9vbGVhbik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFO1xuICAgICAgICBpZiAoIW9ubHlGaXJzdExpbmUpIHBvaW50LnlUb3AgKz0gcGFkZGluZztcbiAgICAgICAgcG9pbnQueExlZnQgKz0gcGFkZGluZztcbiAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucyhwb2ludC54TGVmdCwgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICsgcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB2YWx1ZS50b1N0cmluZygpLCBUZXh0QnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIHRleHRGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHJlbmRlckZsYXRCb3JkZXJzKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXQ6IFBkZkJyaWNrKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5GT1JNX0JPUkRFUl9WSVNJQkxFKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1pblNpZGU6IG51bWJlciA9IE1hdGgubWluKGZsYXQud2lkdGgsIGZsYXQuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlZJU0lCTEVfQk9SREVSX1NDQUxFICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgICAgIGNvbnN0IHZpc2libGVTY2FsZTogbnVtYmVyID0gdGhpcy5mb3JtU2NhbGUoY29udHJvbGxlciwgZmxhdCkgKyB2aXNpYmxlV2lkdGggLyBtaW5TaWRlO1xuICAgICAgICBjb25zdCB1bnZpc2libGVXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogdGhpcy5VTlZJU0lCTEVfQk9SREVSX1NDQUxFICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgICAgIGNvbnN0IHVudmlzaWJsZVNjYWxlOiBudW1iZXIgPSAxLjAgLSB1bnZpc2libGVXaWR0aCAvIG1pblNpZGU7XG4gICAgICAgIGNvbnN0IHVudmlzaWJsZVJhZGl1czogbnVtYmVyID0gdGhpcy5SQURJVVNfU0NBTEUgKiB1bnZpc2libGVXaWR0aDtcbiAgICAgICAgY29uc3Qgb2xkRHJhd0NvbG9yOiBzdHJpbmcgPSBjb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKGZsYXQuZm9ybUJvcmRlckNvbG9yKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0TGluZVdpZHRoKHZpc2libGVXaWR0aCk7XG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4udGhpcy5jcmVhdGVBY3JvZm9ybVJlY3QodGhpcy5zY2FsZVJlY3QoZmxhdCwgdmlzaWJsZVNjYWxlKSkpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IodGhpcy5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0TGluZVdpZHRoKHVudmlzaWJsZVdpZHRoKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Mucm91bmRlZFJlY3QoLi4udGhpcy5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICB0aGlzLnNjYWxlUmVjdChmbGF0LCB1bnZpc2libGVTY2FsZSkpLCB1bnZpc2libGVSYWRpdXMsIHVudmlzaWJsZVJhZGl1cyk7XG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHJlbmRlclJlYWRPbmx5VGV4dEZpZWxkKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHF1ZXN0aW9uOiBRdWVzdGlvbiwgZmxhdDogUGRmQnJpY2ssIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIG9ubHlGaXJzdExpbmU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBvaW50OiBJUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KGZsYXQsIHRydWUsIHRydWUpO1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IGZsYXQuZm9udFNpemU7XG4gICAgICAgIGNvbnN0IHRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgcXVlc3Rpb24sIHZhbHVlLCBvbmx5Rmlyc3RMaW5lKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICBpZiAob25seUZpcnN0TGluZSkgYXdhaXQgdGV4dEZsYXQudW5mb2xkKClbMF0ucmVuZGVyKCk7XG4gICAgICAgIGVsc2UgYXdhaXQgdGV4dEZsYXQucmVuZGVyKCk7XG4gICAgICAgIHRoaXMucmVuZGVyRmxhdEJvcmRlcnMoY29udHJvbGxlciwgZmxhdCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TG9jU3RyaW5nKHRleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSHRtbCh0ZXh0KSkgcmV0dXJuIHRleHQucmVuZGVyZWRIdG1sO1xuICAgICAgICByZXR1cm4gKDxhbnk+dGV4dCkucmVuZGVyZWRUZXh0IHx8IHRleHQucmVuZGVyZWRIdG1sO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBxRHJvcERvd246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgICAgIGlmIChxRHJvcERvd24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcURyb3BEb3duLm90aGVyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghIXF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChxRHJvcERvd24uc2hvd09wdGlvbnNDYXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcURyb3BEb3duLm9wdGlvbnNDYXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250ZW50UXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKTogUXVlc3Rpb24ge1xuICAgICAgICByZXR1cm4gISEoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uID8gKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA6IHF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgaWYoISFxdWVzdGlvbi5jdXN0b21XaWRnZXQpIHJldHVybiBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUXVlc3Rpb25UeXBlO1xuICAgICAgICByZXR1cm4gISEoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uID8gJ2N1c3RvbV9tb2RlbCcgOiBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nTWluV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMuUkFUSU5HX01JTl9XSURUSCkud2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nSXRlbVRleHQocXVlc3Rpb246IFF1ZXN0aW9uUmF0aW5nTW9kZWwsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGxvY1RleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgICAgICBjb25zdCByYXRpbmdJdGVtTG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcobG9jVGV4dC5vd25lciwgbG9jVGV4dC51c2VNYXJrZG93bik7XG4gICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIHF1ZXN0aW9uLm1pblJhdGVEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHF1ZXN0aW9uLmxvY01pblJhdGVEZXNjcmlwdGlvbi50ZXh0ICsgJyAnICsgdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEgJiYgcXVlc3Rpb24ubWF4UmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCkgKyAnICcgKyBxdWVzdGlvbi5sb2NNYXhSYXRlRGVzY3JpcHRpb24udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmF0aW5nSXRlbUxvY1RleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9ICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtXG4gICAgICAgICAgICAodGhpcy5JTUFHRVBJQ0tFUl9DT1VOVCAtIDEpICogY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIHdpZHRoID4gMCA/IHdpZHRoIDogY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbHVtbldpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGNvbENvdW50OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtIChjb2xDb3VudCAtIDEpICpcbiAgICAgICAgICAgIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5HQVBfQkVUV0VFTl9DT0xVTU5TKSAvIGNvbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNldENvbHVtbk1hcmdpbnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlciwgY29sdW1uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoOiBudW1iZXIgPSB0aGlzLmdldENvbHVtbldpZHRoKGNvbnRyb2xsZXIsIGNvbENvdW50KTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArIGNvbHVtbiAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyAoY29sQ291bnQgLSBjb2x1bW4gLSAxKSAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIG1vdmVSZWN0KHJlY3Q6IElSZWN0LCBsZWZ0OiBudW1iZXIgPSByZWN0LnhMZWZ0LCB0b3A6IG51bWJlciA9IHJlY3QueVRvcCk6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgeVRvcDogdG9wLFxuICAgICAgICAgICAgeFJpZ2h0OiBsZWZ0ICsgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgeUJvdDogdG9wICsgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2NhbGVSZWN0KHJlY3Q6IElSZWN0LCBzY2FsZTogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0O1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHJlY3QueUJvdCAtIHJlY3QueVRvcDtcbiAgICAgICAgY29uc3Qgc2NhbGVXaWR0aDogbnVtYmVyID0gKCh3aWR0aCA8IGhlaWdodCkgPyB3aWR0aCA6IGhlaWdodCkgKiAoMS4wIC0gc2NhbGUpIC8gMi4wO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHJlY3QueExlZnQgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcmVjdC55VG9wICsgc2NhbGVXaWR0aCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdC54UmlnaHQgLSBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeUJvdDogcmVjdC55Qm90IC0gc2NhbGVXaWR0aFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGZvcm1TY2FsZShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBmbGF0OiBQZGZCcmljayk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1pblNpZGU6IG51bWJlciA9IE1hdGgubWluKGZsYXQud2lkdGgsIGZsYXQuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgYm9yZGVyV2lkdGg6IG51bWJlciA9IDIuMCAqIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgICAgIHJldHVybiAobWluU2lkZSAtIGJvcmRlcldpZHRoKSAvIG1pblNpZGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBxdWVzdGlvbjogUXVlc3Rpb24sIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy5nZXRDb250ZW50UXVlc3Rpb25UeXBlKHF1ZXN0aW9uKTtcbiAgICAgICAgY29uc3QgZmxhdFF1ZXN0aW9uOiBJRmxhdFF1ZXN0aW9uID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5cbiAgICAgICAgICAgIGNyZWF0ZShzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBxdWVzdGlvblR5cGUpO1xuICAgICAgICBjb25zdCBxdWVzdGlvbkZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IGZsYXRRdWVzdGlvbi5nZW5lcmF0ZUZsYXRzKHBvaW50KTtcbiAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc09wdGlvbnMgPSBuZXcgQWRvcm5lcnNPcHRpb25zKHBvaW50LFxuICAgICAgICAgICAgcXVlc3Rpb25GbGF0cywgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCksIFN1cnZleVBERk1vZHVsZSk7XG4gICAgICAgIGlmIChxdWVzdGlvbi5jdXN0b21XaWRnZXQgJiYgcXVlc3Rpb24uY3VzdG9tV2lkZ2V0LmlzRml0KHF1ZXN0aW9uKSAmJlxuICAgICAgICAgICAgcXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlJlbmRlcikge1xuICAgICAgICAgICAgc3VydmV5Lm9uUmVuZGVyUXVlc3Rpb24udW5zaGlmdChxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUmVuZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJRdWVzdGlvbi5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ZvbnRFeGlzdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBmb250TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5pbnRlcm5hbC5nZXRGb250KGZvbnROYW1lKS5mb250TmFtZSA9PT0gZm9udE5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNDdXN0b21Gb250KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZvbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLmludGVybmFsLmdldEZvbnQoZm9udE5hbWUpLmVuY29kaW5nID09PSB0aGlzLkNVU1RPTV9GT05UX0VOQ09ESU5HO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGZpeEZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0N1c3RvbUZvbnQoY29udHJvbGxlciwgY29udHJvbGxlci5mb250TmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnRleHQoJ2xvYWQgZm9udCcsIDAsIDApO1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2MuZGVsZXRlUGFnZSgxKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkUGFnZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2xvbmUoc3JjOiBhbnkpOiBhbnkge1xuICAgICAgICBjb25zdCB0YXJnZXQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gc3JjKSB7XG4gICAgICAgICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc3JjW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuXG5leHBvcnQgdHlwZSBGbGF0Q29uc3RydWN0b3IgPSBuZXcgKFxuICAgIHN1cnZleTogU3VydmV5UERGLFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlclxuKSA9PiBJRmxhdFF1ZXN0aW9uO1xuZXhwb3J0IGNsYXNzIEZsYXRSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHF1ZXN0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IEZsYXRDb25zdHJ1Y3RvciB9ID0ge307XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEZsYXRSZXBvc2l0b3J5ID0gbmV3IEZsYXRSZXBvc2l0b3J5KCk7XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBGbGF0UmVwb3NpdG9yeSB7XG4gICAgICAgIHJldHVybiBGbGF0UmVwb3NpdG9yeS5pbnN0YW5jZTtcbiAgICB9XG4gICAgcHVibGljIHJlZ2lzdGVyKG1vZGVsVHlwZTogc3RyaW5nLCByZW5kZXJlckNvbnN0cnVjdG9yOiBGbGF0Q29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbnNbbW9kZWxUeXBlXSA9IHJlbmRlcmVyQ29uc3RydWN0b3I7XG4gICAgfVxuICAgIHB1YmxpYyBjcmVhdGUoc3VydmV5OiBTdXJ2ZXlQREYsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGRvY0NvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHR5cGU/OiBzdHJpbmcpOiBJRmxhdFF1ZXN0aW9uIHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcgPyBxdWVzdGlvbi5nZXRUeXBlKCkgOiB0eXBlO1xuICAgICAgICBjb25zdCByZW5kZXJlckNvbnN0cnVjdG9yOiBGbGF0Q29uc3RydWN0b3IgPSB0aGlzLnF1ZXN0aW9uc1txdWVzdGlvblR5cGVdIHx8IEZsYXRRdWVzdGlvbjtcbiAgICAgICAgcmV0dXJuIG5ldyByZW5kZXJlckNvbnN0cnVjdG9yKHN1cnZleSwgcXVlc3Rpb24sIGRvY0NvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiwgTG9jYWxpemFibGVTdHJpbmcsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJRmxhdFF1ZXN0aW9uIHtcbiAgICBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT47XG4gICAgZ2VuZXJhdGVGbGF0cyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT47XG59XG5leHBvcnQgY2xhc3MgRmxhdFF1ZXN0aW9uIGltcGxlbWVudHMgSUZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT05URU5UX0dBUF9WRVJUX1NDQUxFOiBudW1iZXIgPSAwLjU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT05URU5UX0dBUF9IT1JfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTlRFTlRfSU5ERU5UX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBERVNDX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4wNjI1O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb247XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbj5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRUaXRsZShwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUaXRsZUZsYXQocG9pbnQsXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdERlc2NyaXB0aW9uKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBkZXNjUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGRlc2NQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICBkZXNjUG9pbnQueVRvcCArPSBGbGF0UXVlc3Rpb24uREVTQ19HQVBfU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgdGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmxvY0Rlc2NyaXB0aW9uO1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZURlc2NGbGF0KGRlc2NQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0ZXh0KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ29tbWVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgdGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmxvY0NvbW1lbnRUZXh0O1xuICAgICAgICBjb25zdCBvdGhlclRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQob3RoZXJUZXh0RmxhdCk7XG4gICAgICAgIG90aGVyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKG90aGVyVGV4dEZsYXQsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQsIGZhbHNlKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRQYW5lbCA9ICg8YW55PnRoaXMucXVlc3Rpb24pLmNvbnRlbnRQYW5lbDtcbiAgICAgICAgaWYgKCEhY29udGVudFBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwodGhpcy5zdXJ2ZXksXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBjb250ZW50UGFuZWwsIHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gU3VydmV5SGVscGVyLmdldENvbnRlbnRRdWVzdGlvbih0aGlzLnF1ZXN0aW9uKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLnF1ZXN0aW9uLmluZGVudCkud2lkdGg7XG4gICAgICAgIGNvbnN0IGluZGVudFBvaW50OiBJUG9pbnQgPSB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQgKyB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5xdWVzdGlvbi5pbmRlbnQpLndpZHRoLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGNvbW1lbnRQb2ludDogSVBvaW50ID0gaW5kZW50UG9pbnQ7XG4gICAgICAgIGxldCB0aXRsZUxvY2F0aW9uOiBzdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmdldFRpdGxlTG9jYXRpb24oKTtcbiAgICAgICAgdGl0bGVMb2NhdGlvbiA9IHRoaXMucXVlc3Rpb24uaGFzVGl0bGUgPyB0aXRsZUxvY2F0aW9uIDogJ2hpZGRlbic7XG4gICAgICAgIGNvbnN0IGlzRGVzYyA9ICEhU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0Rlc2NyaXB0aW9uKTtcbiAgICAgICAgc3dpdGNoICh0aXRsZUxvY2F0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgY2FzZSAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Rlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGl0bGVGbGF0KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soZGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoZGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCksIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICAgICAgICAgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQgPSBjb250ZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21wb3NpdGUoY29udGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmNvbnRlbnRGbGF0cykueUJvdCArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGNvbnRlbnRGbGF0cy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQgPSBjb250ZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5jb250ZW50RmxhdHMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbW1lbnQoY29tbWVudFBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlUG9pbnQ6IElQb2ludCA9IGluZGVudFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wID0gZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0ueUJvdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKHRpdGxlUG9pbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhkZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdsZWZ0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayh0aXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Rlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGl0bGVGbGF0KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soZGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgPSBNYXRoLm1heChjb250ZW50UG9pbnQueExlZnQsIGRlc2NGbGF0LnhSaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfSE9SX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250ZW50UG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY29tbWVudFBvaW50LnhMZWZ0ID0gY29udGVudFBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21wb3NpdGUoY29udGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uY29udGVudEZsYXRzKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soY29udGVudEZsYXRzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uY29udGVudEZsYXRzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICBjYXNlIFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVg6XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZUxvY2F0aW9uICE9PSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IGNvbnRlbnRQb2ludDtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShjb250ZW50UG9pbnQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cyAhPT0gbnVsbCAmJiBmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0NvbW1lbnQgJiYgdGhpcy5xdWVzdGlvbi50aXRsZUxvY2F0aW9uICE9PSAnYm90dG9tJykge1xuICAgICAgICAgICAgZmxhdHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21tZW50KGNvbW1lbnRQb2ludCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ3F1ZXN0aW9uJywge1xuICAgIG5hbWU6ICdyZWFkb25seVJlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ3RleHQnLCAnYWNyb2Zvcm0nXVxufSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgVGV4dEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBhbGlnbjogeyBhbGlnbjogc3RyaW5nLCBiYXNlbGluZTogc3RyaW5nIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5hbGlnbiA9IHtcbiAgICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgICAgICBiYXNlbGluZTogJ21pZGRsZSdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJpdmF0ZSBlc2NhcGVUZXh0KCkge1xuICAgICAgICB3aGlsZSAodGhpcy50ZXh0LmluZGV4T2YoJ1xcdCcpID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5yZXBsYWNlKCdcXHQnLCBBcnJheSg1KS5qb2luKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGFsaWduUG9pbnQ6IElQb2ludCA9IHRoaXMuYWxpZ25Qb2ludCh0aGlzKTtcbiAgICAgICAgbGV0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGxldCBvbGRUZXh0Q29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0VGV4dENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKHRoaXMudGV4dENvbG9yKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy50ZXh0KHRoaXMuZXNjYXBlVGV4dCgpLCBhbGlnblBvaW50LnhMZWZ0LCBhbGlnblBvaW50LnlUb3AsIHRoaXMuYWxpZ24pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldFRleHRDb2xvcihvbGRUZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFsaWduUG9pbnQocmVjdDogSVJlY3QpOiBJUG9pbnQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHJlY3QueExlZnQsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyAocmVjdC55Qm90IC0gcmVjdC55VG9wKSAvIDIuMFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dC50cyIsImltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlQnJpY2sgaW1wbGVtZW50cyBJUGRmQnJpY2sge1xuICAgIHByaXZhdGUgYnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgIHByaXZhdGUgX3hMZWZ0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeFJpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeVRvcDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3lCb3Q6IG51bWJlcjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoLi4uYnJpY2tzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB0aGlzLl94TGVmdCA9IDAuMDtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0gMC4wO1xuICAgICAgICB0aGlzLl95VG9wID0gMC4wO1xuICAgICAgICB0aGlzLl95Qm90ID0gMC4wO1xuICAgICAgICB0aGlzLmFkZEJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIGdldCB4TGVmdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feExlZnQ7IH1cbiAgICBzZXQgeExlZnQoeExlZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KHhMZWZ0IC0gdGhpcy54TGVmdCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0geExlZnQ7XG4gICAgfVxuICAgIGdldCB4UmlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3hSaWdodDsgfVxuICAgIHNldCB4UmlnaHQoeFJpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIHhSaWdodCAtIHRoaXMueFJpZ2h0LCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHhSaWdodDtcbiAgICB9XG4gICAgZ2V0IHlUb3AoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lUb3A7IH1cbiAgICBzZXQgeVRvcCh5VG9wOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgeVRvcCAtIHRoaXMueVRvcCwgMC4wKTtcbiAgICAgICAgdGhpcy5feVRvcCA9IHlUb3A7XG4gICAgfVxuICAgIGdldCB5Qm90KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl95Qm90OyB9XG4gICAgc2V0IHlCb3QoeUJvdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoMC4wLCAwLjAsIDAuMCwgeUJvdCAtIHRoaXMueUJvdCk7XG4gICAgICAgIHRoaXMuX3lCb3QgPSB5Qm90O1xuICAgIH1cbiAgICBwcml2YXRlIHNoaWZ0KGxlZnRTaGlmdDogbnVtYmVyLCByaWdodFNoaWZ0OiBudW1iZXIsXG4gICAgICAgIHRvcFNoaWZ0OiBudW1iZXIsIGJvdFNoaWZ0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgYnJpY2sueExlZnQgKz0gbGVmdFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueFJpZ2h0ICs9IHJpZ2h0U2hpZnQ7XG4gICAgICAgICAgICBicmljay55VG9wICs9IHRvcFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueUJvdCArPSBib3RTaGlmdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueUJvdCAtIHRoaXMueVRvcDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYnJpY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJyaWNrc1tpXS5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyaWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRCcmljayguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIGlmIChicmlja3MubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnJpY2tzLnB1c2goLi4uYnJpY2tzKTtcbiAgICAgICAgICAgIGxldCBtZXJnZVJlY3QgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi50aGlzLmJyaWNrcyk7XG4gICAgICAgICAgICB0aGlzLl94TGVmdCA9IG1lcmdlUmVjdC54TGVmdDtcbiAgICAgICAgICAgIHRoaXMuX3hSaWdodCA9IG1lcmdlUmVjdC54UmlnaHQ7XG4gICAgICAgICAgICB0aGlzLl95VG9wID0gbWVyZ2VSZWN0LnlUb3A7XG4gICAgICAgICAgICB0aGlzLl95Qm90ID0gbWVyZ2VSZWN0LnlCb3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIGNvbnN0IHVuZm9sZEJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgdW5mb2xkQnJpY2tzLnB1c2goLi4uYnJpY2sudW5mb2xkKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuZm9sZEJyaWNrcztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsImltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJUGRmQnJpY2sgZXh0ZW5kcyBJUmVjdCwgSVNpemUge1xuICAgIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVuZm9sZCgpOiBJUGRmQnJpY2tbXTtcbiAgICBpc1BhZ2VCcmVhazogYm9vbGVhbjtcbn1cbmV4cG9ydCBjbGFzcyBQZGZCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHVibGljIHhMZWZ0OiBudW1iZXI7XG4gICAgcHVibGljIHhSaWdodDogbnVtYmVyO1xuICAgIHB1YmxpYyB5VG9wOiBudW1iZXI7XG4gICAgcHVibGljIHlCb3Q6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTaXplIG9mIHRleHQuIFNldCAwIGZvciBhdXRvIHNpemVcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9udFNpemU6IG51bWJlcjtcbiAgICBwdWJsaWMgdGV4dENvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuVEVYVF9DT0xPUjtcbiAgICBwdWJsaWMgZm9ybUJvcmRlckNvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuRk9STV9CT1JERVJfQ09MT1I7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gISFjb250cm9sbGVyID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgOiBEb2NDb250cm9sbGVyLkZPTlRfU0laRTtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoISF0aGlzLnF1ZXN0aW9uICYmIHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSAmJiBTdXJ2ZXlIZWxwZXIuZ2V0UmVhZG9ubHlSZW5kZXJBcyhcbiAgICAgICAgICAgIDxRdWVzdGlvbj50aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpICE9PSAnYWNyb2Zvcm0nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclJlYWRPbmx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgdW5mb2xkKCk6IElQZGZCcmlja1tdIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzXTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfN19fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9XG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IGpzUERGLCBqc1BERk9wdGlvbnMgfSBmcm9tICdqc3BkZic7XG5pbXBvcnQgeyBJSFRNTFJlbmRlclR5cGUgfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG4vLyBpbXBvcnQgRm9udHMgZnJvbSAnLi9mb250cyc7XG5pbXBvcnQgc2V0UmFkaW9BcHBlYXJhbmNlIGZyb20gJy4vanNwZGZfcGx1Z2lucy9hY3JvZm9ybSc7XG5pbXBvcnQgJy4vanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qcyc7XG5pbXBvcnQgJy4vanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQb2ludCB7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB5VG9wOiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElSZWN0IGV4dGVuZHMgSVBvaW50IHtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTaXplIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJTWFyZ2luTFIge1xuICAgIGxlZnQ/OiBudW1iZXI7XG4gICAgcmlnaHQ/OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElNYXJnaW4gZXh0ZW5kcyBJTWFyZ2luTFIge1xuICAgIHRvcD86IG51bWJlcjtcbiAgICBib3Q/OiBudW1iZXI7XG59XG4vKipcbiAqIERlY2xhcmVzIGEgc2V0IG9mIG9wdGlvbnMgZm9yIGEgU3VydmV5UERGIGRvY3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEb2NPcHRpb25zIHtcbiAgICBvcmllbnRhdGlvbj86ICdwJyB8ICdsJztcbiAgICBmb3JtYXQ/OiBzdHJpbmcgfCBudW1iZXJbXTtcbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICBmb250TmFtZT86IHN0cmluZztcbiAgICBiYXNlNjROb3JtYWw/OiBzdHJpbmc7XG4gICAgYmFzZTY0Qm9sZD86IHN0cmluZztcbiAgICB1c2VDdXN0b21Gb250SW5IdG1sPzogYm9vbGVhbjtcbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcbiAgICBjb21tZXJjaWFsPzogYm9vbGVhbjtcbiAgICBoYXZlQ29tbWVyY2lhbExpY2Vuc2U/OiBib29sZWFuO1xuICAgIGh0bWxSZW5kZXJBcz86IElIVE1MUmVuZGVyVHlwZTtcbiAgICBtYXRyaXhSZW5kZXJBcz86ICdhdXRvJyB8ICdsaXN0JztcbiAgICByZWFkb25seVJlbmRlckFzPzogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJztcbiAgICB0ZXh0RmllbGRSZW5kZXJBcz86ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnO1xuICAgIGNvbXByZXNzPzogYm9vbGVhbjtcbiAgICBhcHBseUltYWdlRml0PzogYm9vbGVhbjtcbn1cbi8qKlxuICogQ29udGFpbnMgYSBzZXQgb2Ygb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgYXBwZWFyYW5jZSBvZiBhIFBERiBkb2N1bWVudCByZW5kZXJlZCBieSBTdXJ2ZXlQREYuXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NPcHRpb25zIGltcGxlbWVudHMgSURvY09wdGlvbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU1fVE9fUFQgPSA3MiAvIDI1LjQ7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkUgPSAxNDtcbiAgICBwcm90ZWN0ZWQgX29yaWVudGF0aW9uOiAnbCcgfCAncCc7XG4gICAgcHJvdGVjdGVkIF9mb3JtYXQ6IHN0cmluZyB8IG51bWJlcltdO1xuICAgIHByb3RlY3RlZCBfZm9udFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2ZvbnROYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTRUdPRV9OT1JNQUw6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIFNFR09FX0JPTEQ6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2Jhc2U2NE5vcm1hbDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYmFzZTY0Qm9sZDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfdXNlQ3VzdG9tRm9udEluSHRtbDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX21hcmdpbnM6IElNYXJnaW47XG4gICAgcHJvdGVjdGVkIF9odG1sUmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZTtcbiAgICBwcm90ZWN0ZWQgX21hdHJpeFJlbmRlckFzOiAnYXV0bycgfCAnbGlzdCc7XG4gICAgcHJvdGVjdGVkIF9yZWFkb25seVJlbmRlckFzOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuICAgIHByb3RlY3RlZCBfdGV4dEZpZWxkUmVuZGVyQXM6ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnO1xuICAgIHByb3RlY3RlZCBfY29tcHJlc3M6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9hcHBseUltYWdlRml0OiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRG9jT3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub3JpZW50YXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0WzBdIDwgb3B0aW9ucy5mb3JtYXRbMV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9ICdwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgdGhpcy5fb3JpZW50YXRpb24gPSAnbCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB0aGlzLl9vcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICdhNCc7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX2Zvcm1hdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdCA9IHRoaXMuX2Zvcm1hdC5tYXAoZiA9PiBmICogRG9jT3B0aW9ucy5NTV9UT19QVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBvcHRpb25zLmZvbnRTaXplIHx8IERvY09wdGlvbnMuRk9OVF9TSVpFO1xuICAgICAgICB0aGlzLl9mb250TmFtZSA9IG9wdGlvbnMuZm9udE5hbWUgfHwgJ3NlZ29lJztcbiAgICAgICAgaWYgKCh0eXBlb2Ygb3B0aW9ucy5mb250TmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5iYXNlNjROb3JtYWwgIT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmFzZTY0Qm9sZCAhPT0gJ3VuZGVmaW5lZCcpKSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Tm9ybWFsID0gb3B0aW9ucy5iYXNlNjROb3JtYWwgfHwgb3B0aW9ucy5iYXNlNjRCb2xkO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IG9wdGlvbnMuYmFzZTY0Qm9sZCB8fCBvcHRpb25zLmJhc2U2NE5vcm1hbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZvbnROYW1lID09PSAnc2Vnb2UnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjROb3JtYWwgPSBGb250cy5TRUdPRV9OT1JNQUw7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjRCb2xkID0gRm9udHMuU0VHT0VfQk9MRDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IERvY09wdGlvbnMuU0VHT0VfTk9STUFMO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IERvY09wdGlvbnMuU0VHT0VfQk9MRDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91c2VDdXN0b21Gb250SW5IdG1sID0gb3B0aW9ucy51c2VDdXN0b21Gb250SW5IdG1sICYmIHR5cGVvZiBvcHRpb25zLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIHRoaXMuX21hcmdpbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUob3B0aW9ucy5tYXJnaW5zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy50b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLnRvcCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLmJvdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMuYm90ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMubGVmdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMubGVmdCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLnJpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5yaWdodCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fbWFyZ2lucykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAoPGFueT50aGlzLl9tYXJnaW5zKVtuYW1lXSA9ICg8YW55PnRoaXMuX21hcmdpbnMpW25hbWVdICogRG9jT3B0aW9ucy5NTV9UT19QVDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2h0bWxSZW5kZXJBcyA9IG9wdGlvbnMuaHRtbFJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fbWF0cml4UmVuZGVyQXMgPSBvcHRpb25zLm1hdHJpeFJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fcmVhZG9ubHlSZW5kZXJBcyA9IG9wdGlvbnMucmVhZG9ubHlSZW5kZXJBcyB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX3RleHRGaWVsZFJlbmRlckFzID0gb3B0aW9ucy50ZXh0RmllbGRSZW5kZXJBcyB8fCAnc2luZ2xlTGluZSc7XG4gICAgICAgIHRoaXMuX2NvbXByZXNzID0gb3B0aW9ucy5jb21wcmVzcyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5fYXBwbHlJbWFnZUZpdCA9IG9wdGlvbnMuYXBwbHlJbWFnZUZpdCB8fCBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBsZWZ0VG9wUG9pbnQoKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiB0aGlzLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlUb3A6IHRoaXMubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NE5vcm1hbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZTY0Tm9ybWFsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NEJvbGQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2U2NEJvbGQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlQ3VzdG9tRm9udEluSHRtbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWFyZ2lucygpOiBJTWFyZ2luIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmdpbnM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9ybWF0KCk6IHN0cmluZyB8IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBvcmllbnRhdGlvbigpOiAnbCcgfCAncCcge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaHRtbFJlbmRlckFzKCk6IElIVE1MUmVuZGVyVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9odG1sUmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWF0cml4UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ2xpc3QnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hdHJpeFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlYWRvbmx5UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkb25seVJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHRleHRGaWVsZFJlbmRlckFzKCk6ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHRGaWVsZFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvbXByZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYXBwbHlJbWFnZUZpdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5SW1hZ2VGaXQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9jQ29udHJvbGxlciBleHRlbmRzIERvY09wdGlvbnMge1xuICAgIHByaXZhdGUgX2RvYzoganNQREY7XG4gICAgcHJpdmF0ZSBfaGVscGVyRG9jOiBqc1BERjtcbiAgICBwcml2YXRlIF9mb250U3R5bGU6IHN0cmluZztcbiAgICBwcml2YXRlIG1hcmdpbnNTdGFjazogSU1hcmdpbkxSW107XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEb2NPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGpzcGRmT3B0aW9uczoganNQREZPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZW50YXRpb246IHRoaXMub3JpZW50YXRpb24sXG4gICAgICAgICAgICB1bml0OiAncHQnLCBmb3JtYXQ6IHRoaXMuZm9ybWF0LCBjb21wcmVzczogdGhpcy5jb21wcmVzc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCcgJiYgIVN1cnZleUhlbHBlci5pc0ZvbnRFeGlzdCh0aGlzLCB0aGlzLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5hZGRGb250KHRoaXMuZm9udE5hbWUsIHRoaXMuYmFzZTY0Tm9ybWFsLCAnbm9ybWFsJyk7XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmFkZEZvbnQodGhpcy5mb250TmFtZSwgdGhpcy5iYXNlNjRCb2xkLCAnYm9sZCcpO1xuICAgICAgICAgICAgdGhpcy5fZG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmFkaW9BcHBlYXJhbmNlKHRoaXMuX2RvYyk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYyA9IG5ldyBqc1BERihqc3BkZk9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5mb250TmFtZSk7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250U2l6ZSh0aGlzLmZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKHRoaXMuZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgdGhpcy5tYXJnaW5zU3RhY2sgPSBbXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjdXN0b21Gb250czogeyBbbmFtZTogc3RyaW5nXTogeyBub3JtYWw6IHN0cmluZywgYm9sZDogc3RyaW5nLCBpdGFsaWM6IHN0cmluZywgYm9sZGl0YWxpYzogc3RyaW5nIH0gfSA9IHt9O1xuICAgIHB1YmxpYyBzdGF0aWMgYWRkRm9udChmb250TmFtZTogc3RyaW5nLCBiYXNlNjQ6IHN0cmluZywgZm9udFN0eWxlOiAnbm9ybWFsJyB8ICdib2xkJyB8ICdpdGFsaWMnIHwgJ2JvbGRpdGFsaWMnKSB7XG4gICAgICAgIGxldCBmb250ID0gRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV07XG4gICAgICAgIGlmICghZm9udCkge1xuICAgICAgICAgICAgZm9udCA9IDxhbnk+e307XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXSA9IGZvbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9udFtmb250U3R5bGVdID0gYmFzZTY0O1xuICAgICAgICBjb25zdCBhZGRGb250Q2FsbGJhY2s6ICgpID0+IHZvaWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Gb250ID0gRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV07XG4gICAgICAgICAgICBpZiAoISFjdXN0b21Gb250ICYmICEhY3VzdG9tRm9udFtmb250U3R5bGVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9udEZpbGU6IHN0cmluZyA9IGAke2ZvbnROYW1lfS0ke2ZvbnRTdHlsZX0udHRmYDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbGVUb1ZGUyhmb250RmlsZSwgY3VzdG9tRm9udFtmb250U3R5bGVdKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZvbnQoZm9udEZpbGUsIGZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAoPGFueT5qc1BERikuQVBJLmV2ZW50cy5wdXNoKFsnYWRkRm9udHMnLCBhZGRGb250Q2FsbGJhY2tdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBkb2MoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvYztcbiAgICB9XG4gICAgcHVibGljIGdldCBoZWxwZXJEb2MoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlbHBlckRvYztcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udE5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udE5hbWUoZm9udE5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9mb250TmFtZSA9IGZvbnROYW1lO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udChmb250TmFtZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KGZvbnROYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udFNpemUoZm9udFNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9mb250U2l6ZSA9IGZvbnRTaXplO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTdHlsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFN0eWxlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGZvbnRTdHlsZShmb250U3R5bGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9mb250U3R5bGUgPSBmb250U3R5bGU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICB9XG4gICAgcHVibGljIG1lYXN1cmVUZXh0KHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nIHwgbnVtYmVyID0gMSwgZm9udFN0eWxlOiBzdHJpbmcgPSB0aGlzLl9mb250U3R5bGUsXG4gICAgICAgIGZvbnRTaXplOiBudW1iZXIgPSB0aGlzLl9mb250U2l6ZSk6IElTaXplIHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuX2hlbHBlckRvYy5nZXRGb250U2l6ZSgpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLl9oZWxwZXJEb2MuZ2V0TGluZUhlaWdodCgpIC8gdGhpcy5faGVscGVyRG9jLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IDAuMDtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGV4dCA9IHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/IHRleHQgOiBTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRleHQpO1xuICAgICAgICAgICAgd2lkdGggPSB0ZXh0LnNwbGl0KCcnKS5yZWR1Y2UoKHNtOiBudW1iZXIsIGNyOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgc20gKyB0aGlzLl9oZWxwZXJEb2MuZ2V0VGV4dFdpZHRoKGNyKSwgMC4wKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUob2xkRm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgJ25vcm1hbCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGdldCB1bml0V2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIGdldCB1bml0SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lYXN1cmVUZXh0KCkuaGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgcHVzaE1hcmdpbnMobGVmdD86IG51bWJlciwgcmlnaHQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJnaW5zU3RhY2sucHVzaCh7IGxlZnQ6IHRoaXMubWFyZ2lucy5sZWZ0LCByaWdodDogdGhpcy5tYXJnaW5zLnJpZ2h0IH0pO1xuICAgICAgICBpZiAodHlwZW9mIGxlZnQgIT09ICd1bmRlZmluZWQnKSB0aGlzLm1hcmdpbnMubGVmdCA9IGxlZnQ7XG4gICAgICAgIGlmICh0eXBlb2YgcmlnaHQgIT09ICd1bmRlZmluZWQnKSB0aGlzLm1hcmdpbnMucmlnaHQgPSByaWdodDtcbiAgICB9XG4gICAgcHVibGljIHBvcE1hcmdpbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hcmdpbnM6IElNYXJnaW5MUiA9IHRoaXMubWFyZ2luc1N0YWNrLnBvcCgpO1xuICAgICAgICB0aGlzLm1hcmdpbnMubGVmdCA9IG1hcmdpbnMubGVmdDtcbiAgICAgICAgdGhpcy5tYXJnaW5zLnJpZ2h0ID0gbWFyZ2lucy5yaWdodDtcbiAgICB9XG4gICAgcHVibGljIGdldCBwYXBlcldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIGdldCBwYXBlckhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0TnVtYmVyT2ZQYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuICAgIH1cbiAgICBwdWJsaWMgYWRkUGFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kb2MuYWRkUGFnZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0UGFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLnNldFBhZ2UoaW5kZXggKyAxKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZG9jX2NvbnRyb2xsZXIudHMiLCJpbXBvcnQgeyBJRWxlbWVudCwgUXVlc3Rpb24sIFBhbmVsTW9kZWxCYXNlLCBQYW5lbE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBBZG9ybmVyc1BhbmVsT3B0aW9ucywgQWRvcm5lcnNQYWdlT3B0aW9ucyB9IGZyb20gJy4uL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5pbXBvcnQgKiBhcyBTdXJ2ZXlQREZNb2R1bGUgZnJvbSAnLi4vZW50cmllcy9wZGYnO1xuXG5leHBvcnQgY2xhc3MgRmxhdFN1cnZleSB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBRVUVTX0dBUF9WRVJUX1NDQUxFOiBudW1iZXIgPSAxLjU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBQQU5FTF9DT05UX0dBUF9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEFORUxfREVTQ19HQVBfU0NBTEU6IG51bWJlciA9IDAuMjU7XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRzUGFuZWwoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBhbmVsOiBQYW5lbE1vZGVsLCBwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBwYW5lbEZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBwYW5lbENvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHBhbmVsLmlubmVySW5kZW50KS53aWR0aDtcbiAgICAgICAgcGFuZWxDb250ZW50UG9pbnQueExlZnQgKz0gY29udHJvbGxlci5tZWFzdXJlVGV4dChwYW5lbC5pbm5lckluZGVudCkud2lkdGg7XG4gICAgICAgIHBhbmVsRmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoc3VydmV5LFxuICAgICAgICAgICAgY29udHJvbGxlciwgcGFuZWwsIHBhbmVsQ29udGVudFBvaW50KSk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzUGFuZWxPcHRpb25zID0gbmV3IEFkb3JuZXJzUGFuZWxPcHRpb25zKHBvaW50LFxuICAgICAgICAgICAgcGFuZWxGbGF0cywgcGFuZWwsIGNvbnRyb2xsZXIsIEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCksIFN1cnZleVBERk1vZHVsZSk7XG4gICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclBhbmVsLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICByZXR1cm4gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRzUGFnZVBhbmVsKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwYWdlUGFuZWw6IFBhbmVsTW9kZWxCYXNlLCBwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZiAoIXBhZ2VQYW5lbC5pc1Zpc2libGUpIHJldHVybjtcbiAgICAgICAgcGFnZVBhbmVsLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICAgICAgY29uc3QgcGFnZVBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmIChwYWdlUGFuZWwuZ2V0VHlwZSgpICE9PSAncGFnZScgfHwgc3VydmV5LnNob3dQYWdlVGl0bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbC50aXRsZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYWdlUGFuZWwgaW5zdGFuY2VvZiBQYW5lbE1vZGVsICYmIHBhZ2VQYW5lbC5ubykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUaXRsZVBhbmVsRmxhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgY29udHJvbGxlciwgcGFnZVBhbmVsLm5vLCBwYWdlUGFuZWwuZ2V0VHlwZSgpID09PSAncGFnZScpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKG5vRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IG5vRmxhdC54UmlnaHQgKyBjb250cm9sbGVyLm1lYXN1cmVUZXh0KCcgJykud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VsUGFuZWxUaXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUaXRsZVBhbmVsRmxhdChcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBjb250cm9sbGVyLCBwYWdlUGFuZWwubG9jVGl0bGUsIHBhZ2VQYW5lbC5nZXRUeXBlKCkgPT09ICdwYWdlJyk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhwYWdlbFBhbmVsVGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocGFnZWxQYW5lbFRpdGxlRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFnZVBhbmVsLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbC50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRTdXJ2ZXkuUEFORUxfREVTQ19HQVBfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VQYW5lbERlc2NGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgbnVsbCwgY29udHJvbGxlciwgcGFnZVBhbmVsLmxvY0Rlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHBhZ2VQYW5lbERlc2NGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocGFnZVBhbmVsRGVzY0ZsYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGVGbGF0LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dMaW5lUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChyb3dMaW5lUG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUEFORUxfQ09OVF9HQVBfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBwYWdlUGFuZWwucm93cykge1xuICAgICAgICAgICAgaWYgKCFyb3cudmlzaWJsZSkgY29udGludWU7XG4gICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKTtcbiAgICAgICAgICAgIGxldCBuZXh0TWFyZ2luTGVmdDogbnVtYmVyID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCByb3dGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3cudmlzaWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IElFbGVtZW50ID0gcm93LnZpc2libGVFbGVtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJzV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGVsZW1lbnQucmVuZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKHJvdy52aXNpYmxlRWxlbWVudHMubGVuZ3RoIC0gMSkgKiBjb250cm9sbGVyLnVuaXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgcm93LnZpc2libGVFbGVtZW50cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gbmV4dE1hcmdpbkxlZnQgKyAoKGkgIT09IDApID8gY29udHJvbGxlci51bml0V2lkdGggOiAwKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIHBlcnNXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBuZXh0TWFyZ2luTGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgcGVyc1dpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFuZWxNb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBlbGVtZW50LCBjdXJyUG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0ZsYXRzLnB1c2goLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhzdXJ2ZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCA8UXVlc3Rpb24+ZWxlbWVudCwgY3VyclBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGlmIChyb3dGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnJvd0ZsYXRzKS55Qm90O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUVVFU19HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKC4uLnJvd0ZsYXRzKTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZVBhbmVsRmxhdHM7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHBvcFJvd2xpbmVzKGZsYXRzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB3aGlsZSAoZmxhdHMubGVuZ3RoID4gMCAmJiBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIFJvd2xpbmVCcmljaykge1xuICAgICAgICAgICAgZmxhdHMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0VGl0bGUoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChzdXJ2ZXkuc2hvd1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VydmV5VGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KFxuICAgICAgICAgICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgc3VydmV5LmxvY1RpdGxlKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHN1cnZleVRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgcG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoc3VydmV5VGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdXJ2ZXkuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0U3VydmV5LlBBTkVMX0RFU0NfR0FQX1NDQUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHN1cnZleS5sb2NEZXNjcmlwdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRMb2dvSW1hZ2Uoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIHBvaW50LCBudWxsLCBjb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHN1cnZleS5sb2NMb2dvKSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5weFRvUHQoc3VydmV5LmxvZ29XaWR0aCksIFN1cnZleUhlbHBlci5weFRvUHQoc3VydmV5LmxvZ29IZWlnaHQpKTtcbiAgICAgICAgbGV0IHNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgc2hpZnQgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gbG9nb0ZsYXQud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBzaGlmdCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcikgLyAyLjAgLSBsb2dvRmxhdC53aWR0aCAvIDIuMDtcbiAgICAgICAgfVxuICAgICAgICBsb2dvRmxhdC54TGVmdCArPSBzaGlmdDtcbiAgICAgICAgbG9nb0ZsYXQueFJpZ2h0ICs9IHNoaWZ0O1xuICAgICAgICByZXR1cm4gbG9nb0ZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0cyhzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8SVBkZkJyaWNrW11bXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBpZiAoIXN1cnZleS5oYXNMb2dvKSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzLnB1c2goW3RpdGxlRmxhdF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1cnZleS5pc0xvZ29CZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQobG9nb0ZsYXQsXG4gICAgICAgICAgICAgICAgc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3RvcCcsIHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKTtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJykge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGxvZ29GbGF0LndpZHRoICsgY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgdGl0bGVQb2ludCk7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHNbMF0ucHVzaCh0aXRsZUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBsb2dvRmxhdC53aWR0aCArIGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0c1swXS51bnNoaWZ0KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgbGV0IGxvZ29Qb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKFt0aXRsZUZsYXRdKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nb1BvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ29Qb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGxvZ29Qb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkgZmxhdHNbMF0ucHVzaChsb2dvRmxhdCk7XG4gICAgICAgICAgICAgICAgZWxzZSBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uZmxhdHNbMF0pKS55VG9wO1xuICAgICAgICAgICAgZmxhdHNbMF0ucHVzaChTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdXJ2ZXkudmlzaWJsZVBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcGFnZUZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICAgICAgcGFnZUZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUGFnZVBhbmVsKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgc3VydmV5LnZpc2libGVQYWdlc1tpXSwgcG9pbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNQYWdlT3B0aW9ucyA9IG5ldyBBZG9ybmVyc1BhZ2VPcHRpb25zKHBvaW50LFxuICAgICAgICAgICAgICAgIHBhZ2VGbGF0cywgc3VydmV5LnZpc2libGVQYWdlc1tpXSwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclBhZ2UuZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgICAgICBwYWdlRmxhdHMgPSBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGF0c1swXS5wdXNoKC4uLnBhZ2VGbGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGZsYXRzLnB1c2gocGFnZUZsYXRzKTtcbiAgICAgICAgICAgIHRoaXMucG9wUm93bGluZXMoZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgcG9pbnQueVRvcCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50LnlUb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBDaGVja0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDAuNztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MOiBzdHJpbmcgPSAnMyc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ6IHN0cmluZyA9ICd6YXBmZGluZ2JhdHMnO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4wIC0gTWF0aC5FIC8gMTAuMDtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5OiBib29sZWFuLCBwcm90ZWN0ZWQgY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveE1vZGVsPnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVuZGVyUmVhZE9ubHkoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGVja0JveDogYW55ID0gbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1DaGVja0JveCkoKTtcbiAgICAgICAgY29uc3QgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGNoZWNrQm94Lm1heEZvbnRTaXplID0gdGhpcy5oZWlnaHQgKiBmb3JtU2NhbGUgKiBDaGVja0l0ZW1Ccmljay5GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGNoZWNrQm94LmNhcHRpb24gPSBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MO1xuICAgICAgICBjaGVja0JveC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgY2hlY2tCb3guZmllbGROYW1lID0gdGhpcy5maWVsZE5hbWU7XG4gICAgICAgIGNoZWNrQm94LnJlYWRPbmx5ID0gdGhpcy5yZWFkb25seTtcbiAgICAgICAgY2hlY2tCb3guY29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICAgICAgY2hlY2tCb3gudmFsdWUgPSB0aGlzLmNoZWNrZWQgPyAnT24nIDogZmFsc2U7XG4gICAgICAgIGNoZWNrQm94LkFTID0gdGhpcy5jaGVja2VkID8gJy9PbicgOiAnL09mZic7XG4gICAgICAgIGNoZWNrQm94LlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChjaGVja0JveCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRoaXMsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgY29uc3Qgb2xkRm9udE5hbWU6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250TmFtZSA9IENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UO1xuICAgICAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICpcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrU2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX1NZTUJPTCk7XG4gICAgICAgICAgICBjaGVja21hcmtQb2ludC54TGVmdCArPSB0aGlzLndpZHRoIC8gMi4wIC0gY2hlY2ttYXJrU2l6ZS53aWR0aCAvIDIuMDtcbiAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LnlUb3AgKz0gdGhpcy5oZWlnaHQgLyAyLjAgLSBjaGVja21hcmtTaXplLmhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgICAgICBjaGVja21hcmtQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0wsIFRleHRCcmljayk7XG4gICAgICAgICAgICAoPGFueT5jaGVja21hcmtGbGF0LnVuZm9sZCgpWzBdKS50ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICAgICAgYXdhaXQgY2hlY2ttYXJrRmxhdC5yZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250TmFtZSA9IG9sZEZvbnROYW1lO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFJhZGlvR3JvdXBXcmFwLCBSYWRpb0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbSc7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYWRpb2dyb3VwIGV4dGVuZHMgRmxhdFNlbGVjdEJhc2Uge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw7XG4gICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBnZW5lcmF0ZUZsYXRJdGVtKHJlY3Q6IElSZWN0LCBpdGVtOiBJdGVtVmFsdWUsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGtleT86IHN0cmluZywgY2hlY2tlZD86IGJvb2xlYW4pOiBJUGRmQnJpY2sge1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAgPSBuZXcgUmFkaW9Hcm91cFdyYXAodGhpcy5xdWVzdGlvbi5pZCArICgodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpID8gJycgOiBrZXkpLFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5KTtcbiAgICAgICAgICAgICg8YW55PnRoaXMucXVlc3Rpb24pLnBkZlJhZGlvR3JvdXBXcmFwID0gdGhpcy5yYWRpb0dyb3VwV3JhcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy5yYWRpb0dyb3VwV3JhcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAgPSAoPGFueT50aGlzLnF1ZXN0aW9uKS5wZGZSYWRpb0dyb3VwV3JhcDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0NoZWNrZWQ6IGJvb2xlYW4gPSAodHlwZW9mIGNoZWNrZWQgPT09ICd1bmRlZmluZWQnKSA/XG4gICAgICAgICAgICAoaXRlbSA9PT0gdGhpcy5xdWVzdGlvbi5vdGhlckl0ZW0gPyB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCA6XG4gICAgICAgICAgICAgICAgKGl0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24udmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZChpdGVtKSkpKSA6IGNoZWNrZWQ7XG4gICAgICAgIHJldHVybiBuZXcgUmFkaW9JdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgaW5kZXgsIGlzQ2hlY2tlZCwgdGhpcy5yYWRpb0dyb3VwV3JhcCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYWRpb2dyb3VwJywgRmxhdFJhZGlvZ3JvdXApO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignYnV0dG9uZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmFkaW9ncm91cC50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0Qm9sZEJyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJleHBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuZXhwb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5leHBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgSU1hcmdpbkxSLCBJTWFyZ2luLCBJRG9jT3B0aW9ucywgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmV4cG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmV4cG9ydCB7IElGbGF0UXVlc3Rpb24sIEZsYXRRdWVzdGlvbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuZXhwb3J0IHsgRmxhdEJvb2xlYW4gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4nO1xuZXhwb3J0IHsgRmxhdENoZWNrYm94IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveCc7XG5leHBvcnQgeyBGbGF0Q3VzdG9tTW9kZWwgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbCc7XG5leHBvcnQgeyBGbGF0Q29tbWVudCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudCc7XG5leHBvcnQgeyBGbGF0RHJvcGRvd24gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duJztcbmV4cG9ydCB7IEZsYXRFeHByZXNzaW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uJztcbmV4cG9ydCB7IEZsYXRGaWxlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9maWxlJztcbmV4cG9ydCB7IEZsYXRIVE1MIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmV4cG9ydCB7IEZsYXRJbWFnZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UnO1xuZXhwb3J0IHsgRmxhdEltYWdlUGlja2VyIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlcic7XG5leHBvcnQgeyBGbGF0UGFuZWxEeW5hbWljIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9wYW5lbGR5bmFtaWMnO1xuZXhwb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhZGlvZ3JvdXAnO1xuZXhwb3J0IHsgRmxhdFJhbmtpbmcgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcnO1xuZXhwb3J0IHsgRmxhdFJhdGluZyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nJztcbmV4cG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zZWxlY3RiYXNlJztcbmV4cG9ydCB7IEZsYXRTaWduYXR1cmVQYWQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZCc7XG5leHBvcnQgeyBGbGF0VGV4dGJveCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfdGV4dGJveCc7XG5leHBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuZXhwb3J0IHsgRmxhdE1hdHJpeCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4JztcbmV4cG9ydCB7IEZsYXRNYXRyaXhNdWx0aXBsZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuZXhwb3J0IHsgRmxhdE1hdHJpeER5bmFtaWMgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeGR5bmFtaWMnO1xuZXhwb3J0IHsgRmxhdE11bHRpcGxlVGV4dCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbXVsdGlwbGV0ZXh0JztcbmV4cG9ydCB7IFBhZ2VQYWNrZXIgfSBmcm9tICcuLi9wYWdlX2xheW91dC9wYWdlX3BhY2tlcic7XG5leHBvcnQgeyBFdmVudEhhbmRsZXIgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXInO1xuZXhwb3J0IHsgSG9yaXpvbnRhbEFsaWduLCBWZXJ0aWNhbEFsaWduLCBJRHJhd1JlY3RPcHRpb25zLCBJRHJhd1RleHRPcHRpb25zLCBJRHJhd0ltYWdlT3B0aW9ucywgRHJhd0NhbnZhcyB9IGZyb20gJy4uL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMnO1xuZXhwb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmV4cG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5leHBvcnQgeyBDaGVja2JveEl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbSc7XG5leHBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbSc7XG5leHBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21tZW50JztcbmV4cG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmV4cG9ydCB7IEN1c3RvbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY3VzdG9tJztcbmV4cG9ydCB7IERyb3Bkb3duQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bic7XG5leHBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuZXhwb3J0IHsgSFRNTEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5leHBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfaW1hZ2UnO1xuZXhwb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfbGluayc7XG5leHBvcnQgeyBSYWRpb0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbSc7XG5leHBvcnQgeyBSYW5raW5nSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0nO1xuZXhwb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5leHBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZCc7XG5leHBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuZXhwb3J0IHsgVGV4dEJveEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJveCc7XG5leHBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmV4cG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwnO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL3BkZi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGbGF0U2VsZWN0QmFzZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94QmFzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94QmFzZT5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFic3RyYWN0IGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IElQZGZCcmljaztcbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSxcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0KSwgaXRlbSwgaW5kZXgpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgaWYgKGl0ZW0ubG9jVGV4dC5yZW5kZXJlZEh0bWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtID09PSB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbSAmJiAoaXRlbS52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgKHR5cGVvZiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQpKSkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5ULCBmYWxzZSwgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCBjb2xDb3VudDogbnVtYmVyID0gdGhpcy5xdWVzdGlvbi5jb2xDb3VudDtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uY29sQ291bnQgPT0gMCkge1xuICAgICAgICAgICAgY29sQ291bnQgPSBNYXRoLmZsb29yKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKVxuICAgICAgICAgICAgICAgIC8gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aCkgfHwgMTtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aCA8IGNvbENvdW50KSB7XG4gICAgICAgICAgICAgICAgY29sQ291bnQgPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnF1ZXN0aW9uLmNvbENvdW50ID4gMSkge1xuICAgICAgICAgICAgY29sQ291bnQgPSAoU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5jb2xDb3VudCkgPFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGgpID8gMSA6IHRoaXMucXVlc3Rpb24uY29sQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChjb2xDb3VudCA9PSAxKSA/IGF3YWl0IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMpIDpcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludCwgY29sQ291bnQpO1xuXG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludDogSVBvaW50LCBpdGVtVmFsdWVzOiBJdGVtVmFsdWVbXSk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGl0ZW1WYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShjdXJyUG9pbnQsIGl0ZW1WYWx1ZXNbaV0sIGkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90ICsgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goaXRlbUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQ6IElQb2ludCwgY29sQ291bnQ6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IHJvdzogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LCB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBpICUgY29sQ291bnQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaV0sIGkpO1xuICAgICAgICAgICAgcm93LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBpZiAoaSAlIGNvbENvdW50ID09PSBjb2xDb3VudCAtIDEgfHwgaSA9PT0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93TGluZUZsYXQ6IElQZGZCcmljayA9IFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHJvdyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dMaW5lRmxhdC55Qm90ICtcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKHJvdywgcm93TGluZUZsYXQpO1xuICAgICAgICAgICAgICAgIHJvdyA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zZWxlY3RiYXNlLnRzIiwiaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBSb3dsaW5lQnJpY2sgaW1wbGVtZW50cyBJUGRmQnJpY2sge1xuICAgIHhMZWZ0OiBudW1iZXI7XG4gICAgeFJpZ2h0OiBudW1iZXI7XG4gICAgeVRvcDogbnVtYmVyO1xuICAgIHlCb3Q6IG51bWJlcjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgY29sb3I6IHN0cmluZykge1xuICAgICAgICB0aGlzLnhMZWZ0ID0gcmVjdC54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZWN0LnhSaWdodDtcbiAgICAgICAgdGhpcy55VG9wID0gcmVjdC55VG9wO1xuICAgICAgICB0aGlzLnlCb3QgPSByZWN0LnlCb3Q7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueUJvdCAtIHRoaXMueVRvcDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29sb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBvbGREcmF3Q29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0RHJhd0NvbG9yKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcih0aGlzLmNvbG9yKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MubGluZSh0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsIHRoaXMueFJpZ2h0LCB0aGlzLnlUb3ApO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3Iob2xkRHJhd0NvbG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdW5mb2xkKCk6IElQZGZCcmlja1tdIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzXTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsLCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0ZmllbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0Qm94QnJpY2sgZXh0ZW5kcyBUZXh0RmllbGRCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgaXNRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIHByb3RlY3RlZCBpc011bHRpbGluZTogYm9vbGVhbiA9IGZhbHNlLCBpbmRleDogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaXNRdWVzdGlvbixcbiAgICAgICAgICAgICg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmlkICsgKGlzUXVlc3Rpb24gPyAnJyA6ICdfY29tbWVudCcgKyBpbmRleCksXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZSg8UXVlc3Rpb24+cXVlc3Rpb24sIGlzUXVlc3Rpb24pLFxuICAgICAgICAgICAgaXNRdWVzdGlvbiA/IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikubG9jUGxhY2VIb2xkZXIpIDogJycsXG4gICAgICAgICAgICBxdWVzdGlvbi5pc1JlYWRPbmx5LCBpc011bHRpbGluZSxcbiAgICAgICAgICAgICg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmlucHV0VHlwZSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym94LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRleHRGaWVsZEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgaXNRdWVzdGlvbjogYm9vbGVhbixcbiAgICAgICAgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYWNlaG9sZGVyOiBzdHJpbmcsIHByb3RlY3RlZCBpc1JlYWRPbmx5OiBib29sZWFuLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW4sIHByb3RlY3RlZCBpbnB1dFR5cGU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgcmVuZGVyQ29sb3JRdWVzdGlvbigpOiB2b2lkIHtcbiAgICAgICAgbGV0IG9sZEZpbGxDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGaWxsQ29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3IodGhpcy5xdWVzdGlvbi52YWx1ZSB8fCAnYmxhY2snKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5yZWN0KHRoaXMueExlZnQsIHRoaXMueVRvcCxcbiAgICAgICAgICAgIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAnRicpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcihvbGRGaWxsQ29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb2xvclF1ZXN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXRGaWVsZDogYW55ID0gdGhpcy5pbnB1dFR5cGUgPT09ICdwYXNzd29yZCcgP1xuICAgICAgICAgICAgbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1QYXNzd29yZEZpZWxkKSgpIDpcbiAgICAgICAgICAgIG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtVGV4dEZpZWxkKSgpO1xuICAgICAgICBpbnB1dEZpZWxkLmZpZWxkTmFtZSA9IHRoaXMuZmllbGROYW1lO1xuICAgICAgICBpbnB1dEZpZWxkLmZvbnROYW1lID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICBpbnB1dEZpZWxkLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgaW5wdXRGaWVsZC5pc1VuaWNvZGUgPSBTdXJ2ZXlIZWxwZXIuaXNDdXN0b21Gb250KFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBpbnB1dEZpZWxkLmZvbnROYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlICE9PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLlYgPSAnICcgKyB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgaW5wdXRGaWVsZC5EViA9ICcgJyArIHRoaXMucGxhY2Vob2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpbnB1dEZpZWxkLnZhbHVlID0gJyc7XG4gICAgICAgIGlucHV0RmllbGQubXVsdGlsaW5lID0gdGhpcy5pc011bHRpbGluZTtcbiAgICAgICAgaW5wdXRGaWVsZC5yZWFkT25seSA9IHRoaXMuaXNSZWFkT25seTtcbiAgICAgICAgaW5wdXRGaWVsZC5jb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICBsZXQgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlucHV0RmllbGQubWF4Rm9udFNpemUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgKiBmb3JtU2NhbGU7XG4gICAgICAgIGlucHV0RmllbGQuUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGlucHV0RmllbGQpO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy54TGVmdCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy54UmlnaHQpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sb3JRdWVzdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLnJlbmRlclJlYWRPbmx5VGV4dEZpZWxkKHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRRdWVzdGlvbk9yQ29tbWVudERpc3BsYXlWYWx1ZSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmlzUXVlc3Rpb24pLFxuICAgICAgICAgICAgICAgICF0aGlzLmlzTXVsdGlsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGZpZWxkLnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzE4X187XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwianNwZGZcIixcImNvbW1vbmpzMlwiOlwianNwZGZcIixcImNvbW1vbmpzXCI6XCJqc3BkZlwiLFwiYW1kXCI6XCJqc3BkZlwifVxuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgSVJlY3QsIElNYXJnaW4sIElTaXplLCBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG4vKipcbiAqIEhvcml6b250YWwgYWxpZ25tZW50IHR5cGVzIGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGVudW0gSG9yaXpvbnRhbEFsaWduIHtcbiAgICBOb3RTZXQgPSAnbm90c2V0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICAgIFJpZ2h0ID0gJ3JpZ2h0J1xufVxuLyoqXG4gKiBWZXJ0aWNhbCBhbGlnbm1lbnQgdHlwZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgZW51bSBWZXJ0aWNhbEFsaWduIHtcbiAgICBOb3RTZXQgPSAnbm90c2V0JyxcbiAgICBUb3AgPSAndG9wJyxcbiAgICBNaWRkbGUgPSAnbWlkZGxlJyxcbiAgICBCb3R0b20gPSAnYm90dG9tJ1xufVxuLyoqXG4gKiBDb21tb24gb3B0aW9ucyBvZiByZW5kZXJpbmcgdGV4dCBhbmQgaW1hZ2VzIGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaG9yaXpvbnRhbCBhbGlnbm1lbnQgb2YgaXRlbSwgaWYgc2V0IChjZW50ZXIgYnkgZGVmYXVsdClcbiAgICAgKi9cbiAgICBob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHZlcnRpY2FsIGFsaWdubWVudCBvZiBpdGVtLCBpZiBzZXQgKG1pZGRsZSBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIHZlcnRpY2FsQWxpZ24/OiBWZXJ0aWNhbEFsaWduO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBtYXJnaW5zIGluc2lkZSB0aGUgZHJhd2luZyByZWN0YW5nbGUgKHVzZWQgaWYgYWxpZ25tZW50IHNldCwgYWxsIHplcm8gYnkgZGVmYXVsdClcbiAgICAgKi9cbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcbiAgICAvKipcbiAgICAgKiBPYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0ZXh0IHJlY3RhbmdsZSAodXNlZCBpZiBhbGlnbm1lbnQgbm90IHNldClcbiAgICAgKi9cbiAgICByZWN0PzogSVJlY3Q7XG59XG4vKipcbiAqIE9wdGlvbnMgb2YgcmVuZGVyaW5nIHRleHQgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElEcmF3VGV4dE9wdGlvbnMgZXh0ZW5kcyBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTdHJpbmcgdGhhdCB3aWxsIGJlIGRyYXduXG4gICAgICovXG4gICAgdGV4dDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBvZiB0ZXh0ICgxNCBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNldCB0cnVlIHRvIG1ha2UgdGV4dCBib2xkIChmYWxzZSBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIGlzQm9sZD86IGJvb2xlYW47XG59XG4vKipcbiAqIE9wdGlvbnMgb2YgcmVuZGVyaW5nIGltYWdlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdJbWFnZU9wdGlvbnMgZXh0ZW5kcyBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaW1hZ2Ugd2lkdGggKHVzZWQgaWYgYWxpZ25tZW50IHNldCwgY2FudmFzLnJlY3QncyB3aWR0aCBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBpbWFnZSBoZWlnaHQgKHVzZWQgaWYgYWxpZ25tZW50IHNldCwgY2FudmFzLnJlY3QncyBoZWlnaHQgYnkgZGVmYXVsdClcbiAgICAgKi9cbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3RyaW5nIHdpdGggYmFzZTY0IGVuY29kZWQgaW1hZ2VcbiAgICAgKi9cbiAgICBiYXNlNjQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEcmF3Q2FudmFzIG9iamVjdCBwYXNzZWQgdG8gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgY2xhc3MgRHJhd0NhbnZhcyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBwYWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHB1YmxpYyBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3JlY3Q6IElSZWN0LFxuICAgICAgICBwcm90ZWN0ZWQgX2NvdW50UGFnZXM6IG51bWJlcixcbiAgICAgICAgcHJvdGVjdGVkIF9wYWdlTnVtYmVyOiBudW1iZXIpIHsgfVxuICAgIC8qKlxuICAgICAqIENvdW50IG9mIHBhZ2VzIGluIHRoZSBkb2N1bWVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY291bnRQYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRQYWdlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFnZSBudW1iZXIgZnJvbSAxXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYWdlTnVtYmVyKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlTnVtYmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgcmVjdGFuZ2xlIGF2YWlsYWJsZSBmb3IgZHJhd2luZ1xuICAgICAqIEBzZWUgSVJlY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlY3QoKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVjdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhbGlnblJlY3QocmVjdE9wdGlvbnM6IElEcmF3UmVjdE9wdGlvbnMsIGl0ZW1TaXplOiBJU2l6ZSk6IElSZWN0IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucyA9IHsgbGVmdDogMC4wLCByaWdodDogMC4wLCB0b3A6IDAuMCwgYm90OiAwLjAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5yZWN0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID09PSBIb3Jpem9udGFsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID0gSG9yaXpvbnRhbEFsaWduLkNlbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSBWZXJ0aWNhbEFsaWduLk5vdFNldCkge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPSBWZXJ0aWNhbEFsaWduLk1pZGRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jbG9uZSh0aGlzLnJlY3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uTGVmdDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54UmlnaHQgPSBNYXRoLm1pbih0aGlzLnJlY3QueFJpZ2h0IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCArIGl0ZW1TaXplLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC54TGVmdCArIHRoaXMucmVjdC54UmlnaHQgLSBpdGVtU2l6ZS53aWR0aCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC54TGVmdCArIHRoaXMucmVjdC54UmlnaHQgKyBpdGVtU2l6ZS53aWR0aCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5SaWdodDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IE1hdGgubWF4KHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0IC0gaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3QueExlZnQgPSByZWN0T3B0aW9ucy5yZWN0LnhMZWZ0IHx8IHRoaXMucmVjdC54TGVmdDtcbiAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gcmVjdE9wdGlvbnMucmVjdC54UmlnaHQgfHwgdGhpcy5yZWN0LnhSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uVG9wOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1pbih0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCArIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5NaWRkbGU6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IE1hdGgubWF4KHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCAtIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1pbih0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC55VG9wICsgdGhpcy5yZWN0LnlCb3QgKyBpdGVtU2l6ZS5oZWlnaHQpIC8gMi4wKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLkJvdHRvbTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgLSBpdGVtU2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSB0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3QueVRvcCA9IHJlY3RPcHRpb25zLnJlY3QueVRvcCB8fCB0aGlzLnJlY3QueVRvcDtcbiAgICAgICAgICAgIHJlY3QueUJvdCA9IHJlY3RPcHRpb25zLnJlY3QueUJvdCB8fCB0aGlzLnJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBkcmF3IHRleHRcbiAgICAgKiBAcGFyYW0gdGV4dE9wdGlvbnMgU2V0IG9wdGlvbnMgb2YgdGhlIGRyYXduIHRleHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhd1RleHQodGV4dE9wdGlvbnM6IElEcmF3VGV4dE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGV4dE9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUodGV4dE9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRPcHRpb25zLmZvbnRTaXplID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGV4dE9wdGlvbnMuZm9udFNpemUgPSBEb2NPcHRpb25zLkZPTlRfU0laRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRleHRPcHRpb25zLmlzQm9sZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmlzQm9sZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleHRTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0ZXh0T3B0aW9ucy50ZXh0LFxuICAgICAgICAgICAgdGV4dE9wdGlvbnMuaXNCb2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsIHRleHRPcHRpb25zLmZvbnRTaXplKTtcbiAgICAgICAgY29uc3QgdGV4dFJlY3Q6IElSZWN0ID0gdGhpcy5hbGlnblJlY3QodGV4dE9wdGlvbnMsIHRleHRTaXplKTtcbiAgICAgICAgaWYgKCF0ZXh0T3B0aW9ucy5pc0JvbGQpIHtcbiAgICAgICAgICAgIHRoaXMucGFja3MucHVzaChuZXcgVGV4dEJyaWNrKG51bGwsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0ZXh0UmVjdCwgdGV4dE9wdGlvbnMudGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYWNrcy5wdXNoKG5ldyBUZXh0Qm9sZEJyaWNrKG51bGwsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0ZXh0UmVjdCwgdGV4dE9wdGlvbnMudGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgICg8UGRmQnJpY2s+dGhpcy5wYWNrc1t0aGlzLnBhY2tzLmxlbmd0aCAtIDFdKS5mb250U2l6ZSA9IHRleHRPcHRpb25zLmZvbnRTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIGRyYXcgaW1hZ2VcbiAgICAgKiBAcGFyYW0gaW1hZ2VPcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRyYXdJbWFnZShpbWFnZU9wdGlvbnM6IElEcmF3SW1hZ2VPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGltYWdlT3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZShpbWFnZU9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIGltYWdlT3B0aW9ucy53aWR0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy53aWR0aCA9IHRoaXMucmVjdC54UmlnaHQgLSB0aGlzLnJlY3QueExlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZU9wdGlvbnMuaGVpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1hZ2VPcHRpb25zLmhlaWdodCA9IHRoaXMucmVjdC55Qm90IC0gdGhpcy5yZWN0LnlUb3A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW1hZ2VTaXplOiBJU2l6ZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBpbWFnZU9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGltYWdlT3B0aW9ucy5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaW1hZ2VSZWN0OiBJUmVjdCA9IHRoaXMuYWxpZ25SZWN0KGltYWdlT3B0aW9ucywgaW1hZ2VTaXplKTtcbiAgICAgICAgdGhpcy5wYWNrcy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaW1hZ2VSZWN0LCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICAgIG51bGwsIHRoaXMuY29udHJvbGxlciwgaW1hZ2VPcHRpb25zLmJhc2U2NCxcbiAgICAgICAgICAgIGltYWdlUmVjdC54UmlnaHQgLSBpbWFnZVJlY3QueExlZnQsXG4gICAgICAgICAgICBpbWFnZVJlY3QueUJvdCAtIGltYWdlUmVjdC55VG9wKSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzLnRzIiwiaW1wb3J0IHsgRXZlbnQgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IERyYXdDYW52YXMgfSBmcm9tICcuL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRBc3luYzxUIGV4dGVuZHMgRnVuY3Rpb24sIE9wdGlvbnM+IGV4dGVuZHMgRXZlbnQ8VCwgT3B0aW9ucz4ge1xuICAgIHB1YmxpYyB1bnNoaWZ0KGZ1bmM6IFQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRnVuYyhmdW5jKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgQXJyYXk8VD4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGxiYWNrcy51bnNoaWZ0KGZ1bmMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmlyZShzZW5kZXI6IGFueSwgb3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxiYWNrc1tpXShzZW5kZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlciB7XG4gICAgcHVibGljIHN0YXRpYyBwcm9jZXNzX2hlYWRlcl9ldmVudHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHBhY2tzOiBJUGRmQnJpY2tbXVtdKTogdm9pZCB7XG4gICAgICAgIGlmICghc3VydmV5LmhhdmVDb21tZXJjaWFsTGljZW5zZSkge1xuICAgICAgICAgICAgc3VydmV5Lm9uUmVuZGVySGVhZGVyLmFkZCgoXywgY2FudmFzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1N1cnZleUpTIFBERiB8IFBsZWFzZSBwdXJjaGFzZSBhIFN1cnZleUpTIFBERiBkZXZlbG9wZXIgbGljZW5zZSB0byB1c2UgaXQgaW4geW91ciBhcHAgfCBodHRwczovL3N1cnZleWpzLmlvL0J1eScsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuZmlyZShzdXJ2ZXksIG5ldyBEcmF3Q2FudmFzKHBhY2tzW2ldLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVIZWFkZXJSZWN0KGNvbnRyb2xsZXIpLCBwYWNrcy5sZW5ndGgsIGkgKyAxKSk7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJGb290ZXIuZmlyZShzdXJ2ZXksIG5ldyBEcmF3Q2FudmFzKHBhY2tzW2ldLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXIpLCBwYWNrcy5sZW5ndGgsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsImltcG9ydCB7XG4gICAgSVF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSxcbiAgICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIFNlcmlhbGl6ZXIsIFBhbmVsTW9kZWxcbn0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4TXVsdGlwbGUgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC41O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLCBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aXBsZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZT5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ2VsbChwb2ludDogSVBvaW50LCBjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLFxuICAgICAgICBpc0hlYWRlcjogYm9vbGVhbik6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBpZiAoY2VsbC5oYXNRdWVzdGlvbikge1xuICAgICAgICAgICAgaWYgKGNlbGwuY2VsbC5jb2x1bW4uaXNTaG93SW5NdWx0aXBsZUNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGF0TXVsdGlwbGVDb2x1bW5zUXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGNlbGwucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5tb3ZlUmVjdChTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBwb2ludC54TGVmdCk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKCg8RmxhdFNlbGVjdEJhc2U+ZmxhdE11bHRpcGxlQ29sdW1uc1F1ZXN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY2VsbC5pdGVtLCBjZWxsLmNob2ljZUluZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjZWxsLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayguLi5hd2FpdCBTdXJ2ZXlIZWxwZXIuZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBjZWxsLnF1ZXN0aW9uLCBwb2ludCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNlbGwuaGFzVGl0bGUpIHtcbiAgICAgICAgICAgIGlmIChpc0hlYWRlcikge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQm9sZFRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwubG9jVGl0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5sb2NUaXRsZSwgVGV4dEJyaWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93SG9yaXNvbnRhbChwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgICAgICAgY29sQ291bnQ6IG51bWJlciwgY29sdW1uV2lkdGg6IG51bWJlcltdKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IGxhc3RSaWdodE1hcmdpbjogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uLmRldGFpbFBhbmVsTW9kZSAhPT0gJ25vbmUnID8gMSA6IDA7IGkgPCByb3cuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbnQgPT0gY29sQ291bnQpIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gbGFzdFJpZ2h0TWFyZ2luICtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29sdW1uV2lkdGhbY250XTtcbiAgICAgICAgICAgIGxhc3RSaWdodE1hcmdpbiA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxDb250ZW50OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoXG4gICAgICAgICAgICAgICAgY3VyclBvaW50LCByb3cuY2VsbHNbaV0sIHJvdyA9PT0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLmhlYWRlclJvdyk7XG4gICAgICAgICAgICBpZiAoIWNlbGxDb250ZW50LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soY2VsbENvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGNudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd1ZlcnRpY2FsKHBvaW50OiBJUG9pbnQsIHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IE1hdGgubWluKGNvbENvdW50LCByb3cuY2VsbHMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnNob3dIZWFkZXIgJiYgKCF0aGlzLmlzTXVsdGlwbGUgfHwgaSA+IDApKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuaGVhZGVyUm93LmNlbGxzW2ldLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoY3VyclBvaW50LCByb3cuY2VsbHNbaV0sIGZhbHNlKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLCBjb2xDb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC1cbiAgICAgICAgICAgIChjb2xDb3VudCAtIDEpICogdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgICAgICBsZXQgcmVtYWluV2lkdGg6IG51bWJlciA9IGF2YWlsYWJsZVdpZHRoO1xuICAgICAgICBsZXQgcmVtYWluQ29sQ291bnQ6IG51bWJlciA9IGNvbENvdW50O1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNvbENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChyb3dzWzBdLmNlbGxzW2ldLndpZHRoLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgcmVtYWluV2lkdGggLT0gd2lkdGg7XG4gICAgICAgICAgICBpZiAod2lkdGggIT09IDAuMCkgcmVtYWluQ29sQ291bnQtLTtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoLnB1c2god2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1haW5Db2xDb3VudCA9PT0gMCkgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBoZXVyaXN0aWNXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aDtcbiAgICAgICAgY29uc3QgY29sdW1uTWluV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKFxuICAgICAgICAgICAgcm93c1swXS5jZWxsc1swXS5taW5XaWR0aCwgcmVtYWluV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgIGNvbnN0IGVxdWFsV2lkdGg6IG51bWJlciA9IHJlbWFpbldpZHRoIC8gcmVtYWluQ29sQ291bnQ7XG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBNYXRoLm1heChoZXVyaXN0aWNXaWR0aCwgY29sdW1uTWluV2lkdGgsIGVxdWFsV2lkdGgpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29sdW1uV2lkdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5XaWR0aFtpXSA9PT0gMC4wKSBjb2x1bW5XaWR0aFtpXSA9IHdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU9uZVJvdyhwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgICAgICAgY29sQ291bnQ6IG51bWJlciwgaXNXaWRlOiBib29sZWFuLCBjb2x1bW5XaWR0aDogbnVtYmVyW10pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGlmIChpc1dpZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dIb3Jpc29udGFsKHBvaW50LCByb3csIGNvbENvdW50LCBjb2x1bW5XaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd1ZlcnRpY2FsKHBvaW50LCByb3csIGNvbENvdW50KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93cyhwb2ludDogSVBvaW50LCByb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSxcbiAgICAgICAgY29sQ291bnQ6IG51bWJlciwgaXNXaWRlOiBib29sZWFuKTogUHJvbWlzZTxDb21wb3NpdGVCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcm93RmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlT25lUm93KGN1cnJQb2ludCwgcm93c1tpXSwgY29sQ291bnQsXG4gICAgICAgICAgICAgICAgaXNXaWRlLCB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KSk7XG4gICAgICAgICAgICBpZiAocm93RmxhdC5pc0VtcHR5KSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChpICE9PSByb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0ZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICByb3dGbGF0LmFkZEJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gocm93RmxhdCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0ZsYXQueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmRldGFpbFBhbmVsTW9kZSAhPT0gJ25vbmUnICYmIGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudERldGFpbFBhbmVsOiBQYW5lbE1vZGVsID0gdGhpcy5xdWVzdGlvbi5kZXRhaWxQYW5lbFZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY3VycmVudERldGFpbFBhbmVsLnF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zW2pdLmlkICs9ICdfJyArIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsQnJpY2tzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBjdXJyZW50RGV0YWlsUGFuZWwsIGN1cnJQb2ludCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyQ29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgICAgIGN1cnJDb21wb3NpdGUuYWRkQnJpY2soLi4ucGFuZWxCcmlja3MpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY3VyckNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcblxuICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKGN1cnJDb21wb3NpdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSByb3dzLmxlbmd0aCAtIDEgJiYgdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnNob3dIZWFkZXIgJiYgaXNXaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcjogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlT25lUm93KGN1cnJQb2ludCwgcm93c1swXSwgY29sQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1dpZGUsIHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93cywgY29sQ291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBoZWFkZXIueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKGhlYWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCB0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUgPSB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGU7XG4gICAgICAgIGNvbnN0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLmNvbHVtbkxheW91dCA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgICAgY29uc3QgY29sQ291bnQ6IG51bWJlciA9IHRhYmxlLnJvd3NbMF0gPyB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aCAtXG4gICAgICAgICAgICAodGFibGUuaGFzUmVtb3ZlUm93cyAmJiAhaXNWZXJ0aWNhbCA/ICh0aGlzLnF1ZXN0aW9uLmRldGFpbFBhbmVsTW9kZSAhPT0gJ25vbmUnID8gMiA6IDEpIDogMCkgOlxuICAgICAgICAgICAgdGFibGUuc2hvd0hlYWRlciAmJiB0YWJsZS5oZWFkZXJSb3cgPyB0YWJsZS5oZWFkZXJSb3cuY2VsbHMubGVuZ3RoIDpcbiAgICAgICAgICAgICAgICB0YWJsZS5zaG93Rm9vdGVyICYmIHRhYmxlLmZvb3RlclJvdyA/IHRhYmxlLmZvb3RlclJvdy5jZWxscy5sZW5ndGggOiAwO1xuICAgICAgICBpZiAoY29sQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IENvbXBvc2l0ZUJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChwb2ludCwgdGhpcy5jb250cm9sbGVyKSldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdID0gW107XG4gICAgICAgIGNvbnN0IGNlbGxXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQpO1xuICAgICAgICBjb25zdCBpc1dpZGU6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLnJlbmRlckFzICE9PSAnbGlzdCcgJiZcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXRyaXhSZW5kZXJBcyAhPT0gJ2xpc3QnICYmXG4gICAgICAgICAgICBjZWxsV2lkdGggPj0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aDtcbiAgICAgICAgaWYgKHRhYmxlLnNob3dIZWFkZXIgJiYgaXNXaWRlKSByb3dzLnB1c2godGFibGUuaGVhZGVyUm93KTtcbiAgICAgICAgcm93cy5wdXNoKC4uLnRhYmxlLnJvd3MpO1xuICAgICAgICBpZiAodGFibGUuaGFzUmVtb3ZlUm93cyAmJiBpc1ZlcnRpY2FsKSByb3dzLnBvcCgpO1xuICAgICAgICBpZiAodGFibGUuc2hvd0Zvb3RlciAmJiBpc1dpZGUpIHJvd3MucHVzaCh0YWJsZS5mb290ZXJSb3cpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93cyhwb2ludCwgcm93cywgY29sQ291bnQsIGlzV2lkZSk7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHJvcGRvd24nLCB7XG4gICAgbmFtZTogJ3JlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ2xpc3QnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtYXRyaXhkcm9wZG93bicsIEZsYXRNYXRyaXhNdWx0aXBsZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUudHMiLCJpbXBvcnQgSW50ZXJ2YWxUcmVlIGZyb20gJ25vZGUtaW50ZXJ2YWwtdHJlZSc7XG5pbXBvcnQgeyBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmludGVyZmFjZSBQYWNrSW50ZXJ2YWwge1xuICAgIHBhZ2VJbmRleDogbnVtYmVyO1xuICAgIHhMZWZ0OiBudW1iZXI7XG4gICAgeFJpZ2h0OiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIGFic0JvdDogbnVtYmVyO1xufVxuZXhwb3J0IGNsYXNzIFBhZ2VQYWNrZXIge1xuICAgIHByaXZhdGUgc3RhdGljIGZpbmRCb3RJbnRlcnZhbCh0cmVlOiBJbnRlcnZhbFRyZWU8UGFja0ludGVydmFsPixcbiAgICAgICAgeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXIsIG9wdGlvbnM6IERvY09wdGlvbnMpOiBQYWNrSW50ZXJ2YWwge1xuICAgICAgICBjb25zdCBpbnRlcnZhbHM6IFBhY2tJbnRlcnZhbFtdID0gdHJlZS5zZWFyY2goeExlZnQsIHhSaWdodCk7XG4gICAgICAgIGludGVydmFscy5wdXNoKHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogMCwgeExlZnQ6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5tYXJnaW5zLmxlZnQsIHhSaWdodDogb3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICB5Qm90OiBvcHRpb25zLm1hcmdpbnMudG9wLCBhYnNCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3BcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbHMucmVkdWNlKChteCwgY3IpID0+IHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjci54UmlnaHQgLSB4TGVmdCkgPCBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fFxuICAgICAgICAgICAgICAgIE1hdGguYWJzKGNyLnhMZWZ0IC0geFJpZ2h0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OKSByZXR1cm4gbXg7XG4gICAgICAgICAgICBpZiAoY3IucGFnZUluZGV4IDwgbXgucGFnZUluZGV4KSByZXR1cm4gbXg7XG4gICAgICAgICAgICBpZiAoY3IucGFnZUluZGV4ID4gbXgucGFnZUluZGV4KSByZXR1cm4gY3I7XG4gICAgICAgICAgICByZXR1cm4gY3IueUJvdCA+IG14LnlCb3QgPyBjciA6IG14O1xuICAgICAgICB9LCBpbnRlcnZhbHNbaW50ZXJ2YWxzLmxlbmd0aCAtIDFdKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkUGFjayhwYWNrczogSVBkZkJyaWNrW11bXSwgaW5kZXg6IG51bWJlciwgYnJpY2s6IElQZGZCcmljaykge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBwYWNrcy5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICAgICAgcGFja3MucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFja3NbaW5kZXhdLnB1c2goYnJpY2spO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHBhY2soZmxhdHM6IElQZGZCcmlja1tdW10sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUGRmQnJpY2tbXVtdIHtcbiAgICAgICAgY29uc3QgcGFnZUhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtXG4gICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMudG9wIC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgY29uc3QgdW5mb2xkRmxhdHM6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgZmxhdHMuZm9yRWFjaCgoZmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgdW5mb2xkRmxhdHMucHVzaChbXSk7XG4gICAgICAgICAgICBmbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXQuaGVpZ2h0ID4gcGFnZUhlaWdodCArIFN1cnZleUhlbHBlci5FUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuZm9sZEZsYXRzW3VuZm9sZEZsYXRzLmxlbmd0aCAtIDFdLnB1c2goLi4uZmxhdC51bmZvbGQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaChmbGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgdW5mb2xkRmxhdHNQYWdlLnNvcnQoKGE6IElQZGZCcmljaywgYjogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA8IGIueVRvcCkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIGlmIChhLnlUb3AgPiBiLnlUb3ApIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIGlmIChhLnhMZWZ0ID4gYi54TGVmdCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPCBiLnhMZWZ0KSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBwYWdlSW5kZXhNb2RlbDogbnVtYmVyID0gMDtcbiAgICAgICAgY29uc3QgcGFja3M6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGFnZUJvdDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3Q7XG4gICAgICAgIHVuZm9sZEZsYXRzLmZvckVhY2goKHVuZm9sZEZsYXRzUGFnZTogSVBkZkJyaWNrW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+ID0gbmV3IEludGVydmFsVHJlZSgpO1xuICAgICAgICAgICAgbGV0IHBhZ2VJbmRleFNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICAgICAgdW5mb2xkRmxhdHNQYWdlLmZvckVhY2goKGZsYXQ6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7IHBhZ2VJbmRleCwgeUJvdCwgYWJzQm90IH0gPSBQYWdlUGFja2VyLmZpbmRCb3RJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgdHJlZSwgZmxhdC54TGVmdCwgZmxhdC54UmlnaHQsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gZmxhdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZmxhdC55VG9wID0geUJvdCArIGZsYXQueVRvcCAtIGFic0JvdDtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZmxhdC55VG9wIC0gY29udHJvbGxlci5tYXJnaW5zLnRvcCkgPiBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiAmJlxuICAgICAgICAgICAgICAgICAgICBmbGF0LnlUb3AgKyBoZWlnaHQgPiBwYWdlQm90ICsgU3VydmV5SGVscGVyLkVQU0lMT04gfHwgZmxhdC5pc1BhZ2VCcmVhaykge1xuICAgICAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSBjb250cm9sbGVyLm1hcmdpbnMudG9wO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4U2hpZnQgPSBNYXRoLm1heChwYWdlSW5kZXhTaGlmdCwgcGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJlZS5pbnNlcnQoZmxhdC54TGVmdCwgZmxhdC54UmlnaHQsIHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHhMZWZ0OiBmbGF0LnhMZWZ0LCB4UmlnaHQ6IGZsYXQueFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB5Qm90OiBmbGF0LnlUb3AgKyBoZWlnaHQsIGFic0JvdDogZmxhdC55Qm90XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmxhdC55Qm90ID0gZmxhdC55VG9wICsgaGVpZ2h0O1xuICAgICAgICAgICAgICAgIFBhZ2VQYWNrZXIuYWRkUGFjayhwYWNrcywgcGFnZUluZGV4TW9kZWwgKyBwYWdlSW5kZXgsIGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYWdlSW5kZXhNb2RlbCArPSBwYWdlSW5kZXhTaGlmdCArIDE7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFja3M7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5JdGVtQnJpY2sgZXh0ZW5kcyBDaGVja0l0ZW1CcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikuaWQsXG4gICAgICAgICAgICBxdWVzdGlvbi5pc1JlYWRPbmx5LFxuICAgICAgICAgICAgKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikuY2hlY2tlZFZhbHVlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2Jvb2xlYW5pdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwsIEl0ZW1WYWx1ZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hJdGVtQnJpY2sgZXh0ZW5kcyBDaGVja0l0ZW1CcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbikuaWQgKyAnaW5kZXgnICsgaW5kZXgsXG4gICAgICAgICAgICBxdWVzdGlvbi5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZCxcbiAgICAgICAgICAgICg8UXVlc3Rpb25DaGVja2JveE1vZGVsPnF1ZXN0aW9uKS5pc0l0ZW1TZWxlY3RlZChpdGVtKSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4vcGRmX3RleHRib3gnO1xuXG5leHBvcnQgY2xhc3MgQ29tbWVudEJyaWNrIGV4dGVuZHMgVGV4dEJveEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBpc1F1ZXN0aW9uOiBib29sZWFuLCBpbmRleDogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaXNRdWVzdGlvbiwgdHJ1ZSwgaW5kZXgpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsLCBJdGVtVmFsdWUgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBEcm9wZG93bkJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBpc011bHRpbGluZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29tYm9Cb3ggPSBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybUNvbWJvQm94KSgpO1xuICAgICAgICBjb21ib0JveC5maWVsZE5hbWUgPSB0aGlzLnF1ZXN0aW9uLmlkO1xuICAgICAgICBjb21ib0JveC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcyxcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcykpKTtcbiAgICAgICAgY29tYm9Cb3guZWRpdCA9IGZhbHNlO1xuICAgICAgICBjb21ib0JveC5jb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93T3B0aW9uc0NhcHRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmZvckVhY2goKGl0ZW06IEl0ZW1WYWx1ZSkgPT4ge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoaXRlbS5sb2NUZXh0KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb21ib0JveC5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb21ib0JveC5mb250TmFtZSA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgY29tYm9Cb3guZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBjb21ib0JveC5yZWFkT25seSA9IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seTtcbiAgICAgICAgY29tYm9Cb3guaXNVbmljb2RlID0gU3VydmV5SGVscGVyLmlzQ3VzdG9tRm9udChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgY29tYm9Cb3guZm9udE5hbWUpO1xuICAgICAgICBjb21ib0JveC5WID0gU3VydmV5SGVscGVyLmdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZSh0aGlzLnF1ZXN0aW9uKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChjb21ib0JveCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLnhSaWdodCk7XG4gICAgICAgIGF3YWl0IFN1cnZleUhlbHBlci5yZW5kZXJSZWFkT25seVRleHRGaWVsZCh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24sIHRoaXMsXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pLCAhKHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSAmJiB0aGlzLmNvbnRyb2xsZXIudGV4dEZpZWxkUmVuZGVyQXMgPT09ICdtdWx0aUxpbmUnKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bi50cyIsImltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEVtcHR5QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBpc0JvcmRlclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHJlY3Q6IElSZWN0LFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG51bGwsXG4gICAgICAgIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKG51bGwsIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmlzQm9yZGVyVmlzaWJsZSA9IGlzQm9yZGVyVmlzaWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2l6ZUJvcmRlcihpc0luY3JlYXNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvZWY6IG51bWJlciA9IGlzSW5jcmVhc2UgPyAxIDogLTE7XG4gICAgICAgIGNvbnN0IGJvcmRlclBhZGRpbmc6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0Rm9udFNpemUoKSAqIFN1cnZleUhlbHBlci5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFO1xuICAgICAgICB0aGlzLnhMZWZ0IC09IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnhSaWdodCArPSBjb2VmICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgdGhpcy55Qm90ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNCb3JkZXJWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcih0cnVlKTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVCb3JkZXIoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciB9O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGh0bWw6IHN0cmluZywgaXNJbWFnZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgaWYgKGlzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMubWFyZ2lucyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IDAuMCxcbiAgICAgICAgICAgICAgICBib3R0b206IDAuMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFyZ2lucyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IGNvbnRyb2xsZXIubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBjb250cm9sbGVyLm1hcmdpbnMuYm90XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmZyb21IVE1MKHRoaXMuaHRtbCwgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsIHBhZ2VzcGxpdDogdHJ1ZSxcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZWw6IEhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwubmFtZS5sYXN0SW5kZXhPZignanNQREZodG1sVGV4dCcsIDApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIHRoaXMubWFyZ2lucyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUG9pbnQgfSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcm90ZWN0ZWQgaW1hZ2U6IHN0cmluZyxcbiAgICAgICAgcG9pbnQ6IElQb2ludCwgcHJvdGVjdGVkIG9yaWdpbmFsV2lkdGg6IG51bWJlciwgcHJvdGVjdGVkIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcG9pbnQueExlZnQgKyAob3JpZ2luYWxXaWR0aCB8fCAwKSxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3AsXG4gICAgICAgICAgICB5Qm90OiBwb2ludC55VG9wICsgKG9yaWdpbmFsSGVpZ2h0IHx8IDApXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzUGFnZUJyZWFrID0gdGhpcy5vcmlnaW5hbEhlaWdodCA9PT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEltYWdlKHRoaXMuaW1hZ2UsIHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy5vcmlnaW5hbFdpZHRoLCB0aGlzLm9yaWdpbmFsSGVpZ2h0KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9pbWFnZS50cyIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIExpbmtCcmljayBleHRlbmRzIFRleHRCcmljayB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0NBTEVfRkFDVE9SX01BR0lDOiBudW1iZXIgPSAwLjk1NTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTE9SOiBzdHJpbmcgPSAnIzAwMDBFRSc7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHRleHRGbGF0OiBUZXh0QnJpY2ssIHByb3RlY3RlZCBsaW5rOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKDxMaW5rQnJpY2s+dGV4dEZsYXQpLnF1ZXN0aW9uLFxuICAgICAgICAgICAgKDxMaW5rQnJpY2s+dGV4dEZsYXQpLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICB0ZXh0RmxhdCwgKDxMaW5rQnJpY2s+dGV4dEZsYXQpLnRleHQpO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IExpbmtCcmljay5DT0xPUjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkVGV4dENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldFRleHRDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldFRleHRDb2xvcihTdXJ2ZXlIZWxwZXIuQkFDS0dST1VORF9DT0xPUik7XG4gICAgICAgIGxldCBkZXNjZW50OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqXG4gICAgICAgICAgICAodGhpcy5jb250cm9sbGVyLmRvYy5nZXRMaW5lSGVpZ2h0RmFjdG9yKCkgLVxuICAgICAgICAgICAgICAgIExpbmtCcmljay5TQ0FMRV9GQUNUT1JfTUFHSUMpO1xuICAgICAgICBsZXQgeVRvcExpbms6IG51bWJlciA9IHRoaXMueVRvcCArXG4gICAgICAgICAgICAodGhpcy55Qm90IC0gdGhpcy55VG9wKSAtIGRlc2NlbnQ7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MudGV4dFdpdGhMaW5rKHRoaXMudGV4dCwgdGhpcy54TGVmdCxcbiAgICAgICAgICAgIHlUb3BMaW5rLCB7IHVybDogdGhpcy5saW5rIH0pO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldFRleHRDb2xvcihvbGRUZXh0Q29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuZ2V0UmVhZG9ubHlSZW5kZXJBcyg8UXVlc3Rpb24+dGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcikgIT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfbGluay50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgUmFkaW9Hcm91cFdyYXAge1xuICAgIHByaXZhdGUgX3JhZGlvR3JvdXA6IGFueTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcml2YXRlIF9yZWFkT25seTogYm9vbGVhbikge1xuICAgIH1cbiAgICBwdWJsaWMgYWRkVG9QZGYoY29sb3I6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwID0gbmV3IHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1SYWRpb0J1dHRvbigpO1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLmZpZWxkTmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC52YWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLnJlYWRPbmx5ID0gdGhpcy5yZWFkT25seTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5jb2xvciA9IGNvbG9yO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKHRoaXMuX3JhZGlvR3JvdXApO1xuICAgIH1cbiAgICBnZXQgcmFkaW9Hcm91cCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9Hcm91cDtcbiAgICB9XG4gICAgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE9ubHk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkaW9JdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MOiBzdHJpbmcgPSAn4oCiJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuNTc1O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJpdmF0ZSBpbmRleDogbnVtYmVyLCBwcml2YXRlIGNoZWNrZWQ6IGJvb2xlYW4sXG4gICAgICAgIHByaXZhdGUgcmFkaW9Hcm91cFdyYXA6IFJhZGlvR3JvdXBXcmFwKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5yYWRpb0dyb3VwV3JhcC5yZWFkT25seSAmJiBTdXJ2ZXlIZWxwZXIuZ2V0UmVhZG9ubHlSZW5kZXJBcyhcbiAgICAgICAgICAgIDxRdWVzdGlvbj50aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpICE9PSAnYWNyb2Zvcm0nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZW5kZXJSZWFkT25seSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAuYWRkVG9QZGYodGhpcy5mb3JtQm9yZGVyQ29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLm5hbWUgKyAnaW5kZXgnICsgdGhpcy5pbmRleDtcbiAgICAgICAgbGV0IHJhZGlvQnV0dG9uOiBhbnkgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAuY3JlYXRlT3B0aW9uKG5hbWUpO1xuICAgICAgICByYWRpb0J1dHRvbi5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCkge1xuICAgICAgICAgICAgcmFkaW9CdXR0b24uQVMgPSAnLycgKyBuYW1lO1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5yYWRpb0dyb3VwLnZhbHVlID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJhZGlvQnV0dG9uLkFTID0gJy9PZmYnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmb3JtU2NhbGU6IG51bWJlciA9IFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgcmFkaW9CdXR0b24uUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICByYWRpb0J1dHRvbi5jb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5yYWRpb0dyb3VwLnNldEFwcGVhcmFuY2UoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtLkFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCkge1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIGxldCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgICAgIGxldCByYWRpb21hcmtlclNpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCk7XG4gICAgICAgICAgICByYWRpb21hcmtlclBvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSByYWRpb21hcmtlclNpemUud2lkdGggLyAyLjA7XG4gICAgICAgICAgICByYWRpb21hcmtlclBvaW50LnlUb3AgKz0gdGhpcy5oZWlnaHQgLyAyLjAgLSByYWRpb21hcmtlclNpemUuaGVpZ2h0IC8gMS45O1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9TWU1CT0wsIFRleHRCcmljayk7XG4gICAgICAgICAgICAoPGFueT5yYWRpb21hcmtlckZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICBhd2FpdCByYWRpb21hcmtlckZsYXQucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25SYW5raW5nTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIsIElQb2ludCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgUmFua2luZ0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUmFua2luZ01vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIG51bWJlcjogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhbmtpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgY29uc3QgbnVtYmVyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY29uc3QgbnVtYmVyU2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5udW1iZXIpO1xuICAgICAgICBudW1iZXJQb2ludC54TGVmdCArPSB0aGlzLndpZHRoIC8gMi4wIC0gbnVtYmVyU2l6ZS53aWR0aCAvIDIuMDtcbiAgICAgICAgbnVtYmVyUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIG51bWJlclNpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICBjb25zdCBudW1iZXJGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBudW1iZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLm51bWJlciwgVGV4dEJyaWNrKTtcbiAgICAgICAgKDxhbnk+bnVtYmVyRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICBhd2FpdCBudW1iZXJGbGF0LnJlbmRlcigpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBUaXRsZVBhbmVsQnJpY2sgZXh0ZW5kcyBUZXh0Qm9sZEJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRm9udFNpemUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogU3VydmV5SGVscGVyLlRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBQYW5lbE1vZGVsLCBQYWdlTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcG9pbnQ6IElQb2ludDtcbiAgICBwdWJsaWMgYnJpY2tzOiBJUGRmQnJpY2tbXTtcbiAgICBwdWJsaWMgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnk7XG4gICAgcHVibGljIG1vZHVsZTogYW55O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICB0aGlzLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgIHRoaXMuYnJpY2tzID0gYnJpY2tzO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICB0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNPcHRpb25zIGV4dGVuZHMgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHF1ZXN0aW9uOiBJUXVlc3Rpb247XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzUGFuZWxPcHRpb25zIGV4dGVuZHMgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHBhbmVsOiBQYW5lbE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBwYW5lbDogUGFuZWxNb2RlbCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucGFuZWwgPSBwYW5lbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc1BhZ2VPcHRpb25zIGV4dGVuZHMgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHBhZ2U6IFBhZ2VNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcGFnZTogUGFnZU1vZGVsLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICB9XG59XG5cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBMb2NhbGl6YWJsZVN0cmluZywgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBCb29sZWFuSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Qm9vbGVhbiBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkJvb2xlYW5Nb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBCb29sZWFuSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCBoZWlnaHQsIGhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGxvY0xhYmVsVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZSA/IG51bGwgOlxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgPyB0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZSA6IHRoaXMucXVlc3Rpb24ubG9jTGFiZWxGYWxzZTtcbiAgICAgICAgaWYgKGxvY0xhYmVsVGV4dCAhPT0gbnVsbCAmJiBsb2NMYWJlbFRleHQucmVuZGVyZWRIdG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgICAgICB0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgbG9jTGFiZWxUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignYm9vbGVhbicsIEZsYXRCb29sZWFuKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9ib29sZWFuLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBDaGVja2JveEl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q2hlY2tib3ggZXh0ZW5kcyBGbGF0U2VsZWN0QmFzZSB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveEl0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QsIGl0ZW0sIGluZGV4KTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2NoZWNrYm94JywgRmxhdENoZWNrYm94KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q29tbWVudCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNvbW1lbnRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNvbW1lbnRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5yb3dzLCB0cnVlKV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjb21tZW50JywgRmxhdENvbW1lbnQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NvbW1lbnQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ3VzdG9tTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgRmxhdEN1c3RvbU1vZGVsIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdCA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgcmV0dXJuIGZsYXQuZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY3VzdG9tX21vZGVsJywgRmxhdEN1c3RvbU1vZGVsKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRHJvcGRvd25CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Ryb3Bkb3duJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdERyb3Bkb3duIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5ICYmIHRoaXMuY29udHJvbGxlci50ZXh0RmllbGRSZW5kZXJBcyA9PT0gJ211bHRpTGluZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3RXaXRoRGluYW1pY0JvdHRvbTogSVJlY3QgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChcbiAgICAgICAgICAgICAgICBwb2ludCwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLCBTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pLCBmYWxzZSk7XG4gICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1heChyZWN0LnlCb3QsIHJlY3RXaXRoRGluYW1pY0JvdHRvbS55Qm90ICsgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soXG4gICAgICAgICAgICBuZXcgRHJvcGRvd25Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QpKTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQsIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVGbGF0XTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2Ryb3Bkb3duJywgRmxhdERyb3Bkb3duKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRGaWVsZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGZpZWxkJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdEV4cHJlc3Npb24gZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25FeHByZXNzaW9uTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBbbmV3IFRleHRGaWVsZEJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCwgdHJ1ZSxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaWQsIHRoaXMucXVlc3Rpb24uZGlzcGxheVZhbHVlLCAnJywgdHJ1ZSwgZmFsc2UsICd0ZXh0JyldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZXhwcmVzc2lvbicsIEZsYXRFeHByZXNzaW9uKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkZpbGVNb2RlbCwgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdEZpbGUgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU1BR0VfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRFWFRfTUlOX1NDQUxFOiBudW1iZXIgPSA1LjA7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkZpbGVNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRmlsZU1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdEl0ZW0ocG9pbnQ6IElQb2ludCwgaXRlbToge1xuICAgICAgICBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLFxuICAgIH0pOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlTGlua0ZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLm5hbWUgPT09IHVuZGVmaW5lZCA/ICdpbWFnZScgOiBpdGVtLm5hbWUsIGl0ZW0uY29udGVudCkpO1xuICAgICAgICBpZiAoU3VydmV5SGVscGVyLmNhblByZXZpZXdJbWFnZSh0aGlzLnF1ZXN0aW9uLCBpdGVtLCBpdGVtLmNvbnRlbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVNpemU6IElTaXplID0gYXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlU2l6ZShpdGVtLmNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aCkge1xuICAgICAgICAgICAgICAgIGltYWdlU2l6ZS53aWR0aCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0KSB7IC8vIFRPRE86IHdlIHNob3VsZG4ndCB1c2UgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoIGhlcmVcbiAgICAgICAgICAgICAgICBpbWFnZVNpemUuaGVpZ2h0ID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgodGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGltYWdlUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgIGltYWdlUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRGaWxlLklNQUdFX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChpbWFnZVBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0uY29udGVudCwgaW1hZ2VTaXplLndpZHRoLCBpbWFnZVNpemUuaGVpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgYWRkTGluZShyb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10sIGN1cnJQb2ludDogSVBvaW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoJ25vRmlsZUNob3NlbicpLCBUZXh0QnJpY2spXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfSA9IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlW2ldO1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudFdpZHRoID0gKGF3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZVNpemUoaXRlbS5jb250ZW50KSkud2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRXaWR0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpZHRoID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgodGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVXaWR0aDogbnVtYmVyID0gTWF0aC5tYXgoY29udGVudFdpZHRoLCBGbGF0RmlsZS5URVhUX01JTl9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0V2lkdGgpO1xuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0aCA8IGNvbXBvc2l0ZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZShyb3dzRmxhdHMsIGN1cnJQb2ludCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyhjdXJyUG9pbnQueExlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gY3VyclBvaW50LnhMZWZ0IC0gY29tcG9zaXRlV2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gaXRlbUZsYXQud2lkdGg7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPCB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZShyb3dzRmxhdHMsIGN1cnJQb2ludCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gaXRlbUZsYXQueFJpZ2h0IC0gaXRlbUZsYXQueExlZnQ7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ZpbGUnLCBGbGF0RmlsZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZmlsZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25IdG1sTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCB0eXBlIElIVE1MUmVuZGVyVHlwZSA9ICdhdXRvJyB8ICdzdGFuZGFyZCcgfCAnaW1hZ2UnO1xuZXhwb3J0IGNsYXNzIEZsYXRIVE1MIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uSHRtbE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIHByaXZhdGUgY2hvb3NlUmVuZGVyKGh0bWw6IHN0cmluZyk6IElIVE1MUmVuZGVyVHlwZSB7XG4gICAgICAgIGlmICgvPFtePl0qc3R5bGVbXjxdKj4vLnRlc3QoaHRtbCkgfHxcbiAgICAgICAgICAgIC88W14+XSp0YWJsZVtePF0qPi8udGVzdChodG1sKSB8fFxuICAgICAgICAgICAgLyZcXHcrOy8udGVzdChodG1sKSkge1xuICAgICAgICAgICAgcmV0dXJuICdpbWFnZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdzdGFuZGFyZCc7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBsZXQgcmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZSA9IDxJSFRNTFJlbmRlclR5cGU+dGhpcy5xdWVzdGlvbi5yZW5kZXJBcztcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnYXV0bycpIHJlbmRlckFzID0gdGhpcy5jb250cm9sbGVyLmh0bWxSZW5kZXJBcztcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnYXV0bycpIHJlbmRlckFzID0gdGhpcy5jaG9vc2VSZW5kZXIoU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0h0bWwpKTtcbiAgICAgICAgY29uc3QgaHRtbDogc3RyaW5nID0gU3VydmV5SGVscGVyLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jSHRtbCksIHRoaXMuY29udHJvbGxlciwgcmVuZGVyQXMpO1xuICAgICAgICBpZiAocmVuZGVyQXMgPT09ICdpbWFnZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICBjb25zdCB7IHVybCwgYXNwZWN0IH06IHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0gPVxuICAgICAgICAgICAgICAgIGF3YWl0IFN1cnZleUhlbHBlci5odG1sVG9JbWFnZShodG1sLCB3aWR0aCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gd2lkdGggLyBhc3BlY3Q7XG4gICAgICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdXJsLCB3aWR0aCwgaGVpZ2h0KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtTdXJ2ZXlIZWxwZXIuc3BsaXRIdG1sUmVjdCh0aGlzLmNvbnRyb2xsZXIsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVIVE1MRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGh0bWwpKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdodG1sJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdodG1sJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdzdGFuZGFyZCcsICdpbWFnZSddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2h0bWwnLCBGbGF0SFRNTCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25JbWFnZU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdEltYWdlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uSW1hZ2VNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uSW1hZ2VNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHdpZHRoUHQ6IG51bWJlciA9IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgpO1xuICAgICAgICBjb25zdCBoZWlnaHRQdDogbnVtYmVyID0gU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHQpO1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uaW1hZ2VMaW5rLCB3aWR0aFB0LCBoZWlnaHRQdCldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignaW1hZ2UnLCBGbGF0SW1hZ2UpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ltYWdlLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdEltYWdlUGlja2VyIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbDtcbiAgICBwcm90ZWN0ZWQgcmFkaW86IEZsYXRSYWRpb2dyb3VwO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdEl0ZW0ocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgcGFnZUF2YWlsYWJsZVdpZHRoID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCBpbWFnZUZsYXQgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsICg8YW55Pml0ZW0pLmltYWdlTGluaywgcGFnZUF2YWlsYWJsZVdpZHRoLCBwYWdlQXZhaWxhYmxlV2lkdGggLyBTdXJ2ZXlIZWxwZXIuSU1BR0VQSUNLRVJfUkFUSU8pO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhpbWFnZUZsYXQpO1xuICAgICAgICBsZXQgYnV0dG9uUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uc2hvd0xhYmVsKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoYnV0dG9uUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS50ZXh0IHx8IGl0ZW0udmFsdWUsIFRleHRCcmljayk7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGxhYmVsRmxhdCk7XG4gICAgICAgICAgICBidXR0b25Qb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChsYWJlbEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGJ1dHRvblJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoYnV0dG9uUG9pbnQsIHBhZ2VBdmFpbGFibGVXaWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ubXVsdGlTZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobmV3IENoZWNrSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBidXR0b25SZWN0LCB0aGlzLnF1ZXN0aW9uLmlkICsgJ2luZGV4JyArIGluZGV4LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSB8fCAhaXRlbS5pc0VuYWJsZWQsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZS5pbmRleE9mKGl0ZW0udmFsdWUpICE9PSAtMSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayh0aGlzLnJhZGlvLmdlbmVyYXRlRmxhdEl0ZW0oYnV0dG9uUmVjdCwgaXRlbSwgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMucmFkaW8gPSB0aGlzLnF1ZXN0aW9uLm11bHRpU2VsZWN0ID8gbnVsbCA6XG4gICAgICAgICAgICBuZXcgRmxhdFJhZGlvZ3JvdXAodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcikgLyBTdXJ2ZXlIZWxwZXIuSU1BR0VQSUNLRVJfQ09VTlQ7XG4gICAgICAgIGxldCBjb2xzOiBudW1iZXIgPSB+fihTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBnZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAvIGNvbFdpZHRoKSB8fCAxO1xuICAgICAgICBjb25zdCBjb3VudDogbnVtYmVyID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgICAgIGNvbHMgPSBjb2xzIDw9IGNvdW50ID8gY29scyA6IGNvdW50O1xuICAgICAgICBjb25zdCByb3dzOiBudW1iZXIgPSB+fihNYXRoLmNlaWwoY291bnQgLyBjb2xzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBsZXQgY3Vyck1hcmdpbkxlZnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgY29sczsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGkgKiBjb2xzICsgajtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gY291bnQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyTWFyZ2luTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY3Vyck1hcmdpbkxlZnQgLSBjb2xXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyTWFyZ2luTGVmdCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaW5kZXhdLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MgLSAxKSB7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZXBpY2tlcicsIEZsYXRJbWFnZVBpY2tlcik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXIudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4TW9kZWwsIE1hdHJpeFJvd01vZGVsLFxuICAgIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsLCBJdGVtVmFsdWUsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVBvaW50LCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNYXRyaXggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC41O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgPFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsPnF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk1hdHJpeE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c0hlYWRlcihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbENvdW50OiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCArICh0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgPyAxIDogMCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgPyBpICsgMSA6IGk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQsIGNvbHVtbik7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgaGVhZGVycy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1uc1tpXS5sb2NUZXh0KSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5oZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQ6IElQb2ludCwgaXNWZXJ0aWNhbDogYm9vbGVhbik6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY2VsbHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9ICdyb3cnICsgaTtcbiAgICAgICAgICAgIGNvbnN0IGZsYXRzUm93OiBJUGRmQnJpY2tbXSA9IGF3YWl0IG5ldyBGbGF0TWF0cml4Um93KHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93c1tpXSwga2V5LCBpID09IDAsIGlzVmVydGljYWwpLmdlbmVyYXRlRmxhdHNDb250ZW50KGN1cnJQb2ludCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uZmxhdHNSb3cpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdE1hdHJpeC5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICAgICAgY2VsbHMucHVzaCguLi5mbGF0c1Jvdyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNlbGxzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCArICh0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgPyAxIDogMCkpO1xuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsOiBib29sZWFuID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJBcyA9PT0gJ2xpc3QnIHx8IHRoaXMuY29udHJvbGxlci5tYXRyaXhSZW5kZXJBcyA9PT0gJ2xpc3QnIHx8XG4gICAgICAgICAgICBjZWxsV2lkdGggPCB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgaWYgKCFpc1ZlcnRpY2FsICYmIHRoaXMucXVlc3Rpb24uc2hvd0hlYWRlciAmJiB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICBsZXQgaGVhZGVyczogSVBkZkJyaWNrW10gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNIZWFkZXIoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5oZWFkZXJzKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goLi4uaGVhZGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKGN1cnJQb2ludCwgaXNWZXJ0aWNhbCkpO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeFJvdyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25NYXRyaXg6IFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByaXZhdGUgcm93OiBNYXRyaXhSb3dNb2RlbCxcbiAgICAgICAgcHJpdmF0ZSBrZXk6IHN0cmluZywgcHJvdGVjdGVkIGlzRmlyc3Q6IGJvb2xlYW4gPSBmYWxzZSwgcHJvdGVjdGVkIGlzVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbk1hdHJpeCA9IDxRdWVzdGlvbk1hdHJpeE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWZXJ0aWNhbCA/XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNWZXJ0aWNhbGx5Q2VsbHMocG9pbnQpIDpcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0hvcml6b250YWxseUNlbGxzKHBvaW50KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlVGV4dENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBjb2x1bW46IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY2hlY2tlZDogYm9vbGVhbiA9IHRoaXMucm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlciksIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgY29uc3QgcmFkaW9GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oaXRlbVJlY3QsIGNvbHVtbiwgaW5kZXgsIHRoaXMua2V5LCBjaGVja2VkKTtcbiAgICAgICAgY3VyclBvaW50LnlUb3AgPSByYWRpb0ZsYXQueUJvdCArIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgY2VsbFRleHRGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbk1hdHJpeC5nZXRDZWxsRGlzcGxheUxvY1RleHQodGhpcy5yb3cubmFtZSwgY29sdW1uKSwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhyYWRpb0ZsYXQsIGNlbGxUZXh0RmxhdCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUl0ZW1Db21wb2lzdGUocG9pbnQ6IElQb2ludCwgY29sdW1uOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJhZGlvRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgaXRlbVJlY3QueExlZnQpLCBjb2x1bW4sIGluZGV4LCB0aGlzLmtleSwgY2hlY2tlZCk7XG4gICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHJhZGlvRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgcmFkaW9UZXh0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBjb2x1bW4ubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhyYWRpb0ZsYXQsIHJhZGlvVGV4dCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQ6IElQb2ludCkge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjb2xDb3VudDogbnVtYmVyID0gdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1ucy5sZW5ndGggKyAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzID8gMSA6IDApO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQsIDApO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbjogSXRlbVZhbHVlID0gdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5OdW1iZXI6IG51bWJlciA9IHRoaXMucXVlc3Rpb25NYXRyaXguaGFzUm93cyA/IGkgKyAxIDogaTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgY29sdW1uTnVtYmVyKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNDZWxsVGV4dCkge1xuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUoY3VyclBvaW50LCBjb2x1bW4sIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgY3VyclBvaW50LnhMZWZ0KSwgY29sdW1uLCBpLCB0aGlzLmtleSwgY2hlY2tlZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5jZWxscyk7XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlQnJpY2ssIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlQnJpY2spLCB0aGlzLmNvbnRyb2xsZXIpXTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNWZXJ0aWNhbGx5Q2VsbHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY2VsbHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzUm93cykge1xuICAgICAgICAgICAgY29uc3Qgcm93VGV4dEZsYXQgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgdGhpcy5yb3cubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93VGV4dEZsYXQueUJvdCArIEZsYXRRdWVzdGlvbi5DT05URU5UX0dBUF9WRVJUX1NDQUxFICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBjZWxscy5wdXNoKHJvd1RleHRGbGF0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZSA9ICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc0NlbGxUZXh0KSA/IHRoaXMuZ2VuZXJhdGVUZXh0Q29tcG9zaXRlIDogdGhpcy5nZW5lcmF0ZUl0ZW1Db21wb2lzdGU7XG4gICAgICAgIGNlbGxzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnMpKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2s6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmNlbGxzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnbWF0cml4JywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXgnLCB7XG4gICAgbmFtZTogJ3JlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ2xpc3QnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtYXRyaXgnLCBGbGF0TWF0cml4KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgRmxhdE1hdHJpeE11bHRpcGxlIH0gZnJvbSAnLi9mbGF0X21hdHJpeG11bHRpcGxlJztcblxuZXhwb3J0IGNsYXNzIEZsYXRNYXRyaXhEeW5hbWljIGV4dGVuZHMgRmxhdE1hdHJpeE11bHRpcGxlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIGZhbHNlKTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeGR5bmFtaWMnLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ21hdHJpeGR5bmFtaWMnLCB7XG4gICAgbmFtZTogJ3JlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ2xpc3QnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtYXRyaXhkeW5hbWljJywgRmxhdE1hdHJpeER5bmFtaWMpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeGR5bmFtaWMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwsIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24sIElGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEZsYXRUZXh0Ym94IH0gZnJvbSAnLi9mbGF0X3RleHRib3gnO1xuXG5leHBvcnQgY2xhc3MgRmxhdE11bHRpcGxlVGV4dCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBST1dTX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4xOTU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCByb3dfaW5kZXg6IG51bWJlciwgY29sX2luZGV4OiBudW1iZXIsXG4gICAgICAgIGl0ZW06IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb2xXaWR0aCAqIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBjcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5sb2NUaXRsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuXG4gICAgICAgIGNvbnN0IGZsYXRNdWx0aXBsZVRleHRJdGVtUXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LCBpdGVtLmVkaXRvciwgdGhpcy5jb250cm9sbGVyLCAndGV4dCcpO1xuICAgICAgICBjb25zdCBpdGVtUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlMsIHlUb3A6IHBvaW50LnlUb3AgfSxcbiAgICAgICAgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayguLi5hd2FpdCAoPEZsYXRUZXh0Ym94PmZsYXRNdWx0aXBsZVRleHRJdGVtUXVlc3Rpb24pLmdlbmVyYXRlRmxhdHNDb250ZW50KGl0ZW1Qb2ludCkpO1xuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMucXVlc3Rpb24uZ2V0Um93cygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgcm93c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5jb2xDb3VudCwgaik7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGksIGosIHJvd3NbaV1bal0pO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TXVsdGlwbGVUZXh0LlJPV1NfR0FQX1NDQUxFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtdWx0aXBsZXRleHQnLCBGbGF0TXVsdGlwbGVUZXh0KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UGFuZWxEeW5hbWljIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWw7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBHQVBfQkVUV0VFTl9QQU5FTFM6IG51bWJlciA9IDAuNzU7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAoY29uc3QgcGFuZWwgb2YgdGhpcy5xdWVzdGlvbi5wYW5lbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgcGFuZWwsIGN1cnJQb2ludCk7XG4gICAgICAgICAgICBpZiAocGFuZWxGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnBhbmVsRmxhdHMpLnlCb3Q7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UGFuZWxEeW5hbWljLkdBUF9CRVRXRUVOX1BBTkVMUztcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLnBhbmVsRmxhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3BhbmVsZHluYW1pYycsIEZsYXRQYW5lbER5bmFtaWMpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBSYW5raW5nSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmFua2luZyBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhbmtpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhbmtpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0V2lkdGgsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgY29uc3QgaXRlbVNjYWxlZFJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLm1vdmVSZWN0KFN1cnZleUhlbHBlci5zY2FsZVJlY3QoXG4gICAgICAgICAgICBpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBwb2ludC54TGVmdCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBuZXcgUmFua2luZ0l0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICBpdGVtU2NhbGVkUmVjdCwgdGhpcy5xdWVzdGlvbi5nZXROdW1iZXJCeUluZGV4KGluZGV4KSk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IHRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICB0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKGl0ZW1GbGF0LCB0ZXh0RmxhdCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlc1tpXSwgaSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmFua2luZycsIEZsYXRSYW5raW5nKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmF0aW5nTW9kZWwsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYXRpbmcgZXh0ZW5kcyBGbGF0UmFkaW9ncm91cCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uUmF0aW5nOiBRdWVzdGlvblJhdGluZ01vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nID0gPFF1ZXN0aW9uUmF0aW5nTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRIb3Jpc29udGFsQ29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dChcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcsIGluZGV4LCBpdGVtLmxvY1RleHQpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29uc3QgaGFsZldpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoIC8gMi4wO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gaGFsZldpZHRoO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdCh0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb25SYXRpbmcsIHRoaXMuY29udHJvbGxlciwgaXRlbVRleHQpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgbGV0IHRleHRXaWR0aDogbnVtYmVyID0gY29tcG9zaXRlRmxhdC53aWR0aDtcbiAgICAgICAgaWYgKHRleHRXaWR0aCA8IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LnhMZWZ0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgoXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAtIHRleHRXaWR0aCkgLyAyLjAgLSBoYWxmV2lkdGg7XG4gICAgICAgICAgICB0ZXh0V2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRleHRXaWR0aCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhZGlvUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgcmFkaW9Qb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChcbiAgICAgICAgICAgIHJhZGlvUG9pbnQsIHRleHRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpLCBpdGVtLCBpbmRleCkpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCBpdGVtVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nSXRlbVRleHQodGhpcy5xdWVzdGlvblJhdGluZywgaW5kZXgsIGl0ZW0ubG9jVGV4dCk7XG4gICAgICAgIGl0ZW1UZXh0ID09IG51bGwgfHwgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICB0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbVRleHQsIFRleHRCcmljaykpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQ6IElQb2ludCkge1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRIb3Jpc29udGFsQ29tcG9zaXRlKGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzW2ldLCBpKTtcbiAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgY29uc3QgbGVmdFdpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBpdGVtRmxhdC54UmlnaHQ7XG4gICAgICAgICAgICBpZiAoU3VydmV5SGVscGVyLmdldFJhdGluZ01pbldpZHRoKHRoaXMuY29udHJvbGxlcikgPD0gbGVmdFdpZHRoICsgU3VydmV5SGVscGVyLkVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3Q7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBsZXQgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcsIGksIHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXNbaV0ubG9jVGV4dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KGl0ZW1UZXh0KS53aWR0aCA+IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuUkFUSU5HX0NPTFVNTl9XSURUSCkud2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNWZXJ0aWNhbCA/IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQsIHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMpIDogdGhpcy5nZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50KTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3JhdGluZycsIEZsYXRSYXRpbmcpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhdGluZy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRTaWduYXR1cmVQYWQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBsZXQgaW1hZ2VCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmFsdWUsXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi53aWR0aCksXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5oZWlnaHQpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbaW1hZ2VCcmlja107XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdzaWduYXR1cmVwYWQnLCBGbGF0U2lnbmF0dXJlUGFkKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym94JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFRleHRib3ggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVDogbnVtYmVyID0gMTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyLnRleHRGaWVsZFJlbmRlckFzID09PSAnc2luZ2xlTGluZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBUZXh0Qm94QnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIEZsYXRUZXh0Ym94Lk1VTFRJTElORV9URVhUX1JPV1NfQ09VTlQsIHRydWUpXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3RleHQnLCBGbGF0VGV4dGJveCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfdGV4dGJveC50cyIsImltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcblxuICAgIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByaXZhdGUgcmVuZGVyRnVuYzogKGRvYzogYW55LCBxdWVzdGlvbjogYW55LCB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIpID0+IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZW5kZXJGdW5jKGNvbnRyb2xsZXIuaGVscGVyRG9jLCBxdWVzdGlvbiwgMCwgMCkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckZ1bmModGhpcy5jb250cm9sbGVyLmRvYywgdGhpcy5xdWVzdGlvbiwgdGhpcy54TGVmdCwgdGhpcy55VG9wKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jdXN0b20udHMiLCJpbXBvcnQgeyBTdXJ2ZXlNb2RlbCwgRXZlbnQsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSURvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5JztcbmltcG9ydCB7IFBhZ2VQYWNrZXIgfSBmcm9tICcuL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRXZlbnRBc3luYywgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXInO1xuaW1wb3J0IHsgRHJhd0NhbnZhcyB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9kcmF3X2NhbnZhcyc7XG5pbXBvcnQgeyBBZG9ybmVyc09wdGlvbnMsIEFkb3JuZXJzUGFuZWxPcHRpb25zLCBBZG9ybmVyc1BhZ2VPcHRpb25zIH0gZnJvbSAnLi9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4vaGVscGVyX3N1cnZleSc7XG5cbi8qKlxuICogU3VydmV5UERGIG9iamVjdCBjb250YWlucyBvcHRpb25zLCBldmVudHMgYW5kIG1ldGhvZHMgdG8gZXhwb3J0IFBERlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5UERGIGV4dGVuZHMgU3VydmV5TW9kZWwge1xuICAgIHByaXZhdGUgX2hhdmVDb21tZXJjaWFsTGljZW5zZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgb3B0aW9uczogSURvY09wdGlvbnM7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGpzb25PYmplY3Q6IGFueSwgb3B0aW9ucz86IElEb2NPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGpzb25PYmplY3QpO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9oYXZlQ29tbWVyY2lhbExpY2Vuc2UgPSBvcHRpb25zLmNvbW1lcmNpYWwgfHwgb3B0aW9ucy5oYXZlQ29tbWVyY2lhbExpY2Vuc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFlvdSBoYXZlIHJpZ2h0IHRvIHNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgaWYgeW91IGhhdmUgYm91Z2h0IHRoZSBjb21tZXJjaWFsIGxpY2VuY2Ugb25seS5cbiAgICAgKiBJdCB3aWxsIHJlbW92ZSB0aGUgdGV4dCBhYm91dCBub24tY29tbWVyaWNhbCB1c2FnZSBvbiB0aGUgdG9wIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgdHJ1ZSB3aXRob3V0IGhhdmluZyBhIGNvbW1lcmNpYWwgbGljZW5jZSBpcyBpbGxlZ2FsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXZlQ29tbWVyY2lhbExpY2Vuc2U7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9oYXZlQ29tbWVyY2lhbExpY2Vuc2UgPSB2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpbiBmaXJlZCBmb3IgZXZlcnkgcmVuZGVyZWQgcGFnZVxuICAgICAqIEBwYXJhbSBzdXJ2ZXkgU3VydmV5UERGIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSBjYW52YXMgRHJhd0NhbnZhcyBvYmplY3QgdGhhdCB5b3UgbWF5IHVzZSBpdCB0byBkcmF3IHRleHQgYW5kIGltYWdlcyBpbiB0aGUgcGFnZSBoZWFkZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJIZWFkZXI6IEV2ZW50PChzdXJ2ZXk6IFN1cnZleVBERiwgY2FudmFzOiBEcmF3Q2FudmFzKSA9PiBhbnksIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnQ8KHN1cnZleTogU3VydmV5UERGLCBjYW52YXM6IERyYXdDYW52YXMpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpbiBmaXJlZCBmb3IgZXZlcnkgcmVuZGVyZWQgcGFnZVxuICAgICAqIEBwYXJhbSBzdXJ2ZXkgU3VydmV5UERGIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSBjYW52YXMgRHJhd0NhbnZhcyBvYmplY3QgdGhhdCB5b3UgbWF5IHVzZSBpdCB0byBkcmF3IHRleHQgYW5kIGltYWdlcyBpbiB0aGUgcGFnZSBmb290ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJGb290ZXI6IEV2ZW50PChzdXJ2ZXk6IFN1cnZleVBERiwgY2FudmFzOiBEcmF3Q2FudmFzKSA9PiBhbnksIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnQ8KHN1cnZleTogU3VydmV5UERGLCBjYW52YXM6IERyYXdDYW52YXMpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpbiBmaXJlZCBmb3IgZXZlcnkgcmVuZGVyZWQgcXVlc3Rpb25cbiAgICAgKiBAcGFyYW0gc3VydmV5IFN1cnZleVBERiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZG9ybmVyc09wdGlvbnMgb2JqZWN0IHRoYXQgaGF2ZSBvcHRpb25zIHRvIGN1c3RvbSByZW5kZXIgdGhlIHF1ZXN0aW9uXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUXVlc3Rpb246IEV2ZW50QXN5bmM8KHN1cnZleTogU3VydmV5UERGLCBvcHRpb25zOiBBZG9ybmVyc09wdGlvbnMpID0+IGFueSwgYW55PiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPChzdXJ2ZXk6IFN1cnZleVBERiwgb3B0aW9uczogQWRvcm5lcnNPcHRpb25zKSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaW4gZmlyZWQgZm9yIGV2ZXJ5IHJlbmRlcmVkIHBhbmVsXG4gICAgICogQHBhcmFtIHN1cnZleSBTdXJ2ZXlQREYgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIG9wdGlvbnMgQWRvcm5lcnNQYW5lbE9wdGlvbnMgb2JqZWN0IHRoYXQgaGF2ZSBvcHRpb25zIHRvIGN1c3RvbSByZW5kZXIgdGhlIHBhbmVsXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFuZWw6IEV2ZW50QXN5bmM8KHN1cnZleTogU3VydmV5UERGLCBvcHRpb25zOiBBZG9ybmVyc1BhbmVsT3B0aW9ucykgPT4gYW55LCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8KHN1cnZleTogU3VydmV5UERGLCBvcHRpb25zOiBBZG9ybmVyc1BhbmVsT3B0aW9ucykgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGluIGZpcmVkIGZvciBldmVyeSByZW5kZXJlZCBwYWdlXG4gICAgICogQHBhcmFtIHN1cnZleSBTdXJ2ZXlQREYgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIG9wdGlvbnMgQWRvcm5lcnNQYWdlT3B0aW9ucyBvYmplY3QgdGhhdCBoYXZlIG9wdGlvbnMgdG8gY3VzdG9tIHJlbmRlciB0aGUgcGFnZVxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlclBhZ2U6IEV2ZW50QXN5bmM8KHN1cnZleTogU3VydmV5UERGLCBvcHRpb25zOiBBZG9ybmVyc1BhZ2VPcHRpb25zKSA9PiBhbnksIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzUGFnZU9wdGlvbnMpID0+IGFueSwgYW55PigpO1xuICAgIHByaXZhdGUgd2FpdEZvclF1ZXN0aW9uSXNSZWFkeShxdWVzdGlvbjogUXVlc3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWR5KSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZHlDYWxsYmFjazogKHNlbmRlcjogUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkgPT4gdm9pZCA9XG4gICAgICAgICAgICAgICAgKF8sIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc1JlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbi5vblJlYWR5Q2hhbmdlZC5yZW1vdmUocmVhZHlDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHF1ZXN0aW9uLm9uUmVhZHlDaGFuZ2VkLmFkZChyZWFkeUNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgd2FpdEZvckNvcmVJc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IHF1ZXN0aW9uIG9mIHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCkpIHtcbiAgICAgICAgICAgIGlmICghISg8YW55PnF1ZXN0aW9uKS5jb250ZW50UGFuZWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0OiBRdWVzdGlvbltdID0gW107XG4gICAgICAgICAgICAgICAgKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRQYW5lbC5hZGRRdWVzdGlvbnNUb0xpc3QobGlzdCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbm5lclF1ZXN0aW9uIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yUXVlc3Rpb25Jc1JlYWR5KGlubmVyUXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhpcy53YWl0Rm9yUXVlc3Rpb25Jc1JlYWR5KFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRDb250ZW50UXVlc3Rpb24oPFF1ZXN0aW9uPnF1ZXN0aW9uKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyByZW5kZXJTdXJ2ZXkoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JDb3JlSXNSZWFkeSgpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0cyh0aGlzLCBjb250cm9sbGVyKTtcbiAgICAgICAgY29uc3QgcGFja3M6IElQZGZCcmlja1tdW10gPSBQYWdlUGFja2VyLnBhY2soZmxhdHMsIGNvbnRyb2xsZXIpO1xuICAgICAgICBFdmVudEhhbmRsZXIucHJvY2Vzc19oZWFkZXJfZXZlbnRzKHRoaXMsIGNvbnRyb2xsZXIsIHBhY2tzKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgcGFja3NbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5nZXROdW1iZXJPZlBhZ2VzKCkgPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hZGRQYWdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuc2V0UGFnZShpKTtcbiAgICAgICAgICAgICAgICAvL2dpem1vcyBicmlja3MgYm9yZGVycyBmb3IgZGVidWdcbiAgICAgICAgICAgICAgICAvLyBwYWNrc1tpXVtqXS51bmZvbGQoKS5mb3JFYWNoKChyZWN0OiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKCdncmVlbicpO1xuICAgICAgICAgICAgICAgIC8vICAgICBjb250cm9sbGVyLmRvYy5yZWN0KC4uLlN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QocmVjdCkpO1xuICAgICAgICAgICAgICAgIC8vICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoJ2JsYWNrJyk7XG4gICAgICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBwYWNrc1tpXVtqXS5yZW5kZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHNhdmUgbWV0aG9kIG9mIHN1cnZleVBERiBvYmplY3QgdG8gZG93bmxvYWQgZmlsZSBpbiBicm93c2VyLiBUaGlzIGlzIGFzeW5jaHJvbm91cyBtZXRob2RcbiAgICAgKiBAcGFyYW0gZmlsZU5hbWUgb3B0aW9uYWwgZmlsZW5hbWUgcGFyYW1ldGVyXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNhdmUoZmlsZU5hbWU6IHN0cmluZyA9ICdzdXJ2ZXlfcmVzdWx0LnBkZicpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbmV3IERvY0NvbnRyb2xsZXIodGhpcy5vcHRpb25zKTtcbiAgICAgICAgU3VydmV5SGVscGVyLmZpeEZvbnQoY29udHJvbGxlcik7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyU3VydmV5KGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2Muc2F2ZShmaWxlTmFtZSwgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHJhdyBtZXRob2Qgb2Ygc3VydmV5UERGIHRvIGdldCBQREYgZG9jdW1lbnQgYXMgc3RyaW5nIG9iamVjdC4gVGhpcyBpcyBhc3luY2hyb25vdXMgbWV0aG9kXG4gICAgICogQHBhcmFtIHR5cGUgb21pdCB0byBnZXQgcmF3IHN0cmluZywgb3IgcGFzcyBcImJsb2JcIiwgXCJibG9idXJsXCIgb3IgXCJkYXRhdXJsc3RyaW5nXCJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmF3KHR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbmV3IERvY0NvbnRyb2xsZXIodGhpcy5vcHRpb25zKTtcbiAgICAgICAgU3VydmV5SGVscGVyLmZpeEZvbnQoY29udHJvbGxlcik7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyU3VydmV5KGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2Mub3V0cHV0KHR5cGUpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXkudHMiLCJcInVzZSBzdHJpY3RcIjtcclxuLy8gQW4gYXVnbWVudGVkIEFWTCBUcmVlIHdoZXJlIGVhY2ggbm9kZSBtYWludGFpbnMgYSBsaXN0IG9mIHJlY29yZHMgYW5kIHRoZWlyIHNlYXJjaCBpbnRlcnZhbHMuXHJcbi8vIFJlY29yZCBpcyBjb21wb3NlZCBvZiBhbiBpbnRlcnZhbCBhbmQgaXRzIHVuZGVybHlpbmcgZGF0YSwgc2VudCBieSBhIGNsaWVudC4gVGhpcyBhbGxvd3MgdGhlXHJcbi8vIGludGVydmFsIHRyZWUgdG8gaGF2ZSB0aGUgc2FtZSBpbnRlcnZhbCBpbnNlcnRlZCBtdWx0aXBsZSB0aW1lcywgYXMgbG9uZyBpdHMgZGF0YSBpcyBkaWZmZXJlbnQuXHJcbi8vIEJvdGggaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiByZXF1aXJlIE8obG9nIG4pIHRpbWUuIFNlYXJjaGluZyByZXF1aXJlcyBPKGsqbG9nbikgdGltZSwgd2hlcmUgYGtgXHJcbi8vIGlzIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzIGluIHRoZSBvdXRwdXQgbGlzdC5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgaXNTYW1lID0gcmVxdWlyZShcInNoYWxsb3dlcXVhbFwiKTtcclxuZnVuY3Rpb24gaGVpZ2h0KG5vZGUpIHtcclxuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XHJcbiAgICB9XHJcbn1cclxudmFyIE5vZGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBOb2RlKGludGVydmFsVHJlZSwgcmVjb3JkKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUgPSBpbnRlcnZhbFRyZWU7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRzID0gW107XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMua2V5ID0gcmVjb3JkLmxvdztcclxuICAgICAgICB0aGlzLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgIC8vIFNhdmUgdGhlIGFycmF5IG9mIGFsbCByZWNvcmRzIHdpdGggdGhlIHNhbWUga2V5IGZvciB0aGlzIG5vZGVcclxuICAgICAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xyXG4gICAgfVxyXG4gICAgLy8gR2V0cyB0aGUgaGlnaGVzdCByZWNvcmQuaGlnaCB2YWx1ZSBmb3IgdGhpcyBub2RlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5nZXROb2RlSGlnaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaGlnaCA9IHRoaXMucmVjb3Jkc1swXS5oaWdoO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZHNbaV0uaGlnaCA+IGhpZ2gpIHtcclxuICAgICAgICAgICAgICAgIGhpZ2ggPSB0aGlzLnJlY29yZHNbaV0uaGlnaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGlnaDtcclxuICAgIH07XHJcbiAgICAvLyBVcGRhdGVzIGhlaWdodCB2YWx1ZSBvZiB0aGUgbm9kZS4gQ2FsbGVkIGR1cmluZyBpbnNlcnRpb24sIHJlYmFsYW5jZSwgcmVtb3ZhbFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0KHRoaXMubGVmdCksIGhlaWdodCh0aGlzLnJpZ2h0KSkgKyAxO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgdGhlIG1heCB2YWx1ZSBvZiBhbGwgdGhlIHBhcmVudHMgYWZ0ZXIgaW5zZXJ0aW5nIGludG8gYWxyZWFkeSBleGlzdGluZyBub2RlLCBhcyB3ZWxsIGFzXHJcbiAgICAvLyByZW1vdmluZyB0aGUgbm9kZSBjb21wbGV0ZWx5IG9yIHJlbW92aW5nIHRoZSByZWNvcmQgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBub2RlLiBTdGFydHMgd2l0aFxyXG4gICAgLy8gdGhlIHBhcmVudCBvZiBhbiBhZmZlY3RlZCBub2RlIGFuZCBidWJibGVzIHVwIHRvIHJvb3RcclxuICAgIE5vZGUucHJvdG90eXBlLnVwZGF0ZU1heE9mUGFyZW50cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLnJpZ2h0Lm1heCwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKlxyXG4gICAgTGVmdC1MZWZ0IGNhc2U6XHJcbiAgXHJcbiAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVxyXG4gICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgICAgIHkgICBUNCAgICAgIFJpZ2h0IFJvdGF0ZSAoeikgICAgICAgICAgeCAgICAgelxyXG4gICAgICAgIC8gXFwgICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAgIC8gXFwgICAvIFxcXHJcbiAgICAgICB4ICAgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgIC8gXFxcclxuICAgIFQxICAgVDJcclxuICBcclxuICAgIExlZnQtUmlnaHQgY2FzZTpcclxuICBcclxuICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgIHkgICBUNCAgTGVmdCBSb3RhdGUgKHkpICAgICAgICAgeCAgVDQgIFJpZ2h0IFJvdGF0ZSh6KSAgICAgeSAgICAgelxyXG4gICAgICAvIFxcICAgICAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgICAgLSAtIC0gLSAtIC0gLSAtPiAgLyBcXCAgIC8gXFxcclxuICAgIFQxICAgeCAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgIFQzICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcXHJcbiAgICAgIFQyICAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDJcclxuICAgICovXHJcbiAgICAvLyBIYW5kbGVzIExlZnQtTGVmdCBjYXNlIGFuZCBMZWZ0LVJpZ2h0IGNhc2UgYWZ0ZXIgcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICB2YXIgbGVmdCA9IHBhcmVudC5sZWZ0O1xyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgbGVmdCBzaWJsaW5nICh4IGluIGZpcnN0IGNhc2UsIHkgaW4gc2Vjb25kKVxyXG4gICAgICAgIHZhciB0aGlzUGFyZW50TGVmdEhpZ2ggPSBsZWZ0LmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsZWZ0LmxlZnQgIT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50TGVmdEhpZ2gsIGxlZnQubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsZWZ0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSB0aGlzUGFyZW50TGVmdEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KGxlZnQubGVmdC5tYXgsIGxlZnQucmlnaHQubWF4KSwgdGhpc1BhcmVudExlZnRIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBpdHNlbGYgKHopXHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBwYXJlbnQgKHkgaW4gZmlyc3QgY2FzZSwgeCBpbiBzZWNvbmQpXHJcbiAgICAgICAgcGFyZW50Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHBhcmVudC5sZWZ0Lm1heCwgcGFyZW50LnJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICAvKlxyXG4gICAgUmlnaHQtUmlnaHQgY2FzZTpcclxuICBcclxuICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgIFQxICB5ICAgICBMZWZ0IFJvdGF0ZSh6KSAgICAgICB6ICAgICB4XHJcbiAgICAgICAvIFxcICAgLSAtIC0gLSAtIC0gLSAtPiAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgVDIgIHggICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAgLyBcXFxyXG4gICAgICAgIFQzIFQ0XHJcbiAgXHJcbiAgICBSaWdodC1MZWZ0IGNhc2U6XHJcbiAgXHJcbiAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgIFQxICB5ICAgUmlnaHQgUm90YXRlICh5KSAgICAgVDEgIHggICAgICBMZWZ0IFJvdGF0ZSh6KSAgIHogICAgIHlcclxuICAgICAgICAvIFxcICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAvIFxcICAgLSAtIC0gLSAtIC0gLSAtPiAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggIFQ0ICAgICAgICAgICAgICAgICAgICAgICAgVDIgIHkgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgIFQyICAgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICBUMyBUNFxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgUmlnaHQtUmlnaHQgY2FzZSBhbmQgUmlnaHQtTGVmdCBjYXNlIGluIHJlYmFsYW5jaW5nIEFWTCB0cmVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5fdXBkYXRlTWF4QWZ0ZXJMZWZ0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICB2YXIgcmlnaHQgPSBwYXJlbnQucmlnaHQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiByaWdodCBzaWJsaW5nICh4IGluIGZpcnN0IGNhc2UsIHkgaW4gc2Vjb25kKVxyXG4gICAgICAgIHZhciB0aGlzUGFyZW50UmlnaHRIaWdoID0gcmlnaHQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAocmlnaHQubGVmdCA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudFJpZ2h0SGlnaCwgcmlnaHQucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmlnaHQubGVmdCAhPT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudFJpZ2h0SGlnaCwgcmlnaHQubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSB0aGlzUGFyZW50UmlnaHRIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocmlnaHQubGVmdC5tYXgsIHJpZ2h0LnJpZ2h0Lm1heCksIHRoaXNQYXJlbnRSaWdodEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCByaWdodC5tYXgpLCBwYXJlbnQuZ2V0Tm9kZUhpZ2goKSk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX2xlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJpZ2h0Q2hpbGQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKHJpZ2h0Q2hpbGQucGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUucm9vdCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQubGVmdCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50LnJpZ2h0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHRDaGlsZC5sZWZ0O1xyXG4gICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByaWdodENoaWxkLmxlZnQgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIHJpZ2h0Q2hpbGQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JpZ2h0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBsZWZ0Q2hpbGQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgbGVmdENoaWxkLnBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChsZWZ0Q2hpbGQucGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUucm9vdCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChsZWZ0Q2hpbGQucGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9IGxlZnRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChsZWZ0Q2hpbGQucGFyZW50LnJpZ2h0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0Q2hpbGQucGFyZW50LnJpZ2h0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnRDaGlsZC5yaWdodDtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxlZnRDaGlsZC5yaWdodCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICBsZWZ0Q2hpbGQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gICAgLy8gUmViYWxhbmNlcyB0aGUgdHJlZSBpZiB0aGUgaGVpZ2h0IHZhbHVlIGJldHdlZW4gdHdvIG5vZGVzIG9mIHRoZSBzYW1lIHBhcmVudCBpcyBncmVhdGVyIHRoYW5cclxuICAgIC8vIHR3by4gVGhlcmUgYXJlIDQgY2FzZXMgdGhhdCBjYW4gaGFwcGVuIHdoaWNoIGFyZSBvdXRsaW5lZCBpbiB0aGUgZ3JhcGhpY3MgYWJvdmVcclxuICAgIE5vZGUucHJvdG90eXBlLl9yZWJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKGhlaWdodCh0aGlzLmxlZnQpID49IDIgKyBoZWlnaHQodGhpcy5yaWdodCkpIHtcclxuICAgICAgICAgICAgdmFyIGxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHQobGVmdC5sZWZ0KSA+PSBoZWlnaHQobGVmdC5yaWdodCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIExlZnQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1SaWdodCBjYXNlXHJcbiAgICAgICAgICAgICAgICBsZWZ0Ll9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlaWdodCh0aGlzLnJpZ2h0KSA+PSAyICsgaGVpZ2h0KHRoaXMubGVmdCkpIHtcclxuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChyaWdodC5yaWdodCkgPj0gaGVpZ2h0KHJpZ2h0LmxlZnQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSaWdodC1SaWdodCBjYXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LUxlZnQgY2FzZVxyXG4gICAgICAgICAgICAgICAgcmlnaHQuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBJbnNlcnQgaW50byBsZWZ0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQgPSBuZXcgTm9kZSh0aGlzLmludGVydmFsVHJlZSwgcmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJbnNlcnQgaW50byByaWdodCBzdWJ0cmVlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQgPSBuZXcgTm9kZSh0aGlzLmludGVydmFsVHJlZSwgcmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtYXggdmFsdWUgb2YgdGhpcyBhbmNlc3RvciBpZiBuZWVkZWRcclxuICAgICAgICBpZiAodGhpcy5tYXggPCByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgaGVpZ2h0IG9mIGVhY2ggbm9kZVxyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgLy8gUmViYWxhbmNlIHRoZSB0cmVlIHRvIGVuc3VyZSBhbGwgb3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gTyhsb2duKSB0aW1lLiBUaGlzIGlzIGVzcGVjaWFsbHlcclxuICAgICAgICAvLyBpbXBvcnRhbnQgaW4gc2VhcmNoaW5nLCBhcyB0aGUgdHJlZSBoYXMgYSBoaWdoIGNoYW5jZSBvZiBkZWdlbmVyYXRpbmcgd2l0aG91dCB0aGUgcmViYWxhbmNpbmdcclxuICAgICAgICB0aGlzLl9yZWJhbGFuY2UoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlLCBsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAoY3VycmVudE5vZGUua2V5IDw9IGhpZ2ggJiYgbG93IDw9IGN1cnJlbnROb2RlLmdldE5vZGVIaWdoKCkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZXMgYXJlIG92ZXJsYXBwaW5nLCBjaGVjayBpZiBpbmRpdmlkdWFsIHJlY29yZHMgaW4gdGhlIG5vZGUgYXJlIG92ZXJsYXBwaW5nXHJcbiAgICAgICAgICAgIHZhciB0ZW1wUmVzdWx0cyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5yZWNvcmRzW2ldLmhpZ2ggPj0gbG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcFJlc3VsdHMucHVzaChjdXJyZW50Tm9kZS5yZWNvcmRzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGVtcFJlc3VsdHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgLy8gRG9uJ3Qgc2VhcmNoIG5vZGVzIHRoYXQgZG9uJ3QgZXhpc3RcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxlZnRTZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgb3duU2VhcmNoID0gW107XHJcbiAgICAgICAgdmFyIHJpZ2h0U2VhcmNoID0gW107XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgcG9pbnQgb2YgYW55IGludGVydmFsIGluIHRoaXMgbm9kZSBhbmQgYWxsIGl0c1xyXG4gICAgICAgIC8vIGNoaWxkcmVuLCB0aGVyZSB3b24ndCBiZSBhbnkgbWF0Y2hlc1xyXG4gICAgICAgIGlmIChsb3cgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlYXJjaCBsZWZ0IGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGVmdC5tYXggPj0gbG93KSB7XHJcbiAgICAgICAgICAgIGxlZnRTZWFyY2ggPSB0aGlzLmxlZnQuc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoZWNrIHRoaXMgbm9kZVxyXG4gICAgICAgIG93blNlYXJjaCA9IHRoaXMuX2dldE92ZXJsYXBwaW5nUmVjb3Jkcyh0aGlzLCBsb3csIGhpZ2gpO1xyXG4gICAgICAgIC8vIElmIGludGVydmFsIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBzdGFydCBvZiB0aGlzIGludGVydmFsLCB0aGVuIGl0IGNhbid0IGJlIGluIGFueSBjaGlsZCB0b1xyXG4gICAgICAgIC8vIHRoZSByaWdodFxyXG4gICAgICAgIGlmIChoaWdoIDwgdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxlZnRTZWFyY2guY29uY2F0KG93blNlYXJjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2VhcmNoIHJpZ2h0IGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodFNlYXJjaCA9IHRoaXMucmlnaHQuc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJldHVybiBhY2N1bXVsYXRlZCByZXN1bHRzLCBpZiBhbnlcclxuICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoLCByaWdodFNlYXJjaCk7XHJcbiAgICB9O1xyXG4gICAgLy8gU2VhcmNoZXMgZm9yIGEgbm9kZSBieSBhIGBrZXlgIHZhbHVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5zZWFyY2hFeGlzdGluZyA9IGZ1bmN0aW9uIChsb3cpIHtcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmtleSA9PT0gbG93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsb3cgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuc2VhcmNoRXhpc3RpbmcobG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQuc2VhcmNoRXhpc3RpbmcobG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuICAgIC8vIFJldHVybnMgdGhlIHNtYWxsZXN0IG5vZGUgb2YgdGhlIHN1YnRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl9taW5WYWx1ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Ll9taW5WYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAobm9kZS5rZXkgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlIHRvIGJlIHJlbW92ZWQgaXMgb24gdGhlIGxlZnQgc2lkZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA+IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIGhhcyB0d28gY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIHZhciBtaW5WYWx1ZSA9IHRoaXMucmlnaHQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleSA9IG1pblZhbHVlLmtleTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkcyA9IG1pblZhbHVlLnJlY29yZHM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZW1vdmUodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uZSBjaGlsZCBvciBubyBjaGlsZCBjYXNlIG9uIGxlZnQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5sZWZ0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5sZWZ0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5fcmViYWxhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uZSBjaGlsZCBvciBubyBjaGlsZCBjYXNlIG9uIHJpZ2h0IHNpZGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJpZ2h0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5fcmViYWxhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gTm9kZTtcclxufSgpKTtcclxuZXhwb3J0cy5Ob2RlID0gTm9kZTtcclxudmFyIEludGVydmFsVHJlZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEludGVydmFsVHJlZSgpIHtcclxuICAgICAgICB0aGlzLmNvdW50ID0gMDtcclxuICAgIH1cclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmIChyZWNvcmQubG93ID4gcmVjb3JkLmhpZ2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgbG93YCB2YWx1ZSBtdXN0IGJlIGxvd2VyIG9yIGVxdWFsIHRvIGBoaWdoYCB2YWx1ZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gQmFzZSBjYXNlOiBUcmVlIGlzIGVtcHR5LCBuZXcgbm9kZSBiZWNvbWVzIHJvb3RcclxuICAgICAgICAgICAgdGhpcy5yb290ID0gbmV3IE5vZGUodGhpcywgcmVjb3JkKTtcclxuICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgaWYgbm9kZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIGtleVxyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlY29yZHMgaW4gdGhpcyBub2RlIGlmIHRoZXJlIGFscmVhZHkgaXMgdGhlIG9uZSB3aXRoIHNhbWUgbG93LCBoaWdoLCBkYXRhXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzW2ldLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVjb3JkIGlzIHNhbWUgYXMgdGhlIG9uZSB3ZSdyZSB0cnlpbmcgdG8gaW5zZXJ0OyByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBoYXMgYmVlbiBpbnNlcnRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZWNvcmQgdG8gdGhlIG5vZGVcclxuICAgICAgICAgICAgICAgIG5vZGUucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHRoZSBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuaGlnaCA+IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSByZWNvcmQuaGlnaDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiBDYWxsIGluc2VydCBmdW5jdGlvbiBvbiByb290J3Mgbm9kZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFRyZWUgaXMgZW1wdHk7IHJldHVybiBlbXB0eSBhcnJheVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LnNlYXJjaChsb3csIGhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgbm90aGluZyB0byByZW1vdmVcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnJvb3Quc2VhcmNoRXhpc3RpbmcocmVjb3JkLmxvdyk7XHJcbiAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlbW92ZWRSZWNvcmQgPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIDIgb3IgbW9yZSByZWNvcmRzLiBGaW5kIHRoZSBvbmUgd2UgbmVlZCBhbmQgcmVtb3ZlIGl0XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzW2ldLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRSZWNvcmQgPSBub2RlLnJlY29yZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVjb3Jkcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkUmVjb3JkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHRoYXQgbm9kZSBhbmQgaXRzIHBhcmVudHMgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID09PSBub2RlLm1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZUhpZ2ggPSBub2RlLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZS5yaWdodC5tYXgpLCBub2RlSGlnaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgbm9kZS5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IE1hdGgubWF4KG5vZGUubGVmdC5tYXgsIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgPT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5yaWdodC5tYXgsIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gbm9kZUhpZ2g7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5yZWNvcmRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTm9kZSB3aXRoIHRoaXMga2V5IGhhcyBvbmx5IDEgcmVjb3JkLiBDaGVjayBpZiB0aGUgcmVtYWluaW5nIHJlY29yZCBpbiB0aGlzIG5vZGUgaXNcclxuICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHRoZSBvbmUgd2Ugd2FudCB0byByZW1vdmVcclxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzWzBdLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyByZWNvcmQgaXMgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZS4gUmVtb3ZlIHRoZSB3aG9sZSBub2RlIGZyb20gdGhlIHRyZWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290LmtleSA9PT0gbm9kZS5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgcmVtb3ZpbmcgdGhlIHJvb3QgZWxlbWVudC4gQ3JlYXRlIGEgZHVtbXkgbm9kZSB0aGF0IHdpbGwgdGVtcG9yYXJpbHkgdGFrZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb290J3MgcGFyZW50IHJvbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3RQYXJlbnQgPSBuZXcgTm9kZSh0aGlzLCB7IGxvdzogcmVjb3JkLmxvdywgaGlnaDogcmVjb3JkLmxvdyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhcmVudC5sZWZ0ID0gdGhpcy5yb290O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QucGFyZW50ID0gcm9vdFBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZWROb2RlID0gdGhpcy5yb290LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdFBhcmVudC5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyBub3QgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vIHJlY29yZHMgYXQgYWxsIGluIHRoaXMgbm9kZT8hIFNob3VsZG4ndCBoYXBwZW5cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluT3JkZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBJbk9yZGVyKHRoaXMucm9vdCk7XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5wcmVPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByZU9yZGVyKHRoaXMucm9vdCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEludGVydmFsVHJlZTtcclxufSgpKTtcclxuZXhwb3J0cy5JbnRlcnZhbFRyZWUgPSBJbnRlcnZhbFRyZWU7XHJcbnZhciBEYXRhSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRGF0YUludGVydmFsVHJlZSgpIHtcclxuICAgICAgICB0aGlzLnRyZWUgPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XHJcbiAgICB9XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAobG93LCBoaWdoLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5pbnNlcnQoeyBsb3c6IGxvdywgaGlnaDogaGlnaCwgZGF0YTogZGF0YSB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobG93LCBoaWdoLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5yZW1vdmUoeyBsb3c6IGxvdywgaGlnaDogaGlnaCwgZGF0YTogZGF0YSB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5zZWFyY2gobG93LCBoaWdoKS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYuZGF0YTsgfSk7XHJcbiAgICB9O1xyXG4gICAgRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5wcmVPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnByZU9yZGVyKCk7XHJcbiAgICB9O1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLCBcImNvdW50XCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5jb3VudDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBEYXRhSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBEYXRhSW50ZXJ2YWxUcmVlO1xyXG52YXIgSW5PcmRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEluT3JkZXIoc3RhcnROb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2goc3RhcnROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFdpbGwgb25seSBoYXBwZW4gaWYgc3RhY2sgaXMgZW1wdHkgYW5kIHBvcCBpcyBjYWxsZWRcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIG5vZGVcclxuICAgICAgICBpZiAodGhpcy5pIDwgdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzW3RoaXMuaSsrXSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBNaWdodCBwb3AgdGhlIGxhc3QgYW5kIHNldCB0aGlzLmN1cnJlbnROb2RlID0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHRoaXMucG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbm9kZTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnROb2RlLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5jdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLmxlZnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5zdGFjay5wb3AoKTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBJbk9yZGVyO1xyXG59KCkpO1xyXG5leHBvcnRzLkluT3JkZXIgPSBJbk9yZGVyO1xyXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XHJcbn1cclxudmFyIFByZU9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gUHJlT3JkZXIoc3RhcnROb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHN0YXJ0Tm9kZTtcclxuICAgIH1cclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFdpbGwgb25seSBoYXBwZW4gaWYgc3RhY2sgaXMgZW1wdHkgYW5kIHBvcCBpcyBjYWxsZWQsXHJcbiAgICAgICAgLy8gd2hpY2ggb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIHJpZ2h0IG5vZGUgKGkuZSB3ZSBhcmUgZG9uZSlcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIG5vZGVcclxuICAgICAgICBpZiAodGhpcy5pIDwgdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzW3RoaXMuaSsrXSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5sZWZ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XHJcbiAgICB9O1xyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuc3RhY2sucHVzaChub2RlKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFByZU9yZGVyO1xyXG59KCkpO1xyXG5leHBvcnRzLlByZU9yZGVyID0gUHJlT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIsIGNvbXBhcmUsIGNvbXBhcmVDb250ZXh0KSB7XG4gIHZhciByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCBvYmpBLCBvYmpCKSA6IHZvaWQgMDtcblxuICBpZiAocmV0ICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gISFyZXQ7XG4gIH1cblxuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSBcIm9iamVjdFwiIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwga2V5c0EubGVuZ3RoOyBpZHgrKykge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuXG4gICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZUEgPSBvYmpBW2tleV07XG4gICAgdmFyIHZhbHVlQiA9IG9iakJba2V5XTtcblxuICAgIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIHZhbHVlQSwgdmFsdWVCLCBrZXkpIDogdm9pZCAwO1xuXG4gICAgaWYgKHJldCA9PT0gZmFsc2UgfHwgKHJldCA9PT0gdm9pZCAwICYmIHZhbHVlQSAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldFJhZGlvQXBwZWFyYW5jZShkb2M6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbjogRnVuY3Rpb24gPSBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWw7XG4gICAgZG9jLkFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzTm9ybWFsID0gZnVuY3Rpb24oZm9ybU9iamVjdDogYW55KSB7XG4gICAgICAgIGNvbnN0IHhvYmo6IGFueSA9IG9sZEFwcGVhcmFuY2VGdW5jaXRpb24oZm9ybU9iamVjdCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbTogc3RyaW5nW10gPSB4b2JqLnN0cmVhbS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGNvbnN0IGVuY29kZUNvbG9yOiBzdHJpbmcgPSBkb2MuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgIHN0cmVhbVswXSA9IHN0cmVhbVswXSArICdcXG4nICsgZW5jb2RlQ29sb3IgKyAnXFxuJyArIGVuY29kZUNvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oJ1xcbicpO1xuICAgICAgICByZXR1cm4geG9iajtcbiAgICB9O1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIERlc2NyaXB0aW9uQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2Rlc2NyaXB0aW9uLnRzIiwidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoKGUpIHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxyXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXHJcblx0XHRnID0gd2luZG93O1xyXG59XHJcblxyXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXHJcbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXHJcbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZztcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSA1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiBnbG9iYWwganNQREYgKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiBBbGV4YW5kZXIgV2VpZHQsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQmlnZ0E5NFxuICogXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5cbi8qKiBcbioganNQREYgQWNyb0Zvcm0gUGx1Z2luXG4qIEBtb2R1bGUgQWNyb0Zvcm1cbiovXG52YXIganNwZGYgPSByZXF1aXJlKCdqc3BkZicpO1xuKGZ1bmN0aW9uIChqc1BERiwgZ2xvYmFsT2JqKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGpzUERGQVBJID0ganNQREYuQVBJO1xuICAgIHZhciBzY29wZTtcbiAgICB2YXIgc2NhbGVGYWN0b3IgPSAxO1xuICAgIGZ1bmN0aW9uIHRvVW5pY29kZShzdHIpIHtcbiAgICAgICAgdmFyIHVuaWNvZGVTdHJpbmcgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0aGVVbmljb2RlID0gc3RyLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB3aGlsZSAodGhlVW5pY29kZS5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICAgICAgdGhlVW5pY29kZSA9ICcwJyArIHRoZVVuaWNvZGU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdW5pY29kZVN0cmluZyArPSB0aGVVbmljb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnPEZFRkYnICsgdW5pY29kZVN0cmluZyArICc+JztcbiAgICB9XG4gICAgdmFyIHBkZkVzY2FwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cXCgvZywgJ1xcXFwoJykucmVwbGFjZSgvXFwpL2csICdcXFxcKScpIH07XG4gICAgdmFyIHBkZlVuZXNjYXBlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpLnJlcGxhY2UoL1xcXFxcXCgvZywgJygnKS5yZXBsYWNlKC9cXFxcXFwpL2csICcpJyk7IH07XG4gICAgZnVuY3Rpb24gYXJyYXlUb1BkZlVuaWNvZGVBcnJheSh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJ1sgJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvVW5pY29kZSh2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9ICcgXSdcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdmFyIGYyID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoMik7IC8vIEllLCAlLjJmXG4gICAgfTtcblxuICAgIHZhciBmNSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDUpOyAvLyBJZSwgJS4yZlxuICAgIH07XG5cbiAgICBqc1BERkFQSS5fX2Fjcm9mb3JtX18gPSB7fTtcbiAgICB2YXIgaW5oZXJpdCA9IGZ1bmN0aW9uIChjaGlsZCwgcGFyZW50KSB7XG4gICAgICAgIGNoaWxkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gICAgICAgIGNoaWxkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgIH07XG5cbiAgICB2YXIgc2NhbGUgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gKHggKiBzY2FsZUZhY3Rvcik7XG4gICAgfTtcbiAgICB2YXIgYW50aVNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC8gc2NhbGVGYWN0b3IpO1xuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlRm9ybVhPYmplY3QgPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgeG9iaiA9IG5ldyBBY3JvRm9ybVhPYmplY3QoKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHhvYmouQkJveCA9IFswLCAwLCBOdW1iZXIoZjIod2lkdGgpKSwgTnVtYmVyKGYyKGhlaWdodCkpXTtcbiAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQml0LU9wZXJhdGlvbnNcbiAgICAqL1xuICAgIHZhciBzZXRCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0ID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgbnVtYmVyID0gbnVtYmVyIHx8IDA7XG4gICAgICAgIGJpdFBvc2l0aW9uID0gYml0UG9zaXRpb24gfHwgMDtcblxuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdE1hc2sgPSAxIDw8IGJpdFBvc2l0aW9uO1xuXG4gICAgICAgIG51bWJlciB8PSBiaXRNYXNrO1xuXG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfTtcblxuICAgIHZhciBjbGVhckJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIG51bWJlciA9IG51bWJlciB8fCAwO1xuICAgICAgICBiaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdE1hc2sgPSAxIDw8IGJpdFBvc2l0aW9uO1xuXG4gICAgICAgIG51bWJlciAmPSB+Yml0TWFzaztcblxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0Qml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmdldEJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG51bWJlciAmICgxIDw8IGJpdFBvc2l0aW9uKSkgPT09IDAgPyAwIDogMTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqIEZmIHN0YXJ0cyBjb3VudGluZyB0aGUgYml0IHBvc2l0aW9uIGF0IDEgYW5kIG5vdCBsaWtlIGphdmFzY3JpcHQgYXQgMFxuICAgICovXG4gICAgdmFyIGdldEJpdEZvclBkZiA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEJpdChudW1iZXIsIGJpdFBvc2l0aW9uIC0gMSk7XG4gICAgfTtcblxuICAgIHZhciBzZXRCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgY2xlYXJCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xlYXJCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlQ29vcmRpbmF0ZXMgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2FsY3VsYXRlQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUgPSB0aGlzLmludGVybmFsLmdldEhvcml6b250YWxDb29yZGluYXRlO1xuICAgICAgICB2YXIgZ2V0VmVydGljYWxDb29yZGluYXRlID0gdGhpcy5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGU7XG4gICAgICAgIHZhciB4ID0gYXJnc1swXTtcbiAgICAgICAgdmFyIHkgPSBhcmdzWzFdO1xuICAgICAgICB2YXIgdyA9IGFyZ3NbMl07XG4gICAgICAgIHZhciBoID0gYXJnc1szXTtcblxuICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSB7fTtcblxuICAgICAgICBjb29yZGluYXRlcy5sb3dlckxlZnRfWCA9IGdldEhvcml6b250YWxDb29yZGluYXRlKHgpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9ZID0gZ2V0VmVydGljYWxDb29yZGluYXRlKHkgKyBoKSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy51cHBlclJpZ2h0X1ggPSBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSh4ICsgdykgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMudXBwZXJSaWdodF9ZID0gZ2V0VmVydGljYWxDb29yZGluYXRlKHkpIHx8IDA7XG5cbiAgICAgICAgcmV0dXJuIFtOdW1iZXIoZjIoY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1gpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9ZKSksIE51bWJlcihmMihjb29yZGluYXRlcy51cHBlclJpZ2h0X1gpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWSkpXTtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZUFwcGVhcmFuY2VTdHJlYW0gPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICBpZiAoZm9ybU9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1PYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZvcm1PYmplY3QuViAmJiAhZm9ybU9iamVjdC5EVikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWxzZSBjYWxjdWxhdGUgaXRcblxuICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgIHZhciB0ZXh0ID0gZm9ybU9iamVjdC5WIHx8IGZvcm1PYmplY3QuRFY7XG4gICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCB0ZXh0KTtcbiAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcblxuICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgIHN0cmVhbS5wdXNoKCcvVHggQk1DJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdxJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdCVCcpOyAvLyBCZWdpbiBUZXh0XG4gICAgICAgIHN0cmVhbS5wdXNoKHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJy8nICsgZm9udEtleSArICcgJyArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgJyBUZicpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnMSAwIDAgMSAwIDAgVG0nKTsvLyBUcmFuc2Zvcm1hdGlvbiBNYXRyaXhcbiAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0VUJyk7IC8vIEVuZCBUZXh0ICAgIFxuICAgICAgICBzdHJlYW0ucHVzaCgnUScpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnRU1DJyk7XG5cbiAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlWCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0LCB0ZXh0KSB7XG4gICAgICAgIGlmIChmb3JtT2JqZWN0LmlzVW5pY29kZSkgdGV4dCA9IGZvcm1PYmplY3QudHJ1ZVZhbHVlO1xuICAgICAgICAgdmFyIG1heEZvbnRTaXplID1cbiAgICAgICAgICAgIGZvcm1PYmplY3QuZm9udFNpemUgPT09IDAgPyBmb3JtT2JqZWN0Lm1heEZvbnRTaXplIDogZm9ybU9iamVjdC5mb250U2l6ZTtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0ge1xuICAgICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICAgIGZvbnRTaXplOiBcIlwiXG4gICAgICAgIH07XG4gICAgICAgIC8vIFJlbW92ZSBCcmFja2V0c1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoMCwgMSkgPT0gXCIoXCIgPyB0ZXh0LnN1YnN0cigxKSA6IHRleHQ7XG4gICAgICAgIHRleHQgPVxuICAgICAgICAgICAgdGV4dC5zdWJzdHIodGV4dC5sZW5ndGggLSAxKSA9PSBcIilcIlxuICAgICAgICAgICAgPyB0ZXh0LnN1YnN0cigwLCB0ZXh0Lmxlbmd0aCAtIDEpXG4gICAgICAgICAgICA6IHRleHQ7XG4gICAgICAgIC8vIHNwbGl0IGludG8gYXJyYXkgb2Ygd29yZHNcbiAgICAgICAgdmFyIHRleHRTcGxpdCA9IHRleHQuc3BsaXQoXCIgXCIpO1xuICAgICAgICB0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gd29yZC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgIHRleHRTcGxpdCA9IHRleHRTcGxpdC5tYXAoZnVuY3Rpb24gKGFycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbYXJyLmpvaW4oXCIgXCIpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZm9udFNpemUgPSBtYXhGb250U2l6ZTsgLy8gVGhlIFN0YXJ0aW5nIGZvbnRTaXplIChUaGUgTWF4aW11bSlcbiAgICAgICAgdmFyIGxpbmVTcGFjaW5nID0gMjtcbiAgICAgICAgdmFyIGJvcmRlclBhZGRpbmcgPSAyO1xuXG4gICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIGhlaWdodCA9IGhlaWdodCA8IDAgPyAtaGVpZ2h0IDogaGVpZ2h0O1xuICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgd2lkdGggPSB3aWR0aCA8IDAgPyAtd2lkdGggOiB3aWR0aDtcblxuICAgICAgICB2YXIgaXNTbWFsbGVyVGhhbldpZHRoID0gZnVuY3Rpb24oaSwgbGFzdExpbmUsIGZvbnRTaXplKSB7XG4gICAgICAgICAgICBpZiAoaSArIDEgPCB0ZXh0U3BsaXQubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gbGFzdExpbmUgKyBcIiBcIiArIHRleHRTcGxpdFtpICsgMV1bMF07XG4gICAgICAgICAgICB2YXIgVGV4dFdpZHRoID0gY2FsY3VsYXRlRm9udFNwYWNlKHRtcCwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoO1xuICAgICAgICAgICAgdmFyIEZpZWxkV2lkdGggPSB3aWR0aCAtIDIgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICAgICAgcmV0dXJuIFRleHRXaWR0aCA8PSBGaWVsZFdpZHRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmb250U2l6ZSsrO1xuICAgICAgICBGb250U2l6ZTogd2hpbGUgKGZvbnRTaXplID4gMCkge1xuICAgICAgICAgICAgdGV4dCA9IFwiXCI7XG4gICAgICAgICAgICBmb250U2l6ZS0tO1xuICAgICAgICAgICAgdmFyIHRleHRIZWlnaHQgPSBjYWxjdWxhdGVGb250U3BhY2UoXCIzXCIsIGZvcm1PYmplY3QsIGZvbnRTaXplKS5oZWlnaHQ7XG4gICAgICAgICAgICB2YXIgc3RhcnRZID0gZm9ybU9iamVjdC5tdWx0aWxpbmVcbiAgICAgICAgICAgID8gaGVpZ2h0IC0gZm9udFNpemVcbiAgICAgICAgICAgIDogKGhlaWdodCAtIHRleHRIZWlnaHQpIC8gMjtcbiAgICAgICAgICAgIHN0YXJ0WSArPSBsaW5lU3BhY2luZztcbiAgICAgICAgICAgIHZhciBzdGFydFg7XG5cbiAgICAgICAgICAgIHZhciBsYXN0WSA9IHN0YXJ0WTtcbiAgICAgICAgICAgIHZhciBmaXJzdFdvcmRJbkxpbmUgPSAwLFxuICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSAwO1xuICAgICAgICAgICAgdmFyIGxhc3RMZW5ndGg7XG4gICAgICAgICAgICB2YXIgY3VycldvcmQgPSAwO1xuXG4gICAgICAgICAgICBpZiAoZm9udFNpemUgPD0gMCkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSwgdGhlIFRleHQgZG9lc24ndCBmaXQgYXQgYWxsXG4gICAgICAgICAgICBmb250U2l6ZSA9IDEyO1xuICAgICAgICAgICAgdGV4dCA9IFwiKC4uLikgVGpcXG5cIjtcbiAgICAgICAgICAgIHRleHQgKz1cbiAgICAgICAgICAgICAgICBcIiUgV2lkdGggb2YgVGV4dDogXCIgK1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUZvbnRTcGFjZSh0ZXh0LCBmb3JtT2JqZWN0LCBmb250U2l6ZSkud2lkdGggK1xuICAgICAgICAgICAgICAgIFwiLCBGaWVsZFdpZHRoOlwiICtcbiAgICAgICAgICAgICAgICB3aWR0aCArXG4gICAgICAgICAgICAgICAgXCJcXG5cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbGFzdExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgdmFyIGxpbmVDb3VudCA9IDA7XG4gICAgICAgICAgICBMaW5lOiBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRTcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRleHRTcGxpdC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBpc1dpdGhOZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRTcGxpdFtpXS5sZW5ndGggIT09IDEgJiYgY3VycldvcmQgIT09IHRleHRTcGxpdFtpXS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IHRleHRTcGxpdFtpXVtjdXJyV29yZF07XG4gICAgICAgICAgICAgICAgaXNXaXRoTmV3TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IHRleHRTcGxpdFtpXVtjdXJyV29yZF0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICBsYXN0TGluZSA9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lLnN1YnN0cihsYXN0TGluZS5sZW5ndGggLSAxKSA9PSBcIiBcIlxuICAgICAgICAgICAgICAgICAgICA/IGxhc3RMaW5lLnN1YnN0cigwLCBsYXN0TGluZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGxhc3RMaW5lO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBwYXJzZUludChpKTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dExpbmVJc1NtYWxsZXIgPSBpc1NtYWxsZXJUaGFuV2lkdGgoa2V5LCBsYXN0TGluZSwgZm9udFNpemUpO1xuICAgICAgICAgICAgICAgIHZhciBpc0xhc3RXb3JkID0gaSA+PSB0ZXh0U3BsaXQubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChuZXh0TGluZUlzU21hbGxlciAmJiAhaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0TGluZSArPSBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgY3VycldvcmQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTGluZVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5leHRMaW5lSXNTbWFsbGVyICYmICFpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0SGVpZ2h0ICsgbGluZVNwYWNpbmcpICogKGxpbmVDb3VudCArIDIpICsgbGluZVNwYWNpbmcgPlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRleHQgaXMgaGlnaGVyIHRoYW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdvIG9uXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBrZXk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtT2JqZWN0Lm11bHRpbGluZSAmJlxuICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRleHQgaXMgaGlnaGVyIHRoYW4gdGhlIEZpZWxkT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGFzdCBibGFua1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IGZpcnN0V29yZEluTGluZTsgeCA8PSBsYXN0V29yZEluTGluZTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJyTGluZSA9IHRleHRTcGxpdFt4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PT0gbGFzdFdvcmRJbkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY3VyckxpbmVbY3VycldvcmRdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyV29yZCA9IChjdXJyV29yZCArIDEpICUgY3VyckxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PT0gZmlyc3RXb3JkSW5MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lW2N1cnJMaW5lLmxlbmd0aCAtIDFdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lWzBdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgYmxhbmtcbiAgICAgICAgICAgICAgICBsaW5lID1cbiAgICAgICAgICAgICAgICBsaW5lLnN1YnN0cihsaW5lLmxlbmd0aCAtIDEpID09IFwiIFwiXG4gICAgICAgICAgICAgICAgICAgID8gbGluZS5zdWJzdHIoMCwgbGluZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGxpbmU7XG4gICAgICAgICAgICAgICAgLy8gbGFzdExlbmd0aCAtPSBibGFua1NwYWNlLndpZHRoO1xuICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSBjYWxjdWxhdGVGb250U3BhY2UobGluZSwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHN0YXJ0WFxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybU9iamVjdC50ZXh0QWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gd2lkdGggLSBsYXN0TGVuZ3RoIC0gYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgICAgICAgICAgICBzdGFydFggPSAod2lkdGggLSBsYXN0TGVuZ3RoKSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRleHQgKz0gZjIoc3RhcnRYKSArIFwiIFwiICsgZjIobGFzdFkpICsgXCIgVGRcXG5cIjtcblxuICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0LmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9udExpc3QgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZm9udExpc3Rbc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkXSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBsaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRXNjYXBlOiBwZGZFc2NhcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRm9udEtleTogc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzOiBmb250TGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVGb250U2l6ZTogZm9ybU9iamVjdC5mb250U2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgncG9zdFByb2Nlc3NUZXh0JywgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJzwnICsgcGF5bG9hZC50ZXh0ICsgJz4gVGpcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnKCcgKyBwZGZFc2NhcGUobGluZSkgKyAnKSBUalxcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlc2V0IFggaW4gUERGXG4gICAgICAgICAgICAgICAgdGV4dCArPSAtZjIoc3RhcnRYKSArIFwiIDAgVGRcXG5cIjtcblxuICAgICAgICAgICAgICAgIC8vIEFmdGVyIGEgTGluZSwgYWRqdXN0IHkgcG9zaXRpb25cbiAgICAgICAgICAgICAgICBsYXN0WSA9IC0oZm9udFNpemUgKyBsaW5lU3BhY2luZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXNldCBmb3IgbmV4dCBpdGVyYXRpb24gc3RlcFxuICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGZpcnN0V29yZEluTGluZSA9IGlzV2l0aE5ld0xpbmUgPyBsYXN0V29yZEluTGluZSA6IGxhc3RXb3JkSW5MaW5lICsgMTtcbiAgICAgICAgICAgICAgICBsaW5lQ291bnQrKztcblxuICAgICAgICAgICAgICAgIGxhc3RMaW5lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb250aW51ZSBMaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5WYWx1ZS50ZXh0ID0gdGV4dDtcbiAgICAgICAgcmV0dXJuVmFsdWUuZm9udFNpemUgPSBmb250U2l6ZTtcblxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogU21hbGwgd29ya2Fyb3VuZCBmb3IgY2FsY3VsYXRpbmcgdGhlIFRleHRNZXRyaWMgYXBwcm94aW1hdGVseS5cbiAgICAqIFxuICAgICogQHBhcmFtIHRleHRcbiAgICAqIEBwYXJhbSBmb250c2l6ZVxuICAgICogQHJldHVybnMge1RleHRNZXRyaWNzfSAoSGFzIEhlaWdodCBhbmQgV2lkdGgpXG4gICAgKi9cbiAgICB2YXIgY2FsY3VsYXRlRm9udFNwYWNlID0gZnVuY3Rpb24gKHRleHQsIGZvcm1PYmplY3QsIGZvbnRTaXplKSB7XG4gICAgICAgIHZhciBmb250ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSk7XG4gICAgICAgIHZhciB3aWR0aCA9IHNjb3BlLmdldFN0cmluZ1VuaXRXaWR0aCh0ZXh0LCB7IGZvbnQ6IGZvbnQsIGZvbnRTaXplOiBwYXJzZUZsb2F0KGZvbnRTaXplKSwgY2hhclNwYWNlOiAwIH0pICogcGFyc2VGbG9hdChmb250U2l6ZSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBzY29wZS5nZXRTdHJpbmdVbml0V2lkdGgoXCIzXCIsIHsgZm9udDogZm9udCwgZm9udFNpemU6IHBhcnNlRmxvYXQoZm9udFNpemUpLCBjaGFyU3BhY2U6IDAgfSkgKiBwYXJzZUZsb2F0KGZvbnRTaXplKSAqIDEuNTtcbiAgICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBoZWlnaHQsIHdpZHRoOiB3aWR0aCB9O1xuICAgIH07XG5cbiAgICB2YXIgYWNyb2Zvcm1QbHVnaW5UZW1wbGF0ZSA9IHtcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgICAgeEZvcm1zOiBbXSxcbiAgICAgICAgLyoqXG4gICAgICAgICogYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQWNyb0Zvcm1cbiAgICAgICAgKiBEaWN0aW9uYXJ5IDA6IFRoZSBFdmVudC1Ub2tlbiwgdGhlIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrIGhhc1xuICAgICAgICAqIDE6IFRoZSBPYmplY3QgSUQgb2YgdGhlIFJvb3RcbiAgICAgICAgKi9cbiAgICAgICAgYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdDogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICogQWZ0ZXIgdGhlIFBERiBnZXRzIGV2YWx1YXRlZCwgdGhlIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBoYXMgdG8gYmVcbiAgICAgICAgKiByZXNldCwgdGhpcyBpbmRpY2F0ZXMsIHdoZXRoZXIgdGhlIHJvb3QgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkXG4gICAgICAgICogb3V0XG4gICAgICAgICovXG4gICAgICAgIHByaW50ZWRPdXQ6IGZhbHNlLFxuICAgICAgICBpbnRlcm5hbDogbnVsbCxcbiAgICAgICAgaXNJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuXG4gICAgdmFyIGFubm90UmVmZXJlbmNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vc2V0IG9iaklkIHRvIHVuZGVmaW5lZCBhbmQgZm9yY2UgaXQgdG8gZ2V0IGEgbmV3IG9iaklkIG9uIGJ1aWxkRG9jdW1lbnRcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzO1xuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBmb3JtT2JqZWN0ID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgICAgIC8vc2V0IG9iaklkIHRvIHVuZGVmaW5lZCBhbmQgZm9yY2UgaXQgdG8gZ2V0IGEgbmV3IG9iaklkIG9uIGJ1aWxkRG9jdW1lbnRcbiAgICAgICAgICAgICAgICBmb3JtT2JqZWN0Lm9iaklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIC8vIGFkZCBBbm5vdCBSZWZlcmVuY2UhXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QuaGFzQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZXMgYW4gQW5ub3RhdGlvbiBXaWRnZXQgaW4gdGhlIEZvcm0gT2JqZWN0LCBwdXQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBpbiB0aGUgL0Fubm90IGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFubm90YXRpb25SZWZlcmVuY2UuY2FsbChzY29wZSwgZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBwdXRGb3JtID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgaWYgKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQpIHtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCkge1xuICAgICAgICAgICAgaW5pdGlhbGl6ZUFjcm9Gb3JtLmNhbGwoc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzLnB1c2goZm9ybU9iamVjdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAqIENyZWF0ZSB0aGUgUmVmZXJlbmNlIHRvIHRoZSB3aWRnZXRBbm5vdGF0aW9uLCBzbyB0aGF0IGl0IGdldHMgcmVmZXJlbmNlZFxuICAgICogaW4gdGhlIEFubm90W10gaW50IHRoZSsgKFJlcXVpcmVzIHRoZSBBbm5vdGF0aW9uIFBsdWdpbilcbiAgICAqL1xuICAgIHZhciBjcmVhdGVBbm5vdGF0aW9uUmVmZXJlbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWZlcmVuY2UnLFxuICAgICAgICAgICAgb2JqZWN0OiBvYmplY3RcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGZpbmRFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gKGVudHJ5LnR5cGUgPT09IG9wdGlvbnMudHlwZSAmJiBlbnRyeS5vYmplY3QgPT09IG9wdGlvbnMub2JqZWN0KTsgfTtcbiAgICAgICAgaWYgKHNjb3BlLmludGVybmFsLmdldFBhZ2VJbmZvKG9iamVjdC5wYWdlKS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5maW5kKGZpbmRFbnRyeSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZ2V0UGFnZUluZm8ob2JqZWN0LnBhZ2UpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLnB1c2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FsbGJhY2tzXG5cbiAgICB2YXIgcHV0Q2F0YWxvZ0NhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQdXQgcmVmZXJlbmNlIHRvIEFjcm9Gb3JtIHRvIERvY3VtZW50Q2F0YWxvZ1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGZvciBzYWZldHksIHNob3VsZG4ndCBub3JtYWxseSBiZSB0aGUgY2FzZVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwud3JpdGUoJy9BY3JvRm9ybSAnICsgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCArICcgJyArIDAgKyAnIFInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHV0Q2F0YWxvZ0NhbGxiYWNrOiBSb290IG1pc3NpbmcuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBBZGRzIC9BY3JvZm9ybSBYIDAgUiB0byBEb2N1bWVudCBDYXRhbG9nLCBhbmQgY3JlYXRlcyB0aGUgQWNyb0Zvcm1cbiAgICAqIERpY3Rpb25hcnlcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGV2ZW50XG4gICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy51bnN1YnNjcmliZShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEKTtcbiAgICAgICAgZGVsZXRlIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQ7XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgdGhlIHNpbmdsZSBGaWVsZHMgYW5kIHdyaXRlcyB0aGVtIGludG8gdGhlIERvY3VtZW50XG4gICAgKiBcbiAgICAqIElmIGZpZWxkQXJyYXkgaXMgc2V0LCB1c2UgdGhlIGZpZWxkcyB0aGF0IGFyZSBpbnNpZGUgaXQgaW5zdGVhZCBvZiB0aGVcbiAgICAqIGZpZWxkcyBmcm9tIHRoZSBBY3JvUm9vdCAoZm9yIHRoZSBGb3JtWE9iamVjdHMuLi4pXG4gICAgKi9cbiAgICB2YXIgY3JlYXRlRmllbGRDYWxsYmFjayA9IGZ1bmN0aW9uIChmaWVsZEFycmF5KSB7XG4gICAgICAgIHZhciBzdGFuZGFyZEZpZWxkcyA9ICghZmllbGRBcnJheSk7XG5cbiAgICAgICAgaWYgKCFmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGZpZWxkQXJyYXkgc3BlY2lmaWVkLCB3ZSB3YW50IHRvIHByaW50IG91dFxuICAgICAgICAgICAgLy8gdGhlIEZpZWxkcyBvZiB0aGUgQWNyb0Zvcm1cbiAgICAgICAgICAgIC8vIFByaW50IG91dCBSb290XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQsIHRydWUpO1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5wdXRTdHJlYW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkQXJyYXkgPSBmaWVsZEFycmF5IHx8IHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuS2lkcztcblxuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkQXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZEFycmF5Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkT2JqZWN0ID0gZmllbGRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG9sZFJlY3QgPSBmaWVsZE9iamVjdC5SZWN0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LlJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmplY3QuUmVjdCA9IGNhbGN1bGF0ZUNvb3JkaW5hdGVzLmNhbGwodGhpcywgZmllbGRPYmplY3QuUmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgV3JpdGluZyB0aGUgT2JqZWN0XG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihmaWVsZE9iamVjdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5EQSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZVN0cmVhbShmaWVsZE9iamVjdCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkT2JqZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBmaWVsZE9iamVjdC5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QgPSBmaWVsZE9iamVjdC5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5SZWN0ID0gb2xkUmVjdDtcblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5oYXNBcHBlYXJhbmNlU3RyZWFtICYmICFmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgQXBwZWFyYW5jZVxuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZSA9IGNhbGN1bGF0ZUFwcGVhcmFuY2VTdHJlYW0uY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiAnQVAnLCB2YWx1ZTogXCI8PC9OIFwiICsgYXBwZWFyYW5jZSArIFwiPj5cIiB9KTtcblxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChhcHBlYXJhbmNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgaXMgYSBBcnJheSB3aXRoIE4sUixEIChhdCBsZWFzdFxuICAgICAgICAgICAgICAgIC8vIG9uZSBvZiB0aGVtISlcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgTixSIGFuZCBEXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudC5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50W2tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgayArIFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IFwiPDxcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+PSAxIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcmFuY2VTdHJlYW0gaXMgYW4gQXJyYXkgb3IgT2JqZWN0IVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gdmFsdWVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgRnVuY3Rpb24gaXMgcmVmZXJlbmNlZCwgY2FsbCBpdCBpbiBvcmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBnZXQgdGhlIEZvcm1YT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBpICsgXCIgXCIgKyBvYmogKyBcIiBcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBYRm9ybSBpcyBhbHJlYWR5IHVzZWQsIGUuZy4gT2ZmU3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBDaGVja0JveGVzLCBkb24ndCBhZGQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMuaW5kZXhPZihvYmopID49IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChvYmopO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQsIGNhbGwgaXQgaW4gb3JkZXIgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgRm9ybVhPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGkgKyBcIiBcIiArIG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5pbmRleE9mKG9iaikgPj0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IFwiPj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcmFuY2Ugc3RyZWFtIGlzIGEgbm9ybWFsIE9iamVjdC4uXG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiAnQVAnLCB2YWx1ZTogXCI8PFxcblwiICsgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArIFwiPj5cIiB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5wdXRTdHJlYW0oeyBhZGRpdGlvbmFsS2V5VmFsdWVzOiBrZXlWYWx1ZUxpc3QgfSk7XG5cbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIik7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhbmRhcmRGaWVsZHMpIHtcbiAgICAgICAgICAgIGNyZWF0ZVhGb3JtT2JqZWN0Q2FsbGJhY2suY2FsbCh0aGlzLCBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVYRm9ybU9iamVjdENhbGxiYWNrID0gZnVuY3Rpb24gKGZpZWxkQXJyYXkpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGRBcnJheS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBpO1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE9iamVjdCA9IGZpZWxkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgV3JpdGluZyB0aGUgT2JqZWN0XG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihmaWVsZE9iamVjdCAmJiBmaWVsZE9iamVjdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkT2JqZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBmaWVsZE9iamVjdC5wdXRTdHJlYW0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5wdXRTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZpZWxkQXJyYXlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaW5pdGlhbGl6ZUFjcm9Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbCAhPT0gdW5kZWZpbmVkICYmICh0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luID09PSB1bmRlZmluZWQgfHwgdGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkID09PSBmYWxzZSkpIHtcblxuICAgICAgICAgICAgc2NvcGUgPSB0aGlzO1xuXG4gICAgICAgICAgICBBY3JvRm9ybUZpZWxkLkZpZWxkTnVtID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFjcm9mb3JtUGx1Z2luVGVtcGxhdGUpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgQWNyb2Zvcm1EaWN0aW9uYXJ5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NhbGVGYWN0b3IgPSBzY29wZS5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgIC8vIFRoZSBPYmplY3QgTnVtYmVyIG9mIHRoZSBBY3JvRm9ybSBEaWN0aW9uYXJ5XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ID0gbmV3IEFjcm9Gb3JtRGljdGlvbmFyeSgpO1xuXG4gICAgICAgICAgICAvLyBhZGQgQ2FsbGJhY2sgZm9yIGNyZWF0aW5nIHRoZSBBY3JvRm9ybSBEaWN0aW9uYXJ5XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEID0gc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgncG9zdFB1dFJlc291cmNlcycsIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrKTtcblxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYnVpbGREb2N1bWVudCcsIGFubm90UmVmZXJlbmNlQ2FsbGJhY2spOyAvLyBidWlsZERvY3VtZW50XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50LCB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBEb2N1bWVudENhdGFsb2cgaXNcbiAgICAgICAgICAgIC8vIHdyaXR0ZW4sIGluIG9yZGVyIHRvIGFkZCAvQWNyb0Zvcm1cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3B1dENhdGFsb2cnLCBwdXRDYXRhbG9nQ2FsbGJhY2spO1xuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBldmVudCwgdGhhdCBjcmVhdGVzIGFsbCBGaWVsZHNcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3Bvc3RQdXRQYWdlcycsIGNyZWF0ZUZpZWxkQ2FsbGJhY2spO1xuXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgMjYsIDcuMy42XG4gICAgdmFyIGFycmF5VG9QZGZBcnJheSA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9ICdbJztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgYXJyYXlbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGFycmF5W2ldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXS5zdWJzdHIoMCwgMSkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJygnICsgcGRmRXNjYXBlKGFycmF5W2ldLnRvU3RyaW5nKCkpICsgJyknO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGFycmF5W2ldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ICs9ICddJztcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuX19hY3JvZm9ybV9fLmFycmF5VG9QZGZBcnJheScpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZ2V0TWF0Y2hlcyhzdHJpbmcsIHJlZ2V4LCBpbmRleCkge1xuICAgICAgICBpbmRleCB8fCAoaW5kZXggPSAxKTsgLy8gZGVmYXVsdCB0byB0aGUgZmlyc3QgY2FwdHVyaW5nIGdyb3VwXG4gICAgICAgIHZhciBtYXRjaGVzID0gW107XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhzdHJpbmcpKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2gobWF0Y2hbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9XG4gICAgdmFyIHBkZkFycmF5VG9TdHJpbmdBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGdldE1hdGNoZXMoYXJyYXksIC9cXCgoLio/KVxcKS9nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB2YXIgdG9QZGZTdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiO1xuICAgICAgICBzdHJpbmcudG9TdHJpbmcoKTtcbiAgICAgICAgc3RyaW5nID0gJygnICsgcGRmRXNjYXBlKHN0cmluZykgKyAnKSc7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gICAgLy8gQ2xhc3Nlc1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVBERk9iamVjdFxuICAgICogQGNsYXNzZGVzYyBBIEFjcm9Gb3JtUERGT2JqZWN0XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QREZPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfb2JqSWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1QREZPYmplY3Qjb2JqSWRcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ29iaklkJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfb2JqSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX29iaklkID0gc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYmpJZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29iaklkID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBmdW5jdGlvbiBBY3JvRm9ybVBERk9iamVjdC50b1N0cmluZ1xuICAgICovXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYmpJZCArIFwiIDAgUlwiO1xuICAgIH07XG5cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUucHV0U3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gdGhpcy5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0oKTtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHsgZGF0YTogdGhpcy5zdHJlYW0sIGFkZGl0aW9uYWxLZXlWYWx1ZXM6IGtleVZhbHVlTGlzdCB9KTtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgYW4ga2V5LXZhbHVlLUxpc3Qgb2YgYWxsIG5vbi1jb25maWd1cmFibGUgVmFyaWFibGVzIGZyb20gdGhlIE9iamVjdFxuICAgICogXG4gICAgKiBAbmFtZSBnZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW1cbiAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgKi9cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3JlYXRlS2V5VmFsdWVMaXN0RnJvbUZpZWxkT2JqZWN0ID0gZnVuY3Rpb24gKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gW107XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZpZWxkT2JqZWN0KS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoa2V5ICE9ICdjb250ZW50JyAmJiBrZXkgIT0gJ2FwcGVhcmFuY2VTdHJlYW1Db250ZW50JyAmJiBrZXkuc3Vic3RyaW5nKDAsIDEpICE9IFwiX1wiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIGtleXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmaWVsZE9iamVjdCwga2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RGVzY3JpcHRvciAmJiBwcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGRPYmplY3Rba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogYXJyYXlUb1BkZkFycmF5KHZhbHVlKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBY3JvRm9ybVBERk9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgaXQgaXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBQREZPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSB0aGUgcmVmZXJlbmNlIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZS5vYmpJZCArIFwiIDAgUlwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlWYWx1ZUxpc3Q7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUtleVZhbHVlTGlzdEZyb21GaWVsZE9iamVjdCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdmFyIEFjcm9Gb3JtWE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIi9YT2JqZWN0XCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnU3VidHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIi9Gb3JtXCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm9ybVR5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9CQm94ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQkJveCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0JCb3g7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQkJveCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1Jlc291cmNlcycsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIjIgMCBSXCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfc3RyZWFtO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfc3RyZWFtID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3RyZWFtO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGluaGVyaXQoQWNyb0Zvcm1YT2JqZWN0LCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICB2YXIgQWNyb0Zvcm1EaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBfS2lkcyA9IFtdO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnS2lkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9LaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGaWVsZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0tpZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlZmF1bHQgQXBwZWFyYW5jZVxuICAgICAgICB2YXIgX0RBO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RBJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfREEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICcoJyArIF9EQSArICcpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0RBID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtRGljdGlvbmFyeSwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgRmllbGQgT2JqZWN0IGNvbnRhaW5zIHRoZSBWYXJpYWJsZXMsIHRoYXQgZXZlcnkgRmllbGQgbmVlZHNcbiAgICAqIFxuICAgICogQGNsYXNzIEFjcm9Gb3JtRmllbGRcbiAgICAqIEBjbGFzc2Rlc2MgQW4gQWNyb0Zvcm0gRmllbGRPYmplY3RcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vQW5ub3RhdGlvbi1GbGFnIFNlZSBUYWJsZSAxNjVcbiAgICAgICAgdmFyIF9GID0gNDtcbiAgICAgICAgdGhpcy5pc1VuaWNvZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cnVlVmFsdWUgPSAnJztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjIpIElmIHNldCwgcHJpbnQgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgcGFnZSBpcyBwcmludGVkLiBJZiBjbGVhciwgbmV2ZXIgcHJpbnQgdGhlIGFubm90YXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2V0aGVyIGlzIGlzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLiBcbiAgICAgICAgKiBOT1RFIDIgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBhbm5vdGF0aW9ucyByZXByZXNlbnRpbmcgaW50ZXJhY3RpdmUgcHVzaGJ1dHRvbnMsIHdoaWNoIHdvdWxkIHNlcnZlIG5vIG1lYW5pbmdmdWwgcHVycG9zZSBvbiB0aGUgcHJpbnRlZCBwYWdlLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNzaG93V2hlblByaW50ZWRcbiAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2hvd1doZW5QcmludGVkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZihfRiwgMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRiA9IHNldEJpdEZvclBkZihfRiwgMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GID0gY2xlYXJCaXRGb3JQZGYoX0YsIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9GZiA9IDA7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRmYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0ZmO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0ZmID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRmYgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1JlY3QgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdSZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9SZWN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1JlY3Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9SZWN0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX1JlY3QgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjeFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3gnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMF0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMF0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjeVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3knLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMV0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMV0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3dpZHRoXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnd2lkdGgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFsyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMl0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMl0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoZWlnaHRcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoZWlnaHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbM10pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbM10gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfRlQgPSBcIlwiO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZUJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0ZUXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9CdG4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvVHgnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvQ2gnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvU2lnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9GVCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGVCBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfVCA9IG51bGw7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9UIHx8IF9ULmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIENoaWxkIGZyb20gYSBSYWRpb8K0R3JvdXAsIHlvdSBkb24ndCBuZWVkIGEgRmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1DaGlsZENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9UID0gXCJGaWVsZE9iamVjdFwiICsgKEFjcm9Gb3JtRmllbGQuRmllbGROdW0rKyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnKCcgKyBwZGZFc2NhcGUoX1QpICsgJyknO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1QgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBwYXJ0aWFsIGZpZWxkIG5hbWUgKHNlZSAxMi43LjMuMiwg4oCcRmllbGQgTmFtZXPigJ0pLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmaWVsZE5hbWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmaWVsZE5hbWUnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9UO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1QgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250TmFtZSA9ICdoZWx2ZXRpY2EnO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udE5hbWUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udE5hbWVcbiAgICAgICAgKiBAZGVmYXVsdCAnaGVsdmV0aWNhJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udE5hbWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250TmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250TmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udFN0eWxlIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnRTdHlsZVxuICAgICAgICAqIEBkZWZhdWx0ICdub3JtYWwnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250U3R5bGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250U3R5bGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udFN0eWxlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udFNpemUgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udFNpemUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udFNpemVcbiAgICAgICAgKiBAZGVmYXVsdCAwIChmb3IgYXV0bylcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnRTaXplJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX2ZvbnRTaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250U2l6ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9tYXhGb250U2l6ZSA9IDUwO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgbWF4aW11bSBmb250U2l6ZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNtYXhGb250U2l6ZVxuICAgICAgICAqIEBkZWZhdWx0IDAgKGZvciBhdXRvKVxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWF4Rm9udFNpemUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfbWF4Rm9udFNpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX21heEZvbnRTaXplID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2NvbG9yID0gJ2JsYWNrJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGNvbG9yIG9mIHRoZSB0ZXh0XG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2NvbG9yXG4gICAgICAgICogQGRlZmF1bHQgJ2JsYWNrJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd8cmdiYX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2xvcicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2NvbG9yID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfREEgPSAnL0YxIDAgVGYgMCBnJztcbiAgICAgICAgLy8gRGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIChOZWVkZWQgZm9yIHZhcmlhYmxlIFRleHQpXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnREEnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RBXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUNoaWxkQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtVGV4dEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfREEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIF9EQSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHZhciBfRFYgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RWJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfRFYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX0RWKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9EVjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdWJzdHIoMCwgMSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX0RWID0gcGRmVW5lc2NhcGUodmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9EViA9IHBkZlVuZXNjYXBlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIGRlZmF1bHQgdmFsdWUgdG8gd2hpY2ggdGhlIGZpZWxkIHJldmVydHMgd2hlbiBhIHJlc2V0LWZvcm0gYWN0aW9uIGlzIGV4ZWN1dGVkIChzZWUgMTIuNy41LjMsIOKAnFJlc2V0LUZvcm0gQWN0aW9u4oCdKS4gVGhlIGZvcm1hdCBvZiB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdmFsdWUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNkZWZhdWx0VmFsdWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkZWZhdWx0VmFsdWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZVbmVzY2FwZShfRFYuc3Vic3RyKDEsIF9EVi5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9EVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9WID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdWJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFfVikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfVik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSB0b1VuaWNvZGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRydWVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN1YnN0cigwLCAxKSA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSBwZGZVbmVzY2FwZSh2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfViA9IHBkZlVuZXNjYXBlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBmaWVsZOKAmXMgdmFsdWUsIHdob3NlIGZvcm1hdCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlLiBTZWUgdGhlIGRlc2NyaXB0aW9ucyBvZiBpbmRpdmlkdWFsIGZpZWxkIHR5cGVzIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjdmFsdWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2YWx1ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkZlVuZXNjYXBlKF9WLnN1YnN0cigxLCBfVi5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9WO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2sgaWYgZmllbGQgaGFzIGFubm90YXRpb25zXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hhc0Fubm90YXRpb25cbiAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBbm5vdGF0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5SZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUeXBlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzQW5ub3RhdGlvbikgPyBcIi9Bbm5vdFwiIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdTdWJ0eXBlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzQW5ub3RhdGlvbikgPyBcIi9XaWRnZXRcIiA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfaGFzQXBwZWFyYW5jZVN0cmVhbSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgKiB0cnVlIGlmIGZpZWxkIGhhcyBhbiBhcHBlYXJhbmNlU3RyZWFtXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hhc0FwcGVhcmFuY2VTdHJlYW1cbiAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBcHBlYXJhbmNlU3RyZWFtJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfaGFzQXBwZWFyYW5jZVN0cmVhbTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgX2hhc0FwcGVhcmFuY2VTdHJlYW0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHBhZ2Ugb24gd2hpY2ggdGhlIEFjcm9Gb3JtRmllbGQgaXMgcGxhY2VkXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3BhZ2VcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICB2YXIgX3BhZ2U7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncGFnZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9wYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3BhZ2UgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgdXNlciBtYXkgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbnkgYXNzb2NpYXRlZCB3aWRnZXQgYW5ub3RhdGlvbnMgd2lsbCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgdXNlcjsgdGhhdCBpcywgdGhleSB3aWxsIG5vdCByZXNwb25kIHRvIG1vdXNlIGNsaWNrcyBvciBjaGFuZ2UgdGhlaXIgYXBwZWFyYW5jZSBpbiByZXNwb25zZSB0byBtb3VzZSBtb3Rpb25zLiBUaGlzIGZsYWcgaXMgdXNlZnVsIGZvciBmaWVsZHMgd2hvc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBvciBpbXBvcnRlZCBmcm9tIGEgZGF0YWJhc2UuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNyZWFkT25seVxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVhZE9ubHknLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGhhdmUgYSB2YWx1ZSBhdCB0aGUgdGltZSBpdCBpcyBleHBvcnRlZCBieSBhIHN1Ym1pdGZvcm0gYWN0aW9uIChzZWUgMTIuNy41LjIsIOKAnFN1Ym1pdC1Gb3JtIEFjdGlvbuKAnSkuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNyZXF1aXJlZFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVxdWlyZWQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBleHBvcnRlZCBieSBhIHN1Ym1pdC1mb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCDigJxTdWJtaXQtRm9ybSBBY3Rpb27igJ0pXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI25vRXhwb3J0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub0V4cG9ydCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB2YXIgX1EgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1EnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfUSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1E7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoWzAsIDEsIDJdLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBfUSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIFEgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBBIGNvZGUgc3BlY2lmeWluZyB0aGUgZm9ybSBvZiBxdWFkZGluZyAoanVzdGlmaWNhdGlvbikgdGhhdCBzaGFsbCBiZSB1c2VkIGluIGRpc3BsYXlpbmcgdGhlIHRleHQ6XG4gICAgICAgICogJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J1xuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN0ZXh0QWxpZ25cbiAgICAgICAgKiBAZGVmYXVsdCAnbGVmdCdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RleHRBbGlnbicsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfUSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3JpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtRmllbGQsIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNob2ljZUZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIC8vIEZpZWxkIFR5cGUgPSBDaG9pY2UgRmllbGRcbiAgICAgICAgdGhpcy5GVCA9IFwiL0NoXCI7XG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5WID0gJygpJztcblxuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgICAgIC8vIFRvcCBJbmRleFxuICAgICAgICB2YXIgX1RJID0gMDtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1RJJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1RJO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1RJID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1LIGZpeCBmb3IgQWNyb2JhdFxuICAgICAgICB2YXIgX01LID0gJzw8IC9CRyBbIDAuOTc1IDAuOTc1IDAuOTc1IF0gID4+JztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNSycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBzY3JvbGxhYmxlIGxpc3QgYm94ZXMsIHRoZSB0b3AgaW5kZXggKHRoZSBpbmRleCBpbiB0aGUgT3B0IGFycmF5IG9mIHRoZSBmaXJzdCBvcHRpb24gdmlzaWJsZSBpbiB0aGUgbGlzdCkuIERlZmF1bHQgdmFsdWU6IDAuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCN0b3BJbmRleFxuICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RvcEluZGV4Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVEk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVEkgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9PcHQgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdPcHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb1BkZlVuaWNvZGVBcnJheShfT3B0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9QZGZBcnJheShfT3B0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9PcHQgPSBwZGZBcnJheVRvU3RyaW5nQXJyYXkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgZ2V0T3B0aW9uc1xuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gYXJyYXkgb2YgT3B0aW9uc1xuICAgICAgICAqL1xuICAgICAgICB0aGlzLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX09wdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgc2V0T3B0aW9uc1xuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IHZhbHVlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgX09wdCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSBhZGRPcHRpb25cbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hZGRPcHRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIF9PcHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIHJlbW92ZU9wdGlvblxuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsRW50cmllcyAoZGVmYXVsdDogZmFsc2UpXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucmVtb3ZlT3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBhbGxFbnRyaWVzKSB7XG4gICAgICAgICAgICBhbGxFbnRyaWVzID0gYWxsRW50cmllcyB8fCBmYWxzZVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICB3aGlsZSAoX09wdC5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNwbGljZShfT3B0LmluZGV4T2YodmFsdWUpLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsRW50cmllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgY29tYm8gYm94OyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgbGlzdCBib3guIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNjb21ib1xuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tYm8nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE4KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxOCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGNvbWJvIGJveCBzaGFsbCBpbmNsdWRlIGFuIGVkaXRhYmxlIHRleHQgYm94IGFzIHdlbGwgYXMgYSBkcm9wLWRvd24gbGlzdDsgaWYgY2xlYXIsIGl0IHNoYWxsIGluY2x1ZGUgb25seSBhIGRyb3AtZG93biBsaXN0LiBUaGlzIGZsYWcgc2hhbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBDb21ibyBmbGFnIGlzIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2VkaXRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VkaXQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE5KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tYm8gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxOSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxk4oCZcyBvcHRpb24gaXRlbXMgc2hhbGwgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiBUaGlzIGZsYWcgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSB3cml0ZXJzLCBub3QgYnkgcmVhZGVycy4gQ29uZm9ybWluZyByZWFkZXJzIHNoYWxsIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXIgaW4gdGhlIE9wdCBhcnJheSAoc2VlIFRhYmxlIDIzMSkuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNzb3J0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzb3J0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjApO1xuICAgICAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgbW9yZSB0aGFuIG9uZSBvZiB0aGUgZmllbGTigJlzIG9wdGlvbiBpdGVtcyBtYXkgYmUgc2VsZWN0ZWQgc2ltdWx0YW5lb3VzbHk7IGlmIGNsZWFyLCBhdCBtb3N0IG9uZSBpdGVtIHNoYWxsIGJlIHNlbGVjdGVkIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNtdWx0aVNlbGVjdFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbXVsdGlTZWxlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIyKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMik7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGxjaGVja2VkLiBUaGlzIGZsYWcgc2hhbGwgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBDb21ibyBhbmQgRWRpdCBmbGFncyBhcmUgYm90aCBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNkb05vdFNwZWxsQ2hlY2tcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U3BlbGxDaGVjaycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgdGhlIG5ldyB2YWx1ZSBzaGFsbCBiZSBjb21taXR0ZWQgYXMgc29vbiBhcyBhIHNlbGVjdGlvbiBpcyBtYWRlIChjb21tb25seSB3aXRoIHRoZSBwb2ludGluZyBkZXZpY2UpLiBJbiB0aGlzIGNhc2UsIHN1cHBseWluZyBhIHZhbHVlIGZvciBhIGZpZWxkIGludm9sdmVzIHRocmVlIGFjdGlvbnM6IHNlbGVjdGluZyB0aGUgZmllbGQgZm9yIGZpbGwtaW4sIHNlbGVjdGluZyBhIGNob2ljZSBmb3IgdGhlIGZpbGwtaW4gdmFsdWUsIGFuZCBsZWF2aW5nIHRoYXQgZmllbGQsIHdoaWNoIGZpbmFsaXplcyBvciDigJxjb21taXRz4oCdIHRoZSBkYXRhIGNob2ljZSBhbmQgdHJpZ2dlcnMgYW55IGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeSBvciBjaGFuZ2luZyBvZiB0aGlzIGRhdGEuIElmIHRoaXMgZmxhZyBpcyBvbiwgdGhlbiBwcm9jZXNzaW5nIGRvZXMgbm90IHdhaXQgZm9yIGxlYXZpbmcgdGhlIGZpZWxkIGFjdGlvbiB0byBvY2N1ciwgYnV0IGltbWVkaWF0ZWx5IHByb2NlZWRzIHRvIHRoZSB0aGlyZCBzdGVwLlxuICAgICAgICAqIFRoaXMgb3B0aW9uIGVuYWJsZXMgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gYW4gYWN0aW9uIG9uY2UgYSBzZWxlY3Rpb24gaXMgbWFkZSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZXhpdCB0aGUgZmllbGQuIElmIGNsZWFyLCB0aGUgbmV3IHZhbHVlIGlzIG5vdCBjb21taXR0ZWQgdW50aWwgdGhlIHVzZXIgZXhpdHMgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNjb21taXRPblNlbENoYW5nZVxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tbWl0T25TZWxDaGFuZ2UnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI3KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdGhpcy5oYXNBcHBlYXJhbmNlU3RyZWFtID0gZmFsc2U7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hvaWNlRmllbGQsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1MaXN0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUNob2ljZUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnaGVsdmV0aWNhJztcblxuICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgIHRoaXMuY29tYm8gPSBmYWxzZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1MaXN0Qm94LCBBY3JvRm9ybUNob2ljZUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ29tYm9Cb3ggXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNvbWJvQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUxpc3RCb3guY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb21ibyA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ29tYm9Cb3gsIEFjcm9Gb3JtTGlzdEJveCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUVkaXRCb3ggXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNvbWJvQm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUVkaXRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQ29tYm9Cb3guY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5lZGl0ID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1FZGl0Qm94LCBBY3JvRm9ybUNvbWJvQm94KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1CdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5GVCA9IFwiL0J0blwiO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSYWRpbyBidXR0b25zIG9ubHkpIElmIHNldCwgZXhhY3RseSBvbmUgcmFkaW8gYnV0dG9uIHNoYWxsIGJlIHNlbGVjdGVkIGF0IGFsbCB0aW1lczsgc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnV0dG9uIGhhcyBubyBlZmZlY3QuIElmIGNsZWFyLCBjbGlja2luZyB0aGUgc2VsZWN0ZWQgYnV0dG9uIGRlc2VsZWN0cyBpdCwgbGVhdmluZyBubyBidXR0b24gc2VsZWN0ZWQuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jbm9Ub2dnbGVUb09mZlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25vVG9nZ2xlVG9PZmYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE1KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnM7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBjaGVja2JveC4gVGhpcyBmbGFnIG1heSBiZSBzZXQgb25seSBpZiB0aGUgUHVzaGJ1dHRvbiBmbGFnIGlzIGNsZWFyLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNyYWRpb1xuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JhZGlvJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHB1c2hidXR0b24gdGhhdCBkb2VzIG5vdCByZXRhaW4gYSBwZXJtYW5lbnQgdmFsdWUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcHVzaEJ1dHRvblxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3B1c2hCdXR0b24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE3KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIGEgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucyB3aXRoaW4gYSByYWRpbyBidXR0b24gZmllbGQgdGhhdCB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBvbiBzdGF0ZSB3aWxsIHR1cm4gb24gYW5kIG9mZiBpbiB1bmlzb247IHRoYXQgaXMgaWYgb25lIGlzIGNoZWNrZWQsIHRoZXkgYXJlIGFsbCBjaGVja2VkLiBJZiBjbGVhciwgdGhlIGJ1dHRvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAodGhlIHNhbWUgYmVoYXZpb3IgYXMgSFRNTCByYWRpbyBidXR0b25zKS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3JhZGlvSXNVbmlzb25cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyYWRpb0lzVW5pc29uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01LID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX01LKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPDwnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gX01LKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLycgKyBrZXkgKyAnICgnICsgX01LW2tleV0gKyAnKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc+PicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogRnJvbSB0aGUgUERGIHJlZmVyZW5jZTpcbiAgICAgICAgKiAoT3B0aW9uYWwsIGJ1dHRvbiBmaWVsZHMgb25seSkgVGhlIHdpZGdldCBhbm5vdGF0aW9uJ3Mgbm9ybWFsIGNhcHRpb24gd2hpY2ggc2hhbGwgYmUgZGlzcGxheWVkIHdoZW4gaXQgaXMgbm90IGludGVyYWN0aW5nIHdpdGggdGhlIHVzZXIuIFxuICAgICAgICAqIFVubGlrZSB0aGUgcmVtYWluaW5nIGVudHJpZXMgbGlzdGVkIGluIHRoaXMgVGFibGUgd2hpY2ggYXBwbHkgb25seSB0byB3aWRnZXQgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHB1c2hidXR0b24gZmllbGRzIChzZWUgUHVzaGJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSwgdGhlIENBIGVudHJ5IG1heSBiZSB1c2VkIHdpdGggYW55IHR5cGUgb2YgYnV0dG9uIGZpZWxkLCBpbmNsdWRpbmcgY2hlY2sgYm94ZXMgKHNlZSBDaGVjayBCb3hlcyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpIGFuZCByYWRpbyBidXR0b25zIChSYWRpbyBCdXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikuXG4gICAgICAgICpcbiAgICAgICAgKiAtICc4JyA9IENyb3NzLCBcbiAgICAgICAgKiAtICdsJyA9ICBDaXJjbGUsXG4gICAgICAgICogLSAnJyA9IG5vdGhpbmdcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNjYXB0aW9uXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjYXB0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUsuQ0EgfHwgJyc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSy5DQSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9BUztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdBUycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmVxdWlyZWQgaWYgdGhlIGFwcGVhcmFuY2UgZGljdGlvbmFyeSBBUCBjb250YWlucyBvbmUgb3IgbW9yZSBzdWJkaWN0aW9uYXJpZXM7IFBERiAxLjIpIFRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBzdGF0ZSwgd2hpY2ggc2VsZWN0cyB0aGUgYXBwbGljYWJsZSBhcHBlYXJhbmNlIHN0cmVhbSBmcm9tIGFuIGFwcGVhcmFuY2Ugc3ViZGljdGlvbmFyeSAoc2VlIFNlY3Rpb24gMTIuNS41LCBcIkFwcGVhcmFuY2UgU3RyZWFtc1wiKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jYXBwZWFyYW5jZVN0YXRlXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdhcHBlYXJhbmNlU3RhdGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUy5zdWJzdHIoMSwgX0FTLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQnV0dG9uLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUHVzaEJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVB1c2hCdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucHVzaEJ1dHRvbiA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUHVzaEJ1dHRvbiwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1SYWRpb0J1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVJhZGlvQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnJhZGlvID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wdXNoQnV0dG9uID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIF9LaWRzID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnS2lkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBfS2lkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9LaWRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1SYWRpb0J1dHRvbiwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgQ2hpbGQgY2xhc3Mgb2YgYSBSYWRpb0J1dHRvbiAodGhlIHJhZGlvR3JvdXApIC0+IFRoZSBzaW5nbGUgQnV0dG9uc1xuICAgICogXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaGlsZENsYXNzXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKiBAaWdub3JlXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaGlsZENsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIF9wYXJlbnQ7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUGFyZW50Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJlbnQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfcGFyZW50ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfb3B0aW9uTmFtZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdvcHRpb25OYW1lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbk5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01LID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzw8Jyk7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBfTUspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy8nICsga2V5ICsgJyAoJyArIF9NS1trZXldICsgJyknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz4+Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZyb20gdGhlIFBERiByZWZlcmVuY2U6XG4gICAgICAgICogKE9wdGlvbmFsLCBidXR0b24gZmllbGRzIG9ubHkpIFRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIG5vcm1hbCBjYXB0aW9uIHdoaWNoIHNoYWxsIGJlIGRpc3BsYXllZCB3aGVuIGl0IGlzIG5vdCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiBcbiAgICAgICAgKiBVbmxpa2UgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGxpc3RlZCBpbiB0aGlzIFRhYmxlIHdoaWNoIGFwcGx5IG9ubHkgdG8gd2lkZ2V0IGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBwdXNoYnV0dG9uIGZpZWxkcyAoc2VlIFB1c2hidXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIiksIHRoZSBDQSBlbnRyeSBtYXkgYmUgdXNlZCB3aXRoIGFueSB0eXBlIG9mIGJ1dHRvbiBmaWVsZCwgaW5jbHVkaW5nIGNoZWNrIGJveGVzIChzZWUgQ2hlY2sgQm94ZXMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSBhbmQgcmFkaW8gYnV0dG9ucyAoUmFkaW8gQnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLlxuICAgICAgICAqXG4gICAgICAgICogLSAnOCcgPSBDcm9zcywgXG4gICAgICAgICogLSAnbCcgPSAgQ2lyY2xlLFxuICAgICAgICAqIC0gJycgPSBub3RoaW5nXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jY2FwdGlvblxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FwdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LLkNBIHx8ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsuQ0EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQVM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQVMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSZXF1aXJlZCBpZiB0aGUgYXBwZWFyYW5jZSBkaWN0aW9uYXJ5IEFQIGNvbnRhaW5zIG9uZSBvciBtb3JlIHN1YmRpY3Rpb25hcmllczsgUERGIDEuMikgVGhlIGFubm90YXRpb24ncyBhcHBlYXJhbmNlIHN0YXRlLCB3aGljaCBzZWxlY3RzIHRoZSBhcHBsaWNhYmxlIGFwcGVhcmFuY2Ugc3RyZWFtIGZyb20gYW4gYXBwZWFyYW5jZSBzdWJkaWN0aW9uYXJ5IChzZWUgU2VjdGlvbiAxMi41LjUsIFwiQXBwZWFyYW5jZSBTdHJlYW1zXCIpXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNhcHBlYXJhbmNlU3RhdGVcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2FwcGVhcmFuY2VTdGF0ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTLnN1YnN0cigxLCBfQVMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9ICdsJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RhdGUgPSAnT2ZmJztcbiAgICAgICAgLy8gdG9kbzogc2V0IEFwcGVhcmFuY2VUeXBlIGFzIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHNldCBmcm9tIHRoZVxuICAgICAgICAvLyBvdXRzaWRlLi4uXG4gICAgICAgIHRoaXMuX0FwcGVhcmFuY2VUeXBlID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZTtcbiAgICAgICAgLy8gVGhlIERlZmF1bHQgYXBwZWFyYW5jZVR5cGUgaXMgdGhlIENpcmNsZVxuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gdGhpcy5fQXBwZWFyYW5jZVR5cGUuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh0aGlzLm9wdGlvbk5hbWUpO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNoaWxkQ2xhc3MsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgQWNyb0Zvcm1SYWRpb0J1dHRvbi5wcm90b3R5cGUuc2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIGlmICghKCdjcmVhdGVBcHBlYXJhbmNlU3RyZWFtJyBpbiBhcHBlYXJhbmNlICYmICdnZXRDQScgaW4gYXBwZWFyYW5jZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGFzc2lnbiBBcHBlYXJhbmNlIHRvIFJhZGlvQnV0dG9uLiBBcHBlYXJhbmNlIHdhcyBJbnZhbGlkIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBvYmpJZCBpbiB0aGlzLktpZHMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLktpZHMuaGFzT3duUHJvcGVydHkob2JqSWQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5LaWRzW29iaklkXTtcbiAgICAgICAgICAgICAgICBjaGlsZC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IGFwcGVhcmFuY2UuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbShjaGlsZC5vcHRpb25OYW1lKTtcbiAgICAgICAgICAgICAgICBjaGlsZC5jYXB0aW9uID0gYXBwZWFyYW5jZS5nZXRDQSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtUmFkaW9CdXR0b24ucHJvdG90eXBlLmNyZWF0ZU9wdGlvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgQ2hpbGQgZm9yIFJhZGlvR3JvdXBcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IEFjcm9Gb3JtQ2hpbGRDbGFzcygpO1xuICAgICAgICBjaGlsZC5QYXJlbnQgPSB0aGlzO1xuICAgICAgICBjaGlsZC5vcHRpb25OYW1lID0gbmFtZTtcbiAgICAgICAgLy8gQWRkIHRvIFBhcmVudFxuICAgICAgICB0aGlzLktpZHMucHVzaChjaGlsZCk7XG5cbiAgICAgICAgYWRkRmllbGQuY2FsbCh0aGlzLCBjaGlsZCk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNoZWNrQm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hlY2tCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICd6YXBmZGluZ2JhdHMnO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSAnMyc7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0YXRlID0gJ09uJztcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiT25cIjtcbiAgICAgICAgdGhpcy50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKCk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hlY2tCb3gsIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtVGV4dEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1UZXh0RmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5GVCA9ICcvVHgnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIG1heSBjb250YWluIG11bHRpcGxlIGxpbmVzIG9mIHRleHQ7IGlmIGNsZWFyLCB0aGUgZmllbGTigJlzIHRleHQgc2hhbGwgYmUgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBsaW5lLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI211bHRpbGluZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ211bHRpbGluZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgcmVwcmVzZW50cyB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlIHdob3NlIGNvbnRlbnRzIHNoYWxsIGJlIHN1Ym1pdHRlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNmaWxlU2VsZWN0XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmlsZVNlbGVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGwtY2hlY2tlZC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNkb05vdFNwZWxsQ2hlY2tcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNwZWxsQ2hlY2snLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3Qgc2Nyb2xsIChob3Jpem9udGFsbHkgZm9yIHNpbmdsZS1saW5lIGZpZWxkcywgdmVydGljYWxseSBmb3IgbXVsdGlwbGUtbGluZSBmaWVsZHMpIHRvIGFjY29tbW9kYXRlIG1vcmUgdGV4dCB0aGFuIGZpdHMgd2l0aGluIGl0cyBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gT25jZSB0aGUgZmllbGQgaXMgZnVsbCwgbm8gZnVydGhlciB0ZXh0IHNoYWxsIGJlIGFjY2VwdGVkIGZvciBpbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmc7IGZvciBub25pbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmcsIHRoZSBmaWxsZXIgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gYWRkIG1vcmUgY2hhcmFjdGVyIHRoYW4gd2lsbCB2aXNpYmx5IGZpdCBpbiB0aGUgZGVmaW5lZCBhcmVhLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNkb05vdFNjcm9sbFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U2Nyb2xsJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgTWF5IGJlIHNldCBvbmx5IGlmIHRoZSBNYXhMZW4gZW50cnkgaXMgcHJlc2VudCBpbiB0aGUgdGV4dCBmaWVsZCBkaWN0aW9uYXJ5IChzZWUgVGFibGUgMjI5KSBhbmQgaWYgdGhlIE11bHRpbGluZSwgUGFzc3dvcmQsIGFuZCBGaWxlU2VsZWN0IGZsYWdzIGFyZSBjbGVhci4gSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgYmUgYXV0b21hdGljYWxseSBkaXZpZGVkIGludG8gYXMgbWFueSBlcXVhbGx5IHNwYWNlZCBwb3NpdGlvbnMsIG9yIGNvbWJzLCBhcyB0aGUgdmFsdWUgb2YgTWF4TGVuLCBhbmQgdGhlIHRleHQgaXMgbGFpZCBvdXQgaW50byB0aG9zZSBjb21icy5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNjb21iXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tYicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI1KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hhbGwgYmUgYSByaWNoIHRleHQgc3RyaW5nIChzZWUgMTIuNy4zLjQsIOKAnFJpY2ggVGV4dCBTdHJpbmdz4oCdKS4gSWYgdGhlIGZpZWxkIGhhcyBhIHZhbHVlLCB0aGUgUlYgZW50cnkgb2YgdGhlIGZpZWxkIGRpY3Rpb25hcnkgKFRhYmxlIDIyMikgc2hhbGwgc3BlY2lmeSB0aGUgcmljaCB0ZXh0IHN0cmluZy5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNyaWNoVGV4dFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JpY2hUZXh0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01heExlbiA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTWF4TGVuJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01heExlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9NYXhMZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBmaWVsZOKAmXMgdGV4dCwgaW4gY2hhcmFjdGVycy4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNtYXhMZW5ndGhcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21heExlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01heExlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfTWF4TGVuID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQXBwZWFyYW5jZVN0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuViB8fCB0aGlzLkRWKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1UZXh0RmllbGQsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QYXNzd29yZEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybVRleHRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1UZXh0RmllbGQuY2FsbCh0aGlzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgZW50ZXJpbmcgYSBzZWN1cmUgcGFzc3dvcmQgdGhhdCBzaG91bGQgbm90IGJlIGVjaG9lZCB2aXNpYmx5IHRvIHRoZSBzY3JlZW4uIENoYXJhY3RlcnMgdHlwZWQgZnJvbSB0aGUga2V5Ym9hcmQgc2hhbGwgaW5zdGVhZCBiZSBlY2hvZWQgaW4gc29tZSB1bnJlYWRhYmxlIGZvcm0sIHN1Y2ggYXMgYXN0ZXJpc2tzIG9yIGJ1bGxldCBjaGFyYWN0ZXJzLlxuICAgICAgICAqIE5PVEUgVG8gcHJvdGVjdCBwYXNzd29yZCBjb25maWRlbnRpYWxpdHksIHJlYWRlcnMgc2hvdWxkIG5ldmVyIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBmaWVsZCBpbiB0aGUgUERGIGZpbGUgaWYgdGhpcyBmbGFnIGlzIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNwYXNzd29yZFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Bhc3N3b3JkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCwgQWNyb0Zvcm1UZXh0RmllbGQpO1xuXG5cbiAgICAvLyBDb250YWlucyBNZXRob2RzIGZvciBjcmVhdGluZyBzdGFuZGFyZCBhcHBlYXJhbmNlc1xuICAgIHZhciBBY3JvRm9ybUFwcGVhcmFuY2UgPSB7XG4gICAgICAgIENoZWNrQm94OiB7XG4gICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIE46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guWWVzTm9ybWFsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guWWVzUHVzaERvd24sXG4gICAgICAgICAgICAgICAgICAgICAgICBPZmY6IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIE9uIEFwcGVhcmFuY2UgZm9yIGEgQ2hlY2tCb3hcbiAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCBmb3JtT2JqZWN0LmNhcHRpb24pO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQk1DXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCAxIHJnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiL1wiICsgZm9udEtleSArIFwiIFwiICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyBcIiBUZiBcIiArIGVuY29kZWRDb2xvcik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChjYWxjUmVzLnRleHQpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRVRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRU1DXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgZm9ybU9iamVjdC5jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKHdpZHRoKSArIFwiIFwiICsgZjIoaGVpZ2h0KSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgMSByZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKHdpZHRoIC0gMSkgKyBcIiBcIiArIGYyKGhlaWdodCAtIDEpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiL1wiICsgZm9udEtleSArIFwiIFwiICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyBcIiBUZiBcIiArIGVuY29kZWRDb2xvcik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgT2ZmIEFwcGVhcmFuY2UgZm9yIGEgQ2hlY2tCb3hcbiAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmFkaW9CdXR0b246IHtcbiAgICAgICAgICAgIENpcmNsZToge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2ZmJzogQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE46IHt9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lk5bbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuRFtuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzUHVzaERvd247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldENBOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbCc7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgUmFkaXVzIG9mIHRoZSBDaXJjbGUgcmVsYXRpdmUgdG8gbWluKGhlaWdodCwgd2lkdGgpIG9mIGZvcm1PYmplY3RcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgPyBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0M7XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXNCZXppZXIgPSBOdW1iZXIoKERvdFJhZGl1cyAqIGMpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICogVGhlIEZvbGxvd2luZyBpcyBhIENpcmNsZSBjcmVhdGVkIHdpdGggQmV6aWVyLUN1cnZlcy5cbiAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIFwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgLVwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDQgOiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJvcmRlcnBhZGRpbmcuLi5cbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZXN1bHRzIGZvciBsYXRlciB1c2U7IG5vIG5lZWQgdG8gd2FzdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRpY2tzIG9uIGRvaW5nIG1hdGhcbiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDIpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2MgPSBOdW1iZXIoKGsgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIFwiICsga2MgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBcIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgLVwiICsgayArIFwiIFwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgLVwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGtjICsgXCIgLVwiICsgayArIFwiIFwiICsgayArIFwiIC1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIGRjICsgXCIgXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBcIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgZGMgKyBcIiAtXCIgKyBkYyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgLVwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZXN1bHRzIGZvciBsYXRlciB1c2U7IG5vIG5lZWQgdG8gd2FzdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRpY2tzIG9uIGRvaW5nIG1hdGhcbiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDIpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2MgPSBOdW1iZXIoKGsgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrYyArIFwiIFwiICsgayArIFwiIC1cIiArIGsgKyBcIiBcIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIC1cIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrYyArIFwiIC1cIiArIGsgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBDcm9zczoge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgKiBDcmVhdGVzIHRoZSBBY3R1YWwgQXBwZWFyYW5jZURpY3Rpb25hcnktUmVmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICogQGlnbm9yZVxuICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09mZic6IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE46IHt9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lk5bbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuWWVzTm9ybWFsO1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5EW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLlllc1B1c2hEb3duO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRDQTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzgnXG4gICAgICAgICAgICAgICAgfSxcblxuXG4gICAgICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Jvc3MgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuY2FsY3VsYXRlQ3Jvc3MoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDEgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLSAyKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAtIDIpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJuXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54MS54KSArIFwiIFwiICsgZjIoY3Jvc3MueDEueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54Mi54KSArIFwiIFwiICsgZjIoY3Jvc3MueDIueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54NC54KSArIFwiIFwiICsgZjIoY3Jvc3MueDQueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54My54KSArIFwiIFwiICsgZjIoY3Jvc3MueDMueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBZZXNQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjcm9zcyA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5jYWxjdWxhdGVDcm9zcyhmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAxIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC0gMikgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLSAyKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDEueCkgKyBcIiBcIiArIGYyKGNyb3NzLngxLnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDIueCkgKyBcIiBcIiArIGYyKGNyb3NzLngyLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDQueCkgKyBcIiBcIiArIGYyKGNyb3NzLng0LnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDMueCkgKyBcIiBcIiArIGYyKGNyb3NzLngzLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBBcHBlYXJhbmNlXG4gICAgICAgICAgKiBcbiAgICAgICAgICAqIEByZXR1cm5zIHtBY3JvRm9ybVhPYmplY3R9XG4gICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBTZXQgSGVsdmV0aWNhIHRvIFN0YW5kYXJkIEZvbnQgKHNpemU6IGF1dG8pXG4gICAgICAgICAgICAvLyBDb2xvcjogQmxhY2tcbiAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICB2YXIgZm9udFNpemUgPSBmb3JtT2JqZWN0LmZvbnRTaXplO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcvJyArIGZvbnRLZXkgKyAnICcgKyBmb250U2l6ZSArICcgVGYgJyArIGVuY29kZWRDb2xvcjtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsID0ge1xuICAgICAgICBCZXppZXJfQzogMC41NTE5MTUwMjQ0OTQsXG5cbiAgICAgICAgY2FsY3VsYXRlQ3Jvc3M6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG5cbiAgICAgICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgdmFyIGEgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgICAgdmFyIGNyb3NzID0ge1xuICAgICAgICAgICAgICAgIHgxOiB7IC8vIHVwcGVyTGVmdFxuICAgICAgICAgICAgICAgICAgICB4OiAod2lkdGggLSBhKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKSArIGEsLy8gaGVpZ2h0IC0gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDI6IHsgLy8gbG93ZXJSaWdodFxuICAgICAgICAgICAgICAgICAgICB4OiAoKHdpZHRoIC0gYSkgLyAyKSArIGEsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKS8vIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHgzOiB7IC8vIGxvd2VyTGVmdFxuICAgICAgICAgICAgICAgICAgICB4OiAod2lkdGggLSBhKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKS8vIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHg0OiB7IC8vIHVwcGVyUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgeDogKCh3aWR0aCAtIGEpIC8gMikgKyBhLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikgKyBhLC8vIGhlaWdodCAtIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gY3Jvc3M7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGggPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtT2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzY2FsZShmb3JtT2JqZWN0LlJlY3RbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybU9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2NhbGUoZm9ybU9iamVjdC5SZWN0WzNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBQdWJsaWM6XG5cbiAgICAvKipcbiAgICAqIEFkZCBhbiBBY3JvRm9ybS1GaWVsZCB0byB0aGUganNQREYtaW5zdGFuY2VcbiAgICAqXG4gICAgKiBAbmFtZSBhZGRGaWVsZFxuICAgICogQGZ1bmN0aW9uIFxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRPYmplY3RcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqL1xuICAgIHZhciBhZGRGaWVsZCA9IGpzUERGQVBJLmFkZEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgIGluaXRpYWxpemVBY3JvRm9ybS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGlmIChmaWVsZE9iamVjdCBpbnN0YW5jZW9mIEFjcm9Gb3JtRmllbGQpIHtcbiAgICAgICAgICAgIHB1dEZvcm0uY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZEZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkT2JqZWN0LnBhZ2UgPSBzY29wZS5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRCdXR0b25cbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtQnV0dG9ufSBvcHRpb25zXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkQnV0dG9uID0gZnVuY3Rpb24gKGJ1dHRvbikge1xuICAgICAgICBpZiAoYnV0dG9uIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZEJ1dHRvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGQuY2FsbCh0aGlzLCBidXR0b24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBuYW1lIGFkZFRleHRGaWVsZFxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1UZXh0RmllbGR9IHRleHRGaWVsZFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZFRleHRGaWVsZCA9IGZ1bmN0aW9uICh0ZXh0RmllbGQpIHtcbiAgICAgICAgaWYgKHRleHRGaWVsZCBpbnN0YW5jZW9mIEFjcm9Gb3JtVGV4dEZpZWxkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRUZXh0RmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgdGV4dEZpZWxkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRDaG9pY2VGaWVsZFxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1DaG9pY2VGaWVsZH0gXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkQ2hvaWNlRmllbGQgPSBmdW5jdGlvbiAoY2hvaWNlRmllbGQpIHtcbiAgICAgICAgaWYgKGNob2ljZUZpZWxkIGluc3RhbmNlb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkQ2hvaWNlRmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgY2hvaWNlRmllbGQpO1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbE9iaiA9PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ2hvaWNlRmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiTGlzdEJveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDb21ib0JveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJFZGl0Qm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkJ1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJQdXNoQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlJhZGlvQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNoZWNrQm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlRleHRGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJQYXNzd29yZEZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgICBnbG9iYWxPYmpbXCJDaG9pY2VGaWVsZFwiXSA9IEFjcm9Gb3JtQ2hvaWNlRmllbGQ7XG4gICAgICAgIGdsb2JhbE9ialtcIkxpc3RCb3hcIl0gPSBBY3JvRm9ybUxpc3RCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkNvbWJvQm94XCJdID0gQWNyb0Zvcm1Db21ib0JveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiRWRpdEJveFwiXSA9IEFjcm9Gb3JtRWRpdEJveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQnV0dG9uXCJdID0gQWNyb0Zvcm1CdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIlB1c2hCdXR0b25cIl0gPSBBY3JvRm9ybVB1c2hCdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIlJhZGlvQnV0dG9uXCJdID0gQWNyb0Zvcm1SYWRpb0J1dHRvbjtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ2hlY2tCb3hcIl0gPSBBY3JvRm9ybUNoZWNrQm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJUZXh0RmllbGRcIl0gPSBBY3JvRm9ybVRleHRGaWVsZDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiUGFzc3dvcmRGaWVsZFwiXSA9IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZDtcblxuICAgICAgICAvLyBiYWNrd2FyZHNDb21wYXRpYmlsaXR5XG4gICAgICAgIGdsb2JhbE9ialtcIkFjcm9Gb3JtXCJdID0geyBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2UgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJBY3JvRm9ybS1DbGFzc2VzIGFyZSBub3QgcG9wdWxhdGVkIGludG8gZ2xvYmFsLW5hbWVzcGFjZSwgYmVjYXVzZSB0aGUgY2xhc3MtTmFtZXMgZXhpc3QgYWxyZWFkeS4gVGhpcyBhdm9pZHMgY29uZmxpY3RzIHdpdGggdGhlIGFscmVhZHkgdXNlZCBmcmFtZXdvcmsuXCIpO1xuICAgIH1cblxuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ2hvaWNlRmllbGQgPSBBY3JvRm9ybUNob2ljZUZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtTGlzdEJveCA9IEFjcm9Gb3JtTGlzdEJveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUNvbWJvQm94ID0gQWNyb0Zvcm1Db21ib0JveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUVkaXRCb3ggPSBBY3JvRm9ybUVkaXRCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1CdXR0b24gPSBBY3JvRm9ybUJ1dHRvbjtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVB1c2hCdXR0b24gPSBBY3JvRm9ybVB1c2hCdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1SYWRpb0J1dHRvbiA9IEFjcm9Gb3JtUmFkaW9CdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1DaGVja0JveCA9IEFjcm9Gb3JtQ2hlY2tCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1UZXh0RmllbGQgPSBBY3JvRm9ybVRleHRGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVBhc3N3b3JkRmllbGQgPSBBY3JvRm9ybVBhc3N3b3JkRmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1BcHBlYXJhbmNlID0gQWNyb0Zvcm1BcHBlYXJhbmNlO1xuXG4gICAganNQREZBUEkuQWNyb0Zvcm0gPSB7XG4gICAgICAgIENob2ljZUZpZWxkOiBBY3JvRm9ybUNob2ljZUZpZWxkLFxuICAgICAgICBMaXN0Qm94OiBBY3JvRm9ybUxpc3RCb3gsXG4gICAgICAgIENvbWJvQm94OiBBY3JvRm9ybUNvbWJvQm94LFxuICAgICAgICBFZGl0Qm94OiBBY3JvRm9ybUVkaXRCb3gsXG4gICAgICAgIEJ1dHRvbjogQWNyb0Zvcm1CdXR0b24sXG4gICAgICAgIFB1c2hCdXR0b246IEFjcm9Gb3JtUHVzaEJ1dHRvbixcbiAgICAgICAgUmFkaW9CdXR0b246IEFjcm9Gb3JtUmFkaW9CdXR0b24sXG4gICAgICAgIENoZWNrQm94OiBBY3JvRm9ybUNoZWNrQm94LFxuICAgICAgICBUZXh0RmllbGQ6IEFjcm9Gb3JtVGV4dEZpZWxkLFxuICAgICAgICBQYXNzd29yZEZpZWxkOiBBY3JvRm9ybVBhc3N3b3JkRmllbGQsXG4gICAgICAgIEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZVxuICAgIH07XG5cbiAgICBqc1BERi5BY3JvRm9ybSA9IHtcbiAgICAgICAgQ2hvaWNlRmllbGQ6IEFjcm9Gb3JtQ2hvaWNlRmllbGQsXG4gICAgICAgIExpc3RCb3g6IEFjcm9Gb3JtTGlzdEJveCxcbiAgICAgICAgQ29tYm9Cb3g6IEFjcm9Gb3JtQ29tYm9Cb3gsXG4gICAgICAgIEVkaXRCb3g6IEFjcm9Gb3JtRWRpdEJveCxcbiAgICAgICAgQnV0dG9uOiBBY3JvRm9ybUJ1dHRvbixcbiAgICAgICAgUHVzaEJ1dHRvbjogQWNyb0Zvcm1QdXNoQnV0dG9uLFxuICAgICAgICBSYWRpb0J1dHRvbjogQWNyb0Zvcm1SYWRpb0J1dHRvbixcbiAgICAgICAgQ2hlY2tCb3g6IEFjcm9Gb3JtQ2hlY2tCb3gsXG4gICAgICAgIFRleHRGaWVsZDogQWNyb0Zvcm1UZXh0RmllbGQsXG4gICAgICAgIFBhc3N3b3JkRmllbGQ6IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCxcbiAgICAgICAgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlXG4gICAgfTtcbn0pKGpzcGRmLmpzUERGLCAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93IHx8IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCkpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0uanNcbi8vIG1vZHVsZSBpZCA9IDYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIiAgLyoqXG4gICAqIGpzUERGIGZyb21IVE1MIHBsdWdpbi4gQkVUQSBzdGFnZS4gQVBJIHN1YmplY3QgdG8gY2hhbmdlLiBOZWVkcyBicm93c2VyXG4gICAqIENvcHlyaWdodCAoYykgMjAxMiBXaWxsb3cgU3lzdGVtcyBDb3Jwb3JhdGlvbiwgd2lsbG93LXN5c3RlbXMuY29tXG4gICAqICAgICAgICAgICAgICAgMjAxNCBKdWFuIFBhYmxvIEdhdmlyaWEsIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFucGdhdmlyaWFcbiAgICogICAgICAgICAgICAgICAyMDE0IERpZWdvIENhc29ycmFuLCBodHRwczovL2dpdGh1Yi5jb20vZGllZ29jclxuICAgKiAgICAgICAgICAgICAgIDIwMTQgRGFuaWVsIEh1c2FyLCBodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsaHVzYXJcbiAgICogICAgICAgICAgICAgICAyMDE0IFdvbGZnYW5nIEdhc3NsZXIsIGh0dHBzOi8vZ2l0aHViLmNvbS93b29sZmdcbiAgICogICAgICAgICAgICAgICAyMDE0IFN0ZXZlbiBTcHVuZ2luLCBodHRwczovL2dpdGh1Yi5jb20vZmxhbWVuY29cbiAgICpcbiAgICogQGxpY2Vuc2VcbiAgICogXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuICB2YXIganNwZGYgPSByZXF1aXJlKFwianNwZGZcIik7XG5cbiAgKGZ1bmN0aW9uIChqc1BERkFQSSkge1xuICAgIHZhciBjbG9uZSwgX0RyaWxsRm9yQ29udGVudCwgRm9udE5hbWVEQiwgRm9udFN0eWxlTWFwLCBUZXh0QWxpZ25NYXAsIEZvbnRXZWlnaHRNYXAsIEZsb2F0TWFwLCBDbGVhck1hcCwgR2V0Q1NTLCBQdXJnZVdoaXRlU3BhY2UsIFJlbmRlcmVyLCBSZXNvbHZlRm9udCwgUmVzb2x2ZVVuaXRlZE51bWJlciwgVW5pdGVkTnVtYmVyTWFwLCBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZSwgaW1hZ2VzLCBsb2FkSW1ncywgY2hlY2tGb3JGb290ZXIsIHByb2Nlc3MsIHRhYmxlVG9Kc29uO1xuXG4gICAgY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICBDbG9uZS5wcm90b3R5cGUgPSBvYmo7XG4gICAgICAgIHJldHVybiBuZXcgQ2xvbmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGZ1bmN0aW9uIENsb25lKCkge31cbiAgICB9KCk7XG5cbiAgICBQdXJnZVdoaXRlU3BhY2UgPSBmdW5jdGlvbiBQdXJnZVdoaXRlU3BhY2UoYXJyYXkpIHtcbiAgICAgIHZhciBmcmFnbWVudCwgaSwgbCwgbFRyaW1tZWQsIHIsIHJUcmltbWVkLCB0cmFpbGluZ1NwYWNlO1xuICAgICAgaSA9IDA7XG4gICAgICBsID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZnJhZ21lbnQgPSB2b2lkIDA7XG4gICAgICBsVHJpbW1lZCA9IGZhbHNlO1xuICAgICAgclRyaW1tZWQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCFsVHJpbW1lZCAmJiBpICE9PSBsKSB7XG4gICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltTGVmdCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIGxUcmltbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgaSA9IGwgLSAxO1xuXG4gICAgICB3aGlsZSAobCAmJiAhclRyaW1tZWQgJiYgaSAhPT0gLTEpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXSA9IGFycmF5W2ldLnRyaW1SaWdodCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIHJUcmltbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGktLTtcbiAgICAgIH1cblxuICAgICAgciA9IC9cXHMrJC9nO1xuICAgICAgdHJhaWxpbmdTcGFjZSA9IHRydWU7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgLy8gTGVhdmUgdGhlIGxpbmUgYnJlYWtzIGludGFjdFxuICAgICAgICBpZiAoYXJyYXlbaV0gIT0gXCJcXHUyMDI4XCIpIHtcbiAgICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldLnJlcGxhY2UoL1xccysvZywgXCIgXCIpO1xuXG4gICAgICAgICAgaWYgKHRyYWlsaW5nU3BhY2UpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQudHJpbUxlZnQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgIHRyYWlsaW5nU3BhY2UgPSByLnRlc3QoZnJhZ21lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFycmF5W2ldID0gZnJhZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIgPSBmdW5jdGlvbiBSZW5kZXJlcihwZGYsIHgsIHksIHNldHRpbmdzKSB7XG4gICAgICB0aGlzLnBkZiA9IHBkZjtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzOyAvL2xpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgYWZ0ZXIgZWFjaCBlbGVtZW50LXJlbmRlcmluZyBwcm9jZXNzXG5cbiAgICAgIHRoaXMud2F0Y2hGdW5jdGlvbnMgPSBbXTtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFJlc29sdmVGb250ID0gZnVuY3Rpb24gUmVzb2x2ZUZvbnQoY3NzX2ZvbnRfZmFtaWx5X3N0cmluZykge1xuICAgICAgdmFyIG5hbWUsIHBhcnQsIHBhcnRzO1xuICAgICAgbmFtZSA9IHZvaWQgMDtcbiAgICAgIHBhcnRzID0gY3NzX2ZvbnRfZmFtaWx5X3N0cmluZy5zcGxpdChcIixcIik7XG4gICAgICBwYXJ0ID0gcGFydHMuc2hpZnQoKTtcblxuICAgICAgd2hpbGUgKCFuYW1lICYmIHBhcnQpIHtcbiAgICAgICAgbmFtZSA9IEZvbnROYW1lREJbcGFydC50cmltKCkudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9O1xuXG4gICAgUmVzb2x2ZVVuaXRlZE51bWJlciA9IGZ1bmN0aW9uIFJlc29sdmVVbml0ZWROdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZykge1xuICAgICAgLy9JRTggaXNzdWVzXG4gICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9PT0gXCJhdXRvXCIgPyBcIjBweFwiIDogY3NzX2xpbmVfaGVpZ2h0X3N0cmluZztcblxuICAgICAgaWYgKGNzc19saW5lX2hlaWdodF9zdHJpbmcuaW5kZXhPZihcImVtXCIpID4gLTEgJiYgIWlzTmFOKE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJlbVwiLCBcIlwiKSkpKSB7XG4gICAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwiZW1cIiwgXCJcIikpICogMTguNzE5ICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5pbmRleE9mKFwicHRcIikgPiAtMSAmJiAhaXNOYU4oTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcInB0XCIsIFwiXCIpKSkpIHtcbiAgICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJwdFwiLCBcIlwiKSkgKiAxLjMzMyArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbCwgdW5kZWYsIHZhbHVlO1xuICAgICAgdW5kZWYgPSB2b2lkIDA7XG4gICAgICBub3JtYWwgPSAxNi4wMDtcbiAgICAgIHZhbHVlID0gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IHtcbiAgICAgICAgXCJ4eC1zbWFsbFwiOiA5LFxuICAgICAgICBcIngtc21hbGxcIjogMTEsXG4gICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgbWVkaXVtOiAxNixcbiAgICAgICAgbGFyZ2U6IDE5LFxuICAgICAgICBcIngtbGFyZ2VcIjogMjMsXG4gICAgICAgIFwieHgtbGFyZ2VcIjogMjgsXG4gICAgICAgIGF1dG86IDBcbiAgICAgIH1bY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ107XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWYpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHZhbHVlIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPSBwYXJzZUZsb2F0KGNzc19saW5lX2hlaWdodF9zdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSBjc3NfbGluZV9oZWlnaHRfc3RyaW5nLm1hdGNoKC8oW1xcZFxcLl0rKShweCkvKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSAxO1xuICAgIH07XG5cbiAgICBHZXRDU1MgPSBmdW5jdGlvbiBHZXRDU1MoZWxlbWVudCkge1xuICAgICAgdmFyIGNzcywgdG1wLCBjb21wdXRlZENTU0VsZW1lbnQ7XG5cbiAgICAgIGNvbXB1dGVkQ1NTRWxlbWVudCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICB2YXIgY29tcENTUztcblxuICAgICAgICBjb21wQ1NTID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsLmN1cnJlbnRTdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsLnN0eWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfShlbCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgcHJvcCA9IHByb3AucmVwbGFjZSgvLVxcRC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY29tcENTU1twcm9wXTtcbiAgICAgICAgfTtcbiAgICAgIH0oZWxlbWVudCk7XG5cbiAgICAgIGNzcyA9IHt9O1xuICAgICAgdG1wID0gdm9pZCAwO1xuICAgICAgY3NzW1wiZm9udC1mYW1pbHlcIl0gPSBSZXNvbHZlRm9udChjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LWZhbWlseVwiKSkgfHwgXCJ0aW1lc1wiO1xuICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IEZvbnRTdHlsZU1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXN0eWxlXCIpXSB8fCBcIm5vcm1hbFwiO1xuICAgICAgY3NzW1widGV4dC1hbGlnblwiXSA9IFRleHRBbGlnbk1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJ0ZXh0LWFsaWduXCIpXSB8fCBcImxlZnRcIjtcbiAgICAgIHRtcCA9IEZvbnRXZWlnaHRNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC13ZWlnaHRcIildIHx8IFwibm9ybWFsXCI7XG5cbiAgICAgIGlmICh0bXAgPT09IFwiYm9sZFwiKSB7XG4gICAgICAgIGlmIChjc3NbXCJmb250LXN0eWxlXCJdID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IHRtcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjc3NbXCJmb250LXN0eWxlXCJdID0gdG1wICsgY3NzW1wiZm9udC1zdHlsZVwiXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjc3NbXCJmb250LXNpemVcIl0gPSBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtc2l6ZVwiKSkgfHwgMTtcbiAgICAgIGNzc1tcImxpbmUtaGVpZ2h0XCJdID0gUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJsaW5lLWhlaWdodFwiKSkgfHwgMTtcbiAgICAgIGNzc1tcImRpc3BsYXlcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJkaXNwbGF5XCIpID09PSBcImlubGluZVwiID8gXCJpbmxpbmVcIiA6IFwiYmxvY2tcIjtcbiAgICAgIHRtcCA9IGNzc1tcImRpc3BsYXlcIl0gPT09IFwiYmxvY2tcIjtcbiAgICAgIGNzc1tcIm1hcmdpbi10b3BcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tdG9wXCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLWJvdHRvbVwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1ib3R0b21cIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLXRvcFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctdG9wXCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1ib3R0b21cIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLWJvdHRvbVwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1sZWZ0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLWxlZnRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tcmlnaHRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tcmlnaHRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLWxlZnRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLWxlZnRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLXJpZ2h0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1yaWdodFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZ2UtYnJlYWstYmVmb3JlXCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwicGFnZS1icmVhay1iZWZvcmVcIikgfHwgXCJhdXRvXCI7IC8vZmxvYXQgYW5kIGNsZWFyaW5nIG9mIGZsb2F0c1xuXG4gICAgICBjc3NbXCJmbG9hdFwiXSA9IEZsb2F0TWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImNzc0Zsb2F0XCIpXSB8fCBcIm5vbmVcIjtcbiAgICAgIGNzc1tcImNsZWFyXCJdID0gQ2xlYXJNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiY2xlYXJcIildIHx8IFwibm9uZVwiO1xuICAgICAgY3NzW1wiY29sb3JcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJjb2xvclwiKTtcbiAgICAgIHJldHVybiBjc3M7XG4gICAgfTtcblxuICAgIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlID0gZnVuY3Rpb24gZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgdmFyIGhhbmRsZXJzLCBpLCBpc0hhbmRsZWRFbHNld2hlcmUsIGwsIGNsYXNzTmFtZXM7XG4gICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBmYWxzZTtcbiAgICAgIGkgPSB2b2lkIDA7XG4gICAgICBsID0gdm9pZCAwO1xuICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbXCIjXCIgKyBlbGVtZW50LmlkXTtcblxuICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1tlbGVtZW50Lm5vZGVOYW1lXTtcblxuICAgICAgaWYgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaGFuZGxlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIFRyeSBjbGFzcyBuYW1lc1xuXG5cbiAgICAgIGNsYXNzTmFtZXMgPSB0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgPT09ICdzdHJpbmcnID8gZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSA6IFtdO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1snLicgKyBjbGFzc05hbWVzW2ldXTtcblxuICAgICAgICBpZiAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBoYW5kbGVycykge1xuICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0hhbmRsZWRFbHNld2hlcmU7XG4gICAgfTtcblxuICAgIHRhYmxlVG9Kc29uID0gZnVuY3Rpb24gdGFibGVUb0pzb24odGFibGUsIHJlbmRlcmVyKSB7XG4gICAgICB2YXIgZGF0YSwgaGVhZGVycywgaSwgaiwgcm93RGF0YSwgdGFibGVSb3csIHRhYmxlX29iaiwgdGFibGVfd2l0aCwgY2VsbCwgbDtcbiAgICAgIGRhdGEgPSBbXTtcbiAgICAgIGhlYWRlcnMgPSBbXTtcbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IHRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoO1xuICAgICAgdGFibGVfd2l0aCA9IHRhYmxlLmNsaWVudFdpZHRoO1xuXG4gICAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgICAgY2VsbCA9IHRhYmxlLnJvd3NbMF0uY2VsbHNbaV07XG4gICAgICAgIGhlYWRlcnNbaV0gPSB7XG4gICAgICAgICAgbmFtZTogY2VsbC50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpLFxuICAgICAgICAgIHByb21wdDogY2VsbC50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHI/XFxuL2csICcnKSxcbiAgICAgICAgICB3aWR0aDogY2VsbC5jbGllbnRXaWR0aCAvIHRhYmxlX3dpdGggKiByZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKVxuICAgICAgICB9O1xuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIGkgPSAxO1xuXG4gICAgICB3aGlsZSAoaSA8IHRhYmxlLnJvd3MubGVuZ3RoKSB7XG4gICAgICAgIHRhYmxlUm93ID0gdGFibGUucm93c1tpXTtcbiAgICAgICAgcm93RGF0YSA9IHt9O1xuICAgICAgICBqID0gMDtcblxuICAgICAgICB3aGlsZSAoaiA8IHRhYmxlUm93LmNlbGxzLmxlbmd0aCkge1xuICAgICAgICAgIHJvd0RhdGFbaGVhZGVyc1tqXS5uYW1lXSA9IHRhYmxlUm93LmNlbGxzW2pdLnRleHRDb250ZW50LnJlcGxhY2UoL1xccj9cXG4vZywgJycpO1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEucHVzaChyb3dEYXRhKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGVfb2JqID0ge1xuICAgICAgICByb3dzOiBkYXRhLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgU2tpcE5vZGUgPSB7XG4gICAgICBTQ1JJUFQ6IDEsXG4gICAgICBTVFlMRTogMSxcbiAgICAgIE5PU0NSSVBUOiAxLFxuICAgICAgT0JKRUNUOiAxLFxuICAgICAgRU1CRUQ6IDEsXG4gICAgICBTRUxFQ1Q6IDFcbiAgICB9O1xuICAgIHZhciBsaXN0Q291bnQgPSAxO1xuXG4gICAgX0RyaWxsRm9yQ29udGVudCA9IGZ1bmN0aW9uIERyaWxsRm9yQ29udGVudChlbGVtZW50LCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSB7XG4gICAgICB2YXIgY24sIGNucywgZnJhZ21lbnRDU1MsIGksIGlzQmxvY2ssIGwsIHRhYmxlMmpzb24sIGNiO1xuICAgICAgY25zID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgY24gPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudENTUyA9IEdldENTUyhlbGVtZW50KTtcbiAgICAgIGlzQmxvY2sgPSBmcmFnbWVudENTUy5kaXNwbGF5ID09PSBcImJsb2NrXCI7XG5cbiAgICAgIGlmIChpc0Jsb2NrKSB7XG4gICAgICAgIHJlbmRlcmVyLnNldEJsb2NrQm91bmRhcnkoKTtcbiAgICAgICAgcmVuZGVyZXIuc2V0QmxvY2tTdHlsZShmcmFnbWVudENTUyk7XG4gICAgICB9XG4gICAgICBpID0gMDtcbiAgICAgIGwgPSBjbnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgICAgY24gPSBjbnNbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZihjbikgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAvL2V4ZWN1dGUgYWxsIHdhdGNoZXIgZnVuY3Rpb25zIHRvIGUuZy4gcmVzZXQgZmxvYXRpbmdcbiAgICAgICAgICByZW5kZXJlci5leGVjdXRlV2F0Y2hGdW5jdGlvbnMoY24pO1xuICAgICAgICAgIC8qKiogSEVBREVSIHJlbmRlcmluZyAqKi9cblxuICAgICAgICAgIGlmIChjbi5ub2RlVHlwZSA9PT0gMSAmJiBjbi5ub2RlTmFtZSA9PT0gJ0hFQURFUicpIHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBjbjsgLy9zdG9yZSBvbGQgdG9wIG1hcmdpblxuXG4gICAgICAgICAgICB2YXIgb2xkTWFyZ2luVG9wID0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcDsgLy9zdWJzY3JpYmUgZm9yIG5ldyBwYWdlIGV2ZW50IGFuZCByZW5kZXIgaGVhZGVyIGZpcnN0IG9uIGV2ZXJ5IHBhZ2VcblxuICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2FkZFBhZ2UnLCBmdW5jdGlvbiAocGFnZUluZm8pIHtcbiAgICAgICAgICAgICAgLy9zZXQgY3VycmVudCB5IHBvc2l0aW9uIHRvIG9sZCBtYXJnaW5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IG9sZE1hcmdpblRvcDsgLy9yZW5kZXIgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBoZWFkZXIgZWxlbWVudFxuXG4gICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoaGVhZGVyLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTsgLy9zZXQgbWFyZ2luIHRvIG9sZCBtYXJnaW4gKyByZW5kZXJlZCBoZWFkZXIgKyAxMCBzcGFjZSB0byBwcmV2ZW50IG92ZXJsYXBwaW5nXG4gICAgICAgICAgICAgIC8vaW1wb3J0YW50IGZvciBvdGhlciBwbHVnaW5zIChlLmcuIHRhYmxlKSB0byBzdGFydCByZW5kZXJpbmcgYXQgY29ycmVjdCBwb3NpdGlvbiBhZnRlciBoZWFkZXJcblxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3AgPSByZW5kZXJlci55ICsgMTA7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNuLm5vZGVUeXBlID09PSA4ICYmIGNuLm5vZGVOYW1lID09PSBcIiNjb21tZW50XCIpIHtcbiAgICAgICAgICAgIGlmICh+Y24udGV4dENvbnRlbnQuaW5kZXhPZihcIkFERF9QQUdFXCIpKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZVR5cGUgPT09IDEgJiYgIVNraXBOb2RlW2NuLm5vZGVOYW1lXSkge1xuICAgICAgICAgICAgLyoqKiBJTUFHRSBSRU5ERVJJTkcgKioqL1xuICAgICAgICAgICAgdmFyIGNhY2hlZF9pbWFnZTtcblxuICAgICAgICAgICAgaWYgKGNuLm5vZGVOYW1lID09PSBcIklNR1wiKSB7XG4gICAgICAgICAgICAgIHZhciB1cmwgPSBjbi5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgICAgICAgICAgIGNhY2hlZF9pbWFnZSA9IGltYWdlc1socmVuZGVyZXIucGRmLnNIYXNoQ29kZSAmJiByZW5kZXJlci5wZGYuc0hhc2hDb2RlKHVybCkpIHx8IHVybF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYWNoZWRfaW1hZ2UpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKSAtIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gPCByZW5kZXJlci55ICsgY24uaGVpZ2h0ICYmIHJlbmRlcmVyLnkgPiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcDsgLy9jaGVjayBpZiB3ZSBoYXZlIHRvIHNldCBiYWNrIHNvbWUgdmFsdWVzIGR1ZSB0byBlLmcuIGhlYWRlciByZW5kZXJpbmcgZm9yIG5ldyBwYWdlXG5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5leGVjdXRlV2F0Y2hGdW5jdGlvbnMoY24pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIGltYWdlc0NTUyA9IEdldENTUyhjbik7XG4gICAgICAgICAgICAgIHZhciBpbWFnZVggPSByZW5kZXJlci54O1xuICAgICAgICAgICAgICB2YXIgZm9udFRvVW5pdFJhdGlvID0gMTIgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7IC8vZGVmaW5lIGFkZGl0aW9uYWwgcGFkZGluZ3MsIG1hcmdpbnMgd2hpY2ggaGF2ZSB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgZm9yIG1hcmdpbiBjYWxjdWxhdGlvbnNcblxuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlTGVmdCA9IChpbWFnZXNDU1NbXCJtYXJnaW4tbGVmdFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctbGVmdFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VSaWdodCA9IChpbWFnZXNDU1NbXCJtYXJnaW4tcmlnaHRcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLXJpZ2h0XCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZVRvcCA9IChpbWFnZXNDU1NbXCJtYXJnaW4tdG9wXCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy10b3BcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlQm90dG9tID0gKGltYWdlc0NTU1tcIm1hcmdpbi1ib3R0b21cIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLWJvdHRvbVwiXSkgKiBmb250VG9Vbml0UmF0aW87IC8vaWYgZmxvYXQgaXMgc2V0IHRvIHJpZ2h0LCBtb3ZlIHRoZSBpbWFnZSB0byB0aGUgcmlnaHQgYm9yZGVyXG4gICAgICAgICAgICAgIC8vYWRkIHNwYWNlIGlmIG1hcmdpbiBpcyBzZXRcblxuICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddICE9PSB1bmRlZmluZWQgJiYgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VYICs9IHJlbmRlcmVyLnNldHRpbmdzLndpZHRoIC0gY24ud2lkdGggLSBhZGRpdGlvbmFsU3BhY2VSaWdodDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbWFnZVggKz0gYWRkaXRpb25hbFNwYWNlTGVmdDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hZGRJbWFnZShjYWNoZWRfaW1hZ2UsIGltYWdlWCwgcmVuZGVyZXIueSArIGFkZGl0aW9uYWxTcGFjZVRvcCwgY24ud2lkdGgsIGNuLmhlaWdodCk7XG4gICAgICAgICAgICAgIGNhY2hlZF9pbWFnZSA9IHVuZGVmaW5lZDsgLy9pZiB0aGUgZmxvYXQgcHJvcCBpcyBzcGVjaWZpZWQgd2UgaGF2ZSB0byBmbG9hdCB0aGUgdGV4dCBhcm91bmQgdGhlIGltYWdlXG5cbiAgICAgICAgICAgICAgaWYgKGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ3JpZ2h0JyB8fCBpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIC8vYWRkIGZ1bmN0aW9udCB0byBzZXQgYmFjayBjb29yZGluYXRlcyBhZnRlciBpbWFnZSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgICByZW5kZXJlci53YXRjaEZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9uIChkaWZmWCwgdGhyZXNob2xkWSwgZGlmZldpZHRoLCBlbCkge1xuICAgICAgICAgICAgICAgICAgLy91bmRvIGRyYXdpbmcgYm94IGFkYXB0aW9ucyB3aGljaCB3ZXJlIHNldCBieSBmbG9hdGluZ1xuICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnkgPj0gdGhyZXNob2xkWSkge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci54ICs9IGRpZmZYO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5zZXR0aW5ncy53aWR0aCArPSBkaWZmV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbCAmJiBlbC5ub2RlVHlwZSA9PT0gMSAmJiAhU2tpcE5vZGVbZWwubm9kZU5hbWVdICYmIHJlbmRlcmVyLnggKyBlbC53aWR0aCA+IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5sZWZ0ICsgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gZGlmZlg7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSB0aHJlc2hvbGRZO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5zZXR0aW5ncy53aWR0aCArPSBkaWZmV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCBpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdsZWZ0JyA/IC1jbi53aWR0aCAtIGFkZGl0aW9uYWxTcGFjZUxlZnQgLSBhZGRpdGlvbmFsU3BhY2VSaWdodCA6IDAsIHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQgKyBhZGRpdGlvbmFsU3BhY2VUb3AgKyBhZGRpdGlvbmFsU3BhY2VCb3R0b20sIGNuLndpZHRoKSk7IC8vcmVzZXQgZmxvYXRpbmcgYnkgY2xlYXI6Ym90aCBkaXZzXG4gICAgICAgICAgICAgICAgLy9qdXN0IHNldCBjdXJzb3JZIGFmdGVyIHRoZSBmbG9hdGluZyBlbGVtZW50XG5cbiAgICAgICAgICAgICAgICByZW5kZXJlci53YXRjaEZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9uICh5UG9zaXRpb25BZnRlckZsb2F0aW5nLCBwYWdlcywgZWwpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci55IDwgeVBvc2l0aW9uQWZ0ZXJGbG9hdGluZyAmJiBwYWdlcyA9PT0gcmVuZGVyZXIucGRmLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwubm9kZVR5cGUgPT09IDEgJiYgR2V0Q1NTKGVsKS5jbGVhciA9PT0gJ2JvdGgnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHlQb3NpdGlvbkFmdGVyRmxvYXRpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgcmVuZGVyZXIueSArIGNuLmhlaWdodCwgcmVuZGVyZXIucGRmLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKSkpOyAvL2lmIGZsb2F0aW5nIGlzIHNldCB3ZSBkZWNyZWFzZSB0aGUgYXZhaWxhYmxlIHdpZHRoIGJ5IHRoZSBpbWFnZSB3aWR0aFxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLT0gY24ud2lkdGggKyBhZGRpdGlvbmFsU3BhY2VMZWZ0ICsgYWRkaXRpb25hbFNwYWNlUmlnaHQ7IC8vaWYgbGVmdCBqdXN0IGFkZCB0aGUgaW1hZ2Ugd2lkdGggdG8gdGhlIFggY29vcmRpbmF0ZVxuXG4gICAgICAgICAgICAgICAgaWYgKGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgICByZW5kZXJlci54ICs9IGNuLndpZHRoICsgYWRkaXRpb25hbFNwYWNlTGVmdCArIGFkZGl0aW9uYWxTcGFjZVJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmIG5vIGZsb2F0aW5nIGlzIHNldCwgbW92ZSB0aGUgcmVuZGVyaW5nIGN1cnNvciBhZnRlciB0aGUgaW1hZ2UgaGVpZ2h0XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSBjbi5oZWlnaHQgKyBhZGRpdGlvbmFsU3BhY2VUb3AgKyBhZGRpdGlvbmFsU3BhY2VCb3R0b207XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLyoqKiBUQUJMRSBSRU5ERVJJTkcgKioqL1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIlRBQkxFXCIpIHtcbiAgICAgICAgICAgICAgdGFibGUyanNvbiA9IHRhYmxlVG9Kc29uKGNuLCByZW5kZXJlcik7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi50YWJsZShyZW5kZXJlci54LCByZW5kZXJlci55LCB0YWJsZTJqc29uLnJvd3MsIHRhYmxlMmpzb24uaGVhZGVycywge1xuICAgICAgICAgICAgICAgIGF1dG9TaXplOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwcmludEhlYWRlcnM6IGVsZW1lbnRIYW5kbGVycy5wcmludEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgbWFyZ2luczogcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLFxuICAgICAgICAgICAgICAgIGNzczogR2V0Q1NTKGNuKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5fX2NlbGxfXy5sYXN0Q2VsbC55ICtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGwuaGVpZ2h0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJPTFwiIHx8IGNuLm5vZGVOYW1lID09PSBcIlVMXCIpIHtcbiAgICAgICAgICAgICAgbGlzdENvdW50ID0gMTtcblxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiTElcIikge1xuICAgICAgICAgICAgICB2YXIgdGVtcCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gMjAgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMztcblxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueCA9IHRlbXA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIkJSXCIpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSBmcmFnbWVudENTU1tcImZvbnQtc2l6ZVwiXSAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dChcIlxcdTIwMjhcIiwgY2xvbmUoZnJhZ21lbnRDU1MpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjbi5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChjbi5ub2RlVmFsdWUgJiYgY24ucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gXCJMSVwiKSB7XG4gICAgICAgICAgICAgIGlmIChjbi5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUgPT09IFwiT0xcIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbGlzdENvdW50KysgKyAnLiAnICsgdmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gZnJhZ21lbnRDU1NbXCJmb250LXNpemVcIl07XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFggPSAoMyAtIGZvbnRTaXplICogMC43NSkgKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFkgPSBmb250U2l6ZSAqIDAuNzUgKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIHJhZGl1cyA9IGZvbnRTaXplICogMS43NCAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcblxuICAgICAgICAgICAgICAgIGNiID0gZnVuY3Rpb24gY2IoeCwgeSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wZGYuY2lyY2xlKHggKyBvZmZzZXRYLCB5ICsgb2Zmc2V0WSwgcmFkaXVzLCAnRkQnKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIE9ubHkgYWRkIHRoZSB0ZXh0IGlmIHRoZSB0ZXh0IG5vZGUgaXMgaW4gdGhlIGJvZHkgZWxlbWVudFxuICAgICAgICAgICAgLy8gQWRkIGNvbXBhdGliaWxpdHkgd2l0aCBJRTExXG5cblxuICAgICAgICAgICAgaWYgKCEhKGNuLm93bmVyRG9jdW1lbnQuYm9keS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihjbikgJiAxNikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dCh2YWx1ZSwgZnJhZ21lbnRDU1MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNuID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZW5kZXJlci5hZGRUZXh0KGNuLCBmcmFnbWVudENTUyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50SGFuZGxlcnMub3V0WSA9IHJlbmRlcmVyLnk7XG5cbiAgICAgIGlmIChpc0Jsb2NrKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KGNiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaW1hZ2VzID0ge307XG5cbiAgICBsb2FkSW1ncyA9IGZ1bmN0aW9uIGxvYWRJbWdzKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMsIGNiKSB7XG4gICAgICB2YXIgaW1ncyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpLFxuICAgICAgICAgIGwgPSBpbWdzLmxlbmd0aCxcbiAgICAgICAgICBmb3VuZF9pbWFnZXMsXG4gICAgICAgICAgeCA9IDA7XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgnaW1hZ2VzTG9hZGVkJyk7XG4gICAgICAgIGNiKGZvdW5kX2ltYWdlcyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxvYWRJbWFnZSh1cmwsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybjtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBmb3VuZF9pbWFnZXMgPSArK3g7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICcnO1xuXG4gICAgICAgIGltZy5vbmVycm9yID0gaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoaW1nLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICAvL3RvIHN1cHBvcnQgZGF0YSB1cmxzIGluIGltYWdlcywgc2V0IHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgICAgIC8vYXMgdGhvc2UgdmFsdWVzIGFyZSBub3QgcmVjb2duaXplZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgICBpZiAoaW1nLnNyYy5pbmRleE9mKCdkYXRhOmltYWdlLycpID09PSAwKSB7XG4gICAgICAgICAgICAgIGltZy53aWR0aCA9IHdpZHRoIHx8IGltZy53aWR0aCB8fCAwO1xuICAgICAgICAgICAgICBpbWcuaGVpZ2h0ID0gaGVpZ2h0IHx8IGltZy5oZWlnaHQgfHwgMDtcbiAgICAgICAgICAgIH0gLy9pZiB2YWxpZCBpbWFnZSBhZGQgdG8ga25vd24gaW1hZ2VzIGFycmF5XG5cblxuICAgICAgICAgICAgaWYgKGltZy53aWR0aCArIGltZy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgdmFyIGhhc2ggPSAocmVuZGVyZXIucGRmLnNIYXNoQ29kZSAmJiByZW5kZXJlci5wZGYuc0hhc2hDb2RlKHVybCkpIHx8IHVybDtcbiAgICAgICAgICAgICAgaW1hZ2VzW2hhc2hdID0gaW1hZ2VzW2hhc2hdIHx8IGltZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoISAtLXgpIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaW1nLnNyYyA9IHVybDtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGwtLSkge1xuICAgICAgICBsb2FkSW1hZ2UoaW1nc1tsXS5nZXRBdHRyaWJ1dGUoXCJzcmNcIiksIGltZ3NbbF0ud2lkdGgsIGltZ3NbbF0uaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHggfHwgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjaGVja0ZvckZvb3RlciA9IGZ1bmN0aW9uIGNoZWNrRm9yRm9vdGVyKGVsZW0sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIC8vY2hlY2sgaWYgd2UgY2FuIGZvdW5kIGEgPGZvb3Rlcj4gZWxlbWVudFxuICAgICAgdmFyIGZvb3RlciA9IGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJmb290ZXJcIik7XG5cbiAgICAgIGlmIChmb290ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBmb290ZXIgPSBmb290ZXJbMF07IC8vYmFkIGhhY2sgdG8gZ2V0IGhlaWdodCBvZiBmb290ZXJcbiAgICAgICAgLy9jcmVhdCBkdW1teSBvdXQgYW5kIGNoZWNrIG5ldyB5IGFmdGVyIGZha2UgcmVuZGVyaW5nXG5cbiAgICAgICAgdmFyIG9sZE91dCA9IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZTtcbiAgICAgICAgdmFyIG9sZFkgPSByZW5kZXJlci55O1xuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZm9vdGVyLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcblxuICAgICAgICB2YXIgZm9vdGVySGVpZ2h0ID0gTWF0aC5jZWlsKHJlbmRlcmVyLnkgLSBvbGRZKSArIDU7XG4gICAgICAgIHJlbmRlcmVyLnkgPSBvbGRZO1xuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGUgPSBvbGRPdXQ7IC8vYWRkIDIwJSB0byBwcmV2ZW50IG92ZXJsYXBwaW5nXG5cbiAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSArPSBmb290ZXJIZWlnaHQ7IC8vQ3JlYXRlIGZ1bmN0aW9uIHJlbmRlciBoZWFkZXIgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgIHZhciByZW5kZXJGb290ZXIgPSBmdW5jdGlvbiByZW5kZXJGb290ZXIocGFnZUluZm8pIHtcbiAgICAgICAgICB2YXIgcGFnZU51bWJlciA9IHBhZ2VJbmZvICE9PSB1bmRlZmluZWQgPyBwYWdlSW5mby5wYWdlTnVtYmVyIDogMTsgLy9zZXQgY3VycmVudCB5IHBvc2l0aW9uIHRvIG9sZCBtYXJnaW5cblxuICAgICAgICAgIHZhciBvbGRQb3NpdGlvbiA9IHJlbmRlcmVyLnk7IC8vcmVuZGVyIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgaGVhZGVyIGVsZW1lbnRcblxuICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tO1xuICAgICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gLT0gZm9vdGVySGVpZ2h0OyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gYWRkIHBhZ2UgbnVtYmVyc1xuXG4gICAgICAgICAgdmFyIHNwYW5zID0gZm9vdGVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzcGFuJyk7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAvL2lmIHdlIGZpbmQgc29tZSBzcGFuIGVsZW1lbnQgd2l0aCBjbGFzcyBwYWdlQ291bnRlciwgc2V0IHRoZSBwYWdlXG4gICAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHBhZ2VDb3VudGVyIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9IHBhZ2VOdW1iZXI7XG4gICAgICAgICAgICB9IC8vaWYgd2UgZmluZCBzb21lIHNwYW4gZWxlbWVudCB3aXRoIGNsYXNzIHRvdGFsUGFnZXMsIHNldCBhIHZhcmlhYmxlIHdoaWNoIGlzIHJlcGxhY2VkIGFmdGVyIHJlbmRlcmluZyBvZiBhbGwgcGFnZXNcblxuXG4gICAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHRvdGFsUGFnZXMgXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0gJyMjI2pzUERGVmFyVG90YWxQYWdlcyMjIyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvL3JlbmRlciBmb290ZXIgY29udGVudFxuXG5cbiAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGZvb3RlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7IC8vc2V0IGJvdHRvbSBtYXJnaW4gdG8gcHJldmlvdXMgaGVpZ2h0IGluY2x1ZGluZyB0aGUgZm9vdGVyIGhlaWdodFxuXG5cbiAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tICs9IGZvb3RlckhlaWdodDsgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG4gICAgICAgICAgcmVuZGVyZXIueSA9IG9sZFBvc2l0aW9uO1xuICAgICAgICB9OyAvL2NoZWNrIGlmIGZvb3RlciBjb250YWlucyB0b3RhbFBhZ2VzIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlIGF0IHRoZSBkaXNvcG9zYWwgb2YgdGhlIGRvY3VtZW50XG5cblxuICAgICAgICB2YXIgc3BhbnMgPSBmb290ZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NwYW4nKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiB0b3RhbFBhZ2VzIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnaHRtbFJlbmRlcmluZ0ZpbmlzaGVkJywgcmVuZGVyZXIucGRmLnB1dFRvdGFsUGFnZXMuYmluZChyZW5kZXJlci5wZGYsICcjIyNqc1BERlZhclRvdGFsUGFnZXMjIyMnKSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vcmVnaXN0ZXIgZXZlbnQgdG8gcmVuZGVyIGZvb3RlciBvbiBldmVyeSBuZXcgcGFnZVxuXG5cbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2FkZFBhZ2UnLCByZW5kZXJGb290ZXIsIGZhbHNlKTsgLy9yZW5kZXIgZm9vdGVyIG9uIGZpcnN0IHBhZ2VcblxuICAgICAgICByZW5kZXJGb290ZXIoKTsgLy9wcmV2ZW50IGZvb3RlciByZW5kZXJpbmdcblxuICAgICAgICBTa2lwTm9kZVsnRk9PVEVSJ10gPSAxO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhwZGYsIGVsZW1lbnQsIHgsIHksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09IFwic3RyaW5nXCIgJiYgIWVsZW1lbnQucGFyZW50Tm9kZSkgZWxlbWVudCA9ICcnICsgZWxlbWVudC5pbm5lckhUTUw7XG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgJGZyYW1lLCAkaGlkZGVuZGl2LCBmcmFtZW5hbWUsIHZpc3VhbGx5aGlkZGVuO1xuICAgICAgICAgIGZyYW1lbmFtZSA9IFwianNQREZodG1sVGV4dFwiICsgRGF0ZS5ub3coKS50b1N0cmluZygpICsgKE1hdGgucmFuZG9tKCkgKiAxMDAwKS50b0ZpeGVkKDApO1xuICAgICAgICAgIHZpc3VhbGx5aGlkZGVuID0gXCJwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcIiArIFwiY2xpcDogcmVjdCgxcHggMXB4IDFweCAxcHgpOyAvKiBJRTYsIElFNyAqL1wiICsgXCJjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7XCIgKyBcInBhZGRpbmc6MCAhaW1wb3J0YW50O1wiICsgXCJib3JkZXI6MCAhaW1wb3J0YW50O1wiICsgXCJoZWlnaHQ6IDFweCAhaW1wb3J0YW50O1wiICsgXCJ3aWR0aDogMXB4ICFpbXBvcnRhbnQ7IFwiICsgXCJ0b3A6YXV0bztcIiArIFwibGVmdDotMTAwcHg7XCIgKyBcIm92ZXJmbG93OiBoaWRkZW47XCI7XG4gICAgICAgICAgJGhpZGRlbmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICRoaWRkZW5kaXYuc3R5bGUuY3NzVGV4dCA9IHZpc3VhbGx5aGlkZGVuO1xuICAgICAgICAgICRoaWRkZW5kaXYuaW5uZXJIVE1MID0gXCI8aWZyYW1lIHN0eWxlPVxcXCJoZWlnaHQ6MXB4O3dpZHRoOjFweFxcXCIgbmFtZT1cXFwiXCIgKyBmcmFtZW5hbWUgKyBcIlxcXCIgLz5cIjtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCRoaWRkZW5kaXYpO1xuICAgICAgICAgICRmcmFtZSA9IHdpbmRvdy5mcmFtZXNbZnJhbWVuYW1lXTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQub3BlbigpO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC53cml0ZWxuKGVsZW1lbnQpO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybiAkZnJhbWUuZG9jdW1lbnQuYm9keTtcbiAgICAgICAgfShlbGVtZW50LnJlcGxhY2UoLzxcXC8/c2NyaXB0W14+XSo/Pi9naSwgJycpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF2YWlsYWJsZUZvbnRzID0gT2JqZWN0LmtleXMocGRmLmdldEZvbnRMaXN0KCkpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGF2YWlsYWJsZUZvbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBmb250TmFtZSA9IGF2YWlsYWJsZUZvbnRzW2ldO1xuICAgICAgICB2YXIgZm9udEZhbWlseSA9IGZvbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmKCFGb250TmFtZURCW2ZvbnRGYW1pbHldKSB7XG4gICAgICAgICAgRm9udE5hbWVEQltmb250RmFtaWx5XSA9IGZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gbmV3IFJlbmRlcmVyKHBkZiwgeCwgeSwgc2V0dGluZ3MpLFxuICAgICAgICAgIG91dDsgLy8gMS4gbG9hZCBpbWFnZXNcbiAgICAgIC8vIDIuIHByZXBhcmUgb3B0aW9uYWwgZm9vdGVyIGVsZW1lbnRzXG4gICAgICAvLyAzLiByZW5kZXIgY29udGVudFxuXG4gICAgICBsb2FkSW1ncy5jYWxsKHRoaXMsIGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycywgZnVuY3Rpb24gKGZvdW5kX2ltYWdlcykge1xuICAgICAgICBjaGVja0ZvckZvb3RlcihlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpO1xuXG4gICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKTsgLy9zZW5kIGV2ZW50IGRpc3Bvc2UgZm9yIGZpbmFsIHRha3MgKGUuZy4gZm9vdGVyIHRvdGFscGFnZSByZXBsYWNlbWVudClcblxuXG4gICAgICAgIHIucGRmLmludGVybmFsLmV2ZW50cy5wdWJsaXNoKCdodG1sUmVuZGVyaW5nRmluaXNoZWQnKTtcbiAgICAgICAgb3V0ID0gci5kaXNwb3NlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKG91dCk7ZWxzZSBpZiAoZm91bmRfaW1hZ2VzKSBjb25zb2xlLmVycm9yKCdqc1BERiBXYXJuaW5nOiByZW5kZXJpbmcgaXNzdWVzPyBwcm92aWRlIGEgY2FsbGJhY2sgdG8gZnJvbUhUTUwhJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvdXQgfHwge1xuICAgICAgICB4OiByLngsXG4gICAgICAgIHk6IHIueVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnBhcmFncmFwaCA9IHtcbiAgICAgICAgdGV4dDogW10sXG4gICAgICAgIHN0eWxlOiBbXVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcInFcIik7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJRXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogdGhpcy54LFxuICAgICAgICB5OiB0aGlzLnksXG4gICAgICAgIHJlYWR5OiB0cnVlXG4gICAgICB9O1xuICAgIH07IC8vQ2hlY2tzIGlmIHdlIGhhdmUgdG8gZXhlY3V0ZSBzb21lIHdhdGNoZXIgZnVuY3Rpb25zXG4gICAgLy9lLmcuIHRvIGVuZCB0ZXh0IGZsb2F0aW5nIGFyb3VuZCBhbiBpbWFnZVxuXG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgICB2YXIgbmFycmF5ID0gW107XG5cbiAgICAgIGlmICh0aGlzLndhdGNoRnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndhdGNoRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKHRoaXMud2F0Y2hGdW5jdGlvbnNbaV0oZWwpID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXJyYXkucHVzaCh0aGlzLndhdGNoRnVuY3Rpb25zW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhdGNoRnVuY3Rpb25zID0gbmFycmF5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMgPSBmdW5jdGlvbiAoZnJhZ21lbnRzLCBzdHlsZXMpIHtcbiAgICAgIHZhciBjdXJyZW50TGluZUxlbmd0aCwgZGVmYXVsdEZvbnRTaXplLCBmZiwgZm9udE1ldHJpY3MsIGZvbnRNZXRyaWNzQ2FjaGUsIGZyYWdtZW50LCBmcmFnbWVudENob3BwZWQsIGZyYWdtZW50TGVuZ3RoLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcywgZnMsIGssIGxpbmUsIGxpbmVzLCBtYXhMaW5lTGVuZ3RoLCBzdHlsZTtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuICAgICAgayA9IHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgZm9udE1ldHJpY3NDYWNoZSA9IHt9O1xuICAgICAgZmYgPSB2b2lkIDA7XG4gICAgICBmcyA9IHZvaWQgMDtcbiAgICAgIGZvbnRNZXRyaWNzID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnQgPSB2b2lkIDA7XG4gICAgICBzdHlsZSA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRMZW5ndGggPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudENob3BwZWQgPSB2b2lkIDA7XG4gICAgICBsaW5lID0gW107XG4gICAgICBsaW5lcyA9IFtsaW5lXTtcbiAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoID0gMDtcbiAgICAgIG1heExpbmVMZW5ndGggPSB0aGlzLnNldHRpbmdzLndpZHRoO1xuXG4gICAgICB3aGlsZSAoZnJhZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50cy5zaGlmdCgpO1xuICAgICAgICBzdHlsZSA9IHN0eWxlcy5zaGlmdCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIGZmID0gc3R5bGVbXCJmb250LWZhbWlseVwiXTtcbiAgICAgICAgICBmcyA9IHN0eWxlW1wiZm9udC1zdHlsZVwiXTtcbiAgICAgICAgICBmb250TWV0cmljcyA9IGZvbnRNZXRyaWNzQ2FjaGVbZmYgKyBmc107XG5cbiAgICAgICAgICBpZiAoIWZvbnRNZXRyaWNzKSB7XG4gICAgICAgICAgICBmb250TWV0cmljcyA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoZmYsIGZzKS5tZXRhZGF0YS5Vbmljb2RlO1xuICAgICAgICAgICAgZm9udE1ldHJpY3NDYWNoZVtmZiArIGZzXSA9IGZvbnRNZXRyaWNzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0ge1xuICAgICAgICAgICAgd2lkdGhzOiBmb250TWV0cmljcy53aWR0aHMsXG4gICAgICAgICAgICBrZXJuaW5nOiBmb250TWV0cmljcy5rZXJuaW5nLFxuICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlW1wiZm9udC1zaXplXCJdICogZGVmYXVsdEZvbnRTaXplLFxuICAgICAgICAgICAgdGV4dEluZGVudDogY3VycmVudExpbmVMZW5ndGhcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZyYWdtZW50TGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGZyYWdtZW50LCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7XG5cbiAgICAgICAgICBpZiAoZnJhZ21lbnQgPT0gXCJcXHUyMDI4XCIpIHtcbiAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TGluZUxlbmd0aCArIGZyYWdtZW50TGVuZ3RoID4gbWF4TGluZUxlbmd0aCkge1xuICAgICAgICAgICAgZnJhZ21lbnRDaG9wcGVkID0gdGhpcy5wZGYuc3BsaXRUZXh0VG9TaXplKGZyYWdtZW50LCBtYXhMaW5lTGVuZ3RoLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcyk7XG4gICAgICAgICAgICBsaW5lLnB1c2goW2ZyYWdtZW50Q2hvcHBlZC5zaGlmdCgpLCBzdHlsZV0pO1xuXG4gICAgICAgICAgICB3aGlsZSAoZnJhZ21lbnRDaG9wcGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICBsaW5lID0gW1tmcmFnbWVudENob3BwZWQuc2hpZnQoKSwgc3R5bGVdXTtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudExpbmVMZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgobGluZVswXVswXSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaW5lLnB1c2goW2ZyYWdtZW50LCBzdHlsZV0pO1xuICAgICAgICAgICAgY3VycmVudExpbmVMZW5ndGggKz0gZnJhZ21lbnRMZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vaWYgdGV4dCBhbGlnbm1lbnQgd2FzIHNldCwgc2V0IG1hcmdpbi9pbmRlbnQgb2YgZWFjaCBsaW5lXG5cblxuICAgICAgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gIT09IHVuZGVmaW5lZCAmJiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcicgfHwgc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0JyB8fCBzdHlsZVsndGV4dC1hbGlnbiddID09PSAnanVzdGlmeScpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGxpbmVzW2ldWzBdWzBdLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7IC8vaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uIGxpbmUgd2UgaGF2ZSB0byBjbG9uZSB0aGUgc3R5bGUgb2JqZWN0IGFzIGFsbCBsaW5lcyBob2xkIGEgcmVmZXJlbmNlIG9uIHRoaXMgb2JqZWN0XG5cbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdID0gY2xvbmUobGluZXNbaV1bMF1bMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzcGFjZSA9IG1heExpbmVMZW5ndGggLSBsZW5ndGg7XG5cbiAgICAgICAgICBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ21hcmdpbi1sZWZ0J10gPSBzcGFjZTsgLy9pZiBhbGlnbm1lbnQgaXMgbm90IHJpZ2h0LCBpdCBoYXMgdG8gYmUgY2VudGVyIHNvIHNwbGl0IHRoZSBzcGFjZSB0byB0aGUgbGVmdCBhbmQgdGhlIHJpZ2h0XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ21hcmdpbi1sZWZ0J10gPSBzcGFjZSAvIDI7IC8vaWYganVzdGlmeSB3YXMgc2V0LCBjYWxjdWxhdGUgdGhlIHdvcmQgc3BhY2luZyBhbmQgZGVmaW5lIGluIGJ5IHVzaW5nIHRoZSBjc3MgcHJvcGVydHlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdqdXN0aWZ5Jykge1xuICAgICAgICAgICAgdmFyIGNvdW50U3BhY2VzID0gbGluZXNbaV1bMF1bMF0uc3BsaXQoJyAnKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ3dvcmQtc3BhY2luZyddID0gc3BhY2UgLyBjb3VudFNwYWNlczsgLy9pZ25vcmUgdGhlIGxhc3QgbGluZSBpbiBqdXN0aWZ5IG1vZGVcblxuICAgICAgICAgICAgaWYgKGkgPT09IGxpbmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ3dvcmQtc3BhY2luZyddID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuUmVuZGVyVGV4dEZyYWdtZW50ID0gZnVuY3Rpb24gKHRleHQsIHN0eWxlKSB7XG4gICAgICB2YXIgZGVmYXVsdEZvbnRTaXplLCBmb250LCBtYXhMaW5lSGVpZ2h0O1xuICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcblxuICAgICAgaWYgKHRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gdGhpcy5wZGYubWFyZ2luc19kb2MuYm90dG9tIDwgdGhpcy55ICsgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIkVUXCIsIFwiUVwiLCBcIlFcIik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5wZGYuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMucGRmLmdldE51bWJlck9mUGFnZXMoKSA9PT0gY3VycmVudFBhZ2VOdW1iZXIpIHRoaXMucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgZWxzZSB0aGlzLnBkZi5zZXRQYWdlKGN1cnJlbnRQYWdlTnVtYmVyICsgMSk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMucGRmLm1hcmdpbnNfZG9jLnRvcDtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJxXCIsIFwicVwiLCBcIkJUXCIsIHRoaXMuZ2V0UGRmQ29sb3Ioc3R5bGUuY29sb3IpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpOyAvL21vdmUgY3Vyc29yIGJ5IG9uZSBsaW5lIG9uIG5ldyBwYWdlXG5cbiAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIHN0eWxlW1wibGluZS1oZWlnaHRcIl0sIHN0eWxlW1wiZm9udC1zaXplXCJdKTtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoMCwgKC0xICogZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSwgXCJUZFwiKTtcbiAgICAgIH1cblxuICAgICAgZm9udCA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoc3R5bGVbXCJmb250LWZhbWlseVwiXSwgc3R5bGVbXCJmb250LXN0eWxlXCJdKTsgLy8gdGV4dCBjb2xvclxuXG4gICAgICB2YXIgcGRmVGV4dENvbG9yID0gdGhpcy5nZXRQZGZDb2xvcihzdHlsZVtcImNvbG9yXCJdKTtcblxuICAgICAgaWYgKHBkZlRleHRDb2xvciAhPT0gdGhpcy5sYXN0VGV4dENvbG9yKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKHBkZlRleHRDb2xvcik7XG4gICAgICAgIHRoaXMubGFzdFRleHRDb2xvciA9IHBkZlRleHRDb2xvcjtcbiAgICAgIH0gLy9zZXQgdGhlIHdvcmQgc3BhY2luZyBmb3IgZS5nLiBqdXN0aWZ5IHN0eWxlXG5cblxuICAgICAgaWYgKHN0eWxlWyd3b3JkLXNwYWNpbmcnXSAhPT0gdW5kZWZpbmVkICYmIHN0eWxlWyd3b3JkLXNwYWNpbmcnXSA+IDApIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoc3R5bGVbJ3dvcmQtc3BhY2luZyddLnRvRml4ZWQoMiksIFwiVHdcIik7XG4gICAgICB9XG5cblxuICAgICAgdmFyIHBkZkVzY2FwZTE2ID0gZnVuY3Rpb24odGV4dCwgZm9udCkge1xuICAgICAgICB2YXIgd2lkdGhzID0gZm9udC5tZXRhZGF0YS5Vbmljb2RlLndpZHRocztcbiAgICAgICAgdmFyIHBhZHogPSBbXCJcIiwgXCIwXCIsIFwiMDBcIiwgXCIwMDBcIiwgXCIwMDAwXCJdO1xuICAgICAgICB2YXIgYXIgPSBbXCJcIl07XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGV4dC5sZW5ndGgsIHQ7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICB0ID0gZm9udC5tZXRhZGF0YS5jaGFyYWN0ZXJUb0dseXBoKHRleHQuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgZm9udC5tZXRhZGF0YS5nbHlJZHNVc2VkLnB1c2godCk7XG4gICAgICAgICAgZm9udC5tZXRhZGF0YS50b1VuaWNvZGVbdF0gPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgaWYgKHdpZHRocy5pbmRleE9mKHQpID09IC0xKSB7XG4gICAgICAgICAgICB3aWR0aHMucHVzaCh0KTtcbiAgICAgICAgICAgIHdpZHRocy5wdXNoKFtwYXJzZUludChmb250Lm1ldGFkYXRhLndpZHRoT2ZHbHlwaCh0KSwgMTApXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ID09IFwiMFwiKSB7XG4gICAgICAgICAgICAvL1NwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gY21hcC5cbiAgICAgICAgICAgIHJldHVybiBhci5qb2luKFwiXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ID0gdC50b1N0cmluZygxNik7XG4gICAgICAgICAgICBhci5wdXNoKHBhZHpbNCAtIHQubGVuZ3RoXSwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhci5qb2luKFwiXCIpO1xuICAgICAgfTtcblxuICAgICAgdmFyIHV0ZjhUZXh0RnVuY3Rpb24gPSBmdW5jdGlvbih0ZXh0LCBmb250KSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGV4dCB8fCBcIlwiO1xuICAgIFxuICAgICAgICB2YXIgc3RyID0gXCJcIixcbiAgICAgICAgICBzID0gMCxcbiAgICAgICAgICBjbWFwQ29uZmlybTtcbiAgICAgICAgdmFyIHN0clRleHQgPSBcIlwiO1xuICAgICAgICB2YXIgZW5jb2RpbmcgPSBmb250LmVuY29kaW5nO1xuICAgIFxuICAgICAgICBpZiAoZm9udC5lbmNvZGluZyAhPT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdHJUZXh0ID0gdGV4dDtcbiAgICBcbiAgICAgICAgZm9yIChzID0gMDsgcyA8IHN0clRleHQubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgICBpZiAoZm9udC5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShcImNtYXBcIikpIHtcbiAgICAgICAgICAgIGNtYXBDb25maXJtID0gZm9udC5tZXRhZGF0YS5jbWFwLnVuaWNvZGUuY29kZU1hcFtzdHJUZXh0W3NdLmNoYXJDb2RlQXQoMCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWNtYXBDb25maXJtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHN0clRleHRbc10uY2hhckNvZGVBdCgwKSA8IDI1NiAmJlxuICAgICAgICAgICAgICBmb250Lm1ldGFkYXRhLmhhc093blByb3BlcnR5KFwiVW5pY29kZVwiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHN0ciArPSBzdHJUZXh0W3NdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RyICs9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciArPSBzdHJUZXh0W3NdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgaWYgKHBhcnNlSW50KGZvbnQuaWQuc2xpY2UoMSkpIDwgMTQgfHwgZW5jb2RpbmcgPT09IFwiV2luQW5zaUVuY29kaW5nXCIpIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUoc3RyLCBrZXkpXG4gICAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oY3YpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGN2LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICAgIHJlc3VsdCA9IHBkZkVzY2FwZTE2KHN0ciwgZm9udCk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07ICAgICAgXG5cbiAgICAgIC8vIHZhciBlc2NhcGVkVGV4dCA9IHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KTtcbiAgICAgIC8vIHZhciBlc2NhcGVkVGV4dCA9IHV0ZjhUZXh0RnVuY3Rpb24odGV4dCwgZm9udCk7XG4gICAgICAvLyBpZihlc2NhcGVkVGV4dCAhPSB0ZXh0KSB7XG4gICAgICAvLyAgIGVzY2FwZWRUZXh0ID0gXCI8XCIgKyBlc2NhcGVkVGV4dCArIFwiPlwiO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgZXNjYXBlZFRleHQgPSBcIihcIiArIGVzY2FwZWRUZXh0ICsgXCIpXCI7XG4gICAgICAvLyB9XG5cbiAgICAgIHZhciBlc2NhcGVkVGV4dCA9IFwiXCI7XG4gICAgICBpZihmb250LmVuY29kaW5nICE9PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICBlc2NhcGVkVGV4dCA9IFwiKFwiICsgdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHRleHQpICsgXCIpXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlc2NhcGVkVGV4dCA9IFwiPFwiICsgdXRmOFRleHRGdW5jdGlvbih0ZXh0LCBmb250KSArIFwiPlwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIi9cIiArIGZvbnQuaWQsIChkZWZhdWx0Rm9udFNpemUgKiBzdHlsZVtcImZvbnQtc2l6ZVwiXSkudG9GaXhlZCgyKSwgXCJUZlwiLCBlc2NhcGVkVGV4dCArIFwiIFRqXCIpOyAvL3NldCB0aGUgd29yZCBzcGFjaW5nIGJhY2sgdG8gbmV1dHJhbCA9PiAwXG5cbiAgICAgIGlmIChzdHlsZVsnd29yZC1zcGFjaW5nJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZSgwLCBcIlR3XCIpO1xuICAgICAgfVxuICAgIH07IC8vIEFjY2VwdHMgI0ZGRkZGRiwgcmdiKGludCxpbnQsaW50KSwgb3IgQ1NTIENvbG9yIE5hbWVcblxuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmdldFBkZkNvbG9yID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICB2YXIgdGV4dENvbG9yO1xuICAgICAgdmFyIHIsIGcsIGI7XG4gICAgICB2YXIgcnggPSAvcmdiXFxzKlxcKFxccyooXFxkKyksXFxzKihcXGQrKSxcXHMqKFxcZCtcXHMqKVxcKS87XG4gICAgICB2YXIgbSA9IHJ4LmV4ZWMoc3R5bGUpO1xuXG4gICAgICBpZiAobSAhPSBudWxsKSB7XG4gICAgICAgIHIgPSBwYXJzZUludChtWzFdKTtcbiAgICAgICAgZyA9IHBhcnNlSW50KG1bMl0pO1xuICAgICAgICBiID0gcGFyc2VJbnQobVszXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSBcInN0cmluZ1wiICYmIHN0eWxlLmNoYXJBdCgwKSAhPSAnIycpIHtcbiAgICAgICAgICB2YXIgcmdiQ29sb3IgPSBuZXcgUkdCQ29sb3Ioc3R5bGUpO1xuXG4gICAgICAgICAgaWYgKHJnYkNvbG9yLm9rKSB7XG4gICAgICAgICAgICBzdHlsZSA9IHJnYkNvbG9yLnRvSGV4KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlID0gJyMwMDAwMDAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHIgPSBzdHlsZS5zdWJzdHJpbmcoMSwgMyk7XG4gICAgICAgIHIgPSBwYXJzZUludChyLCAxNik7XG4gICAgICAgIGcgPSBzdHlsZS5zdWJzdHJpbmcoMywgNSk7XG4gICAgICAgIGcgPSBwYXJzZUludChnLCAxNik7XG4gICAgICAgIGIgPSBzdHlsZS5zdWJzdHJpbmcoNSwgNyk7XG4gICAgICAgIGIgPSBwYXJzZUludChiLCAxNik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycgJiYgL14jWzAtOUEtRmEtZl17Nn0kLy50ZXN0KHIpKSB7XG4gICAgICAgIHZhciBoZXggPSBwYXJzZUludChyLnN1YnN0cigxKSwgMTYpO1xuICAgICAgICByID0gaGV4ID4+IDE2ICYgMjU1O1xuICAgICAgICBnID0gaGV4ID4+IDggJiAyNTU7XG4gICAgICAgIGIgPSBoZXggJiAyNTU7XG4gICAgICB9XG5cbiAgICAgIHZhciBmMyA9IHRoaXMuZjM7XG5cbiAgICAgIGlmIChyID09PSAwICYmIGcgPT09IDAgJiYgYiA9PT0gMCB8fCB0eXBlb2YgZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGV4dENvbG9yID0gZjMociAvIDI1NSkgKyAnIGcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dENvbG9yID0gW2YzKHIgLyAyNTUpLCBmMyhnIC8gMjU1KSwgZjMoYiAvIDI1NSksICdyZyddLmpvaW4oJyAnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRleHRDb2xvcjtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmYzID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDMpOyAvLyBJZSwgJS4zZlxuICAgIH0sIFJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJQYXJhZ3JhcGggPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHZhciBibG9ja3N0eWxlLCBkZWZhdWx0Rm9udFNpemUsIGZvbnRUb1VuaXRSYXRpbywgZnJhZ21lbnRzLCBpLCBsLCBsaW5lLCBsaW5lcywgbWF4TGluZUhlaWdodCwgb3V0LCBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyLCBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZSwgcHJpb3JibG9ja3N0eWxlLCBzdHlsZXMsIGZvbnRTaXplO1xuICAgICAgZnJhZ21lbnRzID0gUHVyZ2VXaGl0ZVNwYWNlKHRoaXMucGFyYWdyYXBoLnRleHQpO1xuICAgICAgc3R5bGVzID0gdGhpcy5wYXJhZ3JhcGguc3R5bGU7XG4gICAgICBibG9ja3N0eWxlID0gdGhpcy5wYXJhZ3JhcGguYmxvY2tzdHlsZTtcbiAgICAgIHByaW9yYmxvY2tzdHlsZSA9IHRoaXMucGFyYWdyYXBoLnByaW9yYmxvY2tzdHlsZSB8fCB7fTtcbiAgICAgIHRoaXMucGFyYWdyYXBoID0ge1xuICAgICAgICB0ZXh0OiBbXSxcbiAgICAgICAgc3R5bGU6IFtdLFxuICAgICAgICBibG9ja3N0eWxlOiB7fSxcbiAgICAgICAgcHJpb3JibG9ja3N0eWxlOiBibG9ja3N0eWxlXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZyYWdtZW50cy5qb2luKFwiXCIpLnRyaW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxpbmVzID0gdGhpcy5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyhmcmFnbWVudHMsIHN0eWxlcyk7XG4gICAgICBsaW5lID0gdm9pZCAwO1xuICAgICAgbWF4TGluZUhlaWdodCA9IHZvaWQgMDtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuICAgICAgZm9udFRvVW5pdFJhdGlvID0gZGVmYXVsdEZvbnRTaXplIC8gdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICB0aGlzLnByaW9yTWFyZ2luQm90dG9tID0gdGhpcy5wcmlvck1hcmdpbkJvdHRvbSB8fCAwO1xuICAgICAgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUgPSAoTWF0aC5tYXgoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tdG9wXCJdIHx8IDApIC0gdGhpcy5wcmlvck1hcmdpbkJvdHRvbSwgMCkgKyAoYmxvY2tzdHlsZVtcInBhZGRpbmctdG9wXCJdIHx8IDApKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgIHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXIgPSAoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tYm90dG9tXCJdIHx8IDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLWJvdHRvbVwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICB0aGlzLnByaW9yTWFyZ2luQm90dG9tID0gYmxvY2tzdHlsZVtcIm1hcmdpbi1ib3R0b21cIl0gfHwgMDtcblxuICAgICAgaWYgKGJsb2Nrc3R5bGVbJ3BhZ2UtYnJlYWstYmVmb3JlJ10gPT09ICdhbHdheXMnKSB7XG4gICAgICAgIHRoaXMucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUgPSAoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tdG9wXCJdIHx8IDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLXRvcFwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICB9XG5cbiAgICAgIG91dCA9IHRoaXMucGRmLmludGVybmFsLndyaXRlO1xuICAgICAgaSA9IHZvaWQgMDtcbiAgICAgIGwgPSB2b2lkIDA7XG4gICAgICB0aGlzLnkgKz0gcGFyYWdyYXBoc3BhY2luZ19iZWZvcmU7XG4gICAgICBvdXQoXCJxXCIsIFwiQlQgMCBnXCIsIHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcodGhpcy54KSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nKHRoaXMueSksIFwiVGRcIik7IC8vc3RvcmVzIHRoZSBjdXJyZW50IGluZGVudCBvZiBjdXJzb3IgcG9zaXRpb25cblxuICAgICAgdmFyIGN1cnJlbnRJbmRlbnQgPSAwO1xuXG4gICAgICB3aGlsZSAobGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGxpbmUgPSBsaW5lcy5zaGlmdCgpO1xuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gMDtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGwgPSBsaW5lLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgIGlmIChsaW5lW2ldWzBdLnRyaW0oKSkge1xuICAgICAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIGxpbmVbaV1bMV1bXCJsaW5lLWhlaWdodFwiXSwgbGluZVtpXVsxXVtcImZvbnQtc2l6ZVwiXSk7XG4gICAgICAgICAgICBmb250U2l6ZSA9IGxpbmVbaV1bMV1bXCJmb250LXNpemVcIl0gKiA3O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfSAvL2lmIHdlIGhhdmUgdG8gbW92ZSB0aGUgY3Vyc29yIHRvIGFkYXB0IHRoZSBpbmRlbnRcblxuXG4gICAgICAgIHZhciBpbmRlbnRNb3ZlID0gMDtcbiAgICAgICAgdmFyIHdhbnRlZEluZGVudCA9IDA7IC8vaWYgYSBtYXJnaW4gd2FzIGFkZGVkIChieSBlLmcuIGEgdGV4dC1hbGlnbm1lbnQpLCBtb3ZlIHRoZSBjdXJzb3JcblxuICAgICAgICBpZiAobGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdICE9PSB1bmRlZmluZWQgJiYgbGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdID4gMCkge1xuICAgICAgICAgIHdhbnRlZEluZGVudCA9IHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcobGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdKTtcbiAgICAgICAgICBpbmRlbnRNb3ZlID0gd2FudGVkSW5kZW50IC0gY3VycmVudEluZGVudDtcbiAgICAgICAgICBjdXJyZW50SW5kZW50ID0gd2FudGVkSW5kZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluZGVudE1vcmUgPSBNYXRoLm1heChibG9ja3N0eWxlW1wibWFyZ2luLWxlZnRcIl0gfHwgMCwgMCkgKiBmb250VG9Vbml0UmF0aW87IC8vbW92ZSB0aGUgY3Vyc29yXG5cbiAgICAgICAgb3V0KGluZGVudE1vdmUgKyBpbmRlbnRNb3JlLCAoLTEgKiBkZWZhdWx0Rm9udFNpemUgKiBtYXhMaW5lSGVpZ2h0KS50b0ZpeGVkKDIpLCBcIlRkXCIpO1xuICAgICAgICBpID0gMDtcbiAgICAgICAgbCA9IGxpbmUubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgICAgaWYgKGxpbmVbaV1bMF0pIHtcbiAgICAgICAgICAgIHRoaXMuUmVuZGVyVGV4dEZyYWdtZW50KGxpbmVbaV1bMF0sIGxpbmVbaV1bMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMueSArPSBtYXhMaW5lSGVpZ2h0ICogZm9udFRvVW5pdFJhdGlvOyAvL2lmIHNvbWUgd2F0Y2hlciBmdW5jdGlvbiB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bCwgc28gZS5nLiBtYXJnaW4gYW5kIHdpZHRocyB3ZXJlIGNoYW5nZWQsXG4gICAgICAgIC8vcmVzZXQgbGluZSBkcmF3aW5nIGFuZCBjYWxjdWxhdGUgcG9zaXRpb24gYW5kIGxpbmVzIGFnYWluXG4gICAgICAgIC8vZS5nLiB0byBzdG9wIHRleHQgZmxvYXRpbmcgYXJvdW5kIGFuIGltYWdlXG5cbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGxpbmVbMF1bMV0pICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgbG9jYWxGcmFnbWVudHMgPSBbXTtcbiAgICAgICAgICB2YXIgbG9jYWxTdHlsZXMgPSBbXTsgLy9jcmVhdGUgZnJhZ21lbnQgYXJyYXkgb2ZcblxuICAgICAgICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsTGluZSkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGwgPSBsb2NhbExpbmUubGVuZ3RoO1xuXG4gICAgICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgICAgICBpZiAobG9jYWxMaW5lW2ldWzBdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxGcmFnbWVudHMucHVzaChsb2NhbExpbmVbaV1bMF0gKyAnICcpO1xuICAgICAgICAgICAgICAgIGxvY2FsU3R5bGVzLnB1c2gobG9jYWxMaW5lW2ldWzFdKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy9zcGxpdCBsaW5lcyBhZ2FpbiBkdWUgdG8gcG9zc2libGUgY29vcmRpbmF0ZSBjaGFuZ2VzXG5cbiAgICAgICAgICBsaW5lcyA9IHRoaXMuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMoUHVyZ2VXaGl0ZVNwYWNlKGxvY2FsRnJhZ21lbnRzKSwgbG9jYWxTdHlsZXMpOyAvL3JlcG9zaXRpb24gdGhlIGN1cnJlbnQgY3Vyc29yXG5cbiAgICAgICAgICBvdXQoXCJFVFwiLCBcIlFcIik7XG4gICAgICAgICAgb3V0KFwicVwiLCBcIkJUIDAgZ1wiLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYiAmJiB0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYi5jYWxsKHRoaXMsIHRoaXMueCAtIDksIHRoaXMueSAtIGZvbnRTaXplIC8gMik7XG4gICAgICB9XG5cbiAgICAgIG91dChcIkVUXCIsIFwiUVwiKTtcbiAgICAgIHJldHVybiB0aGlzLnkgKz0gcGFyYWdyYXBoc3BhY2luZ19hZnRlcjtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNldEJsb2NrQm91bmRhcnkgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclBhcmFncmFwaChjYik7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRCbG9ja1N0eWxlID0gZnVuY3Rpb24gKGNzcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGUgPSBjc3M7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5hZGRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNzcykge1xuICAgICAgdGhpcy5wYXJhZ3JhcGgudGV4dC5wdXNoKHRleHQpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoLnN0eWxlLnB1c2goY3NzKTtcbiAgICB9O1xuXG4gICAgRm9udE5hbWVEQiA9IHtcbiAgICAgIGhlbHZldGljYTogXCJoZWx2ZXRpY2FcIixcbiAgICAgIFwic2Fucy1zZXJpZlwiOiBcImhlbHZldGljYVwiLFxuICAgICAgXCJ0aW1lcyBuZXcgcm9tYW5cIjogXCJ0aW1lc1wiLFxuICAgICAgc2VyaWY6IFwidGltZXNcIixcbiAgICAgIHRpbWVzOiBcInRpbWVzXCIsXG4gICAgICBtb25vc3BhY2U6IFwiY291cmllclwiLFxuICAgICAgY291cmllcjogXCJjb3VyaWVyXCJcbiAgICB9O1xuICAgIEZvbnRXZWlnaHRNYXAgPSB7XG4gICAgICAxMDA6IFwibm9ybWFsXCIsXG4gICAgICAyMDA6IFwibm9ybWFsXCIsXG4gICAgICAzMDA6IFwibm9ybWFsXCIsXG4gICAgICA0MDA6IFwibm9ybWFsXCIsXG4gICAgICA1MDA6IFwiYm9sZFwiLFxuICAgICAgNjAwOiBcImJvbGRcIixcbiAgICAgIDcwMDogXCJib2xkXCIsXG4gICAgICA4MDA6IFwiYm9sZFwiLFxuICAgICAgOTAwOiBcImJvbGRcIixcbiAgICAgIG5vcm1hbDogXCJub3JtYWxcIixcbiAgICAgIGJvbGQ6IFwiYm9sZFwiLFxuICAgICAgYm9sZGVyOiBcImJvbGRcIixcbiAgICAgIGxpZ2h0ZXI6IFwibm9ybWFsXCJcbiAgICB9O1xuICAgIEZvbnRTdHlsZU1hcCA9IHtcbiAgICAgIG5vcm1hbDogXCJub3JtYWxcIixcbiAgICAgIGl0YWxpYzogXCJpdGFsaWNcIixcbiAgICAgIG9ibGlxdWU6IFwiaXRhbGljXCJcbiAgICB9O1xuICAgIFRleHRBbGlnbk1hcCA9IHtcbiAgICAgIGxlZnQ6IFwibGVmdFwiLFxuICAgICAgcmlnaHQ6IFwicmlnaHRcIixcbiAgICAgIGNlbnRlcjogXCJjZW50ZXJcIixcbiAgICAgIGp1c3RpZnk6IFwianVzdGlmeVwiXG4gICAgfTtcbiAgICBGbG9hdE1hcCA9IHtcbiAgICAgIG5vbmU6ICdub25lJyxcbiAgICAgIHJpZ2h0OiAncmlnaHQnLFxuICAgICAgbGVmdDogJ2xlZnQnXG4gICAgfTtcbiAgICBDbGVhck1hcCA9IHtcbiAgICAgIG5vbmU6ICdub25lJyxcbiAgICAgIGJvdGg6ICdib3RoJ1xuICAgIH07XG4gICAgVW5pdGVkTnVtYmVyTWFwID0ge1xuICAgICAgbm9ybWFsOiAxXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBIVE1MLWZvcm1hdHRlZCB0ZXh0IGludG8gZm9ybWF0dGVkIFBERiB0ZXh0LlxuICAgICAqXG4gICAgICogTm90ZXM6XG4gICAgICogMjAxMi0wNy0xOFxuICAgICAqIFBsdWdpbiByZWxpZXMgb24gaGF2aW5nIGJyb3dzZXIsIERPTSBhcm91bmQuIFRoZSBIVE1MIGlzIHB1c2hlZCBpbnRvIGRvbSBhbmQgdHJhdmVyc2VkLlxuICAgICAqIFBsdWdpbiByZWxpZXMgb24galF1ZXJ5IGZvciBDU1MgZXh0cmFjdGlvbi5cbiAgICAgKiBUYXJnZXRpbmcgSFRNTCBvdXRwdXQgZnJvbSBNYXJrZG93biB0ZW1wbGF0aW5nLCB3aGljaCBpcyBhIHZlcnkgc2ltcGxlXG4gICAgICogbWFya3VwIC0gZGl2LCBzcGFuLCBlbSwgc3Ryb25nLCBwLiBObyBici1iYXNlZCBwYXJhZ3JhcGggc2VwYXJhdGlvbiBzdXBwb3J0ZWQgZXhwbGljaXRseSAoYnV0IHN0aWxsIG1heSB3b3JrLilcbiAgICAgKiBJbWFnZXMsIHRhYmxlcyBhcmUgTk9UIHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gSFRNTCB7U3RyaW5nfE9iamVjdH0gSFRNTC1mb3JtYXR0ZWQgdGV4dCwgb3IgcG9pbnRlciB0byBET00gZWxlbWVudCB0aGF0IGlzIHRvIGJlIHJlbmRlcmVkIGludG8gUERGLlxuICAgICAqIEBwYXJhbSB4IHtOdW1iZXJ9IHN0YXJ0aW5nIFggY29vcmRpbmF0ZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzLlxuICAgICAqIEBwYXJhbSB5IHtOdW1iZXJ9IHN0YXJ0aW5nIFkgY29vcmRpbmF0ZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzLlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyB7T2JqZWN0fSBBZGRpdGlvbmFsIC8gb3B0aW9uYWwgdmFyaWFibGVzIGNvbnRyb2xsaW5nIHBhcnNpbmcsIHJlbmRlcmluZy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBqc1BERiBpbnN0YW5jZVxuICAgICAqL1xuXG4gICAganNQREZBUEkuZnJvbUhUTUwgPSBmdW5jdGlvbiAoSFRNTCwgeCwgeSwgc2V0dGluZ3MsIGNhbGxiYWNrLCBtYXJnaW5zKSB7XG5cbiAgICAgIHRoaXMubWFyZ2luc19kb2MgPSBtYXJnaW5zIHx8IHtcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBib3R0b206IDBcbiAgICAgIH07XG4gICAgICBpZiAoIXNldHRpbmdzKSBzZXR0aW5ncyA9IHt9O1xuICAgICAgaWYgKCFzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyA9IHt9O1xuICAgICAgcmV0dXJuIHByb2Nlc3ModGhpcywgSFRNTCwgaXNOYU4oeCkgPyA0IDogeCwgaXNOYU4oeSkgPyA0IDogeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbiAgICB9O1xuICB9KShqc3BkZi5qc1BERi5BUEkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanNcbi8vIG1vZHVsZSBpZCA9IDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=
11101
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBmMGI0NDFiYzY1M2Q0ODNlOTFhNSIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9Iiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9wZGYudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGZpZWxkLnRzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9Iiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZW1wdHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9maWxlLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbXVsdGlwbGV0ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhdGluZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfdGV4dGJveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY3VzdG9tLnRzIiwid2VicGFjazovLy8uL3NyYy9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vfi9ub2RlLWludGVydmFsLXRyZWUvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vc2hhbGxvd2VxdWFsL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbi50cyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbURBQTJDLGNBQWM7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUM5REE7QUFBQSxJQUFJLGFBQWEsR0FBRyxVQUFTLENBQU0sRUFBRSxDQUFNO0lBQ3ZD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QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xKLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUssU0FBVSxTQUFTLENBQUMsT0FBWSxFQUFFLFVBQWUsRUFBRSxDQUFNLEVBQUUsU0FBYztJQUMzRSxTQUFTLEtBQUssQ0FBQyxLQUFVLElBQUksT0FBTyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBWSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0SCxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLE9BQVksRUFBRSxNQUFXO1FBQy9ELFNBQVMsU0FBUyxDQUFDLEtBQVUsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUFFO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FBRSxDQUFDLENBQUM7UUFDaEcsU0FBUyxRQUFRLENBQUMsS0FBVSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FBRTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQUUsQ0FBQyxDQUFDO1FBQ25HLFNBQVMsSUFBSSxDQUFDLE1BQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVLLFNBQVUsV0FBVyxDQUFDLE9BQVksRUFBRSxJQUFTO0lBQy9DLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQU8sRUFBRSxFQUFFLEdBQUcsRUFBTyxFQUFFLEVBQUUsRUFBRSxDQUFNLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLENBQUM7SUFDL0ksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsY0FBYSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6SixTQUFTLElBQUksQ0FBQyxDQUFNLElBQUksT0FBTyxVQUFVLENBQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxTQUFTLElBQUksQ0FBQyxFQUFPO1FBQ2pCLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUM7WUFBRSxJQUFJO2dCQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNYLEtBQUssQ0FBQyxDQUFDO29CQUFDLEtBQUssQ0FBQzt3QkFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUFDLE1BQU07b0JBQzlCLEtBQUssQ0FBQzt3QkFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUN4RCxLQUFLLENBQUM7d0JBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQUMsU0FBUztvQkFDakQsS0FBSyxDQUFDO3dCQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQUMsU0FBUztvQkFDakQ7d0JBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTs0QkFBUSxDQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUFDLFNBQVM7eUJBQUU7d0JBQ25ILElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsZ0NBQWdDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IseUJBQXlCO0FBQ3hEO0FBQ0EsaUZBQWlGO0FBQ2pGO0FB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QTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEMsd0NBQXdDLGlGQUFpRjtBQUN6SDtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFF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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSx5RkFBeUY7QUFDekY7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGtCQUFrQjtBQUNoQyxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsb0I7QUFDZCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHFHOzs7Ozs7O0FDNTJGRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQyxpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4Qix3QkFBd0IsT0FBTztBQUMvQixpQkFBaUIsT0FBTztBQUN4Qjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyIsImZpbGUiOiIuL3BhY2thZ2VzL3N1cnZleS1wZGYvc3VydmV5LnBkZi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInN1cnZleS1jb3JlXCIpLCByZXF1aXJlKFwianNwZGZcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJTdXJ2ZXlQREZcIiwgW1wic3VydmV5LWNvcmVcIiwgXCJqc3BkZlwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTdXJ2ZXlQREZcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcImpzcGRmXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTdXJ2ZXlQREZcIl0gPSBmYWN0b3J5KHJvb3RbXCJTdXJ2ZXlcIl0sIHJvb3RbXCJqc3BkZlwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzdfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOF9fKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmMGI0NDFiYzY1M2Q0ODNlOTFhNSIsImRlY2xhcmUgdmFyIFJlZmxlY3Q6IGFueTtcblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkOiBhbnksIGI6IGFueSk6IGFueSB7XG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkOiBhbnksIGI6IGFueSkge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gJ2Z1bmN0aW9uJyAmJiBiICE9PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDbGFzcyBleHRlbmRzIHZhbHVlICcgKyBTdHJpbmcoYikgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwnKTtcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gICAgX19hc3NpZ24gPSAoPGFueT5PYmplY3QpLmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0OiBhbnkpIHtcbiAgICAgICAgZm9yICh2YXIgczogYW55LCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHM6IGFueSwgZTogYW55KSB7XG4gICAgdmFyIHQ6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHFbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcVtpXSkpXG4gICAgICAgICAgICAgICAgdFtxW2ldXSA9IHNbcVtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9yczogYW55LCB0YXJnZXQ6IGFueSwga2V5OiBhbnksIGRlc2M6IGFueSkge1xuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gJ2Z1bmN0aW9uJykgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnOiBhbnksIF9hcmd1bWVudHM6IGFueSwgUDogYW55LCBnZW5lcmF0b3I6IGFueSkge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlOiBhbnkpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmU6IGFueSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZTogYW55KSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZTogYW55KSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyd0aHJvdyddKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQ6IGFueSkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnOiBhbnksIGJvZHk6IGFueSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IDxhbnk+W10sIG9wczogPGFueT5bXSB9LCBmOiBhbnksIHk6IGFueSwgdDogYW55LCBnOiBhbnk7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksICd0aHJvdyc6IHZlcmIoMSksICdyZXR1cm4nOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuOiBhbnkpIHsgcmV0dXJuIGZ1bmN0aW9uICh2OiBhbnkpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3A6IGFueSkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLicpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbJ3JldHVybiddIDogb3BbMF0gPyB5Wyd0aHJvdyddIHx8ICgodCA9IHlbJ3JldHVybiddKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgKDxhbnk+XykgPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5ICh0bzogYW55LCBmcm9tOiBhbnksIHBhY2s6IGFueSkge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOiBhbnk7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiwgUXVlc3Rpb25SYXRpbmdNb2RlbCwgUXVlc3Rpb25GaWxlTW9kZWwsIExvY2FsaXphYmxlU3RyaW5nLCBRdWVzdGlvblNlbGVjdEJhc2UsIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuL2VudHJpZXMvcGRmJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmltcG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbCc7XG5pbXBvcnQgeyBEZXNjcmlwdGlvbkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbic7XG5pbXBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQnO1xuaW1wb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9saW5rJztcbmltcG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5pbXBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9pbWFnZSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBBZG9ybmVyc09wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5SGVscGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIEVQU0lMT046IG51bWJlciA9IDIuMjIwNDQ2MDQ5MjUwMzEzMDgwODQ3MjYzMzM2MTgxNmUtMTU7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjc7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjM7XG4gICAgcHVibGljIHN0YXRpYyBERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDIuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE9USEVSX1JPV1NfQ09VTlQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfTUlOX1dJRFRIOiBudW1iZXIgPSAzO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9IRUlHSFQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfQ09MVU1OX1dJRFRIOiBudW1iZXIgPSA1O1xuICAgIHB1YmxpYyBzdGF0aWMgTUFUUklYX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX0NPVU5UOiBudW1iZXIgPSA0O1xuICAgIHB1YmxpYyBzdGF0aWMgSU1BR0VQSUNLRVJfUkFUSU86IG51bWJlciA9IDQuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE1VTFRJUExFVEVYVF9URVhUX1BFUlM6IG51bWJlciA9IE1hdGguRSAvIDEwLjA7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RBSUxfVEVYVF9TQ0FMRTogbnVtYmVyID0gMC4yNDtcbiAgICBwdWJsaWMgc3RhdGljIFNFTEVDVF9JVEVNX0ZMQVRfU0NBTEU6IG51bWJlciA9IDAuOTU7XG4gICAgcHVibGljIHN0YXRpYyBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fQ09MVU1OUzogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fSVRFTV9URVhUOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfVklTSUJMRTogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU0NBTEU6IG51bWJlciA9IDAuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjg7XG4gICAgcHVibGljIHN0YXRpYyBVTlZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjI7XG4gICAgcHVibGljIHN0YXRpYyBSQURJVVNfU0NBTEU6IG51bWJlciA9IDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0ZPTlRfU0NBTEU6IG51bWJlciA9IDEuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU6IG51bWJlciA9IDAuMztcbiAgICBwdWJsaWMgc3RhdGljIEhUTUxfVE9fSU1BR0VfUVVBTElUWTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfQ09MT1I6IHN0cmluZyA9ICcjOWY5ZjlmJztcbiAgICBwdWJsaWMgc3RhdGljIFRFWFRfQ09MT1I6IHN0cmluZyA9ICcjNDA0MDQwJztcbiAgICBwdWJsaWMgc3RhdGljIEJBQ0tHUk9VTkRfQ09MT1I6IHN0cmluZyA9ICcjRkZGRkZGJztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0xPQ0FUSU9OX01BVFJJWDogc3RyaW5nID0gJ21hdHJpeCc7XG4gICAgcHVibGljIHN0YXRpYyBTVEFOREFSRF9GT05UOiBzdHJpbmcgPSAnaGVsdmV0aWNhJztcbiAgICBwdWJsaWMgc3RhdGljIENVU1RPTV9GT05UX0VOQ09ESU5HOiBzdHJpbmcgPSAnSWRlbnRpdHktSCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlV2lkdGgod2lkdGg6IHN0cmluZywgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgY29sdW1uc0NvdW50OiBudW1iZXIgPSAxKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHdpZHRoLmluZGV4T2YoJ2NhbGMnKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1heFdpZHRoIC8gY29sdW1uc0NvdW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlOiBudW1iZXIgPSBwYXJzZUZsb2F0KHdpZHRoKTtcbiAgICAgICAgY29uc3QgdW5pdDogc3RyaW5nID0gd2lkdGgucmVwbGFjZSgvW15BLVphLXpdL2csICcnKTtcbiAgICAgICAgbGV0IGs6IG51bWJlcjtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICAgICAgayA9IDEuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDI1LjQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjbSc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyAyLjU0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHgnOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gOTYuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3BjJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VtJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2V4JzpcbiAgICAgICAgICAgICAgICBrID0gNi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgICAgIGsgPSBtYXhXaWR0aCAvIDEwMC4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSAqIGssIG1heFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBweFRvUHQodmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHZhbHVlLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgKiA3Mi4wIC8gOTYuMDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBtZXJnZVJlY3RzKC4uLnJlY3RzOiBJUmVjdFtdKTogSVJlY3Qge1xuICAgICAgICBjb25zdCByZXN1bHRSZWN0OiBJUmVjdCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiByZWN0c1swXS54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdHNbMF0ueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcmVjdHNbMF0ueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHJlY3RzWzBdLnlCb3RcbiAgICAgICAgfTtcbiAgICAgICAgcmVjdHMuZm9yRWFjaCgocmVjdDogSVJlY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueExlZnQgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnhMZWZ0LCByZWN0LnhMZWZ0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueFJpZ2h0ID0gTWF0aC5tYXgocmVzdWx0UmVjdC54UmlnaHQsIHJlY3QueFJpZ2h0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueVRvcCA9IE1hdGgubWluKHJlc3VsdFJlY3QueVRvcCwgcmVjdC55VG9wKSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueUJvdCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueUJvdCwgcmVjdC55Qm90KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRSZWN0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBvaW50KHJlY3Q6IElSZWN0LCBpc0xlZnQ6IGJvb2xlYW4gPSB0cnVlLCBpc1RvcDogYm9vbGVhbiA9IGZhbHNlKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBpc0xlZnQgPyByZWN0LnhMZWZ0IDogcmVjdC54UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBpc1RvcCA/IHJlY3QueVRvcCA6IHJlY3QueUJvdFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlY3QocG9pbnQ6IElQb2ludCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHBvaW50LnhMZWZ0ICsgd2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiAwLjAsXG4gICAgICAgICAgICB4UmlnaHQ6IGNvbnRyb2xsZXIucGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHlUb3A6IDAuMCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIucGFwZXJIZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaG9vc2VIdG1sRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnc3RhbmRhcmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc0N1c3RvbUZvbnQoY29udHJvbGxlciwgY29udHJvbGxlci5mb250TmFtZSkgPyB0aGlzLlNUQU5EQVJEX0ZPTlQgOiBjb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwgPyBjb250cm9sbGVyLmZvbnROYW1lIDogdGhpcy5TVEFOREFSRF9GT05UO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ3NzVGV4dFJ1bGUoZm9udFNpemU6IG51bWJlciwgZm9udFN0eWxlOiBzdHJpbmcsIGZvbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYFwiZm9udC1zaXplOiAke2ZvbnRTaXplfXB0OyBmb250LXdlaWdodDogJHtmb250U3R5bGV9OyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGNvbG9yOiAke3RoaXMuVEVYVF9DT0xPUn07XCJgO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhodG1sOiBzdHJpbmcsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmb250ID0gdGhpcy5jaG9vc2VIdG1sRm9udChjb250cm9sbGVyLCByZW5kZXJBcyk7XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cIl9fc3VydmV5cGRmX2h0bWxcIiBzdHlsZT0ke3RoaXMuZ2VuZXJhdGVDc3NUZXh0UnVsZShcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUsIGNvbnRyb2xsZXIuZm9udFN0eWxlLCBmb250KX0+YCArXG4gICAgICAgICAgICBgPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IDA7IGxpbmUtaGVpZ2h0OiAke2NvbnRyb2xsZXIuZm9udFNpemV9cHQgfSBib2R5IHsgbWFyZ2luOiAwOyB9PC9zdHlsZT4ke2h0bWx9PC9kaXY+YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzcGxpdEh0bWxSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGh0bWxCcmljazogSVBkZkJyaWNrKTogSVBkZkJyaWNrIHtcbiAgICAgICAgY29uc3QgYnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBodG1sSGVpZ2h0OiBudW1iZXIgPSBodG1sQnJpY2suaGVpZ2h0O1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIuZG9jLmdldEZvbnRTaXplKCk7XG4gICAgICAgIGh0bWxCcmljay55Qm90ID0gaHRtbEJyaWNrLnlUb3AgKyBtaW5IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGVtcHR5QnJpY2tDb3VudDogbnVtYmVyID0gTWF0aC5mbG9vcihodG1sSGVpZ2h0IC8gbWluSGVpZ2h0KSAtIDE7XG4gICAgICAgIGJyaWNrcy5wdXNoKGh0bWxCcmljayk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jcmVhdGVQb2ludChodG1sQnJpY2spO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZW1wdHlCcmlja0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGJyaWNrcy5wdXNoKG5ldyBFbXB0eUJyaWNrKHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIGh0bWxCcmljay53aWR0aCwgbWluSGVpZ2h0KSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gbWluSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ0hlaWdodDogbnVtYmVyID0gaHRtbEhlaWdodCAtIChlbXB0eUJyaWNrQ291bnQgKyAxKSAqIG1pbkhlaWdodDtcbiAgICAgICAgaWYgKHJlbWFpbmluZ0hlaWdodCA+IDApIHtcbiAgICAgICAgICAgIGJyaWNrcy5wdXNoKG5ldyBFbXB0eUJyaWNrKHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIGh0bWxCcmljay53aWR0aCwgcmVtYWluaW5nSGVpZ2h0KSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2soLi4uYnJpY2tzKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVQbGFpblRleHRGbGF0PFQgZXh0ZW5kcyBJUGRmQnJpY2s+KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZywgZmFicmljOiBuZXcgKHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSA9PiBUKTogQ29tcG9zaXRlQnJpY2sge1xuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBjb250cm9sbGVyLmRvYy5zcGxpdFRleHRUb1NpemUodGV4dCxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBsaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpemU6IElTaXplID0gY29udHJvbGxlci5tZWFzdXJlVGV4dChsaW5lKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhuZXcgZmFicmljKHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KSwgbGluZSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gc2l6ZS5oZWlnaHQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRleHRGbGF0PFQgZXh0ZW5kcyBJUGRmQnJpY2s+KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBmYWJyaWM6IG5ldyAocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpID0+IFQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnIHx8ICF0aGlzLmhhc0h0bWwodGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBsYWluVGV4dEZsYXQocG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgIHRleHQgOiB0aGlzLmdldExvY1N0cmluZyg8TG9jYWxpemFibGVTdHJpbmc+dGV4dCksIGZhYnJpYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpdEh0bWxSZWN0KGNvbnRyb2xsZXIsIGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQocG9pbnQsIDxRdWVzdGlvbj5xdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayh0aGlzLmdldExvY1N0cmluZyh0ZXh0KSwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBoYXNIdG1sKHRleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm46IFJlZ0V4cCA9IC88XFwvP1thLXpdW1xcc1xcU10qPi9pO1xuICAgICAgICByZXR1cm4gdGV4dC5oYXNIdG1sICYmIChwYXR0ZXJuLnRlc3QoKDxhbnk+dGV4dCkucmVuZGVyZWRUZXh0KSB8fCBwYXR0ZXJuLnRlc3QodGV4dC5yZW5kZXJlZEh0bWwpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0SHRtbE1hcmdpbnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcG9pbnQ6IElQb2ludCk6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gcG9pbnQueExlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IGNvbnRyb2xsZXIubWFyZ2lucy50b3AsXG4gICAgICAgICAgICBib3R0b206IGNvbnRyb2xsZXIubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGggPiBjb250cm9sbGVyLnVuaXRXaWR0aCA/IHdpZHRoIDogY29udHJvbGxlci51bml0V2lkdGhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhUTUxSZWN0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIG1hcmdpbnM6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0sIHJlc3VsdFk6IG51bWJlcik6IElSZWN0IHtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlUGFnZUhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3QgLSBjb250cm9sbGVyLm1hcmdpbnMudG9wO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IChjb250cm9sbGVyLmhlbHBlckRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgLSAxKSAqXG4gICAgICAgICAgICAoY29udHJvbGxlci5mb250U2l6ZSAqIE1hdGguZmxvb3IoYXZhaWxhYmxlUGFnZUhlaWdodCAvIGNvbnRyb2xsZXIuZm9udFNpemUpKVxuICAgICAgICAgICAgKyByZXN1bHRZIC0gbWFyZ2lucy50b3AgKyBTdXJ2ZXlIZWxwZXIuSFRNTF9UQUlMX1RFWFRfU0NBTEUgKiBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhZ2VzOiBudW1iZXIgPSBjb250cm9sbGVyLmhlbHBlckRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmFkZFBhZ2UoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG51bWJlck9mUGFnZXM7IGkrKykge1xuICAgICAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuZGVsZXRlUGFnZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIG1hcmdpbnMud2lkdGgsIGhlaWdodCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVIVE1MRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGh0bWw6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG1hcmdpbnM6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0gPSB0aGlzLmdldEh0bWxNYXJnaW5zKGNvbnRyb2xsZXIsIHBvaW50KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPElQZGZCcmljaz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmZyb21IVE1MKGh0bWwsIHBvaW50LnhMZWZ0LCBtYXJnaW5zLnRvcCwge1xuICAgICAgICAgICAgICAgIHBhZ2VzcGxpdDogdHJ1ZSwgd2lkdGg6IG1hcmdpbnMud2lkdGhcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUhUTUxSZWN0KHBvaW50LCBjb250cm9sbGVyLCBtYXJnaW5zLCByZXN1bHQueSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgSFRNTEJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBodG1sKSk7XG4gICAgICAgICAgICB9LCBtYXJnaW5zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGb250RmFjZShmb250TmFtZTogc3RyaW5nLCBmb250QmFzZTY0OiBzdHJpbmcsIGZvbnRXZWlnaHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGAgK1xuICAgICAgICAgICAgYHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCR7Zm9udEJhc2U2NH0pIGZvcm1hdCgnd29mZicpOyBgICtcbiAgICAgICAgICAgIGBmb250LXdlaWdodDogJHtmb250V2VpZ2h0fTsgfWA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGb250RmFjZVdpdGhJdGFsaWNTdHlsZShmb250TmFtZTogc3RyaW5nLCBmb250QmFzZTY0OiBzdHJpbmcsIGZvbnRXZWlnaHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGAgK1xuICAgICAgICAgICAgYHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCR7Zm9udEJhc2U2NH0pIGZvcm1hdCgnd29mZicpOyBgICtcbiAgICAgICAgICAgIGBmb250LXdlaWdodDogJHtmb250V2VpZ2h0fTsgZm9udC1zdHlsZTogaXRhbGljfWA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaHRtbFRvWG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGh0bWxEb2M6IERvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCcnKTtcbiAgICAgICAgaHRtbERvYy53cml0ZShodG1sLnJlcGxhY2UoL1xcIy9nLCAnJTIzJykpO1xuICAgICAgICBodG1sRG9jLmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgaHRtbERvYy5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJKTtcbiAgICAgICAgaHRtbERvYy5ib2R5LnN0eWxlLm1hcmdpbiA9ICd1bnNldCc7XG4gICAgICAgIHJldHVybiAobmV3IFhNTFNlcmlhbGl6ZXIoKSkuc2VyaWFsaXplVG9TdHJpbmcoaHRtbERvYy5ib2R5KS5yZXBsYWNlKC8lMjMvZywgJyMnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTdmdDb250ZW50KGh0bWw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBjb25zdCBzdHlsZTogSFRNTFN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCA9ICcuX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiB1bnNldDsgbGluZS1oZWlnaHQ6IDIycHg7IH0gYm9keSB7IG1hcmdpbjogdW5zZXQ7IH0nO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgY29uc3QgZGl2OiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ19fc3VydmV5cGRmX2h0bWwnO1xuICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICAgIGRpdi5zdHlsZS50b3AgPSAnLTEwMDAwcHgnO1xuICAgICAgICBkaXYuc3R5bGUubGVmdCA9ICctMTAwMDBweCc7XG4gICAgICAgIGRpdi5zdHlsZS53aWR0aCA9ICh3aWR0aCAvIDcyLjAgKiA5Ni4wKSArICdweCc7XG4gICAgICAgIGRpdi5zdHlsZS5ib3hTaXppbmcgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5jb2xvciA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmZvbnRGYW1pbHkgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5mb250ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUubGluZUhlaWdodCA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgY29uc3QgZGl2V2lkdGg6IG51bWJlciA9IGRpdi5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgZGl2SGVpZ2h0OiBudW1iZXIgPSBkaXYub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICAgIHN0eWxlLnJlbW92ZSgpO1xuICAgICAgICBsZXQgZGVmczogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwpIHtcbiAgICAgICAgICAgIGRlZnMgPSBgPGRlZnM+PHN0eWxlPiR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGNvbnRyb2xsZXIuZm9udE5hbWUsIGNvbnRyb2xsZXIuYmFzZTY0Tm9ybWFsLCAnbm9ybWFsJyl9YCArXG4gICAgICAgICAgICAgICAgYCAke3RoaXMuZ2VuZXJhdGVGb250RmFjZShjb250cm9sbGVyLmZvbnROYW1lLCBjb250cm9sbGVyLmJhc2U2NEJvbGQsICdib2xkJyl9PC9zdHlsZT48L2RlZnM+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHMpLmZvckVhY2goZm9udE5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmb250KS5mb3JFYWNoKChmb250U3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnIHwgJ2l0YWxpYycgfCAnYm9sZGl0YWxpYycpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTdHlsZSA9PT0gJ25vcm1hbCcgfHwgZm9udFN0eWxlID09PSAnYm9sZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZnMgKz0gYCR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGZvbnROYW1lLCBmb250W2ZvbnRTdHlsZV0sIGZvbnRTdHlsZSl9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZnMgKz0gYCR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlV2l0aEl0YWxpY1N0eWxlKGZvbnROYW1lLCBmb250W2ZvbnRTdHlsZV0sIGZvbnRTdHlsZSA9PT0gJ2l0YWxpYycgPyAnbm9ybWFsJyA6ICdib2xkJyl9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlZnMgPSAnPGRlZnM+PHN0eWxlPicgKyBkZWZzICsgJzwvc3R5bGU+PC9kZWZzPic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdmc6IHN0cmluZyA9ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4nICsgZGVmcyArXG4gICAgICAgICAgICAnPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfTwvc3R5bGU+JyArXG4gICAgICAgICAgICBgPGZvcmVpZ25PYmplY3Qgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICtcbiAgICAgICAgICAgIHRoaXMuaHRtbFRvWG1sKGh0bWwpICsgJzwvZm9yZWlnbk9iamVjdD48L3N2Zz4nO1xuICAgICAgICByZXR1cm4geyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBodG1sVG9JbWFnZShodG1sOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0+IHtcbiAgICAgICAgY29uc3QgeyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfSA9IFN1cnZleUhlbHBlci5jcmVhdGVTdmdDb250ZW50KGh0bWwsIHdpZHRoLCBjb250cm9sbGVyKTtcbiAgICAgICAgY29uc3QgZGF0YTogc3RyaW5nID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN2ZykpKTtcbiAgICAgICAgY29uc3QgaW1nOiBIVE1MSW1hZ2VFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5zcmMgPSBkYXRhO1xuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGRpdldpZHRoO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBkaXZIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBTdXJ2ZXlIZWxwZXIuQkFDS0dST1VORF9DT0xPUjtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsOiBzdHJpbmcgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSk7XG4gICAgICAgICAgICAgICAgY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1cmw6IHVybCwgYXNwZWN0OiBkaXZXaWR0aCAvIGRpdkhlaWdodCB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdXJsOiAnZGF0YTosJywgYXNwZWN0OiB3aWR0aCAvIHRoaXMuRVBTSUxPTiB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgVGV4dEJvbGRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplICo9IHRoaXMuVElUTEVfRk9OVF9TQ0FMRTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm5vKSB7XG4gICAgICAgICAgICBjb25zdCBub1RleHQ6IHN0cmluZyA9IHF1ZXN0aW9uLm5vICsgJyAnO1xuICAgICAgICAgICAgbGV0IG5vRmxhdDogSVBkZkJyaWNrO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzSHRtbChxdWVzdGlvbi5sb2NUaXRsZSkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KG5vVGV4dCwgJ2JvbGQnKS53aWR0aDtcbiAgICAgICAgICAgICAgICBub0ZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKG5vVGV4dCwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub0ZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBub1RleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKG5vRmxhdCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBub0ZsYXQueFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgIGNvbnN0IHRleHRGbGF0OiBDb21wb3NpdGVCcmljayA9IDxDb21wb3NpdGVCcmljaz5hd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChcbiAgICAgICAgICAgIGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHF1ZXN0aW9uLmxvY1RpdGxlKTtcbiAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKHRleHRGbGF0KTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZFRleHQ6IHN0cmluZyA9IHF1ZXN0aW9uLnJlcXVpcmVkVGV4dDtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0h0bWwocXVlc3Rpb24ubG9jVGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gdGhpcy5jcmVhdGVQb2ludCh0ZXh0RmxhdC51bmZvbGQoKVswXSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHJlcXVpcmVkVGV4dCwgJ2JvbGQnKS53aWR0aDtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhyZXF1aXJlZFRleHQsIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQodGV4dEZsYXQudW5mb2xkKCkucG9wKCksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiwgY29udHJvbGxlciwgcmVxdWlyZWRUZXh0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgZm9udFNpemVTY2FsZTogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQocG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHRleHQsIFRpdGxlUGFuZWxCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIHRpdGxlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVN1cnZleUZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludCwgY29udHJvbGxlciwgdGV4dCwgdGhpcy5USVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVBhbmVsRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgaXNQYWdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludCwgY29udHJvbGxlciwgdGV4dCxcbiAgICAgICAgICAgIGlzUGFnZSA/IHRoaXMuVElUTEVfUEFHRV9GT05UX1NJWkVfU0NBTEUgOiB0aGlzLlRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlRGVzY0ZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogdGhpcy5ERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgRGVzY3JpcHRpb25Ccmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSZWFkb25seVJlbmRlckFzKHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybScge1xuICAgICAgICByZXR1cm4gKDxhbnk+cXVlc3Rpb24pLnJlYWRvbmx5UmVuZGVyQXMgPT09ICdhdXRvJyA/IGNvbnRyb2xsZXIucmVhZG9ubHlSZW5kZXJBcyA6ICg8YW55PnF1ZXN0aW9uKS5yZWFkb25seVJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUNvbW1lbnRGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcm93czogbnVtYmVyLCBpc1F1ZXN0aW9uOiBib29sZWFuLCBpbmRleDogbnVtYmVyID0gMCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gdGhpcy5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCBjb250cm9sbGVyLCByb3dzKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgdGhpcy5nZXRSZWFkb25seVJlbmRlckFzKHF1ZXN0aW9uLCBjb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJykge1xuICAgICAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChcbiAgICAgICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgcXVlc3Rpb24sIHRoaXMuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbiksIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgIGlmICh0ZXh0RmxhdC55Qm90ICsgcGFkZGluZyA+IHJlY3QueUJvdCkgcmVjdC55Qm90ID0gdGV4dEZsYXQueUJvdCArIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb21tZW50QnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIGluZGV4KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbiwgaXNRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXNRdWVzdGlvbiA/IChxdWVzdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLnZhbHVlICE9PSBudWxsID8gcXVlc3Rpb24udmFsdWUgOiAnJykgOlxuICAgICAgICAgICAgKHF1ZXN0aW9uLmNvbW1lbnQgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5jb21tZW50ICE9PSBudWxsID8gcXVlc3Rpb24uY29tbWVudCA6ICcnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudERpc3BsYXlWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgOiBTdXJ2ZXlIZWxwZXIuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaW5Ccm93c2VyID0gdHlwZW9mIEltYWdlID09PSAnZnVuY3Rpb24nO1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2VGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBhbnksXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG5cbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpIHtcbiAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCAqPSBuZXdXaWR0aCAvIHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHB0VG9QeDogbnVtYmVyID0gOTYuMCAvIDcyLjA7XG4gICAgICAgICAgICAgICAgY29uc3QgZml0VHlwZSA9ICEhcXVlc3Rpb24gJiYgISFxdWVzdGlvbi5pbWFnZUZpdCA/IHF1ZXN0aW9uLmltYWdlRml0IDogJ2NvbnRhaW4nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhc0h0bWw6IHN0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgIGA8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogJHt3aWR0aCAqIHB0VG9QeH1weDsgaGVpZ2h0OiAke2hlaWdodCAqIHB0VG9QeH1weDsnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9JyR7aW1hZ2VsaW5rfScgc3R5bGU9J29iamVjdC1maXQ6ICR7Zml0VHlwZX07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7Jy8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IHVybCwgYXNwZWN0IH06IHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0gPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBTdXJ2ZXlIZWxwZXIuaHRtbFRvSW1hZ2UoY2FudmFzSHRtbCwgd2lkdGgsIGNvbnRyb2xsZXIpO1xuXG4gICAgICAgICAgICAgICAgaW1hZ2VsaW5rID0gdXJsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBgPGltZyBzcmM9JyR7aW1hZ2VsaW5rfScgd2lkdGg9JyR7d2lkdGh9JyBoZWlnaHQ9JyR7aGVpZ2h0fScvPmA7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgdGhpcy5jcmVhdGVSZWN0KHBvaW50LCB3aWR0aCwgaGVpZ2h0KSwgaHRtbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEltYWdlQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIGltYWdlbGluaywgcG9pbnQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNhblByZXZpZXdJbWFnZShxdWVzdGlvbjogUXVlc3Rpb25GaWxlTW9kZWwsIGl0ZW06IHsgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9LCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcXVlc3Rpb24uY2FuUHJldmlld0ltYWdlKGl0ZW0pO1xuICAgICAgICAvLyAgJiYgIGF3YWl0IHRoaXMuZ2V0SW1hZ2VTaXplKHVybCkgIT09IG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VTaXplKHVybDogc3RyaW5nKTogUHJvbWlzZTxJU2l6ZT4ge1xuICAgICAgICBpZiAoIVN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgd2lkdGg6IHVuZGVmaW5lZCwgaGVpZ2h0OiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlOiBhbnkgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IHVybDtcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHdpZHRoOiBpbWFnZS53aWR0aCwgaGVpZ2h0OiBpbWFnZS5oZWlnaHQgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmUobnVsbCk7IH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHdpZHRoPzogbnVtYmVyLCBjb2xvcj86IHN0cmluZyk6IElQZGZCcmljayB7XG4gICAgICAgIGxldCB4UmlnaHQ6IG51bWJlciA9IHR5cGVvZiB3aWR0aCA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IDpcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0ICsgd2lkdGg7XG4gICAgICAgIHhSaWdodCA9IHhSaWdodCA+IHBvaW50LnhMZWZ0ID8geFJpZ2h0IDogcG9pbnQueExlZnQgKyB0aGlzLkVQU0lMT047XG4gICAgICAgIHJldHVybiBuZXcgUm93bGluZUJyaWNrKGNvbnRyb2xsZXIsIHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogeFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCArIHRoaXMuRVBTSUxPTixcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyB0aGlzLkVQU0lMT05cbiAgICAgICAgfSwgdHlwZW9mIGNvbG9yID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBjb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlTGlua0ZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcsIGxpbms6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZVRleHQ6IENvbXBvc2l0ZUJyaWNrID0gPENvbXBvc2l0ZUJyaWNrPmF3YWl0IHRoaXMuXG4gICAgICAgICAgICBjcmVhdGVUZXh0RmxhdChwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIFRleHRCcmljayk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUxpbms6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbXBvc2l0ZVRleHQudW5mb2xkKCkuZm9yRWFjaCgodGV4dDogVGV4dEJyaWNrKSA9PiB7XG4gICAgICAgICAgICBjb21wb3NpdGVMaW5rLmFkZEJyaWNrKG5ldyBMaW5rQnJpY2sodGV4dCwgbGluaykpO1xuICAgICAgICAgICAgY29uc3QgbGluZVBvaW50OiBJUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUxpbmspO1xuICAgICAgICAgICAgY29tcG9zaXRlTGluay5hZGRCcmljayh0aGlzLmNyZWF0ZVJvd2xpbmVGbGF0KGxpbmVQb2ludCxcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21wb3NpdGVMaW5rLndpZHRoLCBMaW5rQnJpY2suQ09MT1IpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVMaW5rO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFjcm9mb3JtUmVjdChyZWN0OiBJUmVjdCk6IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHJlY3QueExlZnQsXG4gICAgICAgICAgICByZWN0LnlUb3AsXG4gICAgICAgICAgICByZWN0LnhSaWdodCAtIHJlY3QueExlZnQsXG4gICAgICAgICAgICByZWN0LnlCb3QgLSByZWN0LnlUb3BcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGxpbmVzOiBudW1iZXIgPSAxKTogSVJlY3Qge1xuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHBvaW50LnhMZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjb250cm9sbGVyLnVuaXRXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogbGluZXM7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlY3QocG9pbnQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQocG9pbnQ6IElQb2ludCxcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcXVlc3Rpb246IFF1ZXN0aW9uLCB2YWx1ZTogc3RyaW5nLCBvbmx5Rmlyc3RMaW5lOiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgcGFkZGluZzogbnVtYmVyID0gY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgIGlmICghb25seUZpcnN0TGluZSkgcG9pbnQueVRvcCArPSBwYWRkaW5nO1xuICAgICAgICBwb2ludC54TGVmdCArPSBwYWRkaW5nO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKHBvaW50LnhMZWZ0LCBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHZhbHVlLnRvU3RyaW5nKCksIFRleHRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gdGV4dEZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVuZGVyRmxhdEJvcmRlcnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdDogUGRmQnJpY2spOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLkZPUk1fQk9SREVSX1ZJU0lCTEUpIHJldHVybjtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oZmxhdC53aWR0aCwgZmxhdC5oZWlnaHQpO1xuICAgICAgICBjb25zdCB2aXNpYmxlV2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVNjYWxlOiBudW1iZXIgPSB0aGlzLmZvcm1TY2FsZShjb250cm9sbGVyLCBmbGF0KSArIHZpc2libGVXaWR0aCAvIG1pblNpZGU7XG4gICAgICAgIGNvbnN0IHVudmlzaWJsZVdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlVOVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdW52aXNpYmxlU2NhbGU6IG51bWJlciA9IDEuMCAtIHVudmlzaWJsZVdpZHRoIC8gbWluU2lkZTtcbiAgICAgICAgY29uc3QgdW52aXNpYmxlUmFkaXVzOiBudW1iZXIgPSB0aGlzLlJBRElVU19TQ0FMRSAqIHVudmlzaWJsZVdpZHRoO1xuICAgICAgICBjb25zdCBvbGREcmF3Q29sb3I6IHN0cmluZyA9IGNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoZmxhdC5mb3JtQm9yZGVyQ29sb3IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodmlzaWJsZVdpZHRoKTtcbiAgICAgICAgY29udHJvbGxlci5kb2MucmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdCh0aGlzLnNjYWxlUmVjdChmbGF0LCB2aXNpYmxlU2NhbGUpKSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcih0aGlzLkJBQ0tHUk9VTkRfQ09MT1IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodW52aXNpYmxlV2lkdGgpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5yb3VuZGVkUmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIHRoaXMuc2NhbGVSZWN0KGZsYXQsIHVudmlzaWJsZVNjYWxlKSksIHVudmlzaWJsZVJhZGl1cywgdW52aXNpYmxlUmFkaXVzKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcmVuZGVyUmVhZE9ubHlUZXh0RmllbGQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcXVlc3Rpb246IFF1ZXN0aW9uLCBmbGF0OiBQZGZCcmljaywgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgb25seUZpcnN0TGluZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoZmxhdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gZmxhdC5mb250U2l6ZTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBjb250cm9sbGVyLCBxdWVzdGlvbiwgdmFsdWUsIG9ubHlGaXJzdExpbmUpO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIGlmIChvbmx5Rmlyc3RMaW5lKSBhd2FpdCB0ZXh0RmxhdC51bmZvbGQoKVswXS5yZW5kZXIoKTtcbiAgICAgICAgZWxzZSBhd2FpdCB0ZXh0RmxhdC5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJGbGF0Qm9yZGVycyhjb250cm9sbGVyLCBmbGF0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRMb2NTdHJpbmcodGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHRleHQpKSByZXR1cm4gdGV4dC5yZW5kZXJlZEh0bWw7XG4gICAgICAgIHJldHVybiAoPGFueT50ZXh0KS5yZW5kZXJlZFRleHQgfHwgdGV4dC5yZW5kZXJlZEh0bWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHFEcm9wRG93bjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICAgICAgaWYgKHFEcm9wRG93bi5pc090aGVyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBxRHJvcERvd24ub3RoZXJUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEhcXVlc3Rpb24uZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlc3Rpb24uZGlzcGxheVZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHFEcm9wRG93bi5zaG93T3B0aW9uc0NhcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBxRHJvcERvd24ub3B0aW9uc0NhcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pOiBRdWVzdGlvbiB7XG4gICAgICAgIHJldHVybiAhISg8YW55PnF1ZXN0aW9uKS5jb250ZW50UXVlc3Rpb24gPyAoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uIDogcXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFF1ZXN0aW9uVHlwZShxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgICAgICBpZighIXF1ZXN0aW9uLmN1c3RvbVdpZGdldCkgcmV0dXJuIHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZRdWVzdGlvblR5cGU7XG4gICAgICAgIHJldHVybiAhISg8YW55PnF1ZXN0aW9uKS5jb250ZW50UXVlc3Rpb24gPyAnY3VzdG9tX21vZGVsJyA6IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdNaW5XaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5SQVRJTkdfTUlOX1dJRFRIKS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdJdGVtVGV4dChxdWVzdGlvbjogUXVlc3Rpb25SYXRpbmdNb2RlbCxcbiAgICAgICAgaW5kZXg6IG51bWJlciwgbG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJhdGluZ0l0ZW1Mb2NUZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhsb2NUZXh0Lm93bmVyLCBsb2NUZXh0LnVzZU1hcmtkb3duKTtcbiAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKGxvY1RleHQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgcXVlc3Rpb24ubWluUmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gcXVlc3Rpb24ubG9jTWluUmF0ZURlc2NyaXB0aW9uLnRleHQgKyAnICcgKyB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gcXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoIC0gMSAmJiBxdWVzdGlvbi5tYXhSYXRlRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KSArICcgJyArIHF1ZXN0aW9uLmxvY01heFJhdGVEZXNjcmlwdGlvbi50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYXRpbmdJdGVtTG9jVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbWFnZVBpY2tlckF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC1cbiAgICAgICAgICAgICh0aGlzLklNQUdFUElDS0VSX0NPVU5UIC0gMSkgKiBjb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICByZXR1cm4gd2lkdGggPiAwID8gd2lkdGggOiBjb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gKGNvbENvdW50IC0gMSkgKlxuICAgICAgICAgICAgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpIC8gY29sQ291bnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q29sdW1uTWFyZ2lucyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBjb2xDb3VudDogbnVtYmVyLCBjb2x1bW46IG51bWJlcikge1xuICAgICAgICBjb25zdCBjZWxsV2lkdGg6IG51bWJlciA9IHRoaXMuZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlciwgY29sQ291bnQpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgY29sdW1uICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIChjb2xDb3VudCAtIGNvbHVtbiAtIDEpICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbW92ZVJlY3QocmVjdDogSVJlY3QsIGxlZnQ6IG51bWJlciA9IHJlY3QueExlZnQsIHRvcDogbnVtYmVyID0gcmVjdC55VG9wKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IGxlZnQsXG4gICAgICAgICAgICB5VG9wOiB0b3AsXG4gICAgICAgICAgICB4UmlnaHQ6IGxlZnQgKyByZWN0LnhSaWdodCAtIHJlY3QueExlZnQsXG4gICAgICAgICAgICB5Qm90OiB0b3AgKyByZWN0LnlCb3QgLSByZWN0LnlUb3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzY2FsZVJlY3QocmVjdDogSVJlY3QsIHNjYWxlOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSByZWN0LnhSaWdodCAtIHJlY3QueExlZnQ7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gcmVjdC55Qm90IC0gcmVjdC55VG9wO1xuICAgICAgICBjb25zdCBzY2FsZVdpZHRoOiBudW1iZXIgPSAoKHdpZHRoIDwgaGVpZ2h0KSA/IHdpZHRoIDogaGVpZ2h0KSAqICgxLjAgLSBzY2FsZSkgLyAyLjA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdC54TGVmdCArIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeFJpZ2h0OiByZWN0LnhSaWdodCAtIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5Qm90OiByZWN0LnlCb3QgLSBzY2FsZVdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZm9ybVNjYWxlKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXQ6IFBkZkJyaWNrKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oZmxhdC53aWR0aCwgZmxhdC5oZWlnaHQpO1xuICAgICAgICBjb25zdCBib3JkZXJXaWR0aDogbnVtYmVyID0gMi4wICogY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgcmV0dXJuIChtaW5TaWRlIC0gYm9yZGVyV2lkdGgpIC8gbWluU2lkZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLmdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb24pO1xuICAgICAgICBjb25zdCBmbGF0UXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLlxuICAgICAgICAgICAgY3JlYXRlKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHF1ZXN0aW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgZmxhdFF1ZXN0aW9uLmdlbmVyYXRlRmxhdHMocG9pbnQpO1xuICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzT3B0aW9ucyA9IG5ldyBBZG9ybmVyc09wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBxdWVzdGlvbkZsYXRzLCBxdWVzdGlvbiwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmN1c3RvbVdpZGdldCAmJiBxdWVzdGlvbi5jdXN0b21XaWRnZXQuaXNGaXQocXVlc3Rpb24pICYmXG4gICAgICAgICAgICBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUmVuZGVyKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJRdWVzdGlvbi51bnNoaWZ0KHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZSZW5kZXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclF1ZXN0aW9uLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICByZXR1cm4gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9udEV4aXN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZvbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLmludGVybmFsLmdldEZvbnQoZm9udE5hbWUpLmZvbnROYW1lID09PSBmb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0N1c3RvbUZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZm9udE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2MuaW50ZXJuYWwuZ2V0Rm9udChmb250TmFtZSkuZW5jb2RpbmcgPT09IHRoaXMuQ1VTVE9NX0ZPTlRfRU5DT0RJTkc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZml4Rm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3VzdG9tRm9udChjb250cm9sbGVyLCBjb250cm9sbGVyLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2MudGV4dCgnbG9hZCBmb250JywgMCwgMCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5kZWxldGVQYWdlKDEpO1xuICAgICAgICAgICAgY29udHJvbGxlci5hZGRQYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjbG9uZShzcmM6IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IHRhcmdldDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcbiAgICAgICAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzcmNbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2hlbHBlcl9zdXJ2ZXkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24sIEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5cbmV4cG9ydCB0eXBlIEZsYXRDb25zdHJ1Y3RvciA9IG5ldyAoXG4gICAgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyXG4pID0+IElGbGF0UXVlc3Rpb247XG5leHBvcnQgY2xhc3MgRmxhdFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgcXVlc3Rpb25zOiB7IFtpbmRleDogc3RyaW5nXTogRmxhdENvbnN0cnVjdG9yIH0gPSB7fTtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRmxhdFJlcG9zaXRvcnkgPSBuZXcgRmxhdFJlcG9zaXRvcnkoKTtcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEZsYXRSZXBvc2l0b3J5IHtcbiAgICAgICAgcmV0dXJuIEZsYXRSZXBvc2l0b3J5Lmluc3RhbmNlO1xuICAgIH1cbiAgICBwdWJsaWMgcmVnaXN0ZXIobW9kZWxUeXBlOiBzdHJpbmcsIHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uc1ttb2RlbFR5cGVdID0gcmVuZGVyZXJDb25zdHJ1Y3RvcjtcbiAgICB9XG4gICAgcHVibGljIGNyZWF0ZShzdXJ2ZXk6IFN1cnZleVBERiwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgZG9jQ29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdHlwZT86IHN0cmluZyk6IElGbGF0UXVlc3Rpb24ge1xuICAgICAgICBjb25zdCBxdWVzdGlvblR5cGU6IHN0cmluZyA9IHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJyA/IHF1ZXN0aW9uLmdldFR5cGUoKSA6IHR5cGU7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3RvciA9IHRoaXMucXVlc3Rpb25zW3F1ZXN0aW9uVHlwZV0gfHwgRmxhdFF1ZXN0aW9uO1xuICAgICAgICByZXR1cm4gbmV3IHJlbmRlcmVyQ29uc3RydWN0b3Ioc3VydmV5LCBxdWVzdGlvbiwgZG9jQ29udHJvbGxlcik7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uLCBMb2NhbGl6YWJsZVN0cmluZywgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGbGF0UXVlc3Rpb24ge1xuICAgIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbiAgICBnZW5lcmF0ZUZsYXRzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbn1cbmV4cG9ydCBjbGFzcyBGbGF0UXVlc3Rpb24gaW1wbGVtZW50cyBJRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTlRFTlRfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDAuNTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTlRFTlRfR0FQX0hPUl9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09OVEVOVF9JTkRFTlRfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFU0NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjA2MjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdFRpdGxlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlRmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24ocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGRlc2NQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZGVzY1BvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgIGRlc2NQb2ludC55VG9wICs9IEZsYXRRdWVzdGlvbi5ERVNDX0dBUF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICBjb25zdCB0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IHRoaXMucXVlc3Rpb24ubG9jRGVzY3JpcHRpb247XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQoZGVzY1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRleHQpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNDb21tZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCB0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IHRoaXMucXVlc3Rpb24ubG9jQ29tbWVudFRleHQ7XG4gICAgICAgIGNvbnN0IG90aGVyVGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRleHQsIFRleHRCcmljayk7XG4gICAgICAgIGNvbnN0IG90aGVyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChvdGhlclRleHRGbGF0KTtcbiAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2sob3RoZXJUZXh0RmxhdCwgYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgb3RoZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuT1RIRVJfUk9XU19DT1VOVCwgZmFsc2UpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb21wb3NpdGUocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29udGVudFBhbmVsID0gKDxhbnk+dGhpcy5xdWVzdGlvbikuY29udGVudFBhbmVsO1xuICAgICAgICBpZiAoISFjb250ZW50UGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbCh0aGlzLnN1cnZleSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbnRlbnRQYW5lbCwgcG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMucXVlc3Rpb24uaW5kZW50KS53aWR0aDtcbiAgICAgICAgY29uc3QgaW5kZW50UG9pbnQ6IElQb2ludCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLnF1ZXN0aW9uLmluZGVudCkud2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgY29tbWVudFBvaW50OiBJUG9pbnQgPSBpbmRlbnRQb2ludDtcbiAgICAgICAgbGV0IHRpdGxlTG9jYXRpb246IHN0cmluZyA9IHRoaXMucXVlc3Rpb24uZ2V0VGl0bGVMb2NhdGlvbigpO1xuICAgICAgICB0aXRsZUxvY2F0aW9uID0gdGhpcy5xdWVzdGlvbi5oYXNUaXRsZSA/IHRpdGxlTG9jYXRpb24gOiAnaGlkZGVuJztcbiAgICAgICAgY29uc3QgaXNEZXNjID0gISFTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jRGVzY3JpcHRpb24pO1xuICAgICAgICBzd2l0Y2ggKHRpdGxlTG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhkZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChkZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KSwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgICAgICAgICBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IGNvbnRlbnRQb2ludDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uY29udGVudEZsYXRzKS55Qm90ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soY29udGVudEZsYXRzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uY29udGVudEZsYXRzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IGNvbnRlbnRQb2ludDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmNvbnRlbnRGbGF0cykpO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5oYXNDb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tbWVudChjb21tZW50UG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVQb2ludDogSVBvaW50ID0gaW5kZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgPSBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXS55Qm90O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUodGl0bGVQb2ludCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNEZXNjKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdERlc2NyaXB0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCkpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGRlc2NGbGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGl0bGVGbGF0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhkZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCA9IE1hdGgubWF4KGNvbnRlbnRQb2ludC54TGVmdCwgZGVzY0ZsYXQueFJpZ2h0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0dBUF9IT1JfU0NBTEU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRlbnRQb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQueExlZnQgPSBjb250ZW50UG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5jb250ZW50RmxhdHMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhjb250ZW50RmxhdHMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgICAgICAgIGNhc2UgU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDpcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlTG9jYXRpb24gIT09IFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tbWVudFBvaW50ID0gY29udGVudFBvaW50O1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKGNvbnRlbnRQb2ludCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzICE9PSBudWxsICYmIGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uZmxhdHMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCAmJiB0aGlzLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gIT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbW1lbnQoY29tbWVudFBvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgncXVlc3Rpb24nLCB7XG4gICAgbmFtZTogJ3JlYWRvbmx5UmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAndGV4dCcsICdhY3JvZm9ybSddXG59KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIGFsaWduOiB7IGFsaWduOiBzdHJpbmcsIGJhc2VsaW5lOiBzdHJpbmcgfTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmFsaWduID0ge1xuICAgICAgICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgICAgICAgIGJhc2VsaW5lOiAnbWlkZGxlJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBwcml2YXRlIGVzY2FwZVRleHQoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnRleHQuaW5kZXhPZignXFx0JykgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnJlcGxhY2UoJ1xcdCcsIEFycmF5KDUpLmpvaW4oU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgYWxpZ25Qb2ludDogSVBvaW50ID0gdGhpcy5hbGlnblBvaW50KHRoaXMpO1xuICAgICAgICBsZXQgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IodGhpcy50ZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHQodGhpcy5lc2NhcGVUZXh0KCksIGFsaWduUG9pbnQueExlZnQsIGFsaWduUG9pbnQueVRvcCwgdGhpcy5hbGlnbik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYWxpZ25Qb2ludChyZWN0OiBJUmVjdCk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdC54TGVmdCxcbiAgICAgICAgICAgIHlUb3A6IHJlY3QueVRvcCArIChyZWN0LnlCb3QgLSByZWN0LnlUb3ApIC8gMi4wXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0LnRzIiwiaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBicmlja3M6IElQZGZCcmlja1tdID0gW107XG4gICAgcHJpdmF0ZSBfeExlZnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF94UmlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF95VG9wOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gMC4wO1xuICAgICAgICB0aGlzLl94UmlnaHQgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lUb3AgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lCb3QgPSAwLjA7XG4gICAgICAgIHRoaXMuYWRkQnJpY2soLi4uYnJpY2tzKTtcbiAgICB9XG4gICAgZ2V0IHhMZWZ0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl94TGVmdDsgfVxuICAgIHNldCB4TGVmdCh4TGVmdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoeExlZnQgLSB0aGlzLnhMZWZ0LCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feExlZnQgPSB4TGVmdDtcbiAgICB9XG4gICAgZ2V0IHhSaWdodCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feFJpZ2h0OyB9XG4gICAgc2V0IHhSaWdodCh4UmlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgeFJpZ2h0IC0gdGhpcy54UmlnaHQsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0geFJpZ2h0O1xuICAgIH1cbiAgICBnZXQgeVRvcCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feVRvcDsgfVxuICAgIHNldCB5VG9wKHlUb3A6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgMC4wLCB5VG9wIC0gdGhpcy55VG9wLCAwLjApO1xuICAgICAgICB0aGlzLl95VG9wID0geVRvcDtcbiAgICB9XG4gICAgZ2V0IHlCb3QoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lCb3Q7IH1cbiAgICBzZXQgeUJvdCh5Qm90OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgMC4wLCB5Qm90IC0gdGhpcy55Qm90KTtcbiAgICAgICAgdGhpcy5feUJvdCA9IHlCb3Q7XG4gICAgfVxuICAgIHByaXZhdGUgc2hpZnQobGVmdFNoaWZ0OiBudW1iZXIsIHJpZ2h0U2hpZnQ6IG51bWJlcixcbiAgICAgICAgdG9wU2hpZnQ6IG51bWJlciwgYm90U2hpZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBicmljay54TGVmdCArPSBsZWZ0U2hpZnQ7XG4gICAgICAgICAgICBicmljay54UmlnaHQgKz0gcmlnaHRTaGlmdDtcbiAgICAgICAgICAgIGJyaWNrLnlUb3AgKz0gdG9wU2hpZnQ7XG4gICAgICAgICAgICBicmljay55Qm90ICs9IGJvdFNoaWZ0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5icmlja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnJpY2tzW2ldLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJpY2tzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcHVibGljIGFkZEJyaWNrKC4uLmJyaWNrczogSVBkZkJyaWNrW10pIHtcbiAgICAgICAgaWYgKGJyaWNrcy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgdGhpcy5icmlja3MucHVzaCguLi5icmlja3MpO1xuICAgICAgICAgICAgbGV0IG1lcmdlUmVjdCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnRoaXMuYnJpY2tzKTtcbiAgICAgICAgICAgIHRoaXMuX3hMZWZ0ID0gbWVyZ2VSZWN0LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5feFJpZ2h0ID0gbWVyZ2VSZWN0LnhSaWdodDtcbiAgICAgICAgICAgIHRoaXMuX3lUb3AgPSBtZXJnZVJlY3QueVRvcDtcbiAgICAgICAgICAgIHRoaXMuX3lCb3QgPSBtZXJnZVJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdW5mb2xkKCk6IElQZGZCcmlja1tdIHtcbiAgICAgICAgY29uc3QgdW5mb2xkQnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRCcmlja3MucHVzaCguLi5icmljay51bmZvbGQoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5mb2xkQnJpY2tzO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlLnRzIiwiaW1wb3J0IHsgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQZGZCcmljayBleHRlbmRzIElSZWN0LCBJU2l6ZSB7XG4gICAgcmVuZGVyKCk6IFByb21pc2U8dm9pZD47XG4gICAgdW5mb2xkKCk6IElQZGZCcmlja1tdO1xuICAgIGlzUGFnZUJyZWFrOiBib29sZWFuO1xufVxuZXhwb3J0IGNsYXNzIFBkZkJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICBwdWJsaWMgeExlZnQ6IG51bWJlcjtcbiAgICBwdWJsaWMgeFJpZ2h0OiBudW1iZXI7XG4gICAgcHVibGljIHlUb3A6IG51bWJlcjtcbiAgICBwdWJsaWMgeUJvdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNpemUgb2YgdGV4dC4gU2V0IDAgZm9yIGF1dG8gc2l6ZVxuICAgICAqL1xuICAgIHB1YmxpYyBmb250U2l6ZTogbnVtYmVyO1xuICAgIHB1YmxpYyB0ZXh0Q29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5URVhUX0NPTE9SO1xuICAgIHB1YmxpYyBmb3JtQm9yZGVyQ29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCkge1xuICAgICAgICB0aGlzLnhMZWZ0ID0gcmVjdC54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZWN0LnhSaWdodDtcbiAgICAgICAgdGhpcy55VG9wID0gcmVjdC55VG9wO1xuICAgICAgICB0aGlzLnlCb3QgPSByZWN0LnlCb3Q7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSAhIWNvbnRyb2xsZXIgP1xuICAgICAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA6IERvY0NvbnRyb2xsZXIuRk9OVF9TSVpFO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnhSaWdodCAtIHRoaXMueExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghIXRoaXMucXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVuZGVyUmVhZE9ubHkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGF3YWl0IHRoaXMucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9icmljay50cyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV83X187XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn1cbi8vIG1vZHVsZSBpZCA9IDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsganNQREYsIGpzUERGT3B0aW9ucyB9IGZyb20gJ2pzcGRmJztcbmltcG9ydCB7IElIVE1MUmVuZGVyVHlwZSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbi8vIGltcG9ydCBGb250cyBmcm9tICcuL2ZvbnRzJztcbmltcG9ydCBzZXRSYWRpb0FwcGVhcmFuY2UgZnJvbSAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIHlUb3A6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVJlY3QgZXh0ZW5kcyBJUG9pbnQge1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIHlCb3Q6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVNpemUge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElNYXJnaW5MUiB7XG4gICAgbGVmdD86IG51bWJlcjtcbiAgICByaWdodD86IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSU1hcmdpbiBleHRlbmRzIElNYXJnaW5MUiB7XG4gICAgdG9wPzogbnVtYmVyO1xuICAgIGJvdD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVjbGFyZXMgYSBzZXQgb2Ygb3B0aW9ucyBmb3IgYSBTdXJ2ZXlQREYgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURvY09wdGlvbnMge1xuICAgIG9yaWVudGF0aW9uPzogJ3AnIHwgJ2wnO1xuICAgIGZvcm1hdD86IHN0cmluZyB8IG51bWJlcltdO1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgIGZvbnROYW1lPzogc3RyaW5nO1xuICAgIGJhc2U2NE5vcm1hbD86IHN0cmluZztcbiAgICBiYXNlNjRCb2xkPzogc3RyaW5nO1xuICAgIHVzZUN1c3RvbUZvbnRJbkh0bWw/OiBib29sZWFuO1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuICAgIGNvbW1lcmNpYWw/OiBib29sZWFuO1xuICAgIGhhdmVDb21tZXJjaWFsTGljZW5zZT86IGJvb2xlYW47XG4gICAgaHRtbFJlbmRlckFzPzogSUhUTUxSZW5kZXJUeXBlO1xuICAgIG1hdHJpeFJlbmRlckFzPzogJ2F1dG8nIHwgJ2xpc3QnO1xuICAgIHJlYWRvbmx5UmVuZGVyQXM/OiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuICAgIHRleHRGaWVsZFJlbmRlckFzPzogJ3NpbmdsZUxpbmUnIHwgJ211bHRpTGluZSc7XG4gICAgY29tcHJlc3M/OiBib29sZWFuO1xuICAgIGFwcGx5SW1hZ2VGaXQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBDb250YWlucyBhIHNldCBvZiBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBhcHBlYXJhbmNlIG9mIGEgUERGIGRvY3VtZW50IHJlbmRlcmVkIGJ5IFN1cnZleVBERi5cbiAqL1xuZXhwb3J0IGNsYXNzIERvY09wdGlvbnMgaW1wbGVtZW50cyBJRG9jT3B0aW9ucyB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNTV9UT19QVCA9IDcyIC8gMjUuNDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZPTlRfU0laRSA9IDE0O1xuICAgIHByb3RlY3RlZCBfb3JpZW50YXRpb246ICdsJyB8ICdwJztcbiAgICBwcm90ZWN0ZWQgX2Zvcm1hdDogc3RyaW5nIHwgbnVtYmVyW107XG4gICAgcHJvdGVjdGVkIF9mb250U2l6ZTogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfZm9udE5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIFNFR09FX05PUk1BTDogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgU0VHT0VfQk9MRDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfYmFzZTY0Tm9ybWFsOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgcHJvdGVjdGVkIF9iYXNlNjRCb2xkOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgcHJvdGVjdGVkIF91c2VDdXN0b21Gb250SW5IdG1sOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfbWFyZ2luczogSU1hcmdpbjtcbiAgICBwcm90ZWN0ZWQgX2h0bWxSZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlO1xuICAgIHByb3RlY3RlZCBfbWF0cml4UmVuZGVyQXM6ICdhdXRvJyB8ICdsaXN0JztcbiAgICBwcm90ZWN0ZWQgX3JlYWRvbmx5UmVuZGVyQXM6ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybSc7XG4gICAgcHJvdGVjdGVkIF90ZXh0RmllbGRSZW5kZXJBczogJ3NpbmdsZUxpbmUnIHwgJ211bHRpTGluZSc7XG4gICAgcHJvdGVjdGVkIF9jb21wcmVzczogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX2FwcGx5SW1hZ2VGaXQ6IGJvb2xlYW47XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEb2NPcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mb3JtYXQgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXRbMF0gPCBvcHRpb25zLmZvcm1hdFsxXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gJ3AnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB0aGlzLl9vcmllbnRhdGlvbiA9ICdsJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHRoaXMuX29yaWVudGF0aW9uID0gb3B0aW9ucy5vcmllbnRhdGlvbjtcbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQgfHwgJ2E0JztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhpcy5fZm9ybWF0ID0gdGhpcy5fZm9ybWF0Lm1hcChmID0+IGYgKiBEb2NPcHRpb25zLk1NX1RPX1BUKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb250U2l6ZSA9IG9wdGlvbnMuZm9udFNpemUgfHwgRG9jT3B0aW9ucy5GT05UX1NJWkU7XG4gICAgICAgIHRoaXMuX2ZvbnROYW1lID0gb3B0aW9ucy5mb250TmFtZSB8fCAnc2Vnb2UnO1xuICAgICAgICBpZiAoKHR5cGVvZiBvcHRpb25zLmZvbnROYW1lICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5iYXNlNjRCb2xkICE9PSAndW5kZWZpbmVkJykpKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjROb3JtYWwgPSBvcHRpb25zLmJhc2U2NE5vcm1hbCB8fCBvcHRpb25zLmJhc2U2NEJvbGQ7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjRCb2xkID0gb3B0aW9ucy5iYXNlNjRCb2xkIHx8IG9wdGlvbnMuYmFzZTY0Tm9ybWFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZm9udE5hbWUgPT09ICdzZWdvZScpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IEZvbnRzLlNFR09FX05PUk1BTDtcbiAgICAgICAgICAgIC8vIHRoaXMuX2Jhc2U2NEJvbGQgPSBGb250cy5TRUdPRV9CT0xEO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Tm9ybWFsID0gRG9jT3B0aW9ucy5TRUdPRV9OT1JNQUw7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjRCb2xkID0gRG9jT3B0aW9ucy5TRUdPRV9CT0xEO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWwgPSBvcHRpb25zLnVzZUN1c3RvbUZvbnRJbkh0bWwgJiYgdHlwZW9mIG9wdGlvbnMuYmFzZTY0Tm9ybWFsICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgdGhpcy5fbWFyZ2lucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zLm1hcmdpbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMudG9wID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMuYm90ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5ib3QgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5sZWZ0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMucmlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLnJpZ2h0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9tYXJnaW5zKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICg8YW55PnRoaXMuX21hcmdpbnMpW25hbWVdID0gKDxhbnk+dGhpcy5fbWFyZ2lucylbbmFtZV0gKiBEb2NPcHRpb25zLk1NX1RPX1BUO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faHRtbFJlbmRlckFzID0gb3B0aW9ucy5odG1sUmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9tYXRyaXhSZW5kZXJBcyA9IG9wdGlvbnMubWF0cml4UmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9yZWFkb25seVJlbmRlckFzID0gb3B0aW9ucy5yZWFkb25seVJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fdGV4dEZpZWxkUmVuZGVyQXMgPSBvcHRpb25zLnRleHRGaWVsZFJlbmRlckFzIHx8ICdzaW5nbGVMaW5lJztcbiAgICAgICAgdGhpcy5fY29tcHJlc3MgPSBvcHRpb25zLmNvbXByZXNzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9hcHBseUltYWdlRml0ID0gb3B0aW9ucy5hcHBseUltYWdlRml0IHx8IGZhbHNlO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGxlZnRUb3BQb2ludCgpOiBJUG9pbnQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHRoaXMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgeVRvcDogdGhpcy5tYXJnaW5zLnRvcFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2l6ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udE5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYmFzZTY0Tm9ybWFsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlNjROb3JtYWw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYmFzZTY0Qm9sZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZTY0Qm9sZDtcbiAgICB9XG4gICAgcHVibGljIGdldCB1c2VDdXN0b21Gb250SW5IdG1sKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlQ3VzdG9tRm9udEluSHRtbDtcbiAgICB9XG4gICAgcHVibGljIGdldCBtYXJnaW5zKCk6IElNYXJnaW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFyZ2lucztcbiAgICB9XG4gICAgcHVibGljIGdldCBmb3JtYXQoKTogc3RyaW5nIHwgbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG9yaWVudGF0aW9uKCk6ICdsJyB8ICdwJyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGdldCBodG1sUmVuZGVyQXMoKTogSUhUTUxSZW5kZXJUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWxSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIGdldCBtYXRyaXhSZW5kZXJBcygpOiAnYXV0bycgfCAnbGlzdCcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF0cml4UmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcmVhZG9ubHlSZW5kZXJBcygpOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5UmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdGV4dEZpZWxkUmVuZGVyQXMoKTogJ3NpbmdsZUxpbmUnIHwgJ211bHRpTGluZScge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dEZpZWxkUmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY29tcHJlc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wcmVzcztcbiAgICB9XG4gICAgcHVibGljIGdldCBhcHBseUltYWdlRml0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlJbWFnZUZpdDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEb2NDb250cm9sbGVyIGV4dGVuZHMgRG9jT3B0aW9ucyB7XG4gICAgcHJpdmF0ZSBfZG9jOiBqc1BERjtcbiAgICBwcml2YXRlIF9oZWxwZXJEb2M6IGpzUERGO1xuICAgIHByaXZhdGUgX2ZvbnRTdHlsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgbWFyZ2luc1N0YWNrOiBJTWFyZ2luTFJbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSURvY09wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgY29uc3QganNwZGZPcHRpb25zOiBqc1BERk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmllbnRhdGlvbjogdGhpcy5vcmllbnRhdGlvbixcbiAgICAgICAgICAgIHVuaXQ6ICdwdCcsIGZvcm1hdDogdGhpcy5mb3JtYXQsIGNvbXByZXNzOiB0aGlzLmNvbXByZXNzXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RvYyA9IG5ldyBqc1BERihqc3BkZk9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYmFzZTY0Tm9ybWFsICE9PSAndW5kZWZpbmVkJyAmJiAhU3VydmV5SGVscGVyLmlzRm9udEV4aXN0KHRoaXMsIHRoaXMuZm9udE5hbWUpKSB7XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmFkZEZvbnQodGhpcy5mb250TmFtZSwgdGhpcy5iYXNlNjROb3JtYWwsICdub3JtYWwnKTtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuYWRkRm9udCh0aGlzLmZvbnROYW1lLCB0aGlzLmJhc2U2NEJvbGQsICdib2xkJyk7XG4gICAgICAgICAgICB0aGlzLl9kb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRSYWRpb0FwcGVhcmFuY2UodGhpcy5fZG9jKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnRTaXplKHRoaXMuZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjayA9IFtdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGN1c3RvbUZvbnRzOiB7IFtuYW1lOiBzdHJpbmddOiB7IG5vcm1hbDogc3RyaW5nLCBib2xkOiBzdHJpbmcsIGl0YWxpYzogc3RyaW5nLCBib2xkaXRhbGljOiBzdHJpbmcgfSB9ID0ge307XG4gICAgcHVibGljIHN0YXRpYyBhZGRGb250KGZvbnROYW1lOiBzdHJpbmcsIGJhc2U2NDogc3RyaW5nLCBmb250U3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnIHwgJ2l0YWxpYycgfCAnYm9sZGl0YWxpYycpIHtcbiAgICAgICAgbGV0IGZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgaWYgKCFmb250KSB7XG4gICAgICAgICAgICBmb250ID0gPGFueT57fTtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdID0gZm9udDtcbiAgICAgICAgfVxuICAgICAgICBmb250W2ZvbnRTdHlsZV0gPSBiYXNlNjQ7XG4gICAgICAgIGNvbnN0IGFkZEZvbnRDYWxsYmFjazogKCkgPT4gdm9pZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgICAgIGlmICghIWN1c3RvbUZvbnQgJiYgISFjdXN0b21Gb250W2ZvbnRTdHlsZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250RmlsZTogc3RyaW5nID0gYCR7Zm9udE5hbWV9LSR7Zm9udFN0eWxlfS50dGZgO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsZVRvVkZTKGZvbnRGaWxlLCBjdXN0b21Gb250W2ZvbnRTdHlsZV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9udChmb250RmlsZSwgZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgICg8YW55PmpzUERGKS5BUEkuZXZlbnRzLnB1c2goWydhZGRGb250cycsIGFkZEZvbnRDYWxsYmFja10pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlbHBlckRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVscGVyRG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250TmFtZShmb250TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnROYW1lID0gZm9udE5hbWU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KGZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQoZm9udE5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2l6ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250U2l6ZShmb250U2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFN0eWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U3R5bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udFN0eWxlKGZvbnRTdHlsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9IGZvbnRTdHlsZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgIH1cbiAgICBwdWJsaWMgbWVhc3VyZVRleHQodGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcgfCBudW1iZXIgPSAxLCBmb250U3R5bGU6IHN0cmluZyA9IHRoaXMuX2ZvbnRTdHlsZSxcbiAgICAgICAgZm9udFNpemU6IG51bWJlciA9IHRoaXMuX2ZvbnRTaXplKTogSVNpemUge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5faGVscGVyRG9jLmdldEZvbnRTaXplKCk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuX2hlbHBlckRvYy5nZXRMaW5lSGVpZ2h0KCkgLyB0aGlzLl9oZWxwZXJEb2MuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gMC4wO1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGV4dCk7XG4gICAgICAgICAgICB3aWR0aCA9IHRleHQuc3BsaXQoJycpLnJlZHVjZSgoc206IG51bWJlciwgY3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICBzbSArIHRoaXMuX2hlbHBlckRvYy5nZXRUZXh0V2lkdGgoY3IpLCAwLjApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShvbGRGb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCAnbm9ybWFsJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVuaXRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWFzdXJlVGV4dCgpLndpZHRoO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVuaXRIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBwdXNoTWFyZ2lucyhsZWZ0PzogbnVtYmVyLCByaWdodD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjay5wdXNoKHsgbGVmdDogdGhpcy5tYXJnaW5zLmxlZnQsIHJpZ2h0OiB0aGlzLm1hcmdpbnMucmlnaHQgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgbGVmdCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgaWYgKHR5cGVvZiByaWdodCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5yaWdodCA9IHJpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgcG9wTWFyZ2lucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWFyZ2luczogSU1hcmdpbkxSID0gdGhpcy5tYXJnaW5zU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMubWFyZ2lucy5sZWZ0ID0gbWFyZ2lucy5sZWZ0O1xuICAgICAgICB0aGlzLm1hcmdpbnMucmlnaHQgPSBtYXJnaW5zLnJpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHBhcGVyV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHBhcGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXROdW1iZXJPZlBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRQYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYy5hZGRQYWdlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXRQYWdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kb2Muc2V0UGFnZShpbmRleCArIDEpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9kb2NfY29udHJvbGxlci50cyIsImltcG9ydCB7IElFbGVtZW50LCBRdWVzdGlvbiwgUGFuZWxNb2RlbEJhc2UsIFBhbmVsTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEFkb3JuZXJzUGFuZWxPcHRpb25zLCBBZG9ybmVyc1BhZ2VPcHRpb25zIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U3VydmV5IHtcbiAgICBwdWJsaWMgc3RhdGljIFFVRVNfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIFBBTkVMX0NPTlRfR0FQX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyBQQU5FTF9ERVNDX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYW5lbChzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IHBhbmVsQ29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQocGFuZWwuaW5uZXJJbmRlbnQpLndpZHRoO1xuICAgICAgICBwYW5lbENvbnRlbnRQb2ludC54TGVmdCArPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHBhbmVsLmlubmVySW5kZW50KS53aWR0aDtcbiAgICAgICAgcGFuZWxGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChzdXJ2ZXksXG4gICAgICAgICAgICBjb250cm9sbGVyLCBwYW5lbCwgcGFuZWxDb250ZW50UG9pbnQpKTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNQYW5lbE9wdGlvbnMgPSBuZXcgQWRvcm5lcnNQYW5lbE9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBwYW5lbEZsYXRzLCBwYW5lbCwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFuZWwuZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBhZ2VQYW5lbDogUGFuZWxNb2RlbEJhc2UsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICghcGFnZVBhbmVsLmlzVmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICBwYWdlUGFuZWwub25GaXJzdFJlbmRlcmluZygpO1xuICAgICAgICBjb25zdCBwYWdlUGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgaWYgKHBhZ2VQYW5lbC5nZXRUeXBlKCkgIT09ICdwYWdlJyB8fCBzdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbCBpbnN0YW5jZW9mIFBhbmVsTW9kZWwgJiYgcGFnZVBhbmVsLm5vKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBjb250cm9sbGVyLCBwYWdlUGFuZWwubm8sIHBhZ2VQYW5lbC5nZXRUeXBlKCkgPT09ICdwYWdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobm9GbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodCArIGNvbnRyb2xsZXIubWVhc3VyZVRleHQoJyAnKS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZWxQYW5lbFRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5sb2NUaXRsZSwgcGFnZVBhbmVsLmdldFR5cGUoKSA9PT0gJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHBhZ2VsUGFuZWxUaXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlbFBhbmVsVGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWdlUGFuZWwuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFN1cnZleS5QQU5FTF9ERVNDX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZVBhbmVsRGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBudWxsLCBjb250cm9sbGVyLCBwYWdlUGFuZWwubG9jRGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2socGFnZVBhbmVsRGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlUGFuZWxEZXNjRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0ZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHJvd0xpbmVQb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBhZ2VQYW5lbC5yb3dzKSB7XG4gICAgICAgICAgICBpZiAoIXJvdy52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgbGV0IG5leHRNYXJnaW5MZWZ0OiBudW1iZXIgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvdy52aXNpYmxlRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudDogSUVsZW1lbnQgPSByb3cudmlzaWJsZUVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlcnNXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZWxlbWVudC5yZW5kZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAocm93LnZpc2libGVFbGVtZW50cy5sZW5ndGggLSAxKSAqIGNvbnRyb2xsZXIudW5pdFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICByb3cudmlzaWJsZUVsZW1lbnRzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBuZXh0TWFyZ2luTGVmdCArICgoaSAhPT0gMCkgPyBjb250cm9sbGVyLnVuaXRXaWR0aCA6IDApO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gcGVyc1dpZHRoO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgIG5leHRNYXJnaW5MZWZ0ID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKyBwZXJzV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQYW5lbE1vZGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0ZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGVsZW1lbnQsIGN1cnJQb2ludCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RmxhdHMucHVzaCguLi5hd2FpdCBTdXJ2ZXlIZWxwZXIuZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKHN1cnZleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIDxRdWVzdGlvbj5lbGVtZW50LCBjdXJyUG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgaWYgKHJvd0ZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4ucm93RmxhdHMpLnlCb3Q7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5RVUVTX0dBUF9WRVJUX1NDQUxFO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goLi4ucm93RmxhdHMpO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlUGFuZWxGbGF0cztcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgcG9wUm93bGluZXMoZmxhdHM6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIHdoaWxlIChmbGF0cy5sZW5ndGggPiAwICYmIGZsYXRzW2ZsYXRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgUm93bGluZUJyaWNrKSB7XG4gICAgICAgICAgICBmbGF0cy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRUaXRsZShzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgaWYgKHN1cnZleS5zaG93VGl0bGUpIHtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkudGl0bGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdXJ2ZXlUaXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUaXRsZVN1cnZleUZsYXQoXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LCBjb250cm9sbGVyLCBzdXJ2ZXkubG9jVGl0bGUpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soc3VydmV5VGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBwb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChzdXJ2ZXlUaXRsZUZsYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1cnZleS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChzdXJ2ZXkudGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRTdXJ2ZXkuUEFORUxfREVTQ19HQVBfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZURlc2NGbGF0KFxuICAgICAgICAgICAgICAgICAgICBwb2ludCwgbnVsbCwgY29udHJvbGxlciwgc3VydmV5LmxvY0Rlc2NyaXB0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdExvZ29JbWFnZShzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoc3VydmV5LmxvY0xvZ28pLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnB4VG9QdChzdXJ2ZXkubG9nb1dpZHRoKSwgU3VydmV5SGVscGVyLnB4VG9QdChzdXJ2ZXkubG9nb0hlaWdodCkpO1xuICAgICAgICBsZXQgc2hpZnQ6IG51bWJlciA9IDA7XG4gICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBzaGlmdCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcikgLSBsb2dvRmxhdC53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHNoaWZ0ID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAvIDIuMCAtIGxvZ29GbGF0LndpZHRoIC8gMi4wO1xuICAgICAgICB9XG4gICAgICAgIGxvZ29GbGF0LnhMZWZ0ICs9IHNoaWZ0O1xuICAgICAgICBsb2dvRmxhdC54UmlnaHQgKz0gc2hpZnQ7XG4gICAgICAgIHJldHVybiBsb2dvRmxhdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRzKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTxJUGRmQnJpY2tbXVtdPiB7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXVtdID0gW107XG4gICAgICAgIGlmICghc3VydmV5Lmhhc0xvZ28pIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHMucHVzaChbdGl0bGVGbGF0XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3VydmV5LmlzTG9nb0JlZm9yZSkge1xuICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgZmxhdHMucHVzaChbbG9nb0ZsYXRdKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChsb2dvRmxhdCxcbiAgICAgICAgICAgICAgICBzdXJ2ZXkubG9nb1Bvc2l0aW9uID09PSAndG9wJywgc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpO1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIHRpdGxlUG9pbnQueExlZnQgKz0gY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gbG9nb0ZsYXQud2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpdGxlUG9pbnQueExlZnQgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCB0aXRsZVBvaW50KTtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJykgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0c1swXS5wdXNoKHRpdGxlRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChbbG9nb0ZsYXRdKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IGxvZ29GbGF0LndpZHRoICsgY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzWzBdLnVuc2hpZnQodGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBsZXQgbG9nb1BvaW50OiBJUG9pbnQgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludDtcbiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goW3RpdGxlRmxhdF0pO1xuICAgICAgICAgICAgICAgICAgICBsb2dvUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgbG9nb1BvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgbG9nb1BvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdHMubGVuZ3RoICE9PSAwKSBmbGF0c1swXS5wdXNoKGxvZ29GbGF0KTtcbiAgICAgICAgICAgICAgICBlbHNlIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvaW50OiBJUG9pbnQgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludDtcbiAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0c1swXSkpLnlUb3A7XG4gICAgICAgICAgICBmbGF0c1swXS5wdXNoKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChwb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgcG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0U3VydmV5LlBBTkVMX0NPTlRfR0FQX1NDQUxFICsgU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1cnZleS52aXNpYmxlUGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYWdlRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgICAgICBwYWdlRmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBwb2ludCkpO1xuICAgICAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc1BhZ2VPcHRpb25zID0gbmV3IEFkb3JuZXJzUGFnZU9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICAgICAgcGFnZUZsYXRzLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFnZS5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgICAgIHBhZ2VGbGF0cyA9IFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICAgICAgICAgIGlmIChpID09PSAwICYmIGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYXRzWzBdLnB1c2goLi4ucGFnZUZsYXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgZmxhdHMucHVzaChwYWdlRmxhdHMpO1xuICAgICAgICAgICAgdGhpcy5wb3BSb3dsaW5lcyhmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBwb2ludC55VG9wID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueVRvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DaGVja2JveE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyLCBJUG9pbnQgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIENoZWNrSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMC43O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENIRUNLTUFSS19SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICczJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVDogc3RyaW5nID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjAgLSBNYXRoLkUgLyAxMC4wO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHk6IGJvb2xlYW4sIHByb3RlY3RlZCBjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb247XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpICE9PSAnYWNyb2Zvcm0nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZW5kZXJSZWFkT25seSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoZWNrQm94OiBhbnkgPSBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybUNoZWNrQm94KSgpO1xuICAgICAgICBjb25zdCBmb3JtU2NhbGU6IG51bWJlciA9IFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgY2hlY2tCb3gubWF4Rm9udFNpemUgPSB0aGlzLmhlaWdodCAqIGZvcm1TY2FsZSAqIENoZWNrSXRlbUJyaWNrLkZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY2hlY2tCb3guY2FwdGlvbiA9IENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0w7XG4gICAgICAgIGNoZWNrQm94LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICBjaGVja0JveC5maWVsZE5hbWUgPSB0aGlzLmZpZWxkTmFtZTtcbiAgICAgICAgY2hlY2tCb3gucmVhZE9ubHkgPSB0aGlzLnJlYWRvbmx5O1xuICAgICAgICBjaGVja0JveC5jb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgICAgICBjaGVja0JveC52YWx1ZSA9IHRoaXMuY2hlY2tlZCA/ICdPbicgOiBmYWxzZTtcbiAgICAgICAgY2hlY2tCb3guQVMgPSB0aGlzLmNoZWNrZWQgPyAnL09uJyA6ICcvT2ZmJztcbiAgICAgICAgY2hlY2tCb3guUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNoZWNrQm94KTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250TmFtZTogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSBjaGVja21hcmtTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIGNoZWNrbWFya1NpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PmNoZWNrbWFya0ZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICBhd2FpdCBjaGVja21hcmtGbGF0LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gb2xkRm9udE5hbWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgUmFkaW9Hcm91cFdyYXAsIFJhZGlvSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhZGlvZ3JvdXAgZXh0ZW5kcyBGbGF0U2VsZWN0QmFzZSB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbDtcbiAgICBwcml2YXRlIHJhZGlvR3JvdXBXcmFwOiBSYWRpb0dyb3VwV3JhcDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICAgICAgaW5kZXg6IG51bWJlciwga2V5Pzogc3RyaW5nLCBjaGVja2VkPzogYm9vbGVhbik6IElQZGZCcmljayB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9IG5ldyBSYWRpb0dyb3VwV3JhcCh0aGlzLnF1ZXN0aW9uLmlkICsgKCh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykgPyAnJyA6IGtleSksXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkpO1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXAgPSB0aGlzLnJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJhZGlvR3JvdXBXcmFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9ICg8YW55PnRoaXMucXVlc3Rpb24pLnBkZlJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQ2hlY2tlZDogYm9vbGVhbiA9ICh0eXBlb2YgY2hlY2tlZCA9PT0gJ3VuZGVmaW5lZCcpID9cbiAgICAgICAgICAgIChpdGVtID09PSB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbSA/IHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkIDpcbiAgICAgICAgICAgICAgICAoaXRlbS52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMucXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSkpIDogY2hlY2tlZDtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWRpb0l0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICBpbmRleCwgaXNDaGVja2VkLCB0aGlzLnJhZGlvR3JvdXBXcmFwKTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3JhZGlvZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdidXR0b25ncm91cCcsIEZsYXRSYWRpb2dyb3VwKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb2xkQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsImV4cG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5leHBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmV4cG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBJTWFyZ2luTFIsIElNYXJnaW4sIElEb2NPcHRpb25zLCBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuZXhwb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuZXhwb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbic7XG5leHBvcnQgeyBGbGF0Qm9vbGVhbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbic7XG5leHBvcnQgeyBGbGF0Q2hlY2tib3ggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2NoZWNrYm94JztcbmV4cG9ydCB7IEZsYXRDdXN0b21Nb2RlbCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY3VzdG9tX21vZGVsJztcbmV4cG9ydCB7IEZsYXRDb21tZW50IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50JztcbmV4cG9ydCB7IEZsYXREcm9wZG93biB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24nO1xuZXhwb3J0IHsgRmxhdEV4cHJlc3Npb24gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2V4cHJlc3Npb24nO1xuZXhwb3J0IHsgRmxhdEZpbGUgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2ZpbGUnO1xuZXhwb3J0IHsgRmxhdEhUTUwgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuZXhwb3J0IHsgRmxhdEltYWdlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9pbWFnZSc7XG5leHBvcnQgeyBGbGF0SW1hZ2VQaWNrZXIgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2ltYWdlcGlja2VyJztcbmV4cG9ydCB7IEZsYXRQYW5lbER5bmFtaWMgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYyc7XG5leHBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmFkaW9ncm91cCc7XG5leHBvcnQgeyBGbGF0UmFua2luZyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmFua2luZyc7XG5leHBvcnQgeyBGbGF0UmF0aW5nIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYXRpbmcnO1xuZXhwb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UnO1xuZXhwb3J0IHsgRmxhdFNpZ25hdHVyZVBhZCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc2lnbmF0dXJlcGFkJztcbmV4cG9ydCB7IEZsYXRUZXh0Ym94IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94JztcbmV4cG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3N1cnZleSc7XG5leHBvcnQgeyBGbGF0TWF0cml4IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgnO1xuZXhwb3J0IHsgRmxhdE1hdHJpeE11bHRpcGxlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhtdWx0aXBsZSc7XG5leHBvcnQgeyBGbGF0TWF0cml4RHluYW1pYyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYyc7XG5leHBvcnQgeyBGbGF0TXVsdGlwbGVUZXh0IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQnO1xuZXhwb3J0IHsgUGFnZVBhY2tlciB9IGZyb20gJy4uL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyJztcbmV4cG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlcic7XG5leHBvcnQgeyBIb3Jpem9udGFsQWxpZ24sIFZlcnRpY2FsQWxpZ24sIElEcmF3UmVjdE9wdGlvbnMsIElEcmF3VGV4dE9wdGlvbnMsIElEcmF3SW1hZ2VPcHRpb25zLCBEcmF3Q2FudmFzIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9kcmF3X2NhbnZhcyc7XG5leHBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuZXhwb3J0IHsgQm9vbGVhbkl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Jvb2xlYW5pdGVtJztcbmV4cG9ydCB7IENoZWNrYm94SXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtJztcbmV4cG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtJztcbmV4cG9ydCB7IENvbW1lbnRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQnO1xuZXhwb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuZXhwb3J0IHsgQ3VzdG9tQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jdXN0b20nO1xuZXhwb3J0IHsgRHJvcGRvd25CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Ryb3Bkb3duJztcbmV4cG9ydCB7IEVtcHR5QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5leHBvcnQgeyBIVE1MQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9odG1sJztcbmV4cG9ydCB7IEltYWdlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9pbWFnZSc7XG5leHBvcnQgeyBMaW5rQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9saW5rJztcbmV4cG9ydCB7IFJhZGlvSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtJztcbmV4cG9ydCB7IFJhbmtpbmdJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbSc7XG5leHBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lJztcbmV4cG9ydCB7IFRleHRGaWVsZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGZpZWxkJztcbmV4cG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZCc7XG5leHBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym94JztcbmV4cG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuZXhwb3J0IHsgVGl0bGVQYW5lbEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbCc7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvcGRmLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsYXRTZWxlY3RCYXNlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hCYXNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hCYXNlPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrO1xuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBpZiAoaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtICYmIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAodHlwZW9mIHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQsIGZhbHNlLCBpbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IGNvbENvdW50OiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uLmNvbENvdW50O1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5jb2xDb3VudCA9PSAwKSB7XG4gICAgICAgICAgICBjb2xDb3VudCA9IE1hdGguZmxvb3IoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgLyB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSB8fCAxO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoIDwgY29sQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjb2xDb3VudCA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucXVlc3Rpb24uY29sQ291bnQgPiAxKSB7XG4gICAgICAgICAgICBjb2xDb3VudCA9IChTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmNvbENvdW50KSA8XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aCkgPyAxIDogdGhpcy5xdWVzdGlvbi5jb2xDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGNvbENvdW50ID09IDEpID8gYXdhaXQgdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcykgOlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50LCBjb2xDb3VudCk7XG5cbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGl0ZW1WYWx1ZXM6IEl0ZW1WYWx1ZVtdKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaXRlbVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKGN1cnJQb2ludCwgaXRlbVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50LCBjb2xDb3VudDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgcm93OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQsIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0KTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQsIGkgJSBjb2xDb3VudCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKFxuICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3cuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGlmIChpICUgY29sQ291bnQgPT09IGNvbENvdW50IC0gMSB8fCBpID09PSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dMaW5lRmxhdDogSVBkZkJyaWNrID0gU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocm93KSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0xpbmVGbGF0LnlCb3QgK1xuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2gocm93LCByb3dMaW5lRmxhdCk7XG4gICAgICAgICAgICAgICAgcm93ID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJpbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIFJvd2xpbmVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5VG9wOiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMueExlZnQgPSByZWN0LnhMZWZ0O1xuICAgICAgICB0aGlzLnhSaWdodCA9IHJlY3QueFJpZ2h0O1xuICAgICAgICB0aGlzLnlUb3AgPSByZWN0LnlUb3A7XG4gICAgICAgIHRoaXMueUJvdCA9IHJlY3QueUJvdDtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb2xvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG9sZERyYXdDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5saW5lKHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy54UmlnaHQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4vcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb3hCcmljayBleHRlbmRzIFRleHRGaWVsZEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2UsIGluZGV4OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaWQgKyAoaXNRdWVzdGlvbiA/ICcnIDogJ19jb21tZW50JyArIGluZGV4KSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKDxRdWVzdGlvbj5xdWVzdGlvbiwgaXNRdWVzdGlvbiksXG4gICAgICAgICAgICBpc1F1ZXN0aW9uID8gU3VydmV5SGVscGVyLmdldExvY1N0cmluZygoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5sb2NQbGFjZUhvbGRlcikgOiAnJyxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHksIGlzTXVsdGlsaW5lLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaW5wdXRUeXBlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgVGV4dEZpZWxkQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblRleHRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuLFxuICAgICAgICBwcm90ZWN0ZWQgZmllbGROYW1lOiBzdHJpbmcsIHByb3RlY3RlZCB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhY2Vob2xkZXI6IHN0cmluZywgcHJvdGVjdGVkIGlzUmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgICAgIHByb3RlY3RlZCBpc011bHRpbGluZTogYm9vbGVhbiwgcHJvdGVjdGVkIGlucHV0VHlwZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSByZW5kZXJDb2xvclF1ZXN0aW9uKCk6IHZvaWQge1xuICAgICAgICBsZXQgb2xkRmlsbENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldEZpbGxDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcih0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8ICdibGFjaycpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnJlY3QodGhpcy54TGVmdCwgdGhpcy55VG9wLFxuICAgICAgICAgICAgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsICdGJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKG9sZEZpbGxDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbG9yUXVlc3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dEZpZWxkOiBhbnkgPSB0aGlzLmlucHV0VHlwZSA9PT0gJ3Bhc3N3b3JkJyA/XG4gICAgICAgICAgICBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVBhc3N3b3JkRmllbGQpKCkgOlxuICAgICAgICAgICAgbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1UZXh0RmllbGQpKCk7XG4gICAgICAgIGlucHV0RmllbGQuZmllbGROYW1lID0gdGhpcy5maWVsZE5hbWU7XG4gICAgICAgIGlucHV0RmllbGQuZm9udE5hbWUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgIGlucHV0RmllbGQuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBpbnB1dEZpZWxkLmlzVW5pY29kZSA9IFN1cnZleUhlbHBlci5pc0N1c3RvbUZvbnQoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGlucHV0RmllbGQuZm9udE5hbWUpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgIT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgICAgIGlucHV0RmllbGQuViA9ICcgJyArIHRoaXMudmFsdWU7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLkRWID0gJyAnICsgdGhpcy5wbGFjZWhvbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlucHV0RmllbGQudmFsdWUgPSAnJztcbiAgICAgICAgaW5wdXRGaWVsZC5tdWx0aWxpbmUgPSB0aGlzLmlzTXVsdGlsaW5lO1xuICAgICAgICBpbnB1dEZpZWxkLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgICAgICBpbnB1dEZpZWxkLmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGxldCBmb3JtU2NhbGU6IG51bWJlciA9IFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaW5wdXRGaWVsZC5tYXhGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZSAqIGZvcm1TY2FsZTtcbiAgICAgICAgaW5wdXRGaWVsZC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcywgZm9ybVNjYWxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQoaW5wdXRGaWVsZCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLnhSaWdodCk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb2xvclF1ZXN0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBTdXJ2ZXlIZWxwZXIucmVuZGVyUmVhZE9ubHlUZXh0RmllbGQodGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50RGlzcGxheVZhbHVlKHRoaXMucXVlc3Rpb24sIHRoaXMuaXNRdWVzdGlvbiksXG4gICAgICAgICAgICAgICAgIXRoaXMuaXNNdWx0aWxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9XG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBJUmVjdCwgSU1hcmdpbiwgSVNpemUsIERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbi8qKlxuICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgdHlwZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgZW51bSBIb3Jpem9udGFsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIExlZnQgPSAnbGVmdCcsXG4gICAgQ2VudGVyID0gJ2NlbnRlcicsXG4gICAgUmlnaHQgPSAncmlnaHQnXG59XG4vKipcbiAqIFZlcnRpY2FsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnRpY2FsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIFRvcCA9ICd0b3AnLFxuICAgIE1pZGRsZSA9ICdtaWRkbGUnLFxuICAgIEJvdHRvbSA9ICdib3R0b20nXG59XG4vKipcbiAqIENvbW1vbiBvcHRpb25zIG9mIHJlbmRlcmluZyB0ZXh0IGFuZCBpbWFnZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3Jpem9udGFsIGFsaWdubWVudCBvZiBpdGVtLCBpZiBzZXQgKGNlbnRlciBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdmVydGljYWwgYWxpZ25tZW50IG9mIGl0ZW0sIGlmIHNldCAobWlkZGxlIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgdmVydGljYWxBbGlnbj86IFZlcnRpY2FsQWxpZ247XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIG1hcmdpbnMgaW5zaWRlIHRoZSBkcmF3aW5nIHJlY3RhbmdsZSAodXNlZCBpZiBhbGlnbm1lbnQgc2V0LCBhbGwgemVybyBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuICAgIC8qKlxuICAgICAqIE9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRleHQgcmVjdGFuZ2xlICh1c2VkIGlmIGFsaWdubWVudCBub3Qgc2V0KVxuICAgICAqL1xuICAgIHJlY3Q/OiBJUmVjdDtcbn1cbi8qKlxuICogT3B0aW9ucyBvZiByZW5kZXJpbmcgdGV4dCBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdUZXh0T3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFN0cmluZyB0aGF0IHdpbGwgYmUgZHJhd25cbiAgICAgKi9cbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRm9udCBzaXplIG9mIHRleHQgKDE0IGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgZm9udFNpemU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU2V0IHRydWUgdG8gbWFrZSB0ZXh0IGJvbGQgKGZhbHNlIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgaXNCb2xkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogT3B0aW9ucyBvZiByZW5kZXJpbmcgaW1hZ2VzIGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRHJhd0ltYWdlT3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBpbWFnZSB3aWR0aCAodXNlZCBpZiBhbGlnbm1lbnQgc2V0LCBjYW52YXMucmVjdCdzIHdpZHRoIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGltYWdlIGhlaWdodCAodXNlZCBpZiBhbGlnbm1lbnQgc2V0LCBjYW52YXMucmVjdCdzIGhlaWdodCBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdHJpbmcgd2l0aCBiYXNlNjQgZW5jb2RlZCBpbWFnZVxuICAgICAqL1xuICAgIGJhc2U2NDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERyYXdDYW52YXMgb2JqZWN0IHBhc3NlZCB0byBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmF3Q2FudmFzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHBhY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByb3RlY3RlZCBfcmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBfY291bnRQYWdlczogbnVtYmVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3BhZ2VOdW1iZXI6IG51bWJlcikgeyB9XG4gICAgLyoqXG4gICAgICogQ291bnQgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjb3VudFBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBhZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYWdlIG51bWJlciBmcm9tIDFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VOdW1iZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VOdW1iZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRoZSByZWN0YW5nbGUgYXZhaWxhYmxlIGZvciBkcmF3aW5nXG4gICAgICogQHNlZSBJUmVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVjdCgpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWN0O1xuICAgIH1cbiAgICBwcml2YXRlIGFsaWduUmVjdChyZWN0T3B0aW9uczogSURyYXdSZWN0T3B0aW9ucywgaXRlbVNpemU6IElTaXplKTogSVJlY3Qge1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zID0geyBsZWZ0OiAwLjAsIHJpZ2h0OiAwLjAsIHRvcDogMC4wLCBib3Q6IDAuMCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnJlY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09IEhvcml6b250YWxBbGlnbi5Ob3RTZXQpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPT09IFZlcnRpY2FsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9IFZlcnRpY2FsQWxpZ24uTWlkZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNsb25lKHRoaXMucmVjdCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3dpdGNoIChyZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5MZWZ0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ICsgaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5DZW50ZXI6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueExlZnQgPSBNYXRoLm1heCh0aGlzLnJlY3QueExlZnQgKyByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCAtIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gTWF0aC5taW4odGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCArIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbEFsaWduLlJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgLSBpdGVtU2l6ZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC54TGVmdCA9IHJlY3RPcHRpb25zLnJlY3QueExlZnQgfHwgdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICAgICAgcmVjdC54UmlnaHQgPSByZWN0T3B0aW9ucy5yZWN0LnhSaWdodCB8fCB0aGlzLnJlY3QueFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMudmVydGljYWxBbGlnbikge1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5Ub3A6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wICsgaXRlbVNpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLk1pZGRsZTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJlY3QueVRvcCArIHRoaXMucmVjdC55Qm90IC0gaXRlbVNpemUuaGVpZ2h0KSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCArIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uQm90dG9tOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSBNYXRoLm1heCh0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlCb3QgLSByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCAtIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3Q7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC55VG9wID0gcmVjdE9wdGlvbnMucmVjdC55VG9wIHx8IHRoaXMucmVjdC55VG9wO1xuICAgICAgICAgICAgcmVjdC55Qm90ID0gcmVjdE9wdGlvbnMucmVjdC55Qm90IHx8IHRoaXMucmVjdC55Qm90O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIGRyYXcgdGV4dFxuICAgICAqIEBwYXJhbSB0ZXh0T3B0aW9ucyBTZXQgb3B0aW9ucyBvZiB0aGUgZHJhd24gdGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBkcmF3VGV4dCh0ZXh0T3B0aW9uczogSURyYXdUZXh0T3B0aW9ucyk6IHZvaWQge1xuICAgICAgICB0ZXh0T3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZSh0ZXh0T3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dE9wdGlvbnMuZm9udFNpemUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0ZXh0T3B0aW9ucy5mb250U2l6ZSA9IERvY09wdGlvbnMuRk9OVF9TSVpFO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dE9wdGlvbnMuaXNCb2xkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGV4dE9wdGlvbnMuaXNCb2xkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dFNpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRleHRPcHRpb25zLnRleHQsXG4gICAgICAgICAgICB0ZXh0T3B0aW9ucy5pc0JvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJywgdGV4dE9wdGlvbnMuZm9udFNpemUpO1xuICAgICAgICBjb25zdCB0ZXh0UmVjdDogSVJlY3QgPSB0aGlzLmFsaWduUmVjdCh0ZXh0T3B0aW9ucywgdGV4dFNpemUpO1xuICAgICAgICBpZiAoIXRleHRPcHRpb25zLmlzQm9sZCkge1xuICAgICAgICAgICAgdGhpcy5wYWNrcy5wdXNoKG5ldyBUZXh0QnJpY2sobnVsbCwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRleHRSZWN0LCB0ZXh0T3B0aW9ucy50ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tzLnB1c2gobmV3IFRleHRCb2xkQnJpY2sobnVsbCwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRleHRSZWN0LCB0ZXh0T3B0aW9ucy50ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgKDxQZGZCcmljaz50aGlzLnBhY2tzW3RoaXMucGFja3MubGVuZ3RoIC0gMV0pLmZvbnRTaXplID0gdGV4dE9wdGlvbnMuZm9udFNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZHJhdyBpbWFnZVxuICAgICAqIEBwYXJhbSBpbWFnZU9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZHJhd0ltYWdlKGltYWdlT3B0aW9uczogSURyYXdJbWFnZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaW1hZ2VPcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKGltYWdlT3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2VPcHRpb25zLndpZHRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1hZ2VPcHRpb25zLndpZHRoID0gdGhpcy5yZWN0LnhSaWdodCAtIHRoaXMucmVjdC54TGVmdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGltYWdlT3B0aW9ucy5oZWlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMuaGVpZ2h0ID0gdGhpcy5yZWN0LnlCb3QgLSB0aGlzLnJlY3QueVRvcDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbWFnZVNpemU6IElTaXplID0ge1xuICAgICAgICAgICAgd2lkdGg6IGltYWdlT3B0aW9ucy53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaW1hZ2VPcHRpb25zLmhlaWdodFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpbWFnZVJlY3Q6IElSZWN0ID0gdGhpcy5hbGlnblJlY3QoaW1hZ2VPcHRpb25zLCBpbWFnZVNpemUpO1xuICAgICAgICB0aGlzLnBhY2tzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChpbWFnZVJlY3QsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgbnVsbCwgdGhpcy5jb250cm9sbGVyLCBpbWFnZU9wdGlvbnMuYmFzZTY0LFxuICAgICAgICAgICAgaW1hZ2VSZWN0LnhSaWdodCAtIGltYWdlUmVjdC54TGVmdCxcbiAgICAgICAgICAgIGltYWdlUmVjdC55Qm90IC0gaW1hZ2VSZWN0LnlUb3ApKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRHJhd0NhbnZhcyB9IGZyb20gJy4vZHJhd19jYW52YXMnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBFdmVudEFzeW5jPFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4gZXh0ZW5kcyBFdmVudDxULCBPcHRpb25zPiB7XG4gICAgcHVibGljIHVuc2hpZnQoZnVuYzogVCkge1xuICAgICAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBBcnJheTxUPigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnVuc2hpZnQoZnVuYyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaXJlKHNlbmRlcjogYW55LCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbGJhY2tzW2ldKHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIHByb2Nlc3NfaGVhZGVyX2V2ZW50cyhzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcGFja3M6IElQZGZCcmlja1tdW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFzdXJ2ZXkuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuYWRkKChfLCBjYW52YXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU3VydmV5SlMgUERGIHwgUGxlYXNlIHB1cmNoYXNlIGEgU3VydmV5SlMgUERGIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdCBpbiB5b3VyIGFwcCB8IGh0dHBzOi8vc3VydmV5anMuaW8vQnV5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDEwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN1cnZleS5vblJlbmRlckhlYWRlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgICAgIHN1cnZleS5vblJlbmRlckZvb3Rlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUZvb3RlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyLnRzIiwiaW1wb3J0IHtcbiAgICBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLFxuICAgIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgU2VyaWFsaXplciwgUGFuZWxNb2RlbFxufSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24sIEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuL2ZsYXRfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNYXRyaXhNdWx0aXBsZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByb3RlY3RlZCBpc011bHRpcGxlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNDZWxsKHBvaW50OiBJUG9pbnQsIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsXG4gICAgICAgIGlzSGVhZGVyOiBib29sZWFuKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChjZWxsLmhhc1F1ZXN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoY2VsbC5jZWxsLmNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRNdWx0aXBsZUNvbHVtbnNRdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgY2VsbC5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBjZWxsLnF1ZXN0aW9uLmdldFR5cGUoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLm1vdmVSZWN0KFN1cnZleUhlbHBlci5zY2FsZVJlY3QoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soKDxGbGF0U2VsZWN0QmFzZT5mbGF0TXVsdGlwbGVDb2x1bW5zUXVlc3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUZsYXRJdGVtKGl0ZW1SZWN0LCBjZWxsLml0ZW0sIGNlbGwuY2hvaWNlSW5kZXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNlbGwucXVlc3Rpb24udGl0bGVMb2NhdGlvbiA9IFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVg7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKC4uLmF3YWl0IFN1cnZleUhlbHBlci5nZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwucXVlc3Rpb24sIHBvaW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2VsbC5oYXNUaXRsZSkge1xuICAgICAgICAgICAgaWYgKGlzSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5sb2NUaXRsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBjZWxsLmxvY1RpdGxlLCBUZXh0QnJpY2spKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dIb3Jpc29udGFsKHBvaW50OiBJUG9pbnQsIHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBjb2x1bW5XaWR0aDogbnVtYmVyW10pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBsZXQgbGFzdFJpZ2h0TWFyZ2luOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgK1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgbGV0IGNudCA9IDA7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMucXVlc3Rpb24uZGV0YWlsUGFuZWxNb2RlICE9PSAnbm9uZScgPyAxIDogMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNudCA9PSBjb2xDb3VudCkgYnJlYWs7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSBsYXN0UmlnaHRNYXJnaW4gK1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb2x1bW5XaWR0aFtjbnRdO1xuICAgICAgICAgICAgbGFzdFJpZ2h0TWFyZ2luID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgY2VsbENvbnRlbnQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ2VsbChcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIHJvdy5jZWxsc1tpXSwgcm93ID09PSB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuaGVhZGVyUm93KTtcbiAgICAgICAgICAgIGlmICghY2VsbENvbnRlbnQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhjZWxsQ29udGVudCk7XG4gICAgICAgICAgICAgICAgY250Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csXG4gICAgICAgIGNvbENvdW50OiBudW1iZXIpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgTWF0aC5taW4oY29sQ291bnQsIHJvdy5jZWxscy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuc2hvd0hlYWRlciAmJiAoIXRoaXMuaXNNdWx0aXBsZSB8fCBpID4gMCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ2VsbChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5oZWFkZXJSb3cuY2VsbHNbaV0sIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjb21wb3NpdGUueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ2VsbChjdXJyUG9pbnQsIHJvdy5jZWxsc1tpXSwgZmFsc2UpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sIGNvbENvdW50OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLVxuICAgICAgICAgICAgKGNvbENvdW50IC0gMSkgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIGxldCByZW1haW5XaWR0aDogbnVtYmVyID0gYXZhaWxhYmxlV2lkdGg7XG4gICAgICAgIGxldCByZW1haW5Db2xDb3VudDogbnVtYmVyID0gY29sQ291bnQ7XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHJvd3NbMF0uY2VsbHNbaV0ud2lkdGgsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICByZW1haW5XaWR0aCAtPSB3aWR0aDtcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gMC4wKSByZW1haW5Db2xDb3VudC0tO1xuICAgICAgICAgICAgY29sdW1uV2lkdGgucHVzaCh3aWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbWFpbkNvbENvdW50ID09PSAwKSByZXR1cm4gY29sdW1uV2lkdGg7XG4gICAgICAgIGNvbnN0IGhldXJpc3RpY1dpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoO1xuICAgICAgICBjb25zdCBjb2x1bW5NaW5XaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoXG4gICAgICAgICAgICByb3dzWzBdLmNlbGxzWzBdLm1pbldpZHRoLCByZW1haW5XaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgY29uc3QgZXF1YWxXaWR0aDogbnVtYmVyID0gcmVtYWluV2lkdGggLyByZW1haW5Db2xDb3VudDtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IE1hdGgubWF4KGhldXJpc3RpY1dpZHRoLCBjb2x1bW5NaW5XaWR0aCwgZXF1YWxXaWR0aCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjb2x1bW5XaWR0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvbHVtbldpZHRoW2ldID09PSAwLjApIGNvbHVtbldpZHRoW2ldID0gd2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlT25lUm93KHBvaW50OiBJUG9pbnQsIHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBpc1dpZGU6IGJvb2xlYW4sIGNvbHVtbldpZHRoOiBudW1iZXJbXSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgaWYgKGlzV2lkZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd0hvcmlzb250YWwocG9pbnQsIHJvdywgY29sQ291bnQsIGNvbHVtbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQsIHJvdywgY29sQ291bnQpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dzKHBvaW50OiBJUG9pbnQsIHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBpc1dpZGU6IGJvb2xlYW4pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb3dGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzW2ldLCBjb2xDb3VudCxcbiAgICAgICAgICAgICAgICBpc1dpZGUsIHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93cywgY29sQ291bnQpKTtcbiAgICAgICAgICAgIGlmIChyb3dGbGF0LmlzRW1wdHkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93RmxhdC55Qm90O1xuICAgICAgICAgICAgICAgIHJvd0ZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChyb3dGbGF0KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93RmxhdC55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uZGV0YWlsUGFuZWxNb2RlICE9PSAnbm9uZScgJiYgaSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RGV0YWlsUGFuZWw6IFBhbmVsTW9kZWwgPSB0aGlzLnF1ZXN0aW9uLmRldGFpbFBhbmVsVmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXRhaWxQYW5lbC5xdWVzdGlvbnNbal0uaWQgKz0gJ18nICsgaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWxCcmlja3M6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCB0aGlzLmNvbnRyb2xsZXIsIGN1cnJlbnREZXRhaWxQYW5lbCwgY3VyclBvaW50KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJDb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICAgICAgY3VyckNvbXBvc2l0ZS5hZGRCcmljayguLi5wYW5lbEJyaWNrcyk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjdXJyQ29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goY3VyckNvbXBvc2l0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSAmJiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyOiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzWzBdLCBjb2xDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGhlYWRlci55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goaGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICAgICAgY29uc3QgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IHRoaXMucXVlc3Rpb24uY29sdW1uTGF5b3V0ID09PSAndmVydGljYWwnO1xuICAgICAgICBjb25zdCBjb2xDb3VudDogbnVtYmVyID0gdGFibGUucm93c1swXSA/IHRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoIC1cbiAgICAgICAgICAgICh0YWJsZS5oYXNSZW1vdmVSb3dzICYmICFpc1ZlcnRpY2FsID8gKHRoaXMucXVlc3Rpb24uZGV0YWlsUGFuZWxNb2RlICE9PSAnbm9uZScgPyAyIDogMSkgOiAwKSA6XG4gICAgICAgICAgICB0YWJsZS5zaG93SGVhZGVyICYmIHRhYmxlLmhlYWRlclJvdyA/IHRhYmxlLmhlYWRlclJvdy5jZWxscy5sZW5ndGggOlxuICAgICAgICAgICAgICAgIHRhYmxlLnNob3dGb290ZXIgJiYgdGFibGUuZm9vdGVyUm93ID8gdGFibGUuZm9vdGVyUm93LmNlbGxzLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChjb2xDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgQ29tcG9zaXRlQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10gPSBbXTtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCk7XG4gICAgICAgIGNvbnN0IGlzV2lkZTogYm9vbGVhbiA9IHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgIT09ICdsaXN0JyAmJlxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hdHJpeFJlbmRlckFzICE9PSAnbGlzdCcgJiZcbiAgICAgICAgICAgIGNlbGxXaWR0aCA+PSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoO1xuICAgICAgICBpZiAodGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHJvd3MucHVzaCh0YWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICByb3dzLnB1c2goLi4udGFibGUucm93cyk7XG4gICAgICAgIGlmICh0YWJsZS5oYXNSZW1vdmVSb3dzICYmIGlzVmVydGljYWwpIHJvd3MucG9wKCk7XG4gICAgICAgIGlmICh0YWJsZS5zaG93Rm9vdGVyICYmIGlzV2lkZSkgcm93cy5wdXNoKHRhYmxlLmZvb3RlclJvdyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKHBvaW50LCByb3dzLCBjb2xDb3VudCwgaXNXaWRlKTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeGRyb3Bkb3duJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGRyb3Bkb3duJywgRmxhdE1hdHJpeE11bHRpcGxlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhtdWx0aXBsZS50cyIsImltcG9ydCBJbnRlcnZhbFRyZWUgZnJvbSAnbm9kZS1pbnRlcnZhbC10cmVlJztcbmltcG9ydCB7IERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuaW50ZXJmYWNlIFBhY2tJbnRlcnZhbCB7XG4gICAgcGFnZUluZGV4OiBudW1iZXI7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgYWJzQm90OiBudW1iZXI7XG59XG5leHBvcnQgY2xhc3MgUGFnZVBhY2tlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZEJvdEludGVydmFsKHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+LFxuICAgICAgICB4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlciwgb3B0aW9uczogRG9jT3B0aW9ucyk6IFBhY2tJbnRlcnZhbCB7XG4gICAgICAgIGNvbnN0IGludGVydmFsczogUGFja0ludGVydmFsW10gPSB0cmVlLnNlYXJjaCh4TGVmdCwgeFJpZ2h0KTtcbiAgICAgICAgaW50ZXJ2YWxzLnB1c2goe1xuICAgICAgICAgICAgcGFnZUluZGV4OiAwLCB4TGVmdDpcbiAgICAgICAgICAgICAgICBvcHRpb25zLm1hcmdpbnMubGVmdCwgeFJpZ2h0OiBvcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3AsIGFic0JvdDogb3B0aW9ucy5tYXJnaW5zLnRvcFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGludGVydmFscy5yZWR1Y2UoKG14LCBjcikgPT4ge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNyLnhSaWdodCAtIHhMZWZ0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OIHx8XG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoY3IueExlZnQgLSB4UmlnaHQpIDwgU3VydmV5SGVscGVyLkVQU0lMT04pIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPCBteC5wYWdlSW5kZXgpIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPiBteC5wYWdlSW5kZXgpIHJldHVybiBjcjtcbiAgICAgICAgICAgIHJldHVybiBjci55Qm90ID4gbXgueUJvdCA/IGNyIDogbXg7XG4gICAgICAgIH0sIGludGVydmFsc1tpbnRlcnZhbHMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhZGRQYWNrKHBhY2tzOiBJUGRmQnJpY2tbXVtdLCBpbmRleDogbnVtYmVyLCBicmljazogSVBkZkJyaWNrKSB7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHBhY2tzLmxlbmd0aDsgaSA8PSBpbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBwYWNrcy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBwYWNrc1tpbmRleF0ucHVzaChicmljayk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcGFjayhmbGF0czogSVBkZkJyaWNrW11bXSwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElQZGZCcmlja1tdW10ge1xuICAgICAgICBjb25zdCBwYWdlSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy50b3AgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90O1xuICAgICAgICBjb25zdCB1bmZvbGRGbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBmbGF0cy5mb3JFYWNoKChmbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0cy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGZsYXRzUGFnZS5mb3JFYWNoKChmbGF0OiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdC5oZWlnaHQgPiBwYWdlSGVpZ2h0ICsgU3VydmV5SGVscGVyLkVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaCguLi5mbGF0LnVuZm9sZCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB1bmZvbGRGbGF0c1t1bmZvbGRGbGF0cy5sZW5ndGggLSAxXS5wdXNoKGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB1bmZvbGRGbGF0cy5mb3JFYWNoKCh1bmZvbGRGbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2Uuc29ydCgoYTogSVBkZkJyaWNrLCBiOiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS55VG9wIDwgYi55VG9wKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA+IGIueVRvcCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPiBiLnhMZWZ0KSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICBpZiAoYS54TGVmdCA8IGIueExlZnQpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHBhZ2VJbmRleE1vZGVsOiBudW1iZXIgPSAwO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBjb25zdCBwYWdlQm90OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJlZTogSW50ZXJ2YWxUcmVlPFBhY2tJbnRlcnZhbD4gPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XG4gICAgICAgICAgICBsZXQgcGFnZUluZGV4U2hpZnQ6IG51bWJlciA9IDA7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgcGFnZUluZGV4LCB5Qm90LCBhYnNCb3QgfSA9IFBhZ2VQYWNrZXIuZmluZEJvdEludGVydmFsKFxuICAgICAgICAgICAgICAgICAgICB0cmVlLCBmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwgY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBmbGF0LmhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSB5Qm90ICsgZmxhdC55VG9wIC0gYWJzQm90O1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhmbGF0LnlUb3AgLSBjb250cm9sbGVyLm1hcmdpbnMudG9wKSA+IFN1cnZleUhlbHBlci5FUFNJTE9OICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCArIGhlaWdodCA+IHBhZ2VCb3QgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fCBmbGF0LmlzUGFnZUJyZWFrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCA9IGNvbnRyb2xsZXIubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXhTaGlmdCA9IE1hdGgubWF4KHBhZ2VJbmRleFNoaWZ0LCBwYWdlSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlLmluc2VydChmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwge1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgeExlZnQ6IGZsYXQueExlZnQsIHhSaWdodDogZmxhdC54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHlCb3Q6IGZsYXQueVRvcCArIGhlaWdodCwgYWJzQm90OiBmbGF0LnlCb3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmbGF0LnlCb3QgPSBmbGF0LnlUb3AgKyBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgUGFnZVBhY2tlci5hZGRQYWNrKHBhY2tzLCBwYWdlSW5kZXhNb2RlbCArIHBhZ2VJbmRleCwgZmxhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhZ2VJbmRleE1vZGVsICs9IHBhZ2VJbmRleFNoaWZ0ICsgMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYWNrcztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5pZCxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHksXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5jaGVja2VkVmFsdWUpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCwgSXRlbVZhbHVlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBDaGVja2JveEl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCxcbiAgICAgICAgICAgICg8UXVlc3Rpb25DaGVja2JveE1vZGVsPnF1ZXN0aW9uKS5pZCArICdpbmRleCcgKyBpbmRleCxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLFxuICAgICAgICAgICAgKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJveEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGJveCc7XG5cbmV4cG9ydCBjbGFzcyBDb21tZW50QnJpY2sgZXh0ZW5kcyBUZXh0Qm94QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIGlzUXVlc3Rpb246IGJvb2xlYW4sIGluZGV4OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLCB0cnVlLCBpbmRleCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwsIEl0ZW1WYWx1ZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWw7XG4gICAgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjb21ib0JveCA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ29tYm9Cb3gpKCk7XG4gICAgICAgIGNvbWJvQm94LmZpZWxkTmFtZSA9IHRoaXMucXVlc3Rpb24uaWQ7XG4gICAgICAgIGNvbWJvQm94LlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKSkpO1xuICAgICAgICBjb21ib0JveC5lZGl0ID0gZmFsc2U7XG4gICAgICAgIGNvbWJvQm94LmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnNob3dPcHRpb25zQ2FwdGlvbikge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHRoaXMucXVlc3Rpb24ub3B0aW9uc0NhcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaCgoaXRlbTogSXRlbVZhbHVlKSA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goU3VydmV5SGVscGVyLmdldExvY1N0cmluZyhpdGVtLmxvY1RleHQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbWJvQm94LnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGNvbWJvQm94LmZvbnROYW1lID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICBjb21ib0JveC5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGNvbWJvQm94LnJlYWRPbmx5ID0gdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5O1xuICAgICAgICBjb21ib0JveC5pc1VuaWNvZGUgPSBTdXJ2ZXlIZWxwZXIuaXNDdXN0b21Gb250KFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBjb21ib0JveC5mb250TmFtZSk7XG4gICAgICAgIGNvbWJvQm94LlYgPSBTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNvbWJvQm94KTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMueExlZnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLnJlbmRlclJlYWRPbmx5VGV4dEZpZWxkKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbiwgdGhpcyxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXREcm9wZG93blF1ZXN0aW9uVmFsdWUodGhpcy5xdWVzdGlvbiksICEodGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5ICYmIHRoaXMuY29udHJvbGxlci50ZXh0RmllbGRSZW5kZXJBcyA9PT0gJ211bHRpTGluZScpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRW1wdHlCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbnVsbCxcbiAgICAgICAgaXNCb3JkZXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobnVsbCwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMuaXNCb3JkZXJWaXNpYmxlID0gaXNCb3JkZXJWaXNpYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplQm9yZGVyKGlzSW5jcmVhc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29lZjogbnVtYmVyID0gaXNJbmNyZWFzZSA/IDEgOiAtMTtcbiAgICAgICAgY29uc3QgYm9yZGVyUGFkZGluZzogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgIHRoaXMueExlZnQgLT0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgICAgIHRoaXMueFJpZ2h0ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnlCb3QgKz0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc0JvcmRlclZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplQm9yZGVyKHRydWUpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcihmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2VtcHR5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcblxuZXhwb3J0IGNsYXNzIEhUTUxCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIG1hcmdpbnM6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgaHRtbDogc3RyaW5nLCBpc0ltYWdlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICBpZiAoaXNJbWFnZSkge1xuICAgICAgICAgICAgdGhpcy5tYXJnaW5zID0ge1xuICAgICAgICAgICAgICAgIHRvcDogMC4wLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMC4wXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXJnaW5zID0ge1xuICAgICAgICAgICAgICAgIHRvcDogY29udHJvbGxlci5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICBib3R0b206IGNvbnRyb2xsZXIubWFyZ2lucy5ib3RcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuZnJvbUhUTUwodGhpcy5odG1sLCB0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCwgcGFnZXNwbGl0OiB0cnVlLFxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJykpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlbDogSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5uYW1lLmxhc3RJbmRleE9mKCdqc1BERmh0bWxUZXh0JywgMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5tYXJnaW5zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQb2ludCB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcblxuZXhwb3J0IGNsYXNzIEltYWdlQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByb3RlY3RlZCBpbWFnZTogc3RyaW5nLFxuICAgICAgICBwb2ludDogSVBvaW50LCBwcm90ZWN0ZWQgb3JpZ2luYWxXaWR0aDogbnVtYmVyLCBwcm90ZWN0ZWQgb3JpZ2luYWxIZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIChvcmlnaW5hbFdpZHRoIHx8IDApLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyAob3JpZ2luYWxIZWlnaHQgfHwgMClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNQYWdlQnJlYWsgPSB0aGlzLm9yaWdpbmFsSGVpZ2h0ID09PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkSW1hZ2UodGhpcy5pbWFnZSwgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLm9yaWdpbmFsV2lkdGgsIHRoaXMub3JpZ2luYWxIZWlnaHQpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgTGlua0JyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQ0FMRV9GQUNUT1JfTUFHSUM6IG51bWJlciA9IDAuOTU1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09MT1I6IHN0cmluZyA9ICcjMDAwMEVFJztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodGV4dEZsYXQ6IFRleHRCcmljaywgcHJvdGVjdGVkIGxpbms6IHN0cmluZykge1xuICAgICAgICBzdXBlcigoPExpbmtCcmljaz50ZXh0RmxhdCkucXVlc3Rpb24sXG4gICAgICAgICAgICAoPExpbmtCcmljaz50ZXh0RmxhdCkuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRleHRGbGF0LCAoPExpbmtCcmljaz50ZXh0RmxhdCkudGV4dCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gTGlua0JyaWNrLkNPTE9SO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRUZXh0Q29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0VGV4dENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKFN1cnZleUhlbHBlci5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgbGV0IGRlc2NlbnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICh0aGlzLmNvbnRyb2xsZXIuZG9jLmdldExpbmVIZWlnaHRGYWN0b3IoKSAtXG4gICAgICAgICAgICAgICAgTGlua0JyaWNrLlNDQUxFX0ZBQ1RPUl9NQUdJQyk7XG4gICAgICAgIGxldCB5VG9wTGluazogbnVtYmVyID0gdGhpcy55VG9wICtcbiAgICAgICAgICAgICh0aGlzLnlCb3QgLSB0aGlzLnlUb3ApIC0gZGVzY2VudDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy50ZXh0V2l0aExpbmsodGhpcy50ZXh0LCB0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgeVRvcExpbmssIHsgdXJsOiB0aGlzLmxpbmsgfSk7XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKDxRdWVzdGlvbj50aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwV3JhcCB7XG4gICAgcHJpdmF0ZSBfcmFkaW9Hcm91cDogYW55O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByaXZhdGUgX3JlYWRPbmx5OiBib29sZWFuKSB7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRUb1BkZihjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAgPSBuZXcgdGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVJhZGlvQnV0dG9uKCk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuZmllbGROYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAucmVhZE9ubHkgPSB0aGlzLnJlYWRPbmx5O1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLmNvbG9yID0gY29sb3I7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQodGhpcy5fcmFkaW9Hcm91cCk7XG4gICAgfVxuICAgIGdldCByYWRpb0dyb3VwKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWRpb0dyb3VwO1xuICAgIH1cbiAgICBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkT25seTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRpb0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICfigKInO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS41NzU7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcml2YXRlIGluZGV4OiBudW1iZXIsIHByaXZhdGUgY2hlY2tlZDogYm9vbGVhbixcbiAgICAgICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXBXcmFwLnJlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlbmRlclJlYWRPbmx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5hZGRUb1BkZih0aGlzLmZvcm1Cb3JkZXJDb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMucmFkaW9Hcm91cFdyYXAubmFtZSArICdpbmRleCcgKyB0aGlzLmluZGV4O1xuICAgICAgICBsZXQgcmFkaW9CdXR0b246IGFueSA9IHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5jcmVhdGVPcHRpb24obmFtZSk7XG4gICAgICAgIHJhZGlvQnV0dG9uLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgICAgICByYWRpb0J1dHRvbi5BUyA9ICcvJyArIG5hbWU7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAudmFsdWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmFkaW9CdXR0b24uQVMgPSAnL09mZic7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICByYWRpb0J1dHRvbi5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcywgZm9ybVNjYWxlKSk7XG4gICAgICAgIHJhZGlvQnV0dG9uLmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAuc2V0QXBwZWFyYW5jZShcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm0uQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgICAgICBsZXQgcmFkaW9tYXJrZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRoaXMsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgbGV0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyU2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS53aWR0aCAvIDIuMDtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS5oZWlnaHQgLyAxLjk7XG4gICAgICAgICAgICBsZXQgcmFkaW9tYXJrZXJGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcmFkaW9tYXJrZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PnJhZGlvbWFya2VyRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIGF3YWl0IHJhZGlvbWFya2VyRmxhdC5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBSYW5raW5nSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgbnVtYmVyOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFua2luZ01vZGVsPnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjb25zdCBudW1iZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRoaXMsIHRydWUsIHRydWUpO1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBjb25zdCBudW1iZXJTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLm51bWJlcik7XG4gICAgICAgIG51bWJlclBvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSBudW1iZXJTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICBudW1iZXJQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gbnVtYmVyU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgIGNvbnN0IG51bWJlckZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIG51bWJlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMubnVtYmVyLCBUZXh0QnJpY2spO1xuICAgICAgICAoPGFueT5udW1iZXJGbGF0LnVuZm9sZCgpWzBdKS50ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIGF3YWl0IG51bWJlckZsYXQucmVuZGVyKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRpdGxlUGFuZWxCcmljayBleHRlbmRzIFRleHRCb2xkQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIHRleHQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBTdXJ2ZXlIZWxwZXIuVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFBhbmVsTW9kZWwsIFBhZ2VNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwb2ludDogSVBvaW50O1xuICAgIHB1YmxpYyBicmlja3M6IElQZGZCcmlja1tdO1xuICAgIHB1YmxpYyBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyO1xuICAgIHB1YmxpYyByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeTtcbiAgICBwdWJsaWMgbW9kdWxlOiBhbnk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHRoaXMucG9pbnQgPSBwb2ludDtcbiAgICAgICAgdGhpcy5icmlja3MgPSBicmlja3M7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc09wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYW5lbE9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhbmVsOiBQYW5lbE1vZGVsLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5wYW5lbCA9IHBhbmVsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzUGFnZU9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFnZTogUGFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBwYWdlOiBQYWdlTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cbn1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIExvY2FsaXphYmxlU3RyaW5nLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRCb29sZWFuIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQm9vbGVhbk1vZGVsO1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gbmV3IEJvb2xlYW5JdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIGhlaWdodCwgaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBwb2ludC54TGVmdCkpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgbG9jTGFiZWxUZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IHRoaXMucXVlc3Rpb24uaXNJbmRldGVybWluYXRlID8gbnVsbCA6XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSA/IHRoaXMucXVlc3Rpb24ubG9jTGFiZWxUcnVlIDogdGhpcy5xdWVzdGlvbi5sb2NMYWJlbEZhbHNlO1xuICAgICAgICBpZiAobG9jTGFiZWxUZXh0ICE9PSBudWxsICYmIGxvY0xhYmVsVGV4dC5yZW5kZXJlZEh0bWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBsb2NMYWJlbFRleHQsIFRleHRCcmljaykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlRmxhdF07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdib29sZWFuJywgRmxhdEJvb2xlYW4pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25DaGVja2JveE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENoZWNrYm94SXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtJztcblxuZXhwb3J0IGNsYXNzIEZsYXRDaGVja2JveCBleHRlbmRzIEZsYXRTZWxlY3RCYXNlIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBnZW5lcmF0ZUZsYXRJdGVtKHJlY3Q6IElSZWN0LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBJUGRmQnJpY2sge1xuICAgICAgICByZXR1cm4gbmV3IENoZWNrYm94SXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCwgaXRlbSwgaW5kZXgpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY2hlY2tib3gnLCBGbGF0Q2hlY2tib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NoZWNrYm94LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkNvbW1lbnRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRDb21tZW50IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ29tbWVudE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ29tbWVudE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnJvd3MsIHRydWUpXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2NvbW1lbnQnLCBGbGF0Q29tbWVudCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DdXN0b21Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q3VzdG9tTW9kZWwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0ID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICByZXR1cm4gZmxhdC5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjdXN0b21fbW9kZWwnLCBGbGF0Q3VzdG9tTW9kZWwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RHJvcGRvd24gZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgdGhpcy5jb250cm9sbGVyLnRleHRGaWVsZFJlbmRlckFzID09PSAnbXVsdGlMaW5lJykge1xuICAgICAgICAgICAgY29uc3QgcmVjdFdpdGhEaW5hbWljQm90dG9tOiBJUmVjdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHBvaW50LCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24sIFN1cnZleUhlbHBlci5nZXREcm9wZG93blF1ZXN0aW9uVmFsdWUodGhpcy5xdWVzdGlvbiksIGZhbHNlKTtcbiAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWF4KHJlY3QueUJvdCwgcmVjdFdpdGhEaW5hbWljQm90dG9tLnlCb3QgKyB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhcbiAgICAgICAgICAgIG5ldyBEcm9wZG93bkJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCkpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG90aGVyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgIG90aGVyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICAgICAgb3RoZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuT1RIRVJfUk9XU19DT1VOVCwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZHJvcGRvd24nLCBGbGF0RHJvcGRvd24pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RXhwcmVzc2lvbiBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIFtuZXcgVGV4dEZpZWxkQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0LCB0cnVlLFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pZCwgdGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWUsICcnLCB0cnVlLCBmYWxzZSwgJ3RleHQnKV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdleHByZXNzaW9uJywgRmxhdEV4cHJlc3Npb24pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2V4cHJlc3Npb24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRmlsZU1vZGVsLCBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RmlsZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTUFHRV9HQVBfU0NBTEU6IG51bWJlciA9IDAuMTk1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVEVYVF9NSU5fU0NBTEU6IG51bWJlciA9IDUuMDtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25GaWxlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsXG4gICAgfSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVMaW5rRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubmFtZSA9PT0gdW5kZWZpbmVkID8gJ2ltYWdlJyA6IGl0ZW0ubmFtZSwgaXRlbS5jb250ZW50KSk7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlU2l6ZTogSVNpemUgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VTaXplKGl0ZW0uY29udGVudCk7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VTaXplLndpZHRoID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgodGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHQpIHsgLy8gVE9ETzogd2Ugc2hvdWxkbid0IHVzZSBnZXRQYWdlQXZhaWxhYmxlV2lkdGggaGVyZVxuICAgICAgICAgICAgICAgIGltYWdlU2l6ZS5oZWlnaHQgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0LCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW1hZ2VQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgaW1hZ2VQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdEZpbGUuSU1BR0VfR0FQX1NDQUxFO1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KGltYWdlUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5jb250ZW50LCBpbWFnZVNpemUud2lkdGgsIGltYWdlU2l6ZS5oZWlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhZGRMaW5lKHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSwgY3VyclBvaW50OiBJUG9pbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZygnbm9GaWxlQ2hvc2VuJyksIFRleHRCcmljayldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW06IHsgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9ID0gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWVbaV07XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgaWYgKFN1cnZleUhlbHBlci5jYW5QcmV2aWV3SW1hZ2UodGhpcy5xdWVzdGlvbiwgaXRlbSwgaXRlbS5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50V2lkdGggPSAoYXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlU2l6ZShpdGVtLmNvbnRlbnQpKS53aWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudFdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZVdpZHRoOiBudW1iZXIgPSBNYXRoLm1heChjb250ZW50V2lkdGgsIEZsYXRGaWxlLlRFWFRfTUlOX1NDQUxFICogdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVdpZHRoIDwgY29tcG9zaXRlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMaW5lKHJvd3NGbGF0cywgY3VyclBvaW50LCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKGN1cnJQb2ludC54TGVmdCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSBjdXJyUG9pbnQueExlZnQgLSBjb21wb3NpdGVXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShjdXJyUG9pbnQsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSBpdGVtRmxhdC53aWR0aDtcbiAgICAgICAgICAgICAgICB5Qm90ID0gTWF0aC5tYXgoeUJvdCwgaXRlbUZsYXQueUJvdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0aCA8IHRoaXMuY29udHJvbGxlci51bml0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMaW5lKHJvd3NGbGF0cywgY3VyclBvaW50LCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShjdXJyUG9pbnQsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSBpdGVtRmxhdC54UmlnaHQgLSBpdGVtRmxhdC54TGVmdDtcbiAgICAgICAgICAgICAgICB5Qm90ID0gTWF0aC5tYXgoeUJvdCwgaXRlbUZsYXQueUJvdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZmlsZScsIEZsYXRGaWxlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9maWxlLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkh0bWxNb2RlbCwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IHR5cGUgSUhUTUxSZW5kZXJUeXBlID0gJ2F1dG8nIHwgJ3N0YW5kYXJkJyB8ICdpbWFnZSc7XG5leHBvcnQgY2xhc3MgRmxhdEhUTUwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25IdG1sTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjaG9vc2VSZW5kZXIoaHRtbDogc3RyaW5nKTogSUhUTUxSZW5kZXJUeXBlIHtcbiAgICAgICAgaWYgKC88W14+XSpzdHlsZVtePF0qPi8udGVzdChodG1sKSB8fFxuICAgICAgICAgICAgLzxbXj5dKnRhYmxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvJlxcdys7Ly50ZXN0KGh0bWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ltYWdlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3N0YW5kYXJkJztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlID0gPElIVE1MUmVuZGVyVHlwZT50aGlzLnF1ZXN0aW9uLnJlbmRlckFzO1xuICAgICAgICBpZiAocmVuZGVyQXMgPT09ICdhdXRvJykgcmVuZGVyQXMgPSB0aGlzLmNvbnRyb2xsZXIuaHRtbFJlbmRlckFzO1xuICAgICAgICBpZiAocmVuZGVyQXMgPT09ICdhdXRvJykgcmVuZGVyQXMgPSB0aGlzLmNob29zZVJlbmRlcihTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jSHRtbCkpO1xuICAgICAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NIdG1sKSwgdGhpcy5jb250cm9sbGVyLCByZW5kZXJBcyk7XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdXJsLCBhc3BlY3QgfTogeyB1cmw6IHN0cmluZywgYXNwZWN0OiBudW1iZXIgfSA9XG4gICAgICAgICAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGh0bWwsIHdpZHRoLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB3aWR0aCAvIGFzcGVjdDtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB1cmwsIHdpZHRoLCBoZWlnaHQpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1N1cnZleUhlbHBlci5zcGxpdEh0bWxSZWN0KHRoaXMuY29udHJvbGxlciwgYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUhUTUxGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaHRtbCkpXTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ2h0bWwnLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ2h0bWwnLCB7XG4gICAgbmFtZTogJ3JlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ3N0YW5kYXJkJywgJ2ltYWdlJ11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignaHRtbCcsIEZsYXRIVE1MKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9odG1sLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkltYWdlTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2UgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25JbWFnZU1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3Qgd2lkdGhQdDogbnVtYmVyID0gU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhlaWdodFB0OiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCk7XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5pbWFnZUxpbmssIHdpZHRoUHQsIGhlaWdodFB0KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZScsIEZsYXRJbWFnZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2VQaWNrZXIgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsO1xuICAgIHByb3RlY3RlZCByYWRpbzogRmxhdFJhZGlvZ3JvdXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBwYWdlQXZhaWxhYmxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGltYWdlRmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgKDxhbnk+aXRlbSkuaW1hZ2VMaW5rLCBwYWdlQXZhaWxhYmxlV2lkdGgsIHBhZ2VBdmFpbGFibGVXaWR0aCAvIFN1cnZleUhlbHBlci5JTUFHRVBJQ0tFUl9SQVRJTyk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGltYWdlRmxhdCk7XG4gICAgICAgIGxldCBidXR0b25Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93TGFiZWwpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChidXR0b25Qb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLnRleHQgfHwgaXRlbS52YWx1ZSwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobGFiZWxGbGF0KTtcbiAgICAgICAgICAgIGJ1dHRvblBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGxhYmVsRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgYnV0dG9uUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChidXR0b25Qb2ludCwgcGFnZUF2YWlsYWJsZVdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhuZXcgQ2hlY2tJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIGJ1dHRvblJlY3QsIHRoaXMucXVlc3Rpb24uaWQgKyAnaW5kZXgnICsgaW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlLmluZGV4T2YoaXRlbS52YWx1ZSkgIT09IC0xKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHRoaXMucmFkaW8uZ2VuZXJhdGVGbGF0SXRlbShidXR0b25SZWN0LCBpdGVtLCBpbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgdGhpcy5yYWRpbyA9IHRoaXMucXVlc3Rpb24ubXVsdGlTZWxlY3QgPyBudWxsIDpcbiAgICAgICAgICAgIG5ldyBGbGF0UmFkaW9ncm91cCh0aGlzLnN1cnZleSwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW25ldyBDb21wb3NpdGVCcmljaygpXTtcbiAgICAgICAgY29uc3QgY29sV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRJbWFnZVBpY2tlckF2YWlsYWJsZVdpZHRoKFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAvIFN1cnZleUhlbHBlci5JTUFHRVBJQ0tFUl9DT1VOVDtcbiAgICAgICAgbGV0IGNvbHM6IG51bWJlciA9IH5+KFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC8gY29sV2lkdGgpIHx8IDE7XG4gICAgICAgIGNvbnN0IGNvdW50OiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDtcbiAgICAgICAgY29scyA9IGNvbHMgPD0gY291bnQgPyBjb2xzIDogY291bnQ7XG4gICAgICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IH5+KE1hdGguY2VpbChjb3VudCAvIGNvbHMpKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeUJvdDogbnVtYmVyID0gY3VyclBvaW50LnlUb3A7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGxldCBjdXJyTWFyZ2luTGVmdDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBjb2xzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gaSAqIGNvbHMgKyBqO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBjb3VudCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGN1cnJNYXJnaW5MZWZ0O1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBjdXJyTWFyZ2luTGVmdCAtIGNvbFdpZHRoO1xuICAgICAgICAgICAgICAgIGN1cnJNYXJnaW5MZWZ0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlc1tpbmRleF0sIGluZGV4KTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICB5Qm90ID0gTWF0aC5tYXgoeUJvdCwgaXRlbUZsYXQueUJvdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICBpZiAoaSAhPT0gcm93cyAtIDEpIHtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ltYWdlcGlja2VyJywgRmxhdEltYWdlUGlja2VyKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25NYXRyaXhNb2RlbCwgTWF0cml4Um93TW9kZWwsXG4gICAgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwsIEl0ZW1WYWx1ZSwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUG9pbnQsIElSZWN0IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeE1vZGVsO1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCA8UXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw+cXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uTWF0cml4TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzSGVhZGVyKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29sQ291bnQ6IG51bWJlciA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICsgKHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IDEgOiAwKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IGkgKyAxIDogaTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgY29sdW1uKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUJvbGRUZXh0RmxhdChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zW2ldLmxvY1RleHQpKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2s6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmhlYWRlcnMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzUm93cyhwb2ludDogSVBvaW50LCBpc1ZlcnRpY2FsOiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleTogc3RyaW5nID0gJ3JvdycgKyBpO1xuICAgICAgICAgICAgY29uc3QgZmxhdHNSb3c6IElQZGZCcmlja1tdID0gYXdhaXQgbmV3IEZsYXRNYXRyaXhSb3codGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzW2ldLCBrZXksIGkgPT0gMCwgaXNWZXJ0aWNhbCkuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0c1JvdykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjZWxscy5wdXNoKC4uLmZsYXRzUm93KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRDb2x1bW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICsgKHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IDEgOiAwKSk7XG4gICAgICAgIGNvbnN0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLnJlbmRlckFzID09PSAnbGlzdCcgfHwgdGhpcy5jb250cm9sbGVyLm1hdHJpeFJlbmRlckFzID09PSAnbGlzdCcgfHxcbiAgICAgICAgICAgIGNlbGxXaWR0aCA8IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBpZiAoIWlzVmVydGljYWwgJiYgdGhpcy5xdWVzdGlvbi5zaG93SGVhZGVyICYmIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0hlYWRlcihjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmhlYWRlcnMpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaCguLi5oZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd3MoY3VyclBvaW50LCBpc1ZlcnRpY2FsKSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4Um93IGV4dGVuZHMgRmxhdFJhZGlvZ3JvdXAge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbk1hdHJpeDogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByb3c6IE1hdHJpeFJvd01vZGVsLFxuICAgICAgICBwcml2YXRlIGtleTogc3RyaW5nLCBwcm90ZWN0ZWQgaXNGaXJzdDogYm9vbGVhbiA9IGZhbHNlLCBwcm90ZWN0ZWQgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uTWF0cml4ID0gPFF1ZXN0aW9uTWF0cml4TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZlcnRpY2FsID9cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludCkgOlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQpO1xuICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJhZGlvRmxhdC55Qm90ICsgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCBjZWxsVGV4dEZsYXQgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uTWF0cml4LmdldENlbGxEaXNwbGF5TG9jVGV4dCh0aGlzLnJvdy5uYW1lLCBjb2x1bW4pLCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKHJhZGlvRmxhdCwgY2VsbFRleHRGbGF0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlSXRlbUNvbXBvaXN0ZShwb2ludDogSVBvaW50LCBjb2x1bW46IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY2hlY2tlZDogYm9vbGVhbiA9IHRoaXMucm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoY3VyclBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgY29uc3QgcmFkaW9GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBpdGVtUmVjdC54TGVmdCksIGNvbHVtbiwgaW5kZXgsIHRoaXMua2V5LCBjaGVja2VkKTtcbiAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcmFkaW9GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCByYWRpb1RleHQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbHVtbi5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKHJhZGlvRmxhdCwgcmFkaW9UZXh0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbENvdW50OiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zLmxlbmd0aCArICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MgPyAxIDogMCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgMCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY2VsbHMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uOiBJdGVtVmFsdWUgPSB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zW2ldO1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZDogYm9vbGVhbiA9IHRoaXMucm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbk51bWJlcjogbnVtYmVyID0gdGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzID8gaSArIDEgOiBpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBjb2x1bW5OdW1iZXIpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc0NlbGxUZXh0KSB7XG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlVGV4dENvbXBvc2l0ZShjdXJyUG9pbnQsIGNvbHVtbiwgaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2godGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBjdXJyUG9pbnQueExlZnQpLCBjb2x1bW4sIGksIHRoaXMua2V5LCBjaGVja2VkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmNlbGxzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICBjb25zdCByb3dUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dUZXh0RmxhdC55Qm90ICsgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2gocm93VGV4dEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlID0gKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpID8gdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUgOiB0aGlzLmdlbmVyYXRlSXRlbUNvbXBvaXN0ZTtcbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1ucykpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXgnLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ21hdHJpeCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeCcsIEZsYXRNYXRyaXgpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuL2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeER5bmFtaWMgZXh0ZW5kcyBGbGF0TWF0cml4TXVsdGlwbGUge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlciwgZmFsc2UpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGR5bmFtaWMnLCBGbGF0TWF0cml4RHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCwgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiwgSUZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuL2ZsYXRfdGV4dGJveCc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TXVsdGlwbGVUZXh0IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJPV1NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIHJvd19pbmRleDogbnVtYmVyLCBjb2xfaW5kZXg6IG51bWJlcixcbiAgICAgICAgaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29sV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlM7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RpdGxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG5cbiAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGl0ZW0uZWRpdG9yLCB0aGlzLmNvbnRyb2xsZXIsICd0ZXh0Jyk7XG4gICAgICAgIGNvbnN0IGl0ZW1Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3Qoe1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0ICsgY29sV2lkdGggKiBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUywgeVRvcDogcG9pbnQueVRvcCB9LFxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKC4uLmF3YWl0ICg8RmxhdFRleHRib3g+ZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbikuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoaXRlbVBvaW50KSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5xdWVzdGlvbi5nZXRSb3dzKCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgICAgICBsZXQgeUJvdDogbnVtYmVyID0gY3VyclBvaW50LnlUb3A7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCByb3dzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmNvbENvdW50LCBqKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgaSwgaiwgcm93c1tpXVtqXSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNdWx0aXBsZVRleHQuUk9XU19HQVBfU0NBTEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ211bHRpcGxldGV4dCcsIEZsYXRNdWx0aXBsZVRleHQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRQYW5lbER5bmFtaWMgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1BBTkVMUzogbnVtYmVyID0gMC43NTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChjb25zdCBwYW5lbCBvZiB0aGlzLnF1ZXN0aW9uLnBhbmVscykge1xuICAgICAgICAgICAgY29uc3QgcGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBwYW5lbCwgY3VyclBvaW50KTtcbiAgICAgICAgICAgIGlmIChwYW5lbEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4ucGFuZWxGbGF0cykueUJvdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRQYW5lbER5bmFtaWMuR0FQX0JFVFdFRU5fUEFORUxTO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4ucGFuZWxGbGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncGFuZWxkeW5hbWljJywgRmxhdFBhbmVsRHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFJhbmtpbmdJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYW5raW5nIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUmFua2luZ01vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFua2luZ01vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtU2NhbGVkUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgIGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBSYW5raW5nSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIGl0ZW1TY2FsZWRSZWN0LCB0aGlzLnF1ZXN0aW9uLmdldE51bWJlckJ5SW5kZXgoaW5kZXgpKTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2soaXRlbUZsYXQsIHRleHRGbGF0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzW2ldLCBpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdCArIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGl0ZW1GbGF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYW5raW5nJywgRmxhdFJhbmtpbmcpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYXRpbmdNb2RlbCwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhdGluZyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25SYXRpbmc6IFF1ZXN0aW9uUmF0aW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcgPSA8UXVlc3Rpb25SYXRpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaW5kZXgsIGl0ZW0ubG9jVGV4dCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggLyAyLjA7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gaGFsZldpZHRoO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgY3JlYXRlQm9sZFRleHRGbGF0KHRleHRQb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZywgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBsZXQgdGV4dFdpZHRoOiBudW1iZXIgPSBjb21wb3NpdGVGbGF0LndpZHRoO1xuICAgICAgICBpZiAodGV4dFdpZHRoIDwgU3VydmV5SGVscGVyLmdldFJhdGluZ01pbldpZHRoKHRoaXMuY29udHJvbGxlcikpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQueExlZnQgKz0gKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC0gdGV4dFdpZHRoKSAvIDIuMCAtIGhhbGZXaWR0aDtcbiAgICAgICAgICAgIHRleHRXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGV4dFdpZHRoICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFkaW9Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICByYWRpb1BvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KFxuICAgICAgICAgICAgcmFkaW9Qb2ludCwgdGV4dFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksIGl0ZW0sIGluZGV4KSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksXG4gICAgICAgICAgICBwb2ludC54TGVmdCksIGl0ZW0sIGluZGV4KTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dCh0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpbmRleCwgaXRlbS5sb2NUZXh0KTtcbiAgICAgICAgaXRlbVRleHQgPT0gbnVsbCB8fCBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXNbaV0sIGkpO1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0V2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKSA8PSBsZWZ0V2lkdGggKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTikge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nSXRlbVRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaSwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXS5sb2NUZXh0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoaXRlbVRleHQpLndpZHRoID4gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5SQVRJTkdfQ09MVU1OX1dJRFRIKS53aWR0aCkge1xuICAgICAgICAgICAgICAgIGlzVmVydGljYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcykgOiB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmF0aW5nJywgRmxhdFJhdGluZyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFNpZ25hdHVyZVBhZCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCBpbWFnZUJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52YWx1ZSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLndpZHRoKSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLmhlaWdodClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtpbWFnZUJyaWNrXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3NpZ25hdHVyZXBhZCcsIEZsYXRTaWduYXR1cmVQYWQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0VGV4dGJveCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNVUxUSUxJTkVfVEVYVF9ST1dTX0NPVU5UOiBudW1iZXIgPSAxO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIudGV4dEZpZWxkUmVuZGVyQXMgPT09ICdzaW5nbGVMaW5lJykge1xuICAgICAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFRleHRCb3hCcmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgRmxhdFRleHRib3guTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVCwgdHJ1ZSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigndGV4dCcsIEZsYXRUZXh0Ym94KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcblxuZXhwb3J0IGNsYXNzIEN1c3RvbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuXG4gICAgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByZW5kZXJGdW5jOiAoZG9jOiBhbnksIHF1ZXN0aW9uOiBhbnksIHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlcikgPT4gSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlbmRlckZ1bmMoY29udHJvbGxlci5oZWxwZXJEb2MsIHF1ZXN0aW9uLCAwLCAwKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRnVuYyh0aGlzLmNvbnRyb2xsZXIuZG9jLCB0aGlzLnF1ZXN0aW9uLCB0aGlzLnhMZWZ0LCB0aGlzLnlUb3ApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2N1c3RvbS50cyIsImltcG9ydCB7IFN1cnZleU1vZGVsLCBFdmVudCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgUGFnZVBhY2tlciB9IGZyb20gJy4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBFdmVudEFzeW5jLCBFdmVudEhhbmRsZXIgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlcic7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IEFkb3JuZXJzT3B0aW9ucywgQWRvcm5lcnNQYW5lbE9wdGlvbnMsIEFkb3JuZXJzUGFnZU9wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBTdXJ2ZXlQREYgb2JqZWN0IGNvbnRhaW5zIG9wdGlvbnMsIGV2ZW50cyBhbmQgbWV0aG9kcyB0byBleHBvcnQgUERGXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQREYgZXh0ZW5kcyBTdXJ2ZXlNb2RlbCB7XG4gICAgcHJpdmF0ZSBfaGF2ZUNvbW1lcmNpYWxMaWNlbnNlOiBib29sZWFuO1xuICAgIHB1YmxpYyBvcHRpb25zOiBJRG9jT3B0aW9ucztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoanNvbk9iamVjdDogYW55LCBvcHRpb25zPzogSURvY09wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoanNvbk9iamVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2hhdmVDb21tZXJjaWFsTGljZW5zZSA9IG9wdGlvbnMuY29tbWVyY2lhbCB8fCBvcHRpb25zLmhhdmVDb21tZXJjaWFsTGljZW5zZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogWW91IGhhdmUgcmlnaHQgdG8gc2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSBpZiB5b3UgaGF2ZSBib3VnaHQgdGhlIGNvbW1lcmNpYWwgbGljZW5jZSBvbmx5LlxuICAgICAqIEl0IHdpbGwgcmVtb3ZlIHRoZSB0ZXh0IGFib3V0IG5vbi1jb21tZXJpY2FsIHVzYWdlIG9uIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0cnVlIHdpdGhvdXQgaGF2aW5nIGEgY29tbWVyY2lhbCBsaWNlbmNlIGlzIGlsbGVnYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhdmVDb21tZXJjaWFsTGljZW5zZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2hhdmVDb21tZXJjaWFsTGljZW5zZSA9IHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGluIGZpcmVkIGZvciBldmVyeSByZW5kZXJlZCBwYWdlXG4gICAgICogQHBhcmFtIHN1cnZleSBTdXJ2ZXlQREYgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIGNhbnZhcyBEcmF3Q2FudmFzIG9iamVjdCB0aGF0IHlvdSBtYXkgdXNlIGl0IHRvIGRyYXcgdGV4dCBhbmQgaW1hZ2VzIGluIHRoZSBwYWdlIGhlYWRlclxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlckhlYWRlcjogRXZlbnQ8KHN1cnZleTogU3VydmV5UERGLCBjYW52YXM6IERyYXdDYW52YXMpID0+IGFueSwgYW55PiA9XG4gICAgICAgIG5ldyBFdmVudDwoc3VydmV5OiBTdXJ2ZXlQREYsIGNhbnZhczogRHJhd0NhbnZhcykgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGluIGZpcmVkIGZvciBldmVyeSByZW5kZXJlZCBwYWdlXG4gICAgICogQHBhcmFtIHN1cnZleSBTdXJ2ZXlQREYgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIGNhbnZhcyBEcmF3Q2FudmFzIG9iamVjdCB0aGF0IHlvdSBtYXkgdXNlIGl0IHRvIGRyYXcgdGV4dCBhbmQgaW1hZ2VzIGluIHRoZSBwYWdlIGZvb3RlclxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlckZvb3RlcjogRXZlbnQ8KHN1cnZleTogU3VydmV5UERGLCBjYW52YXM6IERyYXdDYW52YXMpID0+IGFueSwgYW55PiA9XG4gICAgICAgIG5ldyBFdmVudDwoc3VydmV5OiBTdXJ2ZXlQREYsIGNhbnZhczogRHJhd0NhbnZhcykgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGluIGZpcmVkIGZvciBldmVyeSByZW5kZXJlZCBxdWVzdGlvblxuICAgICAqIEBwYXJhbSBzdXJ2ZXkgU3VydmV5UERGIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFkb3JuZXJzT3B0aW9ucyBvYmplY3QgdGhhdCBoYXZlIG9wdGlvbnMgdG8gY3VzdG9tIHJlbmRlciB0aGUgcXVlc3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJRdWVzdGlvbjogRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzT3B0aW9ucykgPT4gYW55LCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8KHN1cnZleTogU3VydmV5UERGLCBvcHRpb25zOiBBZG9ybmVyc09wdGlvbnMpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpbiBmaXJlZCBmb3IgZXZlcnkgcmVuZGVyZWQgcGFuZWxcbiAgICAgKiBAcGFyYW0gc3VydmV5IFN1cnZleVBERiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZG9ybmVyc1BhbmVsT3B0aW9ucyBvYmplY3QgdGhhdCBoYXZlIG9wdGlvbnMgdG8gY3VzdG9tIHJlbmRlciB0aGUgcGFuZWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJQYW5lbDogRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzUGFuZWxPcHRpb25zKSA9PiBhbnksIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzUGFuZWxPcHRpb25zKSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaW4gZmlyZWQgZm9yIGV2ZXJ5IHJlbmRlcmVkIHBhZ2VcbiAgICAgKiBAcGFyYW0gc3VydmV5IFN1cnZleVBERiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZG9ybmVyc1BhZ2VPcHRpb25zIG9iamVjdCB0aGF0IGhhdmUgb3B0aW9ucyB0byBjdXN0b20gcmVuZGVyIHRoZSBwYWdlXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFnZTogRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzUGFnZU9wdGlvbnMpID0+IGFueSwgYW55PiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPChzdXJ2ZXk6IFN1cnZleVBERiwgb3B0aW9uczogQWRvcm5lcnNQYWdlT3B0aW9ucykgPT4gYW55LCBhbnk+KCk7XG4gICAgcHJpdmF0ZSB3YWl0Rm9yUXVlc3Rpb25Jc1JlYWR5KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrOiAoc2VuZGVyOiBRdWVzdGlvbiwgb3B0aW9uczogYW55KSA9PiB2b2lkID1cbiAgICAgICAgICAgICAgICAoXywgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLm9uUmVhZHlDaGFuZ2VkLnJlbW92ZShyZWFkeUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQuYWRkKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQ29yZUlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2YgdGhpcy5nZXRBbGxRdWVzdGlvbnMoKSkge1xuICAgICAgICAgICAgaWYgKCEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRQYW5lbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3Q6IFF1ZXN0aW9uW10gPSBbXTtcbiAgICAgICAgICAgICAgICAoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsLmFkZFF1ZXN0aW9uc1RvTGlzdChsaXN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlubmVyUXVlc3Rpb24gb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoaW5uZXJRdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldENvbnRlbnRRdWVzdGlvbig8UXVlc3Rpb24+cXVlc3Rpb24pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIHJlbmRlclN1cnZleShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckNvcmVJc1JlYWR5KCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXVtdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzKHRoaXMsIGNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFBhZ2VQYWNrZXIucGFjayhmbGF0cywgY29udHJvbGxlcik7XG4gICAgICAgIEV2ZW50SGFuZGxlci5wcm9jZXNzX2hlYWRlcl9ldmVudHModGhpcywgY29udHJvbGxlciwgcGFja3MpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBwYWNrc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmdldE51bWJlck9mUGFnZXMoKSA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRQYWdlKGkpO1xuICAgICAgICAgICAgICAgIC8vZ2l6bW9zIGJyaWNrcyBib3JkZXJzIGZvciBkZWJ1Z1xuICAgICAgICAgICAgICAgIC8vIHBhY2tzW2ldW2pdLnVuZm9sZCgpLmZvckVhY2goKHJlY3Q6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoJ2dyZWVuJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4uU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChyZWN0KSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignYmxhY2snKTtcbiAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhY2tzW2ldW2pdLnJlbmRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgc2F2ZSBtZXRob2Qgb2Ygc3VydmV5UERGIG9iamVjdCB0byBkb3dubG9hZCBmaWxlIGluIGJyb3dzZXIuIFRoaXMgaXMgYXN5bmNocm9ub3VzIG1ldGhvZFxuICAgICAqIEBwYXJhbSBmaWxlTmFtZSBvcHRpb25hbCBmaWxlbmFtZSBwYXJhbWV0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZShmaWxlTmFtZTogc3RyaW5nID0gJ3N1cnZleV9yZXN1bHQucGRmJyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIgPSBuZXcgRG9jQ29udHJvbGxlcih0aGlzLm9wdGlvbnMpO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIuZml4Rm9udChjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5zYXZlKGZpbGVOYW1lLCB7IHJldHVyblByb21pc2U6IHRydWUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgcmF3IG1ldGhvZCBvZiBzdXJ2ZXlQREYgdG8gZ2V0IFBERiBkb2N1bWVudCBhcyBzdHJpbmcgb2JqZWN0LiBUaGlzIGlzIGFzeW5jaHJvbm91cyBtZXRob2RcbiAgICAgKiBAcGFyYW0gdHlwZSBvbWl0IHRvIGdldCByYXcgc3RyaW5nLCBvciBwYXNzIFwiYmxvYlwiLCBcImJsb2J1cmxcIiBvciBcImRhdGF1cmxzdHJpbmdcIlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByYXcodHlwZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIgPSBuZXcgRG9jQ29udHJvbGxlcih0aGlzLm9wdGlvbnMpO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIuZml4Rm9udChjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5vdXRwdXQodHlwZSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleS50cyIsIlwidXNlIHN0cmljdFwiO1xyXG4vLyBBbiBhdWdtZW50ZWQgQVZMIFRyZWUgd2hlcmUgZWFjaCBub2RlIG1haW50YWlucyBhIGxpc3Qgb2YgcmVjb3JkcyBhbmQgdGhlaXIgc2VhcmNoIGludGVydmFscy5cclxuLy8gUmVjb3JkIGlzIGNvbXBvc2VkIG9mIGFuIGludGVydmFsIGFuZCBpdHMgdW5kZXJseWluZyBkYXRhLCBzZW50IGJ5IGEgY2xpZW50LiBUaGlzIGFsbG93cyB0aGVcclxuLy8gaW50ZXJ2YWwgdHJlZSB0byBoYXZlIHRoZSBzYW1lIGludGVydmFsIGluc2VydGVkIG11bHRpcGxlIHRpbWVzLCBhcyBsb25nIGl0cyBkYXRhIGlzIGRpZmZlcmVudC5cclxuLy8gQm90aCBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIHJlcXVpcmUgTyhsb2cgbikgdGltZS4gU2VhcmNoaW5nIHJlcXVpcmVzIE8oaypsb2duKSB0aW1lLCB3aGVyZSBga2BcclxuLy8gaXMgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgaW4gdGhlIG91dHB1dCBsaXN0LlxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBpc1NhbWUgPSByZXF1aXJlKFwic2hhbGxvd2VxdWFsXCIpO1xyXG5mdW5jdGlvbiBoZWlnaHQobm9kZSkge1xyXG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcclxuICAgIH1cclxufVxyXG52YXIgTm9kZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIE5vZGUoaW50ZXJ2YWxUcmVlLCByZWNvcmQpIHtcclxuICAgICAgICB0aGlzLmludGVydmFsVHJlZSA9IGludGVydmFsVHJlZTtcclxuICAgICAgICB0aGlzLnJlY29yZHMgPSBbXTtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XHJcbiAgICAgICAgdGhpcy5rZXkgPSByZWNvcmQubG93O1xyXG4gICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgLy8gU2F2ZSB0aGUgYXJyYXkgb2YgYWxsIHJlY29yZHMgd2l0aCB0aGUgc2FtZSBrZXkgZm9yIHRoaXMgbm9kZVxyXG4gICAgICAgIHRoaXMucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICB9XHJcbiAgICAvLyBHZXRzIHRoZSBoaWdoZXN0IHJlY29yZC5oaWdoIHZhbHVlIGZvciB0aGlzIG5vZGVcclxuICAgIE5vZGUucHJvdG90eXBlLmdldE5vZGVIaWdoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBoaWdoID0gdGhpcy5yZWNvcmRzWzBdLmhpZ2g7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3Jkc1tpXS5oaWdoID4gaGlnaCkge1xyXG4gICAgICAgICAgICAgICAgaGlnaCA9IHRoaXMucmVjb3Jkc1tpXS5oaWdoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoaWdoO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgaGVpZ2h0IHZhbHVlIG9mIHRoZSBub2RlLiBDYWxsZWQgZHVyaW5nIGluc2VydGlvbiwgcmViYWxhbmNlLCByZW1vdmFsXHJcbiAgICBOb2RlLnByb3RvdHlwZS51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heChoZWlnaHQodGhpcy5sZWZ0KSwgaGVpZ2h0KHRoaXMucmlnaHQpKSArIDE7XHJcbiAgICB9O1xyXG4gICAgLy8gVXBkYXRlcyB0aGUgbWF4IHZhbHVlIG9mIGFsbCB0aGUgcGFyZW50cyBhZnRlciBpbnNlcnRpbmcgaW50byBhbHJlYWR5IGV4aXN0aW5nIG5vZGUsIGFzIHdlbGwgYXNcclxuICAgIC8vIHJlbW92aW5nIHRoZSBub2RlIGNvbXBsZXRlbHkgb3IgcmVtb3ZpbmcgdGhlIHJlY29yZCBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIG5vZGUuIFN0YXJ0cyB3aXRoXHJcbiAgICAvLyB0aGUgcGFyZW50IG9mIGFuIGFmZmVjdGVkIG5vZGUgYW5kIGJ1YmJsZXMgdXAgdG8gcm9vdFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlTWF4T2ZQYXJlbnRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXMucmlnaHQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBMZWZ0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgICAgeSAgIFQ0ICAgICAgUmlnaHQgUm90YXRlICh6KSAgICAgICAgICB4ICAgICB6XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXFxyXG4gICAgVDEgICBUMlxyXG4gIFxyXG4gICAgTGVmdC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgICAgeSAgIFQ0ICBMZWZ0IFJvdGF0ZSAoeSkgICAgICAgICB4ICBUNCAgUmlnaHQgUm90YXRlKHopICAgICB5ICAgICB6XHJcbiAgICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgVDEgICB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICBUMSBUMlxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgTGVmdC1MZWZ0IGNhc2UgYW5kIExlZnQtUmlnaHQgY2FzZSBhZnRlciByZWJhbGFuY2luZyBBVkwgdHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3VwZGF0ZU1heEFmdGVyUmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciBsZWZ0ID0gcGFyZW50LmxlZnQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBsZWZ0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRMZWZ0SGlnaCA9IGxlZnQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAobGVmdC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgbGVmdC5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudExlZnRIaWdoLCBsZWZ0LnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCAhPT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IHRoaXNQYXJlbnRMZWZ0SGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobGVmdC5sZWZ0Lm1heCwgbGVmdC5yaWdodC5tYXgpLCB0aGlzUGFyZW50TGVmdEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCBwYXJlbnQucmlnaHQubWF4KSwgcGFyZW50LmdldE5vZGVIaWdoKCkpO1xyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBSaWdodC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlcclxuICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgVDEgIHkgICAgIExlZnQgUm90YXRlKHopICAgICAgIHogICAgIHhcclxuICAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgLyBcXFxyXG4gICAgICBUMiAgeCAgICAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAgICAvIFxcXHJcbiAgICAgICAgVDMgVDRcclxuICBcclxuICAgIFJpZ2h0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgVDEgIHkgICBSaWdodCBSb3RhdGUgKHkpICAgICBUMSAgeCAgICAgIExlZnQgUm90YXRlKHopICAgeiAgICAgeVxyXG4gICAgICAgIC8gXFwgIC0gLSAtIC0gLSAtIC0gLSAtPiAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgICAgeCAgVDQgICAgICAgICAgICAgICAgICAgICAgICBUMiAgeSAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXFxyXG4gICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQzIFQ0XHJcbiAgICAqL1xyXG4gICAgLy8gSGFuZGxlcyBSaWdodC1SaWdodCBjYXNlIGFuZCBSaWdodC1MZWZ0IGNhc2UgaW4gcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciByaWdodCA9IHBhcmVudC5yaWdodDtcclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHJpZ2h0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRSaWdodEhpZ2ggPSByaWdodC5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJpZ2h0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiByaWdodC5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0Lm1heCA9IHRoaXNQYXJlbnRSaWdodEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heChNYXRoLm1heChyaWdodC5sZWZ0Lm1heCwgcmlnaHQucmlnaHQubWF4KSwgdGhpc1BhcmVudFJpZ2h0SGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgaXRzZWxmICh6KVxyXG4gICAgICAgIHZhciB0aGlzSGlnaCA9IHRoaXMuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpcy5yaWdodC5tYXgpLCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgcGFyZW50ICh5IGluIGZpcnN0IGNhc2UsIHggaW4gc2Vjb25kKVxyXG4gICAgICAgIHBhcmVudC5tYXggPSBNYXRoLm1heChNYXRoLm1heChwYXJlbnQubGVmdC5tYXgsIHJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fbGVmdFJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcmlnaHRDaGlsZCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyaWdodENoaWxkLnBhcmVudC5sZWZ0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICByaWdodENoaWxkLnBhcmVudC5sZWZ0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyaWdodENoaWxkLnBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPSByaWdodENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodENoaWxkLmxlZnQ7XHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJpZ2h0Q2hpbGQubGVmdCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSByaWdodENoaWxkO1xyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgcmlnaHRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fcmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGxlZnRDaGlsZCA9IHRoaXMubGVmdDtcclxuICAgICAgICBsZWZ0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gbGVmdENoaWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgbGVmdENoaWxkLnBhcmVudC5sZWZ0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdENoaWxkLnJpZ2h0O1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGVmdENoaWxkLnJpZ2h0ID0gdGhpcztcclxuICAgICAgICB0aGlzLnBhcmVudCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIGxlZnRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICAvLyBSZWJhbGFuY2VzIHRoZSB0cmVlIGlmIHRoZSBoZWlnaHQgdmFsdWUgYmV0d2VlbiB0d28gbm9kZXMgb2YgdGhlIHNhbWUgcGFyZW50IGlzIGdyZWF0ZXIgdGhhblxyXG4gICAgLy8gdHdvLiBUaGVyZSBhcmUgNCBjYXNlcyB0aGF0IGNhbiBoYXBwZW4gd2hpY2ggYXJlIG91dGxpbmVkIGluIHRoZSBncmFwaGljcyBhYm92ZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JlYmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoaGVpZ2h0KHRoaXMubGVmdCkgPj0gMiArIGhlaWdodCh0aGlzLnJpZ2h0KSkge1xyXG4gICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMubGVmdDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChsZWZ0LmxlZnQpID49IGhlaWdodChsZWZ0LnJpZ2h0KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1MZWZ0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBMZWZ0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIGxlZnQuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVpZ2h0KHRoaXMucmlnaHQpID49IDIgKyBoZWlnaHQodGhpcy5sZWZ0KSkge1xyXG4gICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0KHJpZ2h0LnJpZ2h0KSA+PSBoZWlnaHQocmlnaHQubGVmdCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICByaWdodC5fcmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAocmVjb3JkLmxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIGxlZnQgc3VidHJlZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIHJpZ2h0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5pbnNlcnQocmVjb3JkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIG1heCB2YWx1ZSBvZiB0aGlzIGFuY2VzdG9yIGlmIG5lZWRlZFxyXG4gICAgICAgIGlmICh0aGlzLm1heCA8IHJlY29yZC5oaWdoKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBoZWlnaHQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAvLyBSZWJhbGFuY2UgdGhlIHRyZWUgdG8gZW5zdXJlIGFsbCBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBPKGxvZ24pIHRpbWUuIFRoaXMgaXMgZXNwZWNpYWxseVxyXG4gICAgICAgIC8vIGltcG9ydGFudCBpbiBzZWFyY2hpbmcsIGFzIHRoZSB0cmVlIGhhcyBhIGhpZ2ggY2hhbmNlIG9mIGRlZ2VuZXJhdGluZyB3aXRob3V0IHRoZSByZWJhbGFuY2luZ1xyXG4gICAgICAgIHRoaXMuX3JlYmFsYW5jZSgpO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLl9nZXRPdmVybGFwcGluZ1JlY29yZHMgPSBmdW5jdGlvbiAoY3VycmVudE5vZGUsIGxvdywgaGlnaCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5rZXkgPD0gaGlnaCAmJiBsb3cgPD0gY3VycmVudE5vZGUuZ2V0Tm9kZUhpZ2goKSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlcyBhcmUgb3ZlcmxhcHBpbmcsIGNoZWNrIGlmIGluZGl2aWR1YWwgcmVjb3JkcyBpbiB0aGUgbm9kZSBhcmUgb3ZlcmxhcHBpbmdcclxuICAgICAgICAgICAgdmFyIHRlbXBSZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudE5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLnJlY29yZHNbaV0uaGlnaCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wUmVzdWx0cy5wdXNoKGN1cnJlbnROb2RlLnJlY29yZHNbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW1wUmVzdWx0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICAvLyBEb24ndCBzZWFyY2ggbm9kZXMgdGhhdCBkb24ndCBleGlzdFxyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbGVmdFNlYXJjaCA9IFtdO1xyXG4gICAgICAgIHZhciBvd25TZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgcmlnaHRTZWFyY2ggPSBbXTtcclxuICAgICAgICAvLyBJZiBpbnRlcnZhbCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCBwb2ludCBvZiBhbnkgaW50ZXJ2YWwgaW4gdGhpcyBub2RlIGFuZCBhbGwgaXRzXHJcbiAgICAgICAgLy8gY2hpbGRyZW4sIHRoZXJlIHdvbid0IGJlIGFueSBtYXRjaGVzXHJcbiAgICAgICAgaWYgKGxvdyA+IHRoaXMubWF4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2VhcmNoIGxlZnQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5sZWZ0Lm1heCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgbGVmdFNlYXJjaCA9IHRoaXMubGVmdC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhpcyBub2RlXHJcbiAgICAgICAgb3duU2VhcmNoID0gdGhpcy5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzKHRoaXMsIGxvdywgaGlnaCk7XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIGxlZnQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgaW50ZXJ2YWwsIHRoZW4gaXQgY2FuJ3QgYmUgaW4gYW55IGNoaWxkIHRvXHJcbiAgICAgICAgLy8gdGhlIHJpZ2h0XHJcbiAgICAgICAgaWYgKGhpZ2ggPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWFyY2ggcmlnaHQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0U2VhcmNoID0gdGhpcy5yaWdodC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmV0dXJuIGFjY3VtdWxhdGVkIHJlc3VsdHMsIGlmIGFueVxyXG4gICAgICAgIHJldHVybiBsZWZ0U2VhcmNoLmNvbmNhdChvd25TZWFyY2gsIHJpZ2h0U2VhcmNoKTtcclxuICAgIH07XHJcbiAgICAvLyBTZWFyY2hlcyBmb3IgYSBub2RlIGJ5IGEgYGtleWAgdmFsdWVcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaEV4aXN0aW5nID0gZnVuY3Rpb24gKGxvdykge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMua2V5ID09PSBsb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG4gICAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3Qgbm9kZSBvZiB0aGUgc3VidHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX21pblZhbHVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChub2RlLmtleSA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgbGVmdCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5ID4gdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZSB0byBiZSByZW1vdmVkIGlzIG9uIHRoZSByaWdodCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgaGFzIHR3byBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgdmFyIG1pblZhbHVlID0gdGhpcy5yaWdodC5fbWluVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gbWluVmFsdWUua2V5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRzID0gbWluVmFsdWUucmVjb3JkcztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZSh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gbGVmdCBzaWRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yaWdodCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBOb2RlO1xyXG59KCkpO1xyXG5leHBvcnRzLk5vZGUgPSBOb2RlO1xyXG52YXIgSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgfVxyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPiByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dgIHZhbHVlIG11c3QgYmUgbG93ZXIgb3IgZXF1YWwgdG8gYGhpZ2hgIHZhbHVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBCYXNlIGNhc2U6IFRyZWUgaXMgZW1wdHksIG5ldyBub2RlIGJlY29tZXMgcm9vdFxyXG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBuZXcgTm9kZSh0aGlzLCByZWNvcmQpO1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpZiBub2RlIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUga2V5XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5yb290LnNlYXJjaEV4aXN0aW5nKHJlY29yZC5sb3cpO1xyXG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVjb3JkcyBpbiB0aGlzIG5vZGUgaWYgdGhlcmUgYWxyZWFkeSBpcyB0aGUgb25lIHdpdGggc2FtZSBsb3csIGhpZ2gsIGRhdGFcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZWNvcmQgaXMgc2FtZSBhcyB0aGUgb25lIHdlJ3JlIHRyeWluZyB0byBpbnNlcnQ7IHJldHVybiBmYWxzZSB0byBpbmRpY2F0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGhhcyBiZWVuIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJlY29yZCB0byB0aGUgbm9kZVxyXG4gICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnB1c2gocmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnRzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID4gbm9kZS5tYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuIENhbGwgaW5zZXJ0IGZ1bmN0aW9uIG9uIHJvb3QncyBub2RlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgcmV0dXJuIGVtcHR5IGFycmF5XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Quc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBUcmVlIGlzIGVtcHR5OyBub3RoaW5nIHRvIHJlbW92ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucmVjb3Jkcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZFJlY29yZCA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBoYXMgMiBvciBtb3JlIHJlY29yZHMuIEZpbmQgdGhlIG9uZSB3ZSBuZWVkIGFuZCByZW1vdmUgaXRcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IG5vZGUucmVjb3Jkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRSZWNvcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVkUmVjb3JkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhhdCBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmhpZ2ggPT09IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlSGlnaCA9IG5vZGUuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChNYXRoLm1heChub2RlLmxlZnQubWF4LCBub2RlLnJpZ2h0Lm1heCksIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubGVmdCA9PT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChub2RlLnJpZ2h0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBub2RlSGlnaDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIG9ubHkgMSByZWNvcmQuIENoZWNrIGlmIHRoZSByZW1haW5pbmcgcmVjb3JkIGluIHRoaXMgbm9kZSBpc1xyXG4gICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbMF0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlLiBSZW1vdmUgdGhlIHdob2xlIG5vZGUgZnJvbSB0aGUgdHJlZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3Qua2V5ID09PSBub2RlLmtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSByZW1vdmluZyB0aGUgcm9vdCBlbGVtZW50LiBDcmVhdGUgYSBkdW1teSBub2RlIHRoYXQgd2lsbCB0ZW1wb3JhcmlseSB0YWtlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvb3QncyBwYXJlbnQgcm9sZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdFBhcmVudCA9IG5ldyBOb2RlKHRoaXMsIHsgbG93OiByZWNvcmQubG93LCBoaWdoOiByZWNvcmQubG93IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb290UGFyZW50LmxlZnQgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSByb290UGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290UGFyZW50LmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290LnBhcmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVkTm9kZSA9IHRoaXMucm9vdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZE5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgcmVjb3JkIGlzIG5vdCB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTm8gcmVjb3JkcyBhdCBhbGwgaW4gdGhpcyBub2RlPyEgU2hvdWxkbid0IGhhcHBlblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEluT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJlT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLkludGVydmFsVHJlZSA9IEludGVydmFsVHJlZTtcclxudmFyIERhdGFJbnRlcnZhbFRyZWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBEYXRhSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMudHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcclxuICAgIH1cclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluc2VydCh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnJlbW92ZSh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnNlYXJjaChsb3csIGhpZ2gpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi5kYXRhOyB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbk9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUuaW5PcmRlcigpO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUucHJlT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUsIFwiY291bnRcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlLmNvdW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIERhdGFJbnRlcnZhbFRyZWU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IERhdGFJbnRlcnZhbFRyZWU7XHJcbnZhciBJbk9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW5PcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgaWYgKHN0YXJ0Tm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaChzdGFydE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEluT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZFxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE1pZ2h0IHBvcCB0aGUgbGFzdCBhbmQgc2V0IHRoaXMuY3VycmVudE5vZGUgPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnROb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUubGVmdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEluT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuSW5PcmRlciA9IEluT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG52YXIgUHJlT3JkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBQcmVPcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gc3RhcnROb2RlO1xyXG4gICAgfVxyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZCxcclxuICAgICAgICAvLyB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gcmlnaHQgbm9kZSAoaS5lIHdlIGFyZSBkb25lKVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLmxlZnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvcCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xyXG4gICAgfTtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuc3RhY2sucG9wKCk7XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUHJlT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuUHJlT3JkZXIgPSBQcmVPcmRlcjtcclxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbm9kZS1pbnRlcnZhbC10cmVlL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NoYWxsb3dlcXVhbC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0UmFkaW9BcHBlYXJhbmNlKGRvYzogYW55KTogYW55IHtcbiAgICBjb25zdCBvbGRBcHBlYXJhbmNlRnVuY2l0aW9uOiBGdW5jdGlvbiA9IGRvYy5BY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWwgPSBmdW5jdGlvbihmb3JtT2JqZWN0OiBhbnkpIHtcbiAgICAgICAgY29uc3QgeG9iajogYW55ID0gb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbihmb3JtT2JqZWN0KTtcbiAgICAgICAgY29uc3Qgc3RyZWFtOiBzdHJpbmdbXSA9IHhvYmouc3RyZWFtLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgZW5jb2RlQ29sb3I6IHN0cmluZyA9IGRvYy5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgc3RyZWFtWzBdID0gc3RyZWFtWzBdICsgJ1xcbicgKyBlbmNvZGVDb2xvciArICdcXG4nICsgZW5jb2RlQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuXG5leHBvcnQgY2xhc3MgRGVzY3JpcHRpb25CcmljayBleHRlbmRzIFRleHRCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIHRleHQpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24udHMiLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XHJcbn0gY2F0Y2goZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcclxuXHRcdGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIGdsb2JhbCBqc1BERiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2IEFsZXhhbmRlciBXZWlkdCxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9CaWdnQTk0XG4gKiBcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cblxuLyoqIFxuKiBqc1BERiBBY3JvRm9ybSBQbHVnaW5cbiogQG1vZHVsZSBBY3JvRm9ybVxuKi9cbnZhciBqc3BkZiA9IHJlcXVpcmUoJ2pzcGRmJyk7XG4oZnVuY3Rpb24gKGpzUERGLCBnbG9iYWxPYmopIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIganNQREZBUEkgPSBqc1BERi5BUEk7XG4gICAgdmFyIHNjb3BlO1xuICAgIHZhciBzY2FsZUZhY3RvciA9IDE7XG4gICAgZnVuY3Rpb24gdG9Vbmljb2RlKHN0cikge1xuICAgICAgICB2YXIgdW5pY29kZVN0cmluZyA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRoZVVuaWNvZGUgPSBzdHIuY2hhckNvZGVBdChpKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIHdoaWxlICh0aGVVbmljb2RlLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgICAgICAgICB0aGVVbmljb2RlID0gJzAnICsgdGhlVW5pY29kZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB1bmljb2RlU3RyaW5nICs9IHRoZVVuaWNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICc8RkVGRicgKyB1bmljb2RlU3RyaW5nICsgJz4nO1xuICAgIH1cbiAgICB2YXIgcGRmRXNjYXBlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1xcKC9nLCAnXFxcXCgnKS5yZXBsYWNlKC9cXCkvZywgJ1xcXFwpJykgfTtcbiAgICB2YXIgcGRmVW5lc2NhcGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJykucmVwbGFjZSgvXFxcXFxcKC9nLCAnKCcpLnJlcGxhY2UoL1xcXFxcXCkvZywgJyknKTsgfTtcbiAgICBmdW5jdGlvbiBhcnJheVRvUGRmVW5pY29kZUFycmF5KHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAnWyAnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9Vbmljb2RlKHZhbHVlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgKz0gJyBdJ1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB2YXIgZjIgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCgyKTsgLy8gSWUsICUuMmZcbiAgICB9O1xuXG4gICAgdmFyIGY1ID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoNSk7IC8vIEllLCAlLjJmXG4gICAgfTtcblxuICAgIGpzUERGQVBJLl9fYWNyb2Zvcm1fXyA9IHt9O1xuICAgIHZhciBpbmhlcml0ID0gZnVuY3Rpb24gKGNoaWxkLCBwYXJlbnQpIHtcbiAgICAgICAgY2hpbGQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgICAgICAgY2hpbGQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGQ7XG4gICAgfTtcblxuICAgIHZhciBzY2FsZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiAoeCAqIHNjYWxlRmFjdG9yKTtcbiAgICB9O1xuICAgIHZhciBhbnRpU2NhbGUgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gKHggLyBzY2FsZUZhY3Rvcik7XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVGb3JtWE9iamVjdCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIHZhciB4b2JqID0gbmV3IEFjcm9Gb3JtWE9iamVjdCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgeG9iai5CQm94ID0gWzAsIDAsIE51bWJlcihmMih3aWR0aCkpLCBOdW1iZXIoZjIoaGVpZ2h0KSldO1xuICAgICAgICByZXR1cm4geG9iajtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBCaXQtT3BlcmF0aW9uc1xuICAgICovXG4gICAgdmFyIHNldEJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBudW1iZXIgPSBudW1iZXIgfHwgMDtcbiAgICAgICAgYml0UG9zaXRpb24gPSBiaXRQb3NpdGlvbiB8fCAwO1xuXG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYml0TWFzayA9IDEgPDwgYml0UG9zaXRpb247XG5cbiAgICAgICAgbnVtYmVyIHw9IGJpdE1hc2s7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9O1xuXG4gICAgdmFyIGNsZWFyQml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0ID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgbnVtYmVyID0gbnVtYmVyIHx8IDA7XG4gICAgICAgIGJpdFBvc2l0aW9uID0gYml0UG9zaXRpb24gfHwgMDtcblxuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYml0TWFzayA9IDEgPDwgYml0UG9zaXRpb247XG5cbiAgICAgICAgbnVtYmVyICY9IH5iaXRNYXNrO1xuXG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfTtcblxuICAgIHZhciBnZXRCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0ID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmdldEJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAobnVtYmVyICYgKDEgPDwgYml0UG9zaXRpb24pKSA9PT0gMCA/IDAgOiAxO1xuICAgIH07XG5cbiAgICAvKlxuICAgICogRmYgc3RhcnRzIGNvdW50aW5nIHRoZSBiaXQgcG9zaXRpb24gYXQgMSBhbmQgbm90IGxpa2UgamF2YXNjcmlwdCBhdCAwXG4gICAgKi9cbiAgICB2YXIgZ2V0Qml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmdldEJpdEZvclBkZiA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0Qml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIHNldEJpdEZvclBkZiA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldEJpdChudW1iZXIsIGJpdFBvc2l0aW9uIC0gMSk7XG4gICAgfTtcblxuICAgIHZhciBjbGVhckJpdEZvclBkZiA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdEZvclBkZiA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGVhckJpdChudW1iZXIsIGJpdFBvc2l0aW9uIC0gMSk7XG4gICAgfTtcblxuICAgIHZhciBjYWxjdWxhdGVDb29yZGluYXRlcyA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5jYWxjdWxhdGVDb29yZGluYXRlcyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSA9IHRoaXMuaW50ZXJuYWwuZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGU7XG4gICAgICAgIHZhciBnZXRWZXJ0aWNhbENvb3JkaW5hdGUgPSB0aGlzLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZTtcbiAgICAgICAgdmFyIHggPSBhcmdzWzBdO1xuICAgICAgICB2YXIgeSA9IGFyZ3NbMV07XG4gICAgICAgIHZhciB3ID0gYXJnc1syXTtcbiAgICAgICAgdmFyIGggPSBhcmdzWzNdO1xuXG4gICAgICAgIHZhciBjb29yZGluYXRlcyA9IHt9O1xuXG4gICAgICAgIGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9YID0gZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUoeCkgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1kgPSBnZXRWZXJ0aWNhbENvb3JkaW5hdGUoeSArIGgpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWCA9IGdldEhvcml6b250YWxDb29yZGluYXRlKHggKyB3KSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy51cHBlclJpZ2h0X1kgPSBnZXRWZXJ0aWNhbENvb3JkaW5hdGUoeSkgfHwgMDtcblxuICAgICAgICByZXR1cm4gW051bWJlcihmMihjb29yZGluYXRlcy5sb3dlckxlZnRfWCkpLCBOdW1iZXIoZjIoY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1kpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWCkpLCBOdW1iZXIoZjIoY29vcmRpbmF0ZXMudXBwZXJSaWdodF9ZKSldO1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlQXBwZWFyYW5jZVN0cmVhbSA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIGlmIChmb3JtT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybU9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZm9ybU9iamVjdC5WICYmICFmb3JtT2JqZWN0LkRWKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbHNlIGNhbGN1bGF0ZSBpdFxuXG4gICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgdmFyIHRleHQgPSBmb3JtT2JqZWN0LlYgfHwgZm9ybU9iamVjdC5EVjtcbiAgICAgICAgdmFyIGNhbGNSZXMgPSBjYWxjdWxhdGVYKGZvcm1PYmplY3QsIHRleHQpO1xuICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuXG4gICAgICAgIC8vUERGIDMyMDAwLTE6MjAwOCwgcGFnZSA0NDRcbiAgICAgICAgc3RyZWFtLnB1c2goJy9UeCBCTUMnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ3EnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0JUJyk7IC8vIEJlZ2luIFRleHRcbiAgICAgICAgc3RyZWFtLnB1c2goc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcikpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnLycgKyBmb250S2V5ICsgJyAnICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyAnIFRmJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCcxIDAgMCAxIDAgMCBUbScpOy8vIFRyYW5zZm9ybWF0aW9uIE1hdHJpeFxuICAgICAgICBzdHJlYW0ucHVzaChjYWxjUmVzLnRleHQpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnRVQnKTsgLy8gRW5kIFRleHQgICAgXG4gICAgICAgIHN0cmVhbS5wdXNoKCdRJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdFTUMnKTtcblxuICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50LnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgfTtcblxuICAgIHZhciBjYWxjdWxhdGVYID0gZnVuY3Rpb24gKGZvcm1PYmplY3QsIHRleHQpIHtcbiAgICAgICAgaWYgKGZvcm1PYmplY3QuaXNVbmljb2RlKSB0ZXh0ID0gZm9ybU9iamVjdC50cnVlVmFsdWU7XG4gICAgICAgICB2YXIgbWF4Rm9udFNpemUgPVxuICAgICAgICAgICAgZm9ybU9iamVjdC5mb250U2l6ZSA9PT0gMCA/IGZvcm1PYmplY3QubWF4Rm9udFNpemUgOiBmb3JtT2JqZWN0LmZvbnRTaXplO1xuICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSB7XG4gICAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgICAgZm9udFNpemU6IFwiXCJcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmVtb3ZlIEJyYWNrZXRzXG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cigwLCAxKSA9PSBcIihcIiA/IHRleHQuc3Vic3RyKDEpIDogdGV4dDtcbiAgICAgICAgdGV4dCA9XG4gICAgICAgICAgICB0ZXh0LnN1YnN0cih0ZXh0Lmxlbmd0aCAtIDEpID09IFwiKVwiXG4gICAgICAgICAgICA/IHRleHQuc3Vic3RyKDAsIHRleHQubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIDogdGV4dDtcbiAgICAgICAgLy8gc3BsaXQgaW50byBhcnJheSBvZiB3b3Jkc1xuICAgICAgICB2YXIgdGV4dFNwbGl0ID0gdGV4dC5zcGxpdChcIiBcIik7XG4gICAgICAgIHRleHRTcGxpdCA9IHRleHRTcGxpdC5tYXAoZnVuY3Rpb24gKHdvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiB3b3JkLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmb3JtT2JqZWN0Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgdGV4dFNwbGl0ID0gdGV4dFNwbGl0Lm1hcChmdW5jdGlvbiAoYXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFthcnIuam9pbihcIiBcIildXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb250U2l6ZSA9IG1heEZvbnRTaXplOyAvLyBUaGUgU3RhcnRpbmcgZm9udFNpemUgKFRoZSBNYXhpbXVtKVxuICAgICAgICB2YXIgbGluZVNwYWNpbmcgPSAyO1xuICAgICAgICB2YXIgYm9yZGVyUGFkZGluZyA9IDI7XG5cbiAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IDwgMCA/IC1oZWlnaHQgOiBoZWlnaHQ7XG4gICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICB3aWR0aCA9IHdpZHRoIDwgMCA/IC13aWR0aCA6IHdpZHRoO1xuXG4gICAgICAgIHZhciBpc1NtYWxsZXJUaGFuV2lkdGggPSBmdW5jdGlvbihpLCBsYXN0TGluZSwgZm9udFNpemUpIHtcbiAgICAgICAgICAgIGlmIChpICsgMSA8IHRleHRTcGxpdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciB0bXAgPSBsYXN0TGluZSArIFwiIFwiICsgdGV4dFNwbGl0W2kgKyAxXVswXTtcbiAgICAgICAgICAgIHZhciBUZXh0V2lkdGggPSBjYWxjdWxhdGVGb250U3BhY2UodG1wLCBmb3JtT2JqZWN0LCBmb250U2l6ZSkud2lkdGg7XG4gICAgICAgICAgICB2YXIgRmllbGRXaWR0aCA9IHdpZHRoIC0gMiAqIGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICByZXR1cm4gVGV4dFdpZHRoIDw9IEZpZWxkV2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvbnRTaXplKys7XG4gICAgICAgIEZvbnRTaXplOiB3aGlsZSAoZm9udFNpemUgPiAwKSB7XG4gICAgICAgICAgICB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIGZvbnRTaXplLS07XG4gICAgICAgICAgICB2YXIgdGV4dEhlaWdodCA9IGNhbGN1bGF0ZUZvbnRTcGFjZShcIjNcIiwgZm9ybU9iamVjdCwgZm9udFNpemUpLmhlaWdodDtcbiAgICAgICAgICAgIHZhciBzdGFydFkgPSBmb3JtT2JqZWN0Lm11bHRpbGluZVxuICAgICAgICAgICAgPyBoZWlnaHQgLSBmb250U2l6ZVxuICAgICAgICAgICAgOiAoaGVpZ2h0IC0gdGV4dEhlaWdodCkgLyAyO1xuICAgICAgICAgICAgc3RhcnRZICs9IGxpbmVTcGFjaW5nO1xuICAgICAgICAgICAgdmFyIHN0YXJ0WDtcblxuICAgICAgICAgICAgdmFyIGxhc3RZID0gc3RhcnRZO1xuICAgICAgICAgICAgdmFyIGZpcnN0V29yZEluTGluZSA9IDAsXG4gICAgICAgICAgICBsYXN0V29yZEluTGluZSA9IDA7XG4gICAgICAgICAgICB2YXIgbGFzdExlbmd0aDtcbiAgICAgICAgICAgIHZhciBjdXJyV29yZCA9IDA7XG5cbiAgICAgICAgICAgIGlmIChmb250U2l6ZSA8PSAwKSB7XG4gICAgICAgICAgICAvLyBJbiBjYXNlLCB0aGUgVGV4dCBkb2Vzbid0IGZpdCBhdCBhbGxcbiAgICAgICAgICAgIGZvbnRTaXplID0gMTI7XG4gICAgICAgICAgICB0ZXh0ID0gXCIoLi4uKSBUalxcblwiO1xuICAgICAgICAgICAgdGV4dCArPVxuICAgICAgICAgICAgICAgIFwiJSBXaWR0aCBvZiBUZXh0OiBcIiArXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlRm9udFNwYWNlKHRleHQsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aCArXG4gICAgICAgICAgICAgICAgXCIsIEZpZWxkV2lkdGg6XCIgK1xuICAgICAgICAgICAgICAgIHdpZHRoICtcbiAgICAgICAgICAgICAgICBcIlxcblwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBsYXN0TGluZSA9IFwiXCI7XG4gICAgICAgICAgICB2YXIgbGluZUNvdW50ID0gMDtcbiAgICAgICAgICAgIExpbmU6IGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dFNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGV4dFNwbGl0Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzV2l0aE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dFNwbGl0W2ldLmxlbmd0aCAhPT0gMSAmJiBjdXJyV29yZCAhPT0gdGV4dFNwbGl0W2ldLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICh0ZXh0SGVpZ2h0ICsgbGluZVNwYWNpbmcpICogKGxpbmVDb3VudCArIDIpICsgbGluZVNwYWNpbmcgPlxuICAgICAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGFzdExpbmUgKz0gdGV4dFNwbGl0W2ldW2N1cnJXb3JkXTtcbiAgICAgICAgICAgICAgICBpc1dpdGhOZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsYXN0V29yZEluTGluZSA9IGk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGFzdExpbmUgKz0gdGV4dFNwbGl0W2ldW2N1cnJXb3JkXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lID1cbiAgICAgICAgICAgICAgICAgICAgbGFzdExpbmUuc3Vic3RyKGxhc3RMaW5lLmxlbmd0aCAtIDEpID09IFwiIFwiXG4gICAgICAgICAgICAgICAgICAgID8gbGFzdExpbmUuc3Vic3RyKDAsIGxhc3RMaW5lLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgIDogbGFzdExpbmU7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcnNlSW50KGkpO1xuICAgICAgICAgICAgICAgIHZhciBuZXh0TGluZUlzU21hbGxlciA9IGlzU21hbGxlclRoYW5XaWR0aChrZXksIGxhc3RMaW5lLCBmb250U2l6ZSk7XG4gICAgICAgICAgICAgICAgdmFyIGlzTGFzdFdvcmQgPSBpID49IHRleHRTcGxpdC5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5leHRMaW5lSXNTbWFsbGVyICYmICFpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICBjdXJyV29yZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBMaW5lXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbmV4dExpbmVJc1NtYWxsZXIgJiYgIWlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtT2JqZWN0Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVGV4dCBpcyBoaWdoZXIgdGhhbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpZWxkT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0V29yZEluTGluZSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ28gb25cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0V29yZEluTGluZSA9IGtleTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGZvcm1PYmplY3QubXVsdGlsaW5lICYmXG4gICAgICAgICAgICAgICAgICAgICh0ZXh0SGVpZ2h0ICsgbGluZVNwYWNpbmcpICogKGxpbmVDb3VudCArIDIpICsgbGluZVNwYWNpbmcgPlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVGV4dCBpcyBoaWdoZXIgdGhhbiB0aGUgRmllbGRPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBsYXN0IGJsYW5rXG5cbiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gZmlyc3RXb3JkSW5MaW5lOyB4IDw9IGxhc3RXb3JkSW5MaW5lOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJMaW5lID0gdGV4dFNwbGl0W3hdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID09PSBsYXN0V29yZEluTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVtjdXJyV29yZF0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJXb3JkID0gKGN1cnJXb3JkICsgMSkgJSBjdXJyTGluZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID09PSBmaXJzdFdvcmRJbkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY3VyckxpbmVbY3VyckxpbmUubGVuZ3RoIC0gMV0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY3VyckxpbmVbMF0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGFzdCBibGFua1xuICAgICAgICAgICAgICAgIGxpbmUgPVxuICAgICAgICAgICAgICAgIGxpbmUuc3Vic3RyKGxpbmUubGVuZ3RoIC0gMSkgPT0gXCIgXCJcbiAgICAgICAgICAgICAgICAgICAgPyBsaW5lLnN1YnN0cigwLCBsaW5lLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgIDogbGluZTtcbiAgICAgICAgICAgICAgICAvLyBsYXN0TGVuZ3RoIC09IGJsYW5rU3BhY2Uud2lkdGg7XG4gICAgICAgICAgICAgICAgbGFzdExlbmd0aCA9IGNhbGN1bGF0ZUZvbnRTcGFjZShsaW5lLCBmb3JtT2JqZWN0LCBmb250U2l6ZSkud2lkdGg7XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgc3RhcnRYXG4gICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtT2JqZWN0LnRleHRBbGlnbikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICAgICAgICAgICAgICBzdGFydFggPSB3aWR0aCAtIGxhc3RMZW5ndGggLSBib3JkZXJQYWRkaW5nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9ICh3aWR0aCAtIGxhc3RMZW5ndGgpIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBzdGFydFggPSBib3JkZXJQYWRkaW5nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGV4dCArPSBmMihzdGFydFgpICsgXCIgXCIgKyBmMihsYXN0WSkgKyBcIiBUZFxcblwiO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmb250TGlzdCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBmb250TGlzdFtzY29wZS5pbnRlcm5hbC5nZXRGb250KCkuaWRdID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZFc2NhcGU6IHBkZkVzY2FwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVGb250S2V5OiBzY29wZS5pbnRlcm5hbC5nZXRGb250KCkuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHM6IGZvbnRMaXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvbnRTaXplOiBmb3JtT2JqZWN0LmZvbnRTaXplXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5wdWJsaXNoKCdwb3N0UHJvY2Vzc1RleHQnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnPCcgKyBwYXlsb2FkLnRleHQgKyAnPiBUalxcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcoJyArIHBkZkVzY2FwZShsaW5lKSArICcpIFRqXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgWCBpbiBQREZcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IC1mMihzdGFydFgpICsgXCIgMCBUZFxcblwiO1xuXG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYSBMaW5lLCBhZGp1c3QgeSBwb3NpdGlvblxuICAgICAgICAgICAgICAgIGxhc3RZID0gLShmb250U2l6ZSArIGxpbmVTcGFjaW5nKTtcblxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IGZvciBuZXh0IGl0ZXJhdGlvbiBzdGVwXG4gICAgICAgICAgICAgICAgbGFzdExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgZmlyc3RXb3JkSW5MaW5lID0gaXNXaXRoTmV3TGluZSA/IGxhc3RXb3JkSW5MaW5lIDogbGFzdFdvcmRJbkxpbmUgKyAxO1xuICAgICAgICAgICAgICAgIGxpbmVDb3VudCsrO1xuXG4gICAgICAgICAgICAgICAgbGFzdExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlIExpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVyblZhbHVlLnRleHQgPSB0ZXh0O1xuICAgICAgICByZXR1cm5WYWx1ZS5mb250U2l6ZSA9IGZvbnRTaXplO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBTbWFsbCB3b3JrYXJvdW5kIGZvciBjYWxjdWxhdGluZyB0aGUgVGV4dE1ldHJpYyBhcHByb3hpbWF0ZWx5LlxuICAgICogXG4gICAgKiBAcGFyYW0gdGV4dFxuICAgICogQHBhcmFtIGZvbnRzaXplXG4gICAgKiBAcmV0dXJucyB7VGV4dE1ldHJpY3N9IChIYXMgSGVpZ2h0IGFuZCBXaWR0aClcbiAgICAqL1xuICAgIHZhciBjYWxjdWxhdGVGb250U3BhY2UgPSBmdW5jdGlvbiAodGV4dCwgZm9ybU9iamVjdCwgZm9udFNpemUpIHtcbiAgICAgICAgdmFyIGZvbnQgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKTtcbiAgICAgICAgdmFyIHdpZHRoID0gc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKHRleHQsIHsgZm9udDogZm9udCwgZm9udFNpemU6IHBhcnNlRmxvYXQoZm9udFNpemUpLCBjaGFyU3BhY2U6IDAgfSkgKiBwYXJzZUZsb2F0KGZvbnRTaXplKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IHNjb3BlLmdldFN0cmluZ1VuaXRXaWR0aChcIjNcIiwgeyBmb250OiBmb250LCBmb250U2l6ZTogcGFyc2VGbG9hdChmb250U2l6ZSksIGNoYXJTcGFjZTogMCB9KSAqIHBhcnNlRmxvYXQoZm9udFNpemUpICogMS41O1xuICAgICAgICByZXR1cm4geyBoZWlnaHQ6IGhlaWdodCwgd2lkdGg6IHdpZHRoIH07XG4gICAgfTtcblxuICAgIHZhciBhY3JvZm9ybVBsdWdpblRlbXBsYXRlID0ge1xuICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgICB4Rm9ybXM6IFtdLFxuICAgICAgICAvKipcbiAgICAgICAgKiBhY3JvRm9ybURpY3Rpb25hcnlSb290IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBY3JvRm9ybVxuICAgICAgICAqIERpY3Rpb25hcnkgMDogVGhlIEV2ZW50LVRva2VuLCB0aGUgQWNyb0Zvcm1EaWN0aW9uYXJ5Q2FsbGJhY2sgaGFzXG4gICAgICAgICogMTogVGhlIE9iamVjdCBJRCBvZiB0aGUgUm9vdFxuICAgICAgICAqL1xuICAgICAgICBhY3JvRm9ybURpY3Rpb25hcnlSb290OiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgKiBBZnRlciB0aGUgUERGIGdldHMgZXZhbHVhdGVkLCB0aGUgcmVmZXJlbmNlIHRvIHRoZSByb290IGhhcyB0byBiZVxuICAgICAgICAqIHJlc2V0LCB0aGlzIGluZGljYXRlcywgd2hldGhlciB0aGUgcm9vdCBoYXMgYWxyZWFkeSBiZWVuIHByaW50ZWRcbiAgICAgICAgKiBvdXRcbiAgICAgICAgKi9cbiAgICAgICAgcHJpbnRlZE91dDogZmFsc2UsXG4gICAgICAgIGludGVybmFsOiBudWxsLFxuICAgICAgICBpc0luaXRpYWxpemVkOiBmYWxzZVxuICAgIH07XG5cbiAgICB2YXIgYW5ub3RSZWZlcmVuY2VDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy9zZXQgb2JqSWQgdG8gdW5kZWZpbmVkIGFuZCBmb3JjZSBpdCB0byBnZXQgYSBuZXcgb2JqSWQgb24gYnVpbGREb2N1bWVudFxuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Lm9iaklkID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZmllbGRzID0gc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5GaWVsZHM7XG4gICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoZmllbGRzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvcm1PYmplY3QgPSBmaWVsZHNbaV07XG4gICAgICAgICAgICAgICAgLy9zZXQgb2JqSWQgdG8gdW5kZWZpbmVkIGFuZCBmb3JjZSBpdCB0byBnZXQgYSBuZXcgb2JqSWQgb24gYnVpbGREb2N1bWVudFxuICAgICAgICAgICAgICAgIGZvcm1PYmplY3Qub2JqSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgLy8gYWRkIEFubm90IFJlZmVyZW5jZSFcbiAgICAgICAgICAgICAgICBpZiAoZm9ybU9iamVjdC5oYXNBbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlcyBhbiBBbm5vdGF0aW9uIFdpZGdldCBpbiB0aGUgRm9ybSBPYmplY3QsIHB1dCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIGluIHRoZSAvQW5ub3QgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlQW5ub3RhdGlvblJlZmVyZW5jZS5jYWxsKHNjb3BlLCBmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHB1dEZvcm0gPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICBpZiAoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ucHJpbnRlZE91dCkge1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ucHJpbnRlZE91dCA9IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290KSB7XG4gICAgICAgICAgICBpbml0aWFsaXplQWNyb0Zvcm0uY2FsbChzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5GaWVsZHMucHVzaChmb3JtT2JqZWN0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQ3JlYXRlIHRoZSBSZWZlcmVuY2UgdG8gdGhlIHdpZGdldEFubm90YXRpb24sIHNvIHRoYXQgaXQgZ2V0cyByZWZlcmVuY2VkXG4gICAgKiBpbiB0aGUgQW5ub3RbXSBpbnQgdGhlKyAoUmVxdWlyZXMgdGhlIEFubm90YXRpb24gUGx1Z2luKVxuICAgICovXG4gICAgdmFyIGNyZWF0ZUFubm90YXRpb25SZWZlcmVuY2UgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgdHlwZTogJ3JlZmVyZW5jZScsXG4gICAgICAgICAgICBvYmplY3Q6IG9iamVjdFxuICAgICAgICB9O1xuICAgICAgICB2YXIgZmluZEVudHJ5ID0gZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiAoZW50cnkudHlwZSA9PT0gb3B0aW9ucy50eXBlICYmIGVudHJ5Lm9iamVjdCA9PT0gb3B0aW9ucy5vYmplY3QpOyB9O1xuICAgICAgICBpZiAoc2NvcGUuaW50ZXJuYWwuZ2V0UGFnZUluZm8ob2JqZWN0LnBhZ2UpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLmZpbmQoZmluZEVudHJ5KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5nZXRQYWdlSW5mbyhvYmplY3QucGFnZSkucGFnZUNvbnRleHQuYW5ub3RhdGlvbnMucHVzaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDYWxsYmFja3NcblxuICAgIHZhciBwdXRDYXRhbG9nQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFB1dCByZWZlcmVuY2UgdG8gQWNyb0Zvcm0gdG8gRG9jdW1lbnRDYXRhbG9nXG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gZm9yIHNhZmV0eSwgc2hvdWxkbid0IG5vcm1hbGx5IGJlIHRoZSBjYXNlXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC53cml0ZSgnL0Fjcm9Gb3JtICcgKyBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Lm9iaklkICsgJyAnICsgMCArICcgUicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdXRDYXRhbG9nQ2FsbGJhY2s6IFJvb3QgbWlzc2luZy4nKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEFkZHMgL0Fjcm9mb3JtIFggMCBSIHRvIERvY3VtZW50IENhdGFsb2csIGFuZCBjcmVhdGVzIHRoZSBBY3JvRm9ybVxuICAgICogRGljdGlvbmFyeVxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnRcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnVuc3Vic2NyaWJlKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQpO1xuICAgICAgICBkZWxldGUgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRDtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ucHJpbnRlZE91dCA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQ3JlYXRlcyB0aGUgc2luZ2xlIEZpZWxkcyBhbmQgd3JpdGVzIHRoZW0gaW50byB0aGUgRG9jdW1lbnRcbiAgICAqIFxuICAgICogSWYgZmllbGRBcnJheSBpcyBzZXQsIHVzZSB0aGUgZmllbGRzIHRoYXQgYXJlIGluc2lkZSBpdCBpbnN0ZWFkIG9mIHRoZVxuICAgICogZmllbGRzIGZyb20gdGhlIEFjcm9Sb290IChmb3IgdGhlIEZvcm1YT2JqZWN0cy4uLilcbiAgICAqL1xuICAgIHZhciBjcmVhdGVGaWVsZENhbGxiYWNrID0gZnVuY3Rpb24gKGZpZWxkQXJyYXkpIHtcbiAgICAgICAgdmFyIHN0YW5kYXJkRmllbGRzID0gKCFmaWVsZEFycmF5KTtcblxuICAgICAgICBpZiAoIWZpZWxkQXJyYXkpIHtcbiAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUgaXMgbm8gZmllbGRBcnJheSBzcGVjaWZpZWQsIHdlIHdhbnQgdG8gcHJpbnQgb3V0XG4gICAgICAgICAgICAvLyB0aGUgRmllbGRzIG9mIHRoZSBBY3JvRm9ybVxuICAgICAgICAgICAgLy8gUHJpbnQgb3V0IFJvb3RcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCwgdHJ1ZSk7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LnB1dFN0cmVhbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRBcnJheSA9IGZpZWxkQXJyYXkgfHwgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5LaWRzO1xuXG4gICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRBcnJheSkge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXkuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRPYmplY3QgPSBmaWVsZEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIHZhciBrZXlWYWx1ZUxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgb2xkUmVjdCA9IGZpZWxkT2JqZWN0LlJlY3Q7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuUmVjdCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5SZWN0ID0gY2FsY3VsYXRlQ29vcmRpbmF0ZXMuY2FsbCh0aGlzLCBmaWVsZE9iamVjdC5SZWN0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCBXcml0aW5nIHRoZSBPYmplY3RcbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKGZpZWxkT2JqZWN0Lm9iaklkLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LkRBID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlU3RyZWFtKGZpZWxkT2JqZWN0KTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRPYmplY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGZpZWxkT2JqZWN0LmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdCA9IGZpZWxkT2JqZWN0LmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LlJlY3QgPSBvbGRSZWN0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0Lmhhc0FwcGVhcmFuY2VTdHJlYW0gJiYgIWZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBBcHBlYXJhbmNlXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlID0gY2FsY3VsYXRlQXBwZWFyYW5jZVN0cmVhbS5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6ICdBUCcsIHZhbHVlOiBcIjw8L04gXCIgKyBhcHBlYXJhbmNlICsgXCI+PlwiIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKGFwcGVhcmFuY2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBBcHBlYXJhbmNlU3RyZWFtQ29udGVudCBpcyBhIEFycmF5IHdpdGggTixSLEQgKGF0IGxlYXN0XG4gICAgICAgICAgICAgICAgLy8gb25lIG9mIHRoZW0hKVxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBOLFIgYW5kIERcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnRba107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBrICsgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gXCI8PFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID49IDEgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZWFyYW5jZVN0cmVhbSBpcyBhbiBBcnJheSBvciBPYmplY3QhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSB2YWx1ZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBGdW5jdGlvbiBpcyByZWZlcmVuY2VkLCBjYWxsIGl0IGluIG9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGdldCB0aGUgRm9ybVhPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGkgKyBcIiBcIiArIG9iaiArIFwiIFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIFhGb3JtIGlzIGFscmVhZHkgdXNlZCwgZS5nLiBPZmZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIENoZWNrQm94ZXMsIGRvbid0IGFkZCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5pbmRleE9mKG9iaikgPj0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKG9iaik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgRnVuY3Rpb24gaXMgcmVmZXJlbmNlZCwgY2FsbCBpdCBpbiBvcmRlciB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBGb3JtWE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgaSArIFwiIFwiICsgb2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLmluZGV4T2Yob2JqKSA+PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gXCI+PlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYXBwZWFyYW5jZSBzdHJlYW0gaXMgYSBub3JtYWwgT2JqZWN0Li5cbiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6ICdBUCcsIHZhbHVlOiBcIjw8XFxuXCIgKyBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICsgXCI+PlwiIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLnB1dFN0cmVhbSh7IGFkZGl0aW9uYWxLZXlWYWx1ZXM6IGtleVZhbHVlTGlzdCB9KTtcblxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm91dChcImVuZG9ialwiKTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFuZGFyZEZpZWxkcykge1xuICAgICAgICAgICAgY3JlYXRlWEZvcm1PYmplY3RDYWxsYmFjay5jYWxsKHRoaXMsIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGNyZWF0ZVhGb3JtT2JqZWN0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoZmllbGRBcnJheSkge1xuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkQXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZEFycmF5Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGk7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkT2JqZWN0ID0gZmllbGRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBXcml0aW5nIHRoZSBPYmplY3RcbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKGZpZWxkT2JqZWN0ICYmIGZpZWxkT2JqZWN0Lm9iaklkLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRPYmplY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGZpZWxkT2JqZWN0LnB1dFN0cmVhbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LnB1dFN0cmVhbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgZmllbGRBcnJheVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBpbml0aWFsaXplQWNyb0Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVybmFsICE9PSB1bmRlZmluZWQgJiYgKHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSkge1xuXG4gICAgICAgICAgICBzY29wZSA9IHRoaXM7XG5cbiAgICAgICAgICAgIEFjcm9Gb3JtRmllbGQuRmllbGROdW0gPSAwO1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYWNyb2Zvcm1QbHVnaW5UZW1wbGF0ZSkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyBBY3JvZm9ybURpY3Rpb25hcnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY2FsZUZhY3RvciA9IHNjb3BlLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgLy8gVGhlIE9iamVjdCBOdW1iZXIgb2YgdGhlIEFjcm9Gb3JtIERpY3Rpb25hcnlcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgPSBuZXcgQWNyb0Zvcm1EaWN0aW9uYXJ5KCk7XG5cbiAgICAgICAgICAgIC8vIGFkZCBDYWxsYmFjayBmb3IgY3JlYXRpbmcgdGhlIEFjcm9Gb3JtIERpY3Rpb25hcnlcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQgPSBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwb3N0UHV0UmVzb3VyY2VzJywgQWNyb0Zvcm1EaWN0aW9uYXJ5Q2FsbGJhY2spO1xuXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdidWlsZERvY3VtZW50JywgYW5ub3RSZWZlcmVuY2VDYWxsYmFjayk7IC8vIGJ1aWxkRG9jdW1lbnRcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXZlbnQsIHRoYXQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIERvY3VtZW50Q2F0YWxvZyBpc1xuICAgICAgICAgICAgLy8gd3JpdHRlbiwgaW4gb3JkZXIgdG8gYWRkIC9BY3JvRm9ybVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgncHV0Q2F0YWxvZycsIHB1dENhdGFsb2dDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50LCB0aGF0IGNyZWF0ZXMgYWxsIEZpZWxkc1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgncG9zdFB1dFBhZ2VzJywgY3JlYXRlRmllbGRDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vUERGIDMyMDAwLTE6MjAwOCwgcGFnZSAyNiwgNy4zLjZcbiAgICB2YXIgYXJyYXlUb1BkZkFycmF5ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmFycmF5VG9QZGZBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheSkpIHtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gJ1snO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBhcnJheVtpXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYXJyYXlbaV0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldLnN1YnN0cigwLCAxKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSAnKCcgKyBwZGZFc2NhcGUoYXJyYXlbaV0udG9TdHJpbmcoKSkgKyAnKSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYXJyYXlbaV0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRlbnQgKz0gJ10nO1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5fX2Fjcm9mb3JtX18uYXJyYXlUb1BkZkFycmF5Jyk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBnZXRNYXRjaGVzKHN0cmluZywgcmVnZXgsIGluZGV4KSB7XG4gICAgICAgIGluZGV4IHx8IChpbmRleCA9IDEpOyAvLyBkZWZhdWx0IHRvIHRoZSBmaXJzdCBjYXB0dXJpbmcgZ3JvdXBcbiAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTtcbiAgICAgICAgdmFyIG1hdGNoO1xuICAgICAgICB3aGlsZSAobWF0Y2ggPSByZWdleC5leGVjKHN0cmluZykpIHtcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaChtYXRjaFtpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaGVzO1xuICAgIH1cbiAgICB2YXIgcGRmQXJyYXlUb1N0cmluZ0FycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TWF0Y2hlcyhhcnJheSwgL1xcKCguKj8pXFwpL2cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHZhciB0b1BkZlN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCI7XG4gICAgICAgIHN0cmluZy50b1N0cmluZygpO1xuICAgICAgICBzdHJpbmcgPSAnKCcgKyBwZGZFc2NhcGUoc3RyaW5nKSArICcpJztcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9O1xuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgICAvLyBDbGFzc2VzXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUERGT2JqZWN0XG4gICAgKiBAY2xhc3NkZXNjIEEgQWNyb0Zvcm1QREZPYmplY3RcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVBERk9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9vYmpJZDtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVBERk9iamVjdCNvYmpJZFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnb2JqSWQnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9vYmpJZCkge1xuICAgICAgICAgICAgICAgICAgICBfb2JqSWQgPSBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX29iaklkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb2JqSWQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQGZ1bmN0aW9uIEFjcm9Gb3JtUERGT2JqZWN0LnRvU3RyaW5nXG4gICAgKi9cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9iaklkICsgXCIgMCBSXCI7XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtUERGT2JqZWN0LnByb3RvdHlwZS5wdXRTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBrZXlWYWx1ZUxpc3QgPSB0aGlzLmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSgpO1xuICAgICAgICBzY29wZS5pbnRlcm5hbC5wdXRTdHJlYW0oeyBkYXRhOiB0aGlzLnN0cmVhbSwgYWRkaXRpb25hbEtleVZhbHVlczoga2V5VmFsdWVMaXN0IH0pO1xuICAgICAgICBzY29wZS5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogUmV0dXJucyBhbiBrZXktdmFsdWUtTGlzdCBvZiBhbGwgbm9uLWNvbmZpZ3VyYWJsZSBWYXJpYWJsZXMgZnJvbSB0aGUgT2JqZWN0XG4gICAgKiBcbiAgICAqIEBuYW1lIGdldEtleVZhbHVlTGlzdEZvclN0cmVhbVxuICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAqL1xuICAgIEFjcm9Gb3JtUERGT2JqZWN0LnByb3RvdHlwZS5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdGVLZXlWYWx1ZUxpc3RGcm9tRmllbGRPYmplY3QgPSBmdW5jdGlvbiAoZmllbGRPYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZUxpc3QgPSBbXTtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZmllbGRPYmplY3QpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gJ2NvbnRlbnQnICYmIGtleSAhPSAnYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQnICYmIGtleS5zdWJzdHJpbmcoMCwgMSkgIT0gXCJfXCIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4ga2V5cykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGZpZWxkT2JqZWN0LCBrZXlzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlEZXNjcmlwdG9yICYmIHByb3BlcnR5RGVzY3JpcHRvci5jb25maWd1cmFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBmaWVsZE9iamVjdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiBhcnJheVRvUGRmQXJyYXkodmFsdWUpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFjcm9Gb3JtUERGT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBpdCBpcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIFBERk9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIHRoZSByZWZlcmVuY2UgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLm9iaklkICsgXCIgMCBSXCIgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleVZhbHVlTGlzdDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlS2V5VmFsdWVMaXN0RnJvbUZpZWxkT2JqZWN0KHRoaXMpO1xuICAgIH07XG5cbiAgICB2YXIgQWNyb0Zvcm1YT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUeXBlJywge1xuICAgICAgICAgICAgdmFsdWU6IFwiL1hPYmplY3RcIixcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdTdWJ0eXBlJywge1xuICAgICAgICAgICAgdmFsdWU6IFwiL0Zvcm1cIixcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGb3JtVHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0JCb3ggPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdCQm94Jywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQkJveDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9CQm94ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUmVzb3VyY2VzJywge1xuICAgICAgICAgICAgdmFsdWU6IFwiMiAwIFJcIixcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9zdHJlYW07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc3RyZWFtJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9zdHJlYW0gPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9zdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybVhPYmplY3QsIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIHZhciBBY3JvRm9ybURpY3Rpb25hcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtUERGT2JqZWN0LmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIF9LaWRzID0gW107XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdLaWRzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX0tpZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0tpZHM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZpZWxkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGVmYXVsdCBBcHBlYXJhbmNlXG4gICAgICAgIHZhciBfREE7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnREEnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9EQSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJygnICsgX0RBICsgJyknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfREEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGluaGVyaXQoQWNyb0Zvcm1EaWN0aW9uYXJ5LCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICAvKipcbiAgICAqIFRoZSBGaWVsZCBPYmplY3QgY29udGFpbnMgdGhlIFZhcmlhYmxlcywgdGhhdCBldmVyeSBGaWVsZCBuZWVkc1xuICAgICogXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1GaWVsZFxuICAgICogQGNsYXNzZGVzYyBBbiBBY3JvRm9ybSBGaWVsZE9iamVjdFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtRmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtUERGT2JqZWN0LmNhbGwodGhpcyk7XG5cbiAgICAgICAgLy9Bbm5vdGF0aW9uLUZsYWcgU2VlIFRhYmxlIDE2NVxuICAgICAgICB2YXIgX0YgPSA0O1xuICAgICAgICB0aGlzLmlzVW5pY29kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRydWVWYWx1ZSA9ICcnO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0YnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0Y7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfRiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIEYgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuMikgSWYgc2V0LCBwcmludCB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBwYWdlIGlzIHByaW50ZWQuIElmIGNsZWFyLCBuZXZlciBwcmludCB0aGUgYW5ub3RhdGlvbiwgcmVnYXJkbGVzcyBvZiB3ZXRoZXIgaXMgaXMgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4uIFxuICAgICAgICAqIE5PVEUgMiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGFubm90YXRpb25zIHJlcHJlc2VudGluZyBpbnRlcmFjdGl2ZSBwdXNoYnV0dG9ucywgd2hpY2ggd291bGQgc2VydmUgbm8gbWVhbmluZ2Z1bCBwdXJwb3NlIG9uIHRoZSBwcmludGVkIHBhZ2UuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3Nob3dXaGVuUHJpbnRlZFxuICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzaG93V2hlblByaW50ZWQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKF9GLCAzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GID0gc2V0Qml0Rm9yUGRmKF9GLCAzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkYgPSBjbGVhckJpdEZvclBkZihfRiwgMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0ZmID0gMDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGZicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfRmY7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfRmYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGZiBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfUmVjdCA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1JlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX1JlY3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfUmVjdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX1JlY3QgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfUmVjdCA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHgtcG9zaXRpb24gb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN4XG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAneCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9SZWN0IHx8IGlzTmFOKF9SZWN0WzBdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfUmVjdFswXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfUmVjdFswXSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHktcG9zaXRpb24gb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN5XG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAneScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9SZWN0IHx8IGlzTmFOKF9SZWN0WzFdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfUmVjdFsxXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfUmVjdFsxXSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjd2lkdGhcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd3aWR0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9SZWN0IHx8IGlzTmFOKF9SZWN0WzJdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfUmVjdFsyXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfUmVjdFsyXSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hlaWdodFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hlaWdodCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9SZWN0IHx8IGlzTmFOKF9SZWN0WzNdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfUmVjdFszXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfUmVjdFszXSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9GVCA9IFwiXCI7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRlQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfRlRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL0J0bic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9UeCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9DaCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9TaWcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgX0ZUID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIEZUIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9UID0gbnVsbDtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1QgfHwgX1QubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGEgQ2hpbGQgZnJvbSBhIFJhZGlvwrRHcm91cCwgeW91IGRvbid0IG5lZWQgYSBGaWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUNoaWxkQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX1QgPSBcIkZpZWxkT2JqZWN0XCIgKyAoQWNyb0Zvcm1GaWVsZC5GaWVsZE51bSsrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICcoJyArIHBkZkVzY2FwZShfVCkgKyAnKSc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVCA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbCkgVGhlIHBhcnRpYWwgZmllbGQgbmFtZSAoc2VlIDEyLjcuMy4yLCDigJxGaWVsZCBOYW1lc+KAnSkuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZpZWxkTmFtZVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZpZWxkTmFtZScsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnROYW1lID0gJ2hlbHZldGljYSc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBmb250TmFtZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmb250TmFtZVxuICAgICAgICAqIEBkZWZhdWx0ICdoZWx2ZXRpY2EnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250TmFtZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZvbnROYW1lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZvbnROYW1lID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBmb250U3R5bGUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udFN0eWxlXG4gICAgICAgICogQGRlZmF1bHQgJ25vcm1hbCdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnRTdHlsZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZvbnRTdHlsZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250U3R5bGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250U2l6ZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBmb250U2l6ZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmb250U2l6ZVxuICAgICAgICAqIEBkZWZhdWx0IDAgKGZvciBhdXRvKVxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udFNpemUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfZm9udFNpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZvbnRTaXplID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX21heEZvbnRTaXplID0gNTA7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBtYXhpbXVtIGZvbnRTaXplIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI21heEZvbnRTaXplXG4gICAgICAgICogQGRlZmF1bHQgMCAoZm9yIGF1dG8pXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtYXhGb250U2l6ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9tYXhGb250U2l6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfbWF4Rm9udFNpemUgPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfY29sb3IgPSAnYmxhY2snO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgY29sb3Igb2YgdGhlIHRleHRcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjY29sb3JcbiAgICAgICAgKiBAZGVmYXVsdCAnYmxhY2snXG4gICAgICAgICogQHR5cGUge3N0cmluZ3xyZ2JhfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbG9yJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29sb3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfY29sb3IgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9EQSA9ICcvRjEgMCBUZiAwIGcnO1xuICAgICAgICAvLyBEZWZpbmVzIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgKE5lZWRlZCBmb3IgdmFyaWFibGUgVGV4dClcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEQScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfREFcbiAgICAgICAgICAgICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hpbGRDbGFzc1xuICAgICAgICAgICAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1UZXh0RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvUGRmU3RyaW5nKF9EQSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgX0RBID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdmFyIF9EViA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRFYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9EVikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfRFYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX0RWO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN1YnN0cigwLCAxKSA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfRFYgPSBwZGZVbmVzY2FwZSh2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMikpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX0RWID0gcGRmVW5lc2NhcGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX0RWID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBUaGUgZGVmYXVsdCB2YWx1ZSB0byB3aGljaCB0aGUgZmllbGQgcmV2ZXJ0cyB3aGVuIGEgcmVzZXQtZm9ybSBhY3Rpb24gaXMgZXhlY3V0ZWQgKHNlZSAxMi43LjUuMywg4oCcUmVzZXQtRm9ybSBBY3Rpb27igJ0pLiBUaGUgZm9ybWF0IG9mIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB2YWx1ZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2RlZmF1bHRWYWx1ZVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RlZmF1bHRWYWx1ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkZlVuZXNjYXBlKF9EVi5zdWJzdHIoMSwgX0RWLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0RWO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0RWID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX0RWID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1YgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1YnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9WO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIV9WKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvUGRmU3RyaW5nKF9WKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9WO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICBfViA9IHRvVW5pY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ1ZVZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3Vic3RyKDAsIDEpID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfViA9IHBkZlVuZXNjYXBlKHZhbHVlLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gcGRmVW5lc2NhcGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIGZpZWxk4oCZcyB2YWx1ZSwgd2hvc2UgZm9ybWF0IHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUuIFNlZSB0aGUgZGVzY3JpcHRpb25zIG9mIGluZGl2aWR1YWwgZmllbGQgdHlwZXMgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN2YWx1ZVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3ZhbHVlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGRmVW5lc2NhcGUoX1Yuc3Vic3RyKDEsIF9WLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfViA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBDaGVjayBpZiBmaWVsZCBoYXMgYW5ub3RhdGlvbnNcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjaGFzQW5ub3RhdGlvblxuICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hhc0Fubm90YXRpb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLlJlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1R5cGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5oYXNBbm5vdGF0aW9uKSA/IFwiL0Fubm90XCIgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1N1YnR5cGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5oYXNBbm5vdGF0aW9uKSA/IFwiL1dpZGdldFwiIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9oYXNBcHBlYXJhbmNlU3RyZWFtID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAqIHRydWUgaWYgZmllbGQgaGFzIGFuIGFwcGVhcmFuY2VTdHJlYW1cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjaGFzQXBwZWFyYW5jZVN0cmVhbVxuICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hhc0FwcGVhcmFuY2VTdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9oYXNBcHBlYXJhbmNlU3RyZWFtO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBCb29sZWFuKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBfaGFzQXBwZWFyYW5jZVN0cmVhbSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgcGFnZSBvbiB3aGljaCB0aGUgQWNyb0Zvcm1GaWVsZCBpcyBwbGFjZWRcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcGFnZVxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIHZhciBfcGFnZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYWdlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX3BhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wYWdlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfcGFnZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSB1c2VyIG1heSBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuIEFueSBhc3NvY2lhdGVkIHdpZGdldCBhbm5vdGF0aW9ucyB3aWxsIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyOyB0aGF0IGlzLCB0aGV5IHdpbGwgbm90IHJlc3BvbmQgdG8gbW91c2UgY2xpY2tzIG9yIGNoYW5nZSB0aGVpciBhcHBlYXJhbmNlIGluIHJlc3BvbnNlIHRvIG1vdXNlIG1vdGlvbnMuIFRoaXMgZmxhZyBpcyB1c2VmdWwgZm9yIGZpZWxkcyB3aG9zZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIG9yIGltcG9ydGVkIGZyb20gYSBkYXRhYmFzZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3JlYWRPbmx5XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyZWFkT25seScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgaGF2ZSBhIHZhbHVlIGF0IHRoZSB0aW1lIGl0IGlzIGV4cG9ydGVkIGJ5IGEgc3VibWl0Zm9ybSBhY3Rpb24gKHNlZSAxMi43LjUuMiwg4oCcU3VibWl0LUZvcm0gQWN0aW9u4oCdKS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3JlcXVpcmVkXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyZXF1aXJlZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IGJlIGV4cG9ydGVkIGJ5IGEgc3VibWl0LWZvcm0gYWN0aW9uIChzZWUgMTIuNy41LjIsIOKAnFN1Ym1pdC1Gb3JtIEFjdGlvbuKAnSlcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjbm9FeHBvcnRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25vRXhwb3J0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHZhciBfUSA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9RID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfUTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChbMCwgMSwgMl0uaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIF9RID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgUSBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIEEgY29kZSBzcGVjaWZ5aW5nIHRoZSBmb3JtIG9mIHF1YWRkaW5nIChqdXN0aWZpY2F0aW9uKSB0aGF0IHNoYWxsIGJlIHVzZWQgaW4gZGlzcGxheWluZyB0aGUgdGV4dDpcbiAgICAgICAgKiAnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3RleHRBbGlnblxuICAgICAgICAqIEBkZWZhdWx0ICdsZWZ0J1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndGV4dEFsaWduJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9RKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdsZWZ0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnY2VudGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAncmlnaHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9RID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9RID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIGluaGVyaXQoQWNyb0Zvcm1GaWVsZCwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hvaWNlRmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgLy8gRmllbGQgVHlwZSA9IENob2ljZSBGaWVsZFxuICAgICAgICB0aGlzLkZUID0gXCIvQ2hcIjtcbiAgICAgICAgLy8gb3B0aW9uc1xuICAgICAgICB0aGlzLlYgPSAnKCknO1xuXG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnemFwZmRpbmdiYXRzJztcbiAgICAgICAgLy8gVG9wIEluZGV4XG4gICAgICAgIHZhciBfVEkgPSAwO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVEknLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVEk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVEkgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTUsgZml4IGZvciBBY3JvYmF0XG4gICAgICAgIHZhciBfTUsgPSAnPDwgL0JHIFsgMC45NzUgMC45NzUgMC45NzUgXSAgPj4nO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX01LID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbCkgRm9yIHNjcm9sbGFibGUgbGlzdCBib3hlcywgdGhlIHRvcCBpbmRleCAodGhlIGluZGV4IGluIHRoZSBPcHQgYXJyYXkgb2YgdGhlIGZpcnN0IG9wdGlvbiB2aXNpYmxlIGluIHRoZSBsaXN0KS4gRGVmYXVsdCB2YWx1ZTogMC5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI3RvcEluZGV4XG4gICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndG9wSW5kZXgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9USTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9USSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX09wdCA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ09wdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvUGRmVW5pY29kZUFycmF5KF9PcHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb1BkZkFycmF5KF9PcHQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX09wdCA9IHBkZkFycmF5VG9TdHJpbmdBcnJheSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSBnZXRPcHRpb25zXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHJldHVybnMge2FycmF5fSBhcnJheSBvZiBPcHRpb25zXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfT3B0O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSBzZXRPcHRpb25zXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHBhcmFtIHthcnJheX0gdmFsdWVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZXRPcHRpb25zID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBfT3B0ID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIGFkZE9wdGlvblxuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmFkZE9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgX09wdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgcmVtb3ZlT3B0aW9uXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICAgICogQHBhcmFtIHtib29sZWFufSBhbGxFbnRyaWVzIChkZWZhdWx0OiBmYWxzZSlcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZW1vdmVPcHRpb24gPSBmdW5jdGlvbiAodmFsdWUsIGFsbEVudHJpZXMpIHtcbiAgICAgICAgICAgIGFsbEVudHJpZXMgPSBhbGxFbnRyaWVzIHx8IGZhbHNlXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIHdoaWxlIChfT3B0LmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIF9PcHQuc3BsaWNlKF9PcHQuaW5kZXhPZih2YWx1ZSksIDEpO1xuICAgICAgICAgICAgICAgIGlmIChhbGxFbnRyaWVzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBjb21ibyBib3g7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBsaXN0IGJveC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2NvbWJvXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb21ibycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTgpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgY29tYm8gYm94IHNoYWxsIGluY2x1ZGUgYW4gZWRpdGFibGUgdGV4dCBib3ggYXMgd2VsbCBhcyBhIGRyb3AtZG93biBsaXN0OyBpZiBjbGVhciwgaXQgc2hhbGwgaW5jbHVkZSBvbmx5IGEgZHJvcC1kb3duIGxpc3QuIFRoaXMgZmxhZyBzaGFsbCBiZSB1c2VkIG9ubHkgaWYgdGhlIENvbWJvIGZsYWcgaXMgc2V0LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjZWRpdFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZWRpdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTkpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vUERGIDMyMDAwLTE6MjAwOCwgcGFnZSA0NDRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21ibyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGTigJlzIG9wdGlvbiBpdGVtcyBzaGFsbCBiZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuIFRoaXMgZmxhZyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IHdyaXRlcnMsIG5vdCBieSByZWFkZXJzLiBDb25mb3JtaW5nIHJlYWRlcnMgc2hhbGwgZGlzcGxheSB0aGUgb3B0aW9ucyBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1ciBpbiB0aGUgT3B0IGFycmF5IChzZWUgVGFibGUgMjMxKS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI3NvcnRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3NvcnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIwKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMCk7XG4gICAgICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCBtb3JlIHRoYW4gb25lIG9mIHRoZSBmaWVsZOKAmXMgb3B0aW9uIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBzaW11bHRhbmVvdXNseTsgaWYgY2xlYXIsIGF0IG1vc3Qgb25lIGl0ZW0gc2hhbGwgYmUgc2VsZWN0ZWQgXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI211bHRpU2VsZWN0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtdWx0aVNlbGVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjIpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIyKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBzcGVsbGNoZWNrZWQuIFRoaXMgZmxhZyBzaGFsbCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIENvbWJvIGFuZCBFZGl0IGZsYWdzIGFyZSBib3RoIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2RvTm90U3BlbGxDaGVja1xuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZG9Ob3RTcGVsbENoZWNrJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgSWYgc2V0LCB0aGUgbmV3IHZhbHVlIHNoYWxsIGJlIGNvbW1pdHRlZCBhcyBzb29uIGFzIGEgc2VsZWN0aW9uIGlzIG1hZGUgKGNvbW1vbmx5IHdpdGggdGhlIHBvaW50aW5nIGRldmljZSkuIEluIHRoaXMgY2FzZSwgc3VwcGx5aW5nIGEgdmFsdWUgZm9yIGEgZmllbGQgaW52b2x2ZXMgdGhyZWUgYWN0aW9uczogc2VsZWN0aW5nIHRoZSBmaWVsZCBmb3IgZmlsbC1pbiwgc2VsZWN0aW5nIGEgY2hvaWNlIGZvciB0aGUgZmlsbC1pbiB2YWx1ZSwgYW5kIGxlYXZpbmcgdGhhdCBmaWVsZCwgd2hpY2ggZmluYWxpemVzIG9yIOKAnGNvbW1pdHPigJ0gdGhlIGRhdGEgY2hvaWNlIGFuZCB0cmlnZ2VycyBhbnkgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5IG9yIGNoYW5naW5nIG9mIHRoaXMgZGF0YS4gSWYgdGhpcyBmbGFnIGlzIG9uLCB0aGVuIHByb2Nlc3NpbmcgZG9lcyBub3Qgd2FpdCBmb3IgbGVhdmluZyB0aGUgZmllbGQgYWN0aW9uIHRvIG9jY3VyLCBidXQgaW1tZWRpYXRlbHkgcHJvY2VlZHMgdG8gdGhlIHRoaXJkIHN0ZXAuXG4gICAgICAgICogVGhpcyBvcHRpb24gZW5hYmxlcyBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBhbiBhY3Rpb24gb25jZSBhIHNlbGVjdGlvbiBpcyBtYWRlLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgdXNlciB0byBleGl0IHRoZSBmaWVsZC4gSWYgY2xlYXIsIHRoZSBuZXcgdmFsdWUgaXMgbm90IGNvbW1pdHRlZCB1bnRpbCB0aGUgdXNlciBleGl0cyB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2NvbW1pdE9uU2VsQ2hhbmdlXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb21taXRPblNlbENoYW5nZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjcpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI3KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB0aGlzLmhhc0FwcGVhcmFuY2VTdHJlYW0gPSBmYWxzZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1DaG9pY2VGaWVsZCwgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUxpc3RCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQ2hvaWNlRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICdoZWx2ZXRpY2EnO1xuXG4gICAgICAgIC8vUERGIDMyMDAwLTE6MjAwOCwgcGFnZSA0NDRcbiAgICAgICAgdGhpcy5jb21ibyA9IGZhbHNlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUxpc3RCb3gsIEFjcm9Gb3JtQ2hvaWNlRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1Db21ib0JveCBcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtTGlzdEJveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ29tYm9Cb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtTGlzdEJveC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbWJvID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1Db21ib0JveCwgQWNyb0Zvcm1MaXN0Qm94KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtRWRpdEJveCBcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ29tYm9Cb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtTGlzdEJveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtRWRpdEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1Db21ib0JveC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUVkaXRCb3gsIEFjcm9Gb3JtQ29tYm9Cb3gpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUJ1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLkZUID0gXCIvQnRuXCI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFJhZGlvIGJ1dHRvbnMgb25seSkgSWYgc2V0LCBleGFjdGx5IG9uZSByYWRpbyBidXR0b24gc2hhbGwgYmUgc2VsZWN0ZWQgYXQgYWxsIHRpbWVzOyBzZWxlY3RpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBidXR0b24gaGFzIG5vIGVmZmVjdC4gSWYgY2xlYXIsIGNsaWNraW5nIHRoZSBzZWxlY3RlZCBidXR0b24gZGVzZWxlY3RzIGl0LCBsZWF2aW5nIG5vIGJ1dHRvbiBzZWxlY3RlZC5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNub1RvZ2dsZVRvT2ZmXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbm9Ub2dnbGVUb09mZicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE1KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBzZXQgb2YgcmFkaW8gYnV0dG9uczsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGNoZWNrYm94LiBUaGlzIGZsYWcgbWF5IGJlIHNldCBvbmx5IGlmIHRoZSBQdXNoYnV0dG9uIGZsYWcgaXMgY2xlYXIuIFxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3JhZGlvXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmFkaW8nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE2KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgcHVzaGJ1dHRvbiB0aGF0IGRvZXMgbm90IHJldGFpbiBhIHBlcm1hbmVudCB2YWx1ZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNwdXNoQnV0dG9uXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncHVzaEJ1dHRvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTcpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE3KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgYSBncm91cCBvZiByYWRpbyBidXR0b25zIHdpdGhpbiBhIHJhZGlvIGJ1dHRvbiBmaWVsZCB0aGF0IHVzZSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIG9uIHN0YXRlIHdpbGwgdHVybiBvbiBhbmQgb2ZmIGluIHVuaXNvbjsgdGhhdCBpcyBpZiBvbmUgaXMgY2hlY2tlZCwgdGhleSBhcmUgYWxsIGNoZWNrZWQuIElmIGNsZWFyLCB0aGUgYnV0dG9ucyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICh0aGUgc2FtZSBiZWhhdmlvciBhcyBIVE1MIHJhZGlvIGJ1dHRvbnMpLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcmFkaW9Jc1VuaXNvblxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JhZGlvSXNVbmlzb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfTUsgPSB7fTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNSycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhfTUspLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc8PCcpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBfTUspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcvJyArIGtleSArICcgKCcgKyBfTUtba2V5XSArICcpJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz4+Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBGcm9tIHRoZSBQREYgcmVmZXJlbmNlOlxuICAgICAgICAqIChPcHRpb25hbCwgYnV0dG9uIGZpZWxkcyBvbmx5KSBUaGUgd2lkZ2V0IGFubm90YXRpb24ncyBub3JtYWwgY2FwdGlvbiB3aGljaCBzaGFsbCBiZSBkaXNwbGF5ZWQgd2hlbiBpdCBpcyBub3QgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gXG4gICAgICAgICogVW5saWtlIHRoZSByZW1haW5pbmcgZW50cmllcyBsaXN0ZWQgaW4gdGhpcyBUYWJsZSB3aGljaCBhcHBseSBvbmx5IHRvIHdpZGdldCBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggcHVzaGJ1dHRvbiBmaWVsZHMgKHNlZSBQdXNoYnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLCB0aGUgQ0EgZW50cnkgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdHlwZSBvZiBidXR0b24gZmllbGQsIGluY2x1ZGluZyBjaGVjayBib3hlcyAoc2VlIENoZWNrIEJveGVzIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikgYW5kIHJhZGlvIGJ1dHRvbnMgKFJhZGlvIEJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKS5cbiAgICAgICAgKlxuICAgICAgICAqIC0gJzgnID0gQ3Jvc3MsIFxuICAgICAgICAqIC0gJ2wnID0gIENpcmNsZSxcbiAgICAgICAgKiAtICcnID0gbm90aGluZ1xuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2NhcHRpb25cbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NhcHRpb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSy5DQSB8fCAnJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LLkNBID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0FTO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0FTJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSZXF1aXJlZCBpZiB0aGUgYXBwZWFyYW5jZSBkaWN0aW9uYXJ5IEFQIGNvbnRhaW5zIG9uZSBvciBtb3JlIHN1YmRpY3Rpb25hcmllczsgUERGIDEuMikgVGhlIGFubm90YXRpb24ncyBhcHBlYXJhbmNlIHN0YXRlLCB3aGljaCBzZWxlY3RzIHRoZSBhcHBsaWNhYmxlIGFwcGVhcmFuY2Ugc3RyZWFtIGZyb20gYW4gYXBwZWFyYW5jZSBzdWJkaWN0aW9uYXJ5IChzZWUgU2VjdGlvbiAxMi41LjUsIFwiQXBwZWFyYW5jZSBTdHJlYW1zXCIpXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNhcHBlYXJhbmNlU3RhdGVcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2FwcGVhcmFuY2VTdGF0ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTLnN1YnN0cigxLCBfQVMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1CdXR0b24sIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QdXNoQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUHVzaEJ1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1CdXR0b24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5wdXNoQnV0dG9uID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1QdXNoQnV0dG9uLCBBY3JvRm9ybUJ1dHRvbik7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVJhZGlvQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUmFkaW9CdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucmFkaW8gPSB0cnVlO1xuICAgICAgICB0aGlzLnB1c2hCdXR0b24gPSBmYWxzZTtcblxuICAgICAgICB2YXIgX0tpZHMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdLaWRzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0tpZHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9LaWRzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX0tpZHMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVJhZGlvQnV0dG9uLCBBY3JvRm9ybUJ1dHRvbik7XG5cbiAgICAvKipcbiAgICAqIFRoZSBDaGlsZCBjbGFzcyBvZiBhIFJhZGlvQnV0dG9uICh0aGUgcmFkaW9Hcm91cCkgLT4gVGhlIHNpbmdsZSBCdXR0b25zXG4gICAgKiBcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNoaWxkQ2xhc3NcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqIEBpZ25vcmVcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNoaWxkQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcblxuICAgICAgICB2YXIgX3BhcmVudDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdQYXJlbnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3BhcmVudDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9wYXJlbnQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9vcHRpb25OYW1lO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ29wdGlvbk5hbWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb3B0aW9uTmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9vcHRpb25OYW1lID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfTUsgPSB7fTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNSycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPDwnKTtcbiAgICAgICAgICAgICAgICB2YXIga2V5O1xuICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIF9NSykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLycgKyBrZXkgKyAnICgnICsgX01LW2tleV0gKyAnKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPj4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogRnJvbSB0aGUgUERGIHJlZmVyZW5jZTpcbiAgICAgICAgKiAoT3B0aW9uYWwsIGJ1dHRvbiBmaWVsZHMgb25seSkgVGhlIHdpZGdldCBhbm5vdGF0aW9uJ3Mgbm9ybWFsIGNhcHRpb24gd2hpY2ggc2hhbGwgYmUgZGlzcGxheWVkIHdoZW4gaXQgaXMgbm90IGludGVyYWN0aW5nIHdpdGggdGhlIHVzZXIuIFxuICAgICAgICAqIFVubGlrZSB0aGUgcmVtYWluaW5nIGVudHJpZXMgbGlzdGVkIGluIHRoaXMgVGFibGUgd2hpY2ggYXBwbHkgb25seSB0byB3aWRnZXQgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHB1c2hidXR0b24gZmllbGRzIChzZWUgUHVzaGJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSwgdGhlIENBIGVudHJ5IG1heSBiZSB1c2VkIHdpdGggYW55IHR5cGUgb2YgYnV0dG9uIGZpZWxkLCBpbmNsdWRpbmcgY2hlY2sgYm94ZXMgKHNlZSBDaGVjayBCb3hlcyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpIGFuZCByYWRpbyBidXR0b25zIChSYWRpbyBCdXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikuXG4gICAgICAgICpcbiAgICAgICAgKiAtICc4JyA9IENyb3NzLCBcbiAgICAgICAgKiAtICdsJyA9ICBDaXJjbGUsXG4gICAgICAgICogLSAnJyA9IG5vdGhpbmdcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNjYXB0aW9uXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjYXB0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUsuQ0EgfHwgJyc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSy5DQSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9BUztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdBUycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFJlcXVpcmVkIGlmIHRoZSBhcHBlYXJhbmNlIGRpY3Rpb25hcnkgQVAgY29udGFpbnMgb25lIG9yIG1vcmUgc3ViZGljdGlvbmFyaWVzOyBQREYgMS4yKSBUaGUgYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RhdGUsIHdoaWNoIHNlbGVjdHMgdGhlIGFwcGxpY2FibGUgYXBwZWFyYW5jZSBzdHJlYW0gZnJvbSBhbiBhcHBlYXJhbmNlIHN1YmRpY3Rpb25hcnkgKHNlZSBTZWN0aW9uIDEyLjUuNSwgXCJBcHBlYXJhbmNlIFN0cmVhbXNcIilcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2FwcGVhcmFuY2VTdGF0ZVxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYXBwZWFyYW5jZVN0YXRlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVMuc3Vic3RyKDEsIF9BUy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gJ2wnO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdGF0ZSA9ICdPZmYnO1xuICAgICAgICAvLyB0b2RvOiBzZXQgQXBwZWFyYW5jZVR5cGUgYXMgdmFyaWFibGUgdGhhdCBjYW4gYmUgc2V0IGZyb20gdGhlXG4gICAgICAgIC8vIG91dHNpZGUuLi5cbiAgICAgICAgdGhpcy5fQXBwZWFyYW5jZVR5cGUgPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlO1xuICAgICAgICAvLyBUaGUgRGVmYXVsdCBhcHBlYXJhbmNlVHlwZSBpcyB0aGUgQ2lyY2xlXG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB0aGlzLl9BcHBlYXJhbmNlVHlwZS5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHRoaXMub3B0aW9uTmFtZSk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hpbGRDbGFzcywgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICBBY3JvRm9ybVJhZGlvQnV0dG9uLnByb3RvdHlwZS5zZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgaWYgKCEoJ2NyZWF0ZUFwcGVhcmFuY2VTdHJlYW0nIGluIGFwcGVhcmFuY2UgJiYgJ2dldENBJyBpbiBhcHBlYXJhbmNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgYXNzaWduIEFwcGVhcmFuY2UgdG8gUmFkaW9CdXR0b24uIEFwcGVhcmFuY2Ugd2FzIEludmFsaWQhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIG9iaklkIGluIHRoaXMuS2lkcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuS2lkcy5oYXNPd25Qcm9wZXJ0eShvYmpJZCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLktpZHNbb2JqSWRdO1xuICAgICAgICAgICAgICAgIGNoaWxkLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gYXBwZWFyYW5jZS5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKGNoaWxkLm9wdGlvbk5hbWUpO1xuICAgICAgICAgICAgICAgIGNoaWxkLmNhcHRpb24gPSBhcHBlYXJhbmNlLmdldENBKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1SYWRpb0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlT3B0aW9uID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBDaGlsZCBmb3IgUmFkaW9Hcm91cFxuICAgICAgICB2YXIgY2hpbGQgPSBuZXcgQWNyb0Zvcm1DaGlsZENsYXNzKCk7XG4gICAgICAgIGNoaWxkLlBhcmVudCA9IHRoaXM7XG4gICAgICAgIGNoaWxkLm9wdGlvbk5hbWUgPSBuYW1lO1xuICAgICAgICAvLyBBZGQgdG8gUGFyZW50XG4gICAgICAgIHRoaXMuS2lkcy5wdXNoKGNoaWxkKTtcblxuICAgICAgICBhZGRGaWVsZC5jYWxsKHRoaXMsIGNoaWxkKTtcblxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hlY2tCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaGVja0JveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1CdXR0b24uY2FsbCh0aGlzKTtcblxuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9ICczJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RhdGUgPSAnT24nO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJPblwiO1xuICAgICAgICB0aGlzLnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94LmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0oKTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1DaGVja0JveCwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1UZXh0RmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVRleHRGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLkZUID0gJy9UeCc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbGluZXMgb2YgdGV4dDsgaWYgY2xlYXIsIHRoZSBmaWVsZOKAmXMgdGV4dCBzaGFsbCBiZSByZXN0cmljdGVkIHRvIGEgc2luZ2xlIGxpbmUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjbXVsdGlsaW5lXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbXVsdGlsaW5lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0aGUgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCByZXByZXNlbnRzIHRoZSBwYXRobmFtZSBvZiBhIGZpbGUgd2hvc2UgY29udGVudHMgc2hhbGwgYmUgc3VibWl0dGVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuIFxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI2ZpbGVTZWxlY3RcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmaWxlU2VsZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBzcGVsbC1jaGVja2VkLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI2RvTm90U3BlbGxDaGVja1xuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U3BlbGxDaGVjaycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBzY3JvbGwgKGhvcml6b250YWxseSBmb3Igc2luZ2xlLWxpbmUgZmllbGRzLCB2ZXJ0aWNhbGx5IGZvciBtdWx0aXBsZS1saW5lIGZpZWxkcykgdG8gYWNjb21tb2RhdGUgbW9yZSB0ZXh0IHRoYW4gZml0cyB3aXRoaW4gaXRzIGFubm90YXRpb24gcmVjdGFuZ2xlLiBPbmNlIHRoZSBmaWVsZCBpcyBmdWxsLCBubyBmdXJ0aGVyIHRleHQgc2hhbGwgYmUgYWNjZXB0ZWQgZm9yIGludGVyYWN0aXZlIGZvcm0gZmlsbGluZzsgZm9yIG5vbmludGVyYWN0aXZlIGZvcm0gZmlsbGluZywgdGhlIGZpbGxlciBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byBhZGQgbW9yZSBjaGFyYWN0ZXIgdGhhbiB3aWxsIHZpc2libHkgZml0IGluIHRoZSBkZWZpbmVkIGFyZWEuIFxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI2RvTm90U2Nyb2xsXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZG9Ob3RTY3JvbGwnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI0KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBNYXkgYmUgc2V0IG9ubHkgaWYgdGhlIE1heExlbiBlbnRyeSBpcyBwcmVzZW50IGluIHRoZSB0ZXh0IGZpZWxkIGRpY3Rpb25hcnkgKHNlZSBUYWJsZSAyMjkpIGFuZCBpZiB0aGUgTXVsdGlsaW5lLCBQYXNzd29yZCwgYW5kIEZpbGVTZWxlY3QgZmxhZ3MgYXJlIGNsZWFyLiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBiZSBhdXRvbWF0aWNhbGx5IGRpdmlkZWQgaW50byBhcyBtYW55IGVxdWFsbHkgc3BhY2VkIHBvc2l0aW9ucywgb3IgY29tYnMsIGFzIHRoZSB2YWx1ZSBvZiBNYXhMZW4sIGFuZCB0aGUgdGV4dCBpcyBsYWlkIG91dCBpbnRvIHRob3NlIGNvbWJzLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI2NvbWJcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb21iJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgSWYgc2V0LCB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBzaGFsbCBiZSBhIHJpY2ggdGV4dCBzdHJpbmcgKHNlZSAxMi43LjMuNCwg4oCcUmljaCBUZXh0IFN0cmluZ3PigJ0pLiBJZiB0aGUgZmllbGQgaGFzIGEgdmFsdWUsIHRoZSBSViBlbnRyeSBvZiB0aGUgZmllbGQgZGljdGlvbmFyeSAoVGFibGUgMjIyKSBzaGFsbCBzcGVjaWZ5IHRoZSByaWNoIHRleHQgc3RyaW5nLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI3JpY2hUZXh0XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmljaFRleHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfTWF4TGVuID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNYXhMZW4nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTWF4TGVuO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX01heExlbiA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGZpZWxk4oCZcyB0ZXh0LCBpbiBjaGFyYWN0ZXJzLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI21heExlbmd0aFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWF4TGVuZ3RoJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTWF4TGVuO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NYXhMZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBcHBlYXJhbmNlU3RyZWFtJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5WIHx8IHRoaXMuRFYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVRleHRGaWVsZCwgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVBhc3N3b3JkRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtVGV4dEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QYXNzd29yZEZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVRleHRGaWVsZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGludGVuZGVkIGZvciBlbnRlcmluZyBhIHNlY3VyZSBwYXNzd29yZCB0aGF0IHNob3VsZCBub3QgYmUgZWNob2VkIHZpc2libHkgdG8gdGhlIHNjcmVlbi4gQ2hhcmFjdGVycyB0eXBlZCBmcm9tIHRoZSBrZXlib2FyZCBzaGFsbCBpbnN0ZWFkIGJlIGVjaG9lZCBpbiBzb21lIHVucmVhZGFibGUgZm9ybSwgc3VjaCBhcyBhc3Rlcmlza3Mgb3IgYnVsbGV0IGNoYXJhY3RlcnMuXG4gICAgICAgICogTk9URSBUbyBwcm90ZWN0IHBhc3N3b3JkIGNvbmZpZGVudGlhbGl0eSwgcmVhZGVycyBzaG91bGQgbmV2ZXIgc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IGZpZWxkIGluIHRoZSBQREYgZmlsZSBpZiB0aGlzIGZsYWcgaXMgc2V0LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI3Bhc3N3b3JkXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncGFzc3dvcmQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE0KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1QYXNzd29yZEZpZWxkLCBBY3JvRm9ybVRleHRGaWVsZCk7XG5cblxuICAgIC8vIENvbnRhaW5zIE1ldGhvZHMgZm9yIGNyZWF0aW5nIHN0YW5kYXJkIGFwcGVhcmFuY2VzXG4gICAgdmFyIEFjcm9Gb3JtQXBwZWFyYW5jZSA9IHtcbiAgICAgICAgQ2hlY2tCb3g6IHtcbiAgICAgICAgICAgIGNyZWF0ZUFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgTjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgT246IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5ZZXNOb3JtYWxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgRDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgT246IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5ZZXNQdXNoRG93bixcbiAgICAgICAgICAgICAgICAgICAgICAgIE9mZjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Lk9mZlB1c2hEb3duXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgT24gQXBwZWFyYW5jZSBmb3IgYSBDaGVja0JveFxuICAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICAqIEByZXR1cm5zIHtBY3JvRm9ybVhPYmplY3R9XG4gICAgICAgICAgICAgICovXG4gICAgICAgICAgICBZZXNQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGNSZXMgPSBjYWxjdWxhdGVYKGZvcm1PYmplY3QsIGZvcm1PYmplY3QuY2FwdGlvbik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCTUNcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIDEgcmdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIvXCIgKyBmb250S2V5ICsgXCIgXCIgKyBmMihjYWxjUmVzLmZvbnRTaXplKSArIFwiIFRmIFwiICsgZW5jb2RlZENvbG9yKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJFVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJFTUNcIik7XG4gICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkQ29sb3IgPSBzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCBmb3JtT2JqZWN0LmNhcHRpb24pO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSBnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIod2lkdGgpICsgXCIgXCIgKyBmMihoZWlnaHQpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCAxIHJnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIod2lkdGggLSAxKSArIFwiIFwiICsgZjIoaGVpZ2h0IC0gMSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJuXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCBnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQlRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIvXCIgKyBmb250S2V5ICsgXCIgXCIgKyBmMihjYWxjUmVzLmZvbnRTaXplKSArIFwiIFRmIFwiICsgZW5jb2RlZENvbG9yKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChjYWxjUmVzLnRleHQpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRVRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBPZmYgQXBwZWFyYW5jZSBmb3IgYSBDaGVja0JveFxuICAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICAqIEByZXR1cm5zIHtBY3JvRm9ybVhPYmplY3R9XG4gICAgICAgICAgICAgICovXG4gICAgICAgICAgICBPZmZQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBSYWRpb0J1dHRvbjoge1xuICAgICAgICAgICAgQ2lyY2xlOiB7XG4gICAgICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgRDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPZmYnOiBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLk9mZlB1c2hEb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgTjoge31cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuTltuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzTm9ybWFsO1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5EW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNQdXNoRG93bjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0Q0E6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdsJztcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHRoZSBSYWRpdXMgb2YgdGhlIENpcmNsZSByZWxhdGl2ZSB0byBtaW4oaGVpZ2h0LCB3aWR0aCkgb2YgZm9ybU9iamVjdFxuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDQgOiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJvcmRlcnBhZGRpbmcuLi5cbiAgICAgICAgICAgICAgICAgICAgRG90UmFkaXVzID0gTnVtYmVyKChEb3RSYWRpdXMgKiAwLjkpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQztcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1c0JlemllciA9IE51bWJlcigoRG90UmFkaXVzICogYykudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgKiBUaGUgRm9sbG93aW5nIGlzIGEgQ2lyY2xlIGNyZWF0ZWQgd2l0aCBCZXppZXItQ3VydmVzLlxuICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCAtXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBZZXNQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gTnVtYmVyKChEb3RSYWRpdXMgKiAwLjkpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHJlc3VsdHMgZm9yIGxhdGVyIHVzZTsgbm8gbmVlZCB0byB3YXN0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3IgdGlja3Mgb24gZG9pbmcgbWF0aFxuICAgICAgICAgICAgICAgICAgICB2YXIgayA9IE51bWJlcigoRG90UmFkaXVzICogMikudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrYyA9IE51bWJlcigoayAqIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYyA9IE51bWJlcigoRG90UmFkaXVzICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgXCIgKyBrYyArIFwiIFwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIFwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgayArIFwiIC1cIiArIGtjICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCAtXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goa2MgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1cyArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJcIiArIERvdFJhZGl1cyArIFwiIFwiICsgZGMgKyBcIiBcIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIFwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBkYyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBkYyArIFwiIC1cIiArIGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCAtXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChkYyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDQgOiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJvcmRlcnBhZGRpbmcuLi5cbiAgICAgICAgICAgICAgICAgICAgRG90UmFkaXVzID0gTnVtYmVyKChEb3RSYWRpdXMgKiAwLjkpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHJlc3VsdHMgZm9yIGxhdGVyIHVzZTsgbm8gbmVlZCB0byB3YXN0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3IgdGlja3Mgb24gZG9pbmcgbWF0aFxuICAgICAgICAgICAgICAgICAgICB2YXIgayA9IE51bWJlcigoRG90UmFkaXVzICogMikudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrYyA9IE51bWJlcigoayAqIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIFwiICsga2MgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBcIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgLVwiICsgayArIFwiIFwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgLVwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGtjICsgXCIgLVwiICsgayArIFwiIFwiICsgayArIFwiIC1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIENyb3NzOiB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAqIENyZWF0ZXMgdGhlIEFjdHVhbCBBcHBlYXJhbmNlRGljdGlvbmFyeS1SZWZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAgICAgICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAgICAgICAgICAgICAgKiBAaWdub3JlXG4gICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNyZWF0ZUFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2ZmJzogQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLk9mZlB1c2hEb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgTjoge31cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuTltuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5ZZXNOb3JtYWw7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50LkRbbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuWWVzUHVzaERvd247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldENBOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnOCdcbiAgICAgICAgICAgICAgICB9LFxuXG5cbiAgICAgICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBjcm9zcyA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5jYWxjdWxhdGVDcm9zcyhmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMSBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAtIDIpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC0gMikgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngxLngpICsgXCIgXCIgKyBmMihjcm9zcy54MS55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngyLngpICsgXCIgXCIgKyBmMihjcm9zcy54Mi55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLng0LngpICsgXCIgXCIgKyBmMihjcm9zcy54NC55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngzLngpICsgXCIgXCIgKyBmMihjcm9zcy54My55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwic1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNyb3NzID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDEgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLSAyKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAtIDIpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJuXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54MS54KSArIFwiIFwiICsgZjIoY3Jvc3MueDEueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54Mi54KSArIFwiIFwiICsgZjIoY3Jvc3MueDIueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54NC54KSArIFwiIFwiICsgZjIoY3Jvc3MueDQueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54My54KSArIFwiIFwiICsgZjIoY3Jvc3MueDMueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPZmZQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIEFwcGVhcmFuY2VcbiAgICAgICAgICAqIFxuICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAqL1xuICAgICAgICBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgIC8vIFNldCBIZWx2ZXRpY2EgdG8gU3RhbmRhcmQgRm9udCAoc2l6ZTogYXV0bylcbiAgICAgICAgICAgIC8vIENvbG9yOiBCbGFja1xuICAgICAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcbiAgICAgICAgICAgIHZhciBlbmNvZGVkQ29sb3IgPSBzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgICAgIHZhciBmb250U2l6ZSA9IGZvcm1PYmplY3QuZm9udFNpemU7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gJy8nICsgZm9udEtleSArICcgJyArIGZvbnRTaXplICsgJyBUZiAnICsgZW5jb2RlZENvbG9yO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwgPSB7XG4gICAgICAgIEJlemllcl9DOiAwLjU1MTkxNTAyNDQ5NCxcblxuICAgICAgICBjYWxjdWxhdGVDcm9zczogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcblxuICAgICAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICB2YXIgYSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgICAgICB2YXIgY3Jvc3MgPSB7XG4gICAgICAgICAgICAgICAgeDE6IHsgLy8gdXBwZXJMZWZ0XG4gICAgICAgICAgICAgICAgICAgIHg6ICh3aWR0aCAtIGEpIC8gMixcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpICsgYSwvLyBoZWlnaHQgLSBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4MjogeyAvLyBsb3dlclJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIHg6ICgod2lkdGggLSBhKSAvIDIpICsgYSxcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpLy8gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDM6IHsgLy8gbG93ZXJMZWZ0XG4gICAgICAgICAgICAgICAgICAgIHg6ICh3aWR0aCAtIGEpIC8gMixcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpLy8gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDQ6IHsgLy8gdXBwZXJSaWdodFxuICAgICAgICAgICAgICAgICAgICB4OiAoKHdpZHRoIC0gYSkgLyAyKSArIGEsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKSArIGEsLy8gaGVpZ2h0IC0gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBjcm9zcztcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGZvcm1PYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNjYWxlKGZvcm1PYmplY3QuUmVjdFsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtT2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzY2FsZShmb3JtT2JqZWN0LlJlY3RbM10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIFB1YmxpYzpcblxuICAgIC8qKlxuICAgICogQWRkIGFuIEFjcm9Gb3JtLUZpZWxkIHRvIHRoZSBqc1BERi1pbnN0YW5jZVxuICAgICpcbiAgICAqIEBuYW1lIGFkZEZpZWxkXG4gICAgKiBAZnVuY3Rpb24gXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9iamVjdFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICovXG4gICAgdmFyIGFkZEZpZWxkID0ganNQREZBUEkuYWRkRmllbGQgPSBmdW5jdGlvbiAoZmllbGRPYmplY3QpIHtcbiAgICAgICAgaW5pdGlhbGl6ZUFjcm9Gb3JtLmNhbGwodGhpcyk7XG5cbiAgICAgICAgaWYgKGZpZWxkT2JqZWN0IGluc3RhbmNlb2YgQWNyb0Zvcm1GaWVsZCkge1xuICAgICAgICAgICAgcHV0Rm9ybS5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkRmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRPYmplY3QucGFnZSA9IHNjb3BlLmludGVybmFsLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBuYW1lIGFkZEJ1dHRvblxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1CdXR0b259IG9wdGlvbnNcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgKi9cbiAgICBqc1BERkFQSS5hZGRCdXR0b24gPSBmdW5jdGlvbiAoYnV0dG9uKSB7XG4gICAgICAgIGlmIChidXR0b24gaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkQnV0dG9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIGJ1dHRvbik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkVGV4dEZpZWxkXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtBY3JvRm9ybVRleHRGaWVsZH0gdGV4dEZpZWxkXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkVGV4dEZpZWxkID0gZnVuY3Rpb24gKHRleHRGaWVsZCkge1xuICAgICAgICBpZiAodGV4dEZpZWxkIGluc3RhbmNlb2YgQWNyb0Zvcm1UZXh0RmllbGQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZFRleHRGaWVsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGQuY2FsbCh0aGlzLCB0ZXh0RmllbGQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBuYW1lIGFkZENob2ljZUZpZWxkXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtBY3JvRm9ybUNob2ljZUZpZWxkfSBcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgKi9cbiAgICBqc1BERkFQSS5hZGRDaG9pY2VGaWVsZCA9IGZ1bmN0aW9uIChjaG9pY2VGaWVsZCkge1xuICAgICAgICBpZiAoY2hvaWNlRmllbGQgaW5zdGFuY2VvZiBBY3JvRm9ybUNob2ljZUZpZWxkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRDaG9pY2VGaWVsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGQuY2FsbCh0aGlzLCBjaG9pY2VGaWVsZCk7XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZ2xvYmFsT2JqID09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDaG9pY2VGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJMaXN0Qm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNvbWJvQm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkVkaXRCb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlB1c2hCdXR0b25cIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUmFkaW9CdXR0b25cIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ2hlY2tCb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiVGV4dEZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlBhc3N3b3JkRmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiXG4gICAgKSB7XG4gICAgICAgIGdsb2JhbE9ialtcIkNob2ljZUZpZWxkXCJdID0gQWNyb0Zvcm1DaG9pY2VGaWVsZDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiTGlzdEJveFwiXSA9IEFjcm9Gb3JtTGlzdEJveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ29tYm9Cb3hcIl0gPSBBY3JvRm9ybUNvbWJvQm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJFZGl0Qm94XCJdID0gQWNyb0Zvcm1FZGl0Qm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJCdXR0b25cIl0gPSBBY3JvRm9ybUJ1dHRvbjtcbiAgICAgICAgZ2xvYmFsT2JqW1wiUHVzaEJ1dHRvblwiXSA9IEFjcm9Gb3JtUHVzaEJ1dHRvbjtcbiAgICAgICAgZ2xvYmFsT2JqW1wiUmFkaW9CdXR0b25cIl0gPSBBY3JvRm9ybVJhZGlvQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJDaGVja0JveFwiXSA9IEFjcm9Gb3JtQ2hlY2tCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIlRleHRGaWVsZFwiXSA9IEFjcm9Gb3JtVGV4dEZpZWxkO1xuICAgICAgICBnbG9iYWxPYmpbXCJQYXNzd29yZEZpZWxkXCJdID0gQWNyb0Zvcm1QYXNzd29yZEZpZWxkO1xuXG4gICAgICAgIC8vIGJhY2t3YXJkc0NvbXBhdGliaWxpdHlcbiAgICAgICAgZ2xvYmFsT2JqW1wiQWNyb0Zvcm1cIl0gPSB7IEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIC8vIGNvbnNvbGUud2FybihcIkFjcm9Gb3JtLUNsYXNzZXMgYXJlIG5vdCBwb3B1bGF0ZWQgaW50byBnbG9iYWwtbmFtZXNwYWNlLCBiZWNhdXNlIHRoZSBjbGFzcy1OYW1lcyBleGlzdCBhbHJlYWR5LiBUaGlzIGF2b2lkcyBjb25mbGljdHMgd2l0aCB0aGUgYWxyZWFkeSB1c2VkIGZyYW1ld29yay5cIik7XG4gICAgfVxuXG4gICAganNQREZBUEkuQWNyb0Zvcm1DaG9pY2VGaWVsZCA9IEFjcm9Gb3JtQ2hvaWNlRmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1MaXN0Qm94ID0gQWNyb0Zvcm1MaXN0Qm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ29tYm9Cb3ggPSBBY3JvRm9ybUNvbWJvQm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtRWRpdEJveCA9IEFjcm9Gb3JtRWRpdEJveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUJ1dHRvbiA9IEFjcm9Gb3JtQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtUHVzaEJ1dHRvbiA9IEFjcm9Gb3JtUHVzaEJ1dHRvbjtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVJhZGlvQnV0dG9uID0gQWNyb0Zvcm1SYWRpb0J1dHRvbjtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUNoZWNrQm94ID0gQWNyb0Zvcm1DaGVja0JveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVRleHRGaWVsZCA9IEFjcm9Gb3JtVGV4dEZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtUGFzc3dvcmRGaWVsZCA9IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUFwcGVhcmFuY2UgPSBBY3JvRm9ybUFwcGVhcmFuY2U7XG5cbiAgICBqc1BERkFQSS5BY3JvRm9ybSA9IHtcbiAgICAgICAgQ2hvaWNlRmllbGQ6IEFjcm9Gb3JtQ2hvaWNlRmllbGQsXG4gICAgICAgIExpc3RCb3g6IEFjcm9Gb3JtTGlzdEJveCxcbiAgICAgICAgQ29tYm9Cb3g6IEFjcm9Gb3JtQ29tYm9Cb3gsXG4gICAgICAgIEVkaXRCb3g6IEFjcm9Gb3JtRWRpdEJveCxcbiAgICAgICAgQnV0dG9uOiBBY3JvRm9ybUJ1dHRvbixcbiAgICAgICAgUHVzaEJ1dHRvbjogQWNyb0Zvcm1QdXNoQnV0dG9uLFxuICAgICAgICBSYWRpb0J1dHRvbjogQWNyb0Zvcm1SYWRpb0J1dHRvbixcbiAgICAgICAgQ2hlY2tCb3g6IEFjcm9Gb3JtQ2hlY2tCb3gsXG4gICAgICAgIFRleHRGaWVsZDogQWNyb0Zvcm1UZXh0RmllbGQsXG4gICAgICAgIFBhc3N3b3JkRmllbGQ6IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCxcbiAgICAgICAgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlXG4gICAgfTtcblxuICAgIGpzUERGLkFjcm9Gb3JtID0ge1xuICAgICAgICBDaG9pY2VGaWVsZDogQWNyb0Zvcm1DaG9pY2VGaWVsZCxcbiAgICAgICAgTGlzdEJveDogQWNyb0Zvcm1MaXN0Qm94LFxuICAgICAgICBDb21ib0JveDogQWNyb0Zvcm1Db21ib0JveCxcbiAgICAgICAgRWRpdEJveDogQWNyb0Zvcm1FZGl0Qm94LFxuICAgICAgICBCdXR0b246IEFjcm9Gb3JtQnV0dG9uLFxuICAgICAgICBQdXNoQnV0dG9uOiBBY3JvRm9ybVB1c2hCdXR0b24sXG4gICAgICAgIFJhZGlvQnV0dG9uOiBBY3JvRm9ybVJhZGlvQnV0dG9uLFxuICAgICAgICBDaGVja0JveDogQWNyb0Zvcm1DaGVja0JveCxcbiAgICAgICAgVGV4dEZpZWxkOiBBY3JvRm9ybVRleHRGaWVsZCxcbiAgICAgICAgUGFzc3dvcmRGaWVsZDogQWNyb0Zvcm1QYXNzd29yZEZpZWxkLFxuICAgICAgICBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2VcbiAgICB9O1xufSkoanNwZGYuanNQREYsICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cgfHwgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsKSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qc1xuLy8gbW9kdWxlIGlkID0gNjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiICAvKipcbiAgICoganNQREYgZnJvbUhUTUwgcGx1Z2luLiBCRVRBIHN0YWdlLiBBUEkgc3ViamVjdCB0byBjaGFuZ2UuIE5lZWRzIGJyb3dzZXJcbiAgICogQ29weXJpZ2h0IChjKSAyMDEyIFdpbGxvdyBTeXN0ZW1zIENvcnBvcmF0aW9uLCB3aWxsb3ctc3lzdGVtcy5jb21cbiAgICogICAgICAgICAgICAgICAyMDE0IEp1YW4gUGFibG8gR2F2aXJpYSwgaHR0cHM6Ly9naXRodWIuY29tL2p1YW5wZ2F2aXJpYVxuICAgKiAgICAgICAgICAgICAgIDIwMTQgRGllZ28gQ2Fzb3JyYW4sIGh0dHBzOi8vZ2l0aHViLmNvbS9kaWVnb2NyXG4gICAqICAgICAgICAgICAgICAgMjAxNCBEYW5pZWwgSHVzYXIsIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxodXNhclxuICAgKiAgICAgICAgICAgICAgIDIwMTQgV29sZmdhbmcgR2Fzc2xlciwgaHR0cHM6Ly9naXRodWIuY29tL3dvb2xmZ1xuICAgKiAgICAgICAgICAgICAgIDIwMTQgU3RldmVuIFNwdW5naW4sIGh0dHBzOi8vZ2l0aHViLmNvbS9mbGFtZW5jb1xuICAgKlxuICAgKiBAbGljZW5zZVxuICAgKiBcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG4gIHZhciBqc3BkZiA9IHJlcXVpcmUoXCJqc3BkZlwiKTtcblxuICAoZnVuY3Rpb24gKGpzUERGQVBJKSB7XG4gICAgdmFyIGNsb25lLCBfRHJpbGxGb3JDb250ZW50LCBGb250TmFtZURCLCBGb250U3R5bGVNYXAsIFRleHRBbGlnbk1hcCwgRm9udFdlaWdodE1hcCwgRmxvYXRNYXAsIENsZWFyTWFwLCBHZXRDU1MsIFB1cmdlV2hpdGVTcGFjZSwgUmVuZGVyZXIsIFJlc29sdmVGb250LCBSZXNvbHZlVW5pdGVkTnVtYmVyLCBVbml0ZWROdW1iZXJNYXAsIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlLCBpbWFnZXMsIGxvYWRJbWdzLCBjaGVja0ZvckZvb3RlciwgcHJvY2VzcywgdGFibGVUb0pzb247XG5cbiAgICBjbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIENsb25lLnByb3RvdHlwZSA9IG9iajtcbiAgICAgICAgcmV0dXJuIG5ldyBDbG9uZSgpO1xuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gQ2xvbmUoKSB7fVxuICAgIH0oKTtcblxuICAgIFB1cmdlV2hpdGVTcGFjZSA9IGZ1bmN0aW9uIFB1cmdlV2hpdGVTcGFjZShhcnJheSkge1xuICAgICAgdmFyIGZyYWdtZW50LCBpLCBsLCBsVHJpbW1lZCwgciwgclRyaW1tZWQsIHRyYWlsaW5nU3BhY2U7XG4gICAgICBpID0gMDtcbiAgICAgIGwgPSBhcnJheS5sZW5ndGg7XG4gICAgICBmcmFnbWVudCA9IHZvaWQgMDtcbiAgICAgIGxUcmltbWVkID0gZmFsc2U7XG4gICAgICByVHJpbW1lZCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoIWxUcmltbWVkICYmIGkgIT09IGwpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXSA9IGFycmF5W2ldLnRyaW1MZWZ0KCk7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgbFRyaW1tZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBpID0gbCAtIDE7XG5cbiAgICAgIHdoaWxlIChsICYmICFyVHJpbW1lZCAmJiBpICE9PSAtMSkge1xuICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldID0gYXJyYXlbaV0udHJpbVJpZ2h0KCk7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgclRyaW1tZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaS0tO1xuICAgICAgfVxuXG4gICAgICByID0gL1xccyskL2c7XG4gICAgICB0cmFpbGluZ1NwYWNlID0gdHJ1ZTtcbiAgICAgIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAvLyBMZWF2ZSB0aGUgbGluZSBicmVha3MgaW50YWN0XG4gICAgICAgIGlmIChhcnJheVtpXSAhPSBcIlxcdTIwMjhcIikge1xuICAgICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0ucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG5cbiAgICAgICAgICBpZiAodHJhaWxpbmdTcGFjZSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudC50cmltTGVmdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgICAgdHJhaWxpbmdTcGFjZSA9IHIudGVzdChmcmFnbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXJyYXlbaV0gPSBmcmFnbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH07XG5cbiAgICBSZW5kZXJlciA9IGZ1bmN0aW9uIFJlbmRlcmVyKHBkZiwgeCwgeSwgc2V0dGluZ3MpIHtcbiAgICAgIHRoaXMucGRmID0gcGRmO1xuICAgICAgdGhpcy54ID0geDtcbiAgICAgIHRoaXMueSA9IHk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7IC8vbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggYXJlIGNhbGxlZCBhZnRlciBlYWNoIGVsZW1lbnQtcmVuZGVyaW5nIHByb2Nlc3NcblxuICAgICAgdGhpcy53YXRjaEZ1bmN0aW9ucyA9IFtdO1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgUmVzb2x2ZUZvbnQgPSBmdW5jdGlvbiBSZXNvbHZlRm9udChjc3NfZm9udF9mYW1pbHlfc3RyaW5nKSB7XG4gICAgICB2YXIgbmFtZSwgcGFydCwgcGFydHM7XG4gICAgICBuYW1lID0gdm9pZCAwO1xuICAgICAgcGFydHMgPSBjc3NfZm9udF9mYW1pbHlfc3RyaW5nLnNwbGl0KFwiLFwiKTtcbiAgICAgIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xuXG4gICAgICB3aGlsZSAoIW5hbWUgJiYgcGFydCkge1xuICAgICAgICBuYW1lID0gRm9udE5hbWVEQltwYXJ0LnRyaW0oKS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgcGFydCA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH07XG5cbiAgICBSZXNvbHZlVW5pdGVkTnVtYmVyID0gZnVuY3Rpb24gUmVzb2x2ZVVuaXRlZE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nKSB7XG4gICAgICAvL0lFOCBpc3N1ZXNcbiAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID09PSBcImF1dG9cIiA/IFwiMHB4XCIgOiBjc3NfbGluZV9oZWlnaHRfc3RyaW5nO1xuXG4gICAgICBpZiAoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5pbmRleE9mKFwiZW1cIikgPiAtMSAmJiAhaXNOYU4oTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcImVtXCIsIFwiXCIpKSkpIHtcbiAgICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJlbVwiLCBcIlwiKSkgKiAxOC43MTkgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjc3NfbGluZV9oZWlnaHRfc3RyaW5nLmluZGV4T2YoXCJwdFwiKSA+IC0xICYmICFpc05hTihOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwicHRcIiwgXCJcIikpKSkge1xuICAgICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcInB0XCIsIFwiXCIpKSAqIDEuMzMzICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsLCB1bmRlZiwgdmFsdWU7XG4gICAgICB1bmRlZiA9IHZvaWQgMDtcbiAgICAgIG5vcm1hbCA9IDE2LjAwO1xuICAgICAgdmFsdWUgPSBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ107XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0ge1xuICAgICAgICBcInh4LXNtYWxsXCI6IDksXG4gICAgICAgIFwieC1zbWFsbFwiOiAxMSxcbiAgICAgICAgc21hbGw6IDEzLFxuICAgICAgICBtZWRpdW06IDE2LFxuICAgICAgICBsYXJnZTogMTksXG4gICAgICAgIFwieC1sYXJnZVwiOiAyMyxcbiAgICAgICAgXCJ4eC1sYXJnZVwiOiAyOCxcbiAgICAgICAgYXV0bzogMFxuICAgICAgfVtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXTtcblxuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZikge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gdmFsdWUgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9IHBhcnNlRmxvYXQoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHZhbHVlIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGNzc19saW5lX2hlaWdodF9zdHJpbmcubWF0Y2goLyhbXFxkXFwuXSspKHB4KS8pO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSBwYXJzZUZsb2F0KHZhbHVlWzFdKSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IDE7XG4gICAgfTtcblxuICAgIEdldENTUyA9IGZ1bmN0aW9uIEdldENTUyhlbGVtZW50KSB7XG4gICAgICB2YXIgY3NzLCB0bXAsIGNvbXB1dGVkQ1NTRWxlbWVudDtcblxuICAgICAgY29tcHV0ZWRDU1NFbGVtZW50ID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHZhciBjb21wQ1NTO1xuXG4gICAgICAgIGNvbXBDU1MgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZWwuY3VycmVudFN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuY3VycmVudFN0eWxlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuc3R5bGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KGVsKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICBwcm9wID0gcHJvcC5yZXBsYWNlKC8tXFxEL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBjb21wQ1NTW3Byb3BdO1xuICAgICAgICB9O1xuICAgICAgfShlbGVtZW50KTtcblxuICAgICAgY3NzID0ge307XG4gICAgICB0bXAgPSB2b2lkIDA7XG4gICAgICBjc3NbXCJmb250LWZhbWlseVwiXSA9IFJlc29sdmVGb250KGNvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtZmFtaWx5XCIpKSB8fCBcInRpbWVzXCI7XG4gICAgICBjc3NbXCJmb250LXN0eWxlXCJdID0gRm9udFN0eWxlTWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtc3R5bGVcIildIHx8IFwibm9ybWFsXCI7XG4gICAgICBjc3NbXCJ0ZXh0LWFsaWduXCJdID0gVGV4dEFsaWduTWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcInRleHQtYWxpZ25cIildIHx8IFwibGVmdFwiO1xuICAgICAgdG1wID0gRm9udFdlaWdodE1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXdlaWdodFwiKV0gfHwgXCJub3JtYWxcIjtcblxuICAgICAgaWYgKHRtcCA9PT0gXCJib2xkXCIpIHtcbiAgICAgICAgaWYgKGNzc1tcImZvbnQtc3R5bGVcIl0gPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICBjc3NbXCJmb250LXN0eWxlXCJdID0gdG1wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSB0bXAgKyBjc3NbXCJmb250LXN0eWxlXCJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNzc1tcImZvbnQtc2l6ZVwiXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1zaXplXCIpKSB8fCAxO1xuICAgICAgY3NzW1wibGluZS1oZWlnaHRcIl0gPSBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcImxpbmUtaGVpZ2h0XCIpKSB8fCAxO1xuICAgICAgY3NzW1wiZGlzcGxheVwiXSA9IGNvbXB1dGVkQ1NTRWxlbWVudChcImRpc3BsYXlcIikgPT09IFwiaW5saW5lXCIgPyBcImlubGluZVwiIDogXCJibG9ja1wiO1xuICAgICAgdG1wID0gY3NzW1wiZGlzcGxheVwiXSA9PT0gXCJibG9ja1wiO1xuICAgICAgY3NzW1wibWFyZ2luLXRvcFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi10b3BcIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tYm90dG9tXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLWJvdHRvbVwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctdG9wXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy10b3BcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLWJvdHRvbVwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctYm90dG9tXCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLWxlZnRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tbGVmdFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1yaWdodFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1yaWdodFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctbGVmdFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctbGVmdFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctcmlnaHRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLXJpZ2h0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFnZS1icmVhay1iZWZvcmVcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJwYWdlLWJyZWFrLWJlZm9yZVwiKSB8fCBcImF1dG9cIjsgLy9mbG9hdCBhbmQgY2xlYXJpbmcgb2YgZmxvYXRzXG5cbiAgICAgIGNzc1tcImZsb2F0XCJdID0gRmxvYXRNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiY3NzRmxvYXRcIildIHx8IFwibm9uZVwiO1xuICAgICAgY3NzW1wiY2xlYXJcIl0gPSBDbGVhck1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJjbGVhclwiKV0gfHwgXCJub25lXCI7XG4gICAgICBjc3NbXCJjb2xvclwiXSA9IGNvbXB1dGVkQ1NTRWxlbWVudChcImNvbG9yXCIpO1xuICAgICAgcmV0dXJuIGNzcztcbiAgICB9O1xuXG4gICAgZWxlbWVudEhhbmRsZWRFbHNld2hlcmUgPSBmdW5jdGlvbiBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShlbGVtZW50LCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSB7XG4gICAgICB2YXIgaGFuZGxlcnMsIGksIGlzSGFuZGxlZEVsc2V3aGVyZSwgbCwgY2xhc3NOYW1lcztcbiAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGZhbHNlO1xuICAgICAgaSA9IHZvaWQgMDtcbiAgICAgIGwgPSB2b2lkIDA7XG4gICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1tcIiNcIiArIGVsZW1lbnQuaWRdO1xuXG4gICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZXJzID0gZWxlbWVudEhhbmRsZXJzW2VsZW1lbnQubm9kZU5hbWVdO1xuXG4gICAgICBpZiAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBoYW5kbGVycykge1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgbCA9IGhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVHJ5IGNsYXNzIG5hbWVzXG5cblxuICAgICAgY2xhc3NOYW1lcyA9IHR5cGVvZiBlbGVtZW50LmNsYXNzTmFtZSA9PT0gJ3N0cmluZycgPyBlbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpIDogW107XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhhbmRsZXJzID0gZWxlbWVudEhhbmRsZXJzWycuJyArIGNsYXNzTmFtZXNbaV1dO1xuXG4gICAgICAgIGlmICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGhhbmRsZXJzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgbCA9IGhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzSGFuZGxlZEVsc2V3aGVyZTtcbiAgICB9O1xuXG4gICAgdGFibGVUb0pzb24gPSBmdW5jdGlvbiB0YWJsZVRvSnNvbih0YWJsZSwgcmVuZGVyZXIpIHtcbiAgICAgIHZhciBkYXRhLCBoZWFkZXJzLCBpLCBqLCByb3dEYXRhLCB0YWJsZVJvdywgdGFibGVfb2JqLCB0YWJsZV93aXRoLCBjZWxsLCBsO1xuICAgICAgZGF0YSA9IFtdO1xuICAgICAgaGVhZGVycyA9IFtdO1xuICAgICAgaSA9IDA7XG4gICAgICBsID0gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7XG4gICAgICB0YWJsZV93aXRoID0gdGFibGUuY2xpZW50V2lkdGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjZWxsID0gdGFibGUucm93c1swXS5jZWxsc1tpXTtcbiAgICAgICAgaGVhZGVyc1tpXSA9IHtcbiAgICAgICAgICBuYW1lOiBjZWxsLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyksXG4gICAgICAgICAgcHJvbXB0OiBjZWxsLnRleHRDb250ZW50LnJlcGxhY2UoL1xccj9cXG4vZywgJycpLFxuICAgICAgICAgIHdpZHRoOiBjZWxsLmNsaWVudFdpZHRoIC8gdGFibGVfd2l0aCAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpXG4gICAgICAgIH07XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgaSA9IDE7XG5cbiAgICAgIHdoaWxlIChpIDwgdGFibGUucm93cy5sZW5ndGgpIHtcbiAgICAgICAgdGFibGVSb3cgPSB0YWJsZS5yb3dzW2ldO1xuICAgICAgICByb3dEYXRhID0ge307XG4gICAgICAgIGogPSAwO1xuXG4gICAgICAgIHdoaWxlIChqIDwgdGFibGVSb3cuY2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93RGF0YVtoZWFkZXJzW2pdLm5hbWVdID0gdGFibGVSb3cuY2VsbHNbal0udGV4dENvbnRlbnQucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyk7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5wdXNoKHJvd0RhdGEpO1xuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZV9vYmogPSB7XG4gICAgICAgIHJvd3M6IGRhdGEsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBTa2lwTm9kZSA9IHtcbiAgICAgIFNDUklQVDogMSxcbiAgICAgIFNUWUxFOiAxLFxuICAgICAgTk9TQ1JJUFQ6IDEsXG4gICAgICBPQkpFQ1Q6IDEsXG4gICAgICBFTUJFRDogMSxcbiAgICAgIFNFTEVDVDogMVxuICAgIH07XG4gICAgdmFyIGxpc3RDb3VudCA9IDE7XG5cbiAgICBfRHJpbGxGb3JDb250ZW50ID0gZnVuY3Rpb24gRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBjbiwgY25zLCBmcmFnbWVudENTUywgaSwgaXNCbG9jaywgbCwgdGFibGUyanNvbiwgY2I7XG4gICAgICBjbnMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICBjbiA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50Q1NTID0gR2V0Q1NTKGVsZW1lbnQpO1xuICAgICAgaXNCbG9jayA9IGZyYWdtZW50Q1NTLmRpc3BsYXkgPT09IFwiYmxvY2tcIjtcblxuICAgICAgaWYgKGlzQmxvY2spIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeSgpO1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja1N0eWxlKGZyYWdtZW50Q1NTKTtcbiAgICAgIH1cbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGNucy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjbiA9IGNuc1tpXTtcblxuICAgICAgICBpZiAodHlwZW9mKGNuKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIC8vZXhlY3V0ZSBhbGwgd2F0Y2hlciBmdW5jdGlvbnMgdG8gZS5nLiByZXNldCBmbG9hdGluZ1xuICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgLyoqKiBIRUFERVIgcmVuZGVyaW5nICoqL1xuXG4gICAgICAgICAgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmIGNuLm5vZGVOYW1lID09PSAnSEVBREVSJykge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IGNuOyAvL3N0b3JlIG9sZCB0b3AgbWFyZ2luXG5cbiAgICAgICAgICAgIHZhciBvbGRNYXJnaW5Ub3AgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL3N1YnNjcmliZSBmb3IgbmV3IHBhZ2UgZXZlbnQgYW5kIHJlbmRlciBoZWFkZXIgZmlyc3Qgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYWRkUGFnZScsIGZ1bmN0aW9uIChwYWdlSW5mbykge1xuICAgICAgICAgICAgICAvL3NldCBjdXJyZW50IHkgcG9zaXRpb24gdG8gb2xkIG1hcmdpblxuICAgICAgICAgICAgICByZW5kZXJlci55ID0gb2xkTWFyZ2luVG9wOyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChoZWFkZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBtYXJnaW4gdG8gb2xkIG1hcmdpbiArIHJlbmRlcmVkIGhlYWRlciArIDEwIHNwYWNlIHRvIHByZXZlbnQgb3ZlcmxhcHBpbmdcbiAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCA9IHJlbmRlcmVyLnkgKyAxMDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDggJiYgY24ubm9kZU5hbWUgPT09IFwiI2NvbW1lbnRcIikge1xuICAgICAgICAgICAgaWYgKH5jbi50ZXh0Q29udGVudC5pbmRleE9mKFwiQUREX1BBR0VcIikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMSAmJiAhU2tpcE5vZGVbY24ubm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAvKioqIElNQUdFIFJFTkRFUklORyAqKiovXG4gICAgICAgICAgICB2YXIgY2FjaGVkX2ltYWdlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZU5hbWUgPT09IFwiSU1HXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IGNuLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gaW1hZ2VzWyhyZW5kZXJlci5wZGYuc0hhc2hDb2RlICYmIHJlbmRlcmVyLnBkZi5zSGFzaENvZGUodXJsKSkgfHwgdXJsXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhY2hlZF9pbWFnZSkge1xuICAgICAgICAgICAgICBpZiAocmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQgJiYgcmVuZGVyZXIueSA+IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3ApIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gc2V0IGJhY2sgc29tZSB2YWx1ZXMgZHVlIHRvIGUuZy4gaGVhZGVyIHJlbmRlcmluZyBmb3IgbmV3IHBhZ2VcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgaW1hZ2VzQ1NTID0gR2V0Q1NTKGNuKTtcbiAgICAgICAgICAgICAgdmFyIGltYWdlWCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHZhciBmb250VG9Vbml0UmF0aW8gPSAxMiAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjsgLy9kZWZpbmUgYWRkaXRpb25hbCBwYWRkaW5ncywgbWFyZ2lucyB3aGljaCBoYXZlIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgbWFyZ2luIGNhbGN1bGF0aW9uc1xuXG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VMZWZ0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1sZWZ0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1sZWZ0XCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZVJpZ2h0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1yaWdodFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctcmlnaHRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlVG9wID0gKGltYWdlc0NTU1tcIm1hcmdpbi10b3BcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLXRvcFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VCb3R0b20gPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWJvdHRvbVwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctYm90dG9tXCJdKSAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBmbG9hdCBpcyBzZXQgdG8gcmlnaHQsIG1vdmUgdGhlIGltYWdlIHRvIHRoZSByaWdodCBib3JkZXJcbiAgICAgICAgICAgICAgLy9hZGQgc3BhY2UgaWYgbWFyZ2luIGlzIHNldFxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gIT09IHVuZGVmaW5lZCAmJiBpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVggKz0gcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLSBjbi53aWR0aCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSBhZGRpdGlvbmFsU3BhY2VMZWZ0O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZEltYWdlKGNhY2hlZF9pbWFnZSwgaW1hZ2VYLCByZW5kZXJlci55ICsgYWRkaXRpb25hbFNwYWNlVG9wLCBjbi53aWR0aCwgY24uaGVpZ2h0KTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gdW5kZWZpbmVkOyAvL2lmIHRoZSBmbG9hdCBwcm9wIGlzIHNwZWNpZmllZCB3ZSBoYXZlIHRvIGZsb2F0IHRoZSB0ZXh0IGFyb3VuZCB0aGUgaW1hZ2VcblxuICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAncmlnaHQnIHx8IGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgLy9hZGQgZnVuY3Rpb250IHRvIHNldCBiYWNrIGNvb3JkaW5hdGVzIGFmdGVyIGltYWdlIHJlbmRlcmluZ1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKGRpZmZYLCB0aHJlc2hvbGRZLCBkaWZmV2lkdGgsIGVsKSB7XG4gICAgICAgICAgICAgICAgICAvL3VuZG8gZHJhd2luZyBib3ggYWRhcHRpb25zIHdoaWNoIHdlcmUgc2V0IGJ5IGZsb2F0aW5nXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA+PSB0aHJlc2hvbGRZKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gZGlmZlg7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsICYmIGVsLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtlbC5ub2RlTmFtZV0gJiYgcmVuZGVyZXIueCArIGVsLndpZHRoID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmxlZnQgKyByZW5kZXJlci5wZGYubWFyZ2luc19kb2Mud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHRocmVzaG9sZFk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnID8gLWNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlTGVmdCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0IDogMCwgcmVuZGVyZXIueSArIGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSwgY24ud2lkdGgpKTsgLy9yZXNldCBmbG9hdGluZyBieSBjbGVhcjpib3RoIGRpdnNcbiAgICAgICAgICAgICAgICAvL2p1c3Qgc2V0IGN1cnNvclkgYWZ0ZXIgdGhlIGZsb2F0aW5nIGVsZW1lbnRcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcsIHBhZ2VzLCBlbCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnkgPCB5UG9zaXRpb25BZnRlckZsb2F0aW5nICYmIHBhZ2VzID09PSByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5ub2RlVHlwZSA9PT0gMSAmJiBHZXRDU1MoZWwpLmNsZWFyID09PSAnYm90aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0geVBvc2l0aW9uQWZ0ZXJGbG9hdGluZztcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCByZW5kZXJlci55ICsgY24uaGVpZ2h0LCByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSk7IC8vaWYgZmxvYXRpbmcgaXMgc2V0IHdlIGRlY3JlYXNlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgdGhlIGltYWdlIHdpZHRoXG5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDsgLy9pZiBsZWZ0IGp1c3QgYWRkIHRoZSBpbWFnZSB3aWR0aCB0byB0aGUgWCBjb29yZGluYXRlXG5cbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gY24ud2lkdGggKyBhZGRpdGlvbmFsU3BhY2VMZWZ0ICsgYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYgbm8gZmxvYXRpbmcgaXMgc2V0LCBtb3ZlIHRoZSByZW5kZXJpbmcgY3Vyc29yIGFmdGVyIHRoZSBpbWFnZSBoZWlnaHRcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ICs9IGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvKioqIFRBQkxFIFJFTkRFUklORyAqKiovXG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiVEFCTEVcIikge1xuICAgICAgICAgICAgICB0YWJsZTJqc29uID0gdGFibGVUb0pzb24oY24sIHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLnRhYmxlKHJlbmRlcmVyLngsIHJlbmRlcmVyLnksIHRhYmxlMmpzb24ucm93cywgdGFibGUyanNvbi5oZWFkZXJzLCB7XG4gICAgICAgICAgICAgICAgYXV0b1NpemU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHByaW50SGVhZGVyczogZWxlbWVudEhhbmRsZXJzLnByaW50SGVhZGVycyxcbiAgICAgICAgICAgICAgICBtYXJnaW5zOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MsXG4gICAgICAgICAgICAgICAgY3NzOiBHZXRDU1MoY24pXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLnkgK1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5fX2NlbGxfXy5sYXN0Q2VsbC5oZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIk9MXCIgfHwgY24ubm9kZU5hbWUgPT09IFwiVUxcIikge1xuICAgICAgICAgICAgICBsaXN0Q291bnQgPSAxO1xuXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJMSVwiKSB7XG4gICAgICAgICAgICAgIHZhciB0ZW1wID0gcmVuZGVyZXIueDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSAyMCAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAzO1xuXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZW5kZXJlci54ID0gdGVtcDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiQlJcIikge1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IGZyYWdtZW50Q1NTW1wiZm9udC1zaXplXCJdICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICByZW5kZXJlci5hZGRUZXh0KFwiXFx1MjAyOFwiLCBjbG9uZShmcmFnbWVudENTUykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNuLm5vZGVWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGNuLm5vZGVWYWx1ZSAmJiBjbi5wYXJlbnROb2RlLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcbiAgICAgICAgICAgICAgaWYgKGNuLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gXCJPTFwiKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBsaXN0Q291bnQrKyArICcuICcgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZm9udFNpemUgPSBmcmFnbWVudENTU1tcImZvbnQtc2l6ZVwiXTtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0WCA9ICgzIC0gZm9udFNpemUgKiAwLjc1KSAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0WSA9IGZvbnRTaXplICogMC43NSAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgICB2YXIgcmFkaXVzID0gZm9udFNpemUgKiAxLjc0IC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuXG4gICAgICAgICAgICAgICAgY2IgPSBmdW5jdGlvbiBjYih4LCB5KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBkZi5jaXJjbGUoeCArIG9mZnNldFgsIHkgKyBvZmZzZXRZLCByYWRpdXMsICdGRCcpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gT25seSBhZGQgdGhlIHRleHQgaWYgdGhlIHRleHQgbm9kZSBpcyBpbiB0aGUgYm9keSBlbGVtZW50XG4gICAgICAgICAgICAvLyBBZGQgY29tcGF0aWJpbGl0eSB3aXRoIElFMTFcblxuXG4gICAgICAgICAgICBpZiAoISEoY24ub3duZXJEb2N1bWVudC5ib2R5LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGNuKSAmIDE2KSkge1xuICAgICAgICAgICAgICByZW5kZXJlci5hZGRUZXh0KHZhbHVlLCBmcmFnbWVudENTUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY24gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQoY24sIGZyYWdtZW50Q1NTKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnRIYW5kbGVycy5vdXRZID0gcmVuZGVyZXIueTtcblxuICAgICAgaWYgKGlzQmxvY2spIHtcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnNldEJsb2NrQm91bmRhcnkoY2IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpbWFnZXMgPSB7fTtcblxuICAgIGxvYWRJbWdzID0gZnVuY3Rpb24gbG9hZEltZ3MoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycywgY2IpIHtcbiAgICAgIHZhciBpbWdzID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyksXG4gICAgICAgICAgbCA9IGltZ3MubGVuZ3RoLFxuICAgICAgICAgIGZvdW5kX2ltYWdlcyxcbiAgICAgICAgICB4ID0gMDtcblxuICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5wdWJsaXNoKCdpbWFnZXNMb2FkZWQnKTtcbiAgICAgICAgY2IoZm91bmRfaW1hZ2VzKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbG9hZEltYWdlKHVybCwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGZvdW5kX2ltYWdlcyA9ICsreDtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJyc7XG5cbiAgICAgICAgaW1nLm9uZXJyb3IgPSBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpbWcuY29tcGxldGUpIHtcbiAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBkYXRhIHVybHMgaW4gaW1hZ2VzLCBzZXQgd2lkdGggYW5kIGhlaWdodFxuICAgICAgICAgICAgLy9hcyB0aG9zZSB2YWx1ZXMgYXJlIG5vdCByZWNvZ25pemVkIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAgIGlmIChpbWcuc3JjLmluZGV4T2YoJ2RhdGE6aW1hZ2UvJykgPT09IDApIHtcbiAgICAgICAgICAgICAgaW1nLndpZHRoID0gd2lkdGggfHwgaW1nLndpZHRoIHx8IDA7XG4gICAgICAgICAgICAgIGltZy5oZWlnaHQgPSBoZWlnaHQgfHwgaW1nLmhlaWdodCB8fCAwO1xuICAgICAgICAgICAgfSAvL2lmIHZhbGlkIGltYWdlIGFkZCB0byBrbm93biBpbWFnZXMgYXJyYXlcblxuXG4gICAgICAgICAgICBpZiAoaW1nLndpZHRoICsgaW1nLmhlaWdodCkge1xuICAgICAgICAgICAgICB2YXIgaGFzaCA9IChyZW5kZXJlci5wZGYuc0hhc2hDb2RlICYmIHJlbmRlcmVyLnBkZi5zSGFzaENvZGUodXJsKSkgfHwgdXJsO1xuICAgICAgICAgICAgICBpbWFnZXNbaGFzaF0gPSBpbWFnZXNbaGFzaF0gfHwgaW1nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghIC0teCkge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpbWcuc3JjID0gdXJsO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobC0tKSB7XG4gICAgICAgIGxvYWRJbWFnZShpbWdzW2xdLmdldEF0dHJpYnV0ZShcInNyY1wiKSwgaW1nc1tsXS53aWR0aCwgaW1nc1tsXS5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geCB8fCBkb25lKCk7XG4gICAgfTtcblxuICAgIGNoZWNrRm9yRm9vdGVyID0gZnVuY3Rpb24gY2hlY2tGb3JGb290ZXIoZWxlbSwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgLy9jaGVjayBpZiB3ZSBjYW4gZm91bmQgYSA8Zm9vdGVyPiBlbGVtZW50XG4gICAgICB2YXIgZm9vdGVyID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcImZvb3RlclwiKTtcblxuICAgICAgaWYgKGZvb3Rlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvb3RlciA9IGZvb3RlclswXTsgLy9iYWQgaGFjayB0byBnZXQgaGVpZ2h0IG9mIGZvb3RlclxuICAgICAgICAvL2NyZWF0IGR1bW15IG91dCBhbmQgY2hlY2sgbmV3IHkgYWZ0ZXIgZmFrZSByZW5kZXJpbmdcblxuICAgICAgICB2YXIgb2xkT3V0ID0gcmVuZGVyZXIucGRmLmludGVybmFsLndyaXRlO1xuICAgICAgICB2YXIgb2xkWSA9IHJlbmRlcmVyLnk7XG5cbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLndyaXRlID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAgICAgX0RyaWxsRm9yQ29udGVudChmb290ZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuXG4gICAgICAgIHZhciBmb290ZXJIZWlnaHQgPSBNYXRoLmNlaWwocmVuZGVyZXIueSAtIG9sZFkpICsgNTtcbiAgICAgICAgcmVuZGVyZXIueSA9IG9sZFk7XG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZSA9IG9sZE91dDsgLy9hZGQgMjAlIHRvIHByZXZlbnQgb3ZlcmxhcHBpbmdcblxuICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tICs9IGZvb3RlckhlaWdodDsgLy9DcmVhdGUgZnVuY3Rpb24gcmVuZGVyIGhlYWRlciBvbiBldmVyeSBwYWdlXG5cbiAgICAgICAgdmFyIHJlbmRlckZvb3RlciA9IGZ1bmN0aW9uIHJlbmRlckZvb3RlcihwYWdlSW5mbykge1xuICAgICAgICAgIHZhciBwYWdlTnVtYmVyID0gcGFnZUluZm8gIT09IHVuZGVmaW5lZCA/IHBhZ2VJbmZvLnBhZ2VOdW1iZXIgOiAxOyAvL3NldCBjdXJyZW50IHkgcG9zaXRpb24gdG8gb2xkIG1hcmdpblxuXG4gICAgICAgICAgdmFyIG9sZFBvc2l0aW9uID0gcmVuZGVyZXIueTsgLy9yZW5kZXIgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBoZWFkZXIgZWxlbWVudFxuXG4gICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKSAtIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b207XG4gICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSAtPSBmb290ZXJIZWlnaHQ7IC8vY2hlY2sgaWYgd2UgaGF2ZSB0byBhZGQgcGFnZSBudW1iZXJzXG5cbiAgICAgICAgICB2YXIgc3BhbnMgPSBmb290ZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NwYW4nKTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIC8vaWYgd2UgZmluZCBzb21lIHNwYW4gZWxlbWVudCB3aXRoIGNsYXNzIHBhZ2VDb3VudGVyLCBzZXQgdGhlIHBhZ2VcbiAgICAgICAgICAgIGlmICgoXCIgXCIgKyBzcGFuc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSgvW1xcblxcdF0vZywgXCIgXCIpLmluZGV4T2YoXCIgcGFnZUNvdW50ZXIgXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0gcGFnZU51bWJlcjtcbiAgICAgICAgICAgIH0gLy9pZiB3ZSBmaW5kIHNvbWUgc3BhbiBlbGVtZW50IHdpdGggY2xhc3MgdG90YWxQYWdlcywgc2V0IGEgdmFyaWFibGUgd2hpY2ggaXMgcmVwbGFjZWQgYWZ0ZXIgcmVuZGVyaW5nIG9mIGFsbCBwYWdlc1xuXG5cbiAgICAgICAgICAgIGlmICgoXCIgXCIgKyBzcGFuc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSgvW1xcblxcdF0vZywgXCIgXCIpLmluZGV4T2YoXCIgdG90YWxQYWdlcyBcIikgPiAtMSkge1xuICAgICAgICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPSAnIyMjanNQREZWYXJUb3RhbFBhZ2VzIyMjJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vcmVuZGVyIGZvb3RlciBjb250ZW50XG5cblxuICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZm9vdGVyLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTsgLy9zZXQgYm90dG9tIG1hcmdpbiB0byBwcmV2aW91cyBoZWlnaHQgaW5jbHVkaW5nIHRoZSBmb290ZXIgaGVpZ2h0XG5cblxuICAgICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gKz0gZm9vdGVySGVpZ2h0OyAvL2ltcG9ydGFudCBmb3Igb3RoZXIgcGx1Z2lucyAoZS5nLiB0YWJsZSkgdG8gc3RhcnQgcmVuZGVyaW5nIGF0IGNvcnJlY3QgcG9zaXRpb24gYWZ0ZXIgaGVhZGVyXG5cbiAgICAgICAgICByZW5kZXJlci55ID0gb2xkUG9zaXRpb247XG4gICAgICAgIH07IC8vY2hlY2sgaWYgZm9vdGVyIGNvbnRhaW5zIHRvdGFsUGFnZXMgd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2UgYXQgdGhlIGRpc29wb3NhbCBvZiB0aGUgZG9jdW1lbnRcblxuXG4gICAgICAgIHZhciBzcGFucyA9IGZvb3Rlci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHRvdGFsUGFnZXMgXCIpID4gLTEpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdodG1sUmVuZGVyaW5nRmluaXNoZWQnLCByZW5kZXJlci5wZGYucHV0VG90YWxQYWdlcy5iaW5kKHJlbmRlcmVyLnBkZiwgJyMjI2pzUERGVmFyVG90YWxQYWdlcyMjIycpLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy9yZWdpc3RlciBldmVudCB0byByZW5kZXIgZm9vdGVyIG9uIGV2ZXJ5IG5ldyBwYWdlXG5cblxuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYWRkUGFnZScsIHJlbmRlckZvb3RlciwgZmFsc2UpOyAvL3JlbmRlciBmb290ZXIgb24gZmlyc3QgcGFnZVxuXG4gICAgICAgIHJlbmRlckZvb3RlcigpOyAvL3ByZXZlbnQgZm9vdGVyIHJlbmRlcmluZ1xuXG4gICAgICAgIFNraXBOb2RlWydGT09URVInXSA9IDE7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKHBkZiwgZWxlbWVudCwgeCwgeSwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCAhPT0gXCJzdHJpbmdcIiAmJiAhZWxlbWVudC5wYXJlbnROb2RlKSBlbGVtZW50ID0gJycgKyBlbGVtZW50LmlubmVySFRNTDtcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIHZhciAkZnJhbWUsICRoaWRkZW5kaXYsIGZyYW1lbmFtZSwgdmlzdWFsbHloaWRkZW47XG4gICAgICAgICAgZnJhbWVuYW1lID0gXCJqc1BERmh0bWxUZXh0XCIgKyBEYXRlLm5vdygpLnRvU3RyaW5nKCkgKyAoTWF0aC5yYW5kb20oKSAqIDEwMDApLnRvRml4ZWQoMCk7XG4gICAgICAgICAgdmlzdWFsbHloaWRkZW4gPSBcInBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1wiICsgXCJjbGlwOiByZWN0KDFweCAxcHggMXB4IDFweCk7IC8qIElFNiwgSUU3ICovXCIgKyBcImNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcIiArIFwicGFkZGluZzowICFpbXBvcnRhbnQ7XCIgKyBcImJvcmRlcjowICFpbXBvcnRhbnQ7XCIgKyBcImhlaWdodDogMXB4ICFpbXBvcnRhbnQ7XCIgKyBcIndpZHRoOiAxcHggIWltcG9ydGFudDsgXCIgKyBcInRvcDphdXRvO1wiICsgXCJsZWZ0Oi0xMDBweDtcIiArIFwib3ZlcmZsb3c6IGhpZGRlbjtcIjtcbiAgICAgICAgICAkaGlkZGVuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgJGhpZGRlbmRpdi5zdHlsZS5jc3NUZXh0ID0gdmlzdWFsbHloaWRkZW47XG4gICAgICAgICAgJGhpZGRlbmRpdi5pbm5lckhUTUwgPSBcIjxpZnJhbWUgc3R5bGU9XFxcImhlaWdodDoxcHg7d2lkdGg6MXB4XFxcIiBuYW1lPVxcXCJcIiArIGZyYW1lbmFtZSArIFwiXFxcIiAvPlwiO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoJGhpZGRlbmRpdik7XG4gICAgICAgICAgJGZyYW1lID0gd2luZG93LmZyYW1lc1tmcmFtZW5hbWVdO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgJGZyYW1lLmRvY3VtZW50LndyaXRlbG4oZWxlbWVudCk7XG4gICAgICAgICAgJGZyYW1lLmRvY3VtZW50LmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuICRmcmFtZS5kb2N1bWVudC5ib2R5O1xuICAgICAgICB9KGVsZW1lbnQucmVwbGFjZSgvPFxcLz9zY3JpcHRbXj5dKj8+L2dpLCAnJykpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXZhaWxhYmxlRm9udHMgPSBPYmplY3Qua2V5cyhwZGYuZ2V0Rm9udExpc3QoKSk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGZvbnROYW1lID0gYXZhaWxhYmxlRm9udHNbaV07XG4gICAgICAgIHZhciBmb250RmFtaWx5ID0gZm9udE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYoIUZvbnROYW1lREJbZm9udEZhbWlseV0pIHtcbiAgICAgICAgICBGb250TmFtZURCW2ZvbnRGYW1pbHldID0gZm9udE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSBuZXcgUmVuZGVyZXIocGRmLCB4LCB5LCBzZXR0aW5ncyksXG4gICAgICAgICAgb3V0OyAvLyAxLiBsb2FkIGltYWdlc1xuICAgICAgLy8gMi4gcHJlcGFyZSBvcHRpb25hbCBmb290ZXIgZWxlbWVudHNcbiAgICAgIC8vIDMuIHJlbmRlciBjb250ZW50XG5cbiAgICAgIGxvYWRJbWdzLmNhbGwodGhpcywgZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzLCBmdW5jdGlvbiAoZm91bmRfaW1hZ2VzKSB7XG4gICAgICAgIGNoZWNrRm9yRm9vdGVyKGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyk7XG5cbiAgICAgICAgX0RyaWxsRm9yQ29udGVudChlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpOyAvL3NlbmQgZXZlbnQgZGlzcG9zZSBmb3IgZmluYWwgdGFrcyAoZS5nLiBmb290ZXIgdG90YWxwYWdlIHJlcGxhY2VtZW50KVxuXG5cbiAgICAgICAgci5wZGYuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ2h0bWxSZW5kZXJpbmdGaW5pc2hlZCcpO1xuICAgICAgICBvdXQgPSByLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2sob3V0KTtlbHNlIGlmIChmb3VuZF9pbWFnZXMpIGNvbnNvbGUuZXJyb3IoJ2pzUERGIFdhcm5pbmc6IHJlbmRlcmluZyBpc3N1ZXM/IHByb3ZpZGUgYSBjYWxsYmFjayB0byBmcm9tSFRNTCEnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG91dCB8fCB7XG4gICAgICAgIHg6IHIueCxcbiAgICAgICAgeTogci55XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucGFyYWdyYXBoID0ge1xuICAgICAgICB0ZXh0OiBbXSxcbiAgICAgICAgc3R5bGU6IFtdXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwicVwiKTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIlFcIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB0aGlzLngsXG4gICAgICAgIHk6IHRoaXMueSxcbiAgICAgICAgcmVhZHk6IHRydWVcbiAgICAgIH07XG4gICAgfTsgLy9DaGVja3MgaWYgd2UgaGF2ZSB0byBleGVjdXRlIHNvbWUgd2F0Y2hlciBmdW5jdGlvbnNcbiAgICAvL2UuZy4gdG8gZW5kIHRleHQgZmxvYXRpbmcgYXJvdW5kIGFuIGltYWdlXG5cblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5leGVjdXRlV2F0Y2hGdW5jdGlvbnMgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHZhciByZXQgPSBmYWxzZTtcbiAgICAgIHZhciBuYXJyYXkgPSBbXTtcblxuICAgICAgaWYgKHRoaXMud2F0Y2hGdW5jdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMud2F0Y2hGdW5jdGlvbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAodGhpcy53YXRjaEZ1bmN0aW9uc1tpXShlbCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hcnJheS5wdXNoKHRoaXMud2F0Y2hGdW5jdGlvbnNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2F0Y2hGdW5jdGlvbnMgPSBuYXJyYXk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyA9IGZ1bmN0aW9uIChmcmFnbWVudHMsIHN0eWxlcykge1xuICAgICAgdmFyIGN1cnJlbnRMaW5lTGVuZ3RoLCBkZWZhdWx0Rm9udFNpemUsIGZmLCBmb250TWV0cmljcywgZm9udE1ldHJpY3NDYWNoZSwgZnJhZ21lbnQsIGZyYWdtZW50Q2hvcHBlZCwgZnJhZ21lbnRMZW5ndGgsIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLCBmcywgaywgbGluZSwgbGluZXMsIG1heExpbmVMZW5ndGgsIHN0eWxlO1xuICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7XG4gICAgICBrID0gdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICBmb250TWV0cmljc0NhY2hlID0ge307XG4gICAgICBmZiA9IHZvaWQgMDtcbiAgICAgIGZzID0gdm9pZCAwO1xuICAgICAgZm9udE1ldHJpY3MgPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudCA9IHZvaWQgMDtcbiAgICAgIHN0eWxlID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MgPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudExlbmd0aCA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50Q2hvcHBlZCA9IHZvaWQgMDtcbiAgICAgIGxpbmUgPSBbXTtcbiAgICAgIGxpbmVzID0gW2xpbmVdO1xuICAgICAgY3VycmVudExpbmVMZW5ndGggPSAwO1xuICAgICAgbWF4TGluZUxlbmd0aCA9IHRoaXMuc2V0dGluZ3Mud2lkdGg7XG5cbiAgICAgIHdoaWxlIChmcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnRzLnNoaWZ0KCk7XG4gICAgICAgIHN0eWxlID0gc3R5bGVzLnNoaWZ0KCk7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgZmYgPSBzdHlsZVtcImZvbnQtZmFtaWx5XCJdO1xuICAgICAgICAgIGZzID0gc3R5bGVbXCJmb250LXN0eWxlXCJdO1xuICAgICAgICAgIGZvbnRNZXRyaWNzID0gZm9udE1ldHJpY3NDYWNoZVtmZiArIGZzXTtcblxuICAgICAgICAgIGlmICghZm9udE1ldHJpY3MpIHtcbiAgICAgICAgICAgIGZvbnRNZXRyaWNzID0gdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udChmZiwgZnMpLm1ldGFkYXRhLlVuaWNvZGU7XG4gICAgICAgICAgICBmb250TWV0cmljc0NhY2hlW2ZmICsgZnNdID0gZm9udE1ldHJpY3M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MgPSB7XG4gICAgICAgICAgICB3aWR0aHM6IGZvbnRNZXRyaWNzLndpZHRocyxcbiAgICAgICAgICAgIGtlcm5pbmc6IGZvbnRNZXRyaWNzLmtlcm5pbmcsXG4gICAgICAgICAgICBmb250U2l6ZTogc3R5bGVbXCJmb250LXNpemVcIl0gKiBkZWZhdWx0Rm9udFNpemUsXG4gICAgICAgICAgICB0ZXh0SW5kZW50OiBjdXJyZW50TGluZUxlbmd0aFxuICAgICAgICAgIH07XG4gICAgICAgICAgZnJhZ21lbnRMZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgoZnJhZ21lbnQsIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gaztcblxuICAgICAgICAgIGlmIChmcmFnbWVudCA9PSBcIlxcdTIwMjhcIikge1xuICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMaW5lTGVuZ3RoICsgZnJhZ21lbnRMZW5ndGggPiBtYXhMaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICBmcmFnbWVudENob3BwZWQgPSB0aGlzLnBkZi5zcGxpdFRleHRUb1NpemUoZnJhZ21lbnQsIG1heExpbmVMZW5ndGgsIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKTtcbiAgICAgICAgICAgIGxpbmUucHVzaChbZnJhZ21lbnRDaG9wcGVkLnNoaWZ0KCksIHN0eWxlXSk7XG5cbiAgICAgICAgICAgIHdoaWxlIChmcmFnbWVudENob3BwZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGxpbmUgPSBbW2ZyYWdtZW50Q2hvcHBlZC5zaGlmdCgpLCBzdHlsZV1dO1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50TGluZUxlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChsaW5lWzBdWzBdLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmUucHVzaChbZnJhZ21lbnQsIHN0eWxlXSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZUxlbmd0aCArPSBmcmFnbWVudExlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy9pZiB0ZXh0IGFsaWdubWVudCB3YXMgc2V0LCBzZXQgbWFyZ2luL2luZGVudCBvZiBlYWNoIGxpbmVcblxuXG4gICAgICBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSAhPT0gdW5kZWZpbmVkICYmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnY2VudGVyJyB8fCBzdHlsZVsndGV4dC1hbGlnbiddID09PSAncmlnaHQnIHx8IHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdqdXN0aWZ5JykpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgobGluZXNbaV1bMF1bMF0sIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gazsgLy9pZiB0aGVyZSBpcyBtb3JlIHRoYW4gb24gbGluZSB3ZSBoYXZlIHRvIGNsb25lIHRoZSBzdHlsZSBvYmplY3QgYXMgYWxsIGxpbmVzIGhvbGQgYSByZWZlcmVuY2Ugb24gdGhpcyBvYmplY3RcblxuICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV0gPSBjbG9uZShsaW5lc1tpXVswXVsxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNwYWNlID0gbWF4TGluZUxlbmd0aCAtIGxlbmd0aDtcblxuICAgICAgICAgIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXVsnbWFyZ2luLWxlZnQnXSA9IHNwYWNlOyAvL2lmIGFsaWdubWVudCBpcyBub3QgcmlnaHQsIGl0IGhhcyB0byBiZSBjZW50ZXIgc28gc3BsaXQgdGhlIHNwYWNlIHRvIHRoZSBsZWZ0IGFuZCB0aGUgcmlnaHRcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXVsnbWFyZ2luLWxlZnQnXSA9IHNwYWNlIC8gMjsgLy9pZiBqdXN0aWZ5IHdhcyBzZXQsIGNhbGN1bGF0ZSB0aGUgd29yZCBzcGFjaW5nIGFuZCBkZWZpbmUgaW4gYnkgdXNpbmcgdGhlIGNzcyBwcm9wZXJ0eVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2p1c3RpZnknKSB7XG4gICAgICAgICAgICB2YXIgY291bnRTcGFjZXMgPSBsaW5lc1tpXVswXVswXS5zcGxpdCgnICcpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXVsnd29yZC1zcGFjaW5nJ10gPSBzcGFjZSAvIGNvdW50U3BhY2VzOyAvL2lnbm9yZSB0aGUgbGFzdCBsaW5lIGluIGp1c3RpZnkgbW9kZVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gbGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBsaW5lc1tpXVswXVsxXVsnd29yZC1zcGFjaW5nJ10gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGluZXM7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5SZW5kZXJUZXh0RnJhZ21lbnQgPSBmdW5jdGlvbiAodGV4dCwgc3R5bGUpIHtcbiAgICAgIHZhciBkZWZhdWx0Rm9udFNpemUsIGZvbnQsIG1heExpbmVIZWlnaHQ7XG4gICAgICBtYXhMaW5lSGVpZ2h0ID0gMDtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuXG4gICAgICBpZiAodGhpcy5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSB0aGlzLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gPCB0aGlzLnkgKyB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250U2l6ZSgpKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwiRVRcIiwgXCJRXCIsIFwiUVwiKTtcbiAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW1iZXIgPSB0aGlzLnBkZi5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyO1xuICAgICAgICBpZiAodGhpcy5wZGYuZ2V0TnVtYmVyT2ZQYWdlcygpID09PSBjdXJyZW50UGFnZU51bWJlcikgdGhpcy5wZGYuYWRkUGFnZSgpO1xuICAgICAgICBlbHNlIHRoaXMucGRmLnNldFBhZ2UoY3VycmVudFBhZ2VOdW1iZXIgKyAxKTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy5wZGYubWFyZ2luc19kb2MudG9wO1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcInFcIiwgXCJxXCIsIFwiQlRcIiwgdGhpcy5nZXRQZGZDb2xvcihzdHlsZS5jb2xvciksIHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcodGhpcy54KSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nKHRoaXMueSksIFwiVGRcIik7IC8vbW92ZSBjdXJzb3IgYnkgb25lIGxpbmUgb24gbmV3IHBhZ2VcblxuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgc3R5bGVbXCJsaW5lLWhlaWdodFwiXSwgc3R5bGVbXCJmb250LXNpemVcIl0pO1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZSgwLCAoLTEgKiBkZWZhdWx0Rm9udFNpemUgKiBtYXhMaW5lSGVpZ2h0KS50b0ZpeGVkKDIpLCBcIlRkXCIpO1xuICAgICAgfVxuXG4gICAgICBmb250ID0gdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udChzdHlsZVtcImZvbnQtZmFtaWx5XCJdLCBzdHlsZVtcImZvbnQtc3R5bGVcIl0pOyAvLyB0ZXh0IGNvbG9yXG5cbiAgICAgIHZhciBwZGZUZXh0Q29sb3IgPSB0aGlzLmdldFBkZkNvbG9yKHN0eWxlW1wiY29sb3JcIl0pO1xuXG4gICAgICBpZiAocGRmVGV4dENvbG9yICE9PSB0aGlzLmxhc3RUZXh0Q29sb3IpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUocGRmVGV4dENvbG9yKTtcbiAgICAgICAgdGhpcy5sYXN0VGV4dENvbG9yID0gcGRmVGV4dENvbG9yO1xuICAgICAgfSAvL3NldCB0aGUgd29yZCBzcGFjaW5nIGZvciBlLmcuIGp1c3RpZnkgc3R5bGVcblxuXG4gICAgICBpZiAoc3R5bGVbJ3dvcmQtc3BhY2luZyddICE9PSB1bmRlZmluZWQgJiYgc3R5bGVbJ3dvcmQtc3BhY2luZyddID4gMCkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShzdHlsZVsnd29yZC1zcGFjaW5nJ10udG9GaXhlZCgyKSwgXCJUd1wiKTtcbiAgICAgIH1cblxuXG4gICAgICB2YXIgcGRmRXNjYXBlMTYgPSBmdW5jdGlvbih0ZXh0LCBmb250KSB7XG4gICAgICAgIHZhciB3aWR0aHMgPSBmb250Lm1ldGFkYXRhLlVuaWNvZGUud2lkdGhzO1xuICAgICAgICB2YXIgcGFkeiA9IFtcIlwiLCBcIjBcIiwgXCIwMFwiLCBcIjAwMFwiLCBcIjAwMDBcIl07XG4gICAgICAgIHZhciBhciA9IFtcIlwiXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0ZXh0Lmxlbmd0aCwgdDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgIHQgPSBmb250Lm1ldGFkYXRhLmNoYXJhY3RlclRvR2x5cGgodGV4dC5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICBmb250Lm1ldGFkYXRhLmdseUlkc1VzZWQucHVzaCh0KTtcbiAgICAgICAgICBmb250Lm1ldGFkYXRhLnRvVW5pY29kZVt0XSA9IHRleHQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICBpZiAod2lkdGhzLmluZGV4T2YodCkgPT0gLTEpIHtcbiAgICAgICAgICAgIHdpZHRocy5wdXNoKHQpO1xuICAgICAgICAgICAgd2lkdGhzLnB1c2goW3BhcnNlSW50KGZvbnQubWV0YWRhdGEud2lkdGhPZkdseXBoKHQpLCAxMCldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHQgPT0gXCIwXCIpIHtcbiAgICAgICAgICAgIC8vU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiBjbWFwLlxuICAgICAgICAgICAgcmV0dXJuIGFyLmpvaW4oXCJcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHQgPSB0LnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIGFyLnB1c2gocGFkels0IC0gdC5sZW5ndGhdLCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyLmpvaW4oXCJcIik7XG4gICAgICB9O1xuXG4gICAgICB2YXIgdXRmOFRleHRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRleHQsIGZvbnQpIHtcbiAgICAgICAgdmFyIHRleHQgPSB0ZXh0IHx8IFwiXCI7XG4gICAgXG4gICAgICAgIHZhciBzdHIgPSBcIlwiLFxuICAgICAgICAgIHMgPSAwLFxuICAgICAgICAgIGNtYXBDb25maXJtO1xuICAgICAgICB2YXIgc3RyVGV4dCA9IFwiXCI7XG4gICAgICAgIHZhciBlbmNvZGluZyA9IGZvbnQuZW5jb2Rpbmc7XG4gICAgXG4gICAgICAgIGlmIChmb250LmVuY29kaW5nICE9PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0clRleHQgPSB0ZXh0O1xuICAgIFxuICAgICAgICBmb3IgKHMgPSAwOyBzIDwgc3RyVGV4dC5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICAgIGlmIChmb250Lm1ldGFkYXRhLmhhc093blByb3BlcnR5KFwiY21hcFwiKSkge1xuICAgICAgICAgICAgY21hcENvbmZpcm0gPSBmb250Lm1ldGFkYXRhLmNtYXAudW5pY29kZS5jb2RlTWFwW3N0clRleHRbc10uY2hhckNvZGVBdCgwKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY21hcENvbmZpcm0pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc3RyVGV4dFtzXS5jaGFyQ29kZUF0KDApIDwgMjU2ICYmXG4gICAgICAgICAgICAgIGZvbnQubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXCJVbmljb2RlXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgc3RyICs9IHN0clRleHRbc107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHIgKz0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyICs9IHN0clRleHRbc107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICBpZiAocGFyc2VJbnQoZm9udC5pZC5zbGljZSgxKSkgPCAxNCB8fCBlbmNvZGluZyA9PT0gXCJXaW5BbnNpRW5jb2RpbmdcIikge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZShzdHIsIGtleSlcbiAgICAgICAgICAgIC5zcGxpdChcIlwiKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbihjdikge1xuICAgICAgICAgICAgICByZXR1cm4gY3YuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT09IFwiSWRlbnRpdHktSFwiKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcGRmRXNjYXBlMTYoc3RyLCBmb250KTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTsgICAgICBcblxuICAgICAgLy8gdmFyIGVzY2FwZWRUZXh0ID0gdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHRleHQpO1xuICAgICAgLy8gdmFyIGVzY2FwZWRUZXh0ID0gdXRmOFRleHRGdW5jdGlvbih0ZXh0LCBmb250KTtcbiAgICAgIC8vIGlmKGVzY2FwZWRUZXh0ICE9IHRleHQpIHtcbiAgICAgIC8vICAgZXNjYXBlZFRleHQgPSBcIjxcIiArIGVzY2FwZWRUZXh0ICsgXCI+XCI7XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICBlc2NhcGVkVGV4dCA9IFwiKFwiICsgZXNjYXBlZFRleHQgKyBcIilcIjtcbiAgICAgIC8vIH1cblxuICAgICAgdmFyIGVzY2FwZWRUZXh0ID0gXCJcIjtcbiAgICAgIGlmKGZvbnQuZW5jb2RpbmcgIT09IFwiSWRlbnRpdHktSFwiKSB7XG4gICAgICAgIGVzY2FwZWRUZXh0ID0gXCIoXCIgKyB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUodGV4dCkgKyBcIilcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVzY2FwZWRUZXh0ID0gXCI8XCIgKyB1dGY4VGV4dEZ1bmN0aW9uKHRleHQsIGZvbnQpICsgXCI+XCI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwiL1wiICsgZm9udC5pZCwgKGRlZmF1bHRGb250U2l6ZSAqIHN0eWxlW1wiZm9udC1zaXplXCJdKS50b0ZpeGVkKDIpLCBcIlRmXCIsIGVzY2FwZWRUZXh0ICsgXCIgVGpcIik7IC8vc2V0IHRoZSB3b3JkIHNwYWNpbmcgYmFjayB0byBuZXV0cmFsID0+IDBcblxuICAgICAgaWYgKHN0eWxlWyd3b3JkLXNwYWNpbmcnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKDAsIFwiVHdcIik7XG4gICAgICB9XG4gICAgfTsgLy8gQWNjZXB0cyAjRkZGRkZGLCByZ2IoaW50LGludCxpbnQpLCBvciBDU1MgQ29sb3IgTmFtZVxuXG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZ2V0UGRmQ29sb3IgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIHZhciB0ZXh0Q29sb3I7XG4gICAgICB2YXIgciwgZywgYjtcbiAgICAgIHZhciByeCA9IC9yZ2JcXHMqXFwoXFxzKihcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkK1xccyopXFwpLztcbiAgICAgIHZhciBtID0gcnguZXhlYyhzdHlsZSk7XG5cbiAgICAgIGlmIChtICE9IG51bGwpIHtcbiAgICAgICAgciA9IHBhcnNlSW50KG1bMV0pO1xuICAgICAgICBnID0gcGFyc2VJbnQobVsyXSk7XG4gICAgICAgIGIgPSBwYXJzZUludChtWzNdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09IFwic3RyaW5nXCIgJiYgc3R5bGUuY2hhckF0KDApICE9ICcjJykge1xuICAgICAgICAgIHZhciByZ2JDb2xvciA9IG5ldyBSR0JDb2xvcihzdHlsZSk7XG5cbiAgICAgICAgICBpZiAocmdiQ29sb3Iub2spIHtcbiAgICAgICAgICAgIHN0eWxlID0gcmdiQ29sb3IudG9IZXgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUgPSAnIzAwMDAwMCc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgciA9IHN0eWxlLnN1YnN0cmluZygxLCAzKTtcbiAgICAgICAgciA9IHBhcnNlSW50KHIsIDE2KTtcbiAgICAgICAgZyA9IHN0eWxlLnN1YnN0cmluZygzLCA1KTtcbiAgICAgICAgZyA9IHBhcnNlSW50KGcsIDE2KTtcbiAgICAgICAgYiA9IHN0eWxlLnN1YnN0cmluZyg1LCA3KTtcbiAgICAgICAgYiA9IHBhcnNlSW50KGIsIDE2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJyAmJiAvXiNbMC05QS1GYS1mXXs2fSQvLnRlc3QocikpIHtcbiAgICAgICAgdmFyIGhleCA9IHBhcnNlSW50KHIuc3Vic3RyKDEpLCAxNik7XG4gICAgICAgIHIgPSBoZXggPj4gMTYgJiAyNTU7XG4gICAgICAgIGcgPSBoZXggPj4gOCAmIDI1NTtcbiAgICAgICAgYiA9IGhleCAmIDI1NTtcbiAgICAgIH1cblxuICAgICAgdmFyIGYzID0gdGhpcy5mMztcblxuICAgICAgaWYgKHIgPT09IDAgJiYgZyA9PT0gMCAmJiBiID09PSAwIHx8IHR5cGVvZiBnID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0ZXh0Q29sb3IgPSBmMyhyIC8gMjU1KSArICcgZyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0Q29sb3IgPSBbZjMociAvIDI1NSksIGYzKGcgLyAyNTUpLCBmMyhiIC8gMjU1KSwgJ3JnJ10uam9pbignICcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGV4dENvbG9yO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZjMgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoMyk7IC8vIEllLCAlLjNmXG4gICAgfSwgUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlclBhcmFncmFwaCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgdmFyIGJsb2Nrc3R5bGUsIGRlZmF1bHRGb250U2l6ZSwgZm9udFRvVW5pdFJhdGlvLCBmcmFnbWVudHMsIGksIGwsIGxpbmUsIGxpbmVzLCBtYXhMaW5lSGVpZ2h0LCBvdXQsIHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXIsIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlLCBwcmlvcmJsb2Nrc3R5bGUsIHN0eWxlcywgZm9udFNpemU7XG4gICAgICBmcmFnbWVudHMgPSBQdXJnZVdoaXRlU3BhY2UodGhpcy5wYXJhZ3JhcGgudGV4dCk7XG4gICAgICBzdHlsZXMgPSB0aGlzLnBhcmFncmFwaC5zdHlsZTtcbiAgICAgIGJsb2Nrc3R5bGUgPSB0aGlzLnBhcmFncmFwaC5ibG9ja3N0eWxlO1xuICAgICAgcHJpb3JibG9ja3N0eWxlID0gdGhpcy5wYXJhZ3JhcGgucHJpb3JibG9ja3N0eWxlIHx8IHt9O1xuICAgICAgdGhpcy5wYXJhZ3JhcGggPSB7XG4gICAgICAgIHRleHQ6IFtdLFxuICAgICAgICBzdHlsZTogW10sXG4gICAgICAgIGJsb2Nrc3R5bGU6IHt9LFxuICAgICAgICBwcmlvcmJsb2Nrc3R5bGU6IGJsb2Nrc3R5bGVcbiAgICAgIH07XG5cbiAgICAgIGlmICghZnJhZ21lbnRzLmpvaW4oXCJcIikudHJpbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGluZXMgPSB0aGlzLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzKGZyYWdtZW50cywgc3R5bGVzKTtcbiAgICAgIGxpbmUgPSB2b2lkIDA7XG4gICAgICBtYXhMaW5lSGVpZ2h0ID0gdm9pZCAwO1xuICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7XG4gICAgICBmb250VG9Vbml0UmF0aW8gPSBkZWZhdWx0Rm9udFNpemUgLyB0aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgIHRoaXMucHJpb3JNYXJnaW5Cb3R0b20gPSB0aGlzLnByaW9yTWFyZ2luQm90dG9tIHx8IDA7XG4gICAgICBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZSA9IChNYXRoLm1heCgoYmxvY2tzdHlsZVtcIm1hcmdpbi10b3BcIl0gfHwgMCkgLSB0aGlzLnByaW9yTWFyZ2luQm90dG9tLCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy10b3BcIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgcGFyYWdyYXBoc3BhY2luZ19hZnRlciA9ICgoYmxvY2tzdHlsZVtcIm1hcmdpbi1ib3R0b21cIl0gfHwgMCkgKyAoYmxvY2tzdHlsZVtcInBhZGRpbmctYm90dG9tXCJdIHx8IDApKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgIHRoaXMucHJpb3JNYXJnaW5Cb3R0b20gPSBibG9ja3N0eWxlW1wibWFyZ2luLWJvdHRvbVwiXSB8fCAwO1xuXG4gICAgICBpZiAoYmxvY2tzdHlsZVsncGFnZS1icmVhay1iZWZvcmUnXSA9PT0gJ2Fsd2F5cycpIHtcbiAgICAgICAgdGhpcy5wZGYuYWRkUGFnZSgpO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZSA9ICgoYmxvY2tzdHlsZVtcIm1hcmdpbi10b3BcIl0gfHwgMCkgKyAoYmxvY2tzdHlsZVtcInBhZGRpbmctdG9wXCJdIHx8IDApKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgIH1cblxuICAgICAgb3V0ID0gdGhpcy5wZGYuaW50ZXJuYWwud3JpdGU7XG4gICAgICBpID0gdm9pZCAwO1xuICAgICAgbCA9IHZvaWQgMDtcbiAgICAgIHRoaXMueSArPSBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZTtcbiAgICAgIG91dChcInFcIiwgXCJCVCAwIGdcIiwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTsgLy9zdG9yZXMgdGhlIGN1cnJlbnQgaW5kZW50IG9mIGN1cnNvciBwb3NpdGlvblxuXG4gICAgICB2YXIgY3VycmVudEluZGVudCA9IDA7XG5cbiAgICAgIHdoaWxlIChsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgbGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gICAgICAgIG1heExpbmVIZWlnaHQgPSAwO1xuICAgICAgICBpID0gMDtcbiAgICAgICAgbCA9IGxpbmUubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgICAgaWYgKGxpbmVbaV1bMF0udHJpbSgpKSB7XG4gICAgICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgbGluZVtpXVsxXVtcImxpbmUtaGVpZ2h0XCJdLCBsaW5lW2ldWzFdW1wiZm9udC1zaXplXCJdKTtcbiAgICAgICAgICAgIGZvbnRTaXplID0gbGluZVtpXVsxXVtcImZvbnQtc2l6ZVwiXSAqIDc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9IC8vaWYgd2UgaGF2ZSB0byBtb3ZlIHRoZSBjdXJzb3IgdG8gYWRhcHQgdGhlIGluZGVudFxuXG5cbiAgICAgICAgdmFyIGluZGVudE1vdmUgPSAwO1xuICAgICAgICB2YXIgd2FudGVkSW5kZW50ID0gMDsgLy9pZiBhIG1hcmdpbiB3YXMgYWRkZWQgKGJ5IGUuZy4gYSB0ZXh0LWFsaWdubWVudCksIG1vdmUgdGhlIGN1cnNvclxuXG4gICAgICAgIGlmIChsaW5lWzBdWzFdW1wibWFyZ2luLWxlZnRcIl0gIT09IHVuZGVmaW5lZCAmJiBsaW5lWzBdWzFdW1wibWFyZ2luLWxlZnRcIl0gPiAwKSB7XG4gICAgICAgICAgd2FudGVkSW5kZW50ID0gdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyhsaW5lWzBdWzFdW1wibWFyZ2luLWxlZnRcIl0pO1xuICAgICAgICAgIGluZGVudE1vdmUgPSB3YW50ZWRJbmRlbnQgLSBjdXJyZW50SW5kZW50O1xuICAgICAgICAgIGN1cnJlbnRJbmRlbnQgPSB3YW50ZWRJbmRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5kZW50TW9yZSA9IE1hdGgubWF4KGJsb2Nrc3R5bGVbXCJtYXJnaW4tbGVmdFwiXSB8fCAwLCAwKSAqIGZvbnRUb1VuaXRSYXRpbzsgLy9tb3ZlIHRoZSBjdXJzb3JcblxuICAgICAgICBvdXQoaW5kZW50TW92ZSArIGluZGVudE1vcmUsICgtMSAqIGRlZmF1bHRGb250U2l6ZSAqIG1heExpbmVIZWlnaHQpLnRvRml4ZWQoMiksIFwiVGRcIik7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBsID0gbGluZS5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICBpZiAobGluZVtpXVswXSkge1xuICAgICAgICAgICAgdGhpcy5SZW5kZXJUZXh0RnJhZ21lbnQobGluZVtpXVswXSwgbGluZVtpXVsxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy55ICs9IG1heExpbmVIZWlnaHQgKiBmb250VG9Vbml0UmF0aW87IC8vaWYgc29tZSB3YXRjaGVyIGZ1bmN0aW9uIHdhcyBleGVjdXRlZCBzdWNjZXNzZnVsLCBzbyBlLmcuIG1hcmdpbiBhbmQgd2lkdGhzIHdlcmUgY2hhbmdlZCxcbiAgICAgICAgLy9yZXNldCBsaW5lIGRyYXdpbmcgYW5kIGNhbGN1bGF0ZSBwb3NpdGlvbiBhbmQgbGluZXMgYWdhaW5cbiAgICAgICAgLy9lLmcuIHRvIHN0b3AgdGV4dCBmbG9hdGluZyBhcm91bmQgYW4gaW1hZ2VcblxuICAgICAgICBpZiAodGhpcy5leGVjdXRlV2F0Y2hGdW5jdGlvbnMobGluZVswXVsxXSkgJiYgbGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBsb2NhbEZyYWdtZW50cyA9IFtdO1xuICAgICAgICAgIHZhciBsb2NhbFN0eWxlcyA9IFtdOyAvL2NyZWF0ZSBmcmFnbWVudCBhcnJheSBvZlxuXG4gICAgICAgICAgbGluZXMuZm9yRWFjaChmdW5jdGlvbiAobG9jYWxMaW5lKSB7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICB2YXIgbCA9IGxvY2FsTGluZS5sZW5ndGg7XG5cbiAgICAgICAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgICAgICAgIGlmIChsb2NhbExpbmVbaV1bMF0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbEZyYWdtZW50cy5wdXNoKGxvY2FsTGluZVtpXVswXSArICcgJyk7XG4gICAgICAgICAgICAgICAgbG9jYWxTdHlsZXMucHVzaChsb2NhbExpbmVbaV1bMV0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pOyAvL3NwbGl0IGxpbmVzIGFnYWluIGR1ZSB0byBwb3NzaWJsZSBjb29yZGluYXRlIGNoYW5nZXNcblxuICAgICAgICAgIGxpbmVzID0gdGhpcy5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyhQdXJnZVdoaXRlU3BhY2UobG9jYWxGcmFnbWVudHMpLCBsb2NhbFN0eWxlcyk7IC8vcmVwb3NpdGlvbiB0aGUgY3VycmVudCBjdXJzb3JcblxuICAgICAgICAgIG91dChcIkVUXCIsIFwiUVwiKTtcbiAgICAgICAgICBvdXQoXCJxXCIsIFwiQlQgMCBnXCIsIHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcodGhpcy54KSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nKHRoaXMueSksIFwiVGRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNiICYmIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNiLmNhbGwodGhpcywgdGhpcy54IC0gOSwgdGhpcy55IC0gZm9udFNpemUgLyAyKTtcbiAgICAgIH1cblxuICAgICAgb3V0KFwiRVRcIiwgXCJRXCIpO1xuICAgICAgcmV0dXJuIHRoaXMueSArPSBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc2V0QmxvY2tCb3VuZGFyeSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUGFyYWdyYXBoKGNiKTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNldEJsb2NrU3R5bGUgPSBmdW5jdGlvbiAoY3NzKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhZ3JhcGguYmxvY2tzdHlsZSA9IGNzcztcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmFkZFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY3NzKSB7XG4gICAgICB0aGlzLnBhcmFncmFwaC50ZXh0LnB1c2godGV4dCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhZ3JhcGguc3R5bGUucHVzaChjc3MpO1xuICAgIH07XG5cbiAgICBGb250TmFtZURCID0ge1xuICAgICAgaGVsdmV0aWNhOiBcImhlbHZldGljYVwiLFxuICAgICAgXCJzYW5zLXNlcmlmXCI6IFwiaGVsdmV0aWNhXCIsXG4gICAgICBcInRpbWVzIG5ldyByb21hblwiOiBcInRpbWVzXCIsXG4gICAgICBzZXJpZjogXCJ0aW1lc1wiLFxuICAgICAgdGltZXM6IFwidGltZXNcIixcbiAgICAgIG1vbm9zcGFjZTogXCJjb3VyaWVyXCIsXG4gICAgICBjb3VyaWVyOiBcImNvdXJpZXJcIlxuICAgIH07XG4gICAgRm9udFdlaWdodE1hcCA9IHtcbiAgICAgIDEwMDogXCJub3JtYWxcIixcbiAgICAgIDIwMDogXCJub3JtYWxcIixcbiAgICAgIDMwMDogXCJub3JtYWxcIixcbiAgICAgIDQwMDogXCJub3JtYWxcIixcbiAgICAgIDUwMDogXCJib2xkXCIsXG4gICAgICA2MDA6IFwiYm9sZFwiLFxuICAgICAgNzAwOiBcImJvbGRcIixcbiAgICAgIDgwMDogXCJib2xkXCIsXG4gICAgICA5MDA6IFwiYm9sZFwiLFxuICAgICAgbm9ybWFsOiBcIm5vcm1hbFwiLFxuICAgICAgYm9sZDogXCJib2xkXCIsXG4gICAgICBib2xkZXI6IFwiYm9sZFwiLFxuICAgICAgbGlnaHRlcjogXCJub3JtYWxcIlxuICAgIH07XG4gICAgRm9udFN0eWxlTWFwID0ge1xuICAgICAgbm9ybWFsOiBcIm5vcm1hbFwiLFxuICAgICAgaXRhbGljOiBcIml0YWxpY1wiLFxuICAgICAgb2JsaXF1ZTogXCJpdGFsaWNcIlxuICAgIH07XG4gICAgVGV4dEFsaWduTWFwID0ge1xuICAgICAgbGVmdDogXCJsZWZ0XCIsXG4gICAgICByaWdodDogXCJyaWdodFwiLFxuICAgICAgY2VudGVyOiBcImNlbnRlclwiLFxuICAgICAganVzdGlmeTogXCJqdXN0aWZ5XCJcbiAgICB9O1xuICAgIEZsb2F0TWFwID0ge1xuICAgICAgbm9uZTogJ25vbmUnLFxuICAgICAgcmlnaHQ6ICdyaWdodCcsXG4gICAgICBsZWZ0OiAnbGVmdCdcbiAgICB9O1xuICAgIENsZWFyTWFwID0ge1xuICAgICAgbm9uZTogJ25vbmUnLFxuICAgICAgYm90aDogJ2JvdGgnXG4gICAgfTtcbiAgICBVbml0ZWROdW1iZXJNYXAgPSB7XG4gICAgICBub3JtYWw6IDFcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIEhUTUwtZm9ybWF0dGVkIHRleHQgaW50byBmb3JtYXR0ZWQgUERGIHRleHQuXG4gICAgICpcbiAgICAgKiBOb3RlczpcbiAgICAgKiAyMDEyLTA3LTE4XG4gICAgICogUGx1Z2luIHJlbGllcyBvbiBoYXZpbmcgYnJvd3NlciwgRE9NIGFyb3VuZC4gVGhlIEhUTUwgaXMgcHVzaGVkIGludG8gZG9tIGFuZCB0cmF2ZXJzZWQuXG4gICAgICogUGx1Z2luIHJlbGllcyBvbiBqUXVlcnkgZm9yIENTUyBleHRyYWN0aW9uLlxuICAgICAqIFRhcmdldGluZyBIVE1MIG91dHB1dCBmcm9tIE1hcmtkb3duIHRlbXBsYXRpbmcsIHdoaWNoIGlzIGEgdmVyeSBzaW1wbGVcbiAgICAgKiBtYXJrdXAgLSBkaXYsIHNwYW4sIGVtLCBzdHJvbmcsIHAuIE5vIGJyLWJhc2VkIHBhcmFncmFwaCBzZXBhcmF0aW9uIHN1cHBvcnRlZCBleHBsaWNpdGx5IChidXQgc3RpbGwgbWF5IHdvcmsuKVxuICAgICAqIEltYWdlcywgdGFibGVzIGFyZSBOT1Qgc3VwcG9ydGVkLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBIVE1MIHtTdHJpbmd8T2JqZWN0fSBIVE1MLWZvcm1hdHRlZCB0ZXh0LCBvciBwb2ludGVyIHRvIERPTSBlbGVtZW50IHRoYXQgaXMgdG8gYmUgcmVuZGVyZWQgaW50byBQREYuXG4gICAgICogQHBhcmFtIHgge051bWJlcn0gc3RhcnRpbmcgWCBjb29yZGluYXRlIGluIGpzUERGIGluc3RhbmNlJ3MgZGVjbGFyZWQgdW5pdHMuXG4gICAgICogQHBhcmFtIHkge051bWJlcn0gc3RhcnRpbmcgWSBjb29yZGluYXRlIGluIGpzUERGIGluc3RhbmNlJ3MgZGVjbGFyZWQgdW5pdHMuXG4gICAgICogQHBhcmFtIHNldHRpbmdzIHtPYmplY3R9IEFkZGl0aW9uYWwgLyBvcHRpb25hbCB2YXJpYWJsZXMgY29udHJvbGxpbmcgcGFyc2luZywgcmVuZGVyaW5nLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGpzUERGIGluc3RhbmNlXG4gICAgICovXG5cbiAgICBqc1BERkFQSS5mcm9tSFRNTCA9IGZ1bmN0aW9uIChIVE1MLCB4LCB5LCBzZXR0aW5ncywgY2FsbGJhY2ssIG1hcmdpbnMpIHtcblxuICAgICAgdGhpcy5tYXJnaW5zX2RvYyA9IG1hcmdpbnMgfHwge1xuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGJvdHRvbTogMFxuICAgICAgfTtcbiAgICAgIGlmICghc2V0dGluZ3MpIHNldHRpbmdzID0ge307XG4gICAgICBpZiAoIXNldHRpbmdzLmVsZW1lbnRIYW5kbGVycykgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzID0ge307XG4gICAgICByZXR1cm4gcHJvY2Vzcyh0aGlzLCBIVE1MLCBpc05hTih4KSA/IDQgOiB4LCBpc05hTih5KSA/IDQgOiB5LCBzZXR0aW5ncywgY2FsbGJhY2spO1xuICAgIH07XG4gIH0pKGpzcGRmLmpzUERGLkFQSSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qc1xuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==