@wiris/mathtype-viewer 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/WIRISplugins.js +23 -79
- package/dist/app.d.ts +9 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/properties.d.ts +1 -0
- package/dist/properties.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/app.ts +37 -19
- package/src/properties.ts +20 -2
package/dist/WIRISplugins.js
CHANGED
|
@@ -1766,17 +1766,6 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
1766
1766
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
1767
1767
|
}
|
|
1768
1768
|
};
|
|
1769
|
-
var __values = (this && this.__values) || function(o) {
|
|
1770
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
1771
|
-
if (m) return m.call(o);
|
|
1772
|
-
if (o && typeof o.length === "number") return {
|
|
1773
|
-
next: function () {
|
|
1774
|
-
if (o && i >= o.length) o = void 0;
|
|
1775
|
-
return { value: o && o[i++], done: !o };
|
|
1776
|
-
}
|
|
1777
|
-
};
|
|
1778
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
1779
|
-
};
|
|
1780
1769
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1781
1770
|
var properties_1 = __webpack_require__(/*! ./properties */ "./src/properties.ts");
|
|
1782
1771
|
var latex_1 = __webpack_require__(/*! ./latex */ "./src/latex.ts");
|
|
@@ -1792,9 +1781,12 @@ function main(w) {
|
|
|
1792
1781
|
case 0: return [4, properties_1.Properties.generate()];
|
|
1793
1782
|
case 1:
|
|
1794
1783
|
properties = _a.sent();
|
|
1795
|
-
w.viewer
|
|
1796
|
-
|
|
1797
|
-
|
|
1784
|
+
if (!w.viewer) {
|
|
1785
|
+
w.viewer = {
|
|
1786
|
+
properties: properties,
|
|
1787
|
+
isLoaded: false,
|
|
1788
|
+
};
|
|
1789
|
+
}
|
|
1798
1790
|
document = w.document;
|
|
1799
1791
|
properties.render = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
1800
1792
|
var element;
|
|
@@ -1815,71 +1807,11 @@ function main(w) {
|
|
|
1815
1807
|
});
|
|
1816
1808
|
}); };
|
|
1817
1809
|
start = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
1818
|
-
var _this = this;
|
|
1819
1810
|
return __generator(this, function (_a) {
|
|
1811
|
+
if (w.viewer.isLoaded)
|
|
1812
|
+
return [2];
|
|
1813
|
+
w.viewer.isLoaded = true;
|
|
1820
1814
|
properties.render();
|
|
1821
|
-
new MutationObserver(function (mutationList, observer) { return __awaiter(_this, void 0, void 0, function () {
|
|
1822
|
-
var mutationList_1, mutationList_1_1, mutation, _a, _b, node, e_1_1, e_2_1;
|
|
1823
|
-
var e_2, _c, e_1, _d;
|
|
1824
|
-
return __generator(this, function (_e) {
|
|
1825
|
-
switch (_e.label) {
|
|
1826
|
-
case 0:
|
|
1827
|
-
_e.trys.push([0, 11, 12, 13]);
|
|
1828
|
-
mutationList_1 = __values(mutationList), mutationList_1_1 = mutationList_1.next();
|
|
1829
|
-
_e.label = 1;
|
|
1830
|
-
case 1:
|
|
1831
|
-
if (!!mutationList_1_1.done) return [3, 10];
|
|
1832
|
-
mutation = mutationList_1_1.value;
|
|
1833
|
-
_e.label = 2;
|
|
1834
|
-
case 2:
|
|
1835
|
-
_e.trys.push([2, 7, 8, 9]);
|
|
1836
|
-
_a = (e_1 = void 0, __values(mutation.addedNodes)), _b = _a.next();
|
|
1837
|
-
_e.label = 3;
|
|
1838
|
-
case 3:
|
|
1839
|
-
if (!!_b.done) return [3, 6];
|
|
1840
|
-
node = _b.value;
|
|
1841
|
-
if (!(node instanceof HTMLElement)) return [3, 5];
|
|
1842
|
-
return [4, properties.render()];
|
|
1843
|
-
case 4:
|
|
1844
|
-
_e.sent();
|
|
1845
|
-
_e.label = 5;
|
|
1846
|
-
case 5:
|
|
1847
|
-
_b = _a.next();
|
|
1848
|
-
return [3, 3];
|
|
1849
|
-
case 6: return [3, 9];
|
|
1850
|
-
case 7:
|
|
1851
|
-
e_1_1 = _e.sent();
|
|
1852
|
-
e_1 = { error: e_1_1 };
|
|
1853
|
-
return [3, 9];
|
|
1854
|
-
case 8:
|
|
1855
|
-
try {
|
|
1856
|
-
if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
|
|
1857
|
-
}
|
|
1858
|
-
finally { if (e_1) throw e_1.error; }
|
|
1859
|
-
return [7];
|
|
1860
|
-
case 9:
|
|
1861
|
-
mutationList_1_1 = mutationList_1.next();
|
|
1862
|
-
return [3, 1];
|
|
1863
|
-
case 10: return [3, 13];
|
|
1864
|
-
case 11:
|
|
1865
|
-
e_2_1 = _e.sent();
|
|
1866
|
-
e_2 = { error: e_2_1 };
|
|
1867
|
-
return [3, 13];
|
|
1868
|
-
case 12:
|
|
1869
|
-
try {
|
|
1870
|
-
if (mutationList_1_1 && !mutationList_1_1.done && (_c = mutationList_1.return)) _c.call(mutationList_1);
|
|
1871
|
-
}
|
|
1872
|
-
finally { if (e_2) throw e_2.error; }
|
|
1873
|
-
return [7];
|
|
1874
|
-
case 13: return [2];
|
|
1875
|
-
}
|
|
1876
|
-
});
|
|
1877
|
-
}); })
|
|
1878
|
-
.observe(document, {
|
|
1879
|
-
attributes: true,
|
|
1880
|
-
childList: true,
|
|
1881
|
-
subtree: true,
|
|
1882
|
-
});
|
|
1883
1815
|
return [2];
|
|
1884
1816
|
});
|
|
1885
1817
|
}); };
|
|
@@ -2334,6 +2266,7 @@ var Properties = (function () {
|
|
|
2334
2266
|
instance.config.zoom = +urlParams.get('zoom');
|
|
2335
2267
|
}
|
|
2336
2268
|
}
|
|
2269
|
+
instance.checkServices();
|
|
2337
2270
|
_b.label = 1;
|
|
2338
2271
|
case 1:
|
|
2339
2272
|
_b.trys.push([1, 3, , 4]);
|
|
@@ -2356,6 +2289,17 @@ var Properties = (function () {
|
|
|
2356
2289
|
});
|
|
2357
2290
|
});
|
|
2358
2291
|
};
|
|
2292
|
+
Properties.prototype.checkServices = function () {
|
|
2293
|
+
var path = (document.currentScript.src);
|
|
2294
|
+
if (path.includes('pluginwiris_engine')) {
|
|
2295
|
+
this.config.editorServicesRoot = path;
|
|
2296
|
+
this.config.editorServicesExtension = '';
|
|
2297
|
+
}
|
|
2298
|
+
else if (path.includes('integration/WIRISplugins')) {
|
|
2299
|
+
this.config.editorServicesRoot = path;
|
|
2300
|
+
this.config.editorServicesExtension = '.php';
|
|
2301
|
+
}
|
|
2302
|
+
};
|
|
2359
2303
|
Object.defineProperty(Properties.prototype, "editorServicesRoot", {
|
|
2360
2304
|
get: function () {
|
|
2361
2305
|
return this.config.editorServicesRoot ||
|
|
@@ -6968,7 +6912,7 @@ class Util {
|
|
|
6968
6912
|
// Get all the annotation content including the tags.
|
|
6969
6913
|
let annotation = html.match(annotationRegex);
|
|
6970
6914
|
// Sanitize html code without removing the <semantics> and <annotation> tags.
|
|
6971
|
-
html = dompurify__WEBPACK_IMPORTED_MODULE_0___default().sanitize(html, { ADD_TAGS: ['semantics', 'annotation'], ALLOWED_ATTR: ['mathvariant', 'class', 'linebreak']});
|
|
6915
|
+
html = dompurify__WEBPACK_IMPORTED_MODULE_0___default().sanitize(html, { ADD_TAGS: ['semantics', 'annotation'], ALLOWED_ATTR: ['mathvariant', 'class', 'linebreak', 'open', 'close']});
|
|
6972
6916
|
// Readd old annotation content.
|
|
6973
6917
|
return html.replace(annotationRegex, annotation);
|
|
6974
6918
|
}
|
|
@@ -7741,4 +7685,4 @@ module.exports = JSON.parse('{"ar":{"latex":"LaTeX","cancel":"إلغاء","accep
|
|
|
7741
7685
|
/******/
|
|
7742
7686
|
/******/ })()
|
|
7743
7687
|
;
|
|
7744
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEIsZ0JBQWdCLFFBQVE7QUFDeEIsZ0JBQWdCLFFBQVE7QUFDeEIsZ0JBQWdCLFNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsd0JBQXdCLHdCQUF3QjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUpBQWlKO0FBQ2pKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUF1QixHQUFHLE1BQU07QUFDOUM7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VDL2pDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsaUNBQWlDLFdBQVc7V0FDNUM7V0FDQTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7VUVOQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi4vLi4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9kaXN0L3B1cmlmeS5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vc3JjL2FwcC50cyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vc3JjL2xhdGV4LnRzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9zcmMvbWF0aG1sLnRzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9zcmMvcHJvcGVydGllcy50cyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vc3JjL3JldHJvLnRzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9zcmMvc2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL3NyYy91dGlscy50cyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvYWNjZXNzaWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvY29uZmlndXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9ub2RlX21vZHVsZXMvQHdpcmlzL21hdGh0eXBlLWh0bWwtaW50ZWdyYXRpb24tZGV2a2l0L3NyYy9pbWFnZS5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvbGF0ZXguanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL2xpc3RlbmVycy5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvbWF0aG1sLmpzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9ub2RlX21vZHVsZXMvQHdpcmlzL21hdGh0eXBlLWh0bWwtaW50ZWdyYXRpb24tZGV2a2l0L3NyYy9tZDUuanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL3BhcnNlci5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvc2VydmljZXByb3ZpZGVyLmpzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9ub2RlX21vZHVsZXMvQHdpcmlzL21hdGh0eXBlLWh0bWwtaW50ZWdyYXRpb24tZGV2a2l0L3NyYy9zdHJpbmdtYW5hZ2VyLmpzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9ub2RlX21vZHVsZXMvQHdpcmlzL21hdGh0eXBlLWh0bWwtaW50ZWdyYXRpb24tZGV2a2l0L3NyYy90ZXh0Y2FjaGUuanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL3V0aWwuanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvd2VicGFjay9hZnRlci1zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISBAbGljZW5zZSBET01QdXJpZnkgMi40LjcgfCAoYykgQ3VyZTUzIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBSZWxlYXNlZCB1bmRlciB0aGUgQXBhY2hlIGxpY2Vuc2UgMi4wIGFuZCBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIDIuMCB8IGdpdGh1Yi5jb20vY3VyZTUzL0RPTVB1cmlmeS9ibG9iLzIuNC43L0xJQ0VOU0UgKi9cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuRE9NUHVyaWZ5ID0gZmFjdG9yeSgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICAgIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfSwgX3R5cGVvZihvYmopO1xuICB9XG5cbiAgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICAgIG8uX19wcm90b19fID0gcDtcbiAgICAgIHJldHVybiBvO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xuICB9XG5cbiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgICBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICAgIGEucHVzaC5hcHBseShhLCBhcmdzKTtcbiAgICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgICAgaWYgKENsYXNzKSBfc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG4gIH1cblxuICBmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gICAgaWYgKCFvKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gICAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIH1cblxuICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICAgIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gICAgcmV0dXJuIGFycjI7XG4gIH1cblxuICBmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gIH1cblxuICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QuaGFzT3duUHJvcGVydHksXG4gICAgICBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZixcbiAgICAgIGlzRnJvemVuID0gT2JqZWN0LmlzRnJvemVuLFxuICAgICAgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICB2YXIgZnJlZXplID0gT2JqZWN0LmZyZWV6ZSxcbiAgICAgIHNlYWwgPSBPYmplY3Quc2VhbCxcbiAgICAgIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLW11dGFibGUtZXhwb3J0c1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QsXG4gICAgICBhcHBseSA9IF9yZWYuYXBwbHksXG4gICAgICBjb25zdHJ1Y3QgPSBfcmVmLmNvbnN0cnVjdDtcblxuICBpZiAoIWFwcGx5KSB7XG4gICAgYXBwbHkgPSBmdW5jdGlvbiBhcHBseShmdW4sIHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bi5hcHBseSh0aGlzVmFsdWUsIGFyZ3MpO1xuICAgIH07XG4gIH1cblxuICBpZiAoIWZyZWV6ZSkge1xuICAgIGZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZSh4KSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFzZWFsKSB7XG4gICAgc2VhbCA9IGZ1bmN0aW9uIHNlYWwoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuXG4gIGlmICghY29uc3RydWN0KSB7XG4gICAgY29uc3RydWN0ID0gZnVuY3Rpb24gY29uc3RydWN0KEZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KEZ1bmMsIF90b0NvbnN1bWFibGVBcnJheShhcmdzKSk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBhcnJheUZvckVhY2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKTtcbiAgdmFyIGFycmF5UG9wID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUucG9wKTtcbiAgdmFyIGFycmF5UHVzaCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICB2YXIgc3RyaW5nVG9Mb3dlckNhc2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UpO1xuICB2YXIgc3RyaW5nVG9TdHJpbmcgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcpO1xuICB2YXIgc3RyaW5nTWF0Y2ggPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpO1xuICB2YXIgc3RyaW5nUmVwbGFjZSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbiAgdmFyIHN0cmluZ0luZGV4T2YgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZik7XG4gIHZhciBzdHJpbmdUcmltID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRyaW0pO1xuICB2YXIgcmVnRXhwVGVzdCA9IHVuYXBwbHkoUmVnRXhwLnByb3RvdHlwZS50ZXN0KTtcbiAgdmFyIHR5cGVFcnJvckNyZWF0ZSA9IHVuY29uc3RydWN0KFR5cGVFcnJvcik7XG4gIGZ1bmN0aW9uIHVuYXBwbHkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpc0FyZykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gdW5jb25zdHJ1Y3QoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uc3RydWN0KGZ1bmMsIGFyZ3MpO1xuICAgIH07XG4gIH1cbiAgLyogQWRkIHByb3BlcnRpZXMgdG8gYSBsb29rdXAgdGFibGUgKi9cblxuICBmdW5jdGlvbiBhZGRUb1NldChzZXQsIGFycmF5LCB0cmFuc2Zvcm1DYXNlRnVuYykge1xuICAgIHZhciBfdHJhbnNmb3JtQ2FzZUZ1bmM7XG5cbiAgICB0cmFuc2Zvcm1DYXNlRnVuYyA9IChfdHJhbnNmb3JtQ2FzZUZ1bmMgPSB0cmFuc2Zvcm1DYXNlRnVuYykgIT09IG51bGwgJiYgX3RyYW5zZm9ybUNhc2VGdW5jICE9PSB2b2lkIDAgPyBfdHJhbnNmb3JtQ2FzZUZ1bmMgOiBzdHJpbmdUb0xvd2VyQ2FzZTtcblxuICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgLy8gTWFrZSAnaW4nIGFuZCB0cnV0aHkgY2hlY2tzIGxpa2UgQm9vbGVhbihzZXQuY29uc3RydWN0b3IpXG4gICAgICAvLyBpbmRlcGVuZGVudCBvZiBhbnkgcHJvcGVydGllcyBkZWZpbmVkIG9uIE9iamVjdC5wcm90b3R5cGUuXG4gICAgICAvLyBQcmV2ZW50IHByb3RvdHlwZSBzZXR0ZXJzIGZyb20gaW50ZXJjZXB0aW5nIHNldCBhcyBhIHRoaXMgdmFsdWUuXG4gICAgICBzZXRQcm90b3R5cGVPZihzZXQsIG51bGwpO1xuICAgIH1cblxuICAgIHZhciBsID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGwtLSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBhcnJheVtsXTtcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgbGNFbGVtZW50ID0gdHJhbnNmb3JtQ2FzZUZ1bmMoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGxjRWxlbWVudCAhPT0gZWxlbWVudCkge1xuICAgICAgICAgIC8vIENvbmZpZyBwcmVzZXRzIChlLmcuIHRhZ3MuanMsIGF0dHJzLmpzKSBhcmUgaW1tdXRhYmxlLlxuICAgICAgICAgIGlmICghaXNGcm96ZW4oYXJyYXkpKSB7XG4gICAgICAgICAgICBhcnJheVtsXSA9IGxjRWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbGVtZW50ID0gbGNFbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldFtlbGVtZW50XSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldDtcbiAgfVxuICAvKiBTaGFsbG93IGNsb25lIGFuIG9iamVjdCAqL1xuXG4gIGZ1bmN0aW9uIGNsb25lKG9iamVjdCkge1xuICAgIHZhciBuZXdPYmplY3QgPSBjcmVhdGUobnVsbCk7XG4gICAgdmFyIHByb3BlcnR5O1xuXG4gICAgZm9yIChwcm9wZXJ0eSBpbiBvYmplY3QpIHtcbiAgICAgIGlmIChhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBbcHJvcGVydHldKSA9PT0gdHJ1ZSkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3T2JqZWN0O1xuICB9XG4gIC8qIElFMTAgZG9lc24ndCBzdXBwb3J0IF9fbG9va3VwR2V0dGVyX18gc28gbGV0cydcbiAgICogc2ltdWxhdGUgaXQuIEl0IGFsc28gYXV0b21hdGljYWxseSBjaGVja3NcbiAgICogaWYgdGhlIHByb3AgaXMgZnVuY3Rpb24gb3IgZ2V0dGVyIGFuZCBiZWhhdmVzXG4gICAqIGFjY29yZGluZ2x5LiAqL1xuXG4gIGZ1bmN0aW9uIGxvb2t1cEdldHRlcihvYmplY3QsIHByb3ApIHtcbiAgICB3aGlsZSAob2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3ApO1xuXG4gICAgICBpZiAoZGVzYykge1xuICAgICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKCdmYWxsYmFjayB2YWx1ZSBmb3InLCBlbGVtZW50KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxsYmFja1ZhbHVlO1xuICB9XG5cbiAgdmFyIGh0bWwkMSA9IGZyZWV6ZShbJ2EnLCAnYWJicicsICdhY3JvbnltJywgJ2FkZHJlc3MnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2F1ZGlvJywgJ2InLCAnYmRpJywgJ2JkbycsICdiaWcnLCAnYmxpbmsnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYW52YXMnLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY2l0ZScsICdjb2RlJywgJ2NvbCcsICdjb2xncm91cCcsICdjb250ZW50JywgJ2RhdGEnLCAnZGF0YWxpc3QnLCAnZGQnLCAnZGVjb3JhdG9yJywgJ2RlbCcsICdkZXRhaWxzJywgJ2RmbicsICdkaWFsb2cnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbGVtZW50JywgJ2VtJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2ZvbnQnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaScsICdpbWcnLCAnaW5wdXQnLCAnaW5zJywgJ2tiZCcsICdsYWJlbCcsICdsZWdlbmQnLCAnbGknLCAnbWFpbicsICdtYXAnLCAnbWFyaycsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0ZXInLCAnbmF2JywgJ25vYnInLCAnb2wnLCAnb3B0Z3JvdXAnLCAnb3B0aW9uJywgJ291dHB1dCcsICdwJywgJ3BpY3R1cmUnLCAncHJlJywgJ3Byb2dyZXNzJywgJ3EnLCAncnAnLCAncnQnLCAncnVieScsICdzJywgJ3NhbXAnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc2hhZG93JywgJ3NtYWxsJywgJ3NvdXJjZScsICdzcGFjZXInLCAnc3BhbicsICdzdHJpa2UnLCAnc3Ryb25nJywgJ3N0eWxlJywgJ3N1YicsICdzdW1tYXJ5JywgJ3N1cCcsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aW1lJywgJ3RyJywgJ3RyYWNrJywgJ3R0JywgJ3UnLCAndWwnLCAndmFyJywgJ3ZpZGVvJywgJ3diciddKTsgLy8gU1ZHXG5cbiAgdmFyIHN2ZyQxID0gZnJlZXplKFsnc3ZnJywgJ2EnLCAnYWx0Z2x5cGgnLCAnYWx0Z2x5cGhkZWYnLCAnYWx0Z2x5cGhpdGVtJywgJ2FuaW1hdGVjb2xvcicsICdhbmltYXRlbW90aW9uJywgJ2FuaW1hdGV0cmFuc2Zvcm0nLCAnY2lyY2xlJywgJ2NsaXBwYXRoJywgJ2RlZnMnLCAnZGVzYycsICdlbGxpcHNlJywgJ2ZpbHRlcicsICdmb250JywgJ2cnLCAnZ2x5cGgnLCAnZ2x5cGhyZWYnLCAnaGtlcm4nLCAnaW1hZ2UnLCAnbGluZScsICdsaW5lYXJncmFkaWVudCcsICdtYXJrZXInLCAnbWFzaycsICdtZXRhZGF0YScsICdtcGF0aCcsICdwYXRoJywgJ3BhdHRlcm4nLCAncG9seWdvbicsICdwb2x5bGluZScsICdyYWRpYWxncmFkaWVudCcsICdyZWN0JywgJ3N0b3AnLCAnc3R5bGUnLCAnc3dpdGNoJywgJ3N5bWJvbCcsICd0ZXh0JywgJ3RleHRwYXRoJywgJ3RpdGxlJywgJ3RyZWYnLCAndHNwYW4nLCAndmlldycsICd2a2VybiddKTtcbiAgdmFyIHN2Z0ZpbHRlcnMgPSBmcmVlemUoWydmZUJsZW5kJywgJ2ZlQ29sb3JNYXRyaXgnLCAnZmVDb21wb25lbnRUcmFuc2ZlcicsICdmZUNvbXBvc2l0ZScsICdmZUNvbnZvbHZlTWF0cml4JywgJ2ZlRGlmZnVzZUxpZ2h0aW5nJywgJ2ZlRGlzcGxhY2VtZW50TWFwJywgJ2ZlRGlzdGFudExpZ2h0JywgJ2ZlRmxvb2QnLCAnZmVGdW5jQScsICdmZUZ1bmNCJywgJ2ZlRnVuY0cnLCAnZmVGdW5jUicsICdmZUdhdXNzaWFuQmx1cicsICdmZUltYWdlJywgJ2ZlTWVyZ2UnLCAnZmVNZXJnZU5vZGUnLCAnZmVNb3JwaG9sb2d5JywgJ2ZlT2Zmc2V0JywgJ2ZlUG9pbnRMaWdodCcsICdmZVNwZWN1bGFyTGlnaHRpbmcnLCAnZmVTcG90TGlnaHQnLCAnZmVUaWxlJywgJ2ZlVHVyYnVsZW5jZSddKTsgLy8gTGlzdCBvZiBTVkcgZWxlbWVudHMgdGhhdCBhcmUgZGlzYWxsb3dlZCBieSBkZWZhdWx0LlxuICAvLyBXZSBzdGlsbCBuZWVkIHRvIGtub3cgdGhlbSBzbyB0aGF0IHdlIGNhbiBkbyBuYW1lc3BhY2VcbiAgLy8gY2hlY2tzIHByb3Blcmx5IGluIGNhc2Ugb25lIHdhbnRzIHRvIGFkZCB0aGVtIHRvXG4gIC8vIGFsbG93LWxpc3QuXG5cbiAgdmFyIHN2Z0Rpc2FsbG93ZWQgPSBmcmVlemUoWydhbmltYXRlJywgJ2NvbG9yLXByb2ZpbGUnLCAnY3Vyc29yJywgJ2Rpc2NhcmQnLCAnZmVkcm9wc2hhZG93JywgJ2ZvbnQtZmFjZScsICdmb250LWZhY2UtZm9ybWF0JywgJ2ZvbnQtZmFjZS1uYW1lJywgJ2ZvbnQtZmFjZS1zcmMnLCAnZm9udC1mYWNlLXVyaScsICdmb3JlaWdub2JqZWN0JywgJ2hhdGNoJywgJ2hhdGNocGF0aCcsICdtZXNoJywgJ21lc2hncmFkaWVudCcsICdtZXNocGF0Y2gnLCAnbWVzaHJvdycsICdtaXNzaW5nLWdseXBoJywgJ3NjcmlwdCcsICdzZXQnLCAnc29saWRjb2xvcicsICd1bmtub3duJywgJ3VzZSddKTtcbiAgdmFyIG1hdGhNbCQxID0gZnJlZXplKFsnbWF0aCcsICdtZW5jbG9zZScsICdtZXJyb3InLCAnbWZlbmNlZCcsICdtZnJhYycsICdtZ2x5cGgnLCAnbWknLCAnbWxhYmVsZWR0cicsICdtbXVsdGlzY3JpcHRzJywgJ21uJywgJ21vJywgJ21vdmVyJywgJ21wYWRkZWQnLCAnbXBoYW50b20nLCAnbXJvb3QnLCAnbXJvdycsICdtcycsICdtc3BhY2UnLCAnbXNxcnQnLCAnbXN0eWxlJywgJ21zdWInLCAnbXN1cCcsICdtc3Vic3VwJywgJ210YWJsZScsICdtdGQnLCAnbXRleHQnLCAnbXRyJywgJ211bmRlcicsICdtdW5kZXJvdmVyJ10pOyAvLyBTaW1pbGFybHkgdG8gU1ZHLCB3ZSB3YW50IHRvIGtub3cgYWxsIE1hdGhNTCBlbGVtZW50cyxcbiAgLy8gZXZlbiB0aG9zZSB0aGF0IHdlIGRpc2FsbG93IGJ5IGRlZmF1bHQuXG5cbiAgdmFyIG1hdGhNbERpc2FsbG93ZWQgPSBmcmVlemUoWydtYWN0aW9uJywgJ21hbGlnbmdyb3VwJywgJ21hbGlnbm1hcmsnLCAnbWxvbmdkaXYnLCAnbXNjYXJyaWVzJywgJ21zY2FycnknLCAnbXNncm91cCcsICdtc3RhY2snLCAnbXNsaW5lJywgJ21zcm93JywgJ3NlbWFudGljcycsICdhbm5vdGF0aW9uJywgJ2Fubm90YXRpb24teG1sJywgJ21wcmVzY3JpcHRzJywgJ25vbmUnXSk7XG4gIHZhciB0ZXh0ID0gZnJlZXplKFsnI3RleHQnXSk7XG5cbiAgdmFyIGh0bWwgPSBmcmVlemUoWydhY2NlcHQnLCAnYWN0aW9uJywgJ2FsaWduJywgJ2FsdCcsICdhdXRvY2FwaXRhbGl6ZScsICdhdXRvY29tcGxldGUnLCAnYXV0b3BpY3R1cmVpbnBpY3R1cmUnLCAnYXV0b3BsYXknLCAnYmFja2dyb3VuZCcsICdiZ2NvbG9yJywgJ2JvcmRlcicsICdjYXB0dXJlJywgJ2NlbGxwYWRkaW5nJywgJ2NlbGxzcGFjaW5nJywgJ2NoZWNrZWQnLCAnY2l0ZScsICdjbGFzcycsICdjbGVhcicsICdjb2xvcicsICdjb2xzJywgJ2NvbHNwYW4nLCAnY29udHJvbHMnLCAnY29udHJvbHNsaXN0JywgJ2Nvb3JkcycsICdjcm9zc29yaWdpbicsICdkYXRldGltZScsICdkZWNvZGluZycsICdkZWZhdWx0JywgJ2RpcicsICdkaXNhYmxlZCcsICdkaXNhYmxlcGljdHVyZWlucGljdHVyZScsICdkaXNhYmxlcmVtb3RlcGxheWJhY2snLCAnZG93bmxvYWQnLCAnZHJhZ2dhYmxlJywgJ2VuY3R5cGUnLCAnZW50ZXJrZXloaW50JywgJ2ZhY2UnLCAnZm9yJywgJ2hlYWRlcnMnLCAnaGVpZ2h0JywgJ2hpZGRlbicsICdoaWdoJywgJ2hyZWYnLCAnaHJlZmxhbmcnLCAnaWQnLCAnaW5wdXRtb2RlJywgJ2ludGVncml0eScsICdpc21hcCcsICdraW5kJywgJ2xhYmVsJywgJ2xhbmcnLCAnbGlzdCcsICdsb2FkaW5nJywgJ2xvb3AnLCAnbG93JywgJ21heCcsICdtYXhsZW5ndGgnLCAnbWVkaWEnLCAnbWV0aG9kJywgJ21pbicsICdtaW5sZW5ndGgnLCAnbXVsdGlwbGUnLCAnbXV0ZWQnLCAnbmFtZScsICdub25jZScsICdub3NoYWRlJywgJ25vdmFsaWRhdGUnLCAnbm93cmFwJywgJ29wZW4nLCAnb3B0aW11bScsICdwYXR0ZXJuJywgJ3BsYWNlaG9sZGVyJywgJ3BsYXlzaW5saW5lJywgJ3Bvc3RlcicsICdwcmVsb2FkJywgJ3B1YmRhdGUnLCAncmFkaW9ncm91cCcsICdyZWFkb25seScsICdyZWwnLCAncmVxdWlyZWQnLCAncmV2JywgJ3JldmVyc2VkJywgJ3JvbGUnLCAncm93cycsICdyb3dzcGFuJywgJ3NwZWxsY2hlY2snLCAnc2NvcGUnLCAnc2VsZWN0ZWQnLCAnc2hhcGUnLCAnc2l6ZScsICdzaXplcycsICdzcGFuJywgJ3NyY2xhbmcnLCAnc3RhcnQnLCAnc3JjJywgJ3NyY3NldCcsICdzdGVwJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAndGFiaW5kZXgnLCAndGl0bGUnLCAndHJhbnNsYXRlJywgJ3R5cGUnLCAndXNlbWFwJywgJ3ZhbGlnbicsICd2YWx1ZScsICd3aWR0aCcsICd4bWxucycsICdzbG90J10pO1xuICB2YXIgc3ZnID0gZnJlZXplKFsnYWNjZW50LWhlaWdodCcsICdhY2N1bXVsYXRlJywgJ2FkZGl0aXZlJywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhc2NlbnQnLCAnYXR0cmlidXRlbmFtZScsICdhdHRyaWJ1dGV0eXBlJywgJ2F6aW11dGgnLCAnYmFzZWZyZXF1ZW5jeScsICdiYXNlbGluZS1zaGlmdCcsICdiZWdpbicsICdiaWFzJywgJ2J5JywgJ2NsYXNzJywgJ2NsaXAnLCAnY2xpcHBhdGh1bml0cycsICdjbGlwLXBhdGgnLCAnY2xpcC1ydWxlJywgJ2NvbG9yJywgJ2NvbG9yLWludGVycG9sYXRpb24nLCAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywgJ2NvbG9yLXByb2ZpbGUnLCAnY29sb3ItcmVuZGVyaW5nJywgJ2N4JywgJ2N5JywgJ2QnLCAnZHgnLCAnZHknLCAnZGlmZnVzZWNvbnN0YW50JywgJ2RpcmVjdGlvbicsICdkaXNwbGF5JywgJ2Rpdmlzb3InLCAnZHVyJywgJ2VkZ2Vtb2RlJywgJ2VsZXZhdGlvbicsICdlbmQnLCAnZmlsbCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2ZpbHRlcicsICdmaWx0ZXJ1bml0cycsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdmeCcsICdmeScsICdnMScsICdnMicsICdnbHlwaC1uYW1lJywgJ2dseXBocmVmJywgJ2dyYWRpZW50dW5pdHMnLCAnZ3JhZGllbnR0cmFuc2Zvcm0nLCAnaGVpZ2h0JywgJ2hyZWYnLCAnaWQnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2luJywgJ2luMicsICdrJywgJ2sxJywgJ2syJywgJ2szJywgJ2s0JywgJ2tlcm5pbmcnLCAna2V5cG9pbnRzJywgJ2tleXNwbGluZXMnLCAna2V5dGltZXMnLCAnbGFuZycsICdsZW5ndGhhZGp1c3QnLCAnbGV0dGVyLXNwYWNpbmcnLCAna2VybmVsbWF0cml4JywgJ2tlcm5lbHVuaXRsZW5ndGgnLCAnbGlnaHRpbmctY29sb3InLCAnbG9jYWwnLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdtYXJrZXJoZWlnaHQnLCAnbWFya2VydW5pdHMnLCAnbWFya2Vyd2lkdGgnLCAnbWFza2NvbnRlbnR1bml0cycsICdtYXNrdW5pdHMnLCAnbWF4JywgJ21hc2snLCAnbWVkaWEnLCAnbWV0aG9kJywgJ21vZGUnLCAnbWluJywgJ25hbWUnLCAnbnVtb2N0YXZlcycsICdvZmZzZXQnLCAnb3BlcmF0b3InLCAnb3BhY2l0eScsICdvcmRlcicsICdvcmllbnQnLCAnb3JpZW50YXRpb24nLCAnb3JpZ2luJywgJ292ZXJmbG93JywgJ3BhaW50LW9yZGVyJywgJ3BhdGgnLCAncGF0aGxlbmd0aCcsICdwYXR0ZXJuY29udGVudHVuaXRzJywgJ3BhdHRlcm50cmFuc2Zvcm0nLCAncGF0dGVybnVuaXRzJywgJ3BvaW50cycsICdwcmVzZXJ2ZWFscGhhJywgJ3ByZXNlcnZlYXNwZWN0cmF0aW8nLCAncHJpbWl0aXZldW5pdHMnLCAncicsICdyeCcsICdyeScsICdyYWRpdXMnLCAncmVmeCcsICdyZWZ5JywgJ3JlcGVhdGNvdW50JywgJ3JlcGVhdGR1cicsICdyZXN0YXJ0JywgJ3Jlc3VsdCcsICdyb3RhdGUnLCAnc2NhbGUnLCAnc2VlZCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3BlY3VsYXJjb25zdGFudCcsICdzcGVjdWxhcmV4cG9uZW50JywgJ3NwcmVhZG1ldGhvZCcsICdzdGFydG9mZnNldCcsICdzdGRkZXZpYXRpb24nLCAnc3RpdGNodGlsZXMnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlJywgJ3N0cm9rZS13aWR0aCcsICdzdHlsZScsICdzdXJmYWNlc2NhbGUnLCAnc3lzdGVtbGFuZ3VhZ2UnLCAndGFiaW5kZXgnLCAndGFyZ2V0eCcsICd0YXJnZXR5JywgJ3RyYW5zZm9ybScsICd0cmFuc2Zvcm0tb3JpZ2luJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd0ZXh0bGVuZ3RoJywgJ3R5cGUnLCAndTEnLCAndTInLCAndW5pY29kZScsICd2YWx1ZXMnLCAndmlld2JveCcsICd2aXNpYmlsaXR5JywgJ3ZlcnNpb24nLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd2lkdGgnLCAnd29yZC1zcGFjaW5nJywgJ3dyYXAnLCAnd3JpdGluZy1tb2RlJywgJ3hjaGFubmVsc2VsZWN0b3InLCAneWNoYW5uZWxzZWxlY3RvcicsICd4JywgJ3gxJywgJ3gyJywgJ3htbG5zJywgJ3knLCAneTEnLCAneTInLCAneicsICd6b29tYW5kcGFuJ10pO1xuICB2YXIgbWF0aE1sID0gZnJlZXplKFsnYWNjZW50JywgJ2FjY2VudHVuZGVyJywgJ2FsaWduJywgJ2JldmVsbGVkJywgJ2Nsb3NlJywgJ2NvbHVtbnNhbGlnbicsICdjb2x1bW5saW5lcycsICdjb2x1bW5zcGFuJywgJ2Rlbm9tYWxpZ24nLCAnZGVwdGgnLCAnZGlyJywgJ2Rpc3BsYXknLCAnZGlzcGxheXN0eWxlJywgJ2VuY29kaW5nJywgJ2ZlbmNlJywgJ2ZyYW1lJywgJ2hlaWdodCcsICdocmVmJywgJ2lkJywgJ2xhcmdlb3AnLCAnbGVuZ3RoJywgJ2xpbmV0aGlja25lc3MnLCAnbHNwYWNlJywgJ2xxdW90ZScsICdtYXRoYmFja2dyb3VuZCcsICdtYXRoY29sb3InLCAnbWF0aHNpemUnLCAnbWF0aHZhcmlhbnQnLCAnbWF4c2l6ZScsICdtaW5zaXplJywgJ21vdmFibGVsaW1pdHMnLCAnbm90YXRpb24nLCAnbnVtYWxpZ24nLCAnb3BlbicsICdyb3dhbGlnbicsICdyb3dsaW5lcycsICdyb3dzcGFjaW5nJywgJ3Jvd3NwYW4nLCAncnNwYWNlJywgJ3JxdW90ZScsICdzY3JpcHRsZXZlbCcsICdzY3JpcHRtaW5zaXplJywgJ3NjcmlwdHNpemVtdWx0aXBsaWVyJywgJ3NlbGVjdGlvbicsICdzZXBhcmF0b3InLCAnc2VwYXJhdG9ycycsICdzdHJldGNoeScsICdzdWJzY3JpcHRzaGlmdCcsICdzdXBzY3JpcHRzaGlmdCcsICdzeW1tZXRyaWMnLCAndm9mZnNldCcsICd3aWR0aCcsICd4bWxucyddKTtcbiAgdmFyIHhtbCA9IGZyZWV6ZShbJ3hsaW5rOmhyZWYnLCAneG1sOmlkJywgJ3hsaW5rOnRpdGxlJywgJ3htbDpzcGFjZScsICd4bWxuczp4bGluayddKTtcblxuICB2YXIgTVVTVEFDSEVfRVhQUiA9IHNlYWwoL1xce1xce1tcXHdcXFddKnxbXFx3XFxXXSpcXH1cXH0vZ20pOyAvLyBTcGVjaWZ5IHRlbXBsYXRlIGRldGVjdGlvbiByZWdleCBmb3IgU0FGRV9GT1JfVEVNUExBVEVTIG1vZGVcblxuICB2YXIgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHdcXFddKnxbXFx3XFxXXSolPi9nbSk7XG4gIHZhciBUTVBMSVRfRVhQUiA9IHNlYWwoL1xcJHtbXFx3XFxXXSp9L2dtKTtcbiAgdmFyIERBVEFfQVRUUiA9IHNlYWwoL15kYXRhLVtcXC1cXHcuXFx1MDBCNy1cXHVGRkZGXS8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG5cbiAgdmFyIEFSSUFfQVRUUiA9IHNlYWwoL15hcmlhLVtcXC1cXHddKyQvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuXG4gIHZhciBJU19BTExPV0VEX1VSSSA9IHNlYWwoL14oPzooPzooPzpmfGh0KXRwcz98bWFpbHRvfHRlbHxjYWxsdG98Y2lkfHhtcHApOnxbXmEtel18W2EteisuXFwtXSsoPzpbXmEteisuXFwtOl18JCkpL2kgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICApO1xuICB2YXIgSVNfU0NSSVBUX09SX0RBVEEgPSBzZWFsKC9eKD86XFx3K3NjcmlwdHxkYXRhKTovaSk7XG4gIHZhciBBVFRSX1dISVRFU1BBQ0UgPSBzZWFsKC9bXFx1MDAwMC1cXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUxODBFXFx1MjAwMC1cXHUyMDI5XFx1MjA1RlxcdTMwMDBdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICk7XG4gIHZhciBET0NUWVBFX05BTUUgPSBzZWFsKC9eaHRtbCQvaSk7XG5cbiAgdmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uIGdldEdsb2JhbCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogd2luZG93O1xuICB9O1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5vLW9wIHBvbGljeSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAqIERvbid0IGV4cG9ydCB0aGlzIGZ1bmN0aW9uIG91dHNpZGUgdGhpcyBtb2R1bGUhXG4gICAqIEBwYXJhbSB7P1RydXN0ZWRUeXBlUG9saWN5RmFjdG9yeX0gdHJ1c3RlZFR5cGVzIFRoZSBwb2xpY3kgZmFjdG9yeS5cbiAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IG9iamVjdCAodG8gZGV0ZXJtaW5lIHBvbGljeSBuYW1lIHN1ZmZpeClcbiAgICogQHJldHVybiB7P1RydXN0ZWRUeXBlUG9saWN5fSBUaGUgcG9saWN5IGNyZWF0ZWQgKG9yIG51bGwsIGlmIFRydXN0ZWQgVHlwZXNcbiAgICogYXJlIG5vdCBzdXBwb3J0ZWQpLlxuICAgKi9cblxuXG4gIHZhciBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5ID0gZnVuY3Rpb24gX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSh0cnVzdGVkVHlwZXMsIGRvY3VtZW50KSB7XG4gICAgaWYgKF90eXBlb2YodHJ1c3RlZFR5cGVzKSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gQWxsb3cgdGhlIGNhbGxlcnMgdG8gY29udHJvbCB0aGUgdW5pcXVlIHBvbGljeSBuYW1lXG4gICAgLy8gYnkgYWRkaW5nIGEgZGF0YS10dC1wb2xpY3ktc3VmZml4IHRvIHRoZSBzY3JpcHQgZWxlbWVudCB3aXRoIHRoZSBET01QdXJpZnkuXG4gICAgLy8gUG9saWN5IGNyZWF0aW9uIHdpdGggZHVwbGljYXRlIG5hbWVzIHRocm93cyBpbiBUcnVzdGVkIFR5cGVzLlxuXG5cbiAgICB2YXIgc3VmZml4ID0gbnVsbDtcbiAgICB2YXIgQVRUUl9OQU1FID0gJ2RhdGEtdHQtcG9saWN5LXN1ZmZpeCc7XG5cbiAgICBpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0Lmhhc0F0dHJpYnV0ZShBVFRSX05BTUUpKSB7XG4gICAgICBzdWZmaXggPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LmdldEF0dHJpYnV0ZShBVFRSX05BTUUpO1xuICAgIH1cblxuICAgIHZhciBwb2xpY3lOYW1lID0gJ2RvbXB1cmlmeScgKyAoc3VmZml4ID8gJyMnICsgc3VmZml4IDogJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KHBvbGljeU5hbWUsIHtcbiAgICAgICAgY3JlYXRlSFRNTDogZnVuY3Rpb24gY3JlYXRlSFRNTChodG1sKSB7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZVNjcmlwdFVSTDogZnVuY3Rpb24gY3JlYXRlU2NyaXB0VVJMKHNjcmlwdFVybCkge1xuICAgICAgICAgIHJldHVybiBzY3JpcHRVcmw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8vIFBvbGljeSBjcmVhdGlvbiBmYWlsZWQgKG1vc3QgbGlrZWx5IGFub3RoZXIgRE9NUHVyaWZ5IHNjcmlwdCBoYXNcbiAgICAgIC8vIGFscmVhZHkgcnVuKS4gU2tpcCBjcmVhdGluZyB0aGUgcG9saWN5LCBhcyB0aGlzIHdpbGwgb25seSBjYXVzZSBlcnJvcnNcbiAgICAgIC8vIGlmIFRUIGFyZSBlbmZvcmNlZC5cbiAgICAgIGNvbnNvbGUud2FybignVHJ1c3RlZFR5cGVzIHBvbGljeSAnICsgcG9saWN5TmFtZSArICcgY291bGQgbm90IGJlIGNyZWF0ZWQuJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gY3JlYXRlRE9NUHVyaWZ5KCkge1xuICAgIHZhciB3aW5kb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGdldEdsb2JhbCgpO1xuXG4gICAgdmFyIERPTVB1cmlmeSA9IGZ1bmN0aW9uIERPTVB1cmlmeShyb290KSB7XG4gICAgICByZXR1cm4gY3JlYXRlRE9NUHVyaWZ5KHJvb3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBsYWJlbCwgZXhwb3NlZCBmb3IgZWFzaWVyIGNoZWNrc1xuICAgICAqIGlmIERPTVB1cmlmeSBpcyB1cCB0byBkYXRlIG9yIG5vdFxuICAgICAqL1xuXG5cbiAgICBET01QdXJpZnkudmVyc2lvbiA9ICcyLjQuNyc7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBET01QdXJpZnkgcmVtb3ZlZCBkdXJpbmcgc2FuaXRhdGlvbi5cbiAgICAgKiBFbXB0eSBpZiBub3RoaW5nIHdhcyByZW1vdmVkLlxuICAgICAqL1xuXG4gICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50Lm5vZGVUeXBlICE9PSA5KSB7XG4gICAgICAvLyBOb3QgcnVubmluZyBpbiBhIGJyb3dzZXIsIHByb3ZpZGUgYSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgICAvLyBzbyB0aGF0IHlvdSBjYW4gcGFzcyB5b3VyIG93biBXaW5kb3dcbiAgICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIERPTVB1cmlmeTtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ2luYWxEb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIERvY3VtZW50RnJhZ21lbnQgPSB3aW5kb3cuRG9jdW1lbnRGcmFnbWVudCxcbiAgICAgICAgSFRNTFRlbXBsYXRlRWxlbWVudCA9IHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50LFxuICAgICAgICBOb2RlID0gd2luZG93Lk5vZGUsXG4gICAgICAgIEVsZW1lbnQgPSB3aW5kb3cuRWxlbWVudCxcbiAgICAgICAgTm9kZUZpbHRlciA9IHdpbmRvdy5Ob2RlRmlsdGVyLFxuICAgICAgICBfd2luZG93JE5hbWVkTm9kZU1hcCA9IHdpbmRvdy5OYW1lZE5vZGVNYXAsXG4gICAgICAgIE5hbWVkTm9kZU1hcCA9IF93aW5kb3ckTmFtZWROb2RlTWFwID09PSB2b2lkIDAgPyB3aW5kb3cuTmFtZWROb2RlTWFwIHx8IHdpbmRvdy5Nb3pOYW1lZEF0dHJNYXAgOiBfd2luZG93JE5hbWVkTm9kZU1hcCxcbiAgICAgICAgSFRNTEZvcm1FbGVtZW50ID0gd2luZG93LkhUTUxGb3JtRWxlbWVudCxcbiAgICAgICAgRE9NUGFyc2VyID0gd2luZG93LkRPTVBhcnNlcixcbiAgICAgICAgdHJ1c3RlZFR5cGVzID0gd2luZG93LnRydXN0ZWRUeXBlcztcbiAgICB2YXIgRWxlbWVudFByb3RvdHlwZSA9IEVsZW1lbnQucHJvdG90eXBlO1xuICAgIHZhciBjbG9uZU5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2Nsb25lTm9kZScpO1xuICAgIHZhciBnZXROZXh0U2libGluZyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnbmV4dFNpYmxpbmcnKTtcbiAgICB2YXIgZ2V0Q2hpbGROb2RlcyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2hpbGROb2RlcycpO1xuICAgIHZhciBnZXRQYXJlbnROb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdwYXJlbnROb2RlJyk7IC8vIEFzIHBlciBpc3N1ZSAjNDcsIHRoZSB3ZWItY29tcG9uZW50cyByZWdpc3RyeSBpcyBpbmhlcml0ZWQgYnkgYVxuICAgIC8vIG5ldyBkb2N1bWVudCBjcmVhdGVkIHZpYSBjcmVhdGVIVE1MRG9jdW1lbnQuIEFzIHBlciB0aGUgc3BlY1xuICAgIC8vIChodHRwOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjcmVhdGluZy1hbmQtcGFzc2luZy1yZWdpc3RyaWVzKVxuICAgIC8vIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRlbXBsYXRlIGNvbnRlbnRzIG93bmVyXG4gICAgLy8gZG9jdW1lbnQsIHNvIHdlIHVzZSB0aGF0IGFzIG91ciBwYXJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIG5vdGhpbmdcbiAgICAvLyBpcyBpbmhlcml0ZWQuXG5cbiAgICBpZiAodHlwZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG5cbiAgICAgIGlmICh0ZW1wbGF0ZS5jb250ZW50ICYmIHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgICBkb2N1bWVudCA9IHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJ1c3RlZFR5cGVzUG9saWN5ID0gX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSh0cnVzdGVkVHlwZXMsIG9yaWdpbmFsRG9jdW1lbnQpO1xuXG4gICAgdmFyIGVtcHR5SFRNTCA9IHRydXN0ZWRUeXBlc1BvbGljeSA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKCcnKSA6ICcnO1xuICAgIHZhciBfZG9jdW1lbnQgPSBkb2N1bWVudCxcbiAgICAgICAgaW1wbGVtZW50YXRpb24gPSBfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24sXG4gICAgICAgIGNyZWF0ZU5vZGVJdGVyYXRvciA9IF9kb2N1bWVudC5jcmVhdGVOb2RlSXRlcmF0b3IsXG4gICAgICAgIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQgPSBfZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxcbiAgICAgICAgZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBfZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWU7XG4gICAgdmFyIGltcG9ydE5vZGUgPSBvcmlnaW5hbERvY3VtZW50LmltcG9ydE5vZGU7XG4gICAgdmFyIGRvY3VtZW50TW9kZSA9IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50TW9kZSA9IGNsb25lKGRvY3VtZW50KS5kb2N1bWVudE1vZGUgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiB7fTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgdmFyIGhvb2tzID0ge307XG4gICAgLyoqXG4gICAgICogRXhwb3NlIHdoZXRoZXIgdGhpcyBicm93c2VyIHN1cHBvcnRzIHJ1bm5pbmcgdGhlIGZ1bGwgRE9NUHVyaWZ5LlxuICAgICAqL1xuXG4gICAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID0gdHlwZW9mIGdldFBhcmVudE5vZGUgPT09ICdmdW5jdGlvbicgJiYgaW1wbGVtZW50YXRpb24gJiYgaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50ICE9PSB1bmRlZmluZWQgJiYgZG9jdW1lbnRNb2RlICE9PSA5O1xuICAgIHZhciBNVVNUQUNIRV9FWFBSJDEgPSBNVVNUQUNIRV9FWFBSLFxuICAgICAgICBFUkJfRVhQUiQxID0gRVJCX0VYUFIsXG4gICAgICAgIFRNUExJVF9FWFBSJDEgPSBUTVBMSVRfRVhQUixcbiAgICAgICAgREFUQV9BVFRSJDEgPSBEQVRBX0FUVFIsXG4gICAgICAgIEFSSUFfQVRUUiQxID0gQVJJQV9BVFRSLFxuICAgICAgICBJU19TQ1JJUFRfT1JfREFUQSQxID0gSVNfU0NSSVBUX09SX0RBVEEsXG4gICAgICAgIEFUVFJfV0hJVEVTUEFDRSQxID0gQVRUUl9XSElURVNQQUNFO1xuICAgIHZhciBJU19BTExPV0VEX1VSSSQxID0gSVNfQUxMT1dFRF9VUkk7XG4gICAgLyoqXG4gICAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICAgKiBkb24ndCBhZGQgYW55IG5ldyBvbmVzIGJ1dCBmZWVsIGZyZWUgdG8gcmVtb3ZlIHVud2FudGVkIG9uZXMuXG4gICAgICovXG5cbiAgICAvKiBhbGxvd2VkIGVsZW1lbnQgbmFtZXMgKi9cblxuICAgIHZhciBBTExPV0VEX1RBR1MgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX0FMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGh0bWwkMSksIF90b0NvbnN1bWFibGVBcnJheShzdmckMSksIF90b0NvbnN1bWFibGVBcnJheShzdmdGaWx0ZXJzKSwgX3RvQ29uc3VtYWJsZUFycmF5KG1hdGhNbCQxKSwgX3RvQ29uc3VtYWJsZUFycmF5KHRleHQpKSk7XG4gICAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cblxuICAgIHZhciBBTExPV0VEX0FUVFIgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX0FMTE9XRURfQVRUUiA9IGFkZFRvU2V0KHt9LCBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGh0bWwpLCBfdG9Db25zdW1hYmxlQXJyYXkoc3ZnKSwgX3RvQ29uc3VtYWJsZUFycmF5KG1hdGhNbCksIF90b0NvbnN1bWFibGVBcnJheSh4bWwpKSk7XG4gICAgLypcbiAgICAgKiBDb25maWd1cmUgaG93IERPTVBVcmlmeSBzaG91bGQgaGFuZGxlIGN1c3RvbSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIGN1c3RvbWl6ZWQgYnVpbHQtaW4gZWxlbWVudHMuXG4gICAgICogQHByb3BlcnR5IHtSZWdFeHB8RnVuY3Rpb258bnVsbH0gdGFnTmFtZUNoZWNrIG9uZSBvZiBbbnVsbCwgcmVnZXhQYXR0ZXJuLCBwcmVkaWNhdGVdLiBEZWZhdWx0OiBgbnVsbGAgKGRpc2FsbG93IGFueSBjdXN0b20gZWxlbWVudHMpXG4gICAgICogQHByb3BlcnR5IHtSZWdFeHB8RnVuY3Rpb258bnVsbH0gYXR0cmlidXRlTmFtZUNoZWNrIG9uZSBvZiBbbnVsbCwgcmVnZXhQYXR0ZXJuLCBwcmVkaWNhdGVdLiBEZWZhdWx0OiBgbnVsbGAgKGRpc2FsbG93IGFueSBhdHRyaWJ1dGVzIG5vdCBvbiB0aGUgYWxsb3cgbGlzdClcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyBhbGxvdyBjdXN0b20gZWxlbWVudHMgZGVyaXZlZCBmcm9tIGJ1aWx0LWlucyBpZiB0aGV5IHBhc3MgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLiBEZWZhdWx0OiBgZmFsc2VgLlxuICAgICAqL1xuXG4gICAgdmFyIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HID0gT2JqZWN0LnNlYWwoT2JqZWN0LmNyZWF0ZShudWxsLCB7XG4gICAgICB0YWdOYW1lQ2hlY2s6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBudWxsXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlTmFtZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfSxcbiAgICAgIGFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50czoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICB9XG4gICAgfSkpO1xuICAgIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIHRhZ3MgKG92ZXJyaWRlcyBBTExPV0VEX1RBR1MvQUREX1RBR1MpICovXG5cbiAgICB2YXIgRk9SQklEX1RBR1MgPSBudWxsO1xuICAgIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIGF0dHJpYnV0ZXMgKG92ZXJyaWRlcyBBTExPV0VEX0FUVFIvQUREX0FUVFIpICovXG5cbiAgICB2YXIgRk9SQklEX0FUVFIgPSBudWxsO1xuICAgIC8qIERlY2lkZSBpZiBBUklBIGF0dHJpYnV0ZXMgYXJlIG9rYXkgKi9cblxuICAgIHZhciBBTExPV19BUklBX0FUVFIgPSB0cnVlO1xuICAgIC8qIERlY2lkZSBpZiBjdXN0b20gZGF0YSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG5cbiAgICB2YXIgQUxMT1dfREFUQV9BVFRSID0gdHJ1ZTtcbiAgICAvKiBEZWNpZGUgaWYgdW5rbm93biBwcm90b2NvbHMgYXJlIG9rYXkgKi9cblxuICAgIHZhciBBTExPV19VTktOT1dOX1BST1RPQ09MUyA9IGZhbHNlO1xuICAgIC8qIERlY2lkZSBpZiBzZWxmLWNsb3NpbmcgdGFncyBpbiBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkLlxuICAgICAqIFVzdWFsbHkgcmVtb3ZlZCBkdWUgdG8gYSBtWFNTIGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cblxuICAgIHZhciBBTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgPSB0cnVlO1xuICAgIC8qIE91dHB1dCBzaG91bGQgYmUgc2FmZSBmb3IgY29tbW9uIHRlbXBsYXRlIGVuZ2luZXMuXG4gICAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgZGF0YSBhdHRyaWJ1dGVzLCBtdXN0YWNoZXMgYW5kIEVSQlxuICAgICAqL1xuXG4gICAgdmFyIFNBRkVfRk9SX1RFTVBMQVRFUyA9IGZhbHNlO1xuICAgIC8qIERlY2lkZSBpZiBkb2N1bWVudCB3aXRoIDxodG1sPi4uLiBzaG91bGQgYmUgcmV0dXJuZWQgKi9cblxuICAgIHZhciBXSE9MRV9ET0NVTUVOVCA9IGZhbHNlO1xuICAgIC8qIFRyYWNrIHdoZXRoZXIgY29uZmlnIGlzIGFscmVhZHkgc2V0IG9uIHRoaXMgaW5zdGFuY2Ugb2YgRE9NUHVyaWZ5LiAqL1xuXG4gICAgdmFyIFNFVF9DT05GSUcgPSBmYWxzZTtcbiAgICAvKiBEZWNpZGUgaWYgYWxsIGVsZW1lbnRzIChlLmcuIHN0eWxlLCBzY3JpcHQpIG11c3QgYmUgY2hpbGRyZW4gb2ZcbiAgICAgKiBkb2N1bWVudC5ib2R5LiBCeSBkZWZhdWx0LCBicm93c2VycyBtaWdodCBtb3ZlIHRoZW0gdG8gZG9jdW1lbnQuaGVhZCAqL1xuXG4gICAgdmFyIEZPUkNFX0JPRFkgPSBmYWxzZTtcbiAgICAvKiBEZWNpZGUgaWYgYSBET00gYEhUTUxCb2R5RWxlbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgICAqIHN0cmluZyAob3IgYSBUcnVzdGVkSFRNTCBvYmplY3QgaWYgVHJ1c3RlZCBUeXBlcyBhcmUgc3VwcG9ydGVkKS5cbiAgICAgKiBJZiBgV0hPTEVfRE9DVU1FTlRgIGlzIGVuYWJsZWQgYSBgSFRNTEh0bWxFbGVtZW50YCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWRcbiAgICAgKi9cblxuICAgIHZhciBSRVRVUk5fRE9NID0gZmFsc2U7XG4gICAgLyogRGVjaWRlIGlmIGEgRE9NIGBEb2N1bWVudEZyYWdtZW50YCBzaG91bGQgYmUgcmV0dXJuZWQsIGluc3RlYWQgb2YgYSBodG1sXG4gICAgICogc3RyaW5nICAob3IgYSBUcnVzdGVkSFRNTCBvYmplY3QgaWYgVHJ1c3RlZCBUeXBlcyBhcmUgc3VwcG9ydGVkKSAqL1xuXG4gICAgdmFyIFJFVFVSTl9ET01fRlJBR01FTlQgPSBmYWxzZTtcbiAgICAvKiBUcnkgdG8gcmV0dXJuIGEgVHJ1c3RlZCBUeXBlIG9iamVjdCBpbnN0ZWFkIG9mIGEgc3RyaW5nLCByZXR1cm4gYSBzdHJpbmcgaW5cbiAgICAgKiBjYXNlIFRydXN0ZWQgVHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgICovXG5cbiAgICB2YXIgUkVUVVJOX1RSVVNURURfVFlQRSA9IGZhbHNlO1xuICAgIC8qIE91dHB1dCBzaG91bGQgYmUgZnJlZSBmcm9tIERPTSBjbG9iYmVyaW5nIGF0dGFja3M/XG4gICAgICogVGhpcyBzYW5pdGl6ZXMgbWFya3VwcyBuYW1lZCB3aXRoIGNvbGxpZGluZywgY2xvYmJlcmFibGUgYnVpbHQtaW4gRE9NIEFQSXMuXG4gICAgICovXG5cbiAgICB2YXIgU0FOSVRJWkVfRE9NID0gdHJ1ZTtcbiAgICAvKiBBY2hpZXZlIGZ1bGwgRE9NIENsb2JiZXJpbmcgcHJvdGVjdGlvbiBieSBpc29sYXRpbmcgdGhlIG5hbWVzcGFjZSBvZiBuYW1lZFxuICAgICAqIHByb3BlcnRpZXMgYW5kIEpTIHZhcmlhYmxlcywgbWl0aWdhdGluZyBhdHRhY2tzIHRoYXQgYWJ1c2UgdGhlIEhUTUwvRE9NIHNwZWMgcnVsZXMuXG4gICAgICpcbiAgICAgKiBIVE1ML0RPTSBzcGVjIHJ1bGVzIHRoYXQgZW5hYmxlIERPTSBDbG9iYmVyaW5nOlxuICAgICAqICAgLSBOYW1lZCBBY2Nlc3Mgb24gV2luZG93ICjCpzcuMy4zKVxuICAgICAqICAgLSBET00gVHJlZSBBY2Nlc3NvcnMgKMKnMy4xLjUpXG4gICAgICogICAtIEZvcm0gRWxlbWVudCBQYXJlbnQtQ2hpbGQgUmVsYXRpb25zICjCpzQuMTAuMylcbiAgICAgKiAgIC0gSWZyYW1lIHNyY2RvYyAvIE5lc3RlZCBXaW5kb3dQcm94aWVzICjCpzQuOC41KVxuICAgICAqICAgLSBIVE1MQ29sbGVjdGlvbiAowqc0LjIuMTAuMilcbiAgICAgKlxuICAgICAqIE5hbWVzcGFjZSBpc29sYXRpb24gaXMgaW1wbGVtZW50ZWQgYnkgcHJlZml4aW5nIGBpZGAgYW5kIGBuYW1lYCBhdHRyaWJ1dGVzXG4gICAgICogd2l0aCBhIGNvbnN0YW50IHN0cmluZywgaS5lLiwgYHVzZXItY29udGVudC1gXG4gICAgICovXG5cbiAgICB2YXIgU0FOSVRJWkVfTkFNRURfUFJPUFMgPSBmYWxzZTtcbiAgICB2YXIgU0FOSVRJWkVfTkFNRURfUFJPUFNfUFJFRklYID0gJ3VzZXItY29udGVudC0nO1xuICAgIC8qIEtlZXAgZWxlbWVudCBjb250ZW50IHdoZW4gcmVtb3ZpbmcgZWxlbWVudD8gKi9cblxuICAgIHZhciBLRUVQX0NPTlRFTlQgPSB0cnVlO1xuICAgIC8qIElmIGEgYE5vZGVgIGlzIHBhc3NlZCB0byBzYW5pdGl6ZSgpLCB0aGVuIHBlcmZvcm1zIHNhbml0aXphdGlvbiBpbi1wbGFjZSBpbnN0ZWFkXG4gICAgICogb2YgaW1wb3J0aW5nIGl0IGludG8gYSBuZXcgRG9jdW1lbnQgYW5kIHJldHVybmluZyBhIHNhbml0aXplZCBjb3B5ICovXG5cbiAgICB2YXIgSU5fUExBQ0UgPSBmYWxzZTtcbiAgICAvKiBBbGxvdyB1c2FnZSBvZiBwcm9maWxlcyBsaWtlIGh0bWwsIHN2ZyBhbmQgbWF0aE1sICovXG5cbiAgICB2YXIgVVNFX1BST0ZJTEVTID0ge307XG4gICAgLyogVGFncyB0byBpZ25vcmUgY29udGVudCBvZiB3aGVuIEtFRVBfQ09OVEVOVCBpcyB0cnVlICovXG5cbiAgICB2YXIgRk9SQklEX0NPTlRFTlRTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9GT1JCSURfQ09OVEVOVFMgPSBhZGRUb1NldCh7fSwgWydhbm5vdGF0aW9uLXhtbCcsICdhdWRpbycsICdjb2xncm91cCcsICdkZXNjJywgJ2ZvcmVpZ25vYmplY3QnLCAnaGVhZCcsICdpZnJhbWUnLCAnbWF0aCcsICdtaScsICdtbicsICdtbycsICdtcycsICdtdGV4dCcsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ3BsYWludGV4dCcsICdzY3JpcHQnLCAnc3R5bGUnLCAnc3ZnJywgJ3RlbXBsYXRlJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3ZpZGVvJywgJ3htcCddKTtcbiAgICAvKiBUYWdzIHRoYXQgYXJlIHNhZmUgZm9yIGRhdGE6IFVSSXMgKi9cblxuICAgIHZhciBEQVRBX1VSSV9UQUdTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9EQVRBX1VSSV9UQUdTID0gYWRkVG9TZXQoe30sIFsnYXVkaW8nLCAndmlkZW8nLCAnaW1nJywgJ3NvdXJjZScsICdpbWFnZScsICd0cmFjayddKTtcbiAgICAvKiBBdHRyaWJ1dGVzIHNhZmUgZm9yIHZhbHVlcyBsaWtlIFwiamF2YXNjcmlwdDpcIiAqL1xuXG4gICAgdmFyIFVSSV9TQUZFX0FUVFJJQlVURVMgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMgPSBhZGRUb1NldCh7fSwgWydhbHQnLCAnY2xhc3MnLCAnZm9yJywgJ2lkJywgJ2xhYmVsJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyb2xlJywgJ3N1bW1hcnknLCAndGl0bGUnLCAndmFsdWUnLCAnc3R5bGUnLCAneG1sbnMnXSk7XG4gICAgdmFyIE1BVEhNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCc7XG4gICAgdmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuICAgIHZhciBIVE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAvKiBEb2N1bWVudCBuYW1lc3BhY2UgKi9cblxuICAgIHZhciBOQU1FU1BBQ0UgPSBIVE1MX05BTUVTUEFDRTtcbiAgICB2YXIgSVNfRU1QVFlfSU5QVVQgPSBmYWxzZTtcbiAgICAvKiBBbGxvd2VkIFhIVE1MK1hNTCBuYW1lc3BhY2VzICovXG5cbiAgICB2YXIgQUxMT1dFRF9OQU1FU1BBQ0VTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX05BTUVTUEFDRVMgPSBhZGRUb1NldCh7fSwgW01BVEhNTF9OQU1FU1BBQ0UsIFNWR19OQU1FU1BBQ0UsIEhUTUxfTkFNRVNQQUNFXSwgc3RyaW5nVG9TdHJpbmcpO1xuICAgIC8qIFBhcnNpbmcgb2Ygc3RyaWN0IFhIVE1MIGRvY3VtZW50cyAqL1xuXG4gICAgdmFyIFBBUlNFUl9NRURJQV9UWVBFO1xuICAgIHZhciBTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTID0gWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnLCAndGV4dC9odG1sJ107XG4gICAgdmFyIERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUgPSAndGV4dC9odG1sJztcbiAgICB2YXIgdHJhbnNmb3JtQ2FzZUZ1bmM7XG4gICAgLyogS2VlcCBhIHJlZmVyZW5jZSB0byBjb25maWcgdG8gcGFzcyB0byBob29rcyAqL1xuXG4gICAgdmFyIENPTkZJRyA9IG51bGw7XG4gICAgLyogSWRlYWxseSwgZG8gbm90IHRvdWNoIGFueXRoaW5nIGJlbG93IHRoaXMgbGluZSAqL1xuXG4gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqL1xuXG4gICAgdmFyIGZvcm1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuXG4gICAgdmFyIGlzUmVnZXhPckZ1bmN0aW9uID0gZnVuY3Rpb24gaXNSZWdleE9yRnVuY3Rpb24odGVzdFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGVzdFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHRlc3RWYWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogX3BhcnNlQ29uZmlnXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGNmZyBvcHRpb25hbCBjb25maWcgbGl0ZXJhbFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cblxuICAgIHZhciBfcGFyc2VDb25maWcgPSBmdW5jdGlvbiBfcGFyc2VDb25maWcoY2ZnKSB7XG4gICAgICBpZiAoQ09ORklHICYmIENPTkZJRyA9PT0gY2ZnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRhbXBlcmluZyAqL1xuXG5cbiAgICAgIGlmICghY2ZnIHx8IF90eXBlb2YoY2ZnKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY2ZnID0ge307XG4gICAgICB9XG4gICAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSBwcm90b3R5cGUgcG9sbHV0aW9uICovXG5cblxuICAgICAgY2ZnID0gY2xvbmUoY2ZnKTtcbiAgICAgIFBBUlNFUl9NRURJQV9UWVBFID0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWluY2x1ZGVzXG4gICAgICBTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTLmluZGV4T2YoY2ZnLlBBUlNFUl9NRURJQV9UWVBFKSA9PT0gLTEgPyBQQVJTRVJfTUVESUFfVFlQRSA9IERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUgOiBQQVJTRVJfTUVESUFfVFlQRSA9IGNmZy5QQVJTRVJfTUVESUFfVFlQRTsgLy8gSFRNTCB0YWdzIGFuZCBhdHRyaWJ1dGVzIGFyZSBub3QgY2FzZS1zZW5zaXRpdmUsIGNvbnZlcnRpbmcgdG8gbG93ZXJjYXNlLiBLZWVwaW5nIFhIVE1MIGFzIGlzLlxuXG4gICAgICB0cmFuc2Zvcm1DYXNlRnVuYyA9IFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyA/IHN0cmluZ1RvU3RyaW5nIDogc3RyaW5nVG9Mb3dlckNhc2U7XG4gICAgICAvKiBTZXQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovXG5cbiAgICAgIEFMTE9XRURfVEFHUyA9ICdBTExPV0VEX1RBR1MnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0FMTE9XRURfVEFHUztcbiAgICAgIEFMTE9XRURfQVRUUiA9ICdBTExPV0VEX0FUVFInIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICAgIEFMTE9XRURfTkFNRVNQQUNFUyA9ICdBTExPV0VEX05BTUVTUEFDRVMnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9OQU1FU1BBQ0VTLCBzdHJpbmdUb1N0cmluZykgOiBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUztcbiAgICAgIFVSSV9TQUZFX0FUVFJJQlVURVMgPSAnQUREX1VSSV9TQUZFX0FUVFInIGluIGNmZyA/IGFkZFRvU2V0KGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW5kZW50XG4gICAgICBjZmcuQUREX1VSSV9TQUZFX0FUVFIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW5kZW50XG4gICAgICB0cmFuc2Zvcm1DYXNlRnVuYyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGluZGVudFxuICAgICAgKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGluZGVudFxuICAgICAgOiBERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVM7XG4gICAgICBEQVRBX1VSSV9UQUdTID0gJ0FERF9EQVRBX1VSSV9UQUdTJyBpbiBjZmcgPyBhZGRUb1NldChjbG9uZShERUZBVUxUX0RBVEFfVVJJX1RBR1MpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGluZGVudFxuICAgICAgY2ZnLkFERF9EQVRBX1VSSV9UQUdTLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGluZGVudFxuICAgICAgdHJhbnNmb3JtQ2FzZUZ1bmMgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbmRlbnRcbiAgICAgICkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbmRlbnRcbiAgICAgIDogREVGQVVMVF9EQVRBX1VSSV9UQUdTO1xuICAgICAgRk9SQklEX0NPTlRFTlRTID0gJ0ZPUkJJRF9DT05URU5UUycgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKSA6IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTO1xuICAgICAgRk9SQklEX1RBR1MgPSAnRk9SQklEX1RBR1MnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX1RBR1MsIHRyYW5zZm9ybUNhc2VGdW5jKSA6IHt9O1xuICAgICAgRk9SQklEX0FUVFIgPSAnRk9SQklEX0FUVFInIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKSA6IHt9O1xuICAgICAgVVNFX1BST0ZJTEVTID0gJ1VTRV9QUk9GSUxFUycgaW4gY2ZnID8gY2ZnLlVTRV9QUk9GSUxFUyA6IGZhbHNlO1xuICAgICAgQUxMT1dfQVJJQV9BVFRSID0gY2ZnLkFMTE9XX0FSSUFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuXG4gICAgICBBTExPV19EQVRBX0FUVFIgPSBjZmcuQUxMT1dfREFUQV9BVFRSICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG5cbiAgICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gY2ZnLkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG5cbiAgICAgIEFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiA9IGNmZy5BTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcblxuICAgICAgU0FGRV9GT1JfVEVNUExBVEVTID0gY2ZnLlNBRkVfRk9SX1RFTVBMQVRFUyB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuXG4gICAgICBXSE9MRV9ET0NVTUVOVCA9IGNmZy5XSE9MRV9ET0NVTUVOVCB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuXG4gICAgICBSRVRVUk5fRE9NID0gY2ZnLlJFVFVSTl9ET00gfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcblxuICAgICAgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGNmZy5SRVRVUk5fRE9NX0ZSQUdNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG5cbiAgICAgIFJFVFVSTl9UUlVTVEVEX1RZUEUgPSBjZmcuUkVUVVJOX1RSVVNURURfVFlQRSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuXG4gICAgICBGT1JDRV9CT0RZID0gY2ZnLkZPUkNFX0JPRFkgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcblxuICAgICAgU0FOSVRJWkVfRE9NID0gY2ZnLlNBTklUSVpFX0RPTSAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuXG4gICAgICBTQU5JVElaRV9OQU1FRF9QUk9QUyA9IGNmZy5TQU5JVElaRV9OQU1FRF9QUk9QUyB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuXG4gICAgICBLRUVQX0NPTlRFTlQgPSBjZmcuS0VFUF9DT05URU5UICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG5cbiAgICAgIElOX1BMQUNFID0gY2ZnLklOX1BMQUNFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG5cbiAgICAgIElTX0FMTE9XRURfVVJJJDEgPSBjZmcuQUxMT1dFRF9VUklfUkVHRVhQIHx8IElTX0FMTE9XRURfVVJJJDE7XG4gICAgICBOQU1FU1BBQ0UgPSBjZmcuTkFNRVNQQUNFIHx8IEhUTUxfTkFNRVNQQUNFO1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgPSBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgfHwge307XG5cbiAgICAgIGlmIChjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgJiYgaXNSZWdleE9yRnVuY3Rpb24oY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaykpIHtcbiAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrID0gY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaztcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyAmJiBpc1JlZ2V4T3JGdW5jdGlvbihjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrKSkge1xuICAgICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgPSBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmIHR5cGVvZiBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID0gY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cztcbiAgICAgIH1cblxuICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgICBBTExPV19EQVRBX0FUVFIgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFJFVFVSTl9ET01fRlJBR01FTlQpIHtcbiAgICAgICAgUkVUVVJOX0RPTSA9IHRydWU7XG4gICAgICB9XG4gICAgICAvKiBQYXJzZSBwcm9maWxlIGluZm8gKi9cblxuXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTKSB7XG4gICAgICAgIEFMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBfdG9Db25zdW1hYmxlQXJyYXkodGV4dCkpO1xuICAgICAgICBBTExPV0VEX0FUVFIgPSBbXTtcblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLmh0bWwgPT09IHRydWUpIHtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIGh0bWwkMSk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBodG1sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVU0VfUFJPRklMRVMuc3ZnID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBzdmckMSk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBzdmcpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVU0VfUFJPRklMRVMuc3ZnRmlsdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgc3ZnRmlsdGVycyk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBzdmcpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVU0VfUFJPRklMRVMubWF0aE1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBtYXRoTWwkMSk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBtYXRoTWwpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogTWVyZ2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovXG5cblxuICAgICAgaWYgKGNmZy5BRERfVEFHUykge1xuICAgICAgICBpZiAoQUxMT1dFRF9UQUdTID09PSBERUZBVUxUX0FMTE9XRURfVEFHUykge1xuICAgICAgICAgIEFMTE9XRURfVEFHUyA9IGNsb25lKEFMTE9XRURfVEFHUyk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIGNmZy5BRERfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkFERF9BVFRSKSB7XG4gICAgICAgIGlmIChBTExPV0VEX0FUVFIgPT09IERFRkFVTFRfQUxMT1dFRF9BVFRSKSB7XG4gICAgICAgICAgQUxMT1dFRF9BVFRSID0gY2xvbmUoQUxMT1dFRF9BVFRSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgY2ZnLkFERF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZmcuQUREX1VSSV9TQUZFX0FUVFIpIHtcbiAgICAgICAgYWRkVG9TZXQoVVJJX1NBRkVfQVRUUklCVVRFUywgY2ZnLkFERF9VUklfU0FGRV9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZmcuRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgIGlmIChGT1JCSURfQ09OVEVOVFMgPT09IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgICAgRk9SQklEX0NPTlRFTlRTID0gY2xvbmUoRk9SQklEX0NPTlRFTlRTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEZPUkJJRF9DT05URU5UUywgY2ZnLkZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuICAgICAgLyogQWRkICN0ZXh0IGluIGNhc2UgS0VFUF9DT05URU5UIGlzIHNldCB0byB0cnVlICovXG5cblxuICAgICAgaWYgKEtFRVBfQ09OVEVOVCkge1xuICAgICAgICBBTExPV0VEX1RBR1NbJyN0ZXh0J10gPSB0cnVlO1xuICAgICAgfVxuICAgICAgLyogQWRkIGh0bWwsIGhlYWQgYW5kIGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgV0hPTEVfRE9DVU1FTlQgaXMgdHJ1ZSAqL1xuXG5cbiAgICAgIGlmIChXSE9MRV9ET0NVTUVOVCkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsnaHRtbCcsICdoZWFkJywgJ2JvZHknXSk7XG4gICAgICB9XG4gICAgICAvKiBBZGQgdGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgdGFibGVzIGFyZSBwZXJtaXR0ZWQsIHNlZSAjMjg2LCAjMzY1ICovXG5cblxuICAgICAgaWYgKEFMTE9XRURfVEFHUy50YWJsZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsndGJvZHknXSk7XG4gICAgICAgIGRlbGV0ZSBGT1JCSURfVEFHUy50Ym9keTtcbiAgICAgIH0gLy8gUHJldmVudCBmdXJ0aGVyIG1hbmlwdWxhdGlvbiBvZiBjb25maWd1cmF0aW9uLlxuICAgICAgLy8gTm90IGF2YWlsYWJsZSBpbiBJRTgsIFNhZmFyaSA1LCBldGMuXG5cblxuICAgICAgaWYgKGZyZWV6ZSkge1xuICAgICAgICBmcmVlemUoY2ZnKTtcbiAgICAgIH1cblxuICAgICAgQ09ORklHID0gY2ZnO1xuICAgIH07XG5cbiAgICB2YXIgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnbWknLCAnbW8nLCAnbW4nLCAnbXMnLCAnbXRleHQnXSk7XG4gICAgdmFyIEhUTUxfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnZm9yZWlnbm9iamVjdCcsICdkZXNjJywgJ3RpdGxlJywgJ2Fubm90YXRpb24teG1sJ10pOyAvLyBDZXJ0YWluIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGJvdGggU1ZHIGFuZCBIVE1MXG4gICAgLy8gbmFtZXNwYWNlLiBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5XG4gICAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGdldCBlcnJvbmVvdXNseSBkZWxldGVkIGZyb21cbiAgICAvLyBIVE1MIG5hbWVzcGFjZS5cblxuICAgIHZhciBDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTID0gYWRkVG9TZXQoe30sIFsndGl0bGUnLCAnc3R5bGUnLCAnZm9udCcsICdhJywgJ3NjcmlwdCddKTtcbiAgICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBwb3NzaWJsZSBTVkcgYW5kIE1hdGhNTCB0YWdzXG4gICAgICogc28gdGhhdCB3ZSBjYW4gcGVyZm9ybSB0aGUgbmFtZXNwYWNlIGNoZWNrc1xuICAgICAqIGNvcnJlY3RseS4gKi9cblxuICAgIHZhciBBTExfU1ZHX1RBR1MgPSBhZGRUb1NldCh7fSwgc3ZnJDEpO1xuICAgIGFkZFRvU2V0KEFMTF9TVkdfVEFHUywgc3ZnRmlsdGVycyk7XG4gICAgYWRkVG9TZXQoQUxMX1NWR19UQUdTLCBzdmdEaXNhbGxvd2VkKTtcbiAgICB2YXIgQUxMX01BVEhNTF9UQUdTID0gYWRkVG9TZXQoe30sIG1hdGhNbCQxKTtcbiAgICBhZGRUb1NldChBTExfTUFUSE1MX1RBR1MsIG1hdGhNbERpc2FsbG93ZWQpO1xuICAgIC8qKlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtFbGVtZW50fSBlbGVtZW50IGEgRE9NIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIGlzIGJlaW5nIGNoZWNrZWRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGhhcyBhXG4gICAgICogIG5hbWVzcGFjZSB0aGF0IGEgc3BlYy1jb21wbGlhbnQgcGFyc2VyIHdvdWxkIG5ldmVyXG4gICAgICogIHJldHVybi4gUmV0dXJuIHRydWUgb3RoZXJ3aXNlLlxuICAgICAqL1xuXG4gICAgdmFyIF9jaGVja1ZhbGlkTmFtZXNwYWNlID0gZnVuY3Rpb24gX2NoZWNrVmFsaWROYW1lc3BhY2UoZWxlbWVudCkge1xuICAgICAgdmFyIHBhcmVudCA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7IC8vIEluIEpTRE9NLCBpZiB3ZSdyZSBpbnNpZGUgc2hhZG93IERPTSwgdGhlbiBwYXJlbnROb2RlXG4gICAgICAvLyBjYW4gYmUgbnVsbC4gV2UganVzdCBzaW11bGF0ZSBwYXJlbnQgaW4gdGhpcyBjYXNlLlxuXG4gICAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LnRhZ05hbWUpIHtcbiAgICAgICAgcGFyZW50ID0ge1xuICAgICAgICAgIG5hbWVzcGFjZVVSSTogTkFNRVNQQUNFLFxuICAgICAgICAgIHRhZ05hbWU6ICd0ZW1wbGF0ZSdcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhZ05hbWUgPSBzdHJpbmdUb0xvd2VyQ2FzZShlbGVtZW50LnRhZ05hbWUpO1xuICAgICAgdmFyIHBhcmVudFRhZ05hbWUgPSBzdHJpbmdUb0xvd2VyQ2FzZShwYXJlbnQudGFnTmFtZSk7XG5cbiAgICAgIGlmICghQUxMT1dFRF9OQU1FU1BBQ0VTW2VsZW1lbnQubmFtZXNwYWNlVVJJXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gU1ZHXG4gICAgICAgIC8vIGlzIHZpYSA8c3ZnPi4gSWYgaXQgaGFwcGVucyB2aWEgYW55IG90aGVyIHRhZywgdGhlblxuICAgICAgICAvLyBpdCBzaG91bGQgYmUga2lsbGVkLlxuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ3N2Zyc7XG4gICAgICAgIH0gLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIE1hdGhNTCB0byBTVkcgaXMgdmlhYFxuICAgICAgICAvLyBzdmcgaWYgcGFyZW50IGlzIGVpdGhlciA8YW5ub3RhdGlvbi14bWw+IG9yIE1hdGhNTFxuICAgICAgICAvLyB0ZXh0IGludGVncmF0aW9uIHBvaW50cy5cblxuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnICYmIChwYXJlbnRUYWdOYW1lID09PSAnYW5ub3RhdGlvbi14bWwnIHx8IE1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSk7XG4gICAgICAgIH0gLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIFNWR1xuICAgICAgICAvLyBzcGVjLiBBbGwgb3RoZXJzIGFyZSBkaXNhbGxvd2VkIGluIFNWRyBuYW1lc3BhY2UuXG5cblxuICAgICAgICByZXR1cm4gQm9vbGVhbihBTExfU1ZHX1RBR1NbdGFnTmFtZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIE1hdGhNTFxuICAgICAgICAvLyBpcyB2aWEgPG1hdGg+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCc7XG4gICAgICAgIH0gLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIFNWRyB0byBNYXRoTUwgaXMgdmlhXG4gICAgICAgIC8vIDxtYXRoPiBhbmQgSFRNTCBpbnRlZ3JhdGlvbiBwb2ludHNcblxuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJyAmJiBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXTtcbiAgICAgICAgfSAvLyBXZSBvbmx5IGFsbG93IGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gTWF0aE1MXG4gICAgICAgIC8vIHNwZWMuIEFsbCBvdGhlcnMgYXJlIGRpc2FsbG93ZWQgaW4gTWF0aE1MIG5hbWVzcGFjZS5cblxuXG4gICAgICAgIHJldHVybiBCb29sZWFuKEFMTF9NQVRITUxfVEFHU1t0YWdOYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIFNWRyB0byBIVE1MIGlzIHZpYVxuICAgICAgICAvLyBIVE1MIGludGVncmF0aW9uIHBvaW50cywgYW5kIGZyb20gTWF0aE1MIHRvIEhUTUxcbiAgICAgICAgLy8gaXMgdmlhIE1hdGhNTCB0ZXh0IGludGVncmF0aW9uIHBvaW50c1xuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSAmJiAhSFRNTF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSAmJiAhTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IC8vIFdlIGRpc2FsbG93IHRhZ3MgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIE1hdGhNTFxuICAgICAgICAvLyBvciBTVkcgYW5kIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gSFRNTCBuYW1lc3BhY2VcblxuXG4gICAgICAgIHJldHVybiAhQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdICYmIChDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTW3RhZ05hbWVdIHx8ICFBTExfU1ZHX1RBR1NbdGFnTmFtZV0pO1xuICAgICAgfSAvLyBGb3IgWEhUTUwgYW5kIFhNTCBkb2N1bWVudHMgdGhhdCBzdXBwb3J0IGN1c3RvbSBuYW1lc3BhY2VzXG5cblxuICAgICAgaWYgKFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyAmJiBBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBUaGUgY29kZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwbGFjZSAodGhpcyBtZWFuc1xuICAgICAgLy8gdGhhdCB0aGUgZWxlbWVudCBzb21laG93IGdvdCBuYW1lc3BhY2UgdGhhdCBpcyBub3RcbiAgICAgIC8vIEhUTUwsIFNWRywgTWF0aE1MIG9yIGFsbG93ZWQgdmlhIEFMTE9XRURfTkFNRVNQQUNFUykuXG4gICAgICAvLyBSZXR1cm4gZmFsc2UganVzdCBpbiBjYXNlLlxuXG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9mb3JjZVJlbW92ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gbm9kZSBhIERPTSBub2RlXG4gICAgICovXG5cblxuICAgIHZhciBfZm9yY2VSZW1vdmUgPSBmdW5jdGlvbiBfZm9yY2VSZW1vdmUobm9kZSkge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGVsZW1lbnQ6IG5vZGVcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZG9tLW5vZGUtcmVtb3ZlXG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBub2RlLm91dGVySFRNTCA9IGVtcHR5SFRNTDtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9yZW1vdmVBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gbmFtZSBhbiBBdHRyaWJ1dGUgbmFtZVxuICAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgYSBET00gbm9kZVxuICAgICAqL1xuXG5cbiAgICB2YXIgX3JlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgbm9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgICAgYXR0cmlidXRlOiBub2RlLmdldEF0dHJpYnV0ZU5vZGUobmFtZSksXG4gICAgICAgICAgZnJvbTogbm9kZVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgICAgYXR0cmlidXRlOiBudWxsLFxuICAgICAgICAgIGZyb206IG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOyAvLyBXZSB2b2lkIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIHVucmVtb3ZhYmxlIFwiaXNcIlwiIGF0dHJpYnV0ZXNcblxuICAgICAgaWYgKG5hbWUgPT09ICdpcycgJiYgIUFMTE9XRURfQVRUUltuYW1lXSkge1xuICAgICAgICBpZiAoUkVUVVJOX0RPTSB8fCBSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF9mb3JjZVJlbW92ZShub2RlKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogX2luaXREb2N1bWVudFxuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBkaXJ0eSBhIHN0cmluZyBvZiBkaXJ0eSBtYXJrdXBcbiAgICAgKiBAcmV0dXJuIHtEb2N1bWVudH0gYSBET00sIGZpbGxlZCB3aXRoIHRoZSBkaXJ0eSBtYXJrdXBcbiAgICAgKi9cblxuXG4gICAgdmFyIF9pbml0RG9jdW1lbnQgPSBmdW5jdGlvbiBfaW5pdERvY3VtZW50KGRpcnR5KSB7XG4gICAgICAvKiBDcmVhdGUgYSBIVE1MIGRvY3VtZW50ICovXG4gICAgICB2YXIgZG9jO1xuICAgICAgdmFyIGxlYWRpbmdXaGl0ZXNwYWNlO1xuXG4gICAgICBpZiAoRk9SQ0VfQk9EWSkge1xuICAgICAgICBkaXJ0eSA9ICc8cmVtb3ZlPjwvcmVtb3ZlPicgKyBkaXJ0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIElmIEZPUkNFX0JPRFkgaXNuJ3QgdXNlZCwgbGVhZGluZyB3aGl0ZXNwYWNlIG5lZWRzIHRvIGJlIHByZXNlcnZlZCBtYW51YWxseSAqL1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IHN0cmluZ01hdGNoKGRpcnR5LCAvXltcXHJcXG5cXHQgXSsvKTtcbiAgICAgICAgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaGVzICYmIG1hdGNoZXNbMF07XG4gICAgICB9XG5cbiAgICAgIGlmIChQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgJiYgTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAvLyBSb290IG9mIFhIVE1MIGRvYyBtdXN0IGNvbnRhaW4geG1sbnMgZGVjbGFyYXRpb24gKHNlZSBodHRwczovL3d3dy53My5vcmcvVFIveGh0bWwxL25vcm1hdGl2ZS5odG1sI3N0cmljdClcbiAgICAgICAgZGlydHkgPSAnPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+PGhlYWQ+PC9oZWFkPjxib2R5PicgKyBkaXJ0eSArICc8L2JvZHk+PC9odG1sPic7XG4gICAgICB9XG5cbiAgICAgIHZhciBkaXJ0eVBheWxvYWQgPSB0cnVzdGVkVHlwZXNQb2xpY3kgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSkgOiBkaXJ0eTtcbiAgICAgIC8qXG4gICAgICAgKiBVc2UgdGhlIERPTVBhcnNlciBBUEkgYnkgZGVmYXVsdCwgZmFsbGJhY2sgbGF0ZXIgaWYgbmVlZHMgYmVcbiAgICAgICAqIERPTVBhcnNlciBub3Qgd29yayBmb3Igc3ZnIHdoZW4gaGFzIG11bHRpcGxlIHJvb3QgZWxlbWVudC5cbiAgICAgICAqL1xuXG4gICAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoZGlydHlQYXlsb2FkLCBQQVJTRVJfTUVESUFfVFlQRSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG4gICAgICAvKiBVc2UgY3JlYXRlSFRNTERvY3VtZW50IGluIGNhc2UgRE9NUGFyc2VyIGlzIG5vdCBhdmFpbGFibGUgKi9cblxuXG4gICAgICBpZiAoIWRvYyB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICBkb2MgPSBpbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudChOQU1FU1BBQ0UsICd0ZW1wbGF0ZScsIG51bGwpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgPSBJU19FTVBUWV9JTlBVVCA/IGVtcHR5SFRNTCA6IGRpcnR5UGF5bG9hZDtcbiAgICAgICAgfSBjYXRjaCAoXykgey8vIFN5bnRheCBlcnJvciBpZiBkaXJ0eVBheWxvYWQgaXMgaW52YWxpZCB4bWxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgYm9keSA9IGRvYy5ib2R5IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgIGlmIChkaXJ0eSAmJiBsZWFkaW5nV2hpdGVzcGFjZSkge1xuICAgICAgICBib2R5Lmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWFkaW5nV2hpdGVzcGFjZSksIGJvZHkuY2hpbGROb2Rlc1swXSB8fCBudWxsKTtcbiAgICAgIH1cbiAgICAgIC8qIFdvcmsgb24gd2hvbGUgZG9jdW1lbnQgb3IganVzdCBpdHMgYm9keSAqL1xuXG5cbiAgICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHJldHVybiBnZXRFbGVtZW50c0J5VGFnTmFtZS5jYWxsKGRvYywgV0hPTEVfRE9DVU1FTlQgPyAnaHRtbCcgOiAnYm9keScpWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gV0hPTEVfRE9DVU1FTlQgPyBkb2MuZG9jdW1lbnRFbGVtZW50IDogYm9keTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9jcmVhdGVJdGVyYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtICB7RG9jdW1lbnR9IHJvb3QgZG9jdW1lbnQvZnJhZ21lbnQgdG8gY3JlYXRlIGl0ZXJhdG9yIGZvclxuICAgICAqIEByZXR1cm4ge0l0ZXJhdG9yfSBpdGVyYXRvciBpbnN0YW5jZVxuICAgICAqL1xuXG5cbiAgICB2YXIgX2NyZWF0ZUl0ZXJhdG9yID0gZnVuY3Rpb24gX2NyZWF0ZUl0ZXJhdG9yKHJvb3QpIHtcbiAgICAgIHJldHVybiBjcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChyb290Lm93bmVyRG9jdW1lbnQgfHwgcm9vdCwgcm9vdCwgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHwgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgfCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogX2lzQ2xvYmJlcmVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBlbG0gZWxlbWVudCB0byBjaGVjayBmb3IgY2xvYmJlcmluZyBhdHRhY2tzXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBjbG9iYmVyZWQsIGZhbHNlIGlmIHNhZmVcbiAgICAgKi9cblxuXG4gICAgdmFyIF9pc0Nsb2JiZXJlZCA9IGZ1bmN0aW9uIF9pc0Nsb2JiZXJlZChlbG0pIHtcbiAgICAgIHJldHVybiBlbG0gaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgKHR5cGVvZiBlbG0ubm9kZU5hbWUgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbG0udGV4dENvbnRlbnQgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbG0ucmVtb3ZlQ2hpbGQgIT09ICdmdW5jdGlvbicgfHwgIShlbG0uYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkgfHwgdHlwZW9mIGVsbS5yZW1vdmVBdHRyaWJ1dGUgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGVsbS5zZXRBdHRyaWJ1dGUgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGVsbS5uYW1lc3BhY2VVUkkgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbG0uaW5zZXJ0QmVmb3JlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0uaGFzQ2hpbGROb2RlcyAhPT0gJ2Z1bmN0aW9uJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBfaXNOb2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBvYmogb2JqZWN0IHRvIGNoZWNrIHdoZXRoZXIgaXQncyBhIERPTSBub2RlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpcyBvYmplY3QgaXMgYSBET00gbm9kZVxuICAgICAqL1xuXG5cbiAgICB2YXIgX2lzTm9kZSA9IGZ1bmN0aW9uIF9pc05vZGUob2JqZWN0KSB7XG4gICAgICByZXR1cm4gX3R5cGVvZihOb2RlKSA9PT0gJ29iamVjdCcgPyBvYmplY3QgaW5zdGFuY2VvZiBOb2RlIDogb2JqZWN0ICYmIF90eXBlb2Yob2JqZWN0KSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iamVjdC5ub2RlVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9iamVjdC5ub2RlTmFtZSA9PT0gJ3N0cmluZyc7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBfZXhlY3V0ZUhvb2tcbiAgICAgKiBFeGVjdXRlIHVzZXIgY29uZmlndXJhYmxlIGhvb2tzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGVudHJ5UG9pbnQgIE5hbWUgb2YgdGhlIGhvb2sncyBlbnRyeSBwb2ludFxuICAgICAqIEBwYXJhbSAge05vZGV9IGN1cnJlbnROb2RlIG5vZGUgdG8gd29yayBvbiB3aXRoIHRoZSBob29rXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBkYXRhIGFkZGl0aW9uYWwgaG9vayBwYXJhbWV0ZXJzXG4gICAgICovXG5cblxuICAgIHZhciBfZXhlY3V0ZUhvb2sgPSBmdW5jdGlvbiBfZXhlY3V0ZUhvb2soZW50cnlQb2ludCwgY3VycmVudE5vZGUsIGRhdGEpIHtcbiAgICAgIGlmICghaG9va3NbZW50cnlQb2ludF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhcnJheUZvckVhY2goaG9va3NbZW50cnlQb2ludF0sIGZ1bmN0aW9uIChob29rKSB7XG4gICAgICAgIGhvb2suY2FsbChET01QdXJpZnksIGN1cnJlbnROb2RlLCBkYXRhLCBDT05GSUcpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBfc2FuaXRpemVFbGVtZW50c1xuICAgICAqXG4gICAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICAgKiBAcHJvdGVjdCB0ZXh0Q29udGVudFxuICAgICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICB7Tm9kZX0gY3VycmVudE5vZGUgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb24gdG8gZXhpc3RcbiAgICAgKiBAcmV0dXJuICB7Qm9vbGVhbn0gdHJ1ZSBpZiBub2RlIHdhcyBraWxsZWQsIGZhbHNlIGlmIGxlZnQgYWxpdmVcbiAgICAgKi9cblxuXG4gICAgdmFyIF9zYW5pdGl6ZUVsZW1lbnRzID0gZnVuY3Rpb24gX3Nhbml0aXplRWxlbWVudHMoY3VycmVudE5vZGUpIHtcbiAgICAgIHZhciBjb250ZW50O1xuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuXG4gICAgICBfZXhlY3V0ZUhvb2soJ2JlZm9yZVNhbml0aXplRWxlbWVudHMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG4gICAgICAvKiBDaGVjayBpZiBlbGVtZW50IGlzIGNsb2JiZXJlZCBvciBjYW4gY2xvYmJlciAqL1xuXG5cbiAgICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBDaGVjayBpZiB0YWduYW1lIGNvbnRhaW5zIFVuaWNvZGUgKi9cblxuXG4gICAgICBpZiAocmVnRXhwVGVzdCgvW1xcdTAwODAtXFx1RkZGRl0vLCBjdXJyZW50Tm9kZS5ub2RlTmFtZSkpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIE5vdyBsZXQncyBjaGVjayB0aGUgZWxlbWVudCdzIHR5cGUgYW5kIG5hbWUgKi9cblxuXG4gICAgICB2YXIgdGFnTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKGN1cnJlbnROb2RlLm5vZGVOYW1lKTtcbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cblxuICAgICAgX2V4ZWN1dGVIb29rKCd1cG9uU2FuaXRpemVFbGVtZW50JywgY3VycmVudE5vZGUsIHtcbiAgICAgICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICAgICAgYWxsb3dlZFRhZ3M6IEFMTE9XRURfVEFHU1xuICAgICAgfSk7XG4gICAgICAvKiBEZXRlY3QgbVhTUyBhdHRlbXB0cyBhYnVzaW5nIG5hbWVzcGFjZSBjb25mdXNpb24gKi9cblxuXG4gICAgICBpZiAoY3VycmVudE5vZGUuaGFzQ2hpbGROb2RlcygpICYmICFfaXNOb2RlKGN1cnJlbnROb2RlLmZpcnN0RWxlbWVudENoaWxkKSAmJiAoIV9pc05vZGUoY3VycmVudE5vZGUuY29udGVudCkgfHwgIV9pc05vZGUoY3VycmVudE5vZGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCkpICYmIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUuaW5uZXJIVE1MKSAmJiByZWdFeHBUZXN0KC88Wy9cXHddL2csIGN1cnJlbnROb2RlLnRleHRDb250ZW50KSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogTWl0aWdhdGUgYSBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGluc2lkZSBzZWxlY3QgKi9cblxuXG4gICAgICBpZiAodGFnTmFtZSA9PT0gJ3NlbGVjdCcgJiYgcmVnRXhwVGVzdCgvPHRlbXBsYXRlL2ksIGN1cnJlbnROb2RlLmlubmVySFRNTCkpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIFJlbW92ZSBlbGVtZW50IGlmIGFueXRoaW5nIGZvcmJpZHMgaXRzIHByZXNlbmNlICovXG5cblxuICAgICAgaWYgKCFBTExPV0VEX1RBR1NbdGFnTmFtZV0gfHwgRk9SQklEX1RBR1NbdGFnTmFtZV0pIHtcbiAgICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGN1c3RvbSBlbGVtZW50IHRvIGhhbmRsZSAqL1xuICAgICAgICBpZiAoIUZPUkJJRF9UQUdTW3RhZ05hbWVdICYmIF9iYXNpY0N1c3RvbUVsZW1lbnRUZXN0KHRhZ05hbWUpKSB7XG4gICAgICAgICAgaWYgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJiByZWdFeHBUZXN0KENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgdGFnTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBpZiAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHRhZ05hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogS2VlcCBjb250ZW50IGV4Y2VwdCBmb3IgYmFkLWxpc3RlZCBlbGVtZW50cyAqL1xuXG5cbiAgICAgICAgaWYgKEtFRVBfQ09OVEVOVCAmJiAhRk9SQklEX0NPTlRFTlRTW3RhZ05hbWVdKSB7XG4gICAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGN1cnJlbnROb2RlKSB8fCBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIHZhciBjaGlsZE5vZGVzID0gZ2V0Q2hpbGROb2RlcyhjdXJyZW50Tm9kZSkgfHwgY3VycmVudE5vZGUuY2hpbGROb2RlcztcblxuICAgICAgICAgIGlmIChjaGlsZE5vZGVzICYmIHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZENvdW50ID0gY2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBjaGlsZENvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2xvbmVOb2RlKGNoaWxkTm9kZXNbaV0sIHRydWUpLCBnZXROZXh0U2libGluZyhjdXJyZW50Tm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBDaGVjayB3aGV0aGVyIGVsZW1lbnQgaGFzIGEgdmFsaWQgbmFtZXNwYWNlICovXG5cblxuICAgICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiAhX2NoZWNrVmFsaWROYW1lc3BhY2UoY3VycmVudE5vZGUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBNYWtlIHN1cmUgdGhhdCBvbGRlciBicm93c2VycyBkb24ndCBnZXQgZmFsbGJhY2stdGFnIG1YU1MgKi9cblxuXG4gICAgICBpZiAoKHRhZ05hbWUgPT09ICdub3NjcmlwdCcgfHwgdGFnTmFtZSA9PT0gJ25vZW1iZWQnIHx8IHRhZ05hbWUgPT09ICdub2ZyYW1lcycpICYmIHJlZ0V4cFRlc3QoLzxcXC9ubyhzY3JpcHR8ZW1iZWR8ZnJhbWVzKS9pLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBTYW5pdGl6ZSBlbGVtZW50IGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuXG5cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMgJiYgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgLyogR2V0IHRoZSBlbGVtZW50J3MgdGV4dCBjb250ZW50ICovXG4gICAgICAgIGNvbnRlbnQgPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudDtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgTVVTVEFDSEVfRVhQUiQxLCAnICcpO1xuICAgICAgICBjb250ZW50ID0gc3RyaW5nUmVwbGFjZShjb250ZW50LCBFUkJfRVhQUiQxLCAnICcpO1xuICAgICAgICBjb250ZW50ID0gc3RyaW5nUmVwbGFjZShjb250ZW50LCBUTVBMSVRfRVhQUiQxLCAnICcpO1xuXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS50ZXh0Q29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICAgICAgZWxlbWVudDogY3VycmVudE5vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50Tm9kZS50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cblxuXG4gICAgICBfZXhlY3V0ZUhvb2soJ2FmdGVyU2FuaXRpemVFbGVtZW50cycsIGN1cnJlbnROb2RlLCBudWxsKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogX2lzVmFsaWRBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbGNUYWcgTG93ZXJjYXNlIHRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxjTmFtZSBMb3dlcmNhc2UgYXR0cmlidXRlIG5hbWUuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuXG5cbiAgICB2YXIgX2lzVmFsaWRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSkge1xuICAgICAgLyogTWFrZSBzdXJlIGF0dHJpYnV0ZSBjYW5ub3QgY2xvYmJlciAqL1xuICAgICAgaWYgKFNBTklUSVpFX0RPTSAmJiAobGNOYW1lID09PSAnaWQnIHx8IGxjTmFtZSA9PT0gJ25hbWUnKSAmJiAodmFsdWUgaW4gZG9jdW1lbnQgfHwgdmFsdWUgaW4gZm9ybUVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8qIEFsbG93IHZhbGlkIGRhdGEtKiBhdHRyaWJ1dGVzOiBBdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFmdGVyIFwiLVwiXG4gICAgICAgICAgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RvbS5odG1sI2VtYmVkZGluZy1jdXN0b20tbm9uLXZpc2libGUtZGF0YS13aXRoLXRoZS1kYXRhLSotYXR0cmlidXRlcylcbiAgICAgICAgICBYTUwtY29tcGF0aWJsZSAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5mcmFzdHJ1Y3R1cmUuaHRtbCN4bWwtY29tcGF0aWJsZSBhbmQgaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNkMGU4MDQpXG4gICAgICAgICAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWU7IGl0J3MgYWx3YXlzIFVSSSBzYWZlLiAqL1xuXG5cbiAgICAgIGlmIChBTExPV19EQVRBX0FUVFIgJiYgIUZPUkJJRF9BVFRSW2xjTmFtZV0gJiYgcmVnRXhwVGVzdChEQVRBX0FUVFIkMSwgbGNOYW1lKSkgOyBlbHNlIGlmIChBTExPV19BUklBX0FUVFIgJiYgcmVnRXhwVGVzdChBUklBX0FUVFIkMSwgbGNOYW1lKSkgOyBlbHNlIGlmICghQUxMT1dFRF9BVFRSW2xjTmFtZV0gfHwgRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgICBpZiAoIC8vIEZpcnN0IGNvbmRpdGlvbiBkb2VzIGEgdmVyeSBiYXNpYyBjaGVjayBpZiBhKSBpdCdzIGJhc2ljYWxseSBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IHRhZ25hbWUgQU5EXG4gICAgICAgIC8vIGIpIGlmIHRoZSB0YWdOYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrXG4gICAgICAgIC8vIGFuZCBjKSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2tcbiAgICAgICAgX2Jhc2ljQ3VzdG9tRWxlbWVudFRlc3QobGNUYWcpICYmIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiYgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIGxjVGFnKSB8fCBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sobGNUYWcpKSAmJiAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIGluc3RhbmNlb2YgUmVnRXhwICYmIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrLCBsY05hbWUpIHx8IENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayhsY05hbWUpKSB8fCAvLyBBbHRlcm5hdGl2ZSwgc2Vjb25kIGNvbmRpdGlvbiBjaGVja3MgaWYgaXQncyBhbiBgaXNgLWF0dHJpYnV0ZSwgQU5EXG4gICAgICAgIC8vIHRoZSB2YWx1ZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICBsY05hbWUgPT09ICdpcycgJiYgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzICYmIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiYgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIHZhbHVlKSB8fCBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sodmFsdWUpKSkgOyBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ2hlY2sgdmFsdWUgaXMgc2FmZS4gRmlyc3QsIGlzIGF0dHIgaW5lcnQ/IElmIHNvLCBpcyBzYWZlICovXG5cbiAgICAgIH0gZWxzZSBpZiAoVVJJX1NBRkVfQVRUUklCVVRFU1tsY05hbWVdKSA7IGVsc2UgaWYgKHJlZ0V4cFRlc3QoSVNfQUxMT1dFRF9VUkkkMSwgc3RyaW5nUmVwbGFjZSh2YWx1ZSwgQVRUUl9XSElURVNQQUNFJDEsICcnKSkpIDsgZWxzZSBpZiAoKGxjTmFtZSA9PT0gJ3NyYycgfHwgbGNOYW1lID09PSAneGxpbms6aHJlZicgfHwgbGNOYW1lID09PSAnaHJlZicpICYmIGxjVGFnICE9PSAnc2NyaXB0JyAmJiBzdHJpbmdJbmRleE9mKHZhbHVlLCAnZGF0YTonKSA9PT0gMCAmJiBEQVRBX1VSSV9UQUdTW2xjVGFnXSkgOyBlbHNlIGlmIChBTExPV19VTktOT1dOX1BST1RPQ09MUyAmJiAhcmVnRXhwVGVzdChJU19TQ1JJUFRfT1JfREFUQSQxLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UkMSwgJycpKSkgOyBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9iYXNpY0N1c3RvbUVsZW1lbnRDaGVja1xuICAgICAqIGNoZWNrcyBpZiBhdCBsZWFzdCBvbmUgZGFzaCBpcyBpbmNsdWRlZCBpbiB0YWdOYW1lLCBhbmQgaXQncyBub3QgdGhlIGZpcnN0IGNoYXJcbiAgICAgKiBmb3IgbW9yZSBzb3BoaXN0aWNhdGVkIGNoZWNraW5nIHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3ZhbGlkYXRlLWVsZW1lbnQtbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lIG5hbWUgb2YgdGhlIHRhZyBvZiB0aGUgbm9kZSB0byBzYW5pdGl6ZVxuICAgICAqL1xuXG5cbiAgICB2YXIgX2Jhc2ljQ3VzdG9tRWxlbWVudFRlc3QgPSBmdW5jdGlvbiBfYmFzaWNDdXN0b21FbGVtZW50VGVzdCh0YWdOYW1lKSB7XG4gICAgICByZXR1cm4gdGFnTmFtZS5pbmRleE9mKCctJykgPiAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogX3Nhbml0aXplQXR0cmlidXRlc1xuICAgICAqXG4gICAgICogQHByb3RlY3QgYXR0cmlidXRlc1xuICAgICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAgICogQHByb3RlY3QgcmVtb3ZlQXR0cmlidXRlXG4gICAgICogQHByb3RlY3Qgc2V0QXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBjdXJyZW50Tm9kZSB0byBzYW5pdGl6ZVxuICAgICAqL1xuXG5cbiAgICB2YXIgX3Nhbml0aXplQXR0cmlidXRlcyA9IGZ1bmN0aW9uIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpIHtcbiAgICAgIHZhciBhdHRyO1xuICAgICAgdmFyIHZhbHVlO1xuICAgICAgdmFyIGxjTmFtZTtcbiAgICAgIHZhciBsO1xuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuXG4gICAgICBfZXhlY3V0ZUhvb2soJ2JlZm9yZVNhbml0aXplQXR0cmlidXRlcycsIGN1cnJlbnROb2RlLCBudWxsKTtcblxuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBjdXJyZW50Tm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhdHRyaWJ1dGVzOyBpZiBub3Qgd2UgbWlnaHQgaGF2ZSBhIHRleHQgbm9kZSAqL1xuXG4gICAgICBpZiAoIWF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaG9va0V2ZW50ID0ge1xuICAgICAgICBhdHRyTmFtZTogJycsXG4gICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgIGtlZXBBdHRyOiB0cnVlLFxuICAgICAgICBhbGxvd2VkQXR0cmlidXRlczogQUxMT1dFRF9BVFRSXG4gICAgICB9O1xuICAgICAgbCA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuICAgICAgLyogR28gYmFja3dhcmRzIG92ZXIgYWxsIGF0dHJpYnV0ZXM7IHNhZmVseSByZW1vdmUgYmFkIG9uZXMgKi9cblxuICAgICAgd2hpbGUgKGwtLSkge1xuICAgICAgICBhdHRyID0gYXR0cmlidXRlc1tsXTtcbiAgICAgICAgdmFyIF9hdHRyID0gYXR0cixcbiAgICAgICAgICAgIG5hbWUgPSBfYXR0ci5uYW1lLFxuICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gX2F0dHIubmFtZXNwYWNlVVJJO1xuICAgICAgICB2YWx1ZSA9IG5hbWUgPT09ICd2YWx1ZScgPyBhdHRyLnZhbHVlIDogc3RyaW5nVHJpbShhdHRyLnZhbHVlKTtcbiAgICAgICAgbGNOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMobmFtZSk7XG4gICAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cblxuICAgICAgICBob29rRXZlbnQuYXR0ck5hbWUgPSBsY05hbWU7XG4gICAgICAgIGhvb2tFdmVudC5hdHRyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaG9va0V2ZW50LmtlZXBBdHRyID0gdHJ1ZTtcbiAgICAgICAgaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIgPSB1bmRlZmluZWQ7IC8vIEFsbG93cyBkZXZlbG9wZXJzIHRvIHNlZSB0aGlzIGlzIGEgcHJvcGVydHkgdGhleSBjYW4gc2V0XG5cbiAgICAgICAgX2V4ZWN1dGVIb29rKCd1cG9uU2FuaXRpemVBdHRyaWJ1dGUnLCBjdXJyZW50Tm9kZSwgaG9va0V2ZW50KTtcblxuICAgICAgICB2YWx1ZSA9IGhvb2tFdmVudC5hdHRyVmFsdWU7XG4gICAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuXG4gICAgICAgIGlmIChob29rRXZlbnQuZm9yY2VLZWVwQXR0cikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8qIFJlbW92ZSBhdHRyaWJ1dGUgKi9cblxuXG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICAvKiBEaWQgdGhlIGhvb2tzIGFwcHJvdmUgb2YgdGhlIGF0dHJpYnV0ZT8gKi9cblxuXG4gICAgICAgIGlmICghaG9va0V2ZW50LmtlZXBBdHRyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLyogV29yayBhcm91bmQgYSBzZWN1cml0eSBpc3N1ZSBpbiBqUXVlcnkgMy4wICovXG5cblxuICAgICAgICBpZiAoIUFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiAmJiByZWdFeHBUZXN0KC9cXC8+L2ksIHZhbHVlKSkge1xuICAgICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLyogU2FuaXRpemUgYXR0cmlidXRlIGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuXG5cbiAgICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgICAgIHZhbHVlID0gc3RyaW5nUmVwbGFjZSh2YWx1ZSwgTVVTVEFDSEVfRVhQUiQxLCAnICcpO1xuICAgICAgICAgIHZhbHVlID0gc3RyaW5nUmVwbGFjZSh2YWx1ZSwgRVJCX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIFRNUExJVF9FWFBSJDEsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyogSXMgYHZhbHVlYCB2YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGU/ICovXG5cblxuICAgICAgICB2YXIgbGNUYWcgPSB0cmFuc2Zvcm1DYXNlRnVuYyhjdXJyZW50Tm9kZS5ub2RlTmFtZSk7XG5cbiAgICAgICAgaWYgKCFfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBGdWxsIERPTSBDbG9iYmVyaW5nIHByb3RlY3Rpb24gdmlhIG5hbWVzcGFjZSBpc29sYXRpb24sXG4gICAgICAgICAqIFByZWZpeCBpZCBhbmQgbmFtZSBhdHRyaWJ1dGVzIHdpdGggYHVzZXItY29udGVudC1gXG4gICAgICAgICAqL1xuXG5cbiAgICAgICAgaWYgKFNBTklUSVpFX05BTUVEX1BST1BTICYmIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGlzIHZhbHVlXG4gICAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7IC8vIFByZWZpeCB0aGUgdmFsdWUgYW5kIGxhdGVyIHJlLWNyZWF0ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhlIHNhbml0aXplZCB2YWx1ZVxuXG5cbiAgICAgICAgICB2YWx1ZSA9IFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCArIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8qIEhhbmRsZSBhdHRyaWJ1dGVzIHRoYXQgcmVxdWlyZSBUcnVzdGVkIFR5cGVzICovXG5cblxuICAgICAgICBpZiAodHJ1c3RlZFR5cGVzUG9saWN5ICYmIF90eXBlb2YodHJ1c3RlZFR5cGVzKSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkgOyBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHJ1c3RlZFR5cGVzLmdldEF0dHJpYnV0ZVR5cGUobGNUYWcsIGxjTmFtZSkpIHtcbiAgICAgICAgICAgICAgY2FzZSAnVHJ1c3RlZEhUTUwnOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRTY3JpcHRVUkwnOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZVNjcmlwdFVSTCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qIEhhbmRsZSBpbnZhbGlkIGRhdGEtKiBhdHRyaWJ1dGUgc2V0IGJ5IHRyeS1jYXRjaGluZyBpdCAqL1xuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogRmFsbGJhY2sgdG8gc2V0QXR0cmlidXRlKCkgZm9yIGJyb3dzZXItdW5yZWNvZ25pemVkIG5hbWVzcGFjZXMgZS5nLiBcIngtc2NoZW1hXCIuICovXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFycmF5UG9wKERPTVB1cmlmeS5yZW1vdmVkKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH1cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cblxuXG4gICAgICBfZXhlY3V0ZUhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgY3VycmVudE5vZGUsIG51bGwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogX3Nhbml0aXplU2hhZG93RE9NXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudCB0byBpdGVyYXRlIG92ZXIgcmVjdXJzaXZlbHlcbiAgICAgKi9cblxuXG4gICAgdmFyIF9zYW5pdGl6ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uIF9zYW5pdGl6ZVNoYWRvd0RPTShmcmFnbWVudCkge1xuICAgICAgdmFyIHNoYWRvd05vZGU7XG5cbiAgICAgIHZhciBzaGFkb3dJdGVyYXRvciA9IF9jcmVhdGVJdGVyYXRvcihmcmFnbWVudCk7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG5cblxuICAgICAgX2V4ZWN1dGVIb29rKCdiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTScsIGZyYWdtZW50LCBudWxsKTtcblxuICAgICAgd2hpbGUgKHNoYWRvd05vZGUgPSBzaGFkb3dJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgICAgX2V4ZWN1dGVIb29rKCd1cG9uU2FuaXRpemVTaGFkb3dOb2RlJywgc2hhZG93Tm9kZSwgbnVsbCk7XG4gICAgICAgIC8qIFNhbml0aXplIHRhZ3MgYW5kIGVsZW1lbnRzICovXG5cblxuICAgICAgICBpZiAoX3Nhbml0aXplRWxlbWVudHMoc2hhZG93Tm9kZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBEZWVwIHNoYWRvdyBET00gZGV0ZWN0ZWQgKi9cblxuXG4gICAgICAgIGlmIChzaGFkb3dOb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKHNoYWRvd05vZGUuY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcywgc2FuaXRpemUgaWYgbmVjZXNzYXJ5ICovXG5cblxuICAgICAgICBfc2FuaXRpemVBdHRyaWJ1dGVzKHNoYWRvd05vZGUpO1xuICAgICAgfVxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuXG5cbiAgICAgIF9leGVjdXRlSG9vaygnYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTScsIGZyYWdtZW50LCBudWxsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNhbml0aXplXG4gICAgICogUHVibGljIG1ldGhvZCBwcm92aWRpbmcgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE5vZGV9IGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cblxuICAgIERPTVB1cmlmeS5zYW5pdGl6ZSA9IGZ1bmN0aW9uIChkaXJ0eSkge1xuICAgICAgdmFyIGNmZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgYm9keTtcbiAgICAgIHZhciBpbXBvcnRlZE5vZGU7XG4gICAgICB2YXIgY3VycmVudE5vZGU7XG4gICAgICB2YXIgb2xkTm9kZTtcbiAgICAgIHZhciByZXR1cm5Ob2RlO1xuICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzdHJpbmcgdG8gc2FuaXRpemUuXG4gICAgICAgIERPIE5PVCByZXR1cm4gZWFybHksIGFzIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdyb25nIHR5cGUgaWZcbiAgICAgICAgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCBhIERPTSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcgKi9cblxuICAgICAgSVNfRU1QVFlfSU5QVVQgPSAhZGlydHk7XG5cbiAgICAgIGlmIChJU19FTVBUWV9JTlBVVCkge1xuICAgICAgICBkaXJ0eSA9ICc8IS0tPic7XG4gICAgICB9XG4gICAgICAvKiBTdHJpbmdpZnksIGluIGNhc2UgZGlydHkgaXMgYW4gb2JqZWN0ICovXG5cblxuICAgICAgaWYgKHR5cGVvZiBkaXJ0eSAhPT0gJ3N0cmluZycgJiYgIV9pc05vZGUoZGlydHkpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGlydHkudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBkaXJ0eSA9IGRpcnR5LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKCdkaXJ0eSBpcyBub3QgYSBzdHJpbmcsIGFib3J0aW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgndG9TdHJpbmcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogQ2hlY2sgd2UgY2FuIHJ1bi4gT3RoZXJ3aXNlIGZhbGwgYmFjayBvciBpZ25vcmUgKi9cblxuXG4gICAgICBpZiAoIURPTVB1cmlmeS5pc1N1cHBvcnRlZCkge1xuICAgICAgICBpZiAoX3R5cGVvZih3aW5kb3cudG9TdGF0aWNIVE1MKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHdpbmRvdy50b1N0YXRpY0hUTUwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRpcnR5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy50b1N0YXRpY0hUTUwoZGlydHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfaXNOb2RlKGRpcnR5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy50b1N0YXRpY0hUTUwoZGlydHkub3V0ZXJIVE1MKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGlydHk7XG4gICAgICB9XG4gICAgICAvKiBBc3NpZ24gY29uZmlnIHZhcnMgKi9cblxuXG4gICAgICBpZiAoIVNFVF9DT05GSUcpIHtcbiAgICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgICB9XG4gICAgICAvKiBDbGVhbiB1cCByZW1vdmVkIGVsZW1lbnRzICovXG5cblxuICAgICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcbiAgICAgIC8qIENoZWNrIGlmIGRpcnR5IGlzIGNvcnJlY3RseSB0eXBlZCBmb3IgSU5fUExBQ0UgKi9cblxuICAgICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgSU5fUExBQ0UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICAgIC8qIERvIHNvbWUgZWFybHkgcHJlLXNhbml0aXphdGlvbiB0byBhdm9pZCB1bnNhZmUgcm9vdCBub2RlcyAqL1xuICAgICAgICBpZiAoZGlydHkubm9kZU5hbWUpIHtcbiAgICAgICAgICB2YXIgdGFnTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKGRpcnR5Lm5vZGVOYW1lKTtcblxuICAgICAgICAgIGlmICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKSB7XG4gICAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ3Jvb3Qgbm9kZSBpcyBmb3JiaWRkZW4gYW5kIGNhbm5vdCBiZSBzYW5pdGl6ZWQgaW4tcGxhY2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlydHkgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIC8qIElmIGRpcnR5IGlzIGEgRE9NIGVsZW1lbnQsIGFwcGVuZCB0byBhbiBlbXB0eSBkb2N1bWVudCB0byBhdm9pZFxuICAgICAgICAgICBlbGVtZW50cyBiZWluZyBzdHJpcHBlZCBieSB0aGUgcGFyc2VyICovXG4gICAgICAgIGJvZHkgPSBfaW5pdERvY3VtZW50KCc8IS0tLS0+Jyk7XG4gICAgICAgIGltcG9ydGVkTm9kZSA9IGJvZHkub3duZXJEb2N1bWVudC5pbXBvcnROb2RlKGRpcnR5LCB0cnVlKTtcblxuICAgICAgICBpZiAoaW1wb3J0ZWROb2RlLm5vZGVUeXBlID09PSAxICYmIGltcG9ydGVkTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgICAgLyogTm9kZSBpcyBhbHJlYWR5IGEgYm9keSwgdXNlIGFzIGlzICovXG4gICAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgICAgIGJvZHkgPSBpbXBvcnRlZE5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoaW1wb3J0ZWROb2RlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogRXhpdCBkaXJlY3RseSBpZiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gKi9cbiAgICAgICAgaWYgKCFSRVRVUk5fRE9NICYmICFTQUZFX0ZPUl9URU1QTEFURVMgJiYgIVdIT0xFX0RPQ1VNRU5UICYmIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgICBkaXJ0eS5pbmRleE9mKCc8JykgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpIDogZGlydHk7XG4gICAgICAgIH1cbiAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnQgdG8gd29yayBvbiAqL1xuXG5cbiAgICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoZGlydHkpO1xuICAgICAgICAvKiBDaGVjayB3ZSBoYXZlIGEgRE9NIG5vZGUgZnJvbSB0aGUgZGF0YSAqL1xuXG4gICAgICAgIGlmICghYm9keSkge1xuICAgICAgICAgIHJldHVybiBSRVRVUk5fRE9NID8gbnVsbCA6IFJFVFVSTl9UUlVTVEVEX1RZUEUgPyBlbXB0eUhUTUwgOiAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogUmVtb3ZlIGZpcnN0IGVsZW1lbnQgbm9kZSAob3VycykgaWYgRk9SQ0VfQk9EWSBpcyBzZXQgKi9cblxuXG4gICAgICBpZiAoYm9keSAmJiBGT1JDRV9CT0RZKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShib2R5LmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgLyogR2V0IG5vZGUgaXRlcmF0b3IgKi9cblxuXG4gICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gX2NyZWF0ZUl0ZXJhdG9yKElOX1BMQUNFID8gZGlydHkgOiBib2R5KTtcbiAgICAgIC8qIE5vdyBzdGFydCBpdGVyYXRpbmcgb3ZlciB0aGUgY3JlYXRlZCBkb2N1bWVudCAqL1xuXG5cbiAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8qIEZpeCBJRSdzIHN0cmFuZ2UgYmVoYXZpb3Igd2l0aCBtYW5pcHVsYXRlZCB0ZXh0Tm9kZXMgIzg5ICovXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBjdXJyZW50Tm9kZSA9PT0gb2xkTm9kZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8qIFNhbml0aXplIHRhZ3MgYW5kIGVsZW1lbnRzICovXG5cblxuICAgICAgICBpZiAoX3Nhbml0aXplRWxlbWVudHMoY3VycmVudE5vZGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLyogU2hhZG93IERPTSBkZXRlY3RlZCwgc2FuaXRpemUgaXQgKi9cblxuXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICAgIF9zYW5pdGl6ZVNoYWRvd0RPTShjdXJyZW50Tm9kZS5jb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvKiBDaGVjayBhdHRyaWJ1dGVzLCBzYW5pdGl6ZSBpZiBuZWNlc3NhcnkgKi9cblxuXG4gICAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIG9sZE5vZGUgPSBjdXJyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgb2xkTm9kZSA9IG51bGw7XG4gICAgICAvKiBJZiB3ZSBzYW5pdGl6ZWQgYGRpcnR5YCBpbi1wbGFjZSwgcmV0dXJuIGl0LiAqL1xuXG4gICAgICBpZiAoSU5fUExBQ0UpIHtcbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgICAgfVxuICAgICAgLyogUmV0dXJuIHNhbml0aXplZCBzdHJpbmcgb3IgRE9NICovXG5cblxuICAgICAgaWYgKFJFVFVSTl9ET00pIHtcbiAgICAgICAgaWYgKFJFVFVSTl9ET01fRlJBR01FTlQpIHtcbiAgICAgICAgICByZXR1cm5Ob2RlID0gY3JlYXRlRG9jdW1lbnRGcmFnbWVudC5jYWxsKGJvZHkub3duZXJEb2N1bWVudCk7XG5cbiAgICAgICAgICB3aGlsZSAoYm9keS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZG9tLW5vZGUtYXBwZW5kXG4gICAgICAgICAgICByZXR1cm5Ob2RlLmFwcGVuZENoaWxkKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybk5vZGUgPSBib2R5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFMTE9XRURfQVRUUi5zaGFkb3dyb290IHx8IEFMTE9XRURfQVRUUi5zaGFkb3dyb290bW9kKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgIEFkb3B0Tm9kZSgpIGlzIG5vdCB1c2VkIGJlY2F1c2UgaW50ZXJuYWwgc3RhdGUgaXMgbm90IHJlc2V0XG4gICAgICAgICAgICAoZS5nLiB0aGUgcGFzdCBuYW1lcyBtYXAgb2YgYSBIVE1MRm9ybUVsZW1lbnQpLCB0aGlzIGlzIHNhZmVcbiAgICAgICAgICAgIGluIHRoZW9yeSBidXQgd2Ugd291bGQgcmF0aGVyIG5vdCByaXNrIGFub3RoZXIgYXR0YWNrIHZlY3Rvci5cbiAgICAgICAgICAgIFRoZSBzdGF0ZSB0aGF0IGlzIGNsb25lZCBieSBpbXBvcnROb2RlKCkgaXMgZXhwbGljaXRseSBkZWZpbmVkXG4gICAgICAgICAgICBieSB0aGUgc3BlY3MuXG4gICAgICAgICAgKi9cbiAgICAgICAgICByZXR1cm5Ob2RlID0gaW1wb3J0Tm9kZS5jYWxsKG9yaWdpbmFsRG9jdW1lbnQsIHJldHVybk5vZGUsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldHVybk5vZGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzZXJpYWxpemVkSFRNTCA9IFdIT0xFX0RPQ1VNRU5UID8gYm9keS5vdXRlckhUTUwgOiBib2R5LmlubmVySFRNTDtcbiAgICAgIC8qIFNlcmlhbGl6ZSBkb2N0eXBlIGlmIGFsbG93ZWQgKi9cblxuICAgICAgaWYgKFdIT0xFX0RPQ1VNRU5UICYmIEFMTE9XRURfVEFHU1snIWRvY3R5cGUnXSAmJiBib2R5Lm93bmVyRG9jdW1lbnQgJiYgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUgJiYgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSAmJiByZWdFeHBUZXN0KERPQ1RZUEVfTkFNRSwgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSkpIHtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSAnPCFET0NUWVBFICcgKyBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICsgJz5cXG4nICsgc2VyaWFsaXplZEhUTUw7XG4gICAgICB9XG4gICAgICAvKiBTYW5pdGl6ZSBmaW5hbCBzdHJpbmcgdGVtcGxhdGUtc2FmZSAqL1xuXG5cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBNVVNUQUNIRV9FWFBSJDEsICcgJyk7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgRVJCX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBUTVBMSVRfRVhQUiQxLCAnICcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzUG9saWN5ICYmIFJFVFVSTl9UUlVTVEVEX1RZUEUgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChzZXJpYWxpemVkSFRNTCkgOiBzZXJpYWxpemVkSFRNTDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gc2V0IHRoZSBjb25maWd1cmF0aW9uIG9uY2VcbiAgICAgKiBzZXRDb25maWdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKi9cblxuXG4gICAgRE9NUHVyaWZ5LnNldENvbmZpZyA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICAgIF9wYXJzZUNvbmZpZyhjZmcpO1xuXG4gICAgICBTRVRfQ09ORklHID0gdHJ1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBjb25maWd1cmF0aW9uXG4gICAgICogY2xlYXJDb25maWdcbiAgICAgKlxuICAgICAqL1xuXG5cbiAgICBET01QdXJpZnkuY2xlYXJDb25maWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBDT05GSUcgPSBudWxsO1xuICAgICAgU0VUX0NPTkZJRyA9IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVibGljIG1ldGhvZCB0byBjaGVjayBpZiBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgdmFsaWQuXG4gICAgICogVXNlcyBsYXN0IHNldCBjb25maWcsIGlmIGFueS4gT3RoZXJ3aXNlLCB1c2VzIGNvbmZpZyBkZWZhdWx0cy5cbiAgICAgKiBpc1ZhbGlkQXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHRhZyBUYWcgbmFtZSBvZiBjb250YWluaW5nIGVsZW1lbnQuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBhdHRyIEF0dHJpYnV0ZSBuYW1lLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIHZhbGlkLiBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UuXG4gICAgICovXG5cblxuICAgIERPTVB1cmlmeS5pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKHRhZywgYXR0ciwgdmFsdWUpIHtcbiAgICAgIC8qIEluaXRpYWxpemUgc2hhcmVkIGNvbmZpZyB2YXJzIGlmIG5lY2Vzc2FyeS4gKi9cbiAgICAgIGlmICghQ09ORklHKSB7XG4gICAgICAgIF9wYXJzZUNvbmZpZyh7fSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBsY1RhZyA9IHRyYW5zZm9ybUNhc2VGdW5jKHRhZyk7XG4gICAgICB2YXIgbGNOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoYXR0cik7XG4gICAgICByZXR1cm4gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkSG9va1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gYWRkIERPTVB1cmlmeSBob29rc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhvb2tGdW5jdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlXG4gICAgICovXG5cblxuICAgIERPTVB1cmlmeS5hZGRIb29rID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQsIGhvb2tGdW5jdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBob29rRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBob29rc1tlbnRyeVBvaW50XSA9IGhvb2tzW2VudHJ5UG9pbnRdIHx8IFtdO1xuICAgICAgYXJyYXlQdXNoKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlSG9va1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgbW9yZSBhcmUgcHJlc2VudClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gcmVtb3ZlZChwb3BwZWQpIGhvb2tcbiAgICAgKi9cblxuXG4gICAgRE9NUHVyaWZ5LnJlbW92ZUhvb2sgPSBmdW5jdGlvbiAoZW50cnlQb2ludCkge1xuICAgICAgaWYgKGhvb2tzW2VudHJ5UG9pbnRdKSB7XG4gICAgICAgIHJldHVybiBhcnJheVBvcChob29rc1tlbnRyeVBvaW50XSk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVIb29rc1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIGFsbCBET01QdXJpZnkgaG9va3MgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rcyB0byByZW1vdmVcbiAgICAgKi9cblxuXG4gICAgRE9NUHVyaWZ5LnJlbW92ZUhvb2tzID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQpIHtcbiAgICAgIGlmIChob29rc1tlbnRyeVBvaW50XSkge1xuICAgICAgICBob29rc1tlbnRyeVBvaW50XSA9IFtdO1xuICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlQWxsSG9va3NcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSBhbGwgRE9NUHVyaWZ5IGhvb2tzXG4gICAgICpcbiAgICAgKi9cblxuXG4gICAgRE9NUHVyaWZ5LnJlbW92ZUFsbEhvb2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaG9va3MgPSB7fTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERPTVB1cmlmeTtcbiAgfVxuXG4gIHZhciBwdXJpZnkgPSBjcmVhdGVET01QdXJpZnkoKTtcblxuICByZXR1cm4gcHVyaWZ5O1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdXJpZnkuanMubWFwXG4iLCJpbXBvcnQgeyBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IHJlbmRlckxhdGV4IH0gZnJvbSAnLi9sYXRleCc7XG5pbXBvcnQgeyByZW5kZXJNYXRoTUwgfSBmcm9tICcuL21hdGhtbCc7XG5pbXBvcnQgeyBieXBhc3NFbmNhcHN1bGF0aW9uIH0gZnJvbSAnLi9yZXRybyc7XG5cbi8vIFRoaXMgc2hvdWxkIGJlIHRoZSBvbmx5IGNvZGUgZXhlY3V0ZWQgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uXG4vLyBhbmQgdGhlIG9ubHkgY29kZSBjb250YWluaW5nIGJyb3dzZXIgZ2xvYmFscyAoZS5nLiB3aW5kb3cpXG4vLyBUT0RPIHRyeSB0byBzZXQgdXAgdGhlIGxpbnRlciB0byBjaGVjayB0aGVzZSB0d28gY29uc3RyYWludHNcbm1haW4od2luZG93KTtcblxuLyoqXG4gKiBJbml0aWFsIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGxvYWRpbmcgdGhlIHNjcmlwdC5cbiAqIEBwYXJhbSB7V2luZG93fSB3IC0gVGhlIHdpbmRvdyBpbnN0YW5jZSBvZiB0aGUgYnJvd3Nlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWFpbih3OiBXaW5kb3cpOiBQcm9taXNlPHZvaWQ+IHtcblxuICBjb25zdCBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzID0gYXdhaXQgUHJvcGVydGllcy5nZW5lcmF0ZSgpO1xuXG4gIC8vIEV4cG9zZSB0aGUgZ2xvYmFscyB0byB0aGUgYnJvd3NlclxuICAodyBhcyBhbnkpLnZpZXdlciA9IHtcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xuXG4gIGNvbnN0IGRvY3VtZW50ID0gdy5kb2N1bWVudDtcblxuICAvKipcbiAgICogUGFyc2UgdGhlIERPTSBsb29raW5nIGZvciBMYVRlWCBhbmQgPG1hdGg+IGVsZW1lbnRzLlxuICAgKiBSZXBsYWNlcyB0aGVtIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcmVuZGVyZWQgaW1hZ2VzIHdpdGhpbiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jdW1lbnQgLSBUaGUgRE9NIGRvY3VtZW50IGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIHJlbmRlcmluZyByb290LlxuICAgKiBAcGFyYW0ge011dGF0aW9uT2JzZXJ2ZXJ9IG9ic2VydmVyIC0gTXV0YXRpb24gb2JzZXJ2ZXIgdG8gYWN0aXZhdGUgb3IgcmVhY3RpdmF0ZSBldmVyeSB0aW1lIHRoZSByZW5kZXJpbmcgcm9vdCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJvcGVydGllcy5yZW5kZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHByb3BlcnRpZXMuZWxlbWVudCk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGF3YWl0IHJlbmRlckxhdGV4KHByb3BlcnRpZXMsIGVsZW1lbnQpO1xuICAgICAgYXdhaXQgcmVuZGVyTWF0aE1MKHByb3BlcnRpZXMsIGVsZW1lbnQpO1xuICAgIH1cbiAgfTtcblxuICAvLyBJbml0aWFsIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSBkb2N1bWVudCBpcyBsb2FkZWRcbiAgLy8gUmVuZGVycyBmb3JtdWxhcyBhbmQgc2V0cyBvYnNlcnZlclxuICBjb25zdCBzdGFydCA9IGFzeW5jICgpID0+IHtcbiAgICAvLyBGaXJzdCByZW5kZXJcbiAgICBwcm9wZXJ0aWVzLnJlbmRlcigpO1xuXG4gICAgLy8gQ2FsbGJhY2sgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlcmUgaXMgYSBtdXRhdGlvbiBpbiB0aGUgd2F0Y2hlZCBET00gZWxlbWVudFxuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGFzeW5jIChtdXRhdGlvbkxpc3QsIG9ic2VydmVyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgbXV0YXRpb24uYWRkZWROb2Rlcykge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGF3YWl0IHByb3BlcnRpZXMucmVuZGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBXZSBuZWVkIHRvIHdhdGNoIG92ZXIgdGhlIHdob2xlIGRvY3VtZW50LCBpbiBjYXNlIHRoZSBQcm9wZXJ0aWVzLmVsZW1lbnQgaXMgaW5zZXJ0ZWRcbiAgICAvLyBlLmcuIHdlIHNldCBQcm9wZXJ0aWVzLmVsZW1lbnQgPSAnI3JlbmRlckFyZWEnIGFuZCB0aGVuIHdlIGFwcGVuZCA8ZGl2IGlkPVwicmVuZGVyQXJlYVwiPiQkMisyPTQkJDwvZGl2PiB0byB0aGUgZG9jdW1lbnRcbiAgICAub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSwgLy8gSW4gY2FzZSBhbiBhdHRyaWJ1dGUgaXMgY2hhbmdlZCBpbiBhIDxtYXRoPiBub2RlLCBmb3IgaW5zdGFuY2VcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSwgLy8gSW4gY2FzZSBhIG5ldyA8bWF0aD4gb3IgJCRsYXRleCQkIG5vZGUgaXMgYWRkZWQsIGZvciBpbnN0YW5jZVxuICAgICAgc3VidHJlZTogdHJ1ZSwgLy8gSW4gY2FzZSBhIDxtYXRoPiBub2RlIGlzIGFkZGVkIGFzIGEgZGVzY2VuZGFudCBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudCwgZm9yIGluc3RhbmNlXG4gICAgfSk7XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L0RPTUNvbnRlbnRMb2FkZWRfZXZlbnQjY2hlY2tpbmdfd2hldGhlcl9sb2FkaW5nX2lzX2FscmVhZHlfY29tcGxldGVcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgLy8gTG9hZGluZyBoYXNuJ3QgZmluaXNoZWQgeWV0XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgc3RhcnQpO1xuICB9IGVsc2Uge1xuICAgIC8vIGBET01Db250ZW50TG9hZGVkYCBoYXMgYWxyZWFkeSBmaXJlZFxuICAgIHN0YXJ0KCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdGhlIG9sZCBWaWV3ZXIgQVBJIGFzIGEgZ2xvYmFsXG4gIGJ5cGFzc0VuY2Fwc3VsYXRpb24ocHJvcGVydGllcywgdyk7XG5cbiAgLy8gRGlzcGF0Y2ggYW4gZXZlbnQgbm90aWZ5aW5nIHRoYXQgdGhlIHZpZXdlciBoYXMgYmVlbiBsb2FkZWRcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3ZpZXdlckxvYWRlZCcpKTtcbn1cbiIsImltcG9ydCB7IGxhdGV4VG9NYXRobWwgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7IFByb3BlcnRpZXMgfSBmcm9tICcuL3Byb3BlcnRpZXMnO1xuXG5pbnRlcmZhY2UgTGF0ZXhQb3NpdGlvbiB7XG4gIHN0YXJ0OiBudW1iZXIsXG4gIGVuZDogbnVtYmVyLFxufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBET00gbG9va2luZyBmb3IgTGFUZVggbm9kZXMgYW5kIHJlcGxhY2VzIHRoZW0gd2l0aCB0aGUgY29ycmVzcG9uZGluZyByZW5kZXJlZCBpbWFnZXMuXG4gKiBAcGFyYW0ge1Byb3BlcnRpZXN9IHByb3BlcnRpZXMgLSBQcm9wZXJ0aWVzIG9mIHRoZSB2aWV3ZXIuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb290IC0gQW55IERPTSBlbGVtZW50IHRoYXQgY2FuIGNvbnRhaW4gTWF0aE1MLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyTGF0ZXgocHJvcGVydGllczogUHJvcGVydGllcywgcm9vdDogSFRNTEVsZW1lbnQpIHtcblxuICBpZiAocHJvcGVydGllcy52aWV3ZXIgIT09ICdpbWFnZScgJiYgcHJvcGVydGllcy52aWV3ZXIgIT09ICdsYXRleCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBsYXRleE5vZGVzID0gZmluZExhdGV4VGV4dE5vZGVzKHJvb3QpO1xuXG4gIGZvciAoY29uc3QgbGF0ZXhOb2RlIG9mIGxhdGV4Tm9kZXMpIHtcbiAgICBhd2FpdCByZXBsYWNlTGF0ZXhJblRleHROb2RlKHByb3BlcnRpZXMsIGxhdGV4Tm9kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXBsYWNlIExhVGVYIGluc3RhbmNlcyB3aXRoIE1hdGhNTCBpbnNpZGUgYSBnaXZlbiBub2RlLlxuICogQHBhcmFtIHtQcm9wZXJ0aWVzfSBwcm9wZXJ0aWVzIC0gUHJvcGVydGllcyBvZiB0aGUgdmlld2VyLlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGV4dCBub2RlIGluIHdoaWNoIHRvIHNlYXJjaCBhbmQgcmVwbGFjZSBMYVRlWCBpbnN0YW5jZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VMYXRleEluVGV4dE5vZGUocHJvcGVydGllczogUHJvcGVydGllcywgbm9kZTogTm9kZSkge1xuICBjb25zdCB0ZXh0Q29udGVudDogc3RyaW5nID0gbm9kZS50ZXh0Q29udGVudCB8fCAnJztcbiAgbGV0IHBvczogbnVtYmVyID0gMDtcblxuICB3aGlsZSAocG9zIDwgdGV4dENvbnRlbnQubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV4dExhdGV4UG9zaXRpb246IExhdGV4UG9zaXRpb24gPSBnZXROZXh0TGF0ZXhQb3MocG9zLCB0ZXh0Q29udGVudCk7XG4gICAgaWYgKG5leHRMYXRleFBvc2l0aW9uKSB7XG4gICAgICAvLyBHZXQgbGVmdCBub24gTGFUZVggdGV4dC5cbiAgICAgIGNvbnN0IGxlZnRUZXh0OiBzdHJpbmcgPSB0ZXh0Q29udGVudC5zdWJzdHJpbmcocG9zLCBuZXh0TGF0ZXhQb3NpdGlvbi5zdGFydCk7XG4gICAgICBjb25zdCBsZWZ0VGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWZ0VGV4dCk7XG4gICAgICAvLyBDcmVhdGUgYSBub2RlIHdpdGggbGVmdCB0ZXh0LlxuICAgICAgbm9kZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUobGVmdFRleHROb2RlLCBub2RlKTtcbiAgICAgIG5vZGUubm9kZVZhbHVlID0gbm9kZS5ub2RlVmFsdWUuc3Vic3RyaW5nKHBvcywgbmV4dExhdGV4UG9zaXRpb24uc3RhcnQpO1xuXG4gICAgICAvLyBHZXQgTGFUZVggdGV4dC5cbiAgICAgIGNvbnN0IGxhdGV4ID0gdGV4dENvbnRlbnQuc3Vic3RyaW5nKG5leHRMYXRleFBvc2l0aW9uLnN0YXJ0ICsgJyQkJy5sZW5ndGgsIG5leHRMYXRleFBvc2l0aW9uLmVuZCk7XG4gICAgICAvLyBDb252ZXJ0IExhVGVYIHRvIG1hdGhtbC5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbGF0ZXhUb01hdGhtbChsYXRleCwgcHJvcGVydGllcy5lZGl0b3JTZXJ2aWNlc1Jvb3QsIHByb3BlcnRpZXMuZWRpdG9yU2VydmljZXNFeHRlbnNpb24pO1xuICAgICAgLy8gSW5zZXJ0IG1hdGhtbCBub2RlLlxuICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChyZXNwb25zZS50ZXh0KTtcblxuICAgICAgbm9kZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIG5vZGUpO1xuICAgICAgbm9kZS5ub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZS5zdWJzdHJpbmcobmV4dExhdGV4UG9zaXRpb24uc3RhcnQsIG5leHRMYXRleFBvc2l0aW9uLmVuZCk7XG5cbiAgICAgIHBvcyA9IG5leHRMYXRleFBvc2l0aW9uLmVuZCArICckJCcubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBtb3JlIExhVGVYIG5vZGUgZm91bmQuXG4gICAgICBjb25zdCB0ZXh0ID0gdGV4dENvbnRlbnQuc3Vic3RyaW5nKHBvcyk7XG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICAgICAgbm9kZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIG5vZGUpO1xuICAgICAgbm9kZS5ub2RlVmFsdWUgPSAnJztcbiAgICAgIHBvcyA9IHRleHRDb250ZW50Lmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICAvLyBEZWxldGUgb3JpZ2luYWwgdGV4dCBub2RlLlxuICBub2RlLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKG5vZGUpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBIVE1MIExhVGVYIG5vZGVzLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdCAtIEFueSBET00gZWxlbWVudCB0aGF0IGNhbiBjb250YWluIExhVGVYLlxuICogQHJldHVybnMge05vZGVbXX0gQXJyYXkgd2l0aCBhbGwgSFRNTCBMYVRlWCBub2RlcyBpbnNpZGUgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZmluZExhdGV4VGV4dE5vZGVzKHJvb3Q6IGFueSk6IE5vZGVbXSB7XG4gIGNvbnN0IG5vZGVJdGVyYXRvcjogTm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKFxuICAgIHJvb3QsXG4gICAgTm9kZUZpbHRlci5TSE9XX1RFWFQsXG4gICAgbm9kZSA9PiAvKFxcJFxcJCkoLiopKFxcJFxcJCkvLnRlc3Qobm9kZS5ub2RlVmFsdWUgfHwgJycpID8gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUIDogTm9kZUZpbHRlci5GSUxURVJfUkVKRUNUXG4gICk7XG4gIGNvbnN0IGxhdGV4Tm9kZXMgOiBOb2RlW10gPSBbXTtcblxuICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsO1xuICB3aGlsZSAoY3VycmVudE5vZGUgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkge1xuICAgIGxhdGV4Tm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gbGF0ZXhOb2Rlcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB7c3RhcnQsIGVuZH0gd2l0aCB0aGUgc3RhcnQgYW5kIGVuZCBsYXRleCBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3MgLSBDdXJyZW50IHBvc2l0aW9uIGluc2lkZSB0aGUgdGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGV4dCB3aGVyZSB0aGUgbmV4dCBsYXRleCBpdCB3aWxsIGJlIHNlYXJjaGVkLlxuICogQFxuICovXG5mdW5jdGlvbiBnZXROZXh0TGF0ZXhQb3MocG9zOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IExhdGV4UG9zaXRpb24ge1xuICBjb25zdCBmaXJzdExhdGV4VGFncyA9IHRleHQuaW5kZXhPZignJCQnLCBwb3MpO1xuICBjb25zdCBzZWNvbmRMYXRleFRhZ3MgPSBmaXJzdExhdGV4VGFncyA9PSAtMSA/IC0xIDogdGV4dC5pbmRleE9mKCckJCcsIGZpcnN0TGF0ZXhUYWdzICsgJyQkJy5sZW5ndGgpO1xuICByZXR1cm4gZmlyc3RMYXRleFRhZ3MgIT0gLTEgJiYgc2Vjb25kTGF0ZXhUYWdzICE9IC0xID8geydzdGFydCc6IGZpcnN0TGF0ZXhUYWdzLCAnZW5kJzogc2Vjb25kTGF0ZXhUYWdzfSA6IG51bGw7XG59XG4iLCJpbXBvcnQgeyBQcm9wZXJ0aWVzIH0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgc2hvd0ltYWdlLCBjcmVhdGVJbWFnZSwgbWF0aG1sMmFjY2Vzc2libGUsIHByb2Nlc3NKc29uUmVzcG9uc2UgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7IGh0bWxFbnRpdGllc1RvWG1sRW50aXRpZXMsIGNvcnJ1cHRNYXRoTUwgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEYXRhIG9idGFpbmVkIHdoZW4gcmVuZGVyaW5nIGltYWdlLiBEYXRhIG5lZWRlZCB0byBzZXQgdGhlIGZvcm11bGEgaW1hZ2UgcGFyYW1ldGVycy5cbiAqL1xuaW50ZXJmYWNlIEZvcm11bGFEYXRhIHtcbiAgY29udGVudDogc3RyaW5nLFxuICBiYXNlbGluZTogc3RyaW5nLFxuICBoZWlnaHQ6IHN0cmluZyxcbiAgd2lkdGg6IHN0cmluZyxcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgRE9NIGxvb2tpbmcgZm9yIDxtYXRoPiBlbGVtZW50cyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcmVuZGVyZWQgaW1hZ2VzIHdpdGhpbiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqIEBwYXJhbSB7UHJvcGVydGllc30gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgb2YgdGhlIHZpZXdlci5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJvb3QgLSBBbnkgRE9NIGVsZW1lbnQgdGhhdCBjYW4gY29udGFpbiBNYXRoTUwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJNYXRoTUwocHJvcGVydGllczogUHJvcGVydGllcywgcm9vdDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblxuICBpZiAocHJvcGVydGllcy52aWV3ZXIgIT09ICdpbWFnZScgJiYgcHJvcGVydGllcy52aWV3ZXIgIT09ICdtYXRobWwnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yKGNvbnN0IG1hdGhFbGVtZW50IG9mIFsuLi5yb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdtYXRoJyldKSB7XG4gICAgY29uc3QgbW1sID0gaHRtbEVudGl0aWVzVG9YbWxFbnRpdGllcyhtYXRoRWxlbWVudC5vdXRlckhUTUwpO1xuXG4gICAgbGV0IHJlc3VsdDtcblxuICAgIGlmIChwcm9wZXJ0aWVzLndpcmlzcGx1Z2lucGVyZm9ybWFuY2UgPT09ICd0cnVlJykge1xuICAgICAgLy8gVHJhbnNmb3JtIG1tbCB0byBpbWcuXG4gICAgICByZXN1bHQgPSBhd2FpdCBzaG93SW1hZ2UobW1sLCBwcm9wZXJ0aWVzLmxhbmcsIHByb3BlcnRpZXMuZWRpdG9yU2VydmljZXNSb290LCBwcm9wZXJ0aWVzLmVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY3JlYXRlaW1hZ2UgcmV0dXJucyB0aGUgVVJMIHRvIHNob3dpbWFnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBpbWFnZVxuICAgICAgbGV0IHVybCA9IGF3YWl0IGNyZWF0ZUltYWdlKG1tbCwgcHJvcGVydGllcy5sYW5nLCBwcm9wZXJ0aWVzLmVkaXRvclNlcnZpY2VzUm9vdCwgcHJvcGVydGllcy5lZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbik7XG4gICAgICAvLyBUaGlzIGxpbmUgaXMgbmVjZXNzYXJ5IGR1ZSB0byBhIGJ1ZyBpbiBob3cgdGhlIHNlcnZpY2VzIGludGVyb3BlcmF0ZS5cbiAgICAgIC8vIFRPRE8gZml4IHRoZSBjYXVzaW5nIGJ1Z1xuICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJ3BsdWdpbnNhcHAnLCAncGx1Z2lucy9hcHAnKTtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NKc29uUmVzcG9uc2UoZmV0Y2godXJsKSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGltZyBwcm9wZXJ0aWVzLlxuICAgIGNvbnN0IGltZyA9IGF3YWl0IHNldEltYWdlUHJvcGVydGllcyhwcm9wZXJ0aWVzLCByZXN1bHQsIG1tbCk7XG4gICAgLy8gY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChkYXRhLnJlc3VsdC5jb250ZW50KTtcblxuICAgIC8vIFJlcGxhY2UgdGhlIE1hdGhNTCBmb3IgdGhlIGdlbmVyYXRlZCBmb3JtdWxhIGltYWdlLlxuICAgIG1hdGhFbGVtZW50LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChpbWcsIG1hdGhFbGVtZW50KTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGltYWdlIGZvcm11bGEgY29udGFpbmluZyBhbGwgTWF0aFR5cGUgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7UHJvcGVydGllc30gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgb2YgdGhlIHZpZXdlci5cbiAqIEBwYXJhbSB7Rm9ybXVsYURhdGF9IGRhdGEgLSBPYmplY3QgY29udGFpbmluZyBpbWFnZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW1sIC0gVGhlIE1hdGhNTCBvZiB0aGUgZm9ybXVsYSBpbWFnZSBiZWVpbmcgY3JlYXRlZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+fSAtIEZvcm11bGEgaW1hZ2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldEltYWdlUHJvcGVydGllcyhwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzLCBkYXRhOiBGb3JtdWxhRGF0YSwgbW1sOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcblxuICAvLyBDcmVhdGUgaW1hZyBlbGVtZW50LlxuICBsZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG5cbiAgLy8gU2V0IGltYWdlIHNyYy4gRW5jb2RlIHRoZSByZXN1bHQgc3ZnLlxuICBpbWcuc3JjID0gYGRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsJHtlbmNvZGVVUklDb21wb25lbnQoZGF0YS5jb250ZW50KX1gO1xuXG4gIC8vIFNldCBvdGhlciBpbWFnZSBwcm9wZXJ0aWVzLlxuICBpbWcuc2V0QXR0cmlidXRlKHByb3BlcnRpZXMud2lyaXNlZGl0b3JtYXRobWxhdHRyaWJ1dGUsIG1tbCk7XG4gIGltZy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ1dpcmlzZm9ybXVsYScpO1xuICBpbWcuc2V0QXR0cmlidXRlKCdyb2xlJywgJ21hdGgnKTtcblxuICAvLyBJZiB0aGUgcmVuZGVyIHJldHVybnMgZGltZW5zaW9ucyBwcm9wZXJ0aWVzLCBzZXQgdGhlbSB0byB0aGUgaW1hZ2UuXG4gIGlmICgrZGF0YS5oZWlnaHQgPiAwKSB7XG4gICAgaW1nLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBcIi1cIiArICgrZGF0YS5oZWlnaHQgLSArZGF0YS5iYXNlbGluZSkgKyBcInB4XCI7XG4gICAgaW1nLmhlaWdodCA9ICtkYXRhLmhlaWdodDtcbiAgICBpbWcud2lkdGggPSArZGF0YS53aWR0aDtcbiAgfVxuXG4gIC8vIFNldCB0aGUgYWx0IHRleHQgd2hlbmV2ZXIgdGhlcmUncyBhIHRyYW5zbGF0aW9uIGZvciB0aGUgY2hhcmFjdGVycyBhbmQgTWF0aE1MIG9uIHRoZSBtbWwuXG4gIGlmICghY29ycnVwdE1hdGhNTC5zb21lKGNvcnJ1cHRNYXRoTUwgPT4gbW1sLmluY2x1ZGVzKGNvcnJ1cHRNYXRoTUwpKSkge1xuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgbWF0aG1sMmFjY2Vzc2libGUobW1sLCBwcm9wZXJ0aWVzLmxhbmcsIHByb3BlcnRpZXMuZWRpdG9yU2VydmljZXNSb290LCBwcm9wZXJ0aWVzLmVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uKTtcbiAgICBpbWcuYWx0ID0gdGV4dDtcbiAgfVxuXG4gIHJldHVybiBpbWc7XG5cbn1cbiIsImltcG9ydCB7IGNvbmZpZ3VyYXRpb25Kc29uLCBTdGF0dXNFcnJvciB9IGZyb20gJy4vc2VydmljZXMnO1xuXG4vLyBIZWxwZXIgdHlwZXMgZm9yIENvbmZpZyBiZWxvd1xudHlwZSBWaWV3ZXIgPSAnbm9uZScgfCAnaW1hZ2UnIHwgJ21hdGhtbCcgfCAnbGF0ZXgnO1xudHlwZSBXaXJpc3BsdWdpbnBlcmZvcm1hbmNlID0gJ3RydWUnIHwgJ2ZhbHNlJztcblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2aWV3ZXIuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZyA9IHtcbiAgZWRpdG9yU2VydmljZXNSb290Pzogc3RyaW5nLFxuICBlZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbj86IHN0cmluZyxcbiAgYmFja2VuZENvbmZpZz86IHtcbiAgICB3aXJpc3BsdWdpbnBlcmZvcm1hbmNlPzogV2lyaXNwbHVnaW5wZXJmb3JtYW5jZSxcbiAgICB3aXJpc2VkaXRvcm1hdGhtbGF0dHJpYnV0ZT86IHN0cmluZyxcbiAgfSxcbiAgZHBpPzogbnVtYmVyLFxuICBlbGVtZW50Pzogc3RyaW5nLFxuICBsYW5nPzogc3RyaW5nLFxuICB2aWV3ZXI/OiBWaWV3ZXIsXG4gIHpvb20/OiBudW1iZXIsXG59O1xuXG4vKipcbiAqIEZhbGxiYWNrIHZhbHVlcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIG5vdCBzZXQuXG4gKi9cbmNvbnN0IGRlZmF1bHRWYWx1ZXM6IENvbmZpZyA9IHtcbiAgZWRpdG9yU2VydmljZXNSb290OiAnaHR0cHM6Ly93d3cud2lyaXMubmV0L2RlbW8vcGx1Z2lucy9hcHAvJyxcbiAgZWRpdG9yU2VydmljZXNFeHRlbnNpb246ICcnLFxuICBiYWNrZW5kQ29uZmlnOiB7XG4gICAgd2lyaXNwbHVnaW5wZXJmb3JtYW5jZTogJ3RydWUnLFxuICAgIHdpcmlzZWRpdG9ybWF0aG1sYXR0cmlidXRlOiAnZGF0YS1tYXRobWwnXG4gIH0sXG4gIGRwaTogOTYsXG4gIGVsZW1lbnQ6ICdib2R5JyxcbiAgbGFuZzogJ2VuJyxcbiAgdmlld2VyOiAnbm9uZScsXG4gIHpvb206IDEsXG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyB3aWxsIGhhbmRsZSB0aGUgcGFyYW1ldGVycyBkZWZpbmVkIGJ5IHRoZSB1c2VyLlxuICovXG5leHBvcnQgY2xhc3MgUHJvcGVydGllcyB7XG5cbiAgcmVuZGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gYXN5bmMgKCkgPT4ge307XG5cbiAgLy8gR2V0IFVSTCBwcm9wZXJ0aWVzIChyZXRyb2NvbXBhdGliaWxpdHkpLlxuICBjb25maWc6IENvbmZpZyA9IGRlZmF1bHRWYWx1ZXM7XG5cbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgdGhpcyBtZXRob2QuIEluc3RlYWQsIHVzZSB7QGxpbmsgUHJvcGVydGllcy5nZW5lcmF0ZX0uXG4gICAqIENvbnN0cnVjdG9ycyBjYW5ub3QgYmUgYXN5bmMgc28gd2UgbWFrZSBpdCBwcml2YXRlIGFuZCBmb3JjZSBpbnN0YW50aWF0aW9uIHRocm91Z2ggYW4gYWx0ZXJuYXRpdmUgc3RhdGljIG1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgbmV3KCkge31cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgc2V0cyB1cCBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyBQcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGUoKTogUHJvbWlzZTxQcm9wZXJ0aWVzPiB7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBQcm9wZXJ0aWVzKCk7XG5cbiAgICAvLyBHZXQgVVJMIHBhcmFtZXRlcnMgZnJvbSA8c2NyaXB0PlxuICAgIGNvbnN0IHBsdWdpbk5hbWUgPSAnV0lSSVNwbHVnaW5zLmpzJztcbiAgICBjb25zdCBzY3JpcHQ6IEhUTUxTY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYyo9XCIke3BsdWdpbk5hbWV9XCJdYCk7XG5cbiAgICBpZiAoISFzY3JpcHQpIHtcblxuICAgICAgY29uc3QgcGx1Z2luTmFtZVBvc2l0aW9uOiBudW1iZXIgPSBzY3JpcHQuc3JjLmxhc3RJbmRleE9mKHBsdWdpbk5hbWUpO1xuICAgICAgY29uc3QgcGFyYW1zOiBzdHJpbmcgPSBzY3JpcHQuc3JjLnN1YnN0cmluZyhwbHVnaW5OYW1lUG9zaXRpb24gKyBwbHVnaW5OYW1lLmxlbmd0aCk7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcyk7XG5cbiAgICAgIGlmICh1cmxQYXJhbXMuZ2V0KCdkcGknKSAhPT0gbnVsbCAmJiB1cmxQYXJhbXMuZ2V0KCdkcGknKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbmZpZy5kcGkgPSArdXJsUGFyYW1zLmdldCgnZHBpJyk7XG4gICAgICB9XG4gICAgICBpZiAodXJsUGFyYW1zLmdldCgnZWxlbWVudCcpICE9PSBudWxsICYmIHVybFBhcmFtcy5nZXQoJ2VsZW1lbnQnKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbmZpZy5lbGVtZW50ID0gdXJsUGFyYW1zLmdldCgnZWxlbWVudCcpO1xuICAgICAgfVxuICAgICAgaWYgKHVybFBhcmFtcy5nZXQoJ2xhbmcnKSAhPT0gbnVsbCAmJiB1cmxQYXJhbXMuZ2V0KCdsYW5nJykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnN0YW5jZS5jb25maWcubGFuZyA9IHVybFBhcmFtcy5nZXQoJ2xhbmcnKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cmxQYXJhbXMuZ2V0KCd2aWV3ZXInKSAhPT0gbnVsbCAmJiB1cmxQYXJhbXMuZ2V0KCd2aWV3ZXInKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbmZpZy52aWV3ZXIgPSAodXJsUGFyYW1zLmdldCgndmlld2VyJykgYXMgVmlld2VyKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cmxQYXJhbXMuZ2V0KCd6b29tJykgIT09IG51bGwgJiYgdXJsUGFyYW1zLmdldCgnem9vbScpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5zdGFuY2UuY29uZmlnLnpvb20gPSArdXJsUGFyYW1zLmdldCgnem9vbScpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gR2V0IGJhY2tlbmQgcGFyYW1ldGVycyBjYWxsaW5nIHRoZSBjb25maWd1cmF0aW9uanNvbiBzZXJ2aWNlXG4gICAgdHJ5IHtcbiAgICAgIGluc3RhbmNlLmNvbmZpZy5iYWNrZW5kQ29uZmlnID0gYXdhaXQgY29uZmlndXJhdGlvbkpzb24oXG4gICAgICAgIFsnd2lyaXNwbHVnaW5wZXJmb3JtYW5jZScsICd3aXJpc2VkaXRvcm1hdGhtbGF0dHJpYnV0ZSddLFxuICAgICAgICBpbnN0YW5jZS5lZGl0b3JTZXJ2aWNlc1Jvb3QsXG4gICAgICAgIGluc3RhbmNlLmVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uLFxuICAgICAgKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RhdHVzRXJyb3IpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZzsgbGVhdmUgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIGdldCBlZGl0b3JTZXJ2aWNlc1Jvb3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZWRpdG9yU2VydmljZXNSb290IHx8XG4gICAgICBkZWZhdWx0VmFsdWVzLmVkaXRvclNlcnZpY2VzUm9vdDtcbiAgfVxuXG4gIHNldCBlZGl0b3JTZXJ2aWNlc1Jvb3QoZWRpdG9yU2VydmljZXNSb290OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZy5lZGl0b3JTZXJ2aWNlc1Jvb3QgPSBlZGl0b3JTZXJ2aWNlc1Jvb3Q7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldCBlZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5lZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbiB8fFxuICAgICAgZGVmYXVsdFZhbHVlcy5lZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbjtcbiAgfVxuXG4gIHNldCBlZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbihlZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWcuZWRpdG9yU2VydmljZXNFeHRlbnNpb24gPSBlZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbjtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbGFuZ3VhZ2UuXG4gICAqIEluIG9yZGVyIG9mIHByaW9yaXR5LCB0aGUgZmlyc3Qgb2YgdGhlIGZvbGxvd2luZyB0aGF0IGlzIHNldCBpcyByZXR1cm5lZDpcbiAgICogLSBUaGUgbGFuZyBwYXJhbWV0ZXIgc2V0IGluIHRoZSA8c2NyaXB0PiAoV0lSSVNwbHVnaW4uanM/bGFuZz0uLi4pXG4gICAqIC0gVGhlIEhUTUwgZG9jdW1lbnQgbGFuZ3VhZ2UgKDxodG1sIGxhbmc9Li4uPikuXG4gICAqIC0gVGhlIGxhbmd1YWdlIG9mIHRoZSBicm93c2VyLlxuICAgKiAtIEVuZ2xpc2gsIGJ5IGRlZmF1bHQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEVuY29kZWQgbGFuZ3VhZ2Ugc3RyaW5nLlxuICAgKi9cbiAgZ2V0IGxhbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb25maWdMYW5nID0gKHRoaXMuY29uZmlnLmxhbmcgPT09ICdpbmhlcml0JykgPyBudWxsIDogdGhpcy5jb25maWcubGFuZztcbiAgICByZXR1cm4gY29uZmlnTGFuZyB8fFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5sYW5nIHx8XG4gICAgICBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHxcbiAgICAgIGRlZmF1bHRWYWx1ZXMubGFuZztcbiAgfVxuXG4gIHNldCBsYW5nKGxhbmc6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlnLmxhbmcgPSBsYW5nO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB2aWV3ZXIgbW9kZSBmb3IgdGhlIE1hdGhNTC5cbiAgICogSW4gb3JkZXIgb2YgcHJpb3JpdHksIHRoZSBmaXJzdCBvZiB0aGUgZm9sbG93aW5nIHRoYXQgaXMgc2V0IGlzIHJldHVybmVkOlxuICAgKiAtIFRoZSB2aWV3ZXIgcGFyYW1ldGVyIHNldCBpbiB0aGUgPHNjcmlwdD4gKFdJUklTcGx1Z2luLmpzP3ZpZXdlcj0uLi4pXG4gICAqIC0gbm9uZSwgYnkgZGVmYXVsdC5cbiAgICovXG4gIGdldCB2aWV3ZXIoKTogVmlld2VyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudmlld2VyIHx8XG4gICAgICBkZWZhdWx0VmFsdWVzLnZpZXdlcjtcbiAgfVxuXG4gIHNldCB2aWV3ZXIodmlld2VyOiBWaWV3ZXIpIHtcbiAgICB0aGlzLmNvbmZpZy52aWV3ZXIgPSB2aWV3ZXI7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRwaSBvZiB0aGUgaW1hZ2VzLlxuICAgKiBJbiBvcmRlciBvZiBwcmlvcml0eSwgdGhlIGZpcnN0IG9mIHRoZSBmb2xsb3dpbmcgdGhhdCBpcyBzZXQgaXMgcmV0dXJuZWQ6XG4gICAqIC0gVGhlIGRwaSBwYXJhbWV0ZXIgc2V0IGluIHRoZSA8c2NyaXB0PiAoV0lSSVNwbHVnaW4uanM/ZHBpPS4uLilcbiAgICogLSA5NiwgYnkgZGVmYXVsdC5cbiAgICovXG4gIGdldCBkcGkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZHBpIHx8XG4gICAgICBkZWZhdWx0VmFsdWVzLmRwaTtcbiAgfVxuXG4gIHNldCBkcGkoZHBpOiBudW1iZXIpIHtcbiAgICB0aGlzLmNvbmZpZy5kcGkgPSBkcGk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHpvb20gb2YgdGhlIGltYWdlcy5cbiAgICogSW4gb3JkZXIgb2YgcHJpb3JpdHksIHRoZSBmaXJzdCBvZiB0aGUgZm9sbG93aW5nIHRoYXQgaXMgc2V0IGlzIHJldHVybmVkOlxuICAgKiAtIFRoZSB6b29tIHBhcmFtZXRlciBzZXQgaW4gdGhlIDxzY3JpcHQ+IChXSVJJU3BsdWdpbi5qcz96b29tPS4uLilcbiAgICogLSAxLCBieSBkZWZhdWx0LlxuICAgKi9cbiAgZ2V0IHpvb20oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuem9vbSB8fFxuICAgICAgZGVmYXVsdFZhbHVlcy56b29tO1xuICB9XG5cbiAgc2V0IHpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgdGhpcy5jb25maWcuem9vbSA9IHpvb207XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgaW4gd2hpY2ggdG8gcmVuZGVyIGZvcm11bGFzLlxuICAgKiBJbiBvcmRlciBvZiBwcmlvcml0eSwgdGhlIGZpcnN0IG9mIHRoZSBmb2xsb3dpbmcgdGhhdCBpcyBzZXQgaXMgcmV0dXJuZWQ6XG4gICAqIC0gVGhlIHpvb20gcGFyYW1ldGVyIHNldCBpbiB0aGUgPHNjcmlwdD4gKFdJUklTcGx1Z2luLmpzP2VsZW1lbnQ9Li4uKVxuICAgKiAtICdib2R5JywgYnkgZGVmYXVsdC5cbiAgICovXG4gIGdldCBlbGVtZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmVsZW1lbnQgfHxcbiAgICAgIGRlZmF1bHRWYWx1ZXMuZWxlbWVudDtcbiAgfVxuXG4gIHNldCBlbGVtZW50KGVsZW1lbnQ6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlnLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBXaXJpcyBwbHVnaW4gcGVyZm9ybWFuY2UuXG4gICAqIEluIG9yZGVyIG9mIHByaW9yaXR5LCB0aGUgZmlyc3Qgb2YgdGhlIGZvbGxvd2luZyB0aGF0IGlzIHNldCBpcyByZXR1cm5lZDpcbiAgICogLSBUaGUgYmFja2VuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIuXG4gICAqIC0gdHJ1ZSwgYnkgZGVmYXVsdC5cbiAgICovXG4gIGdldCB3aXJpc3BsdWdpbnBlcmZvcm1hbmNlKCk6IFdpcmlzcGx1Z2lucGVyZm9ybWFuY2Uge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5iYWNrZW5kQ29uZmlnLndpcmlzcGx1Z2lucGVyZm9ybWFuY2UgfHxcbiAgICAgIGRlZmF1bHRWYWx1ZXMuYmFja2VuZENvbmZpZy53aXJpc3BsdWdpbnBlcmZvcm1hbmNlO1xuICB9XG5cbiAgc2V0IHdpcmlzcGx1Z2lucGVyZm9ybWFuY2Uod2lyaXNwbHVnaW5wZXJmb3JtYW5jZTogV2lyaXNwbHVnaW5wZXJmb3JtYW5jZSkge1xuICAgIHRoaXMuY29uZmlnLmJhY2tlbmRDb25maWcud2lyaXNwbHVnaW5wZXJmb3JtYW5jZSA9IHdpcmlzcGx1Z2lucGVyZm9ybWFuY2U7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFdpcmlzIE1hdGhNTCBhdHRyaWJ1dGUuXG4gICAqIEluIG9yZGVyIG9mIHByaW9yaXR5LCB0aGUgZmlyc3Qgb2YgdGhlIGZvbGxvd2luZyB0aGF0IGlzIHNldCBpcyByZXR1cm5lZDpcbiAgICogLSBUaGUgYmFja2VuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIuXG4gICAqIC0gZGF0YS1tYXRobWwsIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBnZXQgd2lyaXNlZGl0b3JtYXRobWxhdHRyaWJ1dGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYmFja2VuZENvbmZpZy53aXJpc2VkaXRvcm1hdGhtbGF0dHJpYnV0ZSB8fFxuICAgICAgZGVmYXVsdFZhbHVlcy5iYWNrZW5kQ29uZmlnLndpcmlzZWRpdG9ybWF0aG1sYXR0cmlidXRlO1xuICB9XG5cbiAgc2V0IHdpcmlzZWRpdG9ybWF0aG1sYXR0cmlidXRlKHdpcmlzZWRpdG9ybWF0aG1sYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZy5iYWNrZW5kQ29uZmlnLndpcmlzZWRpdG9ybWF0aG1sYXR0cmlidXRlID0gd2lyaXNlZGl0b3JtYXRobWxhdHRyaWJ1dGU7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgcmVuZGVyTGF0ZXggfSBmcm9tIFwiLi9sYXRleFwiO1xuaW1wb3J0IHsgcmVuZGVyTWF0aE1MIH0gZnJvbSBcIi4vbWF0aG1sXCI7XG5pbXBvcnQgeyBQcm9wZXJ0aWVzIH0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xuXG4vKipcbiAqIEV4cG9zZXMgdGhlIHtAbGluayBKc1BsdWdpblZpZXdlcn0gc2luZ2xldG9uIGluc3RhbmNlIGFzIHdpbmRvdy5jb20ud2lyaXMuanMuSnNQbHVnaW5WaWV3ZXIuXG4gKiBAcGFyYW0ge1Byb3BlcnRpZXN9IHByb3BlcnRpZXMgLSBQcm9wZXJ0aWVzIG9mIHRoZSB2aWV3ZXIuXG4gKiBAcGFyYW0ge1dpbmRvd30gdyAtIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgd2luZG93LlxuICogQGRlcHJlY2F0ZWQgQ29uc2lkZXIgdXNpbmcge0BsaW5rIHJlbmRlckxhdGV4fSBvciB7QGxpbmsgcmVuZGVyTWF0aE1MfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5cGFzc0VuY2Fwc3VsYXRpb24ocHJvcGVydGllczogUHJvcGVydGllcywgdzogV2luZG93KSB7XG4gIGNvbnN0IHdhbnkgPSB3IGFzIGFueTtcblxuICBpZiAodHlwZW9mIHdhbnkuY29tID09PSAndW5kZWZpbmVkJykge1xuICAgIHdhbnkuY29tID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIHdhbnkuY29tLndpcmlzID09PSAndW5kZWZpbmVkJykge1xuICAgIHdhbnkuY29tLndpcmlzID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIHdhbnkuY29tLndpcmlzLmpzID09PSAndW5kZWZpbmVkJykge1xuICAgIHdhbnkuY29tLndpcmlzLmpzID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIHdhbnkuY29tLndpcmlzLmpzLkpzUGx1Z2luVmlld2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIHdhbnkuY29tLndpcmlzLmpzLkpzUGx1Z2luVmlld2VyID0gSnNQbHVnaW5WaWV3ZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBKc1BsdWdpblZpZXdlci5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYSBjb21wYXRpYmlsaXR5IGxheWVyIHdpdGggdGhlIG9sZCBWaWV3ZXIuXG4gKiBTZWUgaGF4ZS9zcmMtaGF4ZS9jb20vd2lyaXMvanMvSnNQbHVnaW5WaWV3ZXIuaHggaW4gaW4gdGhlIHJlcG8gd2lyaXMvcGx1Z2lucyBwcmV2aW91cyB0byBjb21taXQgZGYxMjQ4YS5cbiAqXG4gKiBXQVJOSU5HOiB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIG1heSBjb250YWluIGRpcmVjdCByZWZlcmVuY2VzIHRvIGdsb2JhbHMgc3VjaCBhcyB3aW5kb3cgYW5kIGRvY3VtZW50LlxuICpcbiAqIEBkZXByZWNhdGVkIENvbnNpZGVyIHVzaW5nIHtAbGluayByZW5kZXJMYXRleH0gb3Ige0BsaW5rIHJlbmRlck1hdGhNTH0uXG4gKi9cbmNsYXNzIEpzUGx1Z2luVmlld2VyIHtcbiAgc3RhdGljIGluc3RhbmNlOiBKc1BsdWdpblZpZXdlcjtcbiAgc3RhdGljIHByb3BlcnRpZXM6IFByb3BlcnRpZXM7XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IEpzUGx1Z2luVmlld2VyIHtcbiAgICBpZiAoSnNQbHVnaW5WaWV3ZXIuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgSnNQbHVnaW5WaWV3ZXIuaW5zdGFuY2UgPSBuZXcgSnNQbHVnaW5WaWV3ZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gSnNQbHVnaW5WaWV3ZXIuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGFsbCB0aGUgZm9ybXVsYXMgd3JpdHRlbiBpbiBTYWZlTWF0aE1MIGluc2lkZSB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgd2hlcmVpbiB0byByZW5kZXIgU2FmZU1hdGhNTCBmb3JtdWxhcy5cbiAgICogQHBhcmFtIGFzeW5jaHJvbm91c2x5IC0gQ3VycmVudGx5IGlnbm9yZWQsIG9ubHkgaW5jbHVkZWQgZm9yIHJldHJvY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrRnVuYyAtIEN1cnJlbnRseSBpZ25vcmVkLCBvbmx5IGluY2x1ZGVkIGZvciByZXRyb2NvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAqIEBkZXByZWNhdGVkIFRoZXJlIGlzIGN1cnJlbnRseSBubyByZXBsYWNlbWVudCBmb3IgcmVuZGVyaW5nIFNhZmVNYXRoTUwgZm9ybXVsYXMuXG4gICAqIFBsZWFzZSBjb25zaWRlciB1c2luZyB7QGxpbmsgcmVuZGVyTGF0ZXh9IG9yIHtAbGluayByZW5kZXJNYXRoTUx9LlxuICAgKi9cbiAgcGFyc2VTYWZlTWF0aE1MRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgYXN5bmNocm9ub3VzbHk/OiBib29sZWFuLCBjYWxsYmFja0Z1bmM/OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdmFyIG1hdGhtbFBvc2l0aW9ucyA9IFtdO1xuICAgIEpzUGx1Z2luVmlld2VyLmdldE1hdGhNTFBvc2l0aW9uc0F0RWxlbWVudEFuZENoaWxkcmVuKGVsZW1lbnQsIG1hdGhtbFBvc2l0aW9ucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRobWxQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtYXRobWxQb3NpdGlvbiA9IG1hdGhtbFBvc2l0aW9uc1tpXTtcbiAgICAgIHZhciBuZXdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm1hdGhcIik7XG4gICAgICBtYXRobWxQb3NpdGlvbi5uZXh0RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCBtYXRobWxQb3NpdGlvbi5uZXh0RWxlbWVudCk7XG4gICAgICBuZXdOb2RlLm91dGVySFRNTCA9IEpzUGx1Z2luVmlld2VyLmRlY29kZVNhZmVNYXRoTUwobWF0aG1sUG9zaXRpb24uc2FmZU1NTCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhbGwgdGhlIGZvcm11bGFzIGluIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIGFzeW5jaHJvbm91c2x5IC0gQ3VycmVudGx5IGlnbm9yZWQsIG9ubHkgaW5jbHVkZWQgZm9yIHJldHJvY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrRnVuYyAtIEN1cnJlbnRseSBpZ25vcmVkLCBvbmx5IGluY2x1ZGVkIGZvciByZXRyb2NvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAqIEBwYXJhbSBzYWZlWG1sIC0gQ3VycmVudGx5IGlnbm9yZWQsIG9ubHkgaW5jbHVkZWQgZm9yIHJldHJvY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNvbnNpZGVyIHVzaW5nIHtAbGluayByZW5kZXJNYXRoTUx9LlxuICAgKi9cbiAgYXN5bmMgcGFyc2VEb2N1bWVudChhc3luY2hyb25vdXNseT86IGJvb2xlYW4sIGNhbGxiYWNrRnVuYz86ICgpID0+IHZvaWQsIHNhZmVYbWw/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHJlbmRlck1hdGhNTChKc1BsdWdpblZpZXdlci5wcm9wZXJ0aWVzLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhbGwgdGhlIGZvcm11bGFzIGluc2lkZSB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgd2hlcmVpbiB0byByZW5kZXIgZm9ybXVsYXMuXG4gICAqIEBwYXJhbSBhc3luY2hyb25vdXNseSAtIEN1cnJlbnRseSBpZ25vcmVkLCBvbmx5IGluY2x1ZGVkIGZvciByZXRyb2NvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFja0Z1bmMgLSBDdXJyZW50bHkgaWdub3JlZCwgb25seSBpbmNsdWRlZCBmb3IgcmV0cm9jb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgY29uc2lkZXIgdXNpbmcge0BsaW5rIHJlbmRlck1hdGhNTH0uXG4gICAqL1xuICBhc3luYyBwYXJzZUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGFzeW5jaHJvbm91c2x5PzogYm9vbGVhbiwgY2FsbGJhY2tGdW5jPzogKCkgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiByZW5kZXJNYXRoTUwoSnNQbHVnaW5WaWV3ZXIucHJvcGVydGllcywgZWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhbGwgdGhlIExhVGVYIGZvcm11bGFzIGluIHRoZSBkb2N1bWVudCB0byBNYXRoTUwuXG4gICAqIEBwYXJhbSBhc3luY2hyb25vdXNseSAtIEN1cnJlbnRseSBpZ25vcmVkLCBvbmx5IGluY2x1ZGVkIGZvciByZXRyb2NvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFja0Z1bmMgLSBDdXJyZW50bHkgaWdub3JlZCwgb25seSBpbmNsdWRlZCBmb3IgcmV0cm9jb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgY29uc2lkZXIgdXNpbmcge0BsaW5rIHJlbmRlckxhdGV4fS5cbiAgICovXG4gIGFzeW5jIHBhcnNlTGF0ZXhEb2N1bWVudChhc3luY2hyb25vdXNseT86IGJvb2xlYW4sIGNhbGxiYWNrRnVuYz86ICgpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gcmVuZGVyTGF0ZXgoSnNQbHVnaW5WaWV3ZXIucHJvcGVydGllcywgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGFsbCB0aGUgTGFUZVggZm9ybXVsYXMgaW5zaWRlIHRoZSBnaXZlbiBlbGVtZW50IHRvIE1hdGhNTC5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgd2hlcmVpbiB0byBjb252ZXJ0IGZvcm11bGFzLlxuICAgKiBAcGFyYW0gYXN5bmNocm9ub3VzbHkgLSBDdXJyZW50bHkgaWdub3JlZCwgb25seSBpbmNsdWRlZCBmb3IgcmV0cm9jb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tGdW5jIC0gQ3VycmVudGx5IGlnbm9yZWQsIG9ubHkgaW5jbHVkZWQgZm9yIHJldHJvY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNvbnNpZGVyIHVzaW5nIHtAbGluayByZW5kZXJMYXRleH0uXG4gICAqL1xuICBhc3luYyBwYXJzZUxhdGV4RWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgYXN5bmNocm9ub3VzbHk/OiBib29sZWFuLCBjYWxsYmFja0Z1bmM/OiAoKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHJlbmRlckxhdGV4KEpzUGx1Z2luVmlld2VyLnByb3BlcnRpZXMsIGVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlU2FmZU1hdGhNTChpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgc2FmZVhNTENoYXJhY3RlcnNFbnRpdGllcyA9IEpzQ2hhcmFjdGVycy5nZXRTYWZlWE1MQ2hhcmFjdGVyc0VudGl0aWVzKCk7XG4gICAgdmFyIHhtbENoYXJhY3RlcnMgPSBKc0NoYXJhY3RlcnMuZ2V0WE1MQ2hhcmFjdGVycygpO1xuICAgIHZhciBzYWZlWE1MQ2hhcmFjdGVycyA9IEpzQ2hhcmFjdGVycy5nZXRTYWZlWE1MQ2hhcmFjdGVycygpO1xuXG4gICAgdmFyIHRhZ09wZW5lckVudGl0eSA9IHNhZmVYTUxDaGFyYWN0ZXJzRW50aXRpZXMudGFnT3BlbmVyO1xuICAgIHZhciB0YWdDbG9zZXJFbnRpdHkgPSBzYWZlWE1MQ2hhcmFjdGVyc0VudGl0aWVzLnRhZ0Nsb3NlcjtcbiAgICB2YXIgZG91YmxlUXVvdGVFbnRpdHkgPSBzYWZlWE1MQ2hhcmFjdGVyc0VudGl0aWVzLmRvdWJsZVF1b3RlO1xuICAgIHZhciByZWFsRG91YmxlUXVvdGVFbnRpdHkgPSBzYWZlWE1MQ2hhcmFjdGVyc0VudGl0aWVzLnJlYWxEb3VibGVRdW90ZTtcblxuXG4gICAgLy8gSW1wb3J0YW50IHRvIG5vdCBjaGFuZ2UgZnVuY3Rpb24gcGFyYW1ldGVyLlxuICAgIHZhciBpbnB1dENvcHkgPSBpbnB1dC5zbGljZSgpO1xuXG4gICAgLy8gRGVjb2RpbmcgZW50aXRpZXMuXG4gICAgaW5wdXRDb3B5ID0gaW5wdXRDb3B5LnNwbGl0KHRhZ09wZW5lckVudGl0eSkuam9pbihzYWZlWE1MQ2hhcmFjdGVycy50YWdPcGVuZXIpO1xuICAgIGlucHV0Q29weSA9IGlucHV0Q29weS5zcGxpdCh0YWdDbG9zZXJFbnRpdHkpLmpvaW4oc2FmZVhNTENoYXJhY3RlcnMudGFnQ2xvc2VyKTtcbiAgICBpbnB1dENvcHkgPSBpbnB1dENvcHkuc3BsaXQoZG91YmxlUXVvdGVFbnRpdHkpLmpvaW4oc2FmZVhNTENoYXJhY3RlcnMuZG91YmxlUXVvdGUpO1xuICAgIGlucHV0Q29weSA9IGlucHV0Q29weS5zcGxpdChyZWFsRG91YmxlUXVvdGVFbnRpdHkpLmpvaW4oc2FmZVhNTENoYXJhY3RlcnMucmVhbERvdWJsZVF1b3RlKTtcblxuICAgIHZhciB0YWdPcGVuZXIgPSBzYWZlWE1MQ2hhcmFjdGVycy50YWdPcGVuZXI7XG4gICAgdmFyIHRhZ0Nsb3NlciA9IHNhZmVYTUxDaGFyYWN0ZXJzLnRhZ0Nsb3NlcjtcbiAgICB2YXIgZG91YmxlUXVvdGUgPSBzYWZlWE1MQ2hhcmFjdGVycy5kb3VibGVRdW90ZTtcbiAgICB2YXIgcmVhbERvdWJsZVF1b3RlID0gc2FmZVhNTENoYXJhY3RlcnMucmVhbERvdWJsZVF1b3RlO1xuICAgIHZhciBhbXBlcnNhbmQgPSBzYWZlWE1MQ2hhcmFjdGVycy5hbXBlcnNhbmQ7XG4gICAgdmFyIHF1b3RlID0gc2FmZVhNTENoYXJhY3RlcnMucXVvdGU7XG5cbiAgICAvLyBEZWNvZGluZyBjaGFyYWN0ZXJzLlxuICAgIGlucHV0Q29weSA9IGlucHV0Q29weS5zcGxpdCh0YWdPcGVuZXIpLmpvaW4oeG1sQ2hhcmFjdGVycy50YWdPcGVuZXIpO1xuICAgIGlucHV0Q29weSA9IGlucHV0Q29weS5zcGxpdCh0YWdDbG9zZXIpLmpvaW4oeG1sQ2hhcmFjdGVycy50YWdDbG9zZXIpO1xuICAgIGlucHV0Q29weSA9IGlucHV0Q29weS5zcGxpdChkb3VibGVRdW90ZSkuam9pbih4bWxDaGFyYWN0ZXJzLmRvdWJsZVF1b3RlKTtcbiAgICBpbnB1dENvcHkgPSBpbnB1dENvcHkuc3BsaXQoYW1wZXJzYW5kKS5qb2luKHhtbENoYXJhY3RlcnMuYW1wZXJzYW5kKTtcbiAgICBpbnB1dENvcHkgPSBpbnB1dENvcHkuc3BsaXQocXVvdGUpLmpvaW4oeG1sQ2hhcmFjdGVycy5xdW90ZSk7XG5cbiAgICAvLyBXZSBhcmUgcmVwbGFjaW5nICQgYnkgJiB3aGVuIGl0cyBwYXJ0IG9mIGFuIGVudGl0eSBmb3IgcmV0cm9jb21wYXRpYmlsaXR5LlxuICAgIC8vIE5vdywgdGhlIHN0YW5kYXJkIGlzIHJlcGxhY2UgwqcgYnkgJi5cbiAgICB2YXIgcmV0dXJuVmFsdWUgPSAnJztcbiAgICB2YXIgY3VycmVudEVudGl0eSA9IG51bGw7XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBpbnB1dENvcHkubGVuZ3RoKSB7XG4gICAgICB2YXIgY2hhcmFjdGVyID0gaW5wdXRDb3B5LmNoYXJBdChpKTtcbiAgICAgIGlmIChjdXJyZW50RW50aXR5ID09IG51bGwpIHtcbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PSAnJCcpIHtcbiAgICAgICAgICBjdXJyZW50RW50aXR5ID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuVmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PSAnOycpIHtcbiAgICAgICAgcmV0dXJuVmFsdWUgKz0gJyYnICsgY3VycmVudEVudGl0eTtcbiAgICAgICAgY3VycmVudEVudGl0eSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3Rlci5tYXRjaCgvKFthLXpBLVowLTkjLl8tXSB8ICctJykvKSkgeyAvLyBDaGFyYWN0ZXIgaXMgcGFydCBvZiBhbiBlbnRpdHkuXG4gICAgICAgIGN1cnJlbnRFbnRpdHkgKz0gY2hhcmFjdGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuVmFsdWUgKz0gJyQnICsgJ2N1cnJlbnRFbnRpdHknOyAvLyBJcyBub3QgYW4gZW50aXR5LlxuICAgICAgICBjdXJyZW50RW50aXR5ID0gbnVsbDtcbiAgICAgICAgaSAtPSAxOyAvLyBQYXJzZSBhZ2FpbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIuXG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWF0aE1MUG9zaXRpb25zQXRFbGVtZW50QW5kQ2hpbGRyZW4oZWxlbWVudDogTm9kZSwgbWF0aG1sUG9zaXRpb25zKSB7XG4gICAgSnNQbHVnaW5WaWV3ZXIuZ2V0TWF0aE1MUG9zaXRpb25zQXROb2RlKGVsZW1lbnQsIG1hdGhtbFBvc2l0aW9ucyk7XG4gICAgLy8gQ29weSBjdXJyZW50IGNoaWxkcmVuIGJlY2F1c2UgRE9NIHdpbGwgYmUgY2hhbmdlZCBhbmQgZWxlbWVudC5jaGlsZE5vZGVzIHdvbid0IGJlXG4gICAgLy8gY29uc2lzdGVudCBvbiBjYWxsIGdldE1hdGhNTFBvc2l0aW9uc0F0RWxlbWVudEFuZENoaWxkcmVuKCkuXG4gICAgdmFyIGNoaWxkTm9kZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG4gICAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XG4gICAgICAgIEpzUGx1Z2luVmlld2VyLmdldE1hdGhNTFBvc2l0aW9uc0F0RWxlbWVudEFuZENoaWxkcmVuKGNoaWxkLCBtYXRobWxQb3NpdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE1hdGhNTFBvc2l0aW9uc0F0Tm9kZShub2RlOiBOb2RlLCBtYXRobWxQb3NpdGlvbnMpIHtcbiAgICB2YXIgc2FmZVhNTENoYXJhY3RlcnMgPSBKc0NoYXJhY3RlcnMuZ2V0U2FmZVhNTENoYXJhY3RlcnMoKTtcbiAgICBpZihub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgIHZhciBzdGFydE1hdGhtbFRhZyA9IHNhZmVYTUxDaGFyYWN0ZXJzLnRhZ09wZW5lciArIFwibWF0aFwiO1xuICAgICAgdmFyIGVuZE1hdGhtbFRhZyA9IHNhZmVYTUxDaGFyYWN0ZXJzLnRhZ09wZW5lciArIFwiL21hdGhcIiArIHNhZmVYTUxDaGFyYWN0ZXJzLnRhZ0Nsb3NlcjtcbiAgICAgIHZhciBzdGFydCA9IG5vZGUudGV4dENvbnRlbnQuaW5kZXhPZihzdGFydE1hdGhtbFRhZyk7XG4gICAgICB2YXIgZW5kID0gMDtcbiAgICAgIHdoaWxlKHN0YXJ0ICE9IC0xKSB7XG4gICAgICAgIGVuZCA9IG5vZGUudGV4dENvbnRlbnQuaW5kZXhPZihlbmRNYXRobWxUYWcsc3RhcnQgKyBzdGFydE1hdGhtbFRhZy5sZW5ndGgpO1xuXG4gICAgICAgIGlmKGVuZCA9PSAtMSkgYnJlYWs7XG5cbiAgICAgICAgdmFyIG5leHRNYXRoTUwgPSBub2RlLnRleHRDb250ZW50LmluZGV4T2Yoc3RhcnRNYXRobWxUYWcsZW5kICsgZW5kTWF0aG1sVGFnLmxlbmd0aCk7XG5cbiAgICAgICAgaWYobmV4dE1hdGhNTCA+PSAwICYmIGVuZCA+IG5leHRNYXRoTUwpIGJyZWFrO1xuXG4gICAgICAgIHZhciBzYWZlTWF0aG1sID0gbm9kZS50ZXh0Q29udGVudC5zdWJzdHJpbmcoc3RhcnQsZW5kICsgZW5kTWF0aG1sVGFnLmxlbmd0aCk7XG5cbiAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQuc3Vic3RyaW5nKDAsc3RhcnQpICsgbm9kZS50ZXh0Q29udGVudC5zdWJzdHJpbmcoZW5kICsgZW5kTWF0aG1sVGFnLmxlbmd0aCk7XG4gICAgICAgIG5vZGUgPSAobm9kZSBhcyBUZXh0KS5zcGxpdFRleHQoc3RhcnQpO1xuICAgICAgICBzdGFydCA9IG5vZGUudGV4dENvbnRlbnQuaW5kZXhPZihzdGFydE1hdGhtbFRhZyk7XG5cbiAgICAgICAgbWF0aG1sUG9zaXRpb25zLnB1c2goe1xuICAgICAgICAgIHNhZmVNTUw6IHNhZmVNYXRobWwsXG4gICAgICAgICAgbmV4dEVsZW1lbnQ6IG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuY2xhc3MgSnNDaGFyYWN0ZXJzIHtcbiAgc3RhdGljIGdldFNhZmVYTUxDaGFyYWN0ZXJzRW50aXRpZXMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFnT3BlbmVyOiAnJmxhcXVvOycsXG4gICAgICB0YWdDbG9zZXI6ICcmcmFxdW87JyxcbiAgICAgIGRvdWJsZVF1b3RlOiAnJnVtbDsnLFxuICAgICAgcmVhbERvdWJsZVF1b3RlOiAnJnF1b3Q7JyxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldFhNTENoYXJhY3RlcnMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICd4bWxDaGFyYWN0ZXJzJyxcbiAgICAgIHRhZ09wZW5lcjogJzwnLCAvLyBIZXg6IFxceDNDLlxuICAgICAgdGFnQ2xvc2VyOiAnPicsIC8vIEhleDogXFx4M0UuXG4gICAgICBkb3VibGVRdW90ZTogJ1wiJywgLy8gSGV4OiBcXHgyMi5cbiAgICAgIGFtcGVyc2FuZDogJyYnLCAvLyBIZXg6IFxceDI2LlxuICAgICAgcXVvdGU6ICdcXCcnLCAvLyBIZXg6IFxceDI3LlxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0U2FmZVhNTENoYXJhY3RlcnMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdzYWZlWG1sQ2hhcmFjdGVycycsXG4gICAgICB0YWdPcGVuZXI6ICfCqycsIC8vIEhleDogXFx4QUIuXG4gICAgICB0YWdDbG9zZXI6ICfCuycsIC8vIEhleDogXFx4QkIuXG4gICAgICBkb3VibGVRdW90ZTogJ8KoJywgLy8gSGV4OiBcXHhBOC5cbiAgICAgIGFtcGVyc2FuZDogJ8KnJywgLy8gSGV4OiBcXHhBNy5cbiAgICAgIHF1b3RlOiAnYCcsIC8vIEhleDogXFx4NjAuXG4gICAgICByZWFsRG91YmxlUXVvdGU6ICfCqCcsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IFBhcnNlciBmcm9tICdAd2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL3BhcnNlcic7XG5cbmVudW0gTWV0aG9kVHlwZSB7XG4gIFBvc3QgPSBcIlBPU1RcIixcbiAgR2V0ID0gXCJHRVRcIixcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHNlcnZpY2UgcmV0dXJucyBhIEpTT04gd2l0aCBhIG5vbi1vayBzdGF0dXMgdmFsdWUgaW4gaXRzIEpTT04gYm9keVxuICovXG5leHBvcnQgY2xhc3MgU3RhdHVzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgU3RhdHVzRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBwcm9jZXNzIHJlc3BvbnNlcyBmcm9tIHRoZSBlZGl0b3Igc2VydmljZXMuXG4gKiBUaGVzZSB1c3VhbGx5IGNvbWUgd3JhcHBlZCBpbiBhIEpTT04gd2l0aCBhIHN0YXR1cyBmaWVsZCB0aGF0IGNhbiBiZSBlaXRoZXIgXCJva1wiIG9yIFwid2FybmluZ1wiLlxuICogSWYgc3RhdHVzIGlzIFwib2tcIiwgcmV0dXJuIHRoZSByZXN1bHQgdmFsdWUgYWxvbmcgaXQuIE90aGVyd2lzZSwgdGhyb3cgYSBTdGF0dXNFcnJvci5cbiAqIEBwYXJhbSB7UHJvbWlzZTxSZXNwb25zZT59IHJlc3BvbnNlIC0gVGhlIHJlc3BvbnNlIGdpdmVuIGJ5IHRoZSBzZXJ2aWNlLlxuICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gVGhlIHVud3JhcHBlZCByZXN1bHQgb2YgdGhlIHJlc3BvbnNlLCBpZiB2YWxpZC5cbiAqIEB0aHJvd3Mge1N0YXR1c0Vycm9yfSBTZXJ2aWNlIHJlc3BvbmRlZCB3aXRoIGEgbm9uLW9rIHN0YXR1cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NKc29uUmVzcG9uc2UocmVzcG9uc2U6IFByb21pc2U8UmVzcG9uc2U+KTogUHJvbWlzZTxhbnk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHN0YXR1cywgcmVzdWx0IH0gPSBhd2FpdCAoYXdhaXQgcmVzcG9uc2UpLmpzb24oKTtcblxuICAgIGlmIChzdGF0dXMgIT09ICdvaycpIHtcbiAgICAgIHRocm93IG5ldyBTdGF0dXNFcnJvcignU2VydmljZSByZXNwb25kZWQgd2l0aCBhIG5vbi1vayBzdGF0dXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoKGUpIHtcbiAgICAvLyBUT0RPIG1hbmFnZSBuZXR3b3JrIGFuZCBzdGF0dXMgbm9uLW9rIGVycm9yc1xuICAgIHRocm93IGU7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgZW5kcG9pbnQgc2VydmljZW5hbWUgYW5kIHJldHVybnMgaXRzIHJlc3BvbnNlLlxuICogQHBhcmFtIHtvYmplY3R9IHF1ZXJ5IC0gT2JqZWN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyBhcyB0aGUgYm9keSByZXF1ZXN0IG9yIHNlYXJjaCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byBiZSBjYWxsZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VydmVyVVJMIC0gVXJsIG9mIHRoZSBzZXJ2ZXIgd2hlcmUgd2Ugd2FudCB0byBjYWxsIHRoZSBzZXJ2aWNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbiAtIEV4dGVuc2lvbiB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgc2VydmljZU5hbWUgKGluY2x1ZGluZyB0aGUgZG90IGlmIG5lY2Vzc2FyeSkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZXNwb25zZT59IFRoZSByZXF1ZXN0IHJlc3BvbnNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FsbFNlcnZpY2UocXVlcnk6IG9iamVjdCwgc2VydmljZU5hbWU6IHN0cmluZywgbWV0aG9kOiBNZXRob2RUeXBlLCBzZXJ2ZXJVUkw6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpIDogUHJvbWlzZTxhbnk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHNlcnZpY2VOYW1lICsgZXh0ZW5zaW9uLCBzZXJ2ZXJVUkwpO1xuICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD11dGYtOCcsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAobWV0aG9kID09PSBNZXRob2RUeXBlLkdldCkge1xuICAgICAgLy8gQWRkIHRoZSBxdWVyeSBhcyBzZWFyY2ggcGFyYW1zXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeSkpIHtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCB0aGUgcXVlcnkgYXMgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3RcbiAgICAgIGluaXQuYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoey4uLnF1ZXJ5fSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZldGNoKHVybC50b1N0cmluZygpLCBpbml0KTtcbiAgfSBjYXRjaChlKSB7XG4gICAgLy8gVE9ETyBtYW5hZ2UgbmV0d29yayBhbmQgc3RhdHVzIG5vbi1vayBlcnJvcnNcbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWx0IHRleHQgb2YgdGhlIE1hdGhNTCBwYXNzZWQgYXMgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IG1tbCAtIE1hdGhNTCB0byBiZSB0cmFuc2Zvcm1lZCBpbnRvIGFsdCB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgLSBMYW5ndWFnZSBvZiB0aGUgYWNjZXNzaWJsZSB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFVSTCBvZiB0aGUgc2VydmVyIHdoZXJlIHdlIHdhbnQgdG8gY2FsbCB0aGUgc2VydmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb24gLSBFeHRlbnNpb24gdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIHNlcnZpY2VOYW1lIChpbmNsdWRpbmcgdGhlIGRvdCBpZiBuZWNlc3NhcnkpLlxuICogQHJldHVybnMge1Byb21pc2U8UmVzcG9uc2U+fSBUaGUgbWF0aG1sMmFjY2Vzc2libGUgc2VydmljZSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1hdGhtbDJhY2Nlc3NpYmxlKG1tbDogc3RyaW5nLCBsYW5nOiBzdHJpbmcsIHVybDogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykgOiBQcm9taXNlPGFueT4ge1xuICAvLyBTZXQgdGhlIG5lZWRlZCBwYXJhbXMgdG8gcmV0cmlldmUgdGhlIGFsdCB0ZXh0LlxuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgJ3NlcnZpY2UnOiAnbWF0aG1sMmFjY2Vzc2libGUnLFxuICAgICdtbWwnOiBtbWwsXG4gICAgJ21ldHJpY3MnOiAndHJ1ZScsXG4gICAgJ2NlbnRlcmJhc2VsaW5lJzogJ2ZhbHNlJyxcbiAgICAnbGFuZyc6IGxhbmcsXG4gICAgJ2lnbm9yZVN0eWxlcyc6ICd0cnVlJyxcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gY2FsbFNlcnZpY2UocGFyYW1zLCAnc2VydmljZScsIE1ldGhvZFR5cGUuUG9zdCwgdXJsLCBleHRlbnNpb24pO1xuICByZXR1cm4gcHJvY2Vzc0pzb25SZXNwb25zZShyZXNwb25zZSk7XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIHNob3dJbWFnZSBzZXJ2aWNlIHdpdGggdGhlIGdpdmVuIE1hdGhNTCBhbmQgcmV0dXJucyB0aGUgcmVjZWl2ZWQgUmVzcG9uc2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IG1tbCAtIE1hdGhNTCB0byByZW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZyAtIExhbmd1YWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFVSTCBvZiB0aGUgc2VydmVyIHdoZXJlIHdlIHdhbnQgdG8gY2FsbCB0aGUgc2VydmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb24gLSBFeHRlbnNpb24gdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIHNlcnZpY2VOYW1lIChpbmNsdWRpbmcgdGhlIGRvdCBpZiBuZWNlc3NhcnkpLlxuICogQHJldHVybnMge1Byb21pc2U8UmVzcG9uc2U+fSB0aGUgUmVzcG9uc2Ugb2JqZWN0IHRvIHRoZSBwZXRpdGlvbiBtYWRlIHRvIHNob3dJbWFnZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hvd0ltYWdlKG1tbDogc3RyaW5nLCBsYW5nOiBzdHJpbmcsIHVybDogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAnbW1sJzogbW1sLFxuICAgICdtZXRyaWNzJzogJ3RydWUnLFxuICAgICdjZW50ZXJiYXNlbGluZSc6ICdmYWxzZScsXG4gICAgJ2xhbmcnOmxhbmcsXG4gIH1cblxuICAvLyBUcnkgdG8gb2J0YWluIHRoZSBpbWFnZSB2aWEgR0VUXG4gIGNvbnN0IGdldFBhcmFtcyA9IFBhcnNlci5jcmVhdGVTaG93SW1hZ2VTcmNEYXRhKHsgbW1sIH0sIGxhbmcpO1xuICBjb25zdCBnZXRSZXNwb25zZSA9IGNhbGxTZXJ2aWNlKGdldFBhcmFtcywgJ3Nob3dpbWFnZScsIE1ldGhvZFR5cGUuR2V0LCB1cmwsIGV4dGVuc2lvbik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb2Nlc3NKc29uUmVzcG9uc2UoZ2V0UmVzcG9uc2UpO1xuICB9IGNhdGNoKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIFN0YXR1c0Vycm9yKSB7XG4gICAgICAvLyBGb3JtdWxhIHdhcyBub3QgaW4gY2FjaGU7IHByb2NlZWQgd2l0aCBjYWxsaW5nIHNob3dpbWFnZSB2aWEgUE9TVFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIEdFVCByZXF1ZXN0IGZhaWxzLCBpdCBtZWFucyB0aGF0IHRoZSBmb3JtdWxhIHdhcyBub3QgaW4gY2FjaGUuIFByb2NlZWQgd2l0aCBQT1NUOlxuICBjb25zdCByZXNwb25zZSA9IGNhbGxTZXJ2aWNlKHBhcmFtcywgJ3Nob3dpbWFnZScsIE1ldGhvZFR5cGUuUG9zdCwgdXJsLCBleHRlbnNpb24pO1xuICByZXR1cm4gcHJvY2Vzc0pzb25SZXNwb25zZShyZXNwb25zZSk7XG5cbn07XG5cbi8qKlxuICogQ2FsbHMgdGhlIGNyZWF0ZUltYWdlIHNlcnZpY2Ugd2l0aCB0aGUgZ2l2ZW4gTWF0aE1MIGFuZCByZXR1cm5zIHRoZSByZWNlaXZlZCBSZXNwb25zZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW1sIC0gTWF0aE1MIHRvIHJlbmRlclxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgLSBMYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBVUkwgb2YgdGhlIHNlcnZlciB3aGVyZSB3ZSB3YW50IHRvIGNhbGwgdGhlIHNlcnZpY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uIC0gRXh0ZW5zaW9uIHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBzZXJ2aWNlTmFtZSAoaW5jbHVkaW5nIHRoZSBkb3QgaWYgbmVjZXNzYXJ5KS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlc3BvbnNlPn0gdGhlIFJlc3BvbnNlIG9iamVjdCB0byB0aGUgcGV0aXRpb24gbWFkZSB0byBzaG93SW1hZ2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUltYWdlKG1tbDogc3RyaW5nLCBsYW5nOiBzdHJpbmcsIHVybDogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAnbW1sJzogbW1sLFxuICAgICdtZXRyaWNzJzogJ3RydWUnLFxuICAgICdjZW50ZXJiYXNlbGluZSc6ICdmYWxzZScsXG4gICAgJ2xhbmcnOiBsYW5nLFxuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBjYWxsU2VydmljZShwYXJhbXMsICdjcmVhdGVpbWFnZScsIE1ldGhvZFR5cGUuR2V0LCB1cmwsIGV4dGVuc2lvbik7XG4gIHJldHVybiAoYXdhaXQgcmVzcG9uc2UpLnRleHQoKTtcbn07XG5cbi8qKlxuICogQ2FsbHMgdGhlIGxhdGV4Mm1hdGhtbCBzZXJ2aWNlIHdpdGggdGhlIGdpdmVuIExhVGVYIGFuZCByZXR1cm5zIHRoZSByZWNlaXZlZCBSZXNwb25zZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGF0ZXggLSBMYVRlWCB0byByZW5kZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBVcmwgb2YgdGhlIHNlcnZlciB3aGVyZSB3ZSB3YW50IHRvIGNhbGwgdGhlIHNlcnZpY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uIC0gRXh0ZW5zaW9uIHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBzZXJ2aWNlTmFtZSAoaW5jbHVkaW5nIHRoZSBkb3QgaWYgbmVjZXNzYXJ5KS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlc3BvbnNlPn0gdGhlIFJlc3BvbnNlIG9iamVjdCB0byB0aGUgcGV0aXRpb24gbWFkZSB0byBzZXJ2aWNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXRleFRvTWF0aG1sKGxhdGV4OiBzdHJpbmcsIHVybDogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAnc2VydmljZSc6ICdsYXRleDJtYXRobWwnLFxuICAgICdsYXRleCc6IGxhdGV4LFxuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBjYWxsU2VydmljZShwYXJhbXMsICdzZXJ2aWNlJywgTWV0aG9kVHlwZS5Qb3N0LCB1cmwsIGV4dGVuc2lvbik7XG4gIHJldHVybiBwcm9jZXNzSnNvblJlc3BvbnNlKHJlc3BvbnNlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGJhY2tlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB2YXJpYWJsZWtleXMgLSBMaXN0IG9mIHRoZSBrZXkgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyB0byBmZXRjaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb24gLSBFeHRlbnNpb24gdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIHNlcnZpY2VOYW1lIChpbmNsdWRpbmcgdGhlIGRvdCBpZiBuZWNlc3NhcnkpLlxuICogQHJldHVybnMge1Byb21pc2U8UmVzcG9uc2U+fSBUaGUgY29uZmlndXJhdGlvbmpzb24gc2VydmljZSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb25Kc29uKHZhcmlhYmxla2V5czogc3RyaW5nW10sIHVybDogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykgOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgJ3ZhcmlhYmxla2V5cyc6IHZhcmlhYmxla2V5cy5qb2luKCcsJyksXG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGNhbGxTZXJ2aWNlKHBhcmFtcywgJ2NvbmZpZ3VyYXRpb25qc29uJywgTWV0aG9kVHlwZS5HZXQsIHVybCwgZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIHByb2Nlc3NKc29uUmVzcG9uc2UocmVzcG9uc2UpO1xufVxuIiwiLyoqXG4gKiBUYWtlcyBhIHN0cmluZyBwb3NzaWJseSBjb250YWluaW5nIGVuY29kZWQgZW50aXRpZXMgKGUuZy4gJm5ic3A7ICYjMTYwOykgYW5kXG4gKiByZXR1cm5zIHRoZSBzYW1lIHN0cmluZyB3aXRoIHRoZXNlIHJlcGxhY2VkIGJ5IHRoZSBVVEYtOCBjaGFyYWN0ZXJzIHRoZXkgcmVwcmVzZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgd2l0aCBlbmNvZGVkIGVudGl0aWVzXG4gKiBAcmV0dXJucyB0aGUgc2FtZSBzdHJpbmcgd2l0aCB0aGUgZW50aXRpZXMgZGVjb2RlZFxuICovXG5mdW5jdGlvbiBkZWNvZGVFbnRpdGllcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgZWxlbWVudC5pbm5lckhUTUwgPSB0ZXh0O1xuICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIHN0cmluZyBwb3NzaWJseSBjb250YWluaW5nIGVuY29kZWQgbmFtZWQgSFRNTCBlbnRpdGllcyAoZS5nLiAmbmJzcDspIGFuZFxuICogcmV0dXJucyB0aGUgc2FtZSBzdHJpbmcgd2l0aCB0aGVzZSByZXBsYWNlZCBieSB0aGUgZW5jb2RpbmcgdGhhdCB1c2VzIG51bWJlcnMgKGUuZy4gJiMxNjA7KS5cbiAqIEJ5IGl0cyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBtZXRob2QgYWxzbyBwb3NzaWJseSBlbmNvZGVzIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IHdlcmVcbiAqIHByZXZpb3VzbHkgdW5lbmNvZGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHdpdGggZW5jb2RlZCBlbnRpdGllc1xuICogQHJldHVybnMgdGhlIHNhbWUgc3RyaW5nIHdpdGggdGhlIGVudGl0aWVzIGRlY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWxFbnRpdGllc1RvWG1sRW50aXRpZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdGV4dCA9IGRlY29kZUVudGl0aWVzKHRleHQpO1xuXG4gIC8vIFJlcGxhY2VzIHRoZSA8ICYgPiBjaGFyYWN0ZXJzIHRvIGl0cyBIVE1MRW50aXR5IHRvIGF2b2lkIHJlbmRlciBpc3N1ZXMuXG4gIHRleHQgPSB0ZXh0LnNwbGl0KCdcIjxcIicpLmpvaW4oJ1wiJmx0O1wiJylcbiAgICAuc3BsaXQoJ1wiPlwiJylcbiAgICAuam9pbignXCImZ3Q7XCInKVxuICAgIC5zcGxpdCgnPjw8JylcbiAgICAuam9pbignPiZsdDs8Jyk7XG5cbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSB0ZXh0LmNoYXJBdChpKTtcbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkpID4gMTI4KSB7XG4gICAgICByZXN1bHQgKz0gJyYjJyArIHRleHQuY2hhckNvZGVBdChpKSArICc7JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IGNoYXJhY3RlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gU2V0IG9mIG1hdGhtbCBhbmQgY2hhcmFjdGVycyB3aGljaCBkb24ndCBoYXZlIGFuIGFjY2Vzc2libGUgdGV4dCBhc3NvY2lhdGVkXG4vLyBhbmQgY2FuIG5vdCBiZSB0cmFuc2xhdGVkIG9yIHRyYW5zZm9ybWVkIHRvIExhVGVYLlxuZXhwb3J0IGNvbnN0IGNvcnJ1cHRNYXRoTUwgPSBbJ+KfpicsICcmIzEwMjE0OycsICfin6cnLCAnJiMxMDIxNTsnLCAnbXNjYXJyaWVzJywgJ21zY2FycnknLCAnbXNncm91cCcsICdtc3RhY2snLCAnbXNsaW5lJywgJ21zcm93J107XG4iLCJpbXBvcnQgVGV4dENhY2hlIGZyb20gJy4vdGV4dGNhY2hlJztcbmltcG9ydCBTZXJ2aWNlUHJvdmlkZXIgZnJvbSAnLi9zZXJ2aWNlcHJvdmlkZXInO1xuaW1wb3J0IE1hdGhNTCBmcm9tICcuL21hdGhtbCc7XG5pbXBvcnQgU3RyaW5nTWFuYWdlciBmcm9tICcuL3N0cmluZ21hbmFnZXInO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBNYXRoVHlwZSBhY2Nlc3NpYmxlIGNsYXNzLiBDb252ZXJ0cyBNYXRoTUwgdG8gYWNjZXNzaWJsZSB0ZXh0IGFuZCBtYW5hZ2VzXG4gKiB0aGUgYXNzb2NpYXRlZCBjbGllbnQtc2lkZSBjYWNoZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNjZXNzaWJpbGl0eSB7XG4gIC8qKlxuICAqIFN0YXRpYyBwcm9wZXJ0eS5cbiAgKiBBY2Nlc3NpYmlsaXR5IGNhY2hlLCBlYWNoIGVudHJ5IGNvbnRhaW5zIGEgTWF0aE1MIGFuZCBpdHMgY29ycmVzcG9uZGVudCBhY2Nlc3NpYmlsaXR5IHRleHQuXG4gICogQHR5cGUge1RleHRDYWNoZX1cbiAgKi9cbiAgc3RhdGljIGdldCBjYWNoZSgpIHtcbiAgICByZXR1cm4gQWNjZXNzaWJpbGl0eS5fY2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIHByb3BlcnR5IHNldHRlci5cbiAgICogU2V0IGFjY2Vzc2liaWxpdHkgY2FjaGUuXG4gICAqIEBwYXJhbSB7VGV4dENhaGV9IHZhbHVlIC0gVGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzdGF0aWMgc2V0IGNhY2hlKHZhbHVlKSB7XG4gICAgQWNjZXNzaWJpbGl0eS5fY2FjaGUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBNYXRoTUwgc3RyaW5ncyB0byBpdHMgYWNjZXNzaWJsZSB0ZXh0IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWF0aE1MIC0gTWF0aE1MIHRvIGJlIGNvbnZlcnRlZCB0byBhY2Nlc3NpYmxlIHRleHQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbGFuZ3VhZ2VdIC0gTGFuZ3VhZ2Ugb2YgdGhlIGFjY2Vzc2libGUgdGV4dC4gJ2VuJyBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBbZGF0YV0gLSBQYXJhbWV0ZXJzIHRvIHNlbmQgdG8gbWF0aG1sMmFjY2Vzc2libGUgc2VydmljZS5cbiAgICogQHJldHVybiB7U3RyaW5nfSBBY2Nlc3NpYmlsaXR5IHRleHQuXG4gICAqL1xuICBzdGF0aWMgbWF0aE1MVG9BY2Nlc3NpYmxlKG1hdGhNTCwgbGFuZ3VhZ2UsIGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIChsYW5ndWFnZSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsYW5ndWFnZSA9ICdlbic7XG4gICAgfVxuICAgIC8vIENoZWNrIE1hdGhNTCBjbGFzcy4gSWYgdGhlIGNsYXNzIGlzIGNoZW1pc3RyeSxcbiAgICAvLyB3ZSBhZGQgY2hlbWlzdHJ5IHRvIGRhdGEgdG8gZm9yY2UgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlXG4gICAgLy8gdG8gbG9hZCBjaGVtaXN0cnkgZ3JhbW1hci5cbiAgICBpZiAoTWF0aE1MLmNvbnRhaW5DbGFzcyhtYXRoTUwsICd3cnNfY2hlbWlzdHJ5JykpIHtcbiAgICAgIGRhdGEubW9kZSA9ICdjaGVtaXN0cnknO1xuICAgIH1cbiAgICAvLyBJZ25vcmUgYWNjZXNpYmlsaXR5IHN0eWxlc1xuICAgIGRhdGEuaWdub3JlU3R5bGVzID0gdHJ1ZTtcbiAgICBsZXQgYWNjZXNzaWJsZVRleHQgPSAnJztcblxuICAgIGlmIChBY2Nlc3NpYmlsaXR5LmNhY2hlLmdldChtYXRoTUwpKSB7XG4gICAgICBhY2Nlc3NpYmxlVGV4dCA9IEFjY2Vzc2liaWxpdHkuY2FjaGUuZ2V0KG1hdGhNTCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEuc2VydmljZSA9ICdtYXRobWwyYWNjZXNzaWJsZSc7XG4gICAgICBkYXRhLmxhbmcgPSBsYW5ndWFnZTtcbiAgICAgIGNvbnN0IGFjY2Vzc2libGVKc29uUmVzcG9uc2UgPSBKU09OLnBhcnNlKFNlcnZpY2VQcm92aWRlci5nZXRTZXJ2aWNlKCdzZXJ2aWNlJywgZGF0YSkpO1xuICAgICAgaWYgKGFjY2Vzc2libGVKc29uUmVzcG9uc2Uuc3RhdHVzICE9PSAnZXJyb3InKSB7XG4gICAgICAgIGFjY2Vzc2libGVUZXh0ID0gYWNjZXNzaWJsZUpzb25SZXNwb25zZS5yZXN1bHQudGV4dDtcbiAgICAgICAgQWNjZXNzaWJpbGl0eS5jYWNoZS5wb3B1bGF0ZShtYXRoTUwsIGFjY2Vzc2libGVUZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY2Vzc2libGVUZXh0ID0gU3RyaW5nTWFuYWdlci5nZXQoJ2Vycm9yX2NvbnZlcnRfYWNjZXNzaWJpbGl0eScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY2Nlc3NpYmxlVGV4dDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIGFuIGluc3RhbmNlIG9mIFRleHRDYWNoZSBjbGFzcyB0byBtYW5hZ2UgdGhlIEphdmFTY3JpcHQgYWNjZXNzaWJsZSBjYWNoZS5cbiAqIEVhY2ggZW50cnkgb2YgdGhlIGNhY2hlIG9iamVjdCBjb250YWlucyB0aGUgTWF0aE1MIGFuZCBpdCdzIGNvcnJlc3BvbmRlbnQgYWNjZXNzaWJpbGl0eSB0ZXh0LlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtUZXh0Q2FjaGV9XG4gKi9cbkFjY2Vzc2liaWxpdHkuX2NhY2hlID0gbmV3IFRleHRDYWNoZSgpO1xuIiwiLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGNvbmZpZ3VyYXRpb24gY2xhc3MuXG4gKiBVc3VhbGx5IHVzZWQgdG8gcmV0cmlldmUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGdlbmVyYXRlZCBpbiB0aGUgYmFja2VuZCBpbnRvIHRoZSBmcm9udGVuZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBZGRzIGEgcHJvcGVydGllcyBvYmplY3QgdG8ge0BsaW5rIENvbmZpZ3VyYXRpb24ucHJvcGVydGllc30uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIC0gcHJvcGVydGllcyB0byBhcHBlbmQgdG8gY3VycmVudCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc3RhdGljIGFkZENvbmZpZ3VyYXRpb24ocHJvcGVydGllcykge1xuICAgIE9iamVjdC5hc3NpZ24oQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAqIFN0YXRpYyBwcm9wZXJ0eS5cbiAgKiBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9iamVjdC5cbiAgKiBAcHJpdmF0ZVxuICAqIEB0eXBlIHtPYmplY3R9XG4gICovXG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4gQ29uZmlndXJhdGlvbi5fcHJvcGVydGllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgcHJvcGVydHkgc2V0dGVyLlxuICAgKiBTZXQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgLSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHN0YXRpYyBzZXQgcHJvcGVydGllcyh2YWx1ZSkge1xuICAgIENvbmZpZ3VyYXRpb24uX3Byb3BlcnRpZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGtleS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtIFByb3BlcnR5IGtleVxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBQcm9wZXJ0eSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIGdldChrZXkpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChDb25maWd1cmF0aW9uLnByb3BlcnRpZXMsIGtleSkpIHtcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChDb25maWd1cmF0aW9uLnByb3BlcnRpZXMsICdfd3JzX2NvbmZfJykpIHtcbiAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb24ucHJvcGVydGllc1tgX3dyc19jb25mXyR7a2V5fWBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzW2tleV07XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBwcm9wZXJ0eSB0byBDb25maWd1cmF0aW9uIGNsYXNzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC0gUHJvcGVydHkga2V5LlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgLSBQcm9wZXJ0eSB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIENvbmZpZ3VyYXRpb24ucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHByb3BlcnR5IG9iamVjdCB2YWx1ZSB3aXRoIG5ldyB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGJlIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0eVZhbHVlIC0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5ldyB2YWx1ZXMuXG4gICAqL1xuICBzdGF0aWMgdXBkYXRlKGtleSwgcHJvcGVydHlWYWx1ZSkge1xuICAgIGlmICghQ29uZmlndXJhdGlvbi5nZXQoa2V5KSkge1xuICAgICAgQ29uZmlndXJhdGlvbi5zZXQoa2V5LCBwcm9wZXJ0eVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXBkYXRlUHJvcGVydHkgPSBPYmplY3QuYXNzaWduKENvbmZpZ3VyYXRpb24uZ2V0KGtleSksIHByb3BlcnR5VmFsdWUpO1xuICAgICAgQ29uZmlndXJhdGlvbi5zZXQoa2V5LCB1cGRhdGVQcm9wZXJ0eSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3RhdGljIHByb3BlcnRpZXMgb2JqZWN0LiBTdG9yZXMgYWxsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy5cbiAqIE5lZWRlZCB0byBhdHRyaWJ1dGUgYWNjZXNzb3JzLlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbkNvbmZpZ3VyYXRpb24uX3Byb3BlcnRpZXMgPSB7fTtcbiIsIi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFsbCB0aGUgY29uc3RhbnRzIG5lZWRlZCBpbiBhIE1hdGhUeXBlIGludGVncmF0aW9uIGFtb25nIGRpZmZlcmVudCBjbGFzc2VzLlxuICogSWYgYSBjb25zdGFudCBzaG91bGQgYmUgdXNlZCBhY3Jvc3MgZGlmZmVyZW50IGNsYXNzZXMgc2hvdWxkIGJlIGRlZmluZWQgdXNpbmcgYXR0cmlidXRlXG4gKiBhY2Nlc3NvcnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnN0YW50cyB7XG4gIC8qKlxuICAgKiBTYWZlIFhNTCBlbnRpdGllcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgc2FmZVhtbENoYXJhY3RlcnNFbnRpdGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFnT3BlbmVyOiAnJmxhcXVvOycsXG4gICAgICB0YWdDbG9zZXI6ICcmcmFxdW87JyxcbiAgICAgIGRvdWJsZVF1b3RlOiAnJnVtbDsnLFxuICAgICAgcmVhbERvdWJsZVF1b3RlOiAnJnF1b3Q7JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJsYWNrYm9hcmQgaW52YWxpZCBzYWZlIGNoYXJhY3RlcnMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IHNhZmVCYWRCbGFja2JvYXJkQ2hhcmFjdGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbHRFbGVtZW50OiAnwqttb8K7PMKrL21vwrsnLFxuICAgICAgZ3RFbGVtZW50OiAnwqttb8K7PsKrL21vwrsnLFxuICAgICAgYW1wRWxlbWVudDogJ8KrbW/CuybCqy9tb8K7JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJsYWNrYm9hcmQgdmFsaWQgc2FmZSBjaGFyYWN0ZXJzLlxuICAgKiBAdHlwZXtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IHNhZmVHb29kQmxhY2tib2FyZENoYXJhY3RlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGx0RWxlbWVudDogJ8KrbW/Cu8KnbHQ7wqsvbW/CuycsXG4gICAgICBndEVsZW1lbnQ6ICfCq21vwrvCp2d0O8KrL21vwrsnLFxuICAgICAgYW1wRWxlbWVudDogJ8KrbW/Cu8KnYW1wO8KrL21vwrsnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhbmRhcmQgWE1MIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgeG1sQ2hhcmFjdGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICd4bWxDaGFyYWN0ZXJzJyxcbiAgICAgIHRhZ09wZW5lcjogJzwnLCAvLyBIZXg6IFxceDNDLlxuICAgICAgdGFnQ2xvc2VyOiAnPicsIC8vIEhleDogXFx4M0UuXG4gICAgICBkb3VibGVRdW90ZTogJ1wiJywgLy8gSGV4OiBcXHgyMi5cbiAgICAgIGFtcGVyc2FuZDogJyYnLCAvLyBIZXg6IFxceDI2LlxuICAgICAgcXVvdGU6ICdcXCcnLCAvLyBIZXg6IFxceDI3LlxuICAgIH07XG4gIH1cblxuICAvKipcbiAgKiBTYWZlIFhNTCBzcGVjaWFsIGNoYXJhY3RlcnMuIFRoaXMgY2hhcmFjdGVycyBhcmUgdXNlZCBpbnN0ZWFkIHRoZSBzdGFuZGFyZFxuICAqIHRoZSBzdGFuZGFyZCB0byBwYXJzZSB0aGUgIE1hdGhNTCBpZiBzYWZlWE1MIHNhdmUgbW9kZSBpcyBlbmFibGUuIEVhY2ggWE1MXG4gICogc3BlY2lhbCBjaGFyYWN0ZXIgaGF2ZSBhIFVURi04IHJlcHJlc2VudGF0aW9uLlxuICAqIEB0eXBlIHtPYmplY3R9XG4gICovXG4gIHN0YXRpYyBnZXQgc2FmZVhtbENoYXJhY3RlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiAnc2FmZVhtbENoYXJhY3RlcnMnLFxuICAgICAgdGFnT3BlbmVyOiAnwqsnLCAvLyBIZXg6IFxceEFCLlxuICAgICAgdGFnQ2xvc2VyOiAnwrsnLCAvLyBIZXg6IFxceEJCLlxuICAgICAgZG91YmxlUXVvdGU6ICfCqCcsIC8vIEhleDogXFx4QTguXG4gICAgICBhbXBlcnNhbmQ6ICfCpycsIC8vIEhleDogXFx4QTcuXG4gICAgICBxdW90ZTogJ2AnLCAvLyBIZXg6IFxceDYwLlxuICAgICAgcmVhbERvdWJsZVF1b3RlOiAnwqgnLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgVXRpbCBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBNYXRoVHlwZSBJbWFnZSBjbGFzcy4gQ29udGFpbnMgYWxsIHRoZSBsb2dpYyByZWxhdGVkXG4gKiB0byBNYXRoVHlwZSBpbWFnZXMgbWFuaXB1bGF0aW9uLlxuICogQWxsIE1hdGhUeXBlIGltYWdlcyBhcmUgZ2VuZXJhdGVkIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBNYXRoVHlwZVxuICogaW50ZWdyYXRpb24gc2VydmljZTogc2hvd2ltYWdlIG9yIGNyZWF0ZWltYWdlLlxuICpcbiAqIFRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIGltYWdlIGZvcm1hdHM6XG4gKiAtIHN2ZyAoZGVmYXVsdClcbiAqIC0gcG5nXG4gKlxuICogVGhlcmUgYXJlIHR3byBmb3JtYXRzIGZvciB0aGUgaW1hZ2Ugc3JjIGF0dHJpYnV0ZTpcbiAqIC0gQSBkYXRhLXVyaSBzY2hlbWUgY29udGFpbmluZyB0aGUgVVJMLWVuY29kZWQgU1ZHIG9yIGEgUE5HJ3MgYmFzZTY0LlxuICogLSBBIGxpbmsgdG8gdGhlIHNob3dpbWFnZSBzZXJ2aWNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZSB7XG4gIC8qKlxuICAgKiBSZW1vdmVzIGRhdGEgYXR0cmlidXRlcyBmcm9tIGFuIGltYWdlLlxuICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IGltZyAtIEltYWdlIHdoZXJlIHJlbW92ZSBkYXRhIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzdGF0aWMgcmVtb3ZlSW1nRGF0YUF0dHJpYnV0ZXMoaW1nKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvUmVtb3ZlID0gW107XG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzIH0gPSBpbWc7XG5cbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgIGlmIChhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCAmJiBhdHRyaWJ1dGUubmFtZSAhPT0gdW5kZWZpbmVkICYmIGF0dHJpYnV0ZS5uYW1lLmluZGV4T2YoJ2RhdGEtJykgPT09IDApIHtcbiAgICAgICAgLy8gSXMgcHJlZmVycmVkIGtlZXAgYW4gYXJyYXkgYW5kIHJlbW92ZSBhZnRlciB0aGUgc2VhcmNoXG4gICAgICAgIC8vIGJlY2F1c2Ugd2hlbiBhdHRyaWJ1dGUgaXMgcmVtb3ZlZCB0aGUgYXJyYXkgb2YgYXR0cmlidXRlc1xuICAgICAgICAvLyBpcyBtb2RpZmllZC5cbiAgICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLnB1c2goYXR0cmlidXRlLm5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXR0cmlidXRlc1RvUmVtb3ZlLmZvckVhY2goKGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgaW1nLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQ2xvbmVzIGFsbCBNYXRoVHlwZSBpbWFnZSBhdHRyaWJ1dGVzIGZyb20gYSBIVE1MSW1hZ2VFbGVtZW50IHRvIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudH0gb3JpZ2luSW1nIC0gVGhlIG9yaWdpbmFsIGltYWdlLlxuICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IGRlc3RJbWcgLSBUaGUgZGVzdGluYXRpb24gaW1hZ2UuXG4gICAqL1xuICBzdGF0aWMgY2xvbmUob3JpZ2luSW1nLCBkZXN0SW1nKSB7XG4gICAgY29uc3QgY3VzdG9tRWRpdG9yQXR0cmlidXRlTmFtZSA9IENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZUN1c3RvbUVkaXRvck5hbWUnKTtcbiAgICBpZiAoIW9yaWdpbkltZy5oYXNBdHRyaWJ1dGUoY3VzdG9tRWRpdG9yQXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIGRlc3RJbWcucmVtb3ZlQXR0cmlidXRlKGN1c3RvbUVkaXRvckF0dHJpYnV0ZU5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGhtbEF0dHJpYnV0ZU5hbWUgPSBDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VNYXRobWxBdHRyaWJ1dGUnKTtcbiAgICBjb25zdCBpbWdBdHRyaWJ1dGVzID0gW1xuICAgICAgbWF0aG1sQXR0cmlidXRlTmFtZSxcbiAgICAgIGN1c3RvbUVkaXRvckF0dHJpYnV0ZU5hbWUsXG4gICAgICAnYWx0JyxcbiAgICAgICdoZWlnaHQnLFxuICAgICAgJ3dpZHRoJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3JjJyxcbiAgICAgICdyb2xlJyxcbiAgICBdO1xuXG4gICAgaW1nQXR0cmlidXRlcy5mb3JFYWNoKChpdGVyYXRvcikgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luQXR0cmlidXRlID0gb3JpZ2luSW1nLmdldEF0dHJpYnV0ZShpdGVyYXRvcik7XG4gICAgICBpZiAob3JpZ2luQXR0cmlidXRlKSB7XG4gICAgICAgIGRlc3RJbWcuc2V0QXR0cmlidXRlKGl0ZXJhdG9yLCBvcmlnaW5BdHRyaWJ1dGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogQ2FsY3VsYXRlcyB0aGUgbWV0cmljcyBvZiBhIE1hdGhUeXBlIGltYWdlIGdpdmVuIHRoZSB0aGUgc2VydmljZSByZXNwb25zZSBhbmQgdGhlIGltYWdlIGZvcm1hdC5cbiAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IGltZyAtIFRoZSBIVE1MSW1hZ2VFbGVtZW50LlxuICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgLSBUaGUgVVJJIGdlbmVyYXRlZCBieSB0aGUgaW1hZ2Ugc2VydmljZTogY2FuIGJlIGEgZGF0YSBVUkkgc2NoZW1lIG9yIGEgVVJMLlxuICAqIEBwYXJhbSB7Qm9vbGVhbn0ganNvblJlc3BvbnNlIC0gVHJ1ZSB0aGUgcmVzcG9uc2Ugb2YgdGhlIGltYWdlIHNlcnZpY2UgaXMgYVxuICAqIEpTT04gb2JqZWN0LiBGYWxzZSBvdGhlcndpc2UuXG4gICovXG4gIHN0YXRpYyBzZXRJbWdTaXplKGltZywgdXJpLCBqc29uUmVzcG9uc2UpIHtcbiAgICBsZXQgYXI7XG4gICAgbGV0IGJhc2U2NFN0cmluZztcbiAgICBsZXQgYnl0ZXM7XG4gICAgbGV0IHN2Z1N0cmluZztcbiAgICBpZiAoanNvblJlc3BvbnNlKSB7XG4gICAgICAvLyBDbGVhbmluZyBkYXRhOmltYWdlL3BuZztiYXNlNjQuXG4gICAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlRm9ybWF0JykgPT09ICdzdmcnKSB7XG4gICAgICAgIC8vIFNWRyBmb3JtYXQuXG4gICAgICAgIC8vIElmIFNWRyBpcyBlbmNvZGVkIGluIGJhc2U2NCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGJhc2U2NCBieXRlcyBpbnRvIGEgU1ZHIHN0cmluZy5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpICE9PSAnYmFzZTY0Jykge1xuICAgICAgICAgIGFyID0gSW1hZ2UuZ2V0TWV0cmljc0Zyb21TdmdTdHJpbmcodXJpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiYXNlNjRTdHJpbmcgPSBpbWcuc3JjLnN1YnN0cihpbWcuc3JjLmluZGV4T2YoJ2Jhc2U2NCwnKSArIDcsIGltZy5zcmMubGVuZ3RoKTtcbiAgICAgICAgICBzdmdTdHJpbmcgPSAnJztcbiAgICAgICAgICBieXRlcyA9IFV0aWwuYjY0VG9CeXRlQXJyYXkoYmFzZTY0U3RyaW5nLCBiYXNlNjRTdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBzdmdTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFyID0gSW1hZ2UuZ2V0TWV0cmljc0Zyb21TdmdTdHJpbmcoc3ZnU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQTkcgZm9ybWF0OiB3ZSBzdG9yZSBhbGwgbWV0cmljcyBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgODggYnl0ZXMuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlNjRTdHJpbmcgPSBpbWcuc3JjLnN1YnN0cihpbWcuc3JjLmluZGV4T2YoJ2Jhc2U2NCwnKSArIDcsIGltZy5zcmMubGVuZ3RoKTtcbiAgICAgICAgYnl0ZXMgPSBVdGlsLmI2NFRvQnl0ZUFycmF5KGJhc2U2NFN0cmluZywgODgpO1xuICAgICAgICBhciA9IEltYWdlLmdldE1ldHJpY3NGcm9tQnl0ZXMoYnl0ZXMpO1xuICAgICAgfVxuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHdlIHN0b3JlIHRoZSBtZXRyaWNzIGludG8gY3JlYXRlaW1hZ2UgcmVzcG9uc2UuXG4gICAgfSBlbHNlIHtcbiAgICAgIGFyID0gVXRpbC51cmxUb0Fzc0FycmF5KHVyaSk7XG4gICAgfVxuICAgIGxldCB3aWR0aCA9IGFyLmN3O1xuICAgIGlmICghd2lkdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGhlaWdodCA9IGFyLmNoO1xuICAgIGxldCBiYXNlbGluZSA9IGFyLmNiO1xuICAgIGNvbnN0IHsgZHBpIH0gPSBhcjtcbiAgICBpZiAoZHBpKSB7XG4gICAgICB3aWR0aCA9IHdpZHRoICogOTYgLyBkcGk7XG4gICAgICBoZWlnaHQgPSBoZWlnaHQgKiA5NiAvIGRwaTtcbiAgICAgIGJhc2VsaW5lID0gYmFzZWxpbmUgKiA5NiAvIGRwaTtcbiAgICB9XG4gICAgaW1nLndpZHRoID0gd2lkdGg7XG4gICAgaW1nLmhlaWdodCA9IGhlaWdodDtcbiAgICBpbWcuc3R5bGUudmVydGljYWxBbGlnbiA9IGAtJHtoZWlnaHQgLSBiYXNlbGluZX1weGA7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgbWV0cmljcyBvZiBhbiBpbWFnZSB3aGljaCBoYXMgYmVlbiByZXNpemVkLiBJcyB1c2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsXG4gICAqIG1ldHJpY3Mgb2YgYSByZXNpemVkIGltYWdlLlxuICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnQgfSBpbWcgLSBUaGUgcmVzaXplZCBIVE1MSW1hZ2VFbGVtZW50LlxuICAgKi9cbiAgc3RhdGljIGZpeEFmdGVyUmVzaXplKGltZykge1xuICAgIGltZy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgaW1nLnJlbW92ZUF0dHJpYnV0ZSgnd2lkdGgnKTtcbiAgICBpbWcucmVtb3ZlQXR0cmlidXRlKCdoZWlnaHQnKTtcbiAgICAvLyBJbiBvcmRlciB0byBhdm9pZCByZXNpemUgd2l0aCBtYXgtd2lkdGggY3NzIHByb3BlcnR5LlxuICAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcblxuICAgIGNvbnN0IHByb2Nlc3NJbWcgPSAoaW1nKSA9PiB7XG4gICAgICBpZiAoaW1nLnNyYy5pbmRleE9mKCdkYXRhOmltYWdlJykgIT09IC0xKSB7XG4gICAgICAgIGlmIChpbWcuc3JjLmluZGV4T2YoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCcpICE9PSAtMSkge1xuXG4gICAgICAgICAgLy8gSW1hZ2UgaXMgaW4gYmFzZTY0XG4gICAgICAgICAgaWYgKGltZy5zcmMuaW5kZXhPZignZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcubGVuZ3RoID09PSAyNlxuICAgICAgICAgICAgY29uc3QgYmFzZTY0U3RyaW5nID0gaW1nLmdldEF0dHJpYnV0ZSgnc3JjJykuc3Vic3RyaW5nKDI2KTtcbiAgICAgICAgICAgIGNvbnN0IHN2Z1N0cmluZyA9IHdpbmRvdy5hdG9iKGJhc2U2NFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkU3ZnU3RyaW5nID0gZW5jb2RlVVJJQ29tcG9uZW50KHN2Z1N0cmluZyk7XG4gICAgICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBgZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmOCwke2VuY29kZWRTdmdTdHJpbmd9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsJy5sZW5ndGggPT09IDMyLlxuICAgICAgICAgIGNvbnN0IHN2ZyA9IGRlY29kZVVSSUNvbXBvbmVudChpbWcuc3JjLnN1YnN0cmluZygzMiwgaW1nLnNyYy5sZW5ndGgpKTtcbiAgICAgICAgICBJbWFnZS5zZXRJbWdTaXplKGltZywgc3ZnLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgPT09IDIyLlxuICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGltZy5zcmMuc3Vic3RyaW5nKDIyLCBpbWcuc3JjLmxlbmd0aCk7XG4gICAgICAgICAgSW1hZ2Uuc2V0SW1nU2l6ZShpbWcsIGJhc2U2NCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEltYWdlLnNldEltZ1NpemUoaW1nLCBpbWcuc3JjKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSWYgdGhlIGltYWdlIGRvZXNuJ3QgY29udGFpbiBhIGJsb2IsIGp1c3QgcHJvY2VzcyBpdCBub3JtYWxseVxuICAgIGlmIChpbWcuc3JjLmluZGV4T2YoJ2Jsb2I6JykgPT09IC0xKSB7XG4gICAgICBwcm9jZXNzSW1nKGltZyk7XG4gICAgLy8gaWYgaXQgZG9lcyBjb250YWluIGEgYmxvYiwgdGhlbiByZWFkIHRoYXQsIHJlcGxhY2UgdGhlIHNyYyB3aXRoIHRoZSBkZWNvZGVkIGNvbnRlbnQsIGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCByZWFkZXIucmVzdWx0KTtcbiAgICAgICAgcHJvY2Vzc0ltZyhpbWcpO1xuICAgICAgfTtcbiAgICAgIGZldGNoKGltZy5zcmMpLnRoZW4ociA9PiByLmJsb2IoKSkudGhlbihibG9iID0+IHtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWV0cmljcyAoaGVpZ2h0LCB3aWR0aCBhbmQgYmFzZWxpbmUpIGNvbnRhaW5lZCBpbiBhIFNWRyBpbWFnZSBnZW5lcmF0ZWRcbiAgICogYnkgdGhlIE1hdGhUeXBlIGltYWdlIHNlcnZpY2UuIFRoaXMgaW1hZ2UgY29udGFpbnMgYXMgYW4gZXh0cmEgY3VzdG9tIGF0dHJpYnV0ZTpcbiAgICogdGhlIGJhc2VsaW5lICh3cnM6YmFzZWxpbmUpLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3ZnU3RyaW5nIC0gVGhlIFNWRyBpbWFnZS5cbiAgICogQHJldHVybiB7QXJyYXl9IC0gVGhlIGltYWdlIG1ldHJpY3MuXG4gICAqL1xuICBzdGF0aWMgZ2V0TWV0cmljc0Zyb21TdmdTdHJpbmcoc3ZnU3RyaW5nKSB7XG4gICAgbGV0IGZpcnN0ID0gc3ZnU3RyaW5nLmluZGV4T2YoJ2hlaWdodD1cIicpO1xuICAgIGxldCBsYXN0ID0gc3ZnU3RyaW5nLmluZGV4T2YoJ1wiJywgZmlyc3QgKyA4LCBzdmdTdHJpbmcubGVuZ3RoKTtcbiAgICBjb25zdCBoZWlnaHQgPSBzdmdTdHJpbmcuc3Vic3RyaW5nKGZpcnN0ICsgOCwgbGFzdCk7XG5cbiAgICBmaXJzdCA9IHN2Z1N0cmluZy5pbmRleE9mKCd3aWR0aD1cIicpO1xuICAgIGxhc3QgPSBzdmdTdHJpbmcuaW5kZXhPZignXCInLCBmaXJzdCArIDcsIHN2Z1N0cmluZy5sZW5ndGgpO1xuICAgIGNvbnN0IHdpZHRoID0gc3ZnU3RyaW5nLnN1YnN0cmluZyhmaXJzdCArIDcsIGxhc3QpO1xuXG4gICAgZmlyc3QgPSBzdmdTdHJpbmcuaW5kZXhPZignd3JzOmJhc2VsaW5lPVwiJyk7XG4gICAgbGFzdCA9IHN2Z1N0cmluZy5pbmRleE9mKCdcIicsIGZpcnN0ICsgMTQsIHN2Z1N0cmluZy5sZW5ndGgpO1xuICAgIGNvbnN0IGJhc2VsaW5lID0gc3ZnU3RyaW5nLnN1YnN0cmluZyhmaXJzdCArIDE0LCBsYXN0KTtcblxuICAgIGlmICh0eXBlb2Ygd2lkdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBhcnIgPSBbXTtcbiAgICAgIGFyci5jdyA9IHdpZHRoO1xuICAgICAgYXJyLmNoID0gaGVpZ2h0O1xuICAgICAgaWYgKHR5cGVvZiBiYXNlbGluZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgYXJyLmNiID0gYmFzZWxpbmU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWV0cmljcyAod2lkdGgsIGhlaWdodCwgYmFzZWxpbmUgYW5kIGRwaSkgY29udGFpbmVkIGluIGEgUE5HIGJ5dGUgYXJyYXkuXG4gICAqIEBwYXJhbSAge0FycmF5LjxCeXRlcz59IGJ5dGVzIC0gcG5nIGJ5dGUgYXJyYXkuXG4gICAqIEByZXR1cm4ge0FycmF5fSBUaGUgcG5nIG1ldHJpY3MuXG4gICAqL1xuICBzdGF0aWMgZ2V0TWV0cmljc0Zyb21CeXRlcyhieXRlcykge1xuICAgIFV0aWwucmVhZEJ5dGVzKGJ5dGVzLCAwLCA4KTtcbiAgICBsZXQgd2lkdGg7XG4gICAgbGV0IGhlaWdodDtcbiAgICBsZXQgdHlwO1xuICAgIGxldCBiYXNlbGluZTtcbiAgICBsZXQgZHBpO1xuICAgIHdoaWxlIChieXRlcy5sZW5ndGggPj0gNCkge1xuICAgICAgdHlwID0gVXRpbC5yZWFkSW50MzIoYnl0ZXMpO1xuICAgICAgaWYgKHR5cCA9PT0gMHg0OTQ4NDQ1Mikge1xuICAgICAgICB3aWR0aCA9IFV0aWwucmVhZEludDMyKGJ5dGVzKTtcbiAgICAgICAgaGVpZ2h0ID0gVXRpbC5yZWFkSW50MzIoYnl0ZXMpO1xuICAgICAgICAvLyBSZWFkIDUgYnl0ZXMuXG4gICAgICAgIFV0aWwucmVhZEludDMyKGJ5dGVzKTtcbiAgICAgICAgVXRpbC5yZWFkQnl0ZShieXRlcyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cCA9PT0gMHg2MjYxNTM0NSkgeyAvLyBCYXNlbGluZTogJ2JhU0UnLlxuICAgICAgICBiYXNlbGluZSA9IFV0aWwucmVhZEludDMyKGJ5dGVzKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwID09PSAweDcwNDg1OTczKSB7IC8vIERwaXM6ICdwSFlzJy5cbiAgICAgICAgZHBpID0gVXRpbC5yZWFkSW50MzIoYnl0ZXMpO1xuICAgICAgICBkcGkgPSAoTWF0aC5yb3VuZChkcGkgLyAzOS4zNykpO1xuICAgICAgICBVdGlsLnJlYWRJbnQzMihieXRlcyk7XG4gICAgICAgIFV0aWwucmVhZEJ5dGUoYnl0ZXMpO1xuICAgICAgfVxuICAgICAgVXRpbC5yZWFkSW50MzIoYnl0ZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2lkdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBhcnIgPSBbXTtcbiAgICAgIGFyci5jdyA9IHdpZHRoO1xuICAgICAgYXJyLmNoID0gaGVpZ2h0O1xuICAgICAgYXJyLmRwaSA9IGRwaTtcbiAgICAgIGlmIChiYXNlbGluZSkge1xuICAgICAgICBhcnIuY2IgPSBiYXNlbGluZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG4iLCJpbXBvcnQgVGV4dENhY2hlIGZyb20gJy4vdGV4dGNhY2hlJztcbmltcG9ydCBNYXRoTUwgZnJvbSAnLi9tYXRobWwnO1xuaW1wb3J0IFNlcnZpY2VQcm92aWRlciBmcm9tICcuL3NlcnZpY2Vwcm92aWRlcic7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBVdGlsIGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgTGFUZVggcGFyc2VyLiBNYW5hZ2VzIHRoZSBzZXJ2aWNlcyB3aGljaCBhbGxvd3MgdG8gY29udmVydFxuICogTGFUZVggaW50byBNYXRoTUwgYW5kIE1hdGhNTCBpbnRvIExhVGVYLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYXRleCB7XG4gIC8qKlxuICAgKiBTdGF0aWMgcHJvcGVydHkuXG4gICAqIFJldHVybiBsYXRleCBjYWNoZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0NhY2hlfVxuICAgKi9cbiAgc3RhdGljIGdldCBjYWNoZSgpIHtcbiAgICByZXR1cm4gTGF0ZXguX2NhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBwcm9wZXJ0eSBzZXR0ZXIuXG4gICAqIFNldCBsYXRleCBjYWNoZS5cbiAgICogQHBhcmFtIHtDYWNoZX0gdmFsdWUgLSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAqIEBpZ25vcmVcbiAgKi9cbiAgc3RhdGljIHNldCBjYWNoZSh2YWx1ZSkge1xuICAgIExhdGV4Ll9jYWNoZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIE1hdGhNTCB0byBMYVRlWCBieSBjYWxsaW5nIG1hdGhtbDJsYXRleCBzZXJ2aWNlLiBGb3IgdGV4dCBzZXJ2aWNlc1xuICAgKiB3ZSBjYWxsIGEgdGV4dCBzZXJ2aWNlIHdpdGggdGhlIHBhcmFtIG1hdGhtbDJsYXRleC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1hdGhtbCAtIE1hdGhNTCBTdHJpbmcuXG4gICAqIEByZXR1cm4ge1N0cmluZ30gTGFUZVggc3RyaW5nIGdlbmVyYXRlZCBieSB0aGUgTWF0aE1MIGFyZ3VtZW50LlxuICAgKi9cbiAgc3RhdGljIGdldExhdGV4RnJvbU1hdGhNTChtYXRobWwpIHtcbiAgICBjb25zdCBtYXRobWxXaXRob3V0U2VtYW50aWNzID0gTWF0aE1MLnJlbW92ZVNlbWFudGljcyhtYXRobWwpO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtUZXh0Q2FjaGV9XG4gICAgICovXG4gICAgY29uc3QgeyBjYWNoZSB9ID0gTGF0ZXg7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgc2VydmljZTogJ21hdGhtbDJsYXRleCcsXG4gICAgICBtbWw6IG1hdGhtbFdpdGhvdXRTZW1hbnRpY3MsXG4gICAgfTtcblxuICAgIGNvbnN0IGpzb25SZXNwb25zZSA9IEpTT04ucGFyc2UoU2VydmljZVByb3ZpZGVyLmdldFNlcnZpY2UoJ3NlcnZpY2UnLCBkYXRhKSk7XG5cbiAgICAvLyBUT0RPOiBFcnJvciBoYW5kbGluZy5cbiAgICBsZXQgbGF0ZXggPSAnJztcblxuICAgIGlmIChqc29uUmVzcG9uc2Uuc3RhdHVzID09PSAnb2snKSB7XG4gICAgICBsYXRleCA9IGpzb25SZXNwb25zZS5yZXN1bHQudGV4dDtcbiAgICAgIGNvbnN0IGxhdGV4SHRtbEVudGl0aWVzRW5jb2RlZCA9IFV0aWwuaHRtbEVudGl0aWVzKGxhdGV4KTtcbiAgICAgIC8vIEluc2VydGluZyBMYVRlWCBzZW1hbnRpY3MuXG4gICAgICBjb25zdCBtYXRobWxXaXRoU2VtYW50aWNzID0gTWF0aE1MLmFkZEFubm90YXRpb24obWF0aG1sLCBsYXRleEh0bWxFbnRpdGllc0VuY29kZWQsICdMYVRlWCcpO1xuICAgICAgY2FjaGUucG9wdWxhdGUobGF0ZXgsIG1hdGhtbFdpdGhTZW1hbnRpY3MpO1xuICAgIH1cblxuICAgIHJldHVybiBsYXRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBMYVRlWCB0byBNYXRoTUwgYnkgY2FsbGluZyBsYXRleDJtYXRobWwgc2VydmljZS4gRm9yIHRleHQgc2VydmljZXNcbiAgICogd2UgY2FsbCBhIHRleHQgc2VydmljZSB3aXRoIHRoZSBwYXJhbSBsYXRleDJtYXRobWwuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsYXRleCAtIFN0cmluZyBjb250YWluaW5nIGEgTGFUZVggZm9ybXVsYS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlTGF0ZXhPblNlbWFudGljc1xuICAgKiAtIElmIHRydWUgTGFUZVggd291bGQgbWUgaW5jbHVkZWQgaW50byBNYXRoTUwgc2VtYW50aWNzLlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IE1hdGhNTCBzdHJpbmcgZ2VuZXJhdGVkIGJ5IHRoZSBMYVRlWCBhcmd1bWVudC5cbiAgICovXG4gIHN0YXRpYyBnZXRNYXRoTUxGcm9tTGF0ZXgobGF0ZXgsIGluY2x1ZGVMYXRleE9uU2VtYW50aWNzKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge1RleHRDYWNoZX1cbiAgICAgKi9cbiAgICBjb25zdCBsYXRleENhY2hlID0gTGF0ZXguY2FjaGU7XG5cbiAgICBpZiAoTGF0ZXguY2FjaGUuZ2V0KGxhdGV4KSkge1xuICAgICAgcmV0dXJuIExhdGV4LmNhY2hlLmdldChsYXRleCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBzZXJ2aWNlOiAnbGF0ZXgybWF0aG1sJyxcbiAgICAgIGxhdGV4LFxuICAgIH07XG5cbiAgICBpZiAoaW5jbHVkZUxhdGV4T25TZW1hbnRpY3MpIHtcbiAgICAgIGRhdGEuc2F2ZUxhdGV4ID0gJyc7XG4gICAgfVxuXG4gICAgY29uc3QganNvblJlc3BvbnNlID0gSlNPTi5wYXJzZShTZXJ2aWNlUHJvdmlkZXIuZ2V0U2VydmljZSgnc2VydmljZScsIGRhdGEpKTtcblxuICAgIGxldCBvdXRwdXQ7XG4gICAgaWYgKGpzb25SZXNwb25zZS5zdGF0dXMgPT09ICdvaycpIHtcbiAgICAgIGxldCBtYXRobWwgPSBqc29uUmVzcG9uc2UucmVzdWx0LnRleHQ7XG4gICAgICBtYXRobWwgPSBtYXRobWwuc3BsaXQoJ1xccicpLmpvaW4oJycpLnNwbGl0KCdcXG4nKS5qb2luKCcgJyk7XG5cbiAgICAgIC8vIFBvcHVsYXRlIExhdGV4Q2FjaGUuXG4gICAgICBpZiAobWF0aG1sLmluZGV4T2YoJ3NlbWFudGljcycpID09PSAtMSAmJiBtYXRobWwuaW5kZXhPZignYW5ub3RhdGlvbicpID09PSAtMSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gVXRpbC5odG1sRW50aXRpZXMobGF0ZXgpO1xuICAgICAgICBtYXRobWwgPSBNYXRoTUwuYWRkQW5ub3RhdGlvbihtYXRobWwsIGNvbnRlbnQsICdMYVRlWCcpO1xuICAgICAgICBvdXRwdXQgPSBtYXRobWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgPSBtYXRobWw7XG4gICAgICB9XG4gICAgICBpZiAoIWxhdGV4Q2FjaGUuZ2V0KGxhdGV4KSkge1xuICAgICAgICBsYXRleENhY2hlLnBvcHVsYXRlKGxhdGV4LCBtYXRobWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQgPSBgJCQke2xhdGV4fSQkYDtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbGwgb2NjdXJyZW5jZXMgb2YgTWF0aE1MIGNvZGUgdG8gTGFUZVguXG4gICAqIFRoZSBNYXRoTUwgY29kZSBzaG91bGQgY29udGFpbmluZyA8YW5ub3RhdGlvbiBlbmNvZGluZz1cIkxhVGVYXCIvPiB0byBiZSBjb252ZXJ0ZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IC0gQSBzdHJpbmcgY29udGFpbmluZyBNYXRoTUwgdmFsaWQgY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYXJhY3RlcnMgLSBBbiBvYmplY3QgY29udGFpbmluZyBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAqIEByZXR1cm4ge1N0cmluZ30gQSBzdHJpbmcgY29udGFpbmluZyBhbGwgTWF0aE1MIGFubm90YXRlZCBvY2N1cnJlbmNlc1xuICAgKiByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyBMYVRlWCBjb2RlLlxuICAgKi9cbiAgc3RhdGljIHBhcnNlTWF0aG1sVG9MYXRleChjb250ZW50LCBjaGFyYWN0ZXJzKSB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIGNvbnN0IG1hdGhUYWdCZWdpbiA9IGAke2NoYXJhY3RlcnMudGFnT3BlbmVyfW1hdGhgO1xuICAgIGNvbnN0IG1hdGhUYWdFbmQgPSBgJHtjaGFyYWN0ZXJzLnRhZ09wZW5lcn0vbWF0aCR7Y2hhcmFjdGVycy50YWdDbG9zZXJ9YDtcbiAgICBjb25zdCBvcGVuVGFyZ2V0ID0gYCR7Y2hhcmFjdGVycy50YWdPcGVuZXJ9YW5ub3RhdGlvbiBlbmNvZGluZz0ke2NoYXJhY3RlcnMuZG91YmxlUXVvdGV9TGFUZVgke2NoYXJhY3RlcnMuZG91YmxlUXVvdGV9JHtjaGFyYWN0ZXJzLnRhZ0Nsb3Nlcn1gO1xuICAgIGNvbnN0IGNsb3NlVGFyZ2V0ID0gYCR7Y2hhcmFjdGVycy50YWdPcGVuZXJ9L2Fubm90YXRpb24ke2NoYXJhY3RlcnMudGFnQ2xvc2VyfWA7XG4gICAgbGV0IHN0YXJ0ID0gY29udGVudC5pbmRleE9mKG1hdGhUYWdCZWdpbik7XG4gICAgbGV0IGVuZCA9IDA7XG4gICAgbGV0IG1hdGhtbDtcbiAgICBsZXQgc3RhcnRBbm5vdGF0aW9uO1xuICAgIGxldCBjbG9zZUFubm90YXRpb247XG5cbiAgICB3aGlsZSAoc3RhcnQgIT09IC0xKSB7XG4gICAgICBvdXRwdXQgKz0gY29udGVudC5zdWJzdHJpbmcoZW5kLCBzdGFydCk7XG4gICAgICBlbmQgPSBjb250ZW50LmluZGV4T2YobWF0aFRhZ0VuZCwgc3RhcnQpO1xuXG4gICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICBlbmQgPSBjb250ZW50Lmxlbmd0aCAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgKz0gbWF0aFRhZ0VuZC5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIG1hdGhtbCA9IGNvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuXG4gICAgICBzdGFydEFubm90YXRpb24gPSBtYXRobWwuaW5kZXhPZihvcGVuVGFyZ2V0KTtcbiAgICAgIGlmIChzdGFydEFubm90YXRpb24gIT09IC0xKSB7XG4gICAgICAgIHN0YXJ0QW5ub3RhdGlvbiArPSBvcGVuVGFyZ2V0Lmxlbmd0aDtcbiAgICAgICAgY2xvc2VBbm5vdGF0aW9uID0gbWF0aG1sLmluZGV4T2YoY2xvc2VUYXJnZXQpO1xuICAgICAgICBsZXQgbGF0ZXggPSBtYXRobWwuc3Vic3RyaW5nKHN0YXJ0QW5ub3RhdGlvbiwgY2xvc2VBbm5vdGF0aW9uKTtcbiAgICAgICAgaWYgKGNoYXJhY3RlcnMgPT09IENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycykge1xuICAgICAgICAgIGxhdGV4ID0gTWF0aE1MLnNhZmVYbWxEZWNvZGUobGF0ZXgpO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dCArPSBgJCQke2xhdGV4fSQkYDtcbiAgICAgICAgLy8gUG9wdWxhdGUgbGF0ZXggaW50byBjYWNoZS5cblxuICAgICAgICBMYXRleC5jYWNoZS5wb3B1bGF0ZShsYXRleCwgbWF0aG1sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCArPSBtYXRobWw7XG4gICAgICB9XG4gICAgICBzdGFydCA9IGNvbnRlbnQuaW5kZXhPZihtYXRoVGFnQmVnaW4sIGVuZCk7XG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGNvbnRlbnQuc3Vic3RyaW5nKGVuZCwgY29udGVudC5sZW5ndGgpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGxhdGV4IG9mIGEgZGV0ZXJtaW5lZCBwb3NpdGlvbiBpbiBhIHRleHQuXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGV4dE5vZGUgLSB0ZXh0Tm9kZSB0byBleHRyYWN0IHRoZSBMYVRlWFxuICAgKiBAcGFyYW0ge051bWJlcn0gY2FyZXRQb3NpdGlvbiAtIFN0YXJ0aW5nIHBvc2l0aW9uIHRvIGZpbmQgTGFUZVguXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsYXRleFRhZ3MgLSBPcHRpb25hbCBwYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRhZ3MgYmV0d2VlbiBsYXRleCBpcyBpbnNlcnRlZC5cbiAgICogSXQgaGFzIHRoZSAnb3BlbicgYXR0cmlidXRlIGZvciB0aGUgb3BlbiB0YWcgYW5kIHRoZSAnY2xvc2UnIGF0dHJpYnV0ZSBmb3IgdGhlIGNsb3NlIHRhZy5cbiAgICogXCIkJFwiIGJ5IGRlZmF1bHQuXG4gICAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggMyBrZXlzOiAnbGF0ZXgnLCAnc3RhcnQnIGFuZCAnZW5kJy4gTnVsbCBpZiBsYXRleCBpcyBub3QgZm91bmQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXRMYXRleEZyb21UZXh0Tm9kZSh0ZXh0Tm9kZSwgY2FyZXRQb3NpdGlvbiwgbGF0ZXhUYWdzKSB7XG4gICAgLy8gVE9ETzogU2V0IExhVGVYIFRhZ3MgYXMgQ29yZSB2YXJpYWJsZS4gRml4IHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gKHRoaXJkIGFyZ3VtZW50KS5cbiAgICAvLyBUYWdzIHVzZWQgZm9yIExhVGVYIGZvcm11bGFzLlxuICAgIGNvbnN0IGRlZmF1bHRMYXRleFRhZ3MgPSB7XG4gICAgICBvcGVuOiAnJCQnLFxuICAgICAgY2xvc2U6ICckJCcsXG4gICAgfTtcbiAgICAvLyBsYXRleFRhZ3MgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBJZiBpcyBub3Qgc2V0LCB1c2UgZGVmYXVsdCBsYXRleFRhZ3MuXG4gICAgaWYgKHR5cGVvZiBsYXRleFRhZ3MgPT09ICd1bmRlZmluZWQnIHx8IGxhdGV4VGFncyA9PSBudWxsKSB7XG4gICAgICBsYXRleFRhZ3MgPSBkZWZhdWx0TGF0ZXhUYWdzO1xuICAgIH1cbiAgICAvLyBMb29raW5nIGZvciB0aGUgZmlyc3QgdGV4dE5vZGUuXG4gICAgbGV0IHN0YXJ0Tm9kZSA9IHRleHROb2RlO1xuXG4gICAgd2hpbGUgKHN0YXJ0Tm9kZS5wcmV2aW91c1NpYmxpbmcgJiYgc3RhcnROb2RlLnByZXZpb3VzU2libGluZy5ub2RlVHlwZSA9PT0gMykgeyAvLyBURVhUX05PREUuXG4gICAgICBzdGFydE5vZGUgPSBzdGFydE5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5leHQgbGF0ZXggcG9zaXRpb24gYW5kIG5vZGUgZnJvbSBhIHNwZWNpZmljIG5vZGUgYW5kIHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gY3VycmVudE5vZGUgLSBOb2RlIHdoZXJlIHNlYXJjaGluZyBsYXRleC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gY3VycmVudFBvc2l0aW9uIC0gQ3VycmVudCBwb3NpdGlvbiBpbnNpZGUgdGhlIGN1cnJlbnROb2RlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsYXRleFRhZ3NUb1VzZSAtIFRhZ3MgdXNlZCBhdCBsYXRleCBiZWdpbm5pbmcgYW5kIGxhdGV4IGZpbmFsLlxuICAgICAqIFwiJCRcIiBieSBkZWZhdWx0LlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdGFnIC0gVGFnIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2VhcmNoLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IG5vZGUgYW5kIHRoZSBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXROZXh0TGF0ZXhQb3NpdGlvbihjdXJyZW50Tm9kZSwgY3VycmVudFBvc2l0aW9uLCB0YWcpIHtcbiAgICAgIGxldCBwb3NpdGlvbiA9IGN1cnJlbnROb2RlLm5vZGVWYWx1ZS5pbmRleE9mKHRhZywgY3VycmVudFBvc2l0aW9uKTtcblxuICAgICAgd2hpbGUgKHBvc2l0aW9uID09PSAtMSkge1xuICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nO1xuXG4gICAgICAgIGlmICghY3VycmVudE5vZGUpIHsgLy8gVEVYVF9OT0RFLlxuICAgICAgICAgIHJldHVybiBudWxsOyAvLyBOb3QgZm91bmQuXG4gICAgICAgIH1cblxuICAgICAgICBwb3NpdGlvbiA9IGN1cnJlbnROb2RlLm5vZGVWYWx1ZSA/IGN1cnJlbnROb2RlLm5vZGVWYWx1ZS5pbmRleE9mKGxhdGV4VGFncy5jbG9zZSkgOiAtMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZTogY3VycmVudE5vZGUsXG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGEgbm9kZSBpcyBwcmV2aW91cywgb3Igbm90LCB0byBhIHNlY29uZCBvbmUuXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gU3RhcnQgbm9kZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBTdGFydCBub2RlIHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZW5kTm9kZSAtIEVuZCBub2RlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbmRQb3NpdGlvbiAtIEVuZCBub2RlIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBzdGFydGluZyBub2RlIGlzIHByZXZpb3VzIHRoYW50IHRoZSBlbiBub2RlLiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcmV2aW91cyhub2RlLCBwb3NpdGlvbiwgZW5kTm9kZSwgZW5kUG9zaXRpb24pIHtcbiAgICAgIGlmIChub2RlID09PSBlbmROb2RlKSB7XG4gICAgICAgIHJldHVybiAocG9zaXRpb24gPD0gZW5kUG9zaXRpb24pO1xuICAgICAgfVxuICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZW5kTm9kZSkge1xuICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChub2RlID09PSBlbmROb2RlKTtcbiAgICB9XG5cbiAgICBsZXQgc3RhcnQ7XG4gICAgbGV0IGVuZCA9IHtcbiAgICAgIG5vZGU6IHN0YXJ0Tm9kZSxcbiAgICAgIHBvc2l0aW9uOiAwLFxuICAgIH07XG4gICAgLy8gSXMgc3VwcG9zZWQgdGhhdCBvcGVuIGFuZCBjbG9zZSB0YWdzIGhhcyB0aGUgc2FtZSBsZW5ndGguXG4gICAgY29uc3QgdGFnTGVuZ3RoID0gbGF0ZXhUYWdzLm9wZW4ubGVuZ3RoO1xuICAgIGRvIHtcbiAgICAgIHN0YXJ0ID0gZ2V0TmV4dExhdGV4UG9zaXRpb24oZW5kLm5vZGUsIGVuZC5wb3NpdGlvbiwgbGF0ZXhUYWdzLm9wZW4pO1xuXG4gICAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBpc1ByZXZpb3VzKHRleHROb2RlLCBjYXJldFBvc2l0aW9uLCBzdGFydC5ub2RlLCBzdGFydC5wb3NpdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGVuZCA9IGdldE5leHRMYXRleFBvc2l0aW9uKHN0YXJ0Lm5vZGUsIHN0YXJ0LnBvc2l0aW9uICsgdGFnTGVuZ3RoLCBsYXRleFRhZ3MuY2xvc2UpO1xuXG4gICAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGVuZC5wb3NpdGlvbiArPSB0YWdMZW5ndGg7XG4gICAgfSB3aGlsZSAoaXNQcmV2aW91cyhlbmQubm9kZSwgZW5kLnBvc2l0aW9uLCB0ZXh0Tm9kZSwgY2FyZXRQb3NpdGlvbikpO1xuXG4gICAgLy8gSXNvbGF0aW5nIGxhdGV4LlxuICAgIGxldCBsYXRleDtcblxuICAgIGlmIChzdGFydC5ub2RlID09PSBlbmQubm9kZSkge1xuICAgICAgbGF0ZXggPSBzdGFydC5ub2RlLm5vZGVWYWx1ZS5zdWJzdHJpbmcoc3RhcnQucG9zaXRpb24gKyB0YWdMZW5ndGgsIGVuZC5wb3NpdGlvbiAtIHRhZ0xlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gc3RhcnQucG9zaXRpb24gKyB0YWdMZW5ndGg7XG4gICAgICBsYXRleCA9IHN0YXJ0Lm5vZGUubm9kZVZhbHVlLnN1YnN0cmluZyhpbmRleCwgc3RhcnQubm9kZS5ub2RlVmFsdWUubGVuZ3RoKTtcbiAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHN0YXJ0Lm5vZGU7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0U2libGluZztcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09PSBlbmQubm9kZSkge1xuICAgICAgICAgIGxhdGV4ICs9IGVuZC5ub2RlLm5vZGVWYWx1ZS5zdWJzdHJpbmcoMCwgZW5kLnBvc2l0aW9uIC0gdGFnTGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXRleCArPSBjdXJyZW50Tm9kZS5ub2RlVmFsdWUgPyBjdXJyZW50Tm9kZS5ub2RlVmFsdWUgOiAnJztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoY3VycmVudE5vZGUgIT09IGVuZC5ub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGF0ZXgsXG4gICAgICBzdGFydE5vZGU6IHN0YXJ0Lm5vZGUsXG4gICAgICBzdGFydFBvc2l0aW9uOiBzdGFydC5wb3NpdGlvbixcbiAgICAgIGVuZE5vZGU6IGVuZC5ub2RlLFxuICAgICAgZW5kUG9zaXRpb246IGVuZC5wb3NpdGlvbixcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVGV4dCBjYWNoZS4gU3RvcmVzIGFsbCBwcm9jZXNzZWQgTGFUZVggc3RyaW5ncyBhbmQgaXQncyBjb3JyZXNwb25kZW50IE1hdGhNTCBzdHJpbmcuXG4gKiBAdHlwZSB7Q2FjaGV9XG4gKiBAc3RhdGljXG4gKi9cbkxhdGV4Ll9jYWNoZSA9IG5ldyBUZXh0Q2FjaGUoKTtcbiIsIi8qKlxuICogVGhpcyBvYmplY3QgcmVwcmVzZW50cyBhIGN1c3RvbSBsaXN0ZW5lci5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVyXG4gKiBAcHJvcGVydHkge1N0cmluZ30gTGlzdGVuZXIuZXZlbnROYW1lIC0gVGhlIGxpc3RlbmVyIG5hbWUuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBMaXN0ZW5lci5jYWxsYmFjayAtIFRoZSBsaXN0ZW5lciBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0ZW5lcnMge1xuICAvKipcbiAgICogQGNsYXNzZGVzY1xuICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjdXN0b20gbGlzdGVuZXJzIG1hbmFnZXIuXG4gICAqIEBjb25zdHJ1Y3RzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBjb250YWluaW5nIGFsbCBjdXN0b20gbGlzdGVuZXJzLlxuICAgICAqIEB0eXBlIHtPYmplY3RbXX1cbiAgICAgKi9cbiAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIExpc3RlbmVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbGlzdGVuZXIgLSBBIGxpc3RlbmVyIG9iamVjdC5cbiAgICovXG4gIGFkZChsaXN0ZW5lcikge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIE1hdGhUeXBlIGV2ZW50IGxpc3RlbmVyc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIC0gZXZlbnQgbmFtZVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIGV2ZW50IG9iamVjdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gZmFsc2UgaWYgZXZlbnQgaGFzIGJlZW4gcHJldmVudGVkLiB0cnVlIG90aGVyd2lzZS5cbiAgICovXG4gIGZpcmUoZXZlbnROYW1lLCBldmVudCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5saXN0ZW5lcnMubGVuZ3RoICYmICFldmVudC5jYW5jZWxsZWQ7IGkgKz0gMSkge1xuICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2ldLmV2ZW50TmFtZSA9PT0gZXZlbnROYW1lKSB7XG4gICAgICAgIC8vIENhbGxpbmcgbGlzdGVuZXIuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzW2ldLmNhbGxiYWNrKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBsaXN0ZW5lciBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBFdmVudCBuYW1lLlxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge29iamVjdH0gdGhlIGxpc3RlbmVyIG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBuZXdMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbGlzdGVuZXIgPSB7fTtcbiAgICBsaXN0ZW5lci5ldmVudE5hbWUgPSBldmVudE5hbWU7XG4gICAgbGlzdGVuZXIuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICByZXR1cm4gbGlzdGVuZXI7XG4gIH1cbn1cbiIsImltcG9ydCBDb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IFV0aWwgZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjbGFzcyB0byBtYW5hZ2UgTWF0aE1MIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hdGhNTCB7XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIG1hdGhtbCBhdCBwb3NpdGlvbiBpIGlzIGluc2lkZSBhbiBIVE1MIGF0dHJpYnV0ZSBvciBub3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gYSBzdHJpbmcgY29udGFpbmluZyBNYXRoTUwgY29kZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGkgLSAgc2VhcmNoIGluZGV4LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGlzIGluc2lkZSBhbiBIVE1MIGF0dHJpYnV0ZS4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RhdGljIGlzTWF0aG1sSW5BdHRyaWJ1dGUoY29udGVudCwgaSkge1xuICAgIC8vIFJlZ2V4ID1cbiAgICAvLyAnXltcXCdcIl1bXFxcXHNdKj1bXFxcXHNdKltcXFxcdy1dKyhbXFxcXHNdKihcIlteXCJdKlwifFxcJ1teXFwnXSpcXCcpW1xcXFxzXSpcbiAgICAvLyA9W1xcXFxzXSpbXFxcXHctXStbXFxcXHNdKikqW1xcXFxzXStnbWk8JztcbiAgICBjb25zdCBtYXRoQXR0ID0gJ1tcXCdcIl1bXFxcXHNdKj1bXFxcXHNdKltcXFxcdy1dKyc7IC8vIFwiPWF0dCBPUiAnPWF0dFxuICAgIGNvbnN0IGF0dENvbnRlbnQgPSAnXCJbXlwiXSpcInxcXCdbXlxcJ10qXFwnJzsgLy8gXCJibGFibGFcIiBPUiAnYmxhYmxhJ1xuICAgIGNvbnN0IGF0dCA9IGBbXFxcXHNdKigke2F0dENvbnRlbnR9KVtcXFxcc10qPVtcXFxcc10qW1xcXFx3LV0rW1xcXFxzXSpgOyAvLyBcImJsYWJsYVwiPWF0dCBPUiAnYmxhYmxhJz1hdHRcbiAgICBjb25zdCBhdHRzID0gYCgnJHthdHR9JykqYDsgLy8gXCJibGFibGFcIj1hdHQxIFwiYmxhYmxhXCI9YXR0MlxuICAgIGNvbnN0IHJlZ2V4ID0gYF4ke21hdGhBdHR9JHthdHRzfVtcXFxcc10rZ21pPGA7IC8vIFwiPWF0dCBcImJsYWJsYVwiPWF0dDEgXCJibGFibGFcIj1hdHQyIGdtaTwgLlxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKHJlZ2V4KTtcblxuICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZygwLCBpKTtcbiAgICBjb25zdCByZXZlcnNlZCA9IGFjdHVhbENvbnRlbnQuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKTtcbiAgICBjb25zdCBleGlzdHMgPSBleHByZXNzaW9uLnRlc3QocmV2ZXJzZWQpO1xuXG4gICAgcmV0dXJuIGV4aXN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGFuIGVuY29kZWQgTWF0aE1MIHdpdGggc3RhbmRhcmQgWE1MIHRhZ3MuXG4gICAqIFdlIHVzZSB0aGVzZSBlbnRpdGllcyBiZWNhdXNlIElFIGRvZXNuJ3Qgc3VwcG9ydCBodG1sIGVudGl0aWVzXG4gICAqIG9uIGl0cyBhdHRyaWJ1dGVzIHNvbWV0aW1lcy4gWWVzLCBzb21ldGltZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIHN0cmluZyB0byBiZSBkZWNvZGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGRlY29kZWQgc3RyaW5nLlxuICAgKi9cbiAgc3RhdGljIHNhZmVYbWxEZWNvZGUoaW5wdXQpIHtcbiAgICBsZXQgeyB0YWdPcGVuZXIgfSA9IENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVyc0VudGl0aWVzO1xuICAgIGxldCB7IHRhZ0Nsb3NlciB9ID0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzRW50aXRpZXM7XG4gICAgbGV0IHsgZG91YmxlUXVvdGUgfSA9IENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVyc0VudGl0aWVzO1xuICAgIGxldCB7IHJlYWxEb3VibGVRdW90ZSB9ID0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzRW50aXRpZXM7XG4gICAgLy8gRGVjb2RpbmcgZW50aXRpZXMuXG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdCh0YWdPcGVuZXIpLmpvaW4oQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzLnRhZ09wZW5lcik7XG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdCh0YWdDbG9zZXIpLmpvaW4oQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzLnRhZ0Nsb3Nlcik7XG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdChkb3VibGVRdW90ZSkuam9pbihDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMuZG91YmxlUXVvdGUpO1xuICAgIC8vIEFkZGVkIHRvIGZpeCBwcm9ibGVtIGR1ZSB0byBpbXBvcnQgZnJvbSAxLjkueC5cbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KHJlYWxEb3VibGVRdW90ZSkuam9pbihDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMucmVhbERvdWJsZVF1b3RlKTtcblxuICAgIC8vIEJsYWNrYm9hcmQuXG4gICAgY29uc3QgeyBsdEVsZW1lbnQgfSA9IENvbnN0YW50cy5zYWZlQmFkQmxhY2tib2FyZENoYXJhY3RlcnM7XG4gICAgY29uc3QgeyBndEVsZW1lbnQgfSA9IENvbnN0YW50cy5zYWZlQmFkQmxhY2tib2FyZENoYXJhY3RlcnM7XG4gICAgY29uc3QgeyBhbXBFbGVtZW50IH0gPSBDb25zdGFudHMuc2FmZUJhZEJsYWNrYm9hcmRDaGFyYWN0ZXJzO1xuICAgIGlmICgnX3dyc19ibGFja2JvYXJkJyBpbiB3aW5kb3cgJiYgd2luZG93Ll93cnNfYmxhY2tib2FyZCkge1xuICAgICAgaW5wdXQgPSBpbnB1dC5zcGxpdChsdEVsZW1lbnQpLmpvaW4oQ29uc3RhbnRzLnNhZmVHb29kQmxhY2tib2FyZENoYXJhY3RlcnMubHRFbGVtZW50KTtcbiAgICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoZ3RFbGVtZW50KS5qb2luKENvbnN0YW50cy5zYWZlR29vZEJsYWNrYm9hcmRDaGFyYWN0ZXJzLmd0RWxlbWVudCk7XG4gICAgICBpbnB1dCA9IGlucHV0LnNwbGl0KGFtcEVsZW1lbnQpLmpvaW4oQ29uc3RhbnRzLnNhZmVHb29kQmxhY2tib2FyZENoYXJhY3RlcnMuYW1wRWxlbWVudCk7XG4gICAgfVxuXG4gICAgKHsgdGFnT3BlbmVyIH0gPSBDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMpO1xuICAgICh7IHRhZ0Nsb3NlciB9ID0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzKTtcbiAgICAoeyBkb3VibGVRdW90ZSB9ID0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzKTtcbiAgICAoeyByZWFsRG91YmxlUXVvdGUgfSA9IENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycyk7XG4gICAgY29uc3QgeyBhbXBlcnNhbmQgfSA9IENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycztcbiAgICBjb25zdCB7IHF1b3RlIH0gPSBDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnM7XG5cbiAgICAvLyBEZWNvZGluZyBjaGFyYWN0ZXJzLlxuICAgIGlucHV0ID0gaW5wdXQuc3BsaXQodGFnT3BlbmVyKS5qb2luKENvbnN0YW50cy54bWxDaGFyYWN0ZXJzLnRhZ09wZW5lcik7XG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdCh0YWdDbG9zZXIpLmpvaW4oQ29uc3RhbnRzLnhtbENoYXJhY3RlcnMudGFnQ2xvc2VyKTtcbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KGRvdWJsZVF1b3RlKS5qb2luKENvbnN0YW50cy54bWxDaGFyYWN0ZXJzLmRvdWJsZVF1b3RlKTtcbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KGFtcGVyc2FuZCkuam9pbihDb25zdGFudHMueG1sQ2hhcmFjdGVycy5hbXBlcnNhbmQpO1xuICAgIGlucHV0ID0gaW5wdXQuc3BsaXQocXVvdGUpLmpvaW4oQ29uc3RhbnRzLnhtbENoYXJhY3RlcnMucXVvdGUpO1xuXG4gICAgLy8gV2UgYXJlIHJlcGxhY2luZyAkIGJ5ICYgd2hlbiBpdHMgcGFydCBvZiBhbiBlbnRpdHkgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkuXG4gICAgLy8gTm93LCB0aGUgc3RhbmRhcmQgaXMgcmVwbGFjZSDCpyBieSAmLlxuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuICAgIGxldCBjdXJyZW50RW50aXR5ID0gbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXJhY3RlciA9IGlucHV0LmNoYXJBdChpKTtcbiAgICAgIGlmIChjdXJyZW50RW50aXR5ID09IG51bGwpIHtcbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJyQnKSB7XG4gICAgICAgICAgY3VycmVudEVudGl0eSA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVyblZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICc7Jykge1xuICAgICAgICByZXR1cm5WYWx1ZSArPSBgJiR7Y3VycmVudEVudGl0eX1gO1xuICAgICAgICBjdXJyZW50RW50aXR5ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyLm1hdGNoKC8oW2EtekEtWjAtOSMuXy1dIHwgJy0nKS8pKSB7IC8vIENoYXJhY3RlciBpcyBwYXJ0IG9mIGFuIGVudGl0eS5cbiAgICAgICAgY3VycmVudEVudGl0eSArPSBjaGFyYWN0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm5WYWx1ZSArPSBgJCR7Y3VycmVudEVudGl0eX1gOyAvLyBJcyBub3QgYW4gZW50aXR5LlxuICAgICAgICBjdXJyZW50RW50aXR5ID0gbnVsbDtcbiAgICAgICAgaSAtPSAxOyAvLyBQYXJzZSBhZ2FpbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIuXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgYSBNYXRoTUwgd2l0aCBzdGFuZGFyZCBYTUwgdGFncyB0byBhIE1NYXRoTUwgZW5jb2RlZCB3aXRoIHNhZmUgWE1MIHRhZ3MuXG4gICAqIFdlIHVzZSB0aGVzZSBlbnRpdGllcyBiZWNhdXNlIElFIGRvZXNuJ3Qgc3VwcG9ydCBodG1sIGVudGl0aWVzIG9uIGl0cyBhdHRyaWJ1dGVzIHNvbWV0aW1lcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gaW5wdXQgc3RyaW5nIHRvIGJlIGVuY29kZWRcbiAgICogQHJldHVybnMge3N0cmluZ30gZW5jb2RlZCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgc2FmZVhtbEVuY29kZShpbnB1dCkge1xuICAgIGNvbnN0IHsgdGFnT3BlbmVyIH0gPSBDb25zdGFudHMueG1sQ2hhcmFjdGVycztcbiAgICBjb25zdCB7IHRhZ0Nsb3NlciB9ID0gQ29uc3RhbnRzLnhtbENoYXJhY3RlcnM7XG4gICAgY29uc3QgeyBkb3VibGVRdW90ZSB9ID0gQ29uc3RhbnRzLnhtbENoYXJhY3RlcnM7XG4gICAgY29uc3QgeyBhbXBlcnNhbmQgfSA9IENvbnN0YW50cy54bWxDaGFyYWN0ZXJzO1xuICAgIGNvbnN0IHsgcXVvdGUgfSA9IENvbnN0YW50cy54bWxDaGFyYWN0ZXJzO1xuXG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdCh0YWdPcGVuZXIpLmpvaW4oQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzLnRhZ09wZW5lcik7XG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdCh0YWdDbG9zZXIpLmpvaW4oQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzLnRhZ0Nsb3Nlcik7XG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdChkb3VibGVRdW90ZSkuam9pbihDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMuZG91YmxlUXVvdGUpO1xuICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoYW1wZXJzYW5kKS5qb2luKENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycy5hbXBlcnNhbmQpO1xuICAgIGlucHV0ID0gaW5wdXQuc3BsaXQocXVvdGUpLmpvaW4oQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzLnF1b3RlKTtcblxuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBzcGVjaWFsIHN5bWJvbHMgKD4gMTI4KSB0byBlbnRpdGllcyBhbmQgcmVwbGFjZXMgYWxsIHRleHR1YWxcbiAgICogZW50aXRpZXMgYnkgaXRzIG51bWJlciBlbnRpdGllcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGhtbCAtIE1hdGhNTCBzdHJpbmcgY29udGFpbmluZyAtIG9yIG5vdCAtIHNwZWNpYWwgc3ltYm9sc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBNYXRoTUwgd2l0aCBhbGwgdGV4dHVhbCBlbnRpdGllcyByZXBsYWNlZC5cbiAgICovXG4gIHN0YXRpYyBtYXRoTUxFbnRpdGllcyhtYXRobWwpIHtcbiAgICBsZXQgdG9SZXR1cm4gPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0aG1sLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyYWN0ZXIgPSBtYXRobWwuY2hhckF0KGkpO1xuXG4gICAgICAvLyBQYXJzaW5nID4gMTI4IGNoYXJhY3RlcnMuXG4gICAgICBpZiAobWF0aG1sLmNvZGVQb2ludEF0KGkpID4gMTI4KSB7XG4gICAgICAgIHRvUmV0dXJuICs9IGAmIyR7bWF0aG1sLmNvZGVQb2ludEF0KGkpfTtgO1xuICAgICAgICAvLyBGb3IgVVRGLTMyIGNoYXJhY3RlcnMgd2UgbmVlZCB0byBtb3ZlIHRoZSBpbmRleCBvbmUgcG9zaXRpb24uXG4gICAgICAgIGlmIChtYXRobWwuY29kZVBvaW50QXQoaSkgPiAweGZmZmYpIHtcbiAgICAgICAgICBpICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnJicpIHtcbiAgICAgICAgY29uc3QgZW5kID0gbWF0aG1sLmluZGV4T2YoJzsnLCBpICsgMSk7XG4gICAgICAgIGlmIChlbmQgPj0gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gbWF0aG1sLnN1YnN0cmluZyhpLCBlbmQgKyAxKTtcbiAgICAgICAgICB0b1JldHVybiArPSBgJiMke1V0aWwuZml4ZWRDaGFyQ29kZUF0KChjb250YWluZXIudGV4dENvbnRlbnQgfHwgY29udGFpbmVyLmlubmVyVGV4dCksIDApfTtgO1xuICAgICAgICAgIGkgPSBlbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9SZXR1cm4gKz0gY2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b1JldHVybiArPSBjaGFyYWN0ZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1c3RvbSBlZGl0b3IgbmFtZSB3aXRoIHRoZSBwcmVmaXggd3JzXyB0byBhIE1hdGhNTCBjbGFzcyBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRobWwgLSBhIE1hdGhNTCBzdHJpbmcgY3JlYXRlZCB3aXRoIGEgY3VzdG9tIGVkaXRvciwgbGlrZSBjaGVtaXN0cnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21FZGl0b3IgLSBjdXN0b20gZWRpdG9yIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE1hdGhNTCBzdHJpbmcgd2l0aCBoaXMgY2xhc3MgY29udGFpbmluZyB0aGUgZWRpdG9yIHRvb2xiYXIgc3RyaW5nLlxuICAgKi9cbiAgc3RhdGljIGFkZEN1c3RvbUVkaXRvckNsYXNzQXR0cmlidXRlKG1hdGhtbCwgY3VzdG9tRWRpdG9yKSB7XG4gICAgbGV0IHRvUmV0dXJuID0gJyc7XG5cbiAgICBjb25zdCBzdGFydCA9IG1hdGhtbC5pbmRleE9mKCc8bWF0aCcpO1xuICAgIGlmIChzdGFydCA9PT0gMCkge1xuICAgICAgY29uc3QgZW5kID0gbWF0aG1sLmluZGV4T2YoJz4nKTtcbiAgICAgIGlmIChtYXRobWwuaW5kZXhPZignY2xhc3MnKSA9PT0gLTEpIHtcbiAgICAgICAgLy8gQWRkaW5nIGN1c3RvbSBlZGl0b3IgdHlwZS5cbiAgICAgICAgdG9SZXR1cm4gPSBgJHttYXRobWwuc3Vic3RyKHN0YXJ0LCBlbmQpfSBjbGFzcz1cIndyc18ke2N1c3RvbUVkaXRvcn1cIj5gO1xuICAgICAgICB0b1JldHVybiArPSBtYXRobWwuc3Vic3RyKGVuZCArIDEsIG1hdGhtbC5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRobWw7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY3VzdG9tIGVkaXRvciBuYW1lIGZyb20gdGhlIE1hdGhNTCBjbGFzcyBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRobWwgLSBhIE1hdGhNTCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21FZGl0b3IgLSBjdXN0b20gZWRpdG9yIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBpbnB1dCBNYXRoTUwgd2l0aG91dCBjdXN0b21FZGl0b3IgbmFtZSBpbiBoaXMgY2xhc3MuXG4gICAqL1xuICBzdGF0aWMgcmVtb3ZlQ3VzdG9tRWRpdG9yQ2xhc3NBdHRyaWJ1dGUobWF0aG1sLCBjdXN0b21FZGl0b3IpIHtcbiAgICAvLyBEaXNjYXJkIE1hdGhNTCB3aXRob3V0IHRoZSBzcGVjaWZpZWQgY2xhc3MuXG4gICAgaWYgKG1hdGhtbC5pbmRleE9mKCdjbGFzcycpID09PSAtMSB8fCBtYXRobWwuaW5kZXhPZihgd3JzXyR7Y3VzdG9tRWRpdG9yfWApID09PSAtMSkge1xuICAgICAgcmV0dXJuIG1hdGhtbDtcbiAgICB9XG5cbiAgICAvLyBUcml2aWFsIGNhc2U6IGNsYXNzIGF0dHJpYnV0ZSB2YWx1ZSBlcXVhbCB0byBlZGl0b3IgbmFtZS4gVGhlblxuICAgIC8vIGNsYXNzIGF0dHJpYnV0ZSBpcyByZW1vdmVkLlxuICAgIC8vIEZpcnN0IHRyeSB0byByZW1vdmUgaXQgd2l0aCBhIHNwYWNlIGJlZm9yZSBpZiB0aGVyZSBpcyBvbmVcbiAgICAvLyBPdGhlcndpc2Ugd2l0aG91dCB0aGUgc3BhY2VcbiAgICBpZiAobWF0aG1sLmluZGV4T2YoYCBjbGFzcz1cIndyc18ke2N1c3RvbUVkaXRvcn1cImApICE9PSAtMSkge1xuICAgICAgcmV0dXJuIG1hdGhtbC5yZXBsYWNlKGAgY2xhc3M9XCJ3cnNfJHtjdXN0b21FZGl0b3J9XCJgLCAnJyk7XG4gICAgfSBlbHNlIGlmIChtYXRobWwuaW5kZXhPZihgY2xhc3M9XCJ3cnNfJHtjdXN0b21FZGl0b3J9XCJgKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBtYXRobWwucmVwbGFjZShgY2xhc3M9XCJ3cnNfJHtjdXN0b21FZGl0b3J9XCJgLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gTm9uIFRyaXZpYWwgY2FzZTogY2xhc3MgYXR0cmlidXRlIGNvbnRhaW5zIGVkaXRvciBuYW1lLlxuICAgIHJldHVybiBtYXRobWwucmVwbGFjZShgd3JzXyR7Y3VzdG9tRWRpdG9yfWAsICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFubm90YXRpb24gdGFnIGluIE1hdGhNTCBlbGVtZW50LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWF0aG1sIC0gdmFsaWQgTWF0aE1MLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudCAtIHZhbHVlIHRvIHB1dCBpbnNpZGUgYW5ub3RhdGlvbiB0YWcuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhbm5vdGF0aW9uRW5jb2RpbmcgLSBhbm5vdGF0aW9uIGVuY29kaW5nLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAtICdtYXRobWwnIHdpdGggYW4gYW5ub3RhdGlvbiB0aGF0IGNvbnRhaW5zXG4gICAqICdjb250ZW50JyBhbmQgZW5jb2RpbmcgJ2VuY29kaW5nJy5cbiAgICovXG4gIHN0YXRpYyBhZGRBbm5vdGF0aW9uKG1hdGhtbCwgY29udGVudCwgYW5ub3RhdGlvbkVuY29kaW5nKSB7XG4gICAgLy8gSWYgY29udGFpbnMgYW5ub3RhdGlvbiwgYWxzbyBjb250YWlucyBzZW1hbnRpY3MgdGFnLlxuICAgIGNvbnN0IGNvbnRhaW5zQW5ub3RhdGlvbiA9IG1hdGhtbC5pbmRleE9mKCc8YW5ub3RhdGlvbicpO1xuXG4gICAgbGV0IG1hdGhtbFdpdGhBbm5vdGF0aW9uID0gJyc7XG4gICAgaWYgKGNvbnRhaW5zQW5ub3RhdGlvbiAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGNsb3NlU2VtYW50aWNzSW5kZXggPSBtYXRobWwuaW5kZXhPZignPC9zZW1hbnRpY3M+Jyk7XG4gICAgICBtYXRobWxXaXRoQW5ub3RhdGlvbiA9IGAke21hdGhtbC5zdWJzdHJpbmcoMCwgY2xvc2VTZW1hbnRpY3NJbmRleCl9PGFubm90YXRpb24gZW5jb2Rpbmc9XCIke2Fubm90YXRpb25FbmNvZGluZ31cIj4ke2NvbnRlbnR9PC9hbm5vdGF0aW9uPiR7bWF0aG1sLnN1YnN0cmluZyhjbG9zZVNlbWFudGljc0luZGV4KX1gO1xuICAgIH0gZWxzZSBpZiAoTWF0aE1MLmlzRW1wdHkobWF0aG1sKSkge1xuICAgICAgY29uc3QgZW5kSW5kZXhJbmxpbmUgPSBtYXRobWwuaW5kZXhPZignLz4nKTtcbiAgICAgIGNvbnN0IGVuZEluZGV4Tm9uSW5saW5lID0gbWF0aG1sLmluZGV4T2YoJz4nKTtcbiAgICAgIGNvbnN0IGVuZEluZGV4ID0gZW5kSW5kZXhOb25JbmxpbmUgPT09IGVuZEluZGV4SW5saW5lID8gZW5kSW5kZXhJbmxpbmUgOiBlbmRJbmRleE5vbklubGluZTtcbiAgICAgIG1hdGhtbFdpdGhBbm5vdGF0aW9uID0gYCR7bWF0aG1sLnN1YnN0cmluZygwLCBlbmRJbmRleCl9PjxzZW1hbnRpY3M+PGFubm90YXRpb24gZW5jb2Rpbmc9XCIke2Fubm90YXRpb25FbmNvZGluZ31cIj4ke2NvbnRlbnR9PC9hbm5vdGF0aW9uPjwvc2VtYW50aWNzPjwvbWF0aD5gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBiZWdpbk1hdGhNTENvbnRlbnQgPSBtYXRobWwuaW5kZXhPZignPicpICsgMTtcbiAgICAgIGNvbnN0IGVuZE1hdGhtbENvbnRlbnQgPSBtYXRobWwubGFzdEluZGV4T2YoJzwvbWF0aD4nKTtcbiAgICAgIGNvbnN0IG1hdGhtbENvbnRlbnQgPSBtYXRobWwuc3Vic3RyaW5nKGJlZ2luTWF0aE1MQ29udGVudCwgZW5kTWF0aG1sQ29udGVudCk7XG4gICAgICBtYXRobWxXaXRoQW5ub3RhdGlvbiA9IGAke21hdGhtbC5zdWJzdHJpbmcoMCwgYmVnaW5NYXRoTUxDb250ZW50KX08c2VtYW50aWNzPjxtcm93PiR7bWF0aG1sQ29udGVudH08L21yb3c+PGFubm90YXRpb24gZW5jb2Rpbmc9XCIke2Fubm90YXRpb25FbmNvZGluZ31cIj4ke2NvbnRlbnR9PC9hbm5vdGF0aW9uPjwvc2VtYW50aWNzPjwvbWF0aD5gOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0aG1sV2l0aEFubm90YXRpb247XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBzcGVjaWZpYyBhbm5vdGF0aW9uIHRhZyBpbiBNYXRoTUwgZWxlbWVudC5cbiAgICogSW4gY2FzZSBvZiByZW1vdmUgdGhlIHVuaXF1ZSBhbm5vdGF0aW9uLCBhbHNvIGlzIHJlbW92ZWQgc2VtYW50aWNzIHRhZy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1hdGhtbCAtIHZhbGlkIE1hdGhNTC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGFubm90YXRpb25FbmNvZGluZyAtIGFubm90YXRpb24gZW5jb2RpbmcgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAtICdtYXRobWwnIHdpdGhvdXQgdGhlIGFubm90YXRpb24gZW5jb2Rpbmcgc3BlY2lmaWVkLlxuICAgKi9cbiAgc3RhdGljIHJlbW92ZUFubm90YXRpb24obWF0aG1sLCBhbm5vdGF0aW9uRW5jb2RpbmcpIHtcbiAgICBsZXQgbWF0aG1sV2l0aG91dEFubm90YXRpb24gPSBtYXRobWw7XG4gICAgY29uc3Qgb3BlbkFubm90YXRpb25UYWcgPSBgPGFubm90YXRpb24gZW5jb2Rpbmc9XCIke2Fubm90YXRpb25FbmNvZGluZ31cIj5gO1xuICAgIGNvbnN0IGNsb3NlQW5ub3RhdGlvblRhZyA9ICc8L2Fubm90YXRpb24+JztcbiAgICBjb25zdCBzdGFydEFubm90YXRpb25JbmRleCA9IG1hdGhtbC5pbmRleE9mKG9wZW5Bbm5vdGF0aW9uVGFnKTtcbiAgICBpZiAoc3RhcnRBbm5vdGF0aW9uSW5kZXggIT09IC0xKSB7XG4gICAgICBsZXQgZGlmZmVyZW50QW5ub3RhdGlvbkZvdW5kID0gZmFsc2U7XG4gICAgICBsZXQgZGlmZmVyZW50QW5ub3RhdGlvbkluZGV4ID0gbWF0aG1sLmluZGV4T2YoJzxhbm5vdGF0aW9uJyk7XG4gICAgICB3aGlsZSAoZGlmZmVyZW50QW5ub3RhdGlvbkluZGV4ICE9PSAtMSkge1xuICAgICAgICBpZiAoZGlmZmVyZW50QW5ub3RhdGlvbkluZGV4ICE9PSBzdGFydEFubm90YXRpb25JbmRleCkge1xuICAgICAgICAgIGRpZmZlcmVudEFubm90YXRpb25Gb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZGlmZmVyZW50QW5ub3RhdGlvbkluZGV4ID0gbWF0aG1sLmluZGV4T2YoJzxhbm5vdGF0aW9uJywgZGlmZmVyZW50QW5ub3RhdGlvbkluZGV4ICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWZmZXJlbnRBbm5vdGF0aW9uRm91bmQpIHtcbiAgICAgICAgY29uc3QgY2xvc2VJbmRleCA9IG1hdGhtbC5pbmRleE9mKGNsb3NlQW5ub3RhdGlvblRhZywgc3RhcnRBbm5vdGF0aW9uSW5kZXgpO1xuICAgICAgICBjb25zdCBlbmRBbm5vdGF0aW9uSW5kZXggPSBjbG9zZUluZGV4ICsgY2xvc2VBbm5vdGF0aW9uVGFnLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IG1hdGhtbC5zdWJzdHJpbmcoMCwgc3RhcnRBbm5vdGF0aW9uSW5kZXgpO1xuICAgICAgICBtYXRobWxXaXRob3V0QW5ub3RhdGlvbiA9IHN0YXJ0SW5kZXggKyBtYXRobWwuc3Vic3RyaW5nKGVuZEFubm90YXRpb25JbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXRobWxXaXRob3V0QW5ub3RhdGlvbiA9IE1hdGhNTC5yZW1vdmVTZW1hbnRpY3MobWF0aG1sKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0aG1sV2l0aG91dEFubm90YXRpb247XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBzZW1hbnRpY3MgdGFnIHRvIG1hdGhtbC5cbiAgICogV2hlbiB1c2luZyBIYW5kIHRvIGNyZWF0ZSBmb3JtdWxhcywgaXQgYWRkcyB0aGUgbXJvdyB0YWcgZHVlIHRvIHRoZSBzZW1hbnRpY3Mgb25lLCB0aGlzIG9uZSBpcyBhbHNvIHJlbW92ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRobWwgLSBNYXRoTUwgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtICdtYXRobWwnIHdpdGhvdXQgc2VtYW50aWNzIHRhZy5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVTZW1hbnRpY3MobWF0aG1sKSB7XG4gICAgLy8gSWYgYG1yb3dgIGlzIGZvdW5kIHJpZ2h0IGJlZm9yZSB0aGUgYHNlbWFudGljc2Agc3RhcnRpbmcgdGFnLCBpdCdzIHJlbW92ZWQgYXMgd2VsbCBcbiAgICBjb25zdCBzZW1hbnRpY3NTdGFydGluZ1RhZ1JlZ2V4ID0gLzxzZW1hbnRpY3M+XFxzKj8oPG1yb3c+KT8vZ207XG5cbiAgICAvLyBJZiBgbXJvd2AgaXMgZm91bmQgcmlnaHQgYWZ0ZXIgdGhlIGBhbm5vdGF0aW9uYCBlbmRpbmcgdGFnLCBpdCdzIHJlbW92ZWQgYXMgd2VsbFxuICAgIC8vIGFsb25nc2lkZSBgc2VtYW50aWNzYCBjbG9zaW5nIHRhZyBhbmQgdGhlIHdob2xlIGBhbm5vdGF0aW9uYCB0YWcgYW5kIGl0cyBjb250ZW50cy5cbiAgICBjb25zdCBzZW1hbnRpY3NFbmRpbmdUYWdSZWdleCA9IC8oPFxcL21yb3c+KT9cXHMqPGFubm90YXRpb25bXFxXXFx3XSo/PFxcL3NlbWFudGljcz4vZ207XG5cbiAgICByZXR1cm4gbWF0aG1sXG4gICAgLnJlcGxhY2Uoc2VtYW50aWNzU3RhcnRpbmdUYWdSZWdleCwgJycpXG4gICAgLnJlcGxhY2Uoc2VtYW50aWNzRW5kaW5nVGFnUmVnZXgsICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGFsbCB4bWwgbWF0aG1sIG9jY3VycmVuY2VzIHRoYXQgY29udGFpbiBzZW1hbnRpY3MgdG8gdGhlIHNhbWVcbiAgICogeG1sIG1hdGhtbCBvY2N1cnJlbmNlcyB3aXRob3V0IHNlbWFudGljcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBzdHJpbmcgdGhhdCBjYW4gY29udGFpbiB4bWwgbWF0aG1sIG9jY3VycmVuY2VzLlxuICAgKiBAcGFyYW0ge0NvbnN0YW50c30gW2NoYXJhY3RlcnNdIC0gQ29uc3RhbnQgb2JqZWN0IGNvbnRhaW5pbmcgeG1sQ2hhcmFjdGVyc1xuICAgKiBvciBzYWZlWG1sQ2hhcmFjdGVycyByZWxhdGlvbi5cbiAgICogeG1sQ2hhcmFjdGVycyBieSBkZWZhdWx0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtICd0ZXh0JyB3aXRoIGFsbCB4bWwgbWF0aG1sIG9jY3VycmVuY2VzIHdpdGhvdXQgYW5ub3RhdGlvbiB0YWcuXG4gICAqL1xuICBzdGF0aWMgcmVtb3ZlU2VtYW50aWNzT2N1cnJlbmNlcyh0ZXh0LCBjaGFyYWN0ZXJzID0gQ29uc3RhbnRzLnhtbENoYXJhY3RlcnMpIHtcbiAgICBjb25zdCBtYXRoVGFnU3RhcnQgPSBgJHtjaGFyYWN0ZXJzLnRhZ09wZW5lcn1tYXRoYDtcbiAgICBjb25zdCBtYXRoVGFnRW5kID0gYCR7Y2hhcmFjdGVycy50YWdPcGVuZXJ9L21hdGgke2NoYXJhY3RlcnMudGFnQ2xvc2VyfWA7XG4gICAgY29uc3QgbWF0aFRhZ0VuZGxpbmUgPSBgLyR7Y2hhcmFjdGVycy50YWdDbG9zZXJ9YDtcbiAgICBjb25zdCB7IHRhZ0Nsb3NlciB9ID0gY2hhcmFjdGVycztcbiAgICBjb25zdCBzZW1hbnRpY3NUYWdTdGFydCA9IGAke2NoYXJhY3RlcnMudGFnT3BlbmVyfXNlbWFudGljcyR7Y2hhcmFjdGVycy50YWdDbG9zZXJ9YDtcbiAgICBjb25zdCBhbm5vdGF0aW9uVGFnU3RhcnQgPSBgJHtjaGFyYWN0ZXJzLnRhZ09wZW5lcn1hbm5vdGF0aW9uIGVuY29kaW5nPWA7XG5cbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgbGV0IHN0YXJ0ID0gdGV4dC5pbmRleE9mKG1hdGhUYWdTdGFydCk7XG4gICAgbGV0IGVuZCA9IDA7XG4gICAgd2hpbGUgKHN0YXJ0ICE9PSAtMSkge1xuICAgICAgb3V0cHV0ICs9IHRleHQuc3Vic3RyaW5nKGVuZCwgc3RhcnQpO1xuXG4gICAgICAvLyBNYXRoTUwgY2FuIGJlIHdyaXR0ZW4gYXMgJzxtYXRoPjwvbWF0aD4nIG9yICc8bWF0aCAvPicuXG4gICAgICBjb25zdCBtYXRoVGFnRW5kSW5kZXggPSB0ZXh0LmluZGV4T2YobWF0aFRhZ0VuZCwgc3RhcnQpO1xuICAgICAgY29uc3QgbWF0aFRhZ0VuZGxpbmVJbmRleCA9IHRleHQuaW5kZXhPZihtYXRoVGFnRW5kbGluZSwgc3RhcnQpO1xuICAgICAgY29uc3QgZmlyc3RUYWdDbG9zZXIgPSB0ZXh0LmluZGV4T2YodGFnQ2xvc2VyLCBzdGFydCk7XG4gICAgICBpZiAobWF0aFRhZ0VuZEluZGV4ICE9PSAtMSkge1xuICAgICAgICBlbmQgPSBtYXRoVGFnRW5kSW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKG1hdGhUYWdFbmRsaW5lSW5kZXggPT09IGZpcnN0VGFnQ2xvc2VyIC0gMSkge1xuICAgICAgICBlbmQgPSBtYXRoVGFnRW5kbGluZUluZGV4O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZW1hbnRpY3NJbmRleCA9IHRleHQuaW5kZXhPZihzZW1hbnRpY3NUYWdTdGFydCwgc3RhcnQpO1xuICAgICAgaWYgKHNlbWFudGljc0luZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBtbWxUYWdTdGFydCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBzZW1hbnRpY3NJbmRleCk7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25JbmRleCA9IHRleHQuaW5kZXhPZihhbm5vdGF0aW9uVGFnU3RhcnQsIHN0YXJ0KTtcbiAgICAgICAgaWYgKGFubm90YXRpb25JbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gc2VtYW50aWNzSW5kZXggKyBzZW1hbnRpY3NUYWdTdGFydC5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgbW1sQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGFubm90YXRpb25JbmRleCk7XG4gICAgICAgICAgb3V0cHV0ICs9IG1tbFRhZ1N0YXJ0ICsgbW1sQ29udGVudCArIG1hdGhUYWdFbmQ7XG4gICAgICAgICAgc3RhcnQgPSB0ZXh0LmluZGV4T2YobWF0aFRhZ1N0YXJ0LCBzdGFydCArIG1hdGhUYWdTdGFydC5sZW5ndGgpO1xuICAgICAgICAgIGVuZCArPSBtYXRoVGFnRW5kLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IHRleHQuaW5kZXhPZihtYXRoVGFnU3RhcnQsIHN0YXJ0ICsgbWF0aFRhZ1N0YXJ0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IHRleHQuaW5kZXhPZihtYXRoVGFnU3RhcnQsIHN0YXJ0ICsgbWF0aFRhZ1N0YXJ0Lmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IHRleHQuc3Vic3RyaW5nKGVuZCwgdGV4dC5sZW5ndGgpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgTWF0aE1MIGNvbnRhaW5zIGEgY2VydGFpbiBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGhNTCAtIGlucHV0IE1hdGhNTC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIGNsYXNzTmFtZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGlucHV0IE1hdGhNTCBjb250YWlucyB0aGUgaW5wdXQgY2xhc3MuXG4gICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGNvbnRhaW5DbGFzcyhtYXRoTUwsIGNsYXNzTmFtZSkge1xuICAgIGNvbnN0IGNsYXNzSW5kZXggPSBtYXRoTUwuaW5kZXhPZignY2xhc3MnKTtcbiAgICBpZiAoY2xhc3NJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NUYWdFbmRJbmRleCA9IG1hdGhNTC5pbmRleE9mKCc+JywgY2xhc3NJbmRleCk7XG4gICAgY29uc3QgY2xhc3NUYWcgPSBtYXRoTUwuc3Vic3RyaW5nKGNsYXNzSW5kZXgsIGNsYXNzVGFnRW5kSW5kZXgpO1xuICAgIGlmIChjbGFzc1RhZy5pbmRleE9mKGNsYXNzTmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBtYXRobWwgaXMgZW1wdHkuIE90aGVyd2lzZSwgZmFsc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRobWwgLSB2YWxpZCBNYXRoTUwgd2l0aCBzdGFuZGFyZCBYTUwgdGFncy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdHJ1ZSBpZiBtYXRobWwgaXMgZW1wdHkuIE90aGVyd2lzZSwgZmFsc2UuXG4gICAqL1xuICBzdGF0aWMgaXNFbXB0eShtYXRobWwpIHtcbiAgICAvLyBNYXRoTUwgY2FuIGhhdmUgdGhlIHNoYXBlIDxtYXRoPjwvbWF0aD4gb3IgJzxtYXRoIC8+Jy5cbiAgICBjb25zdCBjbG9zZVRhZyA9ICc+JztcbiAgICBjb25zdCBjbG9zZVRhZ0lubGluZSA9ICcvPic7XG4gICAgY29uc3QgZmlyc3RDbG9zZVRhZ0luZGV4ID0gbWF0aG1sLmluZGV4T2YoY2xvc2VUYWcpO1xuICAgIGNvbnN0IGZpcnN0Q2xvc2VUYWdJbmxpbmVJbmRleCA9IG1hdGhtbC5pbmRleE9mKGNsb3NlVGFnSW5saW5lKTtcbiAgICBsZXQgZW1wdHkgPSBmYWxzZTtcbiAgICAvLyBNYXRoTUwgaXMgYWx3YXlzIGVtcHR5IGluIHRoZSBzZWNvbmQgc2hhcGUuXG4gICAgaWYgKGZpcnN0Q2xvc2VUYWdJbmxpbmVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChmaXJzdENsb3NlVGFnSW5saW5lSW5kZXggPT09IGZpcnN0Q2xvc2VUYWdJbmRleCAtIDEpIHtcbiAgICAgICAgZW1wdHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1hdGhNTCBpcyBhbHdheXMgZW1wdHkgaW4gdGhlIGZpcnN0IHNoYXBlIHdoZW4gdGhlcmUgYXJlbid0IGVsZW1lbnRzXG4gICAgLy8gYmV0d2VlbiBtYXRoIHRhZ3MuXG4gICAgaWYgKCFlbXB0eSkge1xuICAgICAgY29uc3QgbWF0aFRhZ0VuZFJlZ2V4ID0gbmV3IFJlZ0V4cCgnPC8oLis6KT9tYXRoPicpO1xuICAgICAgY29uc3QgbWF0aFRhZ0VuZEFycmF5ID0gbWF0aFRhZ0VuZFJlZ2V4LmV4ZWMobWF0aG1sKTtcbiAgICAgIGlmIChtYXRoVGFnRW5kQXJyYXkpIHtcbiAgICAgICAgZW1wdHkgPSBmaXJzdENsb3NlVGFnSW5kZXggKyAxID09PSBtYXRoVGFnRW5kQXJyYXkuaW5kZXg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgaHRtbCBlbnRpdGllcyBpbnNpZGUgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1hdGhtbCAtIHZhbGlkIE1hdGhNTCB3aXRoIHN0YW5kYXJkIFhNTCB0YWdzLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAtICdtYXRobWwnIHdpdGggcHJvcGVydHkgZW50aXRpZXMgZW5jb2RlZC5cbiAgICovXG4gIHN0YXRpYyBlbmNvZGVQcm9wZXJ0aWVzKG1hdGhtbCkge1xuICAgIC8vIFNlYXJjaCBhbGwgdGhlIHByb3BlcnRpZXMuXG4gICAgY29uc3QgcmVnZXggPSAvXFx3Kz1cIi4qP1wiL2c7XG4gICAgLy8gRW5jb2RlIGh0bWwgZW50aXRpZXMuXG4gICAgY29uc3QgcmVwbGFjZXIgPSAobWF0Y2gpID0+IHtcbiAgICAgIC8vIEl0IGhhcyB0aGUgc2hhcGU6XG4gICAgICAvLyA8bWF0aCBwcm9wZXJ0eU9uZT1cInNvbWV0aGluZ09uZVwiPjxjaGlsZHJlbiBwcm9wZXJ0eVR3bz1cInNvbWV0aGluZ1R3b1wiPjwvY2hpbGRyZW4+PC9tYXRoPi5cbiAgICAgIGNvbnN0IHF1b3RlSW5kZXggPSBtYXRjaC5pbmRleE9mKCdcIicpO1xuICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IG1hdGNoLnN1YnN0cmluZyhxdW90ZUluZGV4ICsgMSwgbWF0Y2gubGVuZ3RoIC0gMSk7XG4gICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlRW5jb2RlZCA9IFV0aWwuaHRtbEVudGl0aWVzKHByb3BlcnR5VmFsdWUpO1xuICAgICAgY29uc3QgbWF0Y2hFbmNvZGVkID0gYCR7bWF0Y2guc3Vic3RyaW5nKDAsIHF1b3RlSW5kZXggKyAxKX0ke3Byb3BlcnR5VmFsdWVFbmNvZGVkfVwiYDtcbiAgICAgIHJldHVybiBtYXRjaEVuY29kZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IG1hdGhtbEVuY29kZWQgPSBtYXRobWwucmVwbGFjZShyZWdleCwgcmVwbGFjZXIpO1xuICAgIHJldHVybiBtYXRobWxFbmNvZGVkO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xudmFyIG1kNTtcbmV4cG9ydCBkZWZhdWx0IG1kNTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEh4T3ZlcnJpZGVzID0gZnVuY3Rpb24gKCkgeyB9XG4gIEh4T3ZlcnJpZGVzLl9fbmFtZV9fID0gdHJ1ZTtcbiAgSHhPdmVycmlkZXMuZGF0ZVN0ciA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgdmFyIG0gPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgdmFyIGggPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgdmFyIG1pID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgdmFyIHMgPSBkYXRlLmdldFNlY29uZHMoKTtcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCItXCIgKyAobSA8IDEwID8gXCIwXCIgKyBtIDogXCJcIiArIG0pICsgXCItXCIgKyAoZCA8IDEwID8gXCIwXCIgKyBkIDogXCJcIiArIGQpICsgXCIgXCIgKyAoaCA8IDEwID8gXCIwXCIgKyBoIDogXCJcIiArIGgpICsgXCI6XCIgKyAobWkgPCAxMCA/IFwiMFwiICsgbWkgOiBcIlwiICsgbWkpICsgXCI6XCIgKyAocyA8IDEwID8gXCIwXCIgKyBzIDogXCJcIiArIHMpO1xuICB9XG4gIEh4T3ZlcnJpZGVzLnN0ckRhdGUgPSBmdW5jdGlvbiAocykge1xuICAgIHN3aXRjaCAocy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgODpcbiAgICAgICAgdmFyIGsgPSBzLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBkLnNldFRpbWUoMCk7XG4gICAgICAgIGQuc2V0VVRDSG91cnMoa1swXSk7XG4gICAgICAgIGQuc2V0VVRDTWludXRlcyhrWzFdKTtcbiAgICAgICAgZC5zZXRVVENTZWNvbmRzKGtbMl0pO1xuICAgICAgICByZXR1cm4gZDtcbiAgICAgIGNhc2UgMTA6XG4gICAgICAgIHZhciBrID0gcy5zcGxpdChcIi1cIik7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShrWzBdLCBrWzFdIC0gMSwga1syXSwgMCwgMCwgMCk7XG4gICAgICBjYXNlIDE5OlxuICAgICAgICB2YXIgayA9IHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICB2YXIgeSA9IGtbMF0uc3BsaXQoXCItXCIpO1xuICAgICAgICB2YXIgdCA9IGtbMV0uc3BsaXQoXCI6XCIpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoeVswXSwgeVsxXSAtIDEsIHlbMl0sIHRbMF0sIHRbMV0sIHRbMl0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgXCJJbnZhbGlkIGRhdGUgZm9ybWF0IDogXCIgKyBzO1xuICAgIH1cbiAgfVxuICBIeE92ZXJyaWRlcy5jY2EgPSBmdW5jdGlvbiAocywgaW5kZXgpIHtcbiAgICB2YXIgeCA9IHMuY2hhckNvZGVBdChpbmRleCk7XG4gICAgaWYgKHggIT0geCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geDtcbiAgfVxuICBIeE92ZXJyaWRlcy5zdWJzdHIgPSBmdW5jdGlvbiAocywgcG9zLCBsZW4pIHtcbiAgICBpZiAocG9zICE9IG51bGwgJiYgcG9zICE9IDAgJiYgbGVuICE9IG51bGwgJiYgbGVuIDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKGxlbiA9PSBudWxsKSBsZW4gPSBzLmxlbmd0aDtcbiAgICBpZiAocG9zIDwgMCkge1xuICAgICAgcG9zID0gcy5sZW5ndGggKyBwb3M7XG4gICAgICBpZiAocG9zIDwgMCkgcG9zID0gMDtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDApIGxlbiA9IHMubGVuZ3RoICsgbGVuIC0gcG9zO1xuICAgIHJldHVybiBzLnN1YnN0cihwb3MsIGxlbik7XG4gIH1cbiAgSHhPdmVycmlkZXMucmVtb3ZlID0gZnVuY3Rpb24gKGEsIG9iaikge1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgaWYgKGFbaV0gPT0gb2JqKSB7XG4gICAgICAgIGEuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIEh4T3ZlcnJpZGVzLml0ZXIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXI6IDAsIGFycjogYSwgaGFzTmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXIgPCB0aGlzLmFyci5sZW5ndGg7XG4gICAgICB9LCBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyclt0aGlzLmN1cisrXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHZhciBJbnRJdGVyID0gZnVuY3Rpb24gKG1pbiwgbWF4KSB7XG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gIH07XG4gIEludEl0ZXIuX19uYW1lX18gPSB0cnVlO1xuICBJbnRJdGVyLnByb3RvdHlwZSA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5taW4rKztcbiAgICB9XG4gICAgLCBoYXNOZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5taW4gPCB0aGlzLm1heDtcbiAgICB9XG4gICAgLCBfX2NsYXNzX186IEludEl0ZXJcbiAgfVxuICB2YXIgU3RkID0gZnVuY3Rpb24gKCkgeyB9XG4gIFN0ZC5fX25hbWVfXyA9IHRydWU7XG4gIFN0ZFtcImlzXCJdID0gZnVuY3Rpb24gKHYsIHQpIHtcbiAgICByZXR1cm4ganMuQm9vdC5fX2luc3RhbmNlb2YodiwgdCk7XG4gIH1cbiAgU3RkLnN0cmluZyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIGpzLkJvb3QuX19zdHJpbmdfcmVjKHMsIFwiXCIpO1xuICB9XG4gIFN0ZFtcImludFwiXSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIHggfCAwO1xuICB9XG4gIFN0ZC5wYXJzZUludCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgdmFyIHYgPSBwYXJzZUludCh4LCAxMCk7XG4gICAgaWYgKHYgPT0gMCAmJiAoSHhPdmVycmlkZXMuY2NhKHgsIDEpID09IDEyMCB8fCBIeE92ZXJyaWRlcy5jY2EoeCwgMSkgPT0gODgpKSB2ID0gcGFyc2VJbnQoeCk7XG4gICAgaWYgKGlzTmFOKHYpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdjtcbiAgfVxuICBTdGQucGFyc2VGbG9hdCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoeCk7XG4gIH1cbiAgU3RkLnJhbmRvbSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHgpO1xuICB9XG4gIHZhciBjb20gPSBjb20gfHwge31cbiAgaWYgKCFjb20ud2lyaXMpIGNvbS53aXJpcyA9IHt9XG4gIGlmICghY29tLndpcmlzLmpzKSBjb20ud2lyaXMuanMgPSB7fVxuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scyA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRyeVJlYWR5KCk7XG4gIH07XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLl9fbmFtZV9fID0gdHJ1ZTtcbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMubWFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXY7XG4gICAgZXYgPSBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuICAgIGhheGUuVGltZXIuZGVsYXkoJGJpbmQoZXYsIGV2LnRyeVJlYWR5KSwgMTAwKTtcbiAgfVxuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuaW5zdGFuY2UgPT0gbnVsbCkgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuaW5zdGFuY2UgPSBuZXcgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMoKTtcbiAgICByZXR1cm4gY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuaW5zdGFuY2U7XG4gIH1cbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuYnlwYXNzRW5jYXBzdWxhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAod2luZG93LmNvbSA9PSBudWxsKSB3aW5kb3cuY29tID0ge307XG4gICAgaWYgKHdpbmRvdy5jb20ud2lyaXMgPT0gbnVsbCkgd2luZG93LmNvbS53aXJpcyA9IHt9O1xuICAgIGlmICh3aW5kb3cuY29tLndpcmlzLmpzID09IG51bGwpIHdpbmRvdy5jb20ud2lyaXMuanMgPSB7fTtcbiAgICBpZiAod2luZG93LmNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzID09IG51bGwpIHdpbmRvdy5jb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scyA9IGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmdldEluc3RhbmNlKCk7XG4gIH1cbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMucHJvdG90eXBlID0ge1xuICAgIG1kNWVuY29kZTogZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBoYXhlLk1kNS5lbmNvZGUoY29udGVudCk7XG4gICAgfVxuICAgICwgZG9Mb2FkOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICAgIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmluc3RhbmNlID0gdGhpcztcbiAgICAgIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmJ5cGFzc0VuY2Fwc3VsYXRpb24oKTtcbiAgICB9XG4gICAgLCB0cnlSZWFkeTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgaWYgKGpzLkxpYi5kb2N1bWVudC5yZWFkeVN0YXRlKSB7XG4gICAgICAgIHRoaXMuZG9Mb2FkKCk7XG4gICAgICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnJlYWR5KSBoYXhlLlRpbWVyLmRlbGF5KCRiaW5kKHRoaXMsIHRoaXMudHJ5UmVhZHkpLCAxMDApO1xuICAgIH1cbiAgICAsIF9fY2xhc3NfXzogY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHNcbiAgfVxuICB2YXIgaGF4ZSA9IGhheGUgfHwge31cbiAgaGF4ZS5Mb2cgPSBmdW5jdGlvbiAoKSB7IH1cbiAgaGF4ZS5Mb2cuX19uYW1lX18gPSB0cnVlO1xuICBoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uICh2LCBpbmZvcykge1xuICAgIGpzLkJvb3QuX190cmFjZSh2LCBpbmZvcyk7XG4gIH1cbiAgaGF4ZS5Mb2cuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAganMuQm9vdC5fX2NsZWFyX3RyYWNlKCk7XG4gIH1cbiAgaGF4ZS5NZDUgPSBmdW5jdGlvbiAoKSB7XG4gIH07XG4gIGhheGUuTWQ1Ll9fbmFtZV9fID0gdHJ1ZTtcbiAgaGF4ZS5NZDUuZW5jb2RlID0gZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gbmV3IGhheGUuTWQ1KCkuZG9FbmNvZGUocyk7XG4gIH1cbiAgaGF4ZS5NZDUucHJvdG90eXBlID0ge1xuICAgIGRvRW5jb2RlOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICB2YXIgeCA9IHRoaXMuc3RyMmJsa3Moc3RyKTtcbiAgICAgIHZhciBhID0gMTczMjU4NDE5MztcbiAgICAgIHZhciBiID0gLTI3MTczMzg3OTtcbiAgICAgIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gICAgICB2YXIgZCA9IDI3MTczMzg3ODtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCB4Lmxlbmd0aCkge1xuICAgICAgICB2YXIgb2xkYSA9IGE7XG4gICAgICAgIHZhciBvbGRiID0gYjtcbiAgICAgICAgdmFyIG9sZGMgPSBjO1xuICAgICAgICB2YXIgb2xkZCA9IGQ7XG4gICAgICAgIHN0ZXAgPSAwO1xuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICAgICAgZCA9IHRoaXMuZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICAgICAgYSA9IHRoaXMuZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgICAgICBjID0gdGhpcy5mZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICAgICAgYiA9IHRoaXMuZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgICAgICBjID0gdGhpcy5mZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgICAgIGMgPSB0aGlzLmZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICAgICAgYiA9IHRoaXMuZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgICAgIGEgPSB0aGlzLmdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICAgICAgZCA9IHRoaXMuZ2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICAgICAgYyA9IHRoaXMuZ2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICAgICAgYiA9IHRoaXMuZ2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgICAgICBhID0gdGhpcy5nZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgICAgICBjID0gdGhpcy5nZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICAgICAgYiA9IHRoaXMuZ2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgICAgICBjID0gdGhpcy5nZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgICAgICBhID0gdGhpcy5nZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICAgICAgZCA9IHRoaXMuZ2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgICAgIGMgPSB0aGlzLmdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgICAgIGIgPSB0aGlzLmdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICAgICAgYSA9IHRoaXMuaGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICAgICAgYyA9IHRoaXMuaGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgICAgIGEgPSB0aGlzLmhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgICAgIGQgPSB0aGlzLmhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICAgICAgYSA9IHRoaXMuaGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgICAgIGQgPSB0aGlzLmhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgICAgICBjID0gdGhpcy5oaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgICAgICBiID0gdGhpcy5oaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICAgICAgZCA9IHRoaXMuaWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgICAgIGEgPSB0aGlzLmlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgICAgICBjID0gdGhpcy5paShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgICAgIGIgPSB0aGlzLmlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgICAgIGMgPSB0aGlzLmlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICAgICAgYSA9IHRoaXMuaWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgICAgICBkID0gdGhpcy5paShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgICAgIGMgPSB0aGlzLmlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICAgICAgYiA9IHRoaXMuaWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICAgICAgYSA9IHRoaXMuYWRkbWUoYSwgb2xkYSk7XG4gICAgICAgIGIgPSB0aGlzLmFkZG1lKGIsIG9sZGIpO1xuICAgICAgICBjID0gdGhpcy5hZGRtZShjLCBvbGRjKTtcbiAgICAgICAgZCA9IHRoaXMuYWRkbWUoZCwgb2xkZCk7XG4gICAgICAgIGkgKz0gMTY7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yaGV4KGEpICsgdGhpcy5yaGV4KGIpICsgdGhpcy5yaGV4KGMpICsgdGhpcy5yaGV4KGQpO1xuICAgIH1cbiAgICAsIGlpOiBmdW5jdGlvbiAoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICAgICAgcmV0dXJuIHRoaXMuY21uKHRoaXMuYml0WE9SKGMsIHRoaXMuYml0T1IoYiwgfmQpKSwgYSwgYiwgeCwgcywgdCk7XG4gICAgfVxuICAgICwgaGg6IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5jbW4odGhpcy5iaXRYT1IodGhpcy5iaXRYT1IoYiwgYyksIGQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgICB9XG4gICAgLCBnZzogZnVuY3Rpb24gKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNtbih0aGlzLmJpdE9SKHRoaXMuYml0QU5EKGIsIGQpLCB0aGlzLmJpdEFORChjLCB+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcbiAgICB9XG4gICAgLCBmZjogZnVuY3Rpb24gKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNtbih0aGlzLmJpdE9SKHRoaXMuYml0QU5EKGIsIGMpLCB0aGlzLmJpdEFORCh+YiwgZCkpLCBhLCBiLCB4LCBzLCB0KTtcbiAgICB9XG4gICAgLCBjbW46IGZ1bmN0aW9uIChxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRtZSh0aGlzLnJvbCh0aGlzLmFkZG1lKHRoaXMuYWRkbWUoYSwgcSksIHRoaXMuYWRkbWUoeCwgdCkpLCBzKSwgYik7XG4gICAgfVxuICAgICwgcm9sOiBmdW5jdGlvbiAobnVtLCBjbnQpIHtcbiAgICAgIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbiAgICB9XG4gICAgLCBzdHIyYmxrczogZnVuY3Rpb24gKHN0cikge1xuICAgICAgdmFyIG5ibGsgPSAoc3RyLmxlbmd0aCArIDggPj4gNikgKyAxO1xuICAgICAgdmFyIGJsa3MgPSBuZXcgQXJyYXkoKTtcbiAgICAgIHZhciBfZzEgPSAwLCBfZyA9IG5ibGsgKiAxNjtcbiAgICAgIHdoaWxlIChfZzEgPCBfZykge1xuICAgICAgICB2YXIgaSA9IF9nMSsrO1xuICAgICAgICBibGtzW2ldID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICBibGtzW2kgPj4gMl0gfD0gSHhPdmVycmlkZXMuY2NhKHN0ciwgaSkgPDwgKHN0ci5sZW5ndGggKiA4ICsgaSkgJSA0ICogODtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgYmxrc1tpID4+IDJdIHw9IDEyOCA8PCAoc3RyLmxlbmd0aCAqIDggKyBpKSAlIDQgKiA4O1xuICAgICAgdmFyIGwgPSBzdHIubGVuZ3RoICogODtcbiAgICAgIHZhciBrID0gbmJsayAqIDE2IC0gMjtcbiAgICAgIGJsa3Nba10gPSBsICYgMjU1O1xuICAgICAgYmxrc1trXSB8PSAobCA+Pj4gOCAmIDI1NSkgPDwgODtcbiAgICAgIGJsa3Nba10gfD0gKGwgPj4+IDE2ICYgMjU1KSA8PCAxNjtcbiAgICAgIGJsa3Nba10gfD0gKGwgPj4+IDI0ICYgMjU1KSA8PCAyNDtcbiAgICAgIHJldHVybiBibGtzO1xuICAgIH1cbiAgICAsIHJoZXg6IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgIHZhciBzdHIgPSBcIlwiO1xuICAgICAgdmFyIGhleF9jaHIgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbiAgICAgIHZhciBfZyA9IDA7XG4gICAgICB3aGlsZSAoX2cgPCA0KSB7XG4gICAgICAgIHZhciBqID0gX2crKztcbiAgICAgICAgc3RyICs9IGhleF9jaHIuY2hhckF0KG51bSA+PiBqICogOCArIDQgJiAxNSkgKyBoZXhfY2hyLmNoYXJBdChudW0gPj4gaiAqIDggJiAxNSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAsIGFkZG1lOiBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgdmFyIGxzdyA9ICh4ICYgNjU1MzUpICsgKHkgJiA2NTUzNSk7XG4gICAgICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gICAgICByZXR1cm4gbXN3IDw8IDE2IHwgbHN3ICYgNjU1MzU7XG4gICAgfVxuICAgICwgYml0QU5EOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgdmFyIGxzYiA9IGEgJiAxICYgKGIgJiAxKTtcbiAgICAgIHZhciBtc2IzMSA9IGEgPj4+IDEgJiBiID4+PiAxO1xuICAgICAgcmV0dXJuIG1zYjMxIDw8IDEgfCBsc2I7XG4gICAgfVxuICAgICwgYml0WE9SOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgdmFyIGxzYiA9IGEgJiAxIF4gYiAmIDE7XG4gICAgICB2YXIgbXNiMzEgPSBhID4+PiAxIF4gYiA+Pj4gMTtcbiAgICAgIHJldHVybiBtc2IzMSA8PCAxIHwgbHNiO1xuICAgIH1cbiAgICAsIGJpdE9SOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgdmFyIGxzYiA9IGEgJiAxIHwgYiAmIDE7XG4gICAgICB2YXIgbXNiMzEgPSBhID4+PiAxIHwgYiA+Pj4gMTtcbiAgICAgIHJldHVybiBtc2IzMSA8PCAxIHwgbHNiO1xuICAgIH1cbiAgICAsIF9fY2xhc3NfXzogaGF4ZS5NZDVcbiAgfVxuICBoYXhlLlRpbWVyID0gZnVuY3Rpb24gKHRpbWVfbXMpIHtcbiAgICB2YXIgbWUgPSB0aGlzO1xuICAgIHRoaXMuaWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgbWUucnVuKCk7XG4gICAgfSwgdGltZV9tcyk7XG4gIH07XG4gIGhheGUuVGltZXIuX19uYW1lX18gPSB0cnVlO1xuICBoYXhlLlRpbWVyLmRlbGF5ID0gZnVuY3Rpb24gKGYsIHRpbWVfbXMpIHtcbiAgICB2YXIgdCA9IG5ldyBoYXhlLlRpbWVyKHRpbWVfbXMpO1xuICAgIHQucnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgdC5zdG9wKCk7XG4gICAgICBmKCk7XG4gICAgfTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICBoYXhlLlRpbWVyLm1lYXN1cmUgPSBmdW5jdGlvbiAoZiwgcG9zKSB7XG4gICAgdmFyIHQwID0gaGF4ZS5UaW1lci5zdGFtcCgpO1xuICAgIHZhciByID0gZigpO1xuICAgIGhheGUuTG9nLnRyYWNlKGhheGUuVGltZXIuc3RhbXAoKSAtIHQwICsgXCJzXCIsIHBvcyk7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgaGF4ZS5UaW1lci5zdGFtcCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xuICB9XG4gIGhheGUuVGltZXIucHJvdG90eXBlID0ge1xuICAgIHJ1bjogZnVuY3Rpb24gKCkge1xuICAgIH1cbiAgICAsIHN0b3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLmlkID09IG51bGwpIHJldHVybjtcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuaWQpO1xuICAgICAgdGhpcy5pZCA9IG51bGw7XG4gICAgfVxuICAgICwgX19jbGFzc19fOiBoYXhlLlRpbWVyXG4gIH1cbiAgdmFyIGpzID0ganMgfHwge31cbiAganMuQm9vdCA9IGZ1bmN0aW9uICgpIHsgfVxuICBqcy5Cb290Ll9fbmFtZV9fID0gdHJ1ZTtcbiAganMuQm9vdC5fX3VuaHRtbCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMuc3BsaXQoXCImXCIpLmpvaW4oXCImYW1wO1wiKS5zcGxpdChcIjxcIikuam9pbihcIiZsdDtcIikuc3BsaXQoXCI+XCIpLmpvaW4oXCImZ3Q7XCIpO1xuICB9XG4gIGpzLkJvb3QuX190cmFjZSA9IGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgdmFyIG1zZyA9IGkgIT0gbnVsbCA/IGkuZmlsZU5hbWUgKyBcIjpcIiArIGkubGluZU51bWJlciArIFwiOiBcIiA6IFwiXCI7XG4gICAgbXNnICs9IGpzLkJvb3QuX19zdHJpbmdfcmVjKHYsIFwiXCIpO1xuICAgIHZhciBkO1xuICAgIGlmICh0eXBlb2YgKGRvY3VtZW50KSAhPSBcInVuZGVmaW5lZFwiICYmIChkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoYXhlOnRyYWNlXCIpKSAhPSBudWxsKSBkLmlubmVySFRNTCArPSBqcy5Cb290Ll9fdW5odG1sKG1zZykgKyBcIjxici8+XCI7IGVsc2UgaWYgKHR5cGVvZiAoY29uc29sZSkgIT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLmxvZyAhPSBudWxsKSBjb25zb2xlLmxvZyhtc2cpO1xuICB9XG4gIGpzLkJvb3QuX19jbGVhcl90cmFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGF4ZTp0cmFjZVwiKTtcbiAgICBpZiAoZCAhPSBudWxsKSBkLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cbiAganMuQm9vdC5pc0NsYXNzID0gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gby5fX25hbWVfXztcbiAgfVxuICBqcy5Cb290LmlzRW51bSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUuX19lbmFtZV9fO1xuICB9XG4gIGpzLkJvb3QuZ2V0Q2xhc3MgPSBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvLl9fY2xhc3NfXztcbiAgfVxuICBqcy5Cb290Ll9fc3RyaW5nX3JlYyA9IGZ1bmN0aW9uIChvLCBzKSB7XG4gICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIFwibnVsbFwiO1xuICAgIGlmIChzLmxlbmd0aCA+PSA1KSByZXR1cm4gXCI8Li4uPlwiO1xuICAgIHZhciB0ID0gdHlwZW9mIChvKTtcbiAgICBpZiAodCA9PSBcImZ1bmN0aW9uXCIgJiYgKG8uX19uYW1lX18gfHwgby5fX2VuYW1lX18pKSB0ID0gXCJvYmplY3RcIjtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGlmIChvLl9fZW51bV9fKSB7XG4gICAgICAgICAgICBpZiAoby5sZW5ndGggPT0gMikgcmV0dXJuIG9bMF07XG4gICAgICAgICAgICB2YXIgc3RyID0gb1swXSArIFwiKFwiO1xuICAgICAgICAgICAgcyArPSBcIlxcdFwiO1xuICAgICAgICAgICAgdmFyIF9nMSA9IDIsIF9nID0gby5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoX2cxIDwgX2cpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSBfZzErKztcbiAgICAgICAgICAgICAgaWYgKGkgIT0gMikgc3RyICs9IFwiLFwiICsganMuQm9vdC5fX3N0cmluZ19yZWMob1tpXSwgcyk7IGVsc2Ugc3RyICs9IGpzLkJvb3QuX19zdHJpbmdfcmVjKG9baV0sIHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0ciArIFwiKVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbCA9IG8ubGVuZ3RoO1xuICAgICAgICAgIHZhciBpO1xuICAgICAgICAgIHZhciBzdHIgPSBcIltcIjtcbiAgICAgICAgICBzICs9IFwiXFx0XCI7XG4gICAgICAgICAgdmFyIF9nID0gMDtcbiAgICAgICAgICB3aGlsZSAoX2cgPCBsKSB7XG4gICAgICAgICAgICB2YXIgaTEgPSBfZysrO1xuICAgICAgICAgICAgc3RyICs9IChpMSA+IDAgPyBcIixcIiA6IFwiXCIpICsganMuQm9vdC5fX3N0cmluZ19yZWMob1tpMV0sIHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdHIgKz0gXCJdXCI7XG4gICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG9zdHI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9zdHIgPSBvLnRvU3RyaW5nO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPz8/XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvc3RyICE9IG51bGwgJiYgdG9zdHIgIT0gT2JqZWN0LnRvU3RyaW5nKSB7XG4gICAgICAgICAgdmFyIHMyID0gby50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChzMiAhPSBcIltvYmplY3QgT2JqZWN0XVwiKSByZXR1cm4gczI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGsgPSBudWxsO1xuICAgICAgICB2YXIgc3RyID0gXCJ7XFxuXCI7XG4gICAgICAgIHMgKz0gXCJcXHRcIjtcbiAgICAgICAgdmFyIGhhc3AgPSBvLmhhc093blByb3BlcnR5ICE9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGsgaW4gbykge1xuICAgICAgICAgIDtcbiAgICAgICAgICBpZiAoaGFzcCAmJiAhby5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChrID09IFwicHJvdG90eXBlXCIgfHwgayA9PSBcIl9fY2xhc3NfX1wiIHx8IGsgPT0gXCJfX3N1cGVyX19cIiB8fCBrID09IFwiX19pbnRlcmZhY2VzX19cIiB8fCBrID09IFwiX19wcm9wZXJ0aWVzX19cIikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHIubGVuZ3RoICE9IDIpIHN0ciArPSBcIiwgXFxuXCI7XG4gICAgICAgICAgc3RyICs9IHMgKyBrICsgXCIgOiBcIiArIGpzLkJvb3QuX19zdHJpbmdfcmVjKG9ba10sIHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTtcbiAgICAgICAgc3RyICs9IFwiXFxuXCIgKyBzICsgXCJ9XCI7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgcmV0dXJuIFwiPGZ1bmN0aW9uPlwiO1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gbztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBTdHJpbmcobyk7XG4gICAgfVxuICB9XG4gIGpzLkJvb3QuX19pbnRlcmZMb29wID0gZnVuY3Rpb24gKGNjLCBjbCkge1xuICAgIGlmIChjYyA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGNjID09IGNsKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgaW50ZiA9IGNjLl9faW50ZXJmYWNlc19fO1xuICAgIGlmIChpbnRmICE9IG51bGwpIHtcbiAgICAgIHZhciBfZzEgPSAwLCBfZyA9IGludGYubGVuZ3RoO1xuICAgICAgd2hpbGUgKF9nMSA8IF9nKSB7XG4gICAgICAgIHZhciBpID0gX2cxKys7XG4gICAgICAgIHZhciBpMSA9IGludGZbaV07XG4gICAgICAgIGlmIChpMSA9PSBjbCB8fCBqcy5Cb290Ll9faW50ZXJmTG9vcChpMSwgY2wpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGpzLkJvb3QuX19pbnRlcmZMb29wKGNjLl9fc3VwZXJfXywgY2wpO1xuICB9XG4gIGpzLkJvb3QuX19pbnN0YW5jZW9mID0gZnVuY3Rpb24gKG8sIGNsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChvIGluc3RhbmNlb2YgY2wpIHtcbiAgICAgICAgaWYgKGNsID09IEFycmF5KSByZXR1cm4gby5fX2VudW1fXyA9PSBudWxsO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChqcy5Cb290Ll9faW50ZXJmTG9vcChvLl9fY2xhc3NfXywgY2wpKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoY2wgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGNsKSB7XG4gICAgICBjYXNlIEludDpcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChvICUgMjE0NzQ4MzY0OC4wKSA9PT0gbztcbiAgICAgIGNhc2UgRmxvYXQ6XG4gICAgICAgIHJldHVybiB0eXBlb2YgKG8pID09IFwibnVtYmVyXCI7XG4gICAgICBjYXNlIEJvb2w6XG4gICAgICAgIHJldHVybiBvID09PSB0cnVlIHx8IG8gPT09IGZhbHNlO1xuICAgICAgY2FzZSBTdHJpbmc6XG4gICAgICAgIHJldHVybiB0eXBlb2YgKG8pID09IFwic3RyaW5nXCI7XG4gICAgICBjYXNlIER5bmFtaWM6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoY2wgPT0gQ2xhc3MgJiYgby5fX25hbWVfXyAhPSBudWxsKSByZXR1cm4gdHJ1ZTsgZWxzZSBudWxsO1xuICAgICAgICBpZiAoY2wgPT0gRW51bSAmJiBvLl9fZW5hbWVfXyAhPSBudWxsKSByZXR1cm4gdHJ1ZTsgZWxzZSBudWxsO1xuICAgICAgICByZXR1cm4gby5fX2VudW1fXyA9PSBjbDtcbiAgICB9XG4gIH1cbiAganMuQm9vdC5fX2Nhc3QgPSBmdW5jdGlvbiAobywgdCkge1xuICAgIGlmIChqcy5Cb290Ll9faW5zdGFuY2VvZihvLCB0KSkgcmV0dXJuIG87IGVsc2UgdGhyb3cgXCJDYW5ub3QgY2FzdCBcIiArIFN0ZC5zdHJpbmcobykgKyBcIiB0byBcIiArIFN0ZC5zdHJpbmcodCk7XG4gIH1cbiAganMuTGliID0gZnVuY3Rpb24gKCkgeyB9XG4gIGpzLkxpYi5fX25hbWVfXyA9IHRydWU7XG4gIGpzLkxpYi5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Z2dlcjtcbiAgfVxuICBqcy5MaWIuYWxlcnQgPSBmdW5jdGlvbiAodikge1xuICAgIGFsZXJ0KGpzLkJvb3QuX19zdHJpbmdfcmVjKHYsIFwiXCIpKTtcbiAgfVxuICBqcy5MaWIuZXZhbCA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgcmV0dXJuIGV2YWwoY29kZSk7XG4gIH1cbiAganMuTGliLnNldEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChmKSB7XG4gICAganMuTGliLm9uZXJyb3IgPSBmO1xuICB9XG4gIHZhciAkXztcbiAgZnVuY3Rpb24gJGJpbmQobywgbSkgeyB2YXIgZiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGYubWV0aG9kLmFwcGx5KGYuc2NvcGUsIGFyZ3VtZW50cyk7IH07IGYuc2NvcGUgPSBvOyBmLm1ldGhvZCA9IG07IHJldHVybiBmOyB9O1xuICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIEh4T3ZlcnJpZGVzLnJlbW92ZSA9IGZ1bmN0aW9uIChhLCBvKSB7XG4gICAgdmFyIGkgPSBhLmluZGV4T2Yobyk7XG4gICAgaWYgKGkgPT0gLTEpIHJldHVybiBmYWxzZTtcbiAgICBhLnNwbGljZShpLCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTsgZWxzZSBudWxsO1xuICBNYXRoLl9fbmFtZV9fID0gW1wiTWF0aFwiXTtcbiAgTWF0aC5OYU4gPSBOdW1iZXIuTmFOO1xuICBNYXRoLk5FR0FUSVZFX0lORklOSVRZID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICBNYXRoLlBPU0lUSVZFX0lORklOSVRZID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBNYXRoLmlzRmluaXRlID0gZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gaXNGaW5pdGUoaSk7XG4gIH07XG4gIE1hdGguaXNOYU4gPSBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpc05hTihpKTtcbiAgfTtcbiAgU3RyaW5nLnByb3RvdHlwZS5fX2NsYXNzX18gPSBTdHJpbmc7XG4gIFN0cmluZy5fX25hbWVfXyA9IHRydWU7XG4gIEFycmF5LnByb3RvdHlwZS5fX2NsYXNzX18gPSBBcnJheTtcbiAgQXJyYXkuX19uYW1lX18gPSB0cnVlO1xuICBEYXRlLnByb3RvdHlwZS5fX2NsYXNzX18gPSBEYXRlO1xuICBEYXRlLl9fbmFtZV9fID0gW1wiRGF0ZVwiXTtcbiAgdmFyIEludCA9IHsgX19uYW1lX186IFtcIkludFwiXSB9O1xuICB2YXIgRHluYW1pYyA9IHsgX19uYW1lX186IFtcIkR5bmFtaWNcIl0gfTtcbiAgdmFyIEZsb2F0ID0gTnVtYmVyO1xuICBGbG9hdC5fX25hbWVfXyA9IFtcIkZsb2F0XCJdO1xuICB2YXIgQm9vbCA9IEJvb2xlYW47XG4gIEJvb2wuX19lbmFtZV9fID0gW1wiQm9vbFwiXTtcbiAgdmFyIENsYXNzID0geyBfX25hbWVfXzogW1wiQ2xhc3NcIl0gfTtcbiAgdmFyIEVudW0gPSB7fTtcbiAgdmFyIFZvaWQgPSB7IF9fZW5hbWVfXzogW1wiVm9pZFwiXSB9O1xuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9IFwidW5kZWZpbmVkXCIpIGpzLkxpYi5kb2N1bWVudCA9IGRvY3VtZW50O1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAganMuTGliLndpbmRvdyA9IHdpbmRvdztcbiAgICBqcy5MaWIud2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbiAobXNnLCB1cmwsIGxpbmUpIHtcbiAgICAgIHZhciBmID0ganMuTGliLm9uZXJyb3I7XG4gICAgICBpZiAoZiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gZihtc2csIFt1cmwgKyBcIjpcIiArIGxpbmVdKTtcbiAgICB9O1xuICB9XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLm1haW4oKTtcbiAgZGVsZXRlIEFycmF5LnByb3RvdHlwZS5fX2NsYXNzX187XG59KCkpO1xuXG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBIeE92ZXJyaWRlcyA9IGZ1bmN0aW9uICgpIHsgfVxuICBIeE92ZXJyaWRlcy5fX25hbWVfXyA9IHRydWU7XG4gIEh4T3ZlcnJpZGVzLmRhdGVTdHIgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgIHZhciBtID0gZGF0ZS5nZXRNb250aCgpICsgMTtcbiAgICB2YXIgZCA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgIHZhciBoID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIHZhciBtaSA9IGRhdGUuZ2V0TWludXRlcygpO1xuICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiLVwiICsgKG0gPCAxMCA/IFwiMFwiICsgbSA6IFwiXCIgKyBtKSArIFwiLVwiICsgKGQgPCAxMCA/IFwiMFwiICsgZCA6IFwiXCIgKyBkKSArIFwiIFwiICsgKGggPCAxMCA/IFwiMFwiICsgaCA6IFwiXCIgKyBoKSArIFwiOlwiICsgKG1pIDwgMTAgPyBcIjBcIiArIG1pIDogXCJcIiArIG1pKSArIFwiOlwiICsgKHMgPCAxMCA/IFwiMFwiICsgcyA6IFwiXCIgKyBzKTtcbiAgfVxuICBIeE92ZXJyaWRlcy5zdHJEYXRlID0gZnVuY3Rpb24gKHMpIHtcbiAgICBzd2l0Y2ggKHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIHZhciBrID0gcy5zcGxpdChcIjpcIik7XG4gICAgICAgIHZhciBkID0gbmV3IERhdGUoKTtcbiAgICAgICAgZC5zZXRUaW1lKDApO1xuICAgICAgICBkLnNldFVUQ0hvdXJzKGtbMF0pO1xuICAgICAgICBkLnNldFVUQ01pbnV0ZXMoa1sxXSk7XG4gICAgICAgIGQuc2V0VVRDU2Vjb25kcyhrWzJdKTtcbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICB2YXIgayA9IHMuc3BsaXQoXCItXCIpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoa1swXSwga1sxXSAtIDEsIGtbMl0sIDAsIDAsIDApO1xuICAgICAgY2FzZSAxOTpcbiAgICAgICAgdmFyIGsgPSBzLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgdmFyIHkgPSBrWzBdLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdmFyIHQgPSBrWzFdLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHlbMF0sIHlbMV0gLSAxLCB5WzJdLCB0WzBdLCB0WzFdLCB0WzJdKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IFwiSW52YWxpZCBkYXRlIGZvcm1hdCA6IFwiICsgcztcbiAgICB9XG4gIH1cbiAgSHhPdmVycmlkZXMuY2NhID0gZnVuY3Rpb24gKHMsIGluZGV4KSB7XG4gICAgdmFyIHggPSBzLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIGlmICh4ICE9IHgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgSHhPdmVycmlkZXMuc3Vic3RyID0gZnVuY3Rpb24gKHMsIHBvcywgbGVuKSB7XG4gICAgaWYgKHBvcyAhPSBudWxsICYmIHBvcyAhPSAwICYmIGxlbiAhPSBudWxsICYmIGxlbiA8IDApIHJldHVybiBcIlwiO1xuICAgIGlmIChsZW4gPT0gbnVsbCkgbGVuID0gcy5sZW5ndGg7XG4gICAgaWYgKHBvcyA8IDApIHtcbiAgICAgIHBvcyA9IHMubGVuZ3RoICsgcG9zO1xuICAgICAgaWYgKHBvcyA8IDApIHBvcyA9IDA7XG4gICAgfSBlbHNlIGlmIChsZW4gPCAwKSBsZW4gPSBzLmxlbmd0aCArIGxlbiAtIHBvcztcbiAgICByZXR1cm4gcy5zdWJzdHIocG9zLCBsZW4pO1xuICB9XG4gIEh4T3ZlcnJpZGVzLnJlbW92ZSA9IGZ1bmN0aW9uIChhLCBvYmopIHtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGwgPSBhLmxlbmd0aDtcbiAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgIGlmIChhW2ldID09IG9iaikge1xuICAgICAgICBhLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBIeE92ZXJyaWRlcy5pdGVyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VyOiAwLCBhcnI6IGEsIGhhc05leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyIDwgdGhpcy5hcnIubGVuZ3RoO1xuICAgICAgfSwgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJbdGhpcy5jdXIrK107XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICB2YXIgSW50SXRlciA9IGZ1bmN0aW9uIChtaW4sIG1heCkge1xuICAgIHRoaXMubWluID0gbWluO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9O1xuICBJbnRJdGVyLl9fbmFtZV9fID0gdHJ1ZTtcbiAgSW50SXRlci5wcm90b3R5cGUgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWluKys7XG4gICAgfVxuICAgICwgaGFzTmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWluIDwgdGhpcy5tYXg7XG4gICAgfVxuICAgICwgX19jbGFzc19fOiBJbnRJdGVyXG4gIH1cbiAgdmFyIFN0ZCA9IGZ1bmN0aW9uICgpIHsgfVxuICBTdGQuX19uYW1lX18gPSB0cnVlO1xuICBTdGRbXCJpc1wiXSA9IGZ1bmN0aW9uICh2LCB0KSB7XG4gICAgcmV0dXJuIGpzLkJvb3QuX19pbnN0YW5jZW9mKHYsIHQpO1xuICB9XG4gIFN0ZC5zdHJpbmcgPSBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBqcy5Cb290Ll9fc3RyaW5nX3JlYyhzLCBcIlwiKTtcbiAgfVxuICBTdGRbXCJpbnRcIl0gPSBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB4IHwgMDtcbiAgfVxuICBTdGQucGFyc2VJbnQgPSBmdW5jdGlvbiAoeCkge1xuICAgIHZhciB2ID0gcGFyc2VJbnQoeCwgMTApO1xuICAgIGlmICh2ID09IDAgJiYgKEh4T3ZlcnJpZGVzLmNjYSh4LCAxKSA9PSAxMjAgfHwgSHhPdmVycmlkZXMuY2NhKHgsIDEpID09IDg4KSkgdiA9IHBhcnNlSW50KHgpO1xuICAgIGlmIChpc05hTih2KSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHY7XG4gIH1cbiAgU3RkLnBhcnNlRmxvYXQgPSBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHgpO1xuICB9XG4gIFN0ZC5yYW5kb20gPSBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB4KTtcbiAgfVxuICB2YXIgY29tID0gY29tIHx8IHt9XG4gIGlmICghY29tLndpcmlzKSBjb20ud2lyaXMgPSB7fVxuICBpZiAoIWNvbS53aXJpcy5qcykgY29tLndpcmlzLmpzID0ge31cbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50cnlSZWFkeSgpO1xuICB9O1xuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5fX25hbWVfXyA9IHRydWU7XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLm1haW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2O1xuICAgIGV2ID0gY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuZ2V0SW5zdGFuY2UoKTtcbiAgICBoYXhlLlRpbWVyLmRlbGF5KCRiaW5kKGV2LCBldi50cnlSZWFkeSksIDEwMCk7XG4gIH1cbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmluc3RhbmNlID09IG51bGwpIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmluc3RhbmNlID0gbmV3IGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzKCk7XG4gICAgcmV0dXJuIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmluc3RhbmNlO1xuICB9XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmJ5cGFzc0VuY2Fwc3VsYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHdpbmRvdy5jb20gPT0gbnVsbCkgd2luZG93LmNvbSA9IHt9O1xuICAgIGlmICh3aW5kb3cuY29tLndpcmlzID09IG51bGwpIHdpbmRvdy5jb20ud2lyaXMgPSB7fTtcbiAgICBpZiAod2luZG93LmNvbS53aXJpcy5qcyA9PSBudWxsKSB3aW5kb3cuY29tLndpcmlzLmpzID0ge307XG4gICAgaWYgKHdpbmRvdy5jb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scyA9PSBudWxsKSB3aW5kb3cuY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMgPSBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuICB9XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLnByb3RvdHlwZSA9IHtcbiAgICBtZDVlbmNvZGU6IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gICAgICByZXR1cm4gaGF4ZS5NZDUuZW5jb2RlKGNvbnRlbnQpO1xuICAgIH1cbiAgICAsIGRvTG9hZDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5pbnN0YW5jZSA9IHRoaXM7XG4gICAgICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5ieXBhc3NFbmNhcHN1bGF0aW9uKCk7XG4gICAgfVxuICAgICwgdHJ5UmVhZHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgIGlmIChqcy5MaWIuZG9jdW1lbnQucmVhZHlTdGF0ZSkge1xuICAgICAgICB0aGlzLmRvTG9hZCgpO1xuICAgICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5yZWFkeSkgaGF4ZS5UaW1lci5kZWxheSgkYmluZCh0aGlzLCB0aGlzLnRyeVJlYWR5KSwgMTAwKTtcbiAgICB9XG4gICAgLCBfX2NsYXNzX186IGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzXG4gIH1cbiAgdmFyIGhheGUgPSBoYXhlIHx8IHt9XG4gIGhheGUuTG9nID0gZnVuY3Rpb24gKCkgeyB9XG4gIGhheGUuTG9nLl9fbmFtZV9fID0gdHJ1ZTtcbiAgaGF4ZS5Mb2cudHJhY2UgPSBmdW5jdGlvbiAodiwgaW5mb3MpIHtcbiAgICBqcy5Cb290Ll9fdHJhY2UodiwgaW5mb3MpO1xuICB9XG4gIGhheGUuTG9nLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgIGpzLkJvb3QuX19jbGVhcl90cmFjZSgpO1xuICB9XG4gIGhheGUuTWQ1ID0gZnVuY3Rpb24gKCkge1xuICB9O1xuICBoYXhlLk1kNS5fX25hbWVfXyA9IHRydWU7XG4gIGhheGUuTWQ1LmVuY29kZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIG5ldyBoYXhlLk1kNSgpLmRvRW5jb2RlKHMpO1xuICB9XG4gIGhheGUuTWQ1LnByb3RvdHlwZSA9IHtcbiAgICBkb0VuY29kZTogZnVuY3Rpb24gKHN0cikge1xuICAgICAgdmFyIHggPSB0aGlzLnN0cjJibGtzKHN0cik7XG4gICAgICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gICAgICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gICAgICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICAgICAgdmFyIGQgPSAyNzE3MzM4Nzg7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgeC5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG9sZGEgPSBhO1xuICAgICAgICB2YXIgb2xkYiA9IGI7XG4gICAgICAgIHZhciBvbGRjID0gYztcbiAgICAgICAgdmFyIG9sZGQgPSBkO1xuICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgYSA9IHRoaXMuZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgICAgIGMgPSB0aGlzLmZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICAgICAgYiA9IHRoaXMuZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICAgICAgZCA9IHRoaXMuZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgICAgIGIgPSB0aGlzLmZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICAgICAgYSA9IHRoaXMuZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICAgICAgYiA9IHRoaXMuZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgICAgICBjID0gdGhpcy5mZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgICAgIGIgPSB0aGlzLmZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgICAgICBhID0gdGhpcy5nZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgICAgIGMgPSB0aGlzLmdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgICAgIGIgPSB0aGlzLmdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgICAgICBkID0gdGhpcy5nZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICAgICAgYyA9IHRoaXMuZ2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgICAgIGIgPSB0aGlzLmdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgICAgIGEgPSB0aGlzLmdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgICAgICBkID0gdGhpcy5nZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICAgICAgYyA9IHRoaXMuZ2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICAgICAgYiA9IHRoaXMuZ2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgICAgICBjID0gdGhpcy5nZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgICAgIGEgPSB0aGlzLmhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICAgICAgZCA9IHRoaXMuaGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgICAgICBiID0gdGhpcy5oaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgICAgICBjID0gdGhpcy5oaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgICAgICBiID0gdGhpcy5oaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgICAgIGEgPSB0aGlzLmhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICAgICAgZCA9IHRoaXMuaGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgICAgICBjID0gdGhpcy5oaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgICAgICBiID0gdGhpcy5oaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICAgICAgYSA9IHRoaXMuaGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICAgICAgYyA9IHRoaXMuaGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICAgICAgYiA9IHRoaXMuaGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICAgICAgYSA9IHRoaXMuaWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgICAgIGMgPSB0aGlzLmlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICAgICAgYiA9IHRoaXMuaWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgICAgICBkID0gdGhpcy5paShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICAgICAgYSA9IHRoaXMuaWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgICAgICBkID0gdGhpcy5paShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgICAgICBjID0gdGhpcy5paShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICAgICAgYiA9IHRoaXMuaWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgICAgIGEgPSB0aGlzLmlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICAgICAgZCA9IHRoaXMuaWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgICAgICBjID0gdGhpcy5paShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgICAgIGIgPSB0aGlzLmlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgICAgIGEgPSB0aGlzLmFkZG1lKGEsIG9sZGEpO1xuICAgICAgICBiID0gdGhpcy5hZGRtZShiLCBvbGRiKTtcbiAgICAgICAgYyA9IHRoaXMuYWRkbWUoYywgb2xkYyk7XG4gICAgICAgIGQgPSB0aGlzLmFkZG1lKGQsIG9sZGQpO1xuICAgICAgICBpICs9IDE2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmhleChhKSArIHRoaXMucmhleChiKSArIHRoaXMucmhleChjKSArIHRoaXMucmhleChkKTtcbiAgICB9XG4gICAgLCBpaTogZnVuY3Rpb24gKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNtbih0aGlzLmJpdFhPUihjLCB0aGlzLmJpdE9SKGIsIH5kKSksIGEsIGIsIHgsIHMsIHQpO1xuICAgIH1cbiAgICAsIGhoOiBmdW5jdGlvbiAoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICAgICAgcmV0dXJuIHRoaXMuY21uKHRoaXMuYml0WE9SKHRoaXMuYml0WE9SKGIsIGMpLCBkKSwgYSwgYiwgeCwgcywgdCk7XG4gICAgfVxuICAgICwgZ2c6IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5jbW4odGhpcy5iaXRPUih0aGlzLmJpdEFORChiLCBkKSwgdGhpcy5iaXRBTkQoYywgfmQpKSwgYSwgYiwgeCwgcywgdCk7XG4gICAgfVxuICAgICwgZmY6IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5jbW4odGhpcy5iaXRPUih0aGlzLmJpdEFORChiLCBjKSwgdGhpcy5iaXRBTkQofmIsIGQpKSwgYSwgYiwgeCwgcywgdCk7XG4gICAgfVxuICAgICwgY21uOiBmdW5jdGlvbiAocSwgYSwgYiwgeCwgcywgdCkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkbWUodGhpcy5yb2wodGhpcy5hZGRtZSh0aGlzLmFkZG1lKGEsIHEpLCB0aGlzLmFkZG1lKHgsIHQpKSwgcyksIGIpO1xuICAgIH1cbiAgICAsIHJvbDogZnVuY3Rpb24gKG51bSwgY250KSB7XG4gICAgICByZXR1cm4gbnVtIDw8IGNudCB8IG51bSA+Pj4gMzIgLSBjbnQ7XG4gICAgfVxuICAgICwgc3RyMmJsa3M6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHZhciBuYmxrID0gKHN0ci5sZW5ndGggKyA4ID4+IDYpICsgMTtcbiAgICAgIHZhciBibGtzID0gbmV3IEFycmF5KCk7XG4gICAgICB2YXIgX2cxID0gMCwgX2cgPSBuYmxrICogMTY7XG4gICAgICB3aGlsZSAoX2cxIDwgX2cpIHtcbiAgICAgICAgdmFyIGkgPSBfZzErKztcbiAgICAgICAgYmxrc1tpXSA9IDA7XG4gICAgICB9XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB3aGlsZSAoaSA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgYmxrc1tpID4+IDJdIHw9IEh4T3ZlcnJpZGVzLmNjYShzdHIsIGkpIDw8IChzdHIubGVuZ3RoICogOCArIGkpICUgNCAqIDg7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICAgIGJsa3NbaSA+PiAyXSB8PSAxMjggPDwgKHN0ci5sZW5ndGggKiA4ICsgaSkgJSA0ICogODtcbiAgICAgIHZhciBsID0gc3RyLmxlbmd0aCAqIDg7XG4gICAgICB2YXIgayA9IG5ibGsgKiAxNiAtIDI7XG4gICAgICBibGtzW2tdID0gbCAmIDI1NTtcbiAgICAgIGJsa3Nba10gfD0gKGwgPj4+IDggJiAyNTUpIDw8IDg7XG4gICAgICBibGtzW2tdIHw9IChsID4+PiAxNiAmIDI1NSkgPDwgMTY7XG4gICAgICBibGtzW2tdIHw9IChsID4+PiAyNCAmIDI1NSkgPDwgMjQ7XG4gICAgICByZXR1cm4gYmxrcztcbiAgICB9XG4gICAgLCByaGV4OiBmdW5jdGlvbiAobnVtKSB7XG4gICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgIHZhciBoZXhfY2hyID0gXCIwMTIzNDU2Nzg5YWJjZGVmXCI7XG4gICAgICB2YXIgX2cgPSAwO1xuICAgICAgd2hpbGUgKF9nIDwgNCkge1xuICAgICAgICB2YXIgaiA9IF9nKys7XG4gICAgICAgIHN0ciArPSBoZXhfY2hyLmNoYXJBdChudW0gPj4gaiAqIDggKyA0ICYgMTUpICsgaGV4X2Noci5jaGFyQXQobnVtID4+IGogKiA4ICYgMTUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgLCBhZGRtZTogZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIHZhciBsc3cgPSAoeCAmIDY1NTM1KSArICh5ICYgNjU1MzUpO1xuICAgICAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICAgICAgcmV0dXJuIG1zdyA8PCAxNiB8IGxzdyAmIDY1NTM1O1xuICAgIH1cbiAgICAsIGJpdEFORDogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHZhciBsc2IgPSBhICYgMSAmIChiICYgMSk7XG4gICAgICB2YXIgbXNiMzEgPSBhID4+PiAxICYgYiA+Pj4gMTtcbiAgICAgIHJldHVybiBtc2IzMSA8PCAxIHwgbHNiO1xuICAgIH1cbiAgICAsIGJpdFhPUjogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHZhciBsc2IgPSBhICYgMSBeIGIgJiAxO1xuICAgICAgdmFyIG1zYjMxID0gYSA+Pj4gMSBeIGIgPj4+IDE7XG4gICAgICByZXR1cm4gbXNiMzEgPDwgMSB8IGxzYjtcbiAgICB9XG4gICAgLCBiaXRPUjogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHZhciBsc2IgPSBhICYgMSB8IGIgJiAxO1xuICAgICAgdmFyIG1zYjMxID0gYSA+Pj4gMSB8IGIgPj4+IDE7XG4gICAgICByZXR1cm4gbXNiMzEgPDwgMSB8IGxzYjtcbiAgICB9XG4gICAgLCBfX2NsYXNzX186IGhheGUuTWQ1XG4gIH1cbiAgaGF4ZS5UaW1lciA9IGZ1bmN0aW9uICh0aW1lX21zKSB7XG4gICAgdmFyIG1lID0gdGhpcztcbiAgICB0aGlzLmlkID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgIG1lLnJ1bigpO1xuICAgIH0sIHRpbWVfbXMpO1xuICB9O1xuICBoYXhlLlRpbWVyLl9fbmFtZV9fID0gdHJ1ZTtcbiAgaGF4ZS5UaW1lci5kZWxheSA9IGZ1bmN0aW9uIChmLCB0aW1lX21zKSB7XG4gICAgdmFyIHQgPSBuZXcgaGF4ZS5UaW1lcih0aW1lX21zKTtcbiAgICB0LnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHQuc3RvcCgpO1xuICAgICAgZigpO1xuICAgIH07XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgaGF4ZS5UaW1lci5tZWFzdXJlID0gZnVuY3Rpb24gKGYsIHBvcykge1xuICAgIHZhciB0MCA9IGhheGUuVGltZXIuc3RhbXAoKTtcbiAgICB2YXIgciA9IGYoKTtcbiAgICBoYXhlLkxvZy50cmFjZShoYXhlLlRpbWVyLnN0YW1wKCkgLSB0MCArIFwic1wiLCBwb3MpO1xuICAgIHJldHVybiByO1xuICB9XG4gIGhheGUuVGltZXIuc3RhbXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMDtcbiAgfVxuICBoYXhlLlRpbWVyLnByb3RvdHlwZSA9IHtcbiAgICBydW46IGZ1bmN0aW9uICgpIHtcbiAgICB9XG4gICAgLCBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5pZCA9PSBudWxsKSByZXR1cm47XG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmlkKTtcbiAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgIH1cbiAgICAsIF9fY2xhc3NfXzogaGF4ZS5UaW1lclxuICB9XG4gIHZhciBqcyA9IGpzIHx8IHt9XG4gIGpzLkJvb3QgPSBmdW5jdGlvbiAoKSB7IH1cbiAganMuQm9vdC5fX25hbWVfXyA9IHRydWU7XG4gIGpzLkJvb3QuX191bmh0bWwgPSBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLnNwbGl0KFwiJlwiKS5qb2luKFwiJmFtcDtcIikuc3BsaXQoXCI8XCIpLmpvaW4oXCImbHQ7XCIpLnNwbGl0KFwiPlwiKS5qb2luKFwiJmd0O1wiKTtcbiAgfVxuICBqcy5Cb290Ll9fdHJhY2UgPSBmdW5jdGlvbiAodiwgaSkge1xuICAgIHZhciBtc2cgPSBpICE9IG51bGwgPyBpLmZpbGVOYW1lICsgXCI6XCIgKyBpLmxpbmVOdW1iZXIgKyBcIjogXCIgOiBcIlwiO1xuICAgIG1zZyArPSBqcy5Cb290Ll9fc3RyaW5nX3JlYyh2LCBcIlwiKTtcbiAgICB2YXIgZDtcbiAgICBpZiAodHlwZW9mIChkb2N1bWVudCkgIT0gXCJ1bmRlZmluZWRcIiAmJiAoZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGF4ZTp0cmFjZVwiKSkgIT0gbnVsbCkgZC5pbm5lckhUTUwgKz0ganMuQm9vdC5fX3VuaHRtbChtc2cpICsgXCI8YnIvPlwiOyBlbHNlIGlmICh0eXBlb2YgKGNvbnNvbGUpICE9IFwidW5kZWZpbmVkXCIgJiYgY29uc29sZS5sb2cgIT0gbnVsbCkgY29uc29sZS5sb2cobXNnKTtcbiAgfVxuICBqcy5Cb290Ll9fY2xlYXJfdHJhY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhheGU6dHJhY2VcIik7XG4gICAgaWYgKGQgIT0gbnVsbCkgZC5pbm5lckhUTUwgPSBcIlwiO1xuICB9XG4gIGpzLkJvb3QuaXNDbGFzcyA9IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8uX19uYW1lX187XG4gIH1cbiAganMuQm9vdC5pc0VudW0gPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlLl9fZW5hbWVfXztcbiAgfVxuICBqcy5Cb290LmdldENsYXNzID0gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gby5fX2NsYXNzX187XG4gIH1cbiAganMuQm9vdC5fX3N0cmluZ19yZWMgPSBmdW5jdGlvbiAobywgcykge1xuICAgIGlmIChvID09IG51bGwpIHJldHVybiBcIm51bGxcIjtcbiAgICBpZiAocy5sZW5ndGggPj0gNSkgcmV0dXJuIFwiPC4uLj5cIjtcbiAgICB2YXIgdCA9IHR5cGVvZiAobyk7XG4gICAgaWYgKHQgPT0gXCJmdW5jdGlvblwiICYmIChvLl9fbmFtZV9fIHx8IG8uX19lbmFtZV9fKSkgdCA9IFwib2JqZWN0XCI7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBpZiAoby5fX2VudW1fXykge1xuICAgICAgICAgICAgaWYgKG8ubGVuZ3RoID09IDIpIHJldHVybiBvWzBdO1xuICAgICAgICAgICAgdmFyIHN0ciA9IG9bMF0gKyBcIihcIjtcbiAgICAgICAgICAgIHMgKz0gXCJcXHRcIjtcbiAgICAgICAgICAgIHZhciBfZzEgPSAyLCBfZyA9IG8ubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKF9nMSA8IF9nKSB7XG4gICAgICAgICAgICAgIHZhciBpID0gX2cxKys7XG4gICAgICAgICAgICAgIGlmIChpICE9IDIpIHN0ciArPSBcIixcIiArIGpzLkJvb3QuX19zdHJpbmdfcmVjKG9baV0sIHMpOyBlbHNlIHN0ciArPSBqcy5Cb290Ll9fc3RyaW5nX3JlYyhvW2ldLCBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHIgKyBcIilcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGwgPSBvLmxlbmd0aDtcbiAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICB2YXIgc3RyID0gXCJbXCI7XG4gICAgICAgICAgcyArPSBcIlxcdFwiO1xuICAgICAgICAgIHZhciBfZyA9IDA7XG4gICAgICAgICAgd2hpbGUgKF9nIDwgbCkge1xuICAgICAgICAgICAgdmFyIGkxID0gX2crKztcbiAgICAgICAgICAgIHN0ciArPSAoaTEgPiAwID8gXCIsXCIgOiBcIlwiKSArIGpzLkJvb3QuX19zdHJpbmdfcmVjKG9baTFdLCBzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyICs9IFwiXVwiO1xuICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRvc3RyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRvc3RyID0gby50b1N0cmluZztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBcIj8/P1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b3N0ciAhPSBudWxsICYmIHRvc3RyICE9IE9iamVjdC50b1N0cmluZykge1xuICAgICAgICAgIHZhciBzMiA9IG8udG9TdHJpbmcoKTtcbiAgICAgICAgICBpZiAoczIgIT0gXCJbb2JqZWN0IE9iamVjdF1cIikgcmV0dXJuIHMyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrID0gbnVsbDtcbiAgICAgICAgdmFyIHN0ciA9IFwie1xcblwiO1xuICAgICAgICBzICs9IFwiXFx0XCI7XG4gICAgICAgIHZhciBoYXNwID0gby5oYXNPd25Qcm9wZXJ0eSAhPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBrIGluIG8pIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgaWYgKGhhc3AgJiYgIW8uaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoayA9PSBcInByb3RvdHlwZVwiIHx8IGsgPT0gXCJfX2NsYXNzX19cIiB8fCBrID09IFwiX19zdXBlcl9fXCIgfHwgayA9PSBcIl9faW50ZXJmYWNlc19fXCIgfHwgayA9PSBcIl9fcHJvcGVydGllc19fXCIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyLmxlbmd0aCAhPSAyKSBzdHIgKz0gXCIsIFxcblwiO1xuICAgICAgICAgIHN0ciArPSBzICsgayArIFwiIDogXCIgKyBqcy5Cb290Ll9fc3RyaW5nX3JlYyhvW2tdLCBzKTtcbiAgICAgICAgfVxuICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7XG4gICAgICAgIHN0ciArPSBcIlxcblwiICsgcyArIFwifVwiO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgIHJldHVybiBcIjxmdW5jdGlvbj5cIjtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIG87XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gU3RyaW5nKG8pO1xuICAgIH1cbiAgfVxuICBqcy5Cb290Ll9faW50ZXJmTG9vcCA9IGZ1bmN0aW9uIChjYywgY2wpIHtcbiAgICBpZiAoY2MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjYyA9PSBjbCkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGludGYgPSBjYy5fX2ludGVyZmFjZXNfXztcbiAgICBpZiAoaW50ZiAhPSBudWxsKSB7XG4gICAgICB2YXIgX2cxID0gMCwgX2cgPSBpbnRmLmxlbmd0aDtcbiAgICAgIHdoaWxlIChfZzEgPCBfZykge1xuICAgICAgICB2YXIgaSA9IF9nMSsrO1xuICAgICAgICB2YXIgaTEgPSBpbnRmW2ldO1xuICAgICAgICBpZiAoaTEgPT0gY2wgfHwganMuQm9vdC5fX2ludGVyZkxvb3AoaTEsIGNsKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBqcy5Cb290Ll9faW50ZXJmTG9vcChjYy5fX3N1cGVyX18sIGNsKTtcbiAgfVxuICBqcy5Cb290Ll9faW5zdGFuY2VvZiA9IGZ1bmN0aW9uIChvLCBjbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAobyBpbnN0YW5jZW9mIGNsKSB7XG4gICAgICAgIGlmIChjbCA9PSBBcnJheSkgcmV0dXJuIG8uX19lbnVtX18gPT0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoanMuQm9vdC5fX2ludGVyZkxvb3Aoby5fX2NsYXNzX18sIGNsKSkgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGNsID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3dpdGNoIChjbCkge1xuICAgICAgY2FzZSBJbnQ6XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwobyAlIDIxNDc0ODM2NDguMCkgPT09IG87XG4gICAgICBjYXNlIEZsb2F0OlxuICAgICAgICByZXR1cm4gdHlwZW9mIChvKSA9PSBcIm51bWJlclwiO1xuICAgICAgY2FzZSBCb29sOlxuICAgICAgICByZXR1cm4gbyA9PT0gdHJ1ZSB8fCBvID09PSBmYWxzZTtcbiAgICAgIGNhc2UgU3RyaW5nOlxuICAgICAgICByZXR1cm4gdHlwZW9mIChvKSA9PSBcInN0cmluZ1wiO1xuICAgICAgY2FzZSBEeW5hbWljOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChvID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGNsID09IENsYXNzICYmIG8uX19uYW1lX18gIT0gbnVsbCkgcmV0dXJuIHRydWU7IGVsc2UgbnVsbDtcbiAgICAgICAgaWYgKGNsID09IEVudW0gJiYgby5fX2VuYW1lX18gIT0gbnVsbCkgcmV0dXJuIHRydWU7IGVsc2UgbnVsbDtcbiAgICAgICAgcmV0dXJuIG8uX19lbnVtX18gPT0gY2w7XG4gICAgfVxuICB9XG4gIGpzLkJvb3QuX19jYXN0ID0gZnVuY3Rpb24gKG8sIHQpIHtcbiAgICBpZiAoanMuQm9vdC5fX2luc3RhbmNlb2YobywgdCkpIHJldHVybiBvOyBlbHNlIHRocm93IFwiQ2Fubm90IGNhc3QgXCIgKyBTdGQuc3RyaW5nKG8pICsgXCIgdG8gXCIgKyBTdGQuc3RyaW5nKHQpO1xuICB9XG4gIGpzLkxpYiA9IGZ1bmN0aW9uICgpIHsgfVxuICBqcy5MaWIuX19uYW1lX18gPSB0cnVlO1xuICBqcy5MaWIuZGVidWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWdnZXI7XG4gIH1cbiAganMuTGliLmFsZXJ0ID0gZnVuY3Rpb24gKHYpIHtcbiAgICBhbGVydChqcy5Cb290Ll9fc3RyaW5nX3JlYyh2LCBcIlwiKSk7XG4gIH1cbiAganMuTGliLmV2YWwgPSBmdW5jdGlvbiAoY29kZSkge1xuICAgIHJldHVybiBldmFsKGNvZGUpO1xuICB9XG4gIGpzLkxpYi5zZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZikge1xuICAgIGpzLkxpYi5vbmVycm9yID0gZjtcbiAgfVxuICB2YXIgJF87XG4gIGZ1bmN0aW9uICRiaW5kKG8sIG0pIHsgdmFyIGYgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmLm1ldGhvZC5hcHBseShmLnNjb3BlLCBhcmd1bWVudHMpOyB9OyBmLnNjb3BlID0gbzsgZi5tZXRob2QgPSBtOyByZXR1cm4gZjsgfTtcbiAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSBIeE92ZXJyaWRlcy5yZW1vdmUgPSBmdW5jdGlvbiAoYSwgbykge1xuICAgIHZhciBpID0gYS5pbmRleE9mKG8pO1xuICAgIGlmIChpID09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgYS5zcGxpY2UoaSwgMSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07IGVsc2UgbnVsbDtcbiAgTWF0aC5fX25hbWVfXyA9IFtcIk1hdGhcIl07XG4gIE1hdGguTmFOID0gTnVtYmVyLk5hTjtcbiAgTWF0aC5ORUdBVElWRV9JTkZJTklUWSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgTWF0aC5QT1NJVElWRV9JTkZJTklUWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgTWF0aC5pc0Zpbml0ZSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGlzRmluaXRlKGkpO1xuICB9O1xuICBNYXRoLmlzTmFOID0gZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gaXNOYU4oaSk7XG4gIH07XG4gIFN0cmluZy5wcm90b3R5cGUuX19jbGFzc19fID0gU3RyaW5nO1xuICBTdHJpbmcuX19uYW1lX18gPSB0cnVlO1xuICBBcnJheS5wcm90b3R5cGUuX19jbGFzc19fID0gQXJyYXk7XG4gIEFycmF5Ll9fbmFtZV9fID0gdHJ1ZTtcbiAgRGF0ZS5wcm90b3R5cGUuX19jbGFzc19fID0gRGF0ZTtcbiAgRGF0ZS5fX25hbWVfXyA9IFtcIkRhdGVcIl07XG4gIHZhciBJbnQgPSB7IF9fbmFtZV9fOiBbXCJJbnRcIl0gfTtcbiAgdmFyIER5bmFtaWMgPSB7IF9fbmFtZV9fOiBbXCJEeW5hbWljXCJdIH07XG4gIHZhciBGbG9hdCA9IE51bWJlcjtcbiAgRmxvYXQuX19uYW1lX18gPSBbXCJGbG9hdFwiXTtcbiAgdmFyIEJvb2wgPSBCb29sZWFuO1xuICBCb29sLl9fZW5hbWVfXyA9IFtcIkJvb2xcIl07XG4gIHZhciBDbGFzcyA9IHsgX19uYW1lX186IFtcIkNsYXNzXCJdIH07XG4gIHZhciBFbnVtID0ge307XG4gIHZhciBWb2lkID0geyBfX2VuYW1lX186IFtcIlZvaWRcIl0gfTtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiKSBqcy5MaWIuZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGpzLkxpYi53aW5kb3cgPSB3aW5kb3c7XG4gICAganMuTGliLndpbmRvdy5vbmVycm9yID0gZnVuY3Rpb24gKG1zZywgdXJsLCBsaW5lKSB7XG4gICAgICB2YXIgZiA9IGpzLkxpYi5vbmVycm9yO1xuICAgICAgaWYgKGYgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGYobXNnLCBbdXJsICsgXCI6XCIgKyBsaW5lXSk7XG4gICAgfTtcbiAgfVxuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5tYWluKCk7XG59KCkpO1xuZGVsZXRlIEFycmF5LnByb3RvdHlwZS5fX2NsYXNzX187XG4vLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlRW5kXG4iLCJpbXBvcnQgVXRpbCBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IExhdGV4IGZyb20gJy4vbGF0ZXgnO1xuaW1wb3J0IE1hdGhNTCBmcm9tICcuL21hdGhtbCc7XG5pbXBvcnQgSW1hZ2UgZnJvbSAnLi9pbWFnZSc7XG5pbXBvcnQgQWNjZXNzaWJpbGl0eSBmcm9tICcuL2FjY2Vzc2liaWxpdHknO1xuaW1wb3J0IFNlcnZpY2VQcm92aWRlciBmcm9tICcuL3NlcnZpY2Vwcm92aWRlcic7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCBtZDUgZnJvbSAnLi9tZDUnO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTWFoTUwgcGFyc2VyLiBDb252ZXJ0cyBNYXRoTUwgaW50byBmb3JtdWxhcyBkZXBlbmRpbmcgb24gdGhlXG4gKiBpbWFnZSBmb3JtYXQgKFNWRywgUE5HLCBiYXNlNjQpIGFuZCB0aGUgc2F2ZSBtb2RlIChYTUwsIHNhZmVYTUwsIEltYWdlKSBjb25maWd1cmVkXG4gKiBpbiB0aGUgYmFja2VuZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgTWF0aE1MIHN0cmluZyB0byBhbiBpbWcgZWxlbWVudC5cbiAgICogQHBhcmFtIHtEb2N1bWVudH0gY3JlYXRvciAtIERvY3VtZW50IG9iamVjdCB0byBjYWxsIGNyZWF0ZUVsZW1lbnQgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0aG1sIC0gTWF0aE1MIGNvZGVcbiAgICogQHBhcmFtIHtPYmplY3RbXX0gd2lyaXNQcm9wZXJ0aWVzIC0gb2JqZWN0IGNvbnRhaW5pbmcgV0lSSVMgY3VzdG9tIHByb3BlcnRpZXNcbiAgICogQHBhcmFtIHtsYW5ndWFnZX0gbGFuZ3VhZ2UgLSBjdXN0b20gbGFuZ3VhZ2UgZm9yIGFjY2Vzc2liaWxpdHkuXG4gICAqIEByZXR1cm5zIHtIVE1MSW1hZ2VFbGVtZW50fSB0aGUgZm9ybXVsYSBpbWFnZSBjb3JyZXNwb25kaW5nIHRvIGluaXRpYWwgTWF0aE1MIHN0cmluZy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIG1hdGhtbFRvSW1nT2JqZWN0KGNyZWF0b3IsIG1hdGhtbCwgd2lyaXNQcm9wZXJ0aWVzLCBsYW5ndWFnZSkge1xuICAgIGNvbnN0IGltZ09iamVjdCA9IGNyZWF0b3IuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgaW1nT2JqZWN0LmFsaWduID0gJ21pZGRsZSc7XG4gICAgaW1nT2JqZWN0LnN0eWxlLm1heFdpZHRoID0gJ25vbmUnO1xuICAgIGxldCBkYXRhID0gd2lyaXNQcm9wZXJ0aWVzIHx8IHt9O1xuXG4gICAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhlIGJhY2tlbmQgY29uZmlnXG4gICAgY29uc3Qgd2lyaXNFZGl0b3JQcm9wZXJ0aWVzID0gQ29uZmlndXJhdGlvbi5nZXQoXCJlZGl0b3JQYXJhbWV0ZXJzXCIpO1xuICAgIGRhdGEgPSB7IC4uLndpcmlzRWRpdG9yUHJvcGVydGllcywgLi4uZGF0YSB9O1xuXG4gICAgZGF0YS5tbWwgPSBtYXRobWw7XG4gICAgZGF0YS5sYW5nID0gbGFuZ3VhZ2U7XG4gICAgLy8gUmVxdWVzdCBtZXRyaWNzIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuXG4gICAgZGF0YS5tZXRyaWNzID0gJ3RydWUnO1xuICAgIGRhdGEuY2VudGVyYmFzZWxpbmUgPSAnZmFsc2UnO1xuXG4gICAgLy8gRnVsbCBiYXNlNjQgbWV0aG9kIChlZGl0ICYgc2F2ZSkuXG4gICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAnYmFzZTY0JyAmJiBDb25maWd1cmF0aW9uLmdldCgnYmFzZTY0c2F2ZW1vZGUnKSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICBkYXRhLmJhc2U2NCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGpzIHBhcmFtczogX3dyc19pbnRfd2lyaXNQcm9wZXJ0aWVzIGNvbnRhaW5zIHNvbWUganMgcmVuZGVyIHBhcmFtcy5cbiAgICAvLyBTaW5jZSBNYXRoTUwgY2FuIHN1cHBvcnQgcmVuZGVyIHBhcmFtcywganMgcGFyYW1zIHNob3VsZCBiZSBzZW5kIG9ubHkgdG8gZWRpdG9yLlxuXG4gICAgaW1nT2JqZWN0LmNsYXNzTmFtZSA9IENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZUNsYXNzTmFtZScpO1xuXG4gICAgaWYgKG1hdGhtbC5pbmRleE9mKCdjbGFzcz1cIicpICE9PSAtMSkge1xuICAgICAgLy8gV2UgY2hlY2sgaGVyZSBpZiB0aGUgTWF0aE1MIGhhcyBiZWVuIGNyZWF0ZWQgZnJvbSBhIGN1c3RvbUVkaXRvciAoc3VjaCBjaGVtaXN0cnkpXG4gICAgICAvLyB0byBhZGQgY3VzdG9tIGVkaXRvciBuYW1lIGF0dHJpYnV0ZSB0byBpbWcgb2JqZWN0IChpZiBuZWNlc3NhcnkpLlxuICAgICAgbGV0IG1hdGhtbFN1YnN0cmluZyA9IG1hdGhtbC5zdWJzdHJpbmcobWF0aG1sLmluZGV4T2YoJ2NsYXNzPVwiJykgKyAnY2xhc3M9XCInLmxlbmd0aCwgbWF0aG1sLmxlbmd0aCk7XG4gICAgICBtYXRobWxTdWJzdHJpbmcgPSBtYXRobWxTdWJzdHJpbmcuc3Vic3RyaW5nKDAsIG1hdGhtbFN1YnN0cmluZy5pbmRleE9mKCdcIicpKTtcbiAgICAgIG1hdGhtbFN1YnN0cmluZyA9IG1hdGhtbFN1YnN0cmluZy5zdWJzdHJpbmcoNCwgbWF0aG1sU3Vic3RyaW5nLmxlbmd0aCk7XG4gICAgICBpbWdPYmplY3Quc2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZUN1c3RvbUVkaXRvck5hbWUnKSwgbWF0aG1sU3Vic3RyaW5nKTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtYW5jZSBlbmFibGVkLlxuICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnd2lyaXNQbHVnaW5QZXJmb3JtYW5jZScpICYmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSA9PT0gJ3htbCcgfHwgQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVNb2RlJykgPT09ICdzYWZlWG1sJykpIHtcbiAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKFBhcnNlci5jcmVhdGVTaG93SW1hZ2VTcmMoZGF0YSwgbGFuZ3VhZ2UpKTtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnd2FybmluZycpIHtcbiAgICAgICAgLy8gUE9TVCBjYWxsLlxuICAgICAgICAvLyBpZiB0aGUgbWF0aG1sIGlzIG1hbGZvcm1lZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKFNlcnZpY2VQcm92aWRlci5nZXRTZXJ2aWNlKCdzaG93aW1hZ2UnLCBkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKHsgcmVzdWx0IH0gPSByZXN1bHQpO1xuICAgICAgaWYgKHJlc3VsdC5mb3JtYXQgPT09ICdwbmcnKSB7XG4gICAgICAgIGltZ09iamVjdC5zcmMgPSBgZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7cmVzdWx0LmNvbnRlbnR9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltZ09iamVjdC5zcmMgPSBgZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmOCwke1V0aWwudXJsRW5jb2RlKHJlc3VsdC5jb250ZW50KX1gO1xuICAgICAgfVxuICAgICAgaW1nT2JqZWN0LnNldEF0dHJpYnV0ZShDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VNYXRobWxBdHRyaWJ1dGUnKSwgTWF0aE1MLnNhZmVYbWxFbmNvZGUobWF0aG1sKSk7XG4gICAgICBJbWFnZS5zZXRJbWdTaXplKGltZ09iamVjdCwgcmVzdWx0LmNvbnRlbnQsIHRydWUpO1xuXG4gICAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ2VuYWJsZUFjY2Vzc2liaWxpdHknKSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdC5hbHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaW1nT2JqZWN0LmFsdCA9IEFjY2Vzc2liaWxpdHkubWF0aE1MVG9BY2Nlc3NpYmxlKG1hdGhtbCwgbGFuZ3VhZ2UsIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltZ09iamVjdC5hbHQgPSByZXN1bHQuYWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFBhcnNlci5jcmVhdGVJbWFnZVNyYyhtYXRobWwsIGRhdGEpO1xuICAgICAgaW1nT2JqZWN0LnNldEF0dHJpYnV0ZShDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VNYXRobWxBdHRyaWJ1dGUnKSwgTWF0aE1MLnNhZmVYbWxFbmNvZGUobWF0aG1sKSk7XG4gICAgICBpbWdPYmplY3Quc3JjID0gcmVzdWx0O1xuICAgICAgSW1hZ2Uuc2V0SW1nU2l6ZShpbWdPYmplY3QsIHJlc3VsdCwgQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVNb2RlJykgPT09ICdiYXNlNjQnICYmIENvbmZpZ3VyYXRpb24uZ2V0KCdiYXNlNjRzYXZlbW9kZScpID09PSAnZGVmYXVsdCcpO1xuICAgICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdlbmFibGVBY2Nlc3NpYmlsaXR5JykpIHtcbiAgICAgICAgaW1nT2JqZWN0LmFsdCA9IEFjY2Vzc2liaWxpdHkubWF0aE1MVG9BY2Nlc3NpYmxlKG1hdGhtbCwgbGFuZ3VhZ2UsIGRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgUGFyc2VyLm9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgUGFyc2VyLm9ic2VydmVyLm9ic2VydmUoaW1nT2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hdGggaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhL3JvbGVzI21hdGguXG4gICAgaW1nT2JqZWN0LnNldEF0dHJpYnV0ZSgncm9sZScsICdtYXRoJyk7XG4gICAgcmV0dXJuIGltZ09iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgdG8gc2hvd2ltYWdlIHNlcnZpY2UgYnkgY2FsbGluZyBjcmVhdGVpbWFnZSBzZXJ2aWNlLiBUaGVcbiAgICogb3V0cHV0IG9mIHRoZSBjcmVhdGVpbWFnZSBzZXJ2aWNlIGlzIGEgVVJMIHBhdGggcG9pbnRpbmcgdG8gc2hvd2ltYWdlIHNlcnZpY2UuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHBlcmZvcm1hbmNlIGlzIGRpc2FibGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0aG1sIC0gTWF0aE1MIGNvZGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0W119IGRhdGEgLSBkYXRhIG9iamVjdCBjb250YWluaW5nIHNlcnZpY2UgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHNob3dpbWFnZSBwYXRoLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUltYWdlU3JjKG1hdGhtbCwgZGF0YSkge1xuICAgIC8vIEZ1bGwgYmFzZTY0IG1ldGhvZCAoZWRpdCAmIHNhdmUpLlxuICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSA9PT0gJ2Jhc2U2NCcgJiYgQ29uZmlndXJhdGlvbi5nZXQoJ2Jhc2U2NHNhdmVtb2RlJykgPT09ICdkZWZhdWx0Jykge1xuICAgICAgZGF0YS5iYXNlNjQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBTZXJ2aWNlUHJvdmlkZXIuZ2V0U2VydmljZSgnY3JlYXRlaW1hZ2UnLCBkYXRhKTtcblxuICAgIGlmIChyZXN1bHQuaW5kZXhPZignQEJBU0VAJykgIT09IC0xKSB7XG4gICAgICAvLyBSZXBsYWNpbmcgJ0BCQVNFQCcgd2l0aCB0aGUgYmFzZSBVUkwgb2YgY3JlYXRlaW1hZ2UuXG4gICAgICBjb25zdCBiYXNlUGFydHMgPSBTZXJ2aWNlUHJvdmlkZXIuZ2V0U2VydmljZVBhdGgoJ2NyZWF0ZWltYWdlJykuc3BsaXQoJy8nKTtcbiAgICAgIGJhc2VQYXJ0cy5wb3AoKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zcGxpdCgnQEJBU0VAJykuam9pbihiYXNlUGFydHMuam9pbignLycpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBpbml0aWFsIEhUTUwgY29kZS4gSWYgdGhlIEhUTUwgY29udGFpbnMgZGF0YSBnZW5lcmF0ZWQgYnkgV0lSSVMsXG4gICAqIHRoaXMgZGF0YSB3b3VsZCBiZSBjb252ZXJ0ZWQgYXMgZm9sbG93aW5nOlxuICAgKiA8cHJlPlxuICAgKiBNYXRoTUwgY29kZTogSW1hZ2UgY29udGFpbmluZyB0aGUgY29ycmVzcG9uZGluZyBNYXRoTUwgZm9ybXVsYXMuXG4gICAqIE1hdGhNTCBjb2RlIHdpdGggTGFUZVggYW5ub3RhdGlvbiA6IExhVGVYIHN0cmluZy5cbiAgICogPC9wcmU+XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIC0gSFRNTCBjb2RlIGNvbnRhaW5pbmcgTWF0aE1MIGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIGxhbmd1YWdlIHRvIGNyZWF0ZSBpbWFnZSBhbHQgdGV4dC5cbiAgICogQHJldHVybnMge3N0cmluZ30gSFRNTCBjb2RlIHdpdGggdGhlIG9yaWdpbmFsIE1hdGhNTCBjb252ZXJ0ZWQgaW50byBMYVRlWCBhbmQgaW1hZ2VzLlxuICAgKi9cbiAgc3RhdGljIGluaXRQYXJzZShjb2RlLCBsYW5ndWFnZSkge1xuICAgIC8qIE5vdGU6IFRoZSBjb2RlIGluc2lkZSB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGludmVydGVkLlxuICAgIElmIHlvdSBpbnZlcnQgYWdhaW4gdGhlIGNvZGUgdGhlbiB5b3UgY2Fubm90IHVzZSBjb3JyZWN0bHkgTGFUZVhcbiAgICBpbiBNb29kbGUuXG4gICAgKi9cbiAgICBjb2RlID0gUGFyc2VyLmluaXRQYXJzZVNhdmVNb2RlKGNvZGUsIGxhbmd1YWdlKTtcbiAgICByZXR1cm4gUGFyc2VyLmluaXRQYXJzZUVkaXRNb2RlKGNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBpbml0aWFsIEhUTUwgY29kZSBkZXBlbmRpbmcgb24gdGhlIHNhdmUgbW9kZS4gVHJhbnNmb3JtcyBhbGwgTWF0aE1MXG4gICAqIG9jY3VycmVuY2VzIGZvciBpdCdzIGNvcnJlc3BvbmRlbnQgaW1hZ2Ugb3IgTGFUZVguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIC0gSFRNTCBjb2RlIHRvIGJlIHBhcnNlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBsYW5ndWFnZSB0byBjcmVhdGUgaW1hZ2UgYWx0IHRleHQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEhUTUwgY29kZSBwYXJzZWQuXG4gICAqL1xuICBzdGF0aWMgaW5pdFBhcnNlU2F2ZU1vZGUoY29kZSwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVNb2RlJykpIHtcbiAgICAgIC8vIENvbnZlcnRpbmcgWE1MIHRvIHRhZ3MuXG4gICAgICBjb2RlID0gTGF0ZXgucGFyc2VNYXRobWxUb0xhdGV4KGNvZGUsIENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycyk7XG4gICAgICBjb2RlID0gTGF0ZXgucGFyc2VNYXRobWxUb0xhdGV4KGNvZGUsIENvbnN0YW50cy54bWxDaGFyYWN0ZXJzKTtcbiAgICAgIGNvZGUgPSBQYXJzZXIucGFyc2VNYXRobWxUb0ltZyhjb2RlLCBDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMsIGxhbmd1YWdlKTtcbiAgICAgIGNvZGUgPSBQYXJzZXIucGFyc2VNYXRobWxUb0ltZyhjb2RlLCBDb25zdGFudHMueG1sQ2hhcmFjdGVycywgbGFuZ3VhZ2UpO1xuICAgICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAnYmFzZTY0JyAmJiBDb25maWd1cmF0aW9uLmdldCgnYmFzZTY0c2F2ZW1vZGUnKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICBjb2RlID0gUGFyc2VyLmNvZGVJbWdUcmFuc2Zvcm0oY29kZSwgJ2Jhc2U2NDJzaG93aW1hZ2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGluaXRpYWwgSFRNTCBjb2RlIGRlcGVuZGluZyBvbiB0aGUgZWRpdCBtb2RlLlxuICAgKiBJZiAnbGF0ZXgnIHBhcnNlTW9kZSBpcyBlbmFibGVkIGFsbCBNYXRoTUwgY29udGFpbmluZyBhbiBhbm5vdGF0aW9uIHdpdGggZW5jb2Rpbmc9J0xhVGVYJyB3aWxsXG4gICAqIGJlIGNvbnZlcnRlZCBpbnRvIGEgTGFUZVggc3RyaW5nIGluc3RlYWQgb2YgYW4gaW1hZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIC0gSFRNTCBjb2RlIGNvbnRhaW5pbmcgTWF0aE1MLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBwYXJzZWQgSFRNTCBjb2RlLlxuICAgKi9cbiAgc3RhdGljIGluaXRQYXJzZUVkaXRNb2RlKGNvZGUpIHtcbiAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ3BhcnNlTW9kZXMnKS5pbmRleE9mKCdsYXRleCcpICE9PSAtMSkge1xuICAgICAgY29uc3QgaW1nTGlzdCA9IFV0aWwuZ2V0RWxlbWVudHNCeU5hbWVGcm9tU3RyaW5nKGNvZGUsICdpbWcnLCB0cnVlKTtcbiAgICAgIGNvbnN0IHRva2VuID0gJ2VuY29kaW5nPVwiTGFUZVhcIj4nO1xuICAgICAgLy8gV2hpbGUgcmVwbGFjaW5nIGltYWdlcyB3aXRoIGxhdGV4LCB0aGUgaW5kZXhlcyBvZiB0aGUgZm91bmQgaW1hZ2VzIGNoYW5nZXNcbiAgICAgIC8vIHJlc3BlY3RpbmcgdGhlIG9yaWdpbmFsIGNvZGUsIHNvIHRoaXMgY2FycnkgaXMgbmVlZGVkLlxuICAgICAgbGV0IGNhcnJ5ID0gMDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWdMaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGltZ0NvZGUgPSBjb2RlLnN1YnN0cmluZyhpbWdMaXN0W2ldLnN0YXJ0ICsgY2FycnksIGltZ0xpc3RbaV0uZW5kICsgY2FycnkpO1xuXG4gICAgICAgIGlmIChpbWdDb2RlLmluZGV4T2YoYCBjbGFzcz1cIiR7Q29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlQ2xhc3NOYW1lJyl9XCJgKSAhPT0gLTEpIHtcbiAgICAgICAgICBsZXQgbWF0aG1sU3RhcnRUb2tlbiA9IGAgJHtDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VNYXRobWxBdHRyaWJ1dGUnKX09XCJgO1xuICAgICAgICAgIGxldCBtYXRobWxTdGFydCA9IGltZ0NvZGUuaW5kZXhPZihtYXRobWxTdGFydFRva2VuKTtcblxuICAgICAgICAgIGlmIChtYXRobWxTdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICAgIG1hdGhtbFN0YXJ0VG9rZW4gPSAnIGFsdD1cIic7XG4gICAgICAgICAgICBtYXRobWxTdGFydCA9IGltZ0NvZGUuaW5kZXhPZihtYXRobWxTdGFydFRva2VuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWF0aG1sU3RhcnQgIT09IC0xKSB7XG4gICAgICAgICAgICBtYXRobWxTdGFydCArPSBtYXRobWxTdGFydFRva2VuLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG1hdGhtbEVuZCA9IGltZ0NvZGUuaW5kZXhPZignXCInLCBtYXRobWxTdGFydCk7XG4gICAgICAgICAgICBjb25zdCBtYXRobWwgPSBVdGlsLmh0bWxTYW5pdGl6ZShNYXRoTUwuc2FmZVhtbERlY29kZShpbWdDb2RlLnN1YnN0cmluZyhtYXRobWxTdGFydCwgbWF0aG1sRW5kKSkpO1xuICAgICAgICAgICAgbGV0IGxhdGV4U3RhcnRQb3NpdGlvbiA9IG1hdGhtbC5pbmRleE9mKHRva2VuKTtcblxuICAgICAgICAgICAgaWYgKGxhdGV4U3RhcnRQb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgbGF0ZXhTdGFydFBvc2l0aW9uICs9IHRva2VuLmxlbmd0aDtcbiAgICAgICAgICAgICAgY29uc3QgbGF0ZXhFbmRQb3NpdGlvbiA9IG1hdGhtbC5pbmRleE9mKCc8L2Fubm90YXRpb24+JywgbGF0ZXhTdGFydFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgY29uc3QgbGF0ZXggPSBtYXRobWwuc3Vic3RyaW5nKGxhdGV4U3RhcnRQb3NpdGlvbiwgbGF0ZXhFbmRQb3NpdGlvbik7XG5cbiAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZVRleHQgPSBgJCQke1V0aWwuaHRtbEVudGl0aWVzRGVjb2RlKGxhdGV4KX0kJGA7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gY29kZS5zdWJzdHJpbmcoMCwgaW1nTGlzdFtpXS5zdGFydCArIGNhcnJ5KTtcbiAgICAgICAgICAgICAgY29uc3QgZW5kID0gY29kZS5zdWJzdHJpbmcoaW1nTGlzdFtpXS5lbmQgKyBjYXJyeSk7XG4gICAgICAgICAgICAgIGNvZGUgPSBzdGFydCArIHJlcGxhY2VUZXh0ICsgZW5kO1xuICAgICAgICAgICAgICBjYXJyeSArPSByZXBsYWNlVGV4dC5sZW5ndGggLSAoaW1nTGlzdFtpXS5lbmQgLSBpbWdMaXN0W2ldLnN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgZW5kIEhUTUwgY29kZS4gVGhlIGVuZCBIVE1MIGNvZGUgaXMgSFRNTCBjb2RlIHdpdGggZW1iZWRkZWQgaW1hZ2VzXG4gICAqIG9yIExhVGVYIGZvcm11bGFzIGNyZWF0ZWQgd2l0aCBNYXRoVHlwZS4gPGJyPlxuICAgKiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBmb3JtdWxhIGltYWdlcyBhbmQgTGFUZVggc3RyaW5ncyBpbiBNYXRoTUwuIDxicj5cbiAgICogSWYgaW1hZ2UgbW9kZSBpcyBlbmFibGVkIHRoZSBpbWFnZXMgd2lsbCBub3QgYmUgY29udmVydGVkIGludG8gTWF0aE1MLiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy53aXJpcy5jb20vbWF0aHR5cGUvZW4vbWF0aHR5cGUtaW50ZWdyYXRpb25zL21hdGh0eXBlLXdlYi1pbnRlcmZhY2UtZmVhdHVyZXMvZnVsbC1tYXRobWwtbW9kZS0tLXdpcmlzcGx1Z2lucy1qcy5odG1sfS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSBIVE1MIHRvIGJlIHBhcnNlZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgSFRNTCBjb2RlIHBhcnNlZC5cbiAgICovXG4gIHN0YXRpYyBlbmRQYXJzZShjb2RlKSB7XG4gICAgLy8gVHJhbnNmb3JtIExhVGVYIG9jdXJyZW5jZXMgdG8gTWF0aE1MIGVsZW1lbnRzLlxuICAgIGNvbnN0IGNvZGVFbmRQYXJzZWRFZGl0TW9kZSA9IFBhcnNlci5lbmRQYXJzZUVkaXRNb2RlKGNvZGUpO1xuICAgIC8vIFRyYW5zZm9ybSBpbWcgZWxlbWVudHMgdG8gTWF0aE1MIGVsZW1lbnRzLlxuICAgIGNvbnN0IGNvZGVFbmRQYXJzZVNhdmVNb2RlID0gUGFyc2VyLmVuZFBhcnNlU2F2ZU1vZGUoY29kZUVuZFBhcnNlZEVkaXRNb2RlKTtcbiAgICByZXR1cm4gY29kZUVuZFBhcnNlU2F2ZU1vZGU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGVuZCBIVE1MIGNvZGUgZGVwZW5kaW5nIG9uIHRoZSBlZGl0IG1vZGUuXG4gICAqIC0gTGFUZVggaXMgYW4gZW5hYmxlZCBwYXJzZSBtb2RlLCBhbGwgTGFUZVggb2NjdXJyZW5jZXMgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBNYXRoTUwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIC0gSFRNTCBjb2RlIHRvIGJlIHBhcnNlZC5cbiAgICogQHJldHVybnMge3N0cmluZ30gSFRNTCBjb2RlIHBhcnNlZC5cbiAgICovXG4gIHN0YXRpYyBlbmRQYXJzZUVkaXRNb2RlKGNvZGUpIHtcbiAgICAvLyBDb252ZXJ0aW5nIExhVGVYIHRvIGltYWdlcy5cbiAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ3BhcnNlTW9kZXMnKS5pbmRleE9mKCdsYXRleCcpICE9PSAtMSkge1xuICAgICAgbGV0IG91dHB1dCA9ICcnO1xuICAgICAgbGV0IGVuZFBvc2l0aW9uID0gMDtcbiAgICAgIGxldCBzdGFydFBvc2l0aW9uID0gY29kZS5pbmRleE9mKCckJCcpO1xuICAgICAgd2hpbGUgKHN0YXJ0UG9zaXRpb24gIT09IC0xKSB7XG4gICAgICAgIG91dHB1dCArPSBjb2RlLnN1YnN0cmluZyhlbmRQb3NpdGlvbiwgc3RhcnRQb3NpdGlvbik7XG4gICAgICAgIGVuZFBvc2l0aW9uID0gY29kZS5pbmRleE9mKCckJCcsIHN0YXJ0UG9zaXRpb24gKyAyKTtcblxuICAgICAgICBpZiAoZW5kUG9zaXRpb24gIT09IC0xKSB7XG4gICAgICAgICAgLy8gQmVmb3JlLCBpdCB3YXMgYSBjb25kaXRpb24gaGVyZSB0byBleGVjdXRlIHRoZSBuZXh0IGNvZGVsaW5lc1xuICAgICAgICAgIC8vICdsYXRleC5pbmRleE9mKCc8JykgPT0gLTEnLlxuICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2h5IGl0IHdhcyB1c2VkLCBidXQgc2VlbXMgdG8gaGF2ZSBhIGNvbmZsaWN0IHdpdGhcbiAgICAgICAgICAvLyBsYXRleCBmb3JtdWxhcyB0aGF0IGNvbnRhaW5zICc8Jy5cbiAgICAgICAgICBjb25zdCBsYXRleCA9IGNvZGUuc3Vic3RyaW5nKHN0YXJ0UG9zaXRpb24gKyAyLCBlbmRQb3NpdGlvbik7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZExhdGV4ID0gVXRpbC5odG1sRW50aXRpZXNEZWNvZGUobGF0ZXgpO1xuICAgICAgICAgIGxldCBtYXRobWwgPSBVdGlsLmh0bWxTYW5pdGl6ZShMYXRleC5nZXRNYXRoTUxGcm9tTGF0ZXgoZGVjb2RlZExhdGV4LCB0cnVlKSk7XG4gICAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLmdldCgnc2F2ZUhhbmRUcmFjZXMnKSkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGhhbmQgdHJhY2VzLlxuICAgICAgICAgICAgbWF0aG1sID0gTWF0aE1MLnJlbW92ZUFubm90YXRpb24obWF0aG1sLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXQgKz0gbWF0aG1sO1xuICAgICAgICAgIGVuZFBvc2l0aW9uICs9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0cHV0ICs9ICckJCc7XG4gICAgICAgICAgZW5kUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uICsgMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0UG9zaXRpb24gPSBjb2RlLmluZGV4T2YoJyQkJywgZW5kUG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBvdXRwdXQgKz0gY29kZS5zdWJzdHJpbmcoZW5kUG9zaXRpb24sIGNvZGUubGVuZ3RoKTtcbiAgICAgIGNvZGUgPSBvdXRwdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGVuZCBIVE1MIGNvZGUgZGVwZW5kaW5nIG9uIHRoZSBzYXZlIG1vZGUuIENvbnZlcnRzIGFsbFxuICAgKiBpbWFnZXMgaW50byB0aGUgZWxlbWVudCBkZXRlcm1pbmVkIGJ5IHRoZSBzYXZlIG1vZGU6XG4gICAqIC0geG1sOiBQYXJzZXMgaW1hZ2VzIGZvcm11bGFzIGludG8gTWF0aE1MLlxuICAgKiAtIHNhZmVYbWw6IFBhcnNlcyBpbWFnZXMgZm9ybXVsYXMgaW50byBzYWZlTUF0aE1MXG4gICAqIC0gYmFzZTY0OiBQYXJzZXMgaW1hZ2VzIGludG8gYmFzZTY0IGltYWdlcy5cbiAgICogLSBpbWFnZTogUGFyc2UgaW1hZ2VzIGludG8gaW1hZ2VzIChubyBwYXJzaW5nKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZSAtIEhUTUwgY29kZSB0byBiZSBwYXJzZWRcbiAgICogQHJldHVybnMge3N0cmluZ30gSFRNTCBjb2RlIHBhcnNlZC5cbiAgICovXG4gIHN0YXRpYyBlbmRQYXJzZVNhdmVNb2RlKGNvZGUpIHtcbiAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVNb2RlJykpIHtcbiAgICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSA9PT0gJ3NhZmVYbWwnKSB7XG4gICAgICAgIGNvZGUgPSBQYXJzZXIuY29kZUltZ1RyYW5zZm9ybShjb2RlLCAnaW1nMm1hdGhtbCcpO1xuICAgICAgfSBlbHNlIGlmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSA9PT0gJ3htbCcpIHtcbiAgICAgICAgY29kZSA9IFBhcnNlci5jb2RlSW1nVHJhbnNmb3JtKGNvZGUsICdpbWcybWF0aG1sJyk7XG4gICAgICB9IGVsc2UgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAnYmFzZTY0JyAmJiBDb25maWd1cmF0aW9uLmdldCgnYmFzZTY0c2F2ZW1vZGUnKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICBjb2RlID0gUGFyc2VyLmNvZGVJbWdUcmFuc2Zvcm0oY29kZSwgJ2ltZzI2NCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb2RlO1xuICB9XG5cblxuICAvKipcbiAgICogQXV4aWxpYXIgZnVuY3Rpb24gdGhhdCBidWlsZHMgdGhlIGRhdGEgb2JqZWN0IHRvIHNlbmQgdG8gdGhlIHNob3dpbWFnZSBlbmRwb2ludFxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBkYXRhIC0gb2JqZWN0IGNvbnRhaW5pbmcgc2hvd2ltYWdlIHNlcnZpY2UgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxhbmd1YWdlIG9mIHRoZSBmb3JtdWxhLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBKU09OIG9iamVjdCB3aXRoIHRoZSBkYXRhIHRvIHNlbmQgdG8gc2hvd2ltYWdlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVNob3dJbWFnZVNyY0RhdGEoZGF0YSwgbGFuZ3VhZ2UpIHtcbiAgICBjb25zdCBkYXRhTWQ1ID0ge307XG4gICAgY29uc3QgcmVuZGVyUGFyYW1zID0gWydtbWwnLCAnY29sb3InLCAnY2VudGVyYmFzZWxpbmUnLCAnem9vbScsICdkcGknLCAnZm9udFNpemUnLCAnZm9udEZhbWlseScsICdkZWZhdWx0U3RyZXRjaHknLCAnYmFja2dyb3VuZENvbG9yJywgJ2Zvcm1hdCddO1xuICAgIHJlbmRlclBhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhW3BhcmFtXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZGF0YU1kNVtwYXJhbV0gPSBkYXRhW3BhcmFtXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBEYXRhIHZhcmlhYmxlcyB0byBnZXQuXG4gICAgY29uc3QgZGF0YU9iamVjdCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBtYXRobWwgaW4gdGhpcyByZXF1ZXN0IHdlIHRyeSB0byBnZXQgY2FjaGVkLlxuICAgICAgLy8gT25seSBuZWVkIHRoZSBmb3JtdWxhIG1kNSBjYWxjdWxhdGVkIGJlZm9yZS5cbiAgICAgIGlmIChrZXkgIT09ICdtbWwnKSB7XG4gICAgICAgIGRhdGFPYmplY3Rba2V5XSA9IGRhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRhdGFPYmplY3QuZm9ybXVsYSA9IGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLm1kNWVuY29kZShVdGlsLnByb3BlcnRpZXNUb1N0cmluZyhkYXRhTWQ1KSk7XG4gICAgZGF0YU9iamVjdC5sYW5nID0gKHR5cGVvZiBsYW5ndWFnZSA9PT0gJ3VuZGVmaW5lZCcpID8gJ2VuJyA6IGxhbmd1YWdlO1xuICAgIGRhdGFPYmplY3QudmVyc2lvbiA9IENvbmZpZ3VyYXRpb24uZ2V0KCd2ZXJzaW9uJyk7XG5cbiAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgdG8gY2FsbCBzaG93aW1hZ2Ugc2VydmljZSB3aXRoIHRoZSBmb3JtdWxhIG1kNSBhcyBwYXJhbWV0ZXIuXG4gICAqICBUaGUgcmVzdWx0IGNvdWxkIGJlOlxuICAgKiAtIHsnc3RhdHVzJyA6IHdhcm5pbmcnfSA6IFRoZSBpbWFnZSBhc3NvY2lhdGVkIHRvIHRoZSBNYXRoTUwgbWQ1IGlzIG5vdCBpbiBjYWNoZS5cbiAgICogLSB7J3N0YXR1cycgOiAnb2snIC4uLn0gOiBUaGUgaW1hZ2UgYXNzb2NpYXRlZCB0byB0aGUgTWF0aE1MIG1kNSBpcyBpbiBjYWNoZS5cbiAgICogQHBhcmFtIHtPYmplY3RbXX0gZGF0YSAtIG9iamVjdCBjb250YWluaW5nIHNob3dpbWFnZSBzZXJ2aWNlIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIHN0cmluZyBjb250YWluaW5nIHRoZSBsYW5ndWFnZSBvZiB0aGUgZm9ybXVsYS5cbiAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBvYmplY3QgY29udGFpbmluZyBzaG93aW1hZ2UgcmVzcG9uc2UuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlU2hvd0ltYWdlU3JjKGRhdGEsIGxhbmd1YWdlKSB7XG4gICAgY29uc3QgZGF0YU9iamVjdCA9IHRoaXMuY3JlYXRlU2hvd0ltYWdlU3JjRGF0YShkYXRhLCBsYW5ndWFnZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gU2VydmljZVByb3ZpZGVyLmdldFNlcnZpY2UoJ3Nob3dpbWFnZScsIFV0aWwuaHR0cEJ1aWxkUXVlcnkoZGF0YU9iamVjdCksIHRydWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIGh0bWwgaW1nIHRhZ3MgaW5zaWRlIGEgaHRtbCBjb2RlIHRvIG1hdGhtbCwgYmFzZTY0IGltZyB0YWdzIChpLmUgd2l0aCBiYXNlNjQgb24gc3JjKVxuICAgKiBvciBzaG93aW1hZ2UgaW1nIHRhZ3MgKGkuZSB3aXRoIHNob3dpbWFnZS5waHAgb24gc3JjKVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNvZGUgLSBIVE1MIGNvZGVcbiAgICogQHBhcmFtICB7c3RyaW5nfSBtb2RlIC0gYmFzZTY0MnNob3dpbWFnZSBvciBpbWcybWF0aG1sIG9yIGltZzI2NCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IGh0bWwgLSBjb2RlIHRyYW5zZm9ybWVkLlxuICAgKi9cbiAgc3RhdGljIGNvZGVJbWdUcmFuc2Zvcm0oY29kZSwgbW9kZSkge1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgZW5kUG9zaXRpb24gPSAwO1xuICAgIGNvbnN0IHBhdHRlcm4gPSAvPGltZy9naTtcbiAgICBjb25zdCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5zb3VyY2UubGVuZ3RoO1xuXG4gICAgd2hpbGUgKHBhdHRlcm4udGVzdChjb2RlKSkge1xuICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IHBhdHRlcm4ubGFzdEluZGV4IC0gcGF0dGVybkxlbmd0aDtcbiAgICAgIG91dHB1dCArPSBjb2RlLnN1YnN0cmluZyhlbmRQb3NpdGlvbiwgc3RhcnRQb3NpdGlvbik7XG5cbiAgICAgIGxldCBpID0gc3RhcnRQb3NpdGlvbiArIDE7XG5cbiAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGggJiYgZW5kUG9zaXRpb24gPD0gc3RhcnRQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBjb2RlLmNoYXJBdChpKTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSAnXCInIHx8IGNoYXJhY3RlciA9PT0gJ1xcJycpIHtcbiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJOZXh0UG9zaXRpb24gPSBjb2RlLmluZGV4T2YoY2hhcmFjdGVyLCBpICsgMSk7XG5cbiAgICAgICAgICBpZiAoY2hhcmFjdGVyTmV4dFBvc2l0aW9uID09PSAtMSkge1xuICAgICAgICAgICAgaSA9IGNvZGUubGVuZ3RoOyAvLyBFbmQgd2hpbGUuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkgPSBjaGFyYWN0ZXJOZXh0UG9zaXRpb247XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gJz4nKSB7XG4gICAgICAgICAgZW5kUG9zaXRpb24gPSBpICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZFBvc2l0aW9uIDwgc3RhcnRQb3NpdGlvbikgeyAvLyBUaGUgaW1nIHRhZyBpcyBzdHJpcHBlZC5cbiAgICAgICAgb3V0cHV0ICs9IGNvZGUuc3Vic3RyaW5nKHN0YXJ0UG9zaXRpb24sIGNvZGUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH1cbiAgICAgIGxldCBpbWdDb2RlID0gY29kZS5zdWJzdHJpbmcoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pO1xuICAgICAgY29uc3QgaW1nT2JqZWN0ID0gVXRpbC5jcmVhdGVPYmplY3QoaW1nQ29kZSk7XG4gICAgICBsZXQgeG1sQ29kZSA9IGltZ09iamVjdC5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlTWF0aG1sQXR0cmlidXRlJykpO1xuICAgICAgbGV0IGNvbnZlcnRUb1htbDtcbiAgICAgIGxldCBjb252ZXJ0VG9TYWZlWG1sO1xuXG4gICAgICBpZiAobW9kZSA9PT0gJ2Jhc2U2NDJzaG93aW1hZ2UnKSB7XG4gICAgICAgIGlmICh4bWxDb2RlID09IG51bGwpIHtcbiAgICAgICAgICB4bWxDb2RlID0gaW1nT2JqZWN0LmdldEF0dHJpYnV0ZSgnYWx0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgeG1sQ29kZSA9IE1hdGhNTC5zYWZlWG1sRGVjb2RlKHhtbENvZGUpO1xuICAgICAgICBpbWdDb2RlID0gUGFyc2VyLm1hdGhtbFRvSW1nT2JqZWN0KGRvY3VtZW50LCB4bWxDb2RlLCBudWxsLCBudWxsKTtcbiAgICAgICAgb3V0cHV0ICs9IFV0aWwuY3JlYXRlT2JqZWN0Q29kZShpbWdDb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2ltZzJtYXRobWwnKSB7XG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSkge1xuICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSA9PT0gJ3NhZmVYbWwnKSB7XG4gICAgICAgICAgICBjb252ZXJ0VG9YbWwgPSB0cnVlO1xuICAgICAgICAgICAgY29udmVydFRvU2FmZVhtbCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSA9PT0gJ3htbCcpIHtcbiAgICAgICAgICAgIGNvbnZlcnRUb1htbCA9IHRydWU7XG4gICAgICAgICAgICBjb252ZXJ0VG9TYWZlWG1sID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG91dHB1dCArPSBVdGlsLmdldFdJUklTSW1hZ2VPdXRwdXQoaW1nQ29kZSwgY29udmVydFRvWG1sLCBjb252ZXJ0VG9TYWZlWG1sKTtcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2ltZzI2NCcpIHtcbiAgICAgICAgaWYgKHhtbENvZGUgPT09IG51bGwpIHtcbiAgICAgICAgICB4bWxDb2RlID0gaW1nT2JqZWN0LmdldEF0dHJpYnV0ZSgnYWx0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgeG1sQ29kZSA9IE1hdGhNTC5zYWZlWG1sRGVjb2RlKHhtbENvZGUpO1xuXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgcHJvcGVydGllcy5iYXNlNjQgPSAndHJ1ZSc7XG4gICAgICAgIGltZ0NvZGUgPSBQYXJzZXIubWF0aG1sVG9JbWdPYmplY3QoZG9jdW1lbnQsIHhtbENvZGUsIHByb3BlcnRpZXMsIG51bGwpO1xuICAgICAgICAvLyBNZXRyaWNzLlxuICAgICAgICBJbWFnZS5zZXRJbWdTaXplKGltZ0NvZGUsIGltZ0NvZGUuc3JjLCB0cnVlKTtcbiAgICAgICAgb3V0cHV0ICs9IFV0aWwuY3JlYXRlT2JqZWN0Q29kZShpbWdDb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3V0cHV0ICs9IGNvZGUuc3Vic3RyaW5nKGVuZFBvc2l0aW9uLCBjb2RlLmxlbmd0aCk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbGwgb2NjdXJyZW5jZXMgb2YgTWF0aE1MIHRvIHRoZSBjb3JyZXNwb25kaW5nIGltYWdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIHN0cmluZyB3aXRoIHZhbGlkIE1hdGhNTCBjb2RlLlxuICAgKiBUaGUgTWF0aE1MIGNvZGUgZG9lc24ndCBjb250YWluIHNlbWFudGljcy5cbiAgICogQHBhcmFtIHtDb25zdGFudHN9IGNoYXJhY3RlcnMgLSBDb25zdGFudCBvYmplY3QgY29udGFpbmluZyB4bWxDaGFyYWN0ZXJzXG4gICAqIG9yIHNhZmVYbWxDaGFyYWN0ZXJzIHJlbGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBhIHZhbGlkIGxhbmd1YWdlIGNvZGVcbiAgICogaW4gb3JkZXIgdG8gZ2VuZXJhdGUgZm9ybXVsYSBhY2Nlc3NpYmlsaXR5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIHdpdGggYWxsIHRoZSBNYXRoTUxcbiAgICogb2NjdXJyZW5jZXMgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgaW1hZ2UuXG4gICAqL1xuICBzdGF0aWMgcGFyc2VNYXRobWxUb0ltZyhjb250ZW50LCBjaGFyYWN0ZXJzLCBsYW5ndWFnZSkge1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBjb25zdCBtYXRoVGFnQmVnaW4gPSBgJHtjaGFyYWN0ZXJzLnRhZ09wZW5lcn1tYXRoYDtcbiAgICBjb25zdCBtYXRoVGFnRW5kID0gYCR7Y2hhcmFjdGVycy50YWdPcGVuZXJ9L21hdGgke2NoYXJhY3RlcnMudGFnQ2xvc2VyfWA7XG4gICAgbGV0IHN0YXJ0ID0gY29udGVudC5pbmRleE9mKG1hdGhUYWdCZWdpbik7XG4gICAgbGV0IGVuZCA9IDA7XG5cbiAgICB3aGlsZSAoc3RhcnQgIT09IC0xKSB7XG4gICAgICBvdXRwdXQgKz0gY29udGVudC5zdWJzdHJpbmcoZW5kLCBzdGFydCk7XG4gICAgICAvLyBBdm9pZCBXSVJJUyBpbWFnZXMgdG8gYmUgcGFyc2VkLlxuICAgICAgY29uc3QgaW1hZ2VNYXRobWxBdHJyaWJ1dGUgPSBjb250ZW50LmluZGV4T2YoQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlTWF0aG1sQXR0cmlidXRlJykpO1xuICAgICAgZW5kID0gY29udGVudC5pbmRleE9mKG1hdGhUYWdFbmQsIHN0YXJ0KTtcblxuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgZW5kID0gY29udGVudC5sZW5ndGggLSAxO1xuICAgICAgfSBlbHNlIGlmIChpbWFnZU1hdGhtbEF0cnJpYnV0ZSAhPT0gLTEpIHtcbiAgICAgICAgLy8gRmlyc3QgY2xvc2UgdGFnIG9mIGltZyBhdHRyaWJ1dGVcbiAgICAgICAgLy8gSWYgYSBtYXRobWxBdHRyaWJ1dGUgZXhpc3RzIHNob3VsZCBiZSBpbnNpZGUgYSBpbWcgdGFnLlxuICAgICAgICBlbmQgKz0gY29udGVudC5pbmRleE9mKCcvPicsIHN0YXJ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCArPSBtYXRoVGFnRW5kLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFNYXRoTUwuaXNNYXRobWxJbkF0dHJpYnV0ZShjb250ZW50LCBzdGFydCkgJiYgaW1hZ2VNYXRobWxBdHJyaWJ1dGUgPT09IC0xKSB7XG4gICAgICAgIGxldCBtYXRobWwgPSBjb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgbWF0aG1sID0gKGNoYXJhY3RlcnMuaWQgPT09IENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycy5pZClcbiAgICAgICAgICA/IE1hdGhNTC5zYWZlWG1sRGVjb2RlKG1hdGhtbClcbiAgICAgICAgICA6IE1hdGhNTC5tYXRoTUxFbnRpdGllcyhtYXRobWwpO1xuICAgICAgICBvdXRwdXQgKz0gVXRpbC5jcmVhdGVPYmplY3RDb2RlKFBhcnNlci5tYXRobWxUb0ltZ09iamVjdChkb2N1bWVudCwgbWF0aG1sLCBudWxsLCBsYW5ndWFnZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ICs9IGNvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuXG4gICAgICBzdGFydCA9IGNvbnRlbnQuaW5kZXhPZihtYXRoVGFnQmVnaW4sIGVuZCk7XG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGNvbnRlbnQuc3Vic3RyaW5nKGVuZCwgY29udGVudC5sZW5ndGgpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn1cblxuLy8gTXV0YXRpb24gb2JzZXJ2ZXJzIHRvIGF2b2lkIHdpcmlzIGltYWdlIGZvcm11bGFzIGNsYXNzIGJlIHJlbW92ZWQuXG5pZiAodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XG4gICAgICBpZiAobXV0YXRpb24ub2xkVmFsdWUgPT09IENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZUNsYXNzTmFtZScpXG4gICAgICAgICYmIG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdjbGFzcydcbiAgICAgICAgJiYgbXV0YXRpb24udGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZUNsYXNzTmFtZScpKSA9PT0gLTEpIHtcbiAgICAgICAgbXV0YXRpb24udGFyZ2V0LmNsYXNzTmFtZSA9IENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZUNsYXNzTmFtZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBQYXJzZXIub2JzZXJ2ZXIgPSBPYmplY3QuY3JlYXRlKG11dGF0aW9uT2JzZXJ2ZXIpO1xuICBQYXJzZXIub2JzZXJ2ZXIuQ29uZmlnID0geyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVPbGRWYWx1ZTogdHJ1ZSB9O1xuICAvLyBXZSB1c2Ugb3duIGRlZmF1bHQgY29uZmlnLlxuICBQYXJzZXIub2JzZXJ2ZXIub2JzZXJ2ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykub2JzZXJ2ZSh0YXJnZXQsIHRoaXMuQ29uZmlnKTtcbiAgfTtcbn1cbiIsImltcG9ydCBVdGlsIGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgTGlzdGVuZXJzIGZyb20gJy4vbGlzdGVuZXJzJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4vY29uZmlndXJhdGlvbic7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2VydmljZVByb3ZpZGVyUHJvcGVydGllc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IFVSSSAtIFNlcnZpY2UgVVJJLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHNlcnZlciAtIFNlcnZpY2Ugc2VydmVyIGxhbmd1YWdlLlxuICovXG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc2VydmljZVByb3ZpZGVyLiBBIHNlcnZpY2VQcm92aWRlciBpcyBhIGNsYXNzIGNvbnRhaW5pbmdcbiAqIGFuIGFyYml0cmFyeSBudW1iZXIgb2Ygc2VydmljZXMgd2l0aCB0aGUgY29ycmVzcG9uZGVudCBwYXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJ2aWNlUHJvdmlkZXIge1xuICAvKipcbiAgICogUmV0dXJucyBTZXJ2aWNlIFByb3ZpZGVyIGxpc3RlbmVycy5cbiAgICogQHR5cGUge0xpc3RlbmVyc31cbiAgICovXG4gIHN0YXRpYyBnZXQgbGlzdGVuZXJzKCkge1xuICAgIHJldHVybiBTZXJ2aWNlUHJvdmlkZXIuX2xpc3RlbmVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIExpc3RlbmVyfSBpbnN0YW5jZSB0byB7QGxpbmsgU2VydmljZVByb3ZpZGVyfSBjbGFzcy5cbiAgICogQHBhcmFtIHtMaXN0ZW5lcn0gbGlzdGVuZXIgLSBJbnN0YW5jZSBvZiB7QGxpbmsgTGlzdGVuZXJ9LlxuICAgKi9cbiAgc3RhdGljIGFkZExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgU2VydmljZVByb3ZpZGVyLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGV2ZW50cyBpbiBTZXJ2aWNlIFByb3ZpZGVyLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIC0gRXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBFdmVudCBvYmplY3QuXG4gICAqL1xuICBzdGF0aWMgZmlyZUV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpIHtcbiAgICBTZXJ2aWNlUHJvdmlkZXIubGlzdGVuZXJzLmZpcmUoZXZlbnROYW1lLCBldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2VydmljZSBwYXJhbWV0ZXJzLlxuICAgKiBAdHlwZSB7U2VydmljZVByb3ZpZGVyUHJvcGVydGllc31cbiAgICpcbiAgICovXG4gIHN0YXRpYyBnZXQgcGFyYW1ldGVycygpIHtcbiAgICByZXR1cm4gU2VydmljZVByb3ZpZGVyLl9wYXJhbWV0ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcnZpY2UgcGFyYW1ldGVycy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1NlcnZpY2VQcm92aWRlclByb3BlcnRpZXN9XG4gICAqL1xuICBzdGF0aWMgc2V0IHBhcmFtZXRlcnMocGFyYW1ldGVycykge1xuICAgIFNlcnZpY2VQcm92aWRlci5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIHByb3BlcnR5LlxuICAgKiBSZXR1cm4gc2VydmljZSBwcm92aWRlciBwYXRocy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgc2VydmljZVBhdGhzKCkge1xuICAgIHJldHVybiBTZXJ2aWNlUHJvdmlkZXIuX3NlcnZpY2VQYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgcHJvcGVydHkgc2V0dGVyLlxuICAgKiBTZXQgc2VydmljZSBwYXRocy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC0gVGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzdGF0aWMgc2V0IHNlcnZpY2VQYXRocyh2YWx1ZSkge1xuICAgIFNlcnZpY2VQcm92aWRlci5fc2VydmljZVBhdGhzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBzZXJ2aWNlIHRvIHRoZSBTZXJ2aWNlUHJvdmlkZXIuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlIC0gU2VydmljZSBuYW1lLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCAtIFNlcnZpY2UgcGF0aC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHNldFNlcnZpY2VQYXRoKHNlcnZpY2UsIHBhdGgpIHtcbiAgICBTZXJ2aWNlUHJvdmlkZXIuc2VydmljZVBhdGhzW3NlcnZpY2VdID0gcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIHBhdGggZm9yIGEgY2VydGFpbiBzZXJ2aWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VydmljZU5hbWUgLSBTZXJ2aWNlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBzZXJ2aWNlIHBhdGguXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXRTZXJ2aWNlUGF0aChzZXJ2aWNlTmFtZSkge1xuICAgIHJldHVybiBTZXJ2aWNlUHJvdmlkZXIuc2VydmljZVBhdGhzW3NlcnZpY2VOYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgcHJvcGVydHkuXG4gICAqIFNlcnZpY2UgcHJvdmlkZXIgaW50ZWdyYXRpb24gcGF0aC5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgaW50ZWdyYXRpb25QYXRoKCkge1xuICAgIHJldHVybiBTZXJ2aWNlUHJvdmlkZXIuX2ludGVncmF0aW9uUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgcHJvcGVydHkgc2V0dGVyLlxuICAgKiBTZXQgc2VydmljZSBwcm92aWRlciBpbnRlZ3JhdGlvbiBwYXRoLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgLSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHN0YXRpYyBzZXQgaW50ZWdyYXRpb25QYXRoKHZhbHVlKSB7XG4gICAgU2VydmljZVByb3ZpZGVyLl9pbnRlZ3JhdGlvblBhdGggPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgVVJMIGluIHRoZSBmb3JtIHByb3RvY29sOi8vc2VydmVyTmFtZTpzZXJ2ZXJQb3J0LlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBjbGllbnQgc2lkZSBzZXJ2ZXIgcGF0aC5cbiAgICovXG4gIHN0YXRpYyBnZXRTZXJ2ZXJVUkwoKSB7XG4gICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgY29uc3QgYXJyID0gdXJsLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYCR7YXJyWzBdfS8vJHthcnJbMl19YDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRzIHtAbGluayB0aGlzfSBjbGFzcy4gVXNlcyB7QGxpbmsgdGhpcy5pbnRlZ3JhdGlvblBhdGh9IGFzXG4gICAqIGJhc2UgcGF0aCB0byBnZW5lcmF0ZSBhbGwgYmFja2VuZCBzZXJ2aWNlcyBwYXRocy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtZXRlcnMgLSBGdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1ldGVycy5pbnRlZ3JhdGlvblBhdGggLSBTZXJ2aWNlIHBhdGguXG4gICAqL1xuICBzdGF0aWMgaW5pdChwYXJhbWV0ZXJzKSB7XG4gICAgU2VydmljZVByb3ZpZGVyLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgIC8vIFNlcnZpY2VzIHBhdGggKHRlY2ggZGVwZW5kYW50KS5cbiAgICBsZXQgY29uZmlndXJhdGlvblVSSSA9IFNlcnZpY2VQcm92aWRlci5jcmVhdGVTZXJ2aWNlVVJJKCdjb25maWd1cmF0aW9uanMnKTtcbiAgICBsZXQgY3JlYXRlSW1hZ2VVUkkgPSBTZXJ2aWNlUHJvdmlkZXIuY3JlYXRlU2VydmljZVVSSSgnY3JlYXRlaW1hZ2UnKTtcbiAgICBsZXQgc2hvd0ltYWdlVVJJID0gU2VydmljZVByb3ZpZGVyLmNyZWF0ZVNlcnZpY2VVUkkoJ3Nob3dpbWFnZScpO1xuICAgIGxldCBnZXRNYXRoTUxVUkkgPSBTZXJ2aWNlUHJvdmlkZXIuY3JlYXRlU2VydmljZVVSSSgnZ2V0bWF0aG1sJyk7XG4gICAgbGV0IHNlcnZpY2VVUkkgPSBTZXJ2aWNlUHJvdmlkZXIuY3JlYXRlU2VydmljZVVSSSgnc2VydmljZScpO1xuXG4gICAgLy8gU29tZSBiYWNrZW5kIGludGVncmF0aW9ucyAobGlrZSBKYXZhIG8gUnVieSkgaGF2ZSBhbiBhYnNvbHV0ZSBiYWNrZW5kIHBhdGgsXG4gICAgLy8gZm9yIGV4YW1wbGU6IC9hcHAvc2VydmljZS4gRm9yIHRoZW0gd2UgY2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSBVUkwgcGF0aCwgaS5lXG4gICAgLy8gcHJvdG9jb2w6Ly9kb21haW46cG9ydC9hcHAvc2VydmljZVxuICAgIGlmIChTZXJ2aWNlUHJvdmlkZXIucGFyYW1ldGVycy5VUkkuaW5kZXhPZignLycpID09PSAwKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJQYXRoID0gU2VydmljZVByb3ZpZGVyLmdldFNlcnZlclVSTCgpO1xuICAgICAgY29uZmlndXJhdGlvblVSSSA9IHNlcnZlclBhdGggKyBjb25maWd1cmF0aW9uVVJJO1xuICAgICAgc2hvd0ltYWdlVVJJID0gc2VydmVyUGF0aCArIHNob3dJbWFnZVVSSTtcbiAgICAgIGNyZWF0ZUltYWdlVVJJID0gc2VydmVyUGF0aCArIGNyZWF0ZUltYWdlVVJJO1xuICAgICAgZ2V0TWF0aE1MVVJJID0gc2VydmVyUGF0aCArIGdldE1hdGhNTFVSSTtcbiAgICAgIHNlcnZpY2VVUkkgPSBzZXJ2ZXJQYXRoICsgc2VydmljZVVSSTtcbiAgICB9XG5cbiAgICBTZXJ2aWNlUHJvdmlkZXIuc2V0U2VydmljZVBhdGgoJ2NvbmZpZ3VyYXRpb25qcycsIGNvbmZpZ3VyYXRpb25VUkkpO1xuICAgIFNlcnZpY2VQcm92aWRlci5zZXRTZXJ2aWNlUGF0aCgnc2hvd2ltYWdlJywgc2hvd0ltYWdlVVJJKTtcbiAgICBTZXJ2aWNlUHJvdmlkZXIuc2V0U2VydmljZVBhdGgoJ2NyZWF0ZWltYWdlJywgY3JlYXRlSW1hZ2VVUkkpO1xuICAgIFNlcnZpY2VQcm92aWRlci5zZXRTZXJ2aWNlUGF0aCgnc2VydmljZScsIHNlcnZpY2VVUkkpO1xuICAgIFNlcnZpY2VQcm92aWRlci5zZXRTZXJ2aWNlUGF0aCgnZ2V0bWF0aG1sJywgZ2V0TWF0aE1MVVJJKTtcbiAgICBTZXJ2aWNlUHJvdmlkZXIuc2V0U2VydmljZVBhdGgoJ2NvbmZpZ3VyYXRpb25qcycsIGNvbmZpZ3VyYXRpb25VUkkpO1xuXG4gICAgU2VydmljZVByb3ZpZGVyLmxpc3RlbmVycy5maXJlKCdvbkluaXQnLCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29udGVudCBmcm9tIGFuIFVSTC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFRhcmdldCBVUkwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcG9zdFZhcmlhYmxlc10gLSBPYmplY3QgY29udGFpbmluZyBwb3N0IHZhcmlhYmxlcy5cbiAgICogbnVsbCBpZiBhIEdFVCBxdWVyeSBzaG91bGQgYmUgZG9uZS5cbiAgICogQHJldHVybnMge1N0cmluZ30gQ29udGVudCBvZiB0aGUgdGFyZ2V0IFVSTC5cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldFVybCh1cmwsIHBvc3RWYXJpYWJsZXMpIHtcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpLnN1YnN0cigwLCB3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKS5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gICAgY29uc3QgaHR0cFJlcXVlc3QgPSBVdGlsLmNyZWF0ZUh0dHBSZXF1ZXN0KCk7XG5cbiAgICBpZiAoaHR0cFJlcXVlc3QpIHtcbiAgICAgIGlmICh0eXBlb2YgcG9zdFZhcmlhYmxlcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHBvc3RWYXJpYWJsZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmICh1cmwuc3Vic3RyKDAsIDEpID09PSAnLycgfHwgdXJsLnN1YnN0cigwLCA3KSA9PT0gJ2h0dHA6Ly8nIHx8IHVybC5zdWJzdHIoMCwgOCkgPT09ICdodHRwczovLycpIHtcbiAgICAgICAgaHR0cFJlcXVlc3Qub3BlbignUE9TVCcsIHVybCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHR0cFJlcXVlc3Qub3BlbignUE9TVCcsIGN1cnJlbnRQYXRoICsgdXJsLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBoZWFkZXIgPSBDb25maWd1cmF0aW9uLmdldCgnY3VzdG9tSGVhZGVycycpO1xuICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICBoZWFkZXIgPSBoZWFkZXIudG9TdHJpbmcoKVxuICAgICAgICBoZWFkZXIuc3BsaXQoXCIsXCIpXG4gICAgICAgICAgLm1hcChlbGVtZW50ID0+IGVsZW1lbnQudHJpbSgpLnNwbGl0KCc9JykpXG4gICAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IGh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBwb3N0VmFyaWFibGVzICE9PSAndW5kZWZpbmVkJyAmJiBwb3N0VmFyaWFibGVzKSB7XG4gICAgICAgIGh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZChVdGlsLmh0dHBCdWlsZFF1ZXJ5KHBvc3RWYXJpYWJsZXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0dHBSZXF1ZXN0LnNlbmQobnVsbCk7XG4gICAgICB9XG4gICBcbiAgICAgIHJldHVybiBodHRwUmVxdWVzdC5yZXNwb25zZVRleHQ7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNwb25zZSB0ZXh0IG9mIGEgY2VydGFpbiBzZXJ2aWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VydmljZSAtIFNlcnZpY2UgbmFtZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBvc3RWYXJpYWJsZXMgLSBQb3N0IHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtCb29sZWFufSBnZXQgLSBUcnVlIGlmIHRoZSByZXF1ZXN0IGlzIEdFVCBpbnN0ZWFkIG9mIFBPU1QuIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHJldHVybnMge1N0cmluZ30gU2VydmljZSByZXNwb25zZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIGdldFNlcnZpY2Uoc2VydmljZSwgcG9zdFZhcmlhYmxlcywgZ2V0KSB7XG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIGlmIChnZXQgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGdldFZhcmlhYmxlcyA9IHBvc3RWYXJpYWJsZXMgPyBgPyR7cG9zdFZhcmlhYmxlc31gIDogJyc7XG4gICAgICBjb25zdCBzZXJ2aWNlVXJsID0gYCR7U2VydmljZVByb3ZpZGVyLmdldFNlcnZpY2VQYXRoKHNlcnZpY2UpfSR7Z2V0VmFyaWFibGVzfWA7XG4gICAgICByZXNwb25zZSA9IFNlcnZpY2VQcm92aWRlci5nZXRVcmwoc2VydmljZVVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlcnZpY2VVcmwgPSBTZXJ2aWNlUHJvdmlkZXIuZ2V0U2VydmljZVBhdGgoc2VydmljZSk7XG4gICAgICByZXNwb25zZSA9IFNlcnZpY2VQcm92aWRlci5nZXRVcmwoc2VydmljZVVybCwgcG9zdFZhcmlhYmxlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgbGFuZ3VhZ2Ugb2YgYSBjZXJ0YWluIHNlcnZpY2UuIFRoZSBwb3NzaWJsZSB2YWx1ZXNcbiAgICogYXJlOiBwaHAsIGFzcHgsIGphdmEgYW5kIHJ1YnkuXG4gICAqIFRoaXMgbWV0aG9kIGhhcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VydmljZSAtIFRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IC0gVGhlIHNlcnZlciB0ZWNobm9sb2d5IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBzZXJ2aWNlLlxuICAgKi9cbiAgc3RhdGljIGdldFNlcnZlckxhbmd1YWdlRnJvbVNlcnZpY2Uoc2VydmljZSkge1xuICAgIGlmIChzZXJ2aWNlLmluZGV4T2YoJy5waHAnKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiAncGhwJztcbiAgICB9XG4gICAgaWYgKHNlcnZpY2UuaW5kZXhPZignLmFzcHgnKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiAnYXNweCc7XG4gICAgfVxuICAgIGlmIChzZXJ2aWNlLmluZGV4T2YoJ3dpcmlzcGx1Z2luZW5naW5lJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJ3J1YnknO1xuICAgIH1cbiAgICByZXR1cm4gJ2phdmEnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFVSSSBhc3NvY2lhdGVkIHdpdGggYSBjZXJ0YWluIHNlcnZpY2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlIC0gVGhlIHNlcnZpY2UgbmFtZS5cbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgc2VydmljZSBwYXRoLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVNlcnZpY2VVUkkoc2VydmljZSkge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IFNlcnZpY2VQcm92aWRlci5zZXJ2ZXJFeHRlbnNpb24oKTtcbiAgICByZXR1cm4gVXRpbC5jb25jYXRlbmF0ZVVybChTZXJ2aWNlUHJvdmlkZXIucGFyYW1ldGVycy5VUkksIHNlcnZpY2UpICsgZXh0ZW5zaW9uO1xuICB9XG5cbiAgc3RhdGljIHNlcnZlckV4dGVuc2lvbigpIHtcbiAgICBpZiAoU2VydmljZVByb3ZpZGVyLnBhcmFtZXRlcnMuc2VydmVyLmluZGV4T2YoJ3BocCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICcucGhwJztcbiAgICB9XG4gICAgaWYgKFNlcnZpY2VQcm92aWRlci5wYXJhbWV0ZXJzLnNlcnZlci5pbmRleE9mKCdhc3B4JykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJy5hc3B4JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8qKlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHNlcnZpY2UgLSBUaGUgc2VydmljZSBuYW1lLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggLSBUaGUgc2VydmljZSBwYXRoLlxuICogQHN0YXRpY1xuICovXG5TZXJ2aWNlUHJvdmlkZXIuX3NlcnZpY2VQYXRocyA9IHt9O1xuXG4vKipcbiAqIFRoZSBpbnRlZ3JhdGlvbiBwYXRoLiBDb250YWlucyB0aGUgcGF0aCBvZiB0aGUgY29uZmlndXJhdGlvbiBzZXJ2aWNlLlxuICogVXNlZCB0byBkZWZpbmUgdGhlIHBhdGggZm9yIGFsbCBzZXJ2aWNlcy5cbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5TZXJ2aWNlUHJvdmlkZXIuX2ludGVncmF0aW9uUGF0aCA9ICcnO1xuXG4vKipcbiAqIFNlcnZpY2VQcm92aWRlciBzdGF0aWMgbGlzdGVuZXJzLlxuICogQHR5cGUge0xpc3RlbmVyc31cbiAqIEBwcml2YXRlXG4gKi9cblNlcnZpY2VQcm92aWRlci5fbGlzdGVuZXJzID0gbmV3IExpc3RlbmVycygpO1xuXG4vKipcbiAqIFNlcnZpY2UgcHJvdmlkZXIgcGFyYW1ldGVycy5cbiAqIEB0eXBlIHtTZXJ2aWNlUHJvdmlkZXJQYXJhbWV0ZXJzfVxuICovXG5TZXJ2aWNlUHJvdmlkZXIuX3BhcmFtZXRlcnMgPSB7fTtcbiIsImltcG9ydCB0cmFuc2xhdGlvbnMgZnJvbSAnLi4vbGFuZy9zdHJpbmdzLmpzb24nO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzdHJpbmcgbWFuYWdlci4gSXQncyB1c2VkIHRvIGxvYWQgbG9jYWxpemVkIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0cmluZ01hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YXRpYyBjbGFzcyBTdHJpbmdNYW5hZ2VyIGNhbiBub3QgYmUgaW5zdGFudGlhdGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQgdmFsdWUgb2YgY2VydGFpbiBzdHJpbmcga2V5LiBJZiB0aGUgYXNzb2NpYXRlZCB2YWx1ZVxuICAgKiBkb2Vzbid0IGV4aXRzIHJldHVybnMgdGhlIG9yaWdpbmFsIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIHN0cmluZyBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgLSBERUZBVUxUID0gbnVsbC4gU3BlY2lmeSB0aGUgbGFuZ3VhZ2UgdG8gdHJhbnNsYXRlIHRoZSBzdHJpbmdcbiAgICogQHJldHVybnMge3N0cmluZ30gY29ycmVzcG9uZGVudCB2YWx1ZS4gSWYgZG9lc24ndCBleGlzdHMgb3JpZ2luYWwga2V5LlxuICAgKi9cbiAgc3RhdGljIGdldChrZXksIGxhbmcpIHtcblxuICAgIC8vIERlZmF1bHQgbGFuZ3VhZ2UgZGVmaW5pdGlvblxuICAgIGxldCB7bGFuZ3VhZ2V9ID0gdGhpcztcblxuICAgIC8vIElmIHBhcmFtZXRlciBsYW5ndWFnZSwgdXNlIGl0XG4gICAgaWYgKGxhbmcpIHtcbiAgICAgIGxhbmd1YWdlID0gbGFuZztcbiAgICB9XG5cbiAgICAvLyBDdXQgZG93biBvbiBzdHJpbmdzLiBlLmcuIGVuX1VTIC0+IGVuXG4gICAgaWYgKGxhbmd1YWdlICYmIGxhbmd1YWdlLmxlbmd0aCA+IDIpIHtcbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2Uuc2xpY2UoMCwgMik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgd2Ugc3VwcG9ydCB0aGUgbGFuZ3VhZ2VcbiAgICBpZiAoIXRoaXMuc3RyaW5ncy5oYXNPd25Qcm9wZXJ0eShsYW5ndWFnZSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBsYW5ndWFnZSAke2xhbmd1YWdlfSBzZXQgaW4gU3RyaW5nTWFuYWdlci5gKTtcbiAgICAgIGxhbmd1YWdlID0gJ2VuJztcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIHN1cHBvcnRlZCBpbiB0aGUgZ2l2ZW4gbGFuZ3VhZ2VcbiAgICBpZiAoIXRoaXMuc3RyaW5nc1tsYW5ndWFnZV0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgY29uc29sZS53YXJuKGBVbmtub3duIGtleSAke2tleX0gZm9yIGxhbmd1YWdlICR7bGFuZ3VhZ2V9IGluIFN0cmluZ01hbmFnZXIuYCk7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmluZ3NbbGFuZ3VhZ2VdW2tleV07XG4gIH1cbn1cblxuLyoqXG4gKiBEaWN0aW9uYXJ5IG9mIGRpY3Rpb25hcmllczpcbiAqIEtleTogbGFuZ3VhZ2UgY29kZVxuICogVmFsdWU6IEtleTogaWQgb2YgdGhlIHN0cmluZ1xuICogICAgICAgIFZhbHVlOiB0cmFuc2xhdGlvbiBvZiB0aGUgc3RyaW5nXG4gKi9cblN0cmluZ01hbmFnZXIuc3RyaW5ncyA9IHRyYW5zbGF0aW9ucztcblxuLyoqXG4gKiBMYW5ndWFnZSBvZiB0aGUgdHJhbnNsYXRpb25zOyBFbmdsaXNoIGJ5IGRlZmF1bHRcbiAqL1xuU3RyaW5nTWFuYWdlci5sYW5ndWFnZSA9ICdlbic7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0Q2FjaGUge1xuICAvKipcbiAgICogQGNsYXNzZGVzY1xuICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudCBhIGNsaWVudC1zaWRlIHRleHQgY2FjaGUgY2xhc3MuIENvbnRhaW5zIHBhaXJzIG9mXG4gICAqIHN0cmluZ3MgKGtleS92YWx1ZSkgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCBpbiBhbnkgbW9tZW50LiBVc3VhbGx5IHVzZWRcbiAgICogdG8gc3RvcmUgQUpBWCByZXNwb25zZXMgZm9yIHRleHQgc2VydmljZXMgbGlrZSBtYXRobWwybGF0ZXhcbiAgICogKGMuZiB7QGxpbmsgTGF0ZXh9IGNsYXNzKSBvciBtYXRobWwyYWNjZXNzaWJsZSAoYy5mIHtAbGluayBBY2Nlc3NpYmlsaXR5fSBjbGFzcykuXG4gICAqIEBjb25zdHJ1Y3RzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBDYWNoZSBhcnJheSBwcm9wZXJ0eSBzdG9yaW5nIHRoZSBjYWNoZSBlbnRyaWVzLlxuICAgICAqIEB0eXBlIHtBcnJheS48U3RyaW5nPn1cbiAgICAgKi9cbiAgICB0aGlzLmNhY2hlID0gW107XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgcG9wdWxhdGVzIGEga2V5L3ZhbHVlIHBhaXIgaW50byB0aGUge0BsaW5rIHRoaXMuY2FjaGV9IHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC0gQ2FjaGUga2V5LCB1c3VhbGx5IHRoZSBzZXJ2aWNlIHN0cmluZyBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIENhY2hlIHZhbHVlLCB1c3VhbGx5IHRoZSBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKi9cbiAgcG9wdWxhdGUoa2V5LCB2YWx1ZSkge1xuICAgIHRoaXMuY2FjaGVba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhY2hlIHZhbHVlIGFzc29jaWF0ZWQgdG8gY2VydGFpbiBjYWNoZSBrZXkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLSBDYWNoZSBrZXksIHVzdWFsbHkgdGhlIHNlcnZpY2Ugc3RyaW5nIHBhcmFtZXRlci5cbiAgICogQHJldHVybiB7U3RyaW5nfSB2YWx1ZSAtIENhY2hlIHZhbHVlLCBpZiBleGlzdHMuIEZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGdldChrZXkpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY2FjaGUsIGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuaW1wb3J0IE1hdGhNTCBmcm9tICcuL21hdGhtbCc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IExhdGV4IGZyb20gJy4vbGF0ZXgnO1xuaW1wb3J0IFN0cmluZ01hbmFnZXIgZnJvbSAnLi9zdHJpbmdtYW5hZ2VyJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gdXRpbGl0eSBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbCB7XG4gIC8qKlxuICAgKiBGaXJlcyBhbiBldmVudCBpbiBhIHRhcmdldC5cbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgLSB0YXJnZXQgd2hlcmUgZXZlbnQgc2hvdWxkIGJlIGZpcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIGV2ZW50IHRvIGZpcmUuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBmaXJlRXZlbnQoZXZlbnRUYXJnZXQsIGV2ZW50TmFtZSkge1xuICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgY29uc3QgZXZlbnRPYmplY3QgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO1xuICAgICAgZXZlbnRPYmplY3QuaW5pdEV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICByZXR1cm4gIWV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnRPYmplY3QpO1xuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50T2JqZWN0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtcbiAgICByZXR1cm4gZXZlbnRUYXJnZXQuZmlyZUV2ZW50KGBvbiR7ZXZlbnROYW1lfWAsIGV2ZW50T2JqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcm9zcy1icm93c2VyIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IC0gdGFyZ2V0IHRvIGFkZCB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgZXZlbnQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxCYWNrRnVuY3Rpb24gLSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGFkZEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudE5hbWUsIGNhbGxCYWNrRnVuY3Rpb24pIHtcbiAgICBpZiAoZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxCYWNrRnVuY3Rpb24sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUYXJnZXQuYXR0YWNoRXZlbnQpIHtcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgZXZlbnRUYXJnZXQuYXR0YWNoRXZlbnQoYG9uJHtldmVudE5hbWV9YCwgY2FsbEJhY2tGdW5jdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyb3NzLWJyb3dzZXIgcmVtb3ZlRXZlbnRMaXN0ZW5lci9kZXRhY2hFdmVudCBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgLSB0YXJnZXQgdG8gYWRkIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIHNwZWNpZmllcyB0aGUgdHlwZSBvZiBldmVudC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbEJhY2tGdW5jdGlvbiAtIGZ1bmN0aW9uIHRvIHJlbW92ZSBmcm9tIHRoZSBldmVudCB0YXJnZXQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyByZW1vdmVFdmVudChldmVudFRhcmdldCwgZXZlbnROYW1lLCBjYWxsQmFja0Z1bmN0aW9uKSB7XG4gICAgaWYgKGV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIGV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsQmFja0Z1bmN0aW9uLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VGFyZ2V0LmRldGFjaEV2ZW50KSB7XG4gICAgICBldmVudFRhcmdldC5kZXRhY2hFdmVudChgb24ke2V2ZW50TmFtZX1gLCBjYWxsQmFja0Z1bmN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgYSBjYWxsYmFjayBmdW5jdGlvbiwgZm9yIGEgY2VydGFpbiBldmVudCB0YXJnZXQsIHRvIHRoZSBmb2xsb3dpbmcgZXZlbnQgdHlwZXM6XG4gICAqIC0gZGJsY2xpY2tcbiAgICogLSBtb3VzZWRvd25cbiAgICogLSBtb3VzZXVwXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IC0gZXZlbnQgdGFyZ2V0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb3VibGVDbGlja0hhbmRsZXIgLSBmdW5jdGlvbiB0byBydW4gd2hlbiBvbiBkYmxjbGljayBldmVudC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW91c2Vkb3duSGFuZGxlciAtIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIG9uIG1vdXNlZG93biBldmVudC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW91c2V1cEhhbmRsZXIgLSBmdW5jdGlvbiB0byBydW4gd2hlbiBvbiBtb3VzZXVwIGV2ZW50LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgYWRkRWxlbWVudEV2ZW50cyhldmVudFRhcmdldCwgZG91YmxlQ2xpY2tIYW5kbGVyLCBtb3VzZWRvd25IYW5kbGVyLCBtb3VzZXVwSGFuZGxlcikge1xuICAgIGlmIChkb3VibGVDbGlja0hhbmRsZXIpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tEYmxjbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCByZWFsRXZlbnQgPSAoZXZlbnQpIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlYWxFdmVudC5zcmNFbGVtZW50ID8gcmVhbEV2ZW50LnNyY0VsZW1lbnQgOiByZWFsRXZlbnQudGFyZ2V0O1xuICAgICAgICBkb3VibGVDbGlja0hhbmRsZXIoZWxlbWVudCwgcmVhbEV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIFV0aWwuYWRkRXZlbnQoZXZlbnRUYXJnZXQsICdkYmxjbGljaycsIHRoaXMuY2FsbGJhY2tEYmxjbGljayk7XG4gICAgfVxuXG4gICAgaWYgKG1vdXNlZG93bkhhbmRsZXIpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tNb3VzZWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVhbEV2ZW50ID0gKGV2ZW50KSB8fCB3aW5kb3cuZXZlbnQ7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZWFsRXZlbnQuc3JjRWxlbWVudCA/IHJlYWxFdmVudC5zcmNFbGVtZW50IDogcmVhbEV2ZW50LnRhcmdldDtcbiAgICAgICAgbW91c2Vkb3duSGFuZGxlcihlbGVtZW50LCByZWFsRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgVXRpbC5hZGRFdmVudChldmVudFRhcmdldCwgJ21vdXNlZG93bicsIHRoaXMuY2FsbGJhY2tNb3VzZWRvd24pO1xuICAgIH1cblxuICAgIGlmIChtb3VzZXVwSGFuZGxlcikge1xuICAgICAgdGhpcy5jYWxsYmFja01vdXNldXAgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVhbEV2ZW50ID0gKGV2ZW50KSB8fCB3aW5kb3cuZXZlbnQ7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZWFsRXZlbnQuc3JjRWxlbWVudCA/IHJlYWxFdmVudC5zcmNFbGVtZW50IDogcmVhbEV2ZW50LnRhcmdldDtcbiAgICAgICAgbW91c2V1cEhhbmRsZXIoZWxlbWVudCwgcmVhbEV2ZW50KTtcbiAgICAgIH07XG4gICAgICAvLyBDaHJvbWUgZG9lc24ndCB0cmlnZ2VyIHRoaXMgZXZlbnQgZm9yIGV2ZW50VGFyZ2V0IGlmIHdlIHJlbGVhc2UgdGhlIG1vdXNlIGJ1dHRvblxuICAgICAgLy8gd2hpbGUgdGhlIG1vdXNlIGlzIG91dHNpZGUgdGhlIGVkaXRvciB0ZXh0IGZpZWxkLlxuICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQ6IHdlIHRyaWdnZXIgdGhlIGV2ZW50IGluZGVwZW5kZW50bHkgb2Ygd2hlcmUgdGhlIG1vdXNlXG4gICAgICAvLyBpcyB3aGVuIHdlIHJlbGVhc2UgaXRzIGJ1dHRvbi5cbiAgICAgIFV0aWwuYWRkRXZlbnQoZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5jYWxsYmFja01vdXNldXApO1xuICAgICAgVXRpbC5hZGRFdmVudChldmVudFRhcmdldCwgJ21vdXNldXAnLCB0aGlzLmNhbGxiYWNrTW91c2V1cCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgY2FsbGJhY2sgZnVuY3Rpb24sIGZvciBhIGNlcnRhaW4gZXZlbnQgdGFyZ2V0LCB0byB0aGUgZm9sbG93aW5nIGV2ZW50IHR5cGVzOlxuICAgKiAtIGRibGNsaWNrXG4gICAqIC0gbW91c2Vkb3duXG4gICAqIC0gbW91c2V1cFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCAtIGV2ZW50IHRhcmdldC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlbW92ZUVsZW1lbnRFdmVudHMoZXZlbnRUYXJnZXQpIHtcbiAgICBVdGlsLnJlbW92ZUV2ZW50KGV2ZW50VGFyZ2V0LCAnZGJsY2xpY2snLCB0aGlzLmNhbGxiYWNrRGJsY2xpY2spO1xuICAgIFV0aWwucmVtb3ZlRXZlbnQoZXZlbnRUYXJnZXQsICdtb3VzZWRvd24nLCB0aGlzLmNhbGxiYWNrTW91c2Vkb3duKTtcbiAgICBVdGlsLnJlbW92ZUV2ZW50KGRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuY2FsbGJhY2tNb3VzZXVwKTtcbiAgICBVdGlsLnJlbW92ZUV2ZW50KGV2ZW50VGFyZ2V0LCAnbW91c2V1cCcsIHRoaXMuY2FsbGJhY2tNb3VzZXVwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2xhc3MgbmFtZSB0byBhIEhUTUxFbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gdGhlIEhUTUwgZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIHRoZSBjbGFzcyBuYW1lLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKCFVdGlsLmNvbnRhaW5zQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSkge1xuICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gYCAke2NsYXNzTmFtZX1gO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBIVE1MRWxlbWVudCBjb250YWlucyBhIGNlcnRhaW4gY2xhc3MuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSB0aGUgSFRNTCBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gdGhlIGNsYXNzTmFtZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIEhUTUxFbGVtZW50IGNvbnRhaW5zIHRoZSBjbGFzcyBuYW1lLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBjb250YWluc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgIGlmIChlbGVtZW50ID09IG51bGwgfHwgISgnY2xhc3NOYW1lJyBpbiBlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRDbGFzc2VzID0gZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKTtcblxuICAgIGZvciAobGV0IGkgPSBjdXJyZW50Q2xhc3Nlcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgaWYgKGN1cnJlbnRDbGFzc2VzW2ldID09PSBjbGFzc05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGNlcnRhaW4gY2xhc3MgZm9yIGEgSFRNTEVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSB0aGUgSFRNTCBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gdGhlIGNsYXNzIG5hbWUuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyByZW1vdmVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICBsZXQgbmV3Q2xhc3NOYW1lID0gJyc7XG4gICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmIChjbGFzc2VzW2ldICE9PSBjbGFzc05hbWUpIHtcbiAgICAgICAgbmV3Q2xhc3NOYW1lICs9IGAke2NsYXNzZXNbaV19IGA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lLnRyaW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBvbGQgeG1sIGluaXRpYWwgdGV4dCBhdHRyaWJ1dGUgKHdpdGggwqvCuykgdG8gdGhlIGNvcnJlY3Qgb25lKHdpdGggwqdsdDvCp2d0OykuIEl0J3NcbiAgICogdXNlZCB0byBwYXJzZSBvbGQgYXBwbGV0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBzdHJpbmcgY29udGFpbmluZyBzYWZlWG1sIGNoYXJhY3RlcnNcbiAgICogQHJldHVybnMge3N0cmluZ30gYSBzdHJpbmcgd2l0aCBzYWZlWG1sIGNoYXJhY3RlcnMgcGFyc2VkLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgY29udmVydE9sZFhtbGluaXRpYWx0ZXh0QXR0cmlidXRlKHRleHQpIHtcbiAgICAvLyBVc2VkIHRvIGZpeCBhIGJ1ZyB3aXRoIENhcyBpbXBvcnRlZCBmcm9tIE1vb2RsZSAxLjkgdG8gTW9vZGxlIDIueC5cbiAgICAvLyBUaGlzIGNvdWxkIGJlIHJlbW92ZWQgaW4gZnV0dXJlLlxuICAgIGNvbnN0IHZhbCA9ICd2YWx1ZT0nO1xuXG4gICAgY29uc3QgeGl0cG9zID0gdGV4dC5pbmRleE9mKCd4bWxpbml0aWFsdGV4dCcpO1xuICAgIGNvbnN0IHZhbHBvcyA9IHRleHQuaW5kZXhPZih2YWwsIHhpdHBvcyk7XG4gICAgY29uc3QgcXVvdGUgPSB0ZXh0LmNoYXJBdCh2YWxwb3MgKyB2YWwubGVuZ3RoKTtcbiAgICBjb25zdCBzdGFydHF1b3RlID0gdmFscG9zICsgdmFsLmxlbmd0aCArIDE7XG4gICAgY29uc3QgZW5kcXVvdGUgPSB0ZXh0LmluZGV4T2YocXVvdGUsIHN0YXJ0cXVvdGUpO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0ZXh0LnN1YnN0cmluZyhzdGFydHF1b3RlLCBlbmRxdW90ZSk7XG5cbiAgICBsZXQgbmV3dmFsdWUgPSB2YWx1ZS5zcGxpdCgnwqsnKS5qb2luKCfCp2x0OycpO1xuICAgIG5ld3ZhbHVlID0gbmV3dmFsdWUuc3BsaXQoJ8K7Jykuam9pbignwqdndDsnKTtcbiAgICBuZXd2YWx1ZSA9IG5ld3ZhbHVlLnNwbGl0KCcmJykuam9pbignwqcnKTtcbiAgICBuZXd2YWx1ZSA9IG5ld3ZhbHVlLnNwbGl0KCfCqCcpLmpvaW4oJ8KncXVvdDsnKTtcblxuICAgIHRleHQgPSB0ZXh0LnNwbGl0KHZhbHVlKS5qb2luKG5ld3ZhbHVlKTtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcm9zcy1icm93c2VyIHNvbHV0aW9uIGZvciBjcmVhdGluZyBuZXcgZWxlbWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lIC0gdGFnIG5hbWUgb2YgdGhlIHdpc2hlZCBlbGVtZW50LlxuICAgKiBAcGFyYW0ge09iamVjdH0gYXR0cmlidXRlcyAtIGFuIG9iamVjdCB3aGVyZSBlYWNoIGtleSBpcyBhIHdpc2hlZFxuICAgKiBhdHRyaWJ1dGUgbmFtZSBhbmQgZWFjaCB2YWx1ZSBpcyBpdHMgdmFsdWUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3JlYXRvcl0gLSBpZiBzdXBwbGllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHVzZVxuICAgKiB0aGUgXCJjcmVhdGVFbGVtZW50XCIgbWV0aG9kIGZyb20gdGhpcyBwYXJhbS4gT3RoZXJ3aXNlXG4gICAqIGRvY3VtZW50IHdpbGwgYmUgdXNlZCBhcyBjcmVhdG9yLlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH0gVGhlIERPTSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzIGFzc2lnbmVkLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBhdHRyaWJ1dGVzLCBjcmVhdG9yKSB7XG4gICAgaWYgKGF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXR0cmlidXRlcyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChjcmVhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNyZWF0b3IgPSBkb2N1bWVudDtcbiAgICB9XG5cbiAgICBsZXQgZWxlbWVudDtcblxuICAgIC8qXG4gICAgKiBJbnRlcm5ldCBFeHBsb3JlciBmaXg6XG4gICAgKiBJZiB5b3UgY3JlYXRlIGEgbmV3IG9iamVjdCBkeW5hbWljYWxseSwgeW91IGNhbid0IHNldCBhIG5vbi1zdGFuZGFyZCBhdHRyaWJ1dGUuXG4gICAgKiBGb3IgZXhhbXBsZSwgeW91IGNhbid0IHNldCB0aGUgXCJzcmNcIiBhdHRyaWJ1dGUgb24gYW4gXCJhcHBsZXRcIiBvYmplY3QuXG4gICAgKiBPdGhlciBicm93c2VycyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBhbmQgd2lsbCBydW4gdGhlIHN0YW5kYXJkIGNvZGUuXG4gICAgKi9cbiAgICB0cnkge1xuICAgICAgbGV0IGh0bWwgPSBgPCR7dGFnTmFtZX1gO1xuXG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyaWJ1dGVOYW1lKSA9PiB7XG4gICAgICAgIGh0bWwgKz0gYCAke2F0dHJpYnV0ZU5hbWV9PVwiJHtVdGlsLmh0bWxFbnRpdGllcyhhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKX1cImA7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJz4nO1xuICAgICAgZWxlbWVudCA9IGNyZWF0b3IuY3JlYXRlRWxlbWVudChodG1sKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlbGVtZW50ID0gY3JlYXRvci5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoYXR0cmlidXRlTmFtZSkgPT4ge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBIVE1MIGZyb20gaXQncyBIVE1MIGNvZGUgYXMgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0Q29kZSAtIGh0bWwgY29kZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudH0gdGhlIEhUTUwgZWxlbWVudC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZU9iamVjdChvYmplY3RDb2RlLCBjcmVhdG9yKSB7XG4gICAgaWYgKGNyZWF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY3JlYXRvciA9IGRvY3VtZW50O1xuICAgIH1cblxuICAgIC8vIEludGVybmV0IEV4cGxvcmVyIGNhbid0IGluY2x1ZGUgXCJwYXJhbVwiIHRhZyB3aGVuIGlzIHNldHRpbmcgYW4gaW5uZXJIVE1MIHByb3BlcnR5LlxuICAgIG9iamVjdENvZGUgPSBvYmplY3RDb2RlLnNwbGl0KCc8YXBwbGV0ICcpLmpvaW4oJzxzcGFuIHdpcmlzT2JqZWN0PVwiV2lyaXNBcHBsZXRcIiAnKS5zcGxpdCgnPEFQUExFVCAnKS5qb2luKCc8c3BhbiB3aXJpc09iamVjdD1cIldpcmlzQXBwbGV0XCIgJyk7IC8vIEl0IGlzIGEgJ3NwYW4nIGJlY2F1c2UgJ3NwYW4nIG9iamVjdHMgY2FuIGNvbnRhaW4gJ2JyJyBub2Rlcy5cbiAgICBvYmplY3RDb2RlID0gb2JqZWN0Q29kZS5zcGxpdCgnPC9hcHBsZXQ+Jykuam9pbignPC9zcGFuPicpLnNwbGl0KCc8L0FQUExFVD4nKS5qb2luKCc8L3NwYW4+Jyk7XG5cbiAgICBvYmplY3RDb2RlID0gb2JqZWN0Q29kZS5zcGxpdCgnPHBhcmFtICcpLmpvaW4oJzxiciB3aXJpc09iamVjdD1cIldpcmlzUGFyYW1cIiAnKS5zcGxpdCgnPFBBUkFNICcpLmpvaW4oJzxiciB3aXJpc09iamVjdD1cIldpcmlzUGFyYW1cIiAnKTsgLy8gSXQgaXMgYSAnYnInIGJlY2F1c2UgJ2JyJyBjYW4ndCBjb250YWluIG5vZGVzLlxuICAgIG9iamVjdENvZGUgPSBvYmplY3RDb2RlLnNwbGl0KCc8L3BhcmFtPicpLmpvaW4oJzwvYnI+Jykuc3BsaXQoJzwvUEFSQU0+Jykuam9pbignPC9icj4nKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IFV0aWwuY3JlYXRlRWxlbWVudCgnZGl2Jywge30sIGNyZWF0b3IpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBvYmplY3RDb2RlO1xuXG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlUGFyYW1zRml4KG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdC5nZXRBdHRyaWJ1dGUgJiYgb2JqZWN0LmdldEF0dHJpYnV0ZSgnd2lyaXNPYmplY3QnKSA9PT0gJ1dpcmlzUGFyYW0nKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXNQYXJzZWQgPSB7fTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKG9iamVjdC5hdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYXR0cmlidXRlc1BhcnNlZFtvYmplY3QuYXR0cmlidXRlc1tpXS5ub2RlTmFtZV0gPSBvYmplY3QuYXR0cmlidXRlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW0gPSBVdGlsLmNyZWF0ZUVsZW1lbnQoJ3BhcmFtJywgYXR0cmlidXRlc1BhcnNlZCwgY3JlYXRvcik7XG5cbiAgICAgICAgLy8gSUUgZml4LlxuICAgICAgICBpZiAocGFyYW0uTkFNRSkge1xuICAgICAgICAgIHBhcmFtLm5hbWUgPSBwYXJhbS5OQU1FO1xuICAgICAgICAgIHBhcmFtLnZhbHVlID0gcGFyYW0uVkFMVUU7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbS5yZW1vdmVBdHRyaWJ1dGUoJ3dpcmlzT2JqZWN0Jyk7XG4gICAgICAgIG9iamVjdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChwYXJhbSwgb2JqZWN0KTtcbiAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmdldEF0dHJpYnV0ZSAmJiBvYmplY3QuZ2V0QXR0cmlidXRlKCd3aXJpc09iamVjdCcpID09PSAnV2lyaXNBcHBsZXQnKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXNQYXJzZWQgPSB7fTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKG9iamVjdC5hdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYXR0cmlidXRlc1BhcnNlZFtvYmplY3QuYXR0cmlidXRlc1tpXS5ub2RlTmFtZV0gPSBvYmplY3QuYXR0cmlidXRlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwbGV0ID0gVXRpbC5jcmVhdGVFbGVtZW50KCdhcHBsZXQnLCBhdHRyaWJ1dGVzUGFyc2VkLCBjcmVhdG9yKTtcbiAgICAgICAgYXBwbGV0LnJlbW92ZUF0dHJpYnV0ZSgnd2lyaXNPYmplY3QnKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5jaGlsZE5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgcmVjdXJzaXZlUGFyYW1zRml4KG9iamVjdC5jaGlsZE5vZGVzW2ldKTtcblxuICAgICAgICAgIGlmIChvYmplY3QuY2hpbGROb2Rlc1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAncGFyYW0nKSB7XG4gICAgICAgICAgICBhcHBsZXQuYXBwZW5kQ2hpbGQob2JqZWN0LmNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgaSAtPSAxOyAvLyBXaGVuIHdlIGluc2VydCB0aGUgb2JqZWN0IGNoaWxkIGludG8gdGhlIGFwcGxldCwgb2JqZWN0IGxvc2VzIG9uZSBjaGlsZC5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvYmplY3QucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYXBwbGV0LCBvYmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGROb2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIHJlY3Vyc2l2ZVBhcmFtc0ZpeChvYmplY3QuY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWN1cnNpdmVQYXJhbXNGaXgoY29udGFpbmVyKTtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gRWxlbWVudCB0byBpdHMgSFRNTCBjb2RlLlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBlbnRyeSBlbGVtZW50LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBIVE1MIGNvZGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVPYmplY3RDb2RlKGVsZW1lbnQpIHtcbiAgICAvLyBJbiBjYXNlIHRoYXQgdGhlIGltYWdlIHdhcyBub3QgY3JlYXRlZCwgdGhlIG9iamVjdCBjYW4gYmUgbnVsbCBvciB1bmRlZmluZWQuXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCBlbGVtZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFTEVNRU5UX05PREUuXG4gICAgICBsZXQgb3V0cHV0ID0gYDwke2VsZW1lbnQudGFnTmFtZX1gO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuYXR0cmlidXRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoZWxlbWVudC5hdHRyaWJ1dGVzW2ldLnNwZWNpZmllZCkge1xuICAgICAgICAgIG91dHB1dCArPSBgICR7ZWxlbWVudC5hdHRyaWJ1dGVzW2ldLm5hbWV9PVwiJHtVdGlsLmh0bWxFbnRpdGllcyhlbGVtZW50LmF0dHJpYnV0ZXNbaV0udmFsdWUpfVwiYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3V0cHV0ICs9ICc+JztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIG91dHB1dCArPSBVdGlsLmNyZWF0ZU9iamVjdChlbGVtZW50LmNoaWxkTm9kZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ICs9IGA8LyR7ZWxlbWVudC50YWdOYW1lfT5gO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnRElWJyB8fCBlbGVtZW50Lm5vZGVOYW1lID09PSAnU0NSSVBUJykge1xuICAgICAgICBvdXRwdXQgKz0gYD48LyR7ZWxlbWVudC50YWdOYW1lfT5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ICs9ICcvPic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHsgLy8gVEVYVF9OT0RFLlxuICAgICAgcmV0dXJuIFV0aWwuaHRtbEVudGl0aWVzKGVsZW1lbnQubm9kZVZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVzIHR3byBVUkwgcGF0aHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMSAtIGZpcnN0IFVSTCBwYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMiAtIHNlY29uZCBVUkwgcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBuZXcgVVJMLlxuICAgKi9cbiAgc3RhdGljIGNvbmNhdGVuYXRlVXJsKHBhdGgxLCBwYXRoMikge1xuICAgIGxldCBzZXBhcmF0b3IgPSAnJztcbiAgICBpZiAoKHBhdGgxLmluZGV4T2YoJy8nKSAhPT0gcGF0aDEubGVuZ3RoKSAmJiAocGF0aDIuaW5kZXhPZignLycpICE9PSAwKSkge1xuICAgICAgc2VwYXJhdG9yID0gJy8nO1xuICAgIH1cbiAgICByZXR1cm4gKHBhdGgxICsgc2VwYXJhdG9yICsgcGF0aDIpLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdGV4dCBhbmQgcmVwbGFjZXMgYWxsIEhUTUwgc3BlY2lhbCBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGNvcnJlc3BvbmRlbnQgZW50aXRpZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIHRleHQgdG8gYmUgcGFyc2VkLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgaW5wdXQgdGV4dCB3aXRoIGFsbCB0aGVpciBzcGVjaWFsIGNoYXJhY3RlcnMgcmVwbGFjZWQgYnkgdGhlaXIgZW50aXRpZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBodG1sRW50aXRpZXMoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQuc3BsaXQoJyYnKS5qb2luKCcmYW1wOycpLnNwbGl0KCc8Jykuam9pbignJmx0OycpXG4gICAgICAuc3BsaXQoJz4nKVxuICAgICAgLmpvaW4oJyZndDsnKVxuICAgICAgLnNwbGl0KCdcIicpXG4gICAgICAuam9pbignJnF1b3Q7Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgSFRNTCB0byBwcmV2ZW50IFhTUyBpbmplY3Rpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIGh0bWwgdG8gYmUgc2FuaXRpemUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IGh0bWwgc2FuaXRpemVkLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgaHRtbFNhbml0aXplKGh0bWwpIHtcbiAgICBsZXQgYW5ub3RhdGlvblJlZ2V4ID0gL1xcPGFubm90YXRpb24uK1xcPFxcL2Fubm90YXRpb25cXD4vXG4gICAgLy8gR2V0IGFsbCB0aGUgYW5ub3RhdGlvbiBjb250ZW50IGluY2x1ZGluZyB0aGUgdGFncy5cbiAgICBsZXQgYW5ub3RhdGlvbiA9IGh0bWwubWF0Y2goYW5ub3RhdGlvblJlZ2V4KTtcbiAgICAvLyBTYW5pdGl6ZSBodG1sIGNvZGUgd2l0aG91dCByZW1vdmluZyB0aGUgPHNlbWFudGljcz4gYW5kIDxhbm5vdGF0aW9uPiB0YWdzLlxuICAgIGh0bWwgPSBET01QdXJpZnkuc2FuaXRpemUoaHRtbCwgeyBBRERfVEFHUzogWydzZW1hbnRpY3MnLCAnYW5ub3RhdGlvbiddLCBBTExPV0VEX0FUVFI6IFsnbWF0aHZhcmlhbnQnLCAnY2xhc3MnLCAnbGluZWJyZWFrJ119KTtcbiAgICAvLyBSZWFkZCBvbGQgYW5ub3RhdGlvbiBjb250ZW50LlxuICAgIHJldHVybiBodG1sLnJlcGxhY2UoYW5ub3RhdGlvblJlZ2V4LCBhbm5vdGF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB0ZXh0IGFuZCByZXBsYWNlcyBhbGwgdGhlIEhUTUwgZW50aXRpZXMgYnkgdGhlaXIgY2hhcmFjdGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gdGV4dCB0byBiZSBwYXJzZWRcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGlucHV0IHRleHQgd2l0aCBhbGwgdGhlaXIgZW50aXRpZXMgcmVwbGFjZWQgYnkgY2hhcmFjdGVycy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGh0bWxFbnRpdGllc0RlY29kZShpbnB1dCkge1xuICAgIC8vIFRleHRhcmVhIGVsZW1lbnQgZGVjb2RlcyB3aGVuIGlubmVyIGh0bWwgaXMgc2V0LlxuICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICB0ZXh0YXJlYS5pbm5lckhUTUwgPSBpbnB1dDtcbiAgICByZXR1cm4gdGV4dGFyZWEudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNyb3NzLWJyb3dzZXIgaHR0cCByZXF1ZXN0LlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IGh0dHBSZXF1ZXN0IHJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7WE1MSHR0cFJlcXVlc3R8QWN0aXZlWE9iamVjdH0gdGhlIHByb3BlciByZXF1ZXN0IG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVIdHRwUmVxdWVzdCgpIHtcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpLnN1YnN0cigwLCB3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKS5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gICAgaWYgKGN1cnJlbnRQYXRoLnN1YnN0cigwLCA3KSA9PT0gJ2ZpbGU6Ly8nKSB7XG4gICAgICB0aHJvdyBTdHJpbmdNYW5hZ2VyLmdldCgnZXhjZXB0aW9uX2Nyb3NzX3NpdGUnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpO1xuICAgICAgfSBjYXRjaCAob2MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgaGFzaCB0byBhIEhUVFAgcXVlcnkuXG4gICAqIEBwYXJhbSB7T2JqZWN0W119IHByb3BlcnRpZXMgLSBhIGtleS92YWx1ZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IGEgSFRUUCBxdWVyeSBjb250YWluaW5nIGFsbCB0aGUga2V5IHZhbHVlIHBhaXJzIHdpdGhcbiAgICogYWxsIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgcmVwbGFjZWQgYnkgdGhlaXIgZW50aXRpZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBodHRwQnVpbGRRdWVyeShwcm9wZXJ0aWVzKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuXG4gICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgaWYgKHByb3BlcnRpZXNbaV0gIT0gbnVsbCkge1xuICAgICAgICByZXN1bHQgKz0gYCR7VXRpbC51cmxFbmNvZGUoaSl9PSR7VXRpbC51cmxFbmNvZGUocHJvcGVydGllc1tpXSl9JmA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEZWxldGluZyBsYXN0ICcmJyBlbXB0eSBjaGFyYWN0ZXIuXG4gICAgaWYgKHJlc3VsdC5zdWJzdHJpbmcocmVzdWx0Lmxlbmd0aCAtIDEpID09PSAnJicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGhhc2ggdG8gc3RyaW5nIHNvcnRpbmcga2V5cyB0byBnZXQgYSBkZXRlcm1pbmlzdGljIG91dHB1dFxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBoYXNoIC0gYSBrZXkvdmFsdWUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBhIHN0cmluZyB3aXRoIHRoZSBmb3JtIGtleTE9dmFsdWUxLi4ua2V5bj12YWx1ZW5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHByb3BlcnRpZXNUb1N0cmluZyhoYXNoKSB7XG4gICAgLy8gMS4gU29ydCBrZXlzLiBXZSBzb3J0IHRoZSBrZXlzIGJlY2F1c2Ugd2Ugd2FudCBhIGRldGVybWluaXN0aWMgb3V0cHV0LlxuICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhoYXNoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaGFzaCwga2V5KSkge1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IG4gPSBrZXlzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkgKz0gMSkge1xuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbjsgaiArPSAxKSB7XG4gICAgICAgIGNvbnN0IHMxID0ga2V5c1tpXTtcbiAgICAgICAgY29uc3QgczIgPSBrZXlzW2pdO1xuICAgICAgICBpZiAoVXRpbC5jb21wYXJlU3RyaW5ncyhzMSwgczIpID4gMCkge1xuICAgICAgICAgIC8vIFN3YXAuXG4gICAgICAgICAga2V5c1tpXSA9IHMyO1xuICAgICAgICAgIGtleXNbal0gPSBzMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEdlbmVyYXRlIG91dHB1dC5cbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBvdXRwdXQgKz0ga2V5O1xuICAgICAgb3V0cHV0ICs9ICc9JztcbiAgICAgIGxldCB2YWx1ZSA9IGhhc2hba2V5XTtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxcXCcsICdcXFxcXFxcXCcpO1xuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdcXG4nLCAnXFxcXG4nKTtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxyJywgJ1xcXFxyJyk7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xcdCcsICdcXFxcdCcpO1xuXG4gICAgICBvdXRwdXQgKz0gdmFsdWU7XG4gICAgICBvdXRwdXQgKz0gJ1xcbic7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSB0d28gc3RyaW5ncyB1c2luZyBjaGFyQ29kZUF0IG1ldGhvZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYSAtIGZpcnN0IHN0cmluZyB0byBjb21wYXJlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYiAtIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS5cbiAgICogQHJldHVybnMge251bWJlcn0gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBjb21wYXJlU3RyaW5ncyhhLCBiKSB7XG4gICAgbGV0IGk7XG4gICAgY29uc3QgYW4gPSBhLmxlbmd0aDtcbiAgICBjb25zdCBibiA9IGIubGVuZ3RoO1xuICAgIGNvbnN0IG4gPSAoYW4gPiBibikgPyBibiA6IGFuO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGMgPSBVdGlsLmZpeGVkQ2hhckNvZGVBdChhLCBpKSAtIFV0aWwuZml4ZWRDaGFyQ29kZUF0KGIsIGkpO1xuICAgICAgaWYgKGMgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeCBjaGFyQ29kZUF0KCkgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBoYW5kbGUgbm9uLUJhc2ljLU11bHRpbGluZ3VhbC1QbGFuZSBjaGFyYWN0ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gaW5wdXQgc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggLSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwXG4gICAqIGFuZCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBVVEYtMTYgY29kZSBvZiB0aGUgc3RyaW5nIGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGZpeGVkQ2hhckNvZGVBdChzdHJpbmcsIGlkeCkge1xuICAgIGlkeCA9IGlkeCB8fCAwO1xuICAgIGNvbnN0IGNvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpZHgpO1xuICAgIGxldCBoaTtcbiAgICBsZXQgbG93O1xuXG4gICAgLyogSGlnaCBzdXJyb2dhdGUgKGNvdWxkIGNoYW5nZSBsYXN0IGhleCB0byAweERCN0YgdG8gdHJlYXQgaGlnaFxuICAgIHByaXZhdGUgc3Vycm9nYXRlcyBhcyBzaW5nbGUgY2hhcmFjdGVycykgKi9cblxuICAgIGlmIChjb2RlID49IDB4RDgwMCAmJiBjb2RlIDw9IDB4REJGRikge1xuICAgICAgaGkgPSBjb2RlO1xuICAgICAgbG93ID0gc3RyaW5nLmNoYXJDb2RlQXQoaWR4ICsgMSk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKGxvdykpIHtcbiAgICAgICAgdGhyb3cgU3RyaW5nTWFuYWdlci5nZXQoJ2V4Y2VwdGlvbl9oaWdoX3N1cnJvZ2F0ZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICgoaGkgLSAweEQ4MDApICogMHg0MDApICsgKGxvdyAtIDB4REMwMCkgKyAweDEwMDAwO1xuICAgIH1cblxuICAgIGlmIChjb2RlID49IDB4REMwMCAmJiBjb2RlIDw9IDB4REZGRikgeyAvLyBMb3cgc3Vycm9nYXRlLlxuICAgICAgLyogV2UgcmV0dXJuIGZhbHNlIHRvIGFsbG93IGxvb3BzIHRvIHNraXAgdGhpcyBpdGVyYXRpb24gc2luY2Ugc2hvdWxkIGhhdmVcbiAgICAgIGFscmVhZHkgaGFuZGxlZCBoaWdoIHN1cnJvZ2F0ZSBhYm92ZSBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLiAqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIFVSTCB3aXRoIGl0J3MgcXVlcnkgcGFyYW1zIGNvbnZlcnRlZCBpbnRvIGFycmF5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gaW5wdXQgVVJMLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0W119IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIFVSTCBxdWVyeSBwYXJhbXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1cmxUb0Fzc0FycmF5KHVybCkge1xuICAgIGxldCBpO1xuICAgIGkgPSB1cmwuaW5kZXhPZignPycpO1xuICAgIGlmIChpID4gMCkge1xuICAgICAgY29uc3QgcXVlcnkgPSB1cmwuc3Vic3RyaW5nKGkgKyAxKTtcbiAgICAgIGNvbnN0IHNzID0gcXVlcnkuc3BsaXQoJyYnKTtcbiAgICAgIGNvbnN0IGggPSB7fTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBzID0gc3NbaV07XG4gICAgICAgIGNvbnN0IGt2ID0gcy5zcGxpdCgnPScpO1xuICAgICAgICBpZiAoa3YubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGhba3ZbMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KGt2WzFdLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGg7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGVuY29kZWQgVVJMIGJ5IHJlcGxhY2luZyBlYWNoIGluc3RhbmNlIG9mIGNlcnRhaW4gY2hhcmFjdGVycyBieVxuICAgKiBvbmUsIHR3bywgdGhyZWUgb3IgZm91ciBlc2NhcGUgc2VxdWVuY2VzIHVzaW5nIGVuY29kZVVSSUNvbXBvbmVudCBtZXRob2QuXG4gICAqICEnKCkqIC4gd2lsbCBub3QgYmUgZW5jb2RlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsZWFyU3RyaW5nIC0gVVJMIHN0cmluZyB0byBiZSBlbmNvZGVkXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFVSTCB3aXRoIGl0J3Mgc3BlY2lhbCBjaGFyYWN0ZXJzIHJlcGxhY2VkLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdXJsRW5jb2RlKGNsZWFyU3RyaW5nKSB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIC8vIE1ldGhvZCBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCBlbmNvZGUgIScoKSp+IC5cbiAgICBvdXRwdXQgPSBlbmNvZGVVUklDb21wb25lbnQoY2xlYXJTdHJpbmcpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvLyBUT0RPOiBUbyBwYXJzZXI/XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgSFRNTCBvZiBhIGltYWdlIGludG8gdGhlIG91dHB1dCBjb2RlIHRoYXQgV0lSSVMgbXVzdCByZXR1cm4uXG4gICAqIEJ5IGRlZmF1bHQgcmV0dXJucyB0aGUgTWF0aE1MIHN0b3JlZCBvbiBkYXRhLW1haG1sIGF0dHJpYnV0ZSAoaWYgaW1nQ29kZSBpcyBhIGZvcm11bGEpXG4gICAqIG9yIHRoZSBXaXJpc2NhcyBhdHRyaWJ1dGUgb2YgYSBXSVJJUyBhcHBsZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbWdDb2RlIC0gdGhlIGh0bWwgY29kZSBmcm9tIGEgZm9ybXVsYSBvciBhIENBUyBpbWFnZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBjb252ZXJ0VG9YbWwgLSB0cnVlIGlmIHRoZSBpbWFnZSBzaG91bGQgYmUgY29udmVydGVkIHRvIFhNTC5cbiAgICogQHBhcmFtIHtib29sZWFufSBjb252ZXJ0VG9TYWZlWG1sIC0gdHJ1ZSBpZiB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBzYWZlWE1MLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgWE1MIG9yIHNhZmVYTUwgb2YgYSBXSVJJUyBpbWFnZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldFdJUklTSW1hZ2VPdXRwdXQoaW1nQ29kZSwgY29udmVydFRvWG1sLCBjb252ZXJ0VG9TYWZlWG1sKSB7XG4gICAgY29uc3QgaW1nT2JqZWN0ID0gVXRpbC5jcmVhdGVPYmplY3QoaW1nQ29kZSk7XG4gICAgaWYgKGltZ09iamVjdCkge1xuICAgICAgaWYgKGltZ09iamVjdC5jbGFzc05hbWUgPT09IENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZUNsYXNzTmFtZScpIHx8IGltZ09iamVjdC5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlTWF0aG1sQXR0cmlidXRlJykpKSB7XG4gICAgICAgIGlmICghY29udmVydFRvWG1sKSB7XG4gICAgICAgICAgcmV0dXJuIGltZ0NvZGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhTWF0aE1MID0gaW1nT2JqZWN0LmdldEF0dHJpYnV0ZShDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VNYXRobWxBdHRyaWJ1dGUnKSk7XG4gICAgICAgIC8vIFRvIGhhbmRsZSBhbm5vdGF0aW9ucywgZmlyc3Qgd2UgbmVlZCB0aGUgTWF0aE1MIGluIFhNTC5cbiAgICAgICAgbGV0IG1hdGhNTCA9IE1hdGhNTC5zYWZlWG1sRGVjb2RlKGRhdGFNYXRoTUwpO1xuXG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVIYW5kVHJhY2VzJykpIHtcbiAgICAgICAgICBtYXRoTUwgPSBNYXRoTUwucmVtb3ZlQW5ub3RhdGlvbihtYXRoTUwsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0aE1MID09IG51bGwpIHtcbiAgICAgICAgICBtYXRoTUwgPSBpbWdPYmplY3QuZ2V0QXR0cmlidXRlKCdhbHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb252ZXJ0VG9TYWZlWG1sKSB7XG4gICAgICAgICAgY29uc3Qgc2FmZU1hdGhNTCA9IE1hdGhNTC5zYWZlWG1sRW5jb2RlKG1hdGhNTCk7XG4gICAgICAgICAgcmV0dXJuIHNhZmVNYXRoTUw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0aE1MO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW1nQ29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBub2RlIGxlbmd0aCBpbiBjaGFyYWN0ZXJzLlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBIVE1MIG5vZGUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IG5vZGUgbGVuZ3RoLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0Tm9kZUxlbmd0aChub2RlKSB7XG4gICAgY29uc3Qgc3RhdGljTm9kZUxlbmd0aHMgPSB7XG4gICAgICBJTUc6IDEsXG4gICAgICBCUjogMSxcbiAgICB9O1xuXG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVEVYVF9OT0RFLlxuICAgICAgcmV0dXJuIG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFTEVNRU5UX05PREUuXG4gICAgICBsZXQgbGVuZ3RoID0gc3RhdGljTm9kZUxlbmd0aHNbbm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGxlbmd0aCArPSBVdGlsLmdldE5vZGVMZW5ndGgobm9kZS5jaGlsZE5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzZWxlY3RlZCBub2RlIG9yIHRleHQgZnJvbSBhbiBlZGl0YWJsZSBIVE1MRWxlbWVudC5cbiAgICogSWYgdGhlIGNhcmV0IGlzIG9uIGEgdGV4dCBub2RlLCBjb25jYXRlbmF0ZXMgaXQgd2l0aCBhbGwgdGhlIHByZXZpb3VzIGFuZCBuZXh0IHRleHQgbm9kZXMuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldCAtIHRoZSBlZGl0YWJsZSBIVE1MRWxlbWVudC5cbiAgICogQHBhcmFtIHtib29sZWFufSBpc0lmcmFtZSAgLSBzcGVjaWZpZXMgaWYgdGhlIHRhcmdldCBpcyBhbiBpZnJhbWUgb3Igbm90XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VHZXRTZWxlY3Rpb24gLSBpZiB0cnVlLCBpZ25vcmVzIElFIHN5c3RlbSB0byBnZXRcbiAgICogdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCB1c2VzIHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBhbiBvYmplY3Qgd2l0aCB0aGUgJ25vZGUnIGtleSBzZXQgaWYgdGhlIGl0ZW0gaXMgYW5cbiAgICogZWxlbWVudCBvciB0aGUga2V5cyAnbm9kZScgYW5kICdjYXJldFBvc2l0aW9uJyBpZiB0aGUgZWxlbWVudCBpcyB0ZXh0LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VsZWN0ZWRJdGVtKHRhcmdldCwgaXNJZnJhbWUsIGZvcmNlR2V0U2VsZWN0aW9uKSB7XG4gICAgbGV0IHdpbmRvd1RhcmdldDtcblxuICAgIGlmIChpc0lmcmFtZSkge1xuICAgICAgd2luZG93VGFyZ2V0ID0gdGFyZ2V0LmNvbnRlbnRXaW5kb3c7XG4gICAgICB3aW5kb3dUYXJnZXQuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93VGFyZ2V0ID0gd2luZG93O1xuICAgICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiAhZm9yY2VHZXRTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gd2luZG93VGFyZ2V0LmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuXG4gICAgICBpZiAocmFuZ2UucGFyZW50RWxlbWVudCkge1xuICAgICAgICBpZiAocmFuZ2UuaHRtbFRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChyYW5nZS50ZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFV0aWwuZ2V0U2VsZWN0ZWRJdGVtKHRhcmdldCwgaXNJZnJhbWUsIHRydWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93VGFyZ2V0LmRvY3VtZW50LmV4ZWNDb21tYW5kKCdJbnNlcnRJbWFnZScsIGZhbHNlLCAnIycpO1xuICAgICAgICBsZXQgdGVtcG9yYWxPYmplY3QgPSByYW5nZS5wYXJlbnRFbGVtZW50KCk7XG5cbiAgICAgICAgaWYgKHRlbXBvcmFsT2JqZWN0Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICdJTUcnKSB7XG4gICAgICAgICAgLy8gSUU5IGZpeDogcGFyZW50RWxlbWVudCgpIGRvZXMgbm90IHJldHVybiB0aGUgSU1HIG5vZGUsXG4gICAgICAgICAgLy8gcmV0dXJucyB0aGUgcGFyZW50IERJViBub2RlLiBJbiBJRSA8IDksIHBhc3RlSFRNTCBkb2VzIG5vdCB3b3JrIHdlbGwuXG4gICAgICAgICAgcmFuZ2UucGFzdGVIVE1MKCc8c3BhbiBpZD1cIndyc19vcGVuRWRpdG9yV2luZG93X3RlbXBvcmFsT2JqZWN0XCI+PC9zcGFuPicpO1xuICAgICAgICAgIHRlbXBvcmFsT2JqZWN0ID0gd2luZG93VGFyZ2V0LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3cnNfb3BlbkVkaXRvcldpbmRvd190ZW1wb3JhbE9iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5vZGU7XG4gICAgICAgIGxldCBjYXJldFBvc2l0aW9uO1xuXG4gICAgICAgIGlmICh0ZW1wb3JhbE9iamVjdC5uZXh0U2libGluZyAmJiB0ZW1wb3JhbE9iamVjdC5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gMykgeyAvLyBURVhUX05PREUuXG4gICAgICAgICAgbm9kZSA9IHRlbXBvcmFsT2JqZWN0Lm5leHRTaWJsaW5nO1xuICAgICAgICAgIGNhcmV0UG9zaXRpb24gPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBvcmFsT2JqZWN0LnByZXZpb3VzU2libGluZ1xuICAgICAgICAgICYmIHRlbXBvcmFsT2JqZWN0LnByZXZpb3VzU2libGluZy5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgIG5vZGUgPSB0ZW1wb3JhbE9iamVjdC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgY2FyZXRQb3NpdGlvbiA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlID0gd2luZG93VGFyZ2V0LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICAgICAgICB0ZW1wb3JhbE9iamVjdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCB0ZW1wb3JhbE9iamVjdCk7XG4gICAgICAgICAgY2FyZXRQb3NpdGlvbiA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0ZW1wb3JhbE9iamVjdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRlbXBvcmFsT2JqZWN0KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgY2FyZXRQb3NpdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJhbmdlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGU6IHJhbmdlLml0ZW0oMCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh3aW5kb3dUYXJnZXQuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICBsZXQgcmFuZ2U7XG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3dUYXJnZXQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJhbmdlID0gd2luZG93VGFyZ2V0LmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcblxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVEVYVF9OT0RFLlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgY2FyZXRQb3NpdGlvbjogcmFuZ2Uuc3RhcnRPZmZzZXQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlICE9PSByYW5nZS5lbmRDb250YWluZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7IC8vIEVMRU1FTlRfTk9ERS5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSByYW5nZS5zdGFydE9mZnNldDtcblxuICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzW3Bvc2l0aW9uXSkge1xuXG4gICAgICAgICAgLy8gSW4gY2FzZSB0aGF0IGEgZm9ybXVsYSBpcyBkZXRlY3RlZCBidXQgbm90IHNlbGVjdGVkLFxuICAgICAgICAgIC8vIHdlIGNyZWF0ZSBhbiBlbXB0eSBzcGFuIHdoZXJlIHdlIGNvdWxkIGluc2VydCB0aGUgbmV3IGZvcm11bGEuXG4gICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSByYW5nZS5lbmRPZmZzZXQpIHtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPT0gMCAmJiBub2RlLmNoaWxkTm9kZXNbcG9zaXRpb24gLSAxXS5sb2NhbE5hbWUgPT09ICdzcGFuJyAmJiBub2RlLmNoaWxkTm9kZXNbcG9zaXRpb25dLmNsYXNzTGlzdC5jb250YWlucygnV2lyaXNmb3JtdWxhJykpIHtcbiAgICAgICAgICAgICAgbm9kZS5jaGlsZE5vZGVzW3Bvc2l0aW9uIC0gMV0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiBVdGlsLmdldFNlbGVjdGVkSXRlbSh0YXJnZXQsIGlzSWZyYW1lLCBmb3JjZUdldFNlbGVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLmNoaWxkTm9kZXNbcG9zaXRpb25dLmNsYXNzTGlzdD8uY29udGFpbnMoJ1dpcmlzZm9ybXVsYScpKSB7XG4gICAgICAgICAgICAgIGlmICgocG9zaXRpb24gPiAwICYmIG5vZGUuY2hpbGROb2Rlc1twb3NpdGlvbiAtIDFdLmNsYXNzTGlzdC5jb250YWlucygnV2lyaXNmb3JtdWxhJykpIHx8IHBvc2l0aW9uID09PSAwICkge1xuICAgICAgICAgICAgICAgIHZhciBlbXB0eVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoZW1wdHlTcGFuLCBub2RlLmNoaWxkTm9kZXNbcG9zaXRpb25dKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbm9kZTogbm9kZS5jaGlsZE5vZGVzW3Bvc2l0aW9uXSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGU6IG5vZGUuY2hpbGROb2Rlc1twb3NpdGlvbl0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpc24ndCBhbnkgaXRlbSBvciBpZiBpdCBpcyBtYWxmb3JtZWQuXG4gICAqIE90aGVyd2lzZSByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBub2RlIHdpdGggdGhlIE1hdGhNTCBpbWFnZVxuICAgKiBhbmQgdGhlIGN1cnNvciBwb3NpdGlvbiBpbnNpZGUgdGhlIHRleHRhcmVhLlxuICAgKiBAcGFyYW0ge0hUTUxUZXh0QXJlYUVsZW1lbnR9IHRleHRhcmVhIC0gdGV4dGFyZWEgZWxlbWVudC5cbiAgICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5vZGUsIHRoZSBpbmRleCBvZiB0aGVcbiAgICogYmVnaW5uaW5nICBvZiB0aGUgc2VsZWN0ZWQgdGV4dCwgY2FyZXQgcG9zaXRpb24gYW5kIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9uIG9mIHRoZVxuICAgKiB0ZXh0IG5vZGUuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXRTZWxlY3RlZEl0ZW1PblRleHRhcmVhKHRleHRhcmVhKSB7XG4gICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0YXJlYS52YWx1ZSk7XG4gICAgY29uc3QgdGV4dE5vZGVWYWx1ZXMgPSBMYXRleC5nZXRMYXRleEZyb21UZXh0Tm9kZSh0ZXh0Tm9kZSwgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQpO1xuICAgIGlmICh0ZXh0Tm9kZVZhbHVlcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IHRleHROb2RlLFxuICAgICAgY2FyZXRQb3NpdGlvbjogdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBzdGFydFBvc2l0aW9uOiB0ZXh0Tm9kZVZhbHVlcy5zdGFydFBvc2l0aW9uLFxuICAgICAgZW5kUG9zaXRpb246IHRleHROb2RlVmFsdWVzLmVuZFBvc2l0aW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTG9va3MgZm9yIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIG5hbWUgaW4gYSBIVE1MIGNvZGUgc3RyaW5nLlxuICAgKiBJbXBvcnRhbnQ6IHRoaXMgZnVuY3Rpb24gaXMgdmVyeSBjb25jcmV0ZSBmb3IgV0lSSVMgY29kZS5cbiAgICogSXQgdGFrZXMgYXMgcHJlY29uZGl0aW9ucyBsb3RzIG9mIGJlaGF2aW9ycyB0aGF0IGFyZSBub3QgdGhlIGdlbmVyYWwgY2FzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSAgSFRNTCBjb2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIGVsZW1lbnQgbmFtZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBhdXRvQ2xvc2VkIC0gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgYXJlIGF1dG9DbG9zZWQuXG4gICAqIEByZXR1cm4ge09iamVjdFtdfSBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgSFRNTCBlbGVtZW50cyBvZiBjb2RlIG1hdGNoaW5nIHRoZSBuYW1lIGFyZ3VtZW50LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0RWxlbWVudHNCeU5hbWVGcm9tU3RyaW5nKGNvZGUsIG5hbWUsIGF1dG9DbG9zZWQpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICAgIGNvZGUgPSBjb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBsZXQgc3RhcnQgPSBjb2RlLmluZGV4T2YoYDwke25hbWV9IGApO1xuXG4gICAgd2hpbGUgKHN0YXJ0ICE9PSAtMSkgeyAvLyBMb29rIGZvciBub2Rlcy5cbiAgICAgIGxldCBlbmRTdHJpbmc7XG5cbiAgICAgIGlmIChhdXRvQ2xvc2VkKSB7XG4gICAgICAgIGVuZFN0cmluZyA9ICc+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFN0cmluZyA9IGA8LyR7bmFtZX0+YDtcbiAgICAgIH1cblxuICAgICAgbGV0IGVuZCA9IGNvZGUuaW5kZXhPZihlbmRTdHJpbmcsIHN0YXJ0KTtcblxuICAgICAgaWYgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgZW5kICs9IGVuZFN0cmluZy5sZW5ndGg7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgIGVuZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSBzdGFydCArIDE7XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0ID0gY29kZS5pbmRleE9mKGA8JHtuYW1lfSBgLCBlbmQpO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzZTY0IGNoYXJhY3Rlci5cbiAgICogQHBhcmFtICB7c3RyaW5nfSBjaGFyYWN0ZXIgLSBiYXNlNjQgY2hhcmFjdGVyLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBiYXNlNjQgY2hhcmFjdGVyIG51bWVyaWMgdmFsdWUuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBkZWNvZGU2NChjaGFyYWN0ZXIpIHtcbiAgICBjb25zdCBQTFVTID0gJysnLmNoYXJDb2RlQXQoMCk7XG4gICAgY29uc3QgU0xBU0ggPSAnLycuY2hhckNvZGVBdCgwKTtcbiAgICBjb25zdCBOVU1CRVIgPSAnMCcuY2hhckNvZGVBdCgwKTtcbiAgICBjb25zdCBMT1dFUiA9ICdhJy5jaGFyQ29kZUF0KDApO1xuICAgIGNvbnN0IFVQUEVSID0gJ0EnLmNoYXJDb2RlQXQoMCk7XG4gICAgY29uc3QgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApO1xuICAgIGNvbnN0IFNMQVNIX1VSTF9TQUZFID0gJ18nLmNoYXJDb2RlQXQoMCk7XG4gICAgY29uc3QgY29kZSA9IGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApO1xuXG4gICAgaWYgKGNvZGUgPT09IFBMVVMgfHwgY29kZSA9PT0gUExVU19VUkxfU0FGRSkge1xuICAgICAgcmV0dXJuIDYyOyAvLyBDaGFyICcrJy5cbiAgICB9XG4gICAgaWYgKGNvZGUgPT09IFNMQVNIIHx8IGNvZGUgPT09IFNMQVNIX1VSTF9TQUZFKSB7XG4gICAgICByZXR1cm4gNjM7IC8vIENoYXIgJy8nLlxuICAgIH1cbiAgICBpZiAoY29kZSA8IE5VTUJFUikge1xuICAgICAgcmV0dXJuIC0xOyAvLyBObyBtYXRjaC5cbiAgICB9XG4gICAgaWYgKGNvZGUgPCBOVU1CRVIgKyAxMCkge1xuICAgICAgcmV0dXJuIGNvZGUgLSBOVU1CRVIgKyAyNiArIDI2O1xuICAgIH1cbiAgICBpZiAoY29kZSA8IFVQUEVSICsgMjYpIHtcbiAgICAgIHJldHVybiBjb2RlIC0gVVBQRVI7XG4gICAgfVxuICAgIGlmIChjb2RlIDwgTE9XRVIgKyAyNikge1xuICAgICAgcmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmFzZTY0IHN0cmluZyB0byBhIGFycmF5IG9mIGJ5dGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYjY0U3RyaW5nIC0gYmFzZTY0IHN0cmluZy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIGRpbWVuc2lvbiBvZiBieXRlIGFycmF5IChieSBkZWZhdWx0IHdob2xlIHN0cmluZykuXG4gICAqIEByZXR1cm4ge09iamVjdFtdfSB0aGUgcmVzdWx0YW50IGJ5dGUgYXJyYXkuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBiNjRUb0J5dGVBcnJheShiNjRTdHJpbmcsIGxlbmd0aCkge1xuICAgIGxldCB0bXA7XG5cbiAgICBpZiAoYjY0U3RyaW5nLmxlbmd0aCAlIDQgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKTsgLy8gVGlwcGVkIGJhc2U2NC4gTGVuZ3RoIGlzIGZpeGVkLlxuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IFtdO1xuXG4gICAgbGV0IGw7XG4gICAgbGV0IHBsYWNlSG9sZGVycztcbiAgICBpZiAoIWxlbmd0aCkgeyAvLyBBbGwgYjY0U3RyaW5nIHN0cmluZy5cbiAgICAgIGlmIChiNjRTdHJpbmcuY2hhckF0KGI2NFN0cmluZy5sZW5ndGggLSAyKSA9PT0gJz0nKSB7XG4gICAgICAgIHBsYWNlSG9sZGVycyA9IDI7XG4gICAgICB9IGVsc2UgaWYgKGI2NFN0cmluZy5jaGFyQXQoYjY0U3RyaW5nLmxlbmd0aCAtIDEpID09PSAnPScpIHtcbiAgICAgICAgcGxhY2VIb2xkZXJzID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBsYWNlSG9sZGVycyA9IDA7XG4gICAgICB9XG4gICAgICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NFN0cmluZy5sZW5ndGggLSA0IDogYjY0U3RyaW5nLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGxlbmd0aDtcbiAgICB9XG5cbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSA0KSB7XG4gICAgICAvLyBJZ25vcmluZyBjb2RlIGNoZWNrZXIgc3RhbmRhcmRzIChiaXRld2lzZSBvcGVyYXRvcnMpLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vdHJhY2tlci5tb29kbGUub3JnL2Jyb3dzZS9DT05UUklCLTU4NjIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uXG4gICAgICAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlU3RhcnRcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICB0bXAgPSAoVXRpbC5kZWNvZGU2NChiNjRTdHJpbmcuY2hhckF0KGkpKSA8PCAxOCkgfCAoVXRpbC5kZWNvZGU2NChiNjRTdHJpbmcuY2hhckF0KGkgKyAxKSkgPDwgMTIpIHwgKFV0aWwuZGVjb2RlNjQoYjY0U3RyaW5nLmNoYXJBdChpICsgMikpIDw8IDYpIHwgVXRpbC5kZWNvZGU2NChiNjRTdHJpbmcuY2hhckF0KGkgKyAzKSk7XG5cbiAgICAgIGFyci5wdXNoKCh0bXAgPj4gMTYpICYgMHhGRik7XG4gICAgICBhcnIucHVzaCgodG1wID4+IDgpICYgMHhGRik7XG4gICAgICBhcnIucHVzaCh0bXAgJiAweEZGKTtcbiAgICAgIC8vIEBjb2RpbmdTdGFuZGFyZHNJZ25vcmVFbmRcbiAgICB9XG5cbiAgICBpZiAocGxhY2VIb2xkZXJzKSB7XG4gICAgICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgICAgIC8vIElnbm9yaW5nIGNvZGUgY2hlY2tlciBzdGFuZGFyZHMgKGJpdGV3aXNlIG9wZXJhdG9ycykuXG4gICAgICAgIC8vIEBjb2RpbmdTdGFuZGFyZHNJZ25vcmVTdGFydFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICB0bXAgPSAoVXRpbC5kZWNvZGU2NChiNjRTdHJpbmcuY2hhckF0KGkpKSA8PCAyKSB8IChVdGlsLmRlY29kZTY0KGI2NFN0cmluZy5jaGFyQXQoaSArIDEpKSA+PiA0KTtcbiAgICAgICAgYXJyLnB1c2godG1wICYgMHhGRik7XG4gICAgICB9IGVsc2UgaWYgKHBsYWNlSG9sZGVycyA9PT0gMSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICB0bXAgPSAoVXRpbC5kZWNvZGU2NChiNjRTdHJpbmcuY2hhckF0KGkpKSA8PCAxMCkgfCAoVXRpbC5kZWNvZGU2NChiNjRTdHJpbmcuY2hhckF0KGkgKyAxKSkgPDwgNCkgfCAoVXRpbC5kZWNvZGU2NChiNjRTdHJpbmcuY2hhckF0KGkgKyAyKSkgPj4gMik7XG4gICAgICAgIGFyci5wdXNoKCh0bXAgPj4gOCkgJiAweEZGKTtcbiAgICAgICAgYXJyLnB1c2godG1wICYgMHhGRik7XG4gICAgICAgIC8vIEBjb2RpbmdTdGFuZGFyZHNJZ25vcmVFbmRcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCAzMi1iaXQgc2lnbmVkIGludGVnZXIgZnJvbSBhIGJ5dGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7T2JqZWN0W119IGJ5dGVzIC0gYXJyYXkgb2YgYnl0ZXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSAzMi1iaXQgc2lnbmVkIGludGVnZXIuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyByZWFkSW50MzIoYnl0ZXMpIHtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoIDwgNCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBpbnQzMiA9IGJ5dGVzLnNwbGljZSgwLCA0KTtcbiAgICAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlU3RhcnTCoVxuICAgIHJldHVybiAoaW50MzJbMF0gPDwgMjQgfCBpbnQzMlsxXSA8PCAxNiB8IGludDMyWzJdIDw8IDggfCBpbnQzMlszXSA8PCAwKTtcbiAgICAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlRW5kXG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgZmlyc3QgYnl0ZSBmcm9tIGEgYnl0ZSBhcnJheS5cbiAgICogQHBhcmFtIHtPYmplY3R9IGJ5dGVzIC0gaW5wdXQgYnl0ZSBhcnJheS5cbiAgICogQHJldHVybnMge251bWJlcn0gZmlyc3QgYnl0ZSBvZiB0aGUgYnl0ZSBhcnJheS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlYWRCeXRlKGJ5dGVzKSB7XG4gICAgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZVN0YXJ0XG4gICAgcmV0dXJuIGJ5dGVzLnNoaWZ0KCkgPDwgMDtcbiAgICAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlRW5kXG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJ5dGVzLCBmcm9tIGEgZml4ZWQgcG9zaXRpb24gb24gYSBieXRlIGFycmF5LlxuICAgKiBAcGFyYW0gIHtPYmplY3RbXX0gYnl0ZXMgLSBieXRlIGFycmF5LlxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IHBvcyAtIHN0YXJ0IHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IGxlbiAtIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0W119IHRoZSBieXRlIGFycmF5LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVhZEJ5dGVzKGJ5dGVzLCBwb3MsIGxlbikge1xuICAgIHJldHVybiBieXRlcy5zcGxpY2UocG9zLCBsZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgb3IgbW9kaWZpZXMgZm9ybXVsYXMgb3IgQ0FTIG9uIGEgdGV4dGFyZWEuXG4gICAqIEBwYXJhbSB7SFRNTFRleHRBcmVhRWxlbWVudH0gdGV4dGFyZWEgLSB0ZXh0YXJlYSB0YXJnZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBhZGQgaW4gdGhlIHRleHRhcmVhLiBGb3IgZXhhbXBsZSwgdG8gYWRkIHRoZSBsaW5rIHRvIHRoZSBpbWFnZSxcbiAgICogY2FsbCB0aGlzIGZ1bmN0aW9uIGFzICh0ZXh0YXJlYSwgUGFyc2VyLmNyZWF0ZUltYWdlU3JjKG1hdGhtbCkpO1xuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdXBkYXRlVGV4dEFyZWEodGV4dGFyZWEsIHRleHQpIHtcbiAgICBpZiAodGV4dGFyZWEgJiYgdGV4dCkge1xuICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcblxuICAgICAgaWYgKHRleHRhcmVhLnNlbGVjdGlvblN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb25FbmQgfSA9IHRleHRhcmVhO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25TdGFydCA9IHRleHRhcmVhLnZhbHVlLnN1YnN0cmluZygwLCB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkVuZFN1YiA9IHRleHRhcmVhLnZhbHVlLnN1YnN0cmluZyhzZWxlY3Rpb25FbmQsIHRleHRhcmVhLnZhbHVlLmxlbmd0aCk7XG4gICAgICAgIHRleHRhcmVhLnZhbHVlID0gc2VsZWN0aW9uU3RhcnQgKyB0ZXh0ICsgc2VsZWN0aW9uRW5kU3ViO1xuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQgKyB0ZXh0Lmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBzZWxlY3Rpb24udGV4dCA9IHRleHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGV4aXN0aW5nIGZvcm11bGEgb24gYSB0ZXh0YXJlYS5cbiAgICogQHBhcmFtIHtIVE1MVGV4dEFyZWFFbGVtZW50fSB0ZXh0YXJlYSAtIHRleHQgYXJlYSB0YXJnZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBhZGQgaW4gdGhlIHRleHRhcmVhLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYWRkIHRoZSBsaW5rXG4gICAqIHRvIHRoZSBpbWFnZSx5b3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhc1xuICAgKiBVdGlsLnVwZGF0ZVRleHRhcmVhKHRleHRhcmVhLCBQYXJzZXIuY3JlYXRlSW1hZ2VTcmMobWF0aG1sKSk7XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIGJlZ2lubmluZyBpbmRleCBmcm9tIHRleHRhcmVhIHdoZXJlIGl0IG5lZWRzIHRvIGJlIHJlcGxhY2VkIGJ5IHRleHQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgLSBlbmRpbmcgaW5kZXggZnJvbSB0ZXh0YXJlYSB3aGVyZSBpdCBuZWVkcyB0byBiZSByZXBsYWNlZCBieSB0ZXh0XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1cGRhdGVFeGlzdGluZ1RleHRPblRleHRhcmVhKHRleHRhcmVhLCB0ZXh0LCBzdGFydCwgZW5kKSB7XG4gICAgdGV4dGFyZWEuZm9jdXMoKTtcbiAgICBjb25zdCB0ZXh0YXJlYVN0YXJ0ID0gdGV4dGFyZWEudmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0KTtcbiAgICB0ZXh0YXJlYS52YWx1ZSA9IHRleHRhcmVhU3RhcnQgKyB0ZXh0ICsgdGV4dGFyZWEudmFsdWUuc3Vic3RyaW5nKGVuZCwgdGV4dGFyZWEudmFsdWUubGVuZ3RoKTtcbiAgICB0ZXh0YXJlYS5zZWxlY3Rpb25FbmQgPSBzdGFydCArIHRleHQubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBhcmFtZXRlciB3aXRoIGl0J3MgY29ycmVzcG9uZGVudCB2YWx1ZSB0byBhbiBVUkwgKEdFVCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVVJMIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtZXRlciAtIHBhcmFtZXRlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSB2YWx1ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgYWRkQXJndW1lbnQocGF0aCwgcGFyYW1ldGVyLCB2YWx1ZSkge1xuICAgIGxldCBzZXA7XG4gICAgaWYgKHBhdGguaW5kZXhPZignPycpID4gMCkge1xuICAgICAgc2VwID0gJyYnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXAgPSAnPyc7XG4gICAgfVxuICAgIHJldHVybiBgJHtwYXRoICsgc2VwICsgcGFyYW1ldGVyfT0ke3ZhbHVlfWA7XG4gIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oXCIuL3NyYy9hcHAudHNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|
|
7688
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEIsZ0JBQWdCLFFBQVE7QUFDeEIsZ0JBQWdCLFFBQVE7QUFDeEIsZ0JBQWdCLFNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsd0JBQXdCLHdCQUF3QjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUpBQWlKO0FBQ2pKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RCw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsc0JBQXNCLDhDQUE4QyxhQUFhLGNBQWM7QUFDeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHdCQUF3Qix3QkFBd0I7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlKQUFpSjtBQUNqSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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YUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsY0FBYyx1QkFBdUIsR0FBRyxNQUFNO0FBQzlDO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztVQy9qQ0E7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7O1VFTkE7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4uLy4uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvZGlzdC9wdXJpZnkuanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL3NyYy9hcHAudHMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL3NyYy9sYXRleC50cyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vc3JjL21hdGhtbC50cyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vc3JjL3Byb3BlcnRpZXMudHMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL3NyYy9yZXRyby50cyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vc3JjL3NlcnZpY2VzLnRzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL2FjY2Vzc2liaWxpdHkuanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL2NvbmZpZ3VyYXRpb24uanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvaW1hZ2UuanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL2xhdGV4LmpzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9ub2RlX21vZHVsZXMvQHdpcmlzL21hdGh0eXBlLWh0bWwtaW50ZWdyYXRpb24tZGV2a2l0L3NyYy9saXN0ZW5lcnMuanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL21hdGhtbC5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvbWQ1LmpzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9ub2RlX21vZHVsZXMvQHdpcmlzL21hdGh0eXBlLWh0bWwtaW50ZWdyYXRpb24tZGV2a2l0L3NyYy9wYXJzZXIuanMiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci8uL25vZGVfbW9kdWxlcy9Ad2lyaXMvbWF0aHR5cGUtaHRtbC1pbnRlZ3JhdGlvbi1kZXZraXQvc3JjL3NlcnZpY2Vwcm92aWRlci5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvc3RyaW5nbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyLy4vbm9kZV9tb2R1bGVzL0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvdGV4dGNhY2hlLmpzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvLi9ub2RlX21vZHVsZXMvQHdpcmlzL21hdGh0eXBlLWh0bWwtaW50ZWdyYXRpb24tZGV2a2l0L3NyYy91dGlsLmpzIiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vQHdpcmlzL21hdGh0eXBlLXZpZXdlci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0B3aXJpcy9tYXRodHlwZS12aWV3ZXIvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9Ad2lyaXMvbWF0aHR5cGUtdmlld2VyL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQGxpY2Vuc2UgRE9NUHVyaWZ5IDIuNC43IHwgKGMpIEN1cmU1MyBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwgUmVsZWFzZWQgdW5kZXIgdGhlIEFwYWNoZSBsaWNlbnNlIDIuMCBhbmQgTW96aWxsYSBQdWJsaWMgTGljZW5zZSAyLjAgfCBnaXRodWIuY29tL2N1cmU1My9ET01QdXJpZnkvYmxvYi8yLjQuNy9MSUNFTlNFICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkRPTVB1cmlmeSA9IGZhY3RvcnkoKSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH0sIF90eXBlb2Yob2JqKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgICByZXR1cm4gbztcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICAgIGlmIChDbGFzcykgX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICAgIGlmICghbykgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICAgIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gICAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB9XG5cbiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICAgIHJldHVybiBhcnIyO1xuICB9XG5cbiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG5cbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0Lmhhc093blByb3BlcnR5LFxuICAgICAgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YsXG4gICAgICBpc0Zyb3plbiA9IE9iamVjdC5pc0Zyb3plbixcbiAgICAgIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgdmFyIGZyZWV6ZSA9IE9iamVjdC5mcmVlemUsXG4gICAgICBzZWFsID0gT2JqZWN0LnNlYWwsXG4gICAgICBjcmVhdGUgPSBPYmplY3QuY3JlYXRlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby1tdXRhYmxlLWV4cG9ydHNcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBSZWZsZWN0LFxuICAgICAgYXBwbHkgPSBfcmVmLmFwcGx5LFxuICAgICAgY29uc3RydWN0ID0gX3JlZi5jb25zdHJ1Y3Q7XG5cbiAgaWYgKCFhcHBseSkge1xuICAgIGFwcGx5ID0gZnVuY3Rpb24gYXBwbHkoZnVuLCB0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW4uYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFmcmVlemUpIHtcbiAgICBmcmVlemUgPSBmdW5jdGlvbiBmcmVlemUoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuXG4gIGlmICghc2VhbCkge1xuICAgIHNlYWwgPSBmdW5jdGlvbiBzZWFsKHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH1cblxuICBpZiAoIWNvbnN0cnVjdCkge1xuICAgIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIGNvbnN0cnVjdChGdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gX2NvbnN0cnVjdChGdW5jLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJncykpO1xuICAgIH07XG4gIH1cblxuICB2YXIgYXJyYXlGb3JFYWNoID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG4gIHZhciBhcnJheVBvcCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnBvcCk7XG4gIHZhciBhcnJheVB1c2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbiAgdmFyIHN0cmluZ1RvTG93ZXJDYXNlID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlKTtcbiAgdmFyIHN0cmluZ1RvU3RyaW5nID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nKTtcbiAgdmFyIHN0cmluZ01hdGNoID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLm1hdGNoKTtcbiAgdmFyIHN0cmluZ1JlcGxhY2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG4gIHZhciBzdHJpbmdJbmRleE9mID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLmluZGV4T2YpO1xuICB2YXIgc3RyaW5nVHJpbSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS50cmltKTtcbiAgdmFyIHJlZ0V4cFRlc3QgPSB1bmFwcGx5KFJlZ0V4cC5wcm90b3R5cGUudGVzdCk7XG4gIHZhciB0eXBlRXJyb3JDcmVhdGUgPSB1bmNvbnN0cnVjdChUeXBlRXJyb3IpO1xuICBmdW5jdGlvbiB1bmFwcGx5KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRoaXNBcmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHVuY29uc3RydWN0KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnN0cnVjdChmdW5jLCBhcmdzKTtcbiAgICB9O1xuICB9XG4gIC8qIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbG9va3VwIHRhYmxlICovXG5cbiAgZnVuY3Rpb24gYWRkVG9TZXQoc2V0LCBhcnJheSwgdHJhbnNmb3JtQ2FzZUZ1bmMpIHtcbiAgICB2YXIgX3RyYW5zZm9ybUNhc2VGdW5jO1xuXG4gICAgdHJhbnNmb3JtQ2FzZUZ1bmMgPSAoX3RyYW5zZm9ybUNhc2VGdW5jID0gdHJhbnNmb3JtQ2FzZUZ1bmMpICE9PSBudWxsICYmIF90cmFuc2Zvcm1DYXNlRnVuYyAhPT0gdm9pZCAwID8gX3RyYW5zZm9ybUNhc2VGdW5jIDogc3RyaW5nVG9Mb3dlckNhc2U7XG5cbiAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIC8vIE1ha2UgJ2luJyBhbmQgdHJ1dGh5IGNoZWNrcyBsaWtlIEJvb2xlYW4oc2V0LmNvbnN0cnVjdG9yKVxuICAgICAgLy8gaW5kZXBlbmRlbnQgb2YgYW55IHByb3BlcnRpZXMgZGVmaW5lZCBvbiBPYmplY3QucHJvdG90eXBlLlxuICAgICAgLy8gUHJldmVudCBwcm90b3R5cGUgc2V0dGVycyBmcm9tIGludGVyY2VwdGluZyBzZXQgYXMgYSB0aGlzIHZhbHVlLlxuICAgICAgc2V0UHJvdG90eXBlT2Yoc2V0LCBudWxsKTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlIChsLS0pIHtcbiAgICAgIHZhciBlbGVtZW50ID0gYXJyYXlbbF07XG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGxjRWxlbWVudCA9IHRyYW5zZm9ybUNhc2VGdW5jKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChsY0VsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBDb25maWcgcHJlc2V0cyAoZS5nLiB0YWdzLmpzLCBhdHRycy5qcykgYXJlIGltbXV0YWJsZS5cbiAgICAgICAgICBpZiAoIWlzRnJvemVuKGFycmF5KSkge1xuICAgICAgICAgICAgYXJyYXlbbF0gPSBsY0VsZW1lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudCA9IGxjRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRbZWxlbWVudF0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzZXQ7XG4gIH1cbiAgLyogU2hhbGxvdyBjbG9uZSBhbiBvYmplY3QgKi9cblxuICBmdW5jdGlvbiBjbG9uZShvYmplY3QpIHtcbiAgICB2YXIgbmV3T2JqZWN0ID0gY3JlYXRlKG51bGwpO1xuICAgIHZhciBwcm9wZXJ0eTtcblxuICAgIGZvciAocHJvcGVydHkgaW4gb2JqZWN0KSB7XG4gICAgICBpZiAoYXBwbHkoaGFzT3duUHJvcGVydHksIG9iamVjdCwgW3Byb3BlcnR5XSkgPT09IHRydWUpIHtcbiAgICAgICAgbmV3T2JqZWN0W3Byb3BlcnR5XSA9IG9iamVjdFtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld09iamVjdDtcbiAgfVxuICAvKiBJRTEwIGRvZXNuJ3Qgc3VwcG9ydCBfX2xvb2t1cEdldHRlcl9fIHNvIGxldHMnXG4gICAqIHNpbXVsYXRlIGl0LiBJdCBhbHNvIGF1dG9tYXRpY2FsbHkgY2hlY2tzXG4gICAqIGlmIHRoZSBwcm9wIGlzIGZ1bmN0aW9uIG9yIGdldHRlciBhbmQgYmVoYXZlc1xuICAgKiBhY2NvcmRpbmdseS4gKi9cblxuICBmdW5jdGlvbiBsb29rdXBHZXR0ZXIob2JqZWN0LCBwcm9wKSB7XG4gICAgd2hpbGUgKG9iamVjdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wKTtcblxuICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy5nZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmYWxsYmFja1ZhbHVlKGVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybignZmFsbGJhY2sgdmFsdWUgZm9yJywgZWxlbWVudCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbiAgfVxuXG4gIHZhciBodG1sJDEgPSBmcmVlemUoWydhJywgJ2FiYnInLCAnYWNyb255bScsICdhZGRyZXNzJywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdhdWRpbycsICdiJywgJ2JkaScsICdiZG8nLCAnYmlnJywgJ2JsaW5rJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FudmFzJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NpdGUnLCAnY29kZScsICdjb2wnLCAnY29sZ3JvdXAnLCAnY29udGVudCcsICdkYXRhJywgJ2RhdGFsaXN0JywgJ2RkJywgJ2RlY29yYXRvcicsICdkZWwnLCAnZGV0YWlscycsICdkZm4nLCAnZGlhbG9nJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZWxlbWVudCcsICdlbScsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb250JywgJ2Zvb3RlcicsICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2knLCAnaW1nJywgJ2lucHV0JywgJ2lucycsICdrYmQnLCAnbGFiZWwnLCAnbGVnZW5kJywgJ2xpJywgJ21haW4nLCAnbWFwJywgJ21hcmsnLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGVyJywgJ25hdicsICdub2JyJywgJ29sJywgJ29wdGdyb3VwJywgJ29wdGlvbicsICdvdXRwdXQnLCAncCcsICdwaWN0dXJlJywgJ3ByZScsICdwcm9ncmVzcycsICdxJywgJ3JwJywgJ3J0JywgJ3J1YnknLCAncycsICdzYW1wJywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NoYWRvdycsICdzbWFsbCcsICdzb3VyY2UnLCAnc3BhY2VyJywgJ3NwYW4nLCAnc3RyaWtlJywgJ3N0cm9uZycsICdzdHlsZScsICdzdWInLCAnc3VtbWFyeScsICdzdXAnLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGltZScsICd0cicsICd0cmFjaycsICd0dCcsICd1JywgJ3VsJywgJ3ZhcicsICd2aWRlbycsICd3YnInXSk7IC8vIFNWR1xuXG4gIHZhciBzdmckMSA9IGZyZWV6ZShbJ3N2ZycsICdhJywgJ2FsdGdseXBoJywgJ2FsdGdseXBoZGVmJywgJ2FsdGdseXBoaXRlbScsICdhbmltYXRlY29sb3InLCAnYW5pbWF0ZW1vdGlvbicsICdhbmltYXRldHJhbnNmb3JtJywgJ2NpcmNsZScsICdjbGlwcGF0aCcsICdkZWZzJywgJ2Rlc2MnLCAnZWxsaXBzZScsICdmaWx0ZXInLCAnZm9udCcsICdnJywgJ2dseXBoJywgJ2dseXBocmVmJywgJ2hrZXJuJywgJ2ltYWdlJywgJ2xpbmUnLCAnbGluZWFyZ3JhZGllbnQnLCAnbWFya2VyJywgJ21hc2snLCAnbWV0YWRhdGEnLCAnbXBhdGgnLCAncGF0aCcsICdwYXR0ZXJuJywgJ3BvbHlnb24nLCAncG9seWxpbmUnLCAncmFkaWFsZ3JhZGllbnQnLCAncmVjdCcsICdzdG9wJywgJ3N0eWxlJywgJ3N3aXRjaCcsICdzeW1ib2wnLCAndGV4dCcsICd0ZXh0cGF0aCcsICd0aXRsZScsICd0cmVmJywgJ3RzcGFuJywgJ3ZpZXcnLCAndmtlcm4nXSk7XG4gIHZhciBzdmdGaWx0ZXJzID0gZnJlZXplKFsnZmVCbGVuZCcsICdmZUNvbG9yTWF0cml4JywgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLCAnZmVDb21wb3NpdGUnLCAnZmVDb252b2x2ZU1hdHJpeCcsICdmZURpZmZ1c2VMaWdodGluZycsICdmZURpc3BsYWNlbWVudE1hcCcsICdmZURpc3RhbnRMaWdodCcsICdmZUZsb29kJywgJ2ZlRnVuY0EnLCAnZmVGdW5jQicsICdmZUZ1bmNHJywgJ2ZlRnVuY1InLCAnZmVHYXVzc2lhbkJsdXInLCAnZmVJbWFnZScsICdmZU1lcmdlJywgJ2ZlTWVyZ2VOb2RlJywgJ2ZlTW9ycGhvbG9neScsICdmZU9mZnNldCcsICdmZVBvaW50TGlnaHQnLCAnZmVTcGVjdWxhckxpZ2h0aW5nJywgJ2ZlU3BvdExpZ2h0JywgJ2ZlVGlsZScsICdmZVR1cmJ1bGVuY2UnXSk7IC8vIExpc3Qgb2YgU1ZHIGVsZW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgYnkgZGVmYXVsdC5cbiAgLy8gV2Ugc3RpbGwgbmVlZCB0byBrbm93IHRoZW0gc28gdGhhdCB3ZSBjYW4gZG8gbmFtZXNwYWNlXG4gIC8vIGNoZWNrcyBwcm9wZXJseSBpbiBjYXNlIG9uZSB3YW50cyB0byBhZGQgdGhlbSB0b1xuICAvLyBhbGxvdy1saXN0LlxuXG4gIHZhciBzdmdEaXNhbGxvd2VkID0gZnJlZXplKFsnYW5pbWF0ZScsICdjb2xvci1wcm9maWxlJywgJ2N1cnNvcicsICdkaXNjYXJkJywgJ2ZlZHJvcHNoYWRvdycsICdmb250LWZhY2UnLCAnZm9udC1mYWNlLWZvcm1hdCcsICdmb250LWZhY2UtbmFtZScsICdmb250LWZhY2Utc3JjJywgJ2ZvbnQtZmFjZS11cmknLCAnZm9yZWlnbm9iamVjdCcsICdoYXRjaCcsICdoYXRjaHBhdGgnLCAnbWVzaCcsICdtZXNoZ3JhZGllbnQnLCAnbWVzaHBhdGNoJywgJ21lc2hyb3cnLCAnbWlzc2luZy1nbHlwaCcsICdzY3JpcHQnLCAnc2V0JywgJ3NvbGlkY29sb3InLCAndW5rbm93bicsICd1c2UnXSk7XG4gIHZhciBtYXRoTWwkMSA9IGZyZWV6ZShbJ21hdGgnLCAnbWVuY2xvc2UnLCAnbWVycm9yJywgJ21mZW5jZWQnLCAnbWZyYWMnLCAnbWdseXBoJywgJ21pJywgJ21sYWJlbGVkdHInLCAnbW11bHRpc2NyaXB0cycsICdtbicsICdtbycsICdtb3ZlcicsICdtcGFkZGVkJywgJ21waGFudG9tJywgJ21yb290JywgJ21yb3cnLCAnbXMnLCAnbXNwYWNlJywgJ21zcXJ0JywgJ21zdHlsZScsICdtc3ViJywgJ21zdXAnLCAnbXN1YnN1cCcsICdtdGFibGUnLCAnbXRkJywgJ210ZXh0JywgJ210cicsICdtdW5kZXInLCAnbXVuZGVyb3ZlciddKTsgLy8gU2ltaWxhcmx5IHRvIFNWRywgd2Ugd2FudCB0byBrbm93IGFsbCBNYXRoTUwgZWxlbWVudHMsXG4gIC8vIGV2ZW4gdGhvc2UgdGhhdCB3ZSBkaXNhbGxvdyBieSBkZWZhdWx0LlxuXG4gIHZhciBtYXRoTWxEaXNhbGxvd2VkID0gZnJlZXplKFsnbWFjdGlvbicsICdtYWxpZ25ncm91cCcsICdtYWxpZ25tYXJrJywgJ21sb25nZGl2JywgJ21zY2FycmllcycsICdtc2NhcnJ5JywgJ21zZ3JvdXAnLCAnbXN0YWNrJywgJ21zbGluZScsICdtc3JvdycsICdzZW1hbnRpY3MnLCAnYW5ub3RhdGlvbicsICdhbm5vdGF0aW9uLXhtbCcsICdtcHJlc2NyaXB0cycsICdub25lJ10pO1xuICB2YXIgdGV4dCA9IGZyZWV6ZShbJyN0ZXh0J10pO1xuXG4gIHZhciBodG1sID0gZnJlZXplKFsnYWNjZXB0JywgJ2FjdGlvbicsICdhbGlnbicsICdhbHQnLCAnYXV0b2NhcGl0YWxpemUnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9waWN0dXJlaW5waWN0dXJlJywgJ2F1dG9wbGF5JywgJ2JhY2tncm91bmQnLCAnYmdjb2xvcicsICdib3JkZXInLCAnY2FwdHVyZScsICdjZWxscGFkZGluZycsICdjZWxsc3BhY2luZycsICdjaGVja2VkJywgJ2NpdGUnLCAnY2xhc3MnLCAnY2xlYXInLCAnY29sb3InLCAnY29scycsICdjb2xzcGFuJywgJ2NvbnRyb2xzJywgJ2NvbnRyb2xzbGlzdCcsICdjb29yZHMnLCAnY3Jvc3NvcmlnaW4nLCAnZGF0ZXRpbWUnLCAnZGVjb2RpbmcnLCAnZGVmYXVsdCcsICdkaXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnLCAnZGlzYWJsZXJlbW90ZXBsYXliYWNrJywgJ2Rvd25sb2FkJywgJ2RyYWdnYWJsZScsICdlbmN0eXBlJywgJ2VudGVya2V5aGludCcsICdmYWNlJywgJ2ZvcicsICdoZWFkZXJzJywgJ2hlaWdodCcsICdoaWRkZW4nLCAnaGlnaCcsICdocmVmJywgJ2hyZWZsYW5nJywgJ2lkJywgJ2lucHV0bW9kZScsICdpbnRlZ3JpdHknLCAnaXNtYXAnLCAna2luZCcsICdsYWJlbCcsICdsYW5nJywgJ2xpc3QnLCAnbG9hZGluZycsICdsb29wJywgJ2xvdycsICdtYXgnLCAnbWF4bGVuZ3RoJywgJ21lZGlhJywgJ21ldGhvZCcsICdtaW4nLCAnbWlubGVuZ3RoJywgJ211bHRpcGxlJywgJ211dGVkJywgJ25hbWUnLCAnbm9uY2UnLCAnbm9zaGFkZScsICdub3ZhbGlkYXRlJywgJ25vd3JhcCcsICdvcGVuJywgJ29wdGltdW0nLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdwbGF5c2lubGluZScsICdwb3N0ZXInLCAncHJlbG9hZCcsICdwdWJkYXRlJywgJ3JhZGlvZ3JvdXAnLCAncmVhZG9ubHknLCAncmVsJywgJ3JlcXVpcmVkJywgJ3JldicsICdyZXZlcnNlZCcsICdyb2xlJywgJ3Jvd3MnLCAncm93c3BhbicsICdzcGVsbGNoZWNrJywgJ3Njb3BlJywgJ3NlbGVjdGVkJywgJ3NoYXBlJywgJ3NpemUnLCAnc2l6ZXMnLCAnc3BhbicsICdzcmNsYW5nJywgJ3N0YXJ0JywgJ3NyYycsICdzcmNzZXQnLCAnc3RlcCcsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmluZGV4JywgJ3RpdGxlJywgJ3RyYW5zbGF0ZScsICd0eXBlJywgJ3VzZW1hcCcsICd2YWxpZ24nLCAndmFsdWUnLCAnd2lkdGgnLCAneG1sbnMnLCAnc2xvdCddKTtcbiAgdmFyIHN2ZyA9IGZyZWV6ZShbJ2FjY2VudC1oZWlnaHQnLCAnYWNjdW11bGF0ZScsICdhZGRpdGl2ZScsICdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnYXNjZW50JywgJ2F0dHJpYnV0ZW5hbWUnLCAnYXR0cmlidXRldHlwZScsICdhemltdXRoJywgJ2Jhc2VmcmVxdWVuY3knLCAnYmFzZWxpbmUtc2hpZnQnLCAnYmVnaW4nLCAnYmlhcycsICdieScsICdjbGFzcycsICdjbGlwJywgJ2NsaXBwYXRodW5pdHMnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvcicsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdjeCcsICdjeScsICdkJywgJ2R4JywgJ2R5JywgJ2RpZmZ1c2Vjb25zdGFudCcsICdkaXJlY3Rpb24nLCAnZGlzcGxheScsICdkaXZpc29yJywgJ2R1cicsICdlZGdlbW9kZScsICdlbGV2YXRpb24nLCAnZW5kJywgJ2ZpbGwnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmaWx0ZXInLCAnZmlsdGVydW5pdHMnLCAnZmxvb2QtY29sb3InLCAnZmxvb2Qtb3BhY2l0eScsICdmb250LWZhbWlseScsICdmb250LXNpemUnLCAnZm9udC1zaXplLWFkanVzdCcsICdmb250LXN0cmV0Y2gnLCAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnZngnLCAnZnknLCAnZzEnLCAnZzInLCAnZ2x5cGgtbmFtZScsICdnbHlwaHJlZicsICdncmFkaWVudHVuaXRzJywgJ2dyYWRpZW50dHJhbnNmb3JtJywgJ2hlaWdodCcsICdocmVmJywgJ2lkJywgJ2ltYWdlLXJlbmRlcmluZycsICdpbicsICdpbjInLCAnaycsICdrMScsICdrMicsICdrMycsICdrNCcsICdrZXJuaW5nJywgJ2tleXBvaW50cycsICdrZXlzcGxpbmVzJywgJ2tleXRpbWVzJywgJ2xhbmcnLCAnbGVuZ3RoYWRqdXN0JywgJ2xldHRlci1zcGFjaW5nJywgJ2tlcm5lbG1hdHJpeCcsICdrZXJuZWx1bml0bGVuZ3RoJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ2xvY2FsJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnbWFya2VyaGVpZ2h0JywgJ21hcmtlcnVuaXRzJywgJ21hcmtlcndpZHRoJywgJ21hc2tjb250ZW50dW5pdHMnLCAnbWFza3VuaXRzJywgJ21heCcsICdtYXNrJywgJ21lZGlhJywgJ21ldGhvZCcsICdtb2RlJywgJ21pbicsICduYW1lJywgJ251bW9jdGF2ZXMnLCAnb2Zmc2V0JywgJ29wZXJhdG9yJywgJ29wYWNpdHknLCAnb3JkZXInLCAnb3JpZW50JywgJ29yaWVudGF0aW9uJywgJ29yaWdpbicsICdvdmVyZmxvdycsICdwYWludC1vcmRlcicsICdwYXRoJywgJ3BhdGhsZW5ndGgnLCAncGF0dGVybmNvbnRlbnR1bml0cycsICdwYXR0ZXJudHJhbnNmb3JtJywgJ3BhdHRlcm51bml0cycsICdwb2ludHMnLCAncHJlc2VydmVhbHBoYScsICdwcmVzZXJ2ZWFzcGVjdHJhdGlvJywgJ3ByaW1pdGl2ZXVuaXRzJywgJ3InLCAncngnLCAncnknLCAncmFkaXVzJywgJ3JlZngnLCAncmVmeScsICdyZXBlYXRjb3VudCcsICdyZXBlYXRkdXInLCAncmVzdGFydCcsICdyZXN1bHQnLCAncm90YXRlJywgJ3NjYWxlJywgJ3NlZWQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3NwZWN1bGFyY29uc3RhbnQnLCAnc3BlY3VsYXJleHBvbmVudCcsICdzcHJlYWRtZXRob2QnLCAnc3RhcnRvZmZzZXQnLCAnc3RkZGV2aWF0aW9uJywgJ3N0aXRjaHRpbGVzJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cm9rZS1kYXNoYXJyYXknLCAnc3Ryb2tlLWRhc2hvZmZzZXQnLCAnc3Ryb2tlLWxpbmVjYXAnLCAnc3Ryb2tlLWxpbmVqb2luJywgJ3N0cm9rZS1taXRlcmxpbWl0JywgJ3N0cm9rZS1vcGFjaXR5JywgJ3N0cm9rZScsICdzdHJva2Utd2lkdGgnLCAnc3R5bGUnLCAnc3VyZmFjZXNjYWxlJywgJ3N5c3RlbWxhbmd1YWdlJywgJ3RhYmluZGV4JywgJ3RhcmdldHgnLCAndGFyZ2V0eScsICd0cmFuc2Zvcm0nLCAndHJhbnNmb3JtLW9yaWdpbicsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndGV4dGxlbmd0aCcsICd0eXBlJywgJ3UxJywgJ3UyJywgJ3VuaWNvZGUnLCAndmFsdWVzJywgJ3ZpZXdib3gnLCAndmlzaWJpbGl0eScsICd2ZXJzaW9uJywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dpZHRoJywgJ3dvcmQtc3BhY2luZycsICd3cmFwJywgJ3dyaXRpbmctbW9kZScsICd4Y2hhbm5lbHNlbGVjdG9yJywgJ3ljaGFubmVsc2VsZWN0b3InLCAneCcsICd4MScsICd4MicsICd4bWxucycsICd5JywgJ3kxJywgJ3kyJywgJ3onLCAnem9vbWFuZHBhbiddKTtcbiAgdmFyIG1hdGhNbCA9IGZyZWV6ZShbJ2FjY2VudCcsICdhY2NlbnR1bmRlcicsICdhbGlnbicsICdiZXZlbGxlZCcsICdjbG9zZScsICdjb2x1bW5zYWxpZ24nLCAnY29sdW1ubGluZXMnLCAnY29sdW1uc3BhbicsICdkZW5vbWFsaWduJywgJ2RlcHRoJywgJ2RpcicsICdkaXNwbGF5JywgJ2Rpc3BsYXlzdHlsZScsICdlbmNvZGluZycsICdmZW5jZScsICdmcmFtZScsICdoZWlnaHQnLCAnaHJlZicsICdpZCcsICdsYXJnZW9wJywgJ2xlbmd0aCcsICdsaW5ldGhpY2tuZXNzJywgJ2xzcGFjZScsICdscXVvdGUnLCAnbWF0aGJhY2tncm91bmQnLCAnbWF0aGNvbG9yJywgJ21hdGhzaXplJywgJ21hdGh2YXJpYW50JywgJ21heHNpemUnLCAnbWluc2l6ZScsICdtb3ZhYmxlbGltaXRzJywgJ25vdGF0aW9uJywgJ251bWFsaWduJywgJ29wZW4nLCAncm93YWxpZ24nLCAncm93bGluZXMnLCAncm93c3BhY2luZycsICdyb3dzcGFuJywgJ3JzcGFjZScsICdycXVvdGUnLCAnc2NyaXB0bGV2ZWwnLCAnc2NyaXB0bWluc2l6ZScsICdzY3JpcHRzaXplbXVsdGlwbGllcicsICdzZWxlY3Rpb24nLCAnc2VwYXJhdG9yJywgJ3NlcGFyYXRvcnMnLCAnc3RyZXRjaHknLCAnc3Vic2NyaXB0c2hpZnQnLCAnc3Vwc2NyaXB0c2hpZnQnLCAnc3ltbWV0cmljJywgJ3ZvZmZzZXQnLCAnd2lkdGgnLCAneG1sbnMnXSk7XG4gIHZhciB4bWwgPSBmcmVlemUoWyd4bGluazpocmVmJywgJ3htbDppZCcsICd4bGluazp0aXRsZScsICd4bWw6c3BhY2UnLCAneG1sbnM6eGxpbmsnXSk7XG5cbiAgdmFyIE1VU1RBQ0hFX0VYUFIgPSBzZWFsKC9cXHtcXHtbXFx3XFxXXSp8W1xcd1xcV10qXFx9XFx9L2dtKTsgLy8gU3BlY2lmeSB0ZW1wbGF0ZSBkZXRlY3Rpb24gcmVnZXggZm9yIFNBRkVfRk9SX1RFTVBMQVRFUyBtb2RlXG5cbiAgdmFyIEVSQl9FWFBSID0gc2VhbCgvPCVbXFx3XFxXXSp8W1xcd1xcV10qJT4vZ20pO1xuICB2YXIgVE1QTElUX0VYUFIgPSBzZWFsKC9cXCR7W1xcd1xcV10qfS9nbSk7XG4gIHZhciBEQVRBX0FUVFIgPSBzZWFsKC9eZGF0YS1bXFwtXFx3LlxcdTAwQjctXFx1RkZGRl0vKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuXG4gIHZhciBBUklBX0FUVFIgPSBzZWFsKC9eYXJpYS1bXFwtXFx3XSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcblxuICB2YXIgSVNfQUxMT1dFRF9VUkkgPSBzZWFsKC9eKD86KD86KD86ZnxodCl0cHM/fG1haWx0b3x0ZWx8Y2FsbHRvfGNpZHx4bXBwKTp8W15hLXpdfFthLXorLlxcLV0rKD86W15hLXorLlxcLTpdfCQpKS9pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgKTtcbiAgdmFyIElTX1NDUklQVF9PUl9EQVRBID0gc2VhbCgvXig/OlxcdytzY3JpcHR8ZGF0YSk6L2kpO1xuICB2YXIgQVRUUl9XSElURVNQQUNFID0gc2VhbCgvW1xcdTAwMDAtXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MTgwRVxcdTIwMDAtXFx1MjAyOVxcdTIwNUZcXHUzMDAwXS9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuICApO1xuICB2YXIgRE9DVFlQRV9OQU1FID0gc2VhbCgvXmh0bWwkL2kpO1xuXG4gIHZhciBnZXRHbG9iYWwgPSBmdW5jdGlvbiBnZXRHbG9iYWwoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdztcbiAgfTtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuby1vcCBwb2xpY3kgZm9yIGludGVybmFsIHVzZSBvbmx5LlxuICAgKiBEb24ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIVxuICAgKiBAcGFyYW0gez9UcnVzdGVkVHlwZVBvbGljeUZhY3Rvcnl9IHRydXN0ZWRUeXBlcyBUaGUgcG9saWN5IGZhY3RvcnkuXG4gICAqIEBwYXJhbSB7RG9jdW1lbnR9IGRvY3VtZW50IFRoZSBkb2N1bWVudCBvYmplY3QgKHRvIGRldGVybWluZSBwb2xpY3kgbmFtZSBzdWZmaXgpXG4gICAqIEByZXR1cm4gez9UcnVzdGVkVHlwZVBvbGljeX0gVGhlIHBvbGljeSBjcmVhdGVkIChvciBudWxsLCBpZiBUcnVzdGVkIFR5cGVzXG4gICAqIGFyZSBub3Qgc3VwcG9ydGVkKS5cbiAgICovXG5cblxuICB2YXIgX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSA9IGZ1bmN0aW9uIF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kodHJ1c3RlZFR5cGVzLCBkb2N1bWVudCkge1xuICAgIGlmIChfdHlwZW9mKHRydXN0ZWRUeXBlcykgIT09ICdvYmplY3QnIHx8IHR5cGVvZiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIEFsbG93IHRoZSBjYWxsZXJzIHRvIGNvbnRyb2wgdGhlIHVuaXF1ZSBwb2xpY3kgbmFtZVxuICAgIC8vIGJ5IGFkZGluZyBhIGRhdGEtdHQtcG9saWN5LXN1ZmZpeCB0byB0aGUgc2NyaXB0IGVsZW1lbnQgd2l0aCB0aGUgRE9NUHVyaWZ5LlxuICAgIC8vIFBvbGljeSBjcmVhdGlvbiB3aXRoIGR1cGxpY2F0ZSBuYW1lcyB0aHJvd3MgaW4gVHJ1c3RlZCBUeXBlcy5cblxuXG4gICAgdmFyIHN1ZmZpeCA9IG51bGw7XG4gICAgdmFyIEFUVFJfTkFNRSA9ICdkYXRhLXR0LXBvbGljeS1zdWZmaXgnO1xuXG4gICAgaWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSkge1xuICAgICAgc3VmZml4ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTtcbiAgICB9XG5cbiAgICB2YXIgcG9saWN5TmFtZSA9ICdkb21wdXJpZnknICsgKHN1ZmZpeCA/ICcjJyArIHN1ZmZpeCA6ICcnKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeShwb2xpY3lOYW1lLCB7XG4gICAgICAgIGNyZWF0ZUhUTUw6IGZ1bmN0aW9uIGNyZWF0ZUhUTUwoaHRtbCkge1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVTY3JpcHRVUkw6IGZ1bmN0aW9uIGNyZWF0ZVNjcmlwdFVSTChzY3JpcHRVcmwpIHtcbiAgICAgICAgICByZXR1cm4gc2NyaXB0VXJsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvLyBQb2xpY3kgY3JlYXRpb24gZmFpbGVkIChtb3N0IGxpa2VseSBhbm90aGVyIERPTVB1cmlmeSBzY3JpcHQgaGFzXG4gICAgICAvLyBhbHJlYWR5IHJ1bikuIFNraXAgY3JlYXRpbmcgdGhlIHBvbGljeSwgYXMgdGhpcyB3aWxsIG9ubHkgY2F1c2UgZXJyb3JzXG4gICAgICAvLyBpZiBUVCBhcmUgZW5mb3JjZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1RydXN0ZWRUeXBlcyBwb2xpY3kgJyArIHBvbGljeU5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZURPTVB1cmlmeSgpIHtcbiAgICB2YXIgd2luZG93ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBnZXRHbG9iYWwoKTtcblxuICAgIHZhciBET01QdXJpZnkgPSBmdW5jdGlvbiBET01QdXJpZnkocm9vdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZURPTVB1cmlmeShyb290KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFZlcnNpb24gbGFiZWwsIGV4cG9zZWQgZm9yIGVhc2llciBjaGVja3NcbiAgICAgKiBpZiBET01QdXJpZnkgaXMgdXAgdG8gZGF0ZSBvciBub3RcbiAgICAgKi9cblxuXG4gICAgRE9NUHVyaWZ5LnZlcnNpb24gPSAnMi40LjcnO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgRE9NUHVyaWZ5IHJlbW92ZWQgZHVyaW5nIHNhbml0YXRpb24uXG4gICAgICogRW1wdHkgaWYgbm90aGluZyB3YXMgcmVtb3ZlZC5cbiAgICAgKi9cblxuICAgIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgICBpZiAoIXdpbmRvdyB8fCAhd2luZG93LmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudC5ub2RlVHlwZSAhPT0gOSkge1xuICAgICAgLy8gTm90IHJ1bm5pbmcgaW4gYSBicm93c2VyLCBwcm92aWRlIGEgZmFjdG9yeSBmdW5jdGlvblxuICAgICAgLy8gc28gdGhhdCB5b3UgY2FuIHBhc3MgeW91ciBvd24gV2luZG93XG4gICAgICBET01QdXJpZnkuaXNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiBET01QdXJpZnk7XG4gICAgfVxuXG4gICAgdmFyIG9yaWdpbmFsRG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuICAgIHZhciBEb2N1bWVudEZyYWdtZW50ID0gd2luZG93LkRvY3VtZW50RnJhZ21lbnQsXG4gICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQgPSB3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgTm9kZSA9IHdpbmRvdy5Ob2RlLFxuICAgICAgICBFbGVtZW50ID0gd2luZG93LkVsZW1lbnQsXG4gICAgICAgIE5vZGVGaWx0ZXIgPSB3aW5kb3cuTm9kZUZpbHRlcixcbiAgICAgICAgX3dpbmRvdyROYW1lZE5vZGVNYXAgPSB3aW5kb3cuTmFtZWROb2RlTWFwLFxuICAgICAgICBOYW1lZE5vZGVNYXAgPSBfd2luZG93JE5hbWVkTm9kZU1hcCA9PT0gdm9pZCAwID8gd2luZG93Lk5hbWVkTm9kZU1hcCB8fCB3aW5kb3cuTW96TmFtZWRBdHRyTWFwIDogX3dpbmRvdyROYW1lZE5vZGVNYXAsXG4gICAgICAgIEhUTUxGb3JtRWxlbWVudCA9IHdpbmRvdy5IVE1MRm9ybUVsZW1lbnQsXG4gICAgICAgIERPTVBhcnNlciA9IHdpbmRvdy5ET01QYXJzZXIsXG4gICAgICAgIHRydXN0ZWRUeXBlcyA9IHdpbmRvdy50cnVzdGVkVHlwZXM7XG4gICAgdmFyIEVsZW1lbnRQcm90b3R5cGUgPSBFbGVtZW50LnByb3RvdHlwZTtcbiAgICB2YXIgY2xvbmVOb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjbG9uZU5vZGUnKTtcbiAgICB2YXIgZ2V0TmV4dFNpYmxpbmcgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ25leHRTaWJsaW5nJyk7XG4gICAgdmFyIGdldENoaWxkTm9kZXMgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2NoaWxkTm9kZXMnKTtcbiAgICB2YXIgZ2V0UGFyZW50Tm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAncGFyZW50Tm9kZScpOyAvLyBBcyBwZXIgaXNzdWUgIzQ3LCB0aGUgd2ViLWNvbXBvbmVudHMgcmVnaXN0cnkgaXMgaW5oZXJpdGVkIGJ5IGFcbiAgICAvLyBuZXcgZG9jdW1lbnQgY3JlYXRlZCB2aWEgY3JlYXRlSFRNTERvY3VtZW50LiBBcyBwZXIgdGhlIHNwZWNcbiAgICAvLyAoaHR0cDovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3JlYXRpbmctYW5kLXBhc3NpbmctcmVnaXN0cmllcylcbiAgICAvLyBhIG5ldyBlbXB0eSByZWdpc3RyeSBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0ZW1wbGF0ZSBjb250ZW50cyBvd25lclxuICAgIC8vIGRvY3VtZW50LCBzbyB3ZSB1c2UgdGhhdCBhcyBvdXIgcGFyZW50IGRvY3VtZW50IHRvIGVuc3VyZSBub3RoaW5nXG4gICAgLy8gaXMgaW5oZXJpdGVkLlxuXG4gICAgaWYgKHR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuXG4gICAgICBpZiAodGVtcGxhdGUuY29udGVudCAmJiB0ZW1wbGF0ZS5jb250ZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgZG9jdW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRydXN0ZWRUeXBlc1BvbGljeSA9IF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kodHJ1c3RlZFR5cGVzLCBvcmlnaW5hbERvY3VtZW50KTtcblxuICAgIHZhciBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCgnJykgOiAnJztcbiAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsXG4gICAgICAgIGltcGxlbWVudGF0aW9uID0gX2RvY3VtZW50LmltcGxlbWVudGF0aW9uLFxuICAgICAgICBjcmVhdGVOb2RlSXRlcmF0b3IgPSBfZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gX2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQsXG4gICAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lID0gX2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lO1xuICAgIHZhciBpbXBvcnROb2RlID0gb3JpZ2luYWxEb2N1bWVudC5pbXBvcnROb2RlO1xuICAgIHZhciBkb2N1bWVudE1vZGUgPSB7fTtcblxuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudE1vZGUgPSBjbG9uZShkb2N1bWVudCkuZG9jdW1lbnRNb2RlID8gZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDoge307XG4gICAgfSBjYXRjaCAoXykge31cblxuICAgIHZhciBob29rcyA9IHt9O1xuICAgIC8qKlxuICAgICAqIEV4cG9zZSB3aGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyBydW5uaW5nIHRoZSBmdWxsIERPTVB1cmlmeS5cbiAgICAgKi9cblxuICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IHR5cGVvZiBnZXRQYXJlbnROb2RlID09PSAnZnVuY3Rpb24nICYmIGltcGxlbWVudGF0aW9uICYmIGltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCAhPT0gdW5kZWZpbmVkICYmIGRvY3VtZW50TW9kZSAhPT0gOTtcbiAgICB2YXIgTVVTVEFDSEVfRVhQUiQxID0gTVVTVEFDSEVfRVhQUixcbiAgICAgICAgRVJCX0VYUFIkMSA9IEVSQl9FWFBSLFxuICAgICAgICBUTVBMSVRfRVhQUiQxID0gVE1QTElUX0VYUFIsXG4gICAgICAgIERBVEFfQVRUUiQxID0gREFUQV9BVFRSLFxuICAgICAgICBBUklBX0FUVFIkMSA9IEFSSUFfQVRUUixcbiAgICAgICAgSVNfU0NSSVBUX09SX0RBVEEkMSA9IElTX1NDUklQVF9PUl9EQVRBLFxuICAgICAgICBBVFRSX1dISVRFU1BBQ0UkMSA9IEFUVFJfV0hJVEVTUEFDRTtcbiAgICB2YXIgSVNfQUxMT1dFRF9VUkkkMSA9IElTX0FMTE9XRURfVVJJO1xuICAgIC8qKlxuICAgICAqIFdlIGNvbnNpZGVyIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBiZWxvdyB0byBiZSBzYWZlLiBJZGVhbGx5XG4gICAgICogZG9uJ3QgYWRkIGFueSBuZXcgb25lcyBidXQgZmVlbCBmcmVlIHRvIHJlbW92ZSB1bndhbnRlZCBvbmVzLlxuICAgICAqL1xuXG4gICAgLyogYWxsb3dlZCBlbGVtZW50IG5hbWVzICovXG5cbiAgICB2YXIgQUxMT1dFRF9UQUdTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX1RBR1MgPSBhZGRUb1NldCh7fSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShodG1sJDEpLCBfdG9Db25zdW1hYmxlQXJyYXkoc3ZnJDEpLCBfdG9Db25zdW1hYmxlQXJyYXkoc3ZnRmlsdGVycyksIF90b0NvbnN1bWFibGVBcnJheShtYXRoTWwkMSksIF90b0NvbnN1bWFibGVBcnJheSh0ZXh0KSkpO1xuICAgIC8qIEFsbG93ZWQgYXR0cmlidXRlIG5hbWVzICovXG5cbiAgICB2YXIgQUxMT1dFRF9BVFRSID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX0FUVFIgPSBhZGRUb1NldCh7fSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShodG1sKSwgX3RvQ29uc3VtYWJsZUFycmF5KHN2ZyksIF90b0NvbnN1bWFibGVBcnJheShtYXRoTWwpLCBfdG9Db25zdW1hYmxlQXJyYXkoeG1sKSkpO1xuICAgIC8qXG4gICAgICogQ29uZmlndXJlIGhvdyBET01QVXJpZnkgc2hvdWxkIGhhbmRsZSBjdXN0b20gZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyBjdXN0b21pemVkIGJ1aWx0LWluIGVsZW1lbnRzLlxuICAgICAqIEBwcm9wZXJ0eSB7UmVnRXhwfEZ1bmN0aW9ufG51bGx9IHRhZ05hbWVDaGVjayBvbmUgb2YgW251bGwsIHJlZ2V4UGF0dGVybiwgcHJlZGljYXRlXS4gRGVmYXVsdDogYG51bGxgIChkaXNhbGxvdyBhbnkgY3VzdG9tIGVsZW1lbnRzKVxuICAgICAqIEBwcm9wZXJ0eSB7UmVnRXhwfEZ1bmN0aW9ufG51bGx9IGF0dHJpYnV0ZU5hbWVDaGVjayBvbmUgb2YgW251bGwsIHJlZ2V4UGF0dGVybiwgcHJlZGljYXRlXS4gRGVmYXVsdDogYG51bGxgIChkaXNhbGxvdyBhbnkgYXR0cmlidXRlcyBub3Qgb24gdGhlIGFsbG93IGxpc3QpXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgYWxsb3cgY3VzdG9tIGVsZW1lbnRzIGRlcml2ZWQgZnJvbSBidWlsdC1pbnMgaWYgdGhleSBwYXNzIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjay4gRGVmYXVsdDogYGZhbHNlYC5cbiAgICAgKi9cblxuICAgIHZhciBDVVNUT01fRUxFTUVOVF9IQU5ETElORyA9IE9iamVjdC5zZWFsKE9iamVjdC5jcmVhdGUobnVsbCwge1xuICAgICAgdGFnTmFtZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgIH0sXG4gICAgICBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgfVxuICAgIH0pKTtcbiAgICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiB0YWdzIChvdmVycmlkZXMgQUxMT1dFRF9UQUdTL0FERF9UQUdTKSAqL1xuXG4gICAgdmFyIEZPUkJJRF9UQUdTID0gbnVsbDtcbiAgICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiBhdHRyaWJ1dGVzIChvdmVycmlkZXMgQUxMT1dFRF9BVFRSL0FERF9BVFRSKSAqL1xuXG4gICAgdmFyIEZPUkJJRF9BVFRSID0gbnVsbDtcbiAgICAvKiBEZWNpZGUgaWYgQVJJQSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG5cbiAgICB2YXIgQUxMT1dfQVJJQV9BVFRSID0gdHJ1ZTtcbiAgICAvKiBEZWNpZGUgaWYgY3VzdG9tIGRhdGEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuXG4gICAgdmFyIEFMTE9XX0RBVEFfQVRUUiA9IHRydWU7XG4gICAgLyogRGVjaWRlIGlmIHVua25vd24gcHJvdG9jb2xzIGFyZSBva2F5ICovXG5cbiAgICB2YXIgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgPSBmYWxzZTtcbiAgICAvKiBEZWNpZGUgaWYgc2VsZi1jbG9zaW5nIHRhZ3MgaW4gYXR0cmlidXRlcyBhcmUgYWxsb3dlZC5cbiAgICAgKiBVc3VhbGx5IHJlbW92ZWQgZHVlIHRvIGEgbVhTUyBpc3N1ZSBpbiBqUXVlcnkgMy4wICovXG5cbiAgICB2YXIgQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSID0gdHJ1ZTtcbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIHNhZmUgZm9yIGNvbW1vbiB0ZW1wbGF0ZSBlbmdpbmVzLlxuICAgICAqIFRoaXMgbWVhbnMsIERPTVB1cmlmeSByZW1vdmVzIGRhdGEgYXR0cmlidXRlcywgbXVzdGFjaGVzIGFuZCBFUkJcbiAgICAgKi9cblxuICAgIHZhciBTQUZFX0ZPUl9URU1QTEFURVMgPSBmYWxzZTtcbiAgICAvKiBEZWNpZGUgaWYgZG9jdW1lbnQgd2l0aCA8aHRtbD4uLi4gc2hvdWxkIGJlIHJldHVybmVkICovXG5cbiAgICB2YXIgV0hPTEVfRE9DVU1FTlQgPSBmYWxzZTtcbiAgICAvKiBUcmFjayB3aGV0aGVyIGNvbmZpZyBpcyBhbHJlYWR5IHNldCBvbiB0aGlzIGluc3RhbmNlIG9mIERPTVB1cmlmeS4gKi9cblxuICAgIHZhciBTRVRfQ09ORklHID0gZmFsc2U7XG4gICAgLyogRGVjaWRlIGlmIGFsbCBlbGVtZW50cyAoZS5nLiBzdHlsZSwgc2NyaXB0KSBtdXN0IGJlIGNoaWxkcmVuIG9mXG4gICAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cblxuICAgIHZhciBGT1JDRV9CT0RZID0gZmFsc2U7XG4gICAgLyogRGVjaWRlIGlmIGEgRE9NIGBIVE1MQm9keUVsZW1lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICAgKiBzdHJpbmcgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkuXG4gICAgICogSWYgYFdIT0xFX0RPQ1VNRU5UYCBpcyBlbmFibGVkIGEgYEhUTUxIdG1sRWxlbWVudGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkXG4gICAgICovXG5cbiAgICB2YXIgUkVUVVJOX0RPTSA9IGZhbHNlO1xuICAgIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgICAqIHN0cmluZyAgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkgKi9cblxuICAgIHZhciBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gZmFsc2U7XG4gICAgLyogVHJ5IHRvIHJldHVybiBhIFRydXN0ZWQgVHlwZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZywgcmV0dXJuIGEgc3RyaW5nIGluXG4gICAgICogY2FzZSBUcnVzdGVkIFR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkICAqL1xuXG4gICAgdmFyIFJFVFVSTl9UUlVTVEVEX1RZUEUgPSBmYWxzZTtcbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIGZyZWUgZnJvbSBET00gY2xvYmJlcmluZyBhdHRhY2tzP1xuICAgICAqIFRoaXMgc2FuaXRpemVzIG1hcmt1cHMgbmFtZWQgd2l0aCBjb2xsaWRpbmcsIGNsb2JiZXJhYmxlIGJ1aWx0LWluIERPTSBBUElzLlxuICAgICAqL1xuXG4gICAgdmFyIFNBTklUSVpFX0RPTSA9IHRydWU7XG4gICAgLyogQWNoaWV2ZSBmdWxsIERPTSBDbG9iYmVyaW5nIHByb3RlY3Rpb24gYnkgaXNvbGF0aW5nIHRoZSBuYW1lc3BhY2Ugb2YgbmFtZWRcbiAgICAgKiBwcm9wZXJ0aWVzIGFuZCBKUyB2YXJpYWJsZXMsIG1pdGlnYXRpbmcgYXR0YWNrcyB0aGF0IGFidXNlIHRoZSBIVE1ML0RPTSBzcGVjIHJ1bGVzLlxuICAgICAqXG4gICAgICogSFRNTC9ET00gc3BlYyBydWxlcyB0aGF0IGVuYWJsZSBET00gQ2xvYmJlcmluZzpcbiAgICAgKiAgIC0gTmFtZWQgQWNjZXNzIG9uIFdpbmRvdyAowqc3LjMuMylcbiAgICAgKiAgIC0gRE9NIFRyZWUgQWNjZXNzb3JzICjCpzMuMS41KVxuICAgICAqICAgLSBGb3JtIEVsZW1lbnQgUGFyZW50LUNoaWxkIFJlbGF0aW9ucyAowqc0LjEwLjMpXG4gICAgICogICAtIElmcmFtZSBzcmNkb2MgLyBOZXN0ZWQgV2luZG93UHJveGllcyAowqc0LjguNSlcbiAgICAgKiAgIC0gSFRNTENvbGxlY3Rpb24gKMKnNC4yLjEwLjIpXG4gICAgICpcbiAgICAgKiBOYW1lc3BhY2UgaXNvbGF0aW9uIGlzIGltcGxlbWVudGVkIGJ5IHByZWZpeGluZyBgaWRgIGFuZCBgbmFtZWAgYXR0cmlidXRlc1xuICAgICAqIHdpdGggYSBjb25zdGFudCBzdHJpbmcsIGkuZS4sIGB1c2VyLWNvbnRlbnQtYFxuICAgICAqL1xuXG4gICAgdmFyIFNBTklUSVpFX05BTUVEX1BST1BTID0gZmFsc2U7XG4gICAgdmFyIFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCA9ICd1c2VyLWNvbnRlbnQtJztcbiAgICAvKiBLZWVwIGVsZW1lbnQgY29udGVudCB3aGVuIHJlbW92aW5nIGVsZW1lbnQ/ICovXG5cbiAgICB2YXIgS0VFUF9DT05URU5UID0gdHJ1ZTtcbiAgICAvKiBJZiBhIGBOb2RlYCBpcyBwYXNzZWQgdG8gc2FuaXRpemUoKSwgdGhlbiBwZXJmb3JtcyBzYW5pdGl6YXRpb24gaW4tcGxhY2UgaW5zdGVhZFxuICAgICAqIG9mIGltcG9ydGluZyBpdCBpbnRvIGEgbmV3IERvY3VtZW50IGFuZCByZXR1cm5pbmcgYSBzYW5pdGl6ZWQgY29weSAqL1xuXG4gICAgdmFyIElOX1BMQUNFID0gZmFsc2U7XG4gICAgLyogQWxsb3cgdXNhZ2Ugb2YgcHJvZmlsZXMgbGlrZSBodG1sLCBzdmcgYW5kIG1hdGhNbCAqL1xuXG4gICAgdmFyIFVTRV9QUk9GSUxFUyA9IHt9O1xuICAgIC8qIFRhZ3MgdG8gaWdub3JlIGNvbnRlbnQgb2Ygd2hlbiBLRUVQX0NPTlRFTlQgaXMgdHJ1ZSAqL1xuXG4gICAgdmFyIEZPUkJJRF9DT05URU5UUyA9IG51bGw7XG4gICAgdmFyIERFRkFVTFRfRk9SQklEX0NPTlRFTlRTID0gYWRkVG9TZXQoe30sIFsnYW5ub3RhdGlvbi14bWwnLCAnYXVkaW8nLCAnY29sZ3JvdXAnLCAnZGVzYycsICdmb3JlaWdub2JqZWN0JywgJ2hlYWQnLCAnaWZyYW1lJywgJ21hdGgnLCAnbWknLCAnbW4nLCAnbW8nLCAnbXMnLCAnbXRleHQnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdwbGFpbnRleHQnLCAnc2NyaXB0JywgJ3N0eWxlJywgJ3N2ZycsICd0ZW1wbGF0ZScsICd0aGVhZCcsICd0aXRsZScsICd2aWRlbycsICd4bXAnXSk7XG4gICAgLyogVGFncyB0aGF0IGFyZSBzYWZlIGZvciBkYXRhOiBVUklzICovXG5cbiAgICB2YXIgREFUQV9VUklfVEFHUyA9IG51bGw7XG4gICAgdmFyIERFRkFVTFRfREFUQV9VUklfVEFHUyA9IGFkZFRvU2V0KHt9LCBbJ2F1ZGlvJywgJ3ZpZGVvJywgJ2ltZycsICdzb3VyY2UnLCAnaW1hZ2UnLCAndHJhY2snXSk7XG4gICAgLyogQXR0cmlidXRlcyBzYWZlIGZvciB2YWx1ZXMgbGlrZSBcImphdmFzY3JpcHQ6XCIgKi9cblxuICAgIHZhciBVUklfU0FGRV9BVFRSSUJVVEVTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTID0gYWRkVG9TZXQoe30sIFsnYWx0JywgJ2NsYXNzJywgJ2ZvcicsICdpZCcsICdsYWJlbCcsICduYW1lJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAncm9sZScsICdzdW1tYXJ5JywgJ3RpdGxlJywgJ3ZhbHVlJywgJ3N0eWxlJywgJ3htbG5zJ10pO1xuICAgIHZhciBNQVRITUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuICAgIHZhciBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgICB2YXIgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgLyogRG9jdW1lbnQgbmFtZXNwYWNlICovXG5cbiAgICB2YXIgTkFNRVNQQUNFID0gSFRNTF9OQU1FU1BBQ0U7XG4gICAgdmFyIElTX0VNUFRZX0lOUFVUID0gZmFsc2U7XG4gICAgLyogQWxsb3dlZCBYSFRNTCtYTUwgbmFtZXNwYWNlcyAqL1xuXG4gICAgdmFyIEFMTE9XRURfTkFNRVNQQUNFUyA9IG51bGw7XG4gICAgdmFyIERFRkFVTFRfQUxMT1dFRF9OQU1FU1BBQ0VTID0gYWRkVG9TZXQoe30sIFtNQVRITUxfTkFNRVNQQUNFLCBTVkdfTkFNRVNQQUNFLCBIVE1MX05BTUVTUEFDRV0sIHN0cmluZ1RvU3RyaW5nKTtcbiAgICAvKiBQYXJzaW5nIG9mIHN0cmljdCBYSFRNTCBkb2N1bWVudHMgKi9cblxuICAgIHZhciBQQVJTRVJfTUVESUFfVFlQRTtcbiAgICB2YXIgU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUyA9IFsnYXBwbGljYXRpb24veGh0bWwreG1sJywgJ3RleHQvaHRtbCddO1xuICAgIHZhciBERUZBVUxUX1BBUlNFUl9NRURJQV9UWVBFID0gJ3RleHQvaHRtbCc7XG4gICAgdmFyIHRyYW5zZm9ybUNhc2VGdW5jO1xuICAgIC8qIEtlZXAgYSByZWZlcmVuY2UgdG8gY29uZmlnIHRvIHBhc3MgdG8gaG9va3MgKi9cblxuICAgIHZhciBDT05GSUcgPSBudWxsO1xuICAgIC8qIElkZWFsbHksIGRvIG5vdCB0b3VjaCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgKi9cblxuICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi9cblxuICAgIHZhciBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcblxuICAgIHZhciBpc1JlZ2V4T3JGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzUmVnZXhPckZ1bmN0aW9uKHRlc3RWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRlc3RWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCB8fCB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9wYXJzZUNvbmZpZ1xuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBjZmcgb3B0aW9uYWwgY29uZmlnIGxpdGVyYWxcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuXG5cbiAgICB2YXIgX3BhcnNlQ29uZmlnID0gZnVuY3Rpb24gX3BhcnNlQ29uZmlnKGNmZykge1xuICAgICAgaWYgKENPTkZJRyAmJiBDT05GSUcgPT09IGNmZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0YW1wZXJpbmcgKi9cblxuXG4gICAgICBpZiAoIWNmZyB8fCBfdHlwZW9mKGNmZykgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNmZyA9IHt9O1xuICAgICAgfVxuICAgICAgLyogU2hpZWxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gcHJvdG90eXBlIHBvbGx1dGlvbiAqL1xuXG5cbiAgICAgIGNmZyA9IGNsb25lKGNmZyk7XG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUy5pbmRleE9mKGNmZy5QQVJTRVJfTUVESUFfVFlQRSkgPT09IC0xID8gUEFSU0VSX01FRElBX1RZUEUgPSBERUZBVUxUX1BBUlNFUl9NRURJQV9UWVBFIDogUEFSU0VSX01FRElBX1RZUEUgPSBjZmcuUEFSU0VSX01FRElBX1RZUEU7IC8vIEhUTUwgdGFncyBhbmQgYXR0cmlidXRlcyBhcmUgbm90IGNhc2Utc2Vuc2l0aXZlLCBjb252ZXJ0aW5nIHRvIGxvd2VyY2FzZS4gS2VlcGluZyBYSFRNTCBhcyBpcy5cblxuICAgICAgdHJhbnNmb3JtQ2FzZUZ1bmMgPSBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgPyBzdHJpbmdUb1N0cmluZyA6IHN0cmluZ1RvTG93ZXJDYXNlO1xuICAgICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuXG4gICAgICBBTExPV0VEX1RBR1MgPSAnQUxMT1dFRF9UQUdTJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpIDogREVGQVVMVF9BTExPV0VEX1RBR1M7XG4gICAgICBBTExPV0VEX0FUVFIgPSAnQUxMT1dFRF9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpIDogREVGQVVMVF9BTExPV0VEX0FUVFI7XG4gICAgICBBTExPV0VEX05BTUVTUEFDRVMgPSAnQUxMT1dFRF9OQU1FU1BBQ0VTJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfTkFNRVNQQUNFUywgc3RyaW5nVG9TdHJpbmcpIDogREVGQVVMVF9BTExPV0VEX05BTUVTUEFDRVM7XG4gICAgICBVUklfU0FGRV9BVFRSSUJVVEVTID0gJ0FERF9VUklfU0FGRV9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldChjbG9uZShERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGluZGVudFxuICAgICAgY2ZnLkFERF9VUklfU0FGRV9BVFRSLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGluZGVudFxuICAgICAgdHJhbnNmb3JtQ2FzZUZ1bmMgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbmRlbnRcbiAgICAgICkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbmRlbnRcbiAgICAgIDogREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTO1xuICAgICAgREFUQV9VUklfVEFHUyA9ICdBRERfREFUQV9VUklfVEFHUycgaW4gY2ZnID8gYWRkVG9TZXQoY2xvbmUoREVGQVVMVF9EQVRBX1VSSV9UQUdTKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbmRlbnRcbiAgICAgIGNmZy5BRERfREFUQV9VUklfVEFHUywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbmRlbnRcbiAgICAgIHRyYW5zZm9ybUNhc2VGdW5jIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW5kZW50XG4gICAgICApIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW5kZW50XG4gICAgICA6IERFRkFVTFRfREFUQV9VUklfVEFHUztcbiAgICAgIEZPUkJJRF9DT05URU5UUyA9ICdGT1JCSURfQ09OVEVOVFMnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0NPTlRFTlRTLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0ZPUkJJRF9DT05URU5UUztcbiAgICAgIEZPUkJJRF9UQUdTID0gJ0ZPUkJJRF9UQUdTJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiB7fTtcbiAgICAgIEZPUkJJRF9BVFRSID0gJ0ZPUkJJRF9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiB7fTtcbiAgICAgIFVTRV9QUk9GSUxFUyA9ICdVU0VfUFJPRklMRVMnIGluIGNmZyA/IGNmZy5VU0VfUFJPRklMRVMgOiBmYWxzZTtcbiAgICAgIEFMTE9XX0FSSUFfQVRUUiA9IGNmZy5BTExPV19BUklBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcblxuICAgICAgQUxMT1dfREFUQV9BVFRSID0gY2ZnLkFMTE9XX0RBVEFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuXG4gICAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUyA9IGNmZy5BTExPV19VTktOT1dOX1BST1RPQ09MUyB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuXG4gICAgICBBTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgPSBjZmcuQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG5cbiAgICAgIFNBRkVfRk9SX1RFTVBMQVRFUyA9IGNmZy5TQUZFX0ZPUl9URU1QTEFURVMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcblxuICAgICAgV0hPTEVfRE9DVU1FTlQgPSBjZmcuV0hPTEVfRE9DVU1FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcblxuICAgICAgUkVUVVJOX0RPTSA9IGNmZy5SRVRVUk5fRE9NIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG5cbiAgICAgIFJFVFVSTl9ET01fRlJBR01FTlQgPSBjZmcuUkVUVVJOX0RPTV9GUkFHTUVOVCB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuXG4gICAgICBSRVRVUk5fVFJVU1RFRF9UWVBFID0gY2ZnLlJFVFVSTl9UUlVTVEVEX1RZUEUgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcblxuICAgICAgRk9SQ0VfQk9EWSA9IGNmZy5GT1JDRV9CT0RZIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG5cbiAgICAgIFNBTklUSVpFX0RPTSA9IGNmZy5TQU5JVElaRV9ET00gIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcblxuICAgICAgU0FOSVRJWkVfTkFNRURfUFJPUFMgPSBjZmcuU0FOSVRJWkVfTkFNRURfUFJPUFMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcblxuICAgICAgS0VFUF9DT05URU5UID0gY2ZnLktFRVBfQ09OVEVOVCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuXG4gICAgICBJTl9QTEFDRSA9IGNmZy5JTl9QTEFDRSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuXG4gICAgICBJU19BTExPV0VEX1VSSSQxID0gY2ZnLkFMTE9XRURfVVJJX1JFR0VYUCB8fCBJU19BTExPV0VEX1VSSSQxO1xuICAgICAgTkFNRVNQQUNFID0gY2ZnLk5BTUVTUEFDRSB8fCBIVE1MX05BTUVTUEFDRTtcbiAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HID0gY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HIHx8IHt9O1xuXG4gICAgICBpZiAoY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmIGlzUmVnZXhPckZ1bmN0aW9uKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2spKSB7XG4gICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayA9IGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2s7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgJiYgaXNSZWdleE9yRnVuY3Rpb24oY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjaykpIHtcbiAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrID0gY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjaztcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyAmJiB0eXBlb2YgY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyA9IGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM7XG4gICAgICB9XG5cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgQUxMT1dfREFUQV9BVFRSID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIFJFVFVSTl9ET00gPSB0cnVlO1xuICAgICAgfVxuICAgICAgLyogUGFyc2UgcHJvZmlsZSBpbmZvICovXG5cblxuICAgICAgaWYgKFVTRV9QUk9GSUxFUykge1xuICAgICAgICBBTExPV0VEX1RBR1MgPSBhZGRUb1NldCh7fSwgX3RvQ29uc3VtYWJsZUFycmF5KHRleHQpKTtcbiAgICAgICAgQUxMT1dFRF9BVFRSID0gW107XG5cbiAgICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBodG1sJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgaHRtbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2ZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgc3ZnJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgc3ZnKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2Z0ZpbHRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgc3ZnKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLm1hdGhNbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgbWF0aE1sJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgbWF0aE1sKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIE1lcmdlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuXG5cbiAgICAgIGlmIChjZmcuQUREX1RBR1MpIHtcbiAgICAgICAgaWYgKEFMTE9XRURfVEFHUyA9PT0gREVGQVVMVF9BTExPV0VEX1RBR1MpIHtcbiAgICAgICAgICBBTExPV0VEX1RBR1MgPSBjbG9uZShBTExPV0VEX1RBR1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBjZmcuQUREX1RBR1MsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5BRERfQVRUUikge1xuICAgICAgICBpZiAoQUxMT1dFRF9BVFRSID09PSBERUZBVUxUX0FMTE9XRURfQVRUUikge1xuICAgICAgICAgIEFMTE9XRURfQVRUUiA9IGNsb25lKEFMTE9XRURfQVRUUik7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGNmZy5BRERfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkFERF9VUklfU0FGRV9BVFRSKSB7XG4gICAgICAgIGFkZFRvU2V0KFVSSV9TQUZFX0FUVFJJQlVURVMsIGNmZy5BRERfVVJJX1NBRkVfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkZPUkJJRF9DT05URU5UUykge1xuICAgICAgICBpZiAoRk9SQklEX0NPTlRFTlRTID09PSBERUZBVUxUX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChGT1JCSURfQ09OVEVOVFMsIGNmZy5GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICAgIH1cbiAgICAgIC8qIEFkZCAjdGV4dCBpbiBjYXNlIEtFRVBfQ09OVEVOVCBpcyBzZXQgdG8gdHJ1ZSAqL1xuXG5cbiAgICAgIGlmIChLRUVQX0NPTlRFTlQpIHtcbiAgICAgICAgQUxMT1dFRF9UQUdTWycjdGV4dCddID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIEFkZCBodG1sLCBoZWFkIGFuZCBib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIFdIT0xFX0RPQ1VNRU5UIGlzIHRydWUgKi9cblxuXG4gICAgICBpZiAoV0hPTEVfRE9DVU1FTlQpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ2h0bWwnLCAnaGVhZCcsICdib2R5J10pO1xuICAgICAgfVxuICAgICAgLyogQWRkIHRib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIHRhYmxlcyBhcmUgcGVybWl0dGVkLCBzZWUgIzI4NiwgIzM2NSAqL1xuXG5cbiAgICAgIGlmIChBTExPV0VEX1RBR1MudGFibGUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ3Rib2R5J10pO1xuICAgICAgICBkZWxldGUgRk9SQklEX1RBR1MudGJvZHk7XG4gICAgICB9IC8vIFByZXZlbnQgZnVydGhlciBtYW5pcHVsYXRpb24gb2YgY29uZmlndXJhdGlvbi5cbiAgICAgIC8vIE5vdCBhdmFpbGFibGUgaW4gSUU4LCBTYWZhcmkgNSwgZXRjLlxuXG5cbiAgICAgIGlmIChmcmVlemUpIHtcbiAgICAgICAgZnJlZXplKGNmZyk7XG4gICAgICB9XG5cbiAgICAgIENPTkZJRyA9IGNmZztcbiAgICB9O1xuXG4gICAgdmFyIE1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ21pJywgJ21vJywgJ21uJywgJ21zJywgJ210ZXh0J10pO1xuICAgIHZhciBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2ZvcmVpZ25vYmplY3QnLCAnZGVzYycsICd0aXRsZScsICdhbm5vdGF0aW9uLXhtbCddKTsgLy8gQ2VydGFpbiBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBib3RoIFNWRyBhbmQgSFRNTFxuICAgIC8vIG5hbWVzcGFjZS4gV2UgbmVlZCB0byBzcGVjaWZ5IHRoZW0gZXhwbGljaXRseVxuICAgIC8vIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgZXJyb25lb3VzbHkgZGVsZXRlZCBmcm9tXG4gICAgLy8gSFRNTCBuYW1lc3BhY2UuXG5cbiAgICB2YXIgQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UUyA9IGFkZFRvU2V0KHt9LCBbJ3RpdGxlJywgJ3N0eWxlJywgJ2ZvbnQnLCAnYScsICdzY3JpcHQnXSk7XG4gICAgLyogS2VlcCB0cmFjayBvZiBhbGwgcG9zc2libGUgU1ZHIGFuZCBNYXRoTUwgdGFnc1xuICAgICAqIHNvIHRoYXQgd2UgY2FuIHBlcmZvcm0gdGhlIG5hbWVzcGFjZSBjaGVja3NcbiAgICAgKiBjb3JyZWN0bHkuICovXG5cbiAgICB2YXIgQUxMX1NWR19UQUdTID0gYWRkVG9TZXQoe30sIHN2ZyQxKTtcbiAgICBhZGRUb1NldChBTExfU1ZHX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgIGFkZFRvU2V0KEFMTF9TVkdfVEFHUywgc3ZnRGlzYWxsb3dlZCk7XG4gICAgdmFyIEFMTF9NQVRITUxfVEFHUyA9IGFkZFRvU2V0KHt9LCBtYXRoTWwkMSk7XG4gICAgYWRkVG9TZXQoQUxMX01BVEhNTF9UQUdTLCBtYXRoTWxEaXNhbGxvd2VkKTtcbiAgICAvKipcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RWxlbWVudH0gZWxlbWVudCBhIERPTSBlbGVtZW50IHdob3NlIG5hbWVzcGFjZSBpcyBiZWluZyBjaGVja2VkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBoYXMgYVxuICAgICAqICBuYW1lc3BhY2UgdGhhdCBhIHNwZWMtY29tcGxpYW50IHBhcnNlciB3b3VsZCBuZXZlclxuICAgICAqICByZXR1cm4uIFJldHVybiB0cnVlIG90aGVyd2lzZS5cbiAgICAgKi9cblxuICAgIHZhciBfY2hlY2tWYWxpZE5hbWVzcGFjZSA9IGZ1bmN0aW9uIF9jaGVja1ZhbGlkTmFtZXNwYWNlKGVsZW1lbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpOyAvLyBJbiBKU0RPTSwgaWYgd2UncmUgaW5zaWRlIHNoYWRvdyBET00sIHRoZW4gcGFyZW50Tm9kZVxuICAgICAgLy8gY2FuIGJlIG51bGwuIFdlIGp1c3Qgc2ltdWxhdGUgcGFyZW50IGluIHRoaXMgY2FzZS5cblxuICAgICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC50YWdOYW1lKSB7XG4gICAgICAgIHBhcmVudCA9IHtcbiAgICAgICAgICBuYW1lc3BhY2VVUkk6IE5BTUVTUEFDRSxcbiAgICAgICAgICB0YWdOYW1lOiAndGVtcGxhdGUnXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHZhciB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoZWxlbWVudC50YWdOYW1lKTtcbiAgICAgIHZhciBwYXJlbnRUYWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UocGFyZW50LnRhZ05hbWUpO1xuXG4gICAgICBpZiAoIUFMTE9XRURfTkFNRVNQQUNFU1tlbGVtZW50Lm5hbWVzcGFjZVVSSV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIFNWR1xuICAgICAgICAvLyBpcyB2aWEgPHN2Zz4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgICAgLy8gaXQgc2hvdWxkIGJlIGtpbGxlZC5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnO1xuICAgICAgICB9IC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBNYXRoTUwgdG8gU1ZHIGlzIHZpYWBcbiAgICAgICAgLy8gc3ZnIGlmIHBhcmVudCBpcyBlaXRoZXIgPGFubm90YXRpb24teG1sPiBvciBNYXRoTUxcbiAgICAgICAgLy8gdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHMuXG5cblxuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJyAmJiAocGFyZW50VGFnTmFtZSA9PT0gJ2Fubm90YXRpb24teG1sJyB8fCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pO1xuICAgICAgICB9IC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBTVkdcbiAgICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBTVkcgbmFtZXNwYWNlLlxuXG5cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBIVE1MIG5hbWVzcGFjZSB0byBNYXRoTUxcbiAgICAgICAgLy8gaXMgdmlhIDxtYXRoPi4gSWYgaXQgaGFwcGVucyB2aWEgYW55IG90aGVyIHRhZywgdGhlblxuICAgICAgICAvLyBpdCBzaG91bGQgYmUga2lsbGVkLlxuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ21hdGgnO1xuICAgICAgICB9IC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gTWF0aE1MIGlzIHZpYVxuICAgICAgICAvLyA8bWF0aD4gYW5kIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzXG5cblxuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCcgJiYgSFRNTF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV07XG4gICAgICAgIH0gLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIE1hdGhNTFxuICAgICAgICAvLyBzcGVjLiBBbGwgb3RoZXJzIGFyZSBkaXNhbGxvd2VkIGluIE1hdGhNTCBuYW1lc3BhY2UuXG5cblxuICAgICAgICByZXR1cm4gQm9vbGVhbihBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gSFRNTCBpcyB2aWFcbiAgICAgICAgLy8gSFRNTCBpbnRlZ3JhdGlvbiBwb2ludHMsIGFuZCBmcm9tIE1hdGhNTCB0byBIVE1MXG4gICAgICAgIC8vIGlzIHZpYSBNYXRoTUwgdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHNcbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UgJiYgIUhUTUxfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UgJiYgIU1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSAvLyBXZSBkaXNhbGxvdyB0YWdzIHRoYXQgYXJlIHNwZWNpZmljIGZvciBNYXRoTUxcbiAgICAgICAgLy8gb3IgU1ZHIGFuZCBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIEhUTUwgbmFtZXNwYWNlXG5cblxuICAgICAgICByZXR1cm4gIUFMTF9NQVRITUxfVEFHU1t0YWdOYW1lXSAmJiAoQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UU1t0YWdOYW1lXSB8fCAhQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICAgIH0gLy8gRm9yIFhIVE1MIGFuZCBYTUwgZG9jdW1lbnRzIHRoYXQgc3VwcG9ydCBjdXN0b20gbmFtZXNwYWNlc1xuXG5cbiAgICAgIGlmIChQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgJiYgQUxMT1dFRF9OQU1FU1BBQ0VTW2VsZW1lbnQubmFtZXNwYWNlVVJJXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gVGhlIGNvZGUgc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcGxhY2UgKHRoaXMgbWVhbnNcbiAgICAgIC8vIHRoYXQgdGhlIGVsZW1lbnQgc29tZWhvdyBnb3QgbmFtZXNwYWNlIHRoYXQgaXMgbm90XG4gICAgICAvLyBIVE1MLCBTVkcsIE1hdGhNTCBvciBhbGxvd2VkIHZpYSBBTExPV0VEX05BTUVTUEFDRVMpLlxuICAgICAgLy8gUmV0dXJuIGZhbHNlIGp1c3QgaW4gY2FzZS5cblxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBfZm9yY2VSZW1vdmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgYSBET00gbm9kZVxuICAgICAqL1xuXG5cbiAgICB2YXIgX2ZvcmNlUmVtb3ZlID0gZnVuY3Rpb24gX2ZvcmNlUmVtb3ZlKG5vZGUpIHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICBlbGVtZW50OiBub2RlXG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLXJlbW92ZVxuICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbm9kZS5vdXRlckhUTUwgPSBlbXB0eUhUTUw7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBfcmVtb3ZlQXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUgYW4gQXR0cmlidXRlIG5hbWVcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBub2RlIGEgRE9NIG5vZGVcbiAgICAgKi9cblxuXG4gICAgdmFyIF9yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIG5vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICAgIGF0dHJpYnV0ZTogbm9kZS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpLFxuICAgICAgICAgIGZyb206IG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICAgIGF0dHJpYnV0ZTogbnVsbCxcbiAgICAgICAgICBmcm9tOiBub2RlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsgLy8gV2Ugdm9pZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciB1bnJlbW92YWJsZSBcImlzXCJcIiBhdHRyaWJ1dGVzXG5cbiAgICAgIGlmIChuYW1lID09PSAnaXMnICYmICFBTExPV0VEX0FUVFJbbmFtZV0pIHtcbiAgICAgICAgaWYgKFJFVFVSTl9ET00gfHwgUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBfZm9yY2VSZW1vdmUobm9kZSk7XG4gICAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9pbml0RG9jdW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZGlydHkgYSBzdHJpbmcgb2YgZGlydHkgbWFya3VwXG4gICAgICogQHJldHVybiB7RG9jdW1lbnR9IGEgRE9NLCBmaWxsZWQgd2l0aCB0aGUgZGlydHkgbWFya3VwXG4gICAgICovXG5cblxuICAgIHZhciBfaW5pdERvY3VtZW50ID0gZnVuY3Rpb24gX2luaXREb2N1bWVudChkaXJ0eSkge1xuICAgICAgLyogQ3JlYXRlIGEgSFRNTCBkb2N1bWVudCAqL1xuICAgICAgdmFyIGRvYztcbiAgICAgIHZhciBsZWFkaW5nV2hpdGVzcGFjZTtcblxuICAgICAgaWYgKEZPUkNFX0JPRFkpIHtcbiAgICAgICAgZGlydHkgPSAnPHJlbW92ZT48L3JlbW92ZT4nICsgZGlydHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBJZiBGT1JDRV9CT0RZIGlzbid0IHVzZWQsIGxlYWRpbmcgd2hpdGVzcGFjZSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgbWFudWFsbHkgKi9cbiAgICAgICAgdmFyIG1hdGNoZXMgPSBzdHJpbmdNYXRjaChkaXJ0eSwgL15bXFxyXFxuXFx0IF0rLyk7XG4gICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzBdO1xuICAgICAgfVxuXG4gICAgICBpZiAoUEFSU0VSX01FRElBX1RZUEUgPT09ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnICYmIE5BTUVTUEFDRSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gUm9vdCBvZiBYSFRNTCBkb2MgbXVzdCBjb250YWluIHhtbG5zIGRlY2xhcmF0aW9uIChzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3hodG1sMS9ub3JtYXRpdmUuaHRtbCNzdHJpY3QpXG4gICAgICAgIGRpcnR5ID0gJzxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPjxoZWFkPjwvaGVhZD48Ym9keT4nICsgZGlydHkgKyAnPC9ib2R5PjwvaHRtbD4nO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlydHlQYXlsb2FkID0gdHJ1c3RlZFR5cGVzUG9saWN5ID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpIDogZGlydHk7XG4gICAgICAvKlxuICAgICAgICogVXNlIHRoZSBET01QYXJzZXIgQVBJIGJ5IGRlZmF1bHQsIGZhbGxiYWNrIGxhdGVyIGlmIG5lZWRzIGJlXG4gICAgICAgKiBET01QYXJzZXIgbm90IHdvcmsgZm9yIHN2ZyB3aGVuIGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnQuXG4gICAgICAgKi9cblxuICAgICAgaWYgKE5BTUVTUEFDRSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGRpcnR5UGF5bG9hZCwgUEFSU0VSX01FRElBX1RZUEUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgICAgLyogVXNlIGNyZWF0ZUhUTUxEb2N1bWVudCBpbiBjYXNlIERPTVBhcnNlciBpcyBub3QgYXZhaWxhYmxlICovXG5cblxuICAgICAgaWYgKCFkb2MgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgZG9jID0gaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoTkFNRVNQQUNFLCAndGVtcGxhdGUnLCBudWxsKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gSVNfRU1QVFlfSU5QVVQgPyBlbXB0eUhUTUwgOiBkaXJ0eVBheWxvYWQ7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHsvLyBTeW50YXggZXJyb3IgaWYgZGlydHlQYXlsb2FkIGlzIGludmFsaWQgeG1sXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGJvZHkgPSBkb2MuYm9keSB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICBpZiAoZGlydHkgJiYgbGVhZGluZ1doaXRlc3BhY2UpIHtcbiAgICAgICAgYm9keS5pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGVhZGluZ1doaXRlc3BhY2UpLCBib2R5LmNoaWxkTm9kZXNbMF0gfHwgbnVsbCk7XG4gICAgICB9XG4gICAgICAvKiBXb3JrIG9uIHdob2xlIGRvY3VtZW50IG9yIGp1c3QgaXRzIGJvZHkgKi9cblxuXG4gICAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUuY2FsbChkb2MsIFdIT0xFX0RPQ1VNRU5UID8gJ2h0bWwnIDogJ2JvZHknKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFdIT0xFX0RPQ1VNRU5UID8gZG9jLmRvY3VtZW50RWxlbWVudCA6IGJvZHk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBfY3JlYXRlSXRlcmF0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0RvY3VtZW50fSByb290IGRvY3VtZW50L2ZyYWdtZW50IHRvIGNyZWF0ZSBpdGVyYXRvciBmb3JcbiAgICAgKiBAcmV0dXJuIHtJdGVyYXRvcn0gaXRlcmF0b3IgaW5zdGFuY2VcbiAgICAgKi9cblxuXG4gICAgdmFyIF9jcmVhdGVJdGVyYXRvciA9IGZ1bmN0aW9uIF9jcmVhdGVJdGVyYXRvcihyb290KSB7XG4gICAgICByZXR1cm4gY3JlYXRlTm9kZUl0ZXJhdG9yLmNhbGwocm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3QsIHJvb3QsIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9pc0Nsb2JiZXJlZFxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gZWxtIGVsZW1lbnQgdG8gY2hlY2sgZm9yIGNsb2JiZXJpbmcgYXR0YWNrc1xuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgY2xvYmJlcmVkLCBmYWxzZSBpZiBzYWZlXG4gICAgICovXG5cblxuICAgIHZhciBfaXNDbG9iYmVyZWQgPSBmdW5jdGlvbiBfaXNDbG9iYmVyZWQoZWxtKSB7XG4gICAgICByZXR1cm4gZWxtIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmICh0eXBlb2YgZWxtLm5vZGVOYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnJlbW92ZUNoaWxkICE9PSAnZnVuY3Rpb24nIHx8ICEoZWxtLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApIHx8IHR5cGVvZiBlbG0ucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0uc2V0QXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0ubmFtZXNwYWNlVVJJICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZWxtLmhhc0NoaWxkTm9kZXMgIT09ICdmdW5jdGlvbicpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogX2lzTm9kZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gb2JqIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIGl0J3MgYSBET00gbm9kZVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaXMgb2JqZWN0IGlzIGEgRE9NIG5vZGVcbiAgICAgKi9cblxuXG4gICAgdmFyIF9pc05vZGUgPSBmdW5jdGlvbiBfaXNOb2RlKG9iamVjdCkge1xuICAgICAgcmV0dXJuIF90eXBlb2YoTm9kZSkgPT09ICdvYmplY3QnID8gb2JqZWN0IGluc3RhbmNlb2YgTm9kZSA6IG9iamVjdCAmJiBfdHlwZW9mKG9iamVjdCkgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiBvYmplY3Qubm9kZU5hbWUgPT09ICdzdHJpbmcnO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogX2V4ZWN1dGVIb29rXG4gICAgICogRXhlY3V0ZSB1c2VyIGNvbmZpZ3VyYWJsZSBob29rc1xuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBlbnRyeVBvaW50ICBOYW1lIG9mIHRoZSBob29rJ3MgZW50cnkgcG9pbnRcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBjdXJyZW50Tm9kZSBub2RlIHRvIHdvcmsgb24gd2l0aCB0aGUgaG9va1xuICAgICAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBhZGRpdGlvbmFsIGhvb2sgcGFyYW1ldGVyc1xuICAgICAqL1xuXG5cbiAgICB2YXIgX2V4ZWN1dGVIb29rID0gZnVuY3Rpb24gX2V4ZWN1dGVIb29rKGVudHJ5UG9pbnQsIGN1cnJlbnROb2RlLCBkYXRhKSB7XG4gICAgICBpZiAoIWhvb2tzW2VudHJ5UG9pbnRdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXJyYXlGb3JFYWNoKGhvb2tzW2VudHJ5UG9pbnRdLCBmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICBob29rLmNhbGwoRE9NUHVyaWZ5LCBjdXJyZW50Tm9kZSwgZGF0YSwgQ09ORklHKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogX3Nhbml0aXplRWxlbWVudHNcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAgICogQHByb3RlY3QgdGV4dENvbnRlbnRcbiAgICAgKiBAcHJvdGVjdCByZW1vdmVDaGlsZFxuICAgICAqXG4gICAgICogQHBhcmFtICAge05vZGV9IGN1cnJlbnROb2RlIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9uIHRvIGV4aXN0XG4gICAgICogQHJldHVybiAge0Jvb2xlYW59IHRydWUgaWYgbm9kZSB3YXMga2lsbGVkLCBmYWxzZSBpZiBsZWZ0IGFsaXZlXG4gICAgICovXG5cblxuICAgIHZhciBfc2FuaXRpemVFbGVtZW50cyA9IGZ1bmN0aW9uIF9zYW5pdGl6ZUVsZW1lbnRzKGN1cnJlbnROb2RlKSB7XG4gICAgICB2YXIgY29udGVudDtcbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cblxuICAgICAgX2V4ZWN1dGVIb29rKCdiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzJywgY3VycmVudE5vZGUsIG51bGwpO1xuICAgICAgLyogQ2hlY2sgaWYgZWxlbWVudCBpcyBjbG9iYmVyZWQgb3IgY2FuIGNsb2JiZXIgKi9cblxuXG4gICAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogQ2hlY2sgaWYgdGFnbmFtZSBjb250YWlucyBVbmljb2RlICovXG5cblxuICAgICAgaWYgKHJlZ0V4cFRlc3QoL1tcXHUwMDgwLVxcdUZGRkZdLywgY3VycmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBOb3cgbGV0J3MgY2hlY2sgdGhlIGVsZW1lbnQncyB0eXBlIGFuZCBuYW1lICovXG5cblxuICAgICAgdmFyIHRhZ05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhjdXJyZW50Tm9kZS5ub2RlTmFtZSk7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG5cbiAgICAgIF9leGVjdXRlSG9vaygndXBvblNhbml0aXplRWxlbWVudCcsIGN1cnJlbnROb2RlLCB7XG4gICAgICAgIHRhZ05hbWU6IHRhZ05hbWUsXG4gICAgICAgIGFsbG93ZWRUYWdzOiBBTExPV0VEX1RBR1NcbiAgICAgIH0pO1xuICAgICAgLyogRGV0ZWN0IG1YU1MgYXR0ZW1wdHMgYWJ1c2luZyBuYW1lc3BhY2UgY29uZnVzaW9uICovXG5cblxuICAgICAgaWYgKGN1cnJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSAmJiAhX2lzTm9kZShjdXJyZW50Tm9kZS5maXJzdEVsZW1lbnRDaGlsZCkgJiYgKCFfaXNOb2RlKGN1cnJlbnROb2RlLmNvbnRlbnQpIHx8ICFfaXNOb2RlKGN1cnJlbnROb2RlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQpKSAmJiByZWdFeHBUZXN0KC88Wy9cXHddL2csIGN1cnJlbnROb2RlLmlubmVySFRNTCkgJiYgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS50ZXh0Q29udGVudCkpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIE1pdGlnYXRlIGEgcHJvYmxlbSB3aXRoIHRlbXBsYXRlcyBpbnNpZGUgc2VsZWN0ICovXG5cblxuICAgICAgaWYgKHRhZ05hbWUgPT09ICdzZWxlY3QnICYmIHJlZ0V4cFRlc3QoLzx0ZW1wbGF0ZS9pLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuXG5cbiAgICAgIGlmICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKSB7XG4gICAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBjdXN0b20gZWxlbWVudCB0byBoYW5kbGUgKi9cbiAgICAgICAgaWYgKCFGT1JCSURfVEFHU1t0YWdOYW1lXSAmJiBfYmFzaWNDdXN0b21FbGVtZW50VGVzdCh0YWdOYW1lKSkge1xuICAgICAgICAgIGlmIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiYgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIHRhZ05hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgaWYgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayh0YWdOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qIEtlZXAgY29udGVudCBleGNlcHQgZm9yIGJhZC1saXN0ZWQgZWxlbWVudHMgKi9cblxuXG4gICAgICAgIGlmIChLRUVQX0NPTlRFTlQgJiYgIUZPUkJJRF9DT05URU5UU1t0YWdOYW1lXSkge1xuICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSkgfHwgY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICB2YXIgY2hpbGROb2RlcyA9IGdldENoaWxkTm9kZXMoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLmNoaWxkTm9kZXM7XG5cbiAgICAgICAgICBpZiAoY2hpbGROb2RlcyAmJiBwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRDb3VudCA9IGNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRDb3VudCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNsb25lTm9kZShjaGlsZE5vZGVzW2ldLCB0cnVlKSwgZ2V0TmV4dFNpYmxpbmcoY3VycmVudE5vZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogQ2hlY2sgd2hldGhlciBlbGVtZW50IGhhcyBhIHZhbGlkIG5hbWVzcGFjZSAqL1xuXG5cbiAgICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgIV9jaGVja1ZhbGlkTmFtZXNwYWNlKGN1cnJlbnROb2RlKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogTWFrZSBzdXJlIHRoYXQgb2xkZXIgYnJvd3NlcnMgZG9uJ3QgZ2V0IGZhbGxiYWNrLXRhZyBtWFNTICovXG5cblxuICAgICAgaWYgKCh0YWdOYW1lID09PSAnbm9zY3JpcHQnIHx8IHRhZ05hbWUgPT09ICdub2VtYmVkJyB8fCB0YWdOYW1lID09PSAnbm9mcmFtZXMnKSAmJiByZWdFeHBUZXN0KC88XFwvbm8oc2NyaXB0fGVtYmVkfGZyYW1lcykvaSwgY3VycmVudE5vZGUuaW5uZXJIVE1MKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogU2FuaXRpemUgZWxlbWVudCBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cblxuXG4gICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTICYmIGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgIC8qIEdldCB0aGUgZWxlbWVudCdzIHRleHQgY29udGVudCAqL1xuICAgICAgICBjb250ZW50ID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ7XG4gICAgICAgIGNvbnRlbnQgPSBzdHJpbmdSZXBsYWNlKGNvbnRlbnQsIE1VU1RBQ0hFX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgRVJCX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgVE1QTElUX0VYUFIkMSwgJyAnKTtcblxuICAgICAgICBpZiAoY3VycmVudE5vZGUudGV4dENvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGN1cnJlbnROb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG5cblxuICAgICAgX2V4ZWN1dGVIb29rKCdhZnRlclNhbml0aXplRWxlbWVudHMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9pc1ZhbGlkQXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxjVGFnIExvd2VyY2FzZSB0YWcgbmFtZSBvZiBjb250YWluaW5nIGVsZW1lbnQuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBsY05hbWUgTG93ZXJjYXNlIGF0dHJpYnV0ZSBuYW1lLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuXG4gICAgdmFyIF9pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpIHtcbiAgICAgIC8qIE1ha2Ugc3VyZSBhdHRyaWJ1dGUgY2Fubm90IGNsb2JiZXIgKi9cbiAgICAgIGlmIChTQU5JVElaRV9ET00gJiYgKGxjTmFtZSA9PT0gJ2lkJyB8fCBsY05hbWUgPT09ICduYW1lJykgJiYgKHZhbHVlIGluIGRvY3VtZW50IHx8IHZhbHVlIGluIGZvcm1FbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBBbGxvdyB2YWxpZCBkYXRhLSogYXR0cmlidXRlczogQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhZnRlciBcIi1cIlxuICAgICAgICAgIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNlbWJlZGRpbmctY3VzdG9tLW5vbi12aXNpYmxlLWRhdGEtd2l0aC10aGUtZGF0YS0qLWF0dHJpYnV0ZXMpXG4gICAgICAgICAgWE1MLWNvbXBhdGlibGUgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjeG1sLWNvbXBhdGlibGUgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jZDBlODA0KVxuICAgICAgICAgIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlOyBpdCdzIGFsd2F5cyBVUkkgc2FmZS4gKi9cblxuXG4gICAgICBpZiAoQUxMT1dfREFUQV9BVFRSICYmICFGT1JCSURfQVRUUltsY05hbWVdICYmIHJlZ0V4cFRlc3QoREFUQV9BVFRSJDEsIGxjTmFtZSkpIDsgZWxzZSBpZiAoQUxMT1dfQVJJQV9BVFRSICYmIHJlZ0V4cFRlc3QoQVJJQV9BVFRSJDEsIGxjTmFtZSkpIDsgZWxzZSBpZiAoIUFMTE9XRURfQVRUUltsY05hbWVdIHx8IEZPUkJJRF9BVFRSW2xjTmFtZV0pIHtcbiAgICAgICAgaWYgKCAvLyBGaXJzdCBjb25kaXRpb24gZG9lcyBhIHZlcnkgYmFzaWMgY2hlY2sgaWYgYSkgaXQncyBiYXNpY2FsbHkgYSB2YWxpZCBjdXN0b20gZWxlbWVudCB0YWduYW1lIEFORFxuICAgICAgICAvLyBiKSBpZiB0aGUgdGFnTmFtZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICAvLyBhbmQgYykgaWYgdGhlIGF0dHJpYnV0ZSBuYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrXG4gICAgICAgIF9iYXNpY0N1c3RvbUVsZW1lbnRUZXN0KGxjVGFnKSAmJiAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgUmVnRXhwICYmIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCBsY1RhZykgfHwgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKGxjVGFnKSkgJiYgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJiByZWdFeHBUZXN0KENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjaywgbGNOYW1lKSB8fCBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sobGNOYW1lKSkgfHwgLy8gQWx0ZXJuYXRpdmUsIHNlY29uZCBjb25kaXRpb24gY2hlY2tzIGlmIGl0J3MgYW4gYGlzYC1hdHRyaWJ1dGUsIEFORFxuICAgICAgICAvLyB0aGUgdmFsdWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2tcbiAgICAgICAgbGNOYW1lID09PSAnaXMnICYmIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyAmJiAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgUmVnRXhwICYmIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB2YWx1ZSkgfHwgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHZhbHVlKSkpIDsgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qIENoZWNrIHZhbHVlIGlzIHNhZmUuIEZpcnN0LCBpcyBhdHRyIGluZXJ0PyBJZiBzbywgaXMgc2FmZSAqL1xuXG4gICAgICB9IGVsc2UgaWYgKFVSSV9TQUZFX0FUVFJJQlVURVNbbGNOYW1lXSkgOyBlbHNlIGlmIChyZWdFeHBUZXN0KElTX0FMTE9XRURfVVJJJDEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSQxLCAnJykpKSA7IGVsc2UgaWYgKChsY05hbWUgPT09ICdzcmMnIHx8IGxjTmFtZSA9PT0gJ3hsaW5rOmhyZWYnIHx8IGxjTmFtZSA9PT0gJ2hyZWYnKSAmJiBsY1RhZyAhPT0gJ3NjcmlwdCcgJiYgc3RyaW5nSW5kZXhPZih2YWx1ZSwgJ2RhdGE6JykgPT09IDAgJiYgREFUQV9VUklfVEFHU1tsY1RhZ10pIDsgZWxzZSBpZiAoQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgJiYgIXJlZ0V4cFRlc3QoSVNfU0NSSVBUX09SX0RBVEEkMSwgc3RyaW5nUmVwbGFjZSh2YWx1ZSwgQVRUUl9XSElURVNQQUNFJDEsICcnKSkpIDsgZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIDtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBfYmFzaWNDdXN0b21FbGVtZW50Q2hlY2tcbiAgICAgKiBjaGVja3MgaWYgYXQgbGVhc3Qgb25lIGRhc2ggaXMgaW5jbHVkZWQgaW4gdGFnTmFtZSwgYW5kIGl0J3Mgbm90IHRoZSBmaXJzdCBjaGFyXG4gICAgICogZm9yIG1vcmUgc29waGlzdGljYXRlZCBjaGVja2luZyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy92YWxpZGF0ZS1lbGVtZW50LW5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSBuYW1lIG9mIHRoZSB0YWcgb2YgdGhlIG5vZGUgdG8gc2FuaXRpemVcbiAgICAgKi9cblxuXG4gICAgdmFyIF9iYXNpY0N1c3RvbUVsZW1lbnRUZXN0ID0gZnVuY3Rpb24gX2Jhc2ljQ3VzdG9tRWxlbWVudFRlc3QodGFnTmFtZSkge1xuICAgICAgcmV0dXJuIHRhZ05hbWUuaW5kZXhPZignLScpID4gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9zYW5pdGl6ZUF0dHJpYnV0ZXNcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0IGF0dHJpYnV0ZXNcbiAgICAgKiBAcHJvdGVjdCBub2RlTmFtZVxuICAgICAqIEBwcm90ZWN0IHJlbW92ZUF0dHJpYnV0ZVxuICAgICAqIEBwcm90ZWN0IHNldEF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gY3VycmVudE5vZGUgdG8gc2FuaXRpemVcbiAgICAgKi9cblxuXG4gICAgdmFyIF9zYW5pdGl6ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiBfc2FuaXRpemVBdHRyaWJ1dGVzKGN1cnJlbnROb2RlKSB7XG4gICAgICB2YXIgYXR0cjtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIHZhciBsY05hbWU7XG4gICAgICB2YXIgbDtcbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cblxuICAgICAgX2V4ZWN1dGVIb29rKCdiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gY3VycmVudE5vZGUuYXR0cmlidXRlcztcbiAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYXR0cmlidXRlczsgaWYgbm90IHdlIG1pZ2h0IGhhdmUgYSB0ZXh0IG5vZGUgKi9cblxuICAgICAgaWYgKCFhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhvb2tFdmVudCA9IHtcbiAgICAgICAgYXR0ck5hbWU6ICcnLFxuICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICBrZWVwQXR0cjogdHJ1ZSxcbiAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXM6IEFMTE9XRURfQVRUUlxuICAgICAgfTtcbiAgICAgIGwgPSBhdHRyaWJ1dGVzLmxlbmd0aDtcbiAgICAgIC8qIEdvIGJhY2t3YXJkcyBvdmVyIGFsbCBhdHRyaWJ1dGVzOyBzYWZlbHkgcmVtb3ZlIGJhZCBvbmVzICovXG5cbiAgICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgYXR0ciA9IGF0dHJpYnV0ZXNbbF07XG4gICAgICAgIHZhciBfYXR0ciA9IGF0dHIsXG4gICAgICAgICAgICBuYW1lID0gX2F0dHIubmFtZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IF9hdHRyLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgdmFsdWUgPSBuYW1lID09PSAndmFsdWUnID8gYXR0ci52YWx1ZSA6IHN0cmluZ1RyaW0oYXR0ci52YWx1ZSk7XG4gICAgICAgIGxjTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKG5hbWUpO1xuICAgICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG5cbiAgICAgICAgaG9va0V2ZW50LmF0dHJOYW1lID0gbGNOYW1lO1xuICAgICAgICBob29rRXZlbnQuYXR0clZhbHVlID0gdmFsdWU7XG4gICAgICAgIGhvb2tFdmVudC5rZWVwQXR0ciA9IHRydWU7XG4gICAgICAgIGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyID0gdW5kZWZpbmVkOyAvLyBBbGxvd3MgZGV2ZWxvcGVycyB0byBzZWUgdGhpcyBpcyBhIHByb3BlcnR5IHRoZXkgY2FuIHNldFxuXG4gICAgICAgIF9leGVjdXRlSG9vaygndXBvblNhbml0aXplQXR0cmlidXRlJywgY3VycmVudE5vZGUsIGhvb2tFdmVudCk7XG5cbiAgICAgICAgdmFsdWUgPSBob29rRXZlbnQuYXR0clZhbHVlO1xuICAgICAgICAvKiBEaWQgdGhlIGhvb2tzIGFwcHJvdmUgb2YgdGhlIGF0dHJpYnV0ZT8gKi9cblxuICAgICAgICBpZiAoaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBSZW1vdmUgYXR0cmlidXRlICovXG5cblxuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG5cblxuICAgICAgICBpZiAoIWhvb2tFdmVudC5rZWVwQXR0cikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8qIFdvcmsgYXJvdW5kIGEgc2VjdXJpdHkgaXNzdWUgaW4galF1ZXJ5IDMuMCAqL1xuXG5cbiAgICAgICAgaWYgKCFBTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgJiYgcmVnRXhwVGVzdCgvXFwvPi9pLCB2YWx1ZSkpIHtcbiAgICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8qIFNhbml0aXplIGF0dHJpYnV0ZSBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cblxuXG4gICAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIE1VU1RBQ0hFX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIEVSQl9FWFBSJDEsICcgJyk7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBUTVBMSVRfRVhQUiQxLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIC8qIElzIGB2YWx1ZWAgdmFsaWQgZm9yIHRoaXMgYXR0cmlidXRlPyAqL1xuXG5cbiAgICAgICAgdmFyIGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmMoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuXG4gICAgICAgIGlmICghX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLyogRnVsbCBET00gQ2xvYmJlcmluZyBwcm90ZWN0aW9uIHZpYSBuYW1lc3BhY2UgaXNvbGF0aW9uLFxuICAgICAgICAgKiBQcmVmaXggaWQgYW5kIG5hbWUgYXR0cmlidXRlcyB3aXRoIGB1c2VyLWNvbnRlbnQtYFxuICAgICAgICAgKi9cblxuXG4gICAgICAgIGlmIChTQU5JVElaRV9OQU1FRF9QUk9QUyAmJiAobGNOYW1lID09PSAnaWQnIHx8IGxjTmFtZSA9PT0gJ25hbWUnKSkge1xuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhpcyB2YWx1ZVxuICAgICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpOyAvLyBQcmVmaXggdGhlIHZhbHVlIGFuZCBsYXRlciByZS1jcmVhdGUgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW5pdGl6ZWQgdmFsdWVcblxuXG4gICAgICAgICAgdmFsdWUgPSBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBIYW5kbGUgYXR0cmlidXRlcyB0aGF0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlcyAqL1xuXG5cbiAgICAgICAgaWYgKHRydXN0ZWRUeXBlc1BvbGljeSAmJiBfdHlwZW9mKHRydXN0ZWRUeXBlcykgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0cnVzdGVkVHlwZXMuZ2V0QXR0cmlidXRlVHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIDsgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlKGxjVGFnLCBsY05hbWUpKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRIVE1MJzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYXNlICdUcnVzdGVkU2NyaXB0VVJMJzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVTY3JpcHRVUkwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiBIYW5kbGUgaW52YWxpZCBkYXRhLSogYXR0cmlidXRlIHNldCBieSB0cnktY2F0Y2hpbmcgaXQgKi9cblxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHNldEF0dHJpYnV0ZSgpIGZvciBicm93c2VyLXVucmVjb2duaXplZCBuYW1lc3BhY2VzIGUuZy4gXCJ4LXNjaGVtYVwiLiAqL1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhcnJheVBvcChET01QdXJpZnkucmVtb3ZlZCk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG5cblxuICAgICAgX2V4ZWN1dGVIb29rKCdhZnRlclNhbml0aXplQXR0cmlidXRlcycsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIF9zYW5pdGl6ZVNoYWRvd0RPTVxuICAgICAqXG4gICAgICogQHBhcmFtICB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnQgdG8gaXRlcmF0ZSBvdmVyIHJlY3Vyc2l2ZWx5XG4gICAgICovXG5cblxuICAgIHZhciBfc2FuaXRpemVTaGFkb3dET00gPSBmdW5jdGlvbiBfc2FuaXRpemVTaGFkb3dET00oZnJhZ21lbnQpIHtcbiAgICAgIHZhciBzaGFkb3dOb2RlO1xuXG4gICAgICB2YXIgc2hhZG93SXRlcmF0b3IgPSBfY3JlYXRlSXRlcmF0b3IoZnJhZ21lbnQpO1xuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuXG5cbiAgICAgIF9leGVjdXRlSG9vaygnYmVmb3JlU2FuaXRpemVTaGFkb3dET00nLCBmcmFnbWVudCwgbnVsbCk7XG5cbiAgICAgIHdoaWxlIChzaGFkb3dOb2RlID0gc2hhZG93SXRlcmF0b3IubmV4dE5vZGUoKSkge1xuICAgICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICAgIF9leGVjdXRlSG9vaygndXBvblNhbml0aXplU2hhZG93Tm9kZScsIHNoYWRvd05vZGUsIG51bGwpO1xuICAgICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuXG5cbiAgICAgICAgaWYgKF9zYW5pdGl6ZUVsZW1lbnRzKHNoYWRvd05vZGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLyogRGVlcCBzaGFkb3cgRE9NIGRldGVjdGVkICovXG5cblxuICAgICAgICBpZiAoc2hhZG93Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICAgIF9zYW5pdGl6ZVNoYWRvd0RPTShzaGFkb3dOb2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMsIHNhbml0aXplIGlmIG5lY2Vzc2FyeSAqL1xuXG5cbiAgICAgICAgX3Nhbml0aXplQXR0cmlidXRlcyhzaGFkb3dOb2RlKTtcbiAgICAgIH1cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cblxuXG4gICAgICBfZXhlY3V0ZUhvb2soJ2FmdGVyU2FuaXRpemVTaGFkb3dET00nLCBmcmFnbWVudCwgbnVsbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYW5pdGl6ZVxuICAgICAqIFB1YmxpYyBtZXRob2QgcHJvdmlkaW5nIGNvcmUgc2FuaXRhdGlvbiBmdW5jdGlvbmFsaXR5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xOb2RlfSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuXG5cbiAgICBET01QdXJpZnkuc2FuaXRpemUgPSBmdW5jdGlvbiAoZGlydHkpIHtcbiAgICAgIHZhciBjZmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIGJvZHk7XG4gICAgICB2YXIgaW1wb3J0ZWROb2RlO1xuICAgICAgdmFyIGN1cnJlbnROb2RlO1xuICAgICAgdmFyIG9sZE5vZGU7XG4gICAgICB2YXIgcmV0dXJuTm9kZTtcbiAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc3RyaW5nIHRvIHNhbml0aXplLlxuICAgICAgICBETyBOT1QgcmV0dXJuIGVhcmx5LCBhcyB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGlmXG4gICAgICAgIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBET00gb2JqZWN0IHJhdGhlciB0aGFuIGEgc3RyaW5nICovXG5cbiAgICAgIElTX0VNUFRZX0lOUFVUID0gIWRpcnR5O1xuXG4gICAgICBpZiAoSVNfRU1QVFlfSU5QVVQpIHtcbiAgICAgICAgZGlydHkgPSAnPCEtLT4nO1xuICAgICAgfVxuICAgICAgLyogU3RyaW5naWZ5LCBpbiBjYXNlIGRpcnR5IGlzIGFuIG9iamVjdCAqL1xuXG5cbiAgICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnICYmICFfaXNOb2RlKGRpcnR5KSkge1xuICAgICAgICBpZiAodHlwZW9mIGRpcnR5LnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZGlydHkgPSBkaXJ0eS50b1N0cmluZygpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgnZGlydHkgaXMgbm90IGEgc3RyaW5nLCBhYm9ydGluZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ3RvU3RyaW5nIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIENoZWNrIHdlIGNhbiBydW4uIE90aGVyd2lzZSBmYWxsIGJhY2sgb3IgaWdub3JlICovXG5cblxuICAgICAgaWYgKCFET01QdXJpZnkuaXNTdXBwb3J0ZWQpIHtcbiAgICAgICAgaWYgKF90eXBlb2Yod2luZG93LnRvU3RhdGljSFRNTCkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB3aW5kb3cudG9TdGF0aWNIVE1MID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cudG9TdGF0aWNIVE1MKGRpcnR5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cudG9TdGF0aWNIVE1MKGRpcnR5Lm91dGVySFRNTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgICAgfVxuICAgICAgLyogQXNzaWduIGNvbmZpZyB2YXJzICovXG5cblxuICAgICAgaWYgKCFTRVRfQ09ORklHKSB7XG4gICAgICAgIF9wYXJzZUNvbmZpZyhjZmcpO1xuICAgICAgfVxuICAgICAgLyogQ2xlYW4gdXAgcmVtb3ZlZCBlbGVtZW50cyAqL1xuXG5cbiAgICAgIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG4gICAgICAvKiBDaGVjayBpZiBkaXJ0eSBpcyBjb3JyZWN0bHkgdHlwZWQgZm9yIElOX1BMQUNFICovXG5cbiAgICAgIGlmICh0eXBlb2YgZGlydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIElOX1BMQUNFID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChJTl9QTEFDRSkge1xuICAgICAgICAvKiBEbyBzb21lIGVhcmx5IHByZS1zYW5pdGl6YXRpb24gdG8gYXZvaWQgdW5zYWZlIHJvb3Qgbm9kZXMgKi9cbiAgICAgICAgaWYgKGRpcnR5Lm5vZGVOYW1lKSB7XG4gICAgICAgICAgdmFyIHRhZ05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhkaXJ0eS5ub2RlTmFtZSk7XG5cbiAgICAgICAgICBpZiAoIUFMTE9XRURfVEFHU1t0YWdOYW1lXSB8fCBGT1JCSURfVEFHU1t0YWdOYW1lXSkge1xuICAgICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKCdyb290IG5vZGUgaXMgZm9yYmlkZGVuIGFuZCBjYW5ub3QgYmUgc2FuaXRpemVkIGluLXBsYWNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcnR5IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAvKiBJZiBkaXJ0eSBpcyBhIERPTSBlbGVtZW50LCBhcHBlbmQgdG8gYW4gZW1wdHkgZG9jdW1lbnQgdG8gYXZvaWRcbiAgICAgICAgICAgZWxlbWVudHMgYmVpbmcgc3RyaXBwZWQgYnkgdGhlIHBhcnNlciAqL1xuICAgICAgICBib2R5ID0gX2luaXREb2N1bWVudCgnPCEtLS0tPicpO1xuICAgICAgICBpbXBvcnRlZE5vZGUgPSBib2R5Lm93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZShkaXJ0eSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGltcG9ydGVkTm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICAgIC8qIE5vZGUgaXMgYWxyZWFkeSBhIGJvZHksIHVzZSBhcyBpcyAqL1xuICAgICAgICAgIGJvZHkgPSBpbXBvcnRlZE5vZGU7XG4gICAgICAgIH0gZWxzZSBpZiAoaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmRcbiAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKGltcG9ydGVkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEV4aXQgZGlyZWN0bHkgaWYgd2UgaGF2ZSBub3RoaW5nIHRvIGRvICovXG4gICAgICAgIGlmICghUkVUVVJOX0RPTSAmJiAhU0FGRV9GT1JfVEVNUExBVEVTICYmICFXSE9MRV9ET0NVTUVOVCAmJiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaW5jbHVkZXNcbiAgICAgICAgZGlydHkuaW5kZXhPZignPCcpID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRSA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKGRpcnR5KSA6IGRpcnR5O1xuICAgICAgICB9XG4gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGRvY3VtZW50IHRvIHdvcmsgb24gKi9cblxuXG4gICAgICAgIGJvZHkgPSBfaW5pdERvY3VtZW50KGRpcnR5KTtcbiAgICAgICAgLyogQ2hlY2sgd2UgaGF2ZSBhIERPTSBub2RlIGZyb20gdGhlIGRhdGEgKi9cblxuICAgICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gUkVUVVJOX0RPTSA/IG51bGwgOiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gZW1wdHlIVE1MIDogJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIFJlbW92ZSBmaXJzdCBlbGVtZW50IG5vZGUgKG91cnMpIGlmIEZPUkNFX0JPRFkgaXMgc2V0ICovXG5cblxuICAgICAgaWYgKGJvZHkgJiYgRk9SQ0VfQk9EWSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoYm9keS5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICAgIC8qIEdldCBub2RlIGl0ZXJhdG9yICovXG5cblxuICAgICAgdmFyIG5vZGVJdGVyYXRvciA9IF9jcmVhdGVJdGVyYXRvcihJTl9QTEFDRSA/IGRpcnR5IDogYm9keSk7XG4gICAgICAvKiBOb3cgc3RhcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgKi9cblxuXG4gICAgICB3aGlsZSAoY3VycmVudE5vZGUgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkge1xuICAgICAgICAvKiBGaXggSUUncyBzdHJhbmdlIGJlaGF2aW9yIHdpdGggbWFuaXB1bGF0ZWQgdGV4dE5vZGVzICM4OSAqL1xuICAgICAgICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgPT09IDMgJiYgY3VycmVudE5vZGUgPT09IG9sZE5vZGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuXG5cbiAgICAgICAgaWYgKF9zYW5pdGl6ZUVsZW1lbnRzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8qIFNoYWRvdyBET00gZGV0ZWN0ZWQsIHNhbml0aXplIGl0ICovXG5cblxuICAgICAgICBpZiAoY3VycmVudE5vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgICBfc2FuaXRpemVTaGFkb3dET00oY3VycmVudE5vZGUuY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcywgc2FuaXRpemUgaWYgbmVjZXNzYXJ5ICovXG5cblxuICAgICAgICBfc2FuaXRpemVBdHRyaWJ1dGVzKGN1cnJlbnROb2RlKTtcblxuICAgICAgICBvbGROb2RlID0gY3VycmVudE5vZGU7XG4gICAgICB9XG5cbiAgICAgIG9sZE5vZGUgPSBudWxsO1xuICAgICAgLyogSWYgd2Ugc2FuaXRpemVkIGBkaXJ0eWAgaW4tcGxhY2UsIHJldHVybiBpdC4gKi9cblxuICAgICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICAgIHJldHVybiBkaXJ0eTtcbiAgICAgIH1cbiAgICAgIC8qIFJldHVybiBzYW5pdGl6ZWQgc3RyaW5nIG9yIERPTSAqL1xuXG5cbiAgICAgIGlmIChSRVRVUk5fRE9NKSB7XG4gICAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgICAgcmV0dXJuTm9kZSA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQuY2FsbChib2R5Lm93bmVyRG9jdW1lbnQpO1xuXG4gICAgICAgICAgd2hpbGUgKGJvZHkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgICAgcmV0dXJuTm9kZS5hcHBlbmRDaGlsZChib2R5LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5Ob2RlID0gYm9keTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBTExPV0VEX0FUVFIuc2hhZG93cm9vdCB8fCBBTExPV0VEX0FUVFIuc2hhZG93cm9vdG1vZCkge1xuICAgICAgICAgIC8qXG4gICAgICAgICAgICBBZG9wdE5vZGUoKSBpcyBub3QgdXNlZCBiZWNhdXNlIGludGVybmFsIHN0YXRlIGlzIG5vdCByZXNldFxuICAgICAgICAgICAgKGUuZy4gdGhlIHBhc3QgbmFtZXMgbWFwIG9mIGEgSFRNTEZvcm1FbGVtZW50KSwgdGhpcyBpcyBzYWZlXG4gICAgICAgICAgICBpbiB0aGVvcnkgYnV0IHdlIHdvdWxkIHJhdGhlciBub3QgcmlzayBhbm90aGVyIGF0dGFjayB2ZWN0b3IuXG4gICAgICAgICAgICBUaGUgc3RhdGUgdGhhdCBpcyBjbG9uZWQgYnkgaW1wb3J0Tm9kZSgpIGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgICAgICAgICAgYnkgdGhlIHNwZWNzLlxuICAgICAgICAgICovXG4gICAgICAgICAgcmV0dXJuTm9kZSA9IGltcG9ydE5vZGUuY2FsbChvcmlnaW5hbERvY3VtZW50LCByZXR1cm5Ob2RlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5Ob2RlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VyaWFsaXplZEhUTUwgPSBXSE9MRV9ET0NVTUVOVCA/IGJvZHkub3V0ZXJIVE1MIDogYm9keS5pbm5lckhUTUw7XG4gICAgICAvKiBTZXJpYWxpemUgZG9jdHlwZSBpZiBhbGxvd2VkICovXG5cbiAgICAgIGlmIChXSE9MRV9ET0NVTUVOVCAmJiBBTExPV0VEX1RBR1NbJyFkb2N0eXBlJ10gJiYgYm9keS5vd25lckRvY3VtZW50ICYmIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlICYmIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlLm5hbWUgJiYgcmVnRXhwVGVzdChET0NUWVBFX05BTUUsIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlLm5hbWUpKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gJzwhRE9DVFlQRSAnICsgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSArICc+XFxuJyArIHNlcmlhbGl6ZWRIVE1MO1xuICAgICAgfVxuICAgICAgLyogU2FuaXRpemUgZmluYWwgc3RyaW5nIHRlbXBsYXRlLXNhZmUgKi9cblxuXG4gICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgTVVTVEFDSEVfRVhQUiQxLCAnICcpO1xuICAgICAgICBzZXJpYWxpemVkSFRNTCA9IHN0cmluZ1JlcGxhY2Uoc2VyaWFsaXplZEhUTUwsIEVSQl9FWFBSJDEsICcgJyk7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgVE1QTElUX0VYUFIkMSwgJyAnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoc2VyaWFsaXplZEhUTUwpIDogc2VyaWFsaXplZEhUTUw7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHNldCB0aGUgY29uZmlndXJhdGlvbiBvbmNlXG4gICAgICogc2V0Q29uZmlnXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICovXG5cblxuICAgIERPTVB1cmlmeS5zZXRDb25maWcgPSBmdW5jdGlvbiAoY2ZnKSB7XG4gICAgICBfcGFyc2VDb25maWcoY2ZnKTtcblxuICAgICAgU0VUX0NPTkZJRyA9IHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgY29uZmlndXJhdGlvblxuICAgICAqIGNsZWFyQ29uZmlnXG4gICAgICpcbiAgICAgKi9cblxuXG4gICAgRE9NUHVyaWZ5LmNsZWFyQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgICAgQ09ORklHID0gbnVsbDtcbiAgICAgIFNFVF9DT05GSUcgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gY2hlY2sgaWYgYW4gYXR0cmlidXRlIHZhbHVlIGlzIHZhbGlkLlxuICAgICAqIFVzZXMgbGFzdCBzZXQgY29uZmlnLCBpZiBhbnkuIE90aGVyd2lzZSwgdXNlcyBjb25maWcgZGVmYXVsdHMuXG4gICAgICogaXNWYWxpZEF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB0YWcgVGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gYXR0ciBBdHRyaWJ1dGUgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxuICAgICAqL1xuXG5cbiAgICBET01QdXJpZnkuaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICh0YWcsIGF0dHIsIHZhbHVlKSB7XG4gICAgICAvKiBJbml0aWFsaXplIHNoYXJlZCBjb25maWcgdmFycyBpZiBuZWNlc3NhcnkuICovXG4gICAgICBpZiAoIUNPTkZJRykge1xuICAgICAgICBfcGFyc2VDb25maWcoe30pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGNUYWcgPSB0cmFuc2Zvcm1DYXNlRnVuYyh0YWcpO1xuICAgICAgdmFyIGxjTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKGF0dHIpO1xuICAgICAgcmV0dXJuIF9pc1ZhbGlkQXR0cmlidXRlKGxjVGFnLCBsY05hbWUsIHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZEhvb2tcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIGFkZCBET01QdXJpZnkgaG9va3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgICAqL1xuXG5cbiAgICBET01QdXJpZnkuYWRkSG9vayA9IGZ1bmN0aW9uIChlbnRyeVBvaW50LCBob29rRnVuY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgaG9va0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaG9va3NbZW50cnlQb2ludF0gPSBob29rc1tlbnRyeVBvaW50XSB8fCBbXTtcbiAgICAgIGFycmF5UHVzaChob29rc1tlbnRyeVBvaW50XSwgaG9va0Z1bmN0aW9uKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZUhvb2tcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIG1vcmUgYXJlIHByZXNlbnQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybiB7RnVuY3Rpb259IHJlbW92ZWQocG9wcGVkKSBob29rXG4gICAgICovXG5cblxuICAgIERPTVB1cmlmeS5yZW1vdmVIb29rID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQpIHtcbiAgICAgIGlmIChob29rc1tlbnRyeVBvaW50XSkge1xuICAgICAgICByZXR1cm4gYXJyYXlQb3AoaG9va3NbZW50cnlQb2ludF0pO1xuICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlSG9va3NcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSBhbGwgRE9NUHVyaWZ5IGhvb2tzIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9va3MgdG8gcmVtb3ZlXG4gICAgICovXG5cblxuICAgIERPTVB1cmlmeS5yZW1vdmVIb29rcyA9IGZ1bmN0aW9uIChlbnRyeVBvaW50KSB7XG4gICAgICBpZiAoaG9va3NbZW50cnlQb2ludF0pIHtcbiAgICAgICAgaG9va3NbZW50cnlQb2ludF0gPSBbXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZUFsbEhvb2tzXG4gICAgICogUHVibGljIG1ldGhvZCB0byByZW1vdmUgYWxsIERPTVB1cmlmeSBob29rc1xuICAgICAqXG4gICAgICovXG5cblxuICAgIERPTVB1cmlmeS5yZW1vdmVBbGxIb29rcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGhvb2tzID0ge307XG4gICAgfTtcblxuICAgIHJldHVybiBET01QdXJpZnk7XG4gIH1cblxuICB2YXIgcHVyaWZ5ID0gY3JlYXRlRE9NUHVyaWZ5KCk7XG5cbiAgcmV0dXJuIHB1cmlmeTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVyaWZ5LmpzLm1hcFxuIiwiaW1wb3J0IHsgUHJvcGVydGllcyB9IGZyb20gJy4vcHJvcGVydGllcyc7XG5pbXBvcnQgeyByZW5kZXJMYXRleCB9IGZyb20gJy4vbGF0ZXgnO1xuaW1wb3J0IHsgcmVuZGVyTWF0aE1MIH0gZnJvbSAnLi9tYXRobWwnO1xuaW1wb3J0IHsgYnlwYXNzRW5jYXBzdWxhdGlvbiB9IGZyb20gJy4vcmV0cm8nO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIHZpZXdlcjoge1xuICAgICAgcHJvcGVydGllczogUHJvcGVydGllcyxcbiAgICAgIGlzTG9hZGVkOiBib29sZWFuXG4gICAgfTtcbiAgfVxufVxuXG4vLyBUaGlzIHNob3VsZCBiZSB0aGUgb25seSBjb2RlIGV4ZWN1dGVkIG91dHNpZGUgb2YgYSBmdW5jdGlvblxuLy8gYW5kIHRoZSBvbmx5IGNvZGUgY29udGFpbmluZyBicm93c2VyIGdsb2JhbHMgKGUuZy4gd2luZG93KVxuLy8gVE9ETyB0cnkgdG8gc2V0IHVwIHRoZSBsaW50ZXIgdG8gY2hlY2sgdGhlc2UgdHdvIGNvbnN0cmFpbnRzXG5tYWluKHdpbmRvdyk7XG5cbi8qKlxuICogSW5pdGlhbCBmdW5jdGlvbiBjYWxsZWQgd2hlbiBsb2FkaW5nIHRoZSBzY3JpcHQuXG4gKiBAcGFyYW0ge1dpbmRvd30gdyAtIFRoZSB3aW5kb3cgaW5zdGFuY2Ugb2YgdGhlIGJyb3dzZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1haW4odzogV2luZG93KTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgY29uc3QgcHJvcGVydGllczogUHJvcGVydGllcyA9IGF3YWl0IFByb3BlcnRpZXMuZ2VuZXJhdGUoKTtcblxuICAvLyBFeHBvc2UgdGhlIGdsb2JhbHMgdG8gdGhlIGJyb3dzZXJcbiAgaWYgKCF3LnZpZXdlcikge1xuICAgIHcudmlld2VyID0ge1xuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZG9jdW1lbnQgPSB3LmRvY3VtZW50O1xuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgRE9NIGxvb2tpbmcgZm9yIExhVGVYIGFuZCA8bWF0aD4gZWxlbWVudHMuXG4gICAqIFJlcGxhY2VzIHRoZW0gd2l0aCB0aGUgY29ycmVzcG9uZGluZyByZW5kZXJlZCBpbWFnZXMgd2l0aGluIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0RvY3VtZW50fSBkb2N1bWVudCAtIFRoZSBET00gZG9jdW1lbnQgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgcmVuZGVyaW5nIHJvb3QuXG4gICAqIEBwYXJhbSB7TXV0YXRpb25PYnNlcnZlcn0gb2JzZXJ2ZXIgLSBNdXRhdGlvbiBvYnNlcnZlciB0byBhY3RpdmF0ZSBvciByZWFjdGl2YXRlIGV2ZXJ5IHRpbWUgdGhlIHJlbmRlcmluZyByb290IGNoYW5nZXMuXG4gICAqL1xuICBwcm9wZXJ0aWVzLnJlbmRlciA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocHJvcGVydGllcy5lbGVtZW50KTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgYXdhaXQgcmVuZGVyTGF0ZXgocHJvcGVydGllcywgZWxlbWVudCk7XG4gICAgICBhd2FpdCByZW5kZXJNYXRoTUwocHJvcGVydGllcywgZWxlbWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEluaXRpYWwgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIGRvY3VtZW50IGlzIGxvYWRlZFxuICAvLyBSZW5kZXJzIGZvcm11bGFzIGFuZCBzZXRzIG9ic2VydmVyXG4gIGNvbnN0IHN0YXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSB2aWV3ZXIgaXMgYWxyZWR5IGxvYWRlZFxuICAgIGlmICh3LnZpZXdlci5pc0xvYWRlZCkgcmV0dXJuO1xuXG4gICAgdy52aWV3ZXIuaXNMb2FkZWQgPSB0cnVlO1xuXG4gICAgLy8gRmlyc3QgcmVuZGVyXG4gICAgcHJvcGVydGllcy5yZW5kZXIoKTtcblxuICAgIC8vIENhbGxiYWNrIGNhbGxlZCBldmVyeSB0aW1lIHRoZXJlIGlzIGEgbXV0YXRpb24gaW4gdGhlIHdhdGNoZWQgRE9NIGVsZW1lbnRcbiAgICAvLyBGZWF0dXJlIHRlbXBvcmFyaWx5IGRpc2FibGVkIGR1ZSB0byBLQi0zNzgzNFxuICAgIC8vIG5ldyBNdXRhdGlvbk9ic2VydmVyKGFzeW5jIChtdXRhdGlvbkxpc3QsIG9ic2VydmVyKSA9PiB7XG4gICAgLy8gICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xuICAgIC8vICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgbXV0YXRpb24uYWRkZWROb2Rlcykge1xuICAgIC8vICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAvLyAgICAgICAgIGF3YWl0IHByb3BlcnRpZXMucmVuZGVyKCk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICB9XG4gICAgLy8gfSlcbiAgICAvLyAvLyBXZSBuZWVkIHRvIHdhdGNoIG92ZXIgdGhlIHdob2xlIGRvY3VtZW50LCBpbiBjYXNlIHRoZSBQcm9wZXJ0aWVzLmVsZW1lbnQgaXMgaW5zZXJ0ZWRcbiAgICAvLyAvLyBlLmcuIHdlIHNldCBQcm9wZXJ0aWVzLmVsZW1lbnQgPSAnI3JlbmRlckFyZWEnIGFuZCB0aGVuIHdlIGFwcGVuZCA8ZGl2IGlkPVwicmVuZGVyQXJlYVwiPiQkMisyPTQkJDwvZGl2PiB0byB0aGUgZG9jdW1lbnRcbiAgICAvLyAub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgIC8vICAgYXR0cmlidXRlczogdHJ1ZSwgLy8gSW4gY2FzZSBhbiBhdHRyaWJ1dGUgaXMgY2hhbmdlZCBpbiBhIDxtYXRoPiBub2RlLCBmb3IgaW5zdGFuY2VcbiAgICAvLyAgIGNoaWxkTGlzdDogdHJ1ZSwgLy8gSW4gY2FzZSBhIG5ldyA8bWF0aD4gb3IgJCRsYXRleCQkIG5vZGUgaXMgYWRkZWQsIGZvciBpbnN0YW5jZVxuICAgIC8vICAgc3VidHJlZTogdHJ1ZSwgLy8gSW4gY2FzZSBhIDxtYXRoPiBub2RlIGlzIGFkZGVkIGFzIGEgZGVzY2VuZGFudCBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudCwgZm9yIGluc3RhbmNlXG4gICAgLy8gfSk7XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L0RPTUNvbnRlbnRMb2FkZWRfZXZlbnQjY2hlY2tpbmdfd2hldGhlcl9sb2FkaW5nX2lzX2FscmVhZHlfY29tcGxldGVcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgLy8gTG9hZGluZyBoYXNuJ3QgZmluaXNoZWQgeWV0XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgc3RhcnQpO1xuICB9IGVsc2Uge1xuICAgIC8vIGBET01Db250ZW50TG9hZGVkYCBoYXMgYWxyZWFkeSBmaXJlZFxuICAgIHN0YXJ0KCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdGhlIG9sZCBWaWV3ZXIgQVBJIGFzIGEgZ2xvYmFsXG4gIGJ5cGFzc0VuY2Fwc3VsYXRpb24ocHJvcGVydGllcywgdyk7XG5cbiAgLy8gRGlzcGF0Y2ggYW4gZXZlbnQgbm90aWZ5aW5nIHRoYXQgdGhlIHZpZXdlciBoYXMgYmVlbiBsb2FkZWRcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3ZpZXdlckxvYWRlZCcpKTtcbn1cbiIsImltcG9ydCB7IGxhdGV4VG9NYXRobWwgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7IFByb3BlcnRpZXMgfSBmcm9tICcuL3Byb3BlcnRpZXMnO1xuXG5pbnRlcmZhY2UgTGF0ZXhQb3NpdGlvbiB7XG4gIHN0YXJ0OiBudW1iZXIsXG4gIGVuZDogbnVtYmVyLFxufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBET00gbG9va2luZyBmb3IgTGFUZVggbm9kZXMgYW5kIHJlcGxhY2VzIHRoZW0gd2l0aCB0aGUgY29ycmVzcG9uZGluZyByZW5kZXJlZCBpbWFnZXMuXG4gKiBAcGFyYW0ge1Byb3BlcnRpZXN9IHByb3BlcnRpZXMgLSBQcm9wZXJ0aWVzIG9mIHRoZSB2aWV3ZXIuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb290IC0gQW55IERPTSBlbGVtZW50IHRoYXQgY2FuIGNvbnRhaW4gTWF0aE1MLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyTGF0ZXgocHJvcGVydGllczogUHJvcGVydGllcywgcm9vdDogSFRNTEVsZW1lbnQpIHtcblxuICBpZiAocHJvcGVydGllcy52aWV3ZXIgIT09ICdpbWFnZScgJiYgcHJvcGVydGllcy52aWV3ZXIgIT09ICdsYXRleCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBsYXRleE5vZGVzID0gZmluZExhdGV4VGV4dE5vZGVzKHJvb3QpO1xuXG4gIGZvciAoY29uc3QgbGF0ZXhOb2RlIG9mIGxhdGV4Tm9kZXMpIHtcbiAgICBhd2FpdCByZXBsYWNlTGF0ZXhJblRleHROb2RlKHByb3BlcnRpZXMsIGxhdGV4Tm9kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXBsYWNlIExhVGVYIGluc3RhbmNlcyB3aXRoIE1hdGhNTCBpbnNpZGUgYSBnaXZlbiBub2RlLlxuICogQHBhcmFtIHtQcm9wZXJ0aWVzfSBwcm9wZXJ0aWVzIC0gUHJvcGVydGllcyBvZiB0aGUgdmlld2VyLlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGV4dCBub2RlIGluIHdoaWNoIHRvIHNlYXJjaCBhbmQgcmVwbGFjZSBMYVRlWCBpbnN0YW5jZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VMYXRleEluVGV4dE5vZGUocHJvcGVydGllczogUHJvcGVydGllcywgbm9kZTogTm9kZSkge1xuICBjb25zdCB0ZXh0Q29udGVudDogc3RyaW5nID0gbm9kZS50ZXh0Q29udGVudCB8fCAnJztcbiAgbGV0IHBvczogbnVtYmVyID0gMDtcblxuICB3aGlsZSAocG9zIDwgdGV4dENvbnRlbnQubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV4dExhdGV4UG9zaXRpb246IExhdGV4UG9zaXRpb24gPSBnZXROZXh0TGF0ZXhQb3MocG9zLCB0ZXh0Q29udGVudCk7XG4gICAgaWYgKG5leHRMYXRleFBvc2l0aW9uKSB7XG4gICAgICAvLyBHZXQgbGVmdCBub24gTGFUZVggdGV4dC5cbiAgICAgIGNvbnN0IGxlZnRUZXh0OiBzdHJpbmcgPSB0ZXh0Q29udGVudC5zdWJzdHJpbmcocG9zLCBuZXh0TGF0ZXhQb3NpdGlvbi5zdGFydCk7XG4gICAgICBjb25zdCBsZWZ0VGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWZ0VGV4dCk7XG4gICAgICAvLyBDcmVhdGUgYSBub2RlIHdpdGggbGVmdCB0ZXh0LlxuICAgICAgbm9kZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUobGVmdFRleHROb2RlLCBub2RlKTtcbiAgICAgIG5vZGUubm9kZVZhbHVlID0gbm9kZS5ub2RlVmFsdWUuc3Vic3RyaW5nKHBvcywgbmV4dExhdGV4UG9zaXRpb24uc3RhcnQpO1xuXG4gICAgICAvLyBHZXQgTGFUZVggdGV4dC5cbiAgICAgIGNvbnN0IGxhdGV4ID0gdGV4dENvbnRlbnQuc3Vic3RyaW5nKG5leHRMYXRleFBvc2l0aW9uLnN0YXJ0ICsgJyQkJy5sZW5ndGgsIG5leHRMYXRleFBvc2l0aW9uLmVuZCk7XG4gICAgICAvLyBDb252ZXJ0IExhVGVYIHRvIG1hdGhtbC5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbGF0ZXhUb01hdGhtbChsYXRleCwgcHJvcGVydGllcy5lZGl0b3JTZXJ2aWNlc1Jvb3QsIHByb3BlcnRpZXMuZWRpdG9yU2VydmljZXNFeHRlbnNpb24pO1xuICAgICAgLy8gSW5zZXJ0IG1hdGhtbCBub2RlLlxuICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChyZXNwb25zZS50ZXh0KTtcblxuICAgICAgbm9kZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIG5vZGUpO1xuICAgICAgbm9kZS5ub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZS5zdWJzdHJpbmcobmV4dExhdGV4UG9zaXRpb24uc3RhcnQsIG5leHRMYXRleFBvc2l0aW9uLmVuZCk7XG5cbiAgICAgIHBvcyA9IG5leHRMYXRleFBvc2l0aW9uLmVuZCArICckJCcubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBtb3JlIExhVGVYIG5vZGUgZm91bmQuXG4gICAgICBjb25zdCB0ZXh0ID0gdGV4dENvbnRlbnQuc3Vic3RyaW5nKHBvcyk7XG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICAgICAgbm9kZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIG5vZGUpO1xuICAgICAgbm9kZS5ub2RlVmFsdWUgPSAnJztcbiAgICAgIHBvcyA9IHRleHRDb250ZW50Lmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICAvLyBEZWxldGUgb3JpZ2luYWwgdGV4dCBub2RlLlxuICBub2RlLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKG5vZGUpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBIVE1MIExhVGVYIG5vZGVzLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdCAtIEFueSBET00gZWxlbWVudCB0aGF0IGNhbiBjb250YWluIExhVGVYLlxuICogQHJldHVybnMge05vZGVbXX0gQXJyYXkgd2l0aCBhbGwgSFRNTCBMYVRlWCBub2RlcyBpbnNpZGUgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZmluZExhdGV4VGV4dE5vZGVzKHJvb3Q6IGFueSk6IE5vZGVbXSB7XG4gIGNvbnN0IG5vZGVJdGVyYXRvcjogTm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKFxuICAgIHJvb3QsXG4gICAgTm9kZUZpbHRlci5TSE9XX1RFWFQsXG4gICAgbm9kZSA9PiAvKFxcJFxcJCkoLiopKFxcJFxcJCkvLnRlc3Qobm9kZS5ub2RlVmFsdWUgfHwgJycpID8gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUIDogTm9kZUZpbHRlci5GSUxURVJfUkVKRUNUXG4gICk7XG4gIGNvbnN0IGxhdGV4Tm9kZXMgOiBOb2RlW10gPSBbXTtcblxuICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsO1xuICB3aGlsZSAoY3VycmVudE5vZGUgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkge1xuICAgIGxhdGV4Tm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gbGF0ZXhOb2Rlcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB7c3RhcnQsIGVuZH0gd2l0aCB0aGUgc3RhcnQgYW5kIGVuZCBsYXRleCBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3MgLSBDdXJyZW50IHBvc2l0aW9uIGluc2lkZSB0aGUgdGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGV4dCB3aGVyZSB0aGUgbmV4dCBsYXRleCBpdCB3aWxsIGJlIHNlYXJjaGVkLlxuICogQFxuICovXG5mdW5jdGlvbiBnZXROZXh0TGF0ZXhQb3MocG9zOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IExhdGV4UG9zaXRpb24ge1xuICBjb25zdCBmaXJzdExhdGV4VGFncyA9IHRleHQuaW5kZXhPZignJCQnLCBwb3MpO1xuICBjb25zdCBzZWNvbmRMYXRleFRhZ3MgPSBmaXJzdExhdGV4VGFncyA9PSAtMSA/IC0xIDogdGV4dC5pbmRleE9mKCckJCcsIGZpcnN0TGF0ZXhUYWdzICsgJyQkJy5sZW5ndGgpO1xuICByZXR1cm4gZmlyc3RMYXRleFRhZ3MgIT0gLTEgJiYgc2Vjb25kTGF0ZXhUYWdzICE9IC0xID8geydzdGFydCc6IGZpcnN0TGF0ZXhUYWdzLCAnZW5kJzogc2Vjb25kTGF0ZXhUYWdzfSA6IG51bGw7XG59XG4iLCJpbXBvcnQgeyBQcm9wZXJ0aWVzIH0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgc2hvd0ltYWdlLCBjcmVhdGVJbWFnZSwgbWF0aG1sMmFjY2Vzc2libGUsIHByb2Nlc3NKc29uUmVzcG9uc2UgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7IGh0bWxFbnRpdGllc1RvWG1sRW50aXRpZXMsIGNvcnJ1cHRNYXRoTUwgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEYXRhIG9idGFpbmVkIHdoZW4gcmVuZGVyaW5nIGltYWdlLiBEYXRhIG5lZWRlZCB0byBzZXQgdGhlIGZvcm11bGEgaW1hZ2UgcGFyYW1ldGVycy5cbiAqL1xuaW50ZXJmYWNlIEZvcm11bGFEYXRhIHtcbiAgY29udGVudDogc3RyaW5nLFxuICBiYXNlbGluZTogc3RyaW5nLFxuICBoZWlnaHQ6IHN0cmluZyxcbiAgd2lkdGg6IHN0cmluZyxcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgRE9NIGxvb2tpbmcgZm9yIDxtYXRoPiBlbGVtZW50cyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcmVuZGVyZWQgaW1hZ2VzIHdpdGhpbiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqIEBwYXJhbSB7UHJvcGVydGllc30gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgb2YgdGhlIHZpZXdlci5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJvb3QgLSBBbnkgRE9NIGVsZW1lbnQgdGhhdCBjYW4gY29udGFpbiBNYXRoTUwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJNYXRoTUwocHJvcGVydGllczogUHJvcGVydGllcywgcm9vdDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblxuICBpZiAocHJvcGVydGllcy52aWV3ZXIgIT09ICdpbWFnZScgJiYgcHJvcGVydGllcy52aWV3ZXIgIT09ICdtYXRobWwnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yKGNvbnN0IG1hdGhFbGVtZW50IG9mIFsuLi5yb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdtYXRoJyldKSB7XG4gICAgY29uc3QgbW1sID0gaHRtbEVudGl0aWVzVG9YbWxFbnRpdGllcyhtYXRoRWxlbWVudC5vdXRlckhUTUwpO1xuXG4gICAgbGV0IHJlc3VsdDtcblxuICAgIGlmIChwcm9wZXJ0aWVzLndpcmlzcGx1Z2lucGVyZm9ybWFuY2UgPT09ICd0cnVlJykge1xuICAgICAgLy8gVHJhbnNmb3JtIG1tbCB0byBpbWcuXG4gICAgICByZXN1bHQgPSBhd2FpdCBzaG93SW1hZ2UobW1sLCBwcm9wZXJ0aWVzLmxhbmcsIHByb3BlcnRpZXMuZWRpdG9yU2VydmljZXNSb290LCBwcm9wZXJ0aWVzLmVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY3JlYXRlaW1hZ2UgcmV0dXJucyB0aGUgVVJMIHRvIHNob3dpbWFnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBpbWFnZVxuICAgICAgbGV0IHVybCA9IGF3YWl0IGNyZWF0ZUltYWdlKG1tbCwgcHJvcGVydGllcy5sYW5nLCBwcm9wZXJ0aWVzLmVkaXRvclNlcnZpY2VzUm9vdCwgcHJvcGVydGllcy5lZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbik7XG4gICAgICAvLyBUaGlzIGxpbmUgaXMgbmVjZXNzYXJ5IGR1ZSB0byBhIGJ1ZyBpbiBob3cgdGhlIHNlcnZpY2VzIGludGVyb3BlcmF0ZS5cbiAgICAgIC8vIFRPRE8gZml4IHRoZSBjYXVzaW5nIGJ1Z1xuICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJ3BsdWdpbnNhcHAnLCAncGx1Z2lucy9hcHAnKTtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NKc29uUmVzcG9uc2UoZmV0Y2godXJsKSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGltZyBwcm9wZXJ0aWVzLlxuICAgIGNvbnN0IGltZyA9IGF3YWl0IHNldEltYWdlUHJvcGVydGllcyhwcm9wZXJ0aWVzLCByZXN1bHQsIG1tbCk7XG4gICAgLy8gY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChkYXRhLnJlc3VsdC5jb250ZW50KTtcblxuICAgIC8vIFJlcGxhY2UgdGhlIE1hdGhNTCBmb3IgdGhlIGdlbmVyYXRlZCBmb3JtdWxhIGltYWdlLlxuICAgIG1hdGhFbGVtZW50LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChpbWcsIG1hdGhFbGVtZW50KTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGltYWdlIGZvcm11bGEgY29udGFpbmluZyBhbGwgTWF0aFR5cGUgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7UHJvcGVydGllc30gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgb2YgdGhlIHZpZXdlci5cbiAqIEBwYXJhbSB7Rm9ybXVsYURhdGF9IGRhdGEgLSBPYmplY3QgY29udGFpbmluZyBpbWFnZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW1sIC0gVGhlIE1hdGhNTCBvZiB0aGUgZm9ybXVsYSBpbWFnZSBiZWVpbmcgY3JlYXRlZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+fSAtIEZvcm11bGEgaW1hZ2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldEltYWdlUHJvcGVydGllcyhwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzLCBkYXRhOiBGb3JtdWxhRGF0YSwgbW1sOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcblxuICAvLyBDcmVhdGUgaW1hZyBlbGVtZW50LlxuICBsZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG5cbiAgLy8gU2V0IGltYWdlIHNyYy4gRW5jb2RlIHRoZSByZXN1bHQgc3ZnLlxuICBpbWcuc3JjID0gYGRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsJHtlbmNvZGVVUklDb21wb25lbnQoZGF0YS5jb250ZW50KX1gO1xuXG4gIC8vIFNldCBvdGhlciBpbWFnZSBwcm9wZXJ0aWVzLlxuICBpbWcuc2V0QXR0cmlidXRlKHByb3BlcnRpZXMud2lyaXNlZGl0b3JtYXRobWxhdHRyaWJ1dGUsIG1tbCk7XG4gIGltZy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ1dpcmlzZm9ybXVsYScpO1xuICBpbWcuc2V0QXR0cmlidXRlKCdyb2xlJywgJ21hdGgnKTtcblxuICAvLyBJZiB0aGUgcmVuZGVyIHJldHVybnMgZGltZW5zaW9ucyBwcm9wZXJ0aWVzLCBzZXQgdGhlbSB0byB0aGUgaW1hZ2UuXG4gIGlmICgrZGF0YS5oZWlnaHQgPiAwKSB7XG4gICAgaW1nLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBcIi1cIiArICgrZGF0YS5oZWlnaHQgLSArZGF0YS5iYXNlbGluZSkgKyBcInB4XCI7XG4gICAgaW1nLmhlaWdodCA9ICtkYXRhLmhlaWdodDtcbiAgICBpbWcud2lkdGggPSArZGF0YS53aWR0aDtcbiAgfVxuXG4gIC8vIFNldCB0aGUgYWx0IHRleHQgd2hlbmV2ZXIgdGhlcmUncyBhIHRyYW5zbGF0aW9uIGZvciB0aGUgY2hhcmFjdGVycyBhbmQgTWF0aE1MIG9uIHRoZSBtbWwuXG4gIGlmICghY29ycnVwdE1hdGhNTC5zb21lKGNvcnJ1cHRNYXRoTUwgPT4gbW1sLmluY2x1ZGVzKGNvcnJ1cHRNYXRoTUwpKSkge1xuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgbWF0aG1sMmFjY2Vzc2libGUobW1sLCBwcm9wZXJ0aWVzLmxhbmcsIHByb3BlcnRpZXMuZWRpdG9yU2VydmljZXNSb290LCBwcm9wZXJ0aWVzLmVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uKTtcbiAgICBpbWcuYWx0ID0gdGV4dDtcbiAgfVxuXG4gIHJldHVybiBpbWc7XG5cbn1cbiIsImltcG9ydCB7IGNvbmZpZ3VyYXRpb25Kc29uLCBTdGF0dXNFcnJvciB9IGZyb20gJy4vc2VydmljZXMnO1xuXG4vLyBIZWxwZXIgdHlwZXMgZm9yIENvbmZpZyBiZWxvd1xudHlwZSBWaWV3ZXIgPSAnbm9uZScgfCAnaW1hZ2UnIHwgJ21hdGhtbCcgfCAnbGF0ZXgnO1xudHlwZSBXaXJpc3BsdWdpbnBlcmZvcm1hbmNlID0gJ3RydWUnIHwgJ2ZhbHNlJztcblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2aWV3ZXIuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZyA9IHtcbiAgZWRpdG9yU2VydmljZXNSb290Pzogc3RyaW5nLFxuICBlZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbj86IHN0cmluZyxcbiAgYmFja2VuZENvbmZpZz86IHtcbiAgICB3aXJpc3BsdWdpbnBlcmZvcm1hbmNlPzogV2lyaXNwbHVnaW5wZXJmb3JtYW5jZSxcbiAgICB3aXJpc2VkaXRvcm1hdGhtbGF0dHJpYnV0ZT86IHN0cmluZyxcbiAgfSxcbiAgZHBpPzogbnVtYmVyLFxuICBlbGVtZW50Pzogc3RyaW5nLFxuICBsYW5nPzogc3RyaW5nLFxuICB2aWV3ZXI/OiBWaWV3ZXIsXG4gIHpvb20/OiBudW1iZXIsXG59O1xuXG4vKipcbiAqIEZhbGxiYWNrIHZhbHVlcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIG5vdCBzZXQuXG4gKi9cbmNvbnN0IGRlZmF1bHRWYWx1ZXM6IENvbmZpZyA9IHtcbiAgZWRpdG9yU2VydmljZXNSb290OiAnaHR0cHM6Ly93d3cud2lyaXMubmV0L2RlbW8vcGx1Z2lucy9hcHAvJyxcbiAgZWRpdG9yU2VydmljZXNFeHRlbnNpb246ICcnLFxuICBiYWNrZW5kQ29uZmlnOiB7XG4gICAgd2lyaXNwbHVnaW5wZXJmb3JtYW5jZTogJ3RydWUnLFxuICAgIHdpcmlzZWRpdG9ybWF0aG1sYXR0cmlidXRlOiAnZGF0YS1tYXRobWwnXG4gIH0sXG4gIGRwaTogOTYsXG4gIGVsZW1lbnQ6ICdib2R5JyxcbiAgbGFuZzogJ2VuJyxcbiAgdmlld2VyOiAnbm9uZScsXG4gIHpvb206IDEsXG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyB3aWxsIGhhbmRsZSB0aGUgcGFyYW1ldGVycyBkZWZpbmVkIGJ5IHRoZSB1c2VyLlxuICovXG5leHBvcnQgY2xhc3MgUHJvcGVydGllcyB7XG5cbiAgcmVuZGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gYXN5bmMgKCkgPT4ge307XG5cbiAgLy8gR2V0IFVSTCBwcm9wZXJ0aWVzIChyZXRyb2NvbXBhdGliaWxpdHkpLlxuICBjb25maWc6IENvbmZpZyA9IGRlZmF1bHRWYWx1ZXM7XG5cbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgdGhpcyBtZXRob2QuIEluc3RlYWQsIHVzZSB7QGxpbmsgUHJvcGVydGllcy5nZW5lcmF0ZX0uXG4gICAqIENvbnN0cnVjdG9ycyBjYW5ub3QgYmUgYXN5bmMgc28gd2UgbWFrZSBpdCBwcml2YXRlIGFuZCBmb3JjZSBpbnN0YW50aWF0aW9uIHRocm91Z2ggYW4gYWx0ZXJuYXRpdmUgc3RhdGljIG1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgbmV3KCkge31cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgc2V0cyB1cCBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyBQcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGUoKTogUHJvbWlzZTxQcm9wZXJ0aWVzPiB7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBQcm9wZXJ0aWVzKCk7XG5cbiAgICAvLyBHZXQgVVJMIHBhcmFtZXRlcnMgZnJvbSA8c2NyaXB0PlxuICAgIGNvbnN0IHBsdWdpbk5hbWUgPSAnV0lSSVNwbHVnaW5zLmpzJztcbiAgICBjb25zdCBzY3JpcHQ6IEhUTUxTY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYyo9XCIke3BsdWdpbk5hbWV9XCJdYCk7XG5cbiAgICBpZiAoISFzY3JpcHQpIHtcbiAgICAgIGNvbnN0IHBsdWdpbk5hbWVQb3NpdGlvbjogbnVtYmVyID0gc2NyaXB0LnNyYy5sYXN0SW5kZXhPZihwbHVnaW5OYW1lKTtcbiAgICAgIGNvbnN0IHBhcmFtczogc3RyaW5nID0gc2NyaXB0LnNyYy5zdWJzdHJpbmcocGx1Z2luTmFtZVBvc2l0aW9uICsgcGx1Z2luTmFtZS5sZW5ndGgpO1xuICAgICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpO1xuXG4gICAgICBpZiAodXJsUGFyYW1zLmdldCgnZHBpJykgIT09IG51bGwgJiYgdXJsUGFyYW1zLmdldCgnZHBpJykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnN0YW5jZS5jb25maWcuZHBpID0gK3VybFBhcmFtcy5nZXQoJ2RwaScpO1xuICAgICAgfVxuICAgICAgaWYgKHVybFBhcmFtcy5nZXQoJ2VsZW1lbnQnKSAhPT0gbnVsbCAmJiB1cmxQYXJhbXMuZ2V0KCdlbGVtZW50JykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnN0YW5jZS5jb25maWcuZWxlbWVudCA9IHVybFBhcmFtcy5nZXQoJ2VsZW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cmxQYXJhbXMuZ2V0KCdsYW5nJykgIT09IG51bGwgJiYgdXJsUGFyYW1zLmdldCgnbGFuZycpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5zdGFuY2UuY29uZmlnLmxhbmcgPSB1cmxQYXJhbXMuZ2V0KCdsYW5nJyk7XG4gICAgICB9XG4gICAgICBpZiAodXJsUGFyYW1zLmdldCgndmlld2VyJykgIT09IG51bGwgJiYgdXJsUGFyYW1zLmdldCgndmlld2VyJykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnN0YW5jZS5jb25maWcudmlld2VyID0gKHVybFBhcmFtcy5nZXQoJ3ZpZXdlcicpIGFzIFZpZXdlcik7XG4gICAgICB9XG4gICAgICBpZiAodXJsUGFyYW1zLmdldCgnem9vbScpICE9PSBudWxsICYmIHVybFBhcmFtcy5nZXQoJ3pvb20nKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbmZpZy56b29tID0gK3VybFBhcmFtcy5nZXQoJ3pvb20nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZS5jaGVja1NlcnZpY2VzKCk7XG5cbiAgICAvLyBHZXQgYmFja2VuZCBwYXJhbWV0ZXJzIGNhbGxpbmcgdGhlIGNvbmZpZ3VyYXRpb25qc29uIHNlcnZpY2VcbiAgICB0cnkge1xuICAgICAgaW5zdGFuY2UuY29uZmlnLmJhY2tlbmRDb25maWcgPSBhd2FpdCBjb25maWd1cmF0aW9uSnNvbihcbiAgICAgICAgWyd3aXJpc3BsdWdpbnBlcmZvcm1hbmNlJywgJ3dpcmlzZWRpdG9ybWF0aG1sYXR0cmlidXRlJ10sXG4gICAgICAgIGluc3RhbmNlLmVkaXRvclNlcnZpY2VzUm9vdCxcbiAgICAgICAgaW5zdGFuY2UuZWRpdG9yU2VydmljZXNFeHRlbnNpb24sXG4gICAgICApO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdGF0dXNFcnJvcikge1xuICAgICAgICAvLyBEbyBub3RoaW5nOyBsZWF2ZSBkZWZhdWx0IHZhbHVlcy5cbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGlzIGluc2lkZSBJbnRlZ3JhdGlvbnMgU2VydmljZXNcbiAgICogQGRlcHJlY2F0ZWQgVGhpcyB3aWxsIGJlIHJlbW92ZWQgb25jZSB0aGUgdmlld2VyIHVuY291cGxlIGZyb20gdGhlIGludGVncmF0aW9uIHNlcnZpY2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1NlcnZpY2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSAoKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgYXMgSFRNTFNjcmlwdEVsZW1lbnQpLnNyYyk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcygncGx1Z2lud2lyaXNfZW5naW5lJykpIHtcbiAgICAgIC8vIElmIHRoZSBwYXRoIGluY2x1ZGVzIHBsdWdpbndpcmlzX2VuZ2luZSB1c2UgSmF2YSBJbnRlZ3JhdGlvbnMgU2VydmljZXNcbiAgICAgIHRoaXMuY29uZmlnLmVkaXRvclNlcnZpY2VzUm9vdCA9IHBhdGg7XG4gICAgICB0aGlzLmNvbmZpZy5lZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbiA9ICcnO1xuICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcygnaW50ZWdyYXRpb24vV0lSSVNwbHVnaW5zJykpIHtcbiAgICAgIC8vIElmIHRoZSBwYXRoIGluY2x1ZGVzICdpbnRlZ3JhdGlvbi9XSVJJU3BsdWdpbnMnIHVzZSBQSFAgSW50ZWdyYXRpb25zIFNlcnZpY2VzXG4gICAgICB0aGlzLmNvbmZpZy5lZGl0b3JTZXJ2aWNlc1Jvb3QgPSBwYXRoO1xuICAgICAgdGhpcy5jb25maWcuZWRpdG9yU2VydmljZXNFeHRlbnNpb24gPSAnLnBocCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGVkaXRvclNlcnZpY2VzUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5lZGl0b3JTZXJ2aWNlc1Jvb3QgfHxcbiAgICAgIGRlZmF1bHRWYWx1ZXMuZWRpdG9yU2VydmljZXNSb290O1xuICB9XG5cbiAgc2V0IGVkaXRvclNlcnZpY2VzUm9vdChlZGl0b3JTZXJ2aWNlc1Jvb3Q6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlnLmVkaXRvclNlcnZpY2VzUm9vdCA9IGVkaXRvclNlcnZpY2VzUm9vdDtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgZ2V0IGVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uIHx8XG4gICAgICBkZWZhdWx0VmFsdWVzLmVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uO1xuICB9XG5cbiAgc2V0IGVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uKGVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZy5lZGl0b3JTZXJ2aWNlc0V4dGVuc2lvbiA9IGVkaXRvclNlcnZpY2VzRXh0ZW5zaW9uO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsYW5ndWFnZS5cbiAgICogSW4gb3JkZXIgb2YgcHJpb3JpdHksIHRoZSBmaXJzdCBvZiB0aGUgZm9sbG93aW5nIHRoYXQgaXMgc2V0IGlzIHJldHVybmVkOlxuICAgKiAtIFRoZSBsYW5nIHBhcmFtZXRlciBzZXQgaW4gdGhlIDxzY3JpcHQ+IChXSVJJU3BsdWdpbi5qcz9sYW5nPS4uLilcbiAgICogLSBUaGUgSFRNTCBkb2N1bWVudCBsYW5ndWFnZSAoPGh0bWwgbGFuZz0uLi4+KS5cbiAgICogLSBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGJyb3dzZXIuXG4gICAqIC0gRW5nbGlzaCwgYnkgZGVmYXVsdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gRW5jb2RlZCBsYW5ndWFnZSBzdHJpbmcuXG4gICAqL1xuICBnZXQgbGFuZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbmZpZ0xhbmcgPSAodGhpcy5jb25maWcubGFuZyA9PT0gJ2luaGVyaXQnKSA/IG51bGwgOiB0aGlzLmNvbmZpZy5sYW5nO1xuICAgIHJldHVybiBjb25maWdMYW5nIHx8XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmxhbmcgfHxcbiAgICAgIG5hdmlnYXRvci5sYW5ndWFnZSB8fFxuICAgICAgZGVmYXVsdFZhbHVlcy5sYW5nO1xuICB9XG5cbiAgc2V0IGxhbmcobGFuZzogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWcubGFuZyA9IGxhbmc7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHZpZXdlciBtb2RlIGZvciB0aGUgTWF0aE1MLlxuICAgKiBJbiBvcmRlciBvZiBwcmlvcml0eSwgdGhlIGZpcnN0IG9mIHRoZSBmb2xsb3dpbmcgdGhhdCBpcyBzZXQgaXMgcmV0dXJuZWQ6XG4gICAqIC0gVGhlIHZpZXdlciBwYXJhbWV0ZXIgc2V0IGluIHRoZSA8c2NyaXB0PiAoV0lSSVNwbHVnaW4uanM/dmlld2VyPS4uLilcbiAgICogLSBub25lLCBieSBkZWZhdWx0LlxuICAgKi9cbiAgZ2V0IHZpZXdlcigpOiBWaWV3ZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aWV3ZXIgfHxcbiAgICAgIGRlZmF1bHRWYWx1ZXMudmlld2VyO1xuICB9XG5cbiAgc2V0IHZpZXdlcih2aWV3ZXI6IFZpZXdlcikge1xuICAgIHRoaXMuY29uZmlnLnZpZXdlciA9IHZpZXdlcjtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZHBpIG9mIHRoZSBpbWFnZXMuXG4gICAqIEluIG9yZGVyIG9mIHByaW9yaXR5LCB0aGUgZmlyc3Qgb2YgdGhlIGZvbGxvd2luZyB0aGF0IGlzIHNldCBpcyByZXR1cm5lZDpcbiAgICogLSBUaGUgZHBpIHBhcmFtZXRlciBzZXQgaW4gdGhlIDxzY3JpcHQ+IChXSVJJU3BsdWdpbi5qcz9kcGk9Li4uKVxuICAgKiAtIDk2LCBieSBkZWZhdWx0LlxuICAgKi9cbiAgZ2V0IGRwaSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kcGkgfHxcbiAgICAgIGRlZmF1bHRWYWx1ZXMuZHBpO1xuICB9XG5cbiAgc2V0IGRwaShkcGk6IG51bWJlcikge1xuICAgIHRoaXMuY29uZmlnLmRwaSA9IGRwaTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgem9vbSBvZiB0aGUgaW1hZ2VzLlxuICAgKiBJbiBvcmRlciBvZiBwcmlvcml0eSwgdGhlIGZpcnN0IG9mIHRoZSBmb2xsb3dpbmcgdGhhdCBpcyBzZXQgaXMgcmV0dXJuZWQ6XG4gICAqIC0gVGhlIHpvb20gcGFyYW1ldGVyIHNldCBpbiB0aGUgPHNjcmlwdD4gKFdJUklTcGx1Z2luLmpzP3pvb209Li4uKVxuICAgKiAtIDEsIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBnZXQgem9vbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy56b29tIHx8XG4gICAgICBkZWZhdWx0VmFsdWVzLnpvb207XG4gIH1cblxuICBzZXQgem9vbSh6b29tOiBudW1iZXIpIHtcbiAgICB0aGlzLmNvbmZpZy56b29tID0gem9vbTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZWxlbWVudCBpbiB3aGljaCB0byByZW5kZXIgZm9ybXVsYXMuXG4gICAqIEluIG9yZGVyIG9mIHByaW9yaXR5LCB0aGUgZmlyc3Qgb2YgdGhlIGZvbGxvd2luZyB0aGF0IGlzIHNldCBpcyByZXR1cm5lZDpcbiAgICogLSBUaGUgem9vbSBwYXJhbWV0ZXIgc2V0IGluIHRoZSA8c2NyaXB0PiAoV0lSSVNwbHVnaW4uanM/ZWxlbWVudD0uLi4pXG4gICAqIC0gJ2JvZHknLCBieSBkZWZhdWx0LlxuICAgKi9cbiAgZ2V0IGVsZW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZWxlbWVudCB8fFxuICAgICAgZGVmYXVsdFZhbHVlcy5lbGVtZW50O1xuICB9XG5cbiAgc2V0IGVsZW1lbnQoZWxlbWVudDogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWcuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFdpcmlzIHBsdWdpbiBwZXJmb3JtYW5jZS5cbiAgICogSW4gb3JkZXIgb2YgcHJpb3JpdHksIHRoZSBmaXJzdCBvZiB0aGUgZm9sbG93aW5nIHRoYXQgaXMgc2V0IGlzIHJldHVybmVkOlxuICAgKiAtIFRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBhcmFtZXRlci5cbiAgICogLSB0cnVlLCBieSBkZWZhdWx0LlxuICAgKi9cbiAgZ2V0IHdpcmlzcGx1Z2lucGVyZm9ybWFuY2UoKTogV2lyaXNwbHVnaW5wZXJmb3JtYW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmJhY2tlbmRDb25maWcud2lyaXNwbHVnaW5wZXJmb3JtYW5jZSB8fFxuICAgICAgZGVmYXVsdFZhbHVlcy5iYWNrZW5kQ29uZmlnLndpcmlzcGx1Z2lucGVyZm9ybWFuY2U7XG4gIH1cblxuICBzZXQgd2lyaXNwbHVnaW5wZXJmb3JtYW5jZSh3aXJpc3BsdWdpbnBlcmZvcm1hbmNlOiBXaXJpc3BsdWdpbnBlcmZvcm1hbmNlKSB7XG4gICAgdGhpcy5jb25maWcuYmFja2VuZENvbmZpZy53aXJpc3BsdWdpbnBlcmZvcm1hbmNlID0gd2lyaXNwbHVnaW5wZXJmb3JtYW5jZTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgV2lyaXMgTWF0aE1MIGF0dHJpYnV0ZS5cbiAgICogSW4gb3JkZXIgb2YgcHJpb3JpdHksIHRoZSBmaXJzdCBvZiB0aGUgZm9sbG93aW5nIHRoYXQgaXMgc2V0IGlzIHJldHVybmVkOlxuICAgKiAtIFRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBhcmFtZXRlci5cbiAgICogLSBkYXRhLW1hdGhtbCwgYnkgZGVmYXVsdC5cbiAgICovXG4gIGdldCB3aXJpc2VkaXRvcm1hdGhtbGF0dHJpYnV0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5iYWNrZW5kQ29uZmlnLndpcmlzZWRpdG9ybWF0aG1sYXR0cmlidXRlIHx8XG4gICAgICBkZWZhdWx0VmFsdWVzLmJhY2tlbmRDb25maWcud2lyaXNlZGl0b3JtYXRobWxhdHRyaWJ1dGU7XG4gIH1cblxuICBzZXQgd2lyaXNlZGl0b3JtYXRobWxhdHRyaWJ1dGUod2lyaXNlZGl0b3JtYXRobWxhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlnLmJhY2tlbmRDb25maWcud2lyaXNlZGl0b3JtYXRobWxhdHRyaWJ1dGUgPSB3aXJpc2VkaXRvcm1hdGhtbGF0dHJpYnV0ZTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG59XG4iLCJpbXBvcnQgeyByZW5kZXJMYXRleCB9IGZyb20gXCIuL2xhdGV4XCI7XG5pbXBvcnQgeyByZW5kZXJNYXRoTUwgfSBmcm9tIFwiLi9tYXRobWxcIjtcbmltcG9ydCB7IFByb3BlcnRpZXMgfSBmcm9tIFwiLi9wcm9wZXJ0aWVzXCI7XG5cbi8qKlxuICogRXhwb3NlcyB0aGUge0BsaW5rIEpzUGx1Z2luVmlld2VyfSBzaW5nbGV0b24gaW5zdGFuY2UgYXMgd2luZG93LmNvbS53aXJpcy5qcy5Kc1BsdWdpblZpZXdlci5cbiAqIEBwYXJhbSB7UHJvcGVydGllc30gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgb2YgdGhlIHZpZXdlci5cbiAqIEBwYXJhbSB7V2luZG93fSB3IC0gSW5zdGFuY2Ugb2YgdGhlIGdsb2JhbCB3aW5kb3cuXG4gKiBAZGVwcmVjYXRlZCBDb25zaWRlciB1c2luZyB7QGxpbmsgcmVuZGVyTGF0ZXh9IG9yIHtAbGluayByZW5kZXJNYXRoTUx9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnlwYXNzRW5jYXBzdWxhdGlvbihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzLCB3OiBXaW5kb3cpIHtcbiAgY29uc3Qgd2FueSA9IHcgYXMgYW55O1xuXG4gIGlmICh0eXBlb2Ygd2FueS5jb20gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgd2FueS5jb20gPSB7fTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygd2FueS5jb20ud2lyaXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgd2FueS5jb20ud2lyaXMgPSB7fTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygd2FueS5jb20ud2lyaXMuanMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgd2FueS5jb20ud2lyaXMuanMgPSB7fTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygd2FueS5jb20ud2lyaXMuanMuSnNQbHVnaW5WaWV3ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgd2FueS5jb20ud2lyaXMuanMuSnNQbHVnaW5WaWV3ZXIgPSBKc1BsdWdpblZpZXdlci5nZXRJbnN0YW5jZSgpO1xuICAgIEpzUGx1Z2luVmlld2VyLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyBhIGNvbXBhdGliaWxpdHkgbGF5ZXIgd2l0aCB0aGUgb2xkIFZpZXdlci5cbiAqIFNlZSBoYXhlL3NyYy1oYXhlL2NvbS93aXJpcy9qcy9Kc1BsdWdpblZpZXdlci5oeCBpbiBpbiB0aGUgcmVwbyB3aXJpcy9wbHVnaW5zIHByZXZpb3VzIHRvIGNvbW1pdCBkZjEyNDhhLlxuICpcbiAqIFdBUk5JTkc6IHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgbWF5IGNvbnRhaW4gZGlyZWN0IHJlZmVyZW5jZXMgdG8gZ2xvYmFscyBzdWNoIGFzIHdpbmRvdyBhbmQgZG9jdW1lbnQuXG4gKlxuICogQGRlcHJlY2F0ZWQgQ29uc2lkZXIgdXNpbmcge0BsaW5rIHJlbmRlckxhdGV4fSBvciB7QGxpbmsgcmVuZGVyTWF0aE1MfS5cbiAqL1xuY2xhc3MgSnNQbHVnaW5WaWV3ZXIge1xuICBzdGF0aWMgaW5zdGFuY2U6IEpzUGx1Z2luVmlld2VyO1xuICBzdGF0aWMgcHJvcGVydGllczogUHJvcGVydGllcztcblxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogSnNQbHVnaW5WaWV3ZXIge1xuICAgIGlmIChKc1BsdWdpblZpZXdlci5pbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICBKc1BsdWdpblZpZXdlci5pbnN0YW5jZSA9IG5ldyBKc1BsdWdpblZpZXdlcigpO1xuICAgIH1cblxuICAgIHJldHVybiBKc1BsdWdpblZpZXdlci5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYWxsIHRoZSBmb3JtdWxhcyB3cml0dGVuIGluIFNhZmVNYXRoTUwgaW5zaWRlIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB3aGVyZWluIHRvIHJlbmRlciBTYWZlTWF0aE1MIGZvcm11bGFzLlxuICAgKiBAcGFyYW0gYXN5bmNocm9ub3VzbHkgLSBDdXJyZW50bHkgaWdub3JlZCwgb25seSBpbmNsdWRlZCBmb3IgcmV0cm9jb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tGdW5jIC0gQ3VycmVudGx5IGlnbm9yZWQsIG9ubHkgaW5jbHVkZWQgZm9yIHJldHJvY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAgICogQGRlcHJlY2F0ZWQgVGhlcmUgaXMgY3VycmVudGx5IG5vIHJlcGxhY2VtZW50IGZvciByZW5kZXJpbmcgU2FmZU1hdGhNTCBmb3JtdWxhcy5cbiAgICogUGxlYXNlIGNvbnNpZGVyIHVzaW5nIHtAbGluayByZW5kZXJMYXRleH0gb3Ige0BsaW5rIHJlbmRlck1hdGhNTH0uXG4gICAqL1xuICBwYXJzZVNhZmVNYXRoTUxFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhc3luY2hyb25vdXNseT86IGJvb2xlYW4sIGNhbGxiYWNrRnVuYz86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB2YXIgbWF0aG1sUG9zaXRpb25zID0gW107XG4gICAgSnNQbHVnaW5WaWV3ZXIuZ2V0TWF0aE1MUG9zaXRpb25zQXRFbGVtZW50QW5kQ2hpbGRyZW4oZWxlbWVudCwgbWF0aG1sUG9zaXRpb25zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGhtbFBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1hdGhtbFBvc2l0aW9uID0gbWF0aG1sUG9zaXRpb25zW2ldO1xuICAgICAgdmFyIG5ld05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibWF0aFwiKTtcbiAgICAgIG1hdGhtbFBvc2l0aW9uLm5leHRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIG1hdGhtbFBvc2l0aW9uLm5leHRFbGVtZW50KTtcbiAgICAgIG5ld05vZGUub3V0ZXJIVE1MID0gSnNQbHVnaW5WaWV3ZXIuZGVjb2RlU2FmZU1hdGhNTChtYXRobWxQb3NpdGlvbi5zYWZlTU1MKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGFsbCB0aGUgZm9ybXVsYXMgaW4gdGhlIGRvY3VtZW50LlxuICAgKiBAcGFyYW0gYXN5bmNocm9ub3VzbHkgLSBDdXJyZW50bHkgaWdub3JlZCwgb25seSBpbmNsdWRlZCBmb3IgcmV0cm9jb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tGdW5jIC0gQ3VycmVudGx5IGlnbm9yZWQsIG9ubHkgaW5jbHVkZWQgZm9yIHJldHJvY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAgICogQHBhcmFtIHNhZmVYbWwgLSBDdXJyZW50bHkgaWdub3JlZCwgb25seSBpbmNsdWRlZCBmb3IgcmV0cm9jb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgY29uc2lkZXIgdXNpbmcge0BsaW5rIHJlbmRlck1hdGhNTH0uXG4gICAqL1xuICBhc3luYyBwYXJzZURvY3VtZW50KGFzeW5jaHJvbm91c2x5PzogYm9vbGVhbiwgY2FsbGJhY2tGdW5jPzogKCkgPT4gdm9pZCwgc2FmZVhtbD86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gcmVuZGVyTWF0aE1MKEpzUGx1Z2luVmlld2VyLnByb3BlcnRpZXMsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGFsbCB0aGUgZm9ybXVsYXMgaW5zaWRlIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB3aGVyZWluIHRvIHJlbmRlciBmb3JtdWxhcy5cbiAgICogQHBhcmFtIGFzeW5jaHJvbm91c2x5IC0gQ3VycmVudGx5IGlnbm9yZWQsIG9ubHkgaW5jbHVkZWQgZm9yIHJldHJvY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrRnVuYyAtIEN1cnJlbnRseSBpZ25vcmVkLCBvbmx5IGluY2x1ZGVkIGZvciByZXRyb2NvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAqIEBkZXByZWNhdGVkIFBsZWFzZSBjb25zaWRlciB1c2luZyB7QGxpbmsgcmVuZGVyTWF0aE1MfS5cbiAgICovXG4gIGFzeW5jIHBhcnNlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgYXN5bmNocm9ub3VzbHk/OiBib29sZWFuLCBjYWxsYmFja0Z1bmM/OiAoKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHJlbmRlck1hdGhNTChKc1BsdWdpblZpZXdlci5wcm9wZXJ0aWVzLCBlbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGFsbCB0aGUgTGFUZVggZm9ybXVsYXMgaW4gdGhlIGRvY3VtZW50IHRvIE1hdGhNTC5cbiAgICogQHBhcmFtIGFzeW5jaHJvbm91c2x5IC0gQ3VycmVudGx5IGlnbm9yZWQsIG9ubHkgaW5jbHVkZWQgZm9yIHJldHJvY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrRnVuYyAtIEN1cnJlbnRseSBpZ25vcmVkLCBvbmx5IGluY2x1ZGVkIGZvciByZXRyb2NvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAqIEBkZXByZWNhdGVkIFBsZWFzZSBjb25zaWRlciB1c2luZyB7QGxpbmsgcmVuZGVyTGF0ZXh9LlxuICAgKi9cbiAgYXN5bmMgcGFyc2VMYXRleERvY3VtZW50KGFzeW5jaHJvbm91c2x5PzogYm9vbGVhbiwgY2FsbGJhY2tGdW5jPzogKCkgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiByZW5kZXJMYXRleChKc1BsdWdpblZpZXdlci5wcm9wZXJ0aWVzLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYWxsIHRoZSBMYVRlWCBmb3JtdWxhcyBpbnNpZGUgdGhlIGdpdmVuIGVsZW1lbnQgdG8gTWF0aE1MLlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB3aGVyZWluIHRvIGNvbnZlcnQgZm9ybXVsYXMuXG4gICAqIEBwYXJhbSBhc3luY2hyb25vdXNseSAtIEN1cnJlbnRseSBpZ25vcmVkLCBvbmx5IGluY2x1ZGVkIGZvciByZXRyb2NvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFja0Z1bmMgLSBDdXJyZW50bHkgaWdub3JlZCwgb25seSBpbmNsdWRlZCBmb3IgcmV0cm9jb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgY29uc2lkZXIgdXNpbmcge0BsaW5rIHJlbmRlckxhdGV4fS5cbiAgICovXG4gIGFzeW5jIHBhcnNlTGF0ZXhFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhc3luY2hyb25vdXNseT86IGJvb2xlYW4sIGNhbGxiYWNrRnVuYz86ICgpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gcmVuZGVyTGF0ZXgoSnNQbHVnaW5WaWV3ZXIucHJvcGVydGllcywgZWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWNvZGVTYWZlTWF0aE1MKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBzYWZlWE1MQ2hhcmFjdGVyc0VudGl0aWVzID0gSnNDaGFyYWN0ZXJzLmdldFNhZmVYTUxDaGFyYWN0ZXJzRW50aXRpZXMoKTtcbiAgICB2YXIgeG1sQ2hhcmFjdGVycyA9IEpzQ2hhcmFjdGVycy5nZXRYTUxDaGFyYWN0ZXJzKCk7XG4gICAgdmFyIHNhZmVYTUxDaGFyYWN0ZXJzID0gSnNDaGFyYWN0ZXJzLmdldFNhZmVYTUxDaGFyYWN0ZXJzKCk7XG5cbiAgICB2YXIgdGFnT3BlbmVyRW50aXR5ID0gc2FmZVhNTENoYXJhY3RlcnNFbnRpdGllcy50YWdPcGVuZXI7XG4gICAgdmFyIHRhZ0Nsb3NlckVudGl0eSA9IHNhZmVYTUxDaGFyYWN0ZXJzRW50aXRpZXMudGFnQ2xvc2VyO1xuICAgIHZhciBkb3VibGVRdW90ZUVudGl0eSA9IHNhZmVYTUxDaGFyYWN0ZXJzRW50aXRpZXMuZG91YmxlUXVvdGU7XG4gICAgdmFyIHJlYWxEb3VibGVRdW90ZUVudGl0eSA9IHNhZmVYTUxDaGFyYWN0ZXJzRW50aXRpZXMucmVhbERvdWJsZVF1b3RlO1xuXG5cbiAgICAvLyBJbXBvcnRhbnQgdG8gbm90IGNoYW5nZSBmdW5jdGlvbiBwYXJhbWV0ZXIuXG4gICAgdmFyIGlucHV0Q29weSA9IGlucHV0LnNsaWNlKCk7XG5cbiAgICAvLyBEZWNvZGluZyBlbnRpdGllcy5cbiAgICBpbnB1dENvcHkgPSBpbnB1dENvcHkuc3BsaXQodGFnT3BlbmVyRW50aXR5KS5qb2luKHNhZmVYTUxDaGFyYWN0ZXJzLnRhZ09wZW5lcik7XG4gICAgaW5wdXRDb3B5ID0gaW5wdXRDb3B5LnNwbGl0KHRhZ0Nsb3NlckVudGl0eSkuam9pbihzYWZlWE1MQ2hhcmFjdGVycy50YWdDbG9zZXIpO1xuICAgIGlucHV0Q29weSA9IGlucHV0Q29weS5zcGxpdChkb3VibGVRdW90ZUVudGl0eSkuam9pbihzYWZlWE1MQ2hhcmFjdGVycy5kb3VibGVRdW90ZSk7XG4gICAgaW5wdXRDb3B5ID0gaW5wdXRDb3B5LnNwbGl0KHJlYWxEb3VibGVRdW90ZUVudGl0eSkuam9pbihzYWZlWE1MQ2hhcmFjdGVycy5yZWFsRG91YmxlUXVvdGUpO1xuXG4gICAgdmFyIHRhZ09wZW5lciA9IHNhZmVYTUxDaGFyYWN0ZXJzLnRhZ09wZW5lcjtcbiAgICB2YXIgdGFnQ2xvc2VyID0gc2FmZVhNTENoYXJhY3RlcnMudGFnQ2xvc2VyO1xuICAgIHZhciBkb3VibGVRdW90ZSA9IHNhZmVYTUxDaGFyYWN0ZXJzLmRvdWJsZVF1b3RlO1xuICAgIHZhciByZWFsRG91YmxlUXVvdGUgPSBzYWZlWE1MQ2hhcmFjdGVycy5yZWFsRG91YmxlUXVvdGU7XG4gICAgdmFyIGFtcGVyc2FuZCA9IHNhZmVYTUxDaGFyYWN0ZXJzLmFtcGVyc2FuZDtcbiAgICB2YXIgcXVvdGUgPSBzYWZlWE1MQ2hhcmFjdGVycy5xdW90ZTtcblxuICAgIC8vIERlY29kaW5nIGNoYXJhY3RlcnMuXG4gICAgaW5wdXRDb3B5ID0gaW5wdXRDb3B5LnNwbGl0KHRhZ09wZW5lcikuam9pbih4bWxDaGFyYWN0ZXJzLnRhZ09wZW5lcik7XG4gICAgaW5wdXRDb3B5ID0gaW5wdXRDb3B5LnNwbGl0KHRhZ0Nsb3Nlcikuam9pbih4bWxDaGFyYWN0ZXJzLnRhZ0Nsb3Nlcik7XG4gICAgaW5wdXRDb3B5ID0gaW5wdXRDb3B5LnNwbGl0KGRvdWJsZVF1b3RlKS5qb2luKHhtbENoYXJhY3RlcnMuZG91YmxlUXVvdGUpO1xuICAgIGlucHV0Q29weSA9IGlucHV0Q29weS5zcGxpdChhbXBlcnNhbmQpLmpvaW4oeG1sQ2hhcmFjdGVycy5hbXBlcnNhbmQpO1xuICAgIGlucHV0Q29weSA9IGlucHV0Q29weS5zcGxpdChxdW90ZSkuam9pbih4bWxDaGFyYWN0ZXJzLnF1b3RlKTtcblxuICAgIC8vIFdlIGFyZSByZXBsYWNpbmcgJCBieSAmIHdoZW4gaXRzIHBhcnQgb2YgYW4gZW50aXR5IGZvciByZXRyb2NvbXBhdGliaWxpdHkuXG4gICAgLy8gTm93LCB0aGUgc3RhbmRhcmQgaXMgcmVwbGFjZSDCpyBieSAmLlxuICAgIHZhciByZXR1cm5WYWx1ZSA9ICcnO1xuICAgIHZhciBjdXJyZW50RW50aXR5ID0gbnVsbDtcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGlucHV0Q29weS5sZW5ndGgpIHtcbiAgICAgIHZhciBjaGFyYWN0ZXIgPSBpbnB1dENvcHkuY2hhckF0KGkpO1xuICAgICAgaWYgKGN1cnJlbnRFbnRpdHkgPT0gbnVsbCkge1xuICAgICAgICBpZiAoY2hhcmFjdGVyID09ICckJykge1xuICAgICAgICAgIGN1cnJlbnRFbnRpdHkgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5WYWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09ICc7Jykge1xuICAgICAgICByZXR1cm5WYWx1ZSArPSAnJicgKyBjdXJyZW50RW50aXR5O1xuICAgICAgICBjdXJyZW50RW50aXR5ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyLm1hdGNoKC8oW2EtekEtWjAtOSMuXy1dIHwgJy0nKS8pKSB7IC8vIENoYXJhY3RlciBpcyBwYXJ0IG9mIGFuIGVudGl0eS5cbiAgICAgICAgY3VycmVudEVudGl0eSArPSBjaGFyYWN0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm5WYWx1ZSArPSAnJCcgKyAnY3VycmVudEVudGl0eSc7IC8vIElzIG5vdCBhbiBlbnRpdHkuXG4gICAgICAgIGN1cnJlbnRFbnRpdHkgPSBudWxsO1xuICAgICAgICBpIC09IDE7IC8vIFBhcnNlIGFnYWluIHRoZSBjdXJyZW50IGNoYXJhY3Rlci5cbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRNYXRoTUxQb3NpdGlvbnNBdEVsZW1lbnRBbmRDaGlsZHJlbihlbGVtZW50OiBOb2RlLCBtYXRobWxQb3NpdGlvbnMpIHtcbiAgICBKc1BsdWdpblZpZXdlci5nZXRNYXRoTUxQb3NpdGlvbnNBdE5vZGUoZWxlbWVudCwgbWF0aG1sUG9zaXRpb25zKTtcbiAgICAvLyBDb3B5IGN1cnJlbnQgY2hpbGRyZW4gYmVjYXVzZSBET00gd2lsbCBiZSBjaGFuZ2VkIGFuZCBlbGVtZW50LmNoaWxkTm9kZXMgd29uJ3QgYmVcbiAgICAvLyBjb25zaXN0ZW50IG9uIGNhbGwgZ2V0TWF0aE1MUG9zaXRpb25zQXRFbGVtZW50QW5kQ2hpbGRyZW4oKS5cbiAgICB2YXIgY2hpbGROb2RlcyA9IEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbiAgICBpZiAoY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2hpbGROb2Rlc1tpXTtcbiAgICAgICAgSnNQbHVnaW5WaWV3ZXIuZ2V0TWF0aE1MUG9zaXRpb25zQXRFbGVtZW50QW5kQ2hpbGRyZW4oY2hpbGQsIG1hdGhtbFBvc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWF0aE1MUG9zaXRpb25zQXROb2RlKG5vZGU6IE5vZGUsIG1hdGhtbFBvc2l0aW9ucykge1xuICAgIHZhciBzYWZlWE1MQ2hhcmFjdGVycyA9IEpzQ2hhcmFjdGVycy5nZXRTYWZlWE1MQ2hhcmFjdGVycygpO1xuICAgIGlmKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgICAgdmFyIHN0YXJ0TWF0aG1sVGFnID0gc2FmZVhNTENoYXJhY3RlcnMudGFnT3BlbmVyICsgXCJtYXRoXCI7XG4gICAgICB2YXIgZW5kTWF0aG1sVGFnID0gc2FmZVhNTENoYXJhY3RlcnMudGFnT3BlbmVyICsgXCIvbWF0aFwiICsgc2FmZVhNTENoYXJhY3RlcnMudGFnQ2xvc2VyO1xuICAgICAgdmFyIHN0YXJ0ID0gbm9kZS50ZXh0Q29udGVudC5pbmRleE9mKHN0YXJ0TWF0aG1sVGFnKTtcbiAgICAgIHZhciBlbmQgPSAwO1xuICAgICAgd2hpbGUoc3RhcnQgIT0gLTEpIHtcbiAgICAgICAgZW5kID0gbm9kZS50ZXh0Q29udGVudC5pbmRleE9mKGVuZE1hdGhtbFRhZyxzdGFydCArIHN0YXJ0TWF0aG1sVGFnLmxlbmd0aCk7XG5cbiAgICAgICAgaWYoZW5kID09IC0xKSBicmVhaztcblxuICAgICAgICB2YXIgbmV4dE1hdGhNTCA9IG5vZGUudGV4dENvbnRlbnQuaW5kZXhPZihzdGFydE1hdGhtbFRhZyxlbmQgKyBlbmRNYXRobWxUYWcubGVuZ3RoKTtcblxuICAgICAgICBpZihuZXh0TWF0aE1MID49IDAgJiYgZW5kID4gbmV4dE1hdGhNTCkgYnJlYWs7XG5cbiAgICAgICAgdmFyIHNhZmVNYXRobWwgPSBub2RlLnRleHRDb250ZW50LnN1YnN0cmluZyhzdGFydCxlbmQgKyBlbmRNYXRobWxUYWcubGVuZ3RoKTtcblxuICAgICAgICBub2RlLnRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudC5zdWJzdHJpbmcoMCxzdGFydCkgKyBub2RlLnRleHRDb250ZW50LnN1YnN0cmluZyhlbmQgKyBlbmRNYXRobWxUYWcubGVuZ3RoKTtcbiAgICAgICAgbm9kZSA9IChub2RlIGFzIFRleHQpLnNwbGl0VGV4dChzdGFydCk7XG4gICAgICAgIHN0YXJ0ID0gbm9kZS50ZXh0Q29udGVudC5pbmRleE9mKHN0YXJ0TWF0aG1sVGFnKTtcblxuICAgICAgICBtYXRobWxQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgICAgc2FmZU1NTDogc2FmZU1hdGhtbCxcbiAgICAgICAgICBuZXh0RWxlbWVudDogbm9kZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuXG5jbGFzcyBKc0NoYXJhY3RlcnMge1xuICBzdGF0aWMgZ2V0U2FmZVhNTENoYXJhY3RlcnNFbnRpdGllcygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICB0YWdPcGVuZXI6ICcmbGFxdW87JyxcbiAgICAgIHRhZ0Nsb3NlcjogJyZyYXF1bzsnLFxuICAgICAgZG91YmxlUXVvdGU6ICcmdW1sOycsXG4gICAgICByZWFsRG91YmxlUXVvdGU6ICcmcXVvdDsnLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0WE1MQ2hhcmFjdGVycygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3htbENoYXJhY3RlcnMnLFxuICAgICAgdGFnT3BlbmVyOiAnPCcsIC8vIEhleDogXFx4M0MuXG4gICAgICB0YWdDbG9zZXI6ICc+JywgLy8gSGV4OiBcXHgzRS5cbiAgICAgIGRvdWJsZVF1b3RlOiAnXCInLCAvLyBIZXg6IFxceDIyLlxuICAgICAgYW1wZXJzYW5kOiAnJicsIC8vIEhleDogXFx4MjYuXG4gICAgICBxdW90ZTogJ1xcJycsIC8vIEhleDogXFx4MjcuXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRTYWZlWE1MQ2hhcmFjdGVycygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3NhZmVYbWxDaGFyYWN0ZXJzJyxcbiAgICAgIHRhZ09wZW5lcjogJ8KrJywgLy8gSGV4OiBcXHhBQi5cbiAgICAgIHRhZ0Nsb3NlcjogJ8K7JywgLy8gSGV4OiBcXHhCQi5cbiAgICAgIGRvdWJsZVF1b3RlOiAnwqgnLCAvLyBIZXg6IFxceEE4LlxuICAgICAgYW1wZXJzYW5kOiAnwqcnLCAvLyBIZXg6IFxceEE3LlxuICAgICAgcXVvdGU6ICdgJywgLy8gSGV4OiBcXHg2MC5cbiAgICAgIHJlYWxEb3VibGVRdW90ZTogJ8KoJyxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgUGFyc2VyIGZyb20gJ0B3aXJpcy9tYXRodHlwZS1odG1sLWludGVncmF0aW9uLWRldmtpdC9zcmMvcGFyc2VyJztcblxuZW51bSBNZXRob2RUeXBlIHtcbiAgUG9zdCA9IFwiUE9TVFwiLFxuICBHZXQgPSBcIkdFVFwiLFxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgc2VydmljZSByZXR1cm5zIGEgSlNPTiB3aXRoIGEgbm9uLW9rIHN0YXR1cyB2YWx1ZSBpbiBpdHMgSlNPTiBib2R5XG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0dXNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTdGF0dXNFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb2Nlc3MgcmVzcG9uc2VzIGZyb20gdGhlIGVkaXRvciBzZXJ2aWNlcy5cbiAqIFRoZXNlIHVzdWFsbHkgY29tZSB3cmFwcGVkIGluIGEgSlNPTiB3aXRoIGEgc3RhdHVzIGZpZWxkIHRoYXQgY2FuIGJlIGVpdGhlciBcIm9rXCIgb3IgXCJ3YXJuaW5nXCIuXG4gKiBJZiBzdGF0dXMgaXMgXCJva1wiLCByZXR1cm4gdGhlIHJlc3VsdCB2YWx1ZSBhbG9uZyBpdC4gT3RoZXJ3aXNlLCB0aHJvdyBhIFN0YXR1c0Vycm9yLlxuICogQHBhcmFtIHtQcm9taXNlPFJlc3BvbnNlPn0gcmVzcG9uc2UgLSBUaGUgcmVzcG9uc2UgZ2l2ZW4gYnkgdGhlIHNlcnZpY2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBUaGUgdW53cmFwcGVkIHJlc3VsdCBvZiB0aGUgcmVzcG9uc2UsIGlmIHZhbGlkLlxuICogQHRocm93cyB7U3RhdHVzRXJyb3J9IFNlcnZpY2UgcmVzcG9uZGVkIHdpdGggYSBub24tb2sgc3RhdHVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0pzb25SZXNwb25zZShyZXNwb25zZTogUHJvbWlzZTxSZXNwb25zZT4pOiBQcm9taXNlPGFueT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgc3RhdHVzLCByZXN1bHQgfSA9IGF3YWl0IChhd2FpdCByZXNwb25zZSkuanNvbigpO1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gJ29rJykge1xuICAgICAgdGhyb3cgbmV3IFN0YXR1c0Vycm9yKCdTZXJ2aWNlIHJlc3BvbmRlZCB3aXRoIGEgbm9uLW9rIHN0YXR1cycpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2goZSkge1xuICAgIC8vIFRPRE8gbWFuYWdlIG5ldHdvcmsgYW5kIHN0YXR1cyBub24tb2sgZXJyb3JzXG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxzIHRoZSBlbmRwb2ludCBzZXJ2aWNlbmFtZSBhbmQgcmV0dXJucyBpdHMgcmVzcG9uc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcXVlcnkgLSBPYmplY3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIGFzIHRoZSBib2R5IHJlcXVlc3Qgb3Igc2VhcmNoIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGJlIGNhbGxlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2ZXJVUkwgLSBVcmwgb2YgdGhlIHNlcnZlciB3aGVyZSB3ZSB3YW50IHRvIGNhbGwgdGhlIHNlcnZpY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uIC0gRXh0ZW5zaW9uIHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBzZXJ2aWNlTmFtZSAoaW5jbHVkaW5nIHRoZSBkb3QgaWYgbmVjZXNzYXJ5KS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlc3BvbnNlPn0gVGhlIHJlcXVlc3QgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWxsU2VydmljZShxdWVyeTogb2JqZWN0LCBzZXJ2aWNlTmFtZTogc3RyaW5nLCBtZXRob2Q6IE1ldGhvZFR5cGUsIHNlcnZlclVSTDogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykgOiBQcm9taXNlPGFueT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoc2VydmljZU5hbWUgKyBleHRlbnNpb24sIHNlcnZlclVSTCk7XG4gICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmIChtZXRob2QgPT09IE1ldGhvZFR5cGUuR2V0KSB7XG4gICAgICAvLyBBZGQgdGhlIHF1ZXJ5IGFzIHNlYXJjaCBwYXJhbXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHF1ZXJ5KSkge1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRoZSBxdWVyeSBhcyB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdFxuICAgICAgaW5pdC5ib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7Li4ucXVlcnl9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmV0Y2godXJsLnRvU3RyaW5nKCksIGluaXQpO1xuICB9IGNhdGNoKGUpIHtcbiAgICAvLyBUT0RPIG1hbmFnZSBuZXR3b3JrIGFuZCBzdGF0dXMgbm9uLW9rIGVycm9yc1xuICAgIHRocm93IGU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhbHQgdGV4dCBvZiB0aGUgTWF0aE1MIHBhc3NlZCBhcyBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW1sIC0gTWF0aE1MIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYWx0IHRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZyAtIExhbmd1YWdlIG9mIHRoZSBhY2Nlc3NpYmxlIHRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVVJMIG9mIHRoZSBzZXJ2ZXIgd2hlcmUgd2Ugd2FudCB0byBjYWxsIHRoZSBzZXJ2aWNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbiAtIEV4dGVuc2lvbiB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgc2VydmljZU5hbWUgKGluY2x1ZGluZyB0aGUgZG90IGlmIG5lY2Vzc2FyeSkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZXNwb25zZT59IFRoZSBtYXRobWwyYWNjZXNzaWJsZSBzZXJ2aWNlIHJlc3BvbnNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF0aG1sMmFjY2Vzc2libGUobW1sOiBzdHJpbmcsIGxhbmc6IHN0cmluZywgdXJsOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKSA6IFByb21pc2U8YW55PiB7XG4gIC8vIFNldCB0aGUgbmVlZGVkIHBhcmFtcyB0byByZXRyaWV2ZSB0aGUgYWx0IHRleHQuXG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAnc2VydmljZSc6ICdtYXRobWwyYWNjZXNzaWJsZScsXG4gICAgJ21tbCc6IG1tbCxcbiAgICAnbWV0cmljcyc6ICd0cnVlJyxcbiAgICAnY2VudGVyYmFzZWxpbmUnOiAnZmFsc2UnLFxuICAgICdsYW5nJzogbGFuZyxcbiAgICAnaWdub3JlU3R5bGVzJzogJ3RydWUnLFxuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBjYWxsU2VydmljZShwYXJhbXMsICdzZXJ2aWNlJywgTWV0aG9kVHlwZS5Qb3N0LCB1cmwsIGV4dGVuc2lvbik7XG4gIHJldHVybiBwcm9jZXNzSnNvblJlc3BvbnNlKHJlc3BvbnNlKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgc2hvd0ltYWdlIHNlcnZpY2Ugd2l0aCB0aGUgZ2l2ZW4gTWF0aE1MIGFuZCByZXR1cm5zIHRoZSByZWNlaXZlZCBSZXNwb25zZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW1sIC0gTWF0aE1MIHRvIHJlbmRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nIC0gTGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVVJMIG9mIHRoZSBzZXJ2ZXIgd2hlcmUgd2Ugd2FudCB0byBjYWxsIHRoZSBzZXJ2aWNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbiAtIEV4dGVuc2lvbiB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgc2VydmljZU5hbWUgKGluY2x1ZGluZyB0aGUgZG90IGlmIG5lY2Vzc2FyeSkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZXNwb25zZT59IHRoZSBSZXNwb25zZSBvYmplY3QgdG8gdGhlIHBldGl0aW9uIG1hZGUgdG8gc2hvd0ltYWdlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93SW1hZ2UobW1sOiBzdHJpbmcsIGxhbmc6IHN0cmluZywgdXJsOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgICdtbWwnOiBtbWwsXG4gICAgJ21ldHJpY3MnOiAndHJ1ZScsXG4gICAgJ2NlbnRlcmJhc2VsaW5lJzogJ2ZhbHNlJyxcbiAgICAnbGFuZyc6bGFuZyxcbiAgfVxuXG4gIC8vIFRyeSB0byBvYnRhaW4gdGhlIGltYWdlIHZpYSBHRVRcbiAgY29uc3QgZ2V0UGFyYW1zID0gUGFyc2VyLmNyZWF0ZVNob3dJbWFnZVNyY0RhdGEoeyBtbWwgfSwgbGFuZyk7XG4gIGNvbnN0IGdldFJlc3BvbnNlID0gY2FsbFNlcnZpY2UoZ2V0UGFyYW1zLCAnc2hvd2ltYWdlJywgTWV0aG9kVHlwZS5HZXQsIHVybCwgZXh0ZW5zaW9uKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvY2Vzc0pzb25SZXNwb25zZShnZXRSZXNwb25zZSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgU3RhdHVzRXJyb3IpIHtcbiAgICAgIC8vIEZvcm11bGEgd2FzIG5vdCBpbiBjYWNoZTsgcHJvY2VlZCB3aXRoIGNhbGxpbmcgc2hvd2ltYWdlIHZpYSBQT1NUXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgR0VUIHJlcXVlc3QgZmFpbHMsIGl0IG1lYW5zIHRoYXQgdGhlIGZvcm11bGEgd2FzIG5vdCBpbiBjYWNoZS4gUHJvY2VlZCB3aXRoIFBPU1Q6XG4gIGNvbnN0IHJlc3BvbnNlID0gY2FsbFNlcnZpY2UocGFyYW1zLCAnc2hvd2ltYWdlJywgTWV0aG9kVHlwZS5Qb3N0LCB1cmwsIGV4dGVuc2lvbik7XG4gIHJldHVybiBwcm9jZXNzSnNvblJlc3BvbnNlKHJlc3BvbnNlKTtcblxufTtcblxuLyoqXG4gKiBDYWxscyB0aGUgY3JlYXRlSW1hZ2Ugc2VydmljZSB3aXRoIHRoZSBnaXZlbiBNYXRoTUwgYW5kIHJldHVybnMgdGhlIHJlY2VpdmVkIFJlc3BvbnNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtbWwgLSBNYXRoTUwgdG8gcmVuZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZyAtIExhbmd1YWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFVSTCBvZiB0aGUgc2VydmVyIHdoZXJlIHdlIHdhbnQgdG8gY2FsbCB0aGUgc2VydmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb24gLSBFeHRlbnNpb24gdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIHNlcnZpY2VOYW1lIChpbmNsdWRpbmcgdGhlIGRvdCBpZiBuZWNlc3NhcnkpLlxuICogQHJldHVybnMge1Byb21pc2U8UmVzcG9uc2U+fSB0aGUgUmVzcG9uc2Ugb2JqZWN0IHRvIHRoZSBwZXRpdGlvbiBtYWRlIHRvIHNob3dJbWFnZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSW1hZ2UobW1sOiBzdHJpbmcsIGxhbmc6IHN0cmluZywgdXJsOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgICdtbWwnOiBtbWwsXG4gICAgJ21ldHJpY3MnOiAndHJ1ZScsXG4gICAgJ2NlbnRlcmJhc2VsaW5lJzogJ2ZhbHNlJyxcbiAgICAnbGFuZyc6IGxhbmcsXG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGNhbGxTZXJ2aWNlKHBhcmFtcywgJ2NyZWF0ZWltYWdlJywgTWV0aG9kVHlwZS5HZXQsIHVybCwgZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIChhd2FpdCByZXNwb25zZSkudGV4dCgpO1xufTtcblxuLyoqXG4gKiBDYWxscyB0aGUgbGF0ZXgybWF0aG1sIHNlcnZpY2Ugd2l0aCB0aGUgZ2l2ZW4gTGFUZVggYW5kIHJldHVybnMgdGhlIHJlY2VpdmVkIFJlc3BvbnNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYXRleCAtIExhVGVYIHRvIHJlbmRlclxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFVybCBvZiB0aGUgc2VydmVyIHdoZXJlIHdlIHdhbnQgdG8gY2FsbCB0aGUgc2VydmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb24gLSBFeHRlbnNpb24gdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIHNlcnZpY2VOYW1lIChpbmNsdWRpbmcgdGhlIGRvdCBpZiBuZWNlc3NhcnkpLlxuICogQHJldHVybnMge1Byb21pc2U8UmVzcG9uc2U+fSB0aGUgUmVzcG9uc2Ugb2JqZWN0IHRvIHRoZSBwZXRpdGlvbiBtYWRlIHRvIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdGV4VG9NYXRobWwobGF0ZXg6IHN0cmluZywgdXJsOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgICdzZXJ2aWNlJzogJ2xhdGV4Mm1hdGhtbCcsXG4gICAgJ2xhdGV4JzogbGF0ZXgsXG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGNhbGxTZXJ2aWNlKHBhcmFtcywgJ3NlcnZpY2UnLCBNZXRob2RUeXBlLlBvc3QsIHVybCwgZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIHByb2Nlc3NKc29uUmVzcG9uc2UocmVzcG9uc2UpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgYmFja2VuZC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHZhcmlhYmxla2V5cyAtIExpc3Qgb2YgdGhlIGtleSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIHRvIGZldGNoLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbiAtIEV4dGVuc2lvbiB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgc2VydmljZU5hbWUgKGluY2x1ZGluZyB0aGUgZG90IGlmIG5lY2Vzc2FyeSkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZXNwb25zZT59IFRoZSBjb25maWd1cmF0aW9uanNvbiBzZXJ2aWNlIHJlc3BvbnNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uZmlndXJhdGlvbkpzb24odmFyaWFibGVrZXlzOiBzdHJpbmdbXSwgdXJsOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKSA6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAndmFyaWFibGVrZXlzJzogdmFyaWFibGVrZXlzLmpvaW4oJywnKSxcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gY2FsbFNlcnZpY2UocGFyYW1zLCAnY29uZmlndXJhdGlvbmpzb24nLCBNZXRob2RUeXBlLkdldCwgdXJsLCBleHRlbnNpb24pO1xuICByZXR1cm4gcHJvY2Vzc0pzb25SZXNwb25zZShyZXNwb25zZSk7XG59XG4iLCIvKipcbiAqIFRha2VzIGEgc3RyaW5nIHBvc3NpYmx5IGNvbnRhaW5pbmcgZW5jb2RlZCBlbnRpdGllcyAoZS5nLiAmbmJzcDsgJiMxNjA7KSBhbmRcbiAqIHJldHVybnMgdGhlIHNhbWUgc3RyaW5nIHdpdGggdGhlc2UgcmVwbGFjZWQgYnkgdGhlIFVURi04IGNoYXJhY3RlcnMgdGhleSByZXByZXNlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB3aXRoIGVuY29kZWQgZW50aXRpZXNcbiAqIEByZXR1cm5zIHRoZSBzYW1lIHN0cmluZyB3aXRoIHRoZSBlbnRpdGllcyBkZWNvZGVkXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUVudGl0aWVzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICBlbGVtZW50LmlubmVySFRNTCA9IHRleHQ7XG4gIHJldHVybiBlbGVtZW50LnZhbHVlO1xufVxuXG4vKipcbiAqIFRha2VzIGEgc3RyaW5nIHBvc3NpYmx5IGNvbnRhaW5pbmcgZW5jb2RlZCBuYW1lZCBIVE1MIGVudGl0aWVzIChlLmcuICZuYnNwOykgYW5kXG4gKiByZXR1cm5zIHRoZSBzYW1lIHN0cmluZyB3aXRoIHRoZXNlIHJlcGxhY2VkIGJ5IHRoZSBlbmNvZGluZyB0aGF0IHVzZXMgbnVtYmVycyAoZS5nLiAmIzE2MDspLlxuICogQnkgaXRzIGltcGxlbWVudGF0aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHBvc3NpYmx5IGVuY29kZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgd2VyZVxuICogcHJldmlvdXNseSB1bmVuY29kZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgd2l0aCBlbmNvZGVkIGVudGl0aWVzXG4gKiBAcmV0dXJucyB0aGUgc2FtZSBzdHJpbmcgd2l0aCB0aGUgZW50aXRpZXMgZGVjb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaHRtbEVudGl0aWVzVG9YbWxFbnRpdGllcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICB0ZXh0ID0gZGVjb2RlRW50aXRpZXModGV4dCk7XG5cbiAgLy8gUmVwbGFjZXMgdGhlIDwgJiA+IGNoYXJhY3RlcnMgdG8gaXRzIEhUTUxFbnRpdHkgdG8gYXZvaWQgcmVuZGVyIGlzc3Vlcy5cbiAgdGV4dCA9IHRleHQuc3BsaXQoJ1wiPFwiJykuam9pbignXCImbHQ7XCInKVxuICAgIC5zcGxpdCgnXCI+XCInKVxuICAgIC5qb2luKCdcIiZndDtcIicpXG4gICAgLnNwbGl0KCc+PDwnKVxuICAgIC5qb2luKCc+Jmx0OzwnKTtcblxuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHRleHQuY2hhckF0KGkpO1xuICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPiAxMjgpIHtcbiAgICAgIHJlc3VsdCArPSAnJiMnICsgdGV4dC5jaGFyQ29kZUF0KGkpICsgJzsnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBTZXQgb2YgbWF0aG1sIGFuZCBjaGFyYWN0ZXJzIHdoaWNoIGRvbid0IGhhdmUgYW4gYWNjZXNzaWJsZSB0ZXh0IGFzc29jaWF0ZWRcbi8vIGFuZCBjYW4gbm90IGJlIHRyYW5zbGF0ZWQgb3IgdHJhbnNmb3JtZWQgdG8gTGFUZVguXG5leHBvcnQgY29uc3QgY29ycnVwdE1hdGhNTCA9IFsn4p+mJywgJyYjMTAyMTQ7JywgJ+KfpycsICcmIzEwMjE1OycsICdtc2NhcnJpZXMnLCAnbXNjYXJyeScsICdtc2dyb3VwJywgJ21zdGFjaycsICdtc2xpbmUnLCAnbXNyb3cnXTtcbiIsImltcG9ydCBUZXh0Q2FjaGUgZnJvbSAnLi90ZXh0Y2FjaGUnO1xuaW1wb3J0IFNlcnZpY2VQcm92aWRlciBmcm9tICcuL3NlcnZpY2Vwcm92aWRlcic7XG5pbXBvcnQgTWF0aE1MIGZyb20gJy4vbWF0aG1sJztcbmltcG9ydCBTdHJpbmdNYW5hZ2VyIGZyb20gJy4vc3RyaW5nbWFuYWdlcic7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIE1hdGhUeXBlIGFjY2Vzc2libGUgY2xhc3MuIENvbnZlcnRzIE1hdGhNTCB0byBhY2Nlc3NpYmxlIHRleHQgYW5kIG1hbmFnZXNcbiAqIHRoZSBhc3NvY2lhdGVkIGNsaWVudC1zaWRlIGNhY2hlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2Nlc3NpYmlsaXR5IHtcbiAgLyoqXG4gICogU3RhdGljIHByb3BlcnR5LlxuICAqIEFjY2Vzc2liaWxpdHkgY2FjaGUsIGVhY2ggZW50cnkgY29udGFpbnMgYSBNYXRoTUwgYW5kIGl0cyBjb3JyZXNwb25kZW50IGFjY2Vzc2liaWxpdHkgdGV4dC5cbiAgKiBAdHlwZSB7VGV4dENhY2hlfVxuICAqL1xuICBzdGF0aWMgZ2V0IGNhY2hlKCkge1xuICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5Ll9jYWNoZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgcHJvcGVydHkgc2V0dGVyLlxuICAgKiBTZXQgYWNjZXNzaWJpbGl0eSBjYWNoZS5cbiAgICogQHBhcmFtIHtUZXh0Q2FoZX0gdmFsdWUgLSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHN0YXRpYyBzZXQgY2FjaGUodmFsdWUpIHtcbiAgICBBY2Nlc3NpYmlsaXR5Ll9jYWNoZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIE1hdGhNTCBzdHJpbmdzIHRvIGl0cyBhY2Nlc3NpYmxlIHRleHQgcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtYXRoTUwgLSBNYXRoTUwgdG8gYmUgY29udmVydGVkIHRvIGFjY2Vzc2libGUgdGV4dC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtsYW5ndWFnZV0gLSBMYW5ndWFnZSBvZiB0aGUgYWNjZXNzaWJsZSB0ZXh0LiAnZW4nIGJ5IGRlZmF1bHQuXG4gICAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IFtkYXRhXSAtIFBhcmFtZXRlcnMgdG8gc2VuZCB0byBtYXRobWwyYWNjZXNzaWJsZSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IEFjY2Vzc2liaWxpdHkgdGV4dC5cbiAgICovXG4gIHN0YXRpYyBtYXRoTUxUb0FjY2Vzc2libGUobWF0aE1MLCBsYW5ndWFnZSwgZGF0YSkge1xuICAgIGlmICh0eXBlb2YgKGxhbmd1YWdlKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxhbmd1YWdlID0gJ2VuJztcbiAgICB9XG4gICAgLy8gQ2hlY2sgTWF0aE1MIGNsYXNzLiBJZiB0aGUgY2xhc3MgaXMgY2hlbWlzdHJ5LFxuICAgIC8vIHdlIGFkZCBjaGVtaXN0cnkgdG8gZGF0YSB0byBmb3JjZSBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VcbiAgICAvLyB0byBsb2FkIGNoZW1pc3RyeSBncmFtbWFyLlxuICAgIGlmIChNYXRoTUwuY29udGFpbkNsYXNzKG1hdGhNTCwgJ3dyc19jaGVtaXN0cnknKSkge1xuICAgICAgZGF0YS5tb2RlID0gJ2NoZW1pc3RyeSc7XG4gICAgfVxuICAgIC8vIElnbm9yZSBhY2Nlc2liaWxpdHkgc3R5bGVzXG4gICAgZGF0YS5pZ25vcmVTdHlsZXMgPSB0cnVlO1xuICAgIGxldCBhY2Nlc3NpYmxlVGV4dCA9ICcnO1xuXG4gICAgaWYgKEFjY2Vzc2liaWxpdHkuY2FjaGUuZ2V0KG1hdGhNTCkpIHtcbiAgICAgIGFjY2Vzc2libGVUZXh0ID0gQWNjZXNzaWJpbGl0eS5jYWNoZS5nZXQobWF0aE1MKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YS5zZXJ2aWNlID0gJ21hdGhtbDJhY2Nlc3NpYmxlJztcbiAgICAgIGRhdGEubGFuZyA9IGxhbmd1YWdlO1xuICAgICAgY29uc3QgYWNjZXNzaWJsZUpzb25SZXNwb25zZSA9IEpTT04ucGFyc2UoU2VydmljZVByb3ZpZGVyLmdldFNlcnZpY2UoJ3NlcnZpY2UnLCBkYXRhKSk7XG4gICAgICBpZiAoYWNjZXNzaWJsZUpzb25SZXNwb25zZS5zdGF0dXMgIT09ICdlcnJvcicpIHtcbiAgICAgICAgYWNjZXNzaWJsZVRleHQgPSBhY2Nlc3NpYmxlSnNvblJlc3BvbnNlLnJlc3VsdC50ZXh0O1xuICAgICAgICBBY2Nlc3NpYmlsaXR5LmNhY2hlLnBvcHVsYXRlKG1hdGhNTCwgYWNjZXNzaWJsZVRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjZXNzaWJsZVRleHQgPSBTdHJpbmdNYW5hZ2VyLmdldCgnZXJyb3JfY29udmVydF9hY2Nlc3NpYmlsaXR5Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY2Vzc2libGVUZXh0O1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgYW4gaW5zdGFuY2Ugb2YgVGV4dENhY2hlIGNsYXNzIHRvIG1hbmFnZSB0aGUgSmF2YVNjcmlwdCBhY2Nlc3NpYmxlIGNhY2hlLlxuICogRWFjaCBlbnRyeSBvZiB0aGUgY2FjaGUgb2JqZWN0IGNvbnRhaW5zIHRoZSBNYXRoTUwgYW5kIGl0J3MgY29ycmVzcG9uZGVudCBhY2Nlc3NpYmlsaXR5IHRleHQuXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1RleHRDYWNoZX1cbiAqL1xuQWNjZXNzaWJpbGl0eS5fY2FjaGUgPSBuZXcgVGV4dENhY2hlKCk7XG4iLCIvKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgY29uZmlndXJhdGlvbiBjbGFzcy5cbiAqIFVzdWFsbHkgdXNlZCB0byByZXRyaWV2ZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZ2VuZXJhdGVkIGluIHRoZSBiYWNrZW5kIGludG8gdGhlIGZyb250ZW5kLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEFkZHMgYSBwcm9wZXJ0aWVzIG9iamVjdCB0byB7QGxpbmsgQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzfS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgLSBwcm9wZXJ0aWVzIHRvIGFwcGVuZCB0byBjdXJyZW50IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYWRkQ29uZmlndXJhdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihDb25maWd1cmF0aW9uLnByb3BlcnRpZXMsIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICogU3RhdGljIHByb3BlcnR5LlxuICAqIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2JqZWN0LlxuICAqIEBwcml2YXRlXG4gICogQHR5cGUge09iamVjdH1cbiAgKi9cbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiBDb25maWd1cmF0aW9uLl9wcm9wZXJ0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBwcm9wZXJ0eSBzZXR0ZXIuXG4gICAqIFNldCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSAtIFRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc3RhdGljIHNldCBwcm9wZXJ0aWVzKHZhbHVlKSB7XG4gICAgQ29uZmlndXJhdGlvbi5fcHJvcGVydGllcyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkga2V5LlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC0gUHJvcGVydHkga2V5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBzdGF0aWMgZ2V0KGtleSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKENvbmZpZ3VyYXRpb24ucHJvcGVydGllcywga2V5KSkge1xuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKENvbmZpZ3VyYXRpb24ucHJvcGVydGllcywgJ193cnNfY29uZl8nKSkge1xuICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzW2Bfd3JzX2NvbmZfJHtrZXl9YF07XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBDb25maWd1cmF0aW9uLnByb3BlcnRpZXNba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IHByb3BlcnR5IHRvIENvbmZpZ3VyYXRpb24gY2xhc3MuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLSBQcm9wZXJ0eSBrZXkuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSAtIFByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIHNldChrZXksIHZhbHVlKSB7XG4gICAgQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgcHJvcGVydHkgb2JqZWN0IHZhbHVlIHdpdGggbmV3IHZhbHVlcy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gYmUgdXBkYXRlZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnR5VmFsdWUgLSBPYmplY3QgY29udGFpbmluZyB0aGUgbmV3IHZhbHVlcy5cbiAgICovXG4gIHN0YXRpYyB1cGRhdGUoa2V5LCBwcm9wZXJ0eVZhbHVlKSB7XG4gICAgaWYgKCFDb25maWd1cmF0aW9uLmdldChrZXkpKSB7XG4gICAgICBDb25maWd1cmF0aW9uLnNldChrZXksIHByb3BlcnR5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1cGRhdGVQcm9wZXJ0eSA9IE9iamVjdC5hc3NpZ24oQ29uZmlndXJhdGlvbi5nZXQoa2V5KSwgcHJvcGVydHlWYWx1ZSk7XG4gICAgICBDb25maWd1cmF0aW9uLnNldChrZXksIHVwZGF0ZVByb3BlcnR5KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTdGF0aWMgcHJvcGVydGllcyBvYmplY3QuIFN0b3JlcyBhbGwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLlxuICogTmVlZGVkIHRvIGF0dHJpYnV0ZSBhY2Nlc3NvcnMuXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge09iamVjdH1cbiAqL1xuQ29uZmlndXJhdGlvbi5fcHJvcGVydGllcyA9IHt9O1xuIiwiLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYWxsIHRoZSBjb25zdGFudHMgbmVlZGVkIGluIGEgTWF0aFR5cGUgaW50ZWdyYXRpb24gYW1vbmcgZGlmZmVyZW50IGNsYXNzZXMuXG4gKiBJZiBhIGNvbnN0YW50IHNob3VsZCBiZSB1c2VkIGFjcm9zcyBkaWZmZXJlbnQgY2xhc3NlcyBzaG91bGQgYmUgZGVmaW5lZCB1c2luZyBhdHRyaWJ1dGVcbiAqIGFjY2Vzc29ycy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uc3RhbnRzIHtcbiAgLyoqXG4gICAqIFNhZmUgWE1MIGVudGl0aWVzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBzYWZlWG1sQ2hhcmFjdGVyc0VudGl0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YWdPcGVuZXI6ICcmbGFxdW87JyxcbiAgICAgIHRhZ0Nsb3NlcjogJyZyYXF1bzsnLFxuICAgICAgZG91YmxlUXVvdGU6ICcmdW1sOycsXG4gICAgICByZWFsRG91YmxlUXVvdGU6ICcmcXVvdDsnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQmxhY2tib2FyZCBpbnZhbGlkIHNhZmUgY2hhcmFjdGVycy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgc2FmZUJhZEJsYWNrYm9hcmRDaGFyYWN0ZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsdEVsZW1lbnQ6ICfCq21vwrs8wqsvbW/CuycsXG4gICAgICBndEVsZW1lbnQ6ICfCq21vwrs+wqsvbW/CuycsXG4gICAgICBhbXBFbGVtZW50OiAnwqttb8K7JsKrL21vwrsnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQmxhY2tib2FyZCB2YWxpZCBzYWZlIGNoYXJhY3RlcnMuXG4gICAqIEB0eXBle09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgc2FmZUdvb2RCbGFja2JvYXJkQ2hhcmFjdGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbHRFbGVtZW50OiAnwqttb8K7wqdsdDvCqy9tb8K7JyxcbiAgICAgIGd0RWxlbWVudDogJ8KrbW/Cu8KnZ3Q7wqsvbW/CuycsXG4gICAgICBhbXBFbGVtZW50OiAnwqttb8K7wqdhbXA7wqsvbW/CuycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFuZGFyZCBYTUwgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCB4bWxDaGFyYWN0ZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3htbENoYXJhY3RlcnMnLFxuICAgICAgdGFnT3BlbmVyOiAnPCcsIC8vIEhleDogXFx4M0MuXG4gICAgICB0YWdDbG9zZXI6ICc+JywgLy8gSGV4OiBcXHgzRS5cbiAgICAgIGRvdWJsZVF1b3RlOiAnXCInLCAvLyBIZXg6IFxceDIyLlxuICAgICAgYW1wZXJzYW5kOiAnJicsIC8vIEhleDogXFx4MjYuXG4gICAgICBxdW90ZTogJ1xcJycsIC8vIEhleDogXFx4MjcuXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAqIFNhZmUgWE1MIHNwZWNpYWwgY2hhcmFjdGVycy4gVGhpcyBjaGFyYWN0ZXJzIGFyZSB1c2VkIGluc3RlYWQgdGhlIHN0YW5kYXJkXG4gICogdGhlIHN0YW5kYXJkIHRvIHBhcnNlIHRoZSAgTWF0aE1MIGlmIHNhZmVYTUwgc2F2ZSBtb2RlIGlzIGVuYWJsZS4gRWFjaCBYTUxcbiAgKiBzcGVjaWFsIGNoYXJhY3RlciBoYXZlIGEgVVRGLTggcmVwcmVzZW50YXRpb24uXG4gICogQHR5cGUge09iamVjdH1cbiAgKi9cbiAgc3RhdGljIGdldCBzYWZlWG1sQ2hhcmFjdGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdzYWZlWG1sQ2hhcmFjdGVycycsXG4gICAgICB0YWdPcGVuZXI6ICfCqycsIC8vIEhleDogXFx4QUIuXG4gICAgICB0YWdDbG9zZXI6ICfCuycsIC8vIEhleDogXFx4QkIuXG4gICAgICBkb3VibGVRdW90ZTogJ8KoJywgLy8gSGV4OiBcXHhBOC5cbiAgICAgIGFtcGVyc2FuZDogJ8KnJywgLy8gSGV4OiBcXHhBNy5cbiAgICAgIHF1b3RlOiAnYCcsIC8vIEhleDogXFx4NjAuXG4gICAgICByZWFsRG91YmxlUXVvdGU6ICfCqCcsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBVdGlsIGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIE1hdGhUeXBlIEltYWdlIGNsYXNzLiBDb250YWlucyBhbGwgdGhlIGxvZ2ljIHJlbGF0ZWRcbiAqIHRvIE1hdGhUeXBlIGltYWdlcyBtYW5pcHVsYXRpb24uXG4gKiBBbGwgTWF0aFR5cGUgaW1hZ2VzIGFyZSBnZW5lcmF0ZWQgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIE1hdGhUeXBlXG4gKiBpbnRlZ3JhdGlvbiBzZXJ2aWNlOiBzaG93aW1hZ2Ugb3IgY3JlYXRlaW1hZ2UuXG4gKlxuICogVGhlcmUgYXJlIHR3byBhdmFpbGFibGUgaW1hZ2UgZm9ybWF0czpcbiAqIC0gc3ZnIChkZWZhdWx0KVxuICogLSBwbmdcbiAqXG4gKiBUaGVyZSBhcmUgdHdvIGZvcm1hdHMgZm9yIHRoZSBpbWFnZSBzcmMgYXR0cmlidXRlOlxuICogLSBBIGRhdGEtdXJpIHNjaGVtZSBjb250YWluaW5nIHRoZSBVUkwtZW5jb2RlZCBTVkcgb3IgYSBQTkcncyBiYXNlNjQuXG4gKiAtIEEgbGluayB0byB0aGUgc2hvd2ltYWdlIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlIHtcbiAgLyoqXG4gICAqIFJlbW92ZXMgZGF0YSBhdHRyaWJ1dGVzIGZyb20gYW4gaW1hZ2UuXG4gICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudH0gaW1nIC0gSW1hZ2Ugd2hlcmUgcmVtb3ZlIGRhdGEgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVJbWdEYXRhQXR0cmlidXRlcyhpbWcpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBbXTtcbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMgfSA9IGltZztcblxuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgaWYgKGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICYmIGF0dHJpYnV0ZS5uYW1lICE9PSB1bmRlZmluZWQgJiYgYXR0cmlidXRlLm5hbWUuaW5kZXhPZignZGF0YS0nKSA9PT0gMCkge1xuICAgICAgICAvLyBJcyBwcmVmZXJyZWQga2VlcCBhbiBhcnJheSBhbmQgcmVtb3ZlIGFmdGVyIHRoZSBzZWFyY2hcbiAgICAgICAgLy8gYmVjYXVzZSB3aGVuIGF0dHJpYnV0ZSBpcyByZW1vdmVkIHRoZSBhcnJheSBvZiBhdHRyaWJ1dGVzXG4gICAgICAgIC8vIGlzIG1vZGlmaWVkLlxuICAgICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUucHVzaChhdHRyaWJ1dGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuZm9yRWFjaCgoYXR0cmlidXRlKSA9PiB7XG4gICAgICBpbWcucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBDbG9uZXMgYWxsIE1hdGhUeXBlIGltYWdlIGF0dHJpYnV0ZXMgZnJvbSBhIEhUTUxJbWFnZUVsZW1lbnQgdG8gYW5vdGhlci5cbiAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBvcmlnaW5JbWcgLSBUaGUgb3JpZ2luYWwgaW1hZ2UuXG4gICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudH0gZGVzdEltZyAtIFRoZSBkZXN0aW5hdGlvbiBpbWFnZS5cbiAgICovXG4gIHN0YXRpYyBjbG9uZShvcmlnaW5JbWcsIGRlc3RJbWcpIHtcbiAgICBjb25zdCBjdXN0b21FZGl0b3JBdHRyaWJ1dGVOYW1lID0gQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlQ3VzdG9tRWRpdG9yTmFtZScpO1xuICAgIGlmICghb3JpZ2luSW1nLmhhc0F0dHJpYnV0ZShjdXN0b21FZGl0b3JBdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgZGVzdEltZy5yZW1vdmVBdHRyaWJ1dGUoY3VzdG9tRWRpdG9yQXR0cmlidXRlTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0aG1sQXR0cmlidXRlTmFtZSA9IENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZU1hdGhtbEF0dHJpYnV0ZScpO1xuICAgIGNvbnN0IGltZ0F0dHJpYnV0ZXMgPSBbXG4gICAgICBtYXRobWxBdHRyaWJ1dGVOYW1lLFxuICAgICAgY3VzdG9tRWRpdG9yQXR0cmlidXRlTmFtZSxcbiAgICAgICdhbHQnLFxuICAgICAgJ2hlaWdodCcsXG4gICAgICAnd2lkdGgnLFxuICAgICAgJ3N0eWxlJyxcbiAgICAgICdzcmMnLFxuICAgICAgJ3JvbGUnLFxuICAgIF07XG5cbiAgICBpbWdBdHRyaWJ1dGVzLmZvckVhY2goKGl0ZXJhdG9yKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5BdHRyaWJ1dGUgPSBvcmlnaW5JbWcuZ2V0QXR0cmlidXRlKGl0ZXJhdG9yKTtcbiAgICAgIGlmIChvcmlnaW5BdHRyaWJ1dGUpIHtcbiAgICAgICAgZGVzdEltZy5zZXRBdHRyaWJ1dGUoaXRlcmF0b3IsIG9yaWdpbkF0dHJpYnV0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBDYWxjdWxhdGVzIHRoZSBtZXRyaWNzIG9mIGEgTWF0aFR5cGUgaW1hZ2UgZ2l2ZW4gdGhlIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGFuZCB0aGUgaW1hZ2UgZm9ybWF0LlxuICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudH0gaW1nIC0gVGhlIEhUTUxJbWFnZUVsZW1lbnQuXG4gICogQHBhcmFtIHtTdHJpbmd9IHVyaSAtIFRoZSBVUkkgZ2VuZXJhdGVkIGJ5IHRoZSBpbWFnZSBzZXJ2aWNlOiBjYW4gYmUgYSBkYXRhIFVSSSBzY2hlbWUgb3IgYSBVUkwuXG4gICogQHBhcmFtIHtCb29sZWFufSBqc29uUmVzcG9uc2UgLSBUcnVlIHRoZSByZXNwb25zZSBvZiB0aGUgaW1hZ2Ugc2VydmljZSBpcyBhXG4gICogSlNPTiBvYmplY3QuIEZhbHNlIG90aGVyd2lzZS5cbiAgKi9cbiAgc3RhdGljIHNldEltZ1NpemUoaW1nLCB1cmksIGpzb25SZXNwb25zZSkge1xuICAgIGxldCBhcjtcbiAgICBsZXQgYmFzZTY0U3RyaW5nO1xuICAgIGxldCBieXRlcztcbiAgICBsZXQgc3ZnU3RyaW5nO1xuICAgIGlmIChqc29uUmVzcG9uc2UpIHtcbiAgICAgIC8vIENsZWFuaW5nIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NC5cbiAgICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VGb3JtYXQnKSA9PT0gJ3N2ZycpIHtcbiAgICAgICAgLy8gU1ZHIGZvcm1hdC5cbiAgICAgICAgLy8gSWYgU1ZHIGlzIGVuY29kZWQgaW4gYmFzZTY0IHdlIG5lZWQgdG8gY29udmVydCB0aGUgYmFzZTY0IGJ5dGVzIGludG8gYSBTVkcgc3RyaW5nLlxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVNb2RlJykgIT09ICdiYXNlNjQnKSB7XG4gICAgICAgICAgYXIgPSBJbWFnZS5nZXRNZXRyaWNzRnJvbVN2Z1N0cmluZyh1cmkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2U2NFN0cmluZyA9IGltZy5zcmMuc3Vic3RyKGltZy5zcmMuaW5kZXhPZignYmFzZTY0LCcpICsgNywgaW1nLnNyYy5sZW5ndGgpO1xuICAgICAgICAgIHN2Z1N0cmluZyA9ICcnO1xuICAgICAgICAgIGJ5dGVzID0gVXRpbC5iNjRUb0J5dGVBcnJheShiYXNlNjRTdHJpbmcsIGJhc2U2NFN0cmluZy5sZW5ndGgpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHN2Z1N0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXIgPSBJbWFnZS5nZXRNZXRyaWNzRnJvbVN2Z1N0cmluZyhzdmdTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBORyBmb3JtYXQ6IHdlIHN0b3JlIGFsbCBtZXRyaWNzIGluZm9ybWF0aW9uIGluIHRoZSBmaXJzdCA4OCBieXRlcy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2U2NFN0cmluZyA9IGltZy5zcmMuc3Vic3RyKGltZy5zcmMuaW5kZXhPZignYmFzZTY0LCcpICsgNywgaW1nLnNyYy5sZW5ndGgpO1xuICAgICAgICBieXRlcyA9IFV0aWwuYjY0VG9CeXRlQXJyYXkoYmFzZTY0U3RyaW5nLCA4OCk7XG4gICAgICAgIGFyID0gSW1hZ2UuZ2V0TWV0cmljc0Zyb21CeXRlcyhieXRlcyk7XG4gICAgICB9XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogd2Ugc3RvcmUgdGhlIG1ldHJpY3MgaW50byBjcmVhdGVpbWFnZSByZXNwb25zZS5cbiAgICB9IGVsc2Uge1xuICAgICAgYXIgPSBVdGlsLnVybFRvQXNzQXJyYXkodXJpKTtcbiAgICB9XG4gICAgbGV0IHdpZHRoID0gYXIuY3c7XG4gICAgaWYgKCF3aWR0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgaGVpZ2h0ID0gYXIuY2g7XG4gICAgbGV0IGJhc2VsaW5lID0gYXIuY2I7XG4gICAgY29uc3QgeyBkcGkgfSA9IGFyO1xuICAgIGlmIChkcGkpIHtcbiAgICAgIHdpZHRoID0gd2lkdGggKiA5NiAvIGRwaTtcbiAgICAgIGhlaWdodCA9IGhlaWdodCAqIDk2IC8gZHBpO1xuICAgICAgYmFzZWxpbmUgPSBiYXNlbGluZSAqIDk2IC8gZHBpO1xuICAgIH1cbiAgICBpbWcud2lkdGggPSB3aWR0aDtcbiAgICBpbWcuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGltZy5zdHlsZS52ZXJ0aWNhbEFsaWduID0gYC0ke2hlaWdodCAtIGJhc2VsaW5lfXB4YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBtZXRyaWNzIG9mIGFuIGltYWdlIHdoaWNoIGhhcyBiZWVuIHJlc2l6ZWQuIElzIHVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWxcbiAgICogbWV0cmljcyBvZiBhIHJlc2l6ZWQgaW1hZ2UuXG4gICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudCB9IGltZyAtIFRoZSByZXNpemVkIEhUTUxJbWFnZUVsZW1lbnQuXG4gICAqL1xuICBzdGF0aWMgZml4QWZ0ZXJSZXNpemUoaW1nKSB7XG4gICAgaW1nLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICBpbWcucmVtb3ZlQXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIGltZy5yZW1vdmVBdHRyaWJ1dGUoJ2hlaWdodCcpO1xuICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIHJlc2l6ZSB3aXRoIG1heC13aWR0aCBjc3MgcHJvcGVydHkuXG4gICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJ25vbmUnO1xuXG4gICAgY29uc3QgcHJvY2Vzc0ltZyA9IChpbWcpID0+IHtcbiAgICAgIGlmIChpbWcuc3JjLmluZGV4T2YoJ2RhdGE6aW1hZ2UnKSAhPT0gLTEpIHtcbiAgICAgICAgaWYgKGltZy5zcmMuaW5kZXhPZignZGF0YTppbWFnZS9zdmcreG1sJykgIT09IC0xKSB7XG5cbiAgICAgICAgICAvLyBJbWFnZSBpcyBpbiBiYXNlNjRcbiAgICAgICAgICBpZiAoaW1nLnNyYy5pbmRleE9mKCdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJy5sZW5ndGggPT09IDI2XG4gICAgICAgICAgICBjb25zdCBiYXNlNjRTdHJpbmcgPSBpbWcuZ2V0QXR0cmlidXRlKCdzcmMnKS5zdWJzdHJpbmcoMjYpO1xuICAgICAgICAgICAgY29uc3Qgc3ZnU3RyaW5nID0gd2luZG93LmF0b2IoYmFzZTY0U3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRTdmdTdHJpbmcgPSBlbmNvZGVVUklDb21wb25lbnQoc3ZnU3RyaW5nKTtcbiAgICAgICAgICAgIGltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGBkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGY4LCR7ZW5jb2RlZFN2Z1N0cmluZ31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmOCwnLmxlbmd0aCA9PT0gMzIuXG4gICAgICAgICAgY29uc3Qgc3ZnID0gZGVjb2RlVVJJQ29tcG9uZW50KGltZy5zcmMuc3Vic3RyaW5nKDMyLCBpbWcuc3JjLmxlbmd0aCkpO1xuICAgICAgICAgIEltYWdlLnNldEltZ1NpemUoaW1nLCBzdmcsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICdkYXRhOmltYWdlL3BuZztiYXNlNjQsJyA9PT0gMjIuXG4gICAgICAgICAgY29uc3QgYmFzZTY0ID0gaW1nLnNyYy5zdWJzdHJpbmcoMjIsIGltZy5zcmMubGVuZ3RoKTtcbiAgICAgICAgICBJbWFnZS5zZXRJbWdTaXplKGltZywgYmFzZTY0LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgSW1hZ2Uuc2V0SW1nU2l6ZShpbWcsIGltZy5zcmMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBJZiB0aGUgaW1hZ2UgZG9lc24ndCBjb250YWluIGEgYmxvYiwganVzdCBwcm9jZXNzIGl0IG5vcm1hbGx5XG4gICAgaWYgKGltZy5zcmMuaW5kZXhPZignYmxvYjonKSA9PT0gLTEpIHtcbiAgICAgIHByb2Nlc3NJbWcoaW1nKTtcbiAgICAvLyBpZiBpdCBkb2VzIGNvbnRhaW4gYSBibG9iLCB0aGVuIHJlYWQgdGhhdCwgcmVwbGFjZSB0aGUgc3JjIHdpdGggdGhlIGRlY29kZWQgY29udGVudCwgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIHJlYWRlci5yZXN1bHQpO1xuICAgICAgICBwcm9jZXNzSW1nKGltZyk7XG4gICAgICB9O1xuICAgICAgZmV0Y2goaW1nLnNyYykudGhlbihyID0+IHIuYmxvYigpKS50aGVuKGJsb2IgPT4ge1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXRyaWNzIChoZWlnaHQsIHdpZHRoIGFuZCBiYXNlbGluZSkgY29udGFpbmVkIGluIGEgU1ZHIGltYWdlIGdlbmVyYXRlZFxuICAgKiBieSB0aGUgTWF0aFR5cGUgaW1hZ2Ugc2VydmljZS4gVGhpcyBpbWFnZSBjb250YWlucyBhcyBhbiBleHRyYSBjdXN0b20gYXR0cmlidXRlOlxuICAgKiB0aGUgYmFzZWxpbmUgKHdyczpiYXNlbGluZSkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdmdTdHJpbmcgLSBUaGUgU1ZHIGltYWdlLlxuICAgKiBAcmV0dXJuIHtBcnJheX0gLSBUaGUgaW1hZ2UgbWV0cmljcy5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRyaWNzRnJvbVN2Z1N0cmluZyhzdmdTdHJpbmcpIHtcbiAgICBsZXQgZmlyc3QgPSBzdmdTdHJpbmcuaW5kZXhPZignaGVpZ2h0PVwiJyk7XG4gICAgbGV0IGxhc3QgPSBzdmdTdHJpbmcuaW5kZXhPZignXCInLCBmaXJzdCArIDgsIHN2Z1N0cmluZy5sZW5ndGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IHN2Z1N0cmluZy5zdWJzdHJpbmcoZmlyc3QgKyA4LCBsYXN0KTtcblxuICAgIGZpcnN0ID0gc3ZnU3RyaW5nLmluZGV4T2YoJ3dpZHRoPVwiJyk7XG4gICAgbGFzdCA9IHN2Z1N0cmluZy5pbmRleE9mKCdcIicsIGZpcnN0ICsgNywgc3ZnU3RyaW5nLmxlbmd0aCk7XG4gICAgY29uc3Qgd2lkdGggPSBzdmdTdHJpbmcuc3Vic3RyaW5nKGZpcnN0ICsgNywgbGFzdCk7XG5cbiAgICBmaXJzdCA9IHN2Z1N0cmluZy5pbmRleE9mKCd3cnM6YmFzZWxpbmU9XCInKTtcbiAgICBsYXN0ID0gc3ZnU3RyaW5nLmluZGV4T2YoJ1wiJywgZmlyc3QgKyAxNCwgc3ZnU3RyaW5nLmxlbmd0aCk7XG4gICAgY29uc3QgYmFzZWxpbmUgPSBzdmdTdHJpbmcuc3Vic3RyaW5nKGZpcnN0ICsgMTQsIGxhc3QpO1xuXG4gICAgaWYgKHR5cGVvZiB3aWR0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGFyciA9IFtdO1xuICAgICAgYXJyLmN3ID0gd2lkdGg7XG4gICAgICBhcnIuY2ggPSBoZWlnaHQ7XG4gICAgICBpZiAodHlwZW9mIGJhc2VsaW5lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBhcnIuY2IgPSBiYXNlbGluZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXRyaWNzICh3aWR0aCwgaGVpZ2h0LCBiYXNlbGluZSBhbmQgZHBpKSBjb250YWluZWQgaW4gYSBQTkcgYnl0ZSBhcnJheS5cbiAgICogQHBhcmFtICB7QXJyYXkuPEJ5dGVzPn0gYnl0ZXMgLSBwbmcgYnl0ZSBhcnJheS5cbiAgICogQHJldHVybiB7QXJyYXl9IFRoZSBwbmcgbWV0cmljcy5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRyaWNzRnJvbUJ5dGVzKGJ5dGVzKSB7XG4gICAgVXRpbC5yZWFkQnl0ZXMoYnl0ZXMsIDAsIDgpO1xuICAgIGxldCB3aWR0aDtcbiAgICBsZXQgaGVpZ2h0O1xuICAgIGxldCB0eXA7XG4gICAgbGV0IGJhc2VsaW5lO1xuICAgIGxldCBkcGk7XG4gICAgd2hpbGUgKGJ5dGVzLmxlbmd0aCA+PSA0KSB7XG4gICAgICB0eXAgPSBVdGlsLnJlYWRJbnQzMihieXRlcyk7XG4gICAgICBpZiAodHlwID09PSAweDQ5NDg0NDUyKSB7XG4gICAgICAgIHdpZHRoID0gVXRpbC5yZWFkSW50MzIoYnl0ZXMpO1xuICAgICAgICBoZWlnaHQgPSBVdGlsLnJlYWRJbnQzMihieXRlcyk7XG4gICAgICAgIC8vIFJlYWQgNSBieXRlcy5cbiAgICAgICAgVXRpbC5yZWFkSW50MzIoYnl0ZXMpO1xuICAgICAgICBVdGlsLnJlYWRCeXRlKGJ5dGVzKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwID09PSAweDYyNjE1MzQ1KSB7IC8vIEJhc2VsaW5lOiAnYmFTRScuXG4gICAgICAgIGJhc2VsaW5lID0gVXRpbC5yZWFkSW50MzIoYnl0ZXMpO1xuICAgICAgfSBlbHNlIGlmICh0eXAgPT09IDB4NzA0ODU5NzMpIHsgLy8gRHBpczogJ3BIWXMnLlxuICAgICAgICBkcGkgPSBVdGlsLnJlYWRJbnQzMihieXRlcyk7XG4gICAgICAgIGRwaSA9IChNYXRoLnJvdW5kKGRwaSAvIDM5LjM3KSk7XG4gICAgICAgIFV0aWwucmVhZEludDMyKGJ5dGVzKTtcbiAgICAgICAgVXRpbC5yZWFkQnl0ZShieXRlcyk7XG4gICAgICB9XG4gICAgICBVdGlsLnJlYWRJbnQzMihieXRlcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aWR0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGFyciA9IFtdO1xuICAgICAgYXJyLmN3ID0gd2lkdGg7XG4gICAgICBhcnIuY2ggPSBoZWlnaHQ7XG4gICAgICBhcnIuZHBpID0gZHBpO1xuICAgICAgaWYgKGJhc2VsaW5lKSB7XG4gICAgICAgIGFyci5jYiA9IGJhc2VsaW5lO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiIsImltcG9ydCBUZXh0Q2FjaGUgZnJvbSAnLi90ZXh0Y2FjaGUnO1xuaW1wb3J0IE1hdGhNTCBmcm9tICcuL21hdGhtbCc7XG5pbXBvcnQgU2VydmljZVByb3ZpZGVyIGZyb20gJy4vc2VydmljZXByb3ZpZGVyJztcbmltcG9ydCBDb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IFV0aWwgZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBMYVRlWCBwYXJzZXIuIE1hbmFnZXMgdGhlIHNlcnZpY2VzIHdoaWNoIGFsbG93cyB0byBjb252ZXJ0XG4gKiBMYVRlWCBpbnRvIE1hdGhNTCBhbmQgTWF0aE1MIGludG8gTGFUZVguXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhdGV4IHtcbiAgLyoqXG4gICAqIFN0YXRpYyBwcm9wZXJ0eS5cbiAgICogUmV0dXJuIGxhdGV4IGNhY2hlLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Q2FjaGV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGNhY2hlKCkge1xuICAgIHJldHVybiBMYXRleC5fY2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIHByb3BlcnR5IHNldHRlci5cbiAgICogU2V0IGxhdGV4IGNhY2hlLlxuICAgKiBAcGFyYW0ge0NhY2hlfSB2YWx1ZSAtIFRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICogQGlnbm9yZVxuICAqL1xuICBzdGF0aWMgc2V0IGNhY2hlKHZhbHVlKSB7XG4gICAgTGF0ZXguX2NhY2hlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgTWF0aE1MIHRvIExhVGVYIGJ5IGNhbGxpbmcgbWF0aG1sMmxhdGV4IHNlcnZpY2UuIEZvciB0ZXh0IHNlcnZpY2VzXG4gICAqIHdlIGNhbGwgYSB0ZXh0IHNlcnZpY2Ugd2l0aCB0aGUgcGFyYW0gbWF0aG1sMmxhdGV4LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWF0aG1sIC0gTWF0aE1MIFN0cmluZy5cbiAgICogQHJldHVybiB7U3RyaW5nfSBMYVRlWCBzdHJpbmcgZ2VuZXJhdGVkIGJ5IHRoZSBNYXRoTUwgYXJndW1lbnQuXG4gICAqL1xuICBzdGF0aWMgZ2V0TGF0ZXhGcm9tTWF0aE1MKG1hdGhtbCkge1xuICAgIGNvbnN0IG1hdGhtbFdpdGhvdXRTZW1hbnRpY3MgPSBNYXRoTUwucmVtb3ZlU2VtYW50aWNzKG1hdGhtbCk7XG4gICAgLyoqXG4gICAgICogQHR5cGUge1RleHRDYWNoZX1cbiAgICAgKi9cbiAgICBjb25zdCB7IGNhY2hlIH0gPSBMYXRleDtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBzZXJ2aWNlOiAnbWF0aG1sMmxhdGV4JyxcbiAgICAgIG1tbDogbWF0aG1sV2l0aG91dFNlbWFudGljcyxcbiAgICB9O1xuXG4gICAgY29uc3QganNvblJlc3BvbnNlID0gSlNPTi5wYXJzZShTZXJ2aWNlUHJvdmlkZXIuZ2V0U2VydmljZSgnc2VydmljZScsIGRhdGEpKTtcblxuICAgIC8vIFRPRE86IEVycm9yIGhhbmRsaW5nLlxuICAgIGxldCBsYXRleCA9ICcnO1xuXG4gICAgaWYgKGpzb25SZXNwb25zZS5zdGF0dXMgPT09ICdvaycpIHtcbiAgICAgIGxhdGV4ID0ganNvblJlc3BvbnNlLnJlc3VsdC50ZXh0O1xuICAgICAgY29uc3QgbGF0ZXhIdG1sRW50aXRpZXNFbmNvZGVkID0gVXRpbC5odG1sRW50aXRpZXMobGF0ZXgpO1xuICAgICAgLy8gSW5zZXJ0aW5nIExhVGVYIHNlbWFudGljcy5cbiAgICAgIGNvbnN0IG1hdGhtbFdpdGhTZW1hbnRpY3MgPSBNYXRoTUwuYWRkQW5ub3RhdGlvbihtYXRobWwsIGxhdGV4SHRtbEVudGl0aWVzRW5jb2RlZCwgJ0xhVGVYJyk7XG4gICAgICBjYWNoZS5wb3B1bGF0ZShsYXRleCwgbWF0aG1sV2l0aFNlbWFudGljcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhdGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIExhVGVYIHRvIE1hdGhNTCBieSBjYWxsaW5nIGxhdGV4Mm1hdGhtbCBzZXJ2aWNlLiBGb3IgdGV4dCBzZXJ2aWNlc1xuICAgKiB3ZSBjYWxsIGEgdGV4dCBzZXJ2aWNlIHdpdGggdGhlIHBhcmFtIGxhdGV4Mm1hdGhtbC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGxhdGV4IC0gU3RyaW5nIGNvbnRhaW5pbmcgYSBMYVRlWCBmb3JtdWxhLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVMYXRleE9uU2VtYW50aWNzXG4gICAqIC0gSWYgdHJ1ZSBMYVRlWCB3b3VsZCBtZSBpbmNsdWRlZCBpbnRvIE1hdGhNTCBzZW1hbnRpY3MuXG4gICAqIEByZXR1cm4ge1N0cmluZ30gTWF0aE1MIHN0cmluZyBnZW5lcmF0ZWQgYnkgdGhlIExhVGVYIGFyZ3VtZW50LlxuICAgKi9cbiAgc3RhdGljIGdldE1hdGhNTEZyb21MYXRleChsYXRleCwgaW5jbHVkZUxhdGV4T25TZW1hbnRpY3MpIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7VGV4dENhY2hlfVxuICAgICAqL1xuICAgIGNvbnN0IGxhdGV4Q2FjaGUgPSBMYXRleC5jYWNoZTtcblxuICAgIGlmIChMYXRleC5jYWNoZS5nZXQobGF0ZXgpKSB7XG4gICAgICByZXR1cm4gTGF0ZXguY2FjaGUuZ2V0KGxhdGV4KTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHNlcnZpY2U6ICdsYXRleDJtYXRobWwnLFxuICAgICAgbGF0ZXgsXG4gICAgfTtcblxuICAgIGlmIChpbmNsdWRlTGF0ZXhPblNlbWFudGljcykge1xuICAgICAgZGF0YS5zYXZlTGF0ZXggPSAnJztcbiAgICB9XG5cbiAgICBjb25zdCBqc29uUmVzcG9uc2UgPSBKU09OLnBhcnNlKFNlcnZpY2VQcm92aWRlci5nZXRTZXJ2aWNlKCdzZXJ2aWNlJywgZGF0YSkpO1xuXG4gICAgbGV0IG91dHB1dDtcbiAgICBpZiAoanNvblJlc3BvbnNlLnN0YXR1cyA9PT0gJ29rJykge1xuICAgICAgbGV0IG1hdGhtbCA9IGpzb25SZXNwb25zZS5yZXN1bHQudGV4dDtcbiAgICAgIG1hdGhtbCA9IG1hdGhtbC5zcGxpdCgnXFxyJykuam9pbignJykuc3BsaXQoJ1xcbicpLmpvaW4oJyAnKTtcblxuICAgICAgLy8gUG9wdWxhdGUgTGF0ZXhDYWNoZS5cbiAgICAgIGlmIChtYXRobWwuaW5kZXhPZignc2VtYW50aWNzJykgPT09IC0xICYmIG1hdGhtbC5pbmRleE9mKCdhbm5vdGF0aW9uJykgPT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBVdGlsLmh0bWxFbnRpdGllcyhsYXRleCk7XG4gICAgICAgIG1hdGhtbCA9IE1hdGhNTC5hZGRBbm5vdGF0aW9uKG1hdGhtbCwgY29udGVudCwgJ0xhVGVYJyk7XG4gICAgICAgIG91dHB1dCA9IG1hdGhtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IG1hdGhtbDtcbiAgICAgIH1cbiAgICAgIGlmICghbGF0ZXhDYWNoZS5nZXQobGF0ZXgpKSB7XG4gICAgICAgIGxhdGV4Q2FjaGUucG9wdWxhdGUobGF0ZXgsIG1hdGhtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCA9IGAkJCR7bGF0ZXh9JCRgO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFsbCBvY2N1cnJlbmNlcyBvZiBNYXRoTUwgY29kZSB0byBMYVRlWC5cbiAgICogVGhlIE1hdGhNTCBjb2RlIHNob3VsZCBjb250YWluaW5nIDxhbm5vdGF0aW9uIGVuY29kaW5nPVwiTGFUZVhcIi8+IHRvIGJlIGNvbnZlcnRlZC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnQgLSBBIHN0cmluZyBjb250YWluaW5nIE1hdGhNTCB2YWxpZCBjb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdH0gY2hhcmFjdGVycyAtIEFuIG9iamVjdCBjb250YWluaW5nIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAgICogQHJldHVybiB7U3RyaW5nfSBBIHN0cmluZyBjb250YWluaW5nIGFsbCBNYXRoTUwgYW5ub3RhdGVkIG9jY3VycmVuY2VzXG4gICAqIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIExhVGVYIGNvZGUuXG4gICAqL1xuICBzdGF0aWMgcGFyc2VNYXRobWxUb0xhdGV4KGNvbnRlbnQsIGNoYXJhY3RlcnMpIHtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgY29uc3QgbWF0aFRhZ0JlZ2luID0gYCR7Y2hhcmFjdGVycy50YWdPcGVuZXJ9bWF0aGA7XG4gICAgY29uc3QgbWF0aFRhZ0VuZCA9IGAke2NoYXJhY3RlcnMudGFnT3BlbmVyfS9tYXRoJHtjaGFyYWN0ZXJzLnRhZ0Nsb3Nlcn1gO1xuICAgIGNvbnN0IG9wZW5UYXJnZXQgPSBgJHtjaGFyYWN0ZXJzLnRhZ09wZW5lcn1hbm5vdGF0aW9uIGVuY29kaW5nPSR7Y2hhcmFjdGVycy5kb3VibGVRdW90ZX1MYVRlWCR7Y2hhcmFjdGVycy5kb3VibGVRdW90ZX0ke2NoYXJhY3RlcnMudGFnQ2xvc2VyfWA7XG4gICAgY29uc3QgY2xvc2VUYXJnZXQgPSBgJHtjaGFyYWN0ZXJzLnRhZ09wZW5lcn0vYW5ub3RhdGlvbiR7Y2hhcmFjdGVycy50YWdDbG9zZXJ9YDtcbiAgICBsZXQgc3RhcnQgPSBjb250ZW50LmluZGV4T2YobWF0aFRhZ0JlZ2luKTtcbiAgICBsZXQgZW5kID0gMDtcbiAgICBsZXQgbWF0aG1sO1xuICAgIGxldCBzdGFydEFubm90YXRpb247XG4gICAgbGV0IGNsb3NlQW5ub3RhdGlvbjtcblxuICAgIHdoaWxlIChzdGFydCAhPT0gLTEpIHtcbiAgICAgIG91dHB1dCArPSBjb250ZW50LnN1YnN0cmluZyhlbmQsIHN0YXJ0KTtcbiAgICAgIGVuZCA9IGNvbnRlbnQuaW5kZXhPZihtYXRoVGFnRW5kLCBzdGFydCk7XG5cbiAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgIGVuZCA9IGNvbnRlbnQubGVuZ3RoIC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCArPSBtYXRoVGFnRW5kLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgbWF0aG1sID0gY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG5cbiAgICAgIHN0YXJ0QW5ub3RhdGlvbiA9IG1hdGhtbC5pbmRleE9mKG9wZW5UYXJnZXQpO1xuICAgICAgaWYgKHN0YXJ0QW5ub3RhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgc3RhcnRBbm5vdGF0aW9uICs9IG9wZW5UYXJnZXQubGVuZ3RoO1xuICAgICAgICBjbG9zZUFubm90YXRpb24gPSBtYXRobWwuaW5kZXhPZihjbG9zZVRhcmdldCk7XG4gICAgICAgIGxldCBsYXRleCA9IG1hdGhtbC5zdWJzdHJpbmcoc3RhcnRBbm5vdGF0aW9uLCBjbG9zZUFubm90YXRpb24pO1xuICAgICAgICBpZiAoY2hhcmFjdGVycyA9PT0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgbGF0ZXggPSBNYXRoTUwuc2FmZVhtbERlY29kZShsYXRleCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9IGAkJCR7bGF0ZXh9JCRgO1xuICAgICAgICAvLyBQb3B1bGF0ZSBsYXRleCBpbnRvIGNhY2hlLlxuXG4gICAgICAgIExhdGV4LmNhY2hlLnBvcHVsYXRlKGxhdGV4LCBtYXRobWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ICs9IG1hdGhtbDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gY29udGVudC5pbmRleE9mKG1hdGhUYWdCZWdpbiwgZW5kKTtcbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gY29udGVudC5zdWJzdHJpbmcoZW5kLCBjb250ZW50Lmxlbmd0aCk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgbGF0ZXggb2YgYSBkZXRlcm1pbmVkIHBvc2l0aW9uIGluIGEgdGV4dC5cbiAgICogQHBhcmFtIHtOb2RlfSB0ZXh0Tm9kZSAtIHRleHROb2RlIHRvIGV4dHJhY3QgdGhlIExhVGVYXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjYXJldFBvc2l0aW9uIC0gU3RhcnRpbmcgcG9zaXRpb24gdG8gZmluZCBMYVRlWC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGxhdGV4VGFncyAtIE9wdGlvbmFsIHBhcmFtZXRlciByZXByZXNlbnRpbmcgdGFncyBiZXR3ZWVuIGxhdGV4IGlzIGluc2VydGVkLlxuICAgKiBJdCBoYXMgdGhlICdvcGVuJyBhdHRyaWJ1dGUgZm9yIHRoZSBvcGVuIHRhZyBhbmQgdGhlICdjbG9zZScgYXR0cmlidXRlIGZvciB0aGUgY2xvc2UgdGFnLlxuICAgKiBcIiQkXCIgYnkgZGVmYXVsdC5cbiAgICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCAzIGtleXM6ICdsYXRleCcsICdzdGFydCcgYW5kICdlbmQnLiBOdWxsIGlmIGxhdGV4IGlzIG5vdCBmb3VuZC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldExhdGV4RnJvbVRleHROb2RlKHRleHROb2RlLCBjYXJldFBvc2l0aW9uLCBsYXRleFRhZ3MpIHtcbiAgICAvLyBUT0RPOiBTZXQgTGFUZVggVGFncyBhcyBDb3JlIHZhcmlhYmxlLiBGaXggdGhlIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiAodGhpcmQgYXJndW1lbnQpLlxuICAgIC8vIFRhZ3MgdXNlZCBmb3IgTGFUZVggZm9ybXVsYXMuXG4gICAgY29uc3QgZGVmYXVsdExhdGV4VGFncyA9IHtcbiAgICAgIG9wZW46ICckJCcsXG4gICAgICBjbG9zZTogJyQkJyxcbiAgICB9O1xuICAgIC8vIGxhdGV4VGFncyBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuIElmIGlzIG5vdCBzZXQsIHVzZSBkZWZhdWx0IGxhdGV4VGFncy5cbiAgICBpZiAodHlwZW9mIGxhdGV4VGFncyA9PT0gJ3VuZGVmaW5lZCcgfHwgbGF0ZXhUYWdzID09IG51bGwpIHtcbiAgICAgIGxhdGV4VGFncyA9IGRlZmF1bHRMYXRleFRhZ3M7XG4gICAgfVxuICAgIC8vIExvb2tpbmcgZm9yIHRoZSBmaXJzdCB0ZXh0Tm9kZS5cbiAgICBsZXQgc3RhcnROb2RlID0gdGV4dE5vZGU7XG5cbiAgICB3aGlsZSAoc3RhcnROb2RlLnByZXZpb3VzU2libGluZyAmJiBzdGFydE5vZGUucHJldmlvdXNTaWJsaW5nLm5vZGVUeXBlID09PSAzKSB7IC8vIFRFWFRfTk9ERS5cbiAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmV4dCBsYXRleCBwb3NpdGlvbiBhbmQgbm9kZSBmcm9tIGEgc3BlY2lmaWMgbm9kZSBhbmQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtOb2RlfSBjdXJyZW50Tm9kZSAtIE5vZGUgd2hlcmUgc2VhcmNoaW5nIGxhdGV4LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjdXJyZW50UG9zaXRpb24gLSBDdXJyZW50IHBvc2l0aW9uIGluc2lkZSB0aGUgY3VycmVudE5vZGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxhdGV4VGFnc1RvVXNlIC0gVGFncyB1c2VkIGF0IGxhdGV4IGJlZ2lubmluZyBhbmQgbGF0ZXggZmluYWwuXG4gICAgICogXCIkJFwiIGJ5IGRlZmF1bHQuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0YWcgLSBUYWcgY29udGFpbmluZyB0aGUgY3VycmVudCBzZWFyY2guXG4gICAgICogQHJldHVybnMge09iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdGhlIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5leHRMYXRleFBvc2l0aW9uKGN1cnJlbnROb2RlLCBjdXJyZW50UG9zaXRpb24sIHRhZykge1xuICAgICAgbGV0IHBvc2l0aW9uID0gY3VycmVudE5vZGUubm9kZVZhbHVlLmluZGV4T2YodGFnLCBjdXJyZW50UG9zaXRpb24pO1xuXG4gICAgICB3aGlsZSAocG9zaXRpb24gPT09IC0xKSB7XG4gICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50Tm9kZSkgeyAvLyBURVhUX05PREUuXG4gICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vdCBmb3VuZC5cbiAgICAgICAgfVxuXG4gICAgICAgIHBvc2l0aW9uID0gY3VycmVudE5vZGUubm9kZVZhbHVlID8gY3VycmVudE5vZGUubm9kZVZhbHVlLmluZGV4T2YobGF0ZXhUYWdzLmNsb3NlKSA6IC0xO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlOiBjdXJyZW50Tm9kZSxcbiAgICAgICAgcG9zaXRpb24sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBub2RlIGlzIHByZXZpb3VzLCBvciBub3QsIHRvIGEgc2Vjb25kIG9uZS5cbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBTdGFydCBub2RlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFN0YXJ0IG5vZGUgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbmROb2RlIC0gRW5kIG5vZGUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZFBvc2l0aW9uIC0gRW5kIG5vZGUgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0YXJ0aW5nIG5vZGUgaXMgcHJldmlvdXMgdGhhbnQgdGhlIGVuIG5vZGUuIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1ByZXZpb3VzKG5vZGUsIHBvc2l0aW9uLCBlbmROb2RlLCBlbmRQb3NpdGlvbikge1xuICAgICAgaWYgKG5vZGUgPT09IGVuZE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIChwb3NpdGlvbiA8PSBlbmRQb3NpdGlvbik7XG4gICAgICB9XG4gICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBlbmROb2RlKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKG5vZGUgPT09IGVuZE5vZGUpO1xuICAgIH1cblxuICAgIGxldCBzdGFydDtcbiAgICBsZXQgZW5kID0ge1xuICAgICAgbm9kZTogc3RhcnROb2RlLFxuICAgICAgcG9zaXRpb246IDAsXG4gICAgfTtcbiAgICAvLyBJcyBzdXBwb3NlZCB0aGF0IG9wZW4gYW5kIGNsb3NlIHRhZ3MgaGFzIHRoZSBzYW1lIGxlbmd0aC5cbiAgICBjb25zdCB0YWdMZW5ndGggPSBsYXRleFRhZ3Mub3Blbi5sZW5ndGg7XG4gICAgZG8ge1xuICAgICAgc3RhcnQgPSBnZXROZXh0TGF0ZXhQb3NpdGlvbihlbmQubm9kZSwgZW5kLnBvc2l0aW9uLCBsYXRleFRhZ3Mub3Blbik7XG5cbiAgICAgIGlmIChzdGFydCA9PSBudWxsIHx8IGlzUHJldmlvdXModGV4dE5vZGUsIGNhcmV0UG9zaXRpb24sIHN0YXJ0Lm5vZGUsIHN0YXJ0LnBvc2l0aW9uKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZW5kID0gZ2V0TmV4dExhdGV4UG9zaXRpb24oc3RhcnQubm9kZSwgc3RhcnQucG9zaXRpb24gKyB0YWdMZW5ndGgsIGxhdGV4VGFncy5jbG9zZSk7XG5cbiAgICAgIGlmIChlbmQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZW5kLnBvc2l0aW9uICs9IHRhZ0xlbmd0aDtcbiAgICB9IHdoaWxlIChpc1ByZXZpb3VzKGVuZC5ub2RlLCBlbmQucG9zaXRpb24sIHRleHROb2RlLCBjYXJldFBvc2l0aW9uKSk7XG5cbiAgICAvLyBJc29sYXRpbmcgbGF0ZXguXG4gICAgbGV0IGxhdGV4O1xuXG4gICAgaWYgKHN0YXJ0Lm5vZGUgPT09IGVuZC5ub2RlKSB7XG4gICAgICBsYXRleCA9IHN0YXJ0Lm5vZGUubm9kZVZhbHVlLnN1YnN0cmluZyhzdGFydC5wb3NpdGlvbiArIHRhZ0xlbmd0aCwgZW5kLnBvc2l0aW9uIC0gdGFnTGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSBzdGFydC5wb3NpdGlvbiArIHRhZ0xlbmd0aDtcbiAgICAgIGxhdGV4ID0gc3RhcnQubm9kZS5ub2RlVmFsdWUuc3Vic3RyaW5nKGluZGV4LCBzdGFydC5ub2RlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuICAgICAgbGV0IGN1cnJlbnROb2RlID0gc3RhcnQubm9kZTtcblxuICAgICAgZG8ge1xuICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICBpZiAoY3VycmVudE5vZGUgPT09IGVuZC5ub2RlKSB7XG4gICAgICAgICAgbGF0ZXggKz0gZW5kLm5vZGUubm9kZVZhbHVlLnN1YnN0cmluZygwLCBlbmQucG9zaXRpb24gLSB0YWdMZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhdGV4ICs9IGN1cnJlbnROb2RlLm5vZGVWYWx1ZSA/IGN1cnJlbnROb2RlLm5vZGVWYWx1ZSA6ICcnO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlIChjdXJyZW50Tm9kZSAhPT0gZW5kLm5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsYXRleCxcbiAgICAgIHN0YXJ0Tm9kZTogc3RhcnQubm9kZSxcbiAgICAgIHN0YXJ0UG9zaXRpb246IHN0YXJ0LnBvc2l0aW9uLFxuICAgICAgZW5kTm9kZTogZW5kLm5vZGUsXG4gICAgICBlbmRQb3NpdGlvbjogZW5kLnBvc2l0aW9uLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXh0IGNhY2hlLiBTdG9yZXMgYWxsIHByb2Nlc3NlZCBMYVRlWCBzdHJpbmdzIGFuZCBpdCdzIGNvcnJlc3BvbmRlbnQgTWF0aE1MIHN0cmluZy5cbiAqIEB0eXBlIHtDYWNoZX1cbiAqIEBzdGF0aWNcbiAqL1xuTGF0ZXguX2NhY2hlID0gbmV3IFRleHRDYWNoZSgpO1xuIiwiLyoqXG4gKiBUaGlzIG9iamVjdCByZXByZXNlbnRzIGEgY3VzdG9tIGxpc3RlbmVyLlxuICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBMaXN0ZW5lci5ldmVudE5hbWUgLSBUaGUgbGlzdGVuZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IExpc3RlbmVyLmNhbGxiYWNrIC0gVGhlIGxpc3RlbmVyIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpc3RlbmVycyB7XG4gIC8qKlxuICAgKiBAY2xhc3NkZXNjXG4gICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGN1c3RvbSBsaXN0ZW5lcnMgbWFuYWdlci5cbiAgICogQGNvbnN0cnVjdHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIEFycmF5IGNvbnRhaW5pbmcgYWxsIGN1c3RvbSBsaXN0ZW5lcnMuXG4gICAgICogQHR5cGUge09iamVjdFtdfVxuICAgICAqL1xuICAgIHRoaXMubGlzdGVuZXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbGlzdGVuZXIgdG8gTGlzdGVuZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsaXN0ZW5lciAtIEEgbGlzdGVuZXIgb2JqZWN0LlxuICAgKi9cbiAgYWRkKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgTWF0aFR5cGUgZXZlbnQgbGlzdGVuZXJzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgLSBldmVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gZXZlbnQgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBmYWxzZSBpZiBldmVudCBoYXMgYmVlbiBwcmV2ZW50ZWQuIHRydWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgZmlyZShldmVudE5hbWUsIGV2ZW50KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpc3RlbmVycy5sZW5ndGggJiYgIWV2ZW50LmNhbmNlbGxlZDsgaSArPSAxKSB7XG4gICAgICBpZiAodGhpcy5saXN0ZW5lcnNbaV0uZXZlbnROYW1lID09PSBldmVudE5hbWUpIHtcbiAgICAgICAgLy8gQ2FsbGluZyBsaXN0ZW5lci5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnNbaV0uY2FsbGJhY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnQuZGVmYXVsdFByZXZlbnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGxpc3RlbmVyIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIEV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgbGlzdGVuZXIgb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIG5ld0xpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IHt9O1xuICAgIGxpc3RlbmVyLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICBsaXN0ZW5lci5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgfVxufVxuIiwiaW1wb3J0IENvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgVXRpbCBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNsYXNzIHRvIG1hbmFnZSBNYXRoTUwgb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0aE1MIHtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgbWF0aG1sIGF0IHBvc2l0aW9uIGkgaXMgaW5zaWRlIGFuIEhUTUwgYXR0cmlidXRlIG9yIG5vdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBhIHN0cmluZyBjb250YWluaW5nIE1hdGhNTCBjb2RlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaSAtICBzZWFyY2ggaW5kZXguXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgaXMgaW5zaWRlIGFuIEhUTUwgYXR0cmlidXRlLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBzdGF0aWMgaXNNYXRobWxJbkF0dHJpYnV0ZShjb250ZW50LCBpKSB7XG4gICAgLy8gUmVnZXggPVxuICAgIC8vICdeW1xcJ1wiXVtcXFxcc10qPVtcXFxcc10qW1xcXFx3LV0rKFtcXFxcc10qKFwiW15cIl0qXCJ8XFwnW15cXCddKlxcJylbXFxcXHNdKlxuICAgIC8vID1bXFxcXHNdKltcXFxcdy1dK1tcXFxcc10qKSpbXFxcXHNdK2dtaTwnO1xuICAgIGNvbnN0IG1hdGhBdHQgPSAnW1xcJ1wiXVtcXFxcc10qPVtcXFxcc10qW1xcXFx3LV0rJzsgLy8gXCI9YXR0IE9SICc9YXR0XG4gICAgY29uc3QgYXR0Q29udGVudCA9ICdcIlteXCJdKlwifFxcJ1teXFwnXSpcXCcnOyAvLyBcImJsYWJsYVwiIE9SICdibGFibGEnXG4gICAgY29uc3QgYXR0ID0gYFtcXFxcc10qKCR7YXR0Q29udGVudH0pW1xcXFxzXSo9W1xcXFxzXSpbXFxcXHctXStbXFxcXHNdKmA7IC8vIFwiYmxhYmxhXCI9YXR0IE9SICdibGFibGEnPWF0dFxuICAgIGNvbnN0IGF0dHMgPSBgKCcke2F0dH0nKSpgOyAvLyBcImJsYWJsYVwiPWF0dDEgXCJibGFibGFcIj1hdHQyXG4gICAgY29uc3QgcmVnZXggPSBgXiR7bWF0aEF0dH0ke2F0dHN9W1xcXFxzXStnbWk8YDsgLy8gXCI9YXR0IFwiYmxhYmxhXCI9YXR0MSBcImJsYWJsYVwiPWF0dDIgZ21pPCAuXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IG5ldyBSZWdFeHAocmVnZXgpO1xuXG4gICAgY29uc3QgYWN0dWFsQ29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIGkpO1xuICAgIGNvbnN0IHJldmVyc2VkID0gYWN0dWFsQ29udGVudC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xuICAgIGNvbnN0IGV4aXN0cyA9IGV4cHJlc3Npb24udGVzdChyZXZlcnNlZCk7XG5cbiAgICByZXR1cm4gZXhpc3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYW4gZW5jb2RlZCBNYXRoTUwgd2l0aCBzdGFuZGFyZCBYTUwgdGFncy5cbiAgICogV2UgdXNlIHRoZXNlIGVudGl0aWVzIGJlY2F1c2UgSUUgZG9lc24ndCBzdXBwb3J0IGh0bWwgZW50aXRpZXNcbiAgICogb24gaXRzIGF0dHJpYnV0ZXMgc29tZXRpbWVzLiBZZXMsIHNvbWV0aW1lcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gc3RyaW5nIHRvIGJlIGRlY29kZWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gZGVjb2RlZCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgc2FmZVhtbERlY29kZShpbnB1dCkge1xuICAgIGxldCB7IHRhZ09wZW5lciB9ID0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzRW50aXRpZXM7XG4gICAgbGV0IHsgdGFnQ2xvc2VyIH0gPSBDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnNFbnRpdGllcztcbiAgICBsZXQgeyBkb3VibGVRdW90ZSB9ID0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzRW50aXRpZXM7XG4gICAgbGV0IHsgcmVhbERvdWJsZVF1b3RlIH0gPSBDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnNFbnRpdGllcztcbiAgICAvLyBEZWNvZGluZyBlbnRpdGllcy5cbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KHRhZ09wZW5lcikuam9pbihDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMudGFnT3BlbmVyKTtcbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KHRhZ0Nsb3Nlcikuam9pbihDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMudGFnQ2xvc2VyKTtcbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KGRvdWJsZVF1b3RlKS5qb2luKENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycy5kb3VibGVRdW90ZSk7XG4gICAgLy8gQWRkZWQgdG8gZml4IHByb2JsZW0gZHVlIHRvIGltcG9ydCBmcm9tIDEuOS54LlxuICAgIGlucHV0ID0gaW5wdXQuc3BsaXQocmVhbERvdWJsZVF1b3RlKS5qb2luKENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycy5yZWFsRG91YmxlUXVvdGUpO1xuXG4gICAgLy8gQmxhY2tib2FyZC5cbiAgICBjb25zdCB7IGx0RWxlbWVudCB9ID0gQ29uc3RhbnRzLnNhZmVCYWRCbGFja2JvYXJkQ2hhcmFjdGVycztcbiAgICBjb25zdCB7IGd0RWxlbWVudCB9ID0gQ29uc3RhbnRzLnNhZmVCYWRCbGFja2JvYXJkQ2hhcmFjdGVycztcbiAgICBjb25zdCB7IGFtcEVsZW1lbnQgfSA9IENvbnN0YW50cy5zYWZlQmFkQmxhY2tib2FyZENoYXJhY3RlcnM7XG4gICAgaWYgKCdfd3JzX2JsYWNrYm9hcmQnIGluIHdpbmRvdyAmJiB3aW5kb3cuX3dyc19ibGFja2JvYXJkKSB7XG4gICAgICBpbnB1dCA9IGlucHV0LnNwbGl0KGx0RWxlbWVudCkuam9pbihDb25zdGFudHMuc2FmZUdvb2RCbGFja2JvYXJkQ2hhcmFjdGVycy5sdEVsZW1lbnQpO1xuICAgICAgaW5wdXQgPSBpbnB1dC5zcGxpdChndEVsZW1lbnQpLmpvaW4oQ29uc3RhbnRzLnNhZmVHb29kQmxhY2tib2FyZENoYXJhY3RlcnMuZ3RFbGVtZW50KTtcbiAgICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoYW1wRWxlbWVudCkuam9pbihDb25zdGFudHMuc2FmZUdvb2RCbGFja2JvYXJkQ2hhcmFjdGVycy5hbXBFbGVtZW50KTtcbiAgICB9XG5cbiAgICAoeyB0YWdPcGVuZXIgfSA9IENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycyk7XG4gICAgKHsgdGFnQ2xvc2VyIH0gPSBDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMpO1xuICAgICh7IGRvdWJsZVF1b3RlIH0gPSBDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMpO1xuICAgICh7IHJlYWxEb3VibGVRdW90ZSB9ID0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzKTtcbiAgICBjb25zdCB7IGFtcGVyc2FuZCB9ID0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzO1xuICAgIGNvbnN0IHsgcXVvdGUgfSA9IENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycztcblxuICAgIC8vIERlY29kaW5nIGNoYXJhY3RlcnMuXG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdCh0YWdPcGVuZXIpLmpvaW4oQ29uc3RhbnRzLnhtbENoYXJhY3RlcnMudGFnT3BlbmVyKTtcbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KHRhZ0Nsb3Nlcikuam9pbihDb25zdGFudHMueG1sQ2hhcmFjdGVycy50YWdDbG9zZXIpO1xuICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoZG91YmxlUXVvdGUpLmpvaW4oQ29uc3RhbnRzLnhtbENoYXJhY3RlcnMuZG91YmxlUXVvdGUpO1xuICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoYW1wZXJzYW5kKS5qb2luKENvbnN0YW50cy54bWxDaGFyYWN0ZXJzLmFtcGVyc2FuZCk7XG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdChxdW90ZSkuam9pbihDb25zdGFudHMueG1sQ2hhcmFjdGVycy5xdW90ZSk7XG5cbiAgICAvLyBXZSBhcmUgcmVwbGFjaW5nICQgYnkgJiB3aGVuIGl0cyBwYXJ0IG9mIGFuIGVudGl0eSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eS5cbiAgICAvLyBOb3csIHRoZSBzdGFuZGFyZCBpcyByZXBsYWNlIMKnIGJ5ICYuXG4gICAgbGV0IHJldHVyblZhbHVlID0gJyc7XG4gICAgbGV0IGN1cnJlbnRFbnRpdHkgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgY2hhcmFjdGVyID0gaW5wdXQuY2hhckF0KGkpO1xuICAgICAgaWYgKGN1cnJlbnRFbnRpdHkgPT0gbnVsbCkge1xuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSAnJCcpIHtcbiAgICAgICAgICBjdXJyZW50RW50aXR5ID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuVmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gJzsnKSB7XG4gICAgICAgIHJldHVyblZhbHVlICs9IGAmJHtjdXJyZW50RW50aXR5fWA7XG4gICAgICAgIGN1cnJlbnRFbnRpdHkgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIubWF0Y2goLyhbYS16QS1aMC05Iy5fLV0gfCAnLScpLykpIHsgLy8gQ2hhcmFjdGVyIGlzIHBhcnQgb2YgYW4gZW50aXR5LlxuICAgICAgICBjdXJyZW50RW50aXR5ICs9IGNoYXJhY3RlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVyblZhbHVlICs9IGAkJHtjdXJyZW50RW50aXR5fWA7IC8vIElzIG5vdCBhbiBlbnRpdHkuXG4gICAgICAgIGN1cnJlbnRFbnRpdHkgPSBudWxsO1xuICAgICAgICBpIC09IDE7IC8vIFBhcnNlIGFnYWluIHRoZSBjdXJyZW50IGNoYXJhY3Rlci5cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlcyBhIE1hdGhNTCB3aXRoIHN0YW5kYXJkIFhNTCB0YWdzIHRvIGEgTU1hdGhNTCBlbmNvZGVkIHdpdGggc2FmZSBYTUwgdGFncy5cbiAgICogV2UgdXNlIHRoZXNlIGVudGl0aWVzIGJlY2F1c2UgSUUgZG9lc24ndCBzdXBwb3J0IGh0bWwgZW50aXRpZXMgb24gaXRzIGF0dHJpYnV0ZXMgc29tZXRpbWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgLSBpbnB1dCBzdHJpbmcgdG8gYmUgZW5jb2RlZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBlbmNvZGVkIHN0cmluZy5cbiAgICovXG4gIHN0YXRpYyBzYWZlWG1sRW5jb2RlKGlucHV0KSB7XG4gICAgY29uc3QgeyB0YWdPcGVuZXIgfSA9IENvbnN0YW50cy54bWxDaGFyYWN0ZXJzO1xuICAgIGNvbnN0IHsgdGFnQ2xvc2VyIH0gPSBDb25zdGFudHMueG1sQ2hhcmFjdGVycztcbiAgICBjb25zdCB7IGRvdWJsZVF1b3RlIH0gPSBDb25zdGFudHMueG1sQ2hhcmFjdGVycztcbiAgICBjb25zdCB7IGFtcGVyc2FuZCB9ID0gQ29uc3RhbnRzLnhtbENoYXJhY3RlcnM7XG4gICAgY29uc3QgeyBxdW90ZSB9ID0gQ29uc3RhbnRzLnhtbENoYXJhY3RlcnM7XG5cbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KHRhZ09wZW5lcikuam9pbihDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMudGFnT3BlbmVyKTtcbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KHRhZ0Nsb3Nlcikuam9pbihDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMudGFnQ2xvc2VyKTtcbiAgICBpbnB1dCA9IGlucHV0LnNwbGl0KGRvdWJsZVF1b3RlKS5qb2luKENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycy5kb3VibGVRdW90ZSk7XG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdChhbXBlcnNhbmQpLmpvaW4oQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzLmFtcGVyc2FuZCk7XG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdChxdW90ZSkuam9pbihDb25zdGFudHMuc2FmZVhtbENoYXJhY3RlcnMucXVvdGUpO1xuXG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHNwZWNpYWwgc3ltYm9scyAoPiAxMjgpIHRvIGVudGl0aWVzIGFuZCByZXBsYWNlcyBhbGwgdGV4dHVhbFxuICAgKiBlbnRpdGllcyBieSBpdHMgbnVtYmVyIGVudGl0aWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0aG1sIC0gTWF0aE1MIHN0cmluZyBjb250YWluaW5nIC0gb3Igbm90IC0gc3BlY2lhbCBzeW1ib2xzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE1hdGhNTCB3aXRoIGFsbCB0ZXh0dWFsIGVudGl0aWVzIHJlcGxhY2VkLlxuICAgKi9cbiAgc3RhdGljIG1hdGhNTEVudGl0aWVzKG1hdGhtbCkge1xuICAgIGxldCB0b1JldHVybiA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRobWwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXJhY3RlciA9IG1hdGhtbC5jaGFyQXQoaSk7XG5cbiAgICAgIC8vIFBhcnNpbmcgPiAxMjggY2hhcmFjdGVycy5cbiAgICAgIGlmIChtYXRobWwuY29kZVBvaW50QXQoaSkgPiAxMjgpIHtcbiAgICAgICAgdG9SZXR1cm4gKz0gYCYjJHttYXRobWwuY29kZVBvaW50QXQoaSl9O2A7XG4gICAgICAgIC8vIEZvciBVVEYtMzIgY2hhcmFjdGVycyB3ZSBuZWVkIHRvIG1vdmUgdGhlIGluZGV4IG9uZSBwb3NpdGlvbi5cbiAgICAgICAgaWYgKG1hdGhtbC5jb2RlUG9pbnRBdChpKSA+IDB4ZmZmZikge1xuICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcmJykge1xuICAgICAgICBjb25zdCBlbmQgPSBtYXRobWwuaW5kZXhPZignOycsIGkgKyAxKTtcbiAgICAgICAgaWYgKGVuZCA+PSAwKSB7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBtYXRobWwuc3Vic3RyaW5nKGksIGVuZCArIDEpO1xuICAgICAgICAgIHRvUmV0dXJuICs9IGAmIyR7VXRpbC5maXhlZENoYXJDb2RlQXQoKGNvbnRhaW5lci50ZXh0Q29udGVudCB8fCBjb250YWluZXIuaW5uZXJUZXh0KSwgMCl9O2A7XG4gICAgICAgICAgaSA9IGVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b1JldHVybiArPSBjaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvUmV0dXJuICs9IGNoYXJhY3RlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY3VzdG9tIGVkaXRvciBuYW1lIHdpdGggdGhlIHByZWZpeCB3cnNfIHRvIGEgTWF0aE1MIGNsYXNzIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGhtbCAtIGEgTWF0aE1MIHN0cmluZyBjcmVhdGVkIHdpdGggYSBjdXN0b20gZWRpdG9yLCBsaWtlIGNoZW1pc3RyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbUVkaXRvciAtIGN1c3RvbSBlZGl0b3IgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gTWF0aE1MIHN0cmluZyB3aXRoIGhpcyBjbGFzcyBjb250YWluaW5nIHRoZSBlZGl0b3IgdG9vbGJhciBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgYWRkQ3VzdG9tRWRpdG9yQ2xhc3NBdHRyaWJ1dGUobWF0aG1sLCBjdXN0b21FZGl0b3IpIHtcbiAgICBsZXQgdG9SZXR1cm4gPSAnJztcblxuICAgIGNvbnN0IHN0YXJ0ID0gbWF0aG1sLmluZGV4T2YoJzxtYXRoJyk7XG4gICAgaWYgKHN0YXJ0ID09PSAwKSB7XG4gICAgICBjb25zdCBlbmQgPSBtYXRobWwuaW5kZXhPZignPicpO1xuICAgICAgaWYgKG1hdGhtbC5pbmRleE9mKCdjbGFzcycpID09PSAtMSkge1xuICAgICAgICAvLyBBZGRpbmcgY3VzdG9tIGVkaXRvciB0eXBlLlxuICAgICAgICB0b1JldHVybiA9IGAke21hdGhtbC5zdWJzdHIoc3RhcnQsIGVuZCl9IGNsYXNzPVwid3JzXyR7Y3VzdG9tRWRpdG9yfVwiPmA7XG4gICAgICAgIHRvUmV0dXJuICs9IG1hdGhtbC5zdWJzdHIoZW5kICsgMSwgbWF0aG1sLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGhtbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjdXN0b20gZWRpdG9yIG5hbWUgZnJvbSB0aGUgTWF0aE1MIGNsYXNzIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGhtbCAtIGEgTWF0aE1MIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbUVkaXRvciAtIGN1c3RvbSBlZGl0b3IgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGlucHV0IE1hdGhNTCB3aXRob3V0IGN1c3RvbUVkaXRvciBuYW1lIGluIGhpcyBjbGFzcy5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVDdXN0b21FZGl0b3JDbGFzc0F0dHJpYnV0ZShtYXRobWwsIGN1c3RvbUVkaXRvcikge1xuICAgIC8vIERpc2NhcmQgTWF0aE1MIHdpdGhvdXQgdGhlIHNwZWNpZmllZCBjbGFzcy5cbiAgICBpZiAobWF0aG1sLmluZGV4T2YoJ2NsYXNzJykgPT09IC0xIHx8IG1hdGhtbC5pbmRleE9mKGB3cnNfJHtjdXN0b21FZGl0b3J9YCkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbWF0aG1sO1xuICAgIH1cblxuICAgIC8vIFRyaXZpYWwgY2FzZTogY2xhc3MgYXR0cmlidXRlIHZhbHVlIGVxdWFsIHRvIGVkaXRvciBuYW1lLiBUaGVuXG4gICAgLy8gY2xhc3MgYXR0cmlidXRlIGlzIHJlbW92ZWQuXG4gICAgLy8gRmlyc3QgdHJ5IHRvIHJlbW92ZSBpdCB3aXRoIGEgc3BhY2UgYmVmb3JlIGlmIHRoZXJlIGlzIG9uZVxuICAgIC8vIE90aGVyd2lzZSB3aXRob3V0IHRoZSBzcGFjZVxuICAgIGlmIChtYXRobWwuaW5kZXhPZihgIGNsYXNzPVwid3JzXyR7Y3VzdG9tRWRpdG9yfVwiYCkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gbWF0aG1sLnJlcGxhY2UoYCBjbGFzcz1cIndyc18ke2N1c3RvbUVkaXRvcn1cImAsICcnKTtcbiAgICB9IGVsc2UgaWYgKG1hdGhtbC5pbmRleE9mKGBjbGFzcz1cIndyc18ke2N1c3RvbUVkaXRvcn1cImApICE9PSAtMSkge1xuICAgICAgcmV0dXJuIG1hdGhtbC5yZXBsYWNlKGBjbGFzcz1cIndyc18ke2N1c3RvbUVkaXRvcn1cImAsICcnKTtcbiAgICB9XG5cbiAgICAvLyBOb24gVHJpdmlhbCBjYXNlOiBjbGFzcyBhdHRyaWJ1dGUgY29udGFpbnMgZWRpdG9yIG5hbWUuXG4gICAgcmV0dXJuIG1hdGhtbC5yZXBsYWNlKGB3cnNfJHtjdXN0b21FZGl0b3J9YCwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW5ub3RhdGlvbiB0YWcgaW4gTWF0aE1MIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtYXRobWwgLSB2YWxpZCBNYXRoTUwuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IC0gdmFsdWUgdG8gcHV0IGluc2lkZSBhbm5vdGF0aW9uIHRhZy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGFubm90YXRpb25FbmNvZGluZyAtIGFubm90YXRpb24gZW5jb2RpbmcuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IC0gJ21hdGhtbCcgd2l0aCBhbiBhbm5vdGF0aW9uIHRoYXQgY29udGFpbnNcbiAgICogJ2NvbnRlbnQnIGFuZCBlbmNvZGluZyAnZW5jb2RpbmcnLlxuICAgKi9cbiAgc3RhdGljIGFkZEFubm90YXRpb24obWF0aG1sLCBjb250ZW50LCBhbm5vdGF0aW9uRW5jb2RpbmcpIHtcbiAgICAvLyBJZiBjb250YWlucyBhbm5vdGF0aW9uLCBhbHNvIGNvbnRhaW5zIHNlbWFudGljcyB0YWcuXG4gICAgY29uc3QgY29udGFpbnNBbm5vdGF0aW9uID0gbWF0aG1sLmluZGV4T2YoJzxhbm5vdGF0aW9uJyk7XG5cbiAgICBsZXQgbWF0aG1sV2l0aEFubm90YXRpb24gPSAnJztcbiAgICBpZiAoY29udGFpbnNBbm5vdGF0aW9uICE9PSAtMSkge1xuICAgICAgY29uc3QgY2xvc2VTZW1hbnRpY3NJbmRleCA9IG1hdGhtbC5pbmRleE9mKCc8L3NlbWFudGljcz4nKTtcbiAgICAgIG1hdGhtbFdpdGhBbm5vdGF0aW9uID0gYCR7bWF0aG1sLnN1YnN0cmluZygwLCBjbG9zZVNlbWFudGljc0luZGV4KX08YW5ub3RhdGlvbiBlbmNvZGluZz1cIiR7YW5ub3RhdGlvbkVuY29kaW5nfVwiPiR7Y29udGVudH08L2Fubm90YXRpb24+JHttYXRobWwuc3Vic3RyaW5nKGNsb3NlU2VtYW50aWNzSW5kZXgpfWA7XG4gICAgfSBlbHNlIGlmIChNYXRoTUwuaXNFbXB0eShtYXRobWwpKSB7XG4gICAgICBjb25zdCBlbmRJbmRleElubGluZSA9IG1hdGhtbC5pbmRleE9mKCcvPicpO1xuICAgICAgY29uc3QgZW5kSW5kZXhOb25JbmxpbmUgPSBtYXRobWwuaW5kZXhPZignPicpO1xuICAgICAgY29uc3QgZW5kSW5kZXggPSBlbmRJbmRleE5vbklubGluZSA9PT0gZW5kSW5kZXhJbmxpbmUgPyBlbmRJbmRleElubGluZSA6IGVuZEluZGV4Tm9uSW5saW5lO1xuICAgICAgbWF0aG1sV2l0aEFubm90YXRpb24gPSBgJHttYXRobWwuc3Vic3RyaW5nKDAsIGVuZEluZGV4KX0+PHNlbWFudGljcz48YW5ub3RhdGlvbiBlbmNvZGluZz1cIiR7YW5ub3RhdGlvbkVuY29kaW5nfVwiPiR7Y29udGVudH08L2Fubm90YXRpb24+PC9zZW1hbnRpY3M+PC9tYXRoPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJlZ2luTWF0aE1MQ29udGVudCA9IG1hdGhtbC5pbmRleE9mKCc+JykgKyAxO1xuICAgICAgY29uc3QgZW5kTWF0aG1sQ29udGVudCA9IG1hdGhtbC5sYXN0SW5kZXhPZignPC9tYXRoPicpO1xuICAgICAgY29uc3QgbWF0aG1sQ29udGVudCA9IG1hdGhtbC5zdWJzdHJpbmcoYmVnaW5NYXRoTUxDb250ZW50LCBlbmRNYXRobWxDb250ZW50KTtcbiAgICAgIG1hdGhtbFdpdGhBbm5vdGF0aW9uID0gYCR7bWF0aG1sLnN1YnN0cmluZygwLCBiZWdpbk1hdGhNTENvbnRlbnQpfTxzZW1hbnRpY3M+PG1yb3c+JHttYXRobWxDb250ZW50fTwvbXJvdz48YW5ub3RhdGlvbiBlbmNvZGluZz1cIiR7YW5ub3RhdGlvbkVuY29kaW5nfVwiPiR7Y29udGVudH08L2Fubm90YXRpb24+PC9zZW1hbnRpY3M+PC9tYXRoPmA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxlblxuICAgIH1cblxuICAgIHJldHVybiBtYXRobWxXaXRoQW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHNwZWNpZmljIGFubm90YXRpb24gdGFnIGluIE1hdGhNTCBlbGVtZW50LlxuICAgKiBJbiBjYXNlIG9mIHJlbW92ZSB0aGUgdW5pcXVlIGFubm90YXRpb24sIGFsc28gaXMgcmVtb3ZlZCBzZW1hbnRpY3MgdGFnLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWF0aG1sIC0gdmFsaWQgTWF0aE1MLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYW5ub3RhdGlvbkVuY29kaW5nIC0gYW5ub3RhdGlvbiBlbmNvZGluZyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IC0gJ21hdGhtbCcgd2l0aG91dCB0aGUgYW5ub3RhdGlvbiBlbmNvZGluZyBzcGVjaWZpZWQuXG4gICAqL1xuICBzdGF0aWMgcmVtb3ZlQW5ub3RhdGlvbihtYXRobWwsIGFubm90YXRpb25FbmNvZGluZykge1xuICAgIGxldCBtYXRobWxXaXRob3V0QW5ub3RhdGlvbiA9IG1hdGhtbDtcbiAgICBjb25zdCBvcGVuQW5ub3RhdGlvblRhZyA9IGA8YW5ub3RhdGlvbiBlbmNvZGluZz1cIiR7YW5ub3RhdGlvbkVuY29kaW5nfVwiPmA7XG4gICAgY29uc3QgY2xvc2VBbm5vdGF0aW9uVGFnID0gJzwvYW5ub3RhdGlvbj4nO1xuICAgIGNvbnN0IHN0YXJ0QW5ub3RhdGlvbkluZGV4ID0gbWF0aG1sLmluZGV4T2Yob3BlbkFubm90YXRpb25UYWcpO1xuICAgIGlmIChzdGFydEFubm90YXRpb25JbmRleCAhPT0gLTEpIHtcbiAgICAgIGxldCBkaWZmZXJlbnRBbm5vdGF0aW9uRm91bmQgPSBmYWxzZTtcbiAgICAgIGxldCBkaWZmZXJlbnRBbm5vdGF0aW9uSW5kZXggPSBtYXRobWwuaW5kZXhPZignPGFubm90YXRpb24nKTtcbiAgICAgIHdoaWxlIChkaWZmZXJlbnRBbm5vdGF0aW9uSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGlmIChkaWZmZXJlbnRBbm5vdGF0aW9uSW5kZXggIT09IHN0YXJ0QW5ub3RhdGlvbkluZGV4KSB7XG4gICAgICAgICAgZGlmZmVyZW50QW5ub3RhdGlvbkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBkaWZmZXJlbnRBbm5vdGF0aW9uSW5kZXggPSBtYXRobWwuaW5kZXhPZignPGFubm90YXRpb24nLCBkaWZmZXJlbnRBbm5vdGF0aW9uSW5kZXggKyAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZmZlcmVudEFubm90YXRpb25Gb3VuZCkge1xuICAgICAgICBjb25zdCBjbG9zZUluZGV4ID0gbWF0aG1sLmluZGV4T2YoY2xvc2VBbm5vdGF0aW9uVGFnLCBzdGFydEFubm90YXRpb25JbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZEFubm90YXRpb25JbmRleCA9IGNsb3NlSW5kZXggKyBjbG9zZUFubm90YXRpb25UYWcubGVuZ3RoO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gbWF0aG1sLnN1YnN0cmluZygwLCBzdGFydEFubm90YXRpb25JbmRleCk7XG4gICAgICAgIG1hdGhtbFdpdGhvdXRBbm5vdGF0aW9uID0gc3RhcnRJbmRleCArIG1hdGhtbC5zdWJzdHJpbmcoZW5kQW5ub3RhdGlvbkluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGhtbFdpdGhvdXRBbm5vdGF0aW9uID0gTWF0aE1MLnJlbW92ZVNlbWFudGljcyhtYXRobWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRobWxXaXRob3V0QW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHNlbWFudGljcyB0YWcgdG8gbWF0aG1sLlxuICAgKiBXaGVuIHVzaW5nIEhhbmQgdG8gY3JlYXRlIGZvcm11bGFzLCBpdCBhZGRzIHRoZSBtcm93IHRhZyBkdWUgdG8gdGhlIHNlbWFudGljcyBvbmUsIHRoaXMgb25lIGlzIGFsc28gcmVtb3ZlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGhtbCAtIE1hdGhNTCBzdHJpbmcuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gJ21hdGhtbCcgd2l0aG91dCBzZW1hbnRpY3MgdGFnLlxuICAgKi9cbiAgc3RhdGljIHJlbW92ZVNlbWFudGljcyhtYXRobWwpIHtcbiAgICAvLyBJZiBgbXJvd2AgaXMgZm91bmQgcmlnaHQgYmVmb3JlIHRoZSBgc2VtYW50aWNzYCBzdGFydGluZyB0YWcsIGl0J3MgcmVtb3ZlZCBhcyB3ZWxsIFxuICAgIGNvbnN0IHNlbWFudGljc1N0YXJ0aW5nVGFnUmVnZXggPSAvPHNlbWFudGljcz5cXHMqPyg8bXJvdz4pPy9nbTtcblxuICAgIC8vIElmIGBtcm93YCBpcyBmb3VuZCByaWdodCBhZnRlciB0aGUgYGFubm90YXRpb25gIGVuZGluZyB0YWcsIGl0J3MgcmVtb3ZlZCBhcyB3ZWxsXG4gICAgLy8gYWxvbmdzaWRlIGBzZW1hbnRpY3NgIGNsb3NpbmcgdGFnIGFuZCB0aGUgd2hvbGUgYGFubm90YXRpb25gIHRhZyBhbmQgaXRzIGNvbnRlbnRzLlxuICAgIGNvbnN0IHNlbWFudGljc0VuZGluZ1RhZ1JlZ2V4ID0gLyg8XFwvbXJvdz4pP1xccyo8YW5ub3RhdGlvbltcXFdcXHddKj88XFwvc2VtYW50aWNzPi9nbTtcblxuICAgIHJldHVybiBtYXRobWxcbiAgICAucmVwbGFjZShzZW1hbnRpY3NTdGFydGluZ1RhZ1JlZ2V4LCAnJylcbiAgICAucmVwbGFjZShzZW1hbnRpY3NFbmRpbmdUYWdSZWdleCwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgYWxsIHhtbCBtYXRobWwgb2NjdXJyZW5jZXMgdGhhdCBjb250YWluIHNlbWFudGljcyB0byB0aGUgc2FtZVxuICAgKiB4bWwgbWF0aG1sIG9jY3VycmVuY2VzIHdpdGhvdXQgc2VtYW50aWNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHN0cmluZyB0aGF0IGNhbiBjb250YWluIHhtbCBtYXRobWwgb2NjdXJyZW5jZXMuXG4gICAqIEBwYXJhbSB7Q29uc3RhbnRzfSBbY2hhcmFjdGVyc10gLSBDb25zdGFudCBvYmplY3QgY29udGFpbmluZyB4bWxDaGFyYWN0ZXJzXG4gICAqIG9yIHNhZmVYbWxDaGFyYWN0ZXJzIHJlbGF0aW9uLlxuICAgKiB4bWxDaGFyYWN0ZXJzIGJ5IGRlZmF1bHQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gJ3RleHQnIHdpdGggYWxsIHhtbCBtYXRobWwgb2NjdXJyZW5jZXMgd2l0aG91dCBhbm5vdGF0aW9uIHRhZy5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVTZW1hbnRpY3NPY3VycmVuY2VzKHRleHQsIGNoYXJhY3RlcnMgPSBDb25zdGFudHMueG1sQ2hhcmFjdGVycykge1xuICAgIGNvbnN0IG1hdGhUYWdTdGFydCA9IGAke2NoYXJhY3RlcnMudGFnT3BlbmVyfW1hdGhgO1xuICAgIGNvbnN0IG1hdGhUYWdFbmQgPSBgJHtjaGFyYWN0ZXJzLnRhZ09wZW5lcn0vbWF0aCR7Y2hhcmFjdGVycy50YWdDbG9zZXJ9YDtcbiAgICBjb25zdCBtYXRoVGFnRW5kbGluZSA9IGAvJHtjaGFyYWN0ZXJzLnRhZ0Nsb3Nlcn1gO1xuICAgIGNvbnN0IHsgdGFnQ2xvc2VyIH0gPSBjaGFyYWN0ZXJzO1xuICAgIGNvbnN0IHNlbWFudGljc1RhZ1N0YXJ0ID0gYCR7Y2hhcmFjdGVycy50YWdPcGVuZXJ9c2VtYW50aWNzJHtjaGFyYWN0ZXJzLnRhZ0Nsb3Nlcn1gO1xuICAgIGNvbnN0IGFubm90YXRpb25UYWdTdGFydCA9IGAke2NoYXJhY3RlcnMudGFnT3BlbmVyfWFubm90YXRpb24gZW5jb2Rpbmc9YDtcblxuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgc3RhcnQgPSB0ZXh0LmluZGV4T2YobWF0aFRhZ1N0YXJ0KTtcbiAgICBsZXQgZW5kID0gMDtcbiAgICB3aGlsZSAoc3RhcnQgIT09IC0xKSB7XG4gICAgICBvdXRwdXQgKz0gdGV4dC5zdWJzdHJpbmcoZW5kLCBzdGFydCk7XG5cbiAgICAgIC8vIE1hdGhNTCBjYW4gYmUgd3JpdHRlbiBhcyAnPG1hdGg+PC9tYXRoPicgb3IgJzxtYXRoIC8+Jy5cbiAgICAgIGNvbnN0IG1hdGhUYWdFbmRJbmRleCA9IHRleHQuaW5kZXhPZihtYXRoVGFnRW5kLCBzdGFydCk7XG4gICAgICBjb25zdCBtYXRoVGFnRW5kbGluZUluZGV4ID0gdGV4dC5pbmRleE9mKG1hdGhUYWdFbmRsaW5lLCBzdGFydCk7XG4gICAgICBjb25zdCBmaXJzdFRhZ0Nsb3NlciA9IHRleHQuaW5kZXhPZih0YWdDbG9zZXIsIHN0YXJ0KTtcbiAgICAgIGlmIChtYXRoVGFnRW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVuZCA9IG1hdGhUYWdFbmRJbmRleDtcbiAgICAgIH0gZWxzZSBpZiAobWF0aFRhZ0VuZGxpbmVJbmRleCA9PT0gZmlyc3RUYWdDbG9zZXIgLSAxKSB7XG4gICAgICAgIGVuZCA9IG1hdGhUYWdFbmRsaW5lSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbWFudGljc0luZGV4ID0gdGV4dC5pbmRleE9mKHNlbWFudGljc1RhZ1N0YXJ0LCBzdGFydCk7XG4gICAgICBpZiAoc2VtYW50aWNzSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IG1tbFRhZ1N0YXJ0ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIHNlbWFudGljc0luZGV4KTtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvbkluZGV4ID0gdGV4dC5pbmRleE9mKGFubm90YXRpb25UYWdTdGFydCwgc3RhcnQpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbkluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBzZW1hbnRpY3NJbmRleCArIHNlbWFudGljc1RhZ1N0YXJ0Lmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBtbWxDb250ZW50ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnRJbmRleCwgYW5ub3RhdGlvbkluZGV4KTtcbiAgICAgICAgICBvdXRwdXQgKz0gbW1sVGFnU3RhcnQgKyBtbWxDb250ZW50ICsgbWF0aFRhZ0VuZDtcbiAgICAgICAgICBzdGFydCA9IHRleHQuaW5kZXhPZihtYXRoVGFnU3RhcnQsIHN0YXJ0ICsgbWF0aFRhZ1N0YXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgZW5kICs9IG1hdGhUYWdFbmQubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICAgIHN0YXJ0ID0gdGV4dC5pbmRleE9mKG1hdGhUYWdTdGFydCwgc3RhcnQgKyBtYXRoVGFnU3RhcnQubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gdGV4dC5pbmRleE9mKG1hdGhUYWdTdGFydCwgc3RhcnQgKyBtYXRoVGFnU3RhcnQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gdGV4dC5zdWJzdHJpbmcoZW5kLCB0ZXh0Lmxlbmd0aCk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYSBNYXRoTUwgY29udGFpbnMgYSBjZXJ0YWluIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0aE1MIC0gaW5wdXQgTWF0aE1MLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gY2xhc3NOYW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5wdXQgTWF0aE1MIGNvbnRhaW5zIHRoZSBpbnB1dCBjbGFzcy5cbiAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgY29udGFpbkNsYXNzKG1hdGhNTCwgY2xhc3NOYW1lKSB7XG4gICAgY29uc3QgY2xhc3NJbmRleCA9IG1hdGhNTC5pbmRleE9mKCdjbGFzcycpO1xuICAgIGlmIChjbGFzc0luZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc1RhZ0VuZEluZGV4ID0gbWF0aE1MLmluZGV4T2YoJz4nLCBjbGFzc0luZGV4KTtcbiAgICBjb25zdCBjbGFzc1RhZyA9IG1hdGhNTC5zdWJzdHJpbmcoY2xhc3NJbmRleCwgY2xhc3NUYWdFbmRJbmRleCk7XG4gICAgaWYgKGNsYXNzVGFnLmluZGV4T2YoY2xhc3NOYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIG1hdGhtbCBpcyBlbXB0eS4gT3RoZXJ3aXNlLCBmYWxzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGhtbCAtIHZhbGlkIE1hdGhNTCB3aXRoIHN0YW5kYXJkIFhNTCB0YWdzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIGlmIG1hdGhtbCBpcyBlbXB0eS4gT3RoZXJ3aXNlLCBmYWxzZS5cbiAgICovXG4gIHN0YXRpYyBpc0VtcHR5KG1hdGhtbCkge1xuICAgIC8vIE1hdGhNTCBjYW4gaGF2ZSB0aGUgc2hhcGUgPG1hdGg+PC9tYXRoPiBvciAnPG1hdGggLz4nLlxuICAgIGNvbnN0IGNsb3NlVGFnID0gJz4nO1xuICAgIGNvbnN0IGNsb3NlVGFnSW5saW5lID0gJy8+JztcbiAgICBjb25zdCBmaXJzdENsb3NlVGFnSW5kZXggPSBtYXRobWwuaW5kZXhPZihjbG9zZVRhZyk7XG4gICAgY29uc3QgZmlyc3RDbG9zZVRhZ0lubGluZUluZGV4ID0gbWF0aG1sLmluZGV4T2YoY2xvc2VUYWdJbmxpbmUpO1xuICAgIGxldCBlbXB0eSA9IGZhbHNlO1xuICAgIC8vIE1hdGhNTCBpcyBhbHdheXMgZW1wdHkgaW4gdGhlIHNlY29uZCBzaGFwZS5cbiAgICBpZiAoZmlyc3RDbG9zZVRhZ0lubGluZUluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGZpcnN0Q2xvc2VUYWdJbmxpbmVJbmRleCA9PT0gZmlyc3RDbG9zZVRhZ0luZGV4IC0gMSkge1xuICAgICAgICBlbXB0eSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWF0aE1MIGlzIGFsd2F5cyBlbXB0eSBpbiB0aGUgZmlyc3Qgc2hhcGUgd2hlbiB0aGVyZSBhcmVuJ3QgZWxlbWVudHNcbiAgICAvLyBiZXR3ZWVuIG1hdGggdGFncy5cbiAgICBpZiAoIWVtcHR5KSB7XG4gICAgICBjb25zdCBtYXRoVGFnRW5kUmVnZXggPSBuZXcgUmVnRXhwKCc8LyguKzopP21hdGg+Jyk7XG4gICAgICBjb25zdCBtYXRoVGFnRW5kQXJyYXkgPSBtYXRoVGFnRW5kUmVnZXguZXhlYyhtYXRobWwpO1xuICAgICAgaWYgKG1hdGhUYWdFbmRBcnJheSkge1xuICAgICAgICBlbXB0eSA9IGZpcnN0Q2xvc2VUYWdJbmRleCArIDEgPT09IG1hdGhUYWdFbmRBcnJheS5pbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW1wdHk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlcyBodG1sIGVudGl0aWVzIGluc2lkZSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWF0aG1sIC0gdmFsaWQgTWF0aE1MIHdpdGggc3RhbmRhcmQgWE1MIHRhZ3MuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IC0gJ21hdGhtbCcgd2l0aCBwcm9wZXJ0eSBlbnRpdGllcyBlbmNvZGVkLlxuICAgKi9cbiAgc3RhdGljIGVuY29kZVByb3BlcnRpZXMobWF0aG1sKSB7XG4gICAgLy8gU2VhcmNoIGFsbCB0aGUgcHJvcGVydGllcy5cbiAgICBjb25zdCByZWdleCA9IC9cXHcrPVwiLio/XCIvZztcbiAgICAvLyBFbmNvZGUgaHRtbCBlbnRpdGllcy5cbiAgICBjb25zdCByZXBsYWNlciA9IChtYXRjaCkgPT4ge1xuICAgICAgLy8gSXQgaGFzIHRoZSBzaGFwZTpcbiAgICAgIC8vIDxtYXRoIHByb3BlcnR5T25lPVwic29tZXRoaW5nT25lXCI+PGNoaWxkcmVuIHByb3BlcnR5VHdvPVwic29tZXRoaW5nVHdvXCI+PC9jaGlsZHJlbj48L21hdGg+LlxuICAgICAgY29uc3QgcXVvdGVJbmRleCA9IG1hdGNoLmluZGV4T2YoJ1wiJyk7XG4gICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gbWF0Y2guc3Vic3RyaW5nKHF1b3RlSW5kZXggKyAxLCBtYXRjaC5sZW5ndGggLSAxKTtcbiAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWVFbmNvZGVkID0gVXRpbC5odG1sRW50aXRpZXMocHJvcGVydHlWYWx1ZSk7XG4gICAgICBjb25zdCBtYXRjaEVuY29kZWQgPSBgJHttYXRjaC5zdWJzdHJpbmcoMCwgcXVvdGVJbmRleCArIDEpfSR7cHJvcGVydHlWYWx1ZUVuY29kZWR9XCJgO1xuICAgICAgcmV0dXJuIG1hdGNoRW5jb2RlZDtcbiAgICB9O1xuXG4gICAgY29uc3QgbWF0aG1sRW5jb2RlZCA9IG1hdGhtbC5yZXBsYWNlKHJlZ2V4LCByZXBsYWNlcik7XG4gICAgcmV0dXJuIG1hdGhtbEVuY29kZWQ7XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG52YXIgbWQ1O1xuZXhwb3J0IGRlZmF1bHQgbWQ1O1xuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgSHhPdmVycmlkZXMgPSBmdW5jdGlvbiAoKSB7IH1cbiAgSHhPdmVycmlkZXMuX19uYW1lX18gPSB0cnVlO1xuICBIeE92ZXJyaWRlcy5kYXRlU3RyID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICB2YXIgbSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XG4gICAgdmFyIGQgPSBkYXRlLmdldERhdGUoKTtcbiAgICB2YXIgaCA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICB2YXIgbWkgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICB2YXIgcyA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIChtIDwgMTAgPyBcIjBcIiArIG0gOiBcIlwiICsgbSkgKyBcIi1cIiArIChkIDwgMTAgPyBcIjBcIiArIGQgOiBcIlwiICsgZCkgKyBcIiBcIiArIChoIDwgMTAgPyBcIjBcIiArIGggOiBcIlwiICsgaCkgKyBcIjpcIiArIChtaSA8IDEwID8gXCIwXCIgKyBtaSA6IFwiXCIgKyBtaSkgKyBcIjpcIiArIChzIDwgMTAgPyBcIjBcIiArIHMgOiBcIlwiICsgcyk7XG4gIH1cbiAgSHhPdmVycmlkZXMuc3RyRGF0ZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgc3dpdGNoIChzLmxlbmd0aCkge1xuICAgICAgY2FzZSA4OlxuICAgICAgICB2YXIgayA9IHMuc3BsaXQoXCI6XCIpO1xuICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGQuc2V0VGltZSgwKTtcbiAgICAgICAgZC5zZXRVVENIb3VycyhrWzBdKTtcbiAgICAgICAgZC5zZXRVVENNaW51dGVzKGtbMV0pO1xuICAgICAgICBkLnNldFVUQ1NlY29uZHMoa1syXSk7XG4gICAgICAgIHJldHVybiBkO1xuICAgICAgY2FzZSAxMDpcbiAgICAgICAgdmFyIGsgPSBzLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGtbMF0sIGtbMV0gLSAxLCBrWzJdLCAwLCAwLCAwKTtcbiAgICAgIGNhc2UgMTk6XG4gICAgICAgIHZhciBrID0gcy5zcGxpdChcIiBcIik7XG4gICAgICAgIHZhciB5ID0ga1swXS5zcGxpdChcIi1cIik7XG4gICAgICAgIHZhciB0ID0ga1sxXS5zcGxpdChcIjpcIik7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh5WzBdLCB5WzFdIC0gMSwgeVsyXSwgdFswXSwgdFsxXSwgdFsyXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBcIkludmFsaWQgZGF0ZSBmb3JtYXQgOiBcIiArIHM7XG4gICAgfVxuICB9XG4gIEh4T3ZlcnJpZGVzLmNjYSA9IGZ1bmN0aW9uIChzLCBpbmRleCkge1xuICAgIHZhciB4ID0gcy5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICBpZiAoeCAhPSB4KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB4O1xuICB9XG4gIEh4T3ZlcnJpZGVzLnN1YnN0ciA9IGZ1bmN0aW9uIChzLCBwb3MsIGxlbikge1xuICAgIGlmIChwb3MgIT0gbnVsbCAmJiBwb3MgIT0gMCAmJiBsZW4gIT0gbnVsbCAmJiBsZW4gPCAwKSByZXR1cm4gXCJcIjtcbiAgICBpZiAobGVuID09IG51bGwpIGxlbiA9IHMubGVuZ3RoO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICBwb3MgPSBzLmxlbmd0aCArIHBvcztcbiAgICAgIGlmIChwb3MgPCAwKSBwb3MgPSAwO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgMCkgbGVuID0gcy5sZW5ndGggKyBsZW4gLSBwb3M7XG4gICAgcmV0dXJuIHMuc3Vic3RyKHBvcywgbGVuKTtcbiAgfVxuICBIeE92ZXJyaWRlcy5yZW1vdmUgPSBmdW5jdGlvbiAoYSwgb2JqKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBsID0gYS5sZW5ndGg7XG4gICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICBpZiAoYVtpXSA9PSBvYmopIHtcbiAgICAgICAgYS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgSHhPdmVycmlkZXMuaXRlciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cjogMCwgYXJyOiBhLCBoYXNOZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1ciA8IHRoaXMuYXJyLmxlbmd0aDtcbiAgICAgIH0sIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyW3RoaXMuY3VyKytdO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdmFyIEludEl0ZXIgPSBmdW5jdGlvbiAobWluLCBtYXgpIHtcbiAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICB0aGlzLm1heCA9IG1heDtcbiAgfTtcbiAgSW50SXRlci5fX25hbWVfXyA9IHRydWU7XG4gIEludEl0ZXIucHJvdG90eXBlID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1pbisrO1xuICAgIH1cbiAgICAsIGhhc05leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1pbiA8IHRoaXMubWF4O1xuICAgIH1cbiAgICAsIF9fY2xhc3NfXzogSW50SXRlclxuICB9XG4gIHZhciBTdGQgPSBmdW5jdGlvbiAoKSB7IH1cbiAgU3RkLl9fbmFtZV9fID0gdHJ1ZTtcbiAgU3RkW1wiaXNcIl0gPSBmdW5jdGlvbiAodiwgdCkge1xuICAgIHJldHVybiBqcy5Cb290Ll9faW5zdGFuY2VvZih2LCB0KTtcbiAgfVxuICBTdGQuc3RyaW5nID0gZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4ganMuQm9vdC5fX3N0cmluZ19yZWMocywgXCJcIik7XG4gIH1cbiAgU3RkW1wiaW50XCJdID0gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4geCB8IDA7XG4gIH1cbiAgU3RkLnBhcnNlSW50ID0gZnVuY3Rpb24gKHgpIHtcbiAgICB2YXIgdiA9IHBhcnNlSW50KHgsIDEwKTtcbiAgICBpZiAodiA9PSAwICYmIChIeE92ZXJyaWRlcy5jY2EoeCwgMSkgPT0gMTIwIHx8IEh4T3ZlcnJpZGVzLmNjYSh4LCAxKSA9PSA4OCkpIHYgPSBwYXJzZUludCh4KTtcbiAgICBpZiAoaXNOYU4odikpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB2O1xuICB9XG4gIFN0ZC5wYXJzZUZsb2F0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh4KTtcbiAgfVxuICBTdGQucmFuZG9tID0gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogeCk7XG4gIH1cbiAgdmFyIGNvbSA9IGNvbSB8fCB7fVxuICBpZiAoIWNvbS53aXJpcykgY29tLndpcmlzID0ge31cbiAgaWYgKCFjb20ud2lyaXMuanMpIGNvbS53aXJpcy5qcyA9IHt9XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMudHJ5UmVhZHkoKTtcbiAgfTtcbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuX19uYW1lX18gPSB0cnVlO1xuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5tYWluID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBldjtcbiAgICBldiA9IGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmdldEluc3RhbmNlKCk7XG4gICAgaGF4ZS5UaW1lci5kZWxheSgkYmluZChldiwgZXYudHJ5UmVhZHkpLCAxMDApO1xuICB9XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5pbnN0YW5jZSA9PSBudWxsKSBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5pbnN0YW5jZSA9IG5ldyBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scygpO1xuICAgIHJldHVybiBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5pbnN0YW5jZTtcbiAgfVxuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5ieXBhc3NFbmNhcHN1bGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh3aW5kb3cuY29tID09IG51bGwpIHdpbmRvdy5jb20gPSB7fTtcbiAgICBpZiAod2luZG93LmNvbS53aXJpcyA9PSBudWxsKSB3aW5kb3cuY29tLndpcmlzID0ge307XG4gICAgaWYgKHdpbmRvdy5jb20ud2lyaXMuanMgPT0gbnVsbCkgd2luZG93LmNvbS53aXJpcy5qcyA9IHt9O1xuICAgIGlmICh3aW5kb3cuY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMgPT0gbnVsbCkgd2luZG93LmNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzID0gY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuZ2V0SW5zdGFuY2UoKTtcbiAgfVxuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5wcm90b3R5cGUgPSB7XG4gICAgbWQ1ZW5jb2RlOiBmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgcmV0dXJuIGhheGUuTWQ1LmVuY29kZShjb250ZW50KTtcbiAgICB9XG4gICAgLCBkb0xvYWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgICAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuaW5zdGFuY2UgPSB0aGlzO1xuICAgICAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuYnlwYXNzRW5jYXBzdWxhdGlvbigpO1xuICAgIH1cbiAgICAsIHRyeVJlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICBpZiAoanMuTGliLmRvY3VtZW50LnJlYWR5U3RhdGUpIHtcbiAgICAgICAgdGhpcy5kb0xvYWQoKTtcbiAgICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMucmVhZHkpIGhheGUuVGltZXIuZGVsYXkoJGJpbmQodGhpcywgdGhpcy50cnlSZWFkeSksIDEwMCk7XG4gICAgfVxuICAgICwgX19jbGFzc19fOiBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29sc1xuICB9XG4gIHZhciBoYXhlID0gaGF4ZSB8fCB7fVxuICBoYXhlLkxvZyA9IGZ1bmN0aW9uICgpIHsgfVxuICBoYXhlLkxvZy5fX25hbWVfXyA9IHRydWU7XG4gIGhheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24gKHYsIGluZm9zKSB7XG4gICAganMuQm9vdC5fX3RyYWNlKHYsIGluZm9zKTtcbiAgfVxuICBoYXhlLkxvZy5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICBqcy5Cb290Ll9fY2xlYXJfdHJhY2UoKTtcbiAgfVxuICBoYXhlLk1kNSA9IGZ1bmN0aW9uICgpIHtcbiAgfTtcbiAgaGF4ZS5NZDUuX19uYW1lX18gPSB0cnVlO1xuICBoYXhlLk1kNS5lbmNvZGUgPSBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBuZXcgaGF4ZS5NZDUoKS5kb0VuY29kZShzKTtcbiAgfVxuICBoYXhlLk1kNS5wcm90b3R5cGUgPSB7XG4gICAgZG9FbmNvZGU6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5zdHIyYmxrcyhzdHIpO1xuICAgICAgdmFyIGEgPSAxNzMyNTg0MTkzO1xuICAgICAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICAgICAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgICAgIHZhciBkID0gMjcxNzMzODc4O1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB3aGlsZSAoaSA8IHgubGVuZ3RoKSB7XG4gICAgICAgIHZhciBvbGRhID0gYTtcbiAgICAgICAgdmFyIG9sZGIgPSBiO1xuICAgICAgICB2YXIgb2xkYyA9IGM7XG4gICAgICAgIHZhciBvbGRkID0gZDtcbiAgICAgICAgc3RlcCA9IDA7XG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIHhbaV0sIDcsIC02ODA4NzY5MzYpO1xuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCB4W2kgKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xuICAgICAgICBjID0gdGhpcy5mZihjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTcsIDYwNjEwNTgxOSk7XG4gICAgICAgIGIgPSB0aGlzLmZmKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNywgLTE3NjQxODg5Nyk7XG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIHhbaSArIDVdLCAxMiwgMTIwMDA4MDQyNik7XG4gICAgICAgIGMgPSB0aGlzLmZmKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCB4W2kgKyA3XSwgMjIsIC00NTcwNTk4Myk7XG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA3LCAxNzcwMDM1NDE2KTtcbiAgICAgICAgZCA9IHRoaXMuZmYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgICAgIGMgPSB0aGlzLmZmKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTcsIC00MjA2Myk7XG4gICAgICAgIGIgPSB0aGlzLmZmKGIsIGMsIGQsIGEsIHhbaSArIDExXSwgMjIsIC0xOTkwNDA0MTYyKTtcbiAgICAgICAgYSA9IHRoaXMuZmYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTtcbiAgICAgICAgZCA9IHRoaXMuZmYoZCwgYSwgYiwgYywgeFtpICsgMTNdLCAxMiwgLTQwMzQxMTAxKTtcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTtcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwgeFtpICsgMV0sIDUsIC0xNjU3OTY1MTApO1xuICAgICAgICBkID0gdGhpcy5nZyhkLCBhLCBiLCBjLCB4W2kgKyA2XSwgOSwgLTEwNjk1MDE2MzIpO1xuICAgICAgICBjID0gdGhpcy5nZyhjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE0LCA2NDM3MTc3MTMpO1xuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCB4W2ldLCAyMCwgLTM3Mzg5NzMwMik7XG4gICAgICAgIGEgPSB0aGlzLmdnKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA1LCAtNzAxNTU4NjkxKTtcbiAgICAgICAgZCA9IHRoaXMuZ2coZCwgYSwgYiwgYywgeFtpICsgMTBdLCA5LCAzODAxNjA4Myk7XG4gICAgICAgIGMgPSB0aGlzLmdnKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCB4W2kgKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgICAgICBhID0gdGhpcy5nZyhhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNSwgNTY4NDQ2NDM4KTtcbiAgICAgICAgZCA9IHRoaXMuZ2coZCwgYSwgYiwgYywgeFtpICsgMTRdLCA5LCAtMTAxOTgwMzY5MCk7XG4gICAgICAgIGMgPSB0aGlzLmdnKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNCwgLTE4NzM2Mzk2MSk7XG4gICAgICAgIGIgPSB0aGlzLmdnKGIsIGMsIGQsIGEsIHhbaSArIDhdLCAyMCwgMTE2MzUzMTUwMSk7XG4gICAgICAgIGEgPSB0aGlzLmdnKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xuICAgICAgICBkID0gdGhpcy5nZyhkLCBhLCBiLCBjLCB4W2kgKyAyXSwgOSwgLTUxNDAzNzg0KTtcbiAgICAgICAgYyA9IHRoaXMuZ2coYywgZCwgYSwgYiwgeFtpICsgN10sIDE0LCAxNzM1MzI4NDczKTtcbiAgICAgICAgYiA9IHRoaXMuZ2coYiwgYywgZCwgYSwgeFtpICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpO1xuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgICAgIGQgPSB0aGlzLmhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgICAgICBjID0gdGhpcy5oaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICAgICAgYiA9IHRoaXMuaGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICAgICAgYSA9IHRoaXMuaGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICAgICAgZCA9IHRoaXMuaGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICAgICAgYyA9IHRoaXMuaGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICAgICAgYiA9IHRoaXMuaGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgICAgIGQgPSB0aGlzLmhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICAgICAgYyA9IHRoaXMuaGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICAgICAgYiA9IHRoaXMuaGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgICAgIGEgPSB0aGlzLmhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICAgICAgZCA9IHRoaXMuaGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG4gICAgICAgIGEgPSB0aGlzLmlpKGEsIGIsIGMsIGQsIHhbaV0sIDYsIC0xOTg2MzA4NDQpO1xuICAgICAgICBkID0gdGhpcy5paShkLCBhLCBiLCBjLCB4W2kgKyA3XSwgMTAsIDExMjY4OTE0MTUpO1xuICAgICAgICBjID0gdGhpcy5paShjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG4gICAgICAgIGIgPSB0aGlzLmlpKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTtcbiAgICAgICAgYSA9IHRoaXMuaWkoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA2LCAxNzAwNDg1NTcxKTtcbiAgICAgICAgZCA9IHRoaXMuaWkoZCwgYSwgYiwgYywgeFtpICsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgICAgIGMgPSB0aGlzLmlpKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTtcbiAgICAgICAgYiA9IHRoaXMuaWkoYiwgYywgZCwgYSwgeFtpICsgMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG4gICAgICAgIGEgPSB0aGlzLmlpKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA2LCAxODczMzEzMzU5KTtcbiAgICAgICAgZCA9IHRoaXMuaWkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgICAgIGIgPSB0aGlzLmlpKGIsIGMsIGQsIGEsIHhbaSArIDEzXSwgMjEsIDEzMDkxNTE2NDkpO1xuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7XG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIHhbaSArIDExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE1LCA3MTg3ODcyNTkpO1xuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xuICAgICAgICBhID0gdGhpcy5hZGRtZShhLCBvbGRhKTtcbiAgICAgICAgYiA9IHRoaXMuYWRkbWUoYiwgb2xkYik7XG4gICAgICAgIGMgPSB0aGlzLmFkZG1lKGMsIG9sZGMpO1xuICAgICAgICBkID0gdGhpcy5hZGRtZShkLCBvbGRkKTtcbiAgICAgICAgaSArPSAxNjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJoZXgoYSkgKyB0aGlzLnJoZXgoYikgKyB0aGlzLnJoZXgoYykgKyB0aGlzLnJoZXgoZCk7XG4gICAgfVxuICAgICwgaWk6IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5jbW4odGhpcy5iaXRYT1IoYywgdGhpcy5iaXRPUihiLCB+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcbiAgICB9XG4gICAgLCBoaDogZnVuY3Rpb24gKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNtbih0aGlzLmJpdFhPUih0aGlzLmJpdFhPUihiLCBjKSwgZCksIGEsIGIsIHgsIHMsIHQpO1xuICAgIH1cbiAgICAsIGdnOiBmdW5jdGlvbiAoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICAgICAgcmV0dXJuIHRoaXMuY21uKHRoaXMuYml0T1IodGhpcy5iaXRBTkQoYiwgZCksIHRoaXMuYml0QU5EKGMsIH5kKSksIGEsIGIsIHgsIHMsIHQpO1xuICAgIH1cbiAgICAsIGZmOiBmdW5jdGlvbiAoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICAgICAgcmV0dXJuIHRoaXMuY21uKHRoaXMuYml0T1IodGhpcy5iaXRBTkQoYiwgYyksIHRoaXMuYml0QU5EKH5iLCBkKSksIGEsIGIsIHgsIHMsIHQpO1xuICAgIH1cbiAgICAsIGNtbjogZnVuY3Rpb24gKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZG1lKHRoaXMucm9sKHRoaXMuYWRkbWUodGhpcy5hZGRtZShhLCBxKSwgdGhpcy5hZGRtZSh4LCB0KSksIHMpLCBiKTtcbiAgICB9XG4gICAgLCByb2w6IGZ1bmN0aW9uIChudW0sIGNudCkge1xuICAgICAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xuICAgIH1cbiAgICAsIHN0cjJibGtzOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICB2YXIgbmJsayA9IChzdHIubGVuZ3RoICsgOCA+PiA2KSArIDE7XG4gICAgICB2YXIgYmxrcyA9IG5ldyBBcnJheSgpO1xuICAgICAgdmFyIF9nMSA9IDAsIF9nID0gbmJsayAqIDE2O1xuICAgICAgd2hpbGUgKF9nMSA8IF9nKSB7XG4gICAgICAgIHZhciBpID0gX2cxKys7XG4gICAgICAgIGJsa3NbaV0gPSAwO1xuICAgICAgfVxuICAgICAgdmFyIGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgIGJsa3NbaSA+PiAyXSB8PSBIeE92ZXJyaWRlcy5jY2Eoc3RyLCBpKSA8PCAoc3RyLmxlbmd0aCAqIDggKyBpKSAlIDQgKiA4O1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICBibGtzW2kgPj4gMl0gfD0gMTI4IDw8IChzdHIubGVuZ3RoICogOCArIGkpICUgNCAqIDg7XG4gICAgICB2YXIgbCA9IHN0ci5sZW5ndGggKiA4O1xuICAgICAgdmFyIGsgPSBuYmxrICogMTYgLSAyO1xuICAgICAgYmxrc1trXSA9IGwgJiAyNTU7XG4gICAgICBibGtzW2tdIHw9IChsID4+PiA4ICYgMjU1KSA8PCA4O1xuICAgICAgYmxrc1trXSB8PSAobCA+Pj4gMTYgJiAyNTUpIDw8IDE2O1xuICAgICAgYmxrc1trXSB8PSAobCA+Pj4gMjQgJiAyNTUpIDw8IDI0O1xuICAgICAgcmV0dXJuIGJsa3M7XG4gICAgfVxuICAgICwgcmhleDogZnVuY3Rpb24gKG51bSkge1xuICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICB2YXIgaGV4X2NociA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xuICAgICAgdmFyIF9nID0gMDtcbiAgICAgIHdoaWxlIChfZyA8IDQpIHtcbiAgICAgICAgdmFyIGogPSBfZysrO1xuICAgICAgICBzdHIgKz0gaGV4X2Noci5jaGFyQXQobnVtID4+IGogKiA4ICsgNCAmIDE1KSArIGhleF9jaHIuY2hhckF0KG51bSA+PiBqICogOCAmIDE1KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgICwgYWRkbWU6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICB2YXIgbHN3ID0gKHggJiA2NTUzNSkgKyAoeSAmIDY1NTM1KTtcbiAgICAgIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgICAgIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiA2NTUzNTtcbiAgICB9XG4gICAgLCBiaXRBTkQ6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICB2YXIgbHNiID0gYSAmIDEgJiAoYiAmIDEpO1xuICAgICAgdmFyIG1zYjMxID0gYSA+Pj4gMSAmIGIgPj4+IDE7XG4gICAgICByZXR1cm4gbXNiMzEgPDwgMSB8IGxzYjtcbiAgICB9XG4gICAgLCBiaXRYT1I6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICB2YXIgbHNiID0gYSAmIDEgXiBiICYgMTtcbiAgICAgIHZhciBtc2IzMSA9IGEgPj4+IDEgXiBiID4+PiAxO1xuICAgICAgcmV0dXJuIG1zYjMxIDw8IDEgfCBsc2I7XG4gICAgfVxuICAgICwgYml0T1I6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICB2YXIgbHNiID0gYSAmIDEgfCBiICYgMTtcbiAgICAgIHZhciBtc2IzMSA9IGEgPj4+IDEgfCBiID4+PiAxO1xuICAgICAgcmV0dXJuIG1zYjMxIDw8IDEgfCBsc2I7XG4gICAgfVxuICAgICwgX19jbGFzc19fOiBoYXhlLk1kNVxuICB9XG4gIGhheGUuVGltZXIgPSBmdW5jdGlvbiAodGltZV9tcykge1xuICAgIHZhciBtZSA9IHRoaXM7XG4gICAgdGhpcy5pZCA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICBtZS5ydW4oKTtcbiAgICB9LCB0aW1lX21zKTtcbiAgfTtcbiAgaGF4ZS5UaW1lci5fX25hbWVfXyA9IHRydWU7XG4gIGhheGUuVGltZXIuZGVsYXkgPSBmdW5jdGlvbiAoZiwgdGltZV9tcykge1xuICAgIHZhciB0ID0gbmV3IGhheGUuVGltZXIodGltZV9tcyk7XG4gICAgdC5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0LnN0b3AoKTtcbiAgICAgIGYoKTtcbiAgICB9O1xuICAgIHJldHVybiB0O1xuICB9XG4gIGhheGUuVGltZXIubWVhc3VyZSA9IGZ1bmN0aW9uIChmLCBwb3MpIHtcbiAgICB2YXIgdDAgPSBoYXhlLlRpbWVyLnN0YW1wKCk7XG4gICAgdmFyIHIgPSBmKCk7XG4gICAgaGF4ZS5Mb2cudHJhY2UoaGF4ZS5UaW1lci5zdGFtcCgpIC0gdDAgKyBcInNcIiwgcG9zKTtcbiAgICByZXR1cm4gcjtcbiAgfVxuICBoYXhlLlRpbWVyLnN0YW1wID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XG4gIH1cbiAgaGF4ZS5UaW1lci5wcm90b3R5cGUgPSB7XG4gICAgcnVuOiBmdW5jdGlvbiAoKSB7XG4gICAgfVxuICAgICwgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuaWQgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5pZCk7XG4gICAgICB0aGlzLmlkID0gbnVsbDtcbiAgICB9XG4gICAgLCBfX2NsYXNzX186IGhheGUuVGltZXJcbiAgfVxuICB2YXIganMgPSBqcyB8fCB7fVxuICBqcy5Cb290ID0gZnVuY3Rpb24gKCkgeyB9XG4gIGpzLkJvb3QuX19uYW1lX18gPSB0cnVlO1xuICBqcy5Cb290Ll9fdW5odG1sID0gZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gcy5zcGxpdChcIiZcIikuam9pbihcIiZhbXA7XCIpLnNwbGl0KFwiPFwiKS5qb2luKFwiJmx0O1wiKS5zcGxpdChcIj5cIikuam9pbihcIiZndDtcIik7XG4gIH1cbiAganMuQm9vdC5fX3RyYWNlID0gZnVuY3Rpb24gKHYsIGkpIHtcbiAgICB2YXIgbXNnID0gaSAhPSBudWxsID8gaS5maWxlTmFtZSArIFwiOlwiICsgaS5saW5lTnVtYmVyICsgXCI6IFwiIDogXCJcIjtcbiAgICBtc2cgKz0ganMuQm9vdC5fX3N0cmluZ19yZWModiwgXCJcIik7XG4gICAgdmFyIGQ7XG4gICAgaWYgKHR5cGVvZiAoZG9jdW1lbnQpICE9IFwidW5kZWZpbmVkXCIgJiYgKGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhheGU6dHJhY2VcIikpICE9IG51bGwpIGQuaW5uZXJIVE1MICs9IGpzLkJvb3QuX191bmh0bWwobXNnKSArIFwiPGJyLz5cIjsgZWxzZSBpZiAodHlwZW9mIChjb25zb2xlKSAhPSBcInVuZGVmaW5lZFwiICYmIGNvbnNvbGUubG9nICE9IG51bGwpIGNvbnNvbGUubG9nKG1zZyk7XG4gIH1cbiAganMuQm9vdC5fX2NsZWFyX3RyYWNlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoYXhlOnRyYWNlXCIpO1xuICAgIGlmIChkICE9IG51bGwpIGQuaW5uZXJIVE1MID0gXCJcIjtcbiAgfVxuICBqcy5Cb290LmlzQ2xhc3MgPSBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvLl9fbmFtZV9fO1xuICB9XG4gIGpzLkJvb3QuaXNFbnVtID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZS5fX2VuYW1lX187XG4gIH1cbiAganMuQm9vdC5nZXRDbGFzcyA9IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8uX19jbGFzc19fO1xuICB9XG4gIGpzLkJvb3QuX19zdHJpbmdfcmVjID0gZnVuY3Rpb24gKG8sIHMpIHtcbiAgICBpZiAobyA9PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG4gICAgaWYgKHMubGVuZ3RoID49IDUpIHJldHVybiBcIjwuLi4+XCI7XG4gICAgdmFyIHQgPSB0eXBlb2YgKG8pO1xuICAgIGlmICh0ID09IFwiZnVuY3Rpb25cIiAmJiAoby5fX25hbWVfXyB8fCBvLl9fZW5hbWVfXykpIHQgPSBcIm9iamVjdFwiO1xuICAgIHN3aXRjaCAodCkge1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgaWYgKG8uX19lbnVtX18pIHtcbiAgICAgICAgICAgIGlmIChvLmxlbmd0aCA9PSAyKSByZXR1cm4gb1swXTtcbiAgICAgICAgICAgIHZhciBzdHIgPSBvWzBdICsgXCIoXCI7XG4gICAgICAgICAgICBzICs9IFwiXFx0XCI7XG4gICAgICAgICAgICB2YXIgX2cxID0gMiwgX2cgPSBvLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChfZzEgPCBfZykge1xuICAgICAgICAgICAgICB2YXIgaSA9IF9nMSsrO1xuICAgICAgICAgICAgICBpZiAoaSAhPSAyKSBzdHIgKz0gXCIsXCIgKyBqcy5Cb290Ll9fc3RyaW5nX3JlYyhvW2ldLCBzKTsgZWxzZSBzdHIgKz0ganMuQm9vdC5fX3N0cmluZ19yZWMob1tpXSwgcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyICsgXCIpXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBsID0gby5sZW5ndGg7XG4gICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgdmFyIHN0ciA9IFwiW1wiO1xuICAgICAgICAgIHMgKz0gXCJcXHRcIjtcbiAgICAgICAgICB2YXIgX2cgPSAwO1xuICAgICAgICAgIHdoaWxlIChfZyA8IGwpIHtcbiAgICAgICAgICAgIHZhciBpMSA9IF9nKys7XG4gICAgICAgICAgICBzdHIgKz0gKGkxID4gMCA/IFwiLFwiIDogXCJcIikgKyBqcy5Cb290Ll9fc3RyaW5nX3JlYyhvW2kxXSwgcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ciArPSBcIl1cIjtcbiAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b3N0cjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0b3N0ciA9IG8udG9TdHJpbmc7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gXCI/Pz9cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9zdHIgIT0gbnVsbCAmJiB0b3N0ciAhPSBPYmplY3QudG9TdHJpbmcpIHtcbiAgICAgICAgICB2YXIgczIgPSBvLnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKHMyICE9IFwiW29iamVjdCBPYmplY3RdXCIpIHJldHVybiBzMjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgayA9IG51bGw7XG4gICAgICAgIHZhciBzdHIgPSBcIntcXG5cIjtcbiAgICAgICAgcyArPSBcIlxcdFwiO1xuICAgICAgICB2YXIgaGFzcCA9IG8uaGFzT3duUHJvcGVydHkgIT0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKSB7XG4gICAgICAgICAgO1xuICAgICAgICAgIGlmIChoYXNwICYmICFvLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGsgPT0gXCJwcm90b3R5cGVcIiB8fCBrID09IFwiX19jbGFzc19fXCIgfHwgayA9PSBcIl9fc3VwZXJfX1wiIHx8IGsgPT0gXCJfX2ludGVyZmFjZXNfX1wiIHx8IGsgPT0gXCJfX3Byb3BlcnRpZXNfX1wiKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0ci5sZW5ndGggIT0gMikgc3RyICs9IFwiLCBcXG5cIjtcbiAgICAgICAgICBzdHIgKz0gcyArIGsgKyBcIiA6IFwiICsganMuQm9vdC5fX3N0cmluZ19yZWMob1trXSwgcyk7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpO1xuICAgICAgICBzdHIgKz0gXCJcXG5cIiArIHMgKyBcIn1cIjtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICByZXR1cm4gXCI8ZnVuY3Rpb24+XCI7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBvO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhvKTtcbiAgICB9XG4gIH1cbiAganMuQm9vdC5fX2ludGVyZkxvb3AgPSBmdW5jdGlvbiAoY2MsIGNsKSB7XG4gICAgaWYgKGNjID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY2MgPT0gY2wpIHJldHVybiB0cnVlO1xuICAgIHZhciBpbnRmID0gY2MuX19pbnRlcmZhY2VzX187XG4gICAgaWYgKGludGYgIT0gbnVsbCkge1xuICAgICAgdmFyIF9nMSA9IDAsIF9nID0gaW50Zi5sZW5ndGg7XG4gICAgICB3aGlsZSAoX2cxIDwgX2cpIHtcbiAgICAgICAgdmFyIGkgPSBfZzErKztcbiAgICAgICAgdmFyIGkxID0gaW50ZltpXTtcbiAgICAgICAgaWYgKGkxID09IGNsIHx8IGpzLkJvb3QuX19pbnRlcmZMb29wKGkxLCBjbCkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ganMuQm9vdC5fX2ludGVyZkxvb3AoY2MuX19zdXBlcl9fLCBjbCk7XG4gIH1cbiAganMuQm9vdC5fX2luc3RhbmNlb2YgPSBmdW5jdGlvbiAobywgY2wpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG8gaW5zdGFuY2VvZiBjbCkge1xuICAgICAgICBpZiAoY2wgPT0gQXJyYXkpIHJldHVybiBvLl9fZW51bV9fID09IG51bGw7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGpzLkJvb3QuX19pbnRlcmZMb29wKG8uX19jbGFzc19fLCBjbCkpIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChjbCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN3aXRjaCAoY2wpIHtcbiAgICAgIGNhc2UgSW50OlxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG8gJSAyMTQ3NDgzNjQ4LjApID09PSBvO1xuICAgICAgY2FzZSBGbG9hdDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiAobykgPT0gXCJudW1iZXJcIjtcbiAgICAgIGNhc2UgQm9vbDpcbiAgICAgICAgcmV0dXJuIG8gPT09IHRydWUgfHwgbyA9PT0gZmFsc2U7XG4gICAgICBjYXNlIFN0cmluZzpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiAobykgPT0gXCJzdHJpbmdcIjtcbiAgICAgIGNhc2UgRHluYW1pYzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjbCA9PSBDbGFzcyAmJiBvLl9fbmFtZV9fICE9IG51bGwpIHJldHVybiB0cnVlOyBlbHNlIG51bGw7XG4gICAgICAgIGlmIChjbCA9PSBFbnVtICYmIG8uX19lbmFtZV9fICE9IG51bGwpIHJldHVybiB0cnVlOyBlbHNlIG51bGw7XG4gICAgICAgIHJldHVybiBvLl9fZW51bV9fID09IGNsO1xuICAgIH1cbiAgfVxuICBqcy5Cb290Ll9fY2FzdCA9IGZ1bmN0aW9uIChvLCB0KSB7XG4gICAgaWYgKGpzLkJvb3QuX19pbnN0YW5jZW9mKG8sIHQpKSByZXR1cm4gbzsgZWxzZSB0aHJvdyBcIkNhbm5vdCBjYXN0IFwiICsgU3RkLnN0cmluZyhvKSArIFwiIHRvIFwiICsgU3RkLnN0cmluZyh0KTtcbiAgfVxuICBqcy5MaWIgPSBmdW5jdGlvbiAoKSB7IH1cbiAganMuTGliLl9fbmFtZV9fID0gdHJ1ZTtcbiAganMuTGliLmRlYnVnID0gZnVuY3Rpb24gKCkge1xuICAgIGRlYnVnZ2VyO1xuICB9XG4gIGpzLkxpYi5hbGVydCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgYWxlcnQoanMuQm9vdC5fX3N0cmluZ19yZWModiwgXCJcIikpO1xuICB9XG4gIGpzLkxpYi5ldmFsID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgICByZXR1cm4gZXZhbChjb2RlKTtcbiAgfVxuICBqcy5MaWIuc2V0RXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKGYpIHtcbiAgICBqcy5MaWIub25lcnJvciA9IGY7XG4gIH1cbiAgdmFyICRfO1xuICBmdW5jdGlvbiAkYmluZChvLCBtKSB7IHZhciBmID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZi5tZXRob2QuYXBwbHkoZi5zY29wZSwgYXJndW1lbnRzKTsgfTsgZi5zY29wZSA9IG87IGYubWV0aG9kID0gbTsgcmV0dXJuIGY7IH07XG4gIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgSHhPdmVycmlkZXMucmVtb3ZlID0gZnVuY3Rpb24gKGEsIG8pIHtcbiAgICB2YXIgaSA9IGEuaW5kZXhPZihvKTtcbiAgICBpZiAoaSA9PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgIGEuc3BsaWNlKGksIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9OyBlbHNlIG51bGw7XG4gIE1hdGguX19uYW1lX18gPSBbXCJNYXRoXCJdO1xuICBNYXRoLk5hTiA9IE51bWJlci5OYU47XG4gIE1hdGguTkVHQVRJVkVfSU5GSU5JVFkgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIE1hdGguUE9TSVRJVkVfSU5GSU5JVFkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIE1hdGguaXNGaW5pdGUgPSBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpc0Zpbml0ZShpKTtcbiAgfTtcbiAgTWF0aC5pc05hTiA9IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGlzTmFOKGkpO1xuICB9O1xuICBTdHJpbmcucHJvdG90eXBlLl9fY2xhc3NfXyA9IFN0cmluZztcbiAgU3RyaW5nLl9fbmFtZV9fID0gdHJ1ZTtcbiAgQXJyYXkucHJvdG90eXBlLl9fY2xhc3NfXyA9IEFycmF5O1xuICBBcnJheS5fX25hbWVfXyA9IHRydWU7XG4gIERhdGUucHJvdG90eXBlLl9fY2xhc3NfXyA9IERhdGU7XG4gIERhdGUuX19uYW1lX18gPSBbXCJEYXRlXCJdO1xuICB2YXIgSW50ID0geyBfX25hbWVfXzogW1wiSW50XCJdIH07XG4gIHZhciBEeW5hbWljID0geyBfX25hbWVfXzogW1wiRHluYW1pY1wiXSB9O1xuICB2YXIgRmxvYXQgPSBOdW1iZXI7XG4gIEZsb2F0Ll9fbmFtZV9fID0gW1wiRmxvYXRcIl07XG4gIHZhciBCb29sID0gQm9vbGVhbjtcbiAgQm9vbC5fX2VuYW1lX18gPSBbXCJCb29sXCJdO1xuICB2YXIgQ2xhc3MgPSB7IF9fbmFtZV9fOiBbXCJDbGFzc1wiXSB9O1xuICB2YXIgRW51bSA9IHt9O1xuICB2YXIgVm9pZCA9IHsgX19lbmFtZV9fOiBbXCJWb2lkXCJdIH07XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIikganMuTGliLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICBqcy5MaWIud2luZG93ID0gd2luZG93O1xuICAgIGpzLkxpYi53aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uIChtc2csIHVybCwgbGluZSkge1xuICAgICAgdmFyIGYgPSBqcy5MaWIub25lcnJvcjtcbiAgICAgIGlmIChmID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBmKG1zZywgW3VybCArIFwiOlwiICsgbGluZV0pO1xuICAgIH07XG4gIH1cbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMubWFpbigpO1xuICBkZWxldGUgQXJyYXkucHJvdG90eXBlLl9fY2xhc3NfXztcbn0oKSk7XG5cblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEh4T3ZlcnJpZGVzID0gZnVuY3Rpb24gKCkgeyB9XG4gIEh4T3ZlcnJpZGVzLl9fbmFtZV9fID0gdHJ1ZTtcbiAgSHhPdmVycmlkZXMuZGF0ZVN0ciA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgdmFyIG0gPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgdmFyIGggPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgdmFyIG1pID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgdmFyIHMgPSBkYXRlLmdldFNlY29uZHMoKTtcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCItXCIgKyAobSA8IDEwID8gXCIwXCIgKyBtIDogXCJcIiArIG0pICsgXCItXCIgKyAoZCA8IDEwID8gXCIwXCIgKyBkIDogXCJcIiArIGQpICsgXCIgXCIgKyAoaCA8IDEwID8gXCIwXCIgKyBoIDogXCJcIiArIGgpICsgXCI6XCIgKyAobWkgPCAxMCA/IFwiMFwiICsgbWkgOiBcIlwiICsgbWkpICsgXCI6XCIgKyAocyA8IDEwID8gXCIwXCIgKyBzIDogXCJcIiArIHMpO1xuICB9XG4gIEh4T3ZlcnJpZGVzLnN0ckRhdGUgPSBmdW5jdGlvbiAocykge1xuICAgIHN3aXRjaCAocy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgODpcbiAgICAgICAgdmFyIGsgPSBzLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBkLnNldFRpbWUoMCk7XG4gICAgICAgIGQuc2V0VVRDSG91cnMoa1swXSk7XG4gICAgICAgIGQuc2V0VVRDTWludXRlcyhrWzFdKTtcbiAgICAgICAgZC5zZXRVVENTZWNvbmRzKGtbMl0pO1xuICAgICAgICByZXR1cm4gZDtcbiAgICAgIGNhc2UgMTA6XG4gICAgICAgIHZhciBrID0gcy5zcGxpdChcIi1cIik7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShrWzBdLCBrWzFdIC0gMSwga1syXSwgMCwgMCwgMCk7XG4gICAgICBjYXNlIDE5OlxuICAgICAgICB2YXIgayA9IHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICB2YXIgeSA9IGtbMF0uc3BsaXQoXCItXCIpO1xuICAgICAgICB2YXIgdCA9IGtbMV0uc3BsaXQoXCI6XCIpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoeVswXSwgeVsxXSAtIDEsIHlbMl0sIHRbMF0sIHRbMV0sIHRbMl0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgXCJJbnZhbGlkIGRhdGUgZm9ybWF0IDogXCIgKyBzO1xuICAgIH1cbiAgfVxuICBIeE92ZXJyaWRlcy5jY2EgPSBmdW5jdGlvbiAocywgaW5kZXgpIHtcbiAgICB2YXIgeCA9IHMuY2hhckNvZGVBdChpbmRleCk7XG4gICAgaWYgKHggIT0geCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geDtcbiAgfVxuICBIeE92ZXJyaWRlcy5zdWJzdHIgPSBmdW5jdGlvbiAocywgcG9zLCBsZW4pIHtcbiAgICBpZiAocG9zICE9IG51bGwgJiYgcG9zICE9IDAgJiYgbGVuICE9IG51bGwgJiYgbGVuIDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKGxlbiA9PSBudWxsKSBsZW4gPSBzLmxlbmd0aDtcbiAgICBpZiAocG9zIDwgMCkge1xuICAgICAgcG9zID0gcy5sZW5ndGggKyBwb3M7XG4gICAgICBpZiAocG9zIDwgMCkgcG9zID0gMDtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDApIGxlbiA9IHMubGVuZ3RoICsgbGVuIC0gcG9zO1xuICAgIHJldHVybiBzLnN1YnN0cihwb3MsIGxlbik7XG4gIH1cbiAgSHhPdmVycmlkZXMucmVtb3ZlID0gZnVuY3Rpb24gKGEsIG9iaikge1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgaWYgKGFbaV0gPT0gb2JqKSB7XG4gICAgICAgIGEuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIEh4T3ZlcnJpZGVzLml0ZXIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXI6IDAsIGFycjogYSwgaGFzTmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXIgPCB0aGlzLmFyci5sZW5ndGg7XG4gICAgICB9LCBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyclt0aGlzLmN1cisrXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHZhciBJbnRJdGVyID0gZnVuY3Rpb24gKG1pbiwgbWF4KSB7XG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gIH07XG4gIEludEl0ZXIuX19uYW1lX18gPSB0cnVlO1xuICBJbnRJdGVyLnByb3RvdHlwZSA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5taW4rKztcbiAgICB9XG4gICAgLCBoYXNOZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5taW4gPCB0aGlzLm1heDtcbiAgICB9XG4gICAgLCBfX2NsYXNzX186IEludEl0ZXJcbiAgfVxuICB2YXIgU3RkID0gZnVuY3Rpb24gKCkgeyB9XG4gIFN0ZC5fX25hbWVfXyA9IHRydWU7XG4gIFN0ZFtcImlzXCJdID0gZnVuY3Rpb24gKHYsIHQpIHtcbiAgICByZXR1cm4ganMuQm9vdC5fX2luc3RhbmNlb2YodiwgdCk7XG4gIH1cbiAgU3RkLnN0cmluZyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIGpzLkJvb3QuX19zdHJpbmdfcmVjKHMsIFwiXCIpO1xuICB9XG4gIFN0ZFtcImludFwiXSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIHggfCAwO1xuICB9XG4gIFN0ZC5wYXJzZUludCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgdmFyIHYgPSBwYXJzZUludCh4LCAxMCk7XG4gICAgaWYgKHYgPT0gMCAmJiAoSHhPdmVycmlkZXMuY2NhKHgsIDEpID09IDEyMCB8fCBIeE92ZXJyaWRlcy5jY2EoeCwgMSkgPT0gODgpKSB2ID0gcGFyc2VJbnQoeCk7XG4gICAgaWYgKGlzTmFOKHYpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdjtcbiAgfVxuICBTdGQucGFyc2VGbG9hdCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoeCk7XG4gIH1cbiAgU3RkLnJhbmRvbSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHgpO1xuICB9XG4gIHZhciBjb20gPSBjb20gfHwge31cbiAgaWYgKCFjb20ud2lyaXMpIGNvbS53aXJpcyA9IHt9XG4gIGlmICghY29tLndpcmlzLmpzKSBjb20ud2lyaXMuanMgPSB7fVxuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scyA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRyeVJlYWR5KCk7XG4gIH07XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLl9fbmFtZV9fID0gdHJ1ZTtcbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMubWFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXY7XG4gICAgZXYgPSBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuICAgIGhheGUuVGltZXIuZGVsYXkoJGJpbmQoZXYsIGV2LnRyeVJlYWR5KSwgMTAwKTtcbiAgfVxuICBjb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuaW5zdGFuY2UgPT0gbnVsbCkgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuaW5zdGFuY2UgPSBuZXcgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMoKTtcbiAgICByZXR1cm4gY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuaW5zdGFuY2U7XG4gIH1cbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMuYnlwYXNzRW5jYXBzdWxhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAod2luZG93LmNvbSA9PSBudWxsKSB3aW5kb3cuY29tID0ge307XG4gICAgaWYgKHdpbmRvdy5jb20ud2lyaXMgPT0gbnVsbCkgd2luZG93LmNvbS53aXJpcyA9IHt9O1xuICAgIGlmICh3aW5kb3cuY29tLndpcmlzLmpzID09IG51bGwpIHdpbmRvdy5jb20ud2lyaXMuanMgPSB7fTtcbiAgICBpZiAod2luZG93LmNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzID09IG51bGwpIHdpbmRvdy5jb20ud2lyaXMuanMuSnNQbHVnaW5Ub29scyA9IGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmdldEluc3RhbmNlKCk7XG4gIH1cbiAgY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMucHJvdG90eXBlID0ge1xuICAgIG1kNWVuY29kZTogZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBoYXhlLk1kNS5lbmNvZGUoY29udGVudCk7XG4gICAgfVxuICAgICwgZG9Mb2FkOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICAgIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmluc3RhbmNlID0gdGhpcztcbiAgICAgIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLmJ5cGFzc0VuY2Fwc3VsYXRpb24oKTtcbiAgICB9XG4gICAgLCB0cnlSZWFkeTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgaWYgKGpzLkxpYi5kb2N1bWVudC5yZWFkeVN0YXRlKSB7XG4gICAgICAgIHRoaXMuZG9Mb2FkKCk7XG4gICAgICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnJlYWR5KSBoYXhlLlRpbWVyLmRlbGF5KCRiaW5kKHRoaXMsIHRoaXMudHJ5UmVhZHkpLCAxMDApO1xuICAgIH1cbiAgICAsIF9fY2xhc3NfXzogY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHNcbiAgfVxuICB2YXIgaGF4ZSA9IGhheGUgfHwge31cbiAgaGF4ZS5Mb2cgPSBmdW5jdGlvbiAoKSB7IH1cbiAgaGF4ZS5Mb2cuX19uYW1lX18gPSB0cnVlO1xuICBoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uICh2LCBpbmZvcykge1xuICAgIGpzLkJvb3QuX190cmFjZSh2LCBpbmZvcyk7XG4gIH1cbiAgaGF4ZS5Mb2cuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAganMuQm9vdC5fX2NsZWFyX3RyYWNlKCk7XG4gIH1cbiAgaGF4ZS5NZDUgPSBmdW5jdGlvbiAoKSB7XG4gIH07XG4gIGhheGUuTWQ1Ll9fbmFtZV9fID0gdHJ1ZTtcbiAgaGF4ZS5NZDUuZW5jb2RlID0gZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gbmV3IGhheGUuTWQ1KCkuZG9FbmNvZGUocyk7XG4gIH1cbiAgaGF4ZS5NZDUucHJvdG90eXBlID0ge1xuICAgIGRvRW5jb2RlOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICB2YXIgeCA9IHRoaXMuc3RyMmJsa3Moc3RyKTtcbiAgICAgIHZhciBhID0gMTczMjU4NDE5MztcbiAgICAgIHZhciBiID0gLTI3MTczMzg3OTtcbiAgICAgIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gICAgICB2YXIgZCA9IDI3MTczMzg3ODtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCB4Lmxlbmd0aCkge1xuICAgICAgICB2YXIgb2xkYSA9IGE7XG4gICAgICAgIHZhciBvbGRiID0gYjtcbiAgICAgICAgdmFyIG9sZGMgPSBjO1xuICAgICAgICB2YXIgb2xkZCA9IGQ7XG4gICAgICAgIHN0ZXAgPSAwO1xuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICAgICAgZCA9IHRoaXMuZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICAgICAgYSA9IHRoaXMuZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgICAgICBjID0gdGhpcy5mZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICAgICAgYiA9IHRoaXMuZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgICAgICBjID0gdGhpcy5mZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgICAgIGMgPSB0aGlzLmZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICAgICAgYiA9IHRoaXMuZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgICAgIGEgPSB0aGlzLmdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICAgICAgZCA9IHRoaXMuZ2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICAgICAgYyA9IHRoaXMuZ2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICAgICAgYiA9IHRoaXMuZ2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgICAgICBhID0gdGhpcy5nZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgICAgICBjID0gdGhpcy5nZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICAgICAgYiA9IHRoaXMuZ2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgICAgICBjID0gdGhpcy5nZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgICAgICBhID0gdGhpcy5nZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICAgICAgZCA9IHRoaXMuZ2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgICAgIGMgPSB0aGlzLmdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgICAgIGIgPSB0aGlzLmdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICAgICAgYSA9IHRoaXMuaGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICAgICAgYyA9IHRoaXMuaGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgICAgIGEgPSB0aGlzLmhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgICAgIGQgPSB0aGlzLmhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICAgICAgYSA9IHRoaXMuaGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgICAgIGQgPSB0aGlzLmhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgICAgICBjID0gdGhpcy5oaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgICAgICBiID0gdGhpcy5oaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICAgICAgZCA9IHRoaXMuaWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgICAgIGEgPSB0aGlzLmlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgICAgICBjID0gdGhpcy5paShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgICAgIGIgPSB0aGlzLmlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgICAgIGMgPSB0aGlzLmlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICAgICAgYSA9IHRoaXMuaWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgICAgICBkID0gdGhpcy5paShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgICAgIGMgPSB0aGlzLmlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICAgICAgYiA9IHRoaXMuaWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICAgICAgYSA9IHRoaXMuYWRkbWUoYSwgb2xkYSk7XG4gICAgICAgIGIgPSB0aGlzLmFkZG1lKGIsIG9sZGIpO1xuICAgICAgICBjID0gdGhpcy5hZGRtZShjLCBvbGRjKTtcbiAgICAgICAgZCA9IHRoaXMuYWRkbWUoZCwgb2xkZCk7XG4gICAgICAgIGkgKz0gMTY7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yaGV4KGEpICsgdGhpcy5yaGV4KGIpICsgdGhpcy5yaGV4KGMpICsgdGhpcy5yaGV4KGQpO1xuICAgIH1cbiAgICAsIGlpOiBmdW5jdGlvbiAoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICAgICAgcmV0dXJuIHRoaXMuY21uKHRoaXMuYml0WE9SKGMsIHRoaXMuYml0T1IoYiwgfmQpKSwgYSwgYiwgeCwgcywgdCk7XG4gICAgfVxuICAgICwgaGg6IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5jbW4odGhpcy5iaXRYT1IodGhpcy5iaXRYT1IoYiwgYyksIGQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgICB9XG4gICAgLCBnZzogZnVuY3Rpb24gKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNtbih0aGlzLmJpdE9SKHRoaXMuYml0QU5EKGIsIGQpLCB0aGlzLmJpdEFORChjLCB+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcbiAgICB9XG4gICAgLCBmZjogZnVuY3Rpb24gKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNtbih0aGlzLmJpdE9SKHRoaXMuYml0QU5EKGIsIGMpLCB0aGlzLmJpdEFORCh+YiwgZCkpLCBhLCBiLCB4LCBzLCB0KTtcbiAgICB9XG4gICAgLCBjbW46IGZ1bmN0aW9uIChxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRtZSh0aGlzLnJvbCh0aGlzLmFkZG1lKHRoaXMuYWRkbWUoYSwgcSksIHRoaXMuYWRkbWUoeCwgdCkpLCBzKSwgYik7XG4gICAgfVxuICAgICwgcm9sOiBmdW5jdGlvbiAobnVtLCBjbnQpIHtcbiAgICAgIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbiAgICB9XG4gICAgLCBzdHIyYmxrczogZnVuY3Rpb24gKHN0cikge1xuICAgICAgdmFyIG5ibGsgPSAoc3RyLmxlbmd0aCArIDggPj4gNikgKyAxO1xuICAgICAgdmFyIGJsa3MgPSBuZXcgQXJyYXkoKTtcbiAgICAgIHZhciBfZzEgPSAwLCBfZyA9IG5ibGsgKiAxNjtcbiAgICAgIHdoaWxlIChfZzEgPCBfZykge1xuICAgICAgICB2YXIgaSA9IF9nMSsrO1xuICAgICAgICBibGtzW2ldID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICBibGtzW2kgPj4gMl0gfD0gSHhPdmVycmlkZXMuY2NhKHN0ciwgaSkgPDwgKHN0ci5sZW5ndGggKiA4ICsgaSkgJSA0ICogODtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgYmxrc1tpID4+IDJdIHw9IDEyOCA8PCAoc3RyLmxlbmd0aCAqIDggKyBpKSAlIDQgKiA4O1xuICAgICAgdmFyIGwgPSBzdHIubGVuZ3RoICogODtcbiAgICAgIHZhciBrID0gbmJsayAqIDE2IC0gMjtcbiAgICAgIGJsa3Nba10gPSBsICYgMjU1O1xuICAgICAgYmxrc1trXSB8PSAobCA+Pj4gOCAmIDI1NSkgPDwgODtcbiAgICAgIGJsa3Nba10gfD0gKGwgPj4+IDE2ICYgMjU1KSA8PCAxNjtcbiAgICAgIGJsa3Nba10gfD0gKGwgPj4+IDI0ICYgMjU1KSA8PCAyNDtcbiAgICAgIHJldHVybiBibGtzO1xuICAgIH1cbiAgICAsIHJoZXg6IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgIHZhciBzdHIgPSBcIlwiO1xuICAgICAgdmFyIGhleF9jaHIgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbiAgICAgIHZhciBfZyA9IDA7XG4gICAgICB3aGlsZSAoX2cgPCA0KSB7XG4gICAgICAgIHZhciBqID0gX2crKztcbiAgICAgICAgc3RyICs9IGhleF9jaHIuY2hhckF0KG51bSA+PiBqICogOCArIDQgJiAxNSkgKyBoZXhfY2hyLmNoYXJBdChudW0gPj4gaiAqIDggJiAxNSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAsIGFkZG1lOiBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgdmFyIGxzdyA9ICh4ICYgNjU1MzUpICsgKHkgJiA2NTUzNSk7XG4gICAgICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gICAgICByZXR1cm4gbXN3IDw8IDE2IHwgbHN3ICYgNjU1MzU7XG4gICAgfVxuICAgICwgYml0QU5EOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgdmFyIGxzYiA9IGEgJiAxICYgKGIgJiAxKTtcbiAgICAgIHZhciBtc2IzMSA9IGEgPj4+IDEgJiBiID4+PiAxO1xuICAgICAgcmV0dXJuIG1zYjMxIDw8IDEgfCBsc2I7XG4gICAgfVxuICAgICwgYml0WE9SOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgdmFyIGxzYiA9IGEgJiAxIF4gYiAmIDE7XG4gICAgICB2YXIgbXNiMzEgPSBhID4+PiAxIF4gYiA+Pj4gMTtcbiAgICAgIHJldHVybiBtc2IzMSA8PCAxIHwgbHNiO1xuICAgIH1cbiAgICAsIGJpdE9SOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgdmFyIGxzYiA9IGEgJiAxIHwgYiAmIDE7XG4gICAgICB2YXIgbXNiMzEgPSBhID4+PiAxIHwgYiA+Pj4gMTtcbiAgICAgIHJldHVybiBtc2IzMSA8PCAxIHwgbHNiO1xuICAgIH1cbiAgICAsIF9fY2xhc3NfXzogaGF4ZS5NZDVcbiAgfVxuICBoYXhlLlRpbWVyID0gZnVuY3Rpb24gKHRpbWVfbXMpIHtcbiAgICB2YXIgbWUgPSB0aGlzO1xuICAgIHRoaXMuaWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgbWUucnVuKCk7XG4gICAgfSwgdGltZV9tcyk7XG4gIH07XG4gIGhheGUuVGltZXIuX19uYW1lX18gPSB0cnVlO1xuICBoYXhlLlRpbWVyLmRlbGF5ID0gZnVuY3Rpb24gKGYsIHRpbWVfbXMpIHtcbiAgICB2YXIgdCA9IG5ldyBoYXhlLlRpbWVyKHRpbWVfbXMpO1xuICAgIHQucnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgdC5zdG9wKCk7XG4gICAgICBmKCk7XG4gICAgfTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICBoYXhlLlRpbWVyLm1lYXN1cmUgPSBmdW5jdGlvbiAoZiwgcG9zKSB7XG4gICAgdmFyIHQwID0gaGF4ZS5UaW1lci5zdGFtcCgpO1xuICAgIHZhciByID0gZigpO1xuICAgIGhheGUuTG9nLnRyYWNlKGhheGUuVGltZXIuc3RhbXAoKSAtIHQwICsgXCJzXCIsIHBvcyk7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgaGF4ZS5UaW1lci5zdGFtcCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xuICB9XG4gIGhheGUuVGltZXIucHJvdG90eXBlID0ge1xuICAgIHJ1bjogZnVuY3Rpb24gKCkge1xuICAgIH1cbiAgICAsIHN0b3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLmlkID09IG51bGwpIHJldHVybjtcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuaWQpO1xuICAgICAgdGhpcy5pZCA9IG51bGw7XG4gICAgfVxuICAgICwgX19jbGFzc19fOiBoYXhlLlRpbWVyXG4gIH1cbiAgdmFyIGpzID0ganMgfHwge31cbiAganMuQm9vdCA9IGZ1bmN0aW9uICgpIHsgfVxuICBqcy5Cb290Ll9fbmFtZV9fID0gdHJ1ZTtcbiAganMuQm9vdC5fX3VuaHRtbCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMuc3BsaXQoXCImXCIpLmpvaW4oXCImYW1wO1wiKS5zcGxpdChcIjxcIikuam9pbihcIiZsdDtcIikuc3BsaXQoXCI+XCIpLmpvaW4oXCImZ3Q7XCIpO1xuICB9XG4gIGpzLkJvb3QuX190cmFjZSA9IGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgdmFyIG1zZyA9IGkgIT0gbnVsbCA/IGkuZmlsZU5hbWUgKyBcIjpcIiArIGkubGluZU51bWJlciArIFwiOiBcIiA6IFwiXCI7XG4gICAgbXNnICs9IGpzLkJvb3QuX19zdHJpbmdfcmVjKHYsIFwiXCIpO1xuICAgIHZhciBkO1xuICAgIGlmICh0eXBlb2YgKGRvY3VtZW50KSAhPSBcInVuZGVmaW5lZFwiICYmIChkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoYXhlOnRyYWNlXCIpKSAhPSBudWxsKSBkLmlubmVySFRNTCArPSBqcy5Cb290Ll9fdW5odG1sKG1zZykgKyBcIjxici8+XCI7IGVsc2UgaWYgKHR5cGVvZiAoY29uc29sZSkgIT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLmxvZyAhPSBudWxsKSBjb25zb2xlLmxvZyhtc2cpO1xuICB9XG4gIGpzLkJvb3QuX19jbGVhcl90cmFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGF4ZTp0cmFjZVwiKTtcbiAgICBpZiAoZCAhPSBudWxsKSBkLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cbiAganMuQm9vdC5pc0NsYXNzID0gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gby5fX25hbWVfXztcbiAgfVxuICBqcy5Cb290LmlzRW51bSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUuX19lbmFtZV9fO1xuICB9XG4gIGpzLkJvb3QuZ2V0Q2xhc3MgPSBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvLl9fY2xhc3NfXztcbiAgfVxuICBqcy5Cb290Ll9fc3RyaW5nX3JlYyA9IGZ1bmN0aW9uIChvLCBzKSB7XG4gICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIFwibnVsbFwiO1xuICAgIGlmIChzLmxlbmd0aCA+PSA1KSByZXR1cm4gXCI8Li4uPlwiO1xuICAgIHZhciB0ID0gdHlwZW9mIChvKTtcbiAgICBpZiAodCA9PSBcImZ1bmN0aW9uXCIgJiYgKG8uX19uYW1lX18gfHwgby5fX2VuYW1lX18pKSB0ID0gXCJvYmplY3RcIjtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGlmIChvLl9fZW51bV9fKSB7XG4gICAgICAgICAgICBpZiAoby5sZW5ndGggPT0gMikgcmV0dXJuIG9bMF07XG4gICAgICAgICAgICB2YXIgc3RyID0gb1swXSArIFwiKFwiO1xuICAgICAgICAgICAgcyArPSBcIlxcdFwiO1xuICAgICAgICAgICAgdmFyIF9nMSA9IDIsIF9nID0gby5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoX2cxIDwgX2cpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSBfZzErKztcbiAgICAgICAgICAgICAgaWYgKGkgIT0gMikgc3RyICs9IFwiLFwiICsganMuQm9vdC5fX3N0cmluZ19yZWMob1tpXSwgcyk7IGVsc2Ugc3RyICs9IGpzLkJvb3QuX19zdHJpbmdfcmVjKG9baV0sIHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0ciArIFwiKVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbCA9IG8ubGVuZ3RoO1xuICAgICAgICAgIHZhciBpO1xuICAgICAgICAgIHZhciBzdHIgPSBcIltcIjtcbiAgICAgICAgICBzICs9IFwiXFx0XCI7XG4gICAgICAgICAgdmFyIF9nID0gMDtcbiAgICAgICAgICB3aGlsZSAoX2cgPCBsKSB7XG4gICAgICAgICAgICB2YXIgaTEgPSBfZysrO1xuICAgICAgICAgICAgc3RyICs9IChpMSA+IDAgPyBcIixcIiA6IFwiXCIpICsganMuQm9vdC5fX3N0cmluZ19yZWMob1tpMV0sIHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdHIgKz0gXCJdXCI7XG4gICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG9zdHI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9zdHIgPSBvLnRvU3RyaW5nO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPz8/XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvc3RyICE9IG51bGwgJiYgdG9zdHIgIT0gT2JqZWN0LnRvU3RyaW5nKSB7XG4gICAgICAgICAgdmFyIHMyID0gby50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChzMiAhPSBcIltvYmplY3QgT2JqZWN0XVwiKSByZXR1cm4gczI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGsgPSBudWxsO1xuICAgICAgICB2YXIgc3RyID0gXCJ7XFxuXCI7XG4gICAgICAgIHMgKz0gXCJcXHRcIjtcbiAgICAgICAgdmFyIGhhc3AgPSBvLmhhc093blByb3BlcnR5ICE9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGsgaW4gbykge1xuICAgICAgICAgIDtcbiAgICAgICAgICBpZiAoaGFzcCAmJiAhby5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChrID09IFwicHJvdG90eXBlXCIgfHwgayA9PSBcIl9fY2xhc3NfX1wiIHx8IGsgPT0gXCJfX3N1cGVyX19cIiB8fCBrID09IFwiX19pbnRlcmZhY2VzX19cIiB8fCBrID09IFwiX19wcm9wZXJ0aWVzX19cIikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHIubGVuZ3RoICE9IDIpIHN0ciArPSBcIiwgXFxuXCI7XG4gICAgICAgICAgc3RyICs9IHMgKyBrICsgXCIgOiBcIiArIGpzLkJvb3QuX19zdHJpbmdfcmVjKG9ba10sIHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTtcbiAgICAgICAgc3RyICs9IFwiXFxuXCIgKyBzICsgXCJ9XCI7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgcmV0dXJuIFwiPGZ1bmN0aW9uPlwiO1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gbztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBTdHJpbmcobyk7XG4gICAgfVxuICB9XG4gIGpzLkJvb3QuX19pbnRlcmZMb29wID0gZnVuY3Rpb24gKGNjLCBjbCkge1xuICAgIGlmIChjYyA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGNjID09IGNsKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgaW50ZiA9IGNjLl9faW50ZXJmYWNlc19fO1xuICAgIGlmIChpbnRmICE9IG51bGwpIHtcbiAgICAgIHZhciBfZzEgPSAwLCBfZyA9IGludGYubGVuZ3RoO1xuICAgICAgd2hpbGUgKF9nMSA8IF9nKSB7XG4gICAgICAgIHZhciBpID0gX2cxKys7XG4gICAgICAgIHZhciBpMSA9IGludGZbaV07XG4gICAgICAgIGlmIChpMSA9PSBjbCB8fCBqcy5Cb290Ll9faW50ZXJmTG9vcChpMSwgY2wpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGpzLkJvb3QuX19pbnRlcmZMb29wKGNjLl9fc3VwZXJfXywgY2wpO1xuICB9XG4gIGpzLkJvb3QuX19pbnN0YW5jZW9mID0gZnVuY3Rpb24gKG8sIGNsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChvIGluc3RhbmNlb2YgY2wpIHtcbiAgICAgICAgaWYgKGNsID09IEFycmF5KSByZXR1cm4gby5fX2VudW1fXyA9PSBudWxsO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChqcy5Cb290Ll9faW50ZXJmTG9vcChvLl9fY2xhc3NfXywgY2wpKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoY2wgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGNsKSB7XG4gICAgICBjYXNlIEludDpcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChvICUgMjE0NzQ4MzY0OC4wKSA9PT0gbztcbiAgICAgIGNhc2UgRmxvYXQ6XG4gICAgICAgIHJldHVybiB0eXBlb2YgKG8pID09IFwibnVtYmVyXCI7XG4gICAgICBjYXNlIEJvb2w6XG4gICAgICAgIHJldHVybiBvID09PSB0cnVlIHx8IG8gPT09IGZhbHNlO1xuICAgICAgY2FzZSBTdHJpbmc6XG4gICAgICAgIHJldHVybiB0eXBlb2YgKG8pID09IFwic3RyaW5nXCI7XG4gICAgICBjYXNlIER5bmFtaWM6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoY2wgPT0gQ2xhc3MgJiYgby5fX25hbWVfXyAhPSBudWxsKSByZXR1cm4gdHJ1ZTsgZWxzZSBudWxsO1xuICAgICAgICBpZiAoY2wgPT0gRW51bSAmJiBvLl9fZW5hbWVfXyAhPSBudWxsKSByZXR1cm4gdHJ1ZTsgZWxzZSBudWxsO1xuICAgICAgICByZXR1cm4gby5fX2VudW1fXyA9PSBjbDtcbiAgICB9XG4gIH1cbiAganMuQm9vdC5fX2Nhc3QgPSBmdW5jdGlvbiAobywgdCkge1xuICAgIGlmIChqcy5Cb290Ll9faW5zdGFuY2VvZihvLCB0KSkgcmV0dXJuIG87IGVsc2UgdGhyb3cgXCJDYW5ub3QgY2FzdCBcIiArIFN0ZC5zdHJpbmcobykgKyBcIiB0byBcIiArIFN0ZC5zdHJpbmcodCk7XG4gIH1cbiAganMuTGliID0gZnVuY3Rpb24gKCkgeyB9XG4gIGpzLkxpYi5fX25hbWVfXyA9IHRydWU7XG4gIGpzLkxpYi5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Z2dlcjtcbiAgfVxuICBqcy5MaWIuYWxlcnQgPSBmdW5jdGlvbiAodikge1xuICAgIGFsZXJ0KGpzLkJvb3QuX19zdHJpbmdfcmVjKHYsIFwiXCIpKTtcbiAgfVxuICBqcy5MaWIuZXZhbCA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgcmV0dXJuIGV2YWwoY29kZSk7XG4gIH1cbiAganMuTGliLnNldEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChmKSB7XG4gICAganMuTGliLm9uZXJyb3IgPSBmO1xuICB9XG4gIHZhciAkXztcbiAgZnVuY3Rpb24gJGJpbmQobywgbSkgeyB2YXIgZiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGYubWV0aG9kLmFwcGx5KGYuc2NvcGUsIGFyZ3VtZW50cyk7IH07IGYuc2NvcGUgPSBvOyBmLm1ldGhvZCA9IG07IHJldHVybiBmOyB9O1xuICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIEh4T3ZlcnJpZGVzLnJlbW92ZSA9IGZ1bmN0aW9uIChhLCBvKSB7XG4gICAgdmFyIGkgPSBhLmluZGV4T2Yobyk7XG4gICAgaWYgKGkgPT0gLTEpIHJldHVybiBmYWxzZTtcbiAgICBhLnNwbGljZShpLCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTsgZWxzZSBudWxsO1xuICBNYXRoLl9fbmFtZV9fID0gW1wiTWF0aFwiXTtcbiAgTWF0aC5OYU4gPSBOdW1iZXIuTmFOO1xuICBNYXRoLk5FR0FUSVZFX0lORklOSVRZID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICBNYXRoLlBPU0lUSVZFX0lORklOSVRZID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBNYXRoLmlzRmluaXRlID0gZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gaXNGaW5pdGUoaSk7XG4gIH07XG4gIE1hdGguaXNOYU4gPSBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpc05hTihpKTtcbiAgfTtcbiAgU3RyaW5nLnByb3RvdHlwZS5fX2NsYXNzX18gPSBTdHJpbmc7XG4gIFN0cmluZy5fX25hbWVfXyA9IHRydWU7XG4gIEFycmF5LnByb3RvdHlwZS5fX2NsYXNzX18gPSBBcnJheTtcbiAgQXJyYXkuX19uYW1lX18gPSB0cnVlO1xuICBEYXRlLnByb3RvdHlwZS5fX2NsYXNzX18gPSBEYXRlO1xuICBEYXRlLl9fbmFtZV9fID0gW1wiRGF0ZVwiXTtcbiAgdmFyIEludCA9IHsgX19uYW1lX186IFtcIkludFwiXSB9O1xuICB2YXIgRHluYW1pYyA9IHsgX19uYW1lX186IFtcIkR5bmFtaWNcIl0gfTtcbiAgdmFyIEZsb2F0ID0gTnVtYmVyO1xuICBGbG9hdC5fX25hbWVfXyA9IFtcIkZsb2F0XCJdO1xuICB2YXIgQm9vbCA9IEJvb2xlYW47XG4gIEJvb2wuX19lbmFtZV9fID0gW1wiQm9vbFwiXTtcbiAgdmFyIENsYXNzID0geyBfX25hbWVfXzogW1wiQ2xhc3NcIl0gfTtcbiAgdmFyIEVudW0gPSB7fTtcbiAgdmFyIFZvaWQgPSB7IF9fZW5hbWVfXzogW1wiVm9pZFwiXSB9O1xuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9IFwidW5kZWZpbmVkXCIpIGpzLkxpYi5kb2N1bWVudCA9IGRvY3VtZW50O1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAganMuTGliLndpbmRvdyA9IHdpbmRvdztcbiAgICBqcy5MaWIud2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbiAobXNnLCB1cmwsIGxpbmUpIHtcbiAgICAgIHZhciBmID0ganMuTGliLm9uZXJyb3I7XG4gICAgICBpZiAoZiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gZihtc2csIFt1cmwgKyBcIjpcIiArIGxpbmVdKTtcbiAgICB9O1xuICB9XG4gIGNvbS53aXJpcy5qcy5Kc1BsdWdpblRvb2xzLm1haW4oKTtcbn0oKSk7XG5kZWxldGUgQXJyYXkucHJvdG90eXBlLl9fY2xhc3NfXztcbi8vIEBjb2RpbmdTdGFuZGFyZHNJZ25vcmVFbmRcbiIsImltcG9ydCBVdGlsIGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgTGF0ZXggZnJvbSAnLi9sYXRleCc7XG5pbXBvcnQgTWF0aE1MIGZyb20gJy4vbWF0aG1sJztcbmltcG9ydCBJbWFnZSBmcm9tICcuL2ltYWdlJztcbmltcG9ydCBBY2Nlc3NpYmlsaXR5IGZyb20gJy4vYWNjZXNzaWJpbGl0eSc7XG5pbXBvcnQgU2VydmljZVByb3ZpZGVyIGZyb20gJy4vc2VydmljZXByb3ZpZGVyJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gJy4vY29uc3RhbnRzJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IG1kNSBmcm9tICcuL21kNSc7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogVGhpcyBjbGFzcyByZXByZXNlbnQgYSBNYWhNTCBwYXJzZXIuIENvbnZlcnRzIE1hdGhNTCBpbnRvIGZvcm11bGFzIGRlcGVuZGluZyBvbiB0aGVcbiAqIGltYWdlIGZvcm1hdCAoU1ZHLCBQTkcsIGJhc2U2NCkgYW5kIHRoZSBzYXZlIG1vZGUgKFhNTCwgc2FmZVhNTCwgSW1hZ2UpIGNvbmZpZ3VyZWRcbiAqIGluIHRoZSBiYWNrZW5kLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXIge1xuICAvKipcbiAgICogQ29udmVydHMgYSBNYXRoTUwgc3RyaW5nIHRvIGFuIGltZyBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0RvY3VtZW50fSBjcmVhdG9yIC0gRG9jdW1lbnQgb2JqZWN0IHRvIGNhbGwgY3JlYXRlRWxlbWVudCBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRobWwgLSBNYXRoTUwgY29kZVxuICAgKiBAcGFyYW0ge09iamVjdFtdfSB3aXJpc1Byb3BlcnRpZXMgLSBvYmplY3QgY29udGFpbmluZyBXSVJJUyBjdXN0b20gcHJvcGVydGllc1xuICAgKiBAcGFyYW0ge2xhbmd1YWdlfSBsYW5ndWFnZSAtIGN1c3RvbSBsYW5ndWFnZSBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICogQHJldHVybnMge0hUTUxJbWFnZUVsZW1lbnR9IHRoZSBmb3JtdWxhIGltYWdlIGNvcnJlc3BvbmRpbmcgdG8gaW5pdGlhbCBNYXRoTUwgc3RyaW5nLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgbWF0aG1sVG9JbWdPYmplY3QoY3JlYXRvciwgbWF0aG1sLCB3aXJpc1Byb3BlcnRpZXMsIGxhbmd1YWdlKSB7XG4gICAgY29uc3QgaW1nT2JqZWN0ID0gY3JlYXRvci5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICBpbWdPYmplY3QuYWxpZ24gPSAnbWlkZGxlJztcbiAgICBpbWdPYmplY3Quc3R5bGUubWF4V2lkdGggPSAnbm9uZSc7XG4gICAgbGV0IGRhdGEgPSB3aXJpc1Byb3BlcnRpZXMgfHwge307XG5cbiAgICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGUgYmFja2VuZCBjb25maWdcbiAgICBjb25zdCB3aXJpc0VkaXRvclByb3BlcnRpZXMgPSBDb25maWd1cmF0aW9uLmdldChcImVkaXRvclBhcmFtZXRlcnNcIik7XG4gICAgZGF0YSA9IHsgLi4ud2lyaXNFZGl0b3JQcm9wZXJ0aWVzLCAuLi5kYXRhIH07XG5cbiAgICBkYXRhLm1tbCA9IG1hdGhtbDtcbiAgICBkYXRhLmxhbmcgPSBsYW5ndWFnZTtcbiAgICAvLyBSZXF1ZXN0IG1ldHJpY3Mgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZS5cbiAgICBkYXRhLm1ldHJpY3MgPSAndHJ1ZSc7XG4gICAgZGF0YS5jZW50ZXJiYXNlbGluZSA9ICdmYWxzZSc7XG5cbiAgICAvLyBGdWxsIGJhc2U2NCBtZXRob2QgKGVkaXQgJiBzYXZlKS5cbiAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVNb2RlJykgPT09ICdiYXNlNjQnICYmIENvbmZpZ3VyYXRpb24uZ2V0KCdiYXNlNjRzYXZlbW9kZScpID09PSAnZGVmYXVsdCcpIHtcbiAgICAgIGRhdGEuYmFzZTY0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIganMgcGFyYW1zOiBfd3JzX2ludF93aXJpc1Byb3BlcnRpZXMgY29udGFpbnMgc29tZSBqcyByZW5kZXIgcGFyYW1zLlxuICAgIC8vIFNpbmNlIE1hdGhNTCBjYW4gc3VwcG9ydCByZW5kZXIgcGFyYW1zLCBqcyBwYXJhbXMgc2hvdWxkIGJlIHNlbmQgb25seSB0byBlZGl0b3IuXG5cbiAgICBpbWdPYmplY3QuY2xhc3NOYW1lID0gQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlQ2xhc3NOYW1lJyk7XG5cbiAgICBpZiAobWF0aG1sLmluZGV4T2YoJ2NsYXNzPVwiJykgIT09IC0xKSB7XG4gICAgICAvLyBXZSBjaGVjayBoZXJlIGlmIHRoZSBNYXRoTUwgaGFzIGJlZW4gY3JlYXRlZCBmcm9tIGEgY3VzdG9tRWRpdG9yIChzdWNoIGNoZW1pc3RyeSlcbiAgICAgIC8vIHRvIGFkZCBjdXN0b20gZWRpdG9yIG5hbWUgYXR0cmlidXRlIHRvIGltZyBvYmplY3QgKGlmIG5lY2Vzc2FyeSkuXG4gICAgICBsZXQgbWF0aG1sU3Vic3RyaW5nID0gbWF0aG1sLnN1YnN0cmluZyhtYXRobWwuaW5kZXhPZignY2xhc3M9XCInKSArICdjbGFzcz1cIicubGVuZ3RoLCBtYXRobWwubGVuZ3RoKTtcbiAgICAgIG1hdGhtbFN1YnN0cmluZyA9IG1hdGhtbFN1YnN0cmluZy5zdWJzdHJpbmcoMCwgbWF0aG1sU3Vic3RyaW5nLmluZGV4T2YoJ1wiJykpO1xuICAgICAgbWF0aG1sU3Vic3RyaW5nID0gbWF0aG1sU3Vic3RyaW5nLnN1YnN0cmluZyg0LCBtYXRobWxTdWJzdHJpbmcubGVuZ3RoKTtcbiAgICAgIGltZ09iamVjdC5zZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlQ3VzdG9tRWRpdG9yTmFtZScpLCBtYXRobWxTdWJzdHJpbmcpO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1hbmNlIGVuYWJsZWQuXG4gICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCd3aXJpc1BsdWdpblBlcmZvcm1hbmNlJykgJiYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAneG1sJyB8fCBDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSA9PT0gJ3NhZmVYbWwnKSkge1xuICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoUGFyc2VyLmNyZWF0ZVNob3dJbWFnZVNyYyhkYXRhLCBsYW5ndWFnZSkpO1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICd3YXJuaW5nJykge1xuICAgICAgICAvLyBQT1NUIGNhbGwuXG4gICAgICAgIC8vIGlmIHRoZSBtYXRobWwgaXMgbWFsZm9ybWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoU2VydmljZVByb3ZpZGVyLmdldFNlcnZpY2UoJ3Nob3dpbWFnZScsIGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoeyByZXN1bHQgfSA9IHJlc3VsdCk7XG4gICAgICBpZiAocmVzdWx0LmZvcm1hdCA9PT0gJ3BuZycpIHtcbiAgICAgICAgaW1nT2JqZWN0LnNyYyA9IGBkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtyZXN1bHQuY29udGVudH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW1nT2JqZWN0LnNyYyA9IGBkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGY4LCR7VXRpbC51cmxFbmNvZGUocmVzdWx0LmNvbnRlbnQpfWA7XG4gICAgICB9XG4gICAgICBpbWdPYmplY3Quc2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZU1hdGhtbEF0dHJpYnV0ZScpLCBNYXRoTUwuc2FmZVhtbEVuY29kZShtYXRobWwpKTtcbiAgICAgIEltYWdlLnNldEltZ1NpemUoaW1nT2JqZWN0LCByZXN1bHQuY29udGVudCwgdHJ1ZSk7XG5cbiAgICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnZW5hYmxlQWNjZXNzaWJpbGl0eScpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0LmFsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpbWdPYmplY3QuYWx0ID0gQWNjZXNzaWJpbGl0eS5tYXRoTUxUb0FjY2Vzc2libGUobWF0aG1sLCBsYW5ndWFnZSwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW1nT2JqZWN0LmFsdCA9IHJlc3VsdC5hbHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gUGFyc2VyLmNyZWF0ZUltYWdlU3JjKG1hdGhtbCwgZGF0YSk7XG4gICAgICBpbWdPYmplY3Quc2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZU1hdGhtbEF0dHJpYnV0ZScpLCBNYXRoTUwuc2FmZVhtbEVuY29kZShtYXRobWwpKTtcbiAgICAgIGltZ09iamVjdC5zcmMgPSByZXN1bHQ7XG4gICAgICBJbWFnZS5zZXRJbWdTaXplKGltZ09iamVjdCwgcmVzdWx0LCBDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSA9PT0gJ2Jhc2U2NCcgJiYgQ29uZmlndXJhdGlvbi5nZXQoJ2Jhc2U2NHNhdmVtb2RlJykgPT09ICdkZWZhdWx0Jyk7XG4gICAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ2VuYWJsZUFjY2Vzc2liaWxpdHknKSkge1xuICAgICAgICBpbWdPYmplY3QuYWx0ID0gQWNjZXNzaWJpbGl0eS5tYXRoTUxUb0FjY2Vzc2libGUobWF0aG1sLCBsYW5ndWFnZSwgZGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBQYXJzZXIub2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBQYXJzZXIub2JzZXJ2ZXIub2JzZXJ2ZShpbWdPYmplY3QpO1xuICAgIH1cblxuICAgIC8vIFJvbGUgbWF0aCBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEvcm9sZXMjbWF0aC5cbiAgICBpbWdPYmplY3Quc2V0QXR0cmlidXRlKCdyb2xlJywgJ21hdGgnKTtcbiAgICByZXR1cm4gaW1nT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNvdXJjZSB0byBzaG93aW1hZ2Ugc2VydmljZSBieSBjYWxsaW5nIGNyZWF0ZWltYWdlIHNlcnZpY2UuIFRoZVxuICAgKiBvdXRwdXQgb2YgdGhlIGNyZWF0ZWltYWdlIHNlcnZpY2UgaXMgYSBVUkwgcGF0aCBwb2ludGluZyB0byBzaG93aW1hZ2Ugc2VydmljZS5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gcGVyZm9ybWFuY2UgaXMgZGlzYWJsZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRobWwgLSBNYXRoTUwgY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3RbXX0gZGF0YSAtIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmcgc2VydmljZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgc2hvd2ltYWdlIHBhdGguXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW1hZ2VTcmMobWF0aG1sLCBkYXRhKSB7XG4gICAgLy8gRnVsbCBiYXNlNjQgbWV0aG9kIChlZGl0ICYgc2F2ZSkuXG4gICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAnYmFzZTY0JyAmJiBDb25maWd1cmF0aW9uLmdldCgnYmFzZTY0c2F2ZW1vZGUnKSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICBkYXRhLmJhc2U2NCA9IHRydWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IFNlcnZpY2VQcm92aWRlci5nZXRTZXJ2aWNlKCdjcmVhdGVpbWFnZScsIGRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdC5pbmRleE9mKCdAQkFTRUAnKSAhPT0gLTEpIHtcbiAgICAgIC8vIFJlcGxhY2luZyAnQEJBU0VAJyB3aXRoIHRoZSBiYXNlIFVSTCBvZiBjcmVhdGVpbWFnZS5cbiAgICAgIGNvbnN0IGJhc2VQYXJ0cyA9IFNlcnZpY2VQcm92aWRlci5nZXRTZXJ2aWNlUGF0aCgnY3JlYXRlaW1hZ2UnKS5zcGxpdCgnLycpO1xuICAgICAgYmFzZVBhcnRzLnBvcCgpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnNwbGl0KCdAQkFTRUAnKS5qb2luKGJhc2VQYXJ0cy5qb2luKCcvJykpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGluaXRpYWwgSFRNTCBjb2RlLiBJZiB0aGUgSFRNTCBjb250YWlucyBkYXRhIGdlbmVyYXRlZCBieSBXSVJJUyxcbiAgICogdGhpcyBkYXRhIHdvdWxkIGJlIGNvbnZlcnRlZCBhcyBmb2xsb3dpbmc6XG4gICAqIDxwcmU+XG4gICAqIE1hdGhNTCBjb2RlOiBJbWFnZSBjb250YWluaW5nIHRoZSBjb3JyZXNwb25kaW5nIE1hdGhNTCBmb3JtdWxhcy5cbiAgICogTWF0aE1MIGNvZGUgd2l0aCBMYVRlWCBhbm5vdGF0aW9uIDogTGFUZVggc3RyaW5nLlxuICAgKiA8L3ByZT5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSBIVE1MIGNvZGUgY29udGFpbmluZyBNYXRoTUwgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gbGFuZ3VhZ2UgdG8gY3JlYXRlIGltYWdlIGFsdCB0ZXh0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBIVE1MIGNvZGUgd2l0aCB0aGUgb3JpZ2luYWwgTWF0aE1MIGNvbnZlcnRlZCBpbnRvIExhVGVYIGFuZCBpbWFnZXMuXG4gICAqL1xuICBzdGF0aWMgaW5pdFBhcnNlKGNvZGUsIGxhbmd1YWdlKSB7XG4gICAgLyogTm90ZTogVGhlIGNvZGUgaW5zaWRlIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gaW52ZXJ0ZWQuXG4gICAgSWYgeW91IGludmVydCBhZ2FpbiB0aGUgY29kZSB0aGVuIHlvdSBjYW5ub3QgdXNlIGNvcnJlY3RseSBMYVRlWFxuICAgIGluIE1vb2RsZS5cbiAgICAqL1xuICAgIGNvZGUgPSBQYXJzZXIuaW5pdFBhcnNlU2F2ZU1vZGUoY29kZSwgbGFuZ3VhZ2UpO1xuICAgIHJldHVybiBQYXJzZXIuaW5pdFBhcnNlRWRpdE1vZGUoY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGluaXRpYWwgSFRNTCBjb2RlIGRlcGVuZGluZyBvbiB0aGUgc2F2ZSBtb2RlLiBUcmFuc2Zvcm1zIGFsbCBNYXRoTUxcbiAgICogb2NjdXJyZW5jZXMgZm9yIGl0J3MgY29ycmVzcG9uZGVudCBpbWFnZSBvciBMYVRlWC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSBIVE1MIGNvZGUgdG8gYmUgcGFyc2VkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIGxhbmd1YWdlIHRvIGNyZWF0ZSBpbWFnZSBhbHQgdGV4dC5cbiAgICogQHJldHVybnMge3N0cmluZ30gSFRNTCBjb2RlIHBhcnNlZC5cbiAgICovXG4gIHN0YXRpYyBpbml0UGFyc2VTYXZlTW9kZShjb2RlLCBsYW5ndWFnZSkge1xuICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSkge1xuICAgICAgLy8gQ29udmVydGluZyBYTUwgdG8gdGFncy5cbiAgICAgIGNvZGUgPSBMYXRleC5wYXJzZU1hdGhtbFRvTGF0ZXgoY29kZSwgQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzKTtcbiAgICAgIGNvZGUgPSBMYXRleC5wYXJzZU1hdGhtbFRvTGF0ZXgoY29kZSwgQ29uc3RhbnRzLnhtbENoYXJhY3RlcnMpO1xuICAgICAgY29kZSA9IFBhcnNlci5wYXJzZU1hdGhtbFRvSW1nKGNvZGUsIENvbnN0YW50cy5zYWZlWG1sQ2hhcmFjdGVycywgbGFuZ3VhZ2UpO1xuICAgICAgY29kZSA9IFBhcnNlci5wYXJzZU1hdGhtbFRvSW1nKGNvZGUsIENvbnN0YW50cy54bWxDaGFyYWN0ZXJzLCBsYW5ndWFnZSk7XG4gICAgICBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVNb2RlJykgPT09ICdiYXNlNjQnICYmIENvbmZpZ3VyYXRpb24uZ2V0KCdiYXNlNjRzYXZlbW9kZScpID09PSAnaW1hZ2UnKSB7XG4gICAgICAgIGNvZGUgPSBQYXJzZXIuY29kZUltZ1RyYW5zZm9ybShjb2RlLCAnYmFzZTY0MnNob3dpbWFnZScpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgaW5pdGlhbCBIVE1MIGNvZGUgZGVwZW5kaW5nIG9uIHRoZSBlZGl0IG1vZGUuXG4gICAqIElmICdsYXRleCcgcGFyc2VNb2RlIGlzIGVuYWJsZWQgYWxsIE1hdGhNTCBjb250YWluaW5nIGFuIGFubm90YXRpb24gd2l0aCBlbmNvZGluZz0nTGFUZVgnIHdpbGxcbiAgICogYmUgY29udmVydGVkIGludG8gYSBMYVRlWCBzdHJpbmcgaW5zdGVhZCBvZiBhbiBpbWFnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSBIVE1MIGNvZGUgY29udGFpbmluZyBNYXRoTUwuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHBhcnNlZCBIVE1MIGNvZGUuXG4gICAqL1xuICBzdGF0aWMgaW5pdFBhcnNlRWRpdE1vZGUoY29kZSkge1xuICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgncGFyc2VNb2RlcycpLmluZGV4T2YoJ2xhdGV4JykgIT09IC0xKSB7XG4gICAgICBjb25zdCBpbWdMaXN0ID0gVXRpbC5nZXRFbGVtZW50c0J5TmFtZUZyb21TdHJpbmcoY29kZSwgJ2ltZycsIHRydWUpO1xuICAgICAgY29uc3QgdG9rZW4gPSAnZW5jb2Rpbmc9XCJMYVRlWFwiPic7XG4gICAgICAvLyBXaGlsZSByZXBsYWNpbmcgaW1hZ2VzIHdpdGggbGF0ZXgsIHRoZSBpbmRleGVzIG9mIHRoZSBmb3VuZCBpbWFnZXMgY2hhbmdlc1xuICAgICAgLy8gcmVzcGVjdGluZyB0aGUgb3JpZ2luYWwgY29kZSwgc28gdGhpcyBjYXJyeSBpcyBuZWVkZWQuXG4gICAgICBsZXQgY2FycnkgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltZ0xpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgaW1nQ29kZSA9IGNvZGUuc3Vic3RyaW5nKGltZ0xpc3RbaV0uc3RhcnQgKyBjYXJyeSwgaW1nTGlzdFtpXS5lbmQgKyBjYXJyeSk7XG5cbiAgICAgICAgaWYgKGltZ0NvZGUuaW5kZXhPZihgIGNsYXNzPVwiJHtDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VDbGFzc05hbWUnKX1cImApICE9PSAtMSkge1xuICAgICAgICAgIGxldCBtYXRobWxTdGFydFRva2VuID0gYCAke0NvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZU1hdGhtbEF0dHJpYnV0ZScpfT1cImA7XG4gICAgICAgICAgbGV0IG1hdGhtbFN0YXJ0ID0gaW1nQ29kZS5pbmRleE9mKG1hdGhtbFN0YXJ0VG9rZW4pO1xuXG4gICAgICAgICAgaWYgKG1hdGhtbFN0YXJ0ID09PSAtMSkge1xuICAgICAgICAgICAgbWF0aG1sU3RhcnRUb2tlbiA9ICcgYWx0PVwiJztcbiAgICAgICAgICAgIG1hdGhtbFN0YXJ0ID0gaW1nQ29kZS5pbmRleE9mKG1hdGhtbFN0YXJ0VG9rZW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtYXRobWxTdGFydCAhPT0gLTEpIHtcbiAgICAgICAgICAgIG1hdGhtbFN0YXJ0ICs9IG1hdGhtbFN0YXJ0VG9rZW4ubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbWF0aG1sRW5kID0gaW1nQ29kZS5pbmRleE9mKCdcIicsIG1hdGhtbFN0YXJ0KTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGhtbCA9IFV0aWwuaHRtbFNhbml0aXplKE1hdGhNTC5zYWZlWG1sRGVjb2RlKGltZ0NvZGUuc3Vic3RyaW5nKG1hdGhtbFN0YXJ0LCBtYXRobWxFbmQpKSk7XG4gICAgICAgICAgICBsZXQgbGF0ZXhTdGFydFBvc2l0aW9uID0gbWF0aG1sLmluZGV4T2YodG9rZW4pO1xuXG4gICAgICAgICAgICBpZiAobGF0ZXhTdGFydFBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICBsYXRleFN0YXJ0UG9zaXRpb24gKz0gdG9rZW4ubGVuZ3RoO1xuICAgICAgICAgICAgICBjb25zdCBsYXRleEVuZFBvc2l0aW9uID0gbWF0aG1sLmluZGV4T2YoJzwvYW5ub3RhdGlvbj4nLCBsYXRleFN0YXJ0UG9zaXRpb24pO1xuICAgICAgICAgICAgICBjb25zdCBsYXRleCA9IG1hdGhtbC5zdWJzdHJpbmcobGF0ZXhTdGFydFBvc2l0aW9uLCBsYXRleEVuZFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgICBjb25zdCByZXBsYWNlVGV4dCA9IGAkJCR7VXRpbC5odG1sRW50aXRpZXNEZWNvZGUobGF0ZXgpfSQkYDtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBjb2RlLnN1YnN0cmluZygwLCBpbWdMaXN0W2ldLnN0YXJ0ICsgY2FycnkpO1xuICAgICAgICAgICAgICBjb25zdCBlbmQgPSBjb2RlLnN1YnN0cmluZyhpbWdMaXN0W2ldLmVuZCArIGNhcnJ5KTtcbiAgICAgICAgICAgICAgY29kZSA9IHN0YXJ0ICsgcmVwbGFjZVRleHQgKyBlbmQ7XG4gICAgICAgICAgICAgIGNhcnJ5ICs9IHJlcGxhY2VUZXh0Lmxlbmd0aCAtIChpbWdMaXN0W2ldLmVuZCAtIGltZ0xpc3RbaV0uc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBlbmQgSFRNTCBjb2RlLiBUaGUgZW5kIEhUTUwgY29kZSBpcyBIVE1MIGNvZGUgd2l0aCBlbWJlZGRlZCBpbWFnZXNcbiAgICogb3IgTGFUZVggZm9ybXVsYXMgY3JlYXRlZCB3aXRoIE1hdGhUeXBlLiA8YnI+XG4gICAqIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIGZvcm11bGEgaW1hZ2VzIGFuZCBMYVRlWCBzdHJpbmdzIGluIE1hdGhNTC4gPGJyPlxuICAgKiBJZiBpbWFnZSBtb2RlIGlzIGVuYWJsZWQgdGhlIGltYWdlcyB3aWxsIG5vdCBiZSBjb252ZXJ0ZWQgaW50byBNYXRoTUwuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLndpcmlzLmNvbS9tYXRodHlwZS9lbi9tYXRodHlwZS1pbnRlZ3JhdGlvbnMvbWF0aHR5cGUtd2ViLWludGVyZmFjZS1mZWF0dXJlcy9mdWxsLW1hdGhtbC1tb2RlLS0td2lyaXNwbHVnaW5zLWpzLmh0bWx9LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZSAtIEhUTUwgdG8gYmUgcGFyc2VkXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBIVE1MIGNvZGUgcGFyc2VkLlxuICAgKi9cbiAgc3RhdGljIGVuZFBhcnNlKGNvZGUpIHtcbiAgICAvLyBUcmFuc2Zvcm0gTGFUZVggb2N1cnJlbmNlcyB0byBNYXRoTUwgZWxlbWVudHMuXG4gICAgY29uc3QgY29kZUVuZFBhcnNlZEVkaXRNb2RlID0gUGFyc2VyLmVuZFBhcnNlRWRpdE1vZGUoY29kZSk7XG4gICAgLy8gVHJhbnNmb3JtIGltZyBlbGVtZW50cyB0byBNYXRoTUwgZWxlbWVudHMuXG4gICAgY29uc3QgY29kZUVuZFBhcnNlU2F2ZU1vZGUgPSBQYXJzZXIuZW5kUGFyc2VTYXZlTW9kZShjb2RlRW5kUGFyc2VkRWRpdE1vZGUpO1xuICAgIHJldHVybiBjb2RlRW5kUGFyc2VTYXZlTW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgZW5kIEhUTUwgY29kZSBkZXBlbmRpbmcgb24gdGhlIGVkaXQgbW9kZS5cbiAgICogLSBMYVRlWCBpcyBhbiBlbmFibGVkIHBhcnNlIG1vZGUsIGFsbCBMYVRlWCBvY2N1cnJlbmNlcyB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIE1hdGhNTC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSBIVE1MIGNvZGUgdG8gYmUgcGFyc2VkLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBIVE1MIGNvZGUgcGFyc2VkLlxuICAgKi9cbiAgc3RhdGljIGVuZFBhcnNlRWRpdE1vZGUoY29kZSkge1xuICAgIC8vIENvbnZlcnRpbmcgTGFUZVggdG8gaW1hZ2VzLlxuICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgncGFyc2VNb2RlcycpLmluZGV4T2YoJ2xhdGV4JykgIT09IC0xKSB7XG4gICAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgICBsZXQgZW5kUG9zaXRpb24gPSAwO1xuICAgICAgbGV0IHN0YXJ0UG9zaXRpb24gPSBjb2RlLmluZGV4T2YoJyQkJyk7XG4gICAgICB3aGlsZSAoc3RhcnRQb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgb3V0cHV0ICs9IGNvZGUuc3Vic3RyaW5nKGVuZFBvc2l0aW9uLCBzdGFydFBvc2l0aW9uKTtcbiAgICAgICAgZW5kUG9zaXRpb24gPSBjb2RlLmluZGV4T2YoJyQkJywgc3RhcnRQb3NpdGlvbiArIDIpO1xuXG4gICAgICAgIGlmIChlbmRQb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAvLyBCZWZvcmUsIGl0IHdhcyBhIGNvbmRpdGlvbiBoZXJlIHRvIGV4ZWN1dGUgdGhlIG5leHQgY29kZWxpbmVzXG4gICAgICAgICAgLy8gJ2xhdGV4LmluZGV4T2YoJzwnKSA9PSAtMScuXG4gICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aHkgaXQgd2FzIHVzZWQsIGJ1dCBzZWVtcyB0byBoYXZlIGEgY29uZmxpY3Qgd2l0aFxuICAgICAgICAgIC8vIGxhdGV4IGZvcm11bGFzIHRoYXQgY29udGFpbnMgJzwnLlxuICAgICAgICAgIGNvbnN0IGxhdGV4ID0gY29kZS5zdWJzdHJpbmcoc3RhcnRQb3NpdGlvbiArIDIsIGVuZFBvc2l0aW9uKTtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkTGF0ZXggPSBVdGlsLmh0bWxFbnRpdGllc0RlY29kZShsYXRleCk7XG4gICAgICAgICAgbGV0IG1hdGhtbCA9IFV0aWwuaHRtbFNhbml0aXplKExhdGV4LmdldE1hdGhNTEZyb21MYXRleChkZWNvZGVkTGF0ZXgsIHRydWUpKTtcbiAgICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlSGFuZFRyYWNlcycpKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgaGFuZCB0cmFjZXMuXG4gICAgICAgICAgICBtYXRobWwgPSBNYXRoTUwucmVtb3ZlQW5ub3RhdGlvbihtYXRobWwsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dCArPSBtYXRobWw7XG4gICAgICAgICAgZW5kUG9zaXRpb24gKz0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXQgKz0gJyQkJztcbiAgICAgICAgICBlbmRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb24gKyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRQb3NpdGlvbiA9IGNvZGUuaW5kZXhPZignJCQnLCBlbmRQb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIG91dHB1dCArPSBjb2RlLnN1YnN0cmluZyhlbmRQb3NpdGlvbiwgY29kZS5sZW5ndGgpO1xuICAgICAgY29kZSA9IG91dHB1dDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgZW5kIEhUTUwgY29kZSBkZXBlbmRpbmcgb24gdGhlIHNhdmUgbW9kZS4gQ29udmVydHMgYWxsXG4gICAqIGltYWdlcyBpbnRvIHRoZSBlbGVtZW50IGRldGVybWluZWQgYnkgdGhlIHNhdmUgbW9kZTpcbiAgICogLSB4bWw6IFBhcnNlcyBpbWFnZXMgZm9ybXVsYXMgaW50byBNYXRoTUwuXG4gICAqIC0gc2FmZVhtbDogUGFyc2VzIGltYWdlcyBmb3JtdWxhcyBpbnRvIHNhZmVNQXRoTUxcbiAgICogLSBiYXNlNjQ6IFBhcnNlcyBpbWFnZXMgaW50byBiYXNlNjQgaW1hZ2VzLlxuICAgKiAtIGltYWdlOiBQYXJzZSBpbWFnZXMgaW50byBpbWFnZXMgKG5vIHBhcnNpbmcpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIC0gSFRNTCBjb2RlIHRvIGJlIHBhcnNlZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBIVE1MIGNvZGUgcGFyc2VkLlxuICAgKi9cbiAgc3RhdGljIGVuZFBhcnNlU2F2ZU1vZGUoY29kZSkge1xuICAgIGlmIChDb25maWd1cmF0aW9uLmdldCgnc2F2ZU1vZGUnKSkge1xuICAgICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAnc2FmZVhtbCcpIHtcbiAgICAgICAgY29kZSA9IFBhcnNlci5jb2RlSW1nVHJhbnNmb3JtKGNvZGUsICdpbWcybWF0aG1sJyk7XG4gICAgICB9IGVsc2UgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAneG1sJykge1xuICAgICAgICBjb2RlID0gUGFyc2VyLmNvZGVJbWdUcmFuc2Zvcm0oY29kZSwgJ2ltZzJtYXRobWwnKTtcbiAgICAgIH0gZWxzZSBpZiAoQ29uZmlndXJhdGlvbi5nZXQoJ3NhdmVNb2RlJykgPT09ICdiYXNlNjQnICYmIENvbmZpZ3VyYXRpb24uZ2V0KCdiYXNlNjRzYXZlbW9kZScpID09PSAnaW1hZ2UnKSB7XG4gICAgICAgIGNvZGUgPSBQYXJzZXIuY29kZUltZ1RyYW5zZm9ybShjb2RlLCAnaW1nMjY0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBdXhpbGlhciBmdW5jdGlvbiB0aGF0IGJ1aWxkcyB0aGUgZGF0YSBvYmplY3QgdG8gc2VuZCB0byB0aGUgc2hvd2ltYWdlIGVuZHBvaW50XG4gICAqIEBwYXJhbSB7T2JqZWN0W119IGRhdGEgLSBvYmplY3QgY29udGFpbmluZyBzaG93aW1hZ2Ugc2VydmljZSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBzdHJpbmcgY29udGFpbmluZyB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGZvcm11bGEuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gb2JqZWN0IHdpdGggdGhlIGRhdGEgdG8gc2VuZCB0byBzaG93aW1hZ2UuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlU2hvd0ltYWdlU3JjRGF0YShkYXRhLCBsYW5ndWFnZSkge1xuICAgIGNvbnN0IGRhdGFNZDUgPSB7fTtcbiAgICBjb25zdCByZW5kZXJQYXJhbXMgPSBbJ21tbCcsICdjb2xvcicsICdjZW50ZXJiYXNlbGluZScsICd6b29tJywgJ2RwaScsICdmb250U2l6ZScsICdmb250RmFtaWx5JywgJ2RlZmF1bHRTdHJldGNoeScsICdiYWNrZ3JvdW5kQ29sb3InLCAnZm9ybWF0J107XG4gICAgcmVuZGVyUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGRhdGFbcGFyYW1dICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkYXRhTWQ1W3BhcmFtXSA9IGRhdGFbcGFyYW1dO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIERhdGEgdmFyaWFibGVzIHRvIGdldC5cbiAgICBjb25zdCBkYXRhT2JqZWN0ID0ge307XG4gICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAvLyBXZSBkb24ndCBuZWVkIG1hdGhtbCBpbiB0aGlzIHJlcXVlc3Qgd2UgdHJ5IHRvIGdldCBjYWNoZWQuXG4gICAgICAvLyBPbmx5IG5lZWQgdGhlIGZvcm11bGEgbWQ1IGNhbGN1bGF0ZWQgYmVmb3JlLlxuICAgICAgaWYgKGtleSAhPT0gJ21tbCcpIHtcbiAgICAgICAgZGF0YU9iamVjdFtrZXldID0gZGF0YVtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGF0YU9iamVjdC5mb3JtdWxhID0gY29tLndpcmlzLmpzLkpzUGx1Z2luVG9vbHMubWQ1ZW5jb2RlKFV0aWwucHJvcGVydGllc1RvU3RyaW5nKGRhdGFNZDUpKTtcbiAgICBkYXRhT2JqZWN0LmxhbmcgPSAodHlwZW9mIGxhbmd1YWdlID09PSAndW5kZWZpbmVkJykgPyAnZW4nIDogbGFuZ3VhZ2U7XG4gICAgZGF0YU9iamVjdC52ZXJzaW9uID0gQ29uZmlndXJhdGlvbi5nZXQoJ3ZlcnNpb24nKTtcblxuICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc3VsdCB0byBjYWxsIHNob3dpbWFnZSBzZXJ2aWNlIHdpdGggdGhlIGZvcm11bGEgbWQ1IGFzIHBhcmFtZXRlci5cbiAgICogIFRoZSByZXN1bHQgY291bGQgYmU6XG4gICAqIC0geydzdGF0dXMnIDogd2FybmluZyd9IDogVGhlIGltYWdlIGFzc29jaWF0ZWQgdG8gdGhlIE1hdGhNTCBtZDUgaXMgbm90IGluIGNhY2hlLlxuICAgKiAtIHsnc3RhdHVzJyA6ICdvaycgLi4ufSA6IFRoZSBpbWFnZSBhc3NvY2lhdGVkIHRvIHRoZSBNYXRoTUwgbWQ1IGlzIGluIGNhY2hlLlxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBkYXRhIC0gb2JqZWN0IGNvbnRhaW5pbmcgc2hvd2ltYWdlIHNlcnZpY2UgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxhbmd1YWdlIG9mIHRoZSBmb3JtdWxhLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBKU09OIG9iamVjdCBjb250YWluaW5nIHNob3dpbWFnZSByZXNwb25zZS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVTaG93SW1hZ2VTcmMoZGF0YSwgbGFuZ3VhZ2UpIHtcbiAgICBjb25zdCBkYXRhT2JqZWN0ID0gdGhpcy5jcmVhdGVTaG93SW1hZ2VTcmNEYXRhKGRhdGEsIGxhbmd1YWdlKTtcbiAgICBjb25zdCByZXN1bHQgPSBTZXJ2aWNlUHJvdmlkZXIuZ2V0U2VydmljZSgnc2hvd2ltYWdlJywgVXRpbC5odHRwQnVpbGRRdWVyeShkYXRhT2JqZWN0KSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gaHRtbCBpbWcgdGFncyBpbnNpZGUgYSBodG1sIGNvZGUgdG8gbWF0aG1sLCBiYXNlNjQgaW1nIHRhZ3MgKGkuZSB3aXRoIGJhc2U2NCBvbiBzcmMpXG4gICAqIG9yIHNob3dpbWFnZSBpbWcgdGFncyAoaS5lIHdpdGggc2hvd2ltYWdlLnBocCBvbiBzcmMpXG4gICAqIEBwYXJhbSAge3N0cmluZ30gY29kZSAtIEhUTUwgY29kZVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG1vZGUgLSBiYXNlNjQyc2hvd2ltYWdlIG9yIGltZzJtYXRobWwgb3IgaW1nMjY0IHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMge3N0cmluZ30gaHRtbCAtIGNvZGUgdHJhbnNmb3JtZWQuXG4gICAqL1xuICBzdGF0aWMgY29kZUltZ1RyYW5zZm9ybShjb2RlLCBtb2RlKSB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIGxldCBlbmRQb3NpdGlvbiA9IDA7XG4gICAgY29uc3QgcGF0dGVybiA9IC88aW1nL2dpO1xuICAgIGNvbnN0IHBhdHRlcm5MZW5ndGggPSBwYXR0ZXJuLnNvdXJjZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAocGF0dGVybi50ZXN0KGNvZGUpKSB7XG4gICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gcGF0dGVybi5sYXN0SW5kZXggLSBwYXR0ZXJuTGVuZ3RoO1xuICAgICAgb3V0cHV0ICs9IGNvZGUuc3Vic3RyaW5nKGVuZFBvc2l0aW9uLCBzdGFydFBvc2l0aW9uKTtcblxuICAgICAgbGV0IGkgPSBzdGFydFBvc2l0aW9uICsgMTtcblxuICAgICAgd2hpbGUgKGkgPCBjb2RlLmxlbmd0aCAmJiBlbmRQb3NpdGlvbiA8PSBzdGFydFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNoYXJhY3RlciA9IGNvZGUuY2hhckF0KGkpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcIicgfHwgY2hhcmFjdGVyID09PSAnXFwnJykge1xuICAgICAgICAgIGNvbnN0IGNoYXJhY3Rlck5leHRQb3NpdGlvbiA9IGNvZGUuaW5kZXhPZihjaGFyYWN0ZXIsIGkgKyAxKTtcblxuICAgICAgICAgIGlmIChjaGFyYWN0ZXJOZXh0UG9zaXRpb24gPT09IC0xKSB7XG4gICAgICAgICAgICBpID0gY29kZS5sZW5ndGg7IC8vIEVuZCB3aGlsZS5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaSA9IGNoYXJhY3Rlck5leHRQb3NpdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnPicpIHtcbiAgICAgICAgICBlbmRQb3NpdGlvbiA9IGkgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5kUG9zaXRpb24gPCBzdGFydFBvc2l0aW9uKSB7IC8vIFRoZSBpbWcgdGFnIGlzIHN0cmlwcGVkLlxuICAgICAgICBvdXRwdXQgKz0gY29kZS5zdWJzdHJpbmcoc3RhcnRQb3NpdGlvbiwgY29kZS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuICAgICAgbGV0IGltZ0NvZGUgPSBjb2RlLnN1YnN0cmluZyhzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7XG4gICAgICBjb25zdCBpbWdPYmplY3QgPSBVdGlsLmNyZWF0ZU9iamVjdChpbWdDb2RlKTtcbiAgICAgIGxldCB4bWxDb2RlID0gaW1nT2JqZWN0LmdldEF0dHJpYnV0ZShDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VNYXRobWxBdHRyaWJ1dGUnKSk7XG4gICAgICBsZXQgY29udmVydFRvWG1sO1xuICAgICAgbGV0IGNvbnZlcnRUb1NhZmVYbWw7XG5cbiAgICAgIGlmIChtb2RlID09PSAnYmFzZTY0MnNob3dpbWFnZScpIHtcbiAgICAgICAgaWYgKHhtbENvZGUgPT0gbnVsbCkge1xuICAgICAgICAgIHhtbENvZGUgPSBpbWdPYmplY3QuZ2V0QXR0cmlidXRlKCdhbHQnKTtcbiAgICAgICAgfVxuICAgICAgICB4bWxDb2RlID0gTWF0aE1MLnNhZmVYbWxEZWNvZGUoeG1sQ29kZSk7XG4gICAgICAgIGltZ0NvZGUgPSBQYXJzZXIubWF0aG1sVG9JbWdPYmplY3QoZG9jdW1lbnQsIHhtbENvZGUsIG51bGwsIG51bGwpO1xuICAgICAgICBvdXRwdXQgKz0gVXRpbC5jcmVhdGVPYmplY3RDb2RlKGltZ0NvZGUpO1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnaW1nMm1hdGhtbCcpIHtcbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpKSB7XG4gICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAnc2FmZVhtbCcpIHtcbiAgICAgICAgICAgIGNvbnZlcnRUb1htbCA9IHRydWU7XG4gICAgICAgICAgICBjb252ZXJ0VG9TYWZlWG1sID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKENvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlTW9kZScpID09PSAneG1sJykge1xuICAgICAgICAgICAgY29udmVydFRvWG1sID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnZlcnRUb1NhZmVYbWwgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9IFV0aWwuZ2V0V0lSSVNJbWFnZU91dHB1dChpbWdDb2RlLCBjb252ZXJ0VG9YbWwsIGNvbnZlcnRUb1NhZmVYbWwpO1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnaW1nMjY0Jykge1xuICAgICAgICBpZiAoeG1sQ29kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHhtbENvZGUgPSBpbWdPYmplY3QuZ2V0QXR0cmlidXRlKCdhbHQnKTtcbiAgICAgICAgfVxuICAgICAgICB4bWxDb2RlID0gTWF0aE1MLnNhZmVYbWxEZWNvZGUoeG1sQ29kZSk7XG5cbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBwcm9wZXJ0aWVzLmJhc2U2NCA9ICd0cnVlJztcbiAgICAgICAgaW1nQ29kZSA9IFBhcnNlci5tYXRobWxUb0ltZ09iamVjdChkb2N1bWVudCwgeG1sQ29kZSwgcHJvcGVydGllcywgbnVsbCk7XG4gICAgICAgIC8vIE1ldHJpY3MuXG4gICAgICAgIEltYWdlLnNldEltZ1NpemUoaW1nQ29kZSwgaW1nQ29kZS5zcmMsIHRydWUpO1xuICAgICAgICBvdXRwdXQgKz0gVXRpbC5jcmVhdGVPYmplY3RDb2RlKGltZ0NvZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXRwdXQgKz0gY29kZS5zdWJzdHJpbmcoZW5kUG9zaXRpb24sIGNvZGUubGVuZ3RoKTtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFsbCBvY2N1cnJlbmNlcyBvZiBNYXRoTUwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaW1hZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gc3RyaW5nIHdpdGggdmFsaWQgTWF0aE1MIGNvZGUuXG4gICAqIFRoZSBNYXRoTUwgY29kZSBkb2Vzbid0IGNvbnRhaW4gc2VtYW50aWNzLlxuICAgKiBAcGFyYW0ge0NvbnN0YW50c30gY2hhcmFjdGVycyAtIENvbnN0YW50IG9iamVjdCBjb250YWluaW5nIHhtbENoYXJhY3RlcnNcbiAgICogb3Igc2FmZVhtbENoYXJhY3RlcnMgcmVsYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIGEgdmFsaWQgbGFuZ3VhZ2UgY29kZVxuICAgKiBpbiBvcmRlciB0byBnZW5lcmF0ZSBmb3JtdWxhIGFjY2Vzc2liaWxpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgd2l0aCBhbGwgdGhlIE1hdGhNTFxuICAgKiBvY2N1cnJlbmNlcyByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyBpbWFnZS5cbiAgICovXG4gIHN0YXRpYyBwYXJzZU1hdGhtbFRvSW1nKGNvbnRlbnQsIGNoYXJhY3RlcnMsIGxhbmd1YWdlKSB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIGNvbnN0IG1hdGhUYWdCZWdpbiA9IGAke2NoYXJhY3RlcnMudGFnT3BlbmVyfW1hdGhgO1xuICAgIGNvbnN0IG1hdGhUYWdFbmQgPSBgJHtjaGFyYWN0ZXJzLnRhZ09wZW5lcn0vbWF0aCR7Y2hhcmFjdGVycy50YWdDbG9zZXJ9YDtcbiAgICBsZXQgc3RhcnQgPSBjb250ZW50LmluZGV4T2YobWF0aFRhZ0JlZ2luKTtcbiAgICBsZXQgZW5kID0gMDtcblxuICAgIHdoaWxlIChzdGFydCAhPT0gLTEpIHtcbiAgICAgIG91dHB1dCArPSBjb250ZW50LnN1YnN0cmluZyhlbmQsIHN0YXJ0KTtcbiAgICAgIC8vIEF2b2lkIFdJUklTIGltYWdlcyB0byBiZSBwYXJzZWQuXG4gICAgICBjb25zdCBpbWFnZU1hdGhtbEF0cnJpYnV0ZSA9IGNvbnRlbnQuaW5kZXhPZihDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VNYXRobWxBdHRyaWJ1dGUnKSk7XG4gICAgICBlbmQgPSBjb250ZW50LmluZGV4T2YobWF0aFRhZ0VuZCwgc3RhcnQpO1xuXG4gICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICBlbmQgPSBjb250ZW50Lmxlbmd0aCAtIDE7XG4gICAgICB9IGVsc2UgaWYgKGltYWdlTWF0aG1sQXRycmlidXRlICE9PSAtMSkge1xuICAgICAgICAvLyBGaXJzdCBjbG9zZSB0YWcgb2YgaW1nIGF0dHJpYnV0ZVxuICAgICAgICAvLyBJZiBhIG1hdGhtbEF0dHJpYnV0ZSBleGlzdHMgc2hvdWxkIGJlIGluc2lkZSBhIGltZyB0YWcuXG4gICAgICAgIGVuZCArPSBjb250ZW50LmluZGV4T2YoJy8+Jywgc3RhcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kICs9IG1hdGhUYWdFbmQubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU1hdGhNTC5pc01hdGhtbEluQXR0cmlidXRlKGNvbnRlbnQsIHN0YXJ0KSAmJiBpbWFnZU1hdGhtbEF0cnJpYnV0ZSA9PT0gLTEpIHtcbiAgICAgICAgbGV0IG1hdGhtbCA9IGNvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICBtYXRobWwgPSAoY2hhcmFjdGVycy5pZCA9PT0gQ29uc3RhbnRzLnNhZmVYbWxDaGFyYWN0ZXJzLmlkKVxuICAgICAgICAgID8gTWF0aE1MLnNhZmVYbWxEZWNvZGUobWF0aG1sKVxuICAgICAgICAgIDogTWF0aE1MLm1hdGhNTEVudGl0aWVzKG1hdGhtbCk7XG4gICAgICAgIG91dHB1dCArPSBVdGlsLmNyZWF0ZU9iamVjdENvZGUoUGFyc2VyLm1hdGhtbFRvSW1nT2JqZWN0KGRvY3VtZW50LCBtYXRobWwsIG51bGwsIGxhbmd1YWdlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgKz0gY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0ID0gY29udGVudC5pbmRleE9mKG1hdGhUYWdCZWdpbiwgZW5kKTtcbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gY29udGVudC5zdWJzdHJpbmcoZW5kLCBjb250ZW50Lmxlbmd0aCk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufVxuXG4vLyBNdXRhdGlvbiBvYnNlcnZlcnMgdG8gYXZvaWQgd2lyaXMgaW1hZ2UgZm9ybXVsYXMgY2xhc3MgYmUgcmVtb3ZlZC5cbmlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICBtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcbiAgICAgIGlmIChtdXRhdGlvbi5vbGRWYWx1ZSA9PT0gQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlQ2xhc3NOYW1lJylcbiAgICAgICAgJiYgbXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ2NsYXNzJ1xuICAgICAgICAmJiBtdXRhdGlvbi50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlQ2xhc3NOYW1lJykpID09PSAtMSkge1xuICAgICAgICBtdXRhdGlvbi50YXJnZXQuY2xhc3NOYW1lID0gQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlQ2xhc3NOYW1lJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIFBhcnNlci5vYnNlcnZlciA9IE9iamVjdC5jcmVhdGUobXV0YXRpb25PYnNlcnZlcik7XG4gIFBhcnNlci5vYnNlcnZlci5Db25maWcgPSB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZU9sZFZhbHVlOiB0cnVlIH07XG4gIC8vIFdlIHVzZSBvd24gZGVmYXVsdCBjb25maWcuXG4gIFBhcnNlci5vYnNlcnZlci5vYnNlcnZlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5vYnNlcnZlKHRhcmdldCwgdGhpcy5Db25maWcpO1xuICB9O1xufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCBMaXN0ZW5lcnMgZnJvbSAnLi9saXN0ZW5lcnMnO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZXJ2aWNlUHJvdmlkZXJQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge1N0cmluZ30gVVJJIC0gU2VydmljZSBVUkkuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyIC0gU2VydmljZSBzZXJ2ZXIgbGFuZ3VhZ2UuXG4gKi9cblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBzZXJ2aWNlUHJvdmlkZXIuIEEgc2VydmljZVByb3ZpZGVyIGlzIGEgY2xhc3MgY29udGFpbmluZ1xuICogYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBzZXJ2aWNlcyB3aXRoIHRoZSBjb3JyZXNwb25kZW50IHBhdGguXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZpY2VQcm92aWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIFNlcnZpY2UgUHJvdmlkZXIgbGlzdGVuZXJzLlxuICAgKiBAdHlwZSB7TGlzdGVuZXJzfVxuICAgKi9cbiAgc3RhdGljIGdldCBsaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFNlcnZpY2VQcm92aWRlci5fbGlzdGVuZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgTGlzdGVuZXJ9IGluc3RhbmNlIHRvIHtAbGluayBTZXJ2aWNlUHJvdmlkZXJ9IGNsYXNzLlxuICAgKiBAcGFyYW0ge0xpc3RlbmVyfSBsaXN0ZW5lciAtIEluc3RhbmNlIG9mIHtAbGluayBMaXN0ZW5lcn0uXG4gICAqL1xuICBzdGF0aWMgYWRkTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICBTZXJ2aWNlUHJvdmlkZXIubGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgZXZlbnRzIGluIFNlcnZpY2UgUHJvdmlkZXIuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgLSBFdmVudCBuYW1lLlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIEV2ZW50IG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBmaXJlRXZlbnQoZXZlbnROYW1lLCBldmVudCkge1xuICAgIFNlcnZpY2VQcm92aWRlci5saXN0ZW5lcnMuZmlyZShldmVudE5hbWUsIGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIHBhcmFtZXRlcnMuXG4gICAqIEB0eXBlIHtTZXJ2aWNlUHJvdmlkZXJQcm9wZXJ0aWVzfVxuICAgKlxuICAgKi9cbiAgc3RhdGljIGdldCBwYXJhbWV0ZXJzKCkge1xuICAgIHJldHVybiBTZXJ2aWNlUHJvdmlkZXIuX3BhcmFtZXRlcnM7XG4gIH1cblxuICAvKipcbiAgICogU2VydmljZSBwYXJhbWV0ZXJzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U2VydmljZVByb3ZpZGVyUHJvcGVydGllc31cbiAgICovXG4gIHN0YXRpYyBzZXQgcGFyYW1ldGVycyhwYXJhbWV0ZXJzKSB7XG4gICAgU2VydmljZVByb3ZpZGVyLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgcHJvcGVydHkuXG4gICAqIFJldHVybiBzZXJ2aWNlIHByb3ZpZGVyIHBhdGhzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGdldCBzZXJ2aWNlUGF0aHMoKSB7XG4gICAgcmV0dXJuIFNlcnZpY2VQcm92aWRlci5fc2VydmljZVBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBwcm9wZXJ0eSBzZXR0ZXIuXG4gICAqIFNldCBzZXJ2aWNlIHBhdGhzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgLSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHN0YXRpYyBzZXQgc2VydmljZVBhdGhzKHZhbHVlKSB7XG4gICAgU2VydmljZVByb3ZpZGVyLl9zZXJ2aWNlUGF0aHMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IHNlcnZpY2UgdG8gdGhlIFNlcnZpY2VQcm92aWRlci5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlcnZpY2UgLSBTZXJ2aWNlIG5hbWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIC0gU2VydmljZSBwYXRoLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgc2V0U2VydmljZVBhdGgoc2VydmljZSwgcGF0aCkge1xuICAgIFNlcnZpY2VQcm92aWRlci5zZXJ2aWNlUGF0aHNbc2VydmljZV0gPSBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlcnZpY2UgcGF0aCBmb3IgYSBjZXJ0YWluIHNlcnZpY2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlTmFtZSAtIFNlcnZpY2UgbmFtZS5cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHNlcnZpY2UgcGF0aC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldFNlcnZpY2VQYXRoKHNlcnZpY2VOYW1lKSB7XG4gICAgcmV0dXJuIFNlcnZpY2VQcm92aWRlci5zZXJ2aWNlUGF0aHNbc2VydmljZU5hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBwcm9wZXJ0eS5cbiAgICogU2VydmljZSBwcm92aWRlciBpbnRlZ3JhdGlvbiBwYXRoLlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGdldCBpbnRlZ3JhdGlvblBhdGgoKSB7XG4gICAgcmV0dXJuIFNlcnZpY2VQcm92aWRlci5faW50ZWdyYXRpb25QYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBwcm9wZXJ0eSBzZXR0ZXIuXG4gICAqIFNldCBzZXJ2aWNlIHByb3ZpZGVyIGludGVncmF0aW9uIHBhdGguXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIFRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc3RhdGljIHNldCBpbnRlZ3JhdGlvblBhdGgodmFsdWUpIHtcbiAgICBTZXJ2aWNlUHJvdmlkZXIuX2ludGVncmF0aW9uUGF0aCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlcnZlciBVUkwgaW4gdGhlIGZvcm0gcHJvdG9jb2w6Ly9zZXJ2ZXJOYW1lOnNlcnZlclBvcnQuXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGNsaWVudCBzaWRlIHNlcnZlciBwYXRoLlxuICAgKi9cbiAgc3RhdGljIGdldFNlcnZlclVSTCgpIHtcbiAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoJy8nKTtcbiAgICBjb25zdCByZXN1bHQgPSBgJHthcnJbMF19Ly8ke2FyclsyXX1gO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogSW5pdHMge0BsaW5rIHRoaXN9IGNsYXNzLiBVc2VzIHtAbGluayB0aGlzLmludGVncmF0aW9uUGF0aH0gYXNcbiAgICogYmFzZSBwYXRoIHRvIGdlbmVyYXRlIGFsbCBiYWNrZW5kIHNlcnZpY2VzIHBhdGhzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1ldGVycyAtIEZ1bmN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbWV0ZXJzLmludGVncmF0aW9uUGF0aCAtIFNlcnZpY2UgcGF0aC5cbiAgICovXG4gIHN0YXRpYyBpbml0KHBhcmFtZXRlcnMpIHtcbiAgICBTZXJ2aWNlUHJvdmlkZXIucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgLy8gU2VydmljZXMgcGF0aCAodGVjaCBkZXBlbmRhbnQpLlxuICAgIGxldCBjb25maWd1cmF0aW9uVVJJID0gU2VydmljZVByb3ZpZGVyLmNyZWF0ZVNlcnZpY2VVUkkoJ2NvbmZpZ3VyYXRpb25qcycpO1xuICAgIGxldCBjcmVhdGVJbWFnZVVSSSA9IFNlcnZpY2VQcm92aWRlci5jcmVhdGVTZXJ2aWNlVVJJKCdjcmVhdGVpbWFnZScpO1xuICAgIGxldCBzaG93SW1hZ2VVUkkgPSBTZXJ2aWNlUHJvdmlkZXIuY3JlYXRlU2VydmljZVVSSSgnc2hvd2ltYWdlJyk7XG4gICAgbGV0IGdldE1hdGhNTFVSSSA9IFNlcnZpY2VQcm92aWRlci5jcmVhdGVTZXJ2aWNlVVJJKCdnZXRtYXRobWwnKTtcbiAgICBsZXQgc2VydmljZVVSSSA9IFNlcnZpY2VQcm92aWRlci5jcmVhdGVTZXJ2aWNlVVJJKCdzZXJ2aWNlJyk7XG5cbiAgICAvLyBTb21lIGJhY2tlbmQgaW50ZWdyYXRpb25zIChsaWtlIEphdmEgbyBSdWJ5KSBoYXZlIGFuIGFic29sdXRlIGJhY2tlbmQgcGF0aCxcbiAgICAvLyBmb3IgZXhhbXBsZTogL2FwcC9zZXJ2aWNlLiBGb3IgdGhlbSB3ZSBjYWxjdWxhdGUgdGhlIGFic29sdXRlIFVSTCBwYXRoLCBpLmVcbiAgICAvLyBwcm90b2NvbDovL2RvbWFpbjpwb3J0L2FwcC9zZXJ2aWNlXG4gICAgaWYgKFNlcnZpY2VQcm92aWRlci5wYXJhbWV0ZXJzLlVSSS5pbmRleE9mKCcvJykgPT09IDApIHtcbiAgICAgIGNvbnN0IHNlcnZlclBhdGggPSBTZXJ2aWNlUHJvdmlkZXIuZ2V0U2VydmVyVVJMKCk7XG4gICAgICBjb25maWd1cmF0aW9uVVJJID0gc2VydmVyUGF0aCArIGNvbmZpZ3VyYXRpb25VUkk7XG4gICAgICBzaG93SW1hZ2VVUkkgPSBzZXJ2ZXJQYXRoICsgc2hvd0ltYWdlVVJJO1xuICAgICAgY3JlYXRlSW1hZ2VVUkkgPSBzZXJ2ZXJQYXRoICsgY3JlYXRlSW1hZ2VVUkk7XG4gICAgICBnZXRNYXRoTUxVUkkgPSBzZXJ2ZXJQYXRoICsgZ2V0TWF0aE1MVVJJO1xuICAgICAgc2VydmljZVVSSSA9IHNlcnZlclBhdGggKyBzZXJ2aWNlVVJJO1xuICAgIH1cblxuICAgIFNlcnZpY2VQcm92aWRlci5zZXRTZXJ2aWNlUGF0aCgnY29uZmlndXJhdGlvbmpzJywgY29uZmlndXJhdGlvblVSSSk7XG4gICAgU2VydmljZVByb3ZpZGVyLnNldFNlcnZpY2VQYXRoKCdzaG93aW1hZ2UnLCBzaG93SW1hZ2VVUkkpO1xuICAgIFNlcnZpY2VQcm92aWRlci5zZXRTZXJ2aWNlUGF0aCgnY3JlYXRlaW1hZ2UnLCBjcmVhdGVJbWFnZVVSSSk7XG4gICAgU2VydmljZVByb3ZpZGVyLnNldFNlcnZpY2VQYXRoKCdzZXJ2aWNlJywgc2VydmljZVVSSSk7XG4gICAgU2VydmljZVByb3ZpZGVyLnNldFNlcnZpY2VQYXRoKCdnZXRtYXRobWwnLCBnZXRNYXRoTUxVUkkpO1xuICAgIFNlcnZpY2VQcm92aWRlci5zZXRTZXJ2aWNlUGF0aCgnY29uZmlndXJhdGlvbmpzJywgY29uZmlndXJhdGlvblVSSSk7XG5cbiAgICBTZXJ2aWNlUHJvdmlkZXIubGlzdGVuZXJzLmZpcmUoJ29uSW5pdCcsIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZW50IGZyb20gYW4gVVJMLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVGFyZ2V0IFVSTC5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwb3N0VmFyaWFibGVzXSAtIE9iamVjdCBjb250YWluaW5nIHBvc3QgdmFyaWFibGVzLlxuICAgKiBudWxsIGlmIGEgR0VUIHF1ZXJ5IHNob3VsZCBiZSBkb25lLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBDb250ZW50IG9mIHRoZSB0YXJnZXQgVVJMLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0VXJsKHVybCwgcG9zdFZhcmlhYmxlcykge1xuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gd2luZG93LmxvY2F0aW9uLnRvU3RyaW5nKCkuc3Vic3RyKDAsIHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICBjb25zdCBodHRwUmVxdWVzdCA9IFV0aWwuY3JlYXRlSHR0cFJlcXVlc3QoKTtcblxuICAgIGlmIChodHRwUmVxdWVzdCkge1xuICAgICAgaWYgKHR5cGVvZiBwb3N0VmFyaWFibGVzID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgcG9zdFZhcmlhYmxlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsLCBmYWxzZSk7XG4gICAgICB9IGVsc2UgaWYgKHVybC5zdWJzdHIoMCwgMSkgPT09ICcvJyB8fCB1cmwuc3Vic3RyKDAsIDcpID09PSAnaHR0cDovLycgfHwgdXJsLnN1YnN0cigwLCA4KSA9PT0gJ2h0dHBzOi8vJykge1xuICAgICAgICBodHRwUmVxdWVzdC5vcGVuKCdQT1NUJywgdXJsLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVxdWVzdC5vcGVuKCdQT1NUJywgY3VycmVudFBhdGggKyB1cmwsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGhlYWRlciA9IENvbmZpZ3VyYXRpb24uZ2V0KCdjdXN0b21IZWFkZXJzJyk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGhlYWRlciA9IGhlYWRlci50b1N0cmluZygpXG4gICAgICAgIGhlYWRlci5zcGxpdChcIixcIilcbiAgICAgICAgICAubWFwKGVsZW1lbnQgPT4gZWxlbWVudC50cmltKCkuc3BsaXQoJz0nKSlcbiAgICAgICAgICAuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4gaHR0cFJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHBvc3RWYXJpYWJsZXMgIT09ICd1bmRlZmluZWQnICYmIHBvc3RWYXJpYWJsZXMpIHtcbiAgICAgICAgaHR0cFJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCcpO1xuICAgICAgICBodHRwUmVxdWVzdC5zZW5kKFV0aWwuaHR0cEJ1aWxkUXVlcnkocG9zdFZhcmlhYmxlcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTtcbiAgICAgIH1cbiAgIFxuICAgICAgcmV0dXJuIGh0dHBSZXF1ZXN0LnJlc3BvbnNlVGV4dDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc3BvbnNlIHRleHQgb2YgYSBjZXJ0YWluIHNlcnZpY2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlIC0gU2VydmljZSBuYW1lLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcG9zdFZhcmlhYmxlcyAtIFBvc3QgdmFyaWFibGVzLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGdldCAtIFRydWUgaWYgdGhlIHJlcXVlc3QgaXMgR0VUIGluc3RlYWQgb2YgUE9TVC4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTZXJ2aWNlIHJlc3BvbnNlIHRleHQuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VydmljZShzZXJ2aWNlLCBwb3N0VmFyaWFibGVzLCBnZXQpIHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgaWYgKGdldCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgZ2V0VmFyaWFibGVzID0gcG9zdFZhcmlhYmxlcyA/IGA/JHtwb3N0VmFyaWFibGVzfWAgOiAnJztcbiAgICAgIGNvbnN0IHNlcnZpY2VVcmwgPSBgJHtTZXJ2aWNlUHJvdmlkZXIuZ2V0U2VydmljZVBhdGgoc2VydmljZSl9JHtnZXRWYXJpYWJsZXN9YDtcbiAgICAgIHJlc3BvbnNlID0gU2VydmljZVByb3ZpZGVyLmdldFVybChzZXJ2aWNlVXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VydmljZVVybCA9IFNlcnZpY2VQcm92aWRlci5nZXRTZXJ2aWNlUGF0aChzZXJ2aWNlKTtcbiAgICAgIHJlc3BvbnNlID0gU2VydmljZVByb3ZpZGVyLmdldFVybChzZXJ2aWNlVXJsLCBwb3N0VmFyaWFibGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlcnZlciBsYW5ndWFnZSBvZiBhIGNlcnRhaW4gc2VydmljZS4gVGhlIHBvc3NpYmxlIHZhbHVlc1xuICAgKiBhcmU6IHBocCwgYXNweCwgamF2YSBhbmQgcnVieS5cbiAgICogVGhpcyBtZXRob2QgaGFzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlIC0gVGhlIGNvbmZpZ3VyYXRpb24gc2VydmljZS5cbiAgICogQHJldHVybnMge1N0cmluZ30gLSBUaGUgc2VydmVyIHRlY2hub2xvZ3kgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VydmVyTGFuZ3VhZ2VGcm9tU2VydmljZShzZXJ2aWNlKSB7XG4gICAgaWYgKHNlcnZpY2UuaW5kZXhPZignLnBocCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICdwaHAnO1xuICAgIH1cbiAgICBpZiAoc2VydmljZS5pbmRleE9mKCcuYXNweCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICdhc3B4JztcbiAgICB9XG4gICAgaWYgKHNlcnZpY2UuaW5kZXhPZignd2lyaXNwbHVnaW5lbmdpbmUnKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiAncnVieSc7XG4gICAgfVxuICAgIHJldHVybiAnamF2YSc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgVVJJIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRhaW4gc2VydmljZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlcnZpY2UgLSBUaGUgc2VydmljZSBuYW1lLlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzZXJ2aWNlIHBhdGguXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlU2VydmljZVVSSShzZXJ2aWNlKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gU2VydmljZVByb3ZpZGVyLnNlcnZlckV4dGVuc2lvbigpO1xuICAgIHJldHVybiBVdGlsLmNvbmNhdGVuYXRlVXJsKFNlcnZpY2VQcm92aWRlci5wYXJhbWV0ZXJzLlVSSSwgc2VydmljZSkgKyBleHRlbnNpb247XG4gIH1cblxuICBzdGF0aWMgc2VydmVyRXh0ZW5zaW9uKCkge1xuICAgIGlmIChTZXJ2aWNlUHJvdmlkZXIucGFyYW1ldGVycy5zZXJ2ZXIuaW5kZXhPZigncGhwJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJy5waHAnO1xuICAgIH1cbiAgICBpZiAoU2VydmljZVByb3ZpZGVyLnBhcmFtZXRlcnMuc2VydmVyLmluZGV4T2YoJ2FzcHgnKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiAnLmFzcHgnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmljZSAtIFRoZSBzZXJ2aWNlIG5hbWUuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aCAtIFRoZSBzZXJ2aWNlIHBhdGguXG4gKiBAc3RhdGljXG4gKi9cblNlcnZpY2VQcm92aWRlci5fc2VydmljZVBhdGhzID0ge307XG5cbi8qKlxuICogVGhlIGludGVncmF0aW9uIHBhdGguIENvbnRhaW5zIHRoZSBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2UuXG4gKiBVc2VkIHRvIGRlZmluZSB0aGUgcGF0aCBmb3IgYWxsIHNlcnZpY2VzLlxuICogQHR5cGUge1N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblNlcnZpY2VQcm92aWRlci5faW50ZWdyYXRpb25QYXRoID0gJyc7XG5cbi8qKlxuICogU2VydmljZVByb3ZpZGVyIHN0YXRpYyBsaXN0ZW5lcnMuXG4gKiBAdHlwZSB7TGlzdGVuZXJzfVxuICogQHByaXZhdGVcbiAqL1xuU2VydmljZVByb3ZpZGVyLl9saXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJzKCk7XG5cbi8qKlxuICogU2VydmljZSBwcm92aWRlciBwYXJhbWV0ZXJzLlxuICogQHR5cGUge1NlcnZpY2VQcm92aWRlclBhcmFtZXRlcnN9XG4gKi9cblNlcnZpY2VQcm92aWRlci5fcGFyYW1ldGVycyA9IHt9O1xuIiwiaW1wb3J0IHRyYW5zbGF0aW9ucyBmcm9tICcuLi9sYW5nL3N0cmluZ3MuanNvbic7XG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHN0cmluZyBtYW5hZ2VyLiBJdCdzIHVzZWQgdG8gbG9hZCBsb2NhbGl6ZWQgc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RyaW5nTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU3RhdGljIGNsYXNzIFN0cmluZ01hbmFnZXIgY2FuIG5vdCBiZSBpbnN0YW50aWF0ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBvZiBjZXJ0YWluIHN0cmluZyBrZXkuIElmIHRoZSBhc3NvY2lhdGVkIHZhbHVlXG4gICAqIGRvZXNuJ3QgZXhpdHMgcmV0dXJucyB0aGUgb3JpZ2luYWwga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gc3RyaW5nIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZyAtIERFRkFVTFQgPSBudWxsLiBTcGVjaWZ5IHRoZSBsYW5ndWFnZSB0byB0cmFuc2xhdGUgdGhlIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBjb3JyZXNwb25kZW50IHZhbHVlLiBJZiBkb2Vzbid0IGV4aXN0cyBvcmlnaW5hbCBrZXkuXG4gICAqL1xuICBzdGF0aWMgZ2V0KGtleSwgbGFuZykge1xuXG4gICAgLy8gRGVmYXVsdCBsYW5ndWFnZSBkZWZpbml0aW9uXG4gICAgbGV0IHtsYW5ndWFnZX0gPSB0aGlzO1xuXG4gICAgLy8gSWYgcGFyYW1ldGVyIGxhbmd1YWdlLCB1c2UgaXRcbiAgICBpZiAobGFuZykge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5nO1xuICAgIH1cblxuICAgIC8vIEN1dCBkb3duIG9uIHN0cmluZ3MuIGUuZy4gZW5fVVMgLT4gZW5cbiAgICBpZiAobGFuZ3VhZ2UgJiYgbGFuZ3VhZ2UubGVuZ3RoID4gMikge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZS5zbGljZSgwLCAyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzdXBwb3J0IHRoZSBsYW5ndWFnZVxuICAgIGlmICghdGhpcy5zdHJpbmdzLmhhc093blByb3BlcnR5KGxhbmd1YWdlKSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgY29uc29sZS53YXJuKGBVbmtub3duIGxhbmd1YWdlICR7bGFuZ3VhZ2V9IHNldCBpbiBTdHJpbmdNYW5hZ2VyLmApO1xuICAgICAgbGFuZ3VhZ2UgPSAnZW4nO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgc3VwcG9ydGVkIGluIHRoZSBnaXZlbiBsYW5ndWFnZVxuICAgIGlmICghdGhpcy5zdHJpbmdzW2xhbmd1YWdlXS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICBjb25zb2xlLndhcm4oYFVua25vd24ga2V5ICR7a2V5fSBmb3IgbGFuZ3VhZ2UgJHtsYW5ndWFnZX0gaW4gU3RyaW5nTWFuYWdlci5gKTtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nc1tsYW5ndWFnZV1ba2V5XTtcbiAgfVxufVxuXG4vKipcbiAqIERpY3Rpb25hcnkgb2YgZGljdGlvbmFyaWVzOlxuICogS2V5OiBsYW5ndWFnZSBjb2RlXG4gKiBWYWx1ZTogS2V5OiBpZCBvZiB0aGUgc3RyaW5nXG4gKiAgICAgICAgVmFsdWU6IHRyYW5zbGF0aW9uIG9mIHRoZSBzdHJpbmdcbiAqL1xuU3RyaW5nTWFuYWdlci5zdHJpbmdzID0gdHJhbnNsYXRpb25zO1xuXG4vKipcbiAqIExhbmd1YWdlIG9mIHRoZSB0cmFuc2xhdGlvbnM7IEVuZ2xpc2ggYnkgZGVmYXVsdFxuICovXG5TdHJpbmdNYW5hZ2VyLmxhbmd1YWdlID0gJ2VuJztcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHRDYWNoZSB7XG4gIC8qKlxuICAgKiBAY2xhc3NkZXNjXG4gICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50IGEgY2xpZW50LXNpZGUgdGV4dCBjYWNoZSBjbGFzcy4gQ29udGFpbnMgcGFpcnMgb2ZcbiAgICogc3RyaW5ncyAoa2V5L3ZhbHVlKSB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGluIGFueSBtb21lbnQuIFVzdWFsbHkgdXNlZFxuICAgKiB0byBzdG9yZSBBSkFYIHJlc3BvbnNlcyBmb3IgdGV4dCBzZXJ2aWNlcyBsaWtlIG1hdGhtbDJsYXRleFxuICAgKiAoYy5mIHtAbGluayBMYXRleH0gY2xhc3MpIG9yIG1hdGhtbDJhY2Nlc3NpYmxlIChjLmYge0BsaW5rIEFjY2Vzc2liaWxpdHl9IGNsYXNzKS5cbiAgICogQGNvbnN0cnVjdHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIENhY2hlIGFycmF5IHByb3BlcnR5IHN0b3JpbmcgdGhlIGNhY2hlIGVudHJpZXMuXG4gICAgICogQHR5cGUge0FycmF5LjxTdHJpbmc+fVxuICAgICAqL1xuICAgIHRoaXMuY2FjaGUgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBwb3B1bGF0ZXMgYSBrZXkvdmFsdWUgcGFpciBpbnRvIHRoZSB7QGxpbmsgdGhpcy5jYWNoZX0gcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLSBDYWNoZSBrZXksIHVzdWFsbHkgdGhlIHNlcnZpY2Ugc3RyaW5nIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC0gQ2FjaGUgdmFsdWUsIHVzdWFsbHkgdGhlIHNlcnZpY2UgcmVzcG9uc2UuXG4gICAqL1xuICBwb3B1bGF0ZShrZXksIHZhbHVlKSB7XG4gICAgdGhpcy5jYWNoZVtrZXldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FjaGUgdmFsdWUgYXNzb2NpYXRlZCB0byBjZXJ0YWluIGNhY2hlIGtleS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtIENhY2hlIGtleSwgdXN1YWxseSB0aGUgc2VydmljZSBzdHJpbmcgcGFyYW1ldGVyLlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHZhbHVlIC0gQ2FjaGUgdmFsdWUsIGlmIGV4aXN0cy4gRmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0KGtleSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jYWNoZSwga2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5pbXBvcnQgTWF0aE1MIGZyb20gJy4vbWF0aG1sJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgTGF0ZXggZnJvbSAnLi9sYXRleCc7XG5pbXBvcnQgU3RyaW5nTWFuYWdlciBmcm9tICcuL3N0cmluZ21hbmFnZXInO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiB1dGlsaXR5IGNsYXNzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVdGlsIHtcbiAgLyoqXG4gICAqIEZpcmVzIGFuIGV2ZW50IGluIGEgdGFyZ2V0LlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCAtIHRhcmdldCB3aGVyZSBldmVudCBzaG91bGQgYmUgZmlyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgZXZlbnQgdG8gZmlyZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGZpcmVFdmVudChldmVudFRhcmdldCwgZXZlbnROYW1lKSB7XG4gICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7XG4gICAgICBjb25zdCBldmVudE9iamVjdCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XG4gICAgICBldmVudE9iamVjdC5pbml0RXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlKTtcbiAgICAgIHJldHVybiAhZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChldmVudE9iamVjdCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRPYmplY3QgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICAgIHJldHVybiBldmVudFRhcmdldC5maXJlRXZlbnQoYG9uJHtldmVudE5hbWV9YCwgZXZlbnRPYmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyb3NzLWJyb3dzZXIgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgLSB0YXJnZXQgdG8gYWRkIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIHNwZWNpZmllcyB0aGUgdHlwZSBvZiBldmVudC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbEJhY2tGdW5jdGlvbiAtIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgYWRkRXZlbnQoZXZlbnRUYXJnZXQsIGV2ZW50TmFtZSwgY2FsbEJhY2tGdW5jdGlvbikge1xuICAgIGlmIChldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICBldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbEJhY2tGdW5jdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudFRhcmdldC5hdHRhY2hFdmVudCkge1xuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICBldmVudFRhcmdldC5hdHRhY2hFdmVudChgb24ke2V2ZW50TmFtZX1gLCBjYWxsQmFja0Z1bmN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3Jvc3MtYnJvd3NlciByZW1vdmVFdmVudExpc3RlbmVyL2RldGFjaEV2ZW50IGZ1bmN0aW9uLlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCAtIHRhcmdldCB0byBhZGQgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGV2ZW50LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsQmFja0Z1bmN0aW9uIC0gZnVuY3Rpb24gdG8gcmVtb3ZlIGZyb20gdGhlIGV2ZW50IHRhcmdldC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlbW92ZUV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudE5hbWUsIGNhbGxCYWNrRnVuY3Rpb24pIHtcbiAgICBpZiAoZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxCYWNrRnVuY3Rpb24sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUYXJnZXQuZGV0YWNoRXZlbnQpIHtcbiAgICAgIGV2ZW50VGFyZ2V0LmRldGFjaEV2ZW50KGBvbiR7ZXZlbnROYW1lfWAsIGNhbGxCYWNrRnVuY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBhIGNhbGxiYWNrIGZ1bmN0aW9uLCBmb3IgYSBjZXJ0YWluIGV2ZW50IHRhcmdldCwgdG8gdGhlIGZvbGxvd2luZyBldmVudCB0eXBlczpcbiAgICogLSBkYmxjbGlja1xuICAgKiAtIG1vdXNlZG93blxuICAgKiAtIG1vdXNldXBcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgLSBldmVudCB0YXJnZXQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvdWJsZUNsaWNrSGFuZGxlciAtIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIG9uIGRibGNsaWNrIGV2ZW50LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb3VzZWRvd25IYW5kbGVyIC0gZnVuY3Rpb24gdG8gcnVuIHdoZW4gb24gbW91c2Vkb3duIGV2ZW50LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb3VzZXVwSGFuZGxlciAtIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIG9uIG1vdXNldXAgZXZlbnQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBhZGRFbGVtZW50RXZlbnRzKGV2ZW50VGFyZ2V0LCBkb3VibGVDbGlja0hhbmRsZXIsIG1vdXNlZG93bkhhbmRsZXIsIG1vdXNldXBIYW5kbGVyKSB7XG4gICAgaWYgKGRvdWJsZUNsaWNrSGFuZGxlcikge1xuICAgICAgdGhpcy5jYWxsYmFja0RibGNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWxFdmVudCA9IChldmVudCkgfHwgd2luZG93LmV2ZW50O1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVhbEV2ZW50LnNyY0VsZW1lbnQgPyByZWFsRXZlbnQuc3JjRWxlbWVudCA6IHJlYWxFdmVudC50YXJnZXQ7XG4gICAgICAgIGRvdWJsZUNsaWNrSGFuZGxlcihlbGVtZW50LCByZWFsRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgVXRpbC5hZGRFdmVudChldmVudFRhcmdldCwgJ2RibGNsaWNrJywgdGhpcy5jYWxsYmFja0RibGNsaWNrKTtcbiAgICB9XG5cbiAgICBpZiAobW91c2Vkb3duSGFuZGxlcikge1xuICAgICAgdGhpcy5jYWxsYmFja01vdXNlZG93biA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCByZWFsRXZlbnQgPSAoZXZlbnQpIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlYWxFdmVudC5zcmNFbGVtZW50ID8gcmVhbEV2ZW50LnNyY0VsZW1lbnQgOiByZWFsRXZlbnQudGFyZ2V0O1xuICAgICAgICBtb3VzZWRvd25IYW5kbGVyKGVsZW1lbnQsIHJlYWxFdmVudCk7XG4gICAgICB9O1xuXG4gICAgICBVdGlsLmFkZEV2ZW50KGV2ZW50VGFyZ2V0LCAnbW91c2Vkb3duJywgdGhpcy5jYWxsYmFja01vdXNlZG93bik7XG4gICAgfVxuXG4gICAgaWYgKG1vdXNldXBIYW5kbGVyKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrTW91c2V1cCA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCByZWFsRXZlbnQgPSAoZXZlbnQpIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlYWxFdmVudC5zcmNFbGVtZW50ID8gcmVhbEV2ZW50LnNyY0VsZW1lbnQgOiByZWFsRXZlbnQudGFyZ2V0O1xuICAgICAgICBtb3VzZXVwSGFuZGxlcihlbGVtZW50LCByZWFsRXZlbnQpO1xuICAgICAgfTtcbiAgICAgIC8vIENocm9tZSBkb2Vzbid0IHRyaWdnZXIgdGhpcyBldmVudCBmb3IgZXZlbnRUYXJnZXQgaWYgd2UgcmVsZWFzZSB0aGUgbW91c2UgYnV0dG9uXG4gICAgICAvLyB3aGlsZSB0aGUgbW91c2UgaXMgb3V0c2lkZSB0aGUgZWRpdG9yIHRleHQgZmllbGQuXG4gICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZDogd2UgdHJpZ2dlciB0aGUgZXZlbnQgaW5kZXBlbmRlbnRseSBvZiB3aGVyZSB0aGUgbW91c2VcbiAgICAgIC8vIGlzIHdoZW4gd2UgcmVsZWFzZSBpdHMgYnV0dG9uLlxuICAgICAgVXRpbC5hZGRFdmVudChkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLmNhbGxiYWNrTW91c2V1cCk7XG4gICAgICBVdGlsLmFkZEV2ZW50KGV2ZW50VGFyZ2V0LCAnbW91c2V1cCcsIHRoaXMuY2FsbGJhY2tNb3VzZXVwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBjYWxsYmFjayBmdW5jdGlvbiwgZm9yIGEgY2VydGFpbiBldmVudCB0YXJnZXQsIHRvIHRoZSBmb2xsb3dpbmcgZXZlbnQgdHlwZXM6XG4gICAqIC0gZGJsY2xpY2tcbiAgICogLSBtb3VzZWRvd25cbiAgICogLSBtb3VzZXVwXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IC0gZXZlbnQgdGFyZ2V0LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVtb3ZlRWxlbWVudEV2ZW50cyhldmVudFRhcmdldCkge1xuICAgIFV0aWwucmVtb3ZlRXZlbnQoZXZlbnRUYXJnZXQsICdkYmxjbGljaycsIHRoaXMuY2FsbGJhY2tEYmxjbGljayk7XG4gICAgVXRpbC5yZW1vdmVFdmVudChldmVudFRhcmdldCwgJ21vdXNlZG93bicsIHRoaXMuY2FsbGJhY2tNb3VzZWRvd24pO1xuICAgIFV0aWwucmVtb3ZlRXZlbnQoZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5jYWxsYmFja01vdXNldXApO1xuICAgIFV0aWwucmVtb3ZlRXZlbnQoZXZlbnRUYXJnZXQsICdtb3VzZXVwJywgdGhpcy5jYWxsYmFja01vdXNldXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjbGFzcyBuYW1lIHRvIGEgSFRNTEVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSB0aGUgSFRNTCBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gdGhlIGNsYXNzIG5hbWUuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICBpZiAoIVV0aWwuY29udGFpbnNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKSB7XG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSBgICR7Y2xhc3NOYW1lfWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIEhUTUxFbGVtZW50IGNvbnRhaW5zIGEgY2VydGFpbiBjbGFzcy5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIHRoZSBIVE1MIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSB0aGUgY2xhc3NOYW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgSFRNTEVsZW1lbnQgY29udGFpbnMgdGhlIGNsYXNzIG5hbWUuIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGNvbnRhaW5zQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhKCdjbGFzc05hbWUnIGluIGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENsYXNzZXMgPSBlbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpO1xuXG4gICAgZm9yIChsZXQgaSA9IGN1cnJlbnRDbGFzc2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBpZiAoY3VycmVudENsYXNzZXNbaV0gPT09IGNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY2VydGFpbiBjbGFzcyBmb3IgYSBIVE1MRWxlbWVudC5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIHRoZSBIVE1MIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSB0aGUgY2xhc3MgbmFtZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgIGxldCBuZXdDbGFzc05hbWUgPSAnJztcbiAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKGNsYXNzZXNbaV0gIT09IGNsYXNzTmFtZSkge1xuICAgICAgICBuZXdDbGFzc05hbWUgKz0gYCR7Y2xhc3Nlc1tpXX0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWUudHJpbSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIG9sZCB4bWwgaW5pdGlhbCB0ZXh0IGF0dHJpYnV0ZSAod2l0aCDCq8K7KSB0byB0aGUgY29ycmVjdCBvbmUod2l0aCDCp2x0O8KnZ3Q7KS4gSXQnc1xuICAgKiB1c2VkIHRvIHBhcnNlIG9sZCBhcHBsZXRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHN0cmluZyBjb250YWluaW5nIHNhZmVYbWwgY2hhcmFjdGVyc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBhIHN0cmluZyB3aXRoIHNhZmVYbWwgY2hhcmFjdGVycyBwYXJzZWQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBjb252ZXJ0T2xkWG1saW5pdGlhbHRleHRBdHRyaWJ1dGUodGV4dCkge1xuICAgIC8vIFVzZWQgdG8gZml4IGEgYnVnIHdpdGggQ2FzIGltcG9ydGVkIGZyb20gTW9vZGxlIDEuOSB0byBNb29kbGUgMi54LlxuICAgIC8vIFRoaXMgY291bGQgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuXG4gICAgY29uc3QgdmFsID0gJ3ZhbHVlPSc7XG5cbiAgICBjb25zdCB4aXRwb3MgPSB0ZXh0LmluZGV4T2YoJ3htbGluaXRpYWx0ZXh0Jyk7XG4gICAgY29uc3QgdmFscG9zID0gdGV4dC5pbmRleE9mKHZhbCwgeGl0cG9zKTtcbiAgICBjb25zdCBxdW90ZSA9IHRleHQuY2hhckF0KHZhbHBvcyArIHZhbC5sZW5ndGgpO1xuICAgIGNvbnN0IHN0YXJ0cXVvdGUgPSB2YWxwb3MgKyB2YWwubGVuZ3RoICsgMTtcbiAgICBjb25zdCBlbmRxdW90ZSA9IHRleHQuaW5kZXhPZihxdW90ZSwgc3RhcnRxdW90ZSk7XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0cXVvdGUsIGVuZHF1b3RlKTtcblxuICAgIGxldCBuZXd2YWx1ZSA9IHZhbHVlLnNwbGl0KCfCqycpLmpvaW4oJ8KnbHQ7Jyk7XG4gICAgbmV3dmFsdWUgPSBuZXd2YWx1ZS5zcGxpdCgnwrsnKS5qb2luKCfCp2d0OycpO1xuICAgIG5ld3ZhbHVlID0gbmV3dmFsdWUuc3BsaXQoJyYnKS5qb2luKCfCpycpO1xuICAgIG5ld3ZhbHVlID0gbmV3dmFsdWUuc3BsaXQoJ8KoJykuam9pbignwqdxdW90OycpO1xuXG4gICAgdGV4dCA9IHRleHQuc3BsaXQodmFsdWUpLmpvaW4obmV3dmFsdWUpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyb3NzLWJyb3dzZXIgc29sdXRpb24gZm9yIGNyZWF0aW5nIG5ldyBlbGVtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0YWcgbmFtZSBvZiB0aGUgd2lzaGVkIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyaWJ1dGVzIC0gYW4gb2JqZWN0IHdoZXJlIGVhY2gga2V5IGlzIGEgd2lzaGVkXG4gICAqIGF0dHJpYnV0ZSBuYW1lIGFuZCBlYWNoIHZhbHVlIGlzIGl0cyB2YWx1ZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtjcmVhdG9yXSAtIGlmIHN1cHBsaWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlXG4gICAqIHRoZSBcImNyZWF0ZUVsZW1lbnRcIiBtZXRob2QgZnJvbSB0aGlzIHBhcmFtLiBPdGhlcndpc2VcbiAgICogZG9jdW1lbnQgd2lsbCBiZSB1c2VkIGFzIGNyZWF0b3IuXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fSBUaGUgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZXMgYXNzaWduZWQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVFbGVtZW50KHRhZ05hbWUsIGF0dHJpYnV0ZXMsIGNyZWF0b3IpIHtcbiAgICBpZiAoYXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhdHRyaWJ1dGVzID0ge307XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY3JlYXRvciA9IGRvY3VtZW50O1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50O1xuXG4gICAgLypcbiAgICAqIEludGVybmV0IEV4cGxvcmVyIGZpeDpcbiAgICAqIElmIHlvdSBjcmVhdGUgYSBuZXcgb2JqZWN0IGR5bmFtaWNhbGx5LCB5b3UgY2FuJ3Qgc2V0IGEgbm9uLXN0YW5kYXJkIGF0dHJpYnV0ZS5cbiAgICAqIEZvciBleGFtcGxlLCB5b3UgY2FuJ3Qgc2V0IHRoZSBcInNyY1wiIGF0dHJpYnV0ZSBvbiBhbiBcImFwcGxldFwiIG9iamVjdC5cbiAgICAqIE90aGVyIGJyb3dzZXJzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCB3aWxsIHJ1biB0aGUgc3RhbmRhcmQgY29kZS5cbiAgICAqL1xuICAgIHRyeSB7XG4gICAgICBsZXQgaHRtbCA9IGA8JHt0YWdOYW1lfWA7XG5cbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHJpYnV0ZU5hbWUpID0+IHtcbiAgICAgICAgaHRtbCArPSBgICR7YXR0cmlidXRlTmFtZX09XCIke1V0aWwuaHRtbEVudGl0aWVzKGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pfVwiYDtcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPic7XG4gICAgICBlbGVtZW50ID0gY3JlYXRvci5jcmVhdGVFbGVtZW50KGh0bWwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVsZW1lbnQgPSBjcmVhdG9yLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyaWJ1dGVOYW1lKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IEhUTUwgZnJvbSBpdCdzIEhUTUwgY29kZSBhcyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3RDb2RlIC0gaHRtbCBjb2RlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fSB0aGUgSFRNTCBlbGVtZW50LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlT2JqZWN0KG9iamVjdENvZGUsIGNyZWF0b3IpIHtcbiAgICBpZiAoY3JlYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjcmVhdG9yID0gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgY2FuJ3QgaW5jbHVkZSBcInBhcmFtXCIgdGFnIHdoZW4gaXMgc2V0dGluZyBhbiBpbm5lckhUTUwgcHJvcGVydHkuXG4gICAgb2JqZWN0Q29kZSA9IG9iamVjdENvZGUuc3BsaXQoJzxhcHBsZXQgJykuam9pbignPHNwYW4gd2lyaXNPYmplY3Q9XCJXaXJpc0FwcGxldFwiICcpLnNwbGl0KCc8QVBQTEVUICcpLmpvaW4oJzxzcGFuIHdpcmlzT2JqZWN0PVwiV2lyaXNBcHBsZXRcIiAnKTsgLy8gSXQgaXMgYSAnc3BhbicgYmVjYXVzZSAnc3Bhbicgb2JqZWN0cyBjYW4gY29udGFpbiAnYnInIG5vZGVzLlxuICAgIG9iamVjdENvZGUgPSBvYmplY3RDb2RlLnNwbGl0KCc8L2FwcGxldD4nKS5qb2luKCc8L3NwYW4+Jykuc3BsaXQoJzwvQVBQTEVUPicpLmpvaW4oJzwvc3Bhbj4nKTtcblxuICAgIG9iamVjdENvZGUgPSBvYmplY3RDb2RlLnNwbGl0KCc8cGFyYW0gJykuam9pbignPGJyIHdpcmlzT2JqZWN0PVwiV2lyaXNQYXJhbVwiICcpLnNwbGl0KCc8UEFSQU0gJykuam9pbignPGJyIHdpcmlzT2JqZWN0PVwiV2lyaXNQYXJhbVwiICcpOyAvLyBJdCBpcyBhICdicicgYmVjYXVzZSAnYnInIGNhbid0IGNvbnRhaW4gbm9kZXMuXG4gICAgb2JqZWN0Q29kZSA9IG9iamVjdENvZGUuc3BsaXQoJzwvcGFyYW0+Jykuam9pbignPC9icj4nKS5zcGxpdCgnPC9QQVJBTT4nKS5qb2luKCc8L2JyPicpO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gVXRpbC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7fSwgY3JlYXRvcik7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IG9iamVjdENvZGU7XG5cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVQYXJhbXNGaXgob2JqZWN0KSB7XG4gICAgICBpZiAob2JqZWN0LmdldEF0dHJpYnV0ZSAmJiBvYmplY3QuZ2V0QXR0cmlidXRlKCd3aXJpc09iamVjdCcpID09PSAnV2lyaXNQYXJhbScpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc1BhcnNlZCA9IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBpZiAob2JqZWN0LmF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzUGFyc2VkW29iamVjdC5hdHRyaWJ1dGVzW2ldLm5vZGVOYW1lXSA9IG9iamVjdC5hdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbSA9IFV0aWwuY3JlYXRlRWxlbWVudCgncGFyYW0nLCBhdHRyaWJ1dGVzUGFyc2VkLCBjcmVhdG9yKTtcblxuICAgICAgICAvLyBJRSBmaXguXG4gICAgICAgIGlmIChwYXJhbS5OQU1FKSB7XG4gICAgICAgICAgcGFyYW0ubmFtZSA9IHBhcmFtLk5BTUU7XG4gICAgICAgICAgcGFyYW0udmFsdWUgPSBwYXJhbS5WQUxVRTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtLnJlbW92ZUF0dHJpYnV0ZSgnd2lyaXNPYmplY3QnKTtcbiAgICAgICAgb2JqZWN0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHBhcmFtLCBvYmplY3QpO1xuICAgICAgfSBlbHNlIGlmIChvYmplY3QuZ2V0QXR0cmlidXRlICYmIG9iamVjdC5nZXRBdHRyaWJ1dGUoJ3dpcmlzT2JqZWN0JykgPT09ICdXaXJpc0FwcGxldCcpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc1BhcnNlZCA9IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBpZiAob2JqZWN0LmF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzUGFyc2VkW29iamVjdC5hdHRyaWJ1dGVzW2ldLm5vZGVOYW1lXSA9IG9iamVjdC5hdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcHBsZXQgPSBVdGlsLmNyZWF0ZUVsZW1lbnQoJ2FwcGxldCcsIGF0dHJpYnV0ZXNQYXJzZWQsIGNyZWF0b3IpO1xuICAgICAgICBhcHBsZXQucmVtb3ZlQXR0cmlidXRlKCd3aXJpc09iamVjdCcpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0LmNoaWxkTm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICByZWN1cnNpdmVQYXJhbXNGaXgob2JqZWN0LmNoaWxkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgaWYgKG9iamVjdC5jaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdwYXJhbScpIHtcbiAgICAgICAgICAgIGFwcGxldC5hcHBlbmRDaGlsZChvYmplY3QuY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpIC09IDE7IC8vIFdoZW4gd2UgaW5zZXJ0IHRoZSBvYmplY3QgY2hpbGQgaW50byB0aGUgYXBwbGV0LCBvYmplY3QgbG9zZXMgb25lIGNoaWxkLlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9iamVjdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChhcHBsZXQsIG9iamVjdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5jaGlsZE5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgcmVjdXJzaXZlUGFyYW1zRml4KG9iamVjdC5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlY3Vyc2l2ZVBhcmFtc0ZpeChjb250YWluZXIpO1xuICAgIHJldHVybiBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBFbGVtZW50IHRvIGl0cyBIVE1MIGNvZGUuXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIGVudHJ5IGVsZW1lbnQuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIEhUTUwgY29kZSBvZiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZU9iamVjdENvZGUoZWxlbWVudCkge1xuICAgIC8vIEluIGNhc2UgdGhhdCB0aGUgaW1hZ2Ugd2FzIG5vdCBjcmVhdGVkLCB0aGUgb2JqZWN0IGNhbiBiZSBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7IC8vIEVMRU1FTlRfTk9ERS5cbiAgICAgIGxldCBvdXRwdXQgPSBgPCR7ZWxlbWVudC50YWdOYW1lfWA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChlbGVtZW50LmF0dHJpYnV0ZXNbaV0uc3BlY2lmaWVkKSB7XG4gICAgICAgICAgb3V0cHV0ICs9IGAgJHtlbGVtZW50LmF0dHJpYnV0ZXNbaV0ubmFtZX09XCIke1V0aWwuaHRtbEVudGl0aWVzKGVsZW1lbnQuYXR0cmlidXRlc1tpXS52YWx1ZSl9XCJgO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBvdXRwdXQgKz0gJz4nO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgb3V0cHV0ICs9IFV0aWwuY3JlYXRlT2JqZWN0KGVsZW1lbnQuY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQgKz0gYDwvJHtlbGVtZW50LnRhZ05hbWV9PmA7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdESVYnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdTQ1JJUFQnKSB7XG4gICAgICAgIG91dHB1dCArPSBgPjwvJHtlbGVtZW50LnRhZ05hbWV9PmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgKz0gJy8+JztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMykgeyAvLyBURVhUX05PREUuXG4gICAgICByZXR1cm4gVXRpbC5odG1sRW50aXRpZXMoZWxlbWVudC5ub2RlVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25jYXRlbmF0ZXMgdHdvIFVSTCBwYXRocy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGgxIC0gZmlyc3QgVVJMIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGgyIC0gc2Vjb25kIFVSTCBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IG5ldyBVUkwuXG4gICAqL1xuICBzdGF0aWMgY29uY2F0ZW5hdGVVcmwocGF0aDEsIHBhdGgyKSB7XG4gICAgbGV0IHNlcGFyYXRvciA9ICcnO1xuICAgIGlmICgocGF0aDEuaW5kZXhPZignLycpICE9PSBwYXRoMS5sZW5ndGgpICYmIChwYXRoMi5pbmRleE9mKCcvJykgIT09IDApKSB7XG4gICAgICBzZXBhcmF0b3IgPSAnLyc7XG4gICAgfVxuICAgIHJldHVybiAocGF0aDEgKyBzZXBhcmF0b3IgKyBwYXRoMikucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB0ZXh0IGFuZCByZXBsYWNlcyBhbGwgSFRNTCBzcGVjaWFsIGNoYXJhY3RlcnMgYnkgdGhlaXIgY29ycmVzcG9uZGVudCBlbnRpdGllcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gdGV4dCB0byBiZSBwYXJzZWQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBpbnB1dCB0ZXh0IHdpdGggYWxsIHRoZWlyIHNwZWNpYWwgY2hhcmFjdGVycyByZXBsYWNlZCBieSB0aGVpciBlbnRpdGllcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGh0bWxFbnRpdGllcyhpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC5zcGxpdCgnJicpLmpvaW4oJyZhbXA7Jykuc3BsaXQoJzwnKS5qb2luKCcmbHQ7JylcbiAgICAgIC5zcGxpdCgnPicpXG4gICAgICAuam9pbignJmd0OycpXG4gICAgICAuc3BsaXQoJ1wiJylcbiAgICAgIC5qb2luKCcmcXVvdDsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBIVE1MIHRvIHByZXZlbnQgWFNTIGluamVjdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gaHRtbCB0byBiZSBzYW5pdGl6ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gaHRtbCBzYW5pdGl6ZWQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBodG1sU2FuaXRpemUoaHRtbCkge1xuICAgIGxldCBhbm5vdGF0aW9uUmVnZXggPSAvXFw8YW5ub3RhdGlvbi4rXFw8XFwvYW5ub3RhdGlvblxcPi9cbiAgICAvLyBHZXQgYWxsIHRoZSBhbm5vdGF0aW9uIGNvbnRlbnQgaW5jbHVkaW5nIHRoZSB0YWdzLlxuICAgIGxldCBhbm5vdGF0aW9uID0gaHRtbC5tYXRjaChhbm5vdGF0aW9uUmVnZXgpO1xuICAgIC8vIFNhbml0aXplIGh0bWwgY29kZSB3aXRob3V0IHJlbW92aW5nIHRoZSA8c2VtYW50aWNzPiBhbmQgPGFubm90YXRpb24+IHRhZ3MuXG4gICAgaHRtbCA9IERPTVB1cmlmeS5zYW5pdGl6ZShodG1sLCB7IEFERF9UQUdTOiBbJ3NlbWFudGljcycsICdhbm5vdGF0aW9uJ10sIEFMTE9XRURfQVRUUjogWydtYXRodmFyaWFudCcsICdjbGFzcycsICdsaW5lYnJlYWsnLCAnb3BlbicsICdjbG9zZSddfSk7XG4gICAgLy8gUmVhZGQgb2xkIGFubm90YXRpb24gY29udGVudC5cbiAgICByZXR1cm4gaHRtbC5yZXBsYWNlKGFubm90YXRpb25SZWdleCwgYW5ub3RhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdGV4dCBhbmQgcmVwbGFjZXMgYWxsIHRoZSBIVE1MIGVudGl0aWVzIGJ5IHRoZWlyIGNoYXJhY3RlcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIHRleHQgdG8gYmUgcGFyc2VkXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBpbnB1dCB0ZXh0IHdpdGggYWxsIHRoZWlyIGVudGl0aWVzIHJlcGxhY2VkIGJ5IGNoYXJhY3RlcnMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBodG1sRW50aXRpZXNEZWNvZGUoaW5wdXQpIHtcbiAgICAvLyBUZXh0YXJlYSBlbGVtZW50IGRlY29kZXMgd2hlbiBpbm5lciBodG1sIGlzIHNldC5cbiAgICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGV4dGFyZWEuaW5uZXJIVE1MID0gaW5wdXQ7XG4gICAgcmV0dXJuIHRleHRhcmVhLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjcm9zcy1icm93c2VyIGh0dHAgcmVxdWVzdC5cbiAgICogQHJldHVybiB7b2JqZWN0fSBodHRwUmVxdWVzdCByZXF1ZXN0IG9iamVjdC5cbiAgICogQHJldHVybnMge1hNTEh0dHBSZXF1ZXN0fEFjdGl2ZVhPYmplY3R9IHRoZSBwcm9wZXIgcmVxdWVzdCBvYmplY3QuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSHR0cFJlcXVlc3QoKSB7XG4gICAgY29uc3QgY3VycmVudFBhdGggPSB3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKS5zdWJzdHIoMCwgd2luZG93LmxvY2F0aW9uLnRvU3RyaW5nKCkubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICAgIGlmIChjdXJyZW50UGF0aC5zdWJzdHIoMCwgNykgPT09ICdmaWxlOi8vJykge1xuICAgICAgdGhyb3cgU3RyaW5nTWFuYWdlci5nZXQoJ2V4Y2VwdGlvbl9jcm9zc19zaXRlJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTtcbiAgICAgIH0gY2F0Y2ggKG9jKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGhhc2ggdG8gYSBIVFRQIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBwcm9wZXJ0aWVzIC0gYSBrZXkvdmFsdWUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBhIEhUVFAgcXVlcnkgY29udGFpbmluZyBhbGwgdGhlIGtleSB2YWx1ZSBwYWlycyB3aXRoXG4gICAqIGFsbCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHJlcGxhY2VkIGJ5IHRoZWlyIGVudGl0aWVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgaHR0cEJ1aWxkUXVlcnkocHJvcGVydGllcykge1xuICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2goKGkpID0+IHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzW2ldICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0ICs9IGAke1V0aWwudXJsRW5jb2RlKGkpfT0ke1V0aWwudXJsRW5jb2RlKHByb3BlcnRpZXNbaV0pfSZgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGVsZXRpbmcgbGFzdCAnJicgZW1wdHkgY2hhcmFjdGVyLlxuICAgIGlmIChyZXN1bHQuc3Vic3RyaW5nKHJlc3VsdC5sZW5ndGggLSAxKSA9PT0gJyYnKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBoYXNoIHRvIHN0cmluZyBzb3J0aW5nIGtleXMgdG8gZ2V0IGEgZGV0ZXJtaW5pc3RpYyBvdXRwdXRcbiAgICogQHBhcmFtIHtPYmplY3RbXX0gaGFzaCAtIGEga2V5L3ZhbHVlIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gYSBzdHJpbmcgd2l0aCB0aGUgZm9ybSBrZXkxPXZhbHVlMS4uLmtleW49dmFsdWVuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBwcm9wZXJ0aWVzVG9TdHJpbmcoaGFzaCkge1xuICAgIC8vIDEuIFNvcnQga2V5cy4gV2Ugc29ydCB0aGUga2V5cyBiZWNhdXNlIHdlIHdhbnQgYSBkZXRlcm1pbmlzdGljIG91dHB1dC5cbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgT2JqZWN0LmtleXMoaGFzaCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhhc2gsIGtleSkpIHtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBuID0ga2V5cy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpICs9IDEpIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG47IGogKz0gMSkge1xuICAgICAgICBjb25zdCBzMSA9IGtleXNbaV07XG4gICAgICAgIGNvbnN0IHMyID0ga2V5c1tqXTtcbiAgICAgICAgaWYgKFV0aWwuY29tcGFyZVN0cmluZ3MoczEsIHMyKSA+IDApIHtcbiAgICAgICAgICAvLyBTd2FwLlxuICAgICAgICAgIGtleXNbaV0gPSBzMjtcbiAgICAgICAgICBrZXlzW2pdID0gczE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBHZW5lcmF0ZSBvdXRwdXQuXG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSArPSAxKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgb3V0cHV0ICs9IGtleTtcbiAgICAgIG91dHB1dCArPSAnPSc7XG4gICAgICBsZXQgdmFsdWUgPSBoYXNoW2tleV07XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xcXFwnLCAnXFxcXFxcXFwnKTtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxuJywgJ1xcXFxuJyk7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xccicsICdcXFxccicpO1xuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdcXHQnLCAnXFxcXHQnKTtcblxuICAgICAgb3V0cHV0ICs9IHZhbHVlO1xuICAgICAgb3V0cHV0ICs9ICdcXG4nO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgdHdvIHN0cmluZ3MgdXNpbmcgY2hhckNvZGVBdCBtZXRob2RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGEgLSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGIgLSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBhbmQgYlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgY29tcGFyZVN0cmluZ3MoYSwgYikge1xuICAgIGxldCBpO1xuICAgIGNvbnN0IGFuID0gYS5sZW5ndGg7XG4gICAgY29uc3QgYm4gPSBiLmxlbmd0aDtcbiAgICBjb25zdCBuID0gKGFuID4gYm4pID8gYm4gOiBhbjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSArPSAxKSB7XG4gICAgICBjb25zdCBjID0gVXRpbC5maXhlZENoYXJDb2RlQXQoYSwgaSkgLSBVdGlsLmZpeGVkQ2hhckNvZGVBdChiLCBpKTtcbiAgICAgIGlmIChjICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXggY2hhckNvZGVBdCgpIEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gaGFuZGxlIG5vbi1CYXNpYy1NdWx0aWxpbmd1YWwtUGxhbmUgY2hhcmFjdGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIGlucHV0IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaWR4IC0gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMFxuICAgKiBhbmQgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgVVRGLTE2IGNvZGUgb2YgdGhlIHN0cmluZyBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBmaXhlZENoYXJDb2RlQXQoc3RyaW5nLCBpZHgpIHtcbiAgICBpZHggPSBpZHggfHwgMDtcbiAgICBjb25zdCBjb2RlID0gc3RyaW5nLmNoYXJDb2RlQXQoaWR4KTtcbiAgICBsZXQgaGk7XG4gICAgbGV0IGxvdztcblxuICAgIC8qIEhpZ2ggc3Vycm9nYXRlIChjb3VsZCBjaGFuZ2UgbGFzdCBoZXggdG8gMHhEQjdGIHRvIHRyZWF0IGhpZ2hcbiAgICBwcml2YXRlIHN1cnJvZ2F0ZXMgYXMgc2luZ2xlIGNoYXJhY3RlcnMpICovXG5cbiAgICBpZiAoY29kZSA+PSAweEQ4MDAgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgIGhpID0gY29kZTtcbiAgICAgIGxvdyA9IHN0cmluZy5jaGFyQ29kZUF0KGlkeCArIDEpO1xuICAgICAgaWYgKE51bWJlci5pc05hTihsb3cpKSB7XG4gICAgICAgIHRocm93IFN0cmluZ01hbmFnZXIuZ2V0KCdleGNlcHRpb25faGlnaF9zdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKGhpIC0gMHhEODAwKSAqIDB4NDAwKSArIChsb3cgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA+PSAweERDMDAgJiYgY29kZSA8PSAweERGRkYpIHsgLy8gTG93IHN1cnJvZ2F0ZS5cbiAgICAgIC8qIFdlIHJldHVybiBmYWxzZSB0byBhbGxvdyBsb29wcyB0byBza2lwIHRoaXMgaXRlcmF0aW9uIHNpbmNlIHNob3VsZCBoYXZlXG4gICAgICBhbHJlYWR5IGhhbmRsZWQgaGlnaCBzdXJyb2dhdGUgYWJvdmUgaW4gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbi4gKi9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBVUkwgd2l0aCBpdCdzIHF1ZXJ5IHBhcmFtcyBjb252ZXJ0ZWQgaW50byBhcnJheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIGlucHV0IFVSTC5cbiAgICogQHJldHVybnMge09iamVjdFtdfSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBVUkwgcXVlcnkgcGFyYW1zLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdXJsVG9Bc3NBcnJheSh1cmwpIHtcbiAgICBsZXQgaTtcbiAgICBpID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdXJsLnN1YnN0cmluZyhpICsgMSk7XG4gICAgICBjb25zdCBzcyA9IHF1ZXJ5LnNwbGl0KCcmJyk7XG4gICAgICBjb25zdCBoID0ge307XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgcyA9IHNzW2ldO1xuICAgICAgICBjb25zdCBrdiA9IHMuc3BsaXQoJz0nKTtcbiAgICAgICAgaWYgKGt2Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBoW2t2WzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChrdlsxXS5yZXBsYWNlKC9cXCsvZywgJyAnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBoO1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBlbmNvZGVkIFVSTCBieSByZXBsYWNpbmcgZWFjaCBpbnN0YW5jZSBvZiBjZXJ0YWluIGNoYXJhY3RlcnMgYnlcbiAgICogb25lLCB0d28sIHRocmVlIG9yIGZvdXIgZXNjYXBlIHNlcXVlbmNlcyB1c2luZyBlbmNvZGVVUklDb21wb25lbnQgbWV0aG9kLlxuICAgKiAhJygpKiAuIHdpbGwgbm90IGJlIGVuY29kZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGVhclN0cmluZyAtIFVSTCBzdHJpbmcgdG8gYmUgZW5jb2RlZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgd2l0aCBpdCdzIHNwZWNpYWwgY2hhcmFjdGVycyByZXBsYWNlZC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHVybEVuY29kZShjbGVhclN0cmluZykge1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICAvLyBNZXRob2QgZW5jb2RlVVJJQ29tcG9uZW50IGRvZXNuJ3QgZW5jb2RlICEnKCkqfiAuXG4gICAgb3V0cHV0ID0gZW5jb2RlVVJJQ29tcG9uZW50KGNsZWFyU3RyaW5nKTtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgLy8gVE9ETzogVG8gcGFyc2VyP1xuICAvKipcbiAgICogQ29udmVydHMgdGhlIEhUTUwgb2YgYSBpbWFnZSBpbnRvIHRoZSBvdXRwdXQgY29kZSB0aGF0IFdJUklTIG11c3QgcmV0dXJuLlxuICAgKiBCeSBkZWZhdWx0IHJldHVybnMgdGhlIE1hdGhNTCBzdG9yZWQgb24gZGF0YS1tYWhtbCBhdHRyaWJ1dGUgKGlmIGltZ0NvZGUgaXMgYSBmb3JtdWxhKVxuICAgKiBvciB0aGUgV2lyaXNjYXMgYXR0cmlidXRlIG9mIGEgV0lSSVMgYXBwbGV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1nQ29kZSAtIHRoZSBodG1sIGNvZGUgZnJvbSBhIGZvcm11bGEgb3IgYSBDQVMgaW1hZ2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY29udmVydFRvWG1sIC0gdHJ1ZSBpZiB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBYTUwuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY29udmVydFRvU2FmZVhtbCAtIHRydWUgaWYgdGhlIGltYWdlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gc2FmZVhNTC5cbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIFhNTCBvciBzYWZlWE1MIG9mIGEgV0lSSVMgaW1hZ2UuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXRXSVJJU0ltYWdlT3V0cHV0KGltZ0NvZGUsIGNvbnZlcnRUb1htbCwgY29udmVydFRvU2FmZVhtbCkge1xuICAgIGNvbnN0IGltZ09iamVjdCA9IFV0aWwuY3JlYXRlT2JqZWN0KGltZ0NvZGUpO1xuICAgIGlmIChpbWdPYmplY3QpIHtcbiAgICAgIGlmIChpbWdPYmplY3QuY2xhc3NOYW1lID09PSBDb25maWd1cmF0aW9uLmdldCgnaW1hZ2VDbGFzc05hbWUnKSB8fCBpbWdPYmplY3QuZ2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb24uZ2V0KCdpbWFnZU1hdGhtbEF0dHJpYnV0ZScpKSkge1xuICAgICAgICBpZiAoIWNvbnZlcnRUb1htbCkge1xuICAgICAgICAgIHJldHVybiBpbWdDb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YU1hdGhNTCA9IGltZ09iamVjdC5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbi5nZXQoJ2ltYWdlTWF0aG1sQXR0cmlidXRlJykpO1xuICAgICAgICAvLyBUbyBoYW5kbGUgYW5ub3RhdGlvbnMsIGZpcnN0IHdlIG5lZWQgdGhlIE1hdGhNTCBpbiBYTUwuXG4gICAgICAgIGxldCBtYXRoTUwgPSBNYXRoTUwuc2FmZVhtbERlY29kZShkYXRhTWF0aE1MKTtcblxuICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24uZ2V0KCdzYXZlSGFuZFRyYWNlcycpKSB7XG4gICAgICAgICAgbWF0aE1MID0gTWF0aE1MLnJlbW92ZUFubm90YXRpb24obWF0aE1MLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hdGhNTCA9PSBudWxsKSB7XG4gICAgICAgICAgbWF0aE1MID0gaW1nT2JqZWN0LmdldEF0dHJpYnV0ZSgnYWx0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udmVydFRvU2FmZVhtbCkge1xuICAgICAgICAgIGNvbnN0IHNhZmVNYXRoTUwgPSBNYXRoTUwuc2FmZVhtbEVuY29kZShtYXRoTUwpO1xuICAgICAgICAgIHJldHVybiBzYWZlTWF0aE1MO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGhNTDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGltZ0NvZGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbm9kZSBsZW5ndGggaW4gY2hhcmFjdGVycy5cbiAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gSFRNTCBub2RlLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBub2RlIGxlbmd0aC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldE5vZGVMZW5ndGgobm9kZSkge1xuICAgIGNvbnN0IHN0YXRpY05vZGVMZW5ndGhzID0ge1xuICAgICAgSU1HOiAxLFxuICAgICAgQlI6IDEsXG4gICAgfTtcblxuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7IC8vIFRFWFRfTk9ERS5cbiAgICAgIHJldHVybiBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHsgLy8gRUxFTUVOVF9OT0RFLlxuICAgICAgbGV0IGxlbmd0aCA9IHN0YXRpY05vZGVMZW5ndGhzW25vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKV07XG5cbiAgICAgIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZW5ndGggPSAwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBsZW5ndGggKz0gVXRpbC5nZXROb2RlTGVuZ3RoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgc2VsZWN0ZWQgbm9kZSBvciB0ZXh0IGZyb20gYW4gZWRpdGFibGUgSFRNTEVsZW1lbnQuXG4gICAqIElmIHRoZSBjYXJldCBpcyBvbiBhIHRleHQgbm9kZSwgY29uY2F0ZW5hdGVzIGl0IHdpdGggYWxsIHRoZSBwcmV2aW91cyBhbmQgbmV4dCB0ZXh0IG5vZGVzLlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQgLSB0aGUgZWRpdGFibGUgSFRNTEVsZW1lbnQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNJZnJhbWUgIC0gc3BlY2lmaWVzIGlmIHRoZSB0YXJnZXQgaXMgYW4gaWZyYW1lIG9yIG5vdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlR2V0U2VsZWN0aW9uIC0gaWYgdHJ1ZSwgaWdub3JlcyBJRSBzeXN0ZW0gdG8gZ2V0XG4gICAqIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgdXNlcyB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICogQHJldHVybnMge29iamVjdH0gYW4gb2JqZWN0IHdpdGggdGhlICdub2RlJyBrZXkgc2V0IGlmIHRoZSBpdGVtIGlzIGFuXG4gICAqIGVsZW1lbnQgb3IgdGhlIGtleXMgJ25vZGUnIGFuZCAnY2FyZXRQb3NpdGlvbicgaWYgdGhlIGVsZW1lbnQgaXMgdGV4dC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldFNlbGVjdGVkSXRlbSh0YXJnZXQsIGlzSWZyYW1lLCBmb3JjZUdldFNlbGVjdGlvbikge1xuICAgIGxldCB3aW5kb3dUYXJnZXQ7XG5cbiAgICBpZiAoaXNJZnJhbWUpIHtcbiAgICAgIHdpbmRvd1RhcmdldCA9IHRhcmdldC5jb250ZW50V2luZG93O1xuICAgICAgd2luZG93VGFyZ2V0LmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvd1RhcmdldCA9IHdpbmRvdztcbiAgICAgIHRhcmdldC5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgIWZvcmNlR2V0U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHdpbmRvd1RhcmdldC5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgaWYgKHJhbmdlLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHJhbmdlLmh0bWxUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAocmFuZ2UudGV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlsLmdldFNlbGVjdGVkSXRlbSh0YXJnZXQsIGlzSWZyYW1lLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvd1RhcmdldC5kb2N1bWVudC5leGVjQ29tbWFuZCgnSW5zZXJ0SW1hZ2UnLCBmYWxzZSwgJyMnKTtcbiAgICAgICAgbGV0IHRlbXBvcmFsT2JqZWN0ID0gcmFuZ2UucGFyZW50RWxlbWVudCgpO1xuXG4gICAgICAgIGlmICh0ZW1wb3JhbE9iamVjdC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnSU1HJykge1xuICAgICAgICAgIC8vIElFOSBmaXg6IHBhcmVudEVsZW1lbnQoKSBkb2VzIG5vdCByZXR1cm4gdGhlIElNRyBub2RlLFxuICAgICAgICAgIC8vIHJldHVybnMgdGhlIHBhcmVudCBESVYgbm9kZS4gSW4gSUUgPCA5LCBwYXN0ZUhUTUwgZG9lcyBub3Qgd29yayB3ZWxsLlxuICAgICAgICAgIHJhbmdlLnBhc3RlSFRNTCgnPHNwYW4gaWQ9XCJ3cnNfb3BlbkVkaXRvcldpbmRvd190ZW1wb3JhbE9iamVjdFwiPjwvc3Bhbj4nKTtcbiAgICAgICAgICB0ZW1wb3JhbE9iamVjdCA9IHdpbmRvd1RhcmdldC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd3JzX29wZW5FZGl0b3JXaW5kb3dfdGVtcG9yYWxPYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub2RlO1xuICAgICAgICBsZXQgY2FyZXRQb3NpdGlvbjtcblxuICAgICAgICBpZiAodGVtcG9yYWxPYmplY3QubmV4dFNpYmxpbmcgJiYgdGVtcG9yYWxPYmplY3QubmV4dFNpYmxpbmcubm9kZVR5cGUgPT09IDMpIHsgLy8gVEVYVF9OT0RFLlxuICAgICAgICAgIG5vZGUgPSB0ZW1wb3JhbE9iamVjdC5uZXh0U2libGluZztcbiAgICAgICAgICBjYXJldFBvc2l0aW9uID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wb3JhbE9iamVjdC5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgICAmJiB0ZW1wb3JhbE9iamVjdC5wcmV2aW91c1NpYmxpbmcubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICBub2RlID0gdGVtcG9yYWxPYmplY3QucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgIGNhcmV0UG9zaXRpb24gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZSA9IHdpbmRvd1RhcmdldC5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgICAgICAgdGVtcG9yYWxPYmplY3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgdGVtcG9yYWxPYmplY3QpO1xuICAgICAgICAgIGNhcmV0UG9zaXRpb24gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVtcG9yYWxPYmplY3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0ZW1wb3JhbE9iamVjdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGNhcmV0UG9zaXRpb24sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChyYW5nZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlOiByYW5nZS5pdGVtKDApLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93VGFyZ2V0LmdldFNlbGVjdGlvbikge1xuICAgICAgbGV0IHJhbmdlO1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93VGFyZ2V0LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICB0cnkge1xuICAgICAgICByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByYW5nZSA9IHdpbmRvd1RhcmdldC5kb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7IC8vIFRFWFRfTk9ERS5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGNhcmV0UG9zaXRpb246IHJhbmdlLnN0YXJ0T2Zmc2V0LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSAhPT0gcmFuZ2UuZW5kQ29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFTEVNRU5UX05PREUuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG5vZGUuY2hpbGROb2Rlc1twb3NpdGlvbl0pIHtcblxuICAgICAgICAgIC8vIEluIGNhc2UgdGhhdCBhIGZvcm11bGEgaXMgZGV0ZWN0ZWQgYnV0IG5vdCBzZWxlY3RlZCxcbiAgICAgICAgICAvLyB3ZSBjcmVhdGUgYW4gZW1wdHkgc3BhbiB3aGVyZSB3ZSBjb3VsZCBpbnNlcnQgdGhlIG5ldyBmb3JtdWxhLlxuICAgICAgICAgIGlmIChyYW5nZS5zdGFydE9mZnNldCA9PT0gcmFuZ2UuZW5kT2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gIT09IDAgJiYgbm9kZS5jaGlsZE5vZGVzW3Bvc2l0aW9uIC0gMV0ubG9jYWxOYW1lID09PSAnc3BhbicgJiYgbm9kZS5jaGlsZE5vZGVzW3Bvc2l0aW9uXS5jbGFzc0xpc3QuY29udGFpbnMoJ1dpcmlzZm9ybXVsYScpKSB7XG4gICAgICAgICAgICAgIG5vZGUuY2hpbGROb2Rlc1twb3NpdGlvbiAtIDFdLnJlbW92ZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gVXRpbC5nZXRTZWxlY3RlZEl0ZW0odGFyZ2V0LCBpc0lmcmFtZSwgZm9yY2VHZXRTZWxlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5jaGlsZE5vZGVzW3Bvc2l0aW9uXS5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdXaXJpc2Zvcm11bGEnKSkge1xuICAgICAgICAgICAgICBpZiAoKHBvc2l0aW9uID4gMCAmJiBub2RlLmNoaWxkTm9kZXNbcG9zaXRpb24gLSAxXS5jbGFzc0xpc3QuY29udGFpbnMoJ1dpcmlzZm9ybXVsYScpKSB8fCBwb3NpdGlvbiA9PT0gMCApIHtcbiAgICAgICAgICAgICAgICB2YXIgZW1wdHlTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICAgIG5vZGUuaW5zZXJ0QmVmb3JlKGVtcHR5U3Bhbiwgbm9kZS5jaGlsZE5vZGVzW3Bvc2l0aW9uXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUuY2hpbGROb2Rlc1twb3NpdGlvbl0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlOiBub2RlLmNoaWxkTm9kZXNbcG9zaXRpb25dLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXNuJ3QgYW55IGl0ZW0gb3IgaWYgaXQgaXMgbWFsZm9ybWVkLlxuICAgKiBPdGhlcndpc2UgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgbm9kZSB3aXRoIHRoZSBNYXRoTUwgaW1hZ2VcbiAgICogYW5kIHRoZSBjdXJzb3IgcG9zaXRpb24gaW5zaWRlIHRoZSB0ZXh0YXJlYS5cbiAgICogQHBhcmFtIHtIVE1MVGV4dEFyZWFFbGVtZW50fSB0ZXh0YXJlYSAtIHRleHRhcmVhIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBub2RlLCB0aGUgaW5kZXggb2YgdGhlXG4gICAqIGJlZ2lubmluZyAgb2YgdGhlIHNlbGVjdGVkIHRleHQsIGNhcmV0IHBvc2l0aW9uIGFuZCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbiBvZiB0aGVcbiAgICogdGV4dCBub2RlLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VsZWN0ZWRJdGVtT25UZXh0YXJlYSh0ZXh0YXJlYSkge1xuICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dGFyZWEudmFsdWUpO1xuICAgIGNvbnN0IHRleHROb2RlVmFsdWVzID0gTGF0ZXguZ2V0TGF0ZXhGcm9tVGV4dE5vZGUodGV4dE5vZGUsIHRleHRhcmVhLnNlbGVjdGlvblN0YXJ0KTtcbiAgICBpZiAodGV4dE5vZGVWYWx1ZXMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBub2RlOiB0ZXh0Tm9kZSxcbiAgICAgIGNhcmV0UG9zaXRpb246IHRleHRhcmVhLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgc3RhcnRQb3NpdGlvbjogdGV4dE5vZGVWYWx1ZXMuc3RhcnRQb3NpdGlvbixcbiAgICAgIGVuZFBvc2l0aW9uOiB0ZXh0Tm9kZVZhbHVlcy5lbmRQb3NpdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvb2tzIGZvciBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBuYW1lIGluIGEgSFRNTCBjb2RlIHN0cmluZy5cbiAgICogSW1wb3J0YW50OiB0aGlzIGZ1bmN0aW9uIGlzIHZlcnkgY29uY3JldGUgZm9yIFdJUklTIGNvZGUuXG4gICAqIEl0IHRha2VzIGFzIHByZWNvbmRpdGlvbnMgbG90cyBvZiBiZWhhdmlvcnMgdGhhdCBhcmUgbm90IHRoZSBnZW5lcmFsIGNhc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIC0gIEhUTUwgY29kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBlbGVtZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXV0b0Nsb3NlZCAtIHRydWUgaWYgdGhlIGVsZW1lbnRzIGFyZSBhdXRvQ2xvc2VkLlxuICAgKiBAcmV0dXJuIHtPYmplY3RbXX0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIEhUTUwgZWxlbWVudHMgb2YgY29kZSBtYXRjaGluZyB0aGUgbmFtZSBhcmd1bWVudC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldEVsZW1lbnRzQnlOYW1lRnJvbVN0cmluZyhjb2RlLCBuYW1lLCBhdXRvQ2xvc2VkKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgICBjb2RlID0gY29kZS50b0xvd2VyQ2FzZSgpO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IHN0YXJ0ID0gY29kZS5pbmRleE9mKGA8JHtuYW1lfSBgKTtcblxuICAgIHdoaWxlIChzdGFydCAhPT0gLTEpIHsgLy8gTG9vayBmb3Igbm9kZXMuXG4gICAgICBsZXQgZW5kU3RyaW5nO1xuXG4gICAgICBpZiAoYXV0b0Nsb3NlZCkge1xuICAgICAgICBlbmRTdHJpbmcgPSAnPic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmRTdHJpbmcgPSBgPC8ke25hbWV9PmA7XG4gICAgICB9XG5cbiAgICAgIGxldCBlbmQgPSBjb2RlLmluZGV4T2YoZW5kU3RyaW5nLCBzdGFydCk7XG5cbiAgICAgIGlmIChlbmQgIT09IC0xKSB7XG4gICAgICAgIGVuZCArPSBlbmRTdHJpbmcubGVuZ3RoO1xuICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICBzdGFydCxcbiAgICAgICAgICBlbmQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gc3RhcnQgKyAxO1xuICAgICAgfVxuXG4gICAgICBzdGFydCA9IGNvZGUuaW5kZXhPZihgPCR7bmFtZX0gYCwgZW5kKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2U2NCBjaGFyYWN0ZXIuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gY2hhcmFjdGVyIC0gYmFzZTY0IGNoYXJhY3Rlci5cbiAgICogQHJldHVybnMge251bWJlcn0gYmFzZTY0IGNoYXJhY3RlciBudW1lcmljIHZhbHVlLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlNjQoY2hhcmFjdGVyKSB7XG4gICAgY29uc3QgUExVUyA9ICcrJy5jaGFyQ29kZUF0KDApO1xuICAgIGNvbnN0IFNMQVNIID0gJy8nLmNoYXJDb2RlQXQoMCk7XG4gICAgY29uc3QgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMCk7XG4gICAgY29uc3QgTE9XRVIgPSAnYScuY2hhckNvZGVBdCgwKTtcbiAgICBjb25zdCBVUFBFUiA9ICdBJy5jaGFyQ29kZUF0KDApO1xuICAgIGNvbnN0IFBMVVNfVVJMX1NBRkUgPSAnLScuY2hhckNvZGVBdCgwKTtcbiAgICBjb25zdCBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApO1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKTtcblxuICAgIGlmIChjb2RlID09PSBQTFVTIHx8IGNvZGUgPT09IFBMVVNfVVJMX1NBRkUpIHtcbiAgICAgIHJldHVybiA2MjsgLy8gQ2hhciAnKycuXG4gICAgfVxuICAgIGlmIChjb2RlID09PSBTTEFTSCB8fCBjb2RlID09PSBTTEFTSF9VUkxfU0FGRSkge1xuICAgICAgcmV0dXJuIDYzOyAvLyBDaGFyICcvJy5cbiAgICB9XG4gICAgaWYgKGNvZGUgPCBOVU1CRVIpIHtcbiAgICAgIHJldHVybiAtMTsgLy8gTm8gbWF0Y2guXG4gICAgfVxuICAgIGlmIChjb2RlIDwgTlVNQkVSICsgMTApIHtcbiAgICAgIHJldHVybiBjb2RlIC0gTlVNQkVSICsgMjYgKyAyNjtcbiAgICB9XG4gICAgaWYgKGNvZGUgPCBVUFBFUiArIDI2KSB7XG4gICAgICByZXR1cm4gY29kZSAtIFVQUEVSO1xuICAgIH1cbiAgICBpZiAoY29kZSA8IExPV0VSICsgMjYpIHtcbiAgICAgIHJldHVybiBjb2RlIC0gTE9XRVIgKyAyNjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJhc2U2NCBzdHJpbmcgdG8gYSBhcnJheSBvZiBieXRlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGI2NFN0cmluZyAtIGJhc2U2NCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBkaW1lbnNpb24gb2YgYnl0ZSBhcnJheSAoYnkgZGVmYXVsdCB3aG9sZSBzdHJpbmcpLlxuICAgKiBAcmV0dXJuIHtPYmplY3RbXX0gdGhlIHJlc3VsdGFudCBieXRlIGFycmF5LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgYjY0VG9CeXRlQXJyYXkoYjY0U3RyaW5nLCBsZW5ndGgpIHtcbiAgICBsZXQgdG1wO1xuXG4gICAgaWYgKGI2NFN0cmluZy5sZW5ndGggJSA0ID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Jyk7IC8vIFRpcHBlZCBiYXNlNjQuIExlbmd0aCBpcyBmaXhlZC5cbiAgICB9XG5cbiAgICBjb25zdCBhcnIgPSBbXTtcblxuICAgIGxldCBsO1xuICAgIGxldCBwbGFjZUhvbGRlcnM7XG4gICAgaWYgKCFsZW5ndGgpIHsgLy8gQWxsIGI2NFN0cmluZyBzdHJpbmcuXG4gICAgICBpZiAoYjY0U3RyaW5nLmNoYXJBdChiNjRTdHJpbmcubGVuZ3RoIC0gMikgPT09ICc9Jykge1xuICAgICAgICBwbGFjZUhvbGRlcnMgPSAyO1xuICAgICAgfSBlbHNlIGlmIChiNjRTdHJpbmcuY2hhckF0KGI2NFN0cmluZy5sZW5ndGggLSAxKSA9PT0gJz0nKSB7XG4gICAgICAgIHBsYWNlSG9sZGVycyA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwbGFjZUhvbGRlcnMgPSAwO1xuICAgICAgfVxuICAgICAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBiNjRTdHJpbmcubGVuZ3RoIC0gNCA6IGI2NFN0cmluZy5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBsZW5ndGg7XG4gICAgfVxuXG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gNCkge1xuICAgICAgLy8gSWdub3JpbmcgY29kZSBjaGVja2VyIHN0YW5kYXJkcyAoYml0ZXdpc2Ugb3BlcmF0b3JzKS5cbiAgICAgIC8vIFNlZSBodHRwczovL3RyYWNrZXIubW9vZGxlLm9yZy9icm93c2UvQ09OVFJJQi01ODYyIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLlxuICAgICAgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZVN0YXJ0XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgdG1wID0gKFV0aWwuZGVjb2RlNjQoYjY0U3RyaW5nLmNoYXJBdChpKSkgPDwgMTgpIHwgKFV0aWwuZGVjb2RlNjQoYjY0U3RyaW5nLmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChVdGlsLmRlY29kZTY0KGI2NFN0cmluZy5jaGFyQXQoaSArIDIpKSA8PCA2KSB8IFV0aWwuZGVjb2RlNjQoYjY0U3RyaW5nLmNoYXJBdChpICsgMykpO1xuXG4gICAgICBhcnIucHVzaCgodG1wID4+IDE2KSAmIDB4RkYpO1xuICAgICAgYXJyLnB1c2goKHRtcCA+PiA4KSAmIDB4RkYpO1xuICAgICAgYXJyLnB1c2godG1wICYgMHhGRik7XG4gICAgICAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlRW5kXG4gICAgfVxuXG4gICAgaWYgKHBsYWNlSG9sZGVycykge1xuICAgICAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgICAgICAvLyBJZ25vcmluZyBjb2RlIGNoZWNrZXIgc3RhbmRhcmRzIChiaXRld2lzZSBvcGVyYXRvcnMpLlxuICAgICAgICAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlU3RhcnRcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgdG1wID0gKFV0aWwuZGVjb2RlNjQoYjY0U3RyaW5nLmNoYXJBdChpKSkgPDwgMikgfCAoVXRpbC5kZWNvZGU2NChiNjRTdHJpbmcuY2hhckF0KGkgKyAxKSkgPj4gNCk7XG4gICAgICAgIGFyci5wdXNoKHRtcCAmIDB4RkYpO1xuICAgICAgfSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgdG1wID0gKFV0aWwuZGVjb2RlNjQoYjY0U3RyaW5nLmNoYXJBdChpKSkgPDwgMTApIHwgKFV0aWwuZGVjb2RlNjQoYjY0U3RyaW5nLmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKFV0aWwuZGVjb2RlNjQoYjY0U3RyaW5nLmNoYXJBdChpICsgMikpID4+IDIpO1xuICAgICAgICBhcnIucHVzaCgodG1wID4+IDgpICYgMHhGRik7XG4gICAgICAgIGFyci5wdXNoKHRtcCAmIDB4RkYpO1xuICAgICAgICAvLyBAY29kaW5nU3RhbmRhcmRzSWdub3JlRW5kXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlyc3QgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGZyb20gYSBieXRlIGFycmF5LlxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBieXRlcyAtIGFycmF5IG9mIGJ5dGVzLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSB0aGUgMzItYml0IHNpZ25lZCBpbnRlZ2VyLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVhZEludDMyKGJ5dGVzKSB7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCA8IDQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaW50MzIgPSBieXRlcy5zcGxpY2UoMCwgNCk7XG4gICAgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZVN0YXJ0wqFcbiAgICByZXR1cm4gKGludDMyWzBdIDw8IDI0IHwgaW50MzJbMV0gPDwgMTYgfCBpbnQzMlsyXSA8PCA4IHwgaW50MzJbM10gPDwgMCk7XG4gICAgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZUVuZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIGZpcnN0IGJ5dGUgZnJvbSBhIGJ5dGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBieXRlcyAtIGlucHV0IGJ5dGUgYXJyYXkuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IGZpcnN0IGJ5dGUgb2YgdGhlIGJ5dGUgYXJyYXkuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyByZWFkQnl0ZShieXRlcykge1xuICAgIC8vIEBjb2RpbmdTdGFuZGFyZHNJZ25vcmVTdGFydFxuICAgIHJldHVybiBieXRlcy5zaGlmdCgpIDw8IDA7XG4gICAgLy8gQGNvZGluZ1N0YW5kYXJkc0lnbm9yZUVuZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBieXRlcywgZnJvbSBhIGZpeGVkIHBvc2l0aW9uIG9uIGEgYnl0ZSBhcnJheS5cbiAgICogQHBhcmFtICB7T2JqZWN0W119IGJ5dGVzIC0gYnl0ZSBhcnJheS5cbiAgICogQHBhcmFtICB7bnVtYmVyfSBwb3MgLSBzdGFydCBwb3NpdGlvbi5cbiAgICogQHBhcmFtICB7bnVtYmVyfSBsZW4gLSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICogQHJldHVybnMge09iamVjdFtdfSB0aGUgYnl0ZSBhcnJheS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlYWRCeXRlcyhieXRlcywgcG9zLCBsZW4pIHtcbiAgICByZXR1cm4gYnl0ZXMuc3BsaWNlKHBvcywgbGVuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIG9yIG1vZGlmaWVzIGZvcm11bGFzIG9yIENBUyBvbiBhIHRleHRhcmVhLlxuICAgKiBAcGFyYW0ge0hUTUxUZXh0QXJlYUVsZW1lbnR9IHRleHRhcmVhIC0gdGV4dGFyZWEgdGFyZ2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gYWRkIGluIHRoZSB0ZXh0YXJlYS4gRm9yIGV4YW1wbGUsIHRvIGFkZCB0aGUgbGluayB0byB0aGUgaW1hZ2UsXG4gICAqIGNhbGwgdGhpcyBmdW5jdGlvbiBhcyAodGV4dGFyZWEsIFBhcnNlci5jcmVhdGVJbWFnZVNyYyhtYXRobWwpKTtcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHVwZGF0ZVRleHRBcmVhKHRleHRhcmVhLCB0ZXh0KSB7XG4gICAgaWYgKHRleHRhcmVhICYmIHRleHQpIHtcbiAgICAgIHRleHRhcmVhLmZvY3VzKCk7XG5cbiAgICAgIGlmICh0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uRW5kIH0gPSB0ZXh0YXJlYTtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQgPSB0ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoMCwgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25FbmRTdWIgPSB0ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoc2VsZWN0aW9uRW5kLCB0ZXh0YXJlYS52YWx1ZS5sZW5ndGgpO1xuICAgICAgICB0ZXh0YXJlYS52YWx1ZSA9IHNlbGVjdGlvblN0YXJ0ICsgdGV4dCArIHNlbGVjdGlvbkVuZFN1YjtcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgdGV4dC5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgc2VsZWN0aW9uLnRleHQgPSB0ZXh0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBleGlzdGluZyBmb3JtdWxhIG9uIGEgdGV4dGFyZWEuXG4gICAqIEBwYXJhbSB7SFRNTFRleHRBcmVhRWxlbWVudH0gdGV4dGFyZWEgLSB0ZXh0IGFyZWEgdGFyZ2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gYWRkIGluIHRoZSB0ZXh0YXJlYS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGFkZCB0aGUgbGlua1xuICAgKiB0byB0aGUgaW1hZ2UseW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYXNcbiAgICogVXRpbC51cGRhdGVUZXh0YXJlYSh0ZXh0YXJlYSwgUGFyc2VyLmNyZWF0ZUltYWdlU3JjKG1hdGhtbCkpO1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBiZWdpbm5pbmcgaW5kZXggZnJvbSB0ZXh0YXJlYSB3aGVyZSBpdCBuZWVkcyB0byBiZSByZXBsYWNlZCBieSB0ZXh0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gZW5kaW5nIGluZGV4IGZyb20gdGV4dGFyZWEgd2hlcmUgaXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQgYnkgdGV4dFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdXBkYXRlRXhpc3RpbmdUZXh0T25UZXh0YXJlYSh0ZXh0YXJlYSwgdGV4dCwgc3RhcnQsIGVuZCkge1xuICAgIHRleHRhcmVhLmZvY3VzKCk7XG4gICAgY29uc3QgdGV4dGFyZWFTdGFydCA9IHRleHRhcmVhLnZhbHVlLnN1YnN0cmluZygwLCBzdGFydCk7XG4gICAgdGV4dGFyZWEudmFsdWUgPSB0ZXh0YXJlYVN0YXJ0ICsgdGV4dCArIHRleHRhcmVhLnZhbHVlLnN1YnN0cmluZyhlbmQsIHRleHRhcmVhLnZhbHVlLmxlbmd0aCk7XG4gICAgdGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gc3RhcnQgKyB0ZXh0Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXJhbWV0ZXIgd2l0aCBpdCdzIGNvcnJlc3BvbmRlbnQgdmFsdWUgdG8gYW4gVVJMIChHRVQpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFVSTCBwYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbWV0ZXIgLSBwYXJhbWV0ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gdmFsdWVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGFkZEFyZ3VtZW50KHBhdGgsIHBhcmFtZXRlciwgdmFsdWUpIHtcbiAgICBsZXQgc2VwO1xuICAgIGlmIChwYXRoLmluZGV4T2YoJz8nKSA+IDApIHtcbiAgICAgIHNlcCA9ICcmJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2VwID0gJz8nO1xuICAgIH1cbiAgICByZXR1cm4gYCR7cGF0aCArIHNlcCArIHBhcmFtZXRlcn09JHt2YWx1ZX1gO1xuICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9zcmMvYXBwLnRzXCIpO1xuIiwiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|