xdbc 1.0.214 → 1.0.215
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.js +2 -2
- package/package.json +1 -1
- package/src/DBC/OR.ts +1 -1
- package/src/DBC/REGEX.ts +1 -1
package/dist/bundle.js
CHANGED
|
@@ -1581,7 +1581,7 @@ class REGEX extends _DBC__WEBPACK_IMPORTED_MODULE_0__.DBC {
|
|
|
1581
1581
|
* @throws {@link DBC.Infringement} if the value does not match the regular expression. */
|
|
1582
1582
|
static tsCheck(toCheck, expression, hint = undefined, id = undefined) {
|
|
1583
1583
|
const result = REGEX.checkAlgorithm(toCheck, expression);
|
|
1584
|
-
if (result) {
|
|
1584
|
+
if (result === true) {
|
|
1585
1585
|
return toCheck;
|
|
1586
1586
|
}
|
|
1587
1587
|
throw new _DBC__WEBPACK_IMPORTED_MODULE_0__.DBC.Infringement(`${id ? `(${id}) ` : ""}${result}${hint ? ` ✨ ${hint} ✨` : ""}`);
|
|
@@ -2294,4 +2294,4 @@ catch (X) {
|
|
|
2294
2294
|
|
|
2295
2295
|
/******/ })()
|
|
2296
2296
|
;
|
|
2297
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3hkYmMvLi9zcmMvREJDLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0FFLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0NPTVBBUklTT04udHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvQ09NUEFSSVNPTi9HUkVBVEVSLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0NPTVBBUklTT04vR1JFQVRFUl9PUl9FUVVBTC50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9DT01QQVJJU09OL0xFU1MudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvQ09NUEFSSVNPTi9MRVNTX09SX0VRVUFMLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0VRLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0VRL0RJRkZFUkVOVC50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9JTlNUQU5DRS50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9SRUdFWC50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9UWVBFLnRzIiwid2VicGFjazovL3hkYmMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8veGRiYy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8veGRiYy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3hkYmMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RlbW8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm92aWRlcyBhICoqRCoqZXNpZ24gKipCKip5ICoqQyoqb250cmFjdCBGcmFtZXdvcmsgdXNpbmcgZGVjb3JhdG9ycy5cbiAqXG4gKiBAcmVtYXJrc1xuICogTWFpbnRhaW5lcjogQ2FsbGFyaSwgU2FsdmF0b3JlIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIERCQyB7XG4gICAgLyoqIEV2aWN0cyB0aGUgb2xkZXN0IGVudHJ5IGlmIHRoZSBjYWNoZSBleGNlZWRzIHRoZSBtYXhpbXVtIHNpemUuICovXG4gICAgc3RhdGljIGV2aWN0SWZOZWVkZWQoY2FjaGUpIHtcbiAgICAgICAgaWYgKGNhY2hlLnNpemUgPiBEQkMuTUFYX0NBQ0hFX1NJWkUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZGVzdCA9IGNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY2FjaGUuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldEhvc3QoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogZ2xvYmFsVGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldERCQyhkYmMpIHtcbiAgICAgICAgaWYgKGRiYyBpbnN0YW5jZW9mIERCQylcbiAgICAgICAgICAgIHJldHVybiBkYmM7XG4gICAgICAgIGNvbnN0IHBhdGggPSBkYmMgIT09IG51bGwgJiYgZGJjICE9PSB2b2lkIDAgPyBkYmMgOiBcIldhWENvZGUuREJDXCI7XG4gICAgICAgIGlmIChEQkMuZGJjQ2FjaGUuaGFzKHBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gREJDLmRiY0NhY2hlLmdldChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IERCQy5yZXNvbHZlREJDUGF0aChEQkMuZ2V0SG9zdCgpLCBwYXRoKTtcbiAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICBEQkMuZXZpY3RJZk5lZWRlZChEQkMuZGJjQ2FjaGUpO1xuICAgICAgICAgICAgREJDLmRiY0NhY2hlLnNldChwYXRoLCByZXNvbHZlZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbWERCQ10gREJDIGluc3RhbmNlIG5vdCBmb3VuZCBhdCBwYXRoIFwiJHtwYXRofVwiLiBFbnN1cmUgYSBEQkMgaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCB0aGVyZS5gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSB1bmlxdWUga2V5IGZvciBzdG9yaW5nIHBhcmFtZXRlciB2YWx1ZSByZXF1ZXN0cy5cbiAgICAgKiBGb3JtYXQ6IFwiQ2xhc3NOYW1lOm1ldGhvZE5hbWVcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXF1ZXN0S2V5KHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyB0YXJnZXQubmFtZVxuICAgICAgICAgICAgOiAoKF9hID0gdGFyZ2V0LmNvbnN0cnVjdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgfHwgXCJVbmtub3duXCI7XG4gICAgICAgIHJldHVybiBgJHtjbGFzc05hbWV9OiR7U3RyaW5nKG1ldGhvZE5hbWUpfWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2UgYSByZXF1ZXN0IHRvIGdldCB0aGUgdmFsdWUgb2YgYSBjZXJ0YWluIHBhcmFtZXRlciBvZiBzcGVjaWZpYyBtZXRob2QgaW4gYSBzcGVjaWZpYyB7QGxpbmsgb2JqZWN0IH0uXG4gICAgICogVGhhdCByZXF1ZXN0IGdldHMgZW5saXN0ZWQgaW4ge0BsaW5rIHBhcmFtVmFsdWVSZXF1ZXN0cyB9IHdoaWNoIGlzIHVzZWQgYnkge0BsaW5rIFBhcmFtdmFsdWVQcm92aWRlcn0gdG8gaW52b2tlIHRoZVxuICAgICAqIGdpdmVuIFwicmVjZXB0b3JcIiB3aXRoIHRoZSBwYXJhbWV0ZXIgdmFsdWUgc3RvcmVkIGluIHRoZXJlLiBUaHVzIGEgcGFyYW1ldGVyIGRlY29yYXRvciB1c2luZyB0aGlzIG1ldGhvZCB3aWxsXG4gICAgICogbm90IHJlY2VpdmUgYW55IHZhbHVlIG9mIHRoZSB0b3AgbWV0aG9kIGlzIG5vdCB0YWdnZWQgd2l0aCB7QGxpbmsgUGFyYW12YWx1ZVByb3ZpZGVyfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXRcdFx0VGhlIHtAbGluayBvYmplY3QgfSBjb250YWluaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUgcGFyYW1ldGVyIHdoaWNoJ3MgdmFsdWUgaXMgcmVxdWVzdGVkLlxuICAgICAqIEBwYXJhbSBtZXRob2ROYW1lXHRUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdpdGggdGhlIHBhcmFtZXRlciB3aGljaCdzIHZhbHVlIGlzIHJlcXVlc3RlZC5cbiAgICAgKiBAcGFyYW0gaW5kZXhcdFx0XHRUaGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB3aGljaCdzIHZhbHVlIGlzIHJlcXVlc3RlZC5cbiAgICAgKiBAcGFyYW0gcmVjZXB0b3JcdFx0VGhlIG1ldGhvZCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlci12YWx1ZSBzaGFsbCBiZSBwYXNzZWQgdG8gd2hlbiBpdCBiZWNvbWVzIGF2YWlsYWJsZS4gKi9cbiAgICBzdGF0aWMgcmVxdWVzdFBhcmFtVmFsdWUodGFyZ2V0LCBtZXRob2ROYW1lLCBpbmRleCwgXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBHb3R0YSBiZSBhbnkgc2luY2UgcGFyYW1ldGVyLXZhbHVlcyBtYXkgYmUgdW5kZWZpbmVkLlxuICAgIHJlY2VwdG9yKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qga2V5ID0gREJDLmdldFJlcXVlc3RLZXkodGFyZ2V0LCBtZXRob2ROYW1lKTtcbiAgICAgICAgaWYgKERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTWFwID0gREJDLnBhcmFtVmFsdWVSZXF1ZXN0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChwYXJhbU1hcC5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgKF9hID0gcGFyYW1NYXAuZ2V0KGluZGV4KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnB1c2gocmVjZXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyYW1NYXAuc2V0KGluZGV4LCBuZXcgQXJyYXkocmVjZXB0b3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuc2V0KGtleSwgbmV3IE1hcChbXG4gICAgICAgICAgICAgICAgW2luZGV4LCBuZXcgQXJyYXkocmVjZXB0b3IpXSxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgaGFuZGxlIGJvdGggbWV0aG9kIGFuZCBjbGFzcyBkZWNvcmF0b3Igc2lnbmF0dXJlc1xuICAgIHN0YXRpYyBQYXJhbXZhbHVlUHJvdmlkZXIoLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gI3JlZ2lvbiBDbGFzcyBkZWNvcmF0b3IgcGF0aFxuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IGFjY2VwdCBhbnkgY29uc3RydWN0b3Igc2lnbmF0dXJlXG4gICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGFyZ3NbMF07XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgJHtjb25zdHJ1Y3Rvci5uYW1lfTp1bmRlZmluZWRgO1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IGFjY2VwdCBhbnkgY29uc3RydWN0b3Igc2lnbmF0dXJlXG4gICAgICAgICAgICBjb25zdCBXcmFwcGVkQ2xhc3MgPSBjbGFzcyBleHRlbmRzIGNvbnN0cnVjdG9yIHtcbiAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgYWNjZXB0IGFueSBjb25zdHJ1Y3RvciBzaWduYXR1cmVcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5jdG9yQXJncykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoREJDLnBhcmFtVmFsdWVSZXF1ZXN0cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1NYXAgPSBEQkMucGFyYW1WYWx1ZVJlcXVlc3RzLmdldChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBwYXJhbU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBjdG9yQXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWNlcHRvciBvZiBwYXJhbU1hcC5nZXQoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlcHRvcihjdG9yQXJnc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyYXBwZWRDbGFzcywgXCJuYW1lXCIsIHsgdmFsdWU6IGNvbnN0cnVjdG9yLm5hbWUgfSk7XG4gICAgICAgICAgICByZXR1cm4gV3JhcHBlZENsYXNzO1xuICAgICAgICAgICAgLy8gI2VuZHJlZ2lvbiBDbGFzcyBkZWNvcmF0b3IgcGF0aFxuICAgICAgICB9XG4gICAgICAgIC8vICNyZWdpb24gTWV0aG9kIGRlY29yYXRvciBwYXRoXG4gICAgICAgIGNvbnN0IFt0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yXSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgY29uc3QgaXNTdGF0aWMgPSB0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogR290dGEgYmUgYW55IHNpbmNlIHBhcmFtZXRlci12YWx1ZXMgbWF5IGJlIHVuZGVmaW5lZC5cbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5tZXRob2RBcmdzKSB7XG4gICAgICAgICAgICAvLyAjcmVnaW9uICAgQ2hlY2sgaWYgYSB2YWx1ZSBvZiBvbmUgb2YgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgaXQgdG8gdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgcmVjZXB0b3IsIGlmIHNvLlxuICAgICAgICAgICAgY29uc3QgYWN0dWFsVGFyZ2V0ID0gaXNTdGF0aWMgPyB0aGlzIDogdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IERCQy5nZXRSZXF1ZXN0S2V5KGFjdHVhbFRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU1hcCA9IERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBwYXJhbU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgbWV0aG9kQXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVjZXB0b3Igb2YgcGFyYW1NYXAuZ2V0KGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VwdG9yKG1ldGhvZEFyZ3NbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIHBhcmFtZXRlciB2YWx1ZSByZXF1ZXN0cyBmb3VuZCBmb3Iga2V5OlwiLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gI2VuZHJlZ2lvblx0Q2hlY2sgaWYgYSB2YWx1ZSBvZiBvbmUgb2YgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgaXQgdG8gdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgcmVjZXB0b3IsIGlmIHNvLlxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIG1ldGhvZEFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBNZXRob2QgZGVjb3JhdG9yIHBhdGhcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBQYXJhbWV0ZXItdmFsdWUgcmVxdWVzdHMuXG4gICAgLy8gI3JlZ2lvbiBDbGFzc1xuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHktZGVjb3JhdG9yIGZhY3Rvcnkgc2VydmluZyBhcyBhICoqRCoqZXNpZ24gKipCKip5ICoqQyoqb250cmFjdCBJbnZhcmlhbnQuXG4gICAgICogVGhpcyBpbnZhcmlhbnQgYWltcyB0byBjaGVjayB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5vdCB0aGUgdmFsdWUgdG8gYmUgZ2V0IG9yIHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cmFjdHMgVGhlIHtAbGluayBEQkMgfS1Db250cmFjdHMgdGhlIHZhbHVlIHNoYWxsIHVwaG9sZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgXHRBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gd2hlbmV2ZXIgdGhlIHByb3BlcnR5IGlzIHRyaWVkIHRvIGJlIGdldCBvciBzZXQgd2l0aG91dCB0aGUgaW5zdGFuY2Ugb2YgaXQncyBjbGFzc1xuICAgICAqIFx0XHRcdGZ1bGZpbGxpbmcgdGhlIHNwZWNpZmllZCAqKmNvbnRyYWN0cyoqLiAqL1xuICAgIHN0YXRpYyBkZWNDbGFzc0ludmFyaWFudChjb250cmFjdHMsIHBhdGggPSB1bmRlZmluZWQsIGRiYyA9IFwiV2FYQ29kZS5EQkNcIikge1xuICAgICAgICBsZXQgZGJjSW5zdGFuY2U7XG4gICAgICAgIHJldHVybiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikgPT4ge1xuICAgICAgICAgICAgaWYgKCFkYmNJbnN0YW5jZSlcbiAgICAgICAgICAgICAgICBkYmNJbnN0YW5jZSA9IERCQy5nZXREQkMoZGJjKTtcbiAgICAgICAgICAgIGlmICghZGJjSW5zdGFuY2UuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tJbnZhcmlhbnRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTZXR0ZXIgPSBkZXNjcmlwdG9yLnNldDtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsR2V0dGVyID0gZGVzY3JpcHRvci5nZXQ7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBpbnRlcmNlcHQgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgLy8gI3JlZ2lvbiBSZXBsYWNlIG9yaWdpbmFsIHByb3BlcnR5LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGRiY0luc3RhbmNlID09PSBudWxsIHx8IGRiY0luc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYmNJbnN0YW5jZS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlID0gcGF0aCA/IERCQy5yZXNvbHZlKHRoaXMsIHBhdGgpIDogdGhpcztcbiAgICAgICAgICAgICAgICAgICAgLy8gI3JlZ2lvbiBDaGVjayBpZiBhbGwgXCJjb250cmFjdHNcIiBhcmUgZnVsZmlsbGVkLlxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyYWN0IG9mIGNvbnRyYWN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udHJhY3QuY2hlY2socmVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJjSW5zdGFuY2UgPT09IG51bGwgfHwgZGJjSW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRiY0luc3RhbmNlLnJlcG9ydEZpZWxkSW5mcmluZ2VtZW50KHJlc3VsdCwgdGFyZ2V0LCBwYXRoLCBwcm9wZXJ0eUtleSwgcmVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAjZW5kcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEdldHRlciA/IG9yaWdpbmFsR2V0dGVyW3Byb3BlcnR5S2V5XSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0KG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGRiY0luc3RhbmNlID09PSBudWxsIHx8IGRiY0luc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYmNJbnN0YW5jZS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlID0gcGF0aCA/IERCQy5yZXNvbHZlKHRoaXMsIHBhdGgpIDogdGhpcztcbiAgICAgICAgICAgICAgICAgICAgLy8gI3JlZ2lvbiBDaGVjayBpZiBhbGwgXCJjb250cmFjdHNcIiBhcmUgZnVsZmlsbGVkLlxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyYWN0IG9mIGNvbnRyYWN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udHJhY3QuY2hlY2socmVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJjSW5zdGFuY2UgPT09IG51bGwgfHwgZGJjSW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRiY0luc3RhbmNlLnJlcG9ydEZpZWxkSW5mcmluZ2VtZW50KHJlc3VsdCwgdGFyZ2V0LCBwYXRoLCBwcm9wZXJ0eUtleSwgcmVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAjZW5kcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gI2VuZHJlZ2lvbiBSZXBsYWNlIG9yaWdpbmFsIHByb3BlcnR5LlxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENsYXNzXG4gICAgLy8gI3JlZ2lvbiBJbnZhcmlhbnRcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5LWRlY29yYXRvciBmYWN0b3J5IHNlcnZpbmcgYXMgYSAqKkQqKmVzaWduICoqQioqeSAqKkMqKm9udHJhY3QgSW52YXJpYW50LlxuICAgICAqIFNpbmNlIHRoZSB2YWx1ZSBtdXN0IGJlIGluaXRpYWxpemVkIG9yIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCAqKmNvbnRyYWN0cyoqIHRoZSB2YWx1ZSB3aWxsIG9ubHkgYmUgY2hlY2tlZFxuICAgICAqIHdoZW4gYXNzaWduaW5nIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRyYWN0cyBUaGUge0BsaW5rIERCQyB9LUNvbnRyYWN0cyB0aGUgdmFsdWUgc2hhbGwgdXBob2xkLlxuICAgICAqXG4gICAgICogQHRocm93cyBcdEEge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfSB3aGVuZXZlciB0aGUgcHJvcGVydHkgaXMgdHJpZWQgdG8gYmUgc2V0IHRvIGEgdmFsdWUgdGhhdCBkb2VzIG5vdCBjb21wbHkgdG8gdGhlXG4gICAgICogXHRcdFx0c3BlY2lmaWVkICoqY29udHJhY3RzKiosIGJ5IHRoZSByZXR1cm5lZCBtZXRob2QuKi9cbiAgICBzdGF0aWMgZGVjSW52YXJpYW50KGNvbnRyYWN0cywgcGF0aCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBkYmNJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRiY0luc3RhbmNlKVxuICAgICAgICAgICAgICAgIGRiY0luc3RhbmNlID0gREJDLmdldERCQyhkYmMpO1xuICAgICAgICAgICAgaWYgKCFkYmNJbnN0YW5jZS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBpbnRlcmNlcHQgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgLy8gI3JlZ2lvbiBSZXBsYWNlIG9yaWdpbmFsIHByb3BlcnR5LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgICAgICBzZXQobmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGJjSW5zdGFuY2UgPT09IG51bGwgfHwgZGJjSW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRiY0luc3RhbmNlLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrSW52YXJpYW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBwYXRoID8gREJDLnJlc29sdmUobmV3VmFsdWUsIHBhdGgpIDogbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIC8vICNyZWdpb24gQ2hlY2sgaWYgYWxsIFwiY29udHJhY3RzXCIgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb250cmFjdCBvZiBjb250cmFjdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRyYWN0LmNoZWNrKHJlYWxWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiY0luc3RhbmNlID09PSBudWxsIHx8IGRiY0luc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYmNJbnN0YW5jZS5yZXBvcnRGaWVsZEluZnJpbmdlbWVudChyZXN1bHQsIHRhcmdldCwgcGF0aCwgcHJvcGVydHlLZXksIHJlYWxWYWx1ZSwgaGludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBpZiBhbGwgXCJjb250cmFjdHNcIiBhcmUgZnVsZmlsbGVkLlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vICNlbmRyZWdpb24gUmVwbGFjZSBvcmlnaW5hbCBwcm9wZXJ0eS5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBJbnZhcmlhbnRcbiAgICAvLyAjcmVnaW9uIFBvc3Rjb25kaXRpb25cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZCBkZWNvcmF0b3IgZmFjdG9yeSBjaGVja2luZyB0aGUgcmVzdWx0IG9mIGEgbWV0aG9kIHdoZW5ldmVyIGl0IGlzIGludm9rZWQgdGh1cyBhbHNvIHVzYWJsZSBvbiBnZXR0ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoZWNrXHRUaGUgKioodG9DaGVjazogYW55LCBvYmplY3QsIHN0cmluZykgPT4gYm9vbGVhbiB8IHN0cmluZyoqIHRvIHVzZSBmb3IgY2hlY2tpbmcuXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMucmVzb2x2ZURCQ1BhdGggfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0VGhlIGRvdHRlZCBwYXRoIHJlZmVycmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHRvIGNoZWNrLCBzdGFydGluZyBmb3JtIHRoZSBzcGVjaWZpZWQgb25lLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlICoqKCB0YXJnZXQgOiBvYmplY3QsIHByb3BlcnR5S2V5IDogc3RyaW5nLCBkZXNjcmlwdG9yIDogUHJvcGVydHlEZXNjcmlwdG9yICkgOiBQcm9wZXJ0eURlc2NyaXB0b3IqKlxuICAgICAqIFx0XHRcdGludm9rZWQgYnkgVHlwZXNjcmlwdC5cbiAgICAgKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBpbnRlcmNlcHQgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgIHN0YXRpYyBkZWNQb3N0Y29uZGl0aW9uKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTmVjZXNzYXJ5IHRvIGludGVyY2VwdCBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgY2hlY2ssIGRiYyA9IHVuZGVmaW5lZCwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgZGJjSW5zdGFuY2U7XG4gICAgICAgIHJldHVybiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gaW50ZXJjZXB0IFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZGJjSW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgICAgIGRiY0luc3RhbmNlID0gREJDLmdldERCQyhkYmMpO1xuICAgICAgICAgICAgICAgIGlmICghZGJjSW5zdGFuY2UuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tQb3N0Y29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9UaGlzSW5TdGF0aWM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBwYXRoID8gREJDLnJlc29sdmUocmVzdWx0LCBwYXRoKSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja1Jlc3VsdCA9IGNoZWNrKHJlYWxWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGVja1Jlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBkYmNJbnN0YW5jZS5yZXBvcnRSZXR1cm52YWx1ZUluZnJpbmdlbWVudChjaGVja1Jlc3VsdCwgdGFyZ2V0LCBwYXRoLCBwcm9wZXJ0eUtleSwgcmVhbFZhbHVlLCBoaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBQb3N0Y29uZGl0aW9uXG4gICAgLy8gI3JlZ2lvbiBEZWNvcmF0b3JcbiAgICAvLyAjcmVnaW9uIFByZWNvbmRpdGlvblxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHRoYXQgcmVxdWVzdHMgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIncyB2YWx1ZSBwYXNzaW5nIGl0IHRvIHRoZSBwcm92aWRlZFxuICAgICAqIFwiY2hlY2tcIi1tZXRob2Qgd2hlbiB0aGUgdmFsdWUgYmVjb21lcyBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tcdFRoZSBcIiggdW5rbm93biApID0+IHZvaWRcIiB0byBiZSBpbnZva2VkIGFsb25nIHdpdGggdGhlIHRhZ2dlZCBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBzb29uXG4gICAgICogXHRcdFx0XHRhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICAgKiBAcGFyYW0gZGJjICBcdFNlZSB7QGxpbmsgREJDLnJlc29sdmVEQkNQYXRoIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFRoZSBkb3R0ZWQgcGF0aCByZWZlcnJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB0byBjaGVjaywgc3RhcnRpbmcgZm9ybSB0aGUgc3BlY2lmaWVkIG9uZS5cbiAgICAgKiBcdFx0XHRcdE1heSBjb250YWluIDo6IHRvIHNlcGFyYXRlIG11bHRpcGxlIHBhdGhzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlICoqKHRhcmdldDogb2JqZWN0LCBtZXRob2ROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIHBhcmFtZXRlckluZGV4OiBudW1iZXIgKSA9PiB2b2lkKiogaW52b2tlZCBieSBUeXBlc2NyaXB0LSAqL1xuICAgIHN0YXRpYyBkZWNQcmVjb25kaXRpb24oXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gY2hlY2sgYW55IHBhcmFtZXRlciB2YWx1ZVxuICAgIGNoZWNrLCBkYmMgPSB1bmRlZmluZWQsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSBwYXRoID8gcGF0aC5yZXBsYWNlKC8gL2csIFwiXCIpLnNwbGl0KFwiOjpcIikgOiBbdW5kZWZpbmVkXTtcbiAgICAgICAgbGV0IGRiY0luc3RhbmNlO1xuICAgICAgICByZXR1cm4gKHRhcmdldCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICAgIERCQy5yZXF1ZXN0UGFyYW1WYWx1ZSh0YXJnZXQsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4LCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRiY0luc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgICBkYmNJbnN0YW5jZSA9IERCQy5nZXREQkMoZGJjKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRiY0luc3RhbmNlLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUHJlY29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2luZ2xlUGF0aCBvZiBwYXRocykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBzaW5nbGVQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IERCQy5yZXNvbHZlKHZhbHVlLCBzaW5nbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2socmVhbFZhbHVlLCB0YXJnZXQsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiY0luc3RhbmNlLnJlcG9ydFBhcmFtZXRlckluZnJpbmdlbWVudChyZXN1bHQsIHRhcmdldCwgc2luZ2xlUGF0aCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgsIHJlYWxWYWx1ZSwgaGludCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBQcmVjb25kaXRpb25cbiAgICAvLyAjZW5kcmVnaW9uIERlY29yYXRvclxuICAgIC8vICNyZWdpb24gQ29udHJhY3QgRmFjdG9yeSBIZWxwZXJzXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFBSRSBkZWNvcmF0b3IgZnJvbSBhIGNoZWNrQWxnb3JpdGhtIGZ1bmN0aW9uIGFuZCBpdHMgYm91bmQgYXJndW1lbnRzLlxuICAgICAqIFJlZHVjZXMgYm9pbGVycGxhdGUgYWNyb3NzIGNvbnRyYWN0IGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tGbiAgQSBmdW5jdGlvbiB0aGF0IHRha2VzICh2YWx1ZSwgLi4uYm91bmRBcmdzKSBhbmQgcmV0dXJucyB0cnVlIG9yIGFuIGVycm9yIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gYm91bmRBcmdzIFRoZSBhcmd1bWVudHMgdG8gYmluZCB0byB0aGUgY2hlY2sgZnVuY3Rpb24gYWZ0ZXIgdGhlIHZhbHVlLlxuICAgICAqIEBwYXJhbSBkYmMgICAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb259LlxuICAgICAqIEBwYXJhbSBwYXRoICAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb259LlxuICAgICAqIEBwYXJhbSBoaW50ICAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb259LlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IGFjY2VwdCBhbnkgY2hlY2tBbGdvcml0aG0gc2lnbmF0dXJlXG4gICAgY2hlY2tGbiwgXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBBcmd1bWVudHMgdmFyeSBwZXIgY29udHJhY3RcbiAgICBib3VuZEFyZ3MsIGRiYywgcGF0aCwgaGludCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1ByZWNvbmRpdGlvbigodmFsdWUsIF90YXJnZXQsIF9tZXRob2ROYW1lLCBfcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjaGVja0ZuKHZhbHVlLCAuLi5ib3VuZEFyZ3MpO1xuICAgICAgICB9LCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUE9TVCBkZWNvcmF0b3IgZnJvbSBhIGNoZWNrQWxnb3JpdGhtIGZ1bmN0aW9uIGFuZCBpdHMgYm91bmQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoZWNrRm4gIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyAodmFsdWUsIC4uLmJvdW5kQXJncykgYW5kIHJldHVybnMgdHJ1ZSBvciBhbiBlcnJvciBzdHJpbmcuXG4gICAgICogQHBhcmFtIGJvdW5kQXJncyBUaGUgYXJndW1lbnRzIHRvIGJpbmQgdG8gdGhlIGNoZWNrIGZ1bmN0aW9uIGFmdGVyIHRoZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gZGJjICAgICAgU2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbn0uXG4gICAgICogQHBhcmFtIHBhdGggICAgIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb259LlxuICAgICAqIEBwYXJhbSBoaW50ICAgICBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9ufS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgYWNjZXB0IGFueSBjaGVja0FsZ29yaXRobSBzaWduYXR1cmVcbiAgICBjaGVja0ZuLCBcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEFyZ3VtZW50cyB2YXJ5IHBlciBjb250cmFjdFxuICAgIGJvdW5kQXJncywgZGJjLCBwYXRoLCBoaW50KSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUG9zdGNvbmRpdGlvbigodmFsdWUsIF90YXJnZXQsIF9wcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrRm4odmFsdWUsIC4uLmJvdW5kQXJncyk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gSU5WQVJJQU5UIGRlY29yYXRvciBmcm9tIGEgY29udHJhY3QgY29uc3RydWN0b3IgYW5kIGl0cyBib3VuZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gQ29udHJhY3RDbGFzcyBBIGNsYXNzIHdpdGggYSBjb25zdHJ1Y3RvciB0aGF0IHByb2R1Y2VzIGFuIG9iamVjdCB3aXRoIGEgYGNoZWNrYCBtZXRob2QuXG4gICAgICogQHBhcmFtIGN0b3JBcmdzICAgICAgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjb250cmFjdCBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0gZGJjICAgICAgICAgICBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnR9LlxuICAgICAqIEBwYXJhbSBwYXRoICAgICAgICAgIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudH0uXG4gICAgICogQHBhcmFtIGhpbnQgICAgICAgICAgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50fS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTXVzdCBhY2NlcHQgYW55IGNvbnRyYWN0IGNvbnN0cnVjdG9yXG4gICAgQ29udHJhY3RDbGFzcywgXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBBcmd1bWVudHMgdmFyeSBwZXIgY29udHJhY3RcbiAgICBjdG9yQXJncywgZGJjLCBwYXRoLCBoaW50KSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjSW52YXJpYW50KFtuZXcgQ29udHJhY3RDbGFzcyguLi5jdG9yQXJncyldLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHdhcm5pbmcuICovXG4gICAgcmVwb3J0V2FybmluZyhtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLndhcm5pbmdTZXR0aW5ncy5sb2dUb0NvbnNvbGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogU2FuaXRpemVzIGEgdmFsdWUgZm9yIHNhZmUgaW5jbHVzaW9uIGluIGVycm9yIG1lc3NhZ2VzLiAqL1xuICAgIHN0YXRpYyBzYW5pdGl6ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBzdHIgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWzw+JlwiJ10vZywgKGNoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIjxcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJmx0O1wiO1xuICAgICAgICAgICAgICAgIGNhc2UgXCI+XCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiZndDtcIjtcbiAgICAgICAgICAgICAgICBjYXNlIFwiJlwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCImYW1wO1wiO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJnF1b3Q7XCI7XG4gICAgICAgICAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJiMzOTtcIjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZnJpbmdlbWVudCBhY2NvcmRpbmcgdG8gdGhlIHtAbGluayBpbmZyaW5nZW1lbnRTZXR0aW5ncyB9IGFsc28gZ2VuZXJhdGluZyBhIHByb3BlciB7QGxpbmsgc3RyaW5nIH0td3JhcHBlclxuICAgICAqIGZvciB0aGUgZ2l2ZW4gXCJtZXNzYWdlXCIgJiB2aW9sYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudCBhbmQgaXQncyBwcm92ZW5pZW5jZS5cbiAgICAgKiBAcGFyYW0gdmlvbGF0b3IgXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgb3IgbmFtaW5nIHRoZSB2aW9sYXRvci4gKi9cbiAgICByZXBvcnRJbmZyaW5nZW1lbnQobWVzc2FnZSwgdmlvbGF0b3IsIHRhcmdldCwgdmFsdWUsIHBhdGgsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc2FmZVZpb2xhdG9yID0gREJDLnNhbml0aXplKHZpb2xhdG9yKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZSA9IHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBEQkMuc2FuaXRpemUodGFyZ2V0Lm5hbWUpXG4gICAgICAgICAgICA6IHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICB0YXJnZXQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGFyZ2V0LmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICA/IERCQy5zYW5pdGl6ZSh0YXJnZXQuY29uc3RydWN0b3IubmFtZSlcbiAgICAgICAgICAgICAgICA6IERCQy5zYW5pdGl6ZSh0YXJnZXQpO1xuICAgICAgICBjb25zdCBmaW5hbE1lc3NhZ2UgPSBgWyBGcm9tIFwiJHtzYWZlVmlvbGF0b3J9XCIgaW4gXCIke3RhcmdldE5hbWV9XCIke3BhdGggPyBgID4gXCIke0RCQy5zYW5pdGl6ZShwYXRoKX1cImAgOiBcIlwifTogJHttZXNzYWdlfSAke2hpbnQgPyBg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9XWA7XG4gICAgICAgIGlmICh0aGlzLmluZnJpbmdlbWVudFNldHRpbmdzLnRocm93RXhjZXB0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChmaW5hbE1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluZnJpbmdlbWVudFNldHRpbmdzLmxvZ1RvQ29uc29sZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZmluYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgcGFyYW1ldGVyLWluZnJpbmdlbWVudCB2aWEge0BsaW5rIHJlcG9ydEluZnJpbmdlbWVudCB9IGFsc28gZ2VuZXJhdGluZyBhIHByb3BlciB7QGxpbmsgc3RyaW5nIH0td3JhcHBlclxuICAgICAqIGZvciB0aGUgZ2l2ZW4gXCJtZXNzYWdlXCIsXCJtZXRob2RcIiwgcGFyYW1ldGVyLVwiaW5kZXhcIiAmIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcdFRoZSB7QGxpbmsgc3RyaW5nIH0gZGVzY3JpYmluZyB0aGUgaW5mcmluZ2VtZW50IGFuZCBpdCdzIHByb3ZlbmllbmNlLlxuICAgICAqIEBwYXJhbSBtZXRob2QgXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgb3IgbmFtaW5nIHRoZSB2aW9sYXRvci5cbiAgICAgKiBAcGFyYW0gaW5kZXhcdFx0VGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgd2l0aGluIHRoZSBhcmd1bWVudCBsaXN0aW5nLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBcdFRoZSBwYXJhbWV0ZXIncyB2YWx1ZS4gKi9cbiAgICByZXBvcnRQYXJhbWV0ZXJJbmZyaW5nZW1lbnQobWVzc2FnZSwgdGFyZ2V0LCBwYXRoLCBtZXRob2QsIGluZGV4LCB2YWx1ZSwgaGludCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBwcm9wZXJJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgdGhpcy5yZXBvcnRJbmZyaW5nZW1lbnQoYFsgUGFyYW1ldGVyLXZhbHVlIFwiJHt2YWx1ZX1cIiBvZiB0aGUgJHtwcm9wZXJJbmRleH0ke3Byb3BlckluZGV4ID09PSAxID8gXCJzdFwiIDogcHJvcGVySW5kZXggPT09IDIgPyBcIm5kXCIgOiBwcm9wZXJJbmRleCA9PT0gMyA/IFwicmRcIiA6IFwidGhcIn0gcGFyYW1ldGVyIGRpZCBub3QgZnVsZmlsbCBvbmUgb2YgaXQncyBjb250cmFjdHM6ICR7bWVzc2FnZX0gXWAsIG1ldGhvZCwgdGFyZ2V0LCB2YWx1ZSwgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSBmaWVsZC1pbmZyaW5nZW1lbnQgdmlhIHtAbGluayByZXBvcnRJbmZyaW5nZW1lbnQgfSBhbHNvIGdlbmVyYXRpbmcgYSBwcm9wZXIge0BsaW5rIHN0cmluZyB9LXdyYXBwZXJcbiAgICAgKiBmb3IgdGhlIGdpdmVuICoqbWVzc2FnZSoqICYgKipuYW1lKiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVx0QSB7QGxpbmsgc3RyaW5nIH0gZGVzY3JpYmluZyB0aGUgaW5mcmluZ2VtZW50IGFuZCBpdCdzIHByb3ZlbmllbmNlLlxuICAgICAqIEBwYXJhbSBrZXkgXHRcdFRoZSBwcm9wZXJ0eSBrZXkuXG4gICAgICogQHBhcmFtIHBhdGhcdFx0VGhlIGRvdHRlZC1wYXRoIHtAbGluayBzdHJpbmcgfSB0aGF0IGxlYWRzIHRvIHRoZSB2YWx1ZSBub3QgZnVsZmlsbGluZyB0aGUgY29udHJhY3Qgc3RhcnRpbmcgZnJvbVxuICAgICAqIFx0XHRcdFx0XHR0aGUgdGFnZ2VkIG9uZS5cbiAgICAgKiBAcGFyYW0gdmFsdWVcdFx0VGhlIHZhbHVlIG5vdCBmdWxmaWxsaW5nIGEgY29udHJhY3QuICovXG4gICAgcmVwb3J0RmllbGRJbmZyaW5nZW1lbnQobWVzc2FnZSwgdGFyZ2V0LCBwYXRoLCBrZXksIHZhbHVlLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVwb3J0SW5mcmluZ2VtZW50KGBbIE5ldyB2YWx1ZSBmb3IgXCIke2tleX1cIiR7cGF0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAuJHtwYXRofWB9IHdpdGggdmFsdWUgXCIke3ZhbHVlfVwiIGRpZCBub3QgZnVsZmlsbCBvbmUgb2YgaXQncyBjb250cmFjdHM6ICR7bWVzc2FnZX0gXWAsIGtleSwgdGFyZ2V0LCB2YWx1ZSwgcGF0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSByZXR1cm52YWx1ZS1pbmZyaW5nZW1lbnQgYWNjb3JkaW5nIHZpYSB7QGxpbmsgcmVwb3J0SW5mcmluZ2VtZW50IH0gYWxzbyBnZW5lcmF0aW5nIGEgcHJvcGVyIHtAbGluayBzdHJpbmcgfS13cmFwcGVyXG4gICAgICogZm9yIHRoZSBnaXZlbiBcIm1lc3NhZ2VcIixcIm1ldGhvZFwiICYgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVx0VGhlIHtAbGluayBzdHJpbmcgfSBkZXNjcmliaW5nIHRoZSBpbmZyaW5nZW1lbnQgYW5kIGl0J3MgcHJvdmVuaWVuY2UuXG4gICAgICogQHBhcmFtIG1ldGhvZCBcdFRoZSB7QGxpbmsgc3RyaW5nIH0gZGVzY3JpYmluZyBvciBuYW1pbmcgdGhlIHZpb2xhdG9yLlxuICAgICAqIEBwYXJhbSB2YWx1ZVx0XHRUaGUgcGFyYW1ldGVyJ3MgdmFsdWUuICovXG4gICAgcmVwb3J0UmV0dXJudmFsdWVJbmZyaW5nZW1lbnQobWVzc2FnZSwgdGFyZ2V0LCBwYXRoLCBtZXRob2QsIFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgIHZhbHVlLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVwb3J0SW5mcmluZ2VtZW50KGBbIFJldHVybi12YWx1ZSBcIiR7dmFsdWV9XCIgZGlkIG5vdCBmdWxmaWxsIG9uZSBvZiBpdCdzIGNvbnRyYWN0czogJHttZXNzYWdlfSBdYCwgbWV0aG9kLCB0YXJnZXQsIHZhbHVlLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyB0aGlzIHtAbGluayBEQkMgfSB3aXRob3V0IG1vdW50aW5nIGl0IG9uIHRoZSBnbG9iYWwgbmFtZXNwYWNlLlxuICAgICAqIFVzZSB7QGxpbmsgREJDLnJlZ2lzdGVyIH0gdG8gbWFrZSB0aGUgaW5zdGFuY2UgYXZhaWxhYmxlIGF0IGEgc3BlY2lmaWMgcGF0aCBvbiBnbG9iYWxUaGlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZnJpbmdlbWVudFNldHRpbmdzIFx0U2VlIHtAbGluayBEQkMuaW5mcmluZ2VtZW50U2V0dGluZ3MgfS5cbiAgICAgKiBAcGFyYW0gZXhlY3V0aW9uU2V0dGluZ3NcdFx0U2VlIHtAbGluayBEQkMuZXhlY3V0aW9uU2V0dGluZ3MgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihpbmZyaW5nZW1lbnRTZXR0aW5ncyA9IHsgdGhyb3dFeGNlcHRpb246IHRydWUsIGxvZ1RvQ29uc29sZTogZmFsc2UgfSwgZXhlY3V0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGNoZWNrUHJlY29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgY2hlY2tJbnZhcmlhbnRzOiB0cnVlLFxuICAgIH0pIHtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBDb250cmFjdCBGYWN0b3J5IEhlbHBlcnNcbiAgICAgICAgLy8gI3JlZ2lvbiBFeGVjdXRpb24gSGFuZGxpbmdcbiAgICAgICAgLyoqIFN0b3JlcyBzZXR0aW5ncyBjb25jZXJuaW5nIHRoZSBleGVjdXRpb24gb2YgY2hlY2tzLiAqL1xuICAgICAgICB0aGlzLmV4ZWN1dGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgY2hlY2tQcmVjb25kaXRpb25zOiB0cnVlLFxuICAgICAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgIGNoZWNrSW52YXJpYW50czogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBFeGVjdXRpb24gSGFuZGxpbmdcbiAgICAgICAgLy8gI3JlZ2lvbiBXYXJuaW5nIGhhbmRsaW5nLlxuICAgICAgICAvKiogU3RvcmVzIHNldHRpbmdzIGNvbmNlcm5pbmcgd2FybmluZ3MuICovXG4gICAgICAgIHRoaXMud2FybmluZ1NldHRpbmdzID0geyBsb2dUb0NvbnNvbGU6IHRydWUgfTtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBXYXJuaW5nIGhhbmRsaW5nLlxuICAgICAgICAvLyAjcmVnaW9uIGluZnJpbmdlbWVudCBoYW5kbGluZy5cbiAgICAgICAgLyoqIFN0b3JlcyB0aGUgc2V0dGluZ3MgY29uY2VybmluZyBpbmZyaW5nZW1lbnRzICovXG4gICAgICAgIHRoaXMuaW5mcmluZ2VtZW50U2V0dGluZ3MgPSB7IHRocm93RXhjZXB0aW9uOiB0cnVlLCBsb2dUb0NvbnNvbGU6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuaW5mcmluZ2VtZW50U2V0dGluZ3MgPSBpbmZyaW5nZW1lbnRTZXR0aW5ncztcbiAgICAgICAgdGhpcy5leGVjdXRpb25TZXR0aW5ncyA9IGV4ZWN1dGlvblNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgREJDIH0gaW5zdGFuY2UgYXQgdGhlIHNwZWNpZmllZCBkb3R0ZWQgcGF0aCBvbiBnbG9iYWxUaGlzIChvciB3aW5kb3cpLFxuICAgICAqIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGRlY29yYXRvciByZXNvbHV0aW9uIHZpYSBzdHJpbmcgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2VcdFRoZSB7QGxpbmsgREJDIH0gaW5zdGFuY2UgdG8gcmVnaXN0ZXIuXG4gICAgICogQHBhcmFtIHBhdGhcdFx0VGhlIGRvdHRlZCBwYXRoIHRvIHJlZ2lzdGVyIGF0IChkZWZhdWx0OiBgXCJXYVhDb2RlLkRCQ1wiYCkuICovXG4gICAgc3RhdGljIHJlZ2lzdGVyKGluc3RhbmNlLCBwYXRoID0gXCJXYVhDb2RlLkRCQ1wiKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTXVzdCB3YWxrIGR5bmFtaWMgZ2xvYmFsIG5hbWVzcGFjZS5cbiAgICAgICAgbGV0IG9iaiA9IERCQy5nZXRIb3N0KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAob2JqW3NlZ21lbnRzW2ldXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIG9ialtzZWdtZW50c1tpXV0gPSB7fTtcbiAgICAgICAgICAgIG9iaiA9IG9ialtzZWdtZW50c1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgb2JqW3NlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdXSA9IGluc3RhbmNlO1xuICAgICAgICBEQkMuZGJjQ2FjaGUuc2V0KHBhdGgsIGluc3RhbmNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBjYWxsYmFjayB3aXRoIGFuIGlzb2xhdGVkIHtAbGluayBEQkMgfSBpbnN0YW5jZSB0ZW1wb3JhcmlseSByZWdpc3RlcmVkIGF0IHRoZSBkZWZhdWx0IHBhdGguXG4gICAgICogVGhlIHByZXZpb3VzIGluc3RhbmNlIChpZiBhbnkpIGlzIHJlc3RvcmVkIGFmdGVyIHRoZSBjYWxsYmFjayBjb21wbGV0ZXMg4oCUIGV2ZW4gaWYgaXQgdGhyb3dzLlxuICAgICAqIFVzZWZ1bCBmb3IgdGVzdCBpc29sYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIHJlY2VpdmluZyB0aGUgaXNvbGF0ZWQge0BsaW5rIERCQyB9IGluc3RhbmNlLiAqL1xuICAgIHN0YXRpYyBpc29sYXRlZChmbikge1xuICAgICAgICBjb25zdCBzYXZlZCA9IERCQy5kYmNDYWNoZS5nZXQoXCJXYVhDb2RlLkRCQ1wiKTtcbiAgICAgICAgY29uc3QgdGVzdERiYyA9IG5ldyBEQkMoKTtcbiAgICAgICAgREJDLnJlZ2lzdGVyKHRlc3REYmMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm4odGVzdERiYyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgICAgICAgICBEQkMucmVnaXN0ZXIoc2F2ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgREJDLmRiY0NhY2hlLmRlbGV0ZShcIldhWENvZGUuREJDXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBkZXNpcmVkIHtAbGluayBvYmplY3QgfSBvdXQgYSBnaXZlbiBvbmUgKip0b1Jlc29sdmVGcm9tKiogdXNpbmcgdGhlIHNwZWNpZmllZCAqKnBhdGgqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b1Jlc29sdmVGcm9tIFRoZSB7QGxpbmsgb2JqZWN0IH0gc3RhcnRpbmcgdG8gcmVzb2x2ZSBmcm9tLlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0VGhlIGRvdHRlZCBwYXRoLXtAbGluayBzdHJpbmcgfS5cbiAgICAgKiBcdFx0XHRcdFx0XHRUaGlzIHN0cmluZyB1c2VzIC4sIFsuLi5dLCBhbmQgKCkgdG8gcmVwcmVzZW50IGFjY2Vzc2luZyBuZXN0ZWQgcHJvcGVydGllcyxcbiAgICAgKiBcdFx0XHRcdFx0XHRhcnJheSBlbGVtZW50cy9vYmplY3Qga2V5cywgYW5kIGNhbGxpbmcgbWV0aG9kcywgcmVzcGVjdGl2ZWx5LCBtaW1pY2tpbmcgSmF2YVNjcmlwdCBzeW50YXggdG8gbmF2aWdhdGVcbiAgICAgKiBcdFx0XHRcdFx0XHRhbiBvYmplY3QncyBzdHJ1Y3R1cmUuIENvZGUsIGUuZy4gc29tZXRoaW5nIGxpa2UgYS5iKCAxIGFzIG51bWJlciApLmMsIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGFuZFxuICAgICAqIFx0XHRcdFx0XHRcdHRodXMgbWFrZSB0aGUgcmV0cmlldmFsIGZhaWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVxdWVzdGVkIHtAbGluayBvYmplY3QgfSwgTlVMTCBvciBVTkRFRklORUQuICovXG4gICAgc3RhdGljIHJlc29sdmUodG9SZXNvbHZlRnJvbSwgcGF0aCkge1xuICAgICAgICBpZiAoIXRvUmVzb2x2ZUZyb20gfHwgdHlwZW9mIHBhdGggIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VjdXJpdHk6IGJsb2NrIHByb3RvdHlwZSBwb2xsdXRpb24gcGF0aHNcbiAgICAgICAgY29uc3QgZGFuZ2Vyb3VzVG9rZW5zID0gW1wiX19wcm90b19fXCIsIFwiY29uc3RydWN0b3JcIiwgXCJwcm90b3R5cGVcIl07XG4gICAgICAgIGNvbnN0IGNhY2hlZFBhcnRzID0gREJDLnBhdGhUb2tlbkNhY2hlLmdldChwYXRoKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBjYWNoZWRQYXJ0cyAhPT0gbnVsbCAmJiBjYWNoZWRQYXJ0cyAhPT0gdm9pZCAwID8gY2FjaGVkUGFydHMgOiBwYXRoLnJlcGxhY2UoL1xcWyhbJ1wiXT8pKC4qPylcXDFcXF0vZywgXCIuJDJcIikuc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAoIWNhY2hlZFBhcnRzKSB7XG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSB0b2tlbnMgYmVmb3JlIGNhY2hpbmdcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IHBhcnQucmVwbGFjZSgvXFwoLipcXCkkLywgXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGRhbmdlcm91c1Rva2Vucy5pbmRleE9mKHRva2VuTmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtYREJDXSBQYXRoIFwiJHtwYXRofVwiIGNvbnRhaW5zIGZvcmJpZGRlbiB0b2tlbiBcIiR7dG9rZW5OYW1lfVwiLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIERCQy5ldmljdElmTmVlZGVkKERCQy5wYXRoVG9rZW5DYWNoZSk7XG4gICAgICAgICAgICBEQkMucGF0aFRva2VuQ2FjaGUuc2V0KHBhdGgsIHBhcnRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgdHJhdmVyc2UgYXJiaXRyYXJ5IG9iamVjdCBncmFwaHNcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0b1Jlc29sdmVGcm9tO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IHR5cGVvZiBjdXJyZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZE1hdGNoID0gcGFydC5tYXRjaCgvKFxcdyspXFwoKC4qKVxcKS8pO1xuICAgICAgICAgICAgaWYgKG1ldGhvZE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZE1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3NTdHIgPSBtZXRob2RNYXRjaFsyXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gYXJnc1N0ci5zcGxpdChcIixcIikubWFwKChhcmcpID0+IGFyZy50cmltKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudFttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W21ldGhvZE5hbWVdLmFwcGx5KGN1cnJlbnQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcnQuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlKHBhcnQuc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG59XG4vLyAjcmVnaW9uIEludGVybmFsIGNhY2hlcy5cbkRCQy5NQVhfQ0FDSEVfU0laRSA9IDEwMDA7XG5EQkMuZGJjQ2FjaGUgPSBuZXcgTWFwKCk7XG5EQkMucGF0aFRva2VuQ2FjaGUgPSBuZXcgTWFwKCk7XG4vLyAjZW5kcmVnaW9uIEludGVybmFsIGNhY2hlcy5cbi8vICNyZWdpb24gUGFyYW1ldGVyLXZhbHVlIHJlcXVlc3RzLlxuLyoqIFN0b3JlcyBhbGwgcmVxdWVzdCBmb3IgcGFyYW1ldGVyIHZhbHVlcyByZWdpc3RlcmVkIGJ5IHtAbGluayBkZWNQcmVjb25kaXRpb24gfS4gKi9cbkRCQy5wYXJhbVZhbHVlUmVxdWVzdHMgPSBuZXcgTWFwKCk7XG4vLyAjcmVnaW9uIENsYXNzZXNcbi8vICNyZWdpb24gRXJyb3JzXG4vKiogQW4ge0BsaW5rIEVycm9yIH0gdG8gYmUgdGhyb3duIHdoZW5ldmVyIGFuIGluZnJpbmdlbWVudCBpcyBkZXRlY3RlZC4gKi9cbkRCQy5JbmZyaW5nZW1lbnQgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoaXMge0BsaW5rIEVycm9yIH0gYnkgdGFnZ2luZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ute0BsaW5rIHN0cmluZyB9IGFzIGFuIFhEQkMtSW5mcmluZ2VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHtAbGluayBzdHJpbmcgfSBkZXNjcmliaW5nIHRoZSBpbmZyaW5nZW1lbnQuICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihgWyBYREJDIEluZnJpbmdlbWVudCAke21lc3NhZ2V9XWApO1xuICAgIH1cbn07XG4vLyAjZW5kcmVnaW9uIEVycm9yc1xuLy8gI2VuZHJlZ2lvbiBDbGFzc2VzXG4vLyAjZW5kcmVnaW9uIGluZnJpbmdlbWVudCBoYW5kbGluZy5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNwZWNpZmllZCBkb3R0ZWQge0BsaW5rIHN0cmluZyB9LXBhdGggdG8gYSB7QGxpbmsgREJDIH0uXG4gKlxuICogQHBhcmFtIG9iaiBcdFRoZSB7QGxpbmsgb2JqZWN0IH0gdG8gc3RhcnQgcmVzb2x2aW5nIGZyb20uXG4gKiBAcGFyYW0gcGF0aCBcdFRoZSBkb3R0ZWQge0BsaW5rIHN0cmluZyB9LXBhdGggbGVhZGluZyB0byB0aGUge0BsaW5rIERCQyB9LlxuICpcbiAqIEByZXR1cm5zIFRoZSByZXF1ZXN0ZWQge0BsaW5rIERCQyB9LlxuICovXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgdHJhdmVyc2UgYXJiaXRyYXJ5IG9iamVjdCBncmFwaHNcbkRCQy5yZXNvbHZlREJDUGF0aCA9IChvYmosIHBhdGgpID0+IHBhdGggPT09IG51bGwgfHwgcGF0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGF0aC5zcGxpdChcIi5cIikucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3JbY3VycmVudF0sIG9iaik7XG4vLyBSZWdpc3RlciB0aGUgZGVmYXVsdCBpbnN0YW5jZSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLlxuREJDLnJlZ2lzdGVyKG5ldyBEQkMoKSk7XG4iLCJpbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi4vREJDXCI7XG4vKipcbiAqIEEge0BsaW5rIERCQyB9IGRlZmluaW5nIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGFuIHtAbGluayBvYmplY3QgfXMgaGF2ZSB0byBmdWxmaWxsXG4gKiBhIGdpdmVuIHtAbGluayBvYmplY3QgfSdzIGNoZWNrLW1ldGhvZCAoKiooIHRvQ2hlY2sgOiBhbnkgKSA9PiBib29sZWFuIHwgc3RyaW5nKiopLlxuICpcbiAqIEByZW1hcmtzXG4gKiBNYWludGFpbmVyOiBDYWxsYXJpLCBTYWx2YXRvcmUgKFhEQkNAV2FYQ29kZS5uZXQpICovXG5leHBvcnQgY2xhc3MgQUUgZXh0ZW5kcyBEQkMge1xuICAgIC8vICNyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8qKlxuICAgICAqIENoZWNrcyBlYWNoIGVsZW1lbnQgb2YgdGhlICoqdmFsdWUqKi17QGxpbmsgQXJyYXkgPCBhbnkgPn0gYWdhaW5zdCB0aGUgZ2l2ZW4gKipjb25kaXRpb24qKiwgaWYgaXQgaXMgb25lLiBJZiBpdCBpcyBub3RcbiAgICAgKiB0aGUgKip2YWx1ZSoqIGl0c2VsZiB3aWxsIGJlIGNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uXHRUaGUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IHRvIGNoZWNrIHRoZSAqKnZhbHVlKiogYWdhaW5zdC5cbiAgICAgKiBAcGFyYW0gdmFsdWVcdFx0RWl0aGVyICoqdmFsdWUqKi17QGxpbmsgQXJyYXkgPCBhbnkgPn0sIHdoaWNoJ3MgZWxlbWVudHMgd2lsbCBiZSBjaGVja2VkLCBvciB0aGUgdmFsdWUgdG8gYmVcbiAgICAgKiBcdFx0XHRcdFx0Y2hlY2tlZCBpdHNlbGYuXG4gICAgICogQHBhcmFtIGluZGV4XHRcdElmIHNwZWNpZmllZCB3aXRoICoqaWR4RW5kKiogYmVpbmcgdW5kZWZpbmVkLCB0aGlzIHtAbGluayBOdW1iZXIgfSB3aWxsIGJlIHNlZW4gYXMgdGhlIGluZGV4IG9mXG4gICAgICogXHRcdFx0XHRcdHRoZSB2YWx1ZS17QGxpbmsgQXJyYXkgfSdzIGVsZW1lbnQgdG8gY2hlY2suIElmIHZhbHVlIGlzbid0IGFuIHtAbGluayBBcnJheSB9IHRoaXMgcGFyYW1ldGVyXG4gICAgICogXHRcdFx0XHRcdHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdC5cbiAgICAgKiBcdFx0XHRcdFx0V2l0aCAqKmlkeEVuZCoqIG5vdCB1bmRlZmluZWQgdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwYW4gb2YgZWxlbWVudHMgdG9cbiAgICAgKiBcdFx0XHRcdFx0Y2hlY2sgd2l0aGluIHRoZSB2YWx1ZS17QGxpbmsgQXJyYXkgfS5cbiAgICAgKiBAcGFyYW0gaWR4RW5kXHRJbmRpY2F0ZXMgdGhlIGxhc3QgZWxlbWVudCdzIGluZGV4IChpbmNsdWRpbmcpIG9mIHRoZSBzcGFuIG9mIHZhbHVlLXtAbGluayBBcnJheSB9IGVsZW1lbnRzIHRvIGNoZWNrLlxuICAgICAqIFx0XHRcdFx0XHRTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIC0xIHNwZWNpZmllcyB0aGF0IGFsbCB2YWx1ZS17QGxpbmsgQXJyYXkgfSdzIGVsZW1lbnRzIGJlZ2lubmluZyBmcm9tIHRoZVxuICAgICAqIFx0XHRcdFx0XHRzcGVjaWZpZWQgKippbmRleCoqIHNoYWxsIGJlIGNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBcyBzb29uIGFzIHRoZSAqKmNvbmRpdGlvbioqIHJldHVybnMgYSB7QGxpbmsgc3RyaW5nIH0sIGluc3RlYWQgb2YgVFJVRSwgdGhlIHJldHVybmVkIHN0cmluZy4gVFJVRSBpZiB0aGVcbiAgICAgKiBcdFx0XHQqKmNvbmRpdGlvbioqIG5ldmVyIHJldHVybnMgYSB7QGxpbmsgc3RyaW5nfS4gKi9cbiAgICBzdGF0aWMgY2hlY2tBbGdvcml0aG0oY29uZGl0aW9uLCB2YWx1ZSwgaW5kZXgsIGlkeEVuZCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkICYmIGlkeEVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZGl0aW9uLmNoZWNrKHZhbHVlW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFZpb2xhdGluZy1BcnJheWVsZW1lbnQgYXQgaW5kZXggXCIke2luZGV4fVwiIHdpdGggdmFsdWUgXCIke3ZhbHVlW2luZGV4XX1cIi4gJHtyZXN1bHR9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSW4gb3JkZXIgZm9yIG9wdGlvbmFsIHBhcmFtZXRlciB0byBub3QgY2F1c2UgYW4gZXJyb3IgaWYgdGhleSBhcmUgb21pdHRlZC5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVuZGluZyA9IGlkeEVuZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBpZHhFbmQgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gaWR4RW5kICsgMVxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgIDogdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ID8gaW5kZXggOiAwOyBpIDwgZW5kaW5nOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25kaXRpb24uY2hlY2sodmFsdWVbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBWaW9sYXRpbmctQXJyYXllbGVtZW50IGF0IGluZGV4ICR7aX0uICR7cmVzdWx0fWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5jaGVjayh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfSB3aXRoIGVpdGhlciBtdWx0aXBsZSBvciBhIHNpbmdsZSBvbmVcbiAgICAgKiBvZiB0aGUgKipyZWFsQ29uZGl0aW9ucyoqIHRvIGNoZWNrIHRoZSB0YWdnZWQgcGFyYW1ldGVyLXZhbHVlIGFnYWluc3Qgd2l0aC5cbiAgICAgKiBXaGVuIHNwZWNpZnlpbmcgYW4gKippbmRleCoqIGFuZCB0aGUgdGFnZ2VkIHBhcmFtZXRlcidzICoqdmFsdWUqKiBpcyBhbiB7QGxpbmsgQXJyYXkgfSwgdGhlICoqcmVhbENvbmRpdGlvbnMqKiBhcHBseSB0byB0aGVcbiAgICAgKiBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgKippbmRleCoqLlxuICAgICAqIElmIHRoZSB7QGxpbmsgQXJyYXkgfSBpcyB0b28gc2hvcnQgdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IG9mXG4gICAgICogKipyZWFsQ29uZGl0aW9ucyoqIHdpbGwgYmUgdmVyaWZpZWQgdG8gVFJVRSBhdXRvbWF0aWNhbGx5LCBjb25zaWRlcmluZyBvcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAqIElmIGFuICoqaW5kZXgqKiBpcyBzcGVjaWZpZWQgYnV0IHRoZSB0YWdnZWQgcGFyYW1ldGVyJ3MgdmFsdWUgaXNuJ3QgYW4gYXJyYXksIHRoZSAqKmluZGV4KiogaXMgdHJlYXRlZCBhcyBiZWluZyB1bmRlZmluZWQuXG4gICAgICogSWYgKippbmRleCoqIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBhbiB7QGxpbmsgQXJyYXkgfSBlYWNoIGVsZW1lbnQgb2YgaXQgd2lsbCBiZSBjaGVja2VkXG4gICAgICogYWdhaW5zdCB0aGUgKipyZWFsQ29uZGl0aW9ucyoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlYWxDb25kaXRpb25zXHRFaXRoZXIgb25lIG9yIG1vcmUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IHRvIGNoZWNrIHRoZSB0YWdnZWQgcGFyYW1ldGVyLXZhbHVlXG4gICAgICogXHRcdFx0XHRcdFx0XHRhZ2FpbnN0IHdpdGguXG4gICAgICogQHBhcmFtIGluZGV4XHRcdFx0XHRTZWUgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBpZHhFbmRcdFx0XHRTZWUgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuc1x0QSB7QGxpbmsgc3RyaW5nIH0gYXMgc29vbiBhcyBvbmUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IG9mICoqcmVhbENvbmRpdGlvbnMqKiByZXR1cm5zIG9uZS5cbiAgICAgKiBcdFx0XHRPdGhlcndpc2UgVFJVRS4gKi9cbiAgICBzdGF0aWMgUFJFKHJlYWxDb25kaXRpb25zLCBpbmRleCA9IHVuZGVmaW5lZCwgaWR4RW5kID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNQcmVjb25kaXRpb24oKFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgbWF0Y2ggREJDLmRlY1ByZWNvbmRpdGlvbiBzaWduYXR1cmVcbiAgICAgICAgdmFsdWUsIHRhcmdldCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlYWxDb25kaXRpb25zKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudENvbmRpdGlvbiBvZiByZWFsQ29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBBRS5jaGVja0FsZ29yaXRobShjdXJyZW50Q29uZGl0aW9uLCB2YWx1ZSwgaW5kZXgsIGlkeEVuZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFFLmNoZWNrQWxnb3JpdGhtKHJlYWxDb25kaXRpb25zLCB2YWx1ZSwgaW5kZXgsIGlkeEVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9IHdpdGggZWl0aGVyIG11bHRpcGxlIG9yIGEgc2luZ2xlIG9uZVxuICAgICAqIG9mIHRoZSAqKnJlYWxDb25kaXRpb25zKiogdG8gY2hlY2sgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm4tdmFsdWUgYWdhaW5zdCB3aXRoLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlYWxDb25kaXRpb25zXHRFaXRoZXIgb25lIG9yIG1vcmUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IHRvIGNoZWNrIHRoZSB0YWdnZWQgcGFyYW1ldGVyLXZhbHVlXG4gICAgICogXHRcdFx0XHRcdFx0XHRhZ2FpbnN0IHdpdGguXG4gICAgICogQHBhcmFtIGluZGV4XHRcdFx0XHRTZWUgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBpZHhFbmRcdFx0XHRTZWUgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuc1x0QSB7QGxpbmsgc3RyaW5nIH0gYXMgc29vbiBhcyBvbmUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IG9mICoqcmVhbENvbmRpdGlvbnMqKiByZXR1cm4gb25lLlxuICAgICAqIFx0XHRcdE90aGVyd2lzZSBUUlVFLiAqL1xuICAgIHN0YXRpYyBQT1NUKHJlYWxDb25kaXRpb25zLCBpbmRleCA9IHVuZGVmaW5lZCwgaWR4RW5kID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNQb3N0Y29uZGl0aW9uKCh2YWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVhbENvbmRpdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjdXJyZW50Q29uZGl0aW9uIG9mIHJlYWxDb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEFFLmNoZWNrQWxnb3JpdGhtKGN1cnJlbnRDb25kaXRpb24sIHZhbHVlLCBpbmRleCwgaWR4RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQUUuY2hlY2tBbGdvcml0aG0oXG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICAgICAgcmVhbENvbmRpdGlvbnMsIHZhbHVlLCBpbmRleCwgaWR4RW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZpZWxkLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfSB3aXRoIGVpdGhlciBtdWx0aXBsZSBvciBhIHNpbmdsZSBvbmVcbiAgICAgKiBvZiB0aGUgKipyZWFsQ29uZGl0aW9ucyoqIHRvIGNoZWNrIHRoZSB0YWdnZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVhbENvbmRpdGlvbnNcdEVpdGhlciBvbmUgb3IgbW9yZSB7IGNoZWNrOiAodG9DaGVjazogYW55KSA9PiBib29sZWFuIHwgc3RyaW5nIH0gdG8gY2hlY2sgdGhlIHRhZ2dlZCBwYXJhbWV0ZXItdmFsdWVcbiAgICAgKiBcdFx0XHRcdFx0XHRcdGFnYWluc3Qgd2l0aC5cbiAgICAgKiBAcGFyYW0gaW5kZXhcdFx0XHRcdFNlZSB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIGlkeEVuZFx0XHRcdFNlZSB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBoaW50XHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zXHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKHJlYWxDb25kaXRpb25zLCBpbmRleCA9IHVuZGVmaW5lZCwgaWR4RW5kID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVJTlZBUklBTlQoQUUsIFtyZWFsQ29uZGl0aW9ucywgaW5kZXgsIGlkeEVuZF0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2UgZ2xvYmFsIGZ1bmN0aW9ucykuXG4gICAgLy9cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfSB3aXRoIGFsbCB7QGxpbmsgQUUuY29uZGl0aW9ucyB9IGFuZCB0aGUge0BsaW5rIG9iamVjdCB9IHtAbGluayB0b0NoZWNrIH0sXG4gICAgICoge0BsaW5rIEFFLmluZGV4IH0gJiB7QGxpbmsgQUUuaWR4RW5kIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgbWF0Y2ggREJDIGZhY3Rvcnkgc2lnbmF0dXJlXG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmNvbmRpdGlvbnMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRDb25kaXRpb24gb2YgdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gQUUuY2hlY2tBbGdvcml0aG0oY3VycmVudENvbmRpdGlvbiwgdG9DaGVjaywgdGhpcy5pbmRleCwgdGhpcy5pZHhFbmQpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBBRS5jaGVja0FsZ29yaXRobShcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgICAgdGhpcy5jb25kaXRpb25zLCB0b0NoZWNrLCB0aGlzLmluZGV4LCB0aGlzLmlkeEVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhpcyB7QGxpbmsgQUUgfSBieSBzZXR0aW5nIHRoZSBwcm90ZWN0ZWQgcHJvcGVydHkge0BsaW5rIEFFLmNvbmRpdGlvbnMgfSwge0BsaW5rIEFFLmluZGV4IH0gYW5kIHtAbGluayBBRS5pZHhFbmQgfSB1c2VkIGJ5IHtAbGluayBBRS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnQgU2VlIHtAbGluayBFUS5jaGVjayB9LiAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmRpdGlvbnMsIGluZGV4ID0gdW5kZWZpbmVkLCBpZHhFbmQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25zID0gY29uZGl0aW9ucztcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmlkeEVuZCA9IGlkeEVuZDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi4vREJDXCI7XG4vKipcbiAqIEEge0BsaW5rIERCQyB9IGRlZmluaW5nIGEgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB7QGxpbmsgb2JqZWN0IH1zLlxuICpcbiAqIEByZW1hcmtzXG4gKiBNYWludGFpbmVyOiBDYWxsYXJpLCBTYWx2YXRvcmUgKFhEQkNAV2FYQ29kZS5uZXQpICovXG5leHBvcnQgY2xhc3MgQ09NUEFSSVNPTiBleHRlbmRzIERCQyB7XG4gICAgLy8gI3JlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLyoqXG4gICAgICogRG9lcyBhIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUge0BsaW5rIG9iamVjdCB9ICoqdG9DaGVjayoqIGFuZCB0aGUgKiplcXVpdmFsZW50KiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0XHRUaGUgdmFsdWUgdGhhdCBoYXMgdG8gYmUgZXF1YWwgdG8gaXQncyBwb3NzaWJsZSAqKmVxdWl2YWxlbnQqKiBmb3IgdGhpcyB7QGxpbmsgREJDIH0gdG8gYmUgZnVsZmlsbGVkLlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHRUaGUge0BsaW5rIG9iamVjdCB9IHRoZSBvbmUgKip0b0NoZWNrKiogaGFzIHRvIGJlIGVxdWFsIHRvIGluIG9yZGVyIGZvciB0aGlzIHtAbGluayBEQkMgfSB0byBiZVxuICAgICAqIFx0XHRcdFx0XHRcdGZ1bGZpbGxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUgKiplcXVpdmFsZW50KiogYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIsIG90aGVyd2lzZSBGQUxTRS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSBmb3IgZHluYW1pYyBjb21wYXJpc29uXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkLCBpbnZlcnQpIHtcbiAgICAgICAgaWYgKGVxdWFsaXR5UGVybWl0dGVkICYmICFpbnZlcnQgJiYgdG9DaGVjayA8IGVxdWl2YWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVxdWFsaXR5UGVybWl0dGVkICYmIGludmVydCAmJiB0b0NoZWNrID4gZXF1aXZhbGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFwiJHtlcXVpdmFsZW50fVwiYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFsaXR5UGVybWl0dGVkICYmICFpbnZlcnQgJiYgdG9DaGVjayA8PSBlcXVpdmFsZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byBiZSBncmVhdGVyIHRoYW4gXCIke2VxdWl2YWxlbnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXF1YWxpdHlQZXJtaXR0ZWQgJiYgaW52ZXJ0ICYmIHRvQ2hlY2sgPj0gZXF1aXZhbGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gYmUgbGVzcyB0aGFuIFwiJHtlcXVpdmFsZW50fVwiYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwYXJhbWV0ZXItZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0ICAgIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBlcXVhbGl0eVBlcm1pdHRlZCBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdCAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdCAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUFJFKENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0sIFtlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCwgaW52ZXJ0XSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHQgICAgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIGVxdWFsaXR5UGVybWl0dGVkIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0ICAgIFNlZSB7QGxpbmsgREJDLlBvc3Rjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmNyZWF0ZVBPU1QoQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSwgW2VxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkLCBpbnZlcnRdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZpZWxkLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0ICAgIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBlcXVhbGl0eVBlcm1pdHRlZCBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdCAgICBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdCAgICBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlSU5WQVJJQU5UKENPTVBBUklTT04sIFtlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCwgaW52ZXJ0XSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy8gI3JlZ2lvbiBSZWZlcmVuY2VkIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIER5bmFtaWMgdXNhZ2UuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfSBwYXNzaW5nIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiwge0BsaW5rIENPTVBBUklTT04uZXF1aXZhbGVudCB9IGFuZCB7QGxpbmsgQ09NUEFSSVNPTi5pbnZlcnQgfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSBmb3IgZHluYW1pYyBjb21wYXJpc29uXG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLmVxdWl2YWxlbnQsIHRoaXMuZXF1YWxpdHlQZXJtaXR0ZWQsIHRoaXMuaW52ZXJ0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGlzIHtAbGluayBDT01QQVJJU09OIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBDT01QQVJJU09OLmVxdWl2YWxlbnQgfSwge0BsaW5rIENPTVBBUklTT04uZXF1YWxpdHlQZXJtaXR0ZWQgfSBhbmQge0BsaW5rIENPTVBBUklTT04uaW52ZXJ0IH0gdXNlZCBieSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnQgICAgICAgIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVjayB9LlxuICAgICAqIEBwYXJhbSBlcXVhbGl0eVBlcm1pdHRlZCBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2sgfS5cbiAgICAgKiBAcGFyYW0gaW52ZXJ0ICAgICAgICAgICAgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrIH0uICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgICAgICB0aGlzLmVxdWFsaXR5UGVybWl0dGVkID0gZXF1YWxpdHlQZXJtaXR0ZWQ7XG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT04gfSBmcm9tIFwiLi4vQ09NUEFSSVNPTlwiO1xuLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTiB9LiAqL1xuZXhwb3J0IGNsYXNzIEdSRUFURVIgZXh0ZW5kcyBDT01QQVJJU09OIHtcbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBSRSB9LiAqL1xuICAgIHN0YXRpYyBQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBSRShlcXVpdmFsZW50LCBmYWxzZSwgZmFsc2UsIHBhdGgsIGhpbnQsIGRiYyk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUE9TVCB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QT1NUKGVxdWl2YWxlbnQsIGZhbHNlLCBmYWxzZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5JTlZBUklBTlQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgZmFsc2UsIGZhbHNlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLmNvbnN0cnVjdG9yIH0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50KSB7XG4gICAgICAgIHN1cGVyKGVxdWl2YWxlbnQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ09NUEFSSVNPTiB9IGZyb20gXCIuLi9DT01QQVJJU09OXCI7XG4vKiogU2VlIHtAbGluayBDT01QQVJJU09OIH0uICovXG5leHBvcnQgY2xhc3MgR1JFQVRFUl9PUl9FUVVBTCBleHRlbmRzIENPTVBBUklTT04ge1xuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUFJFIH0uICovXG4gICAgc3RhdGljIFBSRShcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IENvbXBhcmlzb24gdGFyZ2V0IGNhbiBiZSBhbnkgbnVtZXJpYyB2YWx1ZVxuICAgIGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUFJFKGVxdWl2YWxlbnQsIHRydWUsIGZhbHNlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBPU1QgfS4gKi9cbiAgICBzdGF0aWMgUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IENvbXBhcmlzb24gdGFyZ2V0IGNhbiBiZSBhbnkgbnVtZXJpYyB2YWx1ZVxuICAgIGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUE9TVChlcXVpdmFsZW50LCB0cnVlLCBmYWxzZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5JTlZBUklBTlQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgdHJ1ZSwgZmFsc2UsIHBhdGgsIGhpbnQsIGRiYyk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uY29uc3RydWN0b3IgfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IENvbXBhcmlzb24gdGFyZ2V0IGNhbiBiZSBhbnkgbnVtZXJpYyB2YWx1ZVxuICAgIGNvbnN0cnVjdG9yKGVxdWl2YWxlbnQpIHtcbiAgICAgICAgc3VwZXIoZXF1aXZhbGVudCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT04gfSBmcm9tIFwiLi4vQ09NUEFSSVNPTlwiO1xuLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTiB9LiAqL1xuZXhwb3J0IGNsYXNzIExFU1MgZXh0ZW5kcyBDT01QQVJJU09OIHtcbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBSRSB9LiAqL1xuICAgIHN0YXRpYyBQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBSRShlcXVpdmFsZW50LCBmYWxzZSwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QT1NUIH0uICovXG4gICAgc3RhdGljIFBPU1QoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBPU1QoZXF1aXZhbGVudCwgZmFsc2UsIHRydWUsIHBhdGgsIGhpbnQsIGRiYyk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uSU5WQVJJQU5UIH0uICovXG4gICAgc3RhdGljIElOVkFSSUFOVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IENvbXBhcmlzb24gdGFyZ2V0IGNhbiBiZSBhbnkgbnVtZXJpYyB2YWx1ZVxuICAgIGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uSU5WQVJJQU5UKGVxdWl2YWxlbnQsIGZhbHNlLCB0cnVlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLmNvbnN0cnVjdG9yIH0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50KSB7XG4gICAgICAgIHN1cGVyKGVxdWl2YWxlbnQsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5lcXVpdmFsZW50ID0gZXF1aXZhbGVudDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDT01QQVJJU09OIH0gZnJvbSBcIi4uL0NPTVBBUklTT05cIjtcbi8qKiBTZWUge0BsaW5rIENPTVBBUklTT04gfS4gKi9cbmV4cG9ydCBjbGFzcyBMRVNTX09SX0VRVUFMIGV4dGVuZHMgQ09NUEFSSVNPTiB7XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QUkUgfS4gKi9cbiAgICBzdGF0aWMgUFJFKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QUkUoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QT1NUIH0uICovXG4gICAgc3RhdGljIFBPU1QoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBPU1QoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5JTlZBUklBTlQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jb25zdHJ1Y3RvciB9LiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgY29uc3RydWN0b3IoZXF1aXZhbGVudCkge1xuICAgICAgICBzdXBlcihlcXVpdmFsZW50LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5lcXVpdmFsZW50ID0gZXF1aXZhbGVudDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi4vREJDXCI7XG4vKipcbiAqIEEge0BsaW5rIERCQyB9IGRlZmluaW5nIHRoYXQgdHdvIHtAbGluayBvYmplY3QgfXMgZ290dGEgYmUgZXF1YWwuXG4gKlxuICogQHJlbWFya3NcbiAqIE1haW50YWluZXI6IENhbGxhcmksIFNhbHZhdG9yZSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBFUSBleHRlbmRzIERCQyB7XG4gICAgLy8gI3JlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkICoqZXF1aXZhbGVudCoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvQ2hlY2tcdFx0VGhlIHZhbHVlIHRoYXQgaGFzIHRvIGJlIGVxdWFsIHRvIGl0J3MgcG9zc2libGUgKiplcXVpdmFsZW50KiogZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlIGZ1bGZpbGxlZC5cbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0VGhlIHtAbGluayBvYmplY3QgfSB0aGUgb25lICoqdG9DaGVjayoqIGhhcyB0byBiZSBlcXVhbCB0byBpbiBvcmRlciBmb3IgdGhpcyB7QGxpbmsgREJDIH0gdG8gYmVcbiAgICAgKiBcdFx0XHRcdFx0XHRmdWxmaWxsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUUlVFIGlmIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBhbmQgdGhlICoqZXF1aXZhbGVudCoqIGFyZSBlcXVhbCB0byBlYWNoIG90aGVyLCBvdGhlcndpc2UgRkFMU0UuICovXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgIHRvQ2hlY2ssIGVxdWl2YWxlbnQsIGludmVydCkge1xuICAgICAgICBpZiAoIWludmVydCAmJiBlcXVpdmFsZW50ICE9PSB0b0NoZWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byBiZSBlcXVhbCB0byBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludmVydCAmJiBlcXVpdmFsZW50ID09PSB0b0NoZWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIG11c3Qgbm90IGJlIGVxdWFsIHRvIFwiJHtlcXVpdmFsZW50fVwiYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwYXJhbWV0ZXItZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdFNlZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBUbyBjaGVjayBmb3IgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgIGVxdWl2YWxlbnQsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVQUkUoRVEuY2hlY2tBbGdvcml0aG0sIFtlcXVpdmFsZW50LCBpbnZlcnRdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHRTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRTZWUge0BsaW5rIERCQy5Qb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFRvIGNoZWNrIGZvciBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmNyZWF0ZVBPU1QoRVEuY2hlY2tBbGdvcml0aG0sIFtlcXVpdmFsZW50LCBpbnZlcnRdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZpZWxkLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIGZpZWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdFNlZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBUbyBjaGVjayBmb3IgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgIGVxdWl2YWxlbnQsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVJTlZBUklBTlQoRVEsIFtlcXVpdmFsZW50LCBpbnZlcnRdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vXG4gICAgLy8gRm9yIHVzYWdlIGluIGR5bmFtaWMgc2NlbmFyaW9zIChsaWtlIHdpdGggQUUtREJDKS5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqLCB7QGxpbmsgRVEuZXF1aXZhbGVudCB9IGFuZCB7QGxpbmsgRVEuaW52ZXJ0IH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBjaGVjayBhZ2FpbnN0IE5VTEwgJiBVTkRFRklORUQuXG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICByZXR1cm4gRVEuY2hlY2tBbGdvcml0aG0odG9DaGVjaywgdGhpcy5lcXVpdmFsZW50LCB0aGlzLmludmVydCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUgc3BlY2lmaWVkICoqdHlwZSoqIC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGRvZXNuJ3QgZnVsZmlsbCB0aGlzIHtAbGluayBFUSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBFUSB9LiovXG4gICAgc3RhdGljIHRzQ2hlY2sodG9DaGVjaywgZXF1aXZhbGVudCwgaGludCA9IHVuZGVmaW5lZCwgaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gRVEuY2hlY2tBbGdvcml0aG0odG9DaGVjaywgZXF1aXZhbGVudCwgZmFsc2UpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjaztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChgJHtpZCA/IGAoJHtpZH0pIGAgOiBcIlwifSR7cmVzdWx0fSAke2hpbnQgPyBg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhpcyB7QGxpbmsgRVEgfSBieSBzZXR0aW5nIHRoZSBwcm90ZWN0ZWQgcHJvcGVydHkge0BsaW5rIEVRLmVxdWl2YWxlbnQgfSB1c2VkIGJ5IHtAbGluayBFUS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnQgU2VlIHtAbGluayBFUS5jaGVjayB9LiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVG8gYmUgYWJsZSB0byBtYXRjaCBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lcXVpdmFsZW50ID0gZXF1aXZhbGVudDtcbiAgICAgICAgdGhpcy5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRVEgfSBmcm9tIFwiLi4vRVFcIjtcbi8qKlxuICogRElGRkVSRU5UIGNsYXNzIGZvciBpbmVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIFRoaXMgY2xhc3MgZXh0ZW5kcyBFUSBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGRpZmZlcmVudCAobm90IGVxdWFsKVxuICogZnJvbSBhIHNwZWNpZmllZCBlcXVpdmFsZW50IHZhbHVlLiBJdCBpbnZlcnRzIHRoZSBlcXVhbGl0eSBjaGVjayBieSBhbHdheXMgcGFzc2luZ1xuICogYHRydWVgIGZvciB0aGUgaW52ZXJ0IHBhcmFtZXRlciB0byB0aGUgcGFyZW50IEVRIGNsYXNzIG1ldGhvZHMuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSBjbGFzcyBwcm92aWRlcyBwcmVjb25kaXRpb24gKFBSRSksIHBvc3Rjb25kaXRpb24gKFBPU1QpLCBhbmQgaW52YXJpYW50IChJTlZBUklBTlQpXG4gKiBjaGVja3MgZm9yIERlc2lnbiBieSBDb250cmFjdCBwcm9ncmFtbWluZyBwYXR0ZXJucy5cbiAqXG4gKiBAc2VlIHtAbGluayBDT01QQVJJU09OfVxuICogQHNlZSB7QGxpbmsgRVF9XG4gKi9cbmV4cG9ydCBjbGFzcyBESUZGRVJFTlQgZXh0ZW5kcyBFUSB7XG4gICAgLyoqIFNlZSB7QGxpbmsgRVEuUFJFIH0uIEFsd2F5cyBpbnZlcnRzIGVxdWFsaXR5IGNoZWNrLiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTXVzdCBtYXRjaCBwYXJlbnQgc2lnbmF0dXJlXG4gICAgc3RhdGljIFBSRShlcXVpdmFsZW50LCBfaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRVEuUFJFKGVxdWl2YWxlbnQsIHRydWUsIHBhdGgsIGhpbnQsIGRiYyk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIEVRLlBPU1QgfS4gQWx3YXlzIGludmVydHMgZXF1YWxpdHkgY2hlY2suICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IG1hdGNoIHBhcmVudCBzaWduYXR1cmVcbiAgICBzdGF0aWMgUE9TVChlcXVpdmFsZW50LCBfaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRVEuUE9TVChlcXVpdmFsZW50LCB0cnVlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBFUS5JTlZBUklBTlQgfS4gQWx3YXlzIGludmVydHMgZXF1YWxpdHkgY2hlY2suICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IG1hdGNoIHBhcmVudCBzaWduYXR1cmVcbiAgICBzdGF0aWMgSU5WQVJJQU5UKGVxdWl2YWxlbnQsIF9pbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBFUS5JTlZBUklBTlQoZXF1aXZhbGVudCwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgRVEuY29uc3RydWN0b3IgfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgbWF0Y2ggcGFyZW50IHNpZ25hdHVyZVxuICAgIGNvbnN0cnVjdG9yKGVxdWl2YWxlbnQpIHtcbiAgICAgICAgc3VwZXIoZXF1aXZhbGVudCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IHRoZSBhbiB7QGxpbmsgb2JqZWN0IH1zIGdvdHRhIGJlIGFuIGluc3RhbmNlIG9mIGEgY2VydGFpbiB7QGxpbmsgSU5TVEFOQ0UucmVmZXJlbmNlIH0uXG4gKlxuICogQHJlbWFya3NcbiAqIE1haW50YWluZXI6IFNhbHZhdG9yZSBDYWxsYXJpIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIElOU1RBTkNFIGV4dGVuZHMgREJDIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgKipyZWZlcmVuY2UqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRUaGUgdmFsdWUgdGhhdCBoYXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgdGhlICoqcmVmZXJlbmNlKiogaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9XG4gICAgICogXHRcdFx0XHRcdHRvIGJlIGZ1bGZpbGxlZC5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRUaGUge0BsaW5rIG9iamVjdCB9IHRoZSBvbmUgKip0b0NoZWNrKiogaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogaXMgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlICpyZWZlcmVuY2UqKiwgKip1bmRlZmluZWQqKiBvciAqKm51bGwqKiwgb3RoZXJ3aXNlIEZBTFNFLiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogSW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBcImluc3RhbmNlb2ZcIiBjaGVjay5cbiAgICBzdGF0aWMgY2hlY2tBbGdvcml0aG0odG9DaGVjaywgLi4ucmVmZXJlbmNlcykge1xuICAgICAgICBpZiAodG9DaGVjayA9PT0gbnVsbCB8fCB0b0NoZWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIGlmICh0b0NoZWNrIGluc3RhbmNlb2YgcmVmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgXCIke3JlZmVyZW5jZXMubWFwKChyZWYpID0+IHJlZi5uYW1lIHx8IHJlZikuam9pbihcIiwgXCIpfVwiIGJ1dCBpcyBvZiB0eXBlIFwiJHt0eXBlb2YgdG9DaGVja31cImA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUFJFKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogSW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBcImluc3RhbmNlb2ZcIiBjaGVjay5cbiAgICByZWZlcmVuY2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWZzID0gQXJyYXkuaXNBcnJheShyZWZlcmVuY2UpID8gcmVmZXJlbmNlIDogW3JlZmVyZW5jZV07XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUFJFKElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtLCByZWZzLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0U2VlIHtAbGluayBEQkMuUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEluIG9yZGVyIHRvIHBlcmZvcm0gYW4gXCJpbnN0YW5jZW9mXCIgY2hlY2suXG4gICAgcmVmZXJlbmNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVmcyA9IEFycmF5LmlzQXJyYXkocmVmZXJlbmNlKSA/IHJlZmVyZW5jZSA6IFtyZWZlcmVuY2VdO1xuICAgICAgICByZXR1cm4gREJDLmNyZWF0ZVBPU1QoSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0sIHJlZnMsIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uICovXG4gICAgc3RhdGljIElOVkFSSUFOVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEluIG9yZGVyIHRvIHBlcmZvcm0gYW4gXCJpbnN0YW5jZW9mXCIgY2hlY2suXG4gICAgcmVmZXJlbmNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVJTlZBUklBTlQoSU5TVEFOQ0UsIFtyZWZlcmVuY2VdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vXG4gICAgLy8gRm9yIHVzYWdlIGluIGR5bmFtaWMgc2NlbmFyaW9zIChsaWtlIHdpdGggQUUtREJDKS5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIElOU1RBTkNFLnJlZmVyZW5jZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG19LiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgIGNoZWNrKHRvQ2hlY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5yZWZlcmVuY2UpXG4gICAgICAgICAgICA/IElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIC4uLnRoaXMucmVmZXJlbmNlKVxuICAgICAgICAgICAgOiBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLnJlZmVyZW5jZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFR5cGUtc2FmZSBjaGVjayB0aGF0IHZhbGlkYXRlcyBpZiBhIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIGEgc3BlY2lmaWVkIHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFx0VGhlIHZhbHVlIHRvIGNoZWNrIGZvciBpbnN0YW5jZSB2YWxpZGl0eS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRUaGUge0BsaW5rIG9iamVjdCB9IHRoZSBvbmUgKip0b0NoZWNrKiogaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mLlxuICAgICAqIEBwYXJhbSBoaW50XHRcdEFuIG9wdGlvbmFsIHtAbGluayBzdHJpbmcgfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gaW4gY2FzZSBvZiBhbiBpbmZyaW5nZW1lbnQuXG4gICAgICogQHBhcmFtIGlkXHRcdEEge0BsaW5rIHN0cmluZyB9IGlkZW50aWZ5aW5nIHRoaXMge0BsaW5rIElOU1RBTkNFIH0gdmlhIHRoZSB7QGxpbmsgREJDLkluZnJpbmdlbWVudCB9LU1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBpZiBpdCBmdWxmaWxscyB0aGlzIHtAbGluayBJTlNUQU5DRSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBJTlNUQU5DRSB9LiAqL1xuICAgIHN0YXRpYyB0c0NoZWNrKHRvQ2hlY2ssIHJlZmVyZW5jZSwgaGludCA9IHVuZGVmaW5lZCwgaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIElOU1RBTkNFLnRzQ2hlY2tNdWx0aSh0b0NoZWNrLCBbcmVmZXJlbmNlXSwgaGludCwgaWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfSBwYXNzaW5nIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBhbmQgdGhlIHtAbGluayBJTlNUQU5DRS5yZWZlcmVuY2UgfSAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0QW4gb3B0aW9uYWwge0BsaW5rIHN0cmluZyB9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBpbiBjYXNlIG9mIGFuIGluZnJpbmdlbWVudC5cbiAgICAgKiBAcGFyYW0gaWRcdFx0QSB7QGxpbmsgc3RyaW5nIH0gaWRlbnRpZnlpbmcgdGhpcyB7QGxpbmsgSU5TVEFOQ0UgfSB2aWEgdGhlIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0tTWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGRvZXNuJ3QgZnVsZmlsbCB0aGlzIHtAbGluayBJTlNUQU5DRSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBERUZJTkVEIH0uICovXG4gICAgc3RhdGljIHRzQ2hlY2tNdWx0aSh0b0NoZWNrLCByZWZlcmVuY2VzLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCAuLi5yZWZlcmVuY2VzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQoYCR7aWQgPyBgKCR7aWR9KSBgIDogXCJcIn0ke3Jlc3VsdH0gJHtoaW50ID8gYOKcqCAke2hpbnR9IOKcqGAgOiBcIlwifWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIElOU1RBTkNFIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBJTlNUQU5DRS5yZWZlcmVuY2UgfSB1c2VkIGJ5IHtAbGluayBJTlNUQU5DRS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZmVyZW5jZSBTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrIH0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERCQyB9IGZyb20gXCIuLi9EQkNcIjtcbi8qKlxuICogQSB7QGxpbmsgREJDIH0gcHJvdmlkaW5nIHtAbGluayBSRUdFWCB9LWNvbnRyYWN0cyBhbmQgc3RhbmRhcmQge0BsaW5rIFJlZ0V4cCB9IGZvciBjb21tb24gdXNlIGNhc2VzIGluIHtAbGluayBSRUdFWC5zdGRFeHAgfS5cbiAqXG4gKiBAcmVtYXJrc1xuICogTWFpbnRhaW5lcjogQ2FsbGFyaSwgU2FsdmF0b3JlIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIFJFR0VYIGV4dGVuZHMgREJDIHtcbiAgICBzdGF0aWMgZ2V0IHN0ZEV4cCgpIHtcbiAgICAgICAgaWYgKCFSRUdFWC5fc3RkRXhwKSB7XG4gICAgICAgICAgICBSRUdFWC5fc3RkRXhwID0ge1xuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lOiAvXlthLXpBLVpfOl1bYS16QS1aMC05Xy46LV0qJC8sXG4gICAgICAgICAgICAgICAgZU1haWw6IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kL2ksXG4gICAgICAgICAgICAgICAgcHJvcGVydHk6IC9eWyRfQS1aYS16XVskX0EtWmEtejAtOV0qJC8sXG4gICAgICAgICAgICAgICAgdXJsOiAvXig/Omh0dHBzP3xmdHApOlxcL1xcL1teXFxzLyQuPyNdLlteXFxzXSokL2ksXG4gICAgICAgICAgICAgICAga2V5UGF0aDogL14oW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFwuKSpbYS16QS1aXyRdW2EtekEtWjAtOV8kXSokLyxcbiAgICAgICAgICAgICAgICBkYXRlOiAvXlxcZHsxLDR9Wy5cXC8tXVxcZHsxLDJ9Wy5cXC8tXVxcZHsxLDR9JC9pLFxuICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQ6IC9eKChEezEsMn1bLi8tXU17MSwyfVsuLy1dWXsxLDR9KXwoTXsxLDJ9Wy4vLV1EezEsMn1bLi8tXVl7MSw0fSl8WXsxLDR9Wy4vLV1EezEsMn1bLi8tXU17MSwyfXwoWXsxLDR9Wy4vLV1NezEsMn1bLi8tXUR7MSwyfSkpJC9pLFxuICAgICAgICAgICAgICAgIGNzc1NlbGVjdG9yOiAvXig/OlxcKnwjW1xcdy1dK3xcXC5bXFx3LV0rfCg/OltcXHctXSt8XFwqKSg/OjooPzpbXFx3LV0rKD86XFwoW1xcdy1dK1xcKSk/KSspPyg/OlxcWyg/OltcXHctXSsoPzooPzo9fH49fFxcfD18XFwqPXxcXCQ9fFxcXj0pXFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXFx3LV0rKVxccyopPyk/XFxdKSt8XFxbXFxzKltcXHctXStcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W1xcdy1dKylcXHMqXFxdKSg/OixcXHMqKD86XFwqfCNbXFx3LV0rfFxcLltcXHctXSt8KD86W1xcdy1dK3xcXCopKD86Oig/OltcXHctXSsoPzpcXChbXFx3LV0rXFwpKT8pKyk/KD86XFxbKD86W1xcdy1dKyg/Oig/Oj18fj18XFx8PXxcXCo9fFxcJD18XFxePSlcXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFtcXHctXSspXFxzKik/KT9cXF0pK3xcXFtcXHMqW1xcdy1dK1xccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXFx3LV0rKVxccypcXF0pKSokLyxcbiAgICAgICAgICAgICAgICBib29sZWFuOiAvXihUUlVFfEZBTFNFKSQvaSxcbiAgICAgICAgICAgICAgICBjb2xvckNvZGVIRVg6IC9eIyhbQS1GYS1mXFxkXXszLDR9fFtBLUZhLWZcXGRdezZ9fFtBLUZhLWZcXGRdezh9KSQvaSxcbiAgICAgICAgICAgICAgICBzaW1wbGVIb3RrZXk6IC9eKChBbHR8Q3RybHxTaGlmdHxNZXRhKVxcKykrW2EtelxcZF0kL2ksXG4gICAgICAgICAgICAgICAgYmNwNDc6IC9eKD86W2Etel17MiwzfSg/Oi1bYS16XXszfSl7MCwzfXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi1bYS16XXs0fSk/KD86LVthLXpdezJ9fC1bMC05XXszfSk/KD86LVthLXowLTldezUsOH18LVswLTldW2EtejAtOV17M30pKig/Oi1bMC05YS13eS16XSg/Oi1bYS16MC05XXsyLDh9KSspKig/Oi14KD86LVthLXowLTldezEsOH0pKyk/JHxeeCg/Oi1bYS16MC05XXsxLDh9KSskL2ksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSRUdFWC5fc3RkRXhwO1xuICAgIH1cbiAgICAvLyAjcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIGNvbXBsaWVzIHRvIHRoZSB7QGxpbmsgUmVnRXhwIH0gKipleHByZXNzaW9uKiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0XHRUaGUgdmFsdWUgdGhhdCBoYXMgY29tcGx5IHRvIHRoZSB7QGxpbmsgUmVnRXhwIH0gKipleHByZXNzaW9uKiogZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlIGZ1bGZpbGxlZC5cbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0VGhlIHtAbGluayBSZWdFeHAgfSB0aGUgb25lICoqdG9DaGVjayoqIGhhcyBjb21wbHkgdG8gaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlXG4gICAgICogXHRcdFx0XHRcdFx0ZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogY29tcGxpZXMgd2l0aCB0aGUge0BsaW5rIFJlZ0V4cCB9ICoqZXhwcmVzc2lvbioqLCBvdGhlcndpc2UgRkFMU0UuICovXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKHRvQ2hlY2sgPT09IHVuZGVmaW5lZCB8fCB0b0NoZWNrID09PSBudWxsIHx8IHRvQ2hlY2sgPT09IFwiXCIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFleHByZXNzaW9uLnRlc3QodG9DaGVjaykpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGNvbXBseSB0byByZWd1bGFyIGV4cHJlc3Npb24gXCIke2V4cHJlc3Npb259XCJgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHBhcmFtZXRlci1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBSRShleHByZXNzaW9uLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVQUkUoUkVHRVguY2hlY2tBbGdvcml0aG0sIFtleHByZXNzaW9uXSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBPU1QoZXhwcmVzc2lvbiwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUE9TVChSRUdFWC5jaGVja0FsZ29yaXRobSwgW2V4cHJlc3Npb25dLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZpZWxkLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgUkVHRVguY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIGZpZWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFNlZSB7QGxpbmsgUkVHRVguY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXhwcmVzc2lvbiwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlSU5WQVJJQU5UKFJFR0VYLCBbZXhwcmVzc2lvbl0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2Ugd2l0aCBBRS1EQkMpLlxuICAgIC8vXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0gcGFzc2luZyB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHtAbGluayBSRUdFWC5lcXVpdmFsZW50IH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIHJldHVybiBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUeXBlLXNhZmUgY2hlY2sgdGhhdCB2YWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IGEgcmVndWxhciBleHByZXNzaW9uIGFuZCByZXR1cm5zIGl0IGFzIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRcdFRoZSB2YWx1ZSB0byBjaGVjayBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgYWdhaW5zdC5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdE9wdGlvbmFsIGhpbnQgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBlcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICAgICAqIEBwYXJhbSBpZFx0XHRcdE9wdGlvbmFsIGlkZW50aWZpZXIgdG8gaW5jbHVkZSBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdmFsdWUgY2FzdCB0byB0aGUgQ0FORElEQVRFIHR5cGUuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtAbGluayBEQkMuSW5mcmluZ2VtZW50fSBpZiB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gKi9cbiAgICBzdGF0aWMgdHNDaGVjayh0b0NoZWNrLCBleHByZXNzaW9uLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCBleHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQoYCR7aWQgPyBgKCR7aWR9KSBgIDogXCJcIn0ke3Jlc3VsdH0ke2hpbnQgPyBgIOKcqCAke2hpbnR9IOKcqGAgOiBcIlwifWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIFJFR0VYIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBSRUdFWC5leHByZXNzaW9uIH0gdXNlZCBieSB7QGxpbmsgUkVHRVguY2hlY2sgfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleHByZXNzaW9uIFNlZSB7QGxpbmsgUkVHRVguY2hlY2sgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy8gI3JlZ2lvbiBJbi1NZXRob2QgY2hlY2tpbmcuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0gcGFzc2luZyB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHtAbGluayBSRUdFWC5leHByZXNzaW9uIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0XHRTZWUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtfS5cbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobX0uXG4gICAgICovXG4gICAgc3RhdGljIGNoZWNrKHRvQ2hlY2ssIGV4cHJlc3Npb24pIHtcbiAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCBleHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGVja1Jlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQoY2hlY2tSZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IGFuIHtAbGluayBvYmplY3QgfXMgZ290dGEgYmUgb2YgY2VydGFpbiB7QGxpbmsgVFlQRS50eXBlIH0uXG4gKlxuICogQHJlbWFya3NcbiAqIEF1dGhvcjogXHRcdFNhbHZhdG9yZSBDYWxsYXJpIChDYWxsYXJpQFdhWENvZGUubmV0KSAvIDIwMjVcbiAqIE1haW50YWluZXI6XHRTYWx2YXRvcmUgQ2FsbGFyaSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBUWVBFIGV4dGVuZHMgREJDIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIG9mIHRoZSAqKnR5cGUqKiBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0VGhlIHtAbGluayBPYmplY3QgfSB3aGljaCdzICoqdHlwZSoqIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB0eXBlXHRcdFRoZSB0eXBlIHRoZSB7QGxpbmsgb2JqZWN0fSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgb2YuIENhbiBiZSBhIHNpbmdsZSB0eXBlIG9yIG11bHRpcGxlIHR5cGVzIHNlcGFyYXRlZCBieSBcInxcIi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIG9mIHRoZSBzcGVjaWZpZWQgKip0eXBlKiosIG90aGVyd2lzZSBGQUxTRS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSBmb3IgZHluYW1pYyB0eXBlIGNoZWNraW5nIG9mIGFsc28gVU5ERUZJTkVELlxuICAgIHN0YXRpYyBjaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0eXBlKSB7XG4gICAgICAgIGlmICh0b0NoZWNrID09PSB1bmRlZmluZWQgfHwgdG9DaGVjayA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCB0eXBlcyA9IHR5cGUuc3BsaXQoXCJ8XCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuICAgICAgICBjb25zdCBhY3R1YWxUeXBlID0gdHlwZW9mIHRvQ2hlY2s7XG4gICAgICAgIC8vICNyZWdpb24gQ2hlY2sgaWYgdGhlIGFjdHVhbCB0eXBlIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXNcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VWYWxpZFR5cGVvZjogTmVjZXNzYXJ5XG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSB0eXBlcy5zb21lKCh0KSA9PiBhY3R1YWxUeXBlID09PSB0KTtcbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICBpZiAodHlwZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gYmUgb2YgdHlwZSBcIiR7dHlwZX1cIiBidXQgaXMgb2YgdHlwZSBcIiR7YWN0dWFsVHlwZX1cImA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byBiZSBvZiB0eXBlIFwiJHt0eXBlcy5qb2luKFwiIHwgXCIpfVwiIGJ1dCBpcyBvZiB0eXBlIFwiJHthY3R1YWxUeXBlfVwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyAjZW5kcmVnaW9uIENoZWNrIGlmIHRoZSBhY3R1YWwgdHlwZSBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHBhcmFtZXRlci1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0QSA6Oi1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgcGF0aHMgdG8gY2hlY2suIEVhY2ggcGF0aCBwb2ludHMgdG8gYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgICAgKiBcdFx0XHRcdFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBza2lwcGVkLiBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQUkUodHlwZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUFJFKFRZUEUuY2hlY2tBbGdvcml0aG0sIFt0eXBlXSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0QSA6Oi1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgcGF0aHMgdG8gY2hlY2suIEVhY2ggcGF0aCBwb2ludHMgdG8gYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgICAgKiBcdFx0XHRcdFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBza2lwcGVkLiBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBPU1QodHlwZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUE9TVChUWVBFLmNoZWNrQWxnb3JpdGhtLCBbdHlwZV0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0QSA6Oi1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgcGF0aHMgdG8gY2hlY2suIEVhY2ggcGF0aCBwb2ludHMgdG8gYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgICAgKiBcdFx0XHRcdFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBza2lwcGVkLiBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQodHlwZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlSU5WQVJJQU5UKFRZUEUsIFt0eXBlXSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy8gI3JlZ2lvbiBSZWZlcmVuY2VkIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvL1xuICAgIC8vIEZvciB1c2FnZSBpbiBkeW5hbWljIHNjZW5hcmlvcyAobGlrZSB3aXRoIEFFLURCQykuXG4gICAgLy9cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIFRZUEUudHlwZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIHJldHVybiBUWVBFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIHRoaXMudHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0gcGFzc2luZyB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHRoZSB7QGxpbmsgVFlQRS50eXBlIH0gLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvQ2hlY2tcdFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSB0eXBlXHRcdFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBoaW50XHRcdEFuIG9wdGlvbmFsIHtAbGluayBzdHJpbmcgfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gaW4gY2FzZSBvZiBhbiBpbmZyaW5nZW1lbnQuXG4gICAgICogQHBhcmFtIGlkXHRcdEEge0BsaW5rIHN0cmluZyB9IGlkZW50aWZ5aW5nIHRoaXMge0BsaW5rIFRZUEUgfSB2aWEgdGhlIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0tTWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGRvZXNuJ3QgZnVsZmlsbCB0aGlzIHtAbGluayBUWVBFIH0uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEEge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfSBpZiB0aGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBkb2VzIG5vdCBmdWxmaWxsIHRoaXMge0BsaW5rIERFRklORUQgfS4gKi9cbiAgICBzdGF0aWMgdHNDaGVjayh0b0NoZWNrLCB0eXBlLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBUWVBFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIHR5cGUpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjaztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChgJHtpZCA/IGAoJHtpZH0pIGAgOiBcIlwifSR7cmVzdWx0fSR7aGludCA/IGAg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhpcyB7QGxpbmsgVFlQRSB9IGJ5IHNldHRpbmcgdGhlIHByb3RlY3RlZCBwcm9wZXJ0eSB7QGxpbmsgVFlQRS50eXBlIH0gdXNlZCBieSB7QGxpbmsgVFlQRS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgU2VlIHtAbGluayBUWVBFLmNoZWNrIH0uICovXG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBtb2R1bGVJZCArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJ2YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG52YXIgX19tZXRhZGF0YSA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7XG59O1xudmFyIF9fcGFyYW0gPSAodGhpcyAmJiB0aGlzLl9fcGFyYW0pIHx8IGZ1bmN0aW9uIChwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn07XG5pbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi9EQkNcIjtcbmltcG9ydCB7IEFFIH0gZnJvbSBcIi4vREJDL0FFXCI7XG5pbXBvcnQgeyBHUkVBVEVSIH0gZnJvbSBcIi4vREJDL0NPTVBBUklTT04vR1JFQVRFUlwiO1xuaW1wb3J0IHsgR1JFQVRFUl9PUl9FUVVBTCB9IGZyb20gXCIuL0RCQy9DT01QQVJJU09OL0dSRUFURVJfT1JfRVFVQUxcIjtcbmltcG9ydCB7IExFU1MgfSBmcm9tIFwiLi9EQkMvQ09NUEFSSVNPTi9MRVNTXCI7XG5pbXBvcnQgeyBMRVNTX09SX0VRVUFMIH0gZnJvbSBcIi4vREJDL0NPTVBBUklTT04vTEVTU19PUl9FUVVBTFwiO1xuaW1wb3J0IHsgRVEgfSBmcm9tIFwiLi9EQkMvRVFcIjtcbmltcG9ydCB7IERJRkZFUkVOVCB9IGZyb20gXCIuL0RCQy9FUS9ESUZGRVJFTlRcIjtcbmltcG9ydCB7IElOU1RBTkNFIH0gZnJvbSBcIi4vREJDL0lOU1RBTkNFXCI7XG5pbXBvcnQgeyBSRUdFWCB9IGZyb20gXCIuL0RCQy9SRUdFWFwiO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gXCIuL0RCQy9UWVBFXCI7XG4vKiogRGVtb25zdHJhdGl2ZSB1c2Ugb2YgKipEKiplc2lnbiAqKkIqKnkgKipDKipvbnRyYWN0IERlY29yYXRvcnMgKi9cbmV4cG9ydCBjbGFzcyBEZW1vIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gI3JlZ2lvbiBDaGVjayBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAgICAgICAgdGhpcy50ZXN0UHJvcGVydHkgPSBcImFcIjtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBTdGF0aWMgTWV0aG9kIHdpdGggUGFyYW12YWx1ZVByb3ZpZGVyXG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgUHJvcGVydHkgRGVjb3JhdG9yXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBQYXJhbWV0ZXIuICYgUmV0dXJudmFsdWUgRGVjb3JhdG9yXG4gICAgdGVzdFBhcmFtdmFsdWVBbmRSZXR1cm52YWx1ZShhKSB7XG4gICAgICAgIHJldHVybiBgeHh4eCR7YX1gO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFBhcmFtZXRlci4gJiBSZXR1cm52YWx1ZSBEZWNvcmF0b3JcbiAgICAvLyAjcmVnaW9uIENoZWNrIFJldHVybnZhbHVlIERlY29yYXRvclxuICAgIHRlc3RSZXR1cm52YWx1ZShhKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFJldHVybnZhbHVlIERlY29yYXRvclxuICAgIC8vICNyZWdpb24gQ2hlY2sgRVEtREJDICYgUGF0aCB0byBwcm9wZXJ0eSBvZiBQYXJhbWV0ZXItdmFsdWVcbiAgICB0ZXN0RVFBbmRQYXRoKG8pIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgRVEtREJDICYgUGF0aCB0byBwcm9wZXJ0eSBvZiBQYXJhbWV0ZXItdmFsdWVcbiAgICAvLyAjcmVnaW9uIENoZWNrIEVRLURCQyAmIFBhdGggdG8gcHJvcGVydHkgb2YgUGFyYW1ldGVyLXZhbHVlIHdpdGggSW52ZXJzaW9uXG4gICAgdGVzdEVRQW5kUGF0aFdpdGhJbnZlcnNpb24obykgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBFUS1EQkMgJiBQYXRoIHRvIHByb3BlcnR5IG9mIFBhcmFtZXRlci12YWx1ZSB3aXRoIEludmVyc2lvblxuICAgIC8vICNyZWdpb24gQ2hlY2sgVFlQRVxuICAgIHRlc3RUWVBFKG8pIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgVFlQRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgQUVcbiAgICB0ZXN0QUUoeCkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBBRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgUkVHRVggd2l0aCBBRVxuICAgIHRlc3RSRUdFWFdpdGhBRSh4KSB7IH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFJFR0VYIHdpdGggQUVcbiAgICAvLyAjcmVnaW9uIENoZWNrIElOU1RBTkNFXG4gICAgdGVzdElOU1RBTkNFKGNhbmRpZGF0ZSkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBJTlNUQU5DRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgQUUgUmFuZ2VcbiAgICB0ZXN0QUVSYW5nZSh4KSB7IH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIEFFIFJhbmdlXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBBRSBJbmRleFxuICAgIHRlc3RBRUluZGV4KHgpIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgQUUgSW5kZXhcbiAgICAvLyAjcmVnaW9uIENoZWNrIENvbXBhcmlzb25cbiAgICB0ZXN0R1JFQVRFUihpbnB1dCkgeyB9XG4gICAgdGVzdEdSRUFURVJfT1JfRVFVQUwoaW5wdXQpIHsgfVxuICAgIHRlc3RMRVNTKGlucHV0KSB7IH1cbiAgICB0ZXN0TEVTU19PUl9FUVVBTChpbnB1dCkgeyB9XG4gICAgdGVzdERJRkZFUkVOVChpbnB1dCkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBDb21wYXJpc29uXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBTdGF0aWMgTWV0aG9kIHdpdGggUGFyYW12YWx1ZVByb3ZpZGVyXG4gICAgc3RhdGljIHRlc3RTdGF0aWNNZXRob2QobWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGAke21lc3NhZ2V9IHJlcGVhdGVkICR7Y291bnR9IHRpbWVzYDtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBSRUdFWC5JTlZBUklBTlQoL15hJC8pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0UHJvcGVydHlcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFJFR0VYLlBPU1QoL154eHh4LiokLyksXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIFJFR0VYLlBSRSgvaG9sbGEqL2cpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbU3RyaW5nXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIFN0cmluZylcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RQYXJhbXZhbHVlQW5kUmV0dXJudmFsdWVcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBSRUdFWC5QT1NUKC9eeHh4eC4qJC8pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtTdHJpbmddKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgU3RyaW5nKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFJldHVybnZhbHVlXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEVRLlBSRShcIlNFTEVDVFwiLCBmYWxzZSwgXCJ0YWdOYW1lXCIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbSFRNTEVsZW1lbnRdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEVRQW5kUGF0aFwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBFUS5QUkUoXCJTRUxFQ1RcIiwgdHJ1ZSwgXCJ0YWdOYW1lXCIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbSFRNTEVsZW1lbnRdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEVRQW5kUGF0aFdpdGhJbnZlcnNpb25cIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgVFlQRS5QUkUoXCJzdHJpbmdcIikpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFRZUEVcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgQUUuUFJFKFtuZXcgVFlQRShcInN0cmluZ1wiKV0pKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXldKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEFFXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEFFLlBSRShuZXcgUkVHRVgoL14oP2k6KE5PVyl8KFsrLV1cXGQrW2RteV0pKSQvaSkpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXldKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFJFR0VYV2l0aEFFXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlclxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVGVzdFxuICAgICxcbiAgICBfX3BhcmFtKDAsIElOU1RBTkNFLlBSRShEYXRlKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0SU5TVEFOQ0VcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgQUUuUFJFKFtuZXcgVFlQRShcInN0cmluZ1wiKSwgbmV3IFJFR0VYKC9eYWJjJC8pXSwgMSwgMikpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtBcnJheV0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0QUVSYW5nZVwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBBRS5QUkUoW25ldyBUWVBFKFwic3RyaW5nXCIpLCBuZXcgUkVHRVgoL15hYmMkLyldLCAxKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0FycmF5XSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RBRUluZGV4XCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEdSRUFURVIuUFJFKDIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RHUkVBVEVSXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEdSRUFURVJfT1JfRVFVQUwuUFJFKDIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RHUkVBVEVSX09SX0VRVUFMXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIExFU1MuUFJFKDIwKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW051bWJlcl0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0TEVTU1wiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBMRVNTX09SX0VRVUFMLlBSRSgyMCkpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtOdW1iZXJdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdExFU1NfT1JfRVFVQUxcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgRElGRkVSRU5ULlBSRSgyMCkpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtOdW1iZXJdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdERJRkZFUkVOVFwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBUWVBFLlBSRShcInN0cmluZ1wiKSksXG4gICAgX19wYXJhbSgxLCBUWVBFLlBSRShcIm51bWJlclwiKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1N0cmluZywgTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIFN0cmluZylcbl0sIERlbW8sIFwidGVzdFN0YXRpY01ldGhvZFwiLCBudWxsKTtcbmNvbnN0IGRlbW8gPSBuZXcgRGVtbygpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RQcm9wZXJ0eSA9IFwiYWJkXCI7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiSU5WQVJJQU5UIEluZnJpbmdlbWVudFwiLCBcIk9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0UHJvcGVydHkgPSBcImFcIjtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJJTlZBUklBTlQgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbmRlbW8udGVzdFBhcmFtdmFsdWVBbmRSZXR1cm52YWx1ZShcImhvbGxhXCIpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIlBBUkFNRVRFUi0gJiBSRVRVUk5WQUxVRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RQYXJhbXZhbHVlQW5kUmV0dXJudmFsdWUoXCJ5eXl5XCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlBBUkFNRVRFUi0gJiBSRVRVUk5WQUxVRSBJbmZyaW5nZW1lbnRcIiwgXCJPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdFJldHVybnZhbHVlKFwieHh4eFwiKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJSRVRVUk5WQUxVRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RSZXR1cm52YWx1ZShcInl5eXlcIik7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiUkVUVVJOVkFMVUUgSW5mcmluZ2VtZW50XCIsIFwiT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RFUUFuZFBhdGgoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiRVEgd2l0aCBQYXRoIEluZnJpbmdlbWVudCBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RFUUFuZFBhdGhXaXRoSW52ZXJzaW9uKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIikpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkVRIHdpdGggUGF0aCBhbmQgSW52ZXJzaW9uIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdFRZUEUoXCJ4XCIpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIlRZUEUgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbnRyeSB7XG4gICAgZGVtby50ZXN0VFlQRSgwKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJUWVBFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdEFFKFtcIjExXCIsIFwiMTBcIiwgXCJiXCJdKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJBRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RBRShbXCIxMVwiLCAxMSwgXCJiXCJdKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJBRSBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RSRUdFWFdpdGhBRShbXCIrMWRcIiwgXCJOT1dcIiwgXCItMTB5XCJdKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJSRUdFWCB3aXRoIEFFIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdFJFR0VYV2l0aEFFKFtcIisxZFwiLCBcIis1ZFwiLCBcIi14MTB5XCJdKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJSRUdFWCB3aXRoIEFFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdElOU1RBTkNFKG5ldyBEYXRlKCkpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIklOU1RBTkNFIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdElOU1RBTkNFKGRlbW8pO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOU1RBTkNFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdEFFUmFuZ2UoWzExLCBcImFiY1wiLCBcImFiY1wiXSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiQUUgUmFuZ2UgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbnRyeSB7XG4gICAgZGVtby50ZXN0QUVSYW5nZShbMTEsIFwiYWJjXCIsIC9hL2ddKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJBRSBSYW5nZSBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RBRUluZGV4KFsxMSwgXCJhYmNcIiwgXCJhYmNcIl0pO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIkFFIEluZGV4IE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdEFFSW5kZXgoW1wiMTFcIiwgMTIsIFwiL2EvZ1wiXSk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiQUUgSW5kZXggSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0R1JFQVRFUigxMSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiR1JFQVRFUiBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RHUkVBVEVSKDIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkdSRUFURVIgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0R1JFQVRFUl9PUl9FUVVBTCgyKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJHUkVBVEVSX09SX0VRVUFMIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdEdSRUFURVJfT1JfRVFVQUwoMSk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiR1JFQVRFUl9PUl9FUVVBTCBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RMRVNTKDEwKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJMRVNTIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdExFU1MoMjApO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkxFU1MgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0TEVTU19PUl9FUVVBTCgyMCk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiTEVTUyBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RMRVNTX09SX0VRVUFMKDIxKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJMRVNTX09SX0VRVUFMIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdERJRkZFUkVOVCgyMSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiRElGRkVSRU5UIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdERJRkZFUkVOVCgyMCk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiRElGRkVSRU5UIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbi8vICNyZWdpb24gSW5hY3Rpdml0eSBDaGVja3NcbndpbmRvdy5XYVhDb2RlLkRCQy5leGVjdXRpb25TZXR0aW5ncy5jaGVja1ByZWNvbmRpdGlvbnMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0TEVTU19PUl9FUVVBTCgyMSk7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJJTkFDVElWRSBQUkVDT05ESVRJT05TIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBSRUNPTkRJVElPTlMgRkFJTEVEXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxud2luZG93LldhWENvZGUuREJDLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUG9zdGNvbmRpdGlvbnMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0UmV0dXJudmFsdWUoXCJxcXFxcVwiKTtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBPU1RDT05ESVRJT05TIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBPU1RDT05ESVRJT05TIEZBSUxFRFwiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbndpbmRvdy5XYVhDb2RlLkRCQy5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0UHJvcGVydHkgPSBcImJcIjtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIElOVkFSSUFOVFMgT0tcIik7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiSU5BQ1RJVkUgSU5WQVJJQU5UUyBGQUlMRURcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG4vLyAjZW5kcmVnaW9uIEluYWN0aXZpdHkgQ2hlY2tzXG4vLyBSZS1lbmFibGUgYWxsIGNoZWNrcyBmb3Igc3Vic2VxdWVudCB0ZXN0c1xud2luZG93LldhWENvZGUuREJDLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUHJlY29uZGl0aW9ucyA9IHRydWU7XG53aW5kb3cuV2FYQ29kZS5EQkMuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tQb3N0Y29uZGl0aW9ucyA9IHRydWU7XG53aW5kb3cuV2FYQ29kZS5EQkMuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tJbnZhcmlhbnRzID0gdHJ1ZTtcbi8vICNyZWdpb24gU3RhdGljIE1ldGhvZCBUZXN0XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiVEVTVElORyBTVEFUSUMgTUVUSE9EIFdJVEggUEFSQU1WQUxVRVBST1ZJREVSXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG5EZW1vLnRlc3RTdGF0aWNNZXRob2QoXCJIZWxsb1wiLCAzKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJTVEFUSUMgTUVUSE9EIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIERlbW8udGVzdFN0YXRpY01ldGhvZChcIkhlbGxvXCIsIFwibm90IGEgbnVtYmVyXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlNUQVRJQyBNRVRIT0QgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxudHJ5IHtcbiAgICBEZW1vLnRlc3RTdGF0aWNNZXRob2QoMTIzLCA1KTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJTVEFUSUMgTUVUSE9EIEluZnJpbmdlbWVudCAoZmlyc3QgcGFyYW0pIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuLy8gI2VuZHJlZ2lvbiBTdGF0aWMgTWV0aG9kIFRlc3RcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
2297
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3hkYmMvLi9zcmMvREJDLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0FFLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0NPTVBBUklTT04udHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvQ09NUEFSSVNPTi9HUkVBVEVSLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0NPTVBBUklTT04vR1JFQVRFUl9PUl9FUVVBTC50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9DT01QQVJJU09OL0xFU1MudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvQ09NUEFSSVNPTi9MRVNTX09SX0VRVUFMLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0VRLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0VRL0RJRkZFUkVOVC50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9JTlNUQU5DRS50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9SRUdFWC50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9UWVBFLnRzIiwid2VicGFjazovL3hkYmMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8veGRiYy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8veGRiYy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3hkYmMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RlbW8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm92aWRlcyBhICoqRCoqZXNpZ24gKipCKip5ICoqQyoqb250cmFjdCBGcmFtZXdvcmsgdXNpbmcgZGVjb3JhdG9ycy5cbiAqXG4gKiBAcmVtYXJrc1xuICogTWFpbnRhaW5lcjogQ2FsbGFyaSwgU2FsdmF0b3JlIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIERCQyB7XG4gICAgLyoqIEV2aWN0cyB0aGUgb2xkZXN0IGVudHJ5IGlmIHRoZSBjYWNoZSBleGNlZWRzIHRoZSBtYXhpbXVtIHNpemUuICovXG4gICAgc3RhdGljIGV2aWN0SWZOZWVkZWQoY2FjaGUpIHtcbiAgICAgICAgaWYgKGNhY2hlLnNpemUgPiBEQkMuTUFYX0NBQ0hFX1NJWkUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZGVzdCA9IGNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY2FjaGUuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldEhvc3QoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogZ2xvYmFsVGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldERCQyhkYmMpIHtcbiAgICAgICAgaWYgKGRiYyBpbnN0YW5jZW9mIERCQylcbiAgICAgICAgICAgIHJldHVybiBkYmM7XG4gICAgICAgIGNvbnN0IHBhdGggPSBkYmMgIT09IG51bGwgJiYgZGJjICE9PSB2b2lkIDAgPyBkYmMgOiBcIldhWENvZGUuREJDXCI7XG4gICAgICAgIGlmIChEQkMuZGJjQ2FjaGUuaGFzKHBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gREJDLmRiY0NhY2hlLmdldChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IERCQy5yZXNvbHZlREJDUGF0aChEQkMuZ2V0SG9zdCgpLCBwYXRoKTtcbiAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICBEQkMuZXZpY3RJZk5lZWRlZChEQkMuZGJjQ2FjaGUpO1xuICAgICAgICAgICAgREJDLmRiY0NhY2hlLnNldChwYXRoLCByZXNvbHZlZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbWERCQ10gREJDIGluc3RhbmNlIG5vdCBmb3VuZCBhdCBwYXRoIFwiJHtwYXRofVwiLiBFbnN1cmUgYSBEQkMgaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCB0aGVyZS5gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSB1bmlxdWUga2V5IGZvciBzdG9yaW5nIHBhcmFtZXRlciB2YWx1ZSByZXF1ZXN0cy5cbiAgICAgKiBGb3JtYXQ6IFwiQ2xhc3NOYW1lOm1ldGhvZE5hbWVcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXF1ZXN0S2V5KHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyB0YXJnZXQubmFtZVxuICAgICAgICAgICAgOiAoKF9hID0gdGFyZ2V0LmNvbnN0cnVjdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgfHwgXCJVbmtub3duXCI7XG4gICAgICAgIHJldHVybiBgJHtjbGFzc05hbWV9OiR7U3RyaW5nKG1ldGhvZE5hbWUpfWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2UgYSByZXF1ZXN0IHRvIGdldCB0aGUgdmFsdWUgb2YgYSBjZXJ0YWluIHBhcmFtZXRlciBvZiBzcGVjaWZpYyBtZXRob2QgaW4gYSBzcGVjaWZpYyB7QGxpbmsgb2JqZWN0IH0uXG4gICAgICogVGhhdCByZXF1ZXN0IGdldHMgZW5saXN0ZWQgaW4ge0BsaW5rIHBhcmFtVmFsdWVSZXF1ZXN0cyB9IHdoaWNoIGlzIHVzZWQgYnkge0BsaW5rIFBhcmFtdmFsdWVQcm92aWRlcn0gdG8gaW52b2tlIHRoZVxuICAgICAqIGdpdmVuIFwicmVjZXB0b3JcIiB3aXRoIHRoZSBwYXJhbWV0ZXIgdmFsdWUgc3RvcmVkIGluIHRoZXJlLiBUaHVzIGEgcGFyYW1ldGVyIGRlY29yYXRvciB1c2luZyB0aGlzIG1ldGhvZCB3aWxsXG4gICAgICogbm90IHJlY2VpdmUgYW55IHZhbHVlIG9mIHRoZSB0b3AgbWV0aG9kIGlzIG5vdCB0YWdnZWQgd2l0aCB7QGxpbmsgUGFyYW12YWx1ZVByb3ZpZGVyfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXRcdFx0VGhlIHtAbGluayBvYmplY3QgfSBjb250YWluaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUgcGFyYW1ldGVyIHdoaWNoJ3MgdmFsdWUgaXMgcmVxdWVzdGVkLlxuICAgICAqIEBwYXJhbSBtZXRob2ROYW1lXHRUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdpdGggdGhlIHBhcmFtZXRlciB3aGljaCdzIHZhbHVlIGlzIHJlcXVlc3RlZC5cbiAgICAgKiBAcGFyYW0gaW5kZXhcdFx0XHRUaGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB3aGljaCdzIHZhbHVlIGlzIHJlcXVlc3RlZC5cbiAgICAgKiBAcGFyYW0gcmVjZXB0b3JcdFx0VGhlIG1ldGhvZCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlci12YWx1ZSBzaGFsbCBiZSBwYXNzZWQgdG8gd2hlbiBpdCBiZWNvbWVzIGF2YWlsYWJsZS4gKi9cbiAgICBzdGF0aWMgcmVxdWVzdFBhcmFtVmFsdWUodGFyZ2V0LCBtZXRob2ROYW1lLCBpbmRleCwgXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBHb3R0YSBiZSBhbnkgc2luY2UgcGFyYW1ldGVyLXZhbHVlcyBtYXkgYmUgdW5kZWZpbmVkLlxuICAgIHJlY2VwdG9yKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qga2V5ID0gREJDLmdldFJlcXVlc3RLZXkodGFyZ2V0LCBtZXRob2ROYW1lKTtcbiAgICAgICAgaWYgKERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTWFwID0gREJDLnBhcmFtVmFsdWVSZXF1ZXN0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChwYXJhbU1hcC5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgKF9hID0gcGFyYW1NYXAuZ2V0KGluZGV4KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnB1c2gocmVjZXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyYW1NYXAuc2V0KGluZGV4LCBuZXcgQXJyYXkocmVjZXB0b3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuc2V0KGtleSwgbmV3IE1hcChbXG4gICAgICAgICAgICAgICAgW2luZGV4LCBuZXcgQXJyYXkocmVjZXB0b3IpXSxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgaGFuZGxlIGJvdGggbWV0aG9kIGFuZCBjbGFzcyBkZWNvcmF0b3Igc2lnbmF0dXJlc1xuICAgIHN0YXRpYyBQYXJhbXZhbHVlUHJvdmlkZXIoLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gI3JlZ2lvbiBDbGFzcyBkZWNvcmF0b3IgcGF0aFxuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IGFjY2VwdCBhbnkgY29uc3RydWN0b3Igc2lnbmF0dXJlXG4gICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGFyZ3NbMF07XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgJHtjb25zdHJ1Y3Rvci5uYW1lfTp1bmRlZmluZWRgO1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IGFjY2VwdCBhbnkgY29uc3RydWN0b3Igc2lnbmF0dXJlXG4gICAgICAgICAgICBjb25zdCBXcmFwcGVkQ2xhc3MgPSBjbGFzcyBleHRlbmRzIGNvbnN0cnVjdG9yIHtcbiAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgYWNjZXB0IGFueSBjb25zdHJ1Y3RvciBzaWduYXR1cmVcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5jdG9yQXJncykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoREJDLnBhcmFtVmFsdWVSZXF1ZXN0cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1NYXAgPSBEQkMucGFyYW1WYWx1ZVJlcXVlc3RzLmdldChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBwYXJhbU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBjdG9yQXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWNlcHRvciBvZiBwYXJhbU1hcC5nZXQoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlcHRvcihjdG9yQXJnc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyYXBwZWRDbGFzcywgXCJuYW1lXCIsIHsgdmFsdWU6IGNvbnN0cnVjdG9yLm5hbWUgfSk7XG4gICAgICAgICAgICByZXR1cm4gV3JhcHBlZENsYXNzO1xuICAgICAgICAgICAgLy8gI2VuZHJlZ2lvbiBDbGFzcyBkZWNvcmF0b3IgcGF0aFxuICAgICAgICB9XG4gICAgICAgIC8vICNyZWdpb24gTWV0aG9kIGRlY29yYXRvciBwYXRoXG4gICAgICAgIGNvbnN0IFt0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yXSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgY29uc3QgaXNTdGF0aWMgPSB0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogR290dGEgYmUgYW55IHNpbmNlIHBhcmFtZXRlci12YWx1ZXMgbWF5IGJlIHVuZGVmaW5lZC5cbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5tZXRob2RBcmdzKSB7XG4gICAgICAgICAgICAvLyAjcmVnaW9uICAgQ2hlY2sgaWYgYSB2YWx1ZSBvZiBvbmUgb2YgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgaXQgdG8gdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgcmVjZXB0b3IsIGlmIHNvLlxuICAgICAgICAgICAgY29uc3QgYWN0dWFsVGFyZ2V0ID0gaXNTdGF0aWMgPyB0aGlzIDogdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IERCQy5nZXRSZXF1ZXN0S2V5KGFjdHVhbFRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU1hcCA9IERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBwYXJhbU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgbWV0aG9kQXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVjZXB0b3Igb2YgcGFyYW1NYXAuZ2V0KGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VwdG9yKG1ldGhvZEFyZ3NbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIHBhcmFtZXRlciB2YWx1ZSByZXF1ZXN0cyBmb3VuZCBmb3Iga2V5OlwiLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gI2VuZHJlZ2lvblx0Q2hlY2sgaWYgYSB2YWx1ZSBvZiBvbmUgb2YgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgaXQgdG8gdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgcmVjZXB0b3IsIGlmIHNvLlxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIG1ldGhvZEFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBNZXRob2QgZGVjb3JhdG9yIHBhdGhcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBQYXJhbWV0ZXItdmFsdWUgcmVxdWVzdHMuXG4gICAgLy8gI3JlZ2lvbiBDbGFzc1xuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHktZGVjb3JhdG9yIGZhY3Rvcnkgc2VydmluZyBhcyBhICoqRCoqZXNpZ24gKipCKip5ICoqQyoqb250cmFjdCBJbnZhcmlhbnQuXG4gICAgICogVGhpcyBpbnZhcmlhbnQgYWltcyB0byBjaGVjayB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5vdCB0aGUgdmFsdWUgdG8gYmUgZ2V0IG9yIHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cmFjdHMgVGhlIHtAbGluayBEQkMgfS1Db250cmFjdHMgdGhlIHZhbHVlIHNoYWxsIHVwaG9sZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgXHRBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gd2hlbmV2ZXIgdGhlIHByb3BlcnR5IGlzIHRyaWVkIHRvIGJlIGdldCBvciBzZXQgd2l0aG91dCB0aGUgaW5zdGFuY2Ugb2YgaXQncyBjbGFzc1xuICAgICAqIFx0XHRcdGZ1bGZpbGxpbmcgdGhlIHNwZWNpZmllZCAqKmNvbnRyYWN0cyoqLiAqL1xuICAgIHN0YXRpYyBkZWNDbGFzc0ludmFyaWFudChjb250cmFjdHMsIHBhdGggPSB1bmRlZmluZWQsIGRiYyA9IFwiV2FYQ29kZS5EQkNcIikge1xuICAgICAgICBsZXQgZGJjSW5zdGFuY2U7XG4gICAgICAgIHJldHVybiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikgPT4ge1xuICAgICAgICAgICAgaWYgKCFkYmNJbnN0YW5jZSlcbiAgICAgICAgICAgICAgICBkYmNJbnN0YW5jZSA9IERCQy5nZXREQkMoZGJjKTtcbiAgICAgICAgICAgIGlmICghZGJjSW5zdGFuY2UuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tJbnZhcmlhbnRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTZXR0ZXIgPSBkZXNjcmlwdG9yLnNldDtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsR2V0dGVyID0gZGVzY3JpcHRvci5nZXQ7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBpbnRlcmNlcHQgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgLy8gI3JlZ2lvbiBSZXBsYWNlIG9yaWdpbmFsIHByb3BlcnR5LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGRiY0luc3RhbmNlID09PSBudWxsIHx8IGRiY0luc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYmNJbnN0YW5jZS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlID0gcGF0aCA/IERCQy5yZXNvbHZlKHRoaXMsIHBhdGgpIDogdGhpcztcbiAgICAgICAgICAgICAgICAgICAgLy8gI3JlZ2lvbiBDaGVjayBpZiBhbGwgXCJjb250cmFjdHNcIiBhcmUgZnVsZmlsbGVkLlxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyYWN0IG9mIGNvbnRyYWN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udHJhY3QuY2hlY2socmVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJjSW5zdGFuY2UgPT09IG51bGwgfHwgZGJjSW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRiY0luc3RhbmNlLnJlcG9ydEZpZWxkSW5mcmluZ2VtZW50KHJlc3VsdCwgdGFyZ2V0LCBwYXRoLCBwcm9wZXJ0eUtleSwgcmVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAjZW5kcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEdldHRlciA/IG9yaWdpbmFsR2V0dGVyW3Byb3BlcnR5S2V5XSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0KG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGRiY0luc3RhbmNlID09PSBudWxsIHx8IGRiY0luc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYmNJbnN0YW5jZS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlID0gcGF0aCA/IERCQy5yZXNvbHZlKHRoaXMsIHBhdGgpIDogdGhpcztcbiAgICAgICAgICAgICAgICAgICAgLy8gI3JlZ2lvbiBDaGVjayBpZiBhbGwgXCJjb250cmFjdHNcIiBhcmUgZnVsZmlsbGVkLlxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyYWN0IG9mIGNvbnRyYWN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udHJhY3QuY2hlY2socmVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJjSW5zdGFuY2UgPT09IG51bGwgfHwgZGJjSW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRiY0luc3RhbmNlLnJlcG9ydEZpZWxkSW5mcmluZ2VtZW50KHJlc3VsdCwgdGFyZ2V0LCBwYXRoLCBwcm9wZXJ0eUtleSwgcmVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAjZW5kcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gI2VuZHJlZ2lvbiBSZXBsYWNlIG9yaWdpbmFsIHByb3BlcnR5LlxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENsYXNzXG4gICAgLy8gI3JlZ2lvbiBJbnZhcmlhbnRcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5LWRlY29yYXRvciBmYWN0b3J5IHNlcnZpbmcgYXMgYSAqKkQqKmVzaWduICoqQioqeSAqKkMqKm9udHJhY3QgSW52YXJpYW50LlxuICAgICAqIFNpbmNlIHRoZSB2YWx1ZSBtdXN0IGJlIGluaXRpYWxpemVkIG9yIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCAqKmNvbnRyYWN0cyoqIHRoZSB2YWx1ZSB3aWxsIG9ubHkgYmUgY2hlY2tlZFxuICAgICAqIHdoZW4gYXNzaWduaW5nIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRyYWN0cyBUaGUge0BsaW5rIERCQyB9LUNvbnRyYWN0cyB0aGUgdmFsdWUgc2hhbGwgdXBob2xkLlxuICAgICAqXG4gICAgICogQHRocm93cyBcdEEge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfSB3aGVuZXZlciB0aGUgcHJvcGVydHkgaXMgdHJpZWQgdG8gYmUgc2V0IHRvIGEgdmFsdWUgdGhhdCBkb2VzIG5vdCBjb21wbHkgdG8gdGhlXG4gICAgICogXHRcdFx0c3BlY2lmaWVkICoqY29udHJhY3RzKiosIGJ5IHRoZSByZXR1cm5lZCBtZXRob2QuKi9cbiAgICBzdGF0aWMgZGVjSW52YXJpYW50KGNvbnRyYWN0cywgcGF0aCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBkYmNJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRiY0luc3RhbmNlKVxuICAgICAgICAgICAgICAgIGRiY0luc3RhbmNlID0gREJDLmdldERCQyhkYmMpO1xuICAgICAgICAgICAgaWYgKCFkYmNJbnN0YW5jZS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBpbnRlcmNlcHQgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgLy8gI3JlZ2lvbiBSZXBsYWNlIG9yaWdpbmFsIHByb3BlcnR5LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgICAgICBzZXQobmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGJjSW5zdGFuY2UgPT09IG51bGwgfHwgZGJjSW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRiY0luc3RhbmNlLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrSW52YXJpYW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBwYXRoID8gREJDLnJlc29sdmUobmV3VmFsdWUsIHBhdGgpIDogbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIC8vICNyZWdpb24gQ2hlY2sgaWYgYWxsIFwiY29udHJhY3RzXCIgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb250cmFjdCBvZiBjb250cmFjdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRyYWN0LmNoZWNrKHJlYWxWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiY0luc3RhbmNlID09PSBudWxsIHx8IGRiY0luc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYmNJbnN0YW5jZS5yZXBvcnRGaWVsZEluZnJpbmdlbWVudChyZXN1bHQsIHRhcmdldCwgcGF0aCwgcHJvcGVydHlLZXksIHJlYWxWYWx1ZSwgaGludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBpZiBhbGwgXCJjb250cmFjdHNcIiBhcmUgZnVsZmlsbGVkLlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vICNlbmRyZWdpb24gUmVwbGFjZSBvcmlnaW5hbCBwcm9wZXJ0eS5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBJbnZhcmlhbnRcbiAgICAvLyAjcmVnaW9uIFBvc3Rjb25kaXRpb25cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZCBkZWNvcmF0b3IgZmFjdG9yeSBjaGVja2luZyB0aGUgcmVzdWx0IG9mIGEgbWV0aG9kIHdoZW5ldmVyIGl0IGlzIGludm9rZWQgdGh1cyBhbHNvIHVzYWJsZSBvbiBnZXR0ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoZWNrXHRUaGUgKioodG9DaGVjazogYW55LCBvYmplY3QsIHN0cmluZykgPT4gYm9vbGVhbiB8IHN0cmluZyoqIHRvIHVzZSBmb3IgY2hlY2tpbmcuXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMucmVzb2x2ZURCQ1BhdGggfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0VGhlIGRvdHRlZCBwYXRoIHJlZmVycmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHRvIGNoZWNrLCBzdGFydGluZyBmb3JtIHRoZSBzcGVjaWZpZWQgb25lLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlICoqKCB0YXJnZXQgOiBvYmplY3QsIHByb3BlcnR5S2V5IDogc3RyaW5nLCBkZXNjcmlwdG9yIDogUHJvcGVydHlEZXNjcmlwdG9yICkgOiBQcm9wZXJ0eURlc2NyaXB0b3IqKlxuICAgICAqIFx0XHRcdGludm9rZWQgYnkgVHlwZXNjcmlwdC5cbiAgICAgKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBpbnRlcmNlcHQgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgIHN0YXRpYyBkZWNQb3N0Y29uZGl0aW9uKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTmVjZXNzYXJ5IHRvIGludGVyY2VwdCBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgY2hlY2ssIGRiYyA9IHVuZGVmaW5lZCwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgZGJjSW5zdGFuY2U7XG4gICAgICAgIHJldHVybiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gaW50ZXJjZXB0IFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZGJjSW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgICAgIGRiY0luc3RhbmNlID0gREJDLmdldERCQyhkYmMpO1xuICAgICAgICAgICAgICAgIGlmICghZGJjSW5zdGFuY2UuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tQb3N0Y29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9UaGlzSW5TdGF0aWM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBwYXRoID8gREJDLnJlc29sdmUocmVzdWx0LCBwYXRoKSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja1Jlc3VsdCA9IGNoZWNrKHJlYWxWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGVja1Jlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBkYmNJbnN0YW5jZS5yZXBvcnRSZXR1cm52YWx1ZUluZnJpbmdlbWVudChjaGVja1Jlc3VsdCwgdGFyZ2V0LCBwYXRoLCBwcm9wZXJ0eUtleSwgcmVhbFZhbHVlLCBoaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBQb3N0Y29uZGl0aW9uXG4gICAgLy8gI3JlZ2lvbiBEZWNvcmF0b3JcbiAgICAvLyAjcmVnaW9uIFByZWNvbmRpdGlvblxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHRoYXQgcmVxdWVzdHMgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIncyB2YWx1ZSBwYXNzaW5nIGl0IHRvIHRoZSBwcm92aWRlZFxuICAgICAqIFwiY2hlY2tcIi1tZXRob2Qgd2hlbiB0aGUgdmFsdWUgYmVjb21lcyBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tcdFRoZSBcIiggdW5rbm93biApID0+IHZvaWRcIiB0byBiZSBpbnZva2VkIGFsb25nIHdpdGggdGhlIHRhZ2dlZCBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBzb29uXG4gICAgICogXHRcdFx0XHRhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICAgKiBAcGFyYW0gZGJjICBcdFNlZSB7QGxpbmsgREJDLnJlc29sdmVEQkNQYXRoIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFRoZSBkb3R0ZWQgcGF0aCByZWZlcnJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB0byBjaGVjaywgc3RhcnRpbmcgZm9ybSB0aGUgc3BlY2lmaWVkIG9uZS5cbiAgICAgKiBcdFx0XHRcdE1heSBjb250YWluIDo6IHRvIHNlcGFyYXRlIG11bHRpcGxlIHBhdGhzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlICoqKHRhcmdldDogb2JqZWN0LCBtZXRob2ROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIHBhcmFtZXRlckluZGV4OiBudW1iZXIgKSA9PiB2b2lkKiogaW52b2tlZCBieSBUeXBlc2NyaXB0LSAqL1xuICAgIHN0YXRpYyBkZWNQcmVjb25kaXRpb24oXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gY2hlY2sgYW55IHBhcmFtZXRlciB2YWx1ZVxuICAgIGNoZWNrLCBkYmMgPSB1bmRlZmluZWQsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSBwYXRoID8gcGF0aC5yZXBsYWNlKC8gL2csIFwiXCIpLnNwbGl0KFwiOjpcIikgOiBbdW5kZWZpbmVkXTtcbiAgICAgICAgbGV0IGRiY0luc3RhbmNlO1xuICAgICAgICByZXR1cm4gKHRhcmdldCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICAgIERCQy5yZXF1ZXN0UGFyYW1WYWx1ZSh0YXJnZXQsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4LCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRiY0luc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgICBkYmNJbnN0YW5jZSA9IERCQy5nZXREQkMoZGJjKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRiY0luc3RhbmNlLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUHJlY29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2luZ2xlUGF0aCBvZiBwYXRocykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBzaW5nbGVQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IERCQy5yZXNvbHZlKHZhbHVlLCBzaW5nbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2socmVhbFZhbHVlLCB0YXJnZXQsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiY0luc3RhbmNlLnJlcG9ydFBhcmFtZXRlckluZnJpbmdlbWVudChyZXN1bHQsIHRhcmdldCwgc2luZ2xlUGF0aCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgsIHJlYWxWYWx1ZSwgaGludCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBQcmVjb25kaXRpb25cbiAgICAvLyAjZW5kcmVnaW9uIERlY29yYXRvclxuICAgIC8vICNyZWdpb24gQ29udHJhY3QgRmFjdG9yeSBIZWxwZXJzXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFBSRSBkZWNvcmF0b3IgZnJvbSBhIGNoZWNrQWxnb3JpdGhtIGZ1bmN0aW9uIGFuZCBpdHMgYm91bmQgYXJndW1lbnRzLlxuICAgICAqIFJlZHVjZXMgYm9pbGVycGxhdGUgYWNyb3NzIGNvbnRyYWN0IGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tGbiAgQSBmdW5jdGlvbiB0aGF0IHRha2VzICh2YWx1ZSwgLi4uYm91bmRBcmdzKSBhbmQgcmV0dXJucyB0cnVlIG9yIGFuIGVycm9yIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gYm91bmRBcmdzIFRoZSBhcmd1bWVudHMgdG8gYmluZCB0byB0aGUgY2hlY2sgZnVuY3Rpb24gYWZ0ZXIgdGhlIHZhbHVlLlxuICAgICAqIEBwYXJhbSBkYmMgICAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb259LlxuICAgICAqIEBwYXJhbSBwYXRoICAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb259LlxuICAgICAqIEBwYXJhbSBoaW50ICAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb259LlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IGFjY2VwdCBhbnkgY2hlY2tBbGdvcml0aG0gc2lnbmF0dXJlXG4gICAgY2hlY2tGbiwgXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBBcmd1bWVudHMgdmFyeSBwZXIgY29udHJhY3RcbiAgICBib3VuZEFyZ3MsIGRiYywgcGF0aCwgaGludCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1ByZWNvbmRpdGlvbigodmFsdWUsIF90YXJnZXQsIF9tZXRob2ROYW1lLCBfcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjaGVja0ZuKHZhbHVlLCAuLi5ib3VuZEFyZ3MpO1xuICAgICAgICB9LCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUE9TVCBkZWNvcmF0b3IgZnJvbSBhIGNoZWNrQWxnb3JpdGhtIGZ1bmN0aW9uIGFuZCBpdHMgYm91bmQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoZWNrRm4gIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyAodmFsdWUsIC4uLmJvdW5kQXJncykgYW5kIHJldHVybnMgdHJ1ZSBvciBhbiBlcnJvciBzdHJpbmcuXG4gICAgICogQHBhcmFtIGJvdW5kQXJncyBUaGUgYXJndW1lbnRzIHRvIGJpbmQgdG8gdGhlIGNoZWNrIGZ1bmN0aW9uIGFmdGVyIHRoZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gZGJjICAgICAgU2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbn0uXG4gICAgICogQHBhcmFtIHBhdGggICAgIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb259LlxuICAgICAqIEBwYXJhbSBoaW50ICAgICBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9ufS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgYWNjZXB0IGFueSBjaGVja0FsZ29yaXRobSBzaWduYXR1cmVcbiAgICBjaGVja0ZuLCBcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEFyZ3VtZW50cyB2YXJ5IHBlciBjb250cmFjdFxuICAgIGJvdW5kQXJncywgZGJjLCBwYXRoLCBoaW50KSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUG9zdGNvbmRpdGlvbigodmFsdWUsIF90YXJnZXQsIF9wcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrRm4odmFsdWUsIC4uLmJvdW5kQXJncyk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gSU5WQVJJQU5UIGRlY29yYXRvciBmcm9tIGEgY29udHJhY3QgY29uc3RydWN0b3IgYW5kIGl0cyBib3VuZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gQ29udHJhY3RDbGFzcyBBIGNsYXNzIHdpdGggYSBjb25zdHJ1Y3RvciB0aGF0IHByb2R1Y2VzIGFuIG9iamVjdCB3aXRoIGEgYGNoZWNrYCBtZXRob2QuXG4gICAgICogQHBhcmFtIGN0b3JBcmdzICAgICAgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjb250cmFjdCBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0gZGJjICAgICAgICAgICBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnR9LlxuICAgICAqIEBwYXJhbSBwYXRoICAgICAgICAgIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudH0uXG4gICAgICogQHBhcmFtIGhpbnQgICAgICAgICAgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50fS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTXVzdCBhY2NlcHQgYW55IGNvbnRyYWN0IGNvbnN0cnVjdG9yXG4gICAgQ29udHJhY3RDbGFzcywgXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBBcmd1bWVudHMgdmFyeSBwZXIgY29udHJhY3RcbiAgICBjdG9yQXJncywgZGJjLCBwYXRoLCBoaW50KSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjSW52YXJpYW50KFtuZXcgQ29udHJhY3RDbGFzcyguLi5jdG9yQXJncyldLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHdhcm5pbmcuICovXG4gICAgcmVwb3J0V2FybmluZyhtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLndhcm5pbmdTZXR0aW5ncy5sb2dUb0NvbnNvbGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogU2FuaXRpemVzIGEgdmFsdWUgZm9yIHNhZmUgaW5jbHVzaW9uIGluIGVycm9yIG1lc3NhZ2VzLiAqL1xuICAgIHN0YXRpYyBzYW5pdGl6ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBzdHIgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWzw+JlwiJ10vZywgKGNoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIjxcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJmx0O1wiO1xuICAgICAgICAgICAgICAgIGNhc2UgXCI+XCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiZndDtcIjtcbiAgICAgICAgICAgICAgICBjYXNlIFwiJlwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCImYW1wO1wiO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJnF1b3Q7XCI7XG4gICAgICAgICAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJiMzOTtcIjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZnJpbmdlbWVudCBhY2NvcmRpbmcgdG8gdGhlIHtAbGluayBpbmZyaW5nZW1lbnRTZXR0aW5ncyB9IGFsc28gZ2VuZXJhdGluZyBhIHByb3BlciB7QGxpbmsgc3RyaW5nIH0td3JhcHBlclxuICAgICAqIGZvciB0aGUgZ2l2ZW4gXCJtZXNzYWdlXCIgJiB2aW9sYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudCBhbmQgaXQncyBwcm92ZW5pZW5jZS5cbiAgICAgKiBAcGFyYW0gdmlvbGF0b3IgXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgb3IgbmFtaW5nIHRoZSB2aW9sYXRvci4gKi9cbiAgICByZXBvcnRJbmZyaW5nZW1lbnQobWVzc2FnZSwgdmlvbGF0b3IsIHRhcmdldCwgdmFsdWUsIHBhdGgsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc2FmZVZpb2xhdG9yID0gREJDLnNhbml0aXplKHZpb2xhdG9yKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZSA9IHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBEQkMuc2FuaXRpemUodGFyZ2V0Lm5hbWUpXG4gICAgICAgICAgICA6IHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICB0YXJnZXQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGFyZ2V0LmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICA/IERCQy5zYW5pdGl6ZSh0YXJnZXQuY29uc3RydWN0b3IubmFtZSlcbiAgICAgICAgICAgICAgICA6IERCQy5zYW5pdGl6ZSh0YXJnZXQpO1xuICAgICAgICBjb25zdCBmaW5hbE1lc3NhZ2UgPSBgWyBGcm9tIFwiJHtzYWZlVmlvbGF0b3J9XCIgaW4gXCIke3RhcmdldE5hbWV9XCIke3BhdGggPyBgID4gXCIke0RCQy5zYW5pdGl6ZShwYXRoKX1cImAgOiBcIlwifTogJHttZXNzYWdlfSAke2hpbnQgPyBg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9XWA7XG4gICAgICAgIGlmICh0aGlzLmluZnJpbmdlbWVudFNldHRpbmdzLnRocm93RXhjZXB0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChmaW5hbE1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluZnJpbmdlbWVudFNldHRpbmdzLmxvZ1RvQ29uc29sZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZmluYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgcGFyYW1ldGVyLWluZnJpbmdlbWVudCB2aWEge0BsaW5rIHJlcG9ydEluZnJpbmdlbWVudCB9IGFsc28gZ2VuZXJhdGluZyBhIHByb3BlciB7QGxpbmsgc3RyaW5nIH0td3JhcHBlclxuICAgICAqIGZvciB0aGUgZ2l2ZW4gXCJtZXNzYWdlXCIsXCJtZXRob2RcIiwgcGFyYW1ldGVyLVwiaW5kZXhcIiAmIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcdFRoZSB7QGxpbmsgc3RyaW5nIH0gZGVzY3JpYmluZyB0aGUgaW5mcmluZ2VtZW50IGFuZCBpdCdzIHByb3ZlbmllbmNlLlxuICAgICAqIEBwYXJhbSBtZXRob2QgXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgb3IgbmFtaW5nIHRoZSB2aW9sYXRvci5cbiAgICAgKiBAcGFyYW0gaW5kZXhcdFx0VGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgd2l0aGluIHRoZSBhcmd1bWVudCBsaXN0aW5nLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBcdFRoZSBwYXJhbWV0ZXIncyB2YWx1ZS4gKi9cbiAgICByZXBvcnRQYXJhbWV0ZXJJbmZyaW5nZW1lbnQobWVzc2FnZSwgdGFyZ2V0LCBwYXRoLCBtZXRob2QsIGluZGV4LCB2YWx1ZSwgaGludCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBwcm9wZXJJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgdGhpcy5yZXBvcnRJbmZyaW5nZW1lbnQoYFsgUGFyYW1ldGVyLXZhbHVlIFwiJHt2YWx1ZX1cIiBvZiB0aGUgJHtwcm9wZXJJbmRleH0ke3Byb3BlckluZGV4ID09PSAxID8gXCJzdFwiIDogcHJvcGVySW5kZXggPT09IDIgPyBcIm5kXCIgOiBwcm9wZXJJbmRleCA9PT0gMyA/IFwicmRcIiA6IFwidGhcIn0gcGFyYW1ldGVyIGRpZCBub3QgZnVsZmlsbCBvbmUgb2YgaXQncyBjb250cmFjdHM6ICR7bWVzc2FnZX0gXWAsIG1ldGhvZCwgdGFyZ2V0LCB2YWx1ZSwgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSBmaWVsZC1pbmZyaW5nZW1lbnQgdmlhIHtAbGluayByZXBvcnRJbmZyaW5nZW1lbnQgfSBhbHNvIGdlbmVyYXRpbmcgYSBwcm9wZXIge0BsaW5rIHN0cmluZyB9LXdyYXBwZXJcbiAgICAgKiBmb3IgdGhlIGdpdmVuICoqbWVzc2FnZSoqICYgKipuYW1lKiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVx0QSB7QGxpbmsgc3RyaW5nIH0gZGVzY3JpYmluZyB0aGUgaW5mcmluZ2VtZW50IGFuZCBpdCdzIHByb3ZlbmllbmNlLlxuICAgICAqIEBwYXJhbSBrZXkgXHRcdFRoZSBwcm9wZXJ0eSBrZXkuXG4gICAgICogQHBhcmFtIHBhdGhcdFx0VGhlIGRvdHRlZC1wYXRoIHtAbGluayBzdHJpbmcgfSB0aGF0IGxlYWRzIHRvIHRoZSB2YWx1ZSBub3QgZnVsZmlsbGluZyB0aGUgY29udHJhY3Qgc3RhcnRpbmcgZnJvbVxuICAgICAqIFx0XHRcdFx0XHR0aGUgdGFnZ2VkIG9uZS5cbiAgICAgKiBAcGFyYW0gdmFsdWVcdFx0VGhlIHZhbHVlIG5vdCBmdWxmaWxsaW5nIGEgY29udHJhY3QuICovXG4gICAgcmVwb3J0RmllbGRJbmZyaW5nZW1lbnQobWVzc2FnZSwgdGFyZ2V0LCBwYXRoLCBrZXksIHZhbHVlLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVwb3J0SW5mcmluZ2VtZW50KGBbIE5ldyB2YWx1ZSBmb3IgXCIke2tleX1cIiR7cGF0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAuJHtwYXRofWB9IHdpdGggdmFsdWUgXCIke3ZhbHVlfVwiIGRpZCBub3QgZnVsZmlsbCBvbmUgb2YgaXQncyBjb250cmFjdHM6ICR7bWVzc2FnZX0gXWAsIGtleSwgdGFyZ2V0LCB2YWx1ZSwgcGF0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSByZXR1cm52YWx1ZS1pbmZyaW5nZW1lbnQgYWNjb3JkaW5nIHZpYSB7QGxpbmsgcmVwb3J0SW5mcmluZ2VtZW50IH0gYWxzbyBnZW5lcmF0aW5nIGEgcHJvcGVyIHtAbGluayBzdHJpbmcgfS13cmFwcGVyXG4gICAgICogZm9yIHRoZSBnaXZlbiBcIm1lc3NhZ2VcIixcIm1ldGhvZFwiICYgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVx0VGhlIHtAbGluayBzdHJpbmcgfSBkZXNjcmliaW5nIHRoZSBpbmZyaW5nZW1lbnQgYW5kIGl0J3MgcHJvdmVuaWVuY2UuXG4gICAgICogQHBhcmFtIG1ldGhvZCBcdFRoZSB7QGxpbmsgc3RyaW5nIH0gZGVzY3JpYmluZyBvciBuYW1pbmcgdGhlIHZpb2xhdG9yLlxuICAgICAqIEBwYXJhbSB2YWx1ZVx0XHRUaGUgcGFyYW1ldGVyJ3MgdmFsdWUuICovXG4gICAgcmVwb3J0UmV0dXJudmFsdWVJbmZyaW5nZW1lbnQobWVzc2FnZSwgdGFyZ2V0LCBwYXRoLCBtZXRob2QsIFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgIHZhbHVlLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVwb3J0SW5mcmluZ2VtZW50KGBbIFJldHVybi12YWx1ZSBcIiR7dmFsdWV9XCIgZGlkIG5vdCBmdWxmaWxsIG9uZSBvZiBpdCdzIGNvbnRyYWN0czogJHttZXNzYWdlfSBdYCwgbWV0aG9kLCB0YXJnZXQsIHZhbHVlLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyB0aGlzIHtAbGluayBEQkMgfSB3aXRob3V0IG1vdW50aW5nIGl0IG9uIHRoZSBnbG9iYWwgbmFtZXNwYWNlLlxuICAgICAqIFVzZSB7QGxpbmsgREJDLnJlZ2lzdGVyIH0gdG8gbWFrZSB0aGUgaW5zdGFuY2UgYXZhaWxhYmxlIGF0IGEgc3BlY2lmaWMgcGF0aCBvbiBnbG9iYWxUaGlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZnJpbmdlbWVudFNldHRpbmdzIFx0U2VlIHtAbGluayBEQkMuaW5mcmluZ2VtZW50U2V0dGluZ3MgfS5cbiAgICAgKiBAcGFyYW0gZXhlY3V0aW9uU2V0dGluZ3NcdFx0U2VlIHtAbGluayBEQkMuZXhlY3V0aW9uU2V0dGluZ3MgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihpbmZyaW5nZW1lbnRTZXR0aW5ncyA9IHsgdGhyb3dFeGNlcHRpb246IHRydWUsIGxvZ1RvQ29uc29sZTogZmFsc2UgfSwgZXhlY3V0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGNoZWNrUHJlY29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgY2hlY2tJbnZhcmlhbnRzOiB0cnVlLFxuICAgIH0pIHtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBDb250cmFjdCBGYWN0b3J5IEhlbHBlcnNcbiAgICAgICAgLy8gI3JlZ2lvbiBFeGVjdXRpb24gSGFuZGxpbmdcbiAgICAgICAgLyoqIFN0b3JlcyBzZXR0aW5ncyBjb25jZXJuaW5nIHRoZSBleGVjdXRpb24gb2YgY2hlY2tzLiAqL1xuICAgICAgICB0aGlzLmV4ZWN1dGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgY2hlY2tQcmVjb25kaXRpb25zOiB0cnVlLFxuICAgICAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgIGNoZWNrSW52YXJpYW50czogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBFeGVjdXRpb24gSGFuZGxpbmdcbiAgICAgICAgLy8gI3JlZ2lvbiBXYXJuaW5nIGhhbmRsaW5nLlxuICAgICAgICAvKiogU3RvcmVzIHNldHRpbmdzIGNvbmNlcm5pbmcgd2FybmluZ3MuICovXG4gICAgICAgIHRoaXMud2FybmluZ1NldHRpbmdzID0geyBsb2dUb0NvbnNvbGU6IHRydWUgfTtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBXYXJuaW5nIGhhbmRsaW5nLlxuICAgICAgICAvLyAjcmVnaW9uIGluZnJpbmdlbWVudCBoYW5kbGluZy5cbiAgICAgICAgLyoqIFN0b3JlcyB0aGUgc2V0dGluZ3MgY29uY2VybmluZyBpbmZyaW5nZW1lbnRzICovXG4gICAgICAgIHRoaXMuaW5mcmluZ2VtZW50U2V0dGluZ3MgPSB7IHRocm93RXhjZXB0aW9uOiB0cnVlLCBsb2dUb0NvbnNvbGU6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuaW5mcmluZ2VtZW50U2V0dGluZ3MgPSBpbmZyaW5nZW1lbnRTZXR0aW5ncztcbiAgICAgICAgdGhpcy5leGVjdXRpb25TZXR0aW5ncyA9IGV4ZWN1dGlvblNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgREJDIH0gaW5zdGFuY2UgYXQgdGhlIHNwZWNpZmllZCBkb3R0ZWQgcGF0aCBvbiBnbG9iYWxUaGlzIChvciB3aW5kb3cpLFxuICAgICAqIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGRlY29yYXRvciByZXNvbHV0aW9uIHZpYSBzdHJpbmcgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2VcdFRoZSB7QGxpbmsgREJDIH0gaW5zdGFuY2UgdG8gcmVnaXN0ZXIuXG4gICAgICogQHBhcmFtIHBhdGhcdFx0VGhlIGRvdHRlZCBwYXRoIHRvIHJlZ2lzdGVyIGF0IChkZWZhdWx0OiBgXCJXYVhDb2RlLkRCQ1wiYCkuICovXG4gICAgc3RhdGljIHJlZ2lzdGVyKGluc3RhbmNlLCBwYXRoID0gXCJXYVhDb2RlLkRCQ1wiKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTXVzdCB3YWxrIGR5bmFtaWMgZ2xvYmFsIG5hbWVzcGFjZS5cbiAgICAgICAgbGV0IG9iaiA9IERCQy5nZXRIb3N0KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAob2JqW3NlZ21lbnRzW2ldXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIG9ialtzZWdtZW50c1tpXV0gPSB7fTtcbiAgICAgICAgICAgIG9iaiA9IG9ialtzZWdtZW50c1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgb2JqW3NlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdXSA9IGluc3RhbmNlO1xuICAgICAgICBEQkMuZGJjQ2FjaGUuc2V0KHBhdGgsIGluc3RhbmNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBjYWxsYmFjayB3aXRoIGFuIGlzb2xhdGVkIHtAbGluayBEQkMgfSBpbnN0YW5jZSB0ZW1wb3JhcmlseSByZWdpc3RlcmVkIGF0IHRoZSBkZWZhdWx0IHBhdGguXG4gICAgICogVGhlIHByZXZpb3VzIGluc3RhbmNlIChpZiBhbnkpIGlzIHJlc3RvcmVkIGFmdGVyIHRoZSBjYWxsYmFjayBjb21wbGV0ZXMg4oCUIGV2ZW4gaWYgaXQgdGhyb3dzLlxuICAgICAqIFVzZWZ1bCBmb3IgdGVzdCBpc29sYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIHJlY2VpdmluZyB0aGUgaXNvbGF0ZWQge0BsaW5rIERCQyB9IGluc3RhbmNlLiAqL1xuICAgIHN0YXRpYyBpc29sYXRlZChmbikge1xuICAgICAgICBjb25zdCBzYXZlZCA9IERCQy5kYmNDYWNoZS5nZXQoXCJXYVhDb2RlLkRCQ1wiKTtcbiAgICAgICAgY29uc3QgdGVzdERiYyA9IG5ldyBEQkMoKTtcbiAgICAgICAgREJDLnJlZ2lzdGVyKHRlc3REYmMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm4odGVzdERiYyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgICAgICAgICBEQkMucmVnaXN0ZXIoc2F2ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgREJDLmRiY0NhY2hlLmRlbGV0ZShcIldhWENvZGUuREJDXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBkZXNpcmVkIHtAbGluayBvYmplY3QgfSBvdXQgYSBnaXZlbiBvbmUgKip0b1Jlc29sdmVGcm9tKiogdXNpbmcgdGhlIHNwZWNpZmllZCAqKnBhdGgqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b1Jlc29sdmVGcm9tIFRoZSB7QGxpbmsgb2JqZWN0IH0gc3RhcnRpbmcgdG8gcmVzb2x2ZSBmcm9tLlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0VGhlIGRvdHRlZCBwYXRoLXtAbGluayBzdHJpbmcgfS5cbiAgICAgKiBcdFx0XHRcdFx0XHRUaGlzIHN0cmluZyB1c2VzIC4sIFsuLi5dLCBhbmQgKCkgdG8gcmVwcmVzZW50IGFjY2Vzc2luZyBuZXN0ZWQgcHJvcGVydGllcyxcbiAgICAgKiBcdFx0XHRcdFx0XHRhcnJheSBlbGVtZW50cy9vYmplY3Qga2V5cywgYW5kIGNhbGxpbmcgbWV0aG9kcywgcmVzcGVjdGl2ZWx5LCBtaW1pY2tpbmcgSmF2YVNjcmlwdCBzeW50YXggdG8gbmF2aWdhdGVcbiAgICAgKiBcdFx0XHRcdFx0XHRhbiBvYmplY3QncyBzdHJ1Y3R1cmUuIENvZGUsIGUuZy4gc29tZXRoaW5nIGxpa2UgYS5iKCAxIGFzIG51bWJlciApLmMsIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGFuZFxuICAgICAqIFx0XHRcdFx0XHRcdHRodXMgbWFrZSB0aGUgcmV0cmlldmFsIGZhaWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVxdWVzdGVkIHtAbGluayBvYmplY3QgfSwgTlVMTCBvciBVTkRFRklORUQuICovXG4gICAgc3RhdGljIHJlc29sdmUodG9SZXNvbHZlRnJvbSwgcGF0aCkge1xuICAgICAgICBpZiAoIXRvUmVzb2x2ZUZyb20gfHwgdHlwZW9mIHBhdGggIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VjdXJpdHk6IGJsb2NrIHByb3RvdHlwZSBwb2xsdXRpb24gcGF0aHNcbiAgICAgICAgY29uc3QgZGFuZ2Vyb3VzVG9rZW5zID0gW1wiX19wcm90b19fXCIsIFwiY29uc3RydWN0b3JcIiwgXCJwcm90b3R5cGVcIl07XG4gICAgICAgIGNvbnN0IGNhY2hlZFBhcnRzID0gREJDLnBhdGhUb2tlbkNhY2hlLmdldChwYXRoKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBjYWNoZWRQYXJ0cyAhPT0gbnVsbCAmJiBjYWNoZWRQYXJ0cyAhPT0gdm9pZCAwID8gY2FjaGVkUGFydHMgOiBwYXRoLnJlcGxhY2UoL1xcWyhbJ1wiXT8pKC4qPylcXDFcXF0vZywgXCIuJDJcIikuc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAoIWNhY2hlZFBhcnRzKSB7XG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSB0b2tlbnMgYmVmb3JlIGNhY2hpbmdcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IHBhcnQucmVwbGFjZSgvXFwoLipcXCkkLywgXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGRhbmdlcm91c1Rva2Vucy5pbmRleE9mKHRva2VuTmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtYREJDXSBQYXRoIFwiJHtwYXRofVwiIGNvbnRhaW5zIGZvcmJpZGRlbiB0b2tlbiBcIiR7dG9rZW5OYW1lfVwiLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIERCQy5ldmljdElmTmVlZGVkKERCQy5wYXRoVG9rZW5DYWNoZSk7XG4gICAgICAgICAgICBEQkMucGF0aFRva2VuQ2FjaGUuc2V0KHBhdGgsIHBhcnRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgdHJhdmVyc2UgYXJiaXRyYXJ5IG9iamVjdCBncmFwaHNcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0b1Jlc29sdmVGcm9tO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IHR5cGVvZiBjdXJyZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZE1hdGNoID0gcGFydC5tYXRjaCgvKFxcdyspXFwoKC4qKVxcKS8pO1xuICAgICAgICAgICAgaWYgKG1ldGhvZE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZE1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3NTdHIgPSBtZXRob2RNYXRjaFsyXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gYXJnc1N0ci5zcGxpdChcIixcIikubWFwKChhcmcpID0+IGFyZy50cmltKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudFttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W21ldGhvZE5hbWVdLmFwcGx5KGN1cnJlbnQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcnQuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlKHBhcnQuc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG59XG4vLyAjcmVnaW9uIEludGVybmFsIGNhY2hlcy5cbkRCQy5NQVhfQ0FDSEVfU0laRSA9IDEwMDA7XG5EQkMuZGJjQ2FjaGUgPSBuZXcgTWFwKCk7XG5EQkMucGF0aFRva2VuQ2FjaGUgPSBuZXcgTWFwKCk7XG4vLyAjZW5kcmVnaW9uIEludGVybmFsIGNhY2hlcy5cbi8vICNyZWdpb24gUGFyYW1ldGVyLXZhbHVlIHJlcXVlc3RzLlxuLyoqIFN0b3JlcyBhbGwgcmVxdWVzdCBmb3IgcGFyYW1ldGVyIHZhbHVlcyByZWdpc3RlcmVkIGJ5IHtAbGluayBkZWNQcmVjb25kaXRpb24gfS4gKi9cbkRCQy5wYXJhbVZhbHVlUmVxdWVzdHMgPSBuZXcgTWFwKCk7XG4vLyAjcmVnaW9uIENsYXNzZXNcbi8vICNyZWdpb24gRXJyb3JzXG4vKiogQW4ge0BsaW5rIEVycm9yIH0gdG8gYmUgdGhyb3duIHdoZW5ldmVyIGFuIGluZnJpbmdlbWVudCBpcyBkZXRlY3RlZC4gKi9cbkRCQy5JbmZyaW5nZW1lbnQgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoaXMge0BsaW5rIEVycm9yIH0gYnkgdGFnZ2luZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ute0BsaW5rIHN0cmluZyB9IGFzIGFuIFhEQkMtSW5mcmluZ2VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHtAbGluayBzdHJpbmcgfSBkZXNjcmliaW5nIHRoZSBpbmZyaW5nZW1lbnQuICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihgWyBYREJDIEluZnJpbmdlbWVudCAke21lc3NhZ2V9XWApO1xuICAgIH1cbn07XG4vLyAjZW5kcmVnaW9uIEVycm9yc1xuLy8gI2VuZHJlZ2lvbiBDbGFzc2VzXG4vLyAjZW5kcmVnaW9uIGluZnJpbmdlbWVudCBoYW5kbGluZy5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNwZWNpZmllZCBkb3R0ZWQge0BsaW5rIHN0cmluZyB9LXBhdGggdG8gYSB7QGxpbmsgREJDIH0uXG4gKlxuICogQHBhcmFtIG9iaiBcdFRoZSB7QGxpbmsgb2JqZWN0IH0gdG8gc3RhcnQgcmVzb2x2aW5nIGZyb20uXG4gKiBAcGFyYW0gcGF0aCBcdFRoZSBkb3R0ZWQge0BsaW5rIHN0cmluZyB9LXBhdGggbGVhZGluZyB0byB0aGUge0BsaW5rIERCQyB9LlxuICpcbiAqIEByZXR1cm5zIFRoZSByZXF1ZXN0ZWQge0BsaW5rIERCQyB9LlxuICovXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgdHJhdmVyc2UgYXJiaXRyYXJ5IG9iamVjdCBncmFwaHNcbkRCQy5yZXNvbHZlREJDUGF0aCA9IChvYmosIHBhdGgpID0+IHBhdGggPT09IG51bGwgfHwgcGF0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGF0aC5zcGxpdChcIi5cIikucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3JbY3VycmVudF0sIG9iaik7XG4vLyBSZWdpc3RlciB0aGUgZGVmYXVsdCBpbnN0YW5jZSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLlxuREJDLnJlZ2lzdGVyKG5ldyBEQkMoKSk7XG4iLCJpbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi4vREJDXCI7XG4vKipcbiAqIEEge0BsaW5rIERCQyB9IGRlZmluaW5nIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGFuIHtAbGluayBvYmplY3QgfXMgaGF2ZSB0byBmdWxmaWxsXG4gKiBhIGdpdmVuIHtAbGluayBvYmplY3QgfSdzIGNoZWNrLW1ldGhvZCAoKiooIHRvQ2hlY2sgOiBhbnkgKSA9PiBib29sZWFuIHwgc3RyaW5nKiopLlxuICpcbiAqIEByZW1hcmtzXG4gKiBNYWludGFpbmVyOiBDYWxsYXJpLCBTYWx2YXRvcmUgKFhEQkNAV2FYQ29kZS5uZXQpICovXG5leHBvcnQgY2xhc3MgQUUgZXh0ZW5kcyBEQkMge1xuICAgIC8vICNyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8qKlxuICAgICAqIENoZWNrcyBlYWNoIGVsZW1lbnQgb2YgdGhlICoqdmFsdWUqKi17QGxpbmsgQXJyYXkgPCBhbnkgPn0gYWdhaW5zdCB0aGUgZ2l2ZW4gKipjb25kaXRpb24qKiwgaWYgaXQgaXMgb25lLiBJZiBpdCBpcyBub3RcbiAgICAgKiB0aGUgKip2YWx1ZSoqIGl0c2VsZiB3aWxsIGJlIGNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uXHRUaGUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IHRvIGNoZWNrIHRoZSAqKnZhbHVlKiogYWdhaW5zdC5cbiAgICAgKiBAcGFyYW0gdmFsdWVcdFx0RWl0aGVyICoqdmFsdWUqKi17QGxpbmsgQXJyYXkgPCBhbnkgPn0sIHdoaWNoJ3MgZWxlbWVudHMgd2lsbCBiZSBjaGVja2VkLCBvciB0aGUgdmFsdWUgdG8gYmVcbiAgICAgKiBcdFx0XHRcdFx0Y2hlY2tlZCBpdHNlbGYuXG4gICAgICogQHBhcmFtIGluZGV4XHRcdElmIHNwZWNpZmllZCB3aXRoICoqaWR4RW5kKiogYmVpbmcgdW5kZWZpbmVkLCB0aGlzIHtAbGluayBOdW1iZXIgfSB3aWxsIGJlIHNlZW4gYXMgdGhlIGluZGV4IG9mXG4gICAgICogXHRcdFx0XHRcdHRoZSB2YWx1ZS17QGxpbmsgQXJyYXkgfSdzIGVsZW1lbnQgdG8gY2hlY2suIElmIHZhbHVlIGlzbid0IGFuIHtAbGluayBBcnJheSB9IHRoaXMgcGFyYW1ldGVyXG4gICAgICogXHRcdFx0XHRcdHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdC5cbiAgICAgKiBcdFx0XHRcdFx0V2l0aCAqKmlkeEVuZCoqIG5vdCB1bmRlZmluZWQgdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwYW4gb2YgZWxlbWVudHMgdG9cbiAgICAgKiBcdFx0XHRcdFx0Y2hlY2sgd2l0aGluIHRoZSB2YWx1ZS17QGxpbmsgQXJyYXkgfS5cbiAgICAgKiBAcGFyYW0gaWR4RW5kXHRJbmRpY2F0ZXMgdGhlIGxhc3QgZWxlbWVudCdzIGluZGV4IChpbmNsdWRpbmcpIG9mIHRoZSBzcGFuIG9mIHZhbHVlLXtAbGluayBBcnJheSB9IGVsZW1lbnRzIHRvIGNoZWNrLlxuICAgICAqIFx0XHRcdFx0XHRTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIC0xIHNwZWNpZmllcyB0aGF0IGFsbCB2YWx1ZS17QGxpbmsgQXJyYXkgfSdzIGVsZW1lbnRzIGJlZ2lubmluZyBmcm9tIHRoZVxuICAgICAqIFx0XHRcdFx0XHRzcGVjaWZpZWQgKippbmRleCoqIHNoYWxsIGJlIGNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBcyBzb29uIGFzIHRoZSAqKmNvbmRpdGlvbioqIHJldHVybnMgYSB7QGxpbmsgc3RyaW5nIH0sIGluc3RlYWQgb2YgVFJVRSwgdGhlIHJldHVybmVkIHN0cmluZy4gVFJVRSBpZiB0aGVcbiAgICAgKiBcdFx0XHQqKmNvbmRpdGlvbioqIG5ldmVyIHJldHVybnMgYSB7QGxpbmsgc3RyaW5nfS4gKi9cbiAgICBzdGF0aWMgY2hlY2tBbGdvcml0aG0oY29uZGl0aW9uLCB2YWx1ZSwgaW5kZXgsIGlkeEVuZCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkICYmIGlkeEVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZGl0aW9uLmNoZWNrKHZhbHVlW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFZpb2xhdGluZy1BcnJheWVsZW1lbnQgYXQgaW5kZXggXCIke2luZGV4fVwiIHdpdGggdmFsdWUgXCIke3ZhbHVlW2luZGV4XX1cIi4gJHtyZXN1bHR9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSW4gb3JkZXIgZm9yIG9wdGlvbmFsIHBhcmFtZXRlciB0byBub3QgY2F1c2UgYW4gZXJyb3IgaWYgdGhleSBhcmUgb21pdHRlZC5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVuZGluZyA9IGlkeEVuZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBpZHhFbmQgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gaWR4RW5kICsgMVxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgIDogdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ID8gaW5kZXggOiAwOyBpIDwgZW5kaW5nOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25kaXRpb24uY2hlY2sodmFsdWVbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBWaW9sYXRpbmctQXJyYXllbGVtZW50IGF0IGluZGV4ICR7aX0uICR7cmVzdWx0fWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5jaGVjayh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfSB3aXRoIGVpdGhlciBtdWx0aXBsZSBvciBhIHNpbmdsZSBvbmVcbiAgICAgKiBvZiB0aGUgKipyZWFsQ29uZGl0aW9ucyoqIHRvIGNoZWNrIHRoZSB0YWdnZWQgcGFyYW1ldGVyLXZhbHVlIGFnYWluc3Qgd2l0aC5cbiAgICAgKiBXaGVuIHNwZWNpZnlpbmcgYW4gKippbmRleCoqIGFuZCB0aGUgdGFnZ2VkIHBhcmFtZXRlcidzICoqdmFsdWUqKiBpcyBhbiB7QGxpbmsgQXJyYXkgfSwgdGhlICoqcmVhbENvbmRpdGlvbnMqKiBhcHBseSB0byB0aGVcbiAgICAgKiBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgKippbmRleCoqLlxuICAgICAqIElmIHRoZSB7QGxpbmsgQXJyYXkgfSBpcyB0b28gc2hvcnQgdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IG9mXG4gICAgICogKipyZWFsQ29uZGl0aW9ucyoqIHdpbGwgYmUgdmVyaWZpZWQgdG8gVFJVRSBhdXRvbWF0aWNhbGx5LCBjb25zaWRlcmluZyBvcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAqIElmIGFuICoqaW5kZXgqKiBpcyBzcGVjaWZpZWQgYnV0IHRoZSB0YWdnZWQgcGFyYW1ldGVyJ3MgdmFsdWUgaXNuJ3QgYW4gYXJyYXksIHRoZSAqKmluZGV4KiogaXMgdHJlYXRlZCBhcyBiZWluZyB1bmRlZmluZWQuXG4gICAgICogSWYgKippbmRleCoqIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBhbiB7QGxpbmsgQXJyYXkgfSBlYWNoIGVsZW1lbnQgb2YgaXQgd2lsbCBiZSBjaGVja2VkXG4gICAgICogYWdhaW5zdCB0aGUgKipyZWFsQ29uZGl0aW9ucyoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlYWxDb25kaXRpb25zXHRFaXRoZXIgb25lIG9yIG1vcmUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IHRvIGNoZWNrIHRoZSB0YWdnZWQgcGFyYW1ldGVyLXZhbHVlXG4gICAgICogXHRcdFx0XHRcdFx0XHRhZ2FpbnN0IHdpdGguXG4gICAgICogQHBhcmFtIGluZGV4XHRcdFx0XHRTZWUgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBpZHhFbmRcdFx0XHRTZWUgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuc1x0QSB7QGxpbmsgc3RyaW5nIH0gYXMgc29vbiBhcyBvbmUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IG9mICoqcmVhbENvbmRpdGlvbnMqKiByZXR1cm5zIG9uZS5cbiAgICAgKiBcdFx0XHRPdGhlcndpc2UgVFJVRS4gKi9cbiAgICBzdGF0aWMgUFJFKHJlYWxDb25kaXRpb25zLCBpbmRleCA9IHVuZGVmaW5lZCwgaWR4RW5kID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNQcmVjb25kaXRpb24oKFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgbWF0Y2ggREJDLmRlY1ByZWNvbmRpdGlvbiBzaWduYXR1cmVcbiAgICAgICAgdmFsdWUsIHRhcmdldCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlYWxDb25kaXRpb25zKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudENvbmRpdGlvbiBvZiByZWFsQ29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBBRS5jaGVja0FsZ29yaXRobShjdXJyZW50Q29uZGl0aW9uLCB2YWx1ZSwgaW5kZXgsIGlkeEVuZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFFLmNoZWNrQWxnb3JpdGhtKHJlYWxDb25kaXRpb25zLCB2YWx1ZSwgaW5kZXgsIGlkeEVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9IHdpdGggZWl0aGVyIG11bHRpcGxlIG9yIGEgc2luZ2xlIG9uZVxuICAgICAqIG9mIHRoZSAqKnJlYWxDb25kaXRpb25zKiogdG8gY2hlY2sgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm4tdmFsdWUgYWdhaW5zdCB3aXRoLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlYWxDb25kaXRpb25zXHRFaXRoZXIgb25lIG9yIG1vcmUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IHRvIGNoZWNrIHRoZSB0YWdnZWQgcGFyYW1ldGVyLXZhbHVlXG4gICAgICogXHRcdFx0XHRcdFx0XHRhZ2FpbnN0IHdpdGguXG4gICAgICogQHBhcmFtIGluZGV4XHRcdFx0XHRTZWUgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBpZHhFbmRcdFx0XHRTZWUgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuc1x0QSB7QGxpbmsgc3RyaW5nIH0gYXMgc29vbiBhcyBvbmUgeyBjaGVjazogKHRvQ2hlY2s6IGFueSkgPT4gYm9vbGVhbiB8IHN0cmluZyB9IG9mICoqcmVhbENvbmRpdGlvbnMqKiByZXR1cm4gb25lLlxuICAgICAqIFx0XHRcdE90aGVyd2lzZSBUUlVFLiAqL1xuICAgIHN0YXRpYyBQT1NUKHJlYWxDb25kaXRpb25zLCBpbmRleCA9IHVuZGVmaW5lZCwgaWR4RW5kID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNQb3N0Y29uZGl0aW9uKCh2YWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVhbENvbmRpdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjdXJyZW50Q29uZGl0aW9uIG9mIHJlYWxDb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEFFLmNoZWNrQWxnb3JpdGhtKGN1cnJlbnRDb25kaXRpb24sIHZhbHVlLCBpbmRleCwgaWR4RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQUUuY2hlY2tBbGdvcml0aG0oXG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICAgICAgcmVhbENvbmRpdGlvbnMsIHZhbHVlLCBpbmRleCwgaWR4RW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZpZWxkLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfSB3aXRoIGVpdGhlciBtdWx0aXBsZSBvciBhIHNpbmdsZSBvbmVcbiAgICAgKiBvZiB0aGUgKipyZWFsQ29uZGl0aW9ucyoqIHRvIGNoZWNrIHRoZSB0YWdnZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVhbENvbmRpdGlvbnNcdEVpdGhlciBvbmUgb3IgbW9yZSB7IGNoZWNrOiAodG9DaGVjazogYW55KSA9PiBib29sZWFuIHwgc3RyaW5nIH0gdG8gY2hlY2sgdGhlIHRhZ2dlZCBwYXJhbWV0ZXItdmFsdWVcbiAgICAgKiBcdFx0XHRcdFx0XHRcdGFnYWluc3Qgd2l0aC5cbiAgICAgKiBAcGFyYW0gaW5kZXhcdFx0XHRcdFNlZSB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIGlkeEVuZFx0XHRcdFNlZSB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBoaW50XHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zXHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKHJlYWxDb25kaXRpb25zLCBpbmRleCA9IHVuZGVmaW5lZCwgaWR4RW5kID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVJTlZBUklBTlQoQUUsIFtyZWFsQ29uZGl0aW9ucywgaW5kZXgsIGlkeEVuZF0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2UgZ2xvYmFsIGZ1bmN0aW9ucykuXG4gICAgLy9cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfSB3aXRoIGFsbCB7QGxpbmsgQUUuY29uZGl0aW9ucyB9IGFuZCB0aGUge0BsaW5rIG9iamVjdCB9IHtAbGluayB0b0NoZWNrIH0sXG4gICAgICoge0BsaW5rIEFFLmluZGV4IH0gJiB7QGxpbmsgQUUuaWR4RW5kIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgbWF0Y2ggREJDIGZhY3Rvcnkgc2lnbmF0dXJlXG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmNvbmRpdGlvbnMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRDb25kaXRpb24gb2YgdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gQUUuY2hlY2tBbGdvcml0aG0oY3VycmVudENvbmRpdGlvbiwgdG9DaGVjaywgdGhpcy5pbmRleCwgdGhpcy5pZHhFbmQpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBBRS5jaGVja0FsZ29yaXRobShcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgICAgdGhpcy5jb25kaXRpb25zLCB0b0NoZWNrLCB0aGlzLmluZGV4LCB0aGlzLmlkeEVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhpcyB7QGxpbmsgQUUgfSBieSBzZXR0aW5nIHRoZSBwcm90ZWN0ZWQgcHJvcGVydHkge0BsaW5rIEFFLmNvbmRpdGlvbnMgfSwge0BsaW5rIEFFLmluZGV4IH0gYW5kIHtAbGluayBBRS5pZHhFbmQgfSB1c2VkIGJ5IHtAbGluayBBRS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnQgU2VlIHtAbGluayBFUS5jaGVjayB9LiAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmRpdGlvbnMsIGluZGV4ID0gdW5kZWZpbmVkLCBpZHhFbmQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25zID0gY29uZGl0aW9ucztcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmlkeEVuZCA9IGlkeEVuZDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi4vREJDXCI7XG4vKipcbiAqIEEge0BsaW5rIERCQyB9IGRlZmluaW5nIGEgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB7QGxpbmsgb2JqZWN0IH1zLlxuICpcbiAqIEByZW1hcmtzXG4gKiBNYWludGFpbmVyOiBDYWxsYXJpLCBTYWx2YXRvcmUgKFhEQkNAV2FYQ29kZS5uZXQpICovXG5leHBvcnQgY2xhc3MgQ09NUEFSSVNPTiBleHRlbmRzIERCQyB7XG4gICAgLy8gI3JlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLyoqXG4gICAgICogRG9lcyBhIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUge0BsaW5rIG9iamVjdCB9ICoqdG9DaGVjayoqIGFuZCB0aGUgKiplcXVpdmFsZW50KiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0XHRUaGUgdmFsdWUgdGhhdCBoYXMgdG8gYmUgZXF1YWwgdG8gaXQncyBwb3NzaWJsZSAqKmVxdWl2YWxlbnQqKiBmb3IgdGhpcyB7QGxpbmsgREJDIH0gdG8gYmUgZnVsZmlsbGVkLlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHRUaGUge0BsaW5rIG9iamVjdCB9IHRoZSBvbmUgKip0b0NoZWNrKiogaGFzIHRvIGJlIGVxdWFsIHRvIGluIG9yZGVyIGZvciB0aGlzIHtAbGluayBEQkMgfSB0byBiZVxuICAgICAqIFx0XHRcdFx0XHRcdGZ1bGZpbGxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUgKiplcXVpdmFsZW50KiogYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIsIG90aGVyd2lzZSBGQUxTRS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSBmb3IgZHluYW1pYyBjb21wYXJpc29uXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkLCBpbnZlcnQpIHtcbiAgICAgICAgaWYgKGVxdWFsaXR5UGVybWl0dGVkICYmICFpbnZlcnQgJiYgdG9DaGVjayA8IGVxdWl2YWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVxdWFsaXR5UGVybWl0dGVkICYmIGludmVydCAmJiB0b0NoZWNrID4gZXF1aXZhbGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFwiJHtlcXVpdmFsZW50fVwiYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFsaXR5UGVybWl0dGVkICYmICFpbnZlcnQgJiYgdG9DaGVjayA8PSBlcXVpdmFsZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byBiZSBncmVhdGVyIHRoYW4gXCIke2VxdWl2YWxlbnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXF1YWxpdHlQZXJtaXR0ZWQgJiYgaW52ZXJ0ICYmIHRvQ2hlY2sgPj0gZXF1aXZhbGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gYmUgbGVzcyB0aGFuIFwiJHtlcXVpdmFsZW50fVwiYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwYXJhbWV0ZXItZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0ICAgIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBlcXVhbGl0eVBlcm1pdHRlZCBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdCAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdCAgICBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUFJFKENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0sIFtlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCwgaW52ZXJ0XSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHQgICAgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIGVxdWFsaXR5UGVybWl0dGVkIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0ICAgIFNlZSB7QGxpbmsgREJDLlBvc3Rjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmNyZWF0ZVBPU1QoQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSwgW2VxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkLCBpbnZlcnRdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZpZWxkLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0ICAgIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBlcXVhbGl0eVBlcm1pdHRlZCBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdCAgICBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdCAgICBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlSU5WQVJJQU5UKENPTVBBUklTT04sIFtlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCwgaW52ZXJ0XSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy8gI3JlZ2lvbiBSZWZlcmVuY2VkIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIER5bmFtaWMgdXNhZ2UuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfSBwYXNzaW5nIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiwge0BsaW5rIENPTVBBUklTT04uZXF1aXZhbGVudCB9IGFuZCB7QGxpbmsgQ09NUEFSSVNPTi5pbnZlcnQgfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSBmb3IgZHluYW1pYyBjb21wYXJpc29uXG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLmVxdWl2YWxlbnQsIHRoaXMuZXF1YWxpdHlQZXJtaXR0ZWQsIHRoaXMuaW52ZXJ0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGlzIHtAbGluayBDT01QQVJJU09OIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBDT01QQVJJU09OLmVxdWl2YWxlbnQgfSwge0BsaW5rIENPTVBBUklTT04uZXF1YWxpdHlQZXJtaXR0ZWQgfSBhbmQge0BsaW5rIENPTVBBUklTT04uaW52ZXJ0IH0gdXNlZCBieSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnQgICAgICAgIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVjayB9LlxuICAgICAqIEBwYXJhbSBlcXVhbGl0eVBlcm1pdHRlZCBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2sgfS5cbiAgICAgKiBAcGFyYW0gaW52ZXJ0ICAgICAgICAgICAgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrIH0uICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgICAgICB0aGlzLmVxdWFsaXR5UGVybWl0dGVkID0gZXF1YWxpdHlQZXJtaXR0ZWQ7XG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT04gfSBmcm9tIFwiLi4vQ09NUEFSSVNPTlwiO1xuLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTiB9LiAqL1xuZXhwb3J0IGNsYXNzIEdSRUFURVIgZXh0ZW5kcyBDT01QQVJJU09OIHtcbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBSRSB9LiAqL1xuICAgIHN0YXRpYyBQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBSRShlcXVpdmFsZW50LCBmYWxzZSwgZmFsc2UsIHBhdGgsIGhpbnQsIGRiYyk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUE9TVCB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QT1NUKGVxdWl2YWxlbnQsIGZhbHNlLCBmYWxzZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5JTlZBUklBTlQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgZmFsc2UsIGZhbHNlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLmNvbnN0cnVjdG9yIH0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50KSB7XG4gICAgICAgIHN1cGVyKGVxdWl2YWxlbnQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ09NUEFSSVNPTiB9IGZyb20gXCIuLi9DT01QQVJJU09OXCI7XG4vKiogU2VlIHtAbGluayBDT01QQVJJU09OIH0uICovXG5leHBvcnQgY2xhc3MgR1JFQVRFUl9PUl9FUVVBTCBleHRlbmRzIENPTVBBUklTT04ge1xuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUFJFIH0uICovXG4gICAgc3RhdGljIFBSRShcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IENvbXBhcmlzb24gdGFyZ2V0IGNhbiBiZSBhbnkgbnVtZXJpYyB2YWx1ZVxuICAgIGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUFJFKGVxdWl2YWxlbnQsIHRydWUsIGZhbHNlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBPU1QgfS4gKi9cbiAgICBzdGF0aWMgUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IENvbXBhcmlzb24gdGFyZ2V0IGNhbiBiZSBhbnkgbnVtZXJpYyB2YWx1ZVxuICAgIGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUE9TVChlcXVpdmFsZW50LCB0cnVlLCBmYWxzZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5JTlZBUklBTlQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgdHJ1ZSwgZmFsc2UsIHBhdGgsIGhpbnQsIGRiYyk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uY29uc3RydWN0b3IgfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IENvbXBhcmlzb24gdGFyZ2V0IGNhbiBiZSBhbnkgbnVtZXJpYyB2YWx1ZVxuICAgIGNvbnN0cnVjdG9yKGVxdWl2YWxlbnQpIHtcbiAgICAgICAgc3VwZXIoZXF1aXZhbGVudCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT04gfSBmcm9tIFwiLi4vQ09NUEFSSVNPTlwiO1xuLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTiB9LiAqL1xuZXhwb3J0IGNsYXNzIExFU1MgZXh0ZW5kcyBDT01QQVJJU09OIHtcbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBSRSB9LiAqL1xuICAgIHN0YXRpYyBQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBSRShlcXVpdmFsZW50LCBmYWxzZSwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QT1NUIH0uICovXG4gICAgc3RhdGljIFBPU1QoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBPU1QoZXF1aXZhbGVudCwgZmFsc2UsIHRydWUsIHBhdGgsIGhpbnQsIGRiYyk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uSU5WQVJJQU5UIH0uICovXG4gICAgc3RhdGljIElOVkFSSUFOVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IENvbXBhcmlzb24gdGFyZ2V0IGNhbiBiZSBhbnkgbnVtZXJpYyB2YWx1ZVxuICAgIGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uSU5WQVJJQU5UKGVxdWl2YWxlbnQsIGZhbHNlLCB0cnVlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLmNvbnN0cnVjdG9yIH0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50KSB7XG4gICAgICAgIHN1cGVyKGVxdWl2YWxlbnQsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5lcXVpdmFsZW50ID0gZXF1aXZhbGVudDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDT01QQVJJU09OIH0gZnJvbSBcIi4uL0NPTVBBUklTT05cIjtcbi8qKiBTZWUge0BsaW5rIENPTVBBUklTT04gfS4gKi9cbmV4cG9ydCBjbGFzcyBMRVNTX09SX0VRVUFMIGV4dGVuZHMgQ09NUEFSSVNPTiB7XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QUkUgfS4gKi9cbiAgICBzdGF0aWMgUFJFKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QUkUoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QT1NUIH0uICovXG4gICAgc3RhdGljIFBPU1QoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBDb21wYXJpc29uIHRhcmdldCBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAgICBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBPU1QoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5JTlZBUklBTlQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jb25zdHJ1Y3RvciB9LiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQ29tcGFyaXNvbiB0YXJnZXQgY2FuIGJlIGFueSBudW1lcmljIHZhbHVlXG4gICAgY29uc3RydWN0b3IoZXF1aXZhbGVudCkge1xuICAgICAgICBzdXBlcihlcXVpdmFsZW50LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5lcXVpdmFsZW50ID0gZXF1aXZhbGVudDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi4vREJDXCI7XG4vKipcbiAqIEEge0BsaW5rIERCQyB9IGRlZmluaW5nIHRoYXQgdHdvIHtAbGluayBvYmplY3QgfXMgZ290dGEgYmUgZXF1YWwuXG4gKlxuICogQHJlbWFya3NcbiAqIE1haW50YWluZXI6IENhbGxhcmksIFNhbHZhdG9yZSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBFUSBleHRlbmRzIERCQyB7XG4gICAgLy8gI3JlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkICoqZXF1aXZhbGVudCoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvQ2hlY2tcdFx0VGhlIHZhbHVlIHRoYXQgaGFzIHRvIGJlIGVxdWFsIHRvIGl0J3MgcG9zc2libGUgKiplcXVpdmFsZW50KiogZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlIGZ1bGZpbGxlZC5cbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0VGhlIHtAbGluayBvYmplY3QgfSB0aGUgb25lICoqdG9DaGVjayoqIGhhcyB0byBiZSBlcXVhbCB0byBpbiBvcmRlciBmb3IgdGhpcyB7QGxpbmsgREJDIH0gdG8gYmVcbiAgICAgKiBcdFx0XHRcdFx0XHRmdWxmaWxsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUUlVFIGlmIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBhbmQgdGhlICoqZXF1aXZhbGVudCoqIGFyZSBlcXVhbCB0byBlYWNoIG90aGVyLCBvdGhlcndpc2UgRkFMU0UuICovXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgIHRvQ2hlY2ssIGVxdWl2YWxlbnQsIGludmVydCkge1xuICAgICAgICBpZiAoIWludmVydCAmJiBlcXVpdmFsZW50ICE9PSB0b0NoZWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byBiZSBlcXVhbCB0byBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludmVydCAmJiBlcXVpdmFsZW50ID09PSB0b0NoZWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIG11c3Qgbm90IGJlIGVxdWFsIHRvIFwiJHtlcXVpdmFsZW50fVwiYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwYXJhbWV0ZXItZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdFNlZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQUkUoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBUbyBjaGVjayBmb3IgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgIGVxdWl2YWxlbnQsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVQUkUoRVEuY2hlY2tBbGdvcml0aG0sIFtlcXVpdmFsZW50LCBpbnZlcnRdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHRTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRTZWUge0BsaW5rIERCQy5Qb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFRvIGNoZWNrIGZvciBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmNyZWF0ZVBPU1QoRVEuY2hlY2tBbGdvcml0aG0sIFtlcXVpdmFsZW50LCBpbnZlcnRdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZpZWxkLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIGZpZWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdFNlZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBUbyBjaGVjayBmb3IgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgIGVxdWl2YWxlbnQsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVJTlZBUklBTlQoRVEsIFtlcXVpdmFsZW50LCBpbnZlcnRdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vXG4gICAgLy8gRm9yIHVzYWdlIGluIGR5bmFtaWMgc2NlbmFyaW9zIChsaWtlIHdpdGggQUUtREJDKS5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqLCB7QGxpbmsgRVEuZXF1aXZhbGVudCB9IGFuZCB7QGxpbmsgRVEuaW52ZXJ0IH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBjaGVjayBhZ2FpbnN0IE5VTEwgJiBVTkRFRklORUQuXG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICByZXR1cm4gRVEuY2hlY2tBbGdvcml0aG0odG9DaGVjaywgdGhpcy5lcXVpdmFsZW50LCB0aGlzLmludmVydCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUgc3BlY2lmaWVkICoqdHlwZSoqIC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGRvZXNuJ3QgZnVsZmlsbCB0aGlzIHtAbGluayBFUSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBFUSB9LiovXG4gICAgc3RhdGljIHRzQ2hlY2sodG9DaGVjaywgZXF1aXZhbGVudCwgaGludCA9IHVuZGVmaW5lZCwgaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gRVEuY2hlY2tBbGdvcml0aG0odG9DaGVjaywgZXF1aXZhbGVudCwgZmFsc2UpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjaztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChgJHtpZCA/IGAoJHtpZH0pIGAgOiBcIlwifSR7cmVzdWx0fSAke2hpbnQgPyBg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhpcyB7QGxpbmsgRVEgfSBieSBzZXR0aW5nIHRoZSBwcm90ZWN0ZWQgcHJvcGVydHkge0BsaW5rIEVRLmVxdWl2YWxlbnQgfSB1c2VkIGJ5IHtAbGluayBFUS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnQgU2VlIHtAbGluayBFUS5jaGVjayB9LiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVG8gYmUgYWJsZSB0byBtYXRjaCBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lcXVpdmFsZW50ID0gZXF1aXZhbGVudDtcbiAgICAgICAgdGhpcy5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRVEgfSBmcm9tIFwiLi4vRVFcIjtcbi8qKlxuICogRElGRkVSRU5UIGNsYXNzIGZvciBpbmVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIFRoaXMgY2xhc3MgZXh0ZW5kcyBFUSBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGRpZmZlcmVudCAobm90IGVxdWFsKVxuICogZnJvbSBhIHNwZWNpZmllZCBlcXVpdmFsZW50IHZhbHVlLiBJdCBpbnZlcnRzIHRoZSBlcXVhbGl0eSBjaGVjayBieSBhbHdheXMgcGFzc2luZ1xuICogYHRydWVgIGZvciB0aGUgaW52ZXJ0IHBhcmFtZXRlciB0byB0aGUgcGFyZW50IEVRIGNsYXNzIG1ldGhvZHMuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSBjbGFzcyBwcm92aWRlcyBwcmVjb25kaXRpb24gKFBSRSksIHBvc3Rjb25kaXRpb24gKFBPU1QpLCBhbmQgaW52YXJpYW50IChJTlZBUklBTlQpXG4gKiBjaGVja3MgZm9yIERlc2lnbiBieSBDb250cmFjdCBwcm9ncmFtbWluZyBwYXR0ZXJucy5cbiAqXG4gKiBAc2VlIHtAbGluayBDT01QQVJJU09OfVxuICogQHNlZSB7QGxpbmsgRVF9XG4gKi9cbmV4cG9ydCBjbGFzcyBESUZGRVJFTlQgZXh0ZW5kcyBFUSB7XG4gICAgLyoqIFNlZSB7QGxpbmsgRVEuUFJFIH0uIEFsd2F5cyBpbnZlcnRzIGVxdWFsaXR5IGNoZWNrLiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTXVzdCBtYXRjaCBwYXJlbnQgc2lnbmF0dXJlXG4gICAgc3RhdGljIFBSRShlcXVpdmFsZW50LCBfaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRVEuUFJFKGVxdWl2YWxlbnQsIHRydWUsIHBhdGgsIGhpbnQsIGRiYyk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIEVRLlBPU1QgfS4gQWx3YXlzIGludmVydHMgZXF1YWxpdHkgY2hlY2suICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IG1hdGNoIHBhcmVudCBzaWduYXR1cmVcbiAgICBzdGF0aWMgUE9TVChlcXVpdmFsZW50LCBfaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRVEuUE9TVChlcXVpdmFsZW50LCB0cnVlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBFUS5JTlZBUklBTlQgfS4gQWx3YXlzIGludmVydHMgZXF1YWxpdHkgY2hlY2suICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBNdXN0IG1hdGNoIHBhcmVudCBzaWduYXR1cmVcbiAgICBzdGF0aWMgSU5WQVJJQU5UKGVxdWl2YWxlbnQsIF9pbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBFUS5JTlZBUklBTlQoZXF1aXZhbGVudCwgdHJ1ZSwgcGF0aCwgaGludCwgZGJjKTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgRVEuY29uc3RydWN0b3IgfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE11c3QgbWF0Y2ggcGFyZW50IHNpZ25hdHVyZVxuICAgIGNvbnN0cnVjdG9yKGVxdWl2YWxlbnQpIHtcbiAgICAgICAgc3VwZXIoZXF1aXZhbGVudCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IHRoZSBhbiB7QGxpbmsgb2JqZWN0IH1zIGdvdHRhIGJlIGFuIGluc3RhbmNlIG9mIGEgY2VydGFpbiB7QGxpbmsgSU5TVEFOQ0UucmVmZXJlbmNlIH0uXG4gKlxuICogQHJlbWFya3NcbiAqIE1haW50YWluZXI6IFNhbHZhdG9yZSBDYWxsYXJpIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIElOU1RBTkNFIGV4dGVuZHMgREJDIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgKipyZWZlcmVuY2UqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRUaGUgdmFsdWUgdGhhdCBoYXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgdGhlICoqcmVmZXJlbmNlKiogaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9XG4gICAgICogXHRcdFx0XHRcdHRvIGJlIGZ1bGZpbGxlZC5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRUaGUge0BsaW5rIG9iamVjdCB9IHRoZSBvbmUgKip0b0NoZWNrKiogaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogaXMgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlICpyZWZlcmVuY2UqKiwgKip1bmRlZmluZWQqKiBvciAqKm51bGwqKiwgb3RoZXJ3aXNlIEZBTFNFLiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogSW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBcImluc3RhbmNlb2ZcIiBjaGVjay5cbiAgICBzdGF0aWMgY2hlY2tBbGdvcml0aG0odG9DaGVjaywgLi4ucmVmZXJlbmNlcykge1xuICAgICAgICBpZiAodG9DaGVjayA9PT0gbnVsbCB8fCB0b0NoZWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIGlmICh0b0NoZWNrIGluc3RhbmNlb2YgcmVmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgXCIke3JlZmVyZW5jZXMubWFwKChyZWYpID0+IHJlZi5uYW1lIHx8IHJlZikuam9pbihcIiwgXCIpfVwiIGJ1dCBpcyBvZiB0eXBlIFwiJHt0eXBlb2YgdG9DaGVja31cImA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUFJFKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogSW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBcImluc3RhbmNlb2ZcIiBjaGVjay5cbiAgICByZWZlcmVuY2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWZzID0gQXJyYXkuaXNBcnJheShyZWZlcmVuY2UpID8gcmVmZXJlbmNlIDogW3JlZmVyZW5jZV07XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUFJFKElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtLCByZWZzLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0U2VlIHtAbGluayBEQkMuUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEluIG9yZGVyIHRvIHBlcmZvcm0gYW4gXCJpbnN0YW5jZW9mXCIgY2hlY2suXG4gICAgcmVmZXJlbmNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVmcyA9IEFycmF5LmlzQXJyYXkocmVmZXJlbmNlKSA/IHJlZmVyZW5jZSA6IFtyZWZlcmVuY2VdO1xuICAgICAgICByZXR1cm4gREJDLmNyZWF0ZVBPU1QoSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0sIHJlZnMsIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uICovXG4gICAgc3RhdGljIElOVkFSSUFOVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEluIG9yZGVyIHRvIHBlcmZvcm0gYW4gXCJpbnN0YW5jZW9mXCIgY2hlY2suXG4gICAgcmVmZXJlbmNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVJTlZBUklBTlQoSU5TVEFOQ0UsIFtyZWZlcmVuY2VdLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vXG4gICAgLy8gRm9yIHVzYWdlIGluIGR5bmFtaWMgc2NlbmFyaW9zIChsaWtlIHdpdGggQUUtREJDKS5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIElOU1RBTkNFLnJlZmVyZW5jZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG19LiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgIGNoZWNrKHRvQ2hlY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5yZWZlcmVuY2UpXG4gICAgICAgICAgICA/IElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIC4uLnRoaXMucmVmZXJlbmNlKVxuICAgICAgICAgICAgOiBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLnJlZmVyZW5jZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFR5cGUtc2FmZSBjaGVjayB0aGF0IHZhbGlkYXRlcyBpZiBhIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIGEgc3BlY2lmaWVkIHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFx0VGhlIHZhbHVlIHRvIGNoZWNrIGZvciBpbnN0YW5jZSB2YWxpZGl0eS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRUaGUge0BsaW5rIG9iamVjdCB9IHRoZSBvbmUgKip0b0NoZWNrKiogaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mLlxuICAgICAqIEBwYXJhbSBoaW50XHRcdEFuIG9wdGlvbmFsIHtAbGluayBzdHJpbmcgfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gaW4gY2FzZSBvZiBhbiBpbmZyaW5nZW1lbnQuXG4gICAgICogQHBhcmFtIGlkXHRcdEEge0BsaW5rIHN0cmluZyB9IGlkZW50aWZ5aW5nIHRoaXMge0BsaW5rIElOU1RBTkNFIH0gdmlhIHRoZSB7QGxpbmsgREJDLkluZnJpbmdlbWVudCB9LU1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBpZiBpdCBmdWxmaWxscyB0aGlzIHtAbGluayBJTlNUQU5DRSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBJTlNUQU5DRSB9LiAqL1xuICAgIHN0YXRpYyB0c0NoZWNrKHRvQ2hlY2ssIHJlZmVyZW5jZSwgaGludCA9IHVuZGVmaW5lZCwgaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIElOU1RBTkNFLnRzQ2hlY2tNdWx0aSh0b0NoZWNrLCBbcmVmZXJlbmNlXSwgaGludCwgaWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfSBwYXNzaW5nIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBhbmQgdGhlIHtAbGluayBJTlNUQU5DRS5yZWZlcmVuY2UgfSAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0QW4gb3B0aW9uYWwge0BsaW5rIHN0cmluZyB9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBpbiBjYXNlIG9mIGFuIGluZnJpbmdlbWVudC5cbiAgICAgKiBAcGFyYW0gaWRcdFx0QSB7QGxpbmsgc3RyaW5nIH0gaWRlbnRpZnlpbmcgdGhpcyB7QGxpbmsgSU5TVEFOQ0UgfSB2aWEgdGhlIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0tTWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGRvZXNuJ3QgZnVsZmlsbCB0aGlzIHtAbGluayBJTlNUQU5DRSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBERUZJTkVEIH0uICovXG4gICAgc3RhdGljIHRzQ2hlY2tNdWx0aSh0b0NoZWNrLCByZWZlcmVuY2VzLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCAuLi5yZWZlcmVuY2VzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQoYCR7aWQgPyBgKCR7aWR9KSBgIDogXCJcIn0ke3Jlc3VsdH0gJHtoaW50ID8gYOKcqCAke2hpbnR9IOKcqGAgOiBcIlwifWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIElOU1RBTkNFIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBJTlNUQU5DRS5yZWZlcmVuY2UgfSB1c2VkIGJ5IHtAbGluayBJTlNUQU5DRS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZmVyZW5jZSBTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrIH0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERCQyB9IGZyb20gXCIuLi9EQkNcIjtcbi8qKlxuICogQSB7QGxpbmsgREJDIH0gcHJvdmlkaW5nIHtAbGluayBSRUdFWCB9LWNvbnRyYWN0cyBhbmQgc3RhbmRhcmQge0BsaW5rIFJlZ0V4cCB9IGZvciBjb21tb24gdXNlIGNhc2VzIGluIHtAbGluayBSRUdFWC5zdGRFeHAgfS5cbiAqXG4gKiBAcmVtYXJrc1xuICogTWFpbnRhaW5lcjogQ2FsbGFyaSwgU2FsdmF0b3JlIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIFJFR0VYIGV4dGVuZHMgREJDIHtcbiAgICBzdGF0aWMgZ2V0IHN0ZEV4cCgpIHtcbiAgICAgICAgaWYgKCFSRUdFWC5fc3RkRXhwKSB7XG4gICAgICAgICAgICBSRUdFWC5fc3RkRXhwID0ge1xuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lOiAvXlthLXpBLVpfOl1bYS16QS1aMC05Xy46LV0qJC8sXG4gICAgICAgICAgICAgICAgZU1haWw6IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kL2ksXG4gICAgICAgICAgICAgICAgcHJvcGVydHk6IC9eWyRfQS1aYS16XVskX0EtWmEtejAtOV0qJC8sXG4gICAgICAgICAgICAgICAgdXJsOiAvXig/Omh0dHBzP3xmdHApOlxcL1xcL1teXFxzLyQuPyNdLlteXFxzXSokL2ksXG4gICAgICAgICAgICAgICAga2V5UGF0aDogL14oW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFwuKSpbYS16QS1aXyRdW2EtekEtWjAtOV8kXSokLyxcbiAgICAgICAgICAgICAgICBkYXRlOiAvXlxcZHsxLDR9Wy5cXC8tXVxcZHsxLDJ9Wy5cXC8tXVxcZHsxLDR9JC9pLFxuICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQ6IC9eKChEezEsMn1bLi8tXU17MSwyfVsuLy1dWXsxLDR9KXwoTXsxLDJ9Wy4vLV1EezEsMn1bLi8tXVl7MSw0fSl8WXsxLDR9Wy4vLV1EezEsMn1bLi8tXU17MSwyfXwoWXsxLDR9Wy4vLV1NezEsMn1bLi8tXUR7MSwyfSkpJC9pLFxuICAgICAgICAgICAgICAgIGNzc1NlbGVjdG9yOiAvXig/OlxcKnwjW1xcdy1dK3xcXC5bXFx3LV0rfCg/OltcXHctXSt8XFwqKSg/OjooPzpbXFx3LV0rKD86XFwoW1xcdy1dK1xcKSk/KSspPyg/OlxcWyg/OltcXHctXSsoPzooPzo9fH49fFxcfD18XFwqPXxcXCQ9fFxcXj0pXFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXFx3LV0rKVxccyopPyk/XFxdKSt8XFxbXFxzKltcXHctXStcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W1xcdy1dKylcXHMqXFxdKSg/OixcXHMqKD86XFwqfCNbXFx3LV0rfFxcLltcXHctXSt8KD86W1xcdy1dK3xcXCopKD86Oig/OltcXHctXSsoPzpcXChbXFx3LV0rXFwpKT8pKyk/KD86XFxbKD86W1xcdy1dKyg/Oig/Oj18fj18XFx8PXxcXCo9fFxcJD18XFxePSlcXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFtcXHctXSspXFxzKik/KT9cXF0pK3xcXFtcXHMqW1xcdy1dK1xccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXFx3LV0rKVxccypcXF0pKSokLyxcbiAgICAgICAgICAgICAgICBib29sZWFuOiAvXihUUlVFfEZBTFNFKSQvaSxcbiAgICAgICAgICAgICAgICBjb2xvckNvZGVIRVg6IC9eIyhbQS1GYS1mXFxkXXszLDR9fFtBLUZhLWZcXGRdezZ9fFtBLUZhLWZcXGRdezh9KSQvaSxcbiAgICAgICAgICAgICAgICBzaW1wbGVIb3RrZXk6IC9eKChBbHR8Q3RybHxTaGlmdHxNZXRhKVxcKykrW2EtelxcZF0kL2ksXG4gICAgICAgICAgICAgICAgYmNwNDc6IC9eKD86W2Etel17MiwzfSg/Oi1bYS16XXszfSl7MCwzfXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi1bYS16XXs0fSk/KD86LVthLXpdezJ9fC1bMC05XXszfSk/KD86LVthLXowLTldezUsOH18LVswLTldW2EtejAtOV17M30pKig/Oi1bMC05YS13eS16XSg/Oi1bYS16MC05XXsyLDh9KSspKig/Oi14KD86LVthLXowLTldezEsOH0pKyk/JHxeeCg/Oi1bYS16MC05XXsxLDh9KSskL2ksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSRUdFWC5fc3RkRXhwO1xuICAgIH1cbiAgICAvLyAjcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIGNvbXBsaWVzIHRvIHRoZSB7QGxpbmsgUmVnRXhwIH0gKipleHByZXNzaW9uKiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0XHRUaGUgdmFsdWUgdGhhdCBoYXMgY29tcGx5IHRvIHRoZSB7QGxpbmsgUmVnRXhwIH0gKipleHByZXNzaW9uKiogZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlIGZ1bGZpbGxlZC5cbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0VGhlIHtAbGluayBSZWdFeHAgfSB0aGUgb25lICoqdG9DaGVjayoqIGhhcyBjb21wbHkgdG8gaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlXG4gICAgICogXHRcdFx0XHRcdFx0ZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogY29tcGxpZXMgd2l0aCB0aGUge0BsaW5rIFJlZ0V4cCB9ICoqZXhwcmVzc2lvbioqLCBvdGhlcndpc2UgRkFMU0UuICovXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKHRvQ2hlY2sgPT09IHVuZGVmaW5lZCB8fCB0b0NoZWNrID09PSBudWxsIHx8IHRvQ2hlY2sgPT09IFwiXCIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFleHByZXNzaW9uLnRlc3QodG9DaGVjaykpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGNvbXBseSB0byByZWd1bGFyIGV4cHJlc3Npb24gXCIke2V4cHJlc3Npb259XCJgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHBhcmFtZXRlci1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBSRShleHByZXNzaW9uLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5jcmVhdGVQUkUoUkVHRVguY2hlY2tBbGdvcml0aG0sIFtleHByZXNzaW9uXSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBPU1QoZXhwcmVzc2lvbiwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUE9TVChSRUdFWC5jaGVja0FsZ29yaXRobSwgW2V4cHJlc3Npb25dLCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZpZWxkLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgUkVHRVguY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIGZpZWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFNlZSB7QGxpbmsgUkVHRVguY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXhwcmVzc2lvbiwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlSU5WQVJJQU5UKFJFR0VYLCBbZXhwcmVzc2lvbl0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2Ugd2l0aCBBRS1EQkMpLlxuICAgIC8vXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0gcGFzc2luZyB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHtAbGluayBSRUdFWC5lcXVpdmFsZW50IH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIHJldHVybiBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUeXBlLXNhZmUgY2hlY2sgdGhhdCB2YWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IGEgcmVndWxhciBleHByZXNzaW9uIGFuZCByZXR1cm5zIGl0IGFzIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRcdFRoZSB2YWx1ZSB0byBjaGVjayBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgYWdhaW5zdC5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdE9wdGlvbmFsIGhpbnQgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBlcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICAgICAqIEBwYXJhbSBpZFx0XHRcdE9wdGlvbmFsIGlkZW50aWZpZXIgdG8gaW5jbHVkZSBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdmFsdWUgY2FzdCB0byB0aGUgQ0FORElEQVRFIHR5cGUuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtAbGluayBEQkMuSW5mcmluZ2VtZW50fSBpZiB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gKi9cbiAgICBzdGF0aWMgdHNDaGVjayh0b0NoZWNrLCBleHByZXNzaW9uLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCBleHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQoYCR7aWQgPyBgKCR7aWR9KSBgIDogXCJcIn0ke3Jlc3VsdH0ke2hpbnQgPyBgIOKcqCAke2hpbnR9IOKcqGAgOiBcIlwifWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIFJFR0VYIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBSRUdFWC5leHByZXNzaW9uIH0gdXNlZCBieSB7QGxpbmsgUkVHRVguY2hlY2sgfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleHByZXNzaW9uIFNlZSB7QGxpbmsgUkVHRVguY2hlY2sgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy8gI3JlZ2lvbiBJbi1NZXRob2QgY2hlY2tpbmcuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0gcGFzc2luZyB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHtAbGluayBSRUdFWC5leHByZXNzaW9uIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0XHRTZWUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtfS5cbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobX0uXG4gICAgICovXG4gICAgc3RhdGljIGNoZWNrKHRvQ2hlY2ssIGV4cHJlc3Npb24pIHtcbiAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCBleHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGVja1Jlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQoY2hlY2tSZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IGFuIHtAbGluayBvYmplY3QgfXMgZ290dGEgYmUgb2YgY2VydGFpbiB7QGxpbmsgVFlQRS50eXBlIH0uXG4gKlxuICogQHJlbWFya3NcbiAqIEF1dGhvcjogXHRcdFNhbHZhdG9yZSBDYWxsYXJpIChDYWxsYXJpQFdhWENvZGUubmV0KSAvIDIwMjVcbiAqIE1haW50YWluZXI6XHRTYWx2YXRvcmUgQ2FsbGFyaSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBUWVBFIGV4dGVuZHMgREJDIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIG9mIHRoZSAqKnR5cGUqKiBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0VGhlIHtAbGluayBPYmplY3QgfSB3aGljaCdzICoqdHlwZSoqIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB0eXBlXHRcdFRoZSB0eXBlIHRoZSB7QGxpbmsgb2JqZWN0fSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgb2YuIENhbiBiZSBhIHNpbmdsZSB0eXBlIG9yIG11bHRpcGxlIHR5cGVzIHNlcGFyYXRlZCBieSBcInxcIi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIG9mIHRoZSBzcGVjaWZpZWQgKip0eXBlKiosIG90aGVyd2lzZSBGQUxTRS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSBmb3IgZHluYW1pYyB0eXBlIGNoZWNraW5nIG9mIGFsc28gVU5ERUZJTkVELlxuICAgIHN0YXRpYyBjaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0eXBlKSB7XG4gICAgICAgIGlmICh0b0NoZWNrID09PSB1bmRlZmluZWQgfHwgdG9DaGVjayA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCB0eXBlcyA9IHR5cGUuc3BsaXQoXCJ8XCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuICAgICAgICBjb25zdCBhY3R1YWxUeXBlID0gdHlwZW9mIHRvQ2hlY2s7XG4gICAgICAgIC8vICNyZWdpb24gQ2hlY2sgaWYgdGhlIGFjdHVhbCB0eXBlIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXNcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VWYWxpZFR5cGVvZjogTmVjZXNzYXJ5XG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSB0eXBlcy5zb21lKCh0KSA9PiBhY3R1YWxUeXBlID09PSB0KTtcbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICBpZiAodHlwZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gYmUgb2YgdHlwZSBcIiR7dHlwZX1cIiBidXQgaXMgb2YgdHlwZSBcIiR7YWN0dWFsVHlwZX1cImA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byBiZSBvZiB0eXBlIFwiJHt0eXBlcy5qb2luKFwiIHwgXCIpfVwiIGJ1dCBpcyBvZiB0eXBlIFwiJHthY3R1YWxUeXBlfVwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyAjZW5kcmVnaW9uIENoZWNrIGlmIHRoZSBhY3R1YWwgdHlwZSBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHBhcmFtZXRlci1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0QSA6Oi1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgcGF0aHMgdG8gY2hlY2suIEVhY2ggcGF0aCBwb2ludHMgdG8gYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgICAgKiBcdFx0XHRcdFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBza2lwcGVkLiBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQUkUodHlwZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUFJFKFRZUEUuY2hlY2tBbGdvcml0aG0sIFt0eXBlXSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0QSA6Oi1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgcGF0aHMgdG8gY2hlY2suIEVhY2ggcGF0aCBwb2ludHMgdG8gYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgICAgKiBcdFx0XHRcdFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBza2lwcGVkLiBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBPU1QodHlwZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlUE9TVChUWVBFLmNoZWNrQWxnb3JpdGhtLCBbdHlwZV0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0QSA6Oi1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgcGF0aHMgdG8gY2hlY2suIEVhY2ggcGF0aCBwb2ludHMgdG8gYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgICAgKiBcdFx0XHRcdFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBza2lwcGVkLiBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQodHlwZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuY3JlYXRlSU5WQVJJQU5UKFRZUEUsIFt0eXBlXSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy8gI3JlZ2lvbiBSZWZlcmVuY2VkIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvL1xuICAgIC8vIEZvciB1c2FnZSBpbiBkeW5hbWljIHNjZW5hcmlvcyAobGlrZSB3aXRoIEFFLURCQykuXG4gICAgLy9cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIFRZUEUudHlwZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIHJldHVybiBUWVBFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIHRoaXMudHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0gcGFzc2luZyB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHRoZSB7QGxpbmsgVFlQRS50eXBlIH0gLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvQ2hlY2tcdFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSB0eXBlXHRcdFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBoaW50XHRcdEFuIG9wdGlvbmFsIHtAbGluayBzdHJpbmcgfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gaW4gY2FzZSBvZiBhbiBpbmZyaW5nZW1lbnQuXG4gICAgICogQHBhcmFtIGlkXHRcdEEge0BsaW5rIHN0cmluZyB9IGlkZW50aWZ5aW5nIHRoaXMge0BsaW5rIFRZUEUgfSB2aWEgdGhlIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0tTWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGRvZXNuJ3QgZnVsZmlsbCB0aGlzIHtAbGluayBUWVBFIH0uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEEge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfSBpZiB0aGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBkb2VzIG5vdCBmdWxmaWxsIHRoaXMge0BsaW5rIERFRklORUQgfS4gKi9cbiAgICBzdGF0aWMgdHNDaGVjayh0b0NoZWNrLCB0eXBlLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBUWVBFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIHR5cGUpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjaztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChgJHtpZCA/IGAoJHtpZH0pIGAgOiBcIlwifSR7cmVzdWx0fSR7aGludCA/IGAg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhpcyB7QGxpbmsgVFlQRSB9IGJ5IHNldHRpbmcgdGhlIHByb3RlY3RlZCBwcm9wZXJ0eSB7QGxpbmsgVFlQRS50eXBlIH0gdXNlZCBieSB7QGxpbmsgVFlQRS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgU2VlIHtAbGluayBUWVBFLmNoZWNrIH0uICovXG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBtb2R1bGVJZCArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJ2YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG52YXIgX19tZXRhZGF0YSA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7XG59O1xudmFyIF9fcGFyYW0gPSAodGhpcyAmJiB0aGlzLl9fcGFyYW0pIHx8IGZ1bmN0aW9uIChwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn07XG5pbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi9EQkNcIjtcbmltcG9ydCB7IEFFIH0gZnJvbSBcIi4vREJDL0FFXCI7XG5pbXBvcnQgeyBHUkVBVEVSIH0gZnJvbSBcIi4vREJDL0NPTVBBUklTT04vR1JFQVRFUlwiO1xuaW1wb3J0IHsgR1JFQVRFUl9PUl9FUVVBTCB9IGZyb20gXCIuL0RCQy9DT01QQVJJU09OL0dSRUFURVJfT1JfRVFVQUxcIjtcbmltcG9ydCB7IExFU1MgfSBmcm9tIFwiLi9EQkMvQ09NUEFSSVNPTi9MRVNTXCI7XG5pbXBvcnQgeyBMRVNTX09SX0VRVUFMIH0gZnJvbSBcIi4vREJDL0NPTVBBUklTT04vTEVTU19PUl9FUVVBTFwiO1xuaW1wb3J0IHsgRVEgfSBmcm9tIFwiLi9EQkMvRVFcIjtcbmltcG9ydCB7IERJRkZFUkVOVCB9IGZyb20gXCIuL0RCQy9FUS9ESUZGRVJFTlRcIjtcbmltcG9ydCB7IElOU1RBTkNFIH0gZnJvbSBcIi4vREJDL0lOU1RBTkNFXCI7XG5pbXBvcnQgeyBSRUdFWCB9IGZyb20gXCIuL0RCQy9SRUdFWFwiO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gXCIuL0RCQy9UWVBFXCI7XG4vKiogRGVtb25zdHJhdGl2ZSB1c2Ugb2YgKipEKiplc2lnbiAqKkIqKnkgKipDKipvbnRyYWN0IERlY29yYXRvcnMgKi9cbmV4cG9ydCBjbGFzcyBEZW1vIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gI3JlZ2lvbiBDaGVjayBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAgICAgICAgdGhpcy50ZXN0UHJvcGVydHkgPSBcImFcIjtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBTdGF0aWMgTWV0aG9kIHdpdGggUGFyYW12YWx1ZVByb3ZpZGVyXG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgUHJvcGVydHkgRGVjb3JhdG9yXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBQYXJhbWV0ZXIuICYgUmV0dXJudmFsdWUgRGVjb3JhdG9yXG4gICAgdGVzdFBhcmFtdmFsdWVBbmRSZXR1cm52YWx1ZShhKSB7XG4gICAgICAgIHJldHVybiBgeHh4eCR7YX1gO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFBhcmFtZXRlci4gJiBSZXR1cm52YWx1ZSBEZWNvcmF0b3JcbiAgICAvLyAjcmVnaW9uIENoZWNrIFJldHVybnZhbHVlIERlY29yYXRvclxuICAgIHRlc3RSZXR1cm52YWx1ZShhKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFJldHVybnZhbHVlIERlY29yYXRvclxuICAgIC8vICNyZWdpb24gQ2hlY2sgRVEtREJDICYgUGF0aCB0byBwcm9wZXJ0eSBvZiBQYXJhbWV0ZXItdmFsdWVcbiAgICB0ZXN0RVFBbmRQYXRoKG8pIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgRVEtREJDICYgUGF0aCB0byBwcm9wZXJ0eSBvZiBQYXJhbWV0ZXItdmFsdWVcbiAgICAvLyAjcmVnaW9uIENoZWNrIEVRLURCQyAmIFBhdGggdG8gcHJvcGVydHkgb2YgUGFyYW1ldGVyLXZhbHVlIHdpdGggSW52ZXJzaW9uXG4gICAgdGVzdEVRQW5kUGF0aFdpdGhJbnZlcnNpb24obykgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBFUS1EQkMgJiBQYXRoIHRvIHByb3BlcnR5IG9mIFBhcmFtZXRlci12YWx1ZSB3aXRoIEludmVyc2lvblxuICAgIC8vICNyZWdpb24gQ2hlY2sgVFlQRVxuICAgIHRlc3RUWVBFKG8pIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgVFlQRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgQUVcbiAgICB0ZXN0QUUoeCkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBBRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgUkVHRVggd2l0aCBBRVxuICAgIHRlc3RSRUdFWFdpdGhBRSh4KSB7IH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFJFR0VYIHdpdGggQUVcbiAgICAvLyAjcmVnaW9uIENoZWNrIElOU1RBTkNFXG4gICAgdGVzdElOU1RBTkNFKGNhbmRpZGF0ZSkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBJTlNUQU5DRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgQUUgUmFuZ2VcbiAgICB0ZXN0QUVSYW5nZSh4KSB7IH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIEFFIFJhbmdlXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBBRSBJbmRleFxuICAgIHRlc3RBRUluZGV4KHgpIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgQUUgSW5kZXhcbiAgICAvLyAjcmVnaW9uIENoZWNrIENvbXBhcmlzb25cbiAgICB0ZXN0R1JFQVRFUihpbnB1dCkgeyB9XG4gICAgdGVzdEdSRUFURVJfT1JfRVFVQUwoaW5wdXQpIHsgfVxuICAgIHRlc3RMRVNTKGlucHV0KSB7IH1cbiAgICB0ZXN0TEVTU19PUl9FUVVBTChpbnB1dCkgeyB9XG4gICAgdGVzdERJRkZFUkVOVChpbnB1dCkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBDb21wYXJpc29uXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBTdGF0aWMgTWV0aG9kIHdpdGggUGFyYW12YWx1ZVByb3ZpZGVyXG4gICAgc3RhdGljIHRlc3RTdGF0aWNNZXRob2QobWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGAke21lc3NhZ2V9IHJlcGVhdGVkICR7Y291bnR9IHRpbWVzYDtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBSRUdFWC5JTlZBUklBTlQoL15hJC8pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0UHJvcGVydHlcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFJFR0VYLlBPU1QoL154eHh4LiokLyksXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIFJFR0VYLlBSRSgvaG9sbGEqL2cpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbU3RyaW5nXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIFN0cmluZylcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RQYXJhbXZhbHVlQW5kUmV0dXJudmFsdWVcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBSRUdFWC5QT1NUKC9eeHh4eC4qJC8pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtTdHJpbmddKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgU3RyaW5nKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFJldHVybnZhbHVlXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEVRLlBSRShcIlNFTEVDVFwiLCBmYWxzZSwgXCJ0YWdOYW1lXCIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbSFRNTEVsZW1lbnRdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEVRQW5kUGF0aFwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBFUS5QUkUoXCJTRUxFQ1RcIiwgdHJ1ZSwgXCJ0YWdOYW1lXCIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbSFRNTEVsZW1lbnRdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEVRQW5kUGF0aFdpdGhJbnZlcnNpb25cIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgVFlQRS5QUkUoXCJzdHJpbmdcIikpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFRZUEVcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgQUUuUFJFKFtuZXcgVFlQRShcInN0cmluZ1wiKV0pKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXldKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEFFXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEFFLlBSRShuZXcgUkVHRVgoL14oP2k6KE5PVyl8KFsrLV1cXGQrW2RteV0pKSQvaSkpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXldKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFJFR0VYV2l0aEFFXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlclxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVGVzdFxuICAgICxcbiAgICBfX3BhcmFtKDAsIElOU1RBTkNFLlBSRShEYXRlKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0SU5TVEFOQ0VcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgQUUuUFJFKFtuZXcgVFlQRShcInN0cmluZ1wiKSwgbmV3IFJFR0VYKC9eYWJjJC8pXSwgMSwgMikpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtBcnJheV0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0QUVSYW5nZVwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBBRS5QUkUoW25ldyBUWVBFKFwic3RyaW5nXCIpLCBuZXcgUkVHRVgoL15hYmMkLyldLCAxKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0FycmF5XSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RBRUluZGV4XCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEdSRUFURVIuUFJFKDIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RHUkVBVEVSXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEdSRUFURVJfT1JfRVFVQUwuUFJFKDIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RHUkVBVEVSX09SX0VRVUFMXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIExFU1MuUFJFKDIwKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW051bWJlcl0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0TEVTU1wiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBMRVNTX09SX0VRVUFMLlBSRSgyMCkpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtOdW1iZXJdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdExFU1NfT1JfRVFVQUxcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgRElGRkVSRU5ULlBSRSgyMCkpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtOdW1iZXJdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdERJRkZFUkVOVFwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBUWVBFLlBSRShcInN0cmluZ1wiKSksXG4gICAgX19wYXJhbSgxLCBUWVBFLlBSRShcIm51bWJlclwiKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1N0cmluZywgTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIFN0cmluZylcbl0sIERlbW8sIFwidGVzdFN0YXRpY01ldGhvZFwiLCBudWxsKTtcbmNvbnN0IGRlbW8gPSBuZXcgRGVtbygpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RQcm9wZXJ0eSA9IFwiYWJkXCI7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiSU5WQVJJQU5UIEluZnJpbmdlbWVudFwiLCBcIk9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0UHJvcGVydHkgPSBcImFcIjtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJJTlZBUklBTlQgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbmRlbW8udGVzdFBhcmFtdmFsdWVBbmRSZXR1cm52YWx1ZShcImhvbGxhXCIpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIlBBUkFNRVRFUi0gJiBSRVRVUk5WQUxVRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RQYXJhbXZhbHVlQW5kUmV0dXJudmFsdWUoXCJ5eXl5XCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlBBUkFNRVRFUi0gJiBSRVRVUk5WQUxVRSBJbmZyaW5nZW1lbnRcIiwgXCJPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdFJldHVybnZhbHVlKFwieHh4eFwiKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJSRVRVUk5WQUxVRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RSZXR1cm52YWx1ZShcInl5eXlcIik7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiUkVUVVJOVkFMVUUgSW5mcmluZ2VtZW50XCIsIFwiT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RFUUFuZFBhdGgoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiRVEgd2l0aCBQYXRoIEluZnJpbmdlbWVudCBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RFUUFuZFBhdGhXaXRoSW52ZXJzaW9uKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIikpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkVRIHdpdGggUGF0aCBhbmQgSW52ZXJzaW9uIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdFRZUEUoXCJ4XCIpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIlRZUEUgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbnRyeSB7XG4gICAgZGVtby50ZXN0VFlQRSgwKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJUWVBFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdEFFKFtcIjExXCIsIFwiMTBcIiwgXCJiXCJdKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJBRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RBRShbXCIxMVwiLCAxMSwgXCJiXCJdKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJBRSBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RSRUdFWFdpdGhBRShbXCIrMWRcIiwgXCJOT1dcIiwgXCItMTB5XCJdKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJSRUdFWCB3aXRoIEFFIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdFJFR0VYV2l0aEFFKFtcIisxZFwiLCBcIis1ZFwiLCBcIi14MTB5XCJdKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJSRUdFWCB3aXRoIEFFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdElOU1RBTkNFKG5ldyBEYXRlKCkpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIklOU1RBTkNFIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdElOU1RBTkNFKGRlbW8pO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOU1RBTkNFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdEFFUmFuZ2UoWzExLCBcImFiY1wiLCBcImFiY1wiXSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiQUUgUmFuZ2UgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbnRyeSB7XG4gICAgZGVtby50ZXN0QUVSYW5nZShbMTEsIFwiYWJjXCIsIC9hL2ddKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJBRSBSYW5nZSBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RBRUluZGV4KFsxMSwgXCJhYmNcIiwgXCJhYmNcIl0pO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIkFFIEluZGV4IE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdEFFSW5kZXgoW1wiMTFcIiwgMTIsIFwiL2EvZ1wiXSk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiQUUgSW5kZXggSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0R1JFQVRFUigxMSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiR1JFQVRFUiBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RHUkVBVEVSKDIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkdSRUFURVIgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0R1JFQVRFUl9PUl9FUVVBTCgyKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJHUkVBVEVSX09SX0VRVUFMIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdEdSRUFURVJfT1JfRVFVQUwoMSk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiR1JFQVRFUl9PUl9FUVVBTCBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RMRVNTKDEwKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJMRVNTIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdExFU1MoMjApO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkxFU1MgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0TEVTU19PUl9FUVVBTCgyMCk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiTEVTUyBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RMRVNTX09SX0VRVUFMKDIxKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJMRVNTX09SX0VRVUFMIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdERJRkZFUkVOVCgyMSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiRElGRkVSRU5UIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdERJRkZFUkVOVCgyMCk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiRElGRkVSRU5UIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbi8vICNyZWdpb24gSW5hY3Rpdml0eSBDaGVja3NcbndpbmRvdy5XYVhDb2RlLkRCQy5leGVjdXRpb25TZXR0aW5ncy5jaGVja1ByZWNvbmRpdGlvbnMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0TEVTU19PUl9FUVVBTCgyMSk7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJJTkFDVElWRSBQUkVDT05ESVRJT05TIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBSRUNPTkRJVElPTlMgRkFJTEVEXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxud2luZG93LldhWENvZGUuREJDLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUG9zdGNvbmRpdGlvbnMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0UmV0dXJudmFsdWUoXCJxcXFxcVwiKTtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBPU1RDT05ESVRJT05TIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBPU1RDT05ESVRJT05TIEZBSUxFRFwiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbndpbmRvdy5XYVhDb2RlLkRCQy5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0UHJvcGVydHkgPSBcImJcIjtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIElOVkFSSUFOVFMgT0tcIik7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiSU5BQ1RJVkUgSU5WQVJJQU5UUyBGQUlMRURcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG4vLyAjZW5kcmVnaW9uIEluYWN0aXZpdHkgQ2hlY2tzXG4vLyBSZS1lbmFibGUgYWxsIGNoZWNrcyBmb3Igc3Vic2VxdWVudCB0ZXN0c1xud2luZG93LldhWENvZGUuREJDLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUHJlY29uZGl0aW9ucyA9IHRydWU7XG53aW5kb3cuV2FYQ29kZS5EQkMuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tQb3N0Y29uZGl0aW9ucyA9IHRydWU7XG53aW5kb3cuV2FYQ29kZS5EQkMuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tJbnZhcmlhbnRzID0gdHJ1ZTtcbi8vICNyZWdpb24gU3RhdGljIE1ldGhvZCBUZXN0XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiVEVTVElORyBTVEFUSUMgTUVUSE9EIFdJVEggUEFSQU1WQUxVRVBST1ZJREVSXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG5EZW1vLnRlc3RTdGF0aWNNZXRob2QoXCJIZWxsb1wiLCAzKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJTVEFUSUMgTUVUSE9EIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIERlbW8udGVzdFN0YXRpY01ldGhvZChcIkhlbGxvXCIsIFwibm90IGEgbnVtYmVyXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlNUQVRJQyBNRVRIT0QgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxudHJ5IHtcbiAgICBEZW1vLnRlc3RTdGF0aWNNZXRob2QoMTIzLCA1KTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJTVEFUSUMgTUVUSE9EIEluZnJpbmdlbWVudCAoZmlyc3QgcGFyYW0pIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuLy8gI2VuZHJlZ2lvbiBTdGF0aWMgTWV0aG9kIFRlc3RcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
package/package.json
CHANGED
package/src/DBC/OR.ts
CHANGED
package/src/DBC/REGEX.ts
CHANGED