survey-analytics 1.11.3 → 1.11.4

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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * surveyjs - SurveyJS Dashboard library v1.11.3
2
+ * surveyjs - SurveyJS Dashboard library v1.11.4
3
3
  * Copyright (c) 2015-2024 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  * License: MIT (http://www.opensource.org/licenses/mit-license.php)
5
5
  */
@@ -7394,7 +7394,12 @@ var englishStrings = {
7394
7394
  answer: "Answer",
7395
7395
  correctAnswer: "Correct answer: ",
7396
7396
  percent: "Percent",
7397
- responses: "Responses"
7397
+ responses: "Responses",
7398
+ visualizer_nps: "NPS Score",
7399
+ npsScore: "NPS Score",
7400
+ npsPromoters: "Promoters",
7401
+ npsPassives: "Passives",
7402
+ npsDetractors: "Detractors",
7398
7403
  };
7399
7404
  // Uncomment the lines below if you create a custom dictionary.
7400
7405
  // Replace "en" with a custom locale code (for example, "fr" or "de"),
@@ -8742,7 +8747,7 @@ function questionContainsValue(questionValue, filterValue) {
8742
8747
  /*!********************************!*\
8743
8748
  !*** ./src/entries/summary.ts ***!
8744
8749
  \********************************/
8745
- /*! exports provided: localization, surveyStrings, DataProvider, VisualizerFactory, NumberModel, hideEmptyAnswersInData, SelectBase, Matrix, BooleanModel, HistogramModel, VisualizerBase, VisualizationManager, VisualizationPanel, VisualizationPanelDynamic, VisualizationMatrixDynamic, VisualizationMatrixDropdown, AlternativeVisualizersWrapper, PlotlySetup, PlotlyChartAdapter, SelectBasePlotly, MatrixPlotly, PlotlyBoolChartAdapter, BooleanPlotly, RankingPlotly, MatrixDropdownGroupedPlotly, HistogramPlotly, PlotlyGaugeAdapter, GaugePlotly, WordCloudAdapter, WordCloud, textHelper, TextTableAdapter, Text, ChoicesTableAdapter, ChoicesTable, DocumentHelper */
8750
+ /*! exports provided: localization, surveyStrings, DataProvider, VisualizerFactory, NumberModel, hideEmptyAnswersInData, SelectBase, Matrix, BooleanModel, HistogramModel, VisualizerBase, VisualizationManager, VisualizationPanel, VisualizationPanelDynamic, VisualizationMatrixDynamic, VisualizationMatrixDropdown, AlternativeVisualizersWrapper, PlotlySetup, PlotlyChartAdapter, SelectBasePlotly, MatrixPlotly, PlotlyBoolChartAdapter, BooleanPlotly, RankingPlotly, MatrixDropdownGroupedPlotly, HistogramPlotly, PlotlyGaugeAdapter, GaugePlotly, WordCloudAdapter, WordCloud, textHelper, TextTableAdapter, Text, ChoicesTableAdapter, ChoicesTable, NpsVizualizerWidget, NpsAdapter, NpsVizualizer, DocumentHelper */
8746
8751
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
8747
8752
 
8748
8753
  "use strict";
@@ -8848,8 +8853,15 @@ __webpack_require__.r(__webpack_exports__);
8848
8853
 
8849
8854
  /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ChoicesTable", function() { return _choices_table__WEBPACK_IMPORTED_MODULE_30__["ChoicesTable"]; });
8850
8855
 
8851
- /* harmony import */ var _utils_index__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../utils/index */ "./src/utils/index.ts");
8852
- /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DocumentHelper", function() { return _utils_index__WEBPACK_IMPORTED_MODULE_31__["DocumentHelper"]; });
8856
+ /* harmony import */ var _nps__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../nps */ "./src/nps.ts");
8857
+ /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NpsVizualizerWidget", function() { return _nps__WEBPACK_IMPORTED_MODULE_31__["NpsVizualizerWidget"]; });
8858
+
8859
+ /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NpsAdapter", function() { return _nps__WEBPACK_IMPORTED_MODULE_31__["NpsAdapter"]; });
8860
+
8861
+ /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NpsVizualizer", function() { return _nps__WEBPACK_IMPORTED_MODULE_31__["NpsVizualizer"]; });
8862
+
8863
+ /* harmony import */ var _utils_index__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../utils/index */ "./src/utils/index.ts");
8864
+ /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DocumentHelper", function() { return _utils_index__WEBPACK_IMPORTED_MODULE_32__["DocumentHelper"]; });
8853
8865
 
8854
8866
 
8855
8867
  //localization
@@ -8884,6 +8896,7 @@ __webpack_require__.r(__webpack_exports__);
8884
8896
 
8885
8897
 
8886
8898
 
8899
+
8887
8900
 
8888
8901
 
8889
8902
  /***/ }),
@@ -9535,6 +9548,160 @@ var MatrixDropdownGrouped = /** @class */ (function (_super) {
9535
9548
 
9536
9549
 
9537
9550
 
9551
+ /***/ }),
9552
+
9553
+ /***/ "./src/nps.scss":
9554
+ /*!**********************!*\
9555
+ !*** ./src/nps.scss ***!
9556
+ \**********************/
9557
+ /*! no static exports found */
9558
+ /***/ (function(module, exports, __webpack_require__) {
9559
+
9560
+ // extracted by mini-css-extract-plugin
9561
+
9562
+ /***/ }),
9563
+
9564
+ /***/ "./src/nps.ts":
9565
+ /*!********************!*\
9566
+ !*** ./src/nps.ts ***!
9567
+ \********************/
9568
+ /*! exports provided: NpsVizualizerWidget, NpsAdapter, NpsVizualizer */
9569
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
9570
+
9571
+ "use strict";
9572
+ __webpack_require__.r(__webpack_exports__);
9573
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NpsVizualizerWidget", function() { return NpsVizualizerWidget; });
9574
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NpsAdapter", function() { return NpsAdapter; });
9575
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NpsVizualizer", function() { return NpsVizualizer; });
9576
+ /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./src/utils/helpers.ts");
9577
+ /* harmony import */ var _visualizerBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./visualizerBase */ "./src/visualizerBase.ts");
9578
+ /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/utils/index.ts");
9579
+ /* harmony import */ var _localizationManager__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./localizationManager */ "./src/localizationManager.ts");
9580
+ /* harmony import */ var _nps_scss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nps.scss */ "./src/nps.scss");
9581
+ /* harmony import */ var _nps_scss__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_nps_scss__WEBPACK_IMPORTED_MODULE_4__);
9582
+
9583
+
9584
+
9585
+
9586
+
9587
+ var NpsVizualizerWidget = /** @class */ (function () {
9588
+ function NpsVizualizerWidget(_model, _data) {
9589
+ this._model = _model;
9590
+ this._data = _data;
9591
+ this._renderedTarget = undefined;
9592
+ }
9593
+ NpsVizualizerWidget.prototype.renderScorePart = function (partId, value, percent) {
9594
+ var scorePartElement = _utils__WEBPACK_IMPORTED_MODULE_2__["DocumentHelper"].createElement("div", "sa-visualizer-nps__score-part");
9595
+ var titleElement = _utils__WEBPACK_IMPORTED_MODULE_2__["DocumentHelper"].createElement("div", "sa-visualizer-nps__score-part-title");
9596
+ titleElement.innerText = _localizationManager__WEBPACK_IMPORTED_MODULE_3__["localization"].getString(partId);
9597
+ scorePartElement.appendChild(titleElement);
9598
+ var valuesElement = _utils__WEBPACK_IMPORTED_MODULE_2__["DocumentHelper"].createElement("div", "sa-visualizer-nps__score-part-values");
9599
+ scorePartElement.appendChild(valuesElement);
9600
+ var valueElement = _utils__WEBPACK_IMPORTED_MODULE_2__["DocumentHelper"].createElement("div", "sa-visualizer-nps__score-part-value");
9601
+ valueElement.innerText = "" + value;
9602
+ valuesElement.appendChild(valueElement);
9603
+ if (percent) {
9604
+ var percentElement = _utils__WEBPACK_IMPORTED_MODULE_2__["DocumentHelper"].createElement("div", "sa-visualizer-nps__score-part-percent");
9605
+ percentElement.innerText = "" + percent + "%";
9606
+ valuesElement.appendChild(percentElement);
9607
+ }
9608
+ return scorePartElement;
9609
+ };
9610
+ NpsVizualizerWidget.prototype.render = function (target) {
9611
+ this._renderedTarget = target;
9612
+ var npsElement = _utils__WEBPACK_IMPORTED_MODULE_2__["DocumentHelper"].createElement("div", "sa-visualizer-nps");
9613
+ npsElement.appendChild(this.renderScorePart("npsScore", ((this._data.promoters - this._data.detractors) / this._data.total) * 100));
9614
+ npsElement.appendChild(this.renderScorePart("npsPromoters", this._data.promoters, this._data.promoters / this._data.total * 100));
9615
+ npsElement.appendChild(this.renderScorePart("npsPassives", this._data.total - this._data.promoters - this._data.detractors, (this._data.total - this._data.promoters - this._data.detractors) / this._data.total * 100));
9616
+ npsElement.appendChild(this.renderScorePart("npsDetractors", this._data.detractors, this._data.detractors / this._data.total * 100));
9617
+ target.appendChild(npsElement);
9618
+ };
9619
+ NpsVizualizerWidget.prototype.dispose = function () {
9620
+ if (!!this._renderedTarget) {
9621
+ this._renderedTarget.innerHTML = "";
9622
+ this._renderedTarget = undefined;
9623
+ }
9624
+ };
9625
+ return NpsVizualizerWidget;
9626
+ }());
9627
+
9628
+ var NpsAdapter = /** @class */ (function () {
9629
+ function NpsAdapter(model) {
9630
+ this.model = model;
9631
+ }
9632
+ Object.defineProperty(NpsAdapter.prototype, "npsVizualizer", {
9633
+ get: function () {
9634
+ return this._npsVizualizer;
9635
+ },
9636
+ enumerable: false,
9637
+ configurable: true
9638
+ });
9639
+ NpsAdapter.prototype.create = function (element) {
9640
+ var data = this.model.getCalculatedValues();
9641
+ this._npsVizualizer = new NpsVizualizerWidget(this.model, data);
9642
+ this._npsVizualizer.render(element);
9643
+ return this._npsVizualizer;
9644
+ };
9645
+ NpsAdapter.prototype.destroy = function (node) {
9646
+ if (this._npsVizualizer && typeof this._npsVizualizer.dispose === "function") {
9647
+ this._npsVizualizer.dispose();
9648
+ }
9649
+ this._npsVizualizer = undefined;
9650
+ };
9651
+ return NpsAdapter;
9652
+ }());
9653
+
9654
+ var NpsVizualizer = /** @class */ (function (_super) {
9655
+ Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(NpsVizualizer, _super);
9656
+ function NpsVizualizer(question, data, options, name) {
9657
+ var _this = _super.call(this, question, data, options, name || "nps") || this;
9658
+ _this._npsAdapter = new NpsAdapter(_this);
9659
+ return _this;
9660
+ }
9661
+ NpsVizualizer.prototype.getCalculatedValues = function () {
9662
+ var _this = this;
9663
+ var result = {
9664
+ detractors: 0,
9665
+ passive: 0,
9666
+ promoters: 0,
9667
+ total: 0,
9668
+ };
9669
+ this.data.forEach(function (row) {
9670
+ var rowValue = row[_this.question.name];
9671
+ var scoreValue = parseInt(rowValue);
9672
+ if (!Number.isNaN(scoreValue)) {
9673
+ if (scoreValue <= 6) {
9674
+ result.detractors++;
9675
+ }
9676
+ else if (scoreValue >= 9) {
9677
+ result.promoters++;
9678
+ }
9679
+ else {
9680
+ result.passive++;
9681
+ }
9682
+ result.total++;
9683
+ }
9684
+ });
9685
+ return result;
9686
+ };
9687
+ NpsVizualizer.prototype.destroyContent = function (container) {
9688
+ this._npsAdapter.destroy(container);
9689
+ _super.prototype.destroyContent.call(this, container);
9690
+ };
9691
+ NpsVizualizer.prototype.renderContent = function (container) {
9692
+ this._npsAdapter.create(container);
9693
+ this.afterRender(this.contentContainer);
9694
+ };
9695
+ NpsVizualizer.prototype.destroy = function () {
9696
+ this._npsAdapter.destroy(this.contentContainer);
9697
+ _super.prototype.destroy.call(this);
9698
+ };
9699
+ return NpsVizualizer;
9700
+ }(_visualizerBase__WEBPACK_IMPORTED_MODULE_1__["VisualizerBase"]));
9701
+
9702
+ // VisualizationManager.registerVisualizer("rating", NpsVizualizer);
9703
+
9704
+
9538
9705
  /***/ }),
9539
9706
 
9540
9707
  /***/ "./src/number.ts":
@@ -15477,4 +15644,4 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_survey_core__;
15477
15644
 
15478
15645
  /******/ });
15479
15646
  });
15480
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bcGMtbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1twYy1uYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc3ZnYnVuZGxlLmh0bWwiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vbm9kZV9tb2R1bGVzL211dXJpL2Rpc3QvbXV1cmkuanMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZhcnNpLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vaXRhbGlhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9qYXBhbmVzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vcG9ydHVndWVzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3NwYW5pc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Nob2ljZXMtdGFibGUuc2Nzcz9hNjhlIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9jaG9pY2VzLXRhYmxlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9kYXRhUHJvdmlkZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2VudHJpZXMvc3VtbWFyeS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvZmlsdGVySW5mby50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvaGlzdG9ncmFtLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9sYXlvdXRFbmdpbmUudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2xvY2FsaXphdGlvbk1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL21hdHJpeC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvbWF0cml4RHJvcGRvd25Hcm91cGVkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9udW1iZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9ib29sZWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvaGlzdG9ncmFtLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9tYXRyaXhkcm9wZG93bi1ncm91cGVkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvcmFua2luZy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3JhdGluZy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3NlbGVjdEJhc2UudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9zZXR1cC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc2VsZWN0QmFzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdGV4dC5zY3NzPzJjNGUiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3RleHQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3V0aWxzL2hlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3V0aWxzL2luZGV4LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWFuYWdlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvbk1hdHJpeERyb3Bkb3duLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWF0cml4RHluYW1pYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvblBhbmVsLnNjc3M/M2M4MiIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvblBhbmVsLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWxEeW5hbWljLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemVyQmFzZS5zY3NzP2FmYmQiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJCYXNlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2luZGV4LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL25vcndlZ2lhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9zcGFuaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvd2lkZ2V0LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvd29yZGNsb3VkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS9leHRlcm5hbCB7XCJyb290XCI6XCJQbG90bHlcIixcImNvbW1vbmpzMlwiOlwicGxvdGx5LmpzLWRpc3QtbWluXCIsXCJjb21tb25qc1wiOlwicGxvdGx5LmpzLWRpc3QtbWluXCIsXCJhbWRcIjpcInBsb3RseS5qcy1kaXN0LW1pblwifSIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7O0FDbEZBLDRDQUE0QyxndUU7Ozs7Ozs7Ozs7O0FDQTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRSxLQUE0RDtBQUM5RCxFQUFFLFNBQ21EO0FBQ3JELENBQUMsb0JBQW9COztBQUVyQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxFQUFFO0FBQ2YsYUFBYSxFQUFFO0FBQ2YsYUFBYSxFQUFFO0FBQ2YsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHNCQUFzQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkMsYUFBYTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7QUFDZixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLHlCQUF5QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxnQkFBZ0I7O0FBRXBFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGlDQUFpQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLHFDQUFxQztBQUNsRCxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMEJBQTBCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLHNCQUFzQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLHlEQUF5RDtBQUN4Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix5REFBeUQ7QUFDbkY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLEtBQUs7QUFDbEIsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsT0FBTztBQUNwQixhQUFhLEtBQUs7QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsRUFBRTtBQUNmLGFBQWEsRUFBRTtBQUNmLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEIsYUFBYSxvQkFBb0I7QUFDakMsYUFBYSxZQUFZO0FBQ3pCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLHdEQUF3RDtBQUN2Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3REFBd0Q7QUFDL0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQXdEO0FBQ3hGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsWUFBWTtBQUN6QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtQkFBbUI7QUFDaEMsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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Q0wsT0FBTztJQUNQLE1BQU07SUFDTixJQUFJO0lBQ0osTUFBTTtJQUNOLFFBQVE7SUFDUixJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxRQUFRO0lBQ1IsUUFBUTtJQUNSLEtBQUs7SUFDTCxJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLEtBQUs7SUFDTCxPQUFPO0lBQ1AsU0FBUztJQUNULEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxLQUFLO0lBQ0wsSUFBSTtJQUNKLElBQUk7SUFDSixPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsS0FBSztJQUNMLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sU0FBUztJQUNULFNBQVM7SUFDVCxHQUFHO0lBQ0gsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsU0FBUztJQUNULE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sV0FBVztJQUNYLE1BQU07SUFDTixLQUFLO0lBQ0wsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLFFBQVE7SUFDUixLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxJQUFJO0lBQ0osTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLElBQUk7SUFDSixPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLFNBQVM7SUFDVCxVQUFVO0lBQ1YsSUFBSTtJQUNKLE9BQU87SUFDUCxLQUFLO0lBQ0wsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lB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Q04sT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixJQUFJO0lBQ0osTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixXQUFXO0lBQ1gsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsU0FBUztJQUNULFNBQVM7SUFDVCxLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxJQUFJO0lBQ0osUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lB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QyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsaUNBQWEsR0FBdkIsVUFBd0IsU0FBc0I7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCwyQkFBTyxHQUFQO1FBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RCxpQkFBTSxPQUFPLFdBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0gsZ0JBQUM7QUFBRCxDQUFDLENBdkY4Qiw4REFBYyxHQXVGNUM7O0FBRUQsMEVBQW9CLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzNELDBFQUFvQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM5RCwwRUFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7Ozs7Ozs7Ozs7OztBQ3BNbkUsZ0U7Ozs7Ozs7Ozs7O0FDQUEseUQiLCJmaWxlIjoic3VydmV5LmFuYWx5dGljcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInBsb3RseS5qcy1kaXN0LW1pblwiKSwgcmVxdWlyZShcInN1cnZleS1jb3JlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiU3VydmV5QW5hbHl0aWNzXCIsIFtcInBsb3RseS5qcy1kaXN0LW1pblwiLCBcInN1cnZleS1jb3JlXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlN1cnZleUFuYWx5dGljc1wiXSA9IGZhY3RvcnkocmVxdWlyZShcInBsb3RseS5qcy1kaXN0LW1pblwiKSwgcmVxdWlyZShcInN1cnZleS1jb3JlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTdXJ2ZXlBbmFseXRpY3NcIl0gPSBmYWN0b3J5KHJvb3RbXCJQbG90bHlcIl0sIHJvb3RbXCJTdXJ2ZXlcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9wbG90bHlfanNfZGlzdF9taW5fXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9zdXJ2ZXlfY29yZV9fKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvZW50cmllcy9zdW1tYXJ5LnRzXCIpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgc3R5bGU9XFxcImRpc3BsYXk6bm9uZTtcXFwiPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWRldGFpbFxcXCI+PGNpcmNsZSBjeD1cXFwiMS41XFxcIiBjeT1cXFwiOC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjcuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCIxMy41XFxcIiBjeT1cXFwiOC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWRyYWdcXFwiPjxwYXRoIGQ9XFxcIk0xMyA1bC0xIDEgMSAxSDlWM2wxIDEgMS0xLTMtMy0zIDMgMSAxIDEtMXY0SDNsMS0xLTEtMS0zIDMgMyAzIDEtMS0xLTFoNHY0bC0xLTEtMSAxIDMgMyAzLTMtMS0xLTEgMVY5aDRsLTEgMSAxIDEgMy0zelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWhpZGVcXFwiPjxwYXRoIGQ9XFxcIk0xMi43OSA0LjJMMTYgMWwtMS0xLTMuMzIgMy4zMkMxMC41NyAyLjU1IDkuMzIgMiA4IDIgMy42MyAyIDAgNy45NyAwIDcuOTdzMS4yNyAyLjEgMy4yMSAzLjgybC0zLjIzIDMuMjMuOTguOTggMy4zNS0zLjM0QzUuNDEgMTMuNDQgNi42NyAxNCA4IDE0YzQuMzcgMCA4LTYgOC02cy0xLjI3LTIuMDktMy4yMS0zLjh6TTIgNy45N2MxLjA3LTEuNDcgMy42MS00IDYtNCAuOCAwIDEuNi4yNyAyLjM1LjY4bC0uNzguNzhjLS40Ni0uMjktLjk5LS40Ni0xLjU3LS40Ni0xLjY2IDAtMyAxLjM0LTMgMyAwIC41OC4xNyAxLjExLjQ2IDEuNTdsLS45Ny45N0ExMy4zOCAxMy4zOCAwIDAgMSAyIDcuOTd6bTYgNGMtLjggMC0xLjU5LS4yNy0yLjMzLS42N2wuNzgtLjc3Yy40NS4yNy45OC40NCAxLjU1LjQ0IDEuNjYgMCAzLTEuMzQgMy0zIDAtLjU3LS4xNy0xLjA5LS40NC0xLjU1bC45OC0uOThjMS4xMS44NyAyLjAxIDEuOTEgMi40NiAyLjUyLTEuMDcgMS40OC0zLjYxIDQuMDEtNiA0LjAxelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW1ha2Vwcml2YXRlXFxcIj48Y2lyY2xlIGN4PVxcXCI4XFxcIiBjeT1cXFwiNFxcXCIgcj1cXFwiM1xcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTggOGMtMy4zMSAwLTYgMi43My02IDQuNjdTNS4yNyAxNSA4IDE1czYtLjQgNi0yLjMzUzExLjMxIDggOCA4elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW1ha2VwdWJsaWNcXFwiPjxjaXJjbGUgY3g9XFxcIjZcXFwiIGN5PVxcXCI1XFxcIiByPVxcXCIzXFxcIj48L2NpcmNsZT48cGF0aCBkPVxcXCJNMTAgNWMwIC4zNC0uMDYuNjctLjE0Ljk5LjA1IDAgLjA5LjAxLjE0LjAxIDEuNjYgMCAzLTEuMzQgMy0zcy0xLjM0LTMtMy0zQzguOTcgMCA4LjA3LjUyIDcuNTMgMS4zIDguOTggMS45MSAxMCAzLjMzIDEwIDV6TTYgOWMtMy4zMSAwLTYgMi43My02IDQuNjdTMy4yNyAxNiA2IDE2czYtLjQgNi0yLjMzUzkuMzEgOSA2IDl6TTEwIDdjLS4xOSAwLS4zOC4wMS0uNTcuMDNhNC4xNCA0LjE0IDAgMCAxLTEuMzcgMS4zOWMzIC44MyA1LjIzIDMuMzEgNS40MiA1LjI4IDEuNDQtLjMxIDIuNTItLjkyIDIuNTItMi4wM0MxNiA5Ljc0IDEzLjMxIDcgMTAgN3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tb3ZldG9kZXRhaWxzXFxcIj48Y2lyY2xlIGN4PVxcXCIxLjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjcuNVxcXCIgY3k9XFxcIjE0LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjeD1cXFwiMTMuNVxcXCIgY3k9XFxcIjE0LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTEyIDFoM3Y5aC0zek0yLjAyIDcuMDJMMSA2IDAgN2wzIDMgMy0zLTEtMS0uOTQuOTRDNC4zMyA0LjczIDYuMjEgMyA4LjUgM2MuMTcgMCAuMzMuMDMuNS4wNVYxLjAzQzguODMgMS4wMSA4LjY3IDEgOC41IDEgNS4wOCAxIDIuMjcgMy42NiAyLjAyIDcuMDJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJzYS1zdmctbm9uY29tbWVyY2lhbFxcXCI+PHBhdGggZD1cXFwiTTggMEwwIDE1aDE2TDggMHptMSAxM0g3di0yaDJ2MnptLTItM1Y1aDJ2NUg3elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLXNvcnRpbmdcXFwiPjxwYXRoIGQ9XFxcIk04IDNsMiAyIDEtMS0zLTMtMyAzIDEgMXpNOCAxM2wtMi0yLTEgMSAzIDMgMy0zLTEtMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48L3N2Zz5cIjsiLCIvKipcbiogTXV1cmkgdjAuOC4wXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9oYWx0dS9tdXVyaVxuKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgSGFsdHUgT3lcbiogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9oYWx0dS9tdXVyaS9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4qIEBsaWNlbnNlIE1JVFxuKlxuKiBNdXVyaSBQYWNrZXJcbiogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIE5pa2xhcyBSw6Rtw7YgPGlucmFtb0BnbWFpbC5jb20+XG4qIEBsaWNlbnNlIE1JVFxuKlxuKiBNdXVyaSBUaWNrZXIgLyBNdXVyaSBFbWl0dGVyIC8gTXV1cmkgUXVldWVcbiogQ29weXJpZ2h0IChjKSAyMDE4LXByZXNlbnQsIE5pa2xhcyBSw6Rtw7YgPGlucmFtb0BnbWFpbC5jb20+XG4qIEBsaWNlbnNlIE1JVFxuKi9cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5NdXVyaSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBuYW1lc3BhY2UgPSAnTXV1cmknO1xuICB2YXIgZ3JpZEluc3RhbmNlcyA9IHt9O1xuXG4gIHZhciBhY3Rpb25Td2FwID0gJ3N3YXAnO1xuICB2YXIgYWN0aW9uTW92ZSA9ICdtb3ZlJztcblxuICB2YXIgZXZlbnRTeW5jaHJvbml6ZSA9ICdzeW5jaHJvbml6ZSc7XG4gIHZhciBldmVudExheW91dFN0YXJ0ID0gJ2xheW91dFN0YXJ0JztcbiAgdmFyIGV2ZW50TGF5b3V0RW5kID0gJ2xheW91dEVuZCc7XG4gIHZhciBldmVudEFkZCA9ICdhZGQnO1xuICB2YXIgZXZlbnRSZW1vdmUgPSAncmVtb3ZlJztcbiAgdmFyIGV2ZW50U2hvd1N0YXJ0ID0gJ3Nob3dTdGFydCc7XG4gIHZhciBldmVudFNob3dFbmQgPSAnc2hvd0VuZCc7XG4gIHZhciBldmVudEhpZGVTdGFydCA9ICdoaWRlU3RhcnQnO1xuICB2YXIgZXZlbnRIaWRlRW5kID0gJ2hpZGVFbmQnO1xuICB2YXIgZXZlbnRGaWx0ZXIgPSAnZmlsdGVyJztcbiAgdmFyIGV2ZW50U29ydCA9ICdzb3J0JztcbiAgdmFyIGV2ZW50TW92ZSA9ICdtb3ZlJztcbiAgdmFyIGV2ZW50U2VuZCA9ICdzZW5kJztcbiAgdmFyIGV2ZW50QmVmb3JlU2VuZCA9ICdiZWZvcmVTZW5kJztcbiAgdmFyIGV2ZW50UmVjZWl2ZSA9ICdyZWNlaXZlJztcbiAgdmFyIGV2ZW50QmVmb3JlUmVjZWl2ZSA9ICdiZWZvcmVSZWNlaXZlJztcbiAgdmFyIGV2ZW50RHJhZ0luaXQgPSAnZHJhZ0luaXQnO1xuICB2YXIgZXZlbnREcmFnU3RhcnQgPSAnZHJhZ1N0YXJ0JztcbiAgdmFyIGV2ZW50RHJhZ01vdmUgPSAnZHJhZ01vdmUnO1xuICB2YXIgZXZlbnREcmFnU2Nyb2xsID0gJ2RyYWdTY3JvbGwnO1xuICB2YXIgZXZlbnREcmFnRW5kID0gJ2RyYWdFbmQnO1xuICB2YXIgZXZlbnREcmFnUmVsZWFzZVN0YXJ0ID0gJ2RyYWdSZWxlYXNlU3RhcnQnO1xuICB2YXIgZXZlbnREcmFnUmVsZWFzZUVuZCA9ICdkcmFnUmVsZWFzZUVuZCc7XG4gIHZhciBldmVudERlc3Ryb3kgPSAnZGVzdHJveSc7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZXIgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQmluZCBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRW1pdHRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gR2V0IGxpc3RlbmVycyBxdWV1ZSBhbmQgY3JlYXRlIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzKSBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdID0gW107XG5cbiAgICAvLyBBZGQgdGhlIGxpc3RlbmVyIHRvIHRoZSBxdWV1ZS5cbiAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVW5iaW5kIGFsbCBldmVudCBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGUgcHJvdmlkZWQgbGlzdGVuZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbbGlzdGVuZXJdXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBsaXN0ZW5lcnMgYW5kIHJldHVybiBpbW1lZGlhdGVseSBpZiBub25lIGlzIGZvdW5kLlxuICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoKSByZXR1cm4gdGhpcztcblxuICAgIC8vIElmIG5vIHNwZWNpZmljIGxpc3RlbmVyIGlzIHByb3ZpZGVkIHJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFsbCBtYXRjaGluZyBsaXN0ZW5lcnMuXG4gICAgdmFyIGkgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbWl0IGFsbCBsaXN0ZW5lcnMgaW4gYSBzcGVjaWZpZWQgZXZlbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHsqfSBbYXJnMV1cbiAgICogQHBhcmFtIHsqfSBbYXJnMl1cbiAgICogQHBhcmFtIHsqfSBbYXJnM11cbiAgICogQHJldHVybnMge0VtaXR0ZXJ9XG4gICAqL1xuICBFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gR2V0IGV2ZW50IGxpc3RlbmVycyBhbmQgcXVpdCBlYXJseSBpZiB0aGVyZSdzIG5vIGxpc3RlbmVycy5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgcUxlbmd0aCA9IHF1ZXVlLmxlbmd0aDtcbiAgICB2YXIgYUxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgIHZhciBpO1xuXG4gICAgLy8gQWRkIHRoZSBjdXJyZW50IGxpc3RlbmVycyB0byB0aGUgY2FsbGJhY2sgcXVldWUgYmVmb3JlIHdlIHByb2Nlc3MgdGhlbS5cbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIGxpc3RlbmVycyBhcmUgY2FsbGVkIGluXG4gICAgLy8gY29ycmVjdCBvcmRlciBldmVuIGlmIG5ldyBldmVudCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQvYWRkZWQgZHVyaW5nXG4gICAgLy8gcHJvY2Vzc2luZyBhbmQvb3IgZXZlbnRzIGFyZSBlbWl0dGVkIGR1cmluZyBwcm9jZXNzaW5nLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICB9XG5cbiAgICAvLyBJbmNyZW1lbnQgcXVldWUgY291bnRlci4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzY2VuYXJpb3Mgd2hlcmUgZW1pdCBpc1xuICAgIC8vIHRyaWdnZXJlZCB3aGlsZSB0aGUgcXVldWUgaXMgYWxyZWFkeSBwcm9jZXNzaW5nLiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2ZcbiAgICAvLyBob3cgbWFueSBcInF1ZXVlIHByb2Nlc3NvcnNcIiB0aGVyZSBhcmUgYWN0aXZlIHNvIHRoYXQgd2UgY2FuIHNhZmVseSByZXNldFxuICAgIC8vIHRoZSBxdWV1ZSBpbiB0aGUgZW5kIHdoZW4gdGhlIGxhc3QgcXVldWUgcHJvY2Vzc29yIGlzIGZpbmlzaGVkLlxuICAgICsrdGhpcy5fY291bnRlcjtcblxuICAgIC8vIFByb2Nlc3MgdGhlIHF1ZXVlICh0aGUgc3BlY2lmaWMgcGFydCBvZiBpdCBmb3IgdGhpcyBlbWl0KS5cbiAgICBmb3IgKGkgPSBxTGVuZ3RoLCBxTGVuZ3RoID0gcXVldWUubGVuZ3RoOyBpIDwgcUxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGFMZW5ndGggPT09IDAgPyBxdWV1ZVtpXSgpIDpcbiAgICAgIGFMZW5ndGggPT09IDEgPyBxdWV1ZVtpXShhcmcxKSA6XG4gICAgICBhTGVuZ3RoID09PSAyID8gcXVldWVbaV0oYXJnMSwgYXJnMikgOlxuICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlW2ldKGFyZzEsIGFyZzIsIGFyZzMpO1xuXG4gICAgICAvLyBTdG9wIHByb2Nlc3NpbmcgaWYgdGhlIGVtaXR0ZXIgaXMgZGVzdHJveWVkLlxuICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBEZWNyZW1lbnQgcXVldWUgcHJvY2VzcyBjb3VudGVyLlxuICAgIC0tdGhpcy5fY291bnRlcjtcblxuICAgIC8vIFJlc2V0IHRoZSBxdWV1ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBxdWV1ZSBwcm9jZXNzZXMgcnVubmluZy5cbiAgICBpZiAoIXRoaXMuX2NvdW50ZXIpIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBlbWl0dGVyIGluc3RhbmNlLiBCYXNpY2FsbHkganVzdCByZW1vdmVzIGFsbCBib3VuZCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgIHZhciBldmVudDtcblxuICAgIC8vIEZsYWcgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIFJlc2V0IHF1ZXVlIChpZiBxdWV1ZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyB0aGlzIHdpbGwgYWxzbyBzdG9wIHRoYXQpLlxuICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IHRoaXMuX2NvdW50ZXIgPSAwO1xuXG4gICAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGlmIChldmVudHNbZXZlbnRdKSB7XG4gICAgICAgIGV2ZW50c1tldmVudF0ubGVuZ3RoID0gMDtcbiAgICAgICAgZXZlbnRzW2V2ZW50XSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBTZXQgdXAgdGhlIGRlZmF1bHQgZXhwb3J0IHZhbHVlcy5cbiAgdmFyIHRyYW5zZm9ybVN0eWxlID0gJ3RyYW5zZm9ybSc7XG4gIHZhciB0cmFuc2Zvcm1Qcm9wID0gJ3RyYW5zZm9ybSc7XG5cbiAgLy8gRmluZCB0aGUgc3VwcG9ydGVkIHRyYW5zZm9ybSBwcm9wIGFuZCBzdHlsZSBuYW1lcy5cbiAgdmFyIGRvY0VsZW1TdHlsZSA9IHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG4gIHZhciBzdHlsZSA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgc3R5bGVDYXAgPSAnVHJhbnNmb3JtJztcbiAgdmFyIGZvdW5kID0gZmFsc2U7XG4gIFsnJywgJ1dlYmtpdCcsICdNb3onLCAnTycsICdtcyddLmZvckVhY2goZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgdmFyIHByb3BOYW1lID0gcHJlZml4ID8gcHJlZml4ICsgc3R5bGVDYXAgOiBzdHlsZTtcbiAgICBpZiAoZG9jRWxlbVN0eWxlW3Byb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSBwcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRyYW5zZm9ybVN0eWxlID0gcHJlZml4ID8gJy0nICsgcHJlZml4ICsgJy0nICsgc3R5bGUgOiBzdHlsZTtcbiAgICAgIHRyYW5zZm9ybVByb3AgPSBwcm9wTmFtZTtcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBzdHlsZXNDYWNoZSA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gbmV3IFdlYWtNYXAoKSA6IG51bGw7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBzdHlsZSBwcm9wZXJ0eSBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlKSB7XG4gICAgdmFyIHN0eWxlcyA9IHN0eWxlc0NhY2hlICYmIHN0eWxlc0NhY2hlLmdldChlbGVtZW50KTtcbiAgICBpZiAoIXN0eWxlcykge1xuICAgICAgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gICAgICBpZiAoc3R5bGVzQ2FjaGUpIHN0eWxlc0NhY2hlLnNldChlbGVtZW50LCBzdHlsZXMpO1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUgPT09ICd0cmFuc2Zvcm0nID8gdHJhbnNmb3JtU3R5bGUgOiBzdHlsZSk7XG4gIH1cblxuICB2YXIgc3R5bGVOYW1lUmVnRXggPSAvKFtBLVpdKS9nO1xuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGEgY2FtZWwgY2FzZSBzdHlsZSBwcm9wZXJ0eSB0byBrZWJhYiBjYXNlIHN0eWxlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZU5hbWUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHN0eWxlTmFtZVJlZ0V4LCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHZhciBzdHJGdW5jdGlvbiA9ICdmdW5jdGlvbic7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWxcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbCkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSBzdHJGdW5jdGlvbjtcbiAgfVxuXG4gIHZhciB0cmFuc2Zvcm1TdHlsZSQxID0gJ3RyYW5zZm9ybSc7XG5cbiAgLyoqXG4gICAqIFNldCBpbmxpbmUgc3R5bGVzIHRvIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0U3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICAgIGZvciAodmFyIHByb3AgaW4gc3R5bGVzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3AgPT09IHRyYW5zZm9ybVN0eWxlJDEgPyB0cmFuc2Zvcm1Qcm9wIDogcHJvcF0gPSBzdHlsZXNbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZW0gYW5pbWF0aW9uIGhhbmRsZXIgcG93ZXJlZCBieSBXZWIgQW5pbWF0aW9ucyBBUEkuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBJdGVtQW5pbWF0ZShlbGVtZW50KSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fcHJvcHMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9rZXlmcmFtZXMgPSBbXTtcbiAgICB0aGlzLl9vcHRpb25zID0ge307XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9vbkZpbmlzaCA9IHRoaXMuX29uRmluaXNoLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgaW5zdGFuY2UncyBhbmltYXRpb24uIEF1dG9tYXRpY2FsbHkgc3RvcHMgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXNcbiAgICogcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc0Zyb21cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzVG9cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZWFzaW5nPSdlYXNlJ11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25GaW5pc2hdXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihwcm9wc0Zyb20sIHByb3BzVG8sIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLl9hbmltYXRpb247XG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX3Byb3BzO1xuICAgIHZhciBjdXJyZW50VmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBjYW5jZWxBbmltYXRpb24gPSBmYWxzZTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXhpc3RpbmcgYW5pbWF0aW9uIHJ1bm5pbmcsIGxldCdzIGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlXG4gICAgLy8gY2FuY2VsbGVkIG9yIGlmIGl0IGNhbiBjb250aW51ZSBydW5uaW5nLlxuICAgIGlmIChhbmltYXRpb24pIHtcbiAgICAgIHZhciBwcm9wQ291bnQgPSAwO1xuICAgICAgdmFyIHByb3BJbmRleDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBhbmltYXRpb24gdGFyZ2V0IHByb3BzIGFuZCB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGVcbiAgICAgIC8vIGN1cnJlbnQgcHJvcHMgYW5kIHZhbHVlcy5cbiAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3BzVG8pIHtcbiAgICAgICAgKytwcm9wQ291bnQ7XG4gICAgICAgIHByb3BJbmRleCA9IGN1cnJlbnRQcm9wcy5pbmRleE9mKHByb3BOYW1lKTtcbiAgICAgICAgaWYgKHByb3BJbmRleCA9PT0gLTEgfHwgcHJvcHNUb1twcm9wTmFtZV0gIT09IGN1cnJlbnRWYWx1ZXNbcHJvcEluZGV4XSkge1xuICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBwcm9wcyBjb3VudCBtYXRjaGVzIGN1cnJlbnQgcHJvcHMgY291bnQuIFRoaXMgaXNcbiAgICAgIC8vIG5lZWRlZCBmb3IgdGhlIGVkZ2UgY2FzZSBzY2VuYXJpbyB3aGVyZSB0YXJnZXQgcHJvcHMgY29udGFpbiB0aGUgc2FtZVxuICAgICAgLy8gc3R5bGVzIGFzIGN1cnJlbnQgcHJvcHMsIGJ1dCB0aGUgY3VycmVudCBwcm9wcyBoYXZlIHNvbWUgYWRkaXRpb25hbFxuICAgICAgLy8gcHJvcHMuXG4gICAgICBpZiAoIWNhbmNlbEFuaW1hdGlvbiAmJiBwcm9wQ291bnQgIT09IGN1cnJlbnRQcm9wcy5sZW5ndGgpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgYW5pbWF0aW9uIChpZiByZXF1aXJlZCkuXG4gICAgaWYgKGNhbmNlbEFuaW1hdGlvbikgYW5pbWF0aW9uLmNhbmNlbCgpO1xuXG4gICAgLy8gU3RvcmUgYW5pbWF0aW9uIGNhbGxiYWNrLlxuICAgIHRoaXMuX2NhbGxiYWNrID0gaXNGdW5jdGlvbihvcHRzLm9uRmluaXNoKSA/IG9wdHMub25GaW5pc2ggOiBudWxsO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHJ1bm5pbmcgYW5pbWF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCB0byBiZSBjYW5jZWxsZWQsIGxldCdzXG4gICAgLy8gY2FsbCBpdCBhIGRheSBoZXJlIGFuZCBsZXQgaXQgcnVuLlxuICAgIGlmIChhbmltYXRpb24gJiYgIWNhbmNlbEFuaW1hdGlvbikgcmV0dXJuO1xuXG4gICAgLy8gU3RvcmUgdGFyZ2V0IHByb3BzIGFuZCB2YWx1ZXMgdG8gaW5zdGFuY2UuXG4gICAgY3VycmVudFByb3BzLmxlbmd0aCA9IGN1cnJlbnRWYWx1ZXMubGVuZ3RoID0gMDtcbiAgICBmb3IgKHByb3BOYW1lIGluIHByb3BzVG8pIHtcbiAgICAgIGN1cnJlbnRQcm9wcy5wdXNoKHByb3BOYW1lKTtcbiAgICAgIGN1cnJlbnRWYWx1ZXMucHVzaChwcm9wc1RvW3Byb3BOYW1lXSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGtleWZyYW1lcy5cbiAgICB2YXIgYW5pbUtleWZyYW1lcyA9IHRoaXMuX2tleWZyYW1lcztcbiAgICBhbmltS2V5ZnJhbWVzWzBdID0gcHJvcHNGcm9tO1xuICAgIGFuaW1LZXlmcmFtZXNbMV0gPSBwcm9wc1RvO1xuXG4gICAgLy8gU2V0IHVwIG9wdGlvbnMuXG4gICAgdmFyIGFuaW1PcHRpb25zID0gdGhpcy5fb3B0aW9ucztcbiAgICBhbmltT3B0aW9ucy5kdXJhdGlvbiA9IG9wdHMuZHVyYXRpb24gfHwgMzAwO1xuICAgIGFuaW1PcHRpb25zLmVhc2luZyA9IG9wdHMuZWFzaW5nIHx8ICdlYXNlJztcblxuICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb25cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgYW5pbWF0aW9uID0gZWxlbWVudC5hbmltYXRlKGFuaW1LZXlmcmFtZXMsIGFuaW1PcHRpb25zKTtcbiAgICBhbmltYXRpb24ub25maW5pc2ggPSB0aGlzLl9vbkZpbmlzaDtcbiAgICB0aGlzLl9hbmltYXRpb24gPSBhbmltYXRpb247XG5cbiAgICAvLyBTZXQgdGhlIGVuZCBzdHlsZXMuIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBlbGVtZW50IHN0YXlzIGF0IHRoZSBlbmRcbiAgICAvLyB2YWx1ZXMgYWZ0ZXIgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLlxuICAgIHNldFN0eWxlcyhlbGVtZW50LCBwcm9wc1RvKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcCBpbnN0YW5jZSdzIGN1cnJlbnQgYW5pbWF0aW9uIGlmIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW3N0eWxlc11cbiAgICovXG4gIEl0ZW1BbmltYXRlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oc3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9hbmltYXRpb24pIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgY3VycmVudFByb3BzID0gdGhpcy5fcHJvcHM7XG4gICAgdmFyIGN1cnJlbnRWYWx1ZXMgPSB0aGlzLl92YWx1ZXM7XG4gICAgdmFyIHByb3BOYW1lO1xuICAgIHZhciBwcm9wVmFsdWU7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBDYWxjdWxhdGUgKGlmIG5vdCBwcm92aWRlZCkgYW5kIHNldCBzdHlsZXMuXG4gICAgaWYgKCFzdHlsZXMpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50UHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcHJvcE5hbWUgPSBjdXJyZW50UHJvcHNbaV07XG4gICAgICAgIHByb3BWYWx1ZSA9IGdldFN0eWxlKGVsZW1lbnQsIGdldFN0eWxlTmFtZShwcm9wTmFtZSkpO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BOYW1lID09PSAndHJhbnNmb3JtJyA/IHRyYW5zZm9ybVByb3AgOiBwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpO1xuICAgIH1cblxuICAgIC8vICBDYW5jZWwgYW5pbWF0aW9uLlxuICAgIHRoaXMuX2FuaW1hdGlvbi5jYW5jZWwoKTtcbiAgICB0aGlzLl9hbmltYXRpb24gPSB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG5cbiAgICAvLyBSZXNldCBjdXJyZW50IHByb3BzIGFuZCB2YWx1ZXMuXG4gICAgY3VycmVudFByb3BzLmxlbmd0aCA9IGN1cnJlbnRWYWx1ZXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgYmVpbmcgYW5pbWF0ZWQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtQW5pbWF0ZS5wcm90b3R5cGVcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW1BbmltYXRlLnByb3RvdHlwZS5pc0FuaW1hdGluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2FuaW1hdGlvbjtcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLl9vcHRpb25zID0gdGhpcy5fa2V5ZnJhbWVzID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQW5pbWF0aW9uIGVuZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuX29uRmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gdGhpcy5fY2FsbGJhY2s7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX3Byb3BzLmxlbmd0aCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGggPSAwO1xuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gIH07XG5cbiAgdmFyIHZlbmRvclByZWZpeGVzID0gWycnLCAnd2Via2l0JywgJ21veicsICdtcycsICdvJywgJ1dlYmtpdCcsICdNb3onLCAnTVMnLCAnTyddO1xuXG4gIC8qKlxuICAgKiBHZXQgcHJlZml4ZWQgQ1NTIHByb3BlcnR5IG5hbWUgd2hlbiBnaXZlbiBhIG5vbi1wcmVmaXhlZCBDU1MgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1TdHlsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcE5hbWVcbiAgICogQHJldHVybnMgeyFTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQcmVmaXhlZFByb3BOYW1lKGVsZW1TdHlsZSwgcHJvcE5hbWUpIHtcbiAgICB2YXIgY2FtZWxQcm9wTmFtZSA9IHByb3BOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wTmFtZS5zbGljZSgxKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZWZpeDtcbiAgICB2YXIgcHJlZml4ZWRQcm9wTmFtZTtcblxuICAgIHdoaWxlIChpIDwgdmVuZG9yUHJlZml4ZXMubGVuZ3RoKSB7XG4gICAgICBwcmVmaXggPSB2ZW5kb3JQcmVmaXhlc1tpXTtcbiAgICAgIHByZWZpeGVkUHJvcE5hbWUgPSBwcmVmaXggPyBwcmVmaXggKyBjYW1lbFByb3BOYW1lIDogcHJvcE5hbWU7XG4gICAgICBpZiAocHJlZml4ZWRQcm9wTmFtZSBpbiBlbGVtU3R5bGUpIHJldHVybiBwcmVmaXhlZFByb3BOYW1lO1xuICAgICAgKytpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGR0ID0gMTAwMCAvIDYwO1xuXG4gIHZhciByYWYgPSAoXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKGR0KTtcbiAgICAgIH0sIGR0KTtcbiAgICB9XG4gICkuYmluZCh3aW5kb3cpO1xuXG4gIC8vIERldGVjdCBzdXBwb3J0IGZvciBwYXNzaXZlIGV2ZW50czpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvRXZlbnRMaXN0ZW5lck9wdGlvbnMvYmxvYi9naC1wYWdlcy9leHBsYWluZXIubWQjZmVhdHVyZS1kZXRlY3Rpb25cbiAgdmFyIGlzUGFzc2l2ZUV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBwYXNzaXZlT3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIHBhc3NpdmVPcHRzKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmUnLCBudWxsLCBwYXNzaXZlT3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgLy8gRHJhZ2dlciBldmVudHMuXG4gIHZhciBldmVudHMgPSB7XG4gICAgc3RhcnQ6ICdzdGFydCcsXG4gICAgbW92ZTogJ21vdmUnLFxuICAgIGVuZDogJ2VuZCcsXG4gICAgY2FuY2VsOiAnY2FuY2VsJ1xuICB9O1xuXG4gIHZhciBoYXNUb3VjaEV2ZW50cyA9ICEhKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCB3aW5kb3cuVG91Y2hFdmVudCk7XG4gIHZhciBoYXNQb2ludGVyRXZlbnRzID0gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xuICB2YXIgaGFzTXNQb2ludGVyRXZlbnRzID0gISF3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7XG4gIHZhciBpc0FuZHJvaWQgPSAvKGFuZHJvaWQpL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIHZhciBsaXN0ZW5lck9wdGlvbnMgPSBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPyB7IHBhc3NpdmU6IHRydWUgfSA6IGZhbHNlO1xuXG4gIHZhciB0YVByb3AgPSAndG91Y2hBY3Rpb24nO1xuICB2YXIgdGFQcm9wUHJlZml4ZWQgPSBnZXRQcmVmaXhlZFByb3BOYW1lKHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsIHRhUHJvcCk7XG4gIHZhciB0YURlZmF1bHRWYWx1ZSA9ICdhdXRvJztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBEcmFnZ2VyIGluc3RhbmNlIGZvciBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3NzUHJvcHNdXG4gICAqL1xuICBmdW5jdGlvbiBEcmFnZ2VyKGVsZW1lbnQsIGNzc1Byb3BzKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jc3NQcm9wcyA9IHt9O1xuICAgIHRoaXMuX3RvdWNoQWN0aW9uID0gJyc7XG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG5cbiAgICB0aGlzLl9wb2ludGVySWQgPSBudWxsO1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5fc3RhcnRYID0gMDtcbiAgICB0aGlzLl9zdGFydFkgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRYID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WSA9IDA7XG5cbiAgICB0aGlzLl9wcmVTdGFydENoZWNrID0gdGhpcy5fcHJlU3RhcnRDaGVjay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSA9IHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uU3RhcnQgPSB0aGlzLl9vblN0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25Nb3ZlID0gdGhpcy5fb25Nb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25DYW5jZWwgPSB0aGlzLl9vbkNhbmNlbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uRW5kID0gdGhpcy5fb25FbmQuYmluZCh0aGlzKTtcblxuICAgIC8vIEFwcGx5IGluaXRpYWwgY3NzIHByb3BzLlxuICAgIHRoaXMuc2V0Q3NzUHJvcHMoY3NzUHJvcHMpO1xuXG4gICAgLy8gSWYgdG91Y2ggYWN0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2l0aCBpbml0aWFsIGNzcyBwcm9wcyBsZXQncyBhc3N1bWUgaXQnc1xuICAgIC8vIGF1dG8uXG4gICAgaWYgKCF0aGlzLl90b3VjaEFjdGlvbikge1xuICAgICAgdGhpcy5zZXRUb3VjaEFjdGlvbih0YURlZmF1bHRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBuYXRpdmUgbGluay9pbWFnZSBkcmFnZ2luZyBmb3IgdGhlIGl0ZW0gYW5kIGl0J3MgYW5jZXN0b3JzLlxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcblxuICAgIC8vIExpc3RlbiB0byBzdGFydCBldmVudC5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fZXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSB0b3VjaCBldmVudHMsIGJ1dCBubyBwb2ludGVyIGV2ZW50cyB3ZSBuZWVkIHRvIGFsc28gbGlzdGVuIGZvclxuICAgIC8vIG1vdXNlIGV2ZW50cyBpbiBhZGRpdGlvbiB0byB0b3VjaCBldmVudHMgZm9yIGRldmljZXMgd2hpY2ggc3VwcG9ydCBib3RoXG4gICAgLy8gbW91c2UgYW5kIHRvdWNoIGludGVyYWN0aW9uLlxuICAgIGlmIChoYXNUb3VjaEV2ZW50cyAmJiAhaGFzUG9pbnRlckV2ZW50cyAmJiAhaGFzTXNQb2ludGVyRXZlbnRzKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fbW91c2VFdmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBwcm9wZXJ0aWVzXG4gICAqICoqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIERyYWdnZXIuX3BvaW50ZXJFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICdwb2ludGVyZG93bicsXG4gICAgbW92ZTogJ3BvaW50ZXJtb3ZlJyxcbiAgICBjYW5jZWw6ICdwb2ludGVyY2FuY2VsJyxcbiAgICBlbmQ6ICdwb2ludGVydXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fbXNQb2ludGVyRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnTVNQb2ludGVyRG93bicsXG4gICAgbW92ZTogJ01TUG9pbnRlck1vdmUnLFxuICAgIGNhbmNlbDogJ01TUG9pbnRlckNhbmNlbCcsXG4gICAgZW5kOiAnTVNQb2ludGVyVXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fdG91Y2hFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICd0b3VjaHN0YXJ0JyxcbiAgICBtb3ZlOiAndG91Y2htb3ZlJyxcbiAgICBjYW5jZWw6ICd0b3VjaGNhbmNlbCcsXG4gICAgZW5kOiAndG91Y2hlbmQnXG4gIH07XG5cbiAgRHJhZ2dlci5fbW91c2VFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICdtb3VzZWRvd24nLFxuICAgIG1vdmU6ICdtb3VzZW1vdmUnLFxuICAgIGNhbmNlbDogJycsXG4gICAgZW5kOiAnbW91c2V1cCdcbiAgfTtcblxuICBEcmFnZ2VyLl9ldmVudHMgPSAoZnVuY3Rpb24oKSB7XG4gICAgaWYgKGhhc1BvaW50ZXJFdmVudHMpIHJldHVybiBEcmFnZ2VyLl9wb2ludGVyRXZlbnRzO1xuICAgIGlmIChoYXNNc1BvaW50ZXJFdmVudHMpIHJldHVybiBEcmFnZ2VyLl9tc1BvaW50ZXJFdmVudHM7XG4gICAgaWYgKGhhc1RvdWNoRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fdG91Y2hFdmVudHM7XG4gICAgcmV0dXJuIERyYWdnZXIuX21vdXNlRXZlbnRzO1xuICB9KSgpO1xuXG4gIERyYWdnZXIuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuXG4gIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgc3RhdGljIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnByZXZlbnREZWZhdWx0ICYmIGUuY2FuY2VsYWJsZSAhPT0gZmFsc2UpIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9hY3RpdmF0ZUluc3RhbmNlID0gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgaW5kZXggPSBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMuaW5kZXhPZihpbnN0YW5jZSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHJldHVybjtcblxuICAgIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9uKGV2ZW50cy5tb3ZlLCBpbnN0YW5jZS5fb25Nb3ZlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9uKGV2ZW50cy5jYW5jZWwsIGluc3RhbmNlLl9vbkNhbmNlbCk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMuZW5kLCBpbnN0YW5jZS5fb25FbmQpO1xuXG4gICAgaWYgKERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIERyYWdnZXIuX2JpbmRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH07XG5cbiAgRHJhZ2dlci5fZGVhY3RpdmF0ZUluc3RhbmNlID0gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgaW5kZXggPSBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMuaW5kZXhPZihpbnN0YW5jZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vZmYoZXZlbnRzLm1vdmUsIGluc3RhbmNlLl9vbk1vdmUpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5jYW5jZWwsIGluc3RhbmNlLl9vbkNhbmNlbCk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vZmYoZXZlbnRzLmVuZCwgaW5zdGFuY2UuX29uRW5kKTtcblxuICAgIGlmICghRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmxlbmd0aCkge1xuICAgICAgRHJhZ2dlci5fdW5iaW5kTGlzdGVuZXJzKCk7XG4gICAgfVxuICB9O1xuXG4gIERyYWdnZXIuX2JpbmRMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXZlbnRzID0gRHJhZ2dlci5fZXZlbnRzO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy5tb3ZlLCBEcmFnZ2VyLl9vbk1vdmUsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRzLmVuZCwgRHJhZ2dlci5fb25FbmQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZXZlbnRzLmNhbmNlbCAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMuY2FuY2VsLCBEcmFnZ2VyLl9vbkNhbmNlbCwgbGlzdGVuZXJPcHRpb25zKTtcbiAgfTtcblxuICBEcmFnZ2VyLl91bmJpbmRMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXZlbnRzID0gRHJhZ2dlci5fZXZlbnRzO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5tb3ZlLCBEcmFnZ2VyLl9vbk1vdmUsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRzLmVuZCwgRHJhZ2dlci5fb25FbmQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZXZlbnRzLmNhbmNlbCAmJiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMuY2FuY2VsLCBEcmFnZ2VyLl9vbkNhbmNlbCwgbGlzdGVuZXJPcHRpb25zKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9nZXRFdmVudFBvaW50ZXJJZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBwb2ludGVyIGlkIGF2YWlsYWJsZSBsZXQncyB1c2UgaXQuXG4gICAgaWYgKHR5cGVvZiBldmVudC5wb2ludGVySWQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZXZlbnQucG9pbnRlcklkO1xuICAgIH1cblxuICAgIC8vIEZvciB0b3VjaCBldmVudHMgbGV0J3MgZ2V0IHRoZSBmaXJzdCBjaGFuZ2VkIHRvdWNoJ3MgaWRlbnRpZmllci5cbiAgICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHtcbiAgICAgIHJldHVybiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZvciBtb3VzZS9vdGhlciBldmVudHMgbGV0J3MgcHJvdmlkZSBhIHN0YXRpYyBpZC5cbiAgICByZXR1cm4gMTtcbiAgfTtcblxuICBEcmFnZ2VyLl9nZXRUb3VjaEJ5SWQgPSBmdW5jdGlvbihldmVudCwgaWQpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcG9pbnRlciBldmVudCByZXR1cm4gdGhlIHdob2xlIGV2ZW50IGlmIHRoZXJlJ3MgYSBtYXRjaCwgYW5kXG4gICAgLy8gbnVsbCBvdGhlcndpc2UuXG4gICAgaWYgKHR5cGVvZiBldmVudC5wb2ludGVySWQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZXZlbnQucG9pbnRlcklkID09PSBpZCA/IGV2ZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgdG91Y2ggZXZlbnRzIGxldCdzIGNoZWNrIGlmIHRoZXJlJ3MgYSBjaGFuZ2VkIHRvdWNoIG9iamVjdCB0aGF0IG1hdGNoZXNcbiAgICAvLyB0aGUgcG9pbnRlcklkIGluIHdoaWNoIGNhc2UgcmV0dXJuIHRoZSB0b3VjaCBvYmplY3QuXG4gICAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyID09PSBpZCkge1xuICAgICAgICAgIHJldHVybiBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRm9yIG1vdXNlL290aGVyIGV2ZW50cyBsZXQncyBhc3N1bWUgdGhlcmUncyBvbmx5IG9uZSBwb2ludGVyIGFuZCBqdXN0XG4gICAgLy8gcmV0dXJuIHRoZSBldmVudC5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH07XG5cbiAgRHJhZ2dlci5fb25Nb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMubW92ZSwgZSk7XG4gIH07XG5cbiAgRHJhZ2dlci5fb25DYW5jZWwgPSBmdW5jdGlvbihlKSB7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5lbWl0KGV2ZW50cy5jYW5jZWwsIGUpO1xuICB9O1xuXG4gIERyYWdnZXIuX29uRW5kID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMuZW5kLCBlKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXNldCBjdXJyZW50IGRyYWcgb3BlcmF0aW9uIChpZiBhbnkpLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuX3N0YXJ0WCA9IDA7XG4gICAgdGhpcy5fc3RhcnRZID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFkgPSAwO1xuICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUsXG4gICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICApO1xuXG4gICAgRHJhZ2dlci5fZGVhY3RpdmF0ZUluc3RhbmNlKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjdXN0b20gZHJhZ2dlciBldmVudCBmcm9tIGEgcmF3IGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICogQHJldHVybnMge0RyYWdnZXJFdmVudH1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9jcmVhdGVFdmVudCA9IGZ1bmN0aW9uKHR5cGUsIGUpIHtcbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEhhbW1lci5qcyBjb21wYXRpYmlsaXR5IGludGVyZmFjZS5cbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBzcmNFdmVudDogZSxcbiAgICAgIGRpc3RhbmNlOiB0aGlzLmdldERpc3RhbmNlKCksXG4gICAgICBkZWx0YVg6IHRoaXMuZ2V0RGVsdGFYKCksXG4gICAgICBkZWx0YVk6IHRoaXMuZ2V0RGVsdGFZKCksXG4gICAgICBkZWx0YVRpbWU6IHR5cGUgPT09IGV2ZW50cy5zdGFydCA/IDAgOiB0aGlzLmdldERlbHRhVGltZSgpLFxuICAgICAgaXNGaXJzdDogdHlwZSA9PT0gZXZlbnRzLnN0YXJ0LFxuICAgICAgaXNGaW5hbDogdHlwZSA9PT0gZXZlbnRzLmVuZCB8fCB0eXBlID09PSBldmVudHMuY2FuY2VsLFxuICAgICAgLy8gUGFydGlhbCBUb3VjaCBBUEkgaW50ZXJmYWNlLlxuICAgICAgaWRlbnRpZmllcjogdGhpcy5fcG9pbnRlcklkLFxuICAgICAgc2NyZWVuWDogdG91Y2guc2NyZWVuWCxcbiAgICAgIHNjcmVlblk6IHRvdWNoLnNjcmVlblksXG4gICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogdG91Y2guY2xpZW50WSxcbiAgICAgIHBhZ2VYOiB0b3VjaC5wYWdlWCxcbiAgICAgIHBhZ2VZOiB0b3VjaC5wYWdlWSxcbiAgICAgIHRhcmdldDogdG91Y2gudGFyZ2V0XG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogRW1pdCBhIHJhdyBldmVudCBhcyBkcmFnZ2VyIGV2ZW50IGludGVybmFsbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2VtaXQgPSBmdW5jdGlvbih0eXBlLCBlKSB7XG4gICAgdGhpcy5fZW1pdHRlci5lbWl0KHR5cGUsIHRoaXMuX2NyZWF0ZUV2ZW50KHR5cGUsIGUpKTtcbiAgfTtcblxuICAvKipcbiAgICogSWYgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIGEgUG9pbnRlckV2ZW50IHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGl0IGlmIGl0IGhhc1xuICAgKiB0aGUgc2FtZSBwb2ludGVySWQgYXMgdGhlIGluc3RhbmNlLiBJZiB0aGUgcHJvdmlkZWQgZXZlbnQgaXMgYSBUb3VjaEV2ZW50XG4gICAqIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIGxvb2sgZm9yIGEgVG91Y2ggaW5zdGFuY2UgaW4gdGhlIGNoYW5nZWRUb3VjaGVzIHRoYXRcbiAgICogaGFzIGFuIGlkZW50aWZpZXIgbWF0Y2hpbmcgdGhpcyBpbnN0YW5jZSdzIHBvaW50ZXJJZC4gSWYgdGhlIHByb3ZpZGVkIGV2ZW50XG4gICAqIGlzIGEgTW91c2VFdmVudCAob3IganVzdCBhbnkgb3RoZXIgZXZlbnQgdGhhbiBQb2ludGVyRXZlbnQgb3IgVG91Y2hFdmVudClcbiAgICogaXQgd2lsbCBiZSByZXR1cm5lZCBpbW1lZGlhdGVseS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfVxuICAgKiBAcmV0dXJucyB7PyhUb3VjaHxQb2ludGVyRXZlbnR8TW91c2VFdmVudCl9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fZ2V0VHJhY2tlZFRvdWNoID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICh0aGlzLl9wb2ludGVySWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHJhZ2dlci5fZ2V0VG91Y2hCeUlkKGUsIHRoaXMuX3BvaW50ZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBIHByZS1oYW5kbGVyIGZvciBzdGFydCBldmVudCB0aGF0IGNoZWNrcyBpZiB3ZSBjYW4gc3RhcnQgZHJhZ2dpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX3ByZVN0YXJ0Q2hlY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgbm90IGJlaW5nIGRyYWdnZWQgY3VycmVudGx5LlxuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcoKSkgcmV0dXJuO1xuXG4gICAgLy8gU3BlY2lhbCBjYW5jZWxhYmxlIGNoZWNrIGZvciBBbmRyb2lkIHRvIHByZXZlbnQgZHJhZyBwcm9jZWR1cmUgZnJvbVxuICAgIC8vIHN0YXJ0aW5nIGlmIG5hdGl2ZSBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MuIFBhcnQgMS5cbiAgICBpZiAoaXNBbmRyb2lkICYmIGUuY2FuY2VsYWJsZSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgIC8vIE1ha2Ugc3VyZSBsZWZ0IGJ1dHRvbiBpcyBwcmVzc2VkIG9uIG1vdXNlLlxuICAgIGlmIChlLmJ1dHRvbikgcmV0dXJuO1xuXG4gICAgLy8gR2V0IChhbmQgc2V0KSBwb2ludGVyIGlkLlxuICAgIHRoaXMuX3BvaW50ZXJJZCA9IERyYWdnZXIuX2dldEV2ZW50UG9pbnRlcklkKGUpO1xuICAgIGlmICh0aGlzLl9wb2ludGVySWQgPT09IG51bGwpIHJldHVybjtcblxuICAgIC8vIFN0b3JlIHRoZSBzdGFydCBldmVudCBhbmQgdHJpZ2dlciBzdGFydCAoYXN5bmMgb3Igc3luYykuIFBvaW50ZXIgZXZlbnRzXG4gICAgLy8gYXJlIGVtaXR0ZWQgYmVmb3JlIHRvdWNoIGV2ZW50cyBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBib3RoIG9mIHRoZW0uIEFuZFxuICAgIC8vIGlmIHlvdSB0cnkgdG8gbW92ZSBhbiBlbGVtZW50IGJlZm9yZSBgdG91Y2hzdGFydGAgaXMgZW1pdHRlZCB0aGUgcG9pbnRlclxuICAgIC8vIGV2ZW50cyBmb3IgdGhhdCBlbGVtZW50IHdpbGwgYmUgY2FuY2VsZWQuIFRoZSBmaXggaXMgdG8gZGVsYXkgdGhlIGVtaXR0ZWRcbiAgICAvLyBwb2ludGVyIGV2ZW50cyBpbiBzdWNoIGEgc2NlbmFyaW8gYnkgb25lIGZyYW1lIHNvIHRoYXQgYHRvdWNoc3RhcnRgIGhhc1xuICAgIC8vIHRpbWUgdG8gYmUgZW1pdHRlZCBiZWZvcmUgdGhlIGVsZW1lbnQgaXMgKHBvdGVudGlhbGx5KSBtb3ZlZC5cbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gZTtcbiAgICBpZiAoaGFzVG91Y2hFdmVudHMgJiYgKGhhc1BvaW50ZXJFdmVudHMgfHwgaGFzTXNQb2ludGVyRXZlbnRzKSkge1xuICAgICAgLy8gU3BlY2lhbCBjYW5jZWxhYmxlIGNoZWNrIGZvciBBbmRyb2lkIHRvIHByZXZlbnQgZHJhZyBwcm9jZWR1cmUgZnJvbVxuICAgICAgLy8gc3RhcnRpbmcgaWYgbmF0aXZlIHNjcm9sbGluZyBpcyBpbiBwcm9ncmVzcy4gUGFydCAyLlxuICAgICAgaWYgKGlzQW5kcm9pZCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICAgICAgdGhpcy5fYWJvcnROb25DYW5jZWxhYmxlLFxuICAgICAgICAgIGxpc3RlbmVyT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmFmKHRoaXMuX29uU3RhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN0YXJ0KCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBYm9ydCBzdGFydCBldmVudCBpZiBpdCB0dXJucyBvdXQgdG8gYmUgbm9uLWNhbmNlbGFibGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2Fib3J0Tm9uQ2FuY2VsYWJsZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCxcbiAgICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSxcbiAgICAgIGxpc3RlbmVyT3B0aW9uc1xuICAgICk7XG5cbiAgICBpZiAodGhpcy5fc3RhcnRFdmVudCAmJiBlLmNhbmNlbGFibGUgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9wb2ludGVySWQgPSBudWxsO1xuICAgICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgZHJhZyBwcm9jZWR1cmUgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uU3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZSA9IHRoaXMuX3N0YXJ0RXZlbnQ7XG4gICAgaWYgKCFlKSByZXR1cm47XG5cbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gbnVsbDtcblxuICAgIHZhciB0b3VjaCA9IHRoaXMuX2dldFRyYWNrZWRUb3VjaChlKTtcbiAgICBpZiAoIXRvdWNoKSByZXR1cm47XG5cbiAgICAvLyBTZXQgdXAgaW5pdCBkYXRhIGFuZCBlbWl0IHN0YXJ0IGV2ZW50LlxuICAgIHRoaXMuX3N0YXJ0WCA9IHRoaXMuX2N1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICB0aGlzLl9zdGFydFkgPSB0aGlzLl9jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5zdGFydCwgZSk7XG4gICAgRHJhZ2dlci5fYWN0aXZhdGVJbnN0YW5jZSh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbW92ZSBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgIHZhciB0b3VjaCA9IHRoaXMuX2dldFRyYWNrZWRUb3VjaChlKTtcbiAgICBpZiAoIXRvdWNoKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy5fY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHRoaXMuX2VtaXQoZXZlbnRzLm1vdmUsIGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBtb3ZlIGNhbmNlbCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25DYW5jZWwgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRUcmFja2VkVG91Y2goZSkpIHJldHVybjtcblxuICAgIHRoaXMuX2VtaXQoZXZlbnRzLmNhbmNlbCwgZSk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgZW5kIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9vbkVuZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoIXRoaXMuX2dldFRyYWNrZWRUb3VjaChlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZW1pdChldmVudHMuZW5kLCBlKTtcbiAgICB0aGlzLl9yZXNldCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZWxlbWVudCBpcyBiZWluZyBkcmFnZ2VkIGF0IHRoZSBtb21lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuaXNEcmFnZ2luZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wb2ludGVySWQgIT09IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBlbGVtZW50J3MgdG91Y2gtYWN0aW9uIENTUyBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5zZXRUb3VjaEFjdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgLy8gU3RvcmUgdW5tb2RpZmllZCB0b3VjaCBhY3Rpb24gdmFsdWUgKHdlIHRydXN0IHVzZXIgaW5wdXQgaGVyZSkuXG4gICAgdGhpcy5fdG91Y2hBY3Rpb24gPSB2YWx1ZTtcblxuICAgIC8vIFNldCB0b3VjaC1hY3Rpb24gc3R5bGUuXG4gICAgaWYgKHRhUHJvcFByZWZpeGVkKSB7XG4gICAgICB0aGlzLl9jc3NQcm9wc1t0YVByb3BQcmVmaXhlZF0gPSAnJztcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbdGFQcm9wUHJlZml4ZWRdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhbiB1bnN1cHBvcnRlZCB0b3VjaC1hY3Rpb24gdmFsdWUgbGV0J3MgYWRkIGEgc3BlY2lhbCBsaXN0ZW5lclxuICAgIC8vIHRoYXQgcHJldmVudHMgZGVmYXVsdCBhY3Rpb24gb24gdG91Y2ggc3RhcnQgZXZlbnQuIEEgZGlydHkgaGFjaywgYnV0IGJlc3RcbiAgICAvLyB3ZSBjYW4gZG8gZm9yIG5vdy4gVGhlIG90aGVyIG9wdGlvbnMgd291bGQgYmUgdG8gc29tZWhvdyBwb2x5ZmlsbCB0aGVcbiAgICAvLyB1bnN1cHBvcnRlZCB0b3VjaCBhY3Rpb24gYmVoYXZpb3Igd2l0aCBjdXN0b20gaGV1cmlzdGljcyB3aGljaCBzb3VuZHMgbGlrZVxuICAgIC8vIGEgY2FuIG9mIHdvcm1zLlxuICAgIGlmIChoYXNUb3VjaEV2ZW50cykge1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGVbdGFQcm9wUHJlZml4ZWRdICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgZWxlbWVudCdzIENTUyBwcm9wZXJ0aWVzLiBBY2NlcHRzIGFuIG9iamVjdCB3aXRoIGNhbWVsIGNhc2VkIHN0eWxlXG4gICAqIHByb3BzIHdpdGggdmFsdWUgcGFpcnMgYXMgaXQncyBmaXJzdCBhcmd1bWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtuZXdQcm9wc11cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLnNldENzc1Byb3BzID0gZnVuY3Rpb24obmV3UHJvcHMpIHtcbiAgICBpZiAoIW5ld1Byb3BzKSByZXR1cm47XG5cbiAgICB2YXIgY3VycmVudFByb3BzID0gdGhpcy5fY3NzUHJvcHM7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBwcm9wO1xuICAgIHZhciBwcmVmaXhlZFByb3A7XG5cbiAgICAvLyBSZXNldCBjdXJyZW50IHByb3BzLlxuICAgIGZvciAocHJvcCBpbiBjdXJyZW50UHJvcHMpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSBjdXJyZW50UHJvcHNbcHJvcF07XG4gICAgICBkZWxldGUgY3VycmVudFByb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIC8vIFNldCBuZXcgcHJvcHMuXG4gICAgZm9yIChwcm9wIGluIG5ld1Byb3BzKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbHVlIGZvciB0aGUgcHJvcC5cbiAgICAgIGlmICghbmV3UHJvcHNbcHJvcF0pIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0b3VjaC1hY3Rpb24uXG4gICAgICBpZiAocHJvcCA9PT0gdGFQcm9wKSB7XG4gICAgICAgIHRoaXMuc2V0VG91Y2hBY3Rpb24obmV3UHJvcHNbcHJvcF0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHByZWZpeGVkIHByb3AgYW5kIHNraXAgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAgICBwcmVmaXhlZFByb3AgPSBnZXRQcmVmaXhlZFByb3BOYW1lKGVsZW1lbnQuc3R5bGUsIHByb3ApO1xuICAgICAgaWYgKCFwcmVmaXhlZFByb3ApIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTdG9yZSB0aGUgcHJvcCBhbmQgYWRkIHRoZSBzdHlsZS5cbiAgICAgIGN1cnJlbnRQcm9wc1twcmVmaXhlZFByb3BdID0gJyc7XG4gICAgICBlbGVtZW50LnN0eWxlW3ByZWZpeGVkUHJvcF0gPSBuZXdQcm9wc1twcm9wXTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBtdWNoIHRoZSBwb2ludGVyIGhhcyBtb3ZlZCBvbiB4LWF4aXMgZnJvbSBzdGFydCBwb3NpdGlvbiwgaW4gcGl4ZWxzLlxuICAgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgbW92ZW1lbnQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZ2V0RGVsdGFYID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRYIC0gdGhpcy5fc3RhcnRYO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbXVjaCB0aGUgcG9pbnRlciBoYXMgbW92ZWQgb24geS1heGlzIGZyb20gc3RhcnQgcG9zaXRpb24sIGluIHBpeGVscy5cbiAgICogUG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIG1vdmVtZW50IGZyb20gdG9wIHRvIGJvdHRvbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhWSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50WSAtIHRoaXMuX3N0YXJ0WTtcbiAgfTtcblxuICAvKipcbiAgICogSG93IGZhciAoaW4gcGl4ZWxzKSBoYXMgcG9pbnRlciBtb3ZlZCBmcm9tIHN0YXJ0IHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgeCA9IHRoaXMuZ2V0RGVsdGFYKCk7XG4gICAgdmFyIHkgPSB0aGlzLmdldERlbHRhWSgpO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGhhcyBwb2ludGVyIGJlZW4gZHJhZ2dlZC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhVGltZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFydFRpbWUgPyBEYXRlLm5vdygpIC0gdGhpcy5fc3RhcnRUaW1lIDogMDtcbiAgfTtcblxuICAvKipcbiAgICogQmluZCBkcmFnIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgKiAgIC0gJ3N0YXJ0JywgJ21vdmUnLCAnY2FuY2VsJyBvciAnZW5kJy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBkcmFnIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgKiAgIC0gJ3N0YXJ0JywgJ21vdmUnLCAnY2FuY2VsJyBvciAnZW5kJy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50cywgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9mZihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHVuYmluZCBhbGwgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcblxuICAgIC8vIFJlc2V0IGRhdGEgYW5kIGRlYWN0aXZhdGUgdGhlIGluc3RhbmNlLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAvLyBEZXN0cm95IGVtaXR0ZXIuXG4gICAgdGhpcy5fZW1pdHRlci5kZXN0cm95KCk7XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgaGFuZGxlcnMuXG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5zdGFydCwgdGhpcy5fcHJlU3RhcnRDaGVjaywgbGlzdGVuZXJPcHRpb25zKTtcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fbW91c2VFdmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCwgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcblxuICAgIC8vIFJlc2V0IHN0eWxlcy5cbiAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMuX2Nzc1Byb3BzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdGhpcy5fY3NzUHJvcHNbcHJvcF07XG4gICAgICBkZWxldGUgdGhpcy5fY3NzUHJvcHNbcHJvcF07XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgZGF0YS5cbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcblxuICAgIC8vIE1hcmsgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogQSB0aWNrZXIgc3lzdGVtIGZvciBoYW5kbGluZyBET00gcmVhZHMgYW5kIHdyaXRlcyBpbiBhbiBlZmZpY2llbnQgd2F5LlxuICAgKiBDb250YWlucyBhIHJlYWQgcXVldWUgYW5kIGEgd3JpdGUgcXVldWUgdGhhdCBhcmUgcHJvY2Vzc2VkIG9uIHRoZSBuZXh0XG4gICAqIGFuaW1hdGlvbiBmcmFtZSB3aGVuIG5lZWRlZC5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqL1xuICBmdW5jdGlvbiBUaWNrZXIoKSB7XG4gICAgdGhpcy5fbmV4dFN0ZXAgPSBudWxsO1xuXG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9yZWFkcyA9IHt9O1xuICAgIHRoaXMuX3dyaXRlcyA9IHt9O1xuXG4gICAgdGhpcy5fYmF0Y2ggPSBbXTtcbiAgICB0aGlzLl9iYXRjaFJlYWRzID0ge307XG4gICAgdGhpcy5fYmF0Y2hXcml0ZXMgPSB7fTtcblxuICAgIHRoaXMuX3N0ZXAgPSB0aGlzLl9zdGVwLmJpbmQodGhpcyk7XG4gIH1cblxuICBUaWNrZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGlkLCByZWFkT3BlcmF0aW9uLCB3cml0ZU9wZXJhdGlvbiwgaXNQcmlvcml0aXplZCkge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiBhbiBpdGVtIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBxdWV1ZXMgd2l0aCB0aGUgc2FtZSBpZFxuICAgIC8vIGFuZCBpZiBzbyAtPiByZW1vdmUgaXQuXG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMuX3F1ZXVlLmluZGV4T2YoaWQpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPiAtMSkgdGhpcy5fcXVldWVbY3VycmVudEluZGV4XSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEFkZCBlbnRyeS5cbiAgICBpc1ByaW9yaXRpemVkID8gdGhpcy5fcXVldWUudW5zaGlmdChpZCkgOiB0aGlzLl9xdWV1ZS5wdXNoKGlkKTtcbiAgICB0aGlzLl9yZWFkc1tpZF0gPSByZWFkT3BlcmF0aW9uO1xuICAgIHRoaXMuX3dyaXRlc1tpZF0gPSB3cml0ZU9wZXJhdGlvbjtcblxuICAgIC8vIEZpbmFsbHksIGxldCdzIGtpY2stc3RhcnQgdGhlIG5leHQgdGljayBpZiBpdCBpcyBub3QgcnVubmluZyB5ZXQuXG4gICAgaWYgKCF0aGlzLl9uZXh0U3RlcCkgdGhpcy5fbmV4dFN0ZXAgPSByYWYodGhpcy5fc3RlcCk7XG4gIH07XG5cbiAgVGlja2VyLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbihpZCkge1xuICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLl9xdWV1ZS5pbmRleE9mKGlkKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuX3F1ZXVlW2N1cnJlbnRJbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgICBkZWxldGUgdGhpcy5fcmVhZHNbaWRdO1xuICAgICAgZGVsZXRlIHRoaXMuX3dyaXRlc1tpZF07XG4gICAgfVxuICB9O1xuXG4gIFRpY2tlci5wcm90b3R5cGUuX3N0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgcmVhZHMgPSB0aGlzLl9yZWFkcztcbiAgICB2YXIgd3JpdGVzID0gdGhpcy5fd3JpdGVzO1xuICAgIHZhciBiYXRjaCA9IHRoaXMuX2JhdGNoO1xuICAgIHZhciBiYXRjaFJlYWRzID0gdGhpcy5fYmF0Y2hSZWFkcztcbiAgICB2YXIgYmF0Y2hXcml0ZXMgPSB0aGlzLl9iYXRjaFdyaXRlcztcbiAgICB2YXIgbGVuZ3RoID0gcXVldWUubGVuZ3RoO1xuICAgIHZhciBpZDtcbiAgICB2YXIgaTtcblxuICAgIC8vIFJlc2V0IHRpY2tlci5cbiAgICB0aGlzLl9uZXh0U3RlcCA9IG51bGw7XG5cbiAgICAvLyBTZXR1cCBxdWV1ZXMgYW5kIGNhbGxiYWNrIHBsYWNlaG9sZGVycy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlkID0gcXVldWVbaV07XG4gICAgICBpZiAoIWlkKSBjb250aW51ZTtcblxuICAgICAgYmF0Y2gucHVzaChpZCk7XG5cbiAgICAgIGJhdGNoUmVhZHNbaWRdID0gcmVhZHNbaWRdO1xuICAgICAgZGVsZXRlIHJlYWRzW2lkXTtcblxuICAgICAgYmF0Y2hXcml0ZXNbaWRdID0gd3JpdGVzW2lkXTtcbiAgICAgIGRlbGV0ZSB3cml0ZXNbaWRdO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHF1ZXVlLlxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcm9jZXNzIHJlYWQgY2FsbGJhY2tzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWQgPSBiYXRjaFtpXTtcbiAgICAgIGlmIChiYXRjaFJlYWRzW2lkXSkge1xuICAgICAgICBiYXRjaFJlYWRzW2lkXSgpO1xuICAgICAgICBkZWxldGUgYmF0Y2hSZWFkc1tpZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyB3cml0ZSBjYWxsYmFja3MuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZCA9IGJhdGNoW2ldO1xuICAgICAgaWYgKGJhdGNoV3JpdGVzW2lkXSkge1xuICAgICAgICBiYXRjaFdyaXRlc1tpZF0oKTtcbiAgICAgICAgZGVsZXRlIGJhdGNoV3JpdGVzW2lkXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXNldCBiYXRjaC5cbiAgICBiYXRjaC5sZW5ndGggPSAwO1xuXG4gICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIG5lZWRlZC5cbiAgICBpZiAoIXRoaXMuX25leHRTdGVwICYmIHF1ZXVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbmV4dFN0ZXAgPSByYWYodGhpcy5fc3RlcCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB0aWNrZXIgPSBuZXcgVGlja2VyKCk7XG5cbiAgdmFyIGxheW91dFRpY2sgPSAnbGF5b3V0JztcbiAgdmFyIHZpc2liaWxpdHlUaWNrID0gJ3Zpc2liaWxpdHknO1xuICB2YXIgbW92ZVRpY2sgPSAnbW92ZSc7XG4gIHZhciBzY3JvbGxUaWNrID0gJ3Njcm9sbCc7XG4gIHZhciBwbGFjZWhvbGRlclRpY2sgPSAncGxhY2Vob2xkZXInO1xuXG4gIGZ1bmN0aW9uIGFkZExheW91dFRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBsYXlvdXRUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsTGF5b3V0VGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBsYXlvdXRUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZpc2liaWxpdHlUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgdmlzaWJpbGl0eVRpY2ssIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxWaXNpYmlsaXR5VGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyB2aXNpYmlsaXR5VGljayk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRNb3ZlVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIG1vdmVUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2ssIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsTW92ZVRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgbW92ZVRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkU2Nyb2xsVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHNjcm9sbFRpY2ssIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaywgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxTY3JvbGxUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIHNjcm9sbFRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkUGxhY2Vob2xkZXJUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgcGxhY2Vob2xkZXJUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIHBsYWNlaG9sZGVyVGljayk7XG4gIH1cblxuICB2YXIgRWxQcm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTtcbiAgdmFyIG1hdGNoZXNGbiA9XG4gICAgRWxQcm90by5tYXRjaGVzIHx8XG4gICAgRWxQcm90by5tYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgRWxQcm90by5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fFxuICAgIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVsZW1lbnQgbWF0Y2hlcyBhIENTUyBzZWxlY3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gbWF0Y2hlc0ZuLmNhbGwoZWwsIHNlbGVjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgY2xhc3MgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWVsZW1lbnRNYXRjaGVzKGVsZW1lbnQsICcuJyArIGNsYXNzTmFtZSkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gJyAnICsgY2xhc3NOYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB0ZW1wQXJyYXkgPSBbXTtcbiAgdmFyIG51bWJlclR5cGUgPSAnbnVtYmVyJztcblxuICAvKipcbiAgICogSW5zZXJ0IGFuIGl0ZW0gb3IgYW4gYXJyYXkgb2YgaXRlbXMgdG8gYXJyYXkgdG8gYSBzcGVjaWZpZWQgaW5kZXguIE11dGF0ZXNcbiAgICogdGhlIGFycmF5LiBUaGUgaW5kZXggY2FuIGJlIG5lZ2F0aXZlIGluIHdoaWNoIGNhc2UgdGhlIGl0ZW1zIHdpbGwgYmUgYWRkZWRcbiAgICogdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7Kn0gaXRlbXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtpbmRleD0tMV1cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5zZXJ0KGFycmF5LCBpdGVtcywgaW5kZXgpIHtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHR5cGVvZiBpbmRleCA9PT0gbnVtYmVyVHlwZSA/IGluZGV4IDogLTE7XG4gICAgaWYgKHN0YXJ0SW5kZXggPCAwKSBzdGFydEluZGV4ID0gYXJyYXkubGVuZ3RoIC0gc3RhcnRJbmRleCArIDE7XG5cbiAgICBhcnJheS5zcGxpY2UuYXBwbHkoYXJyYXksIHRlbXBBcnJheS5jb25jYXQoc3RhcnRJbmRleCwgMCwgaXRlbXMpKTtcbiAgICB0ZW1wQXJyYXkubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYXJyYXkgaW5kZXguIEJhc2ljYWxseSB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCB0aGUgcHJvdmlkZWRcbiAgICogYXJyYXkgaW5kZXggaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHByb3ZpZGVkIGFycmF5IGFuZCBhbHNvIHRyYW5zZm9ybXNcbiAgICogbmVnYXRpdmUgaW5kZXggdG8gdGhlIG1hdGNoaW5nIHBvc2l0aXZlIGluZGV4LlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc01pZ3JhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgaW5kZXgsIGlzTWlncmF0aW9uKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICB2YXIgbWF4SW5kZXggPSBNYXRoLm1heCgwLCBpc01pZ3JhdGlvbiA/IGxlbmd0aCA6IGxlbmd0aCAtIDEpO1xuICAgIHJldHVybiBpbmRleCA+IG1heEluZGV4ID8gbWF4SW5kZXggOiBpbmRleCA8IDAgPyBNYXRoLm1heChtYXhJbmRleCArIGluZGV4ICsgMSwgMCkgOiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGFycmF5IGl0ZW0gdG8gYW5vdGhlciBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZyb21JbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgaXRlbSB0aGF0IHdpbGwgYmUgbW92ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0b0luZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIHdoZXJlIHRoZSBpdGVtIHNob3VsZCBiZSBtb3ZlZCB0by5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TW92ZShhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJheSBoYXMgdHdvIG9yIG1vcmUgaXRlbXMuXG4gICAgaWYgKGFycmF5Lmxlbmd0aCA8IDIpIHJldHVybjtcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgaW5kaWNlcy5cbiAgICB2YXIgZnJvbSA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGZyb21JbmRleCk7XG4gICAgdmFyIHRvID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgdG9JbmRleCk7XG5cbiAgICAvLyBBZGQgdGFyZ2V0IGl0ZW0gdG8gdGhlIG5ldyBwb3NpdGlvbi5cbiAgICBpZiAoZnJvbSAhPT0gdG8pIHtcbiAgICAgIGFycmF5LnNwbGljZSh0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCBhcnJheSBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIG9mIHRoZSBpdGVtIHRoYXQgd2lsbCBiZSBzd2FwcGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gd2l0aEluZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIG9mIHRoZSBvdGhlciBpdGVtIHRoYXQgd2lsbCBiZSBzd2FwcGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTd2FwKGFycmF5LCBpbmRleCwgd2l0aEluZGV4KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJheSBoYXMgdHdvIG9yIG1vcmUgaXRlbXMuXG4gICAgaWYgKGFycmF5Lmxlbmd0aCA8IDIpIHJldHVybjtcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgaW5kaWNlcy5cbiAgICB2YXIgaW5kZXhBID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgaW5kZXgpO1xuICAgIHZhciBpbmRleEIgPSBub3JtYWxpemVBcnJheUluZGV4KGFycmF5LCB3aXRoSW5kZXgpO1xuICAgIHZhciB0ZW1wO1xuXG4gICAgLy8gU3dhcCB0aGUgaXRlbXMuXG4gICAgaWYgKGluZGV4QSAhPT0gaW5kZXhCKSB7XG4gICAgICB0ZW1wID0gYXJyYXlbaW5kZXhBXTtcbiAgICAgIGFycmF5W2luZGV4QV0gPSBhcnJheVtpbmRleEJdO1xuICAgICAgYXJyYXlbaW5kZXhCXSA9IHRlbXA7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFjdGlvbkNhbmNlbCA9ICdjYW5jZWwnO1xuICB2YXIgYWN0aW9uRmluaXNoID0gJ2ZpbmlzaCc7XG4gIHZhciBkZWJvdW5jZVRpY2sgPSAnZGVib3VuY2UnO1xuICB2YXIgZGVib3VuY2VJZCA9IDA7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3RcbiAgICogYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvclxuICAgKiBOIG1pbGxpc2Vjb25kcy4gVGhlIHJldHVybmVkIGZ1bmN0aW9uIGFjY2VwdHMgb25lIGFyZ3VtZW50IHdoaWNoLCB3aGVuXG4gICAqIGJlaW5nIFwiZmluaXNoXCIsIGNhbGxzIHRoZSBkZWJvdW5jZSBmdW5jdGlvbiBpbW1lZGlhdGVseSBpZiBpdCBpcyBjdXJyZW50bHlcbiAgICogd2FpdGluZyB0byBiZSBjYWxsZWQsIGFuZCB3aGVuIGJlaW5nIFwiY2FuY2VsXCIgY2FuY2VscyB0aGUgY3VycmVudGx5IHF1ZXVlZFxuICAgKiBmdW5jdGlvbiBjYWxsLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge051bWJlcn0gd2FpdFxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgd2FpdCkge1xuICAgIHZhciB0aW1lb3V0O1xuICAgIHZhciB0aWNrZXJJZCA9ICsrZGVib3VuY2VJZCArIGRlYm91bmNlVGljaztcblxuICAgIGlmICh3YWl0ID4gMCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZW91dCA9IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgdGlja2VyLmNhbmNlbCh0aWNrZXJJZCk7XG4gICAgICAgICAgaWYgKGFjdGlvbiA9PT0gYWN0aW9uRmluaXNoKSBmbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGlvbiAhPT0gYWN0aW9uQ2FuY2VsICYmIGFjdGlvbiAhPT0gYWN0aW9uRmluaXNoKSB7XG4gICAgICAgICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRpY2tlci5hZGQodGlja2VySWQsIGZuLCBudWxsLCB0cnVlKTtcbiAgICAgICAgICB9LCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oYWN0aW9uKSB7XG4gICAgICBpZiAoYWN0aW9uICE9PSBhY3Rpb25DYW5jZWwpIGZuKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgZWxlbWVudCBpcyB0cmFuc2Zvcm1lZCwgZmFsc2UgaWYgbm90LiBJbiBwcmFjdGljZSB0aGVcbiAgICogZWxlbWVudCdzIGRpc3BsYXkgdmFsdWUgbXVzdCBiZSBhbnl0aGluZyBlbHNlIHRoYW4gXCJub25lXCIgb3IgXCJpbmxpbmVcIiBhc1xuICAgKiB3ZWxsIGFzIGhhdmUgYSB2YWxpZCB0cmFuc2Zvcm0gdmFsdWUgYXBwbGllZCBpbiBvcmRlciB0byBiZSBjb3VudGVkIGFzIGFcbiAgICogdHJhbnNmb3JtZWQgZWxlbWVudC5cbiAgICpcbiAgICogQm9ycm93ZWQgZnJvbSBNZXpyICh2MC42LjEpOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzcmFtby9tZXpyL2Jsb2IvMC42LjEvbWV6ci5qcyNMNjYxXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1RyYW5zZm9ybWVkKGVsZW1lbnQpIHtcbiAgICB2YXIgdHJhbnNmb3JtID0gZ2V0U3R5bGUoZWxlbWVudCwgJ3RyYW5zZm9ybScpO1xuICAgIGlmICghdHJhbnNmb3JtIHx8IHRyYW5zZm9ybSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgZGlzcGxheSA9IGdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5Jyk7XG4gICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnIHx8IGRpc3BsYXkgPT09ICdub25lJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhYnNvbHV0ZSBwb3NpdGlvbmVkIGVsZW1lbnQncyBjb250YWluaW5nIGJsb2NrLCB3aGljaCBpc1xuICAgKiBjb25zaWRlcmVkIHRvIGJlIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgdGhhdCB0aGUgdGFyZ2V0IGVsZW1lbnQnc1xuICAgKiBwb3NpdGlvbmluZyBpcyByZWxhdGl2ZSB0by4gRGlzY2xhaW1lcjogdGhpcyBvbmx5IHdvcmtzIGFzIGludGVuZGVkIGZvclxuICAgKiBhYnNvbHV0ZSBwb3NpdGlvbmVkIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luY2x1ZGVTZWxmPWZhbHNlXVxuICAgKiAgIC0gV2hlbiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZSBjb250YWluaW5nIGJsb2NrIGNoZWNraW5nIGlzIHN0YXJ0ZWQgZnJvbVxuICAgKiAgICAgdGhlIHByb3ZpZGVkIGVsZW1lbnQuIE90aGVyd2lzZSB0aGUgY2hlY2tpbmcgaXMgc3RhcnRlZCBmcm9tIHRoZVxuICAgKiAgICAgcHJvdmlkZWQgZWxlbWVudCdzIHBhcmVudCBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7KERvY3VtZW50fEVsZW1lbnQpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQsIGluY2x1ZGVTZWxmKSB7XG4gICAgLy8gQXMgbG9uZyBhcyB0aGUgY29udGFpbmluZyBibG9jayBpcyBhbiBlbGVtZW50LCBzdGF0aWMgYW5kIG5vdFxuICAgIC8vIHRyYW5zZm9ybWVkLCB0cnkgdG8gZ2V0IHRoZSBlbGVtZW50J3MgcGFyZW50IGVsZW1lbnQgYW5kIGZhbGxiYWNrIHRvXG4gICAgLy8gZG9jdW1lbnQuIGh0dHBzOi8vZ2l0aHViLmNvbS9uaWtsYXNyYW1vL21lenIvYmxvYi8wLjYuMS9tZXpyLmpzI0wzMzlcbiAgICB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIHJldCA9IChpbmNsdWRlU2VsZiA/IGVsZW1lbnQgOiBlbGVtZW50LnBhcmVudEVsZW1lbnQpIHx8IGRvY3VtZW50O1xuICAgIHdoaWxlIChyZXQgJiYgcmV0ICE9PSBkb2N1bWVudCAmJiBnZXRTdHlsZShyZXQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJyAmJiAhaXNUcmFuc2Zvcm1lZChyZXQpKSB7XG4gICAgICByZXQgPSByZXQucGFyZW50RWxlbWVudCB8fCBkb2N1bWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhbiBlbGVtZW50J3Mgc3R5bGUgcHJvcGVydHkgdHJhbnNmb3JtZWQgaW50b1xuICAgKiBhIGZsb2F0IHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0eWxlQXNGbG9hdChlbCwgc3R5bGUpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChnZXRTdHlsZShlbCwgc3R5bGUpKSB8fCAwO1xuICB9XG5cbiAgdmFyIG9mZnNldEEgPSB7fTtcbiAgdmFyIG9mZnNldEIgPSB7fTtcbiAgdmFyIG9mZnNldERpZmYgPSB7fTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZWxlbWVudCdzIGRvY3VtZW50IG9mZnNldCwgd2hpY2ggaW4gcHJhY3RpY2UgbWVhbnMgdGhlIHZlcnRpY2FsXG4gICAqIGFuZCBob3Jpem9udGFsIGRpc3RhbmNlIGJldHdlZW4gdGhlIGVsZW1lbnQncyBub3J0aHdlc3QgY29ybmVyIGFuZCB0aGVcbiAgICogZG9jdW1lbnQncyBub3J0aHdlc3QgY29ybmVyLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyB0aGUgc2FtZVxuICAgKiBvYmplY3Qgc28gYmUgc3VyZSB0byByZWFkIHRoZSBkYXRhIGZyb20gaXQgaW5zdGVhZCB1c2luZyBpdCBhcyBhIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHsoRG9jdW1lbnR8RWxlbWVudHxXaW5kb3cpfSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2Zmc2V0RGF0YV1cbiAgICogICAtIE9wdGlvbmFsIGRhdGEgb2JqZWN0IHdoZXJlIHRoZSBvZmZzZXQgZGF0YSB3aWxsIGJlIGluc2VydGVkIHRvLiBJZiBub3RcbiAgICogICAgIHByb3ZpZGVkIGEgbmV3IG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSByZXR1cm4gZGF0YS5cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldE9mZnNldChlbGVtZW50LCBvZmZzZXREYXRhKSB7XG4gICAgdmFyIHJldCA9IG9mZnNldERhdGEgfHwge307XG4gICAgdmFyIHJlY3Q7XG5cbiAgICAvLyBTZXQgdXAgcmV0dXJuIGRhdGEuXG4gICAgcmV0LmxlZnQgPSAwO1xuICAgIHJldC50b3AgPSAwO1xuXG4gICAgLy8gRG9jdW1lbnQncyBvZmZzZXRzIGFyZSBhbHdheXMgMC5cbiAgICBpZiAoZWxlbWVudCA9PT0gZG9jdW1lbnQpIHJldHVybiByZXQ7XG5cbiAgICAvLyBBZGQgdmlld3BvcnQgc2Nyb2xsIGxlZnQvdG9wIHRvIHRoZSByZXNwZWN0aXZlIG9mZnNldHMuXG4gICAgcmV0LmxlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgMDtcbiAgICByZXQudG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IDA7XG5cbiAgICAvLyBXaW5kb3cncyBvZmZzZXRzIGFyZSB0aGUgdmlld3BvcnQgc2Nyb2xsIGxlZnQvdG9wIHZhbHVlcy5cbiAgICBpZiAoZWxlbWVudC5zZWxmID09PSB3aW5kb3cuc2VsZikgcmV0dXJuIHJldDtcblxuICAgIC8vIEFkZCBlbGVtZW50J3MgY2xpZW50IHJlY3RzIHRvIHRoZSBvZmZzZXRzLlxuICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldC5sZWZ0ICs9IHJlY3QubGVmdDtcbiAgICByZXQudG9wICs9IHJlY3QudG9wO1xuXG4gICAgLy8gRXhjbHVkZSBlbGVtZW50J3MgYm9yZGVycyBmcm9tIHRoZSBvZmZzZXQuXG4gICAgcmV0LmxlZnQgKz0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItbGVmdC13aWR0aCcpO1xuICAgIHJldC50b3AgKz0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItdG9wLXdpZHRoJyk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IGRpZmZlcmVuY2UgdHdvIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtQVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtQlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wYXJlQ29udGFpbmluZ0Jsb2Nrcz1mYWxzZV1cbiAgICogICAtIFdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSB0aGUgY29udGFpbmluZyBibG9ja3Mgb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnRzXG4gICAqICAgICB3aWxsIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlLiBPdGhlcndpc2UgdGhlIHByb3ZpZGVkXG4gICAqICAgICBlbGVtZW50cyB3aWxsIGJlIGNvbXBhcmVkIGRpcmVjdGx5LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0T2Zmc2V0RGlmZihlbGVtQSwgZWxlbUIsIGNvbXBhcmVDb250YWluaW5nQmxvY2tzKSB7XG4gICAgb2Zmc2V0RGlmZi5sZWZ0ID0gMDtcbiAgICBvZmZzZXREaWZmLnRvcCA9IDA7XG5cbiAgICAvLyBJZiBlbGVtZW50cyBhcmUgc2FtZSBsZXQncyByZXR1cm4gZWFybHkuXG4gICAgaWYgKGVsZW1BID09PSBlbGVtQikgcmV0dXJuIG9mZnNldERpZmY7XG5cbiAgICAvLyBDb21wYXJlIGNvbnRhaW5pbmcgYmxvY2tzIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoY29tcGFyZUNvbnRhaW5pbmdCbG9ja3MpIHtcbiAgICAgIGVsZW1BID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1BLCB0cnVlKTtcbiAgICAgIGVsZW1CID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1CLCB0cnVlKTtcblxuICAgICAgLy8gSWYgY29udGFpbmluZyBibG9ja3MgYXJlIGlkZW50aWNhbCwgbGV0J3MgcmV0dXJuIGVhcmx5LlxuICAgICAgaWYgKGVsZW1BID09PSBlbGVtQikgcmV0dXJuIG9mZnNldERpZmY7XG4gICAgfVxuXG4gICAgLy8gRmluYWxseSwgbGV0J3MgY2FsY3VsYXRlIHRoZSBvZmZzZXQgZGlmZi5cbiAgICBnZXRPZmZzZXQoZWxlbUEsIG9mZnNldEEpO1xuICAgIGdldE9mZnNldChlbGVtQiwgb2Zmc2V0Qik7XG4gICAgb2Zmc2V0RGlmZi5sZWZ0ID0gb2Zmc2V0Qi5sZWZ0IC0gb2Zmc2V0QS5sZWZ0O1xuICAgIG9mZnNldERpZmYudG9wID0gb2Zmc2V0Qi50b3AgLSBvZmZzZXRBLnRvcDtcblxuICAgIHJldHVybiBvZmZzZXREaWZmO1xuICB9XG5cbiAgdmFyIHN0eWxlT3ZlcmZsb3cgPSAnb3ZlcmZsb3cnO1xuICB2YXIgc3R5bGVPdmVyZmxvd1ggPSAnb3ZlcmZsb3cteCc7XG4gIHZhciBzdHlsZU92ZXJmbG93WSA9ICdvdmVyZmxvdy15JztcbiAgdmFyIG92ZXJmbG93QXV0byA9ICdhdXRvJztcbiAgdmFyIG92ZXJmbG93U2Nyb2xsID0gJ3Njcm9sbCc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsYWJsZShlbGVtZW50KSB7XG4gICAgdmFyIG92ZXJmbG93ID0gZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVPdmVyZmxvdyk7XG4gICAgaWYgKG92ZXJmbG93ID09PSBvdmVyZmxvd0F1dG8gfHwgb3ZlcmZsb3cgPT09IG92ZXJmbG93U2Nyb2xsKSByZXR1cm4gdHJ1ZTtcblxuICAgIG92ZXJmbG93ID0gZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVPdmVyZmxvd1gpO1xuICAgIGlmIChvdmVyZmxvdyA9PT0gb3ZlcmZsb3dBdXRvIHx8IG92ZXJmbG93ID09PSBvdmVyZmxvd1Njcm9sbCkgcmV0dXJuIHRydWU7XG5cbiAgICBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3dZKTtcbiAgICBpZiAob3ZlcmZsb3cgPT09IG92ZXJmbG93QXV0byB8fCBvdmVyZmxvdyA9PT0gb3ZlcmZsb3dTY3JvbGwpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgZWxlbWVudCdzIGFuY2VzdG9ycyB0aGF0IGFyZSBwb3RlbnRpYWxseSBzY3JvbGxhYmxlIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luY2x1ZGVTZWxmPWZhbHNlXVxuICAgKiBAcGFyYW0ge0FycmF5fSBbZGF0YV1cbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U2Nyb2xsYWJsZUFuY2VzdG9ycyhlbGVtZW50LCBpbmNsdWRlU2VsZiwgZGF0YSkge1xuICAgIHZhciByZXQgPSBkYXRhIHx8IFtdO1xuICAgIHZhciBwYXJlbnQgPSBpbmNsdWRlU2VsZiA/IGVsZW1lbnQgOiBlbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICAvLyBGaW5kIHNjcm9sbCBwYXJlbnRzLlxuICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgLy8gSWYgZWxlbWVudCBpcyBpbnNpZGUgU2hhZG93RE9NIGxldCdzIGdldCBpdCdzIGhvc3Qgbm9kZSBmcm9tIHRoZSByZWFsXG4gICAgICAvLyBET00gYW5kIGNvbnRpbnVlIGxvb3BpbmcuXG4gICAgICBpZiAocGFyZW50LmdldFJvb3ROb2RlICYmIHBhcmVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFJvb3ROb2RlKCkuaG9zdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZSBsZXQncyBhZGQgaXQgdG8gdGhlIHNjcm9sbGFibGUgbGlzdC5cbiAgICAgIGlmIChpc1Njcm9sbGFibGUocGFyZW50KSkge1xuICAgICAgICByZXQucHVzaChwYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICAvLyBBbHdheXMgYWRkIHdpbmRvdyB0byB0aGUgcmVzdWx0cy5cbiAgICByZXQucHVzaCh3aW5kb3cpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHZhciB0cmFuc2xhdGVWYWx1ZSA9IHt9O1xuICB2YXIgdHJhbnNmb3JtU3R5bGUkMiA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgdHJhbnNmb3JtTm9uZSA9ICdub25lJztcbiAgdmFyIHJ4TWF0M2QgPSAvXm1hdHJpeDNkLztcbiAgdmFyIHJ4TWF0VHggPSAvKFteLF0qLCl7NH0vO1xuICB2YXIgcnhNYXQzZFR4ID0gLyhbXixdKiwpezEyfS87XG4gIHZhciByeE5leHRJdGVtID0gL1teLF0qLC87XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQncyBjb21wdXRlZCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHZhbHVlcyBhcyBhIGZsb2F0cy5cbiAgICogVGhlIHJldHVybmVkIG9iamVjdCBpcyBhbHdheXMgdGhlIHNhbWUgb2JqZWN0IGFuZCB1cGRhdGVkIGV2ZXJ5IHRpbWUgdGhpc1xuICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyYW5zbGF0ZShlbGVtZW50KSB7XG4gICAgdHJhbnNsYXRlVmFsdWUueCA9IDA7XG4gICAgdHJhbnNsYXRlVmFsdWUueSA9IDA7XG5cbiAgICB2YXIgdHJhbnNmb3JtID0gZ2V0U3R5bGUoZWxlbWVudCwgdHJhbnNmb3JtU3R5bGUkMik7XG4gICAgaWYgKCF0cmFuc2Zvcm0gfHwgdHJhbnNmb3JtID09PSB0cmFuc2Zvcm1Ob25lKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIHN0eWxlIGNhbiBiZSBpbiBlaXRoZXIgbWF0cml4M2QoLi4uKSBvciBtYXRyaXgoLi4uKS5cbiAgICB2YXIgaXNNYXQzZCA9IHJ4TWF0M2QudGVzdCh0cmFuc2Zvcm0pO1xuICAgIHZhciB0WCA9IHRyYW5zZm9ybS5yZXBsYWNlKGlzTWF0M2QgPyByeE1hdDNkVHggOiByeE1hdFR4LCAnJyk7XG4gICAgdmFyIHRZID0gdFgucmVwbGFjZShyeE5leHRJdGVtLCAnJyk7XG5cbiAgICB0cmFuc2xhdGVWYWx1ZS54ID0gcGFyc2VGbG9hdCh0WCkgfHwgMDtcbiAgICB0cmFuc2xhdGVWYWx1ZS55ID0gcGFyc2VGbG9hdCh0WSkgfHwgMDtcblxuICAgIHJldHVybiB0cmFuc2xhdGVWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZSBpbnRvIENTUyB0cmFuc2Zvcm0gc3R5bGVcbiAgICogcHJvcGVydHkncyB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyYW5zbGF0ZVN0cmluZyh4LCB5KSB7XG4gICAgcmV0dXJuICd0cmFuc2xhdGVYKCcgKyB4ICsgJ3B4KSB0cmFuc2xhdGVZKCcgKyB5ICsgJ3B4KSc7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGNsYXNzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudE1hdGNoZXMoZWxlbWVudCwgJy4nICsgY2xhc3NOYW1lKSkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9ICgnICcgKyBlbGVtZW50LmNsYXNzTmFtZSArICcgJylcbiAgICAgICAgICAucmVwbGFjZSgnICcgKyBjbGFzc05hbWUgKyAnICcsICcgJylcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIERyYWcgc3RhcnQgcHJlZGljYXRlIHN0YXRlcy5cbiAgdmFyIHN0YXJ0UHJlZGljYXRlSW5hY3RpdmUgPSAwO1xuICB2YXIgc3RhcnRQcmVkaWNhdGVQZW5kaW5nID0gMTtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQgPSAyO1xuICB2YXIgc3RhcnRQcmVkaWNhdGVSZWplY3RlZCA9IDM7XG5cbiAgLyoqXG4gICAqIEJpbmQgdG91Y2ggaW50ZXJhY3Rpb24gdG8gYW4gaXRlbS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbURyYWcoaXRlbSkge1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5fZ3JpZElkID0gZ3JpZC5faWQ7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGZhbHNlO1xuXG4gICAgLy8gU3RhcnQgcHJlZGljYXRlIGRhdGEuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGUgPSBpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZSlcbiAgICAgID8gc2V0dGluZ3MuZHJhZ1N0YXJ0UHJlZGljYXRlXG4gICAgICA6IEl0ZW1EcmFnLmRlZmF1bHRTdGFydFByZWRpY2F0ZTtcbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVJbmFjdGl2ZTtcbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIERhdGEgZm9yIGRyYWcgc29ydCBwcmVkaWNhdGUgaGV1cmlzdGljcy5cbiAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLl9oWDEgPSAwO1xuICAgIHRoaXMuX2hYMiA9IDA7XG4gICAgdGhpcy5faFkxID0gMDtcbiAgICB0aGlzLl9oWTIgPSAwO1xuXG4gICAgLy8gU2V0dXAgaXRlbSdzIGluaXRpYWwgZHJhZyBkYXRhLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAvLyBCaW5kIHRoZSBtZXRob2RzIHRoYXQgbmVlZHMgYmluZGluZy5cbiAgICB0aGlzLl9wcmVTdGFydENoZWNrID0gdGhpcy5fcHJlU3RhcnRDaGVjay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZUVuZENoZWNrID0gdGhpcy5fcHJlRW5kQ2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblNjcm9sbCA9IHRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fcHJlcGFyZU1vdmUgPSB0aGlzLl9wcmVwYXJlTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2FwcGx5TW92ZSA9IHRoaXMuX2FwcGx5TW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZXBhcmVTY3JvbGwgPSB0aGlzLl9wcmVwYXJlU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fYXBwbHlTY3JvbGwgPSB0aGlzLl9hcHBseVNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NoZWNrT3ZlcmxhcCA9IHRoaXMuX2NoZWNrT3ZlcmxhcC5iaW5kKHRoaXMpO1xuXG4gICAgLy8gQ3JlYXRlIGRlYm91bmNlIG92ZXJsYXAgY2hlY2tlciBmdW5jdGlvbi5cbiAgICB2YXIgc29ydEludGVydmFsID0gc2V0dGluZ3MuZHJhZ1NvcnRIZXVyaXN0aWNzLnNvcnRJbnRlcnZhbDtcbiAgICB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSA9IGRlYm91bmNlKHRoaXMuX2NoZWNrT3ZlcmxhcCwgc29ydEludGVydmFsKTtcblxuICAgIC8vIEluaXQgZHJhZ2dlci5cbiAgICB0aGlzLl9kcmFnZ2VyID0gbmV3IERyYWdnZXIoZWxlbWVudCwgc2V0dGluZ3MuZHJhZ0Nzc1Byb3BzKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdzdGFydCcsIHRoaXMuX3ByZVN0YXJ0Q2hlY2spO1xuICAgIHRoaXMuX2RyYWdnZXIub24oJ21vdmUnLCB0aGlzLl9wcmVTdGFydENoZWNrKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdjYW5jZWwnLCB0aGlzLl9wcmVFbmRDaGVjayk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignZW5kJywgdGhpcy5fcHJlRW5kQ2hlY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBzdGF0aWMgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgZHJhZyBzdGFydCBwcmVkaWNhdGUgaGFuZGxlciB0aGF0IGhhbmRsZXMgYW5jaG9yIGVsZW1lbnRzXG4gICAqIGdyYWNlZnVsbHkuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBkZWZpbmVzIGlmIHRoZSBkcmFnIGlzXG4gICAqIHN0YXJ0ZWQsIHJlamVjdGVkIG9yIHBlbmRpbmcuIFdoZW4gdHJ1ZSBpcyByZXR1cm5lZCB0aGUgZHJhZ2dpbmcgaXMgc3RhcnRlZFxuICAgKiBhbmQgd2hlbiBmYWxzZSBpcyByZXR1cm5lZCB0aGUgZHJhZ2dpbmcgaXMgcmVqZWN0ZWQuIElmIG5vdGhpbmcgaXMgcmV0dXJuZWRcbiAgICogdGhlIHByZWRpY2F0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBvbiB0aGUgbmV4dCBkcmFnIG1vdmVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAtIEFuIG9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBhc3MgdGhlIHByZWRpY2F0ZVxuICAgKiAgICAgaXQncyBvcHRpb25zIG1hbnVhbGx5LiBCeSBkZWZhdWx0IHRoZSBwcmVkaWNhdGUgcmV0cmlldmVzIHRoZSBvcHRpb25zXG4gICAqICAgICBmcm9tIHRoZSBncmlkJ3Mgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcuZGVmYXVsdFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oaXRlbSwgZXZlbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgZHJhZyA9IGl0ZW0uX2RyYWc7XG4gICAgdmFyIHByZWRpY2F0ZSA9IGRyYWcuX3N0YXJ0UHJlZGljYXRlRGF0YSB8fCBkcmFnLl9zZXR1cFN0YXJ0UHJlZGljYXRlKG9wdGlvbnMpO1xuXG4gICAgLy8gRmluYWwgZXZlbnQgbG9naWMuIEF0IHRoaXMgc3RhZ2UgcmV0dXJuIHZhbHVlIGRvZXMgbm90IG1hdHRlciBhbnltb3JlLFxuICAgIC8vIHRoZSBwcmVkaWNhdGUgaXMgZWl0aGVyIHJlc29sdmVkIG9yIGl0J3Mgbm90IGFuZCB0aGVyZSdzIG5vdGhpbmcgdG8gZG9cbiAgICAvLyBhYm91dCBpdC4gSGVyZSB3ZSBqdXN0IHJlc2V0IGRhdGEgYW5kIGlmIHRoZSBpdGVtIGVsZW1lbnQgaXMgYSBsaW5rXG4gICAgLy8gd2UgZm9sbG93IGl0IChpZiB0aGVyZSBoYXMgb25seSBiZWVuIHNsaWdodCBtb3ZlbWVudCkuXG4gICAgaWYgKGV2ZW50LmlzRmluYWwpIHtcbiAgICAgIGRyYWcuX2ZpbmlzaFN0YXJ0UHJlZGljYXRlKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGFuZCBzdG9yZSB0aGUgaGFuZGxlIGVsZW1lbnQgc28gd2UgY2FuIGNoZWNrIGxhdGVyIG9uIGlmIHRoZVxuICAgIC8vIGN1cnNvciBpcyB3aXRoaW4gdGhlIGhhbmRsZS4gSWYgd2UgaGF2ZSBhIGhhbmRsZSBzZWxlY3RvciBsZXQncyBmaW5kXG4gICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudC4gT3RoZXJ3aXNlIGxldCdzIHVzZSB0aGUgaXRlbSBlbGVtZW50IGFzIHRoZVxuICAgIC8vIGhhbmRsZS5cbiAgICBpZiAoIXByZWRpY2F0ZS5oYW5kbGVFbGVtZW50KSB7XG4gICAgICBwcmVkaWNhdGUuaGFuZGxlRWxlbWVudCA9IGRyYWcuX2dldFN0YXJ0UHJlZGljYXRlSGFuZGxlKGV2ZW50KTtcbiAgICAgIGlmICghcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiBkZWxheSBpcyBkZWZpbmVkIGxldCdzIGtlZXAgdHJhY2sgb2YgdGhlIGxhdGVzdCBldmVudCBhbmQgaW5pdGlhdGVcbiAgICAvLyBkZWxheSBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSB5ZXQuXG4gICAgaWYgKHByZWRpY2F0ZS5kZWxheSkge1xuICAgICAgcHJlZGljYXRlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICBpZiAoIXByZWRpY2F0ZS5kZWxheVRpbWVyKSB7XG4gICAgICAgIHByZWRpY2F0ZS5kZWxheVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcHJlZGljYXRlLmRlbGF5ID0gMDtcbiAgICAgICAgICBpZiAoZHJhZy5fcmVzb2x2ZVN0YXJ0UHJlZGljYXRlKHByZWRpY2F0ZS5ldmVudCkpIHtcbiAgICAgICAgICAgIGRyYWcuX2ZvcmNlUmVzb2x2ZVN0YXJ0UHJlZGljYXRlKHByZWRpY2F0ZS5ldmVudCk7XG4gICAgICAgICAgICBkcmFnLl9yZXNldFN0YXJ0UHJlZGljYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBwcmVkaWNhdGUuZGVsYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkcmFnLl9yZXNvbHZlU3RhcnRQcmVkaWNhdGUoZXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRyYWcgc29ydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aHJlc2hvbGQ9NTBdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hY3Rpb249J21vdmUnXVxuICAgKiBAcmV0dXJucyB7KEJvb2xlYW58RHJhZ1NvcnRDb21tYW5kKX1cbiAgICogICAtIFJldHVybnMgZmFsc2UgaWYgbm8gdmFsaWQgaW5kZXggd2FzIGZvdW5kLiBPdGhlcndpc2UgcmV0dXJucyBkcmFnIHNvcnRcbiAgICogICAgIGNvbW1hbmQuXG4gICAqL1xuICBJdGVtRHJhZy5kZWZhdWx0U29ydFByZWRpY2F0ZSA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbVJlY3QgPSB7fTtcbiAgICB2YXIgdGFyZ2V0UmVjdCA9IHt9O1xuICAgIHZhciByZXR1cm5EYXRhID0ge307XG4gICAgdmFyIHJvb3RHcmlkQXJyYXkgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGdldFRhcmdldEdyaWQoaXRlbSwgcm9vdEdyaWQsIHRocmVzaG9sZCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGw7XG4gICAgICB2YXIgZHJhZ1NvcnQgPSByb290R3JpZC5fc2V0dGluZ3MuZHJhZ1NvcnQ7XG4gICAgICB2YXIgYmVzdFNjb3JlID0gLTE7XG4gICAgICB2YXIgZ3JpZFNjb3JlO1xuICAgICAgdmFyIGdyaWRzO1xuICAgICAgdmFyIGdyaWQ7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gR2V0IHBvdGVudGlhbCB0YXJnZXQgZ3JpZHMuXG4gICAgICBpZiAoZHJhZ1NvcnQgPT09IHRydWUpIHtcbiAgICAgICAgcm9vdEdyaWRBcnJheVswXSA9IHJvb3RHcmlkO1xuICAgICAgICBncmlkcyA9IHJvb3RHcmlkQXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmlkcyA9IGRyYWdTb3J0LmNhbGwocm9vdEdyaWQsIGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlcmUgYXJlIG5vIGdyaWRzLlxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdyaWRzKSkgcmV0dXJuIHRhcmdldDtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBncmlkcyBhbmQgZ2V0IHRoZSBiZXN0IG1hdGNoLlxuICAgICAgZm9yIChpID0gMDsgaSA8IGdyaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGdyaWQgPSBncmlkc1tpXTtcblxuICAgICAgICAvLyBGaWx0ZXIgb3V0IGFsbCBkZXN0cm95ZWQgZ3JpZHMuXG4gICAgICAgIGlmIChncmlkLl9pc0Rlc3Ryb3llZCkgY29udGludWU7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIGdyaWQncyBvZmZzZXRzIGFuZCBkaW1lbnNpb25zIHNpbmNlIHRoZXkgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBjaGFuZ2VkIChlLmcgZHVyaW5nIHNjcm9sbGluZykuXG4gICAgICAgIGdyaWQuX3VwZGF0ZUJvdW5kaW5nUmVjdCgpO1xuXG4gICAgICAgIC8vIENoZWNrIGhvdyBtdWNoIGRyYWdnZWQgZWxlbWVudCBvdmVybGFwcyB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgICAgIHRhcmdldFJlY3Qud2lkdGggPSBncmlkLl93aWR0aDtcbiAgICAgICAgdGFyZ2V0UmVjdC5oZWlnaHQgPSBncmlkLl9oZWlnaHQ7XG4gICAgICAgIHRhcmdldFJlY3QubGVmdCA9IGdyaWQuX2xlZnQ7XG4gICAgICAgIHRhcmdldFJlY3QudG9wID0gZ3JpZC5fdG9wO1xuICAgICAgICBncmlkU2NvcmUgPSBnZXRSZWN0T3ZlcmxhcFNjb3JlKGl0ZW1SZWN0LCB0YXJnZXRSZWN0KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGdyaWQgaXMgdGhlIGJlc3QgbWF0Y2ggc28gZmFyLlxuICAgICAgICBpZiAoZ3JpZFNjb3JlID4gdGhyZXNob2xkICYmIGdyaWRTY29yZSA+IGJlc3RTY29yZSkge1xuICAgICAgICAgIGJlc3RTY29yZSA9IGdyaWRTY29yZTtcbiAgICAgICAgICB0YXJnZXQgPSBncmlkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFsd2F5cyByZXNldCByb290IGdyaWQgYXJyYXkuXG4gICAgICByb290R3JpZEFycmF5Lmxlbmd0aCA9IDA7XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0sIG9wdGlvbnMpIHtcbiAgICAgIHZhciBkcmFnID0gaXRlbS5fZHJhZztcbiAgICAgIHZhciByb290R3JpZCA9IGRyYWcuX2dldEdyaWQoKTtcblxuICAgICAgLy8gR2V0IGRyYWcgc29ydCBwcmVkaWNhdGUgc2V0dGluZ3MuXG4gICAgICB2YXIgc29ydFRocmVzaG9sZCA9IG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMudGhyZXNob2xkID09PSAnbnVtYmVyJyA/IG9wdGlvbnMudGhyZXNob2xkIDogNTA7XG4gICAgICB2YXIgc29ydEFjdGlvbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hY3Rpb24gPT09IGFjdGlvblN3YXAgPyBhY3Rpb25Td2FwIDogYWN0aW9uTW92ZTtcblxuICAgICAgLy8gUG9wdWxhdGUgaXRlbSByZWN0IGRhdGEuXG4gICAgICBpdGVtUmVjdC53aWR0aCA9IGl0ZW0uX3dpZHRoO1xuICAgICAgaXRlbVJlY3QuaGVpZ2h0ID0gaXRlbS5faGVpZ2h0O1xuICAgICAgaXRlbVJlY3QubGVmdCA9IGRyYWcuX2VsZW1lbnRDbGllbnRYO1xuICAgICAgaXRlbVJlY3QudG9wID0gZHJhZy5fZWxlbWVudENsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdGFyZ2V0IGdyaWQuXG4gICAgICB2YXIgZ3JpZCA9IGdldFRhcmdldEdyaWQoaXRlbSwgcm9vdEdyaWQsIHNvcnRUaHJlc2hvbGQpO1xuXG4gICAgICAvLyBSZXR1cm4gZWFybHkgaWYgd2UgZm91bmQgbm8gZ3JpZCBjb250YWluZXIgZWxlbWVudCB0aGF0IG92ZXJsYXBzIHRoZVxuICAgICAgLy8gZHJhZ2dlZCBpdGVtIGVub3VnaC5cbiAgICAgIGlmICghZ3JpZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB2YXIgZ3JpZE9mZnNldExlZnQgPSAwO1xuICAgICAgdmFyIGdyaWRPZmZzZXRUb3AgPSAwO1xuICAgICAgdmFyIG1hdGNoU2NvcmUgPSAtMTtcbiAgICAgIHZhciBtYXRjaEluZGV4O1xuICAgICAgdmFyIGhhc1ZhbGlkVGFyZ2V0cztcbiAgICAgIHZhciB0YXJnZXQ7XG4gICAgICB2YXIgc2NvcmU7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gSWYgaXRlbSBpcyBtb3ZlZCB3aXRoaW4gaXQncyBvcmlnaW5hdGluZyBncmlkIGFkanVzdCBpdGVtJ3MgbGVmdCBhbmRcbiAgICAgIC8vIHRvcCBwcm9wcy4gT3RoZXJ3aXNlIGlmIGl0ZW0gaXMgbW92ZWQgdG8vd2l0aGluIGFub3RoZXIgZ3JpZCBnZXQgdGhlXG4gICAgICAvLyBjb250YWluZXIgZWxlbWVudCdzIG9mZnNldCAoZnJvbSB0aGUgZWxlbWVudCdzIGNvbnRlbnQgZWRnZSkuXG4gICAgICBpZiAoZ3JpZCA9PT0gcm9vdEdyaWQpIHtcbiAgICAgICAgaXRlbVJlY3QubGVmdCA9IGRyYWcuX2dyaWRYICsgaXRlbS5fbWFyZ2luTGVmdDtcbiAgICAgICAgaXRlbVJlY3QudG9wID0gZHJhZy5fZ3JpZFkgKyBpdGVtLl9tYXJnaW5Ub3A7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmlkLl91cGRhdGVCb3JkZXJzKDEsIDAsIDEsIDApO1xuICAgICAgICBncmlkT2Zmc2V0TGVmdCA9IGdyaWQuX2xlZnQgKyBncmlkLl9ib3JkZXJMZWZ0O1xuICAgICAgICBncmlkT2Zmc2V0VG9wID0gZ3JpZC5fdG9wICsgZ3JpZC5fYm9yZGVyVG9wO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHRhcmdldCBncmlkIGl0ZW1zIGFuZCB0cnkgdG8gZmluZCB0aGUgYmVzdCBtYXRjaC5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBncmlkLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0YXJnZXQgPSBncmlkLl9pdGVtc1tpXTtcblxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGl0ZW0gaXMgbm90IGFjdGl2ZSBvciB0aGUgdGFyZ2V0IGl0ZW0gaXMgdGhlIGRyYWdnZWRcbiAgICAgICAgLy8gaXRlbSBsZXQncyBza2lwIHRvIHRoZSBuZXh0IGl0ZW0uXG4gICAgICAgIGlmICghdGFyZ2V0Ll9pc0FjdGl2ZSB8fCB0YXJnZXQgPT09IGl0ZW0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgdGhlIGdyaWQgYXMgaGF2aW5nIHZhbGlkIHRhcmdldCBpdGVtcy5cbiAgICAgICAgaGFzVmFsaWRUYXJnZXRzID0gdHJ1ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRhcmdldCdzIG92ZXJsYXAgc2NvcmUgd2l0aCB0aGUgZHJhZ2dlZCBpdGVtLlxuICAgICAgICB0YXJnZXRSZWN0LndpZHRoID0gdGFyZ2V0Ll93aWR0aDtcbiAgICAgICAgdGFyZ2V0UmVjdC5oZWlnaHQgPSB0YXJnZXQuX2hlaWdodDtcbiAgICAgICAgdGFyZ2V0UmVjdC5sZWZ0ID0gdGFyZ2V0Ll9sZWZ0ICsgdGFyZ2V0Ll9tYXJnaW5MZWZ0ICsgZ3JpZE9mZnNldExlZnQ7XG4gICAgICAgIHRhcmdldFJlY3QudG9wID0gdGFyZ2V0Ll90b3AgKyB0YXJnZXQuX21hcmdpblRvcCArIGdyaWRPZmZzZXRUb3A7XG4gICAgICAgIHNjb3JlID0gZ2V0UmVjdE92ZXJsYXBTY29yZShpdGVtUmVjdCwgdGFyZ2V0UmVjdCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGJlc3QgbWF0Y2ggaW5kZXggYW5kIHNjb3JlIGlmIHRoZSB0YXJnZXQncyBvdmVybGFwIHNjb3JlIHdpdGhcbiAgICAgICAgLy8gdGhlIGRyYWdnZWQgaXRlbSBpcyBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCBiZXN0IG1hdGNoIHNjb3JlLlxuICAgICAgICBpZiAoc2NvcmUgPiBtYXRjaFNjb3JlKSB7XG4gICAgICAgICAgbWF0Y2hJbmRleCA9IGk7XG4gICAgICAgICAgbWF0Y2hTY29yZSA9IHNjb3JlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHZhbGlkIG1hdGNoIGFuZCB0aGUgaXRlbSBpcyBiZWluZyBtb3ZlZCBpbnRvIGFub3RoZXJcbiAgICAgIC8vIGdyaWQuXG4gICAgICBpZiAobWF0Y2hTY29yZSA8IHNvcnRUaHJlc2hvbGQgJiYgaXRlbS5nZXRHcmlkKCkgIT09IGdyaWQpIHtcbiAgICAgICAgbWF0Y2hJbmRleCA9IGhhc1ZhbGlkVGFyZ2V0cyA/IC0xIDogMDtcbiAgICAgICAgbWF0Y2hTY29yZSA9IEluZmluaXR5O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgYmVzdCBtYXRjaCBvdmVybGFwcyBlbm91Z2ggdG8ganVzdGlmeSBhIHBsYWNlbWVudCBzd2l0Y2guXG4gICAgICBpZiAobWF0Y2hTY29yZSA+PSBzb3J0VGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybkRhdGEuZ3JpZCA9IGdyaWQ7XG4gICAgICAgIHJldHVybkRhdGEuaW5kZXggPSBtYXRjaEluZGV4O1xuICAgICAgICByZXR1cm5EYXRhLmFjdGlvbiA9IHNvcnRBY3Rpb247XG4gICAgICAgIHJldHVybiByZXR1cm5EYXRhO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQWJvcnQgZHJhZ2dpbmcgYW5kIHJlc2V0IGRyYWcgZGF0YS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtRHJhZ31cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcblxuICAgIGlmICghdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYmVpbmcgZHJvcHBlZCBpbnRvIGFub3RoZXIgZ3JpZCwgZmluaXNoIGl0IHVwIGFuZCByZXR1cm5cbiAgICAvLyBpbW1lZGlhdGVseS5cbiAgICBpZiAodGhpcy5faXNNaWdyYXRpbmcpIHtcbiAgICAgIHRoaXMuX2ZpbmlzaE1pZ3JhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCBtb3ZlIGFuZCBzY3JvbGwgdGlja3MuXG4gICAgY2FuY2VsTW92ZVRpY2soaXRlbS5faWQpO1xuICAgIGNhbmNlbFNjcm9sbFRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gUmVtb3ZlIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgdGhpcy5fdW5iaW5kU2Nyb2xsTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBDYW5jZWwgb3ZlcmxhcCBjaGVjay5cbiAgICB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgnY2FuY2VsJyk7XG5cbiAgICAvLyBBcHBlbmQgaXRlbSBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgaWYgaXQncyBub3QgaXQncyBjaGlsZC4gQWxzbyBtYWtlXG4gICAgLy8gc3VyZSB0aGUgdHJhbnNsYXRlIHZhbHVlcyBhcmUgYWRqdXN0ZWQgdG8gYWNjb3VudCBmb3IgdGhlIERPTSBzaGlmdC5cbiAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICE9PSBncmlkLl9lbGVtZW50KSB7XG4gICAgICBncmlkLl9lbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9ncmlkWCwgdGhpcy5fZ3JpZFkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBkcmFnZ2luZyBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBncmlkLl9zZXR0aW5ncy5pdGVtRHJhZ2dpbmdDbGFzcyk7XG5cbiAgICAvLyBSZXNldCBkcmFnIGRhdGEuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1EcmFnfVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuX2RyYWdnZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7P0dyaWR9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2dldEdyaWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZ3JpZEluc3RhbmNlc1t0aGlzLl9ncmlkSWRdIHx8IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwL3Jlc2V0IGRyYWcgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIElzIGl0ZW0gYmVpbmcgZHJhZ2dlZD9cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGRyYWdnZWQgaXRlbSdzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG5cbiAgICAvLyBUaGUgZHJhZ2dlZCBpdGVtJ3MgY29udGFpbmluZyBibG9jay5cbiAgICB0aGlzLl9jb250YWluaW5nQmxvY2sgPSBudWxsO1xuXG4gICAgLy8gRHJhZy9zY3JvbGwgZXZlbnQgZGF0YS5cbiAgICB0aGlzLl9kcmFnRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuX3Njcm9sbEV2ZW50ID0gbnVsbDtcblxuICAgIC8vIEFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbmVlZCB0byBiZSBsaXN0ZW5lZCBmb3Igc2Nyb2xsIGV2ZW50cyBkdXJpbmdcbiAgICAvLyBkcmFnZ2luZy5cbiAgICB0aGlzLl9zY3JvbGxlcnMgPSBbXTtcblxuICAgIC8vIFRoZSBjdXJyZW50IHRyYW5zbGF0ZVgvdHJhbnNsYXRlWSBwb3NpdGlvbi5cbiAgICB0aGlzLl9sZWZ0ID0gMDtcbiAgICB0aGlzLl90b3AgPSAwO1xuXG4gICAgLy8gRHJhZ2dlZCBlbGVtZW50J3MgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGdyaWQuXG4gICAgdGhpcy5fZ3JpZFggPSAwO1xuICAgIHRoaXMuX2dyaWRZID0gMDtcblxuICAgIC8vIERyYWdnZWQgZWxlbWVudCdzIGN1cnJlbnQgb2Zmc2V0IGZyb20gd2luZG93J3Mgbm9ydGh3ZXN0IGNvcm5lci4gRG9lc1xuICAgIC8vIG5vdCBhY2NvdW50IGZvciBlbGVtZW50J3MgbWFyZ2lucy5cbiAgICB0aGlzLl9lbGVtZW50Q2xpZW50WCA9IDA7XG4gICAgdGhpcy5fZWxlbWVudENsaWVudFkgPSAwO1xuXG4gICAgLy8gT2Zmc2V0IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZHJhZ2dlZCBlbGVtZW50J3MgdGVtcG9yYXJ5IGRyYWdcbiAgICAvLyBjb250YWluZXIgYW5kIGl0J3Mgb3JpZ2luYWwgY29udGFpbmVyLlxuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJpbmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgdG8gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3IgZWxlbWVudHMgb2YgdGhlXG4gICAqIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fYmluZFNjcm9sbExpc3RlbmVycyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gdGhpcy5fZ2V0R3JpZCgpLl9lbGVtZW50O1xuICAgIHZhciBkcmFnQ29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xuICAgIHZhciBzY3JvbGxlcnMgPSB0aGlzLl9zY3JvbGxlcnM7XG4gICAgdmFyIGdyaWRTY3JvbGxlcnM7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBHZXQgZHJhZ2dlZCBlbGVtZW50J3Mgc2Nyb2xsaW5nIHBhcmVudHMuXG4gICAgc2Nyb2xsZXJzLmxlbmd0aCA9IDA7XG4gICAgZ2V0U2Nyb2xsYWJsZUFuY2VzdG9ycyh0aGlzLl9pdGVtLl9lbGVtZW50LCBmYWxzZSwgc2Nyb2xsZXJzKTtcblxuICAgIC8vIElmIGRyYWcgY29udGFpbmVyIGlzIGRlZmluZWQgYW5kIGl0J3Mgbm90IHRoZSBzYW1lIGVsZW1lbnQgYXMgZ3JpZFxuICAgIC8vIGNvbnRhaW5lciB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBncmlkIGNvbnRhaW5lciBhbmQgaXQncyBzY3JvbGwgcGFyZW50c1xuICAgIC8vIHRvIHRoZSBlbGVtZW50cyB3aGljaCBhcmUgZ29pbmcgdG8gYmUgbGlzdGVuZXIgZm9yIHNjcm9sbCBldmVudHMuXG4gICAgaWYgKGRyYWdDb250YWluZXIgIT09IGdyaWRDb250YWluZXIpIHtcbiAgICAgIGdyaWRTY3JvbGxlcnMgPSBbXTtcbiAgICAgIGdldFNjcm9sbGFibGVBbmNlc3RvcnMoZ3JpZENvbnRhaW5lciwgdHJ1ZSwgZ3JpZFNjcm9sbGVycyk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JpZFNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2Nyb2xsZXJzLmluZGV4T2YoZ3JpZFNjcm9sbGVyc1tpXSkgPCAwKSB7XG4gICAgICAgICAgc2Nyb2xsZXJzLnB1c2goZ3JpZFNjcm9sbGVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCaW5kIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChpID0gMDsgaSA8IHNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgc2Nyb2xsZXJzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX29uU2Nyb2xsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBjdXJyZW50bHkgYm91bmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgZnJvbSBhbGwgc2Nyb2xsYWJsZSBhbmNlc3RvclxuICAgKiBlbGVtZW50cyBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IGFuZCB0aGUgZHJhZyBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl91bmJpbmRTY3JvbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2Nyb2xsZXJzID0gdGhpcy5fc2Nyb2xsZXJzO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgc2Nyb2xsZXJzW2ldLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX29uU2Nyb2xsKTtcbiAgICB9XG5cbiAgICBzY3JvbGxlcnMubGVuZ3RoID0gMDtcbiAgfTtcblxuICAvKipcbiAgICogU2V0dXAgZGVmYXVsdCBzdGFydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9zZXR1cFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBjb25maWcgPSBvcHRpb25zIHx8IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1N0YXJ0UHJlZGljYXRlIHx8IDA7XG4gICAgcmV0dXJuICh0aGlzLl9zdGFydFByZWRpY2F0ZURhdGEgPSB7XG4gICAgICBkaXN0YW5jZTogTWF0aC5hYnMoY29uZmlnLmRpc3RhbmNlKSB8fCAwLFxuICAgICAgZGVsYXk6IE1hdGgubWF4KGNvbmZpZy5kZWxheSwgMCkgfHwgMCxcbiAgICAgIGhhbmRsZTogdHlwZW9mIGNvbmZpZy5oYW5kbGUgPT09ICdzdHJpbmcnID8gY29uZmlnLmhhbmRsZSA6IGZhbHNlXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIGRlZmF1bHQgc3RhcnQgcHJlZGljYXRlIGhhbmRsZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMgez9IVE1MRWxlbWVudH1cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZ2V0U3RhcnRQcmVkaWNhdGVIYW5kbGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9pdGVtLl9lbGVtZW50O1xuICAgIHZhciBoYW5kbGVFbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIE5vIGhhbmRsZSwgbm8gaGFzc2xlIC0+IGxldCdzIHVzZSB0aGUgaXRlbSBlbGVtZW50IGFzIHRoZSBoYW5kbGUuXG4gICAgaWYgKCFwcmVkaWNhdGUuaGFuZGxlKSByZXR1cm4gaGFuZGxlRWxlbWVudDtcblxuICAgIC8vIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgcHJlZGljYXRlIGhhbmRsZSBkZWZpbmVkLCBsZXQncyB0cnkgdG8gZ2V0IGl0LlxuICAgIGhhbmRsZUVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG4gICAgd2hpbGUgKGhhbmRsZUVsZW1lbnQgJiYgIWVsZW1lbnRNYXRjaGVzKGhhbmRsZUVsZW1lbnQsIHByZWRpY2F0ZS5oYW5kbGUpKSB7XG4gICAgICBoYW5kbGVFbGVtZW50ID0gaGFuZGxlRWxlbWVudCAhPT0gZWxlbWVudCA/IGhhbmRsZUVsZW1lbnQucGFyZW50RWxlbWVudCA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVFbGVtZW50IHx8IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBjdXJyZW50bHkgYm91bmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgZnJvbSBhbGwgc2Nyb2xsYWJsZSBhbmNlc3RvclxuICAgKiBlbGVtZW50cyBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IGFuZCB0aGUgZHJhZyBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3Jlc29sdmVTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHByZWRpY2F0ZSA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YTtcblxuICAgIC8vIElmIHRoZSBtb3ZlZCBkaXN0YW5jZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkaXN0YW5jZSBvciB0aGVyZSBpc1xuICAgIC8vIHNvbWUgZGVsYXkgbGVmdCwgaWdub3JlIHRoaXMgcHJlZGljYXRlIGN5Y2xlLlxuICAgIGlmIChldmVudC5kaXN0YW5jZSA8IHByZWRpY2F0ZS5kaXN0YW5jZSB8fCBwcmVkaWNhdGUuZGVsYXkpIHJldHVybjtcblxuICAgIC8vIEdldCBoYW5kbGUgcmVjdCBkYXRhLlxuICAgIHZhciBoYW5kbGVSZWN0ID0gcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIGhhbmRsZUxlZnQgPSBoYW5kbGVSZWN0LmxlZnQgKyAod2luZG93LnBhZ2VYT2Zmc2V0IHx8IDApO1xuICAgIHZhciBoYW5kbGVUb3AgPSBoYW5kbGVSZWN0LnRvcCArICh3aW5kb3cucGFnZVlPZmZzZXQgfHwgMCk7XG4gICAgdmFyIGhhbmRsZVdpZHRoID0gaGFuZGxlUmVjdC53aWR0aDtcbiAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlUmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBSZXNldCBwcmVkaWNhdGUgZGF0YS5cbiAgICB0aGlzLl9yZXNldFN0YXJ0UHJlZGljYXRlKCk7XG5cbiAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIHN0aWxsIHdpdGhpbiB0aGUgaGFuZGxlIGxldCdzIHN0YXJ0IHRoZSBkcmFnLlxuICAgIHJldHVybiAoXG4gICAgICBoYW5kbGVXaWR0aCAmJlxuICAgICAgaGFuZGxlSGVpZ2h0ICYmXG4gICAgICBldmVudC5wYWdlWCA+PSBoYW5kbGVMZWZ0ICYmXG4gICAgICBldmVudC5wYWdlWCA8IGhhbmRsZUxlZnQgKyBoYW5kbGVXaWR0aCAmJlxuICAgICAgZXZlbnQucGFnZVkgPj0gaGFuZGxlVG9wICYmXG4gICAgICBldmVudC5wYWdlWSA8IGhhbmRsZVRvcCArIGhhbmRsZUhlaWdodFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcmNlZnVsbHkgcmVzb2x2ZSBkcmFnIHN0YXJ0IHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZm9yY2VSZXNvbHZlU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICghdGhpcy5faXNEZXN0cm95ZWQgJiYgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcbiAgICAgIHRoaXMuX29uU3RhcnQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRmluYWxpemUgc3RhcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9maW5pc2hTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9pdGVtLl9lbGVtZW50O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsaWNrICh2ZXJ5IHN1YmplY3RpdmUgaGV1cmlzdGljcykuXG4gICAgdmFyIGlzQ2xpY2sgPSBNYXRoLmFicyhldmVudC5kZWx0YVgpIDwgMiAmJiBNYXRoLmFicyhldmVudC5kZWx0YVkpIDwgMiAmJiBldmVudC5kZWx0YVRpbWUgPCAyMDA7XG5cbiAgICAvLyBSZXNldCBwcmVkaWNhdGUuXG4gICAgdGhpcy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuXG4gICAgLy8gSWYgdGhlIGdlc3R1cmUgY2FuIGJlIGludGVycHJldGVkIGFzIGNsaWNrIGxldCdzIHRyeSB0byBvcGVuIHRoZSBlbGVtZW50J3NcbiAgICAvLyBocmVmIHVybCAoaWYgaXQgaXMgYW4gYW5jaG9yIGVsZW1lbnQpLlxuICAgIGlmIChpc0NsaWNrKSBvcGVuQW5jaG9ySHJlZihlbGVtZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgZHJhZyBzb3J0IGhldXJpc3RpY3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3Jlc2V0SGV1cmlzdGljcyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5faFgxID0gdGhpcy5faFgyID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLl9oWTEgPSB0aGlzLl9oWTIgPSBldmVudC5jbGllbnRZO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSdW4gaGV1cmlzdGljcyBhbmQgcmV0dXJuIHRydWUgaWYgb3ZlcmxhcCBjaGVjayBjYW4gYmUgcGVyZm9ybWVkLCBhbmQgZmFsc2VcbiAgICogaWYgaXQgY2FuIG5vdC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2NoZWNrSGV1cmlzdGljcyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnU29ydEhldXJpc3RpY3M7XG4gICAgdmFyIG1pbkRpc3QgPSBzZXR0aW5ncy5taW5EcmFnRGlzdGFuY2U7XG5cbiAgICAvLyBTa2lwIGhldXJpc3RpY3MgaWYgbm90IG5lZWRlZC5cbiAgICBpZiAobWluRGlzdCA8PSAwKSB7XG4gICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciB4ID0gZXZlbnQuY2xpZW50WDtcbiAgICB2YXIgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgdmFyIGRpZmZYID0geCAtIHRoaXMuX2hYMjtcbiAgICB2YXIgZGlmZlkgPSB5IC0gdGhpcy5faFkyO1xuXG4gICAgLy8gSWYgd2UgY2FuJ3QgZG8gcHJvcGVyIGJvdW5jZSBiYWNrIGNoZWNrIG1ha2Ugc3VyZSB0aGF0IHRoZSBibG9ja2VkIGluZGV4XG4gICAgLy8gaXMgbm90IHNldC5cbiAgICB2YXIgY2FuQ2hlY2tCb3VuY2VCYWNrID0gbWluRGlzdCA+IDMgJiYgc2V0dGluZ3MubWluQm91bmNlQmFja0FuZ2xlID4gMDtcbiAgICBpZiAoIWNhbkNoZWNrQm91bmNlQmFjaykge1xuICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IG1pbkRpc3QgfHwgTWF0aC5hYnMoZGlmZlkpID4gbWluRGlzdCkge1xuICAgICAgLy8gUmVzZXQgYmxvY2tlZCBpbmRleCBpZiBhbmdsZSBjaGFuZ2VkIGVub3VnaC4gVGhpcyBjaGVjayByZXF1aXJlcyBhXG4gICAgICAvLyBtaW5pbXVtIHZhbHVlIG9mIDMgZm9yIG1pbkRyYWdEaXN0YW5jZSB0byBmdW5jdGlvbiBwcm9wZXJseS5cbiAgICAgIGlmIChjYW5DaGVja0JvdW5jZUJhY2spIHtcbiAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihkaWZmWCwgZGlmZlkpO1xuICAgICAgICB2YXIgcHJldkFuZ2xlID0gTWF0aC5hdGFuMih0aGlzLl9oWDIgLSB0aGlzLl9oWDEsIHRoaXMuX2hZMiAtIHRoaXMuX2hZMSk7XG4gICAgICAgIHZhciBkZWx0YUFuZ2xlID0gTWF0aC5hdGFuMihNYXRoLnNpbihhbmdsZSAtIHByZXZBbmdsZSksIE1hdGguY29zKGFuZ2xlIC0gcHJldkFuZ2xlKSk7XG4gICAgICAgIGlmIChNYXRoLmFicyhkZWx0YUFuZ2xlKSA+IHNldHRpbmdzLm1pbkJvdW5jZUJhY2tBbmdsZSkge1xuICAgICAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwb2ludHMuXG4gICAgICB0aGlzLl9oWDEgPSB0aGlzLl9oWDI7XG4gICAgICB0aGlzLl9oWTEgPSB0aGlzLl9oWTI7XG4gICAgICB0aGlzLl9oWDIgPSB4O1xuICAgICAgdGhpcy5faFkyID0geTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCBmb3IgZGVmYXVsdCBkcmFnIHN0YXJ0IHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByZWRpY2F0ZSA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YTtcbiAgICBpZiAocHJlZGljYXRlKSB7XG4gICAgICBpZiAocHJlZGljYXRlLmRlbGF5VGltZXIpIHtcbiAgICAgICAgcHJlZGljYXRlLmRlbGF5VGltZXIgPSB3aW5kb3cuY2xlYXJUaW1lb3V0KHByZWRpY2F0ZS5kZWxheVRpbWVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YSA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayAoZHVyaW5nIGRyYWcpIGlmIGFuIGl0ZW0gaXMgb3ZlcmxhcHBpbmcgb3RoZXIgaXRlbXMgYW5kIGJhc2VkIG9uXG4gICAqIHRoZSBjb25maWd1cmF0aW9uIGxheW91dCB0aGUgaXRlbXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fY2hlY2tPdmVybGFwID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3M7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB2YXIgY3VycmVudEdyaWQ7XG4gICAgdmFyIGN1cnJlbnRJbmRleDtcbiAgICB2YXIgdGFyZ2V0R3JpZDtcbiAgICB2YXIgdGFyZ2V0SW5kZXg7XG4gICAgdmFyIHNvcnRBY3Rpb247XG4gICAgdmFyIGlzTWlncmF0aW9uO1xuXG4gICAgLy8gR2V0IG92ZXJsYXAgY2hlY2sgcmVzdWx0LlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKSkge1xuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuZHJhZ1NvcnRQcmVkaWNhdGUoaXRlbSwgdGhpcy5fZHJhZ0V2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gSXRlbURyYWcuZGVmYXVsdFNvcnRQcmVkaWNhdGUoaXRlbSwgc2V0dGluZ3MuZHJhZ1NvcnRQcmVkaWNhdGUpO1xuICAgIH1cblxuICAgIC8vIExldCdzIG1ha2Ugc3VyZSB0aGUgcmVzdWx0IG9iamVjdCBoYXMgYSB2YWxpZCBpbmRleCBiZWZvcmUgZ29pbmcgZnVydGhlci5cbiAgICBpZiAoIXJlc3VsdCB8fCB0eXBlb2YgcmVzdWx0LmluZGV4ICE9PSAnbnVtYmVyJykgcmV0dXJuO1xuXG4gICAgY3VycmVudEdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB0YXJnZXRHcmlkID0gcmVzdWx0LmdyaWQgfHwgY3VycmVudEdyaWQ7XG4gICAgaXNNaWdyYXRpb24gPSBjdXJyZW50R3JpZCAhPT0gdGFyZ2V0R3JpZDtcbiAgICBjdXJyZW50SW5kZXggPSBjdXJyZW50R3JpZC5faXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICB0YXJnZXRJbmRleCA9IG5vcm1hbGl6ZUFycmF5SW5kZXgodGFyZ2V0R3JpZC5faXRlbXMsIHJlc3VsdC5pbmRleCwgaXNNaWdyYXRpb24pO1xuICAgIHNvcnRBY3Rpb24gPSByZXN1bHQuYWN0aW9uID09PSBhY3Rpb25Td2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG5cbiAgICAvLyBQcmV2ZW50IHBvc2l0aW9uIGJvdW5jZS5cbiAgICBpZiAoIWlzTWlncmF0aW9uICYmIHRhcmdldEluZGV4ID09PSB0aGlzLl9oQmxvY2tlZEluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gd2FzIG1vdmVkIHdpdGhpbiBpdCdzIGN1cnJlbnQgZ3JpZC5cbiAgICBpZiAoIWlzTWlncmF0aW9uKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIHRhcmdldCBpbmRleCBpcyBub3QgdGhlIGN1cnJlbnQgaW5kZXguXG4gICAgICBpZiAoY3VycmVudEluZGV4ICE9PSB0YXJnZXRJbmRleCkge1xuICAgICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gY3VycmVudEluZGV4O1xuXG4gICAgICAgIC8vIERvIHRoZSBzb3J0LlxuICAgICAgICAoc29ydEFjdGlvbiA9PT0gYWN0aW9uU3dhcCA/IGFycmF5U3dhcCA6IGFycmF5TW92ZSkoXG4gICAgICAgICAgY3VycmVudEdyaWQuX2l0ZW1zLFxuICAgICAgICAgIGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0YXJnZXRJbmRleFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgbW92ZSBldmVudC5cbiAgICAgICAgaWYgKGN1cnJlbnRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRNb3ZlKSkge1xuICAgICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50TW92ZSwge1xuICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXgsXG4gICAgICAgICAgICBhY3Rpb246IHNvcnRBY3Rpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExheW91dCB0aGUgZ3JpZC5cbiAgICAgICAgY3VycmVudEdyaWQubGF5b3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gd2FzIG1vdmVkIHRvIGFub3RoZXIgZ3JpZC5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuXG4gICAgICAvLyBFbWl0IGJlZm9yZVNlbmQgZXZlbnQuXG4gICAgICBpZiAoY3VycmVudEdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVNlbmQpKSB7XG4gICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50QmVmb3JlU2VuZCwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBiZWZvcmVSZWNlaXZlIGV2ZW50LlxuICAgICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVJlY2VpdmUpKSB7XG4gICAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRCZWZvcmVSZWNlaXZlLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgaXRlbSdzIGdyaWQgaWQgcmVmZXJlbmNlLlxuICAgICAgaXRlbS5fZ3JpZElkID0gdGFyZ2V0R3JpZC5faWQ7XG5cbiAgICAgIC8vIFVwZGF0ZSBkcmFnIGluc3RhbmNlJ3MgbWlncmF0aW5nIGluZGljYXRvci5cbiAgICAgIHRoaXMuX2lzTWlncmF0aW5nID0gaXRlbS5fZ3JpZElkICE9PSB0aGlzLl9ncmlkSWQ7XG5cbiAgICAgIC8vIE1vdmUgaXRlbSBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgZ3JpZCB0byB0YXJnZXQgZ3JpZC5cbiAgICAgIGN1cnJlbnRHcmlkLl9pdGVtcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICAgIGFycmF5SW5zZXJ0KHRhcmdldEdyaWQuX2l0ZW1zLCBpdGVtLCB0YXJnZXRJbmRleCk7XG5cbiAgICAgIC8vIFNldCBzb3J0IGRhdGEgYXMgbnVsbCwgd2hpY2ggaXMgYW4gaW5kaWNhdG9yIGZvciB0aGUgaXRlbSBjb21wYXJpc29uXG4gICAgICAvLyBmdW5jdGlvbiB0aGF0IHRoZSBzb3J0IGRhdGEgb2YgdGhpcyBzcGVjaWZpYyBpdGVtIHNob3VsZCBiZSBmZXRjaGVkXG4gICAgICAvLyBsYXppbHkuXG4gICAgICBpdGVtLl9zb3J0RGF0YSA9IG51bGw7XG5cbiAgICAgIC8vIEVtaXQgc2VuZCBldmVudC5cbiAgICAgIGlmIChjdXJyZW50R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50U2VuZCkpIHtcbiAgICAgICAgY3VycmVudEdyaWQuX2VtaXQoZXZlbnRTZW5kLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHJlY2VpdmUgZXZlbnQuXG4gICAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50UmVjZWl2ZSkpIHtcbiAgICAgICAgdGFyZ2V0R3JpZC5fZW1pdChldmVudFJlY2VpdmUsIHtcbiAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgIGZyb21HcmlkOiBjdXJyZW50R3JpZCxcbiAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExheW91dCBib3RoIGdyaWRzLlxuICAgICAgY3VycmVudEdyaWQubGF5b3V0KCk7XG4gICAgICB0YXJnZXRHcmlkLmxheW91dCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSWYgaXRlbSBpcyBkcmFnZ2VkIGludG8gYW5vdGhlciBncmlkLCBmaW5pc2ggdGhlIG1pZ3JhdGlvbiBwcm9jZXNzXG4gICAqIGdyYWNlZnVsbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZmluaXNoTWlncmF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGlzQWN0aXZlID0gaXRlbS5faXNBY3RpdmU7XG4gICAgdmFyIHRhcmdldEdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgdGFyZ2V0R3JpZEVsZW1lbnQgPSB0YXJnZXRHcmlkLl9lbGVtZW50O1xuICAgIHZhciB0YXJnZXRTZXR0aW5ncyA9IHRhcmdldEdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRTZXR0aW5ncy5kcmFnQ29udGFpbmVyIHx8IHRhcmdldEdyaWRFbGVtZW50O1xuICAgIHZhciBjdXJyZW50U2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBjdXJyZW50Q29udGFpbmVyID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIHZhciB0cmFuc2xhdGU7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBEZXN0cm95IGN1cnJlbnQgZHJhZy4gTm90ZSB0aGF0IHdlIG5lZWQgdG8gc2V0IHRoZSBtaWdyYXRpbmcgZmxhZyB0b1xuICAgIC8vIGZhbHNlIGZpcnN0LCBiZWNhdXNlIG90aGVyd2lzZSB3ZSBjcmVhdGUgYW4gaW5maW5pdGUgbG9vcCBiZXR3ZWVuIHRoaXNcbiAgICAvLyBhbmQgdGhlIGRyYWcuc3RvcCgpIG1ldGhvZC5cbiAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuXG4gICAgLy8gUmVtb3ZlIGN1cnJlbnQgY2xhc3NuYW1lcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBjdXJyZW50U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBjdXJyZW50U2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBBZGQgbmV3IGNsYXNzbmFtZXMuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgdGFyZ2V0U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc0FjdGl2ZSA/IHRhcmdldFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiB0YXJnZXRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gTW92ZSB0aGUgaXRlbSBpbnNpZGUgdGhlIHRhcmdldCBjb250YWluZXIgaWYgaXQncyBkaWZmZXJlbnQgdGhhbiB0aGVcbiAgICAvLyBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICB0YXJnZXRDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZihjdXJyZW50Q29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIHRydWUpO1xuICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgdHJhbnNsYXRlLnggLT0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdHJhbnNsYXRlLnkgLT0gb2Zmc2V0RGlmZi50b3A7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBjYWNoZWQgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIGl0ZW0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgaXRlbS5fcmVmcmVzaFNvcnREYXRhKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0J3MgZHJhZyBjb250YWluZXIgKGlmIGFueSlcbiAgICAvLyBhbmQgYWN0dWFsIGdyaWQgY29udGFpbmVyIGVsZW1lbnQuIFdlIHNhdmUgaXQgbGF0ZXIgZm9yIHRoZSByZWxlYXNlXG4gICAgLy8gcHJvY2Vzcy5cbiAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIHRhcmdldEdyaWRFbGVtZW50LCB0cnVlKTtcbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWSA9IG9mZnNldERpZmYudG9wO1xuXG4gICAgLy8gUmVjcmVhdGUgaXRlbSdzIGRyYWcgaGFuZGxlci5cbiAgICBpdGVtLl9kcmFnID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0VuYWJsZWQgPyBuZXcgSXRlbURyYWcoaXRlbSkgOiBudWxsO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBlbGVtZW50IGlmIGl0IHdhcyBtb3ZlZCBmcm9tIGEgY29udGFpbmVyXG4gICAgLy8gdG8gYW5vdGhlci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRyYW5zbGF0ZS54LCB0cmFuc2xhdGUueSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNoaWxkIGVsZW1lbnQncyBzdHlsZXMgdG8gcmVmbGVjdCB0aGUgY3VycmVudCB2aXNpYmlsaXR5IHN0YXRlLlxuICAgIGl0ZW0uX2NoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIGlzQWN0aXZlID8gdGFyZ2V0U2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHRhcmdldFNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG5cbiAgICAvLyBTdGFydCB0aGUgcmVsZWFzZS5cbiAgICByZWxlYXNlLnN0YXJ0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgcHJlLXN0YXJ0IGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZVN0YXJ0Q2hlY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIExldCdzIGFjdGl2YXRlIGRyYWcgc3RhcnQgcHJlZGljYXRlIHN0YXRlLlxuICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZUluYWN0aXZlKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nO1xuICAgIH1cblxuICAgIC8vIElmIHByZWRpY2F0ZSBpcyBwZW5kaW5nIHRyeSB0byByZXNvbHZlIGl0LlxuICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZVBlbmRpbmcpIHtcbiAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID0gdGhpcy5fc3RhcnRQcmVkaWNhdGUodGhpcy5faXRlbSwgZXZlbnQpO1xuICAgICAgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZVJlc29sdmVkO1xuICAgICAgICB0aGlzLl9vblN0YXJ0KGV2ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZVJlamVjdGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBpZiBwcmVkaWNhdGUgaXMgcmVzb2x2ZWQgYW5kIGRyYWcgaXMgYWN0aXZlLCBtb3ZlIHRoZSBpdGVtLlxuICAgIGVsc2UgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQgJiYgdGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHRoaXMuX29uTW92ZShldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIHByZS1lbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlRW5kQ2hlY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBwcmVkaWNhdGUgd2FzIHJlc29sdmVkIGR1cmluZyBkcmFnLlxuICAgIHZhciBpc1Jlc29sdmVkID0gdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcblxuICAgIC8vIERvIGZpbmFsIHByZWRpY2F0ZSBjaGVjayB0byBhbGxvdyB1c2VyIHRvIHVuYmluZCBzdHVmZiBmb3IgdGhlIGN1cnJlbnRcbiAgICAvLyBkcmFnIHByb2NlZHVyZSB3aXRoaW4gdGhlIHByZWRpY2F0ZSBjYWxsYmFjay4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzXG4gICAgLy8gY2hlY2sgd2lsbCBoYXZlIG5vIGVmZmVjdCB0byB0aGUgc3RhdGUgb2YgdGhlIHByZWRpY2F0ZS5cbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZSh0aGlzLl9pdGVtLCBldmVudCk7XG5cbiAgICAvLyBSZXNldCBzdGFydCBwcmVkaWNhdGUgc3RhdGUuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlSW5hY3RpdmU7XG5cbiAgICAvLyBJZiBwcmVkaWNhdGUgaXMgcmVzb2x2ZWQgYW5kIGRyYWdnaW5nIGlzIGFjdGl2ZSwgY2FsbCB0aGUgZW5kIGhhbmRsZXIuXG4gICAgaWYgKGlzUmVzb2x2ZWQgJiYgdGhpcy5faXNBY3RpdmUpIHRoaXMuX29uRW5kKGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBzdGFydCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vblN0YXJ0ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIGRvbid0IHN0YXJ0IHRoZSBkcmFnLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgZHJhZ0NvbnRhaW5lciA9IHNldHRpbmdzLmRyYWdDb250YWluZXIgfHwgZ3JpZENvbnRhaW5lcjtcbiAgICB2YXIgY29udGFpbmluZ0Jsb2NrID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGRyYWdDb250YWluZXIsIHRydWUpO1xuICAgIHZhciB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgdmFyIGN1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdmFyIGN1cnJlbnRUb3AgPSB0cmFuc2xhdGUueTtcbiAgICB2YXIgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBoYXNEcmFnQ29udGFpbmVyID0gZHJhZ0NvbnRhaW5lciAhPT0gZ3JpZENvbnRhaW5lcjtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcblxuICAgIC8vIFJlc2V0IGhldXJpc3RpY3MgZGF0YS5cbiAgICB0aGlzLl9yZXNldEhldXJpc3RpY3MoZXZlbnQpO1xuXG4gICAgLy8gSWYgZ3JpZCBjb250YWluZXIgaXMgbm90IHRoZSBkcmFnIGNvbnRhaW5lciwgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlXG4gICAgLy8gb2Zmc2V0IGRpZmZlcmVuY2UgYmV0d2VlbiBncmlkIGNvbnRhaW5lciBhbmQgZHJhZyBjb250YWluZXIncyBjb250YWluaW5nXG4gICAgLy8gZWxlbWVudC5cbiAgICBpZiAoaGFzRHJhZ0NvbnRhaW5lcikge1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYoY29udGFpbmluZ0Jsb2NrLCBncmlkQ29udGFpbmVyKTtcbiAgICB9XG5cbiAgICAvLyBTdG9wIGN1cnJlbnQgcG9zaXRpb25pbmcgYW5pbWF0aW9uLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSkge1xuICAgICAgaXRlbS5fbGF5b3V0LnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IG1pZ3JhdGlvbiBhbmltYXRpb24uXG4gICAgaWYgKG1pZ3JhdGUuX2lzQWN0aXZlKSB7XG4gICAgICBjdXJyZW50TGVmdCAtPSBtaWdyYXRlLl9jb250YWluZXJEaWZmWDtcbiAgICAgIGN1cnJlbnRUb3AgLT0gbWlncmF0ZS5fY29udGFpbmVyRGlmZlk7XG4gICAgICBtaWdyYXRlLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBiZWluZyByZWxlYXNlZCByZXNldCByZWxlYXNlIGRhdGEuXG4gICAgaWYgKGl0ZW0uaXNSZWxlYXNpbmcoKSkgcmVsZWFzZS5fcmVzZXQoKTtcblxuICAgIC8vIFNldHVwIGRyYWcgZGF0YS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gZXZlbnQ7XG4gICAgdGhpcy5fY29udGFpbmVyID0gZHJhZ0NvbnRhaW5lcjtcbiAgICB0aGlzLl9jb250YWluaW5nQmxvY2sgPSBjb250YWluaW5nQmxvY2s7XG4gICAgdGhpcy5fZWxlbWVudENsaWVudFggPSBlbGVtZW50UmVjdC5sZWZ0O1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZID0gZWxlbWVudFJlY3QudG9wO1xuICAgIHRoaXMuX2xlZnQgPSB0aGlzLl9ncmlkWCA9IGN1cnJlbnRMZWZ0O1xuICAgIHRoaXMuX3RvcCA9IHRoaXMuX2dyaWRZID0gY3VycmVudFRvcDtcblxuICAgIC8vIENyZWF0ZSBwbGFjZWhvbGRlciAoaWYgbmVjZXNzYXJ5KS5cbiAgICBpZiAoc2V0dGluZ3MuZHJhZ1BsYWNlaG9sZGVyLmVuYWJsZWQpIHtcbiAgICAgIGl0ZW0uX2RyYWdQbGFjZWhvbGRlci5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGRyYWdJbml0IGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnSW5pdCwgaXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gSWYgYSBzcGVjaWZpYyBkcmFnIGNvbnRhaW5lciBpcyBzZXQgYW5kIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZVxuICAgIC8vIGdyaWQncyBjb250YWluZXIgZWxlbWVudCB3ZSBuZWVkIHRvIGNhc3Qgc29tZSBleHRyYSBzcGVsbHMuXG4gICAgaWYgKGhhc0RyYWdDb250YWluZXIpIHtcbiAgICAgIC8vIFN0b3JlIHRoZSBjb250YWluZXIgb2Zmc2V0IGRpZmZzIHRvIGRyYWcgZGF0YS5cbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcblxuICAgICAgLy8gSWYgdGhlIGRyYWdnZWQgZWxlbWVudCBpcyBhIGNoaWxkIG9mIHRoZSBkcmFnIGNvbnRhaW5lciBhbGwgd2UgbmVlZCB0b1xuICAgICAgLy8gZG8gaXMgc2V0dXAgdGhlIHJlbGF0aXZlIGRyYWcgcG9zaXRpb24gZGF0YS5cbiAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgPT09IGRyYWdDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5fZ3JpZFggPSBjdXJyZW50TGVmdCAtIHRoaXMuX2NvbnRhaW5lckRpZmZYO1xuICAgICAgICB0aGlzLl9ncmlkWSA9IGN1cnJlbnRUb3AgLSB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gYXBwZW5kIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgY29ycmVjdCBjb250YWluZXIsXG4gICAgICAvLyBzZXR1cCB0aGUgYWN0dWFsIGRyYWcgcG9zaXRpb24gZGF0YSBhbmQgYWRqdXN0IHRoZSBlbGVtZW50J3MgdHJhbnNsYXRlXG4gICAgICAvLyB2YWx1ZXMgdG8gYWNjb3VudCBmb3IgdGhlIERPTSBwb3NpdGlvbiBzaGlmdC5cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9sZWZ0ID0gY3VycmVudExlZnQgKyB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgICAgdGhpcy5fdG9wID0gY3VycmVudFRvcCArIHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgICBkcmFnQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2xlZnQsIHRoaXMuX3RvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGRyYWcgY2xhc3MgYW5kIGJpbmQgc2Nyb2xsZXJzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1EcmFnZ2luZ0NsYXNzKTtcbiAgICB0aGlzLl9iaW5kU2Nyb2xsTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBFbWl0IGRyYWdTdGFydCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ1N0YXJ0LCBpdGVtLCBldmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgbW92ZSBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vbk1vdmUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBheGlzID0gc2V0dGluZ3MuZHJhZ0F4aXM7XG5cbiAgICAvLyBVcGRhdGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneScpIHtcbiAgICAgIHZhciB4RGlmZiA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9kcmFnRXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuX2xlZnQgKz0geERpZmY7XG4gICAgICB0aGlzLl9ncmlkWCArPSB4RGlmZjtcbiAgICAgIHRoaXMuX2VsZW1lbnRDbGllbnRYICs9IHhEaWZmO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB2ZXJ0aWNhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneCcpIHtcbiAgICAgIHZhciB5RGlmZiA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLl9kcmFnRXZlbnQuY2xpZW50WTtcbiAgICAgIHRoaXMuX3RvcCArPSB5RGlmZjtcbiAgICAgIHRoaXMuX2dyaWRZICs9IHlEaWZmO1xuICAgICAgdGhpcy5fZWxlbWVudENsaWVudFkgKz0geURpZmY7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGV2ZW50IGRhdGEuXG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gZXZlbnQ7XG5cbiAgICAvLyBEbyBtb3ZlIHByZXBhcmUvYXBwbHkgaGFuZGxpbmcgaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRNb3ZlVGljayhpdGVtLl9pZCwgdGhpcy5fcHJlcGFyZU1vdmUsIHRoaXMuX2FwcGx5TW92ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZHJhZ2dlZCBpdGVtIGZvciBtb3ZpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlcGFyZU1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBEbyBub3RoaW5nIGlmIGl0ZW0gaXMgbm90IGFjdGl2ZS5cbiAgICBpZiAoIXRoaXMuX2l0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICAvLyBJZiBkcmFnIHNvcnQgaXMgZW5hYmxlZCAtPiBjaGVjayBvdmVybGFwLlxuICAgIGlmICh0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzLmRyYWdTb3J0KSB7XG4gICAgICBpZiAodGhpcy5fY2hlY2tIZXVyaXN0aWNzKHRoaXMuX2RyYWdFdmVudCkpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEFwcGx5IG1vdmVtZW50IHRvIGRyYWdnZWQgaXRlbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9hcHBseU1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBEbyBub3RoaW5nIGlmIGl0ZW0gaXMgbm90IGFjdGl2ZS5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgZWxlbWVudCdzIHRyYW5zbGF0ZVgvWSB2YWx1ZXMuXG4gICAgaXRlbS5fZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9sZWZ0LCB0aGlzLl90b3ApO1xuXG4gICAgLy8gRW1pdCBkcmFnTW92ZSBldmVudC5cbiAgICB0aGlzLl9nZXRHcmlkKCkuX2VtaXQoZXZlbnREcmFnTW92ZSwgaXRlbSwgdGhpcy5fZHJhZ0V2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBzY3JvbGwgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vblNjcm9sbCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlLCByZXNldCBkcmFnLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsYXN0IHNjcm9sbCBldmVudC5cbiAgICB0aGlzLl9zY3JvbGxFdmVudCA9IGV2ZW50O1xuXG4gICAgLy8gRG8gc2Nyb2xsIHByZXBhcmUvYXBwbHkgaGFuZGxpbmcgaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRTY3JvbGxUaWNrKGl0ZW0uX2lkLCB0aGlzLl9wcmVwYXJlU2Nyb2xsLCB0aGlzLl9hcHBseVNjcm9sbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZHJhZ2dlZCBpdGVtIGZvciBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlcGFyZVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSBkbyBub3RoaW5nLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgYXhpcyA9IHNldHRpbmdzLmRyYWdBeGlzO1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcblxuICAgIC8vIENhbGN1bGF0ZSBlbGVtZW50J3MgcmVjdCBhbmQgeC95IGRpZmYuXG4gICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciB4RGlmZiA9IHRoaXMuX2VsZW1lbnRDbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHZhciB5RGlmZiA9IHRoaXMuX2VsZW1lbnRDbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgICAvLyBVcGRhdGUgY29udGFpbmVyIGRpZmYuXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lciAhPT0gZ3JpZENvbnRhaW5lcikge1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYodGhpcy5fY29udGFpbmluZ0Jsb2NrLCBncmlkQ29udGFpbmVyKTtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneScpIHtcbiAgICAgIHRoaXMuX2xlZnQgKz0geERpZmY7XG4gICAgICB0aGlzLl9ncmlkWCA9IHRoaXMuX2xlZnQgLSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdmVydGljYWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3gnKSB7XG4gICAgICB0aGlzLl90b3AgKz0geURpZmY7XG4gICAgICB0aGlzLl9ncmlkWSA9IHRoaXMuX3RvcCAtIHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgIH1cblxuICAgIC8vIE92ZXJsYXAgaGFuZGxpbmcuXG4gICAgaWYgKHNldHRpbmdzLmRyYWdTb3J0KSB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBzY3JvbGwgdG8gZHJhZ2dlZCBpdGVtLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2FwcGx5U2Nyb2xsID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlIGRvIG5vdGhpbmcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGVsZW1lbnQncyB0cmFuc2xhdGVYL1kgdmFsdWVzLlxuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fbGVmdCwgdGhpcy5fdG9wKTtcblxuICAgIC8vIEVtaXQgZHJhZ1Njcm9sbCBldmVudC5cbiAgICB0aGlzLl9nZXRHcmlkKCkuX2VtaXQoZXZlbnREcmFnU2Nyb2xsLCBpdGVtLCB0aGlzLl9zY3JvbGxFdmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX29uRW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gdGhpcy5fZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgcXVldWVkIG1vdmUgYW5kIHNjcm9sbCB0aWNrcy5cbiAgICBjYW5jZWxNb3ZlVGljayhpdGVtLl9pZCk7XG4gICAgY2FuY2VsU2Nyb2xsVGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBGaW5pc2ggY3VycmVudGx5IHF1ZXVlZCBvdmVybGFwIGNoZWNrLlxuICAgIHNldHRpbmdzLmRyYWdTb3J0ICYmIHRoaXMuX2NoZWNrT3ZlcmxhcERlYm91bmNlKCdmaW5pc2gnKTtcblxuICAgIC8vIFJlbW92ZSBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIHRoaXMuX3VuYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gU2V0dXAgcmVsZWFzZSBkYXRhLlxuICAgIHJlbGVhc2UuX2NvbnRhaW5lckRpZmZYID0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlkgPSB0aGlzLl9jb250YWluZXJEaWZmWTtcblxuICAgIC8vIFJlc2V0IGRyYWcgZGF0YS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gUmVtb3ZlIGRyYWcgY2xhc3MgbmFtZSBmcm9tIGVsZW1lbnQuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbURyYWdnaW5nQ2xhc3MpO1xuXG4gICAgLy8gRW1pdCBkcmFnRW5kIGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnRW5kLCBpdGVtLCBldmVudCk7XG5cbiAgICAvLyBGaW5pc2ggdXAgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzIG9yIHN0YXJ0IHRoZSByZWxlYXNlIHByb2Nlc3MuXG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPyB0aGlzLl9maW5pc2hNaWdyYXRpb24oKSA6IHJlbGVhc2Uuc3RhcnQoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBoZWxwZXJzXG4gICAqICoqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGhvdyBtYW55IHBlcmNlbnQgdGhlIGludGVyc2VjdGlvbiBhcmVhIG9mIHR3byByZWN0YW5nbGVzIGlzIGZyb21cbiAgICogdGhlIG1heGltdW0gcG90ZW50aWFsIGludGVyc2VjdGlvbiBhcmVhIGJldHdlZW4gdGhlIHJlY3RhbmdsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqICAgLSBBIG51bWJlciBiZXR3ZWVuIDAtMTAwLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVjdE92ZXJsYXBTY29yZShhLCBiKSB7XG4gICAgLy8gUmV0dXJuIDAgaW1tZWRpYXRlbHkgaWYgdGhlIHJlY3RhbmdsZXMgZG8gbm90IG92ZXJsYXAuXG4gICAgaWYgKFxuICAgICAgYS5sZWZ0ICsgYS53aWR0aCA8PSBiLmxlZnQgfHxcbiAgICAgIGIubGVmdCArIGIud2lkdGggPD0gYS5sZWZ0IHx8XG4gICAgICBhLnRvcCArIGEuaGVpZ2h0IDw9IGIudG9wIHx8XG4gICAgICBiLnRvcCArIGIuaGVpZ2h0IDw9IGEudG9wXG4gICAgKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIGFyZWEncyB3aWR0aCwgaGVpZ2h0LCBtYXggaGVpZ2h0IGFuZCBtYXggd2lkdGguXG4gICAgdmFyIHdpZHRoID0gTWF0aC5taW4oYS5sZWZ0ICsgYS53aWR0aCwgYi5sZWZ0ICsgYi53aWR0aCkgLSBNYXRoLm1heChhLmxlZnQsIGIubGVmdCk7XG4gICAgdmFyIGhlaWdodCA9IE1hdGgubWluKGEudG9wICsgYS5oZWlnaHQsIGIudG9wICsgYi5oZWlnaHQpIC0gTWF0aC5tYXgoYS50b3AsIGIudG9wKTtcbiAgICB2YXIgbWF4V2lkdGggPSBNYXRoLm1pbihhLndpZHRoLCBiLndpZHRoKTtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gTWF0aC5taW4oYS5oZWlnaHQsIGIuaGVpZ2h0KTtcblxuICAgIHJldHVybiAoKHdpZHRoICogaGVpZ2h0KSAvIChtYXhXaWR0aCAqIG1heEhlaWdodCkpICogMTAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgaXMgYW4gYW5jaG9yIGVsZW1lbnQgYW5kIG9wZW4gdGhlIGhyZWYgdXJsIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBvcGVuQW5jaG9ySHJlZihlbGVtZW50KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGFuY2hvciBlbGVtZW50LlxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2EnKSByZXR1cm47XG5cbiAgICAvLyBHZXQgaHJlZiBhbmQgbWFrZSBzdXJlIGl0IGV4aXN0cy5cbiAgICB2YXIgaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgaWYgKCFocmVmKSByZXR1cm47XG5cbiAgICAvLyBGaW5hbGx5IGxldCdzIG5hdmlnYXRlIHRvIHRoZSBsaW5rIGhyZWYuXG4gICAgdmFyIHRhcmdldCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gJ19zZWxmJykge1xuICAgICAgd2luZG93Lm9wZW4oaHJlZiwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFnIHBsYWNlaG9sZGVyLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqL1xuICBmdW5jdGlvbiBJdGVtRHJhZ1BsYWNlaG9sZGVyKGl0ZW0pIHtcbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9hbmltYXRlID0gbmV3IEl0ZW1BbmltYXRlKCk7XG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fY2xhc3NOYW1lID0gJyc7XG4gICAgdGhpcy5fZGlkTWlncmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcbiAgICB0aGlzLl9jdXJyZW50TGVmdCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IDA7XG4gICAgdGhpcy5fbmV4dExlZnQgPSAwO1xuICAgIHRoaXMuX25leHRUb3AgPSAwO1xuXG4gICAgLy8gQmluZCBhbmltYXRpb24gaGFuZGxlcnMuXG4gICAgdGhpcy5fc2V0dXBBbmltYXRpb24gPSB0aGlzLl9zZXR1cEFuaW1hdGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3N0YXJ0QW5pbWF0aW9uID0gdGhpcy5fc3RhcnRBbmltYXRpb24uYmluZCh0aGlzKTtcblxuICAgIC8vIEJpbmQgZXZlbnQgaGFuZGxlcnMuXG4gICAgdGhpcy5fb25MYXlvdXRTdGFydCA9IHRoaXMuX29uTGF5b3V0U3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkxheW91dEVuZCA9IHRoaXMuX29uTGF5b3V0RW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25SZWxlYXNlRW5kID0gdGhpcy5fb25SZWxlYXNlRW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25NaWdyYXRlID0gdGhpcy5fb25NaWdyYXRlLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNb3ZlIHBsYWNlaG9sZGVyIHRvIGEgbmV3IHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9vbkxheW91dFN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG5cbiAgICAvLyBGaW5kIG91dCB0aGUgaXRlbSdzIG5ldyAodW5hcHBsaWVkKSBsZWZ0IGFuZCB0b3AgcG9zaXRpb24uXG4gICAgdmFyIGl0ZW1JbmRleCA9IGdyaWQuX2l0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdmFyIG5leHRMZWZ0ID0gZ3JpZC5fbGF5b3V0LnNsb3RzW2l0ZW1JbmRleCAqIDJdO1xuICAgIHZhciBuZXh0VG9wID0gZ3JpZC5fbGF5b3V0LnNsb3RzW2l0ZW1JbmRleCAqIDIgKyAxXTtcblxuICAgIC8vIElmIGl0ZW0ncyBwb3NpdGlvbiBkaWQgbm90IGNoYW5nZSBhbmQgdGhlIGl0ZW0gZGlkIG5vdCBtaWdyYXRlIHdlIGNhblxuICAgIC8vIHNhZmVseSBza2lwIGxheW91dC5cbiAgICBpZiAoIXRoaXMuX2RpZE1pZ3JhdGUgJiYgaXRlbS5fbGVmdCA9PT0gbmV4dExlZnQgJiYgaXRlbS5fdG9wID09PSBuZXh0VG9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2xvdHMgZGF0YSBpcyBjYWxjdWxhdGVkIHdpdGggaXRlbSBtYXJnaW5zIGFkZGVkIHRvIHRoZW0gc28gd2UgbmVlZCB0byBhZGRcbiAgICAvLyBpdGVtJ3MgbGVmdCBhbmQgdG9wIG1hcmdpbiB0byB0aGUgc2xvdCBkYXRhIHRvIGdldCB0aGUgcGxhY2Vob2xkZXInc1xuICAgIC8vIG5leHQgcG9zaXRpb24uXG4gICAgbmV4dExlZnQgKz0gaXRlbS5fbWFyZ2luTGVmdDtcbiAgICBuZXh0VG9wICs9IGl0ZW0uX21hcmdpblRvcDtcblxuICAgIC8vIEp1c3Qgc25hcCB0byBuZXcgcG9zaXRpb24gd2l0aG91dCBhbnkgYW5pbWF0aW9ucyBpZiBubyBhbmltYXRpb24gaXNcbiAgICAvLyByZXF1aXJlZCBvciBpZiBwbGFjZWhvbGRlciBtb3ZlcyBiZXR3ZWVuIGdyaWRzLlxuICAgIHZhciBhbmltRW5hYmxlZCA9IGdyaWQuX3NldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5kdXJhdGlvbiA+IDA7XG4gICAgaWYgKCFhbmltRW5hYmxlZCB8fCB0aGlzLl9kaWRNaWdyYXRlKSB7XG4gICAgICAvLyBDYW5jZWwgcG90ZW50aWFsIChxdWV1ZWQpIGxheW91dCB0aWNrLlxuICAgICAgY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkKTtcblxuICAgICAgLy8gU25hcCBwbGFjZWhvbGRlciB0byBjb3JyZWN0IHBvc2l0aW9uLlxuICAgICAgdmFyIHRhcmdldFN0eWxlcyA9IHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcobmV4dExlZnQsIG5leHRUb3ApIH07XG4gICAgICBpZiAodGhpcy5fYW5pbWF0ZS5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIHRoaXMuX2FuaW1hdGUuc3RvcCh0YXJnZXRTdHlsZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U3R5bGVzKHRoaXMuX2VsZW1lbnQsIHRhcmdldFN0eWxlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vdmUgcGxhY2Vob2xkZXIgaW5zaWRlIGNvcnJlY3QgY29udGFpbmVyIGFmdGVyIG1pZ3JhdGlvbi5cbiAgICAgIGlmICh0aGlzLl9kaWRNaWdyYXRlKSB7XG4gICAgICAgIGdyaWQuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICB0aGlzLl9kaWRNaWdyYXRlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFydCB0aGUgcGxhY2Vob2xkZXIncyBsYXlvdXQgYW5pbWF0aW9uIGluIHRoZSBuZXh0IHRpY2suIFdlIGRvIHRoaXMgdG9cbiAgICAvLyBhdm9pZCBsYXlvdXQgdGhyYXNoaW5nLlxuICAgIHRoaXMuX25leHRMZWZ0ID0gbmV4dExlZnQ7XG4gICAgdGhpcy5fbmV4dFRvcCA9IG5leHRUb3A7XG4gICAgYWRkUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkLCB0aGlzLl9zZXR1cEFuaW1hdGlvbiwgdGhpcy5fc3RhcnRBbmltYXRpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIHBsYWNlaG9sZGVyIGZvciBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9zZXR1cEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IHRyYW5zbGF0ZS55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9zdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0ZTtcbiAgICB2YXIgY3VycmVudExlZnQgPSB0aGlzLl9jdXJyZW50TGVmdDtcbiAgICB2YXIgY3VycmVudFRvcCA9IHRoaXMuX2N1cnJlbnRUb3A7XG4gICAgdmFyIG5leHRMZWZ0ID0gdGhpcy5fbmV4dExlZnQ7XG4gICAgdmFyIG5leHRUb3AgPSB0aGlzLl9uZXh0VG9wO1xuICAgIHZhciB0YXJnZXRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKG5leHRMZWZ0LCBuZXh0VG9wKSB9O1xuXG4gICAgLy8gSWYgcGxhY2Vob2xkZXIgaXMgYWxyZWFkeSBpbiBjb3JyZWN0IHBvc2l0aW9uIGxldCdzIGp1c3Qgc3RvcCBhbmltYXRpb25cbiAgICAvLyBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmIChjdXJyZW50TGVmdCA9PT0gbmV4dExlZnQgJiYgY3VycmVudFRvcCA9PT0gbmV4dFRvcCkge1xuICAgICAgaWYgKGFuaW1hdGlvbi5pc0FuaW1hdGluZygpKSBhbmltYXRpb24uc3RvcCh0YXJnZXRTdHlsZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBsZXQncyBzdGFydCB0aGUgYW5pbWF0aW9uLlxuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2l0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXI7XG4gICAgdmFyIGN1cnJlbnRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKGN1cnJlbnRMZWZ0LCBjdXJyZW50VG9wKSB9O1xuICAgIGFuaW1hdGlvbi5zdGFydChjdXJyZW50U3R5bGVzLCB0YXJnZXRTdHlsZXMsIHtcbiAgICAgIGR1cmF0aW9uOiBzZXR0aW5ncy5kdXJhdGlvbixcbiAgICAgIGVhc2luZzogc2V0dGluZ3MuZWFzaW5nLFxuICAgICAgb25GaW5pc2g6IHRoaXMuX29uTGF5b3V0RW5kXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExheW91dCBlbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25MYXlvdXRFbmQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fcmVzZXRBZnRlckxheW91dCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBlbmQgaGFuZGxlci4gVGhpcyBoYW5kbGVyIGlzIGNhbGxlZCB3aGVuIGRyYWdSZWxlYXNlRW5kIGV2ZW50IGlzXG4gICAqIGVtaXR0ZWQgYW5kIHJlY2VpdmVzIHRoZSBldmVudCBkYXRhIGFzIGl0J3MgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9vblJlbGVhc2VFbmQgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgaWYgKGl0ZW0uX2lkID09PSB0aGlzLl9pdGVtLl9pZCkge1xuICAgICAgLy8gSWYgdGhlIHBsYWNlaG9sZGVyIGlzIG5vdCBhbmltYXRpbmcgYW55bW9yZSB3ZSBjYW4gc2FmZWx5IHJlc2V0IGl0LlxuICAgICAgaWYgKCF0aGlzLl9hbmltYXRlLmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpdGVtIGlzIHN0aWxsIGFuaW1hdGluZyBoZXJlLCBsZXQncyB3YWl0IGZvciBpdCB0b1xuICAgICAgLy8gZmluaXNoIGl0J3MgYW5pbWF0aW9uLlxuICAgICAgdGhpcy5fcmVzZXRBZnRlckxheW91dCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBNaWdyYXRpb24gc3RhcnQgaGFuZGxlci4gVGhpcyBoYW5kbGVyIGlzIGNhbGxlZCB3aGVuIGJlZm9yZVNlbmQgZXZlbnQgaXNcbiAgICogZW1pdHRlZCBhbmQgcmVjZWl2ZXMgdGhlIGV2ZW50IGRhdGEgYXMgaXQncyBhcmd1bWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7SXRlbX0gZGF0YS5pdGVtXG4gICAqIEBwYXJhbSB7R3JpZH0gZGF0YS5mcm9tR3JpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGF0YS5mcm9tSW5kZXhcbiAgICogQHBhcmFtIHtHcmlkfSBkYXRhLnRvR3JpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGF0YS50b0luZGV4XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25NaWdyYXRlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbWF0Y2hpbmcgaXRlbS5cbiAgICBpZiAoZGF0YS5pdGVtICE9PSB0aGlzLl9pdGVtKSByZXR1cm47XG5cbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2l0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBuZXh0R3JpZCA9IGRhdGEudG9HcmlkO1xuXG4gICAgLy8gVW5iaW5kIGxpc3RlbmVycyBmcm9tIGN1cnJlbnQgZ3JpZC5cbiAgICBncmlkLm9mZihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub2ZmKGV2ZW50TGF5b3V0U3RhcnQsIHRoaXMuX29uTGF5b3V0U3RhcnQpO1xuICAgIGdyaWQub2ZmKGV2ZW50QmVmb3JlU2VuZCwgdGhpcy5fb25NaWdyYXRlKTtcblxuICAgIC8vIEJpbmQgbGlzdGVuZXJzIHRvIHRoZSBuZXh0IGdyaWQuXG4gICAgbmV4dEdyaWQub24oZXZlbnREcmFnUmVsZWFzZUVuZCwgdGhpcy5fb25SZWxlYXNlRW5kKTtcbiAgICBuZXh0R3JpZC5vbihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBuZXh0R3JpZC5vbihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBNYXJrIHRoZSBpdGVtIGFzIG1pZ3JhdGVkLlxuICAgIHRoaXMuX2RpZE1pZ3JhdGUgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgcGxhY2Vob2xkZXIuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBvbmx5IHdyaXRlcyB0byBET00gYW5kIGRvZXMgbm90XG4gICAqIHJlYWQgYW55dGhpbmcgZnJvbSBET00gc28gaXQgc2hvdWxkIG5vdCBjYXVzZSBhbnkgYWRkaXRpb25hbCBsYXlvdXRcbiAgICogdGhyYXNoaW5nIHdoZW4gaXQncyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZHJhZyBzdGFydCBwcm9jZWR1cmUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgcGxhY2Vob2xkZXIgc2V0IHVwIHdlIGNhbiBza2lwIHRoZSBpbml0aWF0aW9uIGxvZ2ljLlxuICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0ZTtcblxuICAgIC8vIENyZWF0ZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIHZhciBlbGVtZW50O1xuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50KSkge1xuICAgICAgZWxlbWVudCA9IHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50KGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIFVwZGF0ZSBlbGVtZW50IHRvIGFuaW1hdGlvbiBpbnN0YW5jZS5cbiAgICBhbmltYXRpb24uX2VsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgLy8gQWRkIHBsYWNlaG9sZGVyIGNsYXNzIHRvIHRoZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIHRoaXMuX2NsYXNzTmFtZSA9IHNldHRpbmdzLml0ZW1QbGFjZWhvbGRlckNsYXNzIHx8ICcnO1xuICAgIGlmICh0aGlzLl9jbGFzc05hbWUpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIHRoaXMuX2NsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb24gdGhlIHBsYWNlaG9sZGVyIGl0ZW0gY29ycmVjdGx5LlxuICAgIHZhciBsZWZ0ID0gaXRlbS5fbGVmdCArIGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgdmFyIHRvcCA9IGl0ZW0uX3RvcCArIGl0ZW0uX21hcmdpblRvcDtcbiAgICBzZXRTdHlsZXMoZWxlbWVudCwge1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICB3aWR0aDogaXRlbS5fd2lkdGggKyAncHgnLFxuICAgICAgaGVpZ2h0OiBpdGVtLl9oZWlnaHQgKyAncHgnLFxuICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcobGVmdCwgdG9wKVxuICAgIH0pO1xuXG4gICAgLy8gQmluZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgZ3JpZC5vbihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBncmlkLm9uKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgZ3JpZC5vbihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBvbkNyZWF0ZSBob29rLlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vbkNyZWF0ZSkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vbkNyZWF0ZShpdGVtLCBlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgdGhlIHBsYWNlaG9sZGVyIGVsZW1lbnQgdG8gdGhlIGdyaWQuXG4gICAgZ3JpZC5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBsYWNlaG9sZGVyIGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG5cbiAgICAvLyBSZXNldCBmbGFnLlxuICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcblxuICAgIC8vIENhbmNlbCBwb3RlbnRpYWwgKHF1ZXVlZCkgbGF5b3V0IHRpY2suXG4gICAgY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFJlc2V0IGFuaW1hdGlvbiBpbnN0YW5jZS5cbiAgICBhbmltYXRpb24uc3RvcCgpO1xuICAgIGFuaW1hdGlvbi5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgbGlzdGVuZXJzLlxuICAgIGdyaWQub2ZmKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgZ3JpZC5vZmYoZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgZ3JpZC5vZmYoZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGNsYXNzIGZyb20gdGhlIHBsYWNlaG9sZGVyIGVsZW1lbnQuXG4gICAgaWYgKHRoaXMuX2NsYXNzTmFtZSkge1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgdGhpcy5fY2xhc3NOYW1lKTtcbiAgICAgIHRoaXMuX2NsYXNzTmFtZSA9ICcnO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBlbGVtZW50LlxuICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcblxuICAgIC8vIG9uUmVtb3ZlIGhvb2suIE5vdGUgdGhhdCBoZXJlIHdlIHVzZSB0aGUgY3VycmVudCBncmlkJ3Mgb25SZW1vdmUgY2FsbGJhY2tcbiAgICAvLyBzbyBpZiB0aGUgaXRlbSBoYXMgbWlncmF0ZWQgZHVyaW5nIGRyYWcgdGhlIG9uUmVtb3ZlIG1ldGhvZCB3aWxsIG5vdCBiZVxuICAgIC8vIHRoZSBvcmlnaW5hdGluZyBncmlkJ3MgbWV0aG9kLlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZSkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZShpdGVtLCBlbGVtZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwbGFjZWhvbGRlcidzIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge2hlaWdodH0gaGVpZ2h0XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS51cGRhdGVEaW1lbnNpb25zID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHNldFN0eWxlcyh0aGlzLl9lbGVtZW50LCB7XG4gICAgICAgIHdpZHRoOiB3aWR0aCArICdweCcsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0ICsgJ3B4J1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwbGFjZWhvbGRlciBpcyBjdXJyZW50bHkgYWN0aXZlICh2aXNpYmxlKS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgcGxhY2Vob2xkZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHRoaXMuX2FuaW1hdGUuZGVzdHJveSgpO1xuICAgIHRoaXMuX2l0ZW0gPSB0aGlzLl9hbmltYXRlID0gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogUXVldWUgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gUXVldWUoKSB7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFkZCBjYWxsYmFjayB0byB0aGUgcXVldWUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFF1ZXVlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuX3F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHF1ZXVlIGNhbGxiYWNrcyBhbmQgcmVzZXQgdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsqfSBhcmcxXG4gICAqIEBwYXJhbSB7Kn0gYXJnMlxuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhcmcxLCBhcmcyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBsZW5ndGggPSBxdWV1ZS5sZW5ndGg7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBRdWl0IGVhcmx5IGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBpZiAoIWxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgc2luZ2xlQ2FsbGJhY2sgPSBsZW5ndGggPT09IDE7XG4gICAgdmFyIHNuYXBzaG90ID0gc2luZ2xlQ2FsbGJhY2sgPyBxdWV1ZVswXSA6IHF1ZXVlLnNsaWNlKDApO1xuXG4gICAgLy8gUmVzZXQgcXVldWUuXG4gICAgcXVldWUubGVuZ3RoID0gMDtcblxuICAgIC8vIElmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBjYWxsYmFjayBsZXQncyBqdXN0IGNhbGwgaXQuXG4gICAgaWYgKHNpbmdsZUNhbGxiYWNrKSB7XG4gICAgICBzbmFwc2hvdChhcmcxLCBhcmcyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbXVsdGlwbGUgY2FsbGJhY2tzLCBsZXQncyBwcm9jZXNzIHRoZW0uXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBzbmFwc2hvdFtpXShhcmcxLCBhcmcyKTtcbiAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgUXVldWUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFF1ZXVlLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5fcXVldWUubGVuZ3RoID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXlvdXQgbWFuYWdlciBmb3IgSXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbUxheW91dChpdGVtKSB7XG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzSW50ZXJydXB0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jdXJyZW50U3R5bGVzID0ge307XG4gICAgdGhpcy5fdGFyZ2V0U3R5bGVzID0ge307XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSAwO1xuICAgIHRoaXMuX29mZnNldExlZnQgPSAwO1xuICAgIHRoaXMuX29mZnNldFRvcCA9IDA7XG4gICAgdGhpcy5fc2tpcE5leHRBbmltYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9hbmltYXRlT3B0aW9ucyA9IHtcbiAgICAgIG9uRmluaXNoOiB0aGlzLl9maW5pc2guYmluZCh0aGlzKVxuICAgIH07XG4gICAgdGhpcy5fcXVldWUgPSBuZXcgUXVldWUoKTtcblxuICAgIC8vIEJpbmQgYW5pbWF0aW9uIGhhbmRsZXJzIGFuZCBmaW5pc2ggbWV0aG9kLlxuICAgIHRoaXMuX3NldHVwQW5pbWF0aW9uID0gdGhpcy5fc2V0dXBBbmltYXRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbiA9IHRoaXMuX3N0YXJ0QW5pbWF0aW9uLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgaXRlbSBsYXlvdXQgYmFzZWQgb24gaXQncyBjdXJyZW50IGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1MYXlvdXR9XG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcbiAgICB2YXIgZ3JpZFNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBpc1Bvc2l0aW9uaW5nID0gdGhpcy5faXNBY3RpdmU7XG4gICAgdmFyIGlzSnVzdFJlbGVhc2VkID0gcmVsZWFzZS5faXNBY3RpdmUgJiYgcmVsZWFzZS5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPT09IGZhbHNlO1xuICAgIHZhciBhbmltRHVyYXRpb24gPSBpc0p1c3RSZWxlYXNlZFxuICAgICAgPyBncmlkU2V0dGluZ3MuZHJhZ1JlbGVhc2VEdXJhdGlvblxuICAgICAgOiBncmlkU2V0dGluZ3MubGF5b3V0RHVyYXRpb247XG4gICAgdmFyIGFuaW1FYXNpbmcgPSBpc0p1c3RSZWxlYXNlZCA/IGdyaWRTZXR0aW5ncy5kcmFnUmVsZWFzZUVhc2luZyA6IGdyaWRTZXR0aW5ncy5sYXlvdXRFYXNpbmc7XG4gICAgdmFyIGFuaW1FbmFibGVkID0gIWluc3RhbnQgJiYgIXRoaXMuX3NraXBOZXh0QW5pbWF0aW9uICYmIGFuaW1EdXJhdGlvbiA+IDA7XG4gICAgdmFyIGlzQW5pbWF0aW5nO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgY3VycmVudGx5IHBvc2l0aW9uaW5nIHByb2Nlc3MgY3VycmVudCBsYXlvdXQgY2FsbGJhY2tcbiAgICAvLyBxdWV1ZSB3aXRoIGludGVycnVwdGVkIGZsYWcgb24uXG4gICAgaWYgKGlzUG9zaXRpb25pbmcpIHRoaXMuX3F1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuXG4gICAgLy8gTWFyayByZWxlYXNlIHBvc2l0aW9uaW5nIGFzIHN0YXJ0ZWQuXG4gICAgaWYgKGlzSnVzdFJlbGVhc2VkKSByZWxlYXNlLl9pc1Bvc2l0aW9uaW5nU3RhcnRlZCA9IHRydWU7XG5cbiAgICAvLyBQdXNoIHRoZSBjYWxsYmFjayB0byB0aGUgY2FsbGJhY2sgcXVldWUuXG4gICAgaWYgKGlzRnVuY3Rpb24ob25GaW5pc2gpKSB0aGlzLl9xdWV1ZS5hZGQob25GaW5pc2gpO1xuXG4gICAgLy8gSWYgbm8gYW5pbWF0aW9ucyBhcmUgbmVlZGVkLCBlYXN5IHBlYXN5IVxuICAgIGlmICghYW5pbUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZU9mZnNldHMoKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRhcmdldFN0eWxlcygpO1xuICAgICAgaXNBbmltYXRpbmcgPSBpdGVtLl9hbmltYXRlLmlzQW5pbWF0aW5nKCk7XG4gICAgICB0aGlzLnN0b3AoZmFsc2UsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICAhaXNBbmltYXRpbmcgJiYgc2V0U3R5bGVzKGVsZW1lbnQsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICB0aGlzLl9za2lwTmV4dEFuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIC8vIFNldCBpdGVtIGFjdGl2ZSBhbmQgc3RvcmUgc29tZSBkYXRhIGZvciB0aGUgYW5pbWF0aW9uIHRoYXQgaXMgYWJvdXQgdG8gYmVcbiAgICAvLyB0cmlnZ2VyZWQuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2FuaW1hdGVPcHRpb25zLmVhc2luZyA9IGFuaW1FYXNpbmc7XG4gICAgdGhpcy5fYW5pbWF0ZU9wdGlvbnMuZHVyYXRpb24gPSBhbmltRHVyYXRpb247XG4gICAgdGhpcy5faXNJbnRlcnJ1cHRlZCA9IGlzUG9zaXRpb25pbmc7XG5cbiAgICAvLyBTdGFydCB0aGUgaXRlbSdzIGxheW91dCBhbmltYXRpb24gaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRMYXlvdXRUaWNrKGl0ZW0uX2lkLCB0aGlzLl9zZXR1cEFuaW1hdGlvbiwgdGhpcy5fc3RhcnRBbmltYXRpb24pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3AgaXRlbSdzIHBvc2l0aW9uIGFuaW1hdGlvbiBpZiBpdCBpcyBjdXJyZW50bHkgYW5pbWF0aW5nLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtwcm9jZXNzQ2FsbGJhY2tRdWV1ZT1mYWxzZV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRTdHlsZXNdXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKHByb2Nlc3NDYWxsYmFja1F1ZXVlLCB0YXJnZXRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIENhbmNlbCBhbmltYXRpb24gaW5pdC5cbiAgICBjYW5jZWxMYXlvdXRUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFN0b3AgYW5pbWF0aW9uLlxuICAgIGl0ZW0uX2FuaW1hdGUuc3RvcCh0YXJnZXRTdHlsZXMpO1xuXG4gICAgLy8gUmVtb3ZlIHBvc2l0aW9uaW5nIGNsYXNzLlxuICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG5cbiAgICAvLyBSZXNldCBhY3RpdmUgc3RhdGUuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFByb2Nlc3MgY2FsbGJhY2sgcXVldWUgaWYgbmVlZGVkLlxuICAgIGlmIChwcm9jZXNzQ2FsbGJhY2tRdWV1ZSkgdGhpcy5fcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1MYXlvdXR9XG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSwge30pO1xuICAgIHRoaXMuX3F1ZXVlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pdGVtID0gdGhpcy5fY3VycmVudFN0eWxlcyA9IHRoaXMuX3RhcmdldFN0eWxlcyA9IHRoaXMuX2FuaW1hdGVPcHRpb25zID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgaXRlbSdzIGN1cnJlbnQgbGF5b3V0IG9mZnNldCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl91cGRhdGVPZmZzZXRzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIHRoaXMuX29mZnNldExlZnQgPSByZWxlYXNlLl9pc0FjdGl2ZVxuICAgICAgPyByZWxlYXNlLl9jb250YWluZXJEaWZmWFxuICAgICAgOiBtaWdyYXRlLl9pc0FjdGl2ZVxuICAgICAgPyBtaWdyYXRlLl9jb250YWluZXJEaWZmWFxuICAgICAgOiAwO1xuXG4gICAgdGhpcy5fb2Zmc2V0VG9wID0gcmVsZWFzZS5faXNBY3RpdmVcbiAgICAgID8gcmVsZWFzZS5fY29udGFpbmVyRGlmZllcbiAgICAgIDogbWlncmF0ZS5faXNBY3RpdmVcbiAgICAgID8gbWlncmF0ZS5fY29udGFpbmVyRGlmZllcbiAgICAgIDogMDtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgaXRlbSdzIGxheW91dCB0YXJnZXQgc3R5bGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl91cGRhdGVUYXJnZXRTdHlsZXMgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLl90YXJnZXRTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKFxuICAgICAgdGhpcy5faXRlbS5fbGVmdCArIHRoaXMuX29mZnNldExlZnQsXG4gICAgICB0aGlzLl9pdGVtLl90b3AgKyB0aGlzLl9vZmZzZXRUb3BcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5pc2ggaXRlbSBsYXlvdXQgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgbWlncmF0ZSA9IGl0ZW0uX21pZ3JhdGU7XG4gICAgdmFyIHJlbGVhc2UgPSBpdGVtLl9yZWxlYXNlO1xuXG4gICAgLy8gTWFyayB0aGUgaXRlbSBhcyBpbmFjdGl2ZSBhbmQgcmVtb3ZlIHBvc2l0aW9uaW5nIGNsYXNzZXMuXG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgcmVtb3ZlQ2xhc3MoaXRlbS5fZWxlbWVudCwgaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzLml0ZW1Qb3NpdGlvbmluZ0NsYXNzKTtcbiAgICB9XG5cbiAgICAvLyBGaW5pc2ggdXAgcmVsZWFzZSBhbmQgbWlncmF0aW9uLlxuICAgIGlmIChyZWxlYXNlLl9pc0FjdGl2ZSkgcmVsZWFzZS5zdG9wKCk7XG4gICAgaWYgKG1pZ3JhdGUuX2lzQWN0aXZlKSBtaWdyYXRlLnN0b3AoKTtcblxuICAgIC8vIFByb2Nlc3MgdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCBpdGVtKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJlcGFyZSBpdGVtIGZvciBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9zZXR1cEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUodGhpcy5faXRlbS5fZWxlbWVudCk7XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSB0cmFuc2xhdGUueDtcbiAgICB0aGlzLl9jdXJyZW50VG9wID0gdHJhbnNsYXRlLnk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGxheW91dCBhbmltYXRpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuX3N0YXJ0QW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcblxuICAgIC8vIExldCdzIHVwZGF0ZSB0aGUgb2Zmc2V0IGRhdGEgYW5kIHRhcmdldCBzdHlsZXMuXG4gICAgdGhpcy5fdXBkYXRlT2Zmc2V0cygpO1xuICAgIHRoaXMuX3VwZGF0ZVRhcmdldFN0eWxlcygpO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYWxyZWFkeSBpbiBjb3JyZWN0IHBvc2l0aW9uIGxldCdzIHF1aXQgZWFybHkuXG4gICAgaWYgKFxuICAgICAgaXRlbS5fbGVmdCA9PT0gdGhpcy5fY3VycmVudExlZnQgLSB0aGlzLl9vZmZzZXRMZWZ0ICYmXG4gICAgICBpdGVtLl90b3AgPT09IHRoaXMuX2N1cnJlbnRUb3AgLSB0aGlzLl9vZmZzZXRUb3BcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLl9pc0ludGVycnVwdGVkKSB0aGlzLnN0b3AoZmFsc2UsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0IGl0ZW0ncyBwb3NpdGlvbmluZyBjbGFzcyBpZiBuZWVkZWQuXG4gICAgaWYgKCF0aGlzLl9pc0ludGVycnVwdGVkKSB7XG4gICAgICBhZGRDbGFzcyhpdGVtLl9lbGVtZW50LCBzZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgc3R5bGVzIGZvciBhbmltYXRpb24uXG4gICAgdGhpcy5fY3VycmVudFN0eWxlcy50cmFuc2Zvcm0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fY3VycmVudExlZnQsIHRoaXMuX2N1cnJlbnRUb3ApO1xuXG4gICAgLy8gQW5pbWF0ZS5cbiAgICBpdGVtLl9hbmltYXRlLnN0YXJ0KHRoaXMuX2N1cnJlbnRTdHlsZXMsIHRoaXMuX3RhcmdldFN0eWxlcywgdGhpcy5fYW5pbWF0ZU9wdGlvbnMpO1xuICB9O1xuXG4gIHZhciB0ZW1wU3R5bGVzID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBtaWdyYXRlIHByb2Nlc3MgaGFuZGxlciBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbU1pZ3JhdGUoaXRlbSkge1xuICAgIC8vIFByaXZhdGUgcHJvcHMuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgdGhlIG1pZ3JhdGUgcHJvY2VzcyBvZiBhbiBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkfSB0YXJnZXRHcmlkXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gcG9zaXRpb25cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW2NvbnRhaW5lcl1cbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24odGFyZ2V0R3JpZCwgcG9zaXRpb24sIGNvbnRhaW5lcikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBpc1Zpc2libGUgPSBpdGVtLmlzVmlzaWJsZSgpO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHRhcmdldFNldHRpbmdzID0gdGFyZ2V0R3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHRhcmdldEVsZW1lbnQgPSB0YXJnZXRHcmlkLl9lbGVtZW50O1xuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRhcmdldEdyaWQuX2l0ZW1zO1xuICAgIHZhciBjdXJyZW50SW5kZXggPSBncmlkLl9pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBjb250YWluZXIgfHwgd2luZG93LmRvY3VtZW50LmJvZHk7XG4gICAgdmFyIHRhcmdldEluZGV4O1xuICAgIHZhciB0YXJnZXRJdGVtO1xuICAgIHZhciBjdXJyZW50Q29udGFpbmVyO1xuICAgIHZhciBvZmZzZXREaWZmO1xuICAgIHZhciBjb250YWluZXJEaWZmO1xuICAgIHZhciB0cmFuc2xhdGU7XG4gICAgdmFyIHRyYW5zbGF0ZVg7XG4gICAgdmFyIHRyYW5zbGF0ZVk7XG5cbiAgICAvLyBHZXQgdGFyZ2V0IGluZGV4LlxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICB0YXJnZXRJbmRleCA9IG5vcm1hbGl6ZUFycmF5SW5kZXgodGFyZ2V0SXRlbXMsIHBvc2l0aW9uLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0SXRlbSA9IHRhcmdldEdyaWQuX2dldEl0ZW0ocG9zaXRpb24pO1xuICAgICAgLyoqIEB0b2RvIENvbnNpZGVyIHRocm93aW5nIGFuIGVycm9yIGhlcmUgaW5zdGVhZCBvZiBzaWxlbnRseSBmYWlsaW5nLiAqL1xuICAgICAgaWYgKCF0YXJnZXRJdGVtKSByZXR1cm4gdGhpcztcbiAgICAgIHRhcmdldEluZGV4ID0gdGFyZ2V0SXRlbXMuaW5kZXhPZih0YXJnZXRJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHZhbHVlcyBpZiBuZWVkZWQuXG4gICAgaWYgKGl0ZW0uaXNQb3NpdGlvbmluZygpIHx8IHRoaXMuX2lzQWN0aXZlIHx8IGl0ZW0uaXNSZWxlYXNpbmcoKSkge1xuICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZS54O1xuICAgICAgdHJhbnNsYXRlWSA9IHRyYW5zbGF0ZS55O1xuICAgIH1cblxuICAgIC8vIEFib3J0IGN1cnJlbnQgcG9zaXRpb25pbmcuXG4gICAgaWYgKGl0ZW0uaXNQb3NpdGlvbmluZygpKSB7XG4gICAgICBpdGVtLl9sYXlvdXQuc3RvcCh0cnVlLCB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKHRyYW5zbGF0ZVgsIHRyYW5zbGF0ZVkpIH0pO1xuICAgIH1cblxuICAgIC8vIEFib3J0IGN1cnJlbnQgbWlncmF0aW9uLlxuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgdHJhbnNsYXRlWCAtPSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgIHRyYW5zbGF0ZVkgLT0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG4gICAgICB0aGlzLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IHJlbGVhc2UuXG4gICAgaWYgKGl0ZW0uaXNSZWxlYXNpbmcoKSkge1xuICAgICAgdHJhbnNsYXRlWCAtPSBpdGVtLl9yZWxlYXNlLl9jb250YWluZXJEaWZmWDtcbiAgICAgIHRyYW5zbGF0ZVkgLT0gaXRlbS5fcmVsZWFzZS5fY29udGFpbmVyRGlmZlk7XG4gICAgICBpdGVtLl9yZWxlYXNlLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBTdG9wIGN1cnJlbnQgdmlzaWJpbGl0eSBhbmltYXRpb25zLlxuICAgIGl0ZW0uX3Zpc2liaWxpdHkuX3N0b3BBbmltYXRpb24oKTtcblxuICAgIC8vIERlc3Ryb3kgY3VycmVudCBkcmFnLlxuICAgIGlmIChpdGVtLl9kcmFnKSBpdGVtLl9kcmFnLmRlc3Ryb3koKTtcblxuICAgIC8vIFByb2Nlc3MgY3VycmVudCB2aXNpYmlsaXR5IGFuaW1hdGlvbiBxdWV1ZS5cbiAgICBpdGVtLl92aXNpYmlsaXR5Ll9xdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKTtcblxuICAgIC8vIEVtaXQgYmVmb3JlU2VuZCBldmVudC5cbiAgICBpZiAoZ3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50QmVmb3JlU2VuZCkpIHtcbiAgICAgIGdyaWQuX2VtaXQoZXZlbnRCZWZvcmVTZW5kLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBiZWZvcmVSZWNlaXZlIGV2ZW50LlxuICAgIGlmICh0YXJnZXRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVSZWNlaXZlKSkge1xuICAgICAgdGFyZ2V0R3JpZC5fZW1pdChldmVudEJlZm9yZVJlY2VpdmUsIHtcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgZnJvbUdyaWQ6IGdyaWQsXG4gICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgY3VycmVudCBjbGFzc25hbWVzLlxuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIEFkZCBuZXcgY2xhc3NuYW1lcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCB0YXJnZXRTZXR0aW5ncy5pdGVtQ2xhc3MpO1xuICAgIGFkZENsYXNzKGVsZW1lbnQsIGlzVmlzaWJsZSA/IHRhcmdldFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiB0YXJnZXRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gTW92ZSBpdGVtIGluc3RhbmNlIGZyb20gY3VycmVudCBncmlkIHRvIHRhcmdldCBncmlkLlxuICAgIGdyaWQuX2l0ZW1zLnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xuICAgIGFycmF5SW5zZXJ0KHRhcmdldEl0ZW1zLCBpdGVtLCB0YXJnZXRJbmRleCk7XG5cbiAgICAvLyBVcGRhdGUgaXRlbSdzIGdyaWQgaWQgcmVmZXJlbmNlLlxuICAgIGl0ZW0uX2dyaWRJZCA9IHRhcmdldEdyaWQuX2lkO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgY29udGFpbmVyLlxuICAgIGN1cnJlbnRDb250YWluZXIgPSBlbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICAvLyBNb3ZlIHRoZSBpdGVtIGluc2lkZSB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpZiBpdCdzIGRpZmZlcmVudCB0aGFuIHRoZVxuICAgIC8vIGN1cnJlbnQgY29udGFpbmVyLlxuICAgIGlmICh0YXJnZXRDb250YWluZXIgIT09IGN1cnJlbnRDb250YWluZXIpIHtcbiAgICAgIHRhcmdldENvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKHRhcmdldENvbnRhaW5lciwgY3VycmVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICBpZiAoIXRyYW5zbGF0ZSkge1xuICAgICAgICB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgICAgIHRyYW5zbGF0ZVggPSB0cmFuc2xhdGUueDtcbiAgICAgICAgdHJhbnNsYXRlWSA9IHRyYW5zbGF0ZS55O1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgdHJhbnNsYXRlWCArIG9mZnNldERpZmYubGVmdCxcbiAgICAgICAgdHJhbnNsYXRlWSArIG9mZnNldERpZmYudG9wXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjaGlsZCBlbGVtZW50J3Mgc3R5bGVzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBzdGF0ZS5cbiAgICBpdGVtLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgc2V0U3R5bGVzKGl0ZW0uX2NoaWxkLCBpc1Zpc2libGUgPyB0YXJnZXRTZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogdGFyZ2V0U2V0dGluZ3MuaGlkZGVuU3R5bGVzKTtcblxuICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHN0eWxlLlxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGlzVmlzaWJsZSA/ICdibG9jaycgOiAnaGlkZGVuJztcblxuICAgIC8vIEdldCBvZmZzZXQgZGlmZiBmb3IgdGhlIG1pZ3JhdGlvbiBkYXRhLlxuICAgIGNvbnRhaW5lckRpZmYgPSBnZXRPZmZzZXREaWZmKHRhcmdldENvbnRhaW5lciwgdGFyZ2V0RWxlbWVudCwgdHJ1ZSk7XG5cbiAgICAvLyBVcGRhdGUgaXRlbSdzIGNhY2hlZCBkaW1lbnNpb25zIGFuZCBzb3J0IGRhdGEuXG4gICAgaXRlbS5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICBpdGVtLl9yZWZyZXNoU29ydERhdGEoKTtcblxuICAgIC8vIENyZWF0ZSBuZXcgZHJhZyBoYW5kbGVyLlxuICAgIGl0ZW0uX2RyYWcgPSB0YXJnZXRTZXR0aW5ncy5kcmFnRW5hYmxlZCA/IG5ldyBJdGVtRHJhZyhpdGVtKSA6IG51bGw7XG5cbiAgICAvLyBTZXR1cCBtaWdyYXRpb24gZGF0YS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5fY29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gY29udGFpbmVyRGlmZi5sZWZ0O1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gY29udGFpbmVyRGlmZi50b3A7XG5cbiAgICAvLyBFbWl0IHNlbmQgZXZlbnQuXG4gICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhldmVudFNlbmQpKSB7XG4gICAgICBncmlkLl9lbWl0KGV2ZW50U2VuZCwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgcmVjZWl2ZSBldmVudC5cbiAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50UmVjZWl2ZSkpIHtcbiAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRSZWNlaXZlLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgbWlncmF0ZSBwcm9jZXNzIG9mIGFuIGl0ZW0uIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGFib3J0IGFuXG4gICAqIG9uZ29pbmcgbWlncmF0ZSBwcm9jZXNzIChhbmltYXRpb24pIG9yIGZpbmlzaCB0aGUgbWlncmF0ZSBwcm9jZXNzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbYWJvcnQ9ZmFsc2VdXG4gICAqICAtIFNob3VsZCB0aGUgbWlncmF0aW9uIGJlIGFib3J0ZWQ/XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3VycmVudFN0eWxlc11cbiAgICogIC0gT3B0aW9uYWwgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHN0eWxlcy5cbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihhYm9ydCwgY3VycmVudFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBncmlkRWxlbWVudCA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIHRyYW5zbGF0ZTtcblxuICAgIGlmICh0aGlzLl9jb250YWluZXIgIT09IGdyaWRFbGVtZW50KSB7XG4gICAgICBpZiAoIWN1cnJlbnRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGFib3J0KSB7XG4gICAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICAgIHRlbXBTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKFxuICAgICAgICAgICAgdHJhbnNsYXRlLnggLSB0aGlzLl9jb250YWluZXJEaWZmWCxcbiAgICAgICAgICAgIHRyYW5zbGF0ZS55IC0gdGhpcy5fY29udGFpbmVyRGlmZllcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlbXBTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKGl0ZW0uX2xlZnQsIGl0ZW0uX3RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFN0eWxlcyA9IHRlbXBTdHlsZXM7XG4gICAgICB9XG4gICAgICBncmlkRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBjdXJyZW50U3R5bGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlggPSAwO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuc3RvcCh0cnVlKTtcbiAgICB0aGlzLl9pdGVtID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIHRlbXBTdHlsZXMkMSA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBwcm9jZXNzIGhhbmRsZXIgY29uc3RydWN0b3IuIEFsdGhvdWdoIHRoaXMgbWlnaHQgc2VlbSBhcyBwcm9wZXJcbiAgICogZml0IGZvciB0aGUgZHJhZyBwcm9jZXNzIHRoaXMgbmVlZHMgdG8gYmUgc2VwYXJhdGVkIGludG8gaXQncyBvd24gbG9naWNcbiAgICogYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBhIHNjZW5hcmlvIHdoZXJlIGRyYWcgaXMgZGlzYWJsZWQsIGJ1dCB0aGUgcmVsZWFzZVxuICAgKiBwcm9jZXNzIHN0aWxsIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIChkcmFnZ2luZyBmcm9tIGEgZ3JpZCB0byBhbm90aGVyKS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbVJlbGVhc2UoaXRlbSkge1xuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc1Bvc2l0aW9uaW5nU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgdGhlIHJlbGVhc2UgcHJvY2VzcyBvZiBhbiBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtUmVsZWFzZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1SZWxlYXNlfVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuXG4gICAgLy8gRmxhZyByZWxlYXNlIGFzIGFjdGl2ZS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICAvLyBBZGQgcmVsZWFzZSBjbGFzcyBuYW1lIHRvIHRoZSByZWxlYXNlZCBlbGVtZW50LlxuICAgIGFkZENsYXNzKGl0ZW0uX2VsZW1lbnQsIGdyaWQuX3NldHRpbmdzLml0ZW1SZWxlYXNpbmdDbGFzcyk7XG5cbiAgICAvLyBFbWl0IGRyYWdSZWxlYXNlU3RhcnQgZXZlbnQuXG4gICAgZ3JpZC5fZW1pdChldmVudERyYWdSZWxlYXNlU3RhcnQsIGl0ZW0pO1xuXG4gICAgLy8gUG9zaXRpb24gdGhlIHJlbGVhc2VkIGl0ZW0uXG4gICAgaXRlbS5fbGF5b3V0LnN0YXJ0KGZhbHNlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmQgdGhlIHJlbGVhc2UgcHJvY2VzcyBvZiBhbiBpdGVtLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhYm9ydCBhblxuICAgKiBvbmdvaW5nIHJlbGVhc2UgcHJvY2VzcyAoYW5pbWF0aW9uKSBvciBmaW5pc2ggdGhlIHJlbGVhc2UgcHJvY2Vzcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2Fib3J0PWZhbHNlXVxuICAgKiAgLSBTaG91bGQgdGhlIHJlbGVhc2UgYmUgYWJvcnRlZD8gV2hlbiB0cnVlLCB0aGUgcmVsZWFzZSBlbmQgZXZlbnQgd29uJ3QgYmVcbiAgICogICAgZW1pdHRlZC4gU2V0IHRvIHRydWUgb25seSB3aGVuIHlvdSBuZWVkIHRvIGFib3J0IHRoZSByZWxlYXNlIHByb2Nlc3NcbiAgICogICAgd2hpbGUgdGhlIGl0ZW0gaXMgYW5pbWF0aW5nIHRvIGl0J3MgcG9zaXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3VycmVudFN0eWxlc11cbiAgICogIC0gT3B0aW9uYWwgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHN0eWxlcy5cbiAgICogQHJldHVybnMge0l0ZW1SZWxlYXNlfVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihhYm9ydCwgY3VycmVudFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBjb250YWluZXIgPSBncmlkLl9lbGVtZW50O1xuICAgIHZhciB0cmFuc2xhdGU7XG5cbiAgICAvLyBSZXNldCBkYXRhIGFuZCByZW1vdmUgcmVsZWFzaW5nIGNsYXNzIG5hbWUgZnJvbSB0aGUgZWxlbWVudC5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gSWYgdGhlIHJlbGVhc2VkIGVsZW1lbnQgaXMgb3V0c2lkZSB0aGUgZ3JpZCdzIGNvbnRhaW5lciBlbGVtZW50IHB1dCBpdFxuICAgIC8vIGJhY2sgdGhlcmUgYW5kIGFkanVzdCBwb3NpdGlvbiBhY2NvcmRpbmdseS5cbiAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgIGlmICghY3VycmVudFN0eWxlcykge1xuICAgICAgICBpZiAoYWJvcnQpIHtcbiAgICAgICAgICB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgICAgICAgdGVtcFN0eWxlcyQxLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgICAgIHRyYW5zbGF0ZS54IC0gdGhpcy5fY29udGFpbmVyRGlmZlgsXG4gICAgICAgICAgICB0cmFuc2xhdGUueSAtIHRoaXMuX2NvbnRhaW5lckRpZmZZXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wU3R5bGVzJDEudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKGl0ZW0uX2xlZnQsIGl0ZW0uX3RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFN0eWxlcyA9IHRlbXBTdHlsZXMkMTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBjdXJyZW50U3R5bGVzKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGRyYWdSZWxlYXNlRW5kIGV2ZW50LlxuICAgIGlmICghYWJvcnQpIGdyaWQuX2VtaXQoZXZlbnREcmFnUmVsZWFzZUVuZCwgaXRlbSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSk7XG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFJlc2V0IHB1YmxpYyBkYXRhIGFuZCByZW1vdmUgcmVsZWFzaW5nIGNsYXNzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqL1xuICBJdGVtUmVsZWFzZS5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUmVsZWFzaW5nQ2xhc3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHByb3ZpZGVkIHN0eWxlcyBkZWZpbml0aW9uIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVzXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB7fTtcbiAgICBmb3IgKHZhciBwcm9wIGluIHN0eWxlcykge1xuICAgICAgY3VycmVudFtwcm9wXSA9IGdldFN0eWxlKGVsZW1lbnQsIGdldFN0eWxlTmFtZShwcm9wKSk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFZpc2liaWxpdHkgbWFuYWdlciBmb3IgSXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbVZpc2liaWxpdHkoaXRlbSkge1xuICAgIHZhciBpc0FjdGl2ZSA9IGl0ZW0uX2lzQWN0aXZlO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgc2V0dGluZ3MgPSBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3M7XG5cbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLy8gU2V0IHVwIHZpc2liaWxpdHkgc3RhdGVzLlxuICAgIHRoaXMuX2lzSGlkZGVuID0gIWlzQWN0aXZlO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNTaG93aW5nID0gZmFsc2U7XG5cbiAgICAvLyBDYWxsYmFjayBxdWV1ZS5cbiAgICB0aGlzLl9xdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXG4gICAgLy8gQmluZCBzaG93L2hpZGUgZmluaXNoZXJzLlxuICAgIHRoaXMuX2ZpbmlzaFNob3cgPSB0aGlzLl9maW5pc2hTaG93LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fZmluaXNoSGlkZSA9IHRoaXMuX2ZpbmlzaEhpZGUuYmluZCh0aGlzKTtcblxuICAgIC8vIEZvcmNlIGl0ZW0gdG8gYmUgZWl0aGVyIHZpc2libGUgb3IgaGlkZGVuIG9uIGluaXQuXG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gaXNBY3RpdmUgPyAnYmxvY2snIDogJ25vbmUnO1xuXG4gICAgLy8gU2V0IHZpc2libGUvaGlkZGVuIGNsYXNzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGlzQWN0aXZlID8gc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyA6IHNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBTZXQgaW5pdGlhbCBzdHlsZXMgZm9yIHRoZSBjaGlsZCBlbGVtZW50LlxuICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgaXNBY3RpdmUgPyBzZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogc2V0dGluZ3MuaGlkZGVuU3R5bGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTaG93IGl0ZW0uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluc3RhbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRmluaXNoXVxuICAgKiBAcmV0dXJucyB7SXRlbVZpc2liaWxpdHl9XG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIGNhbGxiYWNrID0gaXNGdW5jdGlvbihvbkZpbmlzaCkgPyBvbkZpbmlzaCA6IG51bGw7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIC8vIElmIGl0ZW0gaXMgdmlzaWJsZSBjYWxsIHRoZSBjYWxsYmFjayBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICghdGhpcy5faXNTaG93aW5nICYmICF0aGlzLl9pc0hpZGRlbikge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZmFsc2UsIGl0ZW0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBzaG93aW5nIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNob3duIGluc3RhbnRseSwgbGV0J3MganVzdFxuICAgIC8vIHB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKHRoaXMuX2lzU2hvd2luZyAmJiAhaW5zdGFudCkge1xuICAgICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGhpZGluZyBvciBoaWRkZW4gcHJvY2VzcyB0aGUgY3VycmVudCB2aXNpYmlsaXR5IGNhbGxiYWNrXG4gICAgLy8gcXVldWUgd2l0aCB0aGUgaW50ZXJydXB0ZWQgZmxhZyBhY3RpdmUsIHVwZGF0ZSBjbGFzc2VzIGFuZCBzZXQgZGlzcGxheVxuICAgIC8vIHRvIGJsb2NrIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoIXRoaXMuX2lzU2hvd2luZykge1xuICAgICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG4gICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgICBpZiAoIXRoaXMuX2lzSGlkaW5nKSBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG5cbiAgICAvLyBVcGRhdGUgdmlzaWJpbGl0eSBzdGF0ZXMuXG4gICAgaXRlbS5faXNBY3RpdmUgPSB0aGlzLl9pc1Nob3dpbmcgPSB0cnVlO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gdGhpcy5faXNIaWRkZW4gPSBmYWxzZTtcblxuICAgIC8vIEZpbmFsbHkgbGV0J3Mgc3RhcnQgc2hvdyBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24odHJ1ZSwgaW5zdGFudCwgdGhpcy5fZmluaXNoU2hvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogSGlkZSBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1WaXNpYmlsaXR5fVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24ob25GaW5pc2gpID8gb25GaW5pc2ggOiBudWxsO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBJZiBpdGVtIGlzIGFscmVhZHkgaGlkZGVuIGNhbGwgdGhlIGNhbGxiYWNrIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKCF0aGlzLl9pc0hpZGluZyAmJiB0aGlzLl9pc0hpZGRlbikge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZmFsc2UsIGl0ZW0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBoaWRpbmcgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgaGlkZGVuIGluc3RhbnRseSwgbGV0J3MganVzdFxuICAgIC8vIHB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKHRoaXMuX2lzSGlkaW5nICYmICFpbnN0YW50KSB7XG4gICAgICBjYWxsYmFjayAmJiBxdWV1ZS5hZGQoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgc2hvd2luZyBvciB2aXNpYmxlIHByb2Nlc3MgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBjYWxsYmFja1xuICAgIC8vIHF1ZXVlIHdpdGggdGhlIGludGVycnVwdGVkIGZsYWcgYWN0aXZlLCB1cGRhdGUgY2xhc3NlcyBhbmQgc2V0IGRpc3BsYXlcbiAgICAvLyB0byBibG9jayBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKCF0aGlzLl9pc0hpZGluZykge1xuICAgICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gUHVzaCBjYWxsYmFjayB0byB0aGUgY2FsbGJhY2sgcXVldWUuXG4gICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcblxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IHN0YXRlcy5cbiAgICB0aGlzLl9pc0hpZGRlbiA9IHRoaXMuX2lzSGlkaW5nID0gdHJ1ZTtcbiAgICBpdGVtLl9pc0FjdGl2ZSA9IHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuXG4gICAgLy8gRmluYWxseSBsZXQncyBzdGFydCBoaWRlIGFuaW1hdGlvbi5cbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbihmYWxzZSwgaW5zdGFudCwgdGhpcy5fZmluaXNoSGlkZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtVmlzaWJpbGl0eX1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIC8vIFN0b3AgdmlzaWJpbGl0eSBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RvcEFuaW1hdGlvbih7fSk7XG5cbiAgICAvLyBGaXJlIGFsbCB1bmNvbXBsZXRlZCBjYWxsYmFja3Mgd2l0aCBpbnRlcnJ1cHRlZCBmbGFnIGFuZCBkZXN0cm95IHRoZSBxdWV1ZS5cbiAgICBxdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKS5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgdmlzaWJsZS9oaWRkZW4gY2xhc3Nlcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgc3RhdGUuXG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNIaWRpbmcgPSB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRoaXMuX2lzSGlkZGVuID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9WaXNpYmxlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luc3RhbnRdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbih0b1Zpc2libGUsIGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIHNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRTdHlsZXMgPSB0b1Zpc2libGUgPyBzZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogc2V0dGluZ3MuaGlkZGVuU3R5bGVzO1xuICAgIHZhciBkdXJhdGlvbiA9IHBhcnNlSW50KHRvVmlzaWJsZSA/IHNldHRpbmdzLnNob3dEdXJhdGlvbiA6IHNldHRpbmdzLmhpZGVEdXJhdGlvbikgfHwgMDtcbiAgICB2YXIgZWFzaW5nID0gKHRvVmlzaWJsZSA/IHNldHRpbmdzLnNob3dFYXNpbmcgOiBzZXR0aW5ncy5oaWRlRWFzaW5nKSB8fCAnZWFzZSc7XG4gICAgdmFyIGlzSW5zdGFudCA9IGluc3RhbnQgfHwgZHVyYXRpb24gPD0gMDtcbiAgICB2YXIgY3VycmVudFN0eWxlcztcblxuICAgIC8vIE5vIHRhcmdldCBzdHlsZXM/IExldCdzIHF1aXQgZWFybHkuXG4gICAgaWYgKCF0YXJnZXRTdHlsZXMpIHtcbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCB2aXNpYmlsaXR5IHRpY2suXG4gICAgY2FuY2VsVmlzaWJpbGl0eVRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gSWYgd2UgbmVlZCB0byBhcHBseSB0aGUgc3R5bGVzIGluc3RhbnRseSB3aXRob3V0IGFuaW1hdGlvbi5cbiAgICBpZiAoaXNJbnN0YW50KSB7XG4gICAgICBpZiAoaXRlbS5fYW5pbWF0ZUNoaWxkLmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgdGFyZ2V0U3R5bGVzKTtcbiAgICAgIH1cbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbiBpbiB0aGUgbmV4dCB0aWNrICh0byBhdm9pZCBsYXlvdXQgdGhyYXNoaW5nKS5cbiAgICBhZGRWaXNpYmlsaXR5VGljayhcbiAgICAgIGl0ZW0uX2lkLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSBnZXRDdXJyZW50U3R5bGVzKGl0ZW0uX2NoaWxkLCB0YXJnZXRTdHlsZXMpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBpdGVtLl9hbmltYXRlQ2hpbGQuc3RhcnQoY3VycmVudFN0eWxlcywgdGFyZ2V0U3R5bGVzLCB7XG4gICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogZWFzaW5nLFxuICAgICAgICAgIG9uRmluaXNoOiBvbkZpbmlzaFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9wIHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0U3R5bGVzXVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLl9zdG9wQW5pbWF0aW9uID0gZnVuY3Rpb24odGFyZ2V0U3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIGNhbmNlbFZpc2liaWxpdHlUaWNrKGl0ZW0uX2lkKTtcbiAgICBpdGVtLl9hbmltYXRlQ2hpbGQuc3RvcCh0YXJnZXRTdHlsZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5pc2ggc2hvdyBwcm9jZWR1cmUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fZmluaXNoU2hvdyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0hpZGRlbikgcmV0dXJuO1xuICAgIHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCB0aGlzLl9pdGVtKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIGhpZGUgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqL1xuICB2YXIgZmluaXNoU3R5bGVzID0ge307XG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fZmluaXNoSGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5faXNIaWRkZW4pIHJldHVybjtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdGhpcy5faXNIaWRpbmcgPSBmYWxzZTtcbiAgICBmaW5pc2hTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKDAsIDApO1xuICAgIGl0ZW0uX2xheW91dC5zdG9wKHRydWUsIGZpbmlzaFN0eWxlcyk7XG4gICAgaXRlbS5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCBpdGVtKTtcbiAgfTtcblxuICB2YXIgaWQgPSAwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWVyaWMgaWQgKGluY3JlbWVudHMgYSBiYXNlIHZhbHVlIG9uIGV2ZXJ5IGNhbGwpLlxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlVWlkKCkge1xuICAgIHJldHVybiArK2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgSXRlbSBpbnN0YW5jZSBmb3IgYSBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtHcmlkfSBncmlkXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbaXNBY3RpdmVdXG4gICAqL1xuICBmdW5jdGlvbiBJdGVtKGdyaWQsIGVsZW1lbnQsIGlzQWN0aXZlKSB7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2UgaWQuXG4gICAgdGhpcy5faWQgPSBjcmVhdGVVaWQoKTtcblxuICAgIC8vIFJlZmVyZW5jZSB0byBjb25uZWN0ZWQgR3JpZCBpbnN0YW5jZSdzIGlkLlxuICAgIHRoaXMuX2dyaWRJZCA9IGdyaWQuX2lkO1xuXG4gICAgLy8gRGVzdHJveWVkIGZsYWcuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFNldCB1cCBpbml0aWFsIHBvc2l0aW9ucy5cbiAgICB0aGlzLl9sZWZ0ID0gMDtcbiAgICB0aGlzLl90b3AgPSAwO1xuXG4gICAgLy8gVGhlIGVsZW1lbnRzLlxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2NoaWxkID0gZWxlbWVudC5jaGlsZHJlblswXTtcblxuICAgIC8vIElmIHRoZSBwcm92aWRlZCBpdGVtIGVsZW1lbnQgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBncmlkIGNvbnRhaW5lclxuICAgIC8vIGVsZW1lbnQsIGFwcGVuZCBpdCB0byB0aGUgZ3JpZCBjb250YWluZXIuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gZ3JpZC5fZWxlbWVudCkge1xuICAgICAgZ3JpZC5fZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBTZXQgaXRlbSBjbGFzcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuXG4gICAgLy8gSWYgaXNBY3RpdmUgaXMgbm90IGRlZmluZWQsIGxldCdzIHRyeSB0byBhdXRvLWRldGVjdCBpdC5cbiAgICBpZiAodHlwZW9mIGlzQWN0aXZlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIGlzQWN0aXZlID0gZ2V0U3R5bGUoZWxlbWVudCwgJ2Rpc3BsYXknKSAhPT0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBhY3RpdmUgc3RhdGUgKGRlZmluZXMgaWYgdGhlIGl0ZW0gaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBsYXlvdXRcbiAgICAvLyBvciBub3QpLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gaXNBY3RpdmU7XG5cbiAgICAvLyBTZXQgZWxlbWVudCdzIGluaXRpYWwgcG9zaXRpb24gc3R5bGVzLlxuICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICcwJztcbiAgICBlbGVtZW50LnN0eWxlLnRvcCA9ICcwJztcbiAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKDAsIDApO1xuXG4gICAgLy8gSW5pdGlhdGUgaXRlbSdzIGFuaW1hdGlvbiBjb250cm9sbGVycy5cbiAgICB0aGlzLl9hbmltYXRlID0gbmV3IEl0ZW1BbmltYXRlKGVsZW1lbnQpO1xuICAgIHRoaXMuX2FuaW1hdGVDaGlsZCA9IG5ldyBJdGVtQW5pbWF0ZSh0aGlzLl9jaGlsZCk7XG5cbiAgICAvLyBTZXR1cCB2aXNpYmlsaXR5IGhhbmRsZXIuXG4gICAgdGhpcy5fdmlzaWJpbGl0eSA9IG5ldyBJdGVtVmlzaWJpbGl0eSh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBsYXlvdXQgaGFuZGxlci5cbiAgICB0aGlzLl9sYXlvdXQgPSBuZXcgSXRlbUxheW91dCh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBtaWdyYXRpb24gaGFuZGxlciBkYXRhLlxuICAgIHRoaXMuX21pZ3JhdGUgPSBuZXcgSXRlbU1pZ3JhdGUodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgcmVsZWFzZSBoYW5kbGVyLiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBpcyBmdWxseSBsaW5rZWQgdG8gZHJhZ2dpbmdcbiAgICAvLyB0aGlzIHN0aWxsIG5lZWRzIHRvIGJlIGFsd2F5cyBpbnN0YW50aWF0ZWQgdG8gaGFuZGxlIG1pZ3JhdGlvbiBzY2VuYXJpb3NcbiAgICAvLyBjb3JyZWN0bHkuXG4gICAgdGhpcy5fcmVsZWFzZSA9IG5ldyBJdGVtUmVsZWFzZSh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBkcmFnIHBsYWNlaG9sZGVyIGhhbmRsZXIuIE5vdGUgdGhhdCBhbHRob3VnaCB0aGlzIGlzIGZ1bGx5IGxpbmtlZCB0b1xuICAgIC8vIGRyYWdnaW5nIHRoaXMgc3RpbGwgbmVlZHMgdG8gYmUgYWx3YXlzIGluc3RhbnRpYXRlZCB0byBoYW5kbGUgbWlncmF0aW9uXG4gICAgLy8gc2NlbmFyaW9zIGNvcnJlY3RseS5cbiAgICB0aGlzLl9kcmFnUGxhY2Vob2xkZXIgPSBuZXcgSXRlbURyYWdQbGFjZWhvbGRlcih0aGlzKTtcblxuICAgIC8vIFNldCB1cCBkcmFnIGhhbmRsZXIuXG4gICAgdGhpcy5fZHJhZyA9IHNldHRpbmdzLmRyYWdFbmFibGVkID8gbmV3IEl0ZW1EcmFnKHRoaXMpIDogbnVsbDtcblxuICAgIC8vIFNldCB1cCB0aGUgaW5pdGlhbCBkaW1lbnNpb25zIGFuZCBzb3J0IGRhdGEuXG4gICAgdGhpcy5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9yZWZyZXNoU29ydERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIGdyaWQgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEdyaWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZ3JpZEluc3RhbmNlc1t0aGlzLl9ncmlkSWRdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgd2lkdGguXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgaGVpZ2h0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgbWFyZ2lucy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogICAtIFRoZSByZXR1cm5lZCBvYmplY3QgY29udGFpbnMgbGVmdCwgcmlnaHQsIHRvcCBhbmQgYm90dG9tIHByb3BlcnRpZXNcbiAgICogICAgIHdoaWNoIGluZGljYXRlIHRoZSBpdGVtIGVsZW1lbnQncyBjYWNoZWQgbWFyZ2lucy5cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldE1hcmdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiB0aGlzLl9tYXJnaW5MZWZ0LFxuICAgICAgcmlnaHQ6IHRoaXMuX21hcmdpblJpZ2h0LFxuICAgICAgdG9wOiB0aGlzLl9tYXJnaW5Ub3AsXG4gICAgICBib3R0b206IHRoaXMuX21hcmdpbkJvdHRvbVxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKiAgIC0gVGhlIHJldHVybmVkIG9iamVjdCBjb250YWlucyBsZWZ0IGFuZCB0b3AgcHJvcGVydGllcyB3aGljaCBpbmRpY2F0ZSB0aGVcbiAgICogICAgIGl0ZW0gZWxlbWVudCdzIGNhY2hlZCBwb3NpdGlvbiBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IHRoaXMuX2xlZnQsXG4gICAgICB0b3A6IHRoaXMuX3RvcFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGFjdGl2ZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gdmlzaWJsZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Zpc2libGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl92aXNpYmlsaXR5ICYmICF0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGRlbjtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgYW5pbWF0ZWQgdG8gdmlzaWJsZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Nob3dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fdmlzaWJpbGl0eSAmJiB0aGlzLl92aXNpYmlsaXR5Ll9pc1Nob3dpbmcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyBhbmltYXRlZCB0byBoaWRkZW4/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNIaWRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fdmlzaWJpbGl0eSAmJiB0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGluZyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIHBvc2l0aW9uaW5nP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzUG9zaXRpb25pbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fbGF5b3V0ICYmIHRoaXMuX2xheW91dC5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyBkcmFnZ2VkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzRHJhZ2dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fZHJhZyAmJiB0aGlzLl9kcmFnLl9pc0FjdGl2ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGJlaW5nIHJlbGVhc2VkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzUmVsZWFzaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3JlbGVhc2UgJiYgdGhpcy5fcmVsZWFzZS5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBkZXN0cm95ZWQ/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNEZXN0cm95ZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZXN0cm95ZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogUmVjYWxjdWxhdGUgaXRlbSdzIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuX3JlZnJlc2hEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX3Zpc2liaWxpdHkuX2lzSGlkZGVuKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGRyYWdQbGFjZWhvbGRlciA9IHRoaXMuX2RyYWdQbGFjZWhvbGRlcjtcbiAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodC5cbiAgICB0aGlzLl93aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgdGhpcy5faGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgbWFyZ2lucyAoaWdub3JlIG5lZ2F0aXZlIG1hcmdpbnMpLlxuICAgIHRoaXMuX21hcmdpbkxlZnQgPSBNYXRoLm1heCgwLCBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ21hcmdpbi1sZWZ0JykpO1xuICAgIHRoaXMuX21hcmdpblJpZ2h0ID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tcmlnaHQnKSk7XG4gICAgdGhpcy5fbWFyZ2luVG9wID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tdG9wJykpO1xuICAgIHRoaXMuX21hcmdpbkJvdHRvbSA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLWJvdHRvbScpKTtcblxuICAgIC8vIEtlZXAgZHJhZyBwbGFjZWhvbGRlcidzIGRpbWVuc2lvbnMgc3luY2VkIHdpdGggdGhlIGl0ZW0ncy5cbiAgICBpZiAoZHJhZ1BsYWNlaG9sZGVyKSB7XG4gICAgICBkcmFnUGxhY2Vob2xkZXIudXBkYXRlRGltZW5zaW9ucyh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGFuZCBzdG9yZSBpdGVtJ3Mgc29ydCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9yZWZyZXNoU29ydERhdGEgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBkYXRhID0gKHRoaXMuX3NvcnREYXRhID0ge30pO1xuICAgIHZhciBnZXR0ZXJzID0gdGhpcy5nZXRHcmlkKCkuX3NldHRpbmdzLnNvcnREYXRhO1xuICAgIHZhciBwcm9wO1xuXG4gICAgZm9yIChwcm9wIGluIGdldHRlcnMpIHtcbiAgICAgIGRhdGFbcHJvcF0gPSBnZXR0ZXJzW3Byb3BdKHRoaXMsIHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpdGVtIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcmVtb3ZlRWxlbWVudD1mYWxzZV1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24ocmVtb3ZlRWxlbWVudCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gdGhpcy5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGluZGV4ID0gZ3JpZC5faXRlbXMuaW5kZXhPZih0aGlzKTtcblxuICAgIC8vIERlc3Ryb3kgaGFuZGxlcnMuXG4gICAgdGhpcy5fcmVsZWFzZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fbWlncmF0ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fbGF5b3V0LmRlc3Ryb3koKTtcbiAgICB0aGlzLl92aXNpYmlsaXR5LmRlc3Ryb3koKTtcbiAgICB0aGlzLl9hbmltYXRlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9hbmltYXRlQ2hpbGQuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RyYWdQbGFjZWhvbGRlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fZHJhZyAmJiB0aGlzLl9kcmFnLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSBhbGwgaW5saW5lIHN0eWxlcy5cbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICB0aGlzLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAvLyBSZW1vdmUgaXRlbSBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuXG4gICAgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBHcmlkIGluc3RhbmNlIGlmIGl0IHN0aWxsIGV4aXN0cyB0aGVyZS5cbiAgICBpbmRleCA+IC0xICYmIGdyaWQuX2l0ZW1zLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZW1vdmUgZWxlbWVudCBmcm9tIERPTS5cbiAgICByZW1vdmVFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcblxuICAgIC8vIFJlc2V0IHN0YXRlLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGxheW91dCBhbGdvcml0aG0gZm9yIE11dXJpLiBCYXNlZCBvbiBNQVhSRUNUUyBhcHByb2FjaFxuICAgKiBhcyBkZXNjcmliZWQgYnkgSnVra2EgSnlsw6Rua2kgaW4gaGlzIHN1cnZleTogXCJBIFRob3VzYW5kIFdheXMgdG8gUGFjayB0aGVcbiAgICogQmluIC0gQSBQcmFjdGljYWwgQXBwcm9hY2ggdG8gVHdvLURpbWVuc2lvbmFsIFJlY3RhbmdsZSBCaW4gUGFja2luZy5cIi5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqL1xuICBmdW5jdGlvbiBQYWNrZXIoKSB7XG4gICAgdGhpcy5fc2xvdHMgPSBbXTtcbiAgICB0aGlzLl9zbG90U2l6ZXMgPSBbXTtcbiAgICB0aGlzLl9mcmVlU2xvdHMgPSBbXTtcbiAgICB0aGlzLl9uZXdTbG90cyA9IFtdO1xuICAgIHRoaXMuX3JlY3RJdGVtID0ge307XG4gICAgdGhpcy5fcmVjdFN0b3JlID0gW107XG4gICAgdGhpcy5fcmVjdElkID0gMDtcblxuICAgIC8vIFRoZSBsYXlvdXQgcmV0dXJuIGRhdGEsIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIGluIGdldExheW91dC5cbiAgICB0aGlzLl9sYXlvdXQgPSB7XG4gICAgICBzbG90czogbnVsbCxcbiAgICAgIHNldFdpZHRoOiBmYWxzZSxcbiAgICAgIHNldEhlaWdodDogZmFsc2UsXG4gICAgICB3aWR0aDogZmFsc2UsXG4gICAgICBoZWlnaHQ6IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIEJpbmQgc29ydCBoYW5kbGVycy5cbiAgICB0aGlzLl9zb3J0UmVjdHNMZWZ0VG9wID0gdGhpcy5fc29ydFJlY3RzTGVmdFRvcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3NvcnRSZWN0c1RvcExlZnQgPSB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0l0ZW1bXX0gaXRlbXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICogQHBhcmFtIHtOdW1iZXJbXX0gW3Nsb3RzXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmlsbEdhcHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9yaXpvbnRhbD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGlnblJpZ2h0PWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFsaWduQm90dG9tPWZhbHNlXVxuICAgKiBAcmV0dXJucyB7TGF5b3V0RGF0YX1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuZ2V0TGF5b3V0ID0gZnVuY3Rpb24oaXRlbXMsIHdpZHRoLCBoZWlnaHQsIHNsb3RzLCBvcHRpb25zKSB7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICB2YXIgZmlsbEdhcHMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuZmlsbEdhcHMpO1xuICAgIHZhciBpc0hvcml6b250YWwgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuaG9yaXpvbnRhbCk7XG4gICAgdmFyIGFsaWduUmlnaHQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuYWxpZ25SaWdodCk7XG4gICAgdmFyIGFsaWduQm90dG9tID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmFsaWduQm90dG9tKTtcbiAgICB2YXIgcm91bmRpbmcgPSAhIShvcHRpb25zICYmIG9wdGlvbnMucm91bmRpbmcpO1xuICAgIHZhciBzbG90U2l6ZXMgPSB0aGlzLl9zbG90U2l6ZXM7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZXNldCBsYXlvdXQgZGF0YS5cbiAgICBsYXlvdXQuc2xvdHMgPSBzbG90cyA/IHNsb3RzIDogdGhpcy5fc2xvdHM7XG4gICAgbGF5b3V0LndpZHRoID0gaXNIb3Jpem9udGFsID8gMCA6IHJvdW5kaW5nID8gTWF0aC5yb3VuZCh3aWR0aCkgOiB3aWR0aDtcbiAgICBsYXlvdXQuaGVpZ2h0ID0gIWlzSG9yaXpvbnRhbCA/IDAgOiByb3VuZGluZyA/IE1hdGgucm91bmQoaGVpZ2h0KSA6IGhlaWdodDtcbiAgICBsYXlvdXQuc2V0V2lkdGggPSBpc0hvcml6b250YWw7XG4gICAgbGF5b3V0LnNldEhlaWdodCA9ICFpc0hvcml6b250YWw7XG5cbiAgICAvLyBNYWtlIHN1cmUgc2xvdHMgYW5kIHNsb3Qgc2l6ZSBhcnJheXMgYXJlIHJlc2V0LlxuICAgIGxheW91dC5zbG90cy5sZW5ndGggPSAwO1xuICAgIHNsb3RTaXplcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gTm8gbmVlZCB0byBnbyBmdXJ0aGVyIGlmIGl0ZW1zIGRvIG5vdCBleGlzdC5cbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIGxheW91dDtcblxuICAgIC8vIEZpbmQgc2xvdHMgZm9yIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fYWRkU2xvdChpdGVtc1tpXSwgaXNIb3Jpem9udGFsLCBmaWxsR2Fwcywgcm91bmRpbmcsIGFsaWduUmlnaHQgfHwgYWxpZ25Cb3R0b20pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbGlnbm1lbnQgaXMgc2V0IHRvIHJpZ2h0IHdlIG5lZWQgdG8gYWRqdXN0IHRoZSByZXN1bHRzLlxuICAgIGlmIChhbGlnblJpZ2h0KSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5b3V0LnNsb3RzLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgIGxheW91dC5zbG90c1tpXSA9IGxheW91dC53aWR0aCAtIChsYXlvdXQuc2xvdHNbaV0gKyBzbG90U2l6ZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbGlnbm1lbnQgaXMgc2V0IHRvIGJvdHRvbSB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgcmVzdWx0cy5cbiAgICBpZiAoYWxpZ25Cb3R0b20pIHtcbiAgICAgIGZvciAoaSA9IDE7IGkgPCBsYXlvdXQuc2xvdHMubGVuZ3RoOyBpID0gaSArIDIpIHtcbiAgICAgICAgbGF5b3V0LnNsb3RzW2ldID0gbGF5b3V0LmhlaWdodCAtIChsYXlvdXQuc2xvdHNbaV0gKyBzbG90U2l6ZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2V0IHNsb3RzIGFycmF5cyBhbmQgcmVjdCBpZC5cbiAgICBzbG90U2l6ZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmVlU2xvdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9uZXdTbG90cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3JlY3RJZCA9IDA7XG5cbiAgICByZXR1cm4gbGF5b3V0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgcG9zaXRpb24gZm9yIHRoZSBsYXlvdXQgaXRlbS4gUmV0dXJucyB0aGUgbGVmdCBhbmQgdG9wIHBvc2l0aW9uXG4gICAqIG9mIHRoZSBpdGVtIGluIHBpeGVscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNIb3Jpem9udGFsXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmlsbEdhcHNcbiAgICogQHBhcmFtIHtCb29sZWFufSByb3VuZGluZ1xuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9hZGRTbG90ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBlcHMgPSAwLjAwMTtcbiAgICB2YXIgaXRlbVNsb3QgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSwgaXNIb3Jpem9udGFsLCBmaWxsR2Fwcywgcm91bmRpbmcsIHRyYWNrU2l6ZSkge1xuICAgICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICAgIHZhciBmcmVlU2xvdHMgPSB0aGlzLl9mcmVlU2xvdHM7XG4gICAgICB2YXIgbmV3U2xvdHMgPSB0aGlzLl9uZXdTbG90cztcbiAgICAgIHZhciByZWN0O1xuICAgICAgdmFyIHJlY3RJZDtcbiAgICAgIHZhciBwb3RlbnRpYWxTbG90cztcbiAgICAgIHZhciBpZ25vcmVDdXJyZW50U2xvdHM7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBpaTtcblxuICAgICAgLy8gUmVzZXQgbmV3IHNsb3RzLlxuICAgICAgbmV3U2xvdHMubGVuZ3RoID0gMDtcblxuICAgICAgLy8gU2V0IGl0ZW0gc2xvdCBpbml0aWFsIGRhdGEuXG4gICAgICBpdGVtU2xvdC5sZWZ0ID0gbnVsbDtcbiAgICAgIGl0ZW1TbG90LnRvcCA9IG51bGw7XG4gICAgICBpdGVtU2xvdC53aWR0aCA9IGl0ZW0uX3dpZHRoICsgaXRlbS5fbWFyZ2luTGVmdCArIGl0ZW0uX21hcmdpblJpZ2h0O1xuICAgICAgaXRlbVNsb3QuaGVpZ2h0ID0gaXRlbS5faGVpZ2h0ICsgaXRlbS5fbWFyZ2luVG9wICsgaXRlbS5fbWFyZ2luQm90dG9tO1xuXG4gICAgICAvLyBSb3VuZCBpdGVtIHNsb3Qgd2lkdGggYW5kIGhlaWdodCBpZiBuZWVkZWQuXG4gICAgICBpZiAocm91bmRpbmcpIHtcbiAgICAgICAgaXRlbVNsb3Qud2lkdGggPSBNYXRoLnJvdW5kKGl0ZW1TbG90LndpZHRoKTtcbiAgICAgICAgaXRlbVNsb3QuaGVpZ2h0ID0gTWF0aC5yb3VuZChpdGVtU2xvdC5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgdG8gZmluZCBhIHNsb3QgZm9yIHRoZSBpdGVtLlxuICAgICAgZm9yIChpID0gMDsgaSA8IGZyZWVTbG90cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZWN0SWQgPSBmcmVlU2xvdHNbaV07XG4gICAgICAgIGlmICghcmVjdElkKSBjb250aW51ZTtcbiAgICAgICAgcmVjdCA9IHRoaXMuX2dldFJlY3QocmVjdElkKTtcbiAgICAgICAgaWYgKGl0ZW1TbG90LndpZHRoIDw9IHJlY3Qud2lkdGggKyBlcHMgJiYgaXRlbVNsb3QuaGVpZ2h0IDw9IHJlY3QuaGVpZ2h0ICsgZXBzKSB7XG4gICAgICAgICAgaXRlbVNsb3QubGVmdCA9IHJlY3QubGVmdDtcbiAgICAgICAgICBpdGVtU2xvdC50b3AgPSByZWN0LnRvcDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBzbG90IHdhcyBmb3VuZCBmb3IgdGhlIGl0ZW0uXG4gICAgICBpZiAoaXRlbVNsb3QubGVmdCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBQb3NpdGlvbiB0aGUgaXRlbSBpbiB0byB0aGUgYm90dG9tIGxlZnQgKHZlcnRpY2FsIG1vZGUpIG9yIHRvcCByaWdodFxuICAgICAgICAvLyAoaG9yaXpvbnRhbCBtb2RlKSBvZiB0aGUgZ3JpZC5cbiAgICAgICAgaXRlbVNsb3QubGVmdCA9ICFpc0hvcml6b250YWwgPyAwIDogbGF5b3V0LndpZHRoO1xuICAgICAgICBpdGVtU2xvdC50b3AgPSAhaXNIb3Jpem9udGFsID8gbGF5b3V0LmhlaWdodCA6IDA7XG5cbiAgICAgICAgLy8gSWYgZ2FwcyBkb24ndCBuZWVkIGZpbGxpbmcgZG8gbm90IGFkZCBhbnkgY3VycmVudCBzbG90cyB0byB0aGUgbmV3XG4gICAgICAgIC8vIHNsb3RzIGFycmF5LlxuICAgICAgICBpZiAoIWZpbGxHYXBzKSB7XG4gICAgICAgICAgaWdub3JlQ3VycmVudFNsb3RzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJbiB2ZXJ0aWNhbCBtb2RlLCBpZiB0aGUgaXRlbSdzIGJvdHRvbSBvdmVybGFwcyB0aGUgZ3JpZCdzIGJvdHRvbS5cbiAgICAgIGlmICghaXNIb3Jpem9udGFsICYmIGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCA+IGxheW91dC5oZWlnaHQpIHtcbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgbGVmdCBlZGdlLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgPiAwKSB7XG4gICAgICAgICAgbmV3U2xvdHMucHVzaCh0aGlzLl9hZGRSZWN0KDAsIGxheW91dC5oZWlnaHQsIGl0ZW1TbG90LmxlZnQsIEluZmluaXR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpdGVtIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSByaWdodCBlZGdlLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aCA8IGxheW91dC53aWR0aCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgICBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGgsXG4gICAgICAgICAgICAgIGxheW91dC5oZWlnaHQsXG4gICAgICAgICAgICAgIGxheW91dC53aWR0aCAtIGl0ZW1TbG90LmxlZnQgLSBpdGVtU2xvdC53aWR0aCxcbiAgICAgICAgICAgICAgSW5maW5pdHlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGdyaWQgaGVpZ2h0LlxuICAgICAgICBsYXlvdXQuaGVpZ2h0ID0gaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBob3Jpem9udGFsIG1vZGUsIGlmIHRoZSBpdGVtJ3MgcmlnaHQgb3ZlcmxhcHMgdGhlIGdyaWQncyByaWdodCBlZGdlLlxuICAgICAgaWYgKGlzSG9yaXpvbnRhbCAmJiBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGggPiBsYXlvdXQud2lkdGgpIHtcbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgdG9wLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LnRvcCA+IDApIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKHRoaXMuX2FkZFJlY3QobGF5b3V0LndpZHRoLCAwLCBJbmZpbml0eSwgaXRlbVNsb3QudG9wKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpdGVtIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSBib3R0b20sIGNyZWF0ZSBhIG5ldyBzbG90LlxuICAgICAgICBpZiAoaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0IDwgbGF5b3V0LmhlaWdodCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgICBsYXlvdXQud2lkdGgsXG4gICAgICAgICAgICAgIGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCxcbiAgICAgICAgICAgICAgSW5maW5pdHksXG4gICAgICAgICAgICAgIGxheW91dC5oZWlnaHQgLSBpdGVtU2xvdC50b3AgLSBpdGVtU2xvdC5oZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGdyaWQgd2lkdGguXG4gICAgICAgIGxheW91dC53aWR0aCA9IGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW4gdXAgdGhlIGN1cnJlbnQgc2xvdHMgbWFraW5nIHN1cmUgdGhlcmUgYXJlIG5vIG9sZCBzbG90cyB0aGF0XG4gICAgICAvLyBvdmVybGFwIHdpdGggdGhlIGl0ZW0uIElmIGFuIG9sZCBzbG90IG92ZXJsYXBzIHdpdGggdGhlIGl0ZW0sIHNwbGl0IGl0XG4gICAgICAvLyBpbnRvIHNtYWxsZXIgc2xvdHMgaWYgbmVjZXNzYXJ5LlxuICAgICAgZm9yIChpID0gZmlsbEdhcHMgPyAwIDogaWdub3JlQ3VycmVudFNsb3RzID8gZnJlZVNsb3RzLmxlbmd0aCA6IGk7IGkgPCBmcmVlU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVjdElkID0gZnJlZVNsb3RzW2ldO1xuICAgICAgICBpZiAoIXJlY3RJZCkgY29udGludWU7XG4gICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgIHBvdGVudGlhbFNsb3RzID0gdGhpcy5fc3BsaXRSZWN0KHJlY3QsIGl0ZW1TbG90KTtcbiAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcG90ZW50aWFsU2xvdHMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgcmVjdElkID0gcG90ZW50aWFsU2xvdHNbaWldO1xuICAgICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgICAgLy8gTGV0J3MgbWFrZSBzdXJlIGhlcmUgdGhhdCB3ZSBoYXZlIGEgYmlnIGVub3VnaCBzbG90XG4gICAgICAgICAgLy8gKHdpZHRoL2hlaWdodCA+IDAuNDlweCkgYW5kIGFsc28gbGV0J3MgbWFrZSBzdXJlIHRoYXQgdGhlIHNsb3QgaXNcbiAgICAgICAgICAvLyB3aXRoaW4gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGdyaWQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVjdC53aWR0aCA+IDAuNDkgJiZcbiAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID4gMC40OSAmJlxuICAgICAgICAgICAgKCghaXNIb3Jpem9udGFsICYmIHJlY3QudG9wIDwgbGF5b3V0LmhlaWdodCkgfHxcbiAgICAgICAgICAgICAgKGlzSG9yaXpvbnRhbCAmJiByZWN0LmxlZnQgPCBsYXlvdXQud2lkdGgpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbmV3U2xvdHMucHVzaChyZWN0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBuZXcgc2xvdHMuXG4gICAgICBpZiAobmV3U2xvdHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3B1cmdlUmVjdHMobmV3U2xvdHMpLnNvcnQoXG4gICAgICAgICAgaXNIb3Jpem9udGFsID8gdGhpcy5fc29ydFJlY3RzTGVmdFRvcCA6IHRoaXMuX3NvcnRSZWN0c1RvcExlZnRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxheW91dCB3aWR0aC9oZWlnaHQuXG4gICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIGxheW91dC53aWR0aCA9IE1hdGgubWF4KGxheW91dC53aWR0aCwgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dC5oZWlnaHQgPSBNYXRoLm1heChsYXlvdXQuaGVpZ2h0LCBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaXRlbSBzbG90IGRhdGEgdG8gbGF5b3V0IHNsb3RzIChhbmQgc3RvcmUgdGhlIHNsb3Qgc2l6ZSBmb3IgbGF0ZXJcbiAgICAgIC8vIHVzYWdlIHRvbyBpZiBuZWNlc3NhcnkpLlxuICAgICAgbGF5b3V0LnNsb3RzLnB1c2goaXRlbVNsb3QubGVmdCwgaXRlbVNsb3QudG9wKTtcbiAgICAgIGlmICh0cmFja1NpemUpIHRoaXMuX3Nsb3RTaXplcy5wdXNoKGl0ZW1TbG90LndpZHRoLCBpdGVtU2xvdC5oZWlnaHQpO1xuXG4gICAgICAvLyBGcmVlL25ldyBzbG90cyBzd2l0Y2hlcm9vIVxuICAgICAgdGhpcy5fZnJlZVNsb3RzID0gbmV3U2xvdHM7XG4gICAgICB0aGlzLl9uZXdTbG90cyA9IGZyZWVTbG90cztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgcmVjdGFuZ2xlIHRvIHRoZSByZWN0YW5nbGUgc3RvcmUuIFJldHVybnMgdGhlIGlkIG9mIHRoZSBuZXdcbiAgICogcmVjdGFuZ2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge051bWJlcn0gbGVmdFxuICAgKiBAcGFyYW0ge051bWJlcn0gdG9wXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEByZXR1cm5zIHtSZWN0SWR9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9hZGRSZWN0ID0gZnVuY3Rpb24obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdmFyIHJlY3RJZCA9ICsrdGhpcy5fcmVjdElkO1xuICAgIHZhciByZWN0U3RvcmUgPSB0aGlzLl9yZWN0U3RvcmU7XG5cbiAgICByZWN0U3RvcmVbcmVjdElkXSA9IGxlZnQgfHwgMDtcbiAgICByZWN0U3RvcmVbKyt0aGlzLl9yZWN0SWRdID0gdG9wIHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IHdpZHRoIHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IGhlaWdodCB8fCAwO1xuXG4gICAgcmV0dXJuIHJlY3RJZDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHJlY3RhbmdsZSBkYXRhIGZyb20gdGhlIHJlY3RhbmdsZSBzdG9yZSBieSBpZC4gT3B0aW9uYWxseSB5b3UgY2FuXG4gICAqIHByb3ZpZGUgYSB0YXJnZXQgb2JqZWN0IHdoZXJlIHRoZSByZWN0YW5nbGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gaW4uIEJ5XG4gICAqIGRlZmF1bHQgYW4gaW50ZXJuYWwgb2JqZWN0IGlzIHJldXNlZCBhcyBhIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkfSBpZFxuICAgKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldF1cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2dldFJlY3QgPSBmdW5jdGlvbihpZCwgdGFyZ2V0KSB7XG4gICAgdmFyIHJlY3RJdGVtID0gdGFyZ2V0ID8gdGFyZ2V0IDogdGhpcy5fcmVjdEl0ZW07XG4gICAgdmFyIHJlY3RTdG9yZSA9IHRoaXMuX3JlY3RTdG9yZTtcblxuICAgIHJlY3RJdGVtLmxlZnQgPSByZWN0U3RvcmVbaWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0udG9wID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0ud2lkdGggPSByZWN0U3RvcmVbKytpZF0gfHwgMDtcbiAgICByZWN0SXRlbS5oZWlnaHQgPSByZWN0U3RvcmVbKytpZF0gfHwgMDtcblxuICAgIHJldHVybiByZWN0SXRlbTtcbiAgfTtcblxuICAvKipcbiAgICogUHVuY2ggYSBob2xlIGludG8gYSByZWN0YW5nbGUgYW5kIHNwbGl0IHRoZSByZW1haW5pbmcgYXJlYSBpbnRvIHNtYWxsZXJcbiAgICogcmVjdGFuZ2xlcyAoNCBhdCBtYXgpLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gcmVjdFxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gaG9sZVxuICAgKiBAcmV0dXJucyB7UmVjdElkW119XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9zcGxpdFJlY3QgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVjdCwgaG9sZSkge1xuICAgICAgLy8gUmVzZXQgb2xkIHJlc3VsdHMuXG4gICAgICByZXN1bHRzLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIElmIHRoZSByZWN0IGRvZXMgbm90IG92ZXJsYXAgd2l0aCB0aGUgaG9sZSBhZGQgcmVjdCB0byB0aGUgcmV0dXJuIGRhdGFcbiAgICAgIC8vIGFzIGlzLlxuICAgICAgaWYgKCF0aGlzLl9kb1JlY3RzT3ZlcmxhcChyZWN0LCBob2xlKSkge1xuICAgICAgICByZXN1bHRzLnB1c2godGhpcy5fYWRkUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cblxuICAgICAgLy8gTGVmdCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LmxlZnQgPCBob2xlLmxlZnQpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgaG9sZS5sZWZ0IC0gcmVjdC5sZWZ0LCByZWN0LmhlaWdodCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSaWdodCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LmxlZnQgKyByZWN0LndpZHRoID4gaG9sZS5sZWZ0ICsgaG9sZS53aWR0aCkge1xuICAgICAgICByZXN1bHRzLnB1c2goXG4gICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgIGhvbGUubGVmdCArIGhvbGUud2lkdGgsXG4gICAgICAgICAgICByZWN0LnRvcCxcbiAgICAgICAgICAgIHJlY3QubGVmdCArIHJlY3Qud2lkdGggLSAoaG9sZS5sZWZ0ICsgaG9sZS53aWR0aCksXG4gICAgICAgICAgICByZWN0LmhlaWdodFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVG9wIHNwbGl0LlxuICAgICAgaWYgKHJlY3QudG9wIDwgaG9sZS50b3ApIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgaG9sZS50b3AgLSByZWN0LnRvcCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBCb3R0b20gc3BsaXQuXG4gICAgICBpZiAocmVjdC50b3AgKyByZWN0LmhlaWdodCA+IGhvbGUudG9wICsgaG9sZS5oZWlnaHQpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKFxuICAgICAgICAgIHRoaXMuX2FkZFJlY3QoXG4gICAgICAgICAgICByZWN0LmxlZnQsXG4gICAgICAgICAgICBob2xlLnRvcCArIGhvbGUuaGVpZ2h0LFxuICAgICAgICAgICAgcmVjdC53aWR0aCxcbiAgICAgICAgICAgIHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLSAoaG9sZS50b3AgKyBob2xlLmhlaWdodClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHR3byByZWN0YW5nbGVzIG92ZXJsYXAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fZG9SZWN0c092ZXJsYXAgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICBhLmxlZnQgKyBhLndpZHRoIDw9IGIubGVmdCB8fFxuICAgICAgYi5sZWZ0ICsgYi53aWR0aCA8PSBhLmxlZnQgfHxcbiAgICAgIGEudG9wICsgYS5oZWlnaHQgPD0gYi50b3AgfHxcbiAgICAgIGIudG9wICsgYi5oZWlnaHQgPD0gYS50b3BcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHJlY3RhbmdsZSBpcyBmdWxseSB3aXRoaW4gYW5vdGhlciByZWN0YW5nbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5faXNSZWN0V2l0aGluUmVjdCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5sZWZ0ID49IGIubGVmdCAmJlxuICAgICAgYS50b3AgPj0gYi50b3AgJiZcbiAgICAgIGEubGVmdCArIGEud2lkdGggPD0gYi5sZWZ0ICsgYi53aWR0aCAmJlxuICAgICAgYS50b3AgKyBhLmhlaWdodCA8PSBiLnRvcCArIGIuaGVpZ2h0XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogTG9vcHMgdGhyb3VnaCBhbiBhcnJheSBvZiByZWN0YW5nbGUgaWRzIGFuZCByZXNldHMgYWxsIHRoYXQgYXJlIGZ1bGx5XG4gICAqIHdpdGhpbiBhbm90aGVyIHJlY3RhbmdsZSBpbiB0aGUgYXJyYXkuIFJlc2V0dGluZyBpbiB0aGlzIGNhc2UgbWVhbnMgdGhhdFxuICAgKiB0aGUgcmVjdGFuZ2xlIGlkIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggemVyby5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0SWRbXX0gcmVjdElkc1xuICAgKiBAcmV0dXJucyB7UmVjdElkW119XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9wdXJnZVJlY3RzID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWN0QSA9IHt9O1xuICAgIHZhciByZWN0QiA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbihyZWN0SWRzKSB7XG4gICAgICB2YXIgaSA9IHJlY3RJZHMubGVuZ3RoO1xuICAgICAgdmFyIGlpO1xuXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGlpID0gcmVjdElkcy5sZW5ndGg7XG4gICAgICAgIGlmICghcmVjdElkc1tpXSkgY29udGludWU7XG4gICAgICAgIHRoaXMuX2dldFJlY3QocmVjdElkc1tpXSwgcmVjdEEpO1xuICAgICAgICB3aGlsZSAoaWktLSkge1xuICAgICAgICAgIGlmICghcmVjdElkc1tpaV0gfHwgaSA9PT0gaWkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh0aGlzLl9pc1JlY3RXaXRoaW5SZWN0KHJlY3RBLCB0aGlzLl9nZXRSZWN0KHJlY3RJZHNbaWldLCByZWN0QikpKSB7XG4gICAgICAgICAgICByZWN0SWRzW2ldID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVjdElkcztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBTb3J0IHJlY3RhbmdsZXMgd2l0aCB0b3AtbGVmdCBncmF2aXR5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYUlkXG4gICAqIEBwYXJhbSB7UmVjdElkfSBiSWRcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX3NvcnRSZWN0c1RvcExlZnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlY3RBID0ge307XG4gICAgdmFyIHJlY3RCID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFJZCwgYklkKSB7XG4gICAgICB0aGlzLl9nZXRSZWN0KGFJZCwgcmVjdEEpO1xuICAgICAgdGhpcy5fZ2V0UmVjdChiSWQsIHJlY3RCKTtcbiAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgcmV0dXJuIHJlY3RBLnRvcCA8IHJlY3RCLnRvcCA/IC0xIDpcbiAgICAgICAgICAgICByZWN0QS50b3AgPiByZWN0Qi50b3AgPyAxIDpcbiAgICAgICAgICAgICByZWN0QS5sZWZ0IDwgcmVjdEIubGVmdCA/IC0xIDpcbiAgICAgICAgICAgICByZWN0QS5sZWZ0ID4gcmVjdEIubGVmdCA/IDEgOiAwO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIFNvcnQgcmVjdGFuZ2xlcyB3aXRoIGxlZnQtdG9wIGdyYXZpdHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkfSBhSWRcbiAgICogQHBhcmFtIHtSZWN0SWR9IGJJZFxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fc29ydFJlY3RzTGVmdFRvcCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVjdEEgPSB7fTtcbiAgICB2YXIgcmVjdEIgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24oYUlkLCBiSWQpIHtcbiAgICAgIHRoaXMuX2dldFJlY3QoYUlkLCByZWN0QSk7XG4gICAgICB0aGlzLl9nZXRSZWN0KGJJZCwgcmVjdEIpO1xuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICByZXR1cm4gcmVjdEEubGVmdCA8IHJlY3RCLmxlZnQgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA+IHJlY3RCLmxlZnQgPyAxIDpcbiAgICAgICAgICAgICByZWN0QS50b3AgPCByZWN0Qi50b3AgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wID4gcmVjdEIudG9wID8gMSA6IDA7XG4gICAgfTtcbiAgfSkoKTtcblxuICB2YXIgaHRtbENvbGxlY3Rpb25UeXBlID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJztcbiAgdmFyIG5vZGVMaXN0VHlwZSA9ICdbb2JqZWN0IE5vZGVMaXN0XSc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBub2RlIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWxcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc05vZGVMaXN0KHZhbCkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCk7XG4gICAgcmV0dXJuIHR5cGUgPT09IGh0bWxDb2xsZWN0aW9uVHlwZSB8fCB0eXBlID09PSBub2RlTGlzdFR5cGU7XG4gIH1cblxuICB2YXIgb2JqZWN0VHlwZSA9ICdvYmplY3QnO1xuICB2YXIgb2JqZWN0VG9TdHJpbmdUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gb2JqZWN0VHlwZSAmJiB0b1N0cmluZy5jYWxsKHZhbCkgPT09IG9iamVjdFRvU3RyaW5nVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGFuIGFycmF5IG9yIGNsb25lcyBhbiBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB0YXJnZXRcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheSh0YXJnZXQpIHtcbiAgICByZXR1cm4gaXNOb2RlTGlzdCh0YXJnZXQpID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGFyZ2V0KSA6IEFycmF5LnByb3RvdHlwZS5jb25jYXQodGFyZ2V0KTtcbiAgfVxuXG4gIHZhciBwYWNrZXIgPSBuZXcgUGFja2VyKCk7XG4gIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxuICB2YXIgbnVtYmVyVHlwZSQxID0gJ251bWJlcic7XG4gIHZhciBzdHJpbmdUeXBlID0gJ3N0cmluZyc7XG4gIHZhciBpbnN0YW50TGF5b3V0ID0gJ2luc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxTdHJpbmcpfSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHs/KEhUTUxFbGVtZW50W118Tm9kZUxpc3R8U3RyaW5nKX0gW29wdGlvbnMuaXRlbXNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zaG93RHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc2hvd0Vhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnZpc2libGVTdHlsZXNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oaWRlRHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaGlkZUVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmhpZGRlblN0eWxlc11cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gW29wdGlvbnMubGF5b3V0XVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dC5maWxsR2Fwcz1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuaG9yaXpvbnRhbD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuYWxpZ25SaWdodD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuYWxpZ25Cb3R0b209ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LnJvdW5kaW5nPXRydWVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TnVtYmVyKX0gW29wdGlvbnMubGF5b3V0T25SZXNpemU9MTAwXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dE9uSW5pdD10cnVlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubGF5b3V0RHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubGF5b3V0RWFzaW5nPVwiZWFzZVwiXVxuICAgKiBAcGFyYW0gez9PYmplY3R9IFtvcHRpb25zLnNvcnREYXRhPW51bGxdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZHJhZ0VuYWJsZWQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7P0h0bWxFbGVtZW50fSBbb3B0aW9ucy5kcmFnQ29udGFpbmVyPW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGVdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuZGlzdGFuY2U9MF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTdGFydFByZWRpY2F0ZS5kZWxheT0wXVxuICAgKiBAcGFyYW0geyhCb29sZWFufFN0cmluZyl9IFtvcHRpb25zLmRyYWdTdGFydFByZWRpY2F0ZS5oYW5kbGU9ZmFsc2VdXG4gICAqIEBwYXJhbSB7P1N0cmluZ30gW29wdGlvbnMuZHJhZ0F4aXNdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58RnVuY3Rpb24pfSBbb3B0aW9ucy5kcmFnU29ydD10cnVlXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLnNvcnRJbnRlcnZhbD0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU29ydEhldXJpc3RpY3MubWluRHJhZ0Rpc3RhbmNlPTEwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLm1pbkJvdW5jZUJhY2tBbmdsZT0xXVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0UHJlZGljYXRlLnRocmVzaG9sZD01MF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdTb3J0UHJlZGljYXRlLmFjdGlvbj1cIm1vdmVcIl1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdSZWxlYXNlRHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJhZ1JlbGVhc2VFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5kcmFnQ3NzUHJvcHNdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXJdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmVuYWJsZWQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIuZHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHs/RnVuY3Rpb259IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50PW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGU9bnVsbF1cbiAgICogQHBhcmFtIHs/RnVuY3Rpb259IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZT1udWxsXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29udGFpbmVyQ2xhc3M9XCJtdXVyaVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbUNsYXNzPVwibXV1cmktaXRlbVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVZpc2libGVDbGFzcz1cIm11dXJpLWl0ZW0tdmlzaWJsZVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbUhpZGRlbkNsYXNzPVwibXV1cmktaXRlbS1oaWRkZW5cIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1Qb3NpdGlvbmluZ0NsYXNzPVwibXV1cmktaXRlbS1wb3NpdGlvbmluZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbURyYWdnaW5nQ2xhc3M9XCJtdXVyaS1pdGVtLWRyYWdnaW5nXCJdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pdGVtUmVsZWFzaW5nQ2xhc3M9XCJtdXVyaS1pdGVtLXJlbGVhc2luZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVBsYWNlaG9sZGVyQ2xhc3M9XCJtdXVyaS1pdGVtLXBsYWNlaG9sZGVyXCJdXG4gICAqL1xuXG4gIGZ1bmN0aW9uIEdyaWQoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBpbnN0ID0gdGhpcztcbiAgICB2YXIgc2V0dGluZ3M7XG4gICAgdmFyIGl0ZW1zO1xuICAgIHZhciBsYXlvdXRPblJlc2l6ZTtcblxuICAgIC8vIEFsbG93IHBhc3NpbmcgZWxlbWVudCBhcyBzZWxlY3RvciBzdHJpbmcuIFN0b3JlIGVsZW1lbnQgZm9yIGluc3RhbmNlLlxuICAgIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50ID1cbiAgICAgIHR5cGVvZiBlbGVtZW50ID09PSBzdHJpbmdUeXBlID8gd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgdGhlIGNvbnRhaW5lciBlbGVtZW50IGlzIG5vdCBib2R5IGVsZW1lbnQgb3IgZG9lcyBub3RcbiAgICAvLyBleGlzdCB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudC5cbiAgICB2YXIgaXNFbGVtZW50SW5Eb20gPSBlbGVtZW50LmdldFJvb3ROb2RlXG4gICAgICA/IGVsZW1lbnQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogdHJ1ZSB9KSA9PT0gZG9jdW1lbnRcbiAgICAgIDogd2luZG93LmRvY3VtZW50LmJvZHkuY29udGFpbnMoZWxlbWVudCk7XG4gICAgaWYgKCFpc0VsZW1lbnRJbkRvbSB8fCBlbGVtZW50ID09PSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRhaW5lciBlbGVtZW50IG11c3QgYmUgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2Ugc2V0dGluZ3MgYnkgbWVyZ2luZyB0aGUgb3B0aW9ucyB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAgICBzZXR0aW5ncyA9IHRoaXMuX3NldHRpbmdzID0gbWVyZ2VTZXR0aW5ncyhHcmlkLmRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgIC8vIFNhbml0aXplIGRyYWdTb3J0IHNldHRpbmcuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTb3J0KSkge1xuICAgICAgc2V0dGluZ3MuZHJhZ1NvcnQgPSAhIXNldHRpbmdzLmRyYWdTb3J0O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbnN0YW5jZSBpZCBhbmQgc3RvcmUgaXQgdG8gdGhlIGdyaWQgaW5zdGFuY2VzIGNvbGxlY3Rpb24uXG4gICAgdGhpcy5faWQgPSBjcmVhdGVVaWQoKTtcbiAgICBncmlkSW5zdGFuY2VzW3RoaXMuX2lkXSA9IGluc3Q7XG5cbiAgICAvLyBEZXN0cm95ZWQgZmxhZy5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGxheW91dCBvYmplY3QgKG11dGF0ZWQgb24gZXZlcnkgbGF5b3V0KS5cbiAgICB0aGlzLl9sYXlvdXQgPSB7XG4gICAgICBpZDogMCxcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIHNsb3RzOiBbXSxcbiAgICAgIHNldFdpZHRoOiBmYWxzZSxcbiAgICAgIHNldEhlaWdodDogZmFsc2UsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgcHJpdmF0ZSBFbWl0dGVyIGluc3RhbmNlLlxuICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuXG4gICAgLy8gQWRkIGNvbnRhaW5lciBlbGVtZW50J3MgY2xhc3MgbmFtZS5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jb250YWluZXJDbGFzcyk7XG5cbiAgICAvLyBDcmVhdGUgaW5pdGlhbCBpdGVtcy5cbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgIGl0ZW1zID0gc2V0dGluZ3MuaXRlbXM7XG4gICAgaWYgKHR5cGVvZiBpdGVtcyA9PT0gc3RyaW5nVHlwZSkge1xuICAgICAgdG9BcnJheShlbGVtZW50LmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW1FbGVtZW50KSB7XG4gICAgICAgIGlmIChpdGVtcyA9PT0gJyonIHx8IGVsZW1lbnRNYXRjaGVzKGl0ZW1FbGVtZW50LCBpdGVtcykpIHtcbiAgICAgICAgICBpbnN0Ll9pdGVtcy5wdXNoKG5ldyBJdGVtKGluc3QsIGl0ZW1FbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykgfHwgaXNOb2RlTGlzdChpdGVtcykpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gdG9BcnJheShpdGVtcykubWFwKGZ1bmN0aW9uKGl0ZW1FbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgSXRlbShpbnN0LCBpdGVtRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXRPblJlc2l6ZSBvcHRpb24gaXMgYSB2YWxpZCBudW1iZXIgc2FuaXRpemUgaXQgYW5kIGJpbmQgdGhlIHJlc2l6ZVxuICAgIC8vIGhhbmRsZXIuXG4gICAgbGF5b3V0T25SZXNpemUgPSBzZXR0aW5ncy5sYXlvdXRPblJlc2l6ZTtcbiAgICBpZiAodHlwZW9mIGxheW91dE9uUmVzaXplICE9PSBudW1iZXJUeXBlJDEpIHtcbiAgICAgIGxheW91dE9uUmVzaXplID0gbGF5b3V0T25SZXNpemUgPT09IHRydWUgPyAwIDogLTE7XG4gICAgfVxuICAgIGlmIChsYXlvdXRPblJlc2l6ZSA+PSAwKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ3Jlc2l6ZScsXG4gICAgICAgIChpbnN0Ll9yZXNpemVIYW5kbGVyID0gZGVib3VuY2UoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaW5zdC5yZWZyZXNoSXRlbXMoKS5sYXlvdXQoKTtcbiAgICAgICAgfSwgbGF5b3V0T25SZXNpemUpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMYXlvdXQgb24gaW5pdCBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKHNldHRpbmdzLmxheW91dE9uSW5pdCkge1xuICAgICAgdGhpcy5sYXlvdXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm9wZXJ0aWVzXG4gICAqICoqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1cbiAgICovXG4gIEdyaWQuSXRlbSA9IEl0ZW07XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbUxheW91dFxuICAgKi9cbiAgR3JpZC5JdGVtTGF5b3V0ID0gSXRlbUxheW91dDtcblxuICAvKipcbiAgICogQHNlZSBJdGVtVmlzaWJpbGl0eVxuICAgKi9cbiAgR3JpZC5JdGVtVmlzaWJpbGl0eSA9IEl0ZW1WaXNpYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1NaWdyYXRlXG4gICAqL1xuICBHcmlkLkl0ZW1NaWdyYXRlID0gSXRlbU1pZ3JhdGU7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbUFuaW1hdGVcbiAgICovXG4gIEdyaWQuSXRlbUFuaW1hdGUgPSBJdGVtQW5pbWF0ZTtcblxuICAvKipcbiAgICogQHNlZSBJdGVtRHJhZ1xuICAgKi9cbiAgR3JpZC5JdGVtRHJhZyA9IEl0ZW1EcmFnO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1SZWxlYXNlXG4gICAqL1xuICBHcmlkLkl0ZW1SZWxlYXNlID0gSXRlbVJlbGVhc2U7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbURyYWdQbGFjZWhvbGRlclxuICAgKi9cbiAgR3JpZC5JdGVtRHJhZ1BsYWNlaG9sZGVyID0gSXRlbURyYWdQbGFjZWhvbGRlcjtcblxuICAvKipcbiAgICogQHNlZSBFbWl0dGVyXG4gICAqL1xuICBHcmlkLkVtaXR0ZXIgPSBFbWl0dGVyO1xuXG4gIC8qKlxuICAgKiBAc2VlIERyYWdnZXJcbiAgICovXG4gIEdyaWQuRHJhZ2dlciA9IERyYWdnZXI7XG5cbiAgLyoqXG4gICAqIEBzZWUgUGFja2VyXG4gICAqL1xuICBHcmlkLlBhY2tlciA9IFBhY2tlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBvcHRpb25zIGZvciBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkXG4gICAqL1xuICBHcmlkLmRlZmF1bHRPcHRpb25zID0ge1xuICAgIC8vIEl0ZW0gZWxlbWVudHNcbiAgICBpdGVtczogJyonLFxuXG4gICAgLy8gRGVmYXVsdCBzaG93IGFuaW1hdGlvblxuICAgIHNob3dEdXJhdGlvbjogMzAwLFxuICAgIHNob3dFYXNpbmc6ICdlYXNlJyxcblxuICAgIC8vIERlZmF1bHQgaGlkZSBhbmltYXRpb25cbiAgICBoaWRlRHVyYXRpb246IDMwMCxcbiAgICBoaWRlRWFzaW5nOiAnZWFzZScsXG5cbiAgICAvLyBJdGVtJ3MgdmlzaWJsZS9oaWRkZW4gc3RhdGUgc3R5bGVzXG4gICAgdmlzaWJsZVN0eWxlczoge1xuICAgICAgb3BhY2l0eTogJzEnLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gICAgfSxcbiAgICBoaWRkZW5TdHlsZXM6IHtcbiAgICAgIG9wYWNpdHk6ICcwJyxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuNSknXG4gICAgfSxcblxuICAgIC8vIExheW91dFxuICAgIGxheW91dDoge1xuICAgICAgZmlsbEdhcHM6IGZhbHNlLFxuICAgICAgaG9yaXpvbnRhbDogZmFsc2UsXG4gICAgICBhbGlnblJpZ2h0OiBmYWxzZSxcbiAgICAgIGFsaWduQm90dG9tOiBmYWxzZSxcbiAgICAgIHJvdW5kaW5nOiB0cnVlXG4gICAgfSxcbiAgICBsYXlvdXRPblJlc2l6ZTogMTAwLFxuICAgIGxheW91dE9uSW5pdDogdHJ1ZSxcbiAgICBsYXlvdXREdXJhdGlvbjogMzAwLFxuICAgIGxheW91dEVhc2luZzogJ2Vhc2UnLFxuXG4gICAgLy8gU29ydGluZ1xuICAgIHNvcnREYXRhOiBudWxsLFxuXG4gICAgLy8gRHJhZyAmIERyb3BcbiAgICBkcmFnRW5hYmxlZDogZmFsc2UsXG4gICAgZHJhZ0NvbnRhaW5lcjogbnVsbCxcbiAgICBkcmFnU3RhcnRQcmVkaWNhdGU6IHtcbiAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgZGVsYXk6IDAsXG4gICAgICBoYW5kbGU6IGZhbHNlXG4gICAgfSxcbiAgICBkcmFnQXhpczogbnVsbCxcbiAgICBkcmFnU29ydDogdHJ1ZSxcbiAgICBkcmFnU29ydEhldXJpc3RpY3M6IHtcbiAgICAgIHNvcnRJbnRlcnZhbDogMTAwLFxuICAgICAgbWluRHJhZ0Rpc3RhbmNlOiAxMCxcbiAgICAgIG1pbkJvdW5jZUJhY2tBbmdsZTogMVxuICAgIH0sXG4gICAgZHJhZ1NvcnRQcmVkaWNhdGU6IHtcbiAgICAgIHRocmVzaG9sZDogNTAsXG4gICAgICBhY3Rpb246IGFjdGlvbk1vdmVcbiAgICB9LFxuICAgIGRyYWdSZWxlYXNlRHVyYXRpb246IDMwMCxcbiAgICBkcmFnUmVsZWFzZUVhc2luZzogJ2Vhc2UnLFxuICAgIGRyYWdDc3NQcm9wczoge1xuICAgICAgdG91Y2hBY3Rpb246ICdub25lJyxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIHVzZXJEcmFnOiAnbm9uZScsXG4gICAgICB0YXBIaWdobGlnaHRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknLFxuICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG4gICAgICBjb250ZW50Wm9vbWluZzogJ25vbmUnXG4gICAgfSxcbiAgICBkcmFnUGxhY2Vob2xkZXI6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgIGVhc2luZzogJ2Vhc2UnLFxuICAgICAgY3JlYXRlRWxlbWVudDogbnVsbCxcbiAgICAgIG9uQ3JlYXRlOiBudWxsLFxuICAgICAgb25SZW1vdmU6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQ2xhc3NuYW1lc1xuICAgIGNvbnRhaW5lckNsYXNzOiAnbXV1cmknLFxuICAgIGl0ZW1DbGFzczogJ211dXJpLWl0ZW0nLFxuICAgIGl0ZW1WaXNpYmxlQ2xhc3M6ICdtdXVyaS1pdGVtLXNob3duJyxcbiAgICBpdGVtSGlkZGVuQ2xhc3M6ICdtdXVyaS1pdGVtLWhpZGRlbicsXG4gICAgaXRlbVBvc2l0aW9uaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLXBvc2l0aW9uaW5nJyxcbiAgICBpdGVtRHJhZ2dpbmdDbGFzczogJ211dXJpLWl0ZW0tZHJhZ2dpbmcnLFxuICAgIGl0ZW1SZWxlYXNpbmdDbGFzczogJ211dXJpLWl0ZW0tcmVsZWFzaW5nJyxcbiAgICBpdGVtUGxhY2Vob2xkZXJDbGFzczogJ211dXJpLWl0ZW0tcGxhY2Vob2xkZXInXG4gIH07XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vbihldmVudCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub2ZmKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGFsbCBpdGVtcy4gT3B0aW9uYWxseSB5b3UgY2FuIHByb3ZpZGUgc3BlY2lmaWMgdGFyZ2V0cyAoZWxlbWVudHMgYW5kXG4gICAqIGluZGljZXMpLiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGlzIG5vdCB0aGUgc2FtZSBvYmplY3QgdXNlZCBieSB0aGVcbiAgICogaW5zdGFuY2Ugc28gbW9kaWZ5aW5nIGl0IHdpbGwgbm90IGFmZmVjdCBpbnN0YW5jZSdzIGl0ZW1zLiBBbGwgaXRlbXMgdGhhdFxuICAgKiBhcmUgbm90IGZvdW5kIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJldHVybmVkIGFycmF5LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW3RhcmdldHNdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5nZXRJdGVtcyA9IGZ1bmN0aW9uKHRhcmdldHMpIHtcbiAgICAvLyBSZXR1cm4gYWxsIGl0ZW1zIGltbWVkaWF0ZWx5IGlmIG5vIHRhcmdldHMgd2VyZSBwcm92aWRlZCBvciBpZiB0aGVcbiAgICAvLyBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuXG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICghdGFyZ2V0cyAmJiB0YXJnZXRzICE9PSAwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKDApO1xuICAgIH1cblxuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0b0FycmF5KHRhcmdldHMpO1xuICAgIHZhciBpdGVtO1xuICAgIHZhciBpO1xuXG4gICAgLy8gSWYgdGFyZ2V0IGl0ZW1zIGFyZSBkZWZpbmVkIHJldHVybiBmaWx0ZXJlZCByZXN1bHRzLlxuICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHRoaXMuX2dldEl0ZW0odGFyZ2V0SXRlbXNbaV0pO1xuICAgICAgaXRlbSAmJiByZXQucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGNhY2hlZCBkaW1lbnNpb25zIG9mIHRoZSBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW2l0ZW1zXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlZnJlc2hJdGVtcyA9IGZ1bmN0aW9uKGl0ZW1zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciB0YXJnZXRzID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGFyZ2V0c1tpXS5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzb3J0IGRhdGEgb2YgdGhlIGluc3RhbmNlJ3MgaXRlbXMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBbaXRlbXNdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUucmVmcmVzaFNvcnREYXRhID0gZnVuY3Rpb24oaXRlbXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRhcmdldEl0ZW1zW2ldLl9yZWZyZXNoU29ydERhdGEoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU3luY2hyb25pemUgdGhlIGl0ZW0gZWxlbWVudHMgdG8gbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSBpdGVtcyBpbiB0aGUgRE9NLlxuICAgKiBUaGlzIGNvbWVzIGhhbmR5IGlmIHlvdSBuZWVkIHRvIGtlZXAgdGhlIERPTSBzdHJ1Y3R1cmUgbWF0Y2hlZCB3aXRoIHRoZVxuICAgKiBvcmRlciBvZiB0aGUgaXRlbXMuIE5vdGUgdGhhdCBpZiBhbiBpdGVtJ3MgZWxlbWVudCBpcyBub3QgY3VycmVudGx5IGEgY2hpbGRcbiAgICogb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50IChpZiBpdCBpcyBkcmFnZ2VkIGZvciBleGFtcGxlKSBpdCBpcyBpZ25vcmVkIGFuZFxuICAgKiBsZWZ0IHVudG91Y2hlZC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zeW5jaHJvbml6ZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICB2YXIgZnJhZ21lbnQ7XG4gICAgdmFyIGVsZW1lbnQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBBcHBlbmQgYWxsIGVsZW1lbnRzIGluIG9yZGVyIHRvIHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxlbWVudCA9IGl0ZW1zW2ldLl9lbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlID09PSBjb250YWluZXIpIHtcbiAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50IHx8IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZyYWdtZW50KSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIC8vIEVtaXQgc3luY2hyb25pemUgZXZlbnQuXG4gICAgdGhpcy5fZW1pdChldmVudFN5bmNocm9uaXplKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYW5kIGFwcGx5IGl0ZW0gcG9zaXRpb25zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0xheW91dENhbGxiYWNrfSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24oaW5zdGFudCwgb25GaW5pc2gpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGluc3QgPSB0aGlzO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgbGF5b3V0ID0gdGhpcy5fdXBkYXRlTGF5b3V0KCk7XG4gICAgdmFyIGxheW91dElkID0gbGF5b3V0LmlkO1xuICAgIHZhciBpdGVtc0xlbmd0aCA9IGxheW91dC5pdGVtcy5sZW5ndGg7XG4gICAgdmFyIGNvdW50ZXIgPSBpdGVtc0xlbmd0aDtcbiAgICB2YXIgaXNCb3JkZXJCb3g7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBUaGUgZmluaXNoIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGNoZWNraW5nIGlmIGFsbCB0aGUgaXRlbXNcbiAgICAvLyBoYXZlIGxhaWQgb3V0IHlldC4gQWZ0ZXIgYWxsIGl0ZW1zIGhhdmUgZmluaXNoZWQgdGhlaXIgYW5pbWF0aW9ucyBjYWxsXG4gICAgLy8gY2FsbGJhY2sgYW5kIGVtaXQgbGF5b3V0RW5kIGV2ZW50LiBPbmx5IGVtaXQgbGF5b3V0RW5kIGV2ZW50IGlmIHRoZXJlXG4gICAgLy8gaGFzbid0IGJlZW4gYSBuZXcgbGF5b3V0IGNhbGwgZHVyaW5nIHRoaXMgbGF5b3V0LlxuICAgIGZ1bmN0aW9uIHRyeUZpbmlzaCgpIHtcbiAgICAgIGlmICgtLWNvdW50ZXIgPiAwKSByZXR1cm47XG5cbiAgICAgIHZhciBoYXNMYXlvdXRDaGFuZ2VkID0gaW5zdC5fbGF5b3V0LmlkICE9PSBsYXlvdXRJZDtcbiAgICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24oaW5zdGFudCkgPyBpbnN0YW50IDogb25GaW5pc2g7XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICBjYWxsYmFjayhoYXNMYXlvdXRDaGFuZ2VkLCBsYXlvdXQuaXRlbXMuc2xpY2UoMCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWhhc0xheW91dENoYW5nZWQgJiYgaW5zdC5faGFzTGlzdGVuZXJzKGV2ZW50TGF5b3V0RW5kKSkge1xuICAgICAgICBpbnN0Ll9lbWl0KGV2ZW50TGF5b3V0RW5kLCBsYXlvdXQuaXRlbXMuc2xpY2UoMCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGdyaWQncyB3aWR0aCBvciBoZWlnaHQgd2FzIG1vZGlmaWVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdCdzIGNhY2hlZFxuICAgIC8vIGRpbWVuc2lvbnMuIEFsc28ga2VlcCBpbiBtaW5kIHRoYXQgZ3JpZCdzIGNhY2hlZCB3aWR0aC9oZWlnaHQgc2hvdWxkXG4gICAgLy8gYWx3YXlzIGVxdWFsIHRvIHdoYXQgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB3b3VsZCByZXR1cm4sIHNvXG4gICAgLy8gdGhlcmVmb3JlIHdlIG5lZWQgdG8gYWRkIHRoZSBncmlkIGVsZW1lbnQncyBib3JkZXJzIHRvIHRoZSBkaW1lbnNpb25zIGlmXG4gICAgLy8gaXQncyBib3gtc2l6aW5nIGlzIGJvcmRlci1ib3guIE5vdGUgdGhhdCB3ZSBzdXBwb3J0IHByb3ZpZGluZyB0aGVcbiAgICAvLyBkaW1lbnNpb25zIGFzIGEgc3RyaW5nIGhlcmUgdG9vIHNvIHRoYXQgb25lIGNhbiBkZWZpbmUgdGhlIHVuaXQgb2YgdGhlXG4gICAgLy8gZGltZW5zaW9ucywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyB0aGUgYm9yZGVyLWJveCBjaGVjay5cbiAgICBpZiAoXG4gICAgICAobGF5b3V0LnNldEhlaWdodCAmJiB0eXBlb2YgbGF5b3V0LmhlaWdodCA9PT0gbnVtYmVyVHlwZSQxKSB8fFxuICAgICAgKGxheW91dC5zZXRXaWR0aCAmJiB0eXBlb2YgbGF5b3V0LndpZHRoID09PSBudW1iZXJUeXBlJDEpXG4gICAgKSB7XG4gICAgICBpc0JvcmRlckJveCA9IGdldFN0eWxlKGVsZW1lbnQsICdib3gtc2l6aW5nJykgPT09ICdib3JkZXItYm94JztcbiAgICB9XG4gICAgaWYgKGxheW91dC5zZXRIZWlnaHQpIHtcbiAgICAgIGlmICh0eXBlb2YgbGF5b3V0LmhlaWdodCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID1cbiAgICAgICAgICAoaXNCb3JkZXJCb3ggPyBsYXlvdXQuaGVpZ2h0ICsgdGhpcy5fYm9yZGVyVG9wICsgdGhpcy5fYm9yZGVyQm90dG9tIDogbGF5b3V0LmhlaWdodCkgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBsYXlvdXQuaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGF5b3V0LnNldFdpZHRoKSB7XG4gICAgICBpZiAodHlwZW9mIGxheW91dC53aWR0aCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPVxuICAgICAgICAgIChpc0JvcmRlckJveCA/IGxheW91dC53aWR0aCArIHRoaXMuX2JvcmRlckxlZnQgKyB0aGlzLl9ib3JkZXJSaWdodCA6IGxheW91dC53aWR0aCkgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGxheW91dC53aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbWl0IGxheW91dFN0YXJ0IGV2ZW50LiBOb3RlIHRoYXQgdGhpcyBpcyBpbnRlbnRpb25hbGx5IGVtaXR0ZWQgYWZ0ZXIgdGhlXG4gICAgLy8gY29udGFpbmVyIGVsZW1lbnQncyBkaW1lbnNpb25zIGFyZSBzZXQsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlXG4gICAgLy8gbm8gaG9vayBmb3IgcmVhY3RpbmcgdG8gY29udGFpbmVyIGRpbWVuc2lvbiBjaGFuZ2VzLlxuICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRMYXlvdXRTdGFydCkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRMYXlvdXRTdGFydCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgbGV0J3MgZmluaXNoIHF1aWNrbHkuXG4gICAgaWYgKCFpdGVtc0xlbmd0aCkge1xuICAgICAgdHJ5RmluaXNoKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgaXRlbXMgbGV0J3MgcG9zaXRpb24gdGhlbS5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IGxheW91dC5pdGVtc1tpXTtcbiAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtJ3MgcG9zaXRpb24uXG4gICAgICBpdGVtLl9sZWZ0ID0gbGF5b3V0LnNsb3RzW2kgKiAyXTtcbiAgICAgIGl0ZW0uX3RvcCA9IGxheW91dC5zbG90c1tpICogMiArIDFdO1xuXG4gICAgICAvLyBMYXlvdXQgaXRlbSBpZiBpdCBpcyBub3QgZHJhZ2dlZC5cbiAgICAgIGl0ZW0uaXNEcmFnZ2luZygpID8gdHJ5RmluaXNoKCkgOiBpdGVtLl9sYXlvdXQuc3RhcnQoaW5zdGFudCA9PT0gdHJ1ZSwgdHJ5RmluaXNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQWRkIG5ldyBpdGVtcyBieSBwcm92aWRpbmcgdGhlIGVsZW1lbnRzIHlvdSB3aXNoIHRvIGFkZCB0byB0aGUgaW5zdGFuY2UgYW5kXG4gICAqIG9wdGlvbmFsbHkgcHJvdmlkZSB0aGUgaW5kZXggd2hlcmUgeW91IHdhbnQgdGhlIGl0ZW1zIHRvIGJlIGluc2VydGVkIGludG8uXG4gICAqIEFsbCBlbGVtZW50cyB0aGF0IGFyZSBub3QgYWxyZWFkeSBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgd2lsbCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBjb250YWluZXIgZWxlbWVudC4gSWYgYW4gZWxlbWVudCBoYXMgaXQncyBDU1NcbiAgICogZGlzcGxheSBwcm9wZXJ0eSBzZXQgdG8gXCJub25lXCIgaXQgd2lsbCBiZSBtYXJrZWQgYXMgaW5hY3RpdmUgZHVyaW5nIHRoZVxuICAgKiBpbml0aWF0aW9uIHByb2Nlc3MuIEFzIGxvbmcgYXMgdGhlIGl0ZW0gaXMgaW5hY3RpdmUgaXQgd2lsbCBub3QgYmUgcGFydCBvZlxuICAgKiB0aGUgbGF5b3V0LCBidXQgaXQgd2lsbCByZXRhaW4gaXQncyBpbmRleC4gWW91IGNhbiBhY3RpdmF0ZSBpdGVtcyBhdCBhbnlcbiAgICogcG9pbnQgd2l0aCBncmlkLnNob3coKSBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBjYWxsXG4gICAqIGdyaWQubGF5b3V0KCkgaWYgb25lIG9yIG1vcmUgb2YgdGhlIGFkZGVkIGVsZW1lbnRzIGFyZSB2aXNpYmxlLiBJZiBvbmx5XG4gICAqIGhpZGRlbiBpdGVtcyBhcmUgYWRkZWQgbm8gbGF5b3V0IHdpbGwgYmUgY2FsbGVkLiBBbGwgdGhlIG5ldyB2aXNpYmxlIGl0ZW1zXG4gICAqIGFyZSBwb3NpdGlvbmVkIHdpdGhvdXQgYW5pbWF0aW9uIGR1cmluZyB0aGVpciBmaXJzdCBsYXlvdXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fEhUTUxFbGVtZW50W10pfSBlbGVtZW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbmRleD0tMV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pc0FjdGl2ZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0l0ZW1bXX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICFlbGVtZW50cykgcmV0dXJuIFtdO1xuXG4gICAgdmFyIG5ld0l0ZW1zID0gdG9BcnJheShlbGVtZW50cyk7XG4gICAgaWYgKCFuZXdJdGVtcy5sZW5ndGgpIHJldHVybiBuZXdJdGVtcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIE1hcCBwcm92aWRlZCBlbGVtZW50cyBpbnRvIG5ldyBncmlkIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCBuZXdJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IG5ldyBJdGVtKHRoaXMsIG5ld0l0ZW1zW2ldLCBvcHRzLmlzQWN0aXZlKTtcbiAgICAgIG5ld0l0ZW1zW2ldID0gaXRlbTtcblxuICAgICAgLy8gSWYgdGhlIGl0ZW0gdG8gYmUgYWRkZWQgaXMgYWN0aXZlLCB3ZSBuZWVkIHRvIGRvIGEgbGF5b3V0LiBBbHNvLCB3ZVxuICAgICAgLy8gbmVlZCB0byBtYXJrIHRoZSBpdGVtIHdpdGggdGhlIHNraXBOZXh0QW5pbWF0aW9uIGZsYWcgdG8gbWFrZSBpdFxuICAgICAgLy8gcG9zaXRpb24gaW5zdGFudGx5ICh3aXRob3V0IGFuaW1hdGlvbikgZHVyaW5nIHRoZSBuZXh0IGxheW91dC4gV2l0aG91dFxuICAgICAgLy8gdGhlIGhhY2sgdGhlIGl0ZW0gd291bGQgYW5pbWF0ZSB0byBpdCdzIG5ldyBwb3NpdGlvbiBmcm9tIHRoZSBub3J0aHdlc3RcbiAgICAgIC8vIGNvcm5lciBvZiB0aGUgZ3JpZCwgd2hpY2ggZmVlbHMgYSBiaXQgYnVnZ3kgKGltaG8pLlxuICAgICAgaWYgKGl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICAgIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgICAgaXRlbS5fbGF5b3V0Ll9za2lwTmV4dEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBuZXcgaXRlbXMgdG8gdGhlIGl0ZW1zIGNvbGxlY3Rpb24gdG8gY29ycmVjdCBpbmRleC5cbiAgICBhcnJheUluc2VydChpdGVtcywgbmV3SXRlbXMsIG9wdHMuaW5kZXgpO1xuXG4gICAgLy8gRW1pdCBhZGQgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudEFkZCkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRBZGQsIG5ld0l0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgIGlmIChuZWVkc0xheW91dCAmJiBsYXlvdXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3SXRlbXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZW1vdmVFbGVtZW50cz1mYWxzZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0l0ZW1bXX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgYWxsSXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGluZGljZXMgPSBbXTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIFJlbW92ZSB0aGUgaW5kaXZpZHVhbCBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSB0YXJnZXRJdGVtc1tpXTtcbiAgICAgIGluZGljZXMucHVzaChhbGxJdGVtcy5pbmRleE9mKGl0ZW0pKTtcbiAgICAgIGlmIChpdGVtLl9pc0FjdGl2ZSkgbmVlZHNMYXlvdXQgPSB0cnVlO1xuICAgICAgaXRlbS5fZGVzdHJveShvcHRzLnJlbW92ZUVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHJlbW92ZSBldmVudC5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50UmVtb3ZlKSkge1xuICAgICAgdGhpcy5fZW1pdChldmVudFJlbW92ZSwgdGFyZ2V0SXRlbXMuc2xpY2UoMCksIGluZGljZXMpO1xuICAgIH1cblxuICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgaWYgKG5lZWRzTGF5b3V0ICYmIGxheW91dCkge1xuICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRJdGVtcztcbiAgfTtcblxuICAvKipcbiAgICogU2hvdyBpbnN0YW5jZSBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge1Nob3dDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9zZXRJdGVtc1Zpc2liaWxpdHkoaXRlbXMsIHRydWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIaWRlIGluc3RhbmNlIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gaXRlbXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7SGlkZUNhbGxiYWNrfSBbb3B0aW9ucy5vbkZpbmlzaF1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oaXRlbXMsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuX3NldEl0ZW1zVmlzaWJpbGl0eShpdGVtcywgZmFsc2UsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgaXRlbXMuIEV4cGVjdHMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LCBhIHByZWRpY2F0ZSwgd2hpY2ggc2hvdWxkIGJlXG4gICAqIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBUaGUgcHJlZGljYXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGZvciBldmVyeVxuICAgKiBpdGVtIGluIHRoZSBpbnN0YW5jZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJlZGljYXRlIGlzIHRydXRoeSB0aGVcbiAgICogaXRlbSBpbiBxdWVzdGlvbiB3aWxsIGJlIHNob3duIGFuZCBvdGhlcndpc2UgaGlkZGVuLiBUaGUgcHJlZGljYXRlIGNhbGxiYWNrXG4gICAqIHJlY2VpdmVzIHRoZSBpdGVtIGluc3RhbmNlIGFzIGl0J3MgYXJndW1lbnQuIElmIHRoZSBwcmVkaWNhdGUgaXMgYSBzdHJpbmdcbiAgICogaXQgaXMgY29uc2lkZXJlZCB0byBiZSBhIHNlbGVjdG9yIGFuZCBpdCBpcyBjaGVja2VkIGFnYWluc3QgZXZlcnkgaXRlbVxuICAgKiBlbGVtZW50IGluIHRoZSBpbnN0YW5jZSB3aXRoIHRoZSBuYXRpdmUgZWxlbWVudC5tYXRjaGVzKCkgbWV0aG9kLiBBbGwgdGhlXG4gICAqIG1hdGNoaW5nIGl0ZW1zIHdpbGwgYmUgc2hvd24gYW5kIG90aGVycyBoaWRkZW4uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufFN0cmluZyl9IHByZWRpY2F0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtGaWx0ZXJDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ocHJlZGljYXRlLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9pdGVtcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW1zVG9TaG93ID0gW107XG4gICAgdmFyIGl0ZW1zVG9IaWRlID0gW107XG4gICAgdmFyIGlzUHJlZGljYXRlU3RyaW5nID0gdHlwZW9mIHByZWRpY2F0ZSA9PT0gc3RyaW5nVHlwZTtcbiAgICB2YXIgaXNQcmVkaWNhdGVGbiA9IGlzRnVuY3Rpb24ocHJlZGljYXRlKTtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgaXNJbnN0YW50ID0gb3B0cy5pbnN0YW50ID09PSB0cnVlO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgb25GaW5pc2ggPSBpc0Z1bmN0aW9uKG9wdHMub25GaW5pc2gpID8gb3B0cy5vbkZpbmlzaCA6IG51bGw7XG4gICAgdmFyIHRyeUZpbmlzaENvdW50ZXIgPSAtMTtcbiAgICB2YXIgdHJ5RmluaXNoID0gbm9vcDtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHdlIGhhdmUgb25GaW5pc2ggY2FsbGJhY2ssIGxldCdzIGNyZWF0ZSBwcm9wZXIgdHJ5RmluaXNoIGNhbGxiYWNrLlxuICAgIGlmIChvbkZpbmlzaCkge1xuICAgICAgdHJ5RmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICsrdHJ5RmluaXNoQ291bnRlciAmJiBvbkZpbmlzaChpdGVtc1RvU2hvdy5zbGljZSgwKSwgaXRlbXNUb0hpZGUuc2xpY2UoMCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB3aGljaCBpdGVtcyBuZWVkIHRvIGJlIHNob3duIGFuZCB3aGljaCBoaWRkZW4uXG4gICAgaWYgKGlzUHJlZGljYXRlRm4gfHwgaXNQcmVkaWNhdGVTdHJpbmcpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVtID0gdGhpcy5faXRlbXNbaV07XG4gICAgICAgIGlmIChpc1ByZWRpY2F0ZUZuID8gcHJlZGljYXRlKGl0ZW0pIDogZWxlbWVudE1hdGNoZXMoaXRlbS5fZWxlbWVudCwgcHJlZGljYXRlKSkge1xuICAgICAgICAgIGl0ZW1zVG9TaG93LnB1c2goaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbXNUb0hpZGUucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3cgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIHNob3duLlxuICAgIGlmIChpdGVtc1RvU2hvdy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvdyhpdGVtc1RvU2hvdywge1xuICAgICAgICBpbnN0YW50OiBpc0luc3RhbnQsXG4gICAgICAgIG9uRmluaXNoOiB0cnlGaW5pc2gsXG4gICAgICAgIGxheW91dDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnlGaW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBoaWRkZW4uXG4gICAgaWYgKGl0ZW1zVG9IaWRlLmxlbmd0aCkge1xuICAgICAgdGhpcy5oaWRlKGl0ZW1zVG9IaWRlLCB7XG4gICAgICAgIGluc3RhbnQ6IGlzSW5zdGFudCxcbiAgICAgICAgb25GaW5pc2g6IHRyeUZpbmlzaCxcbiAgICAgICAgbGF5b3V0OiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeUZpbmlzaCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgaXRlbXMgdG8gZmlsdGVyLlxuICAgIGlmIChpdGVtc1RvU2hvdy5sZW5ndGggfHwgaXRlbXNUb0hpZGUubGVuZ3RoKSB7XG4gICAgICAvLyBFbWl0IGZpbHRlciBldmVudC5cbiAgICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRGaWx0ZXIpKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoZXZlbnRGaWx0ZXIsIGl0ZW1zVG9TaG93LnNsaWNlKDApLCBpdGVtc1RvSGlkZS5zbGljZSgwKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgICBpZiAobGF5b3V0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU29ydCBpdGVtcy4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gc29ydCB0aGUgaXRlbXMuIFRoZSBmaXJzdCBpcyBzaW1wbHkgYnlcbiAgICogcHJvdmlkaW5nIGEgZnVuY3Rpb24gYXMgdGhlIGNvbXBhcmVyIHdoaWNoIHdvcmtzIGlkZW50aWNhbGx5IHRvIG5hdGl2ZVxuICAgKiBhcnJheSBzb3J0LiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gc29ydCBieSB0aGUgc29ydCBkYXRhIHlvdSBoYXZlIHByb3ZpZGVkXG4gICAqIGluIHRoZSBpbnN0YW5jZSdzIG9wdGlvbnMuIEp1c3QgcHJvdmlkZSB0aGUgc29ydCBkYXRhIGtleShzKSBhcyBhIHN0cmluZ1xuICAgKiAoc2VwYXJhdGVkIGJ5IHNwYWNlKSBhbmQgdGhlIGl0ZW1zIHdpbGwgYmUgc29ydGVkIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICAgKiBzb3J0IGRhdGEga2V5cy4gTGFzdGx5IHlvdSBoYXZlIHRoZSBvcHBvcnR1bml0eSB0byBwcm92aWRlIGEgcHJlc29ydGVkXG4gICAqIGFycmF5IG9mIGl0ZW1zIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzeW5jIHRoZSBpbnRlcm5hbCBpdGVtcyBhcnJheSBpbiB0aGVcbiAgICogc2FtZSBvcmRlci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoRnVuY3Rpb258SXRlbVtdfFN0cmluZ3xTdHJpbmdbXSl9IGNvbXBhcmVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kZXNjZW5kaW5nPWZhbHNlXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNvcnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNvcnRDb21wYXJlcjtcbiAgICB2YXIgaXNEZXNjZW5kaW5nO1xuICAgIHZhciBvcmlnSXRlbXM7XG4gICAgdmFyIGluZGV4TWFwO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VDcml0ZXJpYShkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnOicpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJbmRleE1hcChpdGVtcykge1xuICAgICAgdmFyIHJldCA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXRbaXRlbXNbaV0uX2lkXSA9IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBhcmVJbmRpY2VzKGl0ZW1BLCBpdGVtQikge1xuICAgICAgdmFyIGluZGV4QSA9IGluZGV4TWFwW2l0ZW1BLl9pZF07XG4gICAgICB2YXIgaW5kZXhCID0gaW5kZXhNYXBbaXRlbUIuX2lkXTtcbiAgICAgIHJldHVybiBpc0Rlc2NlbmRpbmcgPyBpbmRleEIgLSBpbmRleEEgOiBpbmRleEEgLSBpbmRleEI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmYXVsdENvbXBhcmVyKGEsIGIpIHtcbiAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgdmFyIGNyaXRlcmlhTmFtZTtcbiAgICAgIHZhciBjcml0ZXJpYU9yZGVyO1xuICAgICAgdmFyIHZhbEE7XG4gICAgICB2YXIgdmFsQjtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBsaXN0IG9mIHNvcnQgY3JpdGVyaWEuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvcnRDb21wYXJlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBHZXQgdGhlIGNyaXRlcmlhIG5hbWUsIHdoaWNoIHNob3VsZCBtYXRjaCBhbiBpdGVtJ3Mgc29ydCBkYXRhIGtleS5cbiAgICAgICAgY3JpdGVyaWFOYW1lID0gc29ydENvbXBhcmVyW2ldWzBdO1xuICAgICAgICBjcml0ZXJpYU9yZGVyID0gc29ydENvbXBhcmVyW2ldWzFdO1xuXG4gICAgICAgIC8vIEdldCBpdGVtcycgY2FjaGVkIHNvcnQgdmFsdWVzIGZvciB0aGUgY3JpdGVyaWEuIElmIHRoZSBpdGVtIGhhcyBubyBzb3J0XG4gICAgICAgIC8vIGRhdGEgbGV0J3MgdXBkYXRlIHRoZSBpdGVtcyBzb3J0IGRhdGEgKHRoaXMgaXMgYSBsYXp5IGxvYWQgbWVjaGFuaXNtKS5cbiAgICAgICAgdmFsQSA9IChhLl9zb3J0RGF0YSA/IGEgOiBhLl9yZWZyZXNoU29ydERhdGEoKSkuX3NvcnREYXRhW2NyaXRlcmlhTmFtZV07XG4gICAgICAgIHZhbEIgPSAoYi5fc29ydERhdGEgPyBiIDogYi5fcmVmcmVzaFNvcnREYXRhKCkpLl9zb3J0RGF0YVtjcml0ZXJpYU5hbWVdO1xuXG4gICAgICAgIC8vIFNvcnQgdGhlIGl0ZW1zIGluIGRlc2NlbmRpbmcgb3JkZXIgaWYgZGVmaW5lZCBzbyBleHBsaWNpdGx5LiBPdGhlcndpc2VcbiAgICAgICAgLy8gc29ydCBpdGVtcyBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgIGlmIChjcml0ZXJpYU9yZGVyID09PSAnZGVzYycgfHwgKCFjcml0ZXJpYU9yZGVyICYmIGlzRGVzY2VuZGluZykpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWxCIDwgdmFsQSA/IC0xIDogdmFsQiA+IHZhbEEgPyAxIDogMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWxBIDwgdmFsQiA/IC0xIDogdmFsQSA+IHZhbEIgPyAxIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgLTEgb3IgMSBhcyB0aGUgcmV0dXJuIHZhbHVlLCBsZXQncyByZXR1cm4gaXQgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHZhbHVlcyBhcmUgZXF1YWwgbGV0J3MgY29tcGFyZSB0aGUgaXRlbSBpbmRpY2VzIHRvIG1ha2Ugc3VyZSB3ZVxuICAgICAgLy8gaGF2ZSBhIHN0YWJsZSBzb3J0LlxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgaWYgKCFpbmRleE1hcCkgaW5kZXhNYXAgPSBnZXRJbmRleE1hcChvcmlnSXRlbXMpO1xuICAgICAgICByZXN1bHQgPSBjb21wYXJlSW5kaWNlcyhhLCBiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VzdG9tQ29tcGFyZXIoYSwgYikge1xuICAgICAgdmFyIHJlc3VsdCA9IHNvcnRDb21wYXJlcihhLCBiKTtcbiAgICAgIC8vIElmIGRlc2NlbmRpbmcgbGV0J3MgaW52ZXJ0IHRoZSByZXN1bHQgdmFsdWUuXG4gICAgICBpZiAoaXNEZXNjZW5kaW5nICYmIHJlc3VsdCkgcmVzdWx0ID0gLXJlc3VsdDtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCByZXN1bHQgKG5vdCB6ZXJvKSBsZXQncyByZXR1cm4gaXQgcmlnaHQgYXdheS5cbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAvLyBJZiByZXN1bHQgaXMgemVybyBsZXQncyBjb21wYXJlIHRoZSBpdGVtIGluZGljZXMgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYVxuICAgICAgLy8gc3RhYmxlIHNvcnQuXG4gICAgICBpZiAoIWluZGV4TWFwKSBpbmRleE1hcCA9IGdldEluZGV4TWFwKG9yaWdJdGVtcyk7XG4gICAgICByZXR1cm4gY29tcGFyZUluZGljZXMoYSwgYik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNvbXBhcmVyLCBvcHRpb25zKSB7XG4gICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgdGhpcy5faXRlbXMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXM7XG5cbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1zO1xuICAgICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gU2V0dXAgcGFyZW50IHNjb3BlIGRhdGEuXG4gICAgICBzb3J0Q29tcGFyZXIgPSBjb21wYXJlcjtcbiAgICAgIGlzRGVzY2VuZGluZyA9ICEhb3B0cy5kZXNjZW5kaW5nO1xuICAgICAgb3JpZ0l0ZW1zID0gaXRlbXMuc2xpY2UoMCk7XG4gICAgICBpbmRleE1hcCA9IG51bGw7XG5cbiAgICAgIC8vIElmIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGRvIGEgbmF0aXZlIGFycmF5IHNvcnQuXG4gICAgICBpZiAoaXNGdW5jdGlvbihzb3J0Q29tcGFyZXIpKSB7XG4gICAgICAgIGl0ZW1zLnNvcnQoY3VzdG9tQ29tcGFyZXIpO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlIGlmIHdlIGdvdCBhIHN0cmluZywgbGV0J3Mgc29ydCBieSB0aGUgc29ydCBkYXRhIGFzIHByb3ZpZGVkIGluXG4gICAgICAvLyB0aGUgaW5zdGFuY2UncyBvcHRpb25zLlxuICAgICAgZWxzZSBpZiAodHlwZW9mIHNvcnRDb21wYXJlciA9PT0gc3RyaW5nVHlwZSkge1xuICAgICAgICBzb3J0Q29tcGFyZXIgPSBwYXJzZUNyaXRlcmlhKGNvbXBhcmVyKTtcbiAgICAgICAgaXRlbXMuc29ydChkZWZhdWx0Q29tcGFyZXIpO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlIGlmIHdlIGdvdCBhbiBhcnJheSwgbGV0J3MgYXNzdW1lIGl0J3MgYSBwcmVzb3J0ZWQgYXJyYXkgb2YgdGhlXG4gICAgICAvLyBpdGVtcyBhbmQgb3JkZXIgdGhlIGl0ZW1zIGJhc2VkIG9uIGl0LlxuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3J0Q29tcGFyZXIpKSB7XG4gICAgICAgIGlmIChzb3J0Q29tcGFyZXIubGVuZ3RoICE9PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1snICsgbmFtZXNwYWNlICsgJ10gc29ydCByZWZlcmVuY2UgaXRlbXMgZG8gbm90IG1hdGNoIHdpdGggZ3JpZCBpdGVtcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoc29ydENvbXBhcmVyLmluZGV4T2YoaXRlbXNbaV0pIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbJyArIG5hbWVzcGFjZSArICddIHNvcnQgcmVmZXJlbmNlIGl0ZW1zIGRvIG5vdCBtYXRjaCB3aXRoIGdyaWQgaXRlbXMuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGl0ZW1zW2ldID0gc29ydENvbXBhcmVyW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rlc2NlbmRpbmcpIGl0ZW1zLnJldmVyc2UoKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBsZXQncyBqdXN0IHNraXAgaXQsIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUuXG4gICAgICBlbHNlIHtcbiAgICAgICAgLyoqIEB0b2RvIE1heWJlIHRocm93IGFuIGVycm9yIGhlcmU/ICovXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHNvcnQgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50U29ydCkpIHtcbiAgICAgICAgdGhpcy5fZW1pdChldmVudFNvcnQsIGl0ZW1zLnNsaWNlKDApLCBvcmlnSXRlbXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIE1vdmUgaXRlbSB0byBhbm90aGVyIGluZGV4IG9yIGluIHBsYWNlIG9mIGFub3RoZXIgaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBpdGVtXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gcG9zaXRpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYWN0aW9uPVwibW92ZVwiXVxuICAgKiAgIC0gQWNjZXB0cyBlaXRoZXIgXCJtb3ZlXCIgb3IgXCJzd2FwXCIuXG4gICAqICAgLSBcIm1vdmVcIiBtb3ZlcyB0aGUgaXRlbSBpbiBwbGFjZSBvZiB0aGUgb3RoZXIgaXRlbS5cbiAgICogICAtIFwic3dhcFwiIHN3YXBzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbXMuXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uKGl0ZW0sIHBvc2l0aW9uLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2l0ZW1zLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBpc1N3YXAgPSBvcHRzLmFjdGlvbiA9PT0gYWN0aW9uU3dhcDtcbiAgICB2YXIgYWN0aW9uID0gaXNTd2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG4gICAgdmFyIGZyb21JdGVtID0gdGhpcy5fZ2V0SXRlbShpdGVtKTtcbiAgICB2YXIgdG9JdGVtID0gdGhpcy5fZ2V0SXRlbShwb3NpdGlvbik7XG4gICAgdmFyIGZyb21JbmRleDtcbiAgICB2YXIgdG9JbmRleDtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGUgaXRlbXMgZXhpc3QgYW5kIGFyZSBub3QgdGhlIHNhbWUuXG4gICAgaWYgKGZyb21JdGVtICYmIHRvSXRlbSAmJiBmcm9tSXRlbSAhPT0gdG9JdGVtKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGljZXMgb2YgdGhlIGl0ZW1zLlxuICAgICAgZnJvbUluZGV4ID0gaXRlbXMuaW5kZXhPZihmcm9tSXRlbSk7XG4gICAgICB0b0luZGV4ID0gaXRlbXMuaW5kZXhPZih0b0l0ZW0pO1xuXG4gICAgICAvLyBEbyB0aGUgbW92ZS9zd2FwLlxuICAgICAgaWYgKGlzU3dhcCkge1xuICAgICAgICBhcnJheVN3YXAoaXRlbXMsIGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheU1vdmUoaXRlbXMsIGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgbW92ZSBldmVudC5cbiAgICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRNb3ZlKSkge1xuICAgICAgICB0aGlzLl9lbWl0KGV2ZW50TW92ZSwge1xuICAgICAgICAgIGl0ZW06IGZyb21JdGVtLFxuICAgICAgICAgIGZyb21JbmRleDogZnJvbUluZGV4LFxuICAgICAgICAgIHRvSW5kZXg6IHRvSW5kZXgsXG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgICBpZiAobGF5b3V0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU2VuZCBpdGVtIHRvIGFub3RoZXIgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBpdGVtXG4gICAqIEBwYXJhbSB7R3JpZH0gZ3JpZFxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW29wdGlvbnMuYXBwZW5kVG89ZG9jdW1lbnQuYm9keV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXRTZW5kZXI9dHJ1ZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXRSZWNlaXZlcj10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbihpdGVtLCBncmlkLCBwb3NpdGlvbiwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCBncmlkLl9pc0Rlc3Ryb3llZCB8fCB0aGlzID09PSBncmlkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgdGFyZ2V0IGl0ZW0uXG4gICAgaXRlbSA9IHRoaXMuX2dldEl0ZW0oaXRlbSk7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBjb250YWluZXIgPSBvcHRzLmFwcGVuZFRvIHx8IHdpbmRvdy5kb2N1bWVudC5ib2R5O1xuICAgIHZhciBsYXlvdXRTZW5kZXIgPSBvcHRzLmxheW91dFNlbmRlciA/IG9wdHMubGF5b3V0U2VuZGVyIDogb3B0cy5sYXlvdXRTZW5kZXIgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbGF5b3V0UmVjZWl2ZXIgPSBvcHRzLmxheW91dFJlY2VpdmVyXG4gICAgICA/IG9wdHMubGF5b3V0UmVjZWl2ZXJcbiAgICAgIDogb3B0cy5sYXlvdXRSZWNlaXZlciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gU3RhcnQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLlxuICAgIGl0ZW0uX21pZ3JhdGUuc3RhcnQoZ3JpZCwgcG9zaXRpb24sIGNvbnRhaW5lcik7XG5cbiAgICAvLyBJZiBtaWdyYXRpb24gd2FzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgaXRlbSBpcyBhY3RpdmUsIGxldCdzIGxheW91dFxuICAgIC8vIHRoZSBncmlkcy5cbiAgICBpZiAoaXRlbS5fbWlncmF0ZS5faXNBY3RpdmUgJiYgaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgIGlmIChsYXlvdXRTZW5kZXIpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQoXG4gICAgICAgICAgbGF5b3V0U2VuZGVyID09PSBpbnN0YW50TGF5b3V0LFxuICAgICAgICAgIGlzRnVuY3Rpb24obGF5b3V0U2VuZGVyKSA/IGxheW91dFNlbmRlciA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGxheW91dFJlY2VpdmVyKSB7XG4gICAgICAgIGdyaWQubGF5b3V0KFxuICAgICAgICAgIGxheW91dFJlY2VpdmVyID09PSBpbnN0YW50TGF5b3V0LFxuICAgICAgICAgIGlzRnVuY3Rpb24obGF5b3V0UmVjZWl2ZXIpID8gbGF5b3V0UmVjZWl2ZXIgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbW92ZUVsZW1lbnRzPWZhbHNlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihyZW1vdmVFbGVtZW50cykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcy5zbGljZSgwKTtcbiAgICB2YXIgaTtcblxuICAgIC8vIFVuYmluZCB3aW5kb3cgcmVzaXplIGV2ZW50IGxpc3RlbmVyLlxuICAgIGlmICh0aGlzLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fcmVzaXplSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJveSBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zW2ldLl9kZXN0cm95KHJlbW92ZUVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGNvbnRhaW5lci5cbiAgICByZW1vdmVDbGFzcyhjb250YWluZXIsIHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lckNsYXNzKTtcbiAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJyc7XG5cbiAgICAvLyBFbWl0IGRlc3Ryb3kgZXZlbnQgYW5kIHVuYmluZCBhbGwgZXZlbnRzLlxuICAgIHRoaXMuX2VtaXQoZXZlbnREZXN0cm95KTtcbiAgICB0aGlzLl9lbWl0dGVyLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSByZWZlcmVuY2UgZnJvbSB0aGUgZ3JpZCBpbnN0YW5jZXMgY29sbGVjdGlvbi5cbiAgICBncmlkSW5zdGFuY2VzW3RoaXMuX2lkXSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEZsYWcgaW5zdGFuY2UgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSdzIGl0ZW0gYnkgZWxlbWVudCBvciBieSBpbmRleC4gVGFyZ2V0IGNhbiBhbHNvIGJlIGFuIEl0ZW1cbiAgICogaW5zdGFuY2UgaW4gd2hpY2ggY2FzZSB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgaXRlbSBpZiBpdCBleGlzdHMgd2l0aGluXG4gICAqIHJlbGF0ZWQgR3JpZCBpbnN0YW5jZS4gSWYgbm90aGluZyBpcyBmb3VuZCB3aXRoIHRoZSBwcm92aWRlZCB0YXJnZXQsIG51bGxcbiAgICogaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IFt0YXJnZXRdXG4gICAqIEByZXR1cm5zIHs/SXRlbX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLl9nZXRJdGVtID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgLy8gSWYgbm8gdGFyZ2V0IGlzIHNwZWNpZmllZCBvciB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkLCByZXR1cm4gbnVsbC5cbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgKCF0YXJnZXQgJiYgdGFyZ2V0ICE9PSAwKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgdGFyZ2V0IGlzIG51bWJlciByZXR1cm4gdGhlIGl0ZW0gaW4gdGhhdCBpbmRleC4gSWYgdGhlIG51bWJlciBpcyBsb3dlclxuICAgIC8vIHRoYW4gemVybyBsb29rIGZvciB0aGUgaXRlbSBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIGl0ZW1zIGFycmF5LiBGb3JcbiAgICAvLyBleGFtcGxlIC0xIGZvciB0aGUgbGFzdCBpdGVtLCAtMiBmb3IgdGhlIHNlY29uZCBsYXN0IGl0ZW0sIGV0Yy5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlbXNbdGFyZ2V0ID4gLTEgPyB0YXJnZXQgOiB0aGlzLl9pdGVtcy5sZW5ndGggKyB0YXJnZXRdIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBpcyBhbiBpbnN0YW5jZSBvZiBJdGVtIHJldHVybiBpdCBpZiBpdCBpcyBhdHRhY2hlZCB0byB0aGlzXG4gICAgLy8gR3JpZCBpbnN0YW5jZSwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJdGVtKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Ll9ncmlkSWQgPT09IHRoaXMuX2lkID8gdGFyZ2V0IDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJbiBvdGhlciBjYXNlcyBsZXQncyBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGlzIGFuIGVsZW1lbnQsIHNvIGxldCdzIHRyeVxuICAgIC8vIHRvIGZpbmQgYW4gaXRlbSB0aGF0IG1hdGNoZXMgdGhlIGVsZW1lbnQgYW5kIHJldHVybiBpdC4gSWYgaXRlbSBpcyBub3RcbiAgICAvLyBmb3VuZCByZXR1cm4gbnVsbC5cbiAgICAvKiogQHRvZG8gVGhpcyBjb3VsZCBiZSBtYWRlIGEgbG90IGZhc3RlciBieSB1c2luZyBNYXAvV2Vha01hcCBvZiBlbGVtZW50cy4gKi9cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5faXRlbXNbaV0uX2VsZW1lbnQgPT09IHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBpbnN0YW5jZSdzIGxheW91dCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0xheW91dERhdGF9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncy5sYXlvdXQ7XG4gICAgdmFyIHdpZHRoO1xuICAgIHZhciBoZWlnaHQ7XG4gICAgdmFyIG5ld0xheW91dDtcbiAgICB2YXIgaTtcblxuICAgIC8vIExldCdzIGluY3JlbWVudCBsYXlvdXQgaWQuXG4gICAgKytsYXlvdXQuaWQ7XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgbGF5b3V0IGl0ZW1zXG4gICAgbGF5b3V0Lml0ZW1zLmxlbmd0aCA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5faXRlbXNbaV0uX2lzQWN0aXZlKSBsYXlvdXQuaXRlbXMucHVzaCh0aGlzLl9pdGVtc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gTGV0J3MgbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgY29udGFpbmVyIGRpbWVuc2lvbnMuXG4gICAgdGhpcy5fcmVmcmVzaERpbWVuc2lvbnMoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBjb250YWluZXIgd2lkdGggYW5kIGhlaWdodCAod2l0aG91dCBib3JkZXJzKS5cbiAgICB3aWR0aCA9IHRoaXMuX3dpZHRoIC0gdGhpcy5fYm9yZGVyTGVmdCAtIHRoaXMuX2JvcmRlclJpZ2h0O1xuICAgIGhlaWdodCA9IHRoaXMuX2hlaWdodCAtIHRoaXMuX2JvcmRlclRvcCAtIHRoaXMuX2JvcmRlckJvdHRvbTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgbGF5b3V0LlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzKSkge1xuICAgICAgbmV3TGF5b3V0ID0gc2V0dGluZ3MobGF5b3V0Lml0ZW1zLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5b3V0ID0gcGFja2VyLmdldExheW91dChsYXlvdXQuaXRlbXMsIHdpZHRoLCBoZWlnaHQsIGxheW91dC5zbG90cywgc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8vIExldCdzIHVwZGF0ZSB0aGUgZ3JpZCdzIGxheW91dC5cbiAgICBsYXlvdXQuc2xvdHMgPSBuZXdMYXlvdXQuc2xvdHM7XG4gICAgbGF5b3V0LnNldFdpZHRoID0gQm9vbGVhbihuZXdMYXlvdXQuc2V0V2lkdGgpO1xuICAgIGxheW91dC5zZXRIZWlnaHQgPSBCb29sZWFuKG5ld0xheW91dC5zZXRIZWlnaHQpO1xuICAgIGxheW91dC53aWR0aCA9IG5ld0xheW91dC53aWR0aDtcbiAgICBsYXlvdXQuaGVpZ2h0ID0gbmV3TGF5b3V0LmhlaWdodDtcblxuICAgIHJldHVybiBsYXlvdXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgYSBncmlkIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7Li4uKn0gW2FyZ11cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLl9lbWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5fZW1pdHRlci5lbWl0LmFwcGx5KHRoaXMuX2VtaXR0ZXIsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZXZlbnRzIGxpc3RlbmVycyBmb3IgYW4gZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5faGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZW1pdHRlci5fZXZlbnRzW2V2ZW50XTtcbiAgICByZXR1cm4gISEobGlzdGVuZXJzICYmIGxpc3RlbmVycy5sZW5ndGgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29udGFpbmVyJ3Mgd2lkdGgsIGhlaWdodCBhbmQgb2Zmc2V0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlQm91bmRpbmdSZWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLl93aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgdGhpcy5faGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG4gICAgdGhpcy5fbGVmdCA9IHJlY3QubGVmdDtcbiAgICB0aGlzLl90b3AgPSByZWN0LnRvcDtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGNvbnRhaW5lcidzIGJvcmRlciBzaXplcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gbGVmdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJpZ2h0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9wXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYm90dG9tXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlQm9yZGVycyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICBpZiAobGVmdCkgdGhpcy5fYm9yZGVyTGVmdCA9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICBpZiAocmlnaHQpIHRoaXMuX2JvcmRlclJpZ2h0ID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItcmlnaHQtd2lkdGgnKTtcbiAgICBpZiAodG9wKSB0aGlzLl9ib3JkZXJUb3AgPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci10b3Atd2lkdGgnKTtcbiAgICBpZiAoYm90dG9tKSB0aGlzLl9ib3JkZXJCb3R0b20gPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci1ib3R0b20td2lkdGgnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVmcmVzaCBhbGwgb2YgY29udGFpbmVyJ3MgaW50ZXJuYWwgZGltZW5zaW9ucyBhbmQgb2Zmc2V0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fcmVmcmVzaERpbWVuc2lvbnMgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl91cGRhdGVCb3VuZGluZ1JlY3QoKTtcbiAgICB0aGlzLl91cGRhdGVCb3JkZXJzKDEsIDEsIDEsIDEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTaG93IG9yIGhpZGUgR3JpZCBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9WaXNpYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0geyhTaG93Q2FsbGJhY2t8SGlkZUNhbGxiYWNrKX0gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fc2V0SXRlbXNWaXNpYmlsaXR5ID0gZnVuY3Rpb24oaXRlbXMsIHRvVmlzaWJsZSwgb3B0aW9ucykge1xuICAgIHZhciBncmlkID0gdGhpcztcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0aGlzLmdldEl0ZW1zKGl0ZW1zKTtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgaXNJbnN0YW50ID0gb3B0cy5pbnN0YW50ID09PSB0cnVlO1xuICAgIHZhciBjYWxsYmFjayA9IG9wdHMub25GaW5pc2g7XG4gICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBjb3VudGVyID0gdGFyZ2V0SXRlbXMubGVuZ3RoO1xuICAgIHZhciBzdGFydEV2ZW50ID0gdG9WaXNpYmxlID8gZXZlbnRTaG93U3RhcnQgOiBldmVudEhpZGVTdGFydDtcbiAgICB2YXIgZW5kRXZlbnQgPSB0b1Zpc2libGUgPyBldmVudFNob3dFbmQgOiBldmVudEhpZGVFbmQ7XG4gICAgdmFyIG1ldGhvZCA9IHRvVmlzaWJsZSA/ICdzaG93JyA6ICdoaWRlJztcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgY29tcGxldGVkSXRlbXMgPSBbXTtcbiAgICB2YXIgaGlkZGVuSXRlbXMgPSBbXTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcyBjYWxsIHRoZSBjYWxsYmFjaywgYnV0IGRvbid0IGVtaXQgYW55IGV2ZW50cy5cbiAgICBpZiAoIWNvdW50ZXIpIHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgY2FsbGJhY2sodGFyZ2V0SXRlbXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVtaXQgc2hvd1N0YXJ0L2hpZGVTdGFydCBldmVudC5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKHN0YXJ0RXZlbnQpKSB7XG4gICAgICB0aGlzLl9lbWl0KHN0YXJ0RXZlbnQsIHRhcmdldEl0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBTaG93L2hpZGUgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gdGFyZ2V0SXRlbXNbaV07XG5cbiAgICAgIC8vIElmIGluYWN0aXZlIGl0ZW0gaXMgc2hvd24gb3IgYWN0aXZlIGl0ZW0gaXMgaGlkZGVuIHdlIG5lZWQgdG8gZG9cbiAgICAgIC8vIGxheW91dC5cbiAgICAgIGlmICgodG9WaXNpYmxlICYmICFpdGVtLl9pc0FjdGl2ZSkgfHwgKCF0b1Zpc2libGUgJiYgaXRlbS5faXNBY3RpdmUpKSB7XG4gICAgICAgIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaW5hY3RpdmUgaXRlbSBpcyBzaG93biB3ZSBhbHNvIG5lZWQgdG8gZG8gYSBsaXR0bGUgaGFjayB0byBtYWtlIHRoZVxuICAgICAgLy8gaXRlbSBub3QgYW5pbWF0ZSBpdCdzIG5leHQgcG9zaXRpb25pbmcgKGxheW91dCkuXG4gICAgICBpZiAodG9WaXNpYmxlICYmICFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgICBpdGVtLl9sYXlvdXQuX3NraXBOZXh0QW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYSBoaWRkZW4gaXRlbSBpcyBiZWluZyBzaG93biB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGl0ZW0nc1xuICAgICAgLy8gZGltZW5zaW9ucy5cbiAgICAgIGlmICh0b1Zpc2libGUgJiYgaXRlbS5fdmlzaWJpbGl0eS5faXNIaWRkZW4pIHtcbiAgICAgICAgaGlkZGVuSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdy9oaWRlIHRoZSBpdGVtLlxuICAgICAgaXRlbS5fdmlzaWJpbGl0eVttZXRob2RdKGlzSW5zdGFudCwgZnVuY3Rpb24oaW50ZXJydXB0ZWQsIGl0ZW0pIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgaXRlbSdzIGFuaW1hdGlvbiB3YXMgbm90IGludGVycnVwdGVkIGFkZCBpdCB0byB0aGVcbiAgICAgICAgLy8gY29tcGxldGVkSXRlbXMgYXJyYXkuXG4gICAgICAgIGlmICghaW50ZXJydXB0ZWQpIGNvbXBsZXRlZEl0ZW1zLnB1c2goaXRlbSk7XG5cbiAgICAgICAgLy8gSWYgYWxsIGl0ZW1zIGhhdmUgZmluaXNoZWQgdGhlaXIgYW5pbWF0aW9ucyBjYWxsIHRoZSBjYWxsYmFja1xuICAgICAgICAvLyBhbmQgZW1pdCBzaG93RW5kL2hpZGVFbmQgZXZlbnQuXG4gICAgICAgIGlmICgtLWNvdW50ZXIgPCAxKSB7XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSBjYWxsYmFjayhjb21wbGV0ZWRJdGVtcy5zbGljZSgwKSk7XG4gICAgICAgICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhlbmRFdmVudCkpIGdyaWQuX2VtaXQoZW5kRXZlbnQsIGNvbXBsZXRlZEl0ZW1zLnNsaWNlKDApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCBoaWRkZW4gaXRlbXMuXG4gICAgaWYgKGhpZGRlbkl0ZW1zLmxlbmd0aCkgdGhpcy5yZWZyZXNoSXRlbXMoaGlkZGVuSXRlbXMpO1xuXG4gICAgLy8gTGF5b3V0IGlmIG5lZWRlZC5cbiAgICBpZiAobmVlZHNMYXlvdXQgJiYgbGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGhlbHBlcnNcbiAgICogKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXJnZSBkZWZhdWx0IHNldHRpbmdzIHdpdGggdXNlciBzZXR0aW5ncy4gVGhlIHJldHVybmVkIG9iamVjdCBpcyBhIG5ld1xuICAgKiBvYmplY3Qgd2l0aCBtZXJnZWQgdmFsdWVzLiBUaGUgbWVyZ2luZyBpcyBhIGRlZXAgbWVyZ2UgbWVhbmluZyB0aGF0IGFsbFxuICAgKiBvYmplY3RzIGFuZCBhcnJheXMgd2l0aGluIHRoZSBwcm92aWRlZCBzZXR0aW5ncyBvYmplY3RzIHdpbGwgYmUgYWxzbyBtZXJnZWRcbiAgICogc28gdGhhdCBtb2RpZnlpbmcgdGhlIHZhbHVlcyBvZiB0aGUgc2V0dGluZ3Mgb2JqZWN0IHdpbGwgaGF2ZSBubyBlZmZlY3Qgb25cbiAgICogdGhlIHJldHVybmVkIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRTZXR0aW5nc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW3VzZXJTZXR0aW5nc11cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhIG5ldyBvYmplY3QuXG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZVNldHRpbmdzKGRlZmF1bHRTZXR0aW5ncywgdXNlclNldHRpbmdzKSB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggY29weSBvZiBkZWZhdWx0IHNldHRpbmdzLlxuICAgIHZhciByZXQgPSBtZXJnZU9iamVjdHMoe30sIGRlZmF1bHRTZXR0aW5ncyk7XG5cbiAgICAvLyBNZXJnZSB1c2VyIHNldHRpbmdzIHRvIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgaWYgKHVzZXJTZXR0aW5ncykge1xuICAgICAgcmV0ID0gbWVyZ2VPYmplY3RzKHJldCwgdXNlclNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdmlzaWJsZS9oaWRkZW4gc3R5bGVzIG1hbnVhbGx5IHNvIHRoYXQgdGhlIHdob2xlIG9iamVjdCBpc1xuICAgIC8vIG92ZXJyaWRkZW4gaW5zdGVhZCBvZiB0aGUgcHJvcHMuXG4gICAgcmV0LnZpc2libGVTdHlsZXMgPSAodXNlclNldHRpbmdzIHx8IDApLnZpc2libGVTdHlsZXMgfHwgKGRlZmF1bHRTZXR0aW5ncyB8fCAwKS52aXNpYmxlU3R5bGVzO1xuICAgIHJldC5oaWRkZW5TdHlsZXMgPSAodXNlclNldHRpbmdzIHx8IDApLmhpZGRlblN0eWxlcyB8fCAoZGVmYXVsdFNldHRpbmdzIHx8IDApLmhpZGRlblN0eWxlcztcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgdHdvIG9iamVjdHMgcmVjdXJzaXZlbHkgKGRlZXAgbWVyZ2UpLiBUaGUgc291cmNlIG9iamVjdCdzIHByb3BlcnRpZXNcbiAgICogYXJlIG1lcmdlZCB0byB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKiAgIC0gVGhlIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VcbiAgICogICAtIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKHRhcmdldCwgc291cmNlKSB7XG4gICAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgIHZhciBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDtcbiAgICB2YXIgaXNTb3VyY2VPYmplY3Q7XG4gICAgdmFyIHByb3BOYW1lO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBwcm9wTmFtZSA9IHNvdXJjZUtleXNbaV07XG4gICAgICBpc1NvdXJjZU9iamVjdCA9IGlzUGxhaW5PYmplY3Qoc291cmNlW3Byb3BOYW1lXSk7XG5cbiAgICAgIC8vIElmIHRhcmdldCBhbmQgc291cmNlIHZhbHVlcyBhcmUgYm90aCBvYmplY3RzLCBtZXJnZSB0aGUgb2JqZWN0cyBhbmRcbiAgICAgIC8vIGFzc2lnbiB0aGUgbWVyZ2VkIHZhbHVlIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh0YXJnZXRbcHJvcE5hbWVdKSAmJiBpc1NvdXJjZU9iamVjdCkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gbWVyZ2VPYmplY3RzKG1lcmdlT2JqZWN0cyh7fSwgdGFyZ2V0W3Byb3BOYW1lXSksIHNvdXJjZVtwcm9wTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgc291cmNlJ3MgdmFsdWUgaXMgb2JqZWN0IGFuZCB0YXJnZXQncyBpcyBub3QgbGV0J3MgY2xvbmUgdGhlIG9iamVjdCBhc1xuICAgICAgLy8gdGhlIHRhcmdldCdzIHZhbHVlLlxuICAgICAgaWYgKGlzU291cmNlT2JqZWN0KSB7XG4gICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBtZXJnZU9iamVjdHMoe30sIHNvdXJjZVtwcm9wTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgc291cmNlJ3MgdmFsdWUgaXMgYW4gYXJyYXkgbGV0J3MgY2xvbmUgdGhlIGFycmF5IGFzIHRoZSB0YXJnZXQnc1xuICAgICAgLy8gdmFsdWUuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VbcHJvcE5hbWVdKSkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXS5zbGljZSgwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEluIGFsbCBvdGhlciBjYXNlcyBsZXQncyBqdXN0IGRpcmVjdGx5IGFzc2lnbiB0aGUgc291cmNlJ3MgdmFsdWUgYXMgdGhlXG4gICAgICAvLyB0YXJnZXQncyB2YWx1ZS5cbiAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICByZXR1cm4gR3JpZDtcblxufSkpO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIEl0ZW1WYWx1ZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyXG4gIGV4dGVuZHMgVmlzdWFsaXplckJhc2VcbiAgaW1wbGVtZW50cyBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24ge1xuXG4gIHByaXZhdGUgdmlzdWFsaXplclNlbGVjdG9yOiBIVE1MRGl2RWxlbWVudDtcblxuICBwcml2YXRlIHVwZGF0ZVZpc3VhbGl6ZXJTZWxlY3RvcigpIHtcbiAgICBpZiAoISF0aGlzLnZpc3VhbGl6ZXJTZWxlY3Rvcikge1xuICAgICAgdGhpcy52aXN1YWxpemVyU2VsZWN0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXG4gICAgICAgIFwic2VsZWN0XCJcbiAgICAgIClbMF0udmFsdWUgPSB0aGlzLnZpc3VhbGl6ZXIudHlwZTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZpc3VhbGl6ZXJzOiBBcnJheTxWaXN1YWxpemVyQmFzZT4sXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdFxuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucyk7XG4gICAgaWYgKCF2aXN1YWxpemVycyB8fCB2aXN1YWxpemVycy5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVmlzdWFsaXplckFycmF5V3JhcHBlciB3b3JrcyB3aXRoIHZpc3VhbGl6ZXJzIGNvbGxlY3Rpb24gb25seS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICB2aXN1YWxpemVyLm9uVXBkYXRlID0gKCkgPT4gdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgaWYgKHZpc3VhbGl6ZXIuc3VwcG9ydFNlbGVjdGlvbikge1xuICAgICAgICB0aGlzLl9zdXBwb3J0U2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aXN1YWxpemVyc1dpdGhTZWxlY3Rpb24ucHVzaChcbiAgICAgICAgICA8SVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uPig8YW55PnZpc3VhbGl6ZXIpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VWaXN1YWxpemVyXCIsICgpID0+XG4gICAgICB0aGlzLnZpc3VhbGl6ZXJTZWxlY3RvciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICB0aGlzLnZpc3VhbGl6ZXJzLm1hcCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdmlzdWFsaXplci50eXBlLFxuICAgICAgICAgICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInZpc3VhbGl6ZXJfXCIgKyB2aXN1YWxpemVyLnR5cGUpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IHRoaXMudmlzdWFsaXplci50eXBlID09PSBvcHRpb24udmFsdWUsXG4gICAgICAgIChlOiBhbnkpID0+IHRoaXMuc2V0VmlzdWFsaXplcihlLnRhcmdldC52YWx1ZSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy52aXN1YWxpemVyID0gdmlzdWFsaXplcnNbMF07XG4gICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayk7XG4gICAgdGhpcy52aXN1YWxpemVyLm9uU3RhdGVDaGFuZ2VkLmFkZCh0aGlzLm9uVmlzdWFsaXplclN0YXRlQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2aXN1YWxpemVyQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgcHVibGljIGdldCBoYXNGb290ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldFZpc3VhbGl6ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnZpc3VhbGl6ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXN1YWxpemVyc1dpdGhTZWxlY3Rpb246IEFycmF5PElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbj4gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZEl0ZW06IEl0ZW1WYWx1ZTtcbiAgcHJpdmF0ZSB2aXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZTtcblxuICBwcml2YXRlIG9uQWZ0ZXJWaXN1YWxpemVyUmVuZGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9O1xuICBwcml2YXRlIG9uVmlzdWFsaXplclN0YXRlQ2hhbmdlZENhbGxiYWNrID0gKHMsIG9wdGlvbnMpID0+IHtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcInZpc3VhbGl6ZXJcIiwgb3B0aW9ucyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciBjb250ZW50IHR5cGUgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICoqL1xuICBwdWJsaWMgb25WaXN1YWxpemVyQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLCBvcHRpb25zOiBhbnkpID0+IGFueSwgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIGFueT4oKTtcblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2VsZWN0cyB2aXN1YWxpemVyIHRvIHNob3cgYnkgaXQgbmFtZS5cbiAgKlxuICAqIHBhcmFtZXRlcnM6XG4gICogbmFtZSAtIHRoZSBuYW1lIG9mIHZpc3VhbGl6ZXIgdG8gc2hvdyxcbiAgKiBxdWlldCAtIHNldCBpdCB0byB0cnVlIGlmIHlvdSBkb24ndCB3YW50IHRvIHJpc2UgYSBub3RpZmljYXRpb24gZXZlbnRcbiAgKlxuICAqKi9cbiAgcHVibGljIHNldFZpc3VhbGl6ZXIodHlwZTogc3RyaW5nLCBxdWlldCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgdmlzdWFsaXplckNhbmRpZGF0ZSA9IHRoaXMudmlzdWFsaXplcnMuZmlsdGVyKCh2KSA9PiB2LnR5cGUgPT09IHR5cGUpWzBdO1xuICAgIGlmICghIXZpc3VhbGl6ZXJDYW5kaWRhdGUgJiYgdmlzdWFsaXplckNhbmRpZGF0ZSAhPT0gdGhpcy52aXN1YWxpemVyKSB7XG4gICAgICBpZiAoISF0aGlzLnZpc3VhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy52aXN1YWxpemVyLm9uU3RhdGVDaGFuZ2VkLnJlbW92ZSh0aGlzLm9uVmlzdWFsaXplclN0YXRlQ2hhbmdlZENhbGxiYWNrKTtcbiAgICAgICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayk7XG4gICAgICAgIHRoaXMudmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnZpc3VhbGl6ZXIgPSB2aXN1YWxpemVyQ2FuZGlkYXRlO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICB0aGlzLnZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5hZGQodGhpcy5vbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrKTtcbiAgICAgIHRoaXMudmlzdWFsaXplci5vblN0YXRlQ2hhbmdlZC5hZGQodGhpcy5vblZpc3VhbGl6ZXJTdGF0ZUNoYW5nZWRDYWxsYmFjayk7XG4gICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgIHRoaXMub25WaXN1YWxpemVyQ2hhbmdlZC5maXJlKHRoaXMsIHsgdmlzdWFsaXplcjogdGhpcy52aXN1YWxpemVyIH0pO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZChcInZpc3VhbGl6ZXJcIiwgdHlwZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVZpc3VhbGl6ZXJTZWxlY3RvcigpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICB2aXN1YWxpemVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0IG9uRGF0YUl0ZW1TZWxlY3RlZChcbiAgICB2YWw6IChzZWxlY3RlZFZhbHVlOiBhbnksIHNlbGVjdGVkVGV4dDogc3RyaW5nKSA9PiB2b2lkXG4gICkge1xuICAgIHRoaXMudmlzdWFsaXplcnNXaXRoU2VsZWN0aW9uLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25EYXRhSXRlbVNlbGVjdGVkID0gdmFsO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U2VsZWN0aW9uKGl0ZW06IEl0ZW1WYWx1ZSkge1xuICAgIHRoaXMudmlzdWFsaXplcnNXaXRoU2VsZWN0aW9uLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gKDxhbnk+dGhpcy52aXN1YWxpemVyKS5zZWxlY3Rpb24gfHwgdGhpcy5zZWxlY3RlZEl0ZW07XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy52aXN1YWxpemVyQ29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMudmlzdWFsaXplci5yZW5kZXIodGhpcy52aXN1YWxpemVyQ29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKGNvbG9yOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKGNvbG9yKTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2godmlzdWFsaXplciA9PiB2aXN1YWxpemVyLmJhY2tncm91bmRDb2xvciA9IGNvbG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgdGhhdCBkZXNjcmliZSBhIGN1cnJlbnQgdmlzdWFsaXplciBzdGF0ZS4gVGhlIHByb3BlcnRpZXMgYXJlIGRpZmZlcmVudCBmb3IgZWFjaCBpbmRpdmlkdWFsIHZpc3VhbGl6ZXIuXG4gICAqXG4gICAqID4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIGluIGRlc2NlbmRhbnQgY2xhc3Nlcy5cbiAgICogQHNlZSBzZXRTdGF0ZVxuICAgKi9cbiAgcHVibGljIGdldFN0YXRlKCk6IGFueSB7XG4gICAgY29uc3QgY3VycmVudFZpc3VhbGl6ZXJTdGF0ZSA9IHRoaXMudmlzdWFsaXplci5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHN0YXRlOiBhbnkgPSB7XG4gICAgICB2aXN1YWxpemVyOiB0aGlzLnZpc3VhbGl6ZXIudHlwZSxcbiAgICB9O1xuICAgIGlmKE9iamVjdC5rZXlzKGN1cnJlbnRWaXN1YWxpemVyU3RhdGUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0YXRlLnN0YXRlID0gY3VycmVudFZpc3VhbGl6ZXJTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2aXN1YWxpemVyJ3Mgc3RhdGUuXG4gICAqXG4gICAqID4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIGluIGRlc2NlbmRhbnQgY2xhc3Nlcy5cbiAgICogQHNlZSBnZXRTdGF0ZVxuICAgKi9cbiAgcHVibGljIHNldFN0YXRlKHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICBpZighIXN0YXRlLnZpc3VhbGl6ZXIpIHtcbiAgICAgIHRoaXMuc2V0VmlzdWFsaXplcihzdGF0ZS52aXN1YWxpemVyLCB0cnVlKTtcbiAgICB9XG4gICAgaWYoISFzdGF0ZS5zdGF0ZSkge1xuICAgICAgdGhpcy52aXN1YWxpemVyLnNldFN0YXRlKHN0YXRlLnN0YXRlKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uQWZ0ZXJWaXN1YWxpemVyUmVuZGVyQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5vblN0YXRlQ2hhbmdlZC5yZW1vdmUodGhpcy5vblZpc3VhbGl6ZXJTdGF0ZUNoYW5nZWRDYWxsYmFjayk7XG4gICAgICB2aXN1YWxpemVyLm9uVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHRoaXMudmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyQWx0VmlzdWFsaXplclNlbGVjdG9yKFxuICBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlclxuKTtcbiIsIi8vIFRoaXMgZGljdGlvbmFyeSBjb250YWlucyAxIHVudHJhbnNsYXRlZCBvciBpbmhlcml0ZWQgbG9jYWxpemF0aW9uIHN0cmluZ3MuXG4vLyBUaGVzZSBzdHJpbmdzIGFyZSBjb21tZW50ZWQgb3V0LiBVbmNvbW1lbnQgYW5kIGVkaXQgdGhlbSBpZiB5b3Ugd2FudCB0byBhZGQgeW91ciB0cmFuc2xhdGlvbnMuXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGFyYWJpY1N0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcItiy2LHYp9ixINin2YTZhdis2YXZiNi52KlcIixcbiAgdW5ncm91cEJ1dHRvbjogXCLYqtmFINin2YTYqtit2K/ZitirINmF2YYg2K7ZhNin2YTZiVwiLFxuICBzZWxlY3RCdXR0b246IFwi2KfYrtiq2LFcIixcbiAgaGlkZUNvbHVtbjogXCLYp9iu2YHYp9ihINin2YTYudmF2YjYr1wiLFxuICBzaG93Q29sdW1uOiBcItin2LjZh9in2LFcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwi2KPYrNi52YQg2KfZhNi52YXZiNivINiu2KfYtVwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcItij2KzYudmEINin2YTYudmF2YjYryDYudin2YVcIixcbiAgbW92ZVRvRGV0YWlsOiBcItin2YbYqtmC2YQg2KXZhNmJINin2YTYqtmB2KfYtdmK2YRcIixcbiAgc2hvd0FzQ29sdW1uOiBcItil2LjZh9in2LEg2YPYudmF2YjYr1wiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCLYqNit2KsuLi5cIixcbiAgcmVtb3ZlUm93czogXCLYrdiw2YFcIixcbiAgc2hvd0xhYmVsOiBcItin2LjZh9in2LFcIixcbiAgZW50cmllc0xhYmVsOiBcItmF2K/YrtmE2KfYqlwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwi2KzYr9in2YjZhFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCLZg9mE2YXYp9iqXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcItin2YTYsdiz2YUg2KfZhNio2YrYp9mG2YpcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwi2YXYqtmI2LPYt1wiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwi2KzYr9mI2YRcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcItix2LPZhSDYqNmK2KfZhtmKXCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwi2LTYsdmK2LdcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwi2LTYsdmK2Lcg2LnZhdmI2K/ZilwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCLYtNix2YrYtyDZhdmD2K/Ys1wiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiRG91Z2hudXRcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJQaWVcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiU2NhdHRlclwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR2F1Z2VcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCdWxsZXRcIixcbiAgaGlkZUJ1dHRvbjogXCLYp9iu2YHYp9ihXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcItij2KzYudmEINiu2KfYtVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcItij2KzYudmEINi52KfZhVwiLFxuICBzaG93QnV0dG9uOiBcItin2LjZh9in2LFcIixcbiAgZmlsdGVyOiBcItiq2LHYtNitXCIsXG4gIHJlc2V0RmlsdGVyOiBcItil2LnYp9iv2Kkg2KrYudmK2YrZhlwiLFxuICBjaGFuZ2VMb2NhbGU6IFwi2KrYutmK2YrYsSDYp9mE2YTYutipXCIsXG4gIGNsZWFyQnV0dG9uOiBcItmF2LPYrVwiLFxuICBhZGRFbGVtZW50OiBcItin2K7YqtixINiz2KTYp9mE2KfZiyDZhNmE2LnYsdi2IC4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwi2KfZhNiq2LHYqtmK2Kgg2KfZhNin2YHYqtix2KfYttmKXCIsXG4gIGFzY09yZGVyOiBcItiq2LXYp9i52K/ZiVwiLFxuICBkZXNjT3JkZXI6IFwi2KrZhtin2LLZhNmJXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwi2KXYuNmH2KfYsSDYp9mE2KPYudmF2K/YqSDYp9mE2KvYp9mG2YjZitipXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcItio2YbZiNivINmI2KrYudmE2YrZgtin2Kog2KPYrtix2YlcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIti52LHYtiDYp9mE2YbYs9ioINin2YTZhdim2YjZitipXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCLYpdiu2YHYp9ihINin2YTZhtiz2KhcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCLYqtmG2LLZitmEINio2LXZiti62KkgcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwi2KXYrtmB2KfYoSDYp9mE2KXYrNin2KjYp9iqINin2YTZgdin2LHYutipXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwi2KXYuNmH2KfYsSDYp9mE2KXYrNin2KjYp9iqINin2YTZgdin2LHYutipXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwi2KzZhdmK2Lkg2KfZhNil2KzYp9io2KfYqlwiLFxuICB0b3BOVmFsdWVUZXh0NTogXCLYo9mH2YUgNSDYpdis2KfYqNin2KpcIixcbiAgdG9wTlZhbHVlVGV4dDEwOiBcItij2YHYttmEIDEwINil2KzYp9io2KfYqlwiLFxuICB0b3BOVmFsdWVUZXh0MjA6IFwi2KPZgdi22YQgMjAg2KXYrNin2KjYqVwiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwi2KXYrtmB2KfYoSDYp9mE2KXYrNin2KjYp9iqINin2YTZhdmB2YLZiNiv2KlcIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIti52LHYtiDYp9mE2KXYrNin2KjYp9iqINin2YTZhdmB2YLZiNiv2KlcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCLYo9is2YjYqNipINmF2YHZgtmI2K/YqVwiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCLZhNmFINmK2KrZhSDYp9mE2LnYsdi2INio2LnYr1wiLFxuICBub1Jlc3VsdHM6IFwi2YTYpyDZitmI2KzYryDZhtiq2KfYptisINmE2YTYudix2LZcIixcbiAgc2hvd1BlclZhbHVlczogXCLZhNmD2YQg2KfZhNmC2YrZhVwiLFxuICBzaG93UGVyQ29sdW1uczogXCLZhNmD2YQg2KfZhNij2LnZhdiv2KlcIixcbiAgYW5zd2VyOiBcItil2KzYqFwiLFxuICBjb3JyZWN0QW5zd2VyOiBcItin2YTYp9is2KfYqNipINin2YTYtdit2YrYrdipOiBcIixcbiAgcGVyY2VudDogXCLYp9mE2YbYs9io2Ycg2KfZhNmF2KbZiNmK2YdcIixcbiAgcmVzcG9uc2VzOiBcItin2YTYp9iz2KrYrNin2KjYp9iqXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYXJcIl0gPSBhcmFiaWNTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiYXJcIl0gPSBcItin2YTYudix2KjZitipXCI7XG5cbi8vIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBoYXZlIGJlZW4gdHJhbnNsYXRlZCBieSBhIG1hY2hpbmUgdHJhbnNsYXRpb24gc2VydmljZVxuLy8gUmVtb3ZlIHRob3NlIHN0cmluZ3MgdGhhdCB5b3UgaGF2ZSBjb3JyZWN0ZWQgbWFudWFsbHlcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0LTE6IFwiQWxsIGFuc3dlcnNcIiA9PiBcItis2YXZiti5INin2YTYpdis2KfYqNin2KpcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQ1OiBcIlRvcCA1IGFuc3dlcnNcIiA9PiBcItij2YfZhSA1INil2KzYp9io2KfYqlwiXG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dDEwOiBcIlRvcCAxMCBhbnN3ZXJzXCIgPT4gXCLYo9mB2LbZhCAxMCDYpdis2KfYqNin2KpcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQyMDogXCJUb3AgMjAgYW5zd2Vyc1wiID0+IFwi2KPZgdi22YQgMjAg2KXYrNin2KjYqVwiIiwiLy8gVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIDEgdW50cmFuc2xhdGVkIG9yIGluaGVyaXRlZCBsb2NhbGl6YXRpb24gc3RyaW5ncy5cbi8vIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1lbnRlZCBvdXQuIFVuY29tbWVudCBhbmQgZWRpdCB0aGVtIGlmIHlvdSB3YW50IHRvIGFkZCB5b3VyIHRyYW5zbGF0aW9ucy5cbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZHV0Y2hTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCJHcm9lcCBkb29yIG1palwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIkRlZ3JvZXBlcmVuIGJpaiBtaWpcIixcbiAgc2VsZWN0QnV0dG9uOiBcIlNlbGVjdGVlciBtaWpcIixcbiAgaGlkZUNvbHVtbjogXCJLb2xvbSB2ZXJiZXJnZW5cIixcbiAgc2hvd0NvbHVtbjogXCJUb29uIGtvbG9tXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIktvbG9tIHByaXbDqSBtYWtlblwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIk1hYWsgZGUga29sb20gb3BlbmJhYXJcIixcbiAgbW92ZVRvRGV0YWlsOiBcIkdhIG5hYXIgRGV0YWlsXCIsXG4gIHNob3dBc0NvbHVtbjogXCJXZWVyZ2V2ZW4gYWxzIGtvbG9tXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlpvZWtlbi4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlZlcndpamRlciByaWplblwiLFxuICBzaG93TGFiZWw6IFwiVG9uZW5cIixcbiAgZW50cmllc0xhYmVsOiBcImluemVuZGluZ2VuXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJUZWtzdGVuIGluIHRhYmVsXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIldvcmRjbG91ZFwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1cIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiR2VtaWRkZWxkXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWZlbFwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiWmVla2FhcnRcIixcbiAgLy8gdmlzdWFsaXplcl9tYXRyaXg6IFwiQ2hhcnRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiVmVydGljYWxlIGJhbGtcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR2VzdGFwZWxkZSBCYXJcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvbnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiVGFhcnRcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiVmVyc3Ryb29pZW5cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIk1ldGVyXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiS29nZWxcIixcbiAgaGlkZUJ1dHRvbjogXCJWZXJiZXJnZW5cIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiTWFhayBwcml2ZVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIk9wZW5iYWFyIG1ha2VuXCIsXG4gIHNob3dCdXR0b246IFwiVG9uZW5cIixcbiAgZmlsdGVyOiBcIkZpbHRlclwiLFxuICByZXNldEZpbHRlcjogXCJGaWx0ZXIgcmVzZXR0ZW5cIixcbiAgY2hhbmdlTG9jYWxlOiBcIldpanppZyBkZSBsYW5kaW5zdGVsbGluZ1wiLFxuICBjbGVhckJ1dHRvbjogXCJEb29yemljaHRpZ1wiLFxuICBhZGRFbGVtZW50OiBcIktpZXMgZWVuIHZyYWFnIG9tIHdlZXIgdGUgZ2V2ZW4gLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJTdGFuZGFhcmR2b2xnb3JkZVwiLFxuICBhc2NPcmRlcjogXCJPcGxvcGVuZFwiLFxuICBkZXNjT3JkZXI6IFwiQWZsb3BlbmRcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJUb29uIGtsZWluZSBrb2xvbW1lblwiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBbmRlcmUgaXRlbXMgZW4gb3BtZXJraW5nZW5cIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIlBlcmNlbnRhZ2VzIHdlZXJnZXZlblwiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiVmVyYmVyZyBwZXJjZW50YWdlc1wiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkRvd25sb2FkIHBsb3QgYWxzIGVlbiBwbmdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJWZXJiZXJnIGxlZ2UgYW50d29vcmRlblwiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIlRvb24gbGVnZSBhbnR3b29yZGVuXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiQWxsZSBhbnR3b29yZGVuXCIsXG4gIHRvcE5WYWx1ZVRleHQ1OiBcIlRvcCA1IGFudHdvb3JkZW5cIixcbiAgdG9wTlZhbHVlVGV4dDEwOiBcIlRvcCAxMCBhbnR3b29yZGVuXCIsXG4gIHRvcE5WYWx1ZVRleHQyMDogXCJUb3AgMjAgYW50d29vcmRlblwiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiT250YnJla2VuZGUgYW50d29vcmRlbiB2ZXJiZXJnZW5cIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIk9udGJyZWtlbmRlIGFudHdvb3JkZW4gd2VlcmdldmVuXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiT250YnJla2VuZGUgYW50d29vcmRlblwiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJEaXQgdnJhYWd0eXBlIGlzIG5vZyBuaWV0IGdldmlzdWFsaXNlZXJkXCIsXG4gIG5vUmVzdWx0czogXCJFciB6aWpuIG5vZyBnZWVuIHJlc3VsdGF0ZW5cIixcbiAgc2hvd1BlclZhbHVlczogXCJQZXIgd2FhcmRlblwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQZXIgS29sb21tZW5cIixcbiAgYW5zd2VyOiBcIkFudHdvb3JkZW5cIixcbiAgY29ycmVjdEFuc3dlcjogXCJHb2VkIGFudHdvb3JkOiBcIixcbiAgcGVyY2VudDogXCJQcm9jZW50XCIsXG4gIHJlc3BvbnNlczogXCJSZWFjdGllc1wiXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wibmxcIl0gPSBkdXRjaFN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJubFwiXSA9IFwiTmVkZXJsYW5kc1wiO1xuXG4vLyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgYnkgYSBtYWNoaW5lIHRyYW5zbGF0aW9uIHNlcnZpY2Vcbi8vIFJlbW92ZSB0aG9zZSBzdHJpbmdzIHRoYXQgeW91IGhhdmUgY29ycmVjdGVkIG1hbnVhbGx5XG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtXCIgPT4gXCJIaXN0b2dyYW1cIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfbnVtYmVyOiBcIkF2ZXJhZ2VcIiA9PiBcIkdlbWlkZGVsZFwiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmxlXCIgPT4gXCJUYWZlbFwiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkNoYXJ0XCIgPT4gXCJaZWVrYWFydFwiXG4vLyB1bmRlZmluZWQuY2hhcnRUeXBlX3ZiYXI6IFwiVmVydGljYWwgQmFyXCIgPT4gXCJWZXJ0aWNhbGUgYmFsa1wiXG4vLyB1bmRlZmluZWQuZmlsdGVyOiBcIkZpbHRlclwiID0+IFwiRmlsdGVyXCJcbi8vIHVuZGVmaW5lZC5oaWRlTWlzc2luZ0Fuc3dlcnM6IFwiSGlkZSBtaXNzaW5nIGFuc3dlcnNcIiA9PiBcIk9udGJyZWtlbmRlIGFudHdvb3JkZW4gdmVyYmVyZ2VuXCJcbi8vIHVuZGVmaW5lZC5zaG93TWlzc2luZ0Fuc3dlcnM6IFwiU2hvdyBtaXNzaW5nIGFuc3dlcnNcIiA9PiBcIk9udGJyZWtlbmRlIGFudHdvb3JkZW4gd2VlcmdldmVuXCJcbi8vIHVuZGVmaW5lZC5taXNzaW5nQW5zd2Vyc0xhYmVsOiBcIk1pc3NpbmcgYW5zd2Vyc1wiID0+IFwiT250YnJla2VuZGUgYW50d29vcmRlblwiXG4vLyB1bmRlZmluZWQubm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiVGhpcyBxdWVzdGlvbiB0eXBlIGlzIG5vdCB2aXN1YWxpemVkIHlldFwiID0+IFwiRGl0IHZyYWFndHlwZSBpcyBub2cgbmlldCBnZXZpc3VhbGlzZWVyZFwiXG4vLyB1bmRlZmluZWQubm9SZXN1bHRzOiBcIlRoZXJlIGFyZSBubyByZXN1bHRzIHlldFwiID0+IFwiRXIgemlqbiBub2cgZ2VlbiByZXN1bHRhdGVuXCJcbi8vIHVuZGVmaW5lZC5zaG93UGVyVmFsdWVzOiBcIlBlciBWYWx1ZXNcIiA9PiBcIlBlciB3YWFyZGVuXCJcbi8vIHVuZGVmaW5lZC5zaG93UGVyQ29sdW1uczogXCJQZXIgQ29sdW1uc1wiID0+IFwiUGVyIEtvbG9tbWVuXCJcbi8vIHVuZGVmaW5lZC5hbnN3ZXI6IFwiQW5zd2VyXCIgPT4gXCJBbnR3b29yZGVuXCJcbi8vIHVuZGVmaW5lZC5jb3JyZWN0QW5zd2VyOiBcIkNvcnJlY3QgYW5zd2VyOiBcIiA9PiBcIkdvZWQgYW50d29vcmQ6IFwiXG4vLyB1bmRlZmluZWQucGVyY2VudDogXCJQZXJjZW50XCIgPT4gXCJQcm9jZW50XCJcbi8vIHVuZGVmaW5lZC5yZXNwb25zZXM6IFwiUmVzcG9uc2VzXCIgPT4gXCJSZWFjdGllc1wiIiwiLy8gVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSBjcmVhdGUgYSBjdXN0b20gZGljdGlvbmFyeVxuLy8gaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBlbmdsaXNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvdXAgQnkgTWVcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJVbmdyb3VwIEJ5IE1lXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY3QgTWVcIixcbiAgaGlkZUNvbHVtbjogXCJIaWRlIGNvbHVtblwiLFxuICBzaG93Q29sdW1uOiBcIlNob3cgY29sdW1uXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIk1ha2UgY29sdW1uIHByaXZhdGVcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJNYWtlIGNvbHVtbiBwdWJsaWNcIixcbiAgbW92ZVRvRGV0YWlsOiBcIk1vdmUgdG8gRGV0YWlsXCIsXG4gIHNob3dBc0NvbHVtbjogXCJTaG93IGFzIENvbHVtblwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIixcbiAgcmVtb3ZlUm93czogXCJSZW1vdmUgcm93c1wiLFxuICBzaG93TGFiZWw6IFwiU2hvd1wiLFxuICBlbnRyaWVzTGFiZWw6IFwiZW50cmllc1wiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dHMgaW4gdGFibGVcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiV29yZGNsb3VkXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJBdmVyYWdlXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJsZVwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiQ2hhcnRcIixcbiAgdmlzdWFsaXplcl9tYXRyaXg6IFwiQ2hhcnRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiVmVydGljYWwgQmFyXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIlN0YWNrZWQgQmFyXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb3VnaG51dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlBpZVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJTY2F0dGVyXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxldFwiLFxuICBoaWRlQnV0dG9uOiBcIkhpZGVcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiTWFrZSBwcml2YXRlXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiTWFrZSBwdWJsaWNcIixcbiAgc2hvd0J1dHRvbjogXCJTaG93XCIsXG4gIGZpbHRlcjogXCJGaWx0ZXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmVzZXQgRmlsdGVyXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJDaGFuZ2UgTG9jYWxlXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkNsZWFyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiQ2hvb3NlIHF1ZXN0aW9uIHRvIHNob3cuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIkRlZmF1bHQgT3JkZXJcIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kaW5nXCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kaW5nXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiU2hvdyBtaW5vciBjb2x1bW5zXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIk90aGVyIGl0ZW1zIGFuZCBjb21tZW50c1wiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiU2hvdyBwZXJjZW50YWdlc1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiSGlkZSBwZXJjZW50YWdlc1wiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkRvd25sb2FkIHBsb3QgYXMgYSBQTkcgZmlsZVwiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIkhpZGUgZW1wdHkgYW5zd2Vyc1wiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIlNob3cgZW1wdHkgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIkFsbCBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDVcIjogXCJUb3AgNSBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDEwXCI6IFwiVG9wIDEwIGFuc3dlcnNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCJUb3AgMjAgYW5zd2Vyc1wiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiSGlkZSBtaXNzaW5nIGFuc3dlcnNcIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIlNob3cgbWlzc2luZyBhbnN3ZXJzXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiTWlzc2luZyBhbnN3ZXJzXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIlRoaXMgcXVlc3Rpb24gdHlwZSBpcyBub3QgdmlzdWFsaXplZCB5ZXRcIixcbiAgbm9SZXN1bHRzOiBcIlRoZXJlIGFyZSBubyByZXN1bHRzIHlldFwiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBlciBWYWx1ZXNcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGVyIENvbHVtbnNcIixcbiAgYW5zd2VyOiBcIkFuc3dlclwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIkNvcnJlY3QgYW5zd2VyOiBcIixcbiAgcGVyY2VudDogXCJQZXJjZW50XCIsXG4gIHJlc3BvbnNlczogXCJSZXNwb25zZXNcIlxufTtcblxuLy8gVW5jb21tZW50IHRoZSBsaW5lcyBiZWxvdyBpZiB5b3UgY3JlYXRlIGEgY3VzdG9tIGRpY3Rpb25hcnkuXG4vLyBSZXBsYWNlIFwiZW5cIiB3aXRoIGEgY3VzdG9tIGxvY2FsZSBjb2RlIChmb3IgZXhhbXBsZSwgXCJmclwiIG9yIFwiZGVcIiksXG4vLyBSZXBsYWNlIGBlbmdsaXNoU3RyaW5nc2Agd2l0aCB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCBjb250YWlucyB0aGUgY3VzdG9tIGRpY3Rpb25hcnkuXG4vLyBsb2NhbGl6YXRpb24ubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4vLyBsb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJlblwiXSA9IFwiRW5nbGlzaFwiO1xuIiwiLy8gVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIDEgdW50cmFuc2xhdGVkIG9yIGluaGVyaXRlZCBsb2NhbGl6YXRpb24gc3RyaW5ncy5cbi8vIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1lbnRlZCBvdXQuIFVuY29tbWVudCBhbmQgZWRpdCB0aGVtIGlmIHlvdSB3YW50IHRvIGFkZCB5b3VyIHRyYW5zbGF0aW9ucy5cbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZmFyc2lTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCLar9ix2YjZhyDYqNmG2K/bjCDYqNinXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwi2K3YsNmBINqv2LHZiNmHXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCLYp9mG2KrYrtin2KhcIixcbiAgaGlkZUNvbHVtbjogXCLZhdiu2YHbjCDaqdix2K/ZhiDYs9iq2YjZhlwiLFxuICBzaG93Q29sdW1uOiBcItmG2YXYp9uM2LQg2LPYqtmI2YZcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwi2K7YtdmI2LXbjCDaqdix2K/ZhiDYs9iq2YjZhlwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIti52YXZiNmF24wg2qnYsdiv2YYg2LPYqtmI2YZcIixcbiAgbW92ZVRvRGV0YWlsOiBcItin2YbYqtmC2KfZhCDYqNmHINis2LLYptuM2KfYqlwiLFxuICBzaG93QXNDb2x1bW46IFwi2YbZhdin24zYtCDYqNmHINi52YbZiNin2YYg2LPYqtmI2YZcIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwi2KzYs9iq2KzZiC4uLlwiLFxuICByZW1vdmVSb3dzOiBcItit2LDZgSDYs9i32LHZh9inXCIsXG4gIHNob3dMYWJlbDogXCLZhtmF2KfbjNi0XCIsXG4gIGVudHJpZXNMYWJlbDogXCLZiNix2YjYr9uMXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCLZhdiq2YjZhiDYr9ixINis2K/ZiNmEXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcItin2KjYsSDaqdmE2YXYp9iqXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcItmH24zYs9iq2Yjar9ix2KfZhVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCLZhdiq2YjYs9i3XCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCLYrNiv2YjZhFwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwi2YbZhdmI2K/Yp9ixXCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwi2YXbjNmE2Ycg2KfbjFwiLFxuICBjaGFydFR5cGVfdmJhcjogXCLZhtmI2KfYsSDYudmF2YjYr9uMXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcItmG2YjYp9ixINm+2LTYqtmHXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCLYr9mI2YbYp9iqXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwi2K/Yp9io2LHZhyDYp9uMKHBpZSlcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwi2b7Ysdin2qnZhtiv2q/bjChTY2F0dGVyKVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwi2LnZgtix2KjZhyDYp9uMXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwi2YXYrtmB24xcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwi2K7YtdmI2LXbjCDaqdix2K/ZhlwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIti52YXZiNmF24wg2qnYsdiv2YZcIixcbiAgc2hvd0J1dHRvbjogXCLZhtmF2KfbjNi0XCIsXG4gIGZpbHRlcjogXCLZgduM2YTYqtixXCIsXG4gIHJlc2V0RmlsdGVyOiBcItio2KfYstmG2LTYp9mG24wg2YHbjNmE2KrYsdmH2KdcIixcbiAgY2hhbmdlTG9jYWxlOiBcItiq2LrbjNuM2LEg2YXYrdmE24xcIixcbiAgY2xlYXJCdXR0b246IFwi2b7Yp9qpINqp2LHYr9mGXCIsXG4gIGFkZEVsZW1lbnQ6IFwi2KfZhtiq2K7Yp9ioINiz2YjYp9mEINio2LHYp9uMINmG2YXYp9uM2LQuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcItiq2LHYqtuM2Kgg2b7bjNi02YHYsdi2XCIsXG4gIGFzY09yZGVyOiBcIti12LnZiNiv24xcIixcbiAgZGVzY09yZGVyOiBcItmG2LLZiNmE24xcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCLZhtmF2KfbjNi0INiz2KrZiNmG2YfYp9uMINmB2LHYuduMXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcItiz2KfbjNixINmF2YjYp9ix2K8g2Ygg2YbYuNix2KfYqlwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwi2YbZhdin24zYtCDYr9ix2LXYr1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwi2K/Ysdi12K/Zh9in24wg2YXYrtmB24xcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcItm+24wg2K/bjCDYp9mBXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwi2Kfaqdiz2YRcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNzdlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcItiv2KfZhtmE2YjYryDYt9ix2K0g2KjZhyDYudmG2YjYp9mGINuM2qkg2YHYp9uM2YQgUE5HXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwi2YXYrtmB24wg2qnYsdiv2YYg2b7Yp9iz2K7Zh9in24wg2K7Yp9mE24xcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCLZhtmF2KfbjNi0INm+2KfYs9iu2YfYp9uMINiu2KfZhNuMXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwi2YfZhdmHINm+2KfYs9iuINmH2KdcIixcbiAgdG9wTlZhbHVlVGV4dDU6IFwiNSDZvtin2LPYriDYqNix2KrYsVwiLFxuICB0b3BOVmFsdWVUZXh0MTA6IFwiMTAg2b7Yp9iz2K4g2KjYsdiq2LFcIixcbiAgdG9wTlZhbHVlVGV4dDIwOiBcIjIwINm+2KfYs9iuINio2LHYqtixXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCLZhdiu2YHbjCDaqdix2K/ZhiDZvtin2LPYrtmH2KfbjCDar9mF2LTYr9mHXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCLZhtmF2KfbjNi0INm+2KfYs9iu2YfYp9uMINqv2YXYtNiv2YdcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCLZvtin2LPYriDZh9in24wg2q/Zhdi02K/Zh1wiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCLYp9uM2YYg2YbZiNi5INiz2YjYp9mEINmH2YbZiNiyINiq2KzYs9mFINmG2LTYr9mHINin2LPYqlwiLFxuICBub1Jlc3VsdHM6IFwi2YfZhtmI2LIg2YbYqtuM2KzZhyDYp9uMINit2KfYtdmEINmG2LTYr9mHINin2LPYqlwiLFxuICBzaG93UGVyVmFsdWVzOiBcItio2Ycg2KfYstin24wg2YfYsSDYp9ix2LLYtFwiLFxuICBzaG93UGVyQ29sdW1uczogXCLYr9ixINmH2LEg2LPYqtmI2YZcIixcbiAgYW5zd2VyOiBcItm+2KfYs9iuXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwi2b7Yp9iz2K4g2LXYrduM2K06IFwiLFxuICBwZXJjZW50OiBcItiv2LHYtdivXCIsXG4gIHJlc3BvbnNlczogXCLZvtin2LPYrlwiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImZhXCJdID0gZmFyc2lTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZmFcIl0gPSBcItmB2KfYsdiz24xcIjtcblxuLy8gVGhlIGZvbGxvd2luZyBzdHJpbmdzIGhhdmUgYmVlbiB0cmFuc2xhdGVkIGJ5IGEgbWFjaGluZSB0cmFuc2xhdGlvbiBzZXJ2aWNlXG4vLyBSZW1vdmUgdGhvc2Ugc3RyaW5ncyB0aGF0IHlvdSBoYXZlIGNvcnJlY3RlZCBtYW51YWxseVxuLy8gdW5kZWZpbmVkLm1ha2VQcml2YXRlQ29sdW1uOiBcIk1ha2UgY29sdW1uIHByaXZhdGVcIiA9PiBcItiu2LXZiNi124wg2qnYsdiv2YYg2LPYqtmI2YZcIlxuLy8gdW5kZWZpbmVkLm1ha2VQdWJsaWNDb2x1bW46IFwiTWFrZSBjb2x1bW4gcHVibGljXCIgPT4gXCLYudmF2YjZhduMINqp2LHYr9mGINiz2KrZiNmGXCJcbi8vIHVuZGVmaW5lZC5maWx0ZXJQbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIiA9PiBcItis2LPYqtis2YguLi5cIlxuLy8gdW5kZWZpbmVkLnJlbW92ZVJvd3M6IFwiUmVtb3ZlIHJvd3NcIiA9PiBcItit2LDZgSDYs9i32LHZh9inXCJcbi8vIHVuZGVmaW5lZC5zaG93TGFiZWw6IFwiU2hvd1wiID0+IFwi2YbZhdin24zYtFwiXG4vLyB1bmRlZmluZWQuZW50cmllc0xhYmVsOiBcImVudHJpZXNcIiA9PiBcItmI2LHZiNiv24xcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbVwiID0+IFwi2YfbjNiz2KrZiNqv2LHYp9mFXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX251bWJlcjogXCJBdmVyYWdlXCIgPT4gXCLZhdiq2YjYs9i3XCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFibGVcIiA9PiBcItis2K/ZiNmEXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiQ2hhcnRcIiA9PiBcItmG2YXZiNiv2KfYsVwiXG4vLyB1bmRlZmluZWQuY2hhcnRUeXBlX3ZiYXI6IFwiVmVydGljYWwgQmFyXCIgPT4gXCLZhtmI2KfYsSDYudmF2YjYr9uMXCJcbi8vIHVuZGVmaW5lZC5jaGFydFR5cGVfc3RhY2tlZGJhcjogXCJTdGFja2VkIEJhclwiID0+IFwi2YbZiNin2LEg2b7YtNiq2YdcIlxuLy8gdW5kZWZpbmVkLmNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb3VnaG51dFwiID0+IFwi2K/ZiNmG2KfYqlwiXG4vLyB1bmRlZmluZWQubWFrZVByaXZhdGVCdXR0b246IFwiTWFrZSBwcml2YXRlXCIgPT4gXCLYrti12YjYtduMINqp2LHYr9mGXCJcbi8vIHVuZGVmaW5lZC5tYWtlUHVibGljQnV0dG9uOiBcIk1ha2UgcHVibGljXCIgPT4gXCLYudmF2YjZhduMINqp2LHYr9mGXCJcbi8vIHVuZGVmaW5lZC5zaG93QnV0dG9uOiBcIlNob3dcIiA9PiBcItmG2YXYp9uM2LRcIlxuLy8gdW5kZWZpbmVkLmZpbHRlcjogXCJGaWx0ZXJcIiA9PiBcItmB24zZhNiq2LFcIlxuLy8gdW5kZWZpbmVkLmNoYW5nZUxvY2FsZTogXCJDaGFuZ2UgTG9jYWxlXCIgPT4gXCLYqti624zbjNixINmF2K3ZhNuMXCJcbi8vIHVuZGVmaW5lZC5kZWZhdWx0T3JkZXI6IFwiRGVmYXVsdCBPcmRlclwiID0+IFwi2KrYsdiq24zYqCDZvtuM2LTZgdix2LZcIlxuLy8gdW5kZWZpbmVkLmFzY09yZGVyOiBcIkFzY2VuZGluZ1wiID0+IFwi2LXYudmI2K/bjFwiXG4vLyB1bmRlZmluZWQuZGVzY09yZGVyOiBcIkRlc2NlbmRpbmdcIiA9PiBcItmG2LLZiNmE24xcIlxuLy8gdW5kZWZpbmVkLnNob3dNaW5vckNvbHVtbnM6IFwiU2hvdyBtaW5vciBjb2x1bW5zXCIgPT4gXCLZhtmF2KfbjNi0INiz2KrZiNmG2YfYp9uMINmB2LHYuduMXCJcbi8vIHVuZGVmaW5lZC5vdGhlckNvbW1lbnRUaXRsZTogXCJPdGhlciBpdGVtcyBhbmQgY29tbWVudHNcIiA9PiBcItiz2KfbjNixINmF2YjYp9ix2K8g2Ygg2YbYuNix2KfYqlwiXG4vLyB1bmRlZmluZWQuc2hvd1BlcmNlbnRhZ2VzOiBcIlNob3cgcGVyY2VudGFnZXNcIiA9PiBcItmG2YXYp9uM2LQg2K/Ysdi12K9cIlxuLy8gdW5kZWZpbmVkLmhpZGVQZXJjZW50YWdlczogXCJIaWRlIHBlcmNlbnRhZ2VzXCIgPT4gXCLYr9ix2LXYr9mH2KfbjCDZhdiu2YHbjFwiXG4vLyB1bmRlZmluZWQucGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiID0+IFwi2b7bjCDYr9uMINin2YFcIlxuLy8gdW5kZWZpbmVkLnhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIiA9PiBcItin2qnYs9mEXCJcbi8vIHVuZGVmaW5lZC5jc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIgPT4gXCJDc3ZcIlxuLy8gdW5kZWZpbmVkLnNhdmVEaWFncmFtQXNQTkc6IFwiRG93bmxvYWQgcGxvdCBhcyBhIFBORyBmaWxlXCIgPT4gXCLYr9in2YbZhNmI2K8g2LfYsditINio2Ycg2LnZhtmI2KfZhiDbjNqpINmB2KfbjNmEIFBOR1wiXG4vLyB1bmRlZmluZWQuaGlkZUVtcHR5QW5zd2VyczogXCJIaWRlIGVtcHR5IGFuc3dlcnNcIiA9PiBcItmF2K7ZgduMINqp2LHYr9mGINm+2KfYs9iu2YfYp9uMINiu2KfZhNuMXCJcbi8vIHVuZGVmaW5lZC5zaG93RW1wdHlBbnN3ZXJzOiBcIlNob3cgZW1wdHkgYW5zd2Vyc1wiID0+IFwi2YbZhdin24zYtCDZvtin2LPYrtmH2KfbjCDYrtin2YTbjFwiXG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dC0xOiBcIkFsbCBhbnN3ZXJzXCIgPT4gXCLZh9mF2Ycg2b7Yp9iz2K4g2YfYp1wiXG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dDU6IFwiVG9wIDUgYW5zd2Vyc1wiID0+IFwiNSDZvtin2LPYriDYqNix2KrYsVwiXG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dDEwOiBcIlRvcCAxMCBhbnN3ZXJzXCIgPT4gXCIxMCDZvtin2LPYriDYqNix2KrYsVwiXG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dDIwOiBcIlRvcCAyMCBhbnN3ZXJzXCIgPT4gXCIyMCDZvtin2LPYriDYqNix2KrYsVwiXG4vLyB1bmRlZmluZWQuaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIkhpZGUgbWlzc2luZyBhbnN3ZXJzXCIgPT4gXCLZhdiu2YHbjCDaqdix2K/ZhiDZvtin2LPYrtmH2KfbjCDar9mF2LTYr9mHXCJcbi8vIHVuZGVmaW5lZC5zaG93TWlzc2luZ0Fuc3dlcnM6IFwiU2hvdyBtaXNzaW5nIGFuc3dlcnNcIiA9PiBcItmG2YXYp9uM2LQg2b7Yp9iz2K7Zh9in24wg2q/Zhdi02K/Zh1wiXG4vLyB1bmRlZmluZWQubWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJNaXNzaW5nIGFuc3dlcnNcIiA9PiBcItm+2KfYs9iuINmH2KfbjCDar9mF2LTYr9mHXCJcbi8vIHVuZGVmaW5lZC5ub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJUaGlzIHF1ZXN0aW9uIHR5cGUgaXMgbm90IHZpc3VhbGl6ZWQgeWV0XCIgPT4gXCLYp9uM2YYg2YbZiNi5INiz2YjYp9mEINmH2YbZiNiyINiq2KzYs9mFINmG2LTYr9mHINin2LPYqlwiXG4vLyB1bmRlZmluZWQubm9SZXN1bHRzOiBcIlRoZXJlIGFyZSBubyByZXN1bHRzIHlldFwiID0+IFwi2YfZhtmI2LIg2YbYqtuM2KzZhyDYp9uMINit2KfYtdmEINmG2LTYr9mHINin2LPYqlwiXG4vLyB1bmRlZmluZWQuc2hvd1BlclZhbHVlczogXCJQZXIgVmFsdWVzXCIgPT4gXCLYqNmHINin2LLYp9uMINmH2LEg2KfYsdiy2LRcIlxuLy8gdW5kZWZpbmVkLnNob3dQZXJDb2x1bW5zOiBcIlBlciBDb2x1bW5zXCIgPT4gXCLYr9ixINmH2LEg2LPYqtmI2YZcIlxuLy8gdW5kZWZpbmVkLmFuc3dlcjogXCJBbnN3ZXJcIiA9PiBcItm+2KfYs9iuXCJcbi8vIHVuZGVmaW5lZC5jb3JyZWN0QW5zd2VyOiBcIkNvcnJlY3QgYW5zd2VyOiBcIiA9PiBcItm+2KfYs9iuINi12K3bjNitOiBcIlxuLy8gdW5kZWZpbmVkLnBlcmNlbnQ6IFwiUGVyY2VudFwiID0+IFwi2K/Ysdi12K9cIlxuLy8gdW5kZWZpbmVkLnJlc3BvbnNlczogXCJSZXNwb25zZXNcIiA9PiBcItm+2KfYs9iuXCJcbiIsIi8vIFRoaXMgZGljdGlvbmFyeSBjb250YWlucyAxIHVudHJhbnNsYXRlZCBvciBpbmhlcml0ZWQgbG9jYWxpemF0aW9uIHN0cmluZ3MuXG4vLyBUaGVzZSBzdHJpbmdzIGFyZSBjb21tZW50ZWQgb3V0LiBVbmNvbW1lbnQgYW5kIGVkaXQgdGhlbSBpZiB5b3Ugd2FudCB0byBhZGQgeW91ciB0cmFuc2xhdGlvbnMuXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGZyZW5jaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb3VwZXJcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEaXNzb2NpZXJcIixcbiAgc2VsZWN0QnV0dG9uOiBcIlPDqWxlY3Rpb25uZXJcIixcbiAgaGlkZUNvbHVtbjogXCJNYXNxdWVyIGNvbG9ubmVcIixcbiAgc2hvd0NvbHVtbjogXCJBZmZpY2hlciBjb2xvbm5lXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIlJlbmRyZSBsYSBjb2xvbm5lIHByaXbDqVwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIlJlbmRyZSBsYSBjb2xvbm5lIHB1YmxpY1wiLFxuICBtb3ZlVG9EZXRhaWw6IFwiRMOpcGxhY2VyIHZlcnMgZMOpdGFpbHNcIixcbiAgc2hvd0FzQ29sdW1uOiBcIkFmZmljaGVyIGVuIGNvbG9ubmVcIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiUmVjaGVyY2hlci4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlN1cHByaW1lciBjb2xvbm5lXCIsXG4gIHNob3dMYWJlbDogXCJBZmZpY2hlclwiLFxuICBlbnRyaWVzTGFiZWw6IFwiZW50csOpZXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRlcyBlbiB0YWJsZVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJOdWFnZXMgZGUgbW90c1wiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1tZVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJNb3llbm5lXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJsZVwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiR3JhcGhpcXVlXCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFycmVzXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIkJhcnJlIHZlcnRpY2FsZVwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJCYXJyZXMgZW1waWzDqWVzXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJBbm5lYXVcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJTZWN0ZXVyc1wiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJOdWFnZXMgZGUgcG9pbnRzXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxlc1wiLFxuICBoaWRlQnV0dG9uOiBcIk1hc3F1ZXJcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiUmVuZHJlIHByaXbDqVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIlJlbmRyZSBwdWJsaXF1ZVwiLFxuICBzaG93QnV0dG9uOiBcIkFmZmljaGVyXCIsXG4gIGZpbHRlcjogXCJGaWx0cmVcIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmFmcmFpY2hpciBGaWx0cmVzXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJDaGFuZ2VyIGxlcyBwYXJhbcOodHJlcyByw6lnaW9uYXV4XCIsXG4gIGNsZWFyQnV0dG9uOiBcIlJhZnJhaWNoaXJcIixcbiAgYWRkRWxlbWVudDogXCJDaG9pc2lyIGxhIHF1ZXN0aW9uIMOgIGFmZmljaGVyLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJEZWZhdXRcIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kYW50XCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kYW50XCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiQWZmaWNoZXIgbGVzIGNvbG9ubmVzIG1pbmV1cmVzXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkF1dHJlIMOpbMOpbWVudCBldCBjb21tZW50YWlyZXNcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIkFmZmljaGVyIGxlcyBwb3VyY2VudGFnZXNcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIk1hc3F1ZXIgbGVzIHBvdXJjZW50YWdlc1wiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxsZXJcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkZpY2hpZXIgQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiU2F1dmVyIGVuIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIk1hc3F1ZXIgbGVzIHLDqXBvbnNlcyB2aWRlc1wiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIkFmZmljaGVyIGxlcyByw6lwb25zZXMgdmlkZXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJUb3V0ZXMgbGVzIHLDqXBvbnNlc1wiLFxuICB0b3BOVmFsdWVUZXh0NTogXCJUb3AgNSBkZXMgcsOpcG9uc2VzXCIsXG4gIHRvcE5WYWx1ZVRleHQxMDogXCJUb3AgMTAgZGVzIHLDqXBvbnNlc1wiLFxuICB0b3BOVmFsdWVUZXh0MjA6IFwiVG9wIDIwIGRlcyByw6lwb25zZXNcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIk1hc3F1ZXIgbGVzIHLDqXBvbnNlcyBtYW5xdWFudGVzXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJBZmZpY2hlciBsZXMgcsOpcG9uc2VzIG1hbnF1YW50ZXNcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJSw6lwb25zZXMgbWFucXVhbnRlc1wiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJDZSB0eXBlIGRlIHF1ZXN0aW9uIG4nZXN0IHBhcyBlbmNvcmUgdmlzdWFsaXPDqVwiLFxuICBub1Jlc3VsdHM6IFwiSWwgbid5IGEgcGFzIGVuY29yZSBkZSByw6lzdWx0YXRzXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwiUGFyIHZhbGV1clwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQYXIgY29sb25uZVwiLFxuICBhbnN3ZXI6IFwiUsOpcG9uc2VcIixcbiAgY29ycmVjdEFuc3dlcjogXCJSw6lwb25zZSBjb3JyZWN0ZTogXCIsXG4gIHBlcmNlbnQ6IFwiUG91cmNlbnRhZ2VcIixcbiAgcmVzcG9uc2VzOiBcIlLDqXBvbnNlc1wiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImZyXCJdID0gZnJlbmNoU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImZyXCJdID0gXCJGcmFuw6dhaXNcIjtcblxuLy8gVGhlIGZvbGxvd2luZyBzdHJpbmdzIGhhdmUgYmVlbiB0cmFuc2xhdGVkIGJ5IGEgbWFjaGluZSB0cmFuc2xhdGlvbiBzZXJ2aWNlXG4vLyBSZW1vdmUgdGhvc2Ugc3RyaW5ncyB0aGF0IHlvdSBoYXZlIGNvcnJlY3RlZCBtYW51YWxseVxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbVwiID0+IFwiSGlzdG9ncmFtbWVcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfbnVtYmVyOiBcIkF2ZXJhZ2VcIiA9PiBcIk1veWVubmVcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJsZVwiID0+IFwiVGFibGVcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJDaGFydFwiID0+IFwiR3JhcGhpcXVlXCJcbi8vIHVuZGVmaW5lZC5jaGFydFR5cGVfdmJhcjogXCJWZXJ0aWNhbCBCYXJcIiA9PiBcIkJhcnJlIHZlcnRpY2FsZVwiXG4vLyB1bmRlZmluZWQuY2hhbmdlTG9jYWxlOiBcIkNoYW5nZSBMb2NhbGVcIiA9PiBcIkNoYW5nZXIgbGVzIHBhcmFtw6h0cmVzIHLDqWdpb25hdXhcIlxuLy8gdW5kZWZpbmVkLnNob3dQZXJjZW50YWdlczogXCJTaG93IHBlcmNlbnRhZ2VzXCIgPT4gXCJBZmZpY2hlciBsZXMgcG91cmNlbnRhZ2VzXCJcbi8vIHVuZGVmaW5lZC5oaWRlUGVyY2VudGFnZXM6IFwiSGlkZSBwZXJjZW50YWdlc1wiID0+IFwiTWFzcXVlciBsZXMgcG91cmNlbnRhZ2VzXCJcbi8vIHVuZGVmaW5lZC5wZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIgPT4gXCJQREZcIlxuLy8gdW5kZWZpbmVkLnhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIiA9PiBcIkV4Y2VsbGVyXCJcbi8vIHVuZGVmaW5lZC5jc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIgPT4gXCJGaWNoaWVyIENTVlwiXG4vLyB1bmRlZmluZWQuaGlkZUVtcHR5QW5zd2VyczogXCJIaWRlIGVtcHR5IGFuc3dlcnNcIiA9PiBcIk1hc3F1ZXIgbGVzIHLDqXBvbnNlcyB2aWRlc1wiXG4vLyB1bmRlZmluZWQuc2hvd0VtcHR5QW5zd2VyczogXCJTaG93IGVtcHR5IGFuc3dlcnNcIiA9PiBcIkFmZmljaGVyIGxlcyByw6lwb25zZXMgdmlkZXNcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQtMTogXCJBbGwgYW5zd2Vyc1wiID0+IFwiVG91dGVzIGxlcyByw6lwb25zZXNcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQ1OiBcIlRvcCA1IGFuc3dlcnNcIiA9PiBcIlRvcCA1IGRlcyByw6lwb25zZXNcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQxMDogXCJUb3AgMTAgYW5zd2Vyc1wiID0+IFwiVG9wIDEwIGRlcyByw6lwb25zZXNcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQyMDogXCJUb3AgMjAgYW5zd2Vyc1wiID0+IFwiVG9wIDIwIGRlcyByw6lwb25zZXNcIlxuLy8gdW5kZWZpbmVkLmhpZGVNaXNzaW5nQW5zd2VyczogXCJIaWRlIG1pc3NpbmcgYW5zd2Vyc1wiID0+IFwiTWFzcXVlciBsZXMgcsOpcG9uc2VzIG1hbnF1YW50ZXNcIlxuLy8gdW5kZWZpbmVkLnNob3dNaXNzaW5nQW5zd2VyczogXCJTaG93IG1pc3NpbmcgYW5zd2Vyc1wiID0+IFwiQWZmaWNoZXIgbGVzIHLDqXBvbnNlcyBtYW5xdWFudGVzXCJcbi8vIHVuZGVmaW5lZC5taXNzaW5nQW5zd2Vyc0xhYmVsOiBcIk1pc3NpbmcgYW5zd2Vyc1wiID0+IFwiUsOpcG9uc2VzIG1hbnF1YW50ZXNcIiIsIi8vIFRoaXMgZGljdGlvbmFyeSBjb250YWlucyAxIHVudHJhbnNsYXRlZCBvciBpbmhlcml0ZWQgbG9jYWxpemF0aW9uIHN0cmluZ3MuXG4vLyBUaGVzZSBzdHJpbmdzIGFyZSBjb21tZW50ZWQgb3V0LiBVbmNvbW1lbnQgYW5kIGVkaXQgdGhlbSBpZiB5b3Ugd2FudCB0byBhZGQgeW91ciB0cmFuc2xhdGlvbnMuXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGdlcm1hblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdydXBwaWVyZW5cIixcbiAgdW5ncm91cEJ1dHRvbjogXCJHcnVwcGllcnVuZyBhdWZoZWJlblwiLFxuICBzZWxlY3RCdXR0b246IFwiTWljaCBhdXN3w6RobGVuXCIsXG4gIGhpZGVDb2x1bW46IFwiU3BhbHRlIGF1c2JsZW5kZW5cIixcbiAgc2hvd0NvbHVtbjogXCJTcGFsdGUgZWluYmxlbmRlblwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJTcGFsdGUgcHJpdmF0IG1hY2hlblwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIlNwYWx0ZSB2ZXLDtmZmZW50bGljaGVuXCIsXG4gIG1vdmVUb0RldGFpbDogXCJpbiBEZXRhaWxzIHZlcnNjaGllYmVuXCIsXG4gIHNob3dBc0NvbHVtbjogXCJBbHMgU3BhbHRlIGFuemVpZ2VuXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlN1Y2hlLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiWmVpbGVuIGVudGZlcm5lblwiLFxuICBzaG93TGFiZWw6IFwiYW56ZWlnZW5cIixcbiAgZW50cmllc0xhYmVsOiBcIkVpbnRyw6RnZVwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dGUgaW4gVGFiZWxsZW5mb3JtXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIldvcmRjbG91ZFwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1tXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIkR1cmNoc2Nobml0dFwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiTGlzdGVcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkRpYWdyYW1tdHlwXCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFsa2VuZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiQmFsa2VuZGlhZ3JhbW0gdmVydGlrYWxcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR2VzdGFwZWx0ZXMgQmFsa2VuZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvbnV0LURpYWdyYW1tXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiS3JlaXNkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJQdW5rdGVkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiUGVnZWxkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkF1ZnrDpGhsdW5nc2RpYWdyYW1tXCIsXG4gIGhpZGVCdXR0b246IFwiQXVzYmxlbmRlblwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJQcml2YXQgbWFjaGVuXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiw5ZmZmVudGxpY2ggbWFjaGVuXCIsXG4gIHNob3dCdXR0b246IFwiQW56ZWlnZW5cIixcbiAgZmlsdGVyOiBcIkZpbHRlclwiLFxuICByZXNldEZpbHRlcjogXCJGaWx0ZXIgenVyw7xja3NldHplblwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiTG9rYWxpc2llcnVuZyDDpG5kZXJuXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkVpbnN0ZWxsdW5nZW4gbMO2c2NoZW5cIixcbiAgYWRkRWxlbWVudDogXCJXw6RobGVuIFNpZSBlaW5lIEZyYWdlLCB1bSB6dSB6ZWlnZW4uLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIlN0YW5kYXJkcmVpaGVuZm9sZ2VcIixcbiAgYXNjT3JkZXI6IFwiQXVmc3RlaWdlbmRcIixcbiAgZGVzY09yZGVyOiBcIkFic3RlaWdlbmRcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJLbGVpbmVyZSBTcGFsdGVuIGFuemVpZ2VuXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkFuZGVyZSBQdW5rdGUgdW5kIEtvbW1lbnRhcmVcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIlByb3plbnRzw6R0emUgYW56ZWlnZW5cIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlByb3plbnRzw6R0emUgYXVzYmxlbmRlblwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkRpYWdyYW1tIGFscyBwbmcgaGVydW50ZXJsYWRlblwiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIkxlZXJlIEFudHdvcnRlbiBhdXNibGVuZGVuXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTGVlcmUgQW50d29ydGVuIGFuemVpZ2VuXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiQWxsZSBBbnR3b3J0ZW5cIixcbiAgdG9wTlZhbHVlVGV4dDU6IFwiVG9wIDUgQW50d29ydGVuXCIsXG4gIHRvcE5WYWx1ZVRleHQxMDogXCJUb3AgMTAgQW50d29ydGVuXCIsXG4gIHRvcE5WYWx1ZVRleHQyMDogXCJUb3AgMjAgQW50d29ydGVuXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCJGZWhsZW5kZSBBbnR3b3J0ZW4gYXVzYmxlbmRlblwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiRmVobGVuZGUgQW50d29ydGVuIGFuemVpZ2VuXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiRmVobGVkZSBBbnR3b3J0ZW5cIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiRsO8ciBkaWVzZW4gRnJhZ2V0eXAgZ2lidCBlcyBub2NoIGtlaW5lIFZpc3VhbGlzaWVydW5nLlwiLFxuICBub1Jlc3VsdHM6IFwiRXMgbGllZ2VuIG5vY2gga2VpbmUgRXJnZWJuaXNzZSB2b3JcIixcbiAgc2hvd1BlclZhbHVlczogXCJQcm8gV2VydFwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQcm8gU3BhbHRlXCIsXG4gIGFuc3dlcjogXCJBbnR3b3J0XCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiS29ycmVrdGUgQW50d29ydDogXCIsXG4gIHBlcmNlbnQ6IFwiUHJvemVudFwiLFxuICByZXNwb25zZXM6IFwiQW50d29ydGVuXCJcbn07XG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImRlXCJdID0gZ2VybWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImRlXCJdID0gXCJEZXV0c2NoXCI7XG4iLCIvLyBUaGlzIGRpY3Rpb25hcnkgY29udGFpbnMgMSB1bnRyYW5zbGF0ZWQgb3IgaW5oZXJpdGVkIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuLy8gVGhlc2Ugc3RyaW5ncyBhcmUgY29tbWVudGVkIG91dC4gVW5jb21tZW50IGFuZCBlZGl0IHRoZW0gaWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgdHJhbnNsYXRpb25zLlxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBpdGFsaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiUmFnZ3J1cHBhXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiRGl2aWRpXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlemlvbmFtaVwiLFxuICBoaWRlQ29sdW1uOiBcIk5hc2NvbmRpIGNvbG9ubmFcIixcbiAgc2hvd0NvbHVtbjogXCJNb3N0cmEgY29sb25uYVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJSZW5kaSBsYSBjb2xvbm5hIHByaXZhdGFcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJSZW5kaSBsYSBjb2xvbm5hIHB1YmJsaWNhXCIsXG4gIG1vdmVUb0RldGFpbDogXCJTcG9zdGEgaW4gRGV0dGFnbGlvXCIsXG4gIHNob3dBc0NvbHVtbjogXCJNb3N0cmEgY29tZSBDb2xvbm5hXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIkNlcmNhLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiUmltdW92aSByaWdoZVwiLFxuICBzaG93TGFiZWw6IFwiTW9zdHJhXCIsXG4gIGVudHJpZXNMYWJlbDogXCJ2b2NpXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJQYXJvbGUgaW4gdGFiZWxsYVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJOdXZvbGEgZGkgcGFyb2xlXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIklzdG9ncmFtbWFcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiTWVkaWFcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmVsbGFcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkdyYWZpY29cIixcbiAgLy8gdmlzdWFsaXplcl9tYXRyaXg6IFwiQ2hhcnRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJHcmFmaWNvIGEgYmFycmVcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiR3JhZmljbyBhIGJhcnJlIHZlcnRpY2FsaVwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJHcmFmaWNvIGEgYmFycmUgc292cmFwcG9zdGVcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkdyYWZpY28gYSBjaWFtYmVsbGFcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJHcmFmaWNvIGEgdG9ydGFcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiR3JhZmljbyBhIGRpc3BlcnNpb25lXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHcmFmaWNvIEdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiUHVudG9cIixcbiAgaGlkZUJ1dHRvbjogXCJOYXNjb25kaVwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJSZW5kaSBwcml2YXRvXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiUmVuZGkgcHViYmxpY29cIixcbiAgc2hvd0J1dHRvbjogXCJNb3N0cmFcIixcbiAgZmlsdGVyOiBcIkZpbHRyb1wiLFxuICByZXNldEZpbHRlcjogXCJDYW5jZWxsYSBmaWx0cm9cIixcbiAgY2hhbmdlTG9jYWxlOiBcIkNhbWJpYSBsaW5ndWFcIixcbiAgY2xlYXJCdXR0b246IFwiQ2FuY2VsbGFcIixcbiAgYWRkRWxlbWVudDogXCJTY2VnbGkgbGEgZG9tYW5kYSBkYSBtb3N0cmFyZS4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiT3JkaW5lIGRpIERlZmF1bHRcIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kZW50ZVwiLFxuICBkZXNjT3JkZXI6IFwiRGlzY2VuZGVudGVcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJNb3N0cmEgY29sb25uZSBzZWNvbmRhcmllXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkFsdHJpIHB1bnRpIGUgY29tbWVudGlcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIk1vc3RyYSBwZXJjZW50dWFsaVwiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiTmFzY29uZGkgcGVyY2VudHVhbGlcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJTY2FyaWNhIGlsIGdyYWZpY28gaW4gZm9ybWF0byBwbmdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJOYXNjb25kaSByaXNwb3N0ZSB2dW90ZVwiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIk1vc3RyYSByaXNwb3N0ZSB2dW90ZVwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIlR1dHRlIGxlIHJpc3Bvc3RlXCIsXG4gIHRvcE5WYWx1ZVRleHQ1OiBcIlRvcCA1IHJpc3Bvc3RlXCIsXG4gIHRvcE5WYWx1ZVRleHQxMDogXCJUb3AgMTAgcmlzcG9zdGVcIixcbiAgdG9wTlZhbHVlVGV4dDIwOiBcIlRvcCAyMCByaXNwb3N0ZVwiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiTmFzY29uZGkgbGUgcmlzcG9zdGUgbWFuY2FudGlcIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIk1vc3RyYSBsZSByaXNwb3N0ZSBtYW5jYW50aVwiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIlJpc3Bvc3RlIG1hbmNhbnRpXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIlF1ZXN0byB0aXBvIGRpIGRvbWFuZGEgbm9uIMOoIGFuY29yYSBzdGF0byB2aXN1YWxpenphdG9cIixcbiAgbm9SZXN1bHRzOiBcIk5vbiBjaSBzb25vIGFuY29yYSByaXN1bHRhdGlcIixcbiAgc2hvd1BlclZhbHVlczogXCJQZXIgVmFsb3JpXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBlciBDb2xvbm5lXCIsXG4gIGFuc3dlcjogXCJSaXNwb3N0YVwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIlJpc3Bvc3RhIGVzYXR0YTogXCIsXG4gIHBlcmNlbnQ6IFwiUGVyY2VudHVhbGVcIixcbiAgcmVzcG9uc2VzOiBcIlJpc3Bvc3RlXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaXRcIl0gPSBpdGFsaWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIml0XCJdID0gXCJJdGFsaWFub1wiO1xuXG4vLyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgYnkgYSBtYWNoaW5lIHRyYW5zbGF0aW9uIHNlcnZpY2Vcbi8vIFJlbW92ZSB0aG9zZSBzdHJpbmdzIHRoYXQgeW91IGhhdmUgY29ycmVjdGVkIG1hbnVhbGx5XG4vLyB1bmRlZmluZWQuY29ycmVjdEFuc3dlcjogXCJDb3JyZWN0IGFuc3dlcjogXCIgPT4gXCJSaXNwb3N0YSBlc2F0dGE6IFwiIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBqYXBhbmVzZVN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIuOCsOODq+ODvOODl+WMllwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIuOCsOODq+ODvOODl+ino+mZpFwiLFxuICBzZWxlY3RCdXR0b246IFwi6YG45oqeXCIsXG4gIGhpZGVDb2x1bW46IFwi5YiX44KS6Z2e6KGo56S6XCIsXG4gIHNob3dDb2x1bW46IFwi5YiX44KS6KGo56S6XCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIuWIl+OCkumdnuWFrOmWi+OBq+OBmeOCi1wiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIuWIl+OCkuWFrOmWi+OBmeOCi1wiLFxuICBtb3ZlVG9EZXRhaWw6IFwi6Kmz57Sw44Gr56e75YuVXCIsXG4gIHNob3dBc0NvbHVtbjogXCLliJfjgajjgZfjgabooajnpLpcIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwi5qSc57SiLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwi6KGM44KS5YmK6ZmkXCIsXG4gIHNob3dMYWJlbDogXCLooajnpLpcIixcbiAgZW50cmllc0xhYmVsOiBcIuS7tlwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwi44OG44Kt44K544OIXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIuODr+ODvOODieOCr+ODqeOCpuODiVwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCLjg5Ljgrnjg4jjgrDjg6njg6BcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwi5bmz5Z2HXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCLjg4bjg7zjg5bjg6tcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIuODgeODo+ODvOODiFwiLFxuICBjaGFydFR5cGVfYmFyOiBcIuajkuOCsOODqeODlVwiLFxuICBjaGFydFR5cGVfdmJhcjogXCLnuKbmo5LjgrDjg6njg5VcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwi56mN44G/5LiK44GS5qOS44Kw44Op44OVXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCLjg4njg7zjg4rjg4Tjg4Hjg6Pjg7zjg4hcIixcbiAgY2hhcnRUeXBlX3BpZTogXCLlhobjgrDjg6njg5VcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwi5pWj5biD5ZuzXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCLjgrLjg7zjgrhcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCLjg5Djg6zjg4Pjg4hcIixcbiAgaGlkZUJ1dHRvbjogXCLpnZ7ooajnpLpcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwi6Z2e5YWs6ZaL44Gr44GZ44KLXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwi5YWs6ZaL44GZ44KLXCIsXG4gIHNob3dCdXR0b246IFwi6KGo56S6XCIsXG4gIGZpbHRlcjogXCLjg5XjgqPjg6vjgr/jg7xcIixcbiAgcmVzZXRGaWx0ZXI6IFwi44OV44Kj44Or44K/44O844KS44Oq44K744OD44OIXCIsXG4gIGNoYW5nZUxvY2FsZTogXCLoqIDoqp7jgpLlpInmm7RcIixcbiAgY2xlYXJCdXR0b246IFwi44Kv44Oq44KiXCIsXG4gIGFkZEVsZW1lbnQ6IFwi6KGo56S644GZ44KL6LOq5ZWP44KS6YG45oqeLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCLjg4fjg5Xjgqnjg6vjg4jpoIZcIixcbiAgYXNjT3JkZXI6IFwi5piH6aCGXCIsXG4gIGRlc2NPcmRlcjogXCLpmY3poIZcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCLjg57jgqTjg4rjg7zliJfjgpLooajnpLpcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwi44Gd44Gu5LuW44Gu44Ki44Kk44OG44Og44Go44Kz44Oh44Oz44OIXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCLjg5Hjg7zjgrvjg7Pjg4bjg7zjgrjjgpLooajnpLpcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIuODkeODvOOCu+ODs+ODhuODvOOCuOOCkumdnuihqOekulwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIuODl+ODreODg+ODiOOCklBOR+ODleOCoeOCpOODq+OBqOOBl+OBpuS/neWtmFwiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIuepuuOBruWbnuetlOOCkumdnuihqOekulwiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIuepuuOBruWbnuetlOOCkuihqOekulwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIuOBmeOBueOBpuOBruWbnuetlFwiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwi5LiK5L2NNeOBpOOBruWbnuetlFwiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIuS4iuS9jTEw44Gu5Zue562UXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwi5LiK5L2NMjDjga7lm57nrZRcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIuasoOaQjeWApOOCkumdnuihqOekulwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwi5qyg5pCN5YCk44KS6KGo56S6XCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwi5qyg5pCN5YCkXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIuOBk+OBruizquWVj+OCv+OCpOODl+OBr+OBvuOBoOimluimmuWMluOBleOCjOOBpuOBhOOBvuOBm+OCk1wiLFxuICBub1Jlc3VsdHM6IFwi44G+44Gg57WQ5p6c44GM44GC44KK44G+44Gb44KTXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwi5YCk44GU44Go44Gr6KGo56S6XCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIuWIl+OBlOOBqOOBq+ihqOekulwiLFxuICBhbnN3ZXI6IFwi5Zue562UXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwi5q2j6KejOiBcIixcbiAgcGVyY2VudDogXCLjg5Hjg7zjgrvjg7Pjg4hcIixcbiAgcmVzcG9uc2VzOiBcIuWbnuetlOaVsFwiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImphXCJdID0gamFwYW5lc2VTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiamFcIl0gPSBcIkphcGFuZXNlXCI7XG4iLCIvLyBUaGlzIGRpY3Rpb25hcnkgY29udGFpbnMgMSB1bnRyYW5zbGF0ZWQgb3IgaW5oZXJpdGVkIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuLy8gVGhlc2Ugc3RyaW5ncyBhcmUgY29tbWVudGVkIG91dC4gVW5jb21tZW50IGFuZCBlZGl0IHRoZW0gaWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgdHJhbnNsYXRpb25zLlxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBub3J3ZWdpYW5TdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCJHcnVwcGVyXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiT3BwaGV2IGdydXBwZXJpbmdcIixcbiAgc2VsZWN0QnV0dG9uOiBcIlZlbGdcIixcbiAgaGlkZUNvbHVtbjogXCJTa2p1bCBrb2xvbm5lXCIsXG4gIHNob3dDb2x1bW46IFwiVmlzIGtvbG9ubmVcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiR2rDuHIga29sb25uZSBwcml2YXRcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJHasO4ciBrb2xvbm5lIG9mZmVudGxpZ1wiLFxuICBtb3ZlVG9EZXRhaWw6IFwiRmx5dHQgdGlsIGRldGFsamVydCB2aXNuaW5nXCIsXG4gIHNob3dBc0NvbHVtbjogXCJWaXMgc29tIGtvbG9ubmVcIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiU8O4ay4uLlwiLFxuICByZW1vdmVSb3dzOiBcIkZqZXJuIHJhZGVyXCIsXG4gIHNob3dMYWJlbDogXCJWaXNcIixcbiAgZW50cmllc0xhYmVsOiBcIm9wcGbDuHJpbmdlclwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGFiZWxsdmlzbmluZ1wiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJPcmRza3lcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIkdqZW5ub21zbml0dFwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiQm9yZFwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiU2rDuGthcnRcIixcbiAgLy8gdmlzdWFsaXplcl9tYXRyaXg6IFwiQ2hhcnRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJTdG9scGVkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIlZlcnRpa2FsIHN0b2xwZVwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJTdGFibGV0IHN0b2xwZWRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkhqdWxkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiU2VrdG9yZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJQdW5rdGRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIk3DpWxlZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkt1bGVkaWFncmFtXCIsXG4gIGhpZGVCdXR0b246IFwiU2tqdWxcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiR2rDuHIgcHJpdmF0XCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiR2rDuHIgb2ZmZW50bGlnXCIsXG4gIHNob3dCdXR0b246IFwiVmlzXCIsXG4gIGZpbHRlcjogXCJGaWx0ZXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiTnVsbHN0aWxsIGZpbHRlclwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiQnl0dCBzcHLDpWtcIixcbiAgY2xlYXJCdXR0b246IFwiVMO4bVwiLFxuICBhZGRFbGVtZW50OiBcIlZlbGcgc3DDuHJzbcOlbC4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiU3RhbmRhcmRcIixcbiAgYXNjT3JkZXI6IFwiU3RpZ2VuZGVcIixcbiAgZGVzY09yZGVyOiBcIlN5bmtlbmRlXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiVmlzIG1pbmRyZSBrb2xvbm5lclwiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBbm5ldCBvZyBrb21tZW50YXJlclwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiVmlzIHByb3NlbnRlclwiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiU2tqdWwgcHJvc2VudGVyXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJPdmVyZ8OlXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJMYXN0IG5lZCBwbG90dCBzb20gZW4gUE5HLWZpbFwiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIlNranVsIHRvbW1lIHN2YXJcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJWaXMgdG9tbWUgc3ZhclwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIkFsbGUgc3ZhclwiLFxuICB0b3BOVmFsdWVUZXh0NTogXCJUb3BwIDUgc3ZhclwiLFxuICB0b3BOVmFsdWVUZXh0MTA6IFwiVG9wcCAxMCBzdmFyXCIsXG4gIHRvcE5WYWx1ZVRleHQyMDogXCJUb3BwIDIwIHN2YXJcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIlNranVsIG1hbmdsZW5kZSBzdmFyXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJWaXMgbWFuZ2xlbmRlIHN2YXJcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJNYW5nbGVyIHN2YXJcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiRGVubmUgc3DDuHJzbcOlbHN0eXBlbiBlciBpa2tlIHZpc3VhbGlzZXJ0IGVubsOlXCIsXG4gIG5vUmVzdWx0czogXCJEZXQgZXIgaW5nZW4gcmVzdWx0YXRlciBlbm7DpVwiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBlciB2ZXJkaWVyXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBlciBrb2xvbm5lclwiLFxuICBhbnN3ZXI6IFwiU3ZhcmVcIixcbiAgY29ycmVjdEFuc3dlcjogXCJSaWt0aWcgc3ZhcjogXCIsXG4gIHBlcmNlbnQ6IFwiUHJvc2VudFwiLFxuICByZXNwb25zZXM6IFwiU3ZhclwiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5vXCJdID0gbm9yd2VnaWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIm5vXCJdID0gXCJOb3Jza1wiO1xuXG4vLyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgYnkgYSBtYWNoaW5lIHRyYW5zbGF0aW9uIHNlcnZpY2Vcbi8vIFJlbW92ZSB0aG9zZSBzdHJpbmdzIHRoYXQgeW91IGhhdmUgY29ycmVjdGVkIG1hbnVhbGx5XG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtXCIgPT4gXCJIaXN0b2dyYW1cIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfbnVtYmVyOiBcIkF2ZXJhZ2VcIiA9PiBcIkdqZW5ub21zbml0dFwiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmxlXCIgPT4gXCJCb3JkXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiQ2hhcnRcIiA9PiBcIlNqw7hrYXJ0XCJcbi8vIHVuZGVmaW5lZC5jaGFydFR5cGVfdmJhcjogXCJWZXJ0aWNhbCBCYXJcIiA9PiBcIlZlcnRpa2FsIHN0b2xwZVwiXG4vLyB1bmRlZmluZWQuZmlsdGVyOiBcIkZpbHRlclwiID0+IFwiRmlsdGVyXCJcbi8vIHVuZGVmaW5lZC5wZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIgPT4gXCJQREZcIlxuLy8gdW5kZWZpbmVkLnhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIiA9PiBcIk92ZXJnw6VcIlxuLy8gdW5kZWZpbmVkLmNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIiA9PiBcIkNTVlwiXG4vLyB1bmRlZmluZWQuc2F2ZURpYWdyYW1Bc1BORzogXCJEb3dubG9hZCBwbG90IGFzIGEgUE5HIGZpbGVcIiA9PiBcIkxhc3QgbmVkIHBsb3R0IHNvbSBlbiBQTkctZmlsXCJcbi8vIHVuZGVmaW5lZC5oaWRlRW1wdHlBbnN3ZXJzOiBcIkhpZGUgZW1wdHkgYW5zd2Vyc1wiID0+IFwiU2tqdWwgdG9tbWUgc3ZhclwiXG4vLyB1bmRlZmluZWQuc2hvd0VtcHR5QW5zd2VyczogXCJTaG93IGVtcHR5IGFuc3dlcnNcIiA9PiBcIlZpcyB0b21tZSBzdmFyXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0LTE6IFwiQWxsIGFuc3dlcnNcIiA9PiBcIkFsbGUgc3ZhclwiXG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dDU6IFwiVG9wIDUgYW5zd2Vyc1wiID0+IFwiVG9wcCA1IHN2YXJcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQxMDogXCJUb3AgMTAgYW5zd2Vyc1wiID0+IFwiVG9wcCAxMCBzdmFyXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0MjA6IFwiVG9wIDIwIGFuc3dlcnNcIiA9PiBcIlRvcHAgMjAgc3ZhclwiXG4vLyB1bmRlZmluZWQuaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIkhpZGUgbWlzc2luZyBhbnN3ZXJzXCIgPT4gXCJTa2p1bCBtYW5nbGVuZGUgc3ZhclwiXG4vLyB1bmRlZmluZWQuc2hvd01pc3NpbmdBbnN3ZXJzOiBcIlNob3cgbWlzc2luZyBhbnN3ZXJzXCIgPT4gXCJWaXMgbWFuZ2xlbmRlIHN2YXJcIlxuLy8gdW5kZWZpbmVkLm1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiTWlzc2luZyBhbnN3ZXJzXCIgPT4gXCJNYW5nbGVyIHN2YXJcIlxuLy8gdW5kZWZpbmVkLm5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIlRoaXMgcXVlc3Rpb24gdHlwZSBpcyBub3QgdmlzdWFsaXplZCB5ZXRcIiA9PiBcIkRlbm5lIHNww7hyc23DpWxzdHlwZW4gZXIgaWtrZSB2aXN1YWxpc2VydCBlbm7DpVwiXG4vLyB1bmRlZmluZWQubm9SZXN1bHRzOiBcIlRoZXJlIGFyZSBubyByZXN1bHRzIHlldFwiID0+IFwiRGV0IGVyIGluZ2VuIHJlc3VsdGF0ZXIgZW5uw6VcIlxuLy8gdW5kZWZpbmVkLnNob3dQZXJWYWx1ZXM6IFwiUGVyIFZhbHVlc1wiID0+IFwiUGVyIHZlcmRpZXJcIlxuLy8gdW5kZWZpbmVkLnNob3dQZXJDb2x1bW5zOiBcIlBlciBDb2x1bW5zXCIgPT4gXCJQZXIga29sb25uZXJcIlxuLy8gdW5kZWZpbmVkLmFuc3dlcjogXCJBbnN3ZXJcIiA9PiBcIlN2YXJlXCJcbi8vIHVuZGVmaW5lZC5jb3JyZWN0QW5zd2VyOiBcIkNvcnJlY3QgYW5zd2VyOiBcIiA9PiBcIlJpa3RpZyBzdmFyOiBcIlxuLy8gdW5kZWZpbmVkLnBlcmNlbnQ6IFwiUGVyY2VudFwiID0+IFwiUHJvc2VudFwiXG4vLyB1bmRlZmluZWQucmVzcG9uc2VzOiBcIlJlc3BvbnNlc1wiID0+IFwiU3ZhclwiIiwiLy8gVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIDEgdW50cmFuc2xhdGVkIG9yIGluaGVyaXRlZCBsb2NhbGl6YXRpb24gc3RyaW5ncy5cbi8vIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1lbnRlZCBvdXQuIFVuY29tbWVudCBhbmQgZWRpdCB0aGVtIGlmIHlvdSB3YW50IHRvIGFkZCB5b3VyIHRyYW5zbGF0aW9ucy5cbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgcG9ydHVndWVzZVN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkFncnVwYXIgUG9yIE1pbVwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIkRlc2FncnVwYXIgUG9yIE1pbVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZWNpb25hclwiLFxuICBoaWRlQ29sdW1uOiBcIkVzY29uZGVyIGNvbHVuYVwiLFxuICBzaG93Q29sdW1uOiBcIk1vc3RyYXIgY29sdW5hXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIlRvcm5hciBjb2x1bmEgcHJpdmFkYVwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIlRvcm5hciBjb2x1bmEgcMO6YmxpY2FcIixcbiAgbW92ZVRvRGV0YWlsOiBcIk1vdmVyIHBhcmEgRGV0YWxoZXNcIixcbiAgc2hvd0FzQ29sdW1uOiBcIk1vc3RyYXIgY29tbyBDb2x1bmFcIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiUGVzcXVpc2FyLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiUmVtb3ZlciBsaW5oYXNcIixcbiAgc2hvd0xhYmVsOiBcIk1vc3RyYXJcIixcbiAgZW50cmllc0xhYmVsOiBcImVudHJhZGFzXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJUZXh0b3MgZW0gdGFiZWxhXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIk51dmVtIGRlIHBhbGF2cmFzXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbWFcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiTcOpZGlhXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJlbGFcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkdyw6FmaWNvXCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFycmFcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiQmFycmEgdmVydGljYWxcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiQmFycmEgRW1waWxoYWRhXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJSb3NjYVwiLFxuICBjaGFydFR5cGVfcGllOiBcIlRhcnRlXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIkxhc3Ryb1wiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiRXNjYWxhXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQmFsYVwiLFxuICBoaWRlQnV0dG9uOiBcIkVzY29uZGVyXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIlRvcm5hciBwcml2YWRvXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiVG9ybmFyIHDDumJsaWNvXCIsXG4gIHNob3dCdXR0b246IFwiTW9zdHJhclwiLFxuICBmaWx0ZXI6IFwiRmlsdHJhclwiLFxuICByZXNldEZpbHRlcjogXCJSZXN0YXVyYXIgRmlsdHJvXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJNdWRhciBMb2NhbGl6YcOnw6NvXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkxpbXBhclwiLFxuICBhZGRFbGVtZW50OiBcIkVzY29saGVyIHF1ZXN0w6NvIHBhcmEgbW9zdHJhci4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiT3JkZW5hw6fDo28gUGFkcsOjb1wiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRlbnRlXCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kZW50ZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIk1vc3RyYXIgY29sdW5hcyBtZW5vcmVzXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIk91dHJvcyBpdGVucyBlIGNvbWVudMOhcmlvc1wiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiTW9zdHJhciBwZXJjZW50dWFpc1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiRXNjb25kZXIgcGVyY2VudHVhaXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJCYWl4YXIgZGlhZ3JhbWEgY29tbyBQTkdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJFc2NvbmRlciBwZXJndW50YXMgdmF6aWFzXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTW9zdHJhciBwZXJndW50YXMgdmF6aWFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVG9kYXMgYXMgcmVzcG9zdGFzXCIsXG4gIHRvcE5WYWx1ZVRleHQ1OiBcIlByaW1laXJhcyA1IHJlc3Bvc3Rhc1wiLFxuICB0b3BOVmFsdWVUZXh0MTA6IFwiUHJpbWVpcmFzIDEwIHJlc3Bvc3Rhc1wiLFxuICB0b3BOVmFsdWVUZXh0MjA6IFwiUHJpbWVpcmFzIDIwIHJlc3Bvc3Rhc1wiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiT2N1bHRhciBwZXJndW50YXMgbsOjbyByZXNwb25kaWRhc1wiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiTW9zdHJhciBwZXJndW50YXMgbsOjbyByZXNwb25kaWRhc1wiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIlBlcmd1bnRhcyBuw6NvIHJlc3BvbmRpZGFzXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIkVzdGUgdGlwbyBkZSBwZXJndW50YSBhaW5kYSBuw6NvIGZvaSB2aXN1YWxpemFkYVwiLFxuICBub1Jlc3VsdHM6IFwiQWluZGEgbsOjbyBwb3NzdWkgcmVzdWx0YWRvc1wiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBvciB2YWxvcmVzXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBvciBjb2x1bmFzXCIsXG4gIGFuc3dlcjogXCJSZXNwb3N0YVwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIlJlc3Bvc3RhIGNvcnJldGE6IFwiLFxuICBwZXJjZW50OiBcIlBlcmNlbnRhZ2VtXCIsXG4gIHJlc3BvbnNlczogXCJSZXNwb3N0YXNcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcInB0XCJdID0gcG9ydHVndWVzZVN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJwdFwiXSA9IFwiUG9ydHVndcOqc1wiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBydXNzaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwi0KHQs9GA0YPQv9C/0LjRgNC+0LLQsNGC0YxcIixcbiAgdW5ncm91cEJ1dHRvbjogXCLQoNCw0LfQs9GA0YPQv9C/0LjRgNC+0LLQsNGC0YxcIixcbiAgc2VsZWN0QnV0dG9uOiBcItCS0YvQsdGA0LDRgtGMXCIsXG4gIGhpZGVDb2x1bW46IFwi0KHQutGA0YvRgtGMINGB0YLQvtC70LHQtdGGXCIsXG4gIHNob3dDb2x1bW46IFwi0J/QvtC60LDQt9Cw0YLRjCDRgdGC0L7Qu9Cx0LXRhlwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCLQodC00LXQu9Cw0YLRjCDRgdGC0L7Qu9Cx0LXRhiDQv9GA0LjQstCw0YLQvdGL0LxcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCLQodC00LXQu9Cw0YLRjCDRgdGC0L7Qu9Cx0LXRhiDQv9GD0LHQu9C40YfQvdGL0LxcIixcbiAgbW92ZVRvRGV0YWlsOiBcItCh0L/RgNGP0YLQsNGC0Ywg0LIg0YDQsNGB0LrRgNGL0LLQsNGO0YnRg9GO0YHRjyDRgdC10LrRhtC40Y5cIixcbiAgc2hvd0FzQ29sdW1uOiBcItCf0L7QutCw0LfQsNGC0Ywg0LrQsNC6INGB0YLQvtC70LHQtdGGXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcItCf0L7QuNGB0LouLi5cIixcbiAgcmVtb3ZlUm93czogXCLQo9C00LDQu9C40YLRjCDRgdGC0YDQvtC60LhcIixcbiAgc2hvd0xhYmVsOiBcItCf0L7QutCw0LfQsNGC0YxcIixcbiAgZW50cmllc0xhYmVsOiBcItC30LDQv9C40YHQtdC5XCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCLQotCw0LHQu9C40YbQsFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCLQntCx0LvQsNC60L4g0YLRjdCz0L7QslwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCLQk9C40YHRgtC+0LPRgNCw0LzQvNCwXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcItCh0YDQtdC00L3QtdC1INC30L3QsNGH0LXQvdC40LVcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcItCi0LDQsdC70LjRhtCwXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCLQlNC40LDQs9GA0LDQvNC80LBcIixcbiAgdmlzdWFsaXplcl9tYXRyaXg6IFwi0JTQuNCw0LPRgNCw0LzQvNCwXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwi0KHRgtC+0LvQsdGH0LDRgtCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcItCS0LXRgNGC0LjQutCw0LvRjNC90LDRjyDRgdGC0L7Qu9Cx0YfQsNGC0LDRjyDQtNC40LDQs9GA0LDQvNC80LBcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwi0KHRgtC+0LvQsdGH0LDRgtCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwINGBINC90LDQutC+0L/Qu9C10L3QuNC10LxcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcItCa0L7Qu9GM0YbQtdCy0LDRjyDQtNC40LDQs9GA0LDQvNC80LBcIixcbiAgY2hhcnRUeXBlX3BpZTogXCLQmtGA0YPQs9C+0LLQsNGPINC00LjQsNCz0YDQsNC80LzQsFwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCLQotC+0YfQtdGH0L3QsNGPINC00LjQsNCz0YDQsNC80LzQsFwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwi0JjQt9C80LXRgNC40YLQtdC70YzQvdCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwi0JzQsNGA0LrQuNGA0L7QstCw0L3QvdCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwXCIsXG4gIGhpZGVCdXR0b246IFwi0KHQutGA0YvRgtGMXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcItCh0LTQtdC70LDRgtGMINC/0YDQuNCy0LDRgtC90YvQvFwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcItCh0LTQtdC70LDRgtGMINC/0YPQsdC70LjRh9C90YvQvFwiLFxuICBzaG93QnV0dG9uOiBcItCf0L7QutCw0LfQsNGC0YxcIixcbiAgZmlsdGVyOiBcItCk0LjQu9GM0YLRgFwiLFxuICByZXNldEZpbHRlcjogXCLQntGH0LjRgdGC0LjRgtGMINGE0LjQu9GM0YLRgFwiLFxuICBjaGFuZ2VMb2NhbGU6IFwi0KHQvNC10L3QuNGC0Ywg0Y/Qt9GL0LpcIixcbiAgY2xlYXJCdXR0b246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICBhZGRFbGVtZW50OiBcItCS0YvQsdC10YDQuNGC0LUg0LLQvtC/0YDQvtGBLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCLQn9C+0YDRj9C00L7QuiDQv9C+INGD0LzQvtC70YfQsNC90LjRjlwiLFxuICBhc2NPcmRlcjogXCLQodC+0YDRgtC40YDQvtCy0LDRgtGMINC/0L4g0LLQvtC30YDQsNGB0YLQsNC90LjRjlwiLFxuICBkZXNjT3JkZXI6IFwi0KHQvtGA0YLQuNGA0L7QstCw0YLRjCDQv9C+INGD0LHRi9Cy0LDQvdC40Y5cIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCLQn9C+0LrQsNC30LDRgtGMINCy0YLQvtGA0L7RgdGC0LXQv9C10L3QvdGL0LUg0YHRgtC+0LvQsdGG0YtcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwi0JTRgNGD0LPQvtC1INC4INC60L7QvNC80LXQvdGC0LDRgNC40LhcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcItCf0L7QutCw0LfQsNGC0Ywg0L/RgNC+0YbQtdC90YLRi1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwi0KHQutGA0YvRgtGMINC/0YDQvtGG0LXQvdGC0YtcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCLQodC60LDRh9Cw0YLRjCDQtNC40LDQs9GA0LDQvNC80YMg0LIg0YTQvtGA0LzQsNGC0LUgUE5HXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwi0KHQutGA0YvRgtGMINC/0YPRgdGC0YvQtSDQvtGC0LLQtdGC0YtcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCLQn9C+0LrQsNC30LDRgtGMINC/0YPRgdGC0YvQtSDQvtGC0LLQtdGC0YtcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCLQktGB0LUg0L7RgtCy0LXRgtGLXCIsXG4gIHRvcE5WYWx1ZVRleHQ1OiBcItCf0LXRgNCy0YvQtSA1INC+0YLQstC10YLQvtCyXCIsXG4gIHRvcE5WYWx1ZVRleHQxMDogXCLQn9C10YDQstGL0LUgMTAg0L7RgtCy0LXRgtC+0LJcIixcbiAgdG9wTlZhbHVlVGV4dDIwOiBcItCf0LXRgNCy0YvQtSAyMCDQvtGC0LLQtdGC0L7QslwiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwi0KHQutGA0YvRgtGMINC+0YLRgdGD0YLRgdGC0LLRg9GO0YnQuNC1INC+0YLQstC10YLRi1wiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwi0J/QvtC60LDQt9Cw0YLRjCDQvtGC0YHRg9GC0YHRgtCy0YPRjtGJ0LjQtSDQvtGC0LLQtdGC0YtcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCLQntGC0YHRg9GC0YHRgtCy0YPRjtGJ0LjQtSDQvtGC0LLQtdGC0YtcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwi0K3RgtC+0YIg0YLQuNC/INCy0L7Qv9GA0L7RgdCwINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGC0YHRj1wiLFxuICBub1Jlc3VsdHM6IFwi0KDQtdC30YPQu9GM0YLQsNGC0Ysg0L7RgtGB0YPRgtGB0YLQstGD0Y7RglwiLFxuICBzaG93UGVyVmFsdWVzOiBcItCf0L4g0LfQvdCw0YfQtdC90LjRj9C8XCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcItCf0L4g0YHRgtC+0LvQsdGG0LDQvFwiLFxuICBhbnN3ZXI6IFwi0J7RgtCy0LXRglwiLFxuICBjb3JyZWN0QW5zd2VyOiBcItCf0YDQsNCy0LjQu9GM0L3Ri9C5INC+0YLQstC10YI6IFwiLFxuICBwZXJjZW50OiBcItC/0YDQvtGG0LXQvdGC0L7QslwiLFxuICByZXNwb25zZXM6IFwi0L7RgtCy0LXRgtC+0LJcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJydVwiXSA9IHJ1c3NpYW5TdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicnVcIl0gPSBcItCg0YPRgdGB0LrQuNC5XCI7XG4iLCIvLyBUaGlzIGRpY3Rpb25hcnkgY29udGFpbnMgMSB1bnRyYW5zbGF0ZWQgb3IgaW5oZXJpdGVkIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuLy8gVGhlc2Ugc3RyaW5ncyBhcmUgY29tbWVudGVkIG91dC4gVW5jb21tZW50IGFuZCBlZGl0IHRoZW0gaWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgdHJhbnNsYXRpb25zLlxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBzcGFuaXNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3J1cG8gUG9yIE3DrVwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIkRlc2FncnVwYXIgcG9yIG3DrVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZWNjaW9uYXJtZVwiLFxuICBoaWRlQ29sdW1uOiBcIk9jdWx0YXIgY29sdW1uYVwiLFxuICBzaG93Q29sdW1uOiBcIk1vc3RyYXIgY29sdW1uYVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJIYWNlciBxdWUgbGEgY29sdW1uYSBzZWEgcHJpdmFkYVwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIkhhY2VyIHDDumJsaWNhIGxhIGNvbHVtbmFcIixcbiAgbW92ZVRvRGV0YWlsOiBcIk1vdmVyIGFsIGRldGFsbGVcIixcbiAgc2hvd0FzQ29sdW1uOiBcIk1vc3RyYXIgY29tbyBjb2x1bW5hXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIkJ1c2NhciAuLi5cIixcbiAgcmVtb3ZlUm93czogXCJFbGltaW5hciBmaWxhc1wiLFxuICBzaG93TGFiZWw6IFwiTW9zdHJhclwiLFxuICBlbnRyaWVzTGFiZWw6IFwiRW50cmFkYXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRvcyBlbiB0YWJsYVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJXb3JkY2xvdWRcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtYVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJQcm9tZWRpb1wiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiTWVzYVwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiR3LDoWZpY29cIixcbiAgLy8gdmlzdWFsaXplcl9tYXRyaXg6IFwiQ2hhcnRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiQmFycmEgdmVydGljYWxcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiQmFycmEgYXBpbGFkYVwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiRG9udXRcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJQaWVcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiRGlzcGVyc2nDs25cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwiT2N1bHRhclwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJIYWNlciBwcml2YWRvXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiSGFjZXIgcMO6YmxpY29cIixcbiAgc2hvd0J1dHRvbjogXCJNb3N0cmFyXCIsXG4gIGZpbHRlcjogXCJGaWx0cm9cIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmVzdGFibGVjZXIgZmlsdHJvXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJDYW1iaWFyIGNvbmZpZ3VyYWNpw7NuIHJlZ2lvbmFsXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkJvcnJhclwiLFxuICBhZGRFbGVtZW50OiBcIkVsaWphIGxhIHByZWd1bnRhIHBhcmEgbW9zdHJhciAuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIk9yZGVuIHByZWRldGVybWluYWRvXCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGVudGVcIixcbiAgZGVzY09yZGVyOiBcIkRlc2NlbmRlbnRlXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiTW9zdHJhciBjb2x1bW5hcyBzZWN1bmRhcmlhc1wiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJPdHJvcyBlbGVtZW50b3MgeSBjb21lbnRhcmlvc1wiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiTW9zdHJhciBwb3JjZW50YWplc1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiT2N1bHRhciBwb3JjZW50YWplc1wiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkRlc2NhcmdhciBlbCBncsOhZmljbyBjb21vIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIk9jdWx0YXIgcmVzcHVlc3RhcyB2YWPDrWFzXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTW9zdHJhciByZXNwdWVzdGFzIHZhY8OtYXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJUb2RhcyBsYXMgcmVzcHVlc3Rhc1wiLFxuICB0b3BOVmFsdWVUZXh0NTogXCJMYXMgNSByZXNwdWVzdGFzIHByaW5jaXBhbGVzXCIsXG4gIHRvcE5WYWx1ZVRleHQxMDogXCJMYXMgMTAgcmVzcHVlc3RhcyBwcmluY2lwYWxlc1wiLFxuICB0b3BOVmFsdWVUZXh0MjA6IFwiMjAgcmVzcHVlc3RhcyBwcmluY2lwYWxlc1wiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiT2N1bHRhciBsYXMgcmVzcHVlc3RhcyBxdWUgZmFsdGFuXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJNb3N0cmFyIGxhcyByZXNwdWVzdGFzIHF1ZSBmYWx0YW5cIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJSZXNwdWVzdGFzIGZhbHRhbnRlc1wiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJFc3RlIHRpcG8gZGUgcHJlZ3VudGEgYcO6biBubyBzZSB2aXN1YWxpemFcIixcbiAgbm9SZXN1bHRzOiBcIkHDum4gbm8gaGF5IHJlc3VsdGFkb3NcIixcbiAgc2hvd1BlclZhbHVlczogXCJQb3IgdmFsb3Jlc1wiLFxuICBzaG93UGVyQ29sdW1uczogXCJQb3IgY29sdW1uYXNcIixcbiAgYW5zd2VyOiBcIlJlc3B1ZXN0YVwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIlJlc3B1ZXN0YSBjb3JyZWN0YTogXCIsXG4gIHBlcmNlbnQ6IFwiUG9yIGNpZW50b1wiLFxuICByZXNwb25zZXM6IFwiUmVzcHVlc3Rhc1wiXG59O1xubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlc1wiXSA9IHNwYW5pc2hTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZXNcIl0gPSBcIkVzcGHDsW9sXCI7XG5cbi8vIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBoYXZlIGJlZW4gdHJhbnNsYXRlZCBieSBhIG1hY2hpbmUgdHJhbnNsYXRpb24gc2VydmljZVxuLy8gUmVtb3ZlIHRob3NlIHN0cmluZ3MgdGhhdCB5b3UgaGF2ZSBjb3JyZWN0ZWQgbWFudWFsbHlcbi8vIHVuZGVmaW5lZC5ncm91cEJ1dHRvbjogXCJHcm91cCBCeSBNZVwiID0+IFwiR3J1cG8gUG9yIE3DrVwiXG4vLyB1bmRlZmluZWQuZW50cmllc0xhYmVsOiBcImVudHJpZXNcIiA9PiBcIkVudHJhZGFzXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1cIiA9PiBcIkhpc3RvZ3JhbWFcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfbnVtYmVyOiBcIkF2ZXJhZ2VcIiA9PiBcIlByb21lZGlvXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFibGVcIiA9PiBcIk1lc2FcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJDaGFydFwiID0+IFwiR3LDoWZpY29cIlxuLy8gdW5kZWZpbmVkLmNoYXJ0VHlwZV92YmFyOiBcIlZlcnRpY2FsIEJhclwiID0+IFwiQmFycmEgdmVydGljYWxcIlxuLy8gdW5kZWZpbmVkLmhpZGVNaXNzaW5nQW5zd2VyczogXCJIaWRlIG1pc3NpbmcgYW5zd2Vyc1wiID0+IFwiT2N1bHRhciBsYXMgcmVzcHVlc3RhcyBxdWUgZmFsdGFuXCJcbi8vIHVuZGVmaW5lZC5zaG93TWlzc2luZ0Fuc3dlcnM6IFwiU2hvdyBtaXNzaW5nIGFuc3dlcnNcIiA9PiBcIk1vc3RyYXIgbGFzIHJlc3B1ZXN0YXMgcXVlIGZhbHRhblwiXG4vLyB1bmRlZmluZWQubWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJNaXNzaW5nIGFuc3dlcnNcIiA9PiBcIlJlc3B1ZXN0YXMgZmFsdGFudGVzXCJcbi8vIHVuZGVmaW5lZC5zaG93UGVyVmFsdWVzOiBcIlBlciBWYWx1ZXNcIiA9PiBcIlBvciB2YWxvcmVzXCJcbi8vIHVuZGVmaW5lZC5zaG93UGVyQ29sdW1uczogXCJQZXIgQ29sdW1uc1wiID0+IFwiUG9yIGNvbHVtbmFzXCJcbi8vIHVuZGVmaW5lZC5hbnN3ZXI6IFwiQW5zd2VyXCIgPT4gXCJSZXNwdWVzdGFcIlxuLy8gdW5kZWZpbmVkLmNvcnJlY3RBbnN3ZXI6IFwiQ29ycmVjdCBhbnN3ZXI6IFwiID0+IFwiUmVzcHVlc3RhIGNvcnJlY3RhOiBcIlxuLy8gdW5kZWZpbmVkLnBlcmNlbnQ6IFwiUGVyY2VudFwiID0+IFwiUG9yIGNpZW50b1wiXG4vLyB1bmRlZmluZWQucmVzcG9uc2VzOiBcIlJlc3BvbnNlc1wiID0+IFwiUmVzcHVlc3Rhc1wiIiwiaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEYXRhUHJvdmlkZXIgfSBmcm9tIFwiLi9kYXRhUHJvdmlkZXJcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5Nb2RlbCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBwcm90ZWN0ZWQgY2hhcnRUeXBlczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwiYm9vbGVhblwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0QW5zd2VyVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvcnJlY3RBbnN3ZXJWYWx1ZSA9IHRoaXMuYm9vbGVhblF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXI7XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlVHJ1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlVHJ1ZSA9PT0gY29ycmVjdEFuc3dlclZhbHVlIHx8ICEhY29ycmVjdEFuc3dlclZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ib29sZWFuUXVlc3Rpb24ubG9jTGFiZWxUcnVlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIGlmICh0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVGYWxzZSA9PT0gY29ycmVjdEFuc3dlclZhbHVlIHx8ICFjb3JyZWN0QW5zd2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbEZhbHNlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIHJldHVybiBjb3JyZWN0QW5zd2VyVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJvb2xlYW5RdWVzdGlvbigpIHtcbiAgICByZXR1cm4gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnRoaXMucXVlc3Rpb247XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRydWVDb2xvciA9IFwiXCI7XG4gIHB1YmxpYyBzdGF0aWMgZmFsc2VDb2xvciA9IFwiXCI7XG5cbiAgcHVibGljIGdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dDogc3RyaW5nKSB7XG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuICAgIHJldHVybiBuZXcgSXRlbVZhbHVlKHZhbHVlc1tsYWJlbHMuaW5kZXhPZihpdGVtVGV4dCldLCBpdGVtVGV4dCk7XG4gIH1cblxuICBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZVRydWVcbiAgICAgICAgOiB0cnVlLFxuICAgICAgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVGYWxzZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVGYWxzZVxuICAgICAgICA6IGZhbHNlLFxuICAgIF07XG4gICAgaWYgKHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZ2V0TGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBsYWJlbHMgPSBbXS5jb25jYXQodGhpcy5nZXRWYWx1ZXMoKSk7XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxhYmVsVHJ1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYWJlbHNbMF0gPSB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbFRydWUudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxhYmVsRmFsc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGFiZWxzWzFdID0gdGhpcy5ib29sZWFuUXVlc3Rpb24ubG9jTGFiZWxGYWxzZS50ZXh0T3JIdG1sO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIGxhYmVsc1syXSA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtaXNzaW5nQW5zd2Vyc0xhYmVsXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG59XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxudmFyIHN0eWxlcyA9IHJlcXVpcmUoXCIuL2Nob2ljZXMtdGFibGUuc2Nzc1wiKTtcblxuZXhwb3J0IGNsYXNzIENob2ljZXNUYWJsZUFkYXB0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBDaG9pY2VzVGFibGUpIHt9XG5cbiAgcHVibGljIGNyZWF0ZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IHRoaXMubW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcblxuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxO1xuXG4gICAgY29uc3QgZW1wdHlUZXh0Tm9kZSA9IDxIVE1MRWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwicFwiLCBcIlwiLCB7XG4gICAgICBpbm5lclRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Jlc3VsdHNcIiksXG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YXNldHMubGVuZ3RoID09PSAwIHx8IGRhdGFzZXRzWzBdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVtcHR5VGV4dE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGEsIGlkeCkgPT4ge1xuICAgICAgY29uc3QgdGFibGVOb2RlID0gPEhUTUxUYWJsZUVsZW1lbnQ+KFxuICAgICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwgXCJzYS1jaG9pY2VzLXRhYmxlXCIpXG4gICAgICApO1xuXG4gICAgICB0YWJsZU5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGVOb2RlKTtcblxuICAgICAgdmFyIGhlYWRlclJvdyA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcbiAgICAgIHZhciBsYWJlbENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiYW5zd2VyXCIpLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQobGFiZWxDZWxsKTtcbiAgICAgIHZhciBzcGFya2xpbmVDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRoXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbC1oZWFkZXJcIiwge1xuICAgICAgICB0ZXh0Q29udGVudDogXCJcIixcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHNwYXJrbGluZUNlbGwpO1xuICAgICAgdmFyIHBlcmNlbnRDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRoXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbC1oZWFkZXJcIiwge1xuICAgICAgICB0ZXh0Q29udGVudDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBlcmNlbnRcIiksXG4gICAgICB9KTtcbiAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChwZXJjZW50Q2VsbCk7XG4gICAgICB2YXIgdmFsdWVDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRoXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbC1oZWFkZXJcIiwge1xuICAgICAgICB0ZXh0Q29udGVudDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlc3BvbnNlc1wiKSxcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHZhbHVlQ2VsbCk7XG4gICAgICB0YWJsZU5vZGUuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTtcblxuICAgICAgZGF0YS5mb3JFYWNoKChyb3dEYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICB2YXIgcm93ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICB2YXIgbGFiZWxDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbFwiLCB7XG4gICAgICAgICAgdGV4dENvbnRlbnQ6IGxhYmVsc1tpbmRleF0sXG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQobGFiZWxDZWxsKTtcbiAgICAgICAgdmFyIHNwYXJrbGluZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsXCIpO1xuICAgICAgICB2YXIgb3V0ZXJCYXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtY2hvaWNlcy1zcGFya2xpbmVcIik7XG4gICAgICAgIHZhciBpbm5lckJhciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1jaG9pY2VzLXNwYXJrbGluZS12YWx1ZVwiKTtcbiAgICAgICAgaW5uZXJCYXIuc3R5bGUud2lkdGggPSB0ZXh0c1tpZHhdW2luZGV4XSArIFwiJVwiO1xuICAgICAgICBvdXRlckJhci5hcHBlbmRDaGlsZChpbm5lckJhcik7XG4gICAgICAgIHNwYXJrbGluZUNlbGwuYXBwZW5kQ2hpbGQob3V0ZXJCYXIpO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQoc3BhcmtsaW5lQ2VsbCk7XG4gICAgICAgIHZhciBwZXJjZW50Q2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwgc2EtY2hvaWNlcy10YWJsZV9fY2VsbC12YWx1ZVwiLCB7XG4gICAgICAgICAgdGV4dENvbnRlbnQ6IFwiXCIgKyB0ZXh0c1tpZHhdW2luZGV4XSArIFwiJVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKHBlcmNlbnRDZWxsKTtcbiAgICAgICAgdmFyIHZhbHVlQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwgc2EtY2hvaWNlcy10YWJsZV9fY2VsbC12YWx1ZVwiLCB7XG4gICAgICAgICAgdGV4dENvbnRlbnQ6IHJvd0RhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQodmFsdWVDZWxsKTtcbiAgICAgICAgdGFibGVOb2RlLmFwcGVuZENoaWxkKHJvdyk7XG4gICAgICB9KTtcblxuICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9IFwic2EtY2hvaWNlcy10YWJsZV9fY29udGFpbmVyXCI7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGVOb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KG5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBcIlwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDaG9pY2VzVGFibGUgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJpdmF0ZSBfY2hvaWNlc1RhYmxlQWRhcHRlcjogQ2hvaWNlc1RhYmxlQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJjaG9pY2VzXCIpO1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIgPSBuZXcgQ2hvaWNlc1RhYmxlQWRhcHRlcih0aGlzKTtcbiAgICB0aGlzLmFuc3dlcnNPcmRlciA9IFwiYXNjXCI7XG4gICAgdGhpcy5zaG93UGVyY2VudGFnZXMgPSB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaG9pY2VzVGFibGVBZGFwdGVyLmRlc3Ryb3koY29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIuY3JlYXRlKGNvbnRhaW5lcik7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9jaG9pY2VzVGFibGVBZGFwdGVyLmRlc3Ryb3kodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuLy8gVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFkaW9ncm91cFwiLCBDaG9pY2VzVGFibGUpO1xuLy8gVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZHJvcGRvd25cIiwgQ2hvaWNlc1RhYmxlKTtcbi8vIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImNoZWNrYm94XCIsIENob2ljZXNUYWJsZSk7XG4iLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGF0YUluZm8ge1xyXG4gIG5hbWU6IHN0cmluZyB8IEFycmF5PHN0cmluZz47XHJcbiAgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT47XHJcbiAgZ2V0TGFiZWxzKCk6IEFycmF5PHN0cmluZz47XHJcbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz47XHJcbiAgZ2V0U2VyaWVzTGFiZWxzKCk6IEFycmF5PHN0cmluZz47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRhUHJvdmlkZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWVzTWFya2VyS2V5ID0gXCJfX3NhX3Nlcmllc19uYW1lXCI7XHJcblxyXG4gIHByaXZhdGUgX2ZpbHRlcmVkRGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PjtcclxuICBwcml2YXRlIF9zdGF0aXN0aWNzQ2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBBcnJheTxBcnJheTxudW1iZXI+PiB8IEFycmF5PEFycmF5PEFycmF5PG51bWJlcj4+PiB9O1xyXG4gIHByb3RlY3RlZCBmaWx0ZXJWYWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICBwcml2YXRlIGdldFN0YXRpc3RpY3NDYWNoZUtleShkYXRhSW5mbzogSURhdGFJbmZvKTogc3RyaW5nIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFJbmZvLm5hbWUpKSB7XHJcbiAgICAgIHJldHVybiBkYXRhSW5mby5uYW1lLmpvaW4oXCItXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFJbmZvLm5hbWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhOiBBcnJheTxhbnk+ID0gW10sIHByaXZhdGUgX2dldERhdGFDb3JlOiAoZGF0YUluZm86IElEYXRhSW5mbykgPT4gbnVtYmVyW11bXSA9IHVuZGVmaW5lZCkgeyB9XHJcblxyXG4gIHB1YmxpYyByZXNldChkYXRhSW5mbz86IElEYXRhSW5mbykge1xyXG4gICAgaWYgKCEhZGF0YUluZm8pIHtcclxuICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NDYWNoZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmdldFN0YXRpc3RpY3NDYWNoZUtleShkYXRhSW5mbyk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXRpc3RpY3NDYWNoZVtjYWNoZUtleV07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgIT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICB0aGlzLl9maWx0ZXJlZERhdGEgIT09IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLnJhaXNlRGF0YUNoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRhdGEoZGF0YTogQXJyYXk8YW55Pikge1xyXG4gICAgdGhpcy5fZGF0YSA9IFtdLmNvbmNhdChkYXRhKTtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZmlsdGVyZWREYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuX2ZpbHRlcmVkRGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCBmaWx0ZXJLZXlzID0gT2JqZWN0LmtleXModGhpcy5maWx0ZXJWYWx1ZXMpO1xyXG4gICAgICBpZiAoZmlsdGVyS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gdGhpcy5kYXRhLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuICFPYmplY3Qua2V5cyh0aGlzLmZpbHRlclZhbHVlcykuc29tZShcclxuICAgICAgICAgICAgKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJWYWx1ZXNba2V5XTtcclxuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZVR5cGUgPSB0eXBlb2YgZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25WYWx1ZSA9IGl0ZW1ba2V5XTtcclxuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVzdGlvblZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlVHlwZSAhPT0gXCJvYmplY3RcIilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uVmFsdWUuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgPT0gLTE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlc3Rpb25WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlVHlwZSAhPT0gXCJvYmplY3RcIilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gIXF1ZXN0aW9uQ29udGFpbnNWYWx1ZShxdWVzdGlvblZhbHVlLCBmaWx0ZXJWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnN0IHNlcmllc1ZhbHVlID0gaXRlbVtEYXRhUHJvdmlkZXIuc2VyaWVzTWFya2VyS2V5XTtcclxuICAgICAgICAgICAgICBpZiAoISFzZXJpZXNWYWx1ZSAmJiBmaWx0ZXJWYWx1ZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBxdWVzdGlvblZhbHVlICE9PSBmaWx0ZXJWYWx1ZVtzZXJpZXNWYWx1ZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZVR5cGUgPT09IFwib2JqZWN0XCIgJiYgZmlsdGVyVmFsdWUuc3RhcnQgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJWYWx1ZS5lbmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRpbmlvaXVzVmFsdWUgPSB0eXBlb2YgcXVlc3Rpb25WYWx1ZSA9PT0gXCJudW1iZXJcIiA/IHF1ZXN0aW9uVmFsdWUgOiBEYXRlLnBhcnNlKHF1ZXN0aW9uVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGNvbnRpbmlvaXVzVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbmlvaXVzVmFsdWUgPSBwYXJzZUZsb2F0KHF1ZXN0aW9uVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oY29udGluaW9pdXNWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRpbmlvaXVzVmFsdWUgPCBmaWx0ZXJWYWx1ZS5zdGFydCB8fCBjb250aW5pb2l1c1ZhbHVlID49IGZpbHRlclZhbHVlLmVuZDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1ba2V5XSAhPT0gdGhpcy5maWx0ZXJWYWx1ZXNba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZERhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGZpbHRlciBieSBxdWVzdGlvbiBuYW1lIGFuZCB2YWx1ZS5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RmlsdGVyKHF1ZXN0aW9uTmFtZTogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBhbnkpIHtcclxuICAgIHZhciBmaWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIGlmIChzZWxlY3RlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlsdGVyQ2hhbmdlZCA9IHRoaXMuZmlsdGVyVmFsdWVzW3F1ZXN0aW9uTmFtZV0gIT09IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMuZmlsdGVyVmFsdWVzW3F1ZXN0aW9uTmFtZV0gPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmlsdGVyQ2hhbmdlZCA9IHRoaXMuZmlsdGVyVmFsdWVzW3F1ZXN0aW9uTmFtZV0gIT09IHVuZGVmaW5lZDtcclxuICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyVmFsdWVzW3F1ZXN0aW9uTmFtZV07XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsdGVyQ2hhbmdlZCkge1xyXG4gICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0RGF0YUNvcmUoZGF0YUluZm86IElEYXRhSW5mbykge1xyXG4gICAgaWYgKCEhdGhpcy5fZ2V0RGF0YUNvcmUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2dldERhdGFDb3JlKGRhdGFJbmZvKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhTmFtZXMgPSBBcnJheS5pc0FycmF5KGRhdGFJbmZvLm5hbWUpID8gZGF0YUluZm8ubmFtZSA6IFtkYXRhSW5mby5uYW1lXTtcclxuICAgIGNvbnN0IHN0YXRpc3RpY3M6IEFycmF5PEFycmF5PEFycmF5PG51bWJlcj4+PiA9IFtdO1xyXG5cclxuICAgIGNvbnN0IHZhbHVlcyA9IGRhdGFJbmZvLmdldFZhbHVlcygpO1xyXG4gICAgY29uc3QgdmFsdWVzSW5kZXg6IHsgW2luZGV4OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgdmFsdWVzLmZvckVhY2goKHZhbDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHZhbHVlc0luZGV4W3ZhbF0gPSBpbmRleDtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgcHJvY2Vzc01pc3NpbmdBbnN3ZXJzID0gdmFsdWVzLmluZGV4T2YodW5kZWZpbmVkKSAhPT0gLTE7XHJcblxyXG4gICAgY29uc3Qgc2VyaWVzID0gZGF0YUluZm8uZ2V0U2VyaWVzVmFsdWVzKCk7XHJcbiAgICBjb25zdCBzZXJpZXNJbmRleDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICBzZXJpZXMuZm9yRWFjaCgodmFsOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgc2VyaWVzSW5kZXhbdmFsXSA9IGluZGV4O1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2VyaWVzTGVuZ3RoID0gc2VyaWVzLmxlbmd0aCB8fCAxO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTmFtZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgZGF0YU5hbWVTdGF0aXN0aWNzID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KCk7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VyaWVzTGVuZ3RoOyArK2opIHtcclxuICAgICAgICBkYXRhTmFtZVN0YXRpc3RpY3MucHVzaChuZXcgQXJyYXk8bnVtYmVyPih2YWx1ZXMubGVuZ3RoKS5maWxsKDApKTtcclxuICAgICAgfVxyXG4gICAgICBzdGF0aXN0aWNzLnB1c2goZGF0YU5hbWVTdGF0aXN0aWNzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkRGF0YS5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICBkYXRhTmFtZXMuZm9yRWFjaCgoZGF0YU5hbWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1tkYXRhTmFtZV07XHJcbiAgICAgICAgaWYgKHJvd1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgcHJvY2Vzc01pc3NpbmdBbnN3ZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCByb3dWYWx1ZXMgPSBBcnJheS5pc0FycmF5KHJvd1ZhbHVlKSA/IHJvd1ZhbHVlIDogW3Jvd1ZhbHVlXTtcclxuICAgICAgICAgIGlmIChzZXJpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAocm93W0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAvLyBTZXJpZXMgYXJlIGxhYmVsbGVkIGJ5IHNlcmllc01hcmtlcktleSBpbiByb3cgZGF0YVxyXG4gICAgICAgICAgICAgIGNvbnN0IHNlcmllc05vID1cclxuICAgICAgICAgICAgICAgIHNlcmllc0luZGV4W3Jvd1tEYXRhUHJvdmlkZXIuc2VyaWVzTWFya2VyS2V5XV0gfHwgMDtcclxuICAgICAgICAgICAgICByb3dWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0aXN0aWNzW2luZGV4XVtzZXJpZXNOb11bdmFsdWVzSW5kZXhbdmFsXV0rKztcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBTZXJpZXMgYXJlIHRoZSBrZXlzIGluIHF1ZXN0aW9uIHZhbHVlIChtYXRyaXggcXVlc3Rpb24pXHJcbiAgICAgICAgICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgdGhlIGRlLW5vcm1hbGl6YXRpb24gYW5kIGNvbWJpbmUgd2l0aCB0aGUgcHJldmlvdXMgY2FzZVxyXG4gICAgICAgICAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcmllcy5mb3JFYWNoKChzZXJpZXNOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh2YWxbc2VyaWVzTmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmllc05vID0gc2VyaWVzSW5kZXhbc2VyaWVzTmFtZV0gfHwgMDtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzW2luZGV4XVtzZXJpZXNOb11bdmFsdWVzSW5kZXhbdmFsW3Nlcmllc05hbWVdXV0rKztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE5vIHNlcmllc1xyXG4gICAgICAgICAgICByb3dWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiBzdGF0aXN0aWNzWzBdWzBdW3ZhbHVlc0luZGV4W3ZhbF1dKyspO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhSW5mby5uYW1lKSA/IHN0YXRpc3RpY3MgOiBzdGF0aXN0aWNzWzBdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBjYWxjdWxhdGVkIHN0YXRpc2N0aWNzIGZvciB0aGUgSURhdGFJbmZvIG9iamVjdC5cclxuICAgKi9cclxuICBnZXREYXRhKGRhdGFJbmZvOiBJRGF0YUluZm8pIHtcclxuICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZXRTdGF0aXN0aWNzQ2FjaGVLZXkoZGF0YUluZm8pO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGVbY2FjaGVLZXldID09PSB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5fc3RhdGlzdGljc0NhY2hlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgPSB7fTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGVbY2FjaGVLZXldID0gdGhpcy5nZXREYXRhQ29yZShkYXRhSW5mbyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW10uY29uY2F0KHRoaXMuX3N0YXRpc3RpY3NDYWNoZVtjYWNoZUtleV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZXMgd2hlbiBkYXRhIGhhcyBiZWVuIGNoYW5nZWQuXHJcbiAgICovXHJcbiAgcHVibGljIG9uRGF0YUNoYW5nZWQgPSBuZXcgRXZlbnQ8XHJcbiAgICAoc2VuZGVyOiBEYXRhUHJvdmlkZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxyXG4gICAgRGF0YVByb3ZpZGVyLFxyXG4gICAgYW55XHJcbiAgPigpO1xyXG5cclxuICBwcm90ZWN0ZWQgcmFpc2VEYXRhQ2hhbmdlZCgpIHtcclxuICAgIGlmICghdGhpcy5vbkRhdGFDaGFuZ2VkLmlzRW1wdHkpIHtcclxuICAgICAgdGhpcy5vbkRhdGFDaGFuZ2VkLmZpcmUodGhpcywge30pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcXVlc3Rpb25Db250YWluc1ZhbHVlKHF1ZXN0aW9uVmFsdWU6IGFueSwgZmlsdGVyVmFsdWU6IGFueSkge1xyXG4gIGNvbnN0IHF1ZXN0aW9uVmFsdWVLZXlzID0gT2JqZWN0LmtleXMocXVlc3Rpb25WYWx1ZSk7XHJcbiAgY29uc3QgZmlsdGVyVmFsdWVLZXlzID0gT2JqZWN0LmtleXMoZmlsdGVyVmFsdWUpO1xyXG5cclxuICBpZiAoZmlsdGVyVmFsdWVLZXlzLmxlbmd0aCA+IHF1ZXN0aW9uVmFsdWVLZXlzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICBmb3IgKHZhciBrZXkgb2YgZmlsdGVyVmFsdWVLZXlzKSB7XHJcbiAgICBpZiAoZmlsdGVyVmFsdWVba2V5XSAhPSBxdWVzdGlvblZhbHVlW2tleV0pIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG4vL2xvY2FsaXphdGlvblxuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9mYXJzaVwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9mcmVuY2hcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZ2VybWFuXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL25vcndlZ2lhblwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9wb3J0dWd1ZXNlXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3J1c3NpYW5cIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZHV0Y2hcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vc3BhbmlzaFwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9pdGFsaWFuXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2FyYWJpY1wiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9qYXBhbmVzZVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4vZGF0YVByb3ZpZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXplckZhY3RvcnlcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4uL251bWJlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3NlbGVjdEJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9tYXRyaXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9ib29sZWFuXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vaGlzdG9ncmFtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXplckJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25QYW5lbER5bmFtaWNcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWF0cml4RHluYW1pY1wiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYXRyaXhEcm9wZG93blwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuLi9wbG90bHkvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi93b3JkY2xvdWQvd29yZGNsb3VkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vd29yZGNsb3VkL3N0b3B3b3Jkcy9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3RleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9jaG9pY2VzLXRhYmxlXCI7XG5cbmV4cG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4XCI7XG4iLCJpbXBvcnQgeyBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XHJcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbHRlckluZm8ge1xyXG4gIHByaXZhdGUgX2h0bWxFbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHRleHQ6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aXN1YWxpemVyOiBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24pIHtcclxuICAgIHRoaXMuX2h0bWxFbGVtZW50ID0gPEhUTUxEaXZFbGVtZW50PihcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCBcInNhLXF1ZXN0aW9uX19maWx0ZXJcIilcclxuICAgICk7XHJcbiAgICB0aGlzLnRleHQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxyXG4gICAgICBcInNwYW5cIixcclxuICAgICAgXCJzYS1xdWVzdGlvbl9fZmlsdGVyLXRleHRcIlxyXG4gICAgKTtcclxuICAgIHRoaXMuX2h0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudGV4dCk7XHJcbiAgICBjb25zdCBmaWx0ZXJDbGVhciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XHJcbiAgICAgIHZpc3VhbGl6ZXIuc2V0U2VsZWN0aW9uKHVuZGVmaW5lZCk7XHJcbiAgICB9LCBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2xlYXJCdXR0b25cIikpO1xyXG4gICAgdGhpcy5faHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZmlsdGVyQ2xlYXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBodG1sRWxlbWVudCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9odG1sRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGUoc2VsZWN0aW9uOiB7IHZhbHVlOiBhbnksIHRleHQ6IHN0cmluZyB9KSB7XHJcbiAgICBpZiAoc2VsZWN0aW9uICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0aW9uLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5faHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWZsZXhcIjtcclxuICAgICAgdGhpcy50ZXh0LmlubmVyVGV4dCA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJmaWx0ZXJcIikgKyBcIjogW1wiICsgc2VsZWN0aW9uLnRleHQgKyBcIl1cIjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2h0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgdGhpcy50ZXh0LmlubmVyVGV4dCA9IFwiXCI7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSwgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIEhpc3RvZ3JhbU1vZGVsIGV4dGVuZHMgU2VsZWN0QmFzZSB7XG4gIHByb3RlY3RlZCB2YWx1ZVR5cGU6IFwiZGF0ZVwiIHwgXCJudW1iZXJcIiA9IFwibnVtYmVyXCI7XG4gIHByaXZhdGUgX2NhY2hlZFZhbHVlczogQXJyYXk8eyBvcmlnaW5hbDogYW55LCBjb250aW5pb3VzOiBudW1iZXIgfT4gPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NvbnRpbmlvdXNEYXRhOiB7IFtzZXJpZXM6IHN0cmluZ106IEFycmF5PG51bWJlcj4gfSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY2FjaGVkSW50ZXJ2YWxzOiBBcnJheTx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBsYWJlbDogc3RyaW5nIH0+ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9pbnRlcnZhbFByZWNpc2lvbjogbnVtYmVyID0gMjtcbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IHN0cmluZ1tdO1xuXG4gIHB1YmxpYyBzdGF0aWMgSW50ZXJ2YWxzQ291bnQgPSAxMDtcbiAgcHVibGljIHN0YXRpYyBVc2VJbnRlcnZhbHNGcm9tID0gMTA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwiaGlzdG9ncmFtXCIpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJ2YWxQcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faW50ZXJ2YWxQcmVjaXNpb24gPSB0aGlzLm9wdGlvbnMuaW50ZXJ2YWxQcmVjaXNpb247XG4gICAgfVxuICAgIGNvbnN0IHF1ZXN0aW9uVHlwZSA9IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICBpZiAocXVlc3Rpb25UeXBlID09PSBcInRleHRcIiAmJiAocXVlc3Rpb25bXCJpbnB1dFR5cGVcIl0gPT09IFwiZGF0ZVwiIHx8IHF1ZXN0aW9uW1wiaW5wdXRUeXBlXCJdID09PSBcImRhdGV0aW1lXCIpKSB7XG4gICAgICB0aGlzLnZhbHVlVHlwZSA9IFwiZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlVHlwZSA9IFwibnVtYmVyXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldCgpIHtcbiAgICB0aGlzLl9jb250aW5pb3VzRGF0YSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jYWNoZWRWYWx1ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2FjaGVkSW50ZXJ2YWxzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRpbmlvdXNWYWx1ZSh2YWx1ZTogYW55KTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy52YWx1ZVR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgICByZXR1cm4gRGF0ZS5wYXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHJpbmcodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudmFsdWVUeXBlID09PSBcImRhdGVcIikge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKS50b0xvY2FsZURhdGVTdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdG9QcmVjaXNpb24odmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGJhc2UgPSBNYXRoLnBvdygxMCwgdGhpcy5faW50ZXJ2YWxQcmVjaXNpb24pO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGJhc2UgKiB2YWx1ZSkgLyBiYXNlO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzIHx8IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlcygpLmxlbmd0aCA+IEhpc3RvZ3JhbU1vZGVsLlVzZUludGVydmFsc0Zyb20pIHtcbiAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5pbnRlcnZhbHMuZmlsdGVyKGludGVydmFsID0+IGludGVydmFsLmxhYmVsID09PSBpdGVtVGV4dClbMF07XG4gICAgICByZXR1cm4gbmV3IEl0ZW1WYWx1ZShpbnRlcnZhbCwgaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCA/IGludGVydmFsLmxhYmVsIDogXCJcIik7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgY29uc3QgbGFiZWxJbmRleCA9IGxhYmVscy5pbmRleE9mKGl0ZW1UZXh0KTtcbiAgICByZXR1cm4gbmV3IEl0ZW1WYWx1ZSh0aGlzLmdldFZhbHVlcygpW2xhYmVsSW5kZXhdLCBsYWJlbHNbbGFiZWxJbmRleF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdmlzdWFsaXplciBkYXRhLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBzdXBlci51cGRhdGVEYXRhKGRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZWQoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHN1cGVyLm9uRGF0YUNoYW5nZWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb250aW5pb3VzVmFsdWVzKCkge1xuICAgIGlmICh0aGlzLl9jYWNoZWRWYWx1ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICAgIGlmIChzZXJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHNlcmllcy5wdXNoKFwiXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29udGluaW91c0RhdGEgPSB7fTtcbiAgICAgIHNlcmllcy5mb3JFYWNoKHNlcmllc1ZhbHVlID0+IHRoaXMuX2NvbnRpbmlvdXNEYXRhW3Nlcmllc1ZhbHVlXSA9IFtdKTtcbiAgICAgIGNvbnN0IGhhc2ggPSB7fTtcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKGRhdGFJdGVtID0+IHtcbiAgICAgICAgY29uc3QgYW5zd2VyRGF0YSA9IGRhdGFJdGVtW3RoaXMubmFtZSBhcyBzdHJpbmddO1xuICAgICAgICBpZiAoYW5zd2VyRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc2VyaWVzVmFsdWUgPSBkYXRhSXRlbVtEYXRhUHJvdmlkZXIuc2VyaWVzTWFya2VyS2V5XSB8fCBcIlwiO1xuICAgICAgICAgIC8vIFRPRE86IF9jb250aW5pb3VzRGF0YSBzaG91bGQgYmUgc29ydGVkIGluIG9yZGVyIHRvIHNwZWVkLXVwIHN0YXRpc3RpY3MgY2FsY3VsYXRpb24gaW4gdGhlIGdldERhdGEgZnVuY3Rpb25cbiAgICAgICAgICB0aGlzLl9jb250aW5pb3VzRGF0YVtzZXJpZXNWYWx1ZV0ucHVzaCh0aGlzLmdldENvbnRpbmlvdXNWYWx1ZShhbnN3ZXJEYXRhKSk7XG4gICAgICAgICAgaGFzaFthbnN3ZXJEYXRhXSA9IGFuc3dlckRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FjaGVkVmFsdWVzID0gT2JqZWN0LmtleXMoaGFzaCkubWFwKGtleSA9PiAoeyBvcmlnaW5hbDogaGFzaFtrZXldLCBjb250aW5pb3VzOiB0aGlzLmdldENvbnRpbmlvdXNWYWx1ZShrZXkpIH0pKTtcbiAgICAgIHRoaXMuX2NhY2hlZFZhbHVlcy5zb3J0KChhLCBiKSA9PiBhLmNvbnRpbmlvdXMgLSBiLmNvbnRpbmlvdXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkVmFsdWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbmVlZFVzZVJhdGVWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uZ2V0VHlwZSgpID09IFwicmF0aW5nXCIgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnF1ZXN0aW9uW1wicmF0ZVZhbHVlc1wiXSkgJiYgdGhpcy5xdWVzdGlvbltcInJhdGVWYWx1ZXNcIl0ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWxzLm1hcChpbnRlcnZhbCA9PiBpbnRlcnZhbC5zdGFydCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmludGVydmFscy5tYXAoaW50ZXJ2YWwgPT4gaW50ZXJ2YWwubGFiZWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNDdXN0b21JbnRlcnZhbHMoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbk9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnF1ZXN0aW9uT3B0aW9ucy5pbnRlcnZhbHMpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcnZhbHMoKSB7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbk9wdGlvbnMuaW50ZXJ2YWxzO1xuICAgIH1cblxuICAgIGlmKHRoaXMucXVlc3Rpb24uZ2V0VHlwZSgpID09IFwicmF0aW5nXCIpIHtcbiAgICAgIGlmICh0aGlzLm5lZWRVc2VSYXRlVmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSB0aGlzLnF1ZXN0aW9uW1wicmF0ZVZhbHVlc1wiXSBhcyBJdGVtVmFsdWVbXTtcbiAgICAgICAgcmV0dXJuIHJhdGVWYWx1ZXMubWFwKChyYXRlVmFsdWUsIGkpID0+ICh7XG4gICAgICAgICAgc3RhcnQ6IHJhdGVWYWx1ZS52YWx1ZSxcbiAgICAgICAgICBlbmQ6IGkgPCByYXRlVmFsdWVzLmxlbmd0aCAtIDEgPyByYXRlVmFsdWVzW2kgKyAxXS52YWx1ZSA6IHJhdGVWYWx1ZS52YWx1ZSArIDEsXG4gICAgICAgICAgbGFiZWw6IHJhdGVWYWx1ZS50ZXh0XG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhdGVJbnRlcnZhbHMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gKHRoaXMucXVlc3Rpb25bXCJyYXRlTWluXCJdIHx8IDApOyBpIDw9ICh0aGlzLnF1ZXN0aW9uW1wicmF0ZU1heFwiXSB8fCAoSGlzdG9ncmFtTW9kZWwuSW50ZXJ2YWxzQ291bnQgLSAxKSk7IGkgKz0gKHRoaXMucXVlc3Rpb25bXCJyYXRlU3RlcFwiXSB8fCAxKSkge1xuICAgICAgICAgIHJhdGVJbnRlcnZhbHMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogaSxcbiAgICAgICAgICAgIGVuZDogaSArIDEsXG4gICAgICAgICAgICBsYWJlbDogXCJcIiArICghIXRoaXMucXVlc3Rpb25bXCJyYXRlTWluXCJdICYmICEhdGhpcy5xdWVzdGlvbltcInJhdGVNYXhcIl0gPyBpIDogKGkgKyBcIi1cIiArIChpKzEpKSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmF0ZUludGVydmFscztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2FjaGVkSW50ZXJ2YWxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvbnRpbmlvdXNWYWx1ZXMgPSB0aGlzLmdldENvbnRpbmlvdXNWYWx1ZXMoKTtcbiAgICAgIHRoaXMuX2NhY2hlZEludGVydmFscyA9IFtdO1xuICAgICAgaWYgKGNvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBzdGFydCA9IGNvbnRpbmlvdXNWYWx1ZXNbMF0uY29udGluaW91cztcbiAgICAgICAgY29uc3QgZW5kID0gY29udGluaW91c1ZhbHVlc1tjb250aW5pb3VzVmFsdWVzLmxlbmd0aCAtIDFdLmNvbnRpbmlvdXM7XG4gICAgICAgIGNvbnN0IGludGVydmFsc0NvdW50ID0gSGlzdG9ncmFtTW9kZWwuSW50ZXJ2YWxzQ291bnQ7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gKGVuZCAtIHN0YXJ0KSAvIGludGVydmFsc0NvdW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVydmFsc0NvdW50OyArK2kpIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gc3RhcnQgKyBkZWx0YTtcbiAgICAgICAgICBjb25zdCBpc3RhcnQgPSB0aGlzLnRvUHJlY2lzaW9uKHN0YXJ0KTtcbiAgICAgICAgICBjb25zdCBpbmV4dCA9IHRoaXMudG9QcmVjaXNpb24obmV4dCk7XG4gICAgICAgICAgdGhpcy5fY2FjaGVkSW50ZXJ2YWxzLnB1c2goe1xuICAgICAgICAgICAgc3RhcnQ6IGlzdGFydCxcbiAgICAgICAgICAgIGVuZDogaSA8IGludGVydmFsc0NvdW50IC0gMSA/IGluZXh0IDogaW5leHQgKyBkZWx0YSAvIDEwMCxcbiAgICAgICAgICAgIGxhYmVsOiBcIlwiICsgdGhpcy5nZXRTdHJpbmcoaXN0YXJ0KSArIFwiLVwiICsgdGhpcy5nZXRTdHJpbmcoaW5leHQpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3RhcnQgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRJbnRlcnZhbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpOiBhbnkge1xuICAgIGNvbnN0IGNvbnRpbmlvdXNWYWx1ZXMgPSB0aGlzLmdldENvbnRpbmlvdXNWYWx1ZXMoKTtcbiAgICBjb25zdCBpbnRlcnZhbHMgPSB0aGlzLmludGVydmFscztcbiAgICBjb25zdCBzdGF0aXN0aWNzOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgaWYgKHNlcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNlcmllcy5wdXNoKFwiXCIpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcmllcy5sZW5ndGg7ICsraSkge1xuICAgICAgc3RhdGlzdGljcy5wdXNoKGludGVydmFscy5tYXAoaSA9PiAwKSk7XG4gICAgICB0aGlzLl9jb250aW5pb3VzRGF0YVtzZXJpZXNbaV1dLmZvckVhY2goZGF0YVZhbHVlID0+IHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbnRlcnZhbHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBpZiAoaW50ZXJ2YWxzW2pdLnN0YXJ0IDw9IGRhdGFWYWx1ZSAmJiAoZGF0YVZhbHVlIDwgaW50ZXJ2YWxzW2pdLmVuZCB8fCBqID09IGludGVydmFscy5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgc3RhdGlzdGljc1tpXVtqXSsrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpc3RpY3M7XG4gIH1cbn1cbiIsImNvbnN0IE11dXJpID0gcmVxdWlyZShcIm11dXJpXCIpO1xyXG5cclxuLyoqXHJcbiAqIEEgYmFzZSBjbGFzcyB1c2VkIHRvIGltcGxlbWVudCBjdXN0b20gbGF5b3V0IGVuZ2luZXMgb3IgaW50ZWdyYXRlIHRoaXJkLXBhcnR5IGxheW91dCBlbmdpbmVzIHdpdGggU3VydmV5SlMgRGFzaGJvYXJkLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExheW91dEVuZ2luZSB7XHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9hbGxvd2VkOiBib29sZWFuKSB7IH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXJ0Q29yZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7IH1cclxuICBwcm90ZWN0ZWQgc3RvcENvcmUoKSB7IH1cclxuICBwcm90ZWN0ZWQgdXBkYXRlQ29yZSgpIHsgfVxyXG5cclxuICBnZXQgYWxsb3dlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyB0aGUgZHluYW1pYyBsYXlvdXQgaW4gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYXJyYW5nZSB2aXN1YWxpemF0aW9uIGl0ZW1zIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgc2NyZWVuIHNwYWNlIGFuZCBhbGxvdyB1c2VycyB0byByZW9yZGVyIHRoZW0gdmlhIGRyYWcgYW5kIGRyb3AuXHJcbiAgICovXHJcbiAgc3RhcnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHtcclxuICAgICAgdGhpcy5zdGFydENvcmUoY29udGFpbmVyKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGlzYWJsZXMgdGhlIGR5bmFtaWMgbGF5b3V0LlxyXG4gICAqL1xyXG4gIHN0b3AoKSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkge1xyXG4gICAgICB0aGlzLnN0b3BDb3JlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIGR5bmFtaWMgbGF5b3V0LlxyXG4gICAqL1xyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29yZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHsgfVxyXG4gIHJlbW92ZShlbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+LCBvcHRpb25zPzogYW55KSB7IH1cclxuXHJcbiAgb25Nb3ZlQ2FsbGJhY2s6IChvcmRlcjogQXJyYXk8c3RyaW5nPikgPT4gdm9pZDtcclxuXHJcbiAgZGVzdHJveSgpIHtcclxuICAgIHRoaXMuc3RvcCgpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE11dXJpTGF5b3V0RW5naW5lIGV4dGVuZHMgTGF5b3V0RW5naW5lIHtcclxuICBwcml2YXRlIF9tdXVyaTogYW55ID0gdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2xheW91dGluZ1RpbWVyOiBhbnkgPSB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGFsbG93ZWQ6IGJvb2xlYW4sIHByaXZhdGUgX3NlbGVjdG9yOiBzdHJpbmcsIHByaXZhdGUgZHJhZ0VuYWJsZWQgPSB0cnVlKSB7XHJcbiAgICBzdXBlcihhbGxvd2VkKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdGFydENvcmUoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgdGhpcy5fbXV1cmkgPSBuZXcgTXV1cmkoY29udGFpbmVyLCB7XHJcbiAgICAgIGRyYWdTdGFydFByZWRpY2F0ZToge1xyXG4gICAgICAgIGhhbmRsZTogXCIuc2EtcXVlc3Rpb25fX3RpdGxlLS1kcmFnZ2FibGVcIixcclxuICAgICAgfSxcclxuICAgICAgaXRlbXM6IHRoaXMuX3NlbGVjdG9yLFxyXG4gICAgICBkcmFnRW5hYmxlZDogdGhpcy5kcmFnRW5hYmxlZCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbXV1cmkub24oXHJcbiAgICAgIFwiZHJhZ1JlbGVhc2VFbmRcIixcclxuICAgICAgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld09yZGVyID0gaXRlbS5nZXRHcmlkKCkuZ2V0SXRlbXMoKS5tYXAoZ3JpZEl0ZW0gPT4gZ3JpZEl0ZW0uZ2V0RWxlbWVudCgpLmRhdGFzZXQucXVlc3Rpb24pO1xyXG4gICAgICAgIHRoaXMub25Nb3ZlQ2FsbGJhY2sgJiYgdGhpcy5vbk1vdmVDYWxsYmFjayhuZXdPcmRlcik7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBzdG9wQ29yZSgpIHtcclxuICAgIHRoaXMuX211dXJpLm9mZihcImRyYWdSZWxlYXNlRW5kXCIpO1xyXG4gICAgdGhpcy5fbXV1cmkuZGVzdHJveSgpO1xyXG4gICAgdGhpcy5fbXV1cmkgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCB1cGRhdGVDb3JlKCkge1xyXG4gICAgaWYgKHRoaXMuX2xheW91dGluZ1RpbWVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2xheW91dGluZ1RpbWVyKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2xheW91dGluZ1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2xheW91dGluZ1RpbWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLl9tdXVyaS5yZWZyZXNoSXRlbXMoKTtcclxuICAgICAgdGhpcy5fbXV1cmkubGF5b3V0KCk7XHJcbiAgICB9LCAxMCk7XHJcbiAgfVxyXG5cclxuICBhZGQoZWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50Piwgb3B0aW9ucz86IGFueSkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHRoaXMuX211dXJpLmFkZChlbGVtZW50cywgb3B0aW9ucyk7XHJcbiAgfVxyXG4gIHJlbW92ZShlbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+LCBvcHRpb25zPzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkgdGhpcy5fbXV1cmkucmVtb3ZlKGVsZW1lbnRzLCBvcHRpb25zKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2VuZ2xpc2hcIjtcblxuZXhwb3J0IHZhciBsb2NhbGl6YXRpb24gPSB7XG4gIGN1cnJlbnRMb2NhbGVWYWx1ZTogXCJcIixcbiAgZGVmYXVsdExvY2FsZVZhbHVlOiBcImVuXCIsXG4gIGxvY2FsZXM6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gIGxvY2FsZU5hbWVzOiA8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pnt9LFxuICBzdXBwb3J0ZWRMb2NhbGVzOiA8QXJyYXk8YW55Pj5bXSxcbiAgZ2V0IGN1cnJlbnRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExvY2FsZVZhbHVlID09PSB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZVxuICAgICAgPyBcIlwiXG4gICAgICA6IHRoaXMuY3VycmVudExvY2FsZVZhbHVlO1xuICB9LFxuICBzZXQgY3VycmVudExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudExvY2FsZVZhbHVlID0gdmFsO1xuICB9LFxuICBnZXQgZGVmYXVsdExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWU7XG4gIH0sXG4gIHNldCBkZWZhdWx0TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWUgPSB2YWw7XG4gIH0sXG4gIGdldFN0cmluZzogZnVuY3Rpb24gKHN0ck5hbWU6IHN0cmluZykge1xuICAgIHZhciBsb2MgPSB0aGlzLmN1cnJlbnRMb2NhbGVcbiAgICAgID8gdGhpcy5sb2NhbGVzW3RoaXMuY3VycmVudExvY2FsZV1cbiAgICAgIDogdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgaWYgKCFsb2MgfHwgIWxvY1tzdHJOYW1lXSkgbG9jID0gdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgdmFyIHJlc3VsdCA9IGxvY1tzdHJOYW1lXTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMubG9jYWxlc1tcImVuXCJdW3N0ck5hbWVdIHx8IHN0ck5hbWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIGdldExvY2FsZXM6IGZ1bmN0aW9uICgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgcmVzLnB1c2goXCJcIik7XG4gICAgaWYgKHRoaXMuc3VwcG9ydGVkTG9jYWxlcyAmJiB0aGlzLnN1cHBvcnRlZExvY2FsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1cHBvcnRlZExvY2FsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnB1c2godGhpcy5zdXBwb3J0ZWRMb2NhbGVzW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMubG9jYWxlcykge1xuICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXMuc29ydCgpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgc3VydmV5U3RyaW5ncyA9IGVuZ2xpc2hTdHJpbmdzO1xuKDxhbnk+bG9jYWxpemF0aW9uKS5sb2NhbGVzW1wiZW5cIl0gPSBlbmdsaXNoU3RyaW5ncztcbig8YW55PmxvY2FsaXphdGlvbikubG9jYWxlTmFtZXNbXCJlblwiXSA9IFwiRW5nbGlzaFwiO1xuIiwiaW1wb3J0IHsgSXRlbVZhbHVlLCBRdWVzdGlvbk1hdHJpeE1vZGVsLCBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSUFuc3dlcnNEYXRhLCBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgTWF0cml4IGV4dGVuZHMgU2VsZWN0QmFzZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcIm1hdHJpeFwiKTtcbiAgICB0aGlzLmdldEFuc3dlcnNEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG1hdHJpeFF1ZXN0aW9uKCk6IFF1ZXN0aW9uTWF0cml4TW9kZWwge1xuICAgIHJldHVybiA8UXVlc3Rpb25NYXRyaXhNb2RlbD50aGlzLnF1ZXN0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFNlcmllc1ZhbHVlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+IFwiXCIgKyByb3cudmFsdWUpO1xuICB9XG5cbiAgZ2V0U2VyaWVzTGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT5cbiAgICAgIEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLm1hdHJpeFF1ZXN0aW9uLnJvd3MsIHJvdy52YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24uY29sdW1ucy5maWx0ZXIoXG4gICAgICAoY29sdW1uOiBJdGVtVmFsdWUpID0+IGNvbHVtbi50ZXh0ID09PSBpdGVtVGV4dFxuICAgIClbMF07XG4gIH1cblxuICB2YWx1ZXNTb3VyY2UoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24uY29sdW1ucztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyYXkoXG4gICAgZGF0YXNldHM6IEFycmF5PEFycmF5PGFueT4+XG4gICk6IEFycmF5PGJvb2xlYW4+IHtcbiAgICBsZXQgcmVzdWx0OiBBcnJheTxib29sZWFuPiA9IEFycmF5PGJvb2xlYW4+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhc2V0c1swXS5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkYXRhc2V0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoZGF0YXNldHNbal1baV0gIT0gMCkge1xuICAgICAgICAgIHJlc3VsdFtpXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SGFzQW5zd2Vyc0luU2VyaWVzKGRhdGFzZXQ6IEFycmF5PGFueT4pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChkYXRhc2V0W2ldICE9IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlRW1wdHlBbnN3ZXJzSW5EYXRhKGFuc3dlcnNEYXRhOiBJQW5zd2Vyc0RhdGEpOiBJQW5zd2Vyc0RhdGEge1xuICAgIGNvbnN0IHJlc3VsdDogSUFuc3dlcnNEYXRhID0ge1xuICAgICAgZGF0YXNldHM6IDxBcnJheTxBcnJheTxhbnk+Pj5bXSxcbiAgICAgIGxhYmVsczogPEFycmF5PHN0cmluZz4+W10sXG4gICAgICBjb2xvcnM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgICAgdGV4dHM6IDxBcnJheTxBcnJheTxhbnk+Pj5bXSxcbiAgICAgIHNlcmllc0xhYmVsczogPEFycmF5PHN0cmluZz4+W10sXG4gICAgfTtcblxuICAgIGNvbnN0IGhhc0Fuc3dlcnNJbkFsbFNlcmllc0FyciA9IHRoaXMuZ2V0SGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyYXkoXG4gICAgICBhbnN3ZXJzRGF0YS5kYXRhc2V0c1xuICAgICk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbnN3ZXJzRGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaGFzQW5zd2Vyc0luU2VyaWVzID0gdGhpcy5nZXRIYXNBbnN3ZXJzSW5TZXJpZXMoXG4gICAgICAgIGFuc3dlcnNEYXRhLmRhdGFzZXRzW2ldXG4gICAgICApO1xuICAgICAgaWYgKGhhc0Fuc3dlcnNJblNlcmllcykge1xuICAgICAgICByZXN1bHQubGFiZWxzLnB1c2goYW5zd2Vyc0RhdGEubGFiZWxzW2ldKTtcbiAgICAgICAgcmVzdWx0LmNvbG9ycy5wdXNoKGFuc3dlcnNEYXRhLmNvbG9yc1tpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXRzID0gW107XG4gICAgICBjb25zdCB0ZXh0cyA9IFtdO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhbnN3ZXJzRGF0YS5kYXRhc2V0c1swXS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoaGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyW2pdKSB7XG4gICAgICAgICAgZGF0YXNldHMucHVzaChhbnN3ZXJzRGF0YS5kYXRhc2V0c1tpXVtqXSk7XG4gICAgICAgICAgdGV4dHMucHVzaChhbnN3ZXJzRGF0YS50ZXh0c1tpXVtqXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdC5kYXRhc2V0cy5wdXNoKGRhdGFzZXRzKTtcbiAgICAgIHJlc3VsdC50ZXh0cy5wdXNoKHRleHRzKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbnN3ZXJzRGF0YS5kYXRhc2V0c1swXS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhhc0Fuc3dlcnNJbkFsbFNlcmllc0FycltpXSkge1xuICAgICAgICByZXN1bHQuc2VyaWVzTGFiZWxzLnB1c2goYW5zd2Vyc0RhdGEuc2VyaWVzTGFiZWxzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYWxjdWxhdGVkVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdGF0aXN0aWNzID0gc3VwZXIuZ2V0Q2FsY3VsYXRlZFZhbHVlcygpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgdmFsdWVzLmZvckVhY2goKHZhbCwgdmFsdWVJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgIChzZXJpZXNOYW1lLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bdmFsdWVJbmRleF1cbiAgICAgICk7XG4gICAgICBwcmVwYXJlZERhdGEucHVzaChzZXJpZXNEYXRhKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCwgUXVlc3Rpb24sIE1hdHJpeERyb3Bkb3duQ29sdW1uLCBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSUFuc3dlcnNEYXRhLCBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Hcm91cGVkIGV4dGVuZHMgU2VsZWN0QmFzZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcIm1hdHJpeERyb3Bkb3duR3JvdXBlZFwiKTtcbiAgICB0aGlzLmdldEFuc3dlcnNEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG1hdHJpeFF1ZXN0aW9uKCk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB7XG4gICAgcmV0dXJuIDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+dGhpcy5xdWVzdGlvbjtcbiAgfVxuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB8IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24uY29sdW1ucy5tYXAoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgfVxuXG4gIGdldFNlcmllc0xhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLm1hcCgoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikgPT4gY29sdW1uLnRpdGxlKTtcbiAgfVxuXG4gIC8vIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAvLyAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMuZmlsdGVyKFxuICAvLyAgICAgKGNvbHVtbjogSXRlbVZhbHVlKSA9PiBjb2x1bW4udGV4dCA9PT0gaXRlbVRleHRcbiAgLy8gICApWzBdO1xuICAvLyB9XG5cbiAgdmFsdWVzU291cmNlKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNob2ljZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldENhbGN1bGF0ZWRWYWx1ZXMoKTogYW55W10ge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICBjb25zdCByb3dzID0gdGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLm1hcChyb3cgPT4gcm93LnZhbHVlKTtcblxuICAgIGNvbnN0IHN0YXRpc3RpY3MgPSB0aGlzLmRhdGFQcm92aWRlci5nZXREYXRhKHtcbiAgICAgIG5hbWU6IHNlcmllcyxcbiAgICAgIGdldFZhbHVlczogKCkgPT4gdmFsdWVzLFxuICAgICAgZ2V0TGFiZWxzOiAoKSA9PiB2YWx1ZXMsXG4gICAgICBnZXRTZXJpZXNWYWx1ZXM6ICgpID0+IHJvd3MsXG4gICAgICBnZXRTZXJpZXNMYWJlbHM6ICgpID0+IHJvd3MsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgdmFsdWVzLmZvckVhY2goKHZhbCwgdmFsdWVJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgIChzZXJpZXNOYW1lLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bMF1bdmFsdWVJbmRleF1cbiAgICAgICk7XG4gICAgICBwcmVwYXJlZERhdGEucHVzaChzZXJpZXNEYXRhKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG5leHBvcnQgY2xhc3MgTnVtYmVyTW9kZWwgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByaXZhdGUgX3Jlc3VsdEF2ZXJhZ2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVzdWx0TWluOiBudW1iZXI7XG4gIHByaXZhdGUgX3Jlc3VsdE1heDogbnVtYmVyO1xuXG4gIHB1YmxpYyBzdGF0aWMgc3RlcHNDb3VudCA9IDU7XG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVUZXh0c0NhbGxiYWNrOiAoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBzdGVwc0NvdW50OiBudW1iZXIsXG4gICAgdGV4dHM6IHN0cmluZ1tdXG4gICkgPT4gc3RyaW5nW107XG5cbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IEFycmF5PHN0cmluZz47XG4gIGNoYXJ0VHlwZTogU3RyaW5nO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hvd0FzUGVyY2VudGFnZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJudW1iZXJcIik7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlQ2hhcnRUeXBlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy5jaGFydFR5cGVzLm1hcCgoY2hhcnRUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogY2hhcnRUeXBlLFxuICAgICAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhcnRUeXBlX1wiICsgY2hhcnRUeXBlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLmNoYXJ0VHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcnRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWluID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3VsdE1heCA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFydFR5cGVDaGFuZ2VkKCkge31cblxuICBwcm90ZWN0ZWQgc2V0Q2hhcnRUeXBlKGNoYXJ0VHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGFydFR5cGVzLmluZGV4T2YoY2hhcnRUeXBlKSAhPT0gLTEgJiZcbiAgICAgIHRoaXMuY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuY2hhcnRUeXBlID0gY2hhcnRUeXBlO1xuICAgICAgdGhpcy5vbkNoYXJ0VHlwZUNoYW5nZWQoKTtcbiAgICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXN1bHRNaW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWF4ID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGdlbmVyYXRlVGV4dChtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBsZXQgdGV4dHM6IGFueSA9IFtdO1xuXG4gICAgaWYgKHN0ZXBzQ291bnQgPT09IDUpIHtcbiAgICAgIHRleHRzID0gW1xuICAgICAgICBcInZlcnkgaGlnaCAoXCIgKyBtYXhWYWx1ZSArIFwiKVwiLFxuICAgICAgICBcImhpZ2hcIixcbiAgICAgICAgXCJtZWRpdW1cIixcbiAgICAgICAgXCJsb3dcIixcbiAgICAgICAgXCJ2ZXJ5IGxvdyAoXCIgKyBtaW5WYWx1ZSArIFwiKVwiLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dHMucHVzaChtYXhWYWx1ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzQ291bnQgLSAyOyBpKyspIHtcbiAgICAgICAgdGV4dHMucHVzaChcIlwiKTtcbiAgICAgIH1cbiAgICAgIHRleHRzLnB1c2gobWluVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghIU51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIE51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjayhcbiAgICAgICAgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgbWF4VmFsdWUsXG4gICAgICAgIG1pblZhbHVlLFxuICAgICAgICBzdGVwc0NvdW50LFxuICAgICAgICB0ZXh0c1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dHM7XG4gIH1cblxuICBnZW5lcmF0ZVZhbHVlcyhtYXhWYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICB2YWx1ZXMucHVzaChtYXhWYWx1ZSAvIHN0ZXBzQ291bnQpO1xuICAgIH1cblxuICAgIHZhbHVlcy5wdXNoKG1heFZhbHVlKTtcblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBnZW5lcmF0ZUNvbG9ycyhtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCBwYWxldHRlID0gdGhpcy5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICBjb2xvcnMucHVzaChwYWxldHRlW2ldKTtcbiAgICB9XG5cbiAgICBjb2xvcnMucHVzaChcInJnYmEoMjU1LCAyNTUsIDI1NSwgMClcIik7XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgcHVibGljIGdldENhbGN1bGF0ZWRWYWx1ZXMoKTogYW55IHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9yZXN1bHRNYXggPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5fcmVzdWx0TWluID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIHRoaXMuX3Jlc3VsdE1heCA9IC1OdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IDA7XG4gICAgICBsZXQgYWN0dWFsQW5zd2VyQ291bnQgPSAwO1xuXG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaCgocm93RGF0YSkgPT4ge1xuICAgICAgICBpZihyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uVmFsdWU6IG51bWJlciA9ICtyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICAgICAgYWN0dWFsQW5zd2VyQ291bnQrKztcbiAgICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlICs9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jlc3VsdE1pbiA+IHF1ZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9yZXN1bHRNYXggPCBxdWVzdGlvblZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRNYXggPSBxdWVzdGlvblZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmKGFjdHVhbEFuc3dlckNvdW50ID4gMCkge1xuICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID0gdGhpcy5fcmVzdWx0QXZlcmFnZSAvIGFjdHVhbEFuc3dlckNvdW50O1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IE1hdGguY2VpbCh0aGlzLl9yZXN1bHRBdmVyYWdlICogMTAwKSAvIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLl9yZXN1bHRBdmVyYWdlLCB0aGlzLl9yZXN1bHRNaW4sIHRoaXMuX3Jlc3VsdE1heF07XG4gIH1cbn1cbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi9ib29sZWFuXCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgUGxvdGx5Qm9vbENoYXJ0QWRhcHRlciBleHRlbmRzIFBsb3RseUNoYXJ0QWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsOiBCb29sZWFuUGxvdGx5KSB7XG4gICAgc3VwZXIobW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBib29sQ29sb3JzID0gW1xuICAgICAgQm9vbGVhblBsb3RseS50cnVlQ29sb3IgfHwgY29sb3JzWzBdLFxuICAgICAgQm9vbGVhblBsb3RseS5mYWxzZUNvbG9yIHx8IGNvbG9yc1sxXSxcbiAgICBdO1xuICAgIGlmKHRoaXMubW9kZWwuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICBib29sQ29sb3JzLnB1c2goY29sb3JzWzJdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlOiBhbnkpID0+IHtcbiAgICAgICAgdHJhY2UubWFya2VyLmNvbG9ycyA9IGJvb2xDb2xvcnM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuY2hhcnRUeXBlID09PSBcImJhclwiKSB7XG4gICAgICB0cmFjZXMuZm9yRWFjaCgodHJhY2U6IGFueSkgPT4ge1xuICAgICAgICB0cmFjZS5tYXJrZXIuY29sb3IgPSBib29sQ29sb3JzO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuUGxvdGx5IGV4dGVuZHMgQm9vbGVhbk1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJwaWVcIiwgXCJiYXJcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEJvb2xlYW5QbG90bHkudHlwZXM7XG4gICAgdGhpcy5fY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlCb29sQ2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImJvb2xlYW5cIiwgQm9vbGVhblBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEhpc3RvZ3JhbU1vZGVsIH0gZnJvbSBcIi4uL2hpc3RvZ3JhbVwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEhpc3RvZ3JhbVBsb3RseSBleHRlbmRzIEhpc3RvZ3JhbU1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJ2YmFyXCIsIFwiYmFyXCIsIFwic2NhdHRlclwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEhpc3RvZ3JhbVBsb3RseS50eXBlcztcbiAgICB0aGlzLl9jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gPEhUTUxFbGVtZW50PihcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICApO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGFydE5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5jcmVhdGUoY2hhcnROb2RlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYWxjdWxhdGVkVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdGF0aXN0aWNzID0gc3VwZXIuZ2V0Q2FsY3VsYXRlZFZhbHVlcygpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBpZiAoc2VyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkRGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgICAgKHNlcmllc1ZhbHVlLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bdmFsdWVJbmRleF1cbiAgICAgICAgKTtcbiAgICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcmVwYXJlZERhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlVHlwZSgpOiBcImRhdGVcIiB8IFwibnVtYmVyXCIge1xuICAgIHJldHVybiB0aGlzLnZhbHVlVHlwZTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkYXRlXCIsIEhpc3RvZ3JhbVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJudW1iZXJcIiwgSGlzdG9ncmFtUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInJhdGluZ1wiLCBIaXN0b2dyYW1QbG90bHkpO1xuIiwiZXhwb3J0ICogZnJvbSBcIi4vc2V0dXBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21hdHJpeFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYm9vbGVhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmFua2luZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWF0cml4ZHJvcGRvd24tZ3JvdXBlZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaGlzdG9ncmFtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yYXRpbmdcIjtcbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSwgUXVlc3Rpb25NYXRyaXhNb2RlbCwgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBNYXRyaXggfSBmcm9tIFwiLi4vbWF0cml4XCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgTWF0cml4UGxvdGx5IGV4dGVuZHMgTWF0cml4IHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJiYXJcIiwgXCJzdGFja2VkYmFyXCIsIFwicGllXCIsIFwiZG91Z2hudXRcIl07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBNYXRyaXhQbG90bHkudHlwZXM7XG4gICAgdGhpcy5fY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlDaGFydEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm1hdHJpeFwiLCBNYXRyaXhQbG90bHkpO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgTWF0cml4RHJvcGRvd25Hcm91cGVkIH0gZnJvbSBcIi4uL21hdHJpeERyb3Bkb3duR3JvdXBlZFwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duR3JvdXBlZFBsb3RseSBleHRlbmRzIE1hdHJpeERyb3Bkb3duR3JvdXBlZCB7XG4gIHByaXZhdGUgX2NoYXJ0QWRhcHRlcjogUGxvdGx5Q2hhcnRBZGFwdGVyO1xuICBwdWJsaWMgc3RhdGljIHR5cGVzID0gW1wic3RhY2tlZGJhclwiLCBcImJhclwiLCBcInBpZVwiLCBcImRvdWdobnV0XCJdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IE1hdHJpeERyb3Bkb3duR3JvdXBlZFBsb3RseS50eXBlcztcbiAgICB0aGlzLl9jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibWF0cml4ZHJvcGRvd24tZ3JvdXBlZFwiLCBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkpO1xuIiwiaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2VQbG90bHkgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBSYW5raW5nUGxvdGx5IGV4dGVuZHMgU2VsZWN0QmFzZVBsb3RseSB7XG4gIGdldFF1ZXN0aW9uUmVzdWx0cygpIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5xdWVzdGlvbi5uYW1lO1xuICAgIHJldHVybiB0aGlzLmRhdGEubWFwKChkYXRhSXRlbSkgPT4gZGF0YUl0ZW1bbmFtZV0pO1xuICB9XG5cbiAgZ2V0RW1wdHlEYXRhKCkge1xuICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuICAgIGxldCBkYXRhOiBhbnkgPSBbXTtcblxuICAgIGRhdGEubGVuZ3RoID0gY2hvaWNlcy5sZW5ndGg7XG4gICAgZGF0YS5maWxsKDApO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ2V0UXVlc3Rpb25SZXN1bHRzKCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG5cbiAgICBsZXQgcGxvdGx5RGF0YSA9IHRoaXMuZ2V0RW1wdHlEYXRhKCk7XG5cbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy5hcHBseVJlc3VsdFRvUGxvdGx5RGF0YShyZXN1bHQsIHBsb3RseURhdGEsIGNob2ljZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtwbG90bHlEYXRhXTtcbiAgfVxuXG4gIGFwcGx5UmVzdWx0VG9QbG90bHlEYXRhKHJlc3VsdDogYW55W10sIHBsb3RseURhdGE6IGFueSwgY2hvaWNlczogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQgfHwgIXBsb3RseURhdGEgfHwgIWNob2ljZXMpIHJldHVybjtcblxuICAgIHJlc3VsdC5mb3JFYWNoKChyZXN1bHRWYWx1ZTogYW55LCByZXN1bHRWYWx1ZUluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55W10pID0+IHtcbiAgICAgIGxldCBpbmRleCA9IGNob2ljZXMuaW5kZXhPZihyZXN1bHRWYWx1ZSk7XG4gICAgICBwbG90bHlEYXRhW2luZGV4XSA9XG4gICAgICAgICtwbG90bHlEYXRhW2luZGV4XSArIChyZXN1bHQubGVuZ3RoIC0gcmVzdWx0VmFsdWVJbmRleCk7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFua2luZ1wiLCBSYW5raW5nUGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvblJhdGluZ01vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBOdW1iZXJNb2RlbCB9IGZyb20gXCIuLi9udW1iZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBhbGxvd0RvbVJlbmRlcmluZywgRGF0YUhlbHBlciwgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5pbXBvcnQgUGxvdGx5IGZyb20gXCJwbG90bHkuanMtZGlzdC1taW5cIjtcblxuZXhwb3J0IGNsYXNzIFBsb3RseUdhdWdlQWRhcHRlciB7XG4gIHByaXZhdGUgX2NoYXJ0OiBQcm9taXNlPFBsb3RseS5QbG90bHlIVE1MRWxlbWVudD4gPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogR2F1Z2VQbG90bHkpIHsgfVxuXG4gIHB1YmxpYyBnZXQgY2hhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0O1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZShjaGFydE5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSB0aGlzLm1vZGVsLnF1ZXN0aW9uO1xuICAgIGxldCBbbGV2ZWwsIG1pblZhbHVlLCBtYXhWYWx1ZV0gPSB0aGlzLm1vZGVsLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcblxuICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwicmF0aW5nXCIpIHtcbiAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSAoPFF1ZXN0aW9uUmF0aW5nTW9kZWw+cXVlc3Rpb24pLnZpc2libGVSYXRlVmFsdWVzO1xuICAgICAgbWF4VmFsdWUgPSByYXRlVmFsdWVzW3JhdGVWYWx1ZXMubGVuZ3RoIC0gMV0udmFsdWU7XG4gICAgICBtaW5WYWx1ZSA9IHJhdGVWYWx1ZXNbMF0udmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZW5lcmF0ZUNvbG9ycyhcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBHYXVnZVBsb3RseS5zdGVwc0NvdW50XG4gICAgKTtcblxuICAgIGlmIChHYXVnZVBsb3RseS5zaG93QXNQZXJjZW50YWdlKSB7XG4gICAgICBsZXZlbCA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKGxldmVsLCBtYXhWYWx1ZSk7XG4gICAgICBtaW5WYWx1ZSA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBtYXhWYWx1ZSA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKG1heFZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGRhdGE6IGFueSA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbmRpY2F0b3JcIixcbiAgICAgICAgbW9kZTogXCJnYXVnZStudW1iZXJcIixcbiAgICAgICAgZ2F1Z2U6IHtcbiAgICAgICAgICBheGlzOiB7IHJhbmdlOiBbbWluVmFsdWUsIG1heFZhbHVlXSB9LFxuICAgICAgICAgIHNoYXBlOiB0aGlzLm1vZGVsLmNoYXJ0VHlwZSxcbiAgICAgICAgICBiZ2NvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgYmFyOiB7IGNvbG9yOiBjb2xvcnNbMF0gfSxcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IGxldmVsLFxuICAgICAgICB0ZXh0OiBxdWVzdGlvbi5uYW1lLFxuICAgICAgICBkb21haW46IHsgeDogWzAsIDFdLCB5OiBbMCwgMV0gfSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGNoYXJ0TWFyZ2luID0gdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiYnVsbGV0XCIgPyA2MCA6IDMwO1xuICAgIHZhciBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGhlaWdodDogMjUwLFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIGw6IGNoYXJ0TWFyZ2luLFxuICAgICAgICByOiBjaGFydE1hcmdpbixcbiAgICAgICAgYjogY2hhcnRNYXJnaW4sXG4gICAgICAgIHQ6IGNoYXJ0TWFyZ2luLFxuICAgICAgICBwYWQ6IDVcbiAgICAgIH0sXG4gICAgICBwbG90X2JnY29sb3I6IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGRpc3BsYXlNb2RlQmFyOiB0cnVlLFxuICAgICAgbG9jYWxlOiBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZSxcbiAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICBkaXNwbGF5bG9nbzogZmFsc2UsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsIGFzIGFueSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAoPGFueT5QbG90bHkpLmRvd25sb2FkSW1hZ2UoZ2QsIG9wdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuXG4gICAgfTtcbiAgICBpZiAoR2F1Z2VQbG90bHkuZGlzcGxheU1vZGVCYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLmRpc3BsYXlNb2RlQmFyID0gR2F1Z2VQbG90bHkuZGlzcGxheU1vZGVCYXI7XG4gICAgfVxuXG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgbGF5b3V0OiBsYXlvdXQsXG4gICAgICBjb25maWc6IGNvbmZpZyxcbiAgICB9O1xuICAgIFBsb3RseVNldHVwLm9uUGxvdENyZWF0aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gKDxhbnk+UGxvdGx5KS5uZXdQbG90KFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgb3B0aW9ucy5kYXRhLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdhdWdlUGxvdGx5IGV4dGVuZHMgTnVtYmVyTW9kZWwge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUdhdWdlQWRhcHRlcjtcblxuICBwdWJsaWMgc3RhdGljIGRpc3BsYXlNb2RlQmFyOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJnYXVnZVwiLCBcImJ1bGxldFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEdhdWdlUGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlHYXVnZUFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm51bWJlclwiLCBHYXVnZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYXRpbmdcIiwgR2F1Z2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZXhwcmVzc2lvblwiLCBHYXVnZVBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgSXRlbVZhbHVlLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgYWxsb3dEb21SZW5kZXJpbmcsIERhdGFIZWxwZXIsIERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IFBsb3RseSBmcm9tIFwicGxvdGx5LmpzLWRpc3QtbWluXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBjbGFzcyBQbG90bHlDaGFydEFkYXB0ZXIge1xuICBwcml2YXRlIF9jaGFydDogUHJvbWlzZTxQbG90bHkuUGxvdGx5SFRNTEVsZW1lbnQ+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBtb2RlbDogU2VsZWN0QmFzZSkgeyB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGNoYXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFydDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoY2hhcnROb2RlOiBIVE1MRWxlbWVudCkge1xuICAgIHZhciBwbG90bHlPcHRpb25zID0gUGxvdGx5U2V0dXAuc2V0dXAodGhpcy5tb2RlbC5jaGFydFR5cGUsIHRoaXMubW9kZWwpO1xuXG4gICAgbGV0IGNvbmZpZzogYW55ID0ge1xuICAgICAgZGlzcGxheWxvZ286IGZhbHNlLFxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgIGxvY2FsZTogbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICg8YW55PlBsb3RseSkuZG93bmxvYWRJbWFnZShnZCwgb3B0aW9ucyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBpZiAoU2VsZWN0QmFzZVBsb3RseS5kaXNwbGF5TW9kZUJhciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuZGlzcGxheU1vZGVCYXIgPSBTZWxlY3RCYXNlUGxvdGx5LmRpc3BsYXlNb2RlQmFyO1xuICAgIH1cblxuICAgIHRoaXMucGF0Y2hDb25maWdQYXJhbWV0ZXJzKFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBwbG90bHlPcHRpb25zLmxheW91dCxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG5cbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgIHRyYWNlczogcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBsYXlvdXQ6IHBsb3RseU9wdGlvbnMubGF5b3V0LFxuICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgfTtcbiAgICBQbG90bHlTZXR1cC5vblBsb3RDcmVhdGluZy5maXJlKHRoaXMubW9kZWwsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcGxvdCA9ICg8YW55PlBsb3RseSkubmV3UGxvdChcbiAgICAgIGNoYXJ0Tm9kZSxcbiAgICAgIG9wdGlvbnMudHJhY2VzLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG5cbiAgICAoPGFueT5jaGFydE5vZGUpW1wib25cIl0oXCJwbG90bHlfY2xpY2tcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEucG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGl0ZW1UZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKCFwbG90bHlPcHRpb25zLmhhc1Nlcmllcykge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gQXJyYXkuaXNBcnJheShkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhKVxuICAgICAgICAgICAgPyBkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhWzBdXG4gICAgICAgICAgICA6IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGE7XG4gICAgICAgICAgY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lO1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5TGFiZWwgPSBkYXRhLnBvaW50c1swXS5sYWJlbDtcbiAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZXMgPSB0aGlzLm1vZGVsLmdldFNlcmllc1ZhbHVlcygpO1xuICAgICAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMubW9kZWwuZ2V0U2VyaWVzTGFiZWxzKCk7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHNlcmllc1ZhbHVlc1tzZXJpZXNMYWJlbHMuaW5kZXhPZihwcm9wZXJ0eUxhYmVsKV07XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWUgPSB0aGlzLm1vZGVsLmdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dCk7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBJdGVtVmFsdWUoeyBbcHJvcGVydHlWYWx1ZV06IHNlbGVjdGVkSXRlbS52YWx1ZSB9LCBwcm9wZXJ0eUxhYmVsICsgXCI6IFwiICsgc2VsZWN0ZWRJdGVtLnRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc3QgaXRlbVRleHQgPSBwbG90bHlPcHRpb25zLmhhc1Nlcmllc1xuICAgICAgICAvLyAgID8gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lXG4gICAgICAgIC8vICAgOiBBcnJheS5pc0FycmF5KGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGEpXG4gICAgICAgIC8vICAgICA/IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGFbMF1cbiAgICAgICAgLy8gICAgIDogZGF0YS5wb2ludHNbMF0uY3VzdG9tZGF0YTtcbiAgICAgICAgLy8gY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAvLyB0aGlzLm1vZGVsLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBnZXREcmFnTGF5ZXIgPSAoKSA9PlxuICAgICAgPEhUTUxFbGVtZW50PmNoYXJ0Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibnNld2RyYWdcIilbMF07XG4gICAgKDxhbnk+Y2hhcnROb2RlKVtcIm9uXCJdKFwicGxvdGx5X2hvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCIpO1xuICAgIH0pO1xuICAgICg8YW55PmNoYXJ0Tm9kZSlbXCJvblwiXShcInBsb3RseV91bmhvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJcIik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jaGFydCA9IHBsb3Q7XG4gICAgcmV0dXJuIHBsb3Q7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJhc2VQbG90bHkgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiLCBcInNjYXR0ZXJcIl07XG4gIHB1YmxpYyBzdGF0aWMgZGlzcGxheU1vZGVCYXI6IGFueSA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBbXS5jb25jYXQoU2VsZWN0QmFzZVBsb3RseS50eXBlcyk7XG4gICAgaWYgKHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID4gMCAmJiB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcInN0YWNrZWRiYXJcIikgPT09IC0xKSB7XG4gICAgICB0aGlzLmNoYXJ0VHlwZXMucHVzaChcInN0YWNrZWRiYXJcIik7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuYWxsb3dFeHBlcmltZW50YWxGZWF0dXJlcykge1xuICAgICAgdGhpcy5jaGFydFR5cGVzLnNwbGljZSgxLCAwLCBcInZiYXJcIik7XG4gICAgfVxuICAgIHRoaXMuX2NoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICBpZiAodGhpcy5jaGFydFR5cGVzLmluZGV4T2Yob3B0aW9ucy5kZWZhdWx0Q2hhcnRUeXBlKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2NoYXJ0VHlwZSA9IG9wdGlvbnMuZGVmYXVsdENoYXJ0VHlwZTtcbiAgICB9XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHN1cGVyLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgaWYgKHNlcmllcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsLCB2YWx1ZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAgIChzZXJpZXNWYWx1ZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdW3ZhbHVlSW5kZXhdXG4gICAgICAgICk7XG4gICAgICAgIHByZXBhcmVkRGF0YS5wdXNoKHNlcmllc0RhdGEpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGlzdGljcztcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJjaGVja2JveFwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInJhZGlvZ3JvdXBcIiwgU2VsZWN0QmFzZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkcm9wZG93blwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImltYWdlcGlja2VyXCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwidGFnYm94XCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuIiwiaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi4vdmlzdWFsaXplckJhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQbG90bHlPcHRpb25zIHtcbiAgdHJhY2VzOiBBcnJheTxhbnk+O1xuICBsYXlvdXQ6IGFueTtcbiAgaGFzU2VyaWVzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUGxvdGx5U2V0dXAge1xuICBwdWJsaWMgc3RhdGljIGltYWdlRXhwb3J0Rm9ybWF0ID0gXCJwbmdcIjtcbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gZW5kIHVzZXIgY2xpY2tzIG9uIHRoZSAnc2F2ZSBhcyBpbWFnZScgYnV0dG9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvbkltYWdlU2F2aW5nID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFNlbGVjdEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFNlbGVjdEJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICAvKipcbiAgICogRmlyZXMgYmVmb3JlIHBsb3Qgd2lsbCBiZSBjcmVhdGVkLiBVc2VyIGNhbiBjaGFuZ2UgdHJhY2VzLCBsYXlvdXQgYW5kIGNvbmZpZyBvZiB0aGUgcGxvdC5cbiAgICogT3B0aW9ucyBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczogdHJhY2VzLCBsYXlvdXQgYW5kIGNvbmZpZyBvZiB0aGUgcGxvdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb25QbG90Q3JlYXRpbmcgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXplckJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFZpc3VhbGl6ZXJCYXNlLFxuICAgIGFueVxuICA+KCk7XG5cbiAgc3RhdGljIHNldHVwczogeyBbdHlwZTogc3RyaW5nXTogKG1vZGVsOiBTZWxlY3RCYXNlKSA9PiBQbG90bHlPcHRpb25zIH0gPSB7XG4gICAgYmFyOiBQbG90bHlTZXR1cC5zZXR1cEJhcixcbiAgICB2YmFyOiBQbG90bHlTZXR1cC5zZXR1cFZCYXIsXG4gICAgc3RhY2tlZGJhcjogUGxvdGx5U2V0dXAuc2V0dXBCYXIsXG4gICAgZG91Z2hudXQ6IFBsb3RseVNldHVwLnNldHVwUGllLFxuICAgIHBpZTogUGxvdGx5U2V0dXAuc2V0dXBQaWUsXG4gICAgc2NhdHRlcjogUGxvdGx5U2V0dXAuc2V0dXBTY2F0dGVyLFxuICB9O1xuXG4gIHN0YXRpYyBzZXR1cChjaGFyVHlwZTogc3RyaW5nLCBtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnNldHVwc1tjaGFyVHlwZV0obW9kZWwpO1xuICB9XG5cbiAgc3RhdGljIGdldFRydW5jYXRlZExhYmVsID0gKGxhYmVsOiBzdHJpbmcsIGxhYmVsVHJ1bmNhdGVMZW5ndGg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHRydW5jYXRlU3ltYm9scyA9IFwiLi4uXCI7XG4gICAgY29uc3QgdHJ1bmNhdGVTeW1ib2xzTGVuZ3RoID0gdHJ1bmNhdGVTeW1ib2xzLmxlbmd0aDtcblxuICAgIGlmICghbGFiZWxUcnVuY2F0ZUxlbmd0aCkgcmV0dXJuIGxhYmVsO1xuICAgIGlmIChsYWJlbFRydW5jYXRlTGVuZ3RoID09PSAtMSkgcmV0dXJuIGxhYmVsO1xuICAgIGlmIChsYWJlbC5sZW5ndGggPD0gbGFiZWxUcnVuY2F0ZUxlbmd0aCArIHRydW5jYXRlU3ltYm9sc0xlbmd0aClcbiAgICAgIHJldHVybiBsYWJlbDtcblxuICAgIHJldHVybiBsYWJlbC5zdWJzdHJpbmcoMCwgbGFiZWxUcnVuY2F0ZUxlbmd0aCkgKyB0cnVuY2F0ZVN5bWJvbHM7XG4gIH07XG5cbiAgc3RhdGljIHNldHVwUGllKG1vZGVsOiBTZWxlY3RCYXNlKTogUGxvdGx5T3B0aW9ucyB7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBsZXQgdHJhY2VzOiBhbnkgPSBbXTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMSB8fCBtb2RlbC5xdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwibWF0cml4XCI7XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogbW9kZWwuY2hhcnRUeXBlLFxuICAgICAgeTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgdGV4dDogKGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscykubWFwKChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBQbG90bHlTZXR1cC5nZXRUcnVuY2F0ZWRMYWJlbChcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtb2RlbC5sYWJlbFRydW5jYXRlTGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGhvdmVyaW5mbzogXCJ4K3lcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG5cbiAgICB0cmFjZUNvbmZpZy5ob3ZlcmluZm8gPSBcImxhYmVsK3ZhbHVlK3BlcmNlbnRcIjtcbiAgICB0cmFjZUNvbmZpZy5tYXJrZXIuY29sb3JzID0gY29sb3JzO1xuICAgIHRyYWNlQ29uZmlnLnRleHRwb3NpdGlvbiA9IFwiaW5zaWRlXCI7XG5cbiAgICBpZiAobW9kZWwuY2hhcnRUeXBlID09PSBcImRvdWdobnV0XCIpIHtcbiAgICAgIHRyYWNlQ29uZmlnLnR5cGUgPSBcInBpZVwiO1xuICAgICAgdHJhY2VDb25maWcuaG9sZSA9IDAuNDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1Nlcmllcykge1xuICAgICAgdHJhY2VDb25maWcubWFya2VyLnN5bWJvbCA9IFwiY2lyY2xlXCI7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc2l6ZSA9IDE2O1xuICAgIH1cblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHRyYWNlcy5wdXNoKFxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCB0cmFjZUNvbmZpZywge1xuICAgICAgICAgIHZhbHVlczogZGF0YXNldCxcbiAgICAgICAgICBsYWJlbHM6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IHJhZGl1cyA9IGxhYmVscy5sZW5ndGggPCAxMCA/IGxhYmVscy5sZW5ndGggKiA1MCArIDEwMCA6IDU1MDtcbiAgICBjb25zdCBoZWlnaHQgPSByYWRpdXMgKiBNYXRoLnJvdW5kKHRyYWNlcy5sZW5ndGggLyAyKSArIDI1O1xuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIGw6IDAsXG4gICAgICAgIHQ6IDI1LFxuICAgICAgICBiOiAwLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHBsb3RfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgc2hvd2xlZ2VuZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGlmIChoYXNTZXJpZXMpIHtcbiAgICAgIGxheW91dC5hbm5vdGF0aW9ucyA9IFtdO1xuICAgICAgbGFiZWxzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLnRpdGxlID0geyBwb3NpdGlvbjogXCJib3R0b20gY2VudGVyXCIsIHRleHQ6IGxhYmVsIH07XG4gICAgICB9KTtcbiAgICAgIHRyYWNlcyA9IHRyYWNlcy5maWx0ZXIodCA9PiAhKHQudmFsdWVzLmxlbmd0aCA9PT0gMSAmJiB0LnZhbHVlc1swXSA9PT0gMCkpO1xuICAgICAgdHJhY2VzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLmRvbWFpbiA9IHtcbiAgICAgICAgICBjb2x1bW46IGluZGV4ICUgMixcbiAgICAgICAgICByb3c6IE1hdGguZmxvb3IoaW5kZXggLyAyKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgbGF5b3V0LmdyaWQgPSB7XG4gICAgICAgIHJvd3M6IE1hdGgucm91bmQodHJhY2VzLmxlbmd0aCAvIDIpLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgfTtcbiAgICAgIGxheW91dC5oZWlnaHQgPSByYWRpdXMgKiBNYXRoLnJvdW5kKHRyYWNlcy5sZW5ndGggLyAyKSArIDI1O1xuICAgIH1cbiAgICByZXR1cm4geyB0cmFjZXMsIGxheW91dCwgaGFzU2VyaWVzIH07XG4gIH1cblxuICBzdGF0aWMgc2V0dXBCYXIobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQgbGluZUhlaWdodCA9IDMwO1xuICAgIGxldCB0b3BNYXJnaW4gPSAzMDtcbiAgICBsZXQgYm90dG9tTWFyZ2luID0gMzA7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBjb25zdCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxIHx8IG1vZGVsLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJtYXRyaXhcIjtcbiAgICBjb25zdCB5RnVsbFRleHRzID0gaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzO1xuXG4gICAgY29uc3QgdHJhY2VDb25maWc6IGFueSA9IHtcbiAgICAgIHR5cGU6IG1vZGVsLmNoYXJ0VHlwZSxcbiAgICAgIHk6IHlGdWxsVGV4dHMsXG4gICAgICB0ZXh0OiB5RnVsbFRleHRzLFxuICAgICAgY3VzdG9tZGF0YTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgaG92ZXJpbmZvOiBcInRleHRcIixcbiAgICAgIG9yaWVudGF0aW9uOiBcImhcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgdGV4dHBvc2l0aW9uOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiAwLjUsXG4gICAgICBiYXJnYXA6IDAuNSxcbiAgICAgIG1hcmtlcjogPGFueT57fSxcbiAgICB9O1xuICAgIHRyYWNlQ29uZmlnLm1hcmtlci5jb2xvciA9IGNvbG9ycztcblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHZhciB0cmFjZSA9IE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgIHg6IGRhdGFzZXQsXG4gICAgICAgIHRleHQ6IHRleHRzW2luZGV4XSxcbiAgICAgICAgaG92ZXJ0ZXh0OiB5RnVsbFRleHRzLm1hcCgobGFiZWw6IHN0cmluZywgbGFiZWxJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAke3RleHRzW2luZGV4XVtsYWJlbEluZGV4XX0sICR7bGFiZWx9YDtcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAgIGlmIChtb2RlbC5zaG93UGVyY2VudGFnZXMpIHtcbiAgICAgICAgbGV0IHRleHR0ZW1wbGF0ZSA9IG1vZGVsLnNob3dPbmx5UGVyY2VudGFnZXMgPyBcIiV7dGV4dH0lXCIgOiBcIiV7dmFsdWV9ICgle3RleHR9JSlcIjtcbiAgICAgICAgdHJhY2UudGV4dHBvc2l0aW9uID0gXCJpbnNpZGVcIjtcbiAgICAgICAgdHJhY2UudGV4dHRlbXBsYXRlID0gdGV4dHRlbXBsYXRlO1xuICAgICAgICB0cmFjZS5iYXJnYXAgPSAwLjE7XG4gICAgICB9XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBoZWlnaHQgPSAobGFiZWxzLmxlbmd0aCArIDEpICogbGluZUhlaWdodCArIHRvcE1hcmdpbiArIGJvdHRvbU1hcmdpbjtcblxuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIHQ6IHRvcE1hcmdpbixcbiAgICAgICAgYjogYm90dG9tTWFyZ2luLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHlheGlzOiB7XG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgICB0aWNrbW9kZTogXCJhcnJheVwiLFxuICAgICAgICB0aWNrdmFsczogeUZ1bGxUZXh0cyxcbiAgICAgICAgdGlja3RleHQ6IHlGdWxsVGV4dHMubWFwKChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFBsb3RseVNldHVwLmdldFRydW5jYXRlZExhYmVsKFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICBtb2RlbC5sYWJlbFRydW5jYXRlTGVuZ3RoXG4gICAgICAgICAgKSArIFwiICBcIjtcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgeGF4aXM6IHtcbiAgICAgICAgcmFuZ2Vtb2RlOiBcIm5vbm5lZ2F0aXZlXCIsXG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIC8vIGR0aWNrOiAxXG4gICAgICB9LFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKGhhc1Nlcmllcykge1xuICAgICAgbGF5b3V0LnNob3dsZWdlbmQgPSB0cnVlO1xuICAgICAgaWYgKG1vZGVsLmNoYXJ0VHlwZSA9PSBcInN0YWNrZWRiYXJcIikge1xuICAgICAgICBsYXlvdXQuYmFybW9kZSA9IFwic3RhY2tcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dC5oZWlnaHQgPVxuICAgICAgICAgIChsYWJlbHMubGVuZ3RoICsgMSkgKiBsaW5lSGVpZ2h0ICogc2VyaWVzTGFiZWxzLmxlbmd0aCArXG4gICAgICAgICAgdG9wTWFyZ2luICtcbiAgICAgICAgICBib3R0b21NYXJnaW47XG4gICAgICB9XG5cbiAgICAgIGxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5tYXJrZXIuY29sb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyYWNlc1tpbmRleF0ubmFtZSA9IGxhYmVsO1xuXG4gICAgICAgIGlmIChtb2RlbC5jaGFydFR5cGUgPT09IFwic3RhY2tlZGJhclwiKSB7XG4gICAgICAgICAgdHJhY2VzW2luZGV4XS50eXBlID0gXCJiYXJcIjtcbiAgICAgICAgICB0cmFjZXNbaW5kZXhdLndpZHRoID0gMC41O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyYWNlc1tpbmRleF0ud2lkdGggPVxuICAgICAgICAgICAgKG1vZGVsLnNob3dQZXJjZW50YWdlcyA/IDAuNyA6IDAuNSkgLyB0cmFjZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlLCB0cmFjZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRTdHJpbmcgPSBtb2RlbC5zaG93UGVyY2VudGFnZXMgPyBcIiVcIiA6IFwiXCI7XG4gICAgICAgIHRyYWNlc1t0cmFjZUluZGV4XS5ob3ZlcnRleHQgPSBbXTtcbiAgICAgICAgeUZ1bGxUZXh0cy5mb3JFYWNoKCh5RnVsbFRleHQsIHlGdWxsVGV4dEluZGV4KSA9PiB7XG4gICAgICAgICAgdHJhY2VzW3RyYWNlSW5kZXhdLmhvdmVydGV4dC5wdXNoKGAke3RyYWNlLnlbeUZ1bGxUZXh0SW5kZXhdfSA6ICR7dHJhY2UubmFtZX0sICR7dHJhY2UudGV4dFt5RnVsbFRleHRJbmRleF19JHtwZXJjZW50U3RyaW5nfWApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYWNlcywgbGF5b3V0LCBoYXNTZXJpZXMgfTtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cFZCYXIobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQgdG9wTWFyZ2luID0gMzA7XG4gICAgbGV0IGJvdHRvbU1hcmdpbiA9IDMwO1xuICAgIGxldCB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxhYmVscyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHRleHRzLFxuICAgICAgc2VyaWVzTGFiZWxzLFxuICAgIH0gPSBtb2RlbC5nZXRBbnN3ZXJzRGF0YSgpO1xuXG4gICAgY29uc3QgdHJhY2VzOiBhbnkgPSBbXTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMSB8fCBtb2RlbC5xdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwibWF0cml4XCI7XG5cbiAgICBjb25zdCBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGZvbnQ6IHtcbiAgICAgICAgZmFtaWx5OiBcIlNlZ29lIFVJLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgIHNpemU6IDE0LFxuICAgICAgICB3ZWlnaHQ6IFwibm9ybWFsXCIsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQwNDBcIixcbiAgICAgIH0sXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgdDogdG9wTWFyZ2luLFxuICAgICAgICBiOiBib3R0b21NYXJnaW4sXG4gICAgICAgIHI6IDEwLFxuICAgICAgfSxcbiAgICAgIGNvbG9yd2F5OiBjb2xvcnMsXG4gICAgICBob3Zlcm1vZGU6IFwiY2xvc2VzdFwiLFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHJhY2VDb25maWc6IGFueSA9IHtcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICBob3ZlcmluZm86IFwieCt5XCIsXG4gICAgICBtb2RlOiBcIm1hcmtlcnNcIixcbiAgICAgIHRleHRwb3NpdGlvbjogXCJub25lXCIsXG4gICAgICB3aWR0aDogMC41LFxuICAgICAgYmFyZ2FwOiAwLjUsXG4gICAgICBtYXJrZXI6IDxhbnk+e30sXG4gICAgfTtcbiAgICB0cmFjZUNvbmZpZy5tYXJrZXIuY29sb3IgPSBjb2xvcnM7XG5cbiAgICBkYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBBcnJheTxudW1iZXI+LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICB2YXIgdHJhY2UgPSBPYmplY3QuYXNzaWduKHt9LCB0cmFjZUNvbmZpZywge1xuICAgICAgICB4OiBsYWJlbHMsXG4gICAgICAgIHk6IG1vZGVsLnNob3dQZXJjZW50YWdlcyA/IHRleHRzW2luZGV4XS5tYXAoeSA9PiB5IC8gMTAwKSA6IGRhdGFzZXQsXG4gICAgICAgIHRleHQ6IHRleHRzW2luZGV4XSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG1vZGVsLnNob3dQZXJjZW50YWdlcykge1xuICAgICAgICBsZXQgdGV4dHRlbXBsYXRlID0gbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcyA/IFwiJXt0ZXh0fSVcIiA6IFwiJXt2YWx1ZX0gKCV7dGV4dH0lKVwiO1xuICAgICAgICB0cmFjZS50ZXh0cG9zaXRpb24gPSBcImluc2lkZVwiO1xuICAgICAgICB0cmFjZS50ZXh0dGVtcGxhdGUgPSB0ZXh0dGVtcGxhdGU7XG4gICAgICAgIHRyYWNlLndpZHRoID0gMC45O1xuICAgICAgICB0cmFjZS5iYXJnYXAgPSAwLjE7XG4gICAgICB9XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwuc2hvd1BlcmNlbnRhZ2VzICYmIG1vZGVsLnNob3dPbmx5UGVyY2VudGFnZXMpIHtcbiAgICAgIGxheW91dC55YXhpcyA9IHtcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgdGlja2Zvcm1hdDogXCIuMCVcIixcbiAgICAgICAgcmFuZ2U6IFswLCAxXSxcbiAgICAgICAgdGlja2xlbjogbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcyA/IDI1IDogNSxcbiAgICAgICAgdGlja2NvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZigobW9kZWwgYXMgYW55KS5nZXRWYWx1ZVR5cGUoKSAhPSBcImRhdGVcIikge1xuICAgICAgbGF5b3V0LnhheGlzID0ge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYWNlcywgbGF5b3V0LCBoYXNTZXJpZXMgfTtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cFNjYXR0ZXIobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQgbGluZUhlaWdodCA9IDMwO1xuICAgIGxldCB0b3BNYXJnaW4gPSAzMDtcbiAgICBsZXQgYm90dG9tTWFyZ2luID0gMzA7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG4gICAgY29uc3QgaGFzU2VyaWVzID0gc2VyaWVzTGFiZWxzLmxlbmd0aCA+IDEgfHwgbW9kZWwucXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcIm1hdHJpeFwiO1xuICAgIGNvbnN0IHRyYWNlczogYW55ID0gW107XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICB5OiAoaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzKS5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIFBsb3RseVNldHVwLmdldFRydW5jYXRlZExhYmVsKFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIG1vZGVsLmxhYmVsVHJ1bmNhdGVMZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgY3VzdG9tZGF0YTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgdGV4dDogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgaG92ZXJpbmZvOiBcIngreVwiLFxuICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICB3aWR0aDogMC41LFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG5cbiAgICBpZiAoIWhhc1Nlcmllcykge1xuICAgICAgdHJhY2VDb25maWcubWFya2VyLnN5bWJvbCA9IFwiY2lyY2xlXCI7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc2l6ZSA9IDE2O1xuICAgIH1cblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4pID0+IHtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRyYWNlID0gT2JqZWN0LmFzc2lnbih7fSwgdHJhY2VDb25maWcsIHtcbiAgICAgICAgICB4OiBkYXRhc2V0LFxuICAgICAgICB9KTtcbiAgICAgICAgdHJhY2VzLnB1c2godHJhY2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgaGVpZ2h0ID0gKGxhYmVscy5sZW5ndGggKyAxKSAqIGxpbmVIZWlnaHQgKyB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW47XG5cbiAgICBjb25zdCBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGZvbnQ6IHtcbiAgICAgICAgZmFtaWx5OiBcIlNlZ29lIFVJLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgIHNpemU6IDE0LFxuICAgICAgICB3ZWlnaHQ6IFwibm9ybWFsXCIsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQwNDBcIixcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIG1hcmdpbjoge1xuICAgICAgICB0OiB0b3BNYXJnaW4sXG4gICAgICAgIGI6IGJvdHRvbU1hcmdpbixcbiAgICAgICAgcjogMTAsXG4gICAgICB9LFxuICAgICAgY29sb3J3YXk6IGNvbG9ycyxcbiAgICAgIGhvdmVybW9kZTogXCJjbG9zZXN0XCIsXG4gICAgICB5YXhpczoge1xuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIHRpY2tsZW46IDUsXG4gICAgICAgIHRpY2tjb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgfSxcbiAgICAgIHhheGlzOiB7XG4gICAgICAgIHJhbmdlbW9kZTogXCJub25uZWdhdGl2ZVwiLFxuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHBsb3RfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgc2hvd2xlZ2VuZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGlmIChoYXNTZXJpZXMpIHtcbiAgICAgIGxheW91dC5zaG93bGVnZW5kID0gdHJ1ZTtcbiAgICAgIGxheW91dC5oZWlnaHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5ob3ZlcmluZm8gPSBcIngrbmFtZVwiO1xuICAgICAgICB0cmFjZXNbaW5kZXhdLm1hcmtlci5jb2xvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5uYW1lID0gbGFiZWw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG59IiwiaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uU2VsZWN0QmFzZSwgSXRlbVZhbHVlLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRGF0YUhlbHBlciwgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB7XG4gIHNlbGVjdGlvbjogSXRlbVZhbHVlO1xuICBvbkRhdGFJdGVtU2VsZWN0ZWQ6IChzZWxlY3RlZFZhbHVlOiBhbnksIHNlbGVjdGVkVGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXRTZWxlY3Rpb24oaXRlbTogSXRlbVZhbHVlKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQW5zd2Vyc0RhdGEge1xuICBkYXRhc2V0czogQXJyYXk8QXJyYXk8YW55Pj47XG4gIGxhYmVsczogQXJyYXk8c3RyaW5nPjtcbiAgY29sb3JzOiBBcnJheTxzdHJpbmc+O1xuICB0ZXh0czogQXJyYXk8QXJyYXk8YW55Pj47XG4gIHNlcmllc0xhYmVsczogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSk6IElBbnN3ZXJzRGF0YSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBkYXRhc2V0czogPEFycmF5PGFueT4+W10sXG4gICAgbGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICBjb2xvcnM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgIHRleHRzOiA8QXJyYXk8YW55Pj5bXSxcbiAgICBzZXJpZXNMYWJlbHM6IDxBcnJheTxhbnk+PltdLFxuICB9O1xuICBpZihhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmRhdGFzZXRzLnB1c2goW10pO1xuICAgIHJlc3VsdC50ZXh0cy5wdXNoKFtdKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF1baV0gIT0gMCkge1xuICAgICAgICByZXN1bHQuZGF0YXNldHNbMF0ucHVzaChhbnN3ZXJzRGF0YS5kYXRhc2V0c1swXVtpXSk7XG4gICAgICAgIHJlc3VsdC5sYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5sYWJlbHNbaV0pO1xuICAgICAgICByZXN1bHQuY29sb3JzLnB1c2goYW5zd2Vyc0RhdGEuY29sb3JzW2ldKTtcbiAgICAgICAgcmVzdWx0LnRleHRzWzBdLnB1c2goYW5zd2Vyc0RhdGEudGV4dHNbMF1baV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IHNlcmllc0RhdGFFeGlzdGVuY2UgPSA8QXJyYXk8Ym9vbGVhbj4+W107XG4gIHNlcmllc0RhdGFFeGlzdGVuY2UubGVuZ3RoID0gYW5zd2Vyc0RhdGEuc2VyaWVzTGFiZWxzLmxlbmd0aDtcbiAgY29uc3QgdmFsdWVzRGF0YUV4aXN0ZW5jZSA9IDxBcnJheTxib29sZWFuPj5bXTtcbiAgdmFsdWVzRGF0YUV4aXN0ZW5jZS5sZW5ndGggPSBhbnN3ZXJzRGF0YS5sYWJlbHMubGVuZ3RoO1xuICBmb3IgKHZhciB2YWx1ZUluZGV4ID0gMDsgdmFsdWVJbmRleCA8IGFuc3dlcnNEYXRhLmxhYmVscy5sZW5ndGg7IHZhbHVlSW5kZXgrKykge1xuICAgIGZvciAodmFyIHNlcmllc0luZGV4ID0gMDsgc2VyaWVzSW5kZXggPCBhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMubGVuZ3RoOyBzZXJpZXNJbmRleCsrKSB7XG4gICAgICBpZiAoYW5zd2Vyc0RhdGEuZGF0YXNldHNbdmFsdWVJbmRleF1bc2VyaWVzSW5kZXhdICE9IDApIHtcbiAgICAgICAgc2VyaWVzRGF0YUV4aXN0ZW5jZVtzZXJpZXNJbmRleF0gPSB0cnVlO1xuICAgICAgICB2YWx1ZXNEYXRhRXhpc3RlbmNlW3ZhbHVlSW5kZXhdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgdmFsdWVJbmRleCA9IDA7IHZhbHVlSW5kZXggPCB2YWx1ZXNEYXRhRXhpc3RlbmNlLmxlbmd0aDsgdmFsdWVJbmRleCsrKSB7XG4gICAgaWYgKHZhbHVlc0RhdGFFeGlzdGVuY2VbdmFsdWVJbmRleF0pIHtcbiAgICAgIHJlc3VsdC5sYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5sYWJlbHNbdmFsdWVJbmRleF0pO1xuICAgICAgcmVzdWx0LmNvbG9ycy5wdXNoKGFuc3dlcnNEYXRhLmNvbG9yc1t2YWx1ZUluZGV4XSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIHNlcmllc0luZGV4ID0gMDsgc2VyaWVzSW5kZXggPCBhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMubGVuZ3RoOyBzZXJpZXNJbmRleCsrKSB7XG4gICAgaWYgKHNlcmllc0RhdGFFeGlzdGVuY2Vbc2VyaWVzSW5kZXhdKSB7XG4gICAgICByZXN1bHQuc2VyaWVzTGFiZWxzLnB1c2goYW5zd2Vyc0RhdGEuc2VyaWVzTGFiZWxzW3Nlcmllc0luZGV4XSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIHZhbHVlSW5kZXggPSAwOyB2YWx1ZUluZGV4IDwgYW5zd2Vyc0RhdGEubGFiZWxzLmxlbmd0aDsgdmFsdWVJbmRleCsrKSB7XG4gICAgaWYgKHZhbHVlc0RhdGFFeGlzdGVuY2VbdmFsdWVJbmRleF0pIHtcbiAgICAgIGNvbnN0IGRhdGFzZXQgPSBbXTtcbiAgICAgIGNvbnN0IHRleHRzID0gW107XG4gICAgICBmb3IgKHZhciBzZXJpZXNJbmRleCA9IDA7IHNlcmllc0luZGV4IDwgYW5zd2Vyc0RhdGEuZGF0YXNldHMubGVuZ3RoOyBzZXJpZXNJbmRleCsrKSB7XG4gICAgICAgIGlmIChzZXJpZXNEYXRhRXhpc3RlbmNlW3Nlcmllc0luZGV4XSkge1xuICAgICAgICAgIGRhdGFzZXQucHVzaChhbnN3ZXJzRGF0YS5kYXRhc2V0c1t2YWx1ZUluZGV4XVtzZXJpZXNJbmRleF0pO1xuICAgICAgICAgIHRleHRzLnB1c2goYW5zd2Vyc0RhdGEudGV4dHNbdmFsdWVJbmRleF1bc2VyaWVzSW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LmRhdGFzZXRzLnB1c2goZGF0YXNldCk7XG4gICAgICByZXN1bHQudGV4dHMucHVzaCh0ZXh0cyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RCYXNlXG4gIGV4dGVuZHMgVmlzdWFsaXplckJhc2VcbiAgaW1wbGVtZW50cyBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24ge1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWUgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2hvaWNlc09yZGVyU2VsZWN0b3I6IEhUTUxEaXZFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHNob3dQZXJjZW50YWdlQnRuOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBlbXB0eUFuc3dlcnNCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHRyYW5zcG9zZURhdGFCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHRvcE5TZWxlY3RvcjogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Nob3dQZXJjZW50YWdlczogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zaG93T25seVBlcmNlbnRhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3BlcmNlbnRhZ2VQcmVjaXNpb246IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBfYW5zd2Vyc09yZGVyOiBzdHJpbmcgPSBcImRlZmF1bHRcIjtcbiAgcHJvdGVjdGVkIF9zdXBwb3J0U2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfaGlkZUVtcHR5QW5zd2VycyA9IGZhbHNlO1xuICBwcml2YXRlIF90b3BOID0gLTE7XG4gIHB1YmxpYyBzdGF0aWMgdG9wTlZhbHVlc0RlZmF1bHRzID0gWy0xLCA1LCAxMCwgMjBdO1xuICBwdWJsaWMgdG9wTlZhbHVlcyA9IFtdLmNvbmNhdChTZWxlY3RCYXNlLnRvcE5WYWx1ZXNEZWZhdWx0cyk7XG4gIHByaXZhdGUgX3RyYW5zcG9zZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvd01pc3NpbmdBbnN3ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbWlzc2luZ0Fuc3dlcnNCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBhbnksXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInNlbGVjdEJhc2VcIik7XG4gICAgKDxhbnk+cXVlc3Rpb24pLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhUHJvdmlkZXIucmVzZXQoKTtcbiAgICB9O1xuICAgIHRoaXMuX3Nob3dQZXJjZW50YWdlcyA9IHRoaXMub3B0aW9ucy5zaG93UGVyY2VudGFnZXMgPT09IHRydWU7XG4gICAgdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcyA9IHRoaXMub3B0aW9ucy5zaG93T25seVBlcmNlbnRhZ2VzID09PSB0cnVlO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZXJjZW50YWdlUHJlY2lzaW9uKSB7XG4gICAgICB0aGlzLl9wZXJjZW50YWdlUHJlY2lzaW9uID0gdGhpcy5vcHRpb25zLnBlcmNlbnRhZ2VQcmVjaXNpb247XG4gICAgfVxuXG4gICAgdGhpcy5faGlkZUVtcHR5QW5zd2VycyA9IHRoaXMub3B0aW9ucy5oaWRlRW1wdHlBbnN3ZXJzID09PSB0cnVlO1xuICAgIHRoaXMuX2Fuc3dlcnNPcmRlciA9IHRoaXMub3B0aW9ucy5hbnN3ZXJzT3JkZXIgfHwgXCJkZWZhdWx0XCI7XG4gICAgdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzID0gdGhpcy5pc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpICYmIHRoaXMub3B0aW9ucy5zaG93TWlzc2luZ0Fuc3dlcnMgPT09IHRydWU7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlQ2hhcnRUeXBlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy5jaGFydFR5cGVzLm1hcCgoY2hhcnRUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogY2hhcnRUeXBlLFxuICAgICAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhcnRUeXBlX1wiICsgY2hhcnRUeXBlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLmNoYXJ0VHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcnRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VBbnN3ZXJzT3JkZXJcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0QW5zd2Vyc09yZGVyKCkpIHtcbiAgICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3RvciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImRlZmF1bHRPcmRlclwiKSwgdmFsdWU6IFwiZGVmYXVsdFwiIH0sXG4gICAgICAgICAgICB7IHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhc2NPcmRlclwiKSwgdmFsdWU6IFwiYXNjXCIgfSxcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImRlc2NPcmRlclwiKSwgdmFsdWU6IFwiZGVzY1wiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAob3B0aW9uKSA9PiBmYWxzZSxcbiAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbnN3ZXJzT3JkZXIgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3I7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwic2hvd1BlcmNlbnRhZ2VzXCIsICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vcHRpb25zLmFsbG93U2hvd1BlcmNlbnRhZ2VzICYmXG4gICAgICAgICh0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcImJhclwiKSAhPT0gLTEgfHxcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcInN0YWNrZWRiYXJcIikgIT09IC0xKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VzID0gIXRoaXMuc2hvd1BlcmNlbnRhZ2VzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93UGVyY2VudGFnZUJ0bjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJoaWRlRW1wdHlBbnN3ZXJzXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dIaWRlRW1wdHlBbnN3ZXJzKSB7XG4gICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmhpZGVFbXB0eUFuc3dlcnMgPSAhdGhpcy5faGlkZUVtcHR5QW5zd2VycztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbXB0eUFuc3dlcnNCdG47XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwidG9wTkFuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dUb3BOQW5zd2VycyAmJlxuICAgICAgICB0aGlzLmdldFNlcmllc1ZhbHVlcygpLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudG9wTlNlbGVjdG9yID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy50b3BOVmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ0b3BOVmFsdWVUZXh0XCIgKyB2YWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbikgPT4gZmFsc2UsXG4gICAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9wTiA9IHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlVG9wTlNlbGVjdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50b3BOU2VsZWN0b3I7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwidHJhbnNwb3NlRGF0YVwiLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93VHJhbnNwb3NlRGF0YSkge1xuICAgICAgICB0aGlzLnRyYW5zcG9zZURhdGFCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YSA9ICF0aGlzLnRyYW5zcG9zZURhdGE7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9zZURhdGFCdG47XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwic2hvd01pc3NpbmdBbnN3ZXJzXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCkgJiYgdGhpcy5vcHRpb25zLmFsbG93U2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICAgIHRoaXMubWlzc2luZ0Fuc3dlcnNCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzID0gIXRoaXMuX3Nob3dNaXNzaW5nQW5zd2VycztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlTWlzc2luZ0Fuc3dlcnNCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IHN0cmluZ1tdID0gW107XG4gIHByb3RlY3RlZCBfY2hhcnRUeXBlOiBzdHJpbmcgPSBcImJhclwiO1xuICAvKipcbiAgICogQ2hhcnQgdHlwZSAtIGN1cnJlbnQgY2hhcnQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hhcnRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0VHlwZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNoYXJ0VHlwZShuZXdDaGFydFR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0Q2hhcnRUeXBlKG5ld0NoYXJ0VHlwZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpIHtcbiAgICBpZiAoISF0aGlzLmVtcHR5QW5zd2Vyc0J0bikge1xuICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4uaW5uZXJUZXh0ID0gdGhpcy5faGlkZUVtcHR5QW5zd2Vyc1xuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93RW1wdHlBbnN3ZXJzXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVFbXB0eUFuc3dlcnNcIik7XG4gICAgICBpZiAodGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInNjYXR0ZXJcIikge1xuICAgICAgICB0aGlzLmVtcHR5QW5zd2Vyc0J0bi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKSB7XG4gICAgaWYgKCEhdGhpcy50cmFuc3Bvc2VEYXRhQnRuKSB7XG4gICAgICB0aGlzLnRyYW5zcG9zZURhdGFCdG4uaW5uZXJUZXh0ID0gdGhpcy50cmFuc3Bvc2VEYXRhXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dQZXJDb2x1bW5zXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dQZXJWYWx1ZXNcIik7XG4gICAgICBpZiAodGhpcy5nZXRTZXJpZXNWYWx1ZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVPcmRlclNlbGVjdG9yKCkge1xuICAgIGlmICghIXRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3IpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fFxuICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fFxuICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9PSBcInNjYXR0ZXJcIiB8fFxuICAgICAgICAoKHRoaXMuY2hhcnRUeXBlID09IFwicGllXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJkb3VnaG51dFwiKSAmJlxuICAgICAgICAgIHRoaXMudG9wTiA+IDApXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3Rvci5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtZmxleFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3Rvci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICBcInNlbGVjdFwiXG4gICAgICApWzBdLnZhbHVlID0gdGhpcy5hbnN3ZXJzT3JkZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpIHtcbiAgICBpZiAoISF0aGlzLnNob3dQZXJjZW50YWdlQnRuKSB7XG4gICAgICB0aGlzLnNob3dQZXJjZW50YWdlQnRuLmlubmVyVGV4dCA9IHRoaXMuX3Nob3dQZXJjZW50YWdlc1xuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlUGVyY2VudGFnZXNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd1BlcmNlbnRhZ2VzXCIpO1xuICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlID09IFwiYmFyXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJ2YmFyXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJzdGFja2VkYmFyXCIpIHtcbiAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9wTlNlbGVjdG9yKCkge1xuICAgIGlmICghIXRoaXMudG9wTlNlbGVjdG9yKSB7XG4gICAgICB0aGlzLnRvcE5TZWxlY3Rvci5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNlbGVjdFwiKVswXS52YWx1ZSA9IDxhbnk+KFxuICAgICAgICB0aGlzLl90b3BOXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWlzc2luZ0Fuc3dlcnNCdG4oKSB7XG4gICAgaWYgKCEhdGhpcy5taXNzaW5nQW5zd2Vyc0J0bikge1xuICAgICAgdGhpcy5taXNzaW5nQW5zd2Vyc0J0bi5pbm5lclRleHQgPSB0aGlzLl9zaG93TWlzc2luZ0Fuc3dlcnNcbiAgICAgICAgPyBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaGlkZU1pc3NpbmdBbnN3ZXJzXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dNaXNzaW5nQW5zd2Vyc1wiKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFydFR5cGVDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgIHRoaXMudXBkYXRlU2hvd1BlcmNlbnRhZ2VCdG4oKTtcbiAgICB0aGlzLnVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpO1xuICAgIHRoaXMudXBkYXRlVG9wTlNlbGVjdG9yKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJjaGFydFR5cGVcIiwgdGhpcy5fY2hhcnRUeXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRDaGFydFR5cGUoY2hhcnRUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihjaGFydFR5cGUpICE9PSAtMSAmJlxuICAgICAgdGhpcy5fY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuX2NoYXJ0VHlwZSA9IGNoYXJ0VHlwZTtcbiAgICAgIHRoaXMub25DaGFydFR5cGVDaGFuZ2VkKCk7XG4gICAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29ycmVjdEFuc3dlclZhbHVlID0gc3VwZXIuZ2V0Q29ycmVjdEFuc3dlclRleHQoKTtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNvcnJlY3RBbnN3ZXJWYWx1ZSkgPyBjb3JyZWN0QW5zd2VyVmFsdWUgOiBbY29ycmVjdEFuc3dlclZhbHVlXTtcbiAgICBjb25zdCBzZWxlY3RCYXNlUXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uIGFzIFF1ZXN0aW9uU2VsZWN0QmFzZTtcbiAgICByZXR1cm4gcmVzdWx0VmFsdWVzLm1hcCgodmFsdWU6IGFueSkgPT4gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHNlbGVjdEJhc2VRdWVzdGlvbi5jaG9pY2VzLCB2YWx1ZSkpLmpvaW4oXCIsIFwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbEJhc2UgPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzT3RoZXIgJiYgaXRlbVRleHQgPT0gc2VsQmFzZS5vdGhlclRleHQpIHtcbiAgICAgIHJldHVybiBzZWxCYXNlLm90aGVySXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbEJhc2UuY2hvaWNlcy5maWx0ZXIoXG4gICAgICAgIChjaG9pY2U6IEl0ZW1WYWx1ZSkgPT4gY2hvaWNlLnRleHQgPT09IGl0ZW1UZXh0XG4gICAgICApWzBdO1xuICAgIH1cbiAgfVxuXG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0gIT09IGl0ZW0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLm9uRGF0YUl0ZW1TZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMub25EYXRhSXRlbVNlbGVjdGVkKFxuICAgICAgICAgIGl0ZW0gIT09IHVuZGVmaW5lZCA/IGl0ZW0udmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXRlbSAhPT0gdW5kZWZpbmVkID8gaXRlbS50ZXh0IDogXCJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgY2hhcnQgc2hvdWxkIHNob3cgcGVyY2VudGFnZXMgb25seS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd09ubHlQZXJjZW50YWdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd09ubHlQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93T25seVBlcmNlbnRhZ2VzID0gdmFsO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcInNob3dPbmx5UGVyY2VudGFnZXNcIiwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgY2hhcnQgc2hvdWxkIHNob3cgdmFsdWVzIGFuZCBwZXJjZW50YWdlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BlcmNlbnRhZ2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGVyY2VudGFnZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93UGVyY2VudGFnZXMgPSB2YWw7XG4gICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcInNob3dQZXJjZW50YWdlc1wiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW5kIHNldHMgY2hhcnQgZWxlbWVudHMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFuc3dlcnNPcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5zd2Vyc09yZGVyO1xuICB9XG5cbiAgcHVibGljIHNldCBhbnN3ZXJzT3JkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Fuc3dlcnNPcmRlciA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImFuc3dlcnNPcmRlclwiLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgbmVlZCB0byBoaWRlIGVtcHR5IGNoYXJ0IGVsZW1lbnRzIChlLmcuIGJhcnMgdml0aCB6ZXJvIHZhbHVlKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZUVtcHR5QW5zd2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZUVtcHR5QW5zd2VycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaGlkZUVtcHR5QW5zd2Vycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hpZGVFbXB0eUFuc3dlcnMgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImhpZGVFbXB0eUFuc3dlcnNcIiwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldCB0cmFuc3Bvc2VEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3Bvc2VEYXRhO1xuICB9XG5cbiAgcHVibGljIHNldCB0cmFuc3Bvc2VEYXRhKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdHJhbnNwb3NlRGF0YSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVHJhbnNwb3NlRGF0YUJ0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcInRyYW5zcG9zZURhdGFcIiwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0byBzb21lIHZhbHVlIGlmIG5lZWQgdG8gc2hvdyB0b3AgTiBjaGFydCBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdG9wTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3BOO1xuICB9XG5cbiAgcHVibGljIHNldCB0b3BOKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90b3BOID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgICB0aGlzLnVwZGF0ZU9yZGVyU2VsZWN0b3IoKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJ0b3BOXCIsIHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1N1cHBvcnRBbnN3ZXJzT3JkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLm9wdGlvbnMuYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyKSAmJlxuICAgICAgICAgICAgdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKS5sZW5ndGggPT09IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc2VlIGNoYXJ0IGVsZW1lbnRzIGZvciBtaXNzaW5nIGFuc3dlcnMgKGUuZy4gcmFkaW9ncm91cCBpdGVtcyBuZXZlciBiZWVuIHNlbGVjdGVkIGJ5IHN1cnZleWVlKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd01pc3NpbmdBbnN3ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93TWlzc2luZ0Fuc3dlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dNaXNzaW5nQW5zd2Vycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dNaXNzaW5nQW5zd2VycyA9IHRoaXMuaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKSAmJiB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZU1pc3NpbmdBbnN3ZXJzQnRuKCk7XG4gICAgdGhpcy5kYXRhUHJvdmlkZXIucmVzZXQodGhpcyk7XG4gICAgdGhpcy5yZWZyZXNoQ29udGVudCgpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VkKFwic2hvd01pc3NpbmdBbnNld3JzXCIsIHZhbHVlKTtcbiAgfVxuXG4gIHJlZnJlc2hDb250ZW50KCkge1xuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgfVxuXG4gIG9uRGF0YUl0ZW1TZWxlY3RlZDogKHNlbGVjdGVkVmFsdWU6IGFueSwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgZ2V0IHNob3dWYWx1ZXNJbk9yaWdpbmFsT3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyICE9PSBmYWxzZTtcbiAgfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICBsZXQgcXVlc3Rpb24gPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYoISFxdWVzdGlvbi5jaG9pY2VzRnJvbVF1ZXN0aW9uICYmICEhcXVlc3Rpb24uc3VydmV5KSB7XG4gICAgICBxdWVzdGlvbiA9IDxRdWVzdGlvblNlbGVjdEJhc2U+cXVlc3Rpb24uc3VydmV5LmdldFF1ZXN0aW9uQnlOYW1lKHF1ZXN0aW9uLmNob2ljZXNGcm9tUXVlc3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25bXCJhY3RpdmVDaG9pY2VzXCJdO1xuICB9XG5cbiAgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8YW55PiA9IHRoaXMudmFsdWVzU291cmNlKCkubWFwKFxuICAgICAgKGNob2ljZSkgPT4gY2hvaWNlLnZhbHVlXG4gICAgKTtcblxuICAgIGlmICgoPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uKS5oYXNOb25lKSB7XG4gICAgICB2YWx1ZXMucHVzaCgoPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uKS5ub25lSXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc090aGVyKSB7XG4gICAgICB2YWx1ZXMucHVzaChcIm90aGVyXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIHZhbHVlcy51bnNoaWZ0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dWYWx1ZXNJbk9yaWdpbmFsT3JkZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZXMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZ2V0TGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudXNlVmFsdWVzQXNMYWJlbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlcygpO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbHM6IEFycmF5PHN0cmluZz4gPSB0aGlzLnZhbHVlc1NvdXJjZSgpLm1hcCgoY2hvaWNlKSA9PlxuICAgICAgSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMudmFsdWVzU291cmNlKCksIGNob2ljZS52YWx1ZSlcbiAgICApO1xuICAgIGNvbnN0IHNlbEJhc2UgPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKHNlbEJhc2UuaGFzTm9uZSkge1xuICAgICAgbGFiZWxzLnB1c2goc2VsQmFzZS5ub25lVGV4dCk7XG4gICAgfVxuICAgIGlmIChzZWxCYXNlLmhhc090aGVyKSB7XG4gICAgICBsYWJlbHMucHVzaChzZWxCYXNlLm90aGVyVGV4dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNaXNzaW5nQW5zd2Vycykge1xuICAgICAgbGFiZWxzLnVuc2hpZnQobG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1pc3NpbmdBbnN3ZXJzTGFiZWxcIikpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKSB7XG4gICAgICByZXR1cm4gbGFiZWxzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxuXG4gIGdldFBlcmNlbnRhZ2VzKCk6IEFycmF5PEFycmF5PG51bWJlcj4+IHtcbiAgICB2YXIgZGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSB0aGlzLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICB2YXIgcGVyY2VudGFnZXM6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgdmFyIHBlcmNlbnRhZ2VQcmVjaXNpb24gPSB0aGlzLl9wZXJjZW50YWdlUHJlY2lzaW9uO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoIDwgMikge1xuICAgICAgZGF0YS5mb3JFYWNoKChyZXMsIGluZGV4KSA9PiB7XG4gICAgICAgIHZhciBzdW0gPSByZXMucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKTtcbiAgICAgICAgcGVyY2VudGFnZXNbaW5kZXhdID0gcmVzLm1hcCgodmFsKSA9PiB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gcGVyY2VudGFnZVByZWNpc2lvbiA/ICsodmFsIC8gc3VtKS50b0ZpeGVkKHBlcmNlbnRhZ2VQcmVjaXNpb24pIDogTWF0aC5yb3VuZCgodmFsIC8gc3VtKSAqIDEwMDAwKTtcbiAgICAgICAgICByZXR1cm4gc3VtICYmICh2YWx1ZSAvIDEwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVswXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgc3VtICs9IGRhdGFbal1baV07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBlcmNlbnRhZ2VzW2pdKSkgcGVyY2VudGFnZXNbal0gPSBbXTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBwZXJjZW50YWdlUHJlY2lzaW9uID8gKygoZGF0YVtqXVtpXSAvIHN1bSkgKiAxMDApLnRvRml4ZWQocGVyY2VudGFnZVByZWNpc2lvbikgOiBNYXRoLnJvdW5kKChkYXRhW2pdW2ldIC8gc3VtKSAqIDEwMCk7XG4gICAgICAgICAgcGVyY2VudGFnZXNbal1baV0gPSBzdW0gJiYgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcmNlbnRhZ2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFuc3dlcnNEYXRhUmVhZHkoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSkge1xuICAgIGxldCByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLmhpZGVFbXB0eUFuc3dlcnMpIHtcbiAgICAgIHJlc3VsdCA9IGhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhbnN3ZXJzRGF0YTtcbiAgICB9XG4gICAgaWYgKHRoaXMudG9wTiA+IDApIHtcbiAgICAgIHJlc3VsdC5kYXRhc2V0c1swXSA9IHJlc3VsdC5kYXRhc2V0c1swXS5zbGljZSgtdGhpcy50b3BOKTtcbiAgICAgIHJlc3VsdC5sYWJlbHMgPSByZXN1bHQubGFiZWxzLnNsaWNlKC10aGlzLnRvcE4pO1xuICAgICAgcmVzdWx0LmNvbG9ycyA9IHJlc3VsdC5jb2xvcnMuc2xpY2UoLXRoaXMudG9wTik7XG4gICAgICByZXN1bHQudGV4dHNbMF0gPSByZXN1bHQudGV4dHNbMF0uc2xpY2UoLXRoaXMudG9wTik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbnN3ZXIgZGF0YSBoYXMgYmVlbiBjb21iaW5lZCBiZWZvcmUgdGhleSBwYXNzZWQgdG8gZHJhdyBncmFwaC5cbiAgICogb3B0aW9ucyAtIHRoZSBhbnN3ZXJzIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmc6IGRhdGFzZXRzLCBsYWJlbHMsIGNvbG9ycywgYWRkaXRpb25hbCB0ZXh0cyAocGVyY2VudGFnZSkuXG4gICAqIG9wdGlvbnMgZmllbGRzIGNhbiBiZSBtb2RpZmllZFxuICAgKi9cbiAgcHVibGljIG9uQW5zd2Vyc0RhdGFSZWFkeSA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTZWxlY3RCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBTZWxlY3RCYXNlLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb2JqZWN0IHdpdGggYWxsIGluZm90bWF0aW9uIGZvciBkYXRhIHZpc3VhbGl6YXRpb246IGRhdGFzZXRzLCBsYWJlbHMsIGNvbG9ycywgYWRkaXRpb25hbCB0ZXh0cyAocGVyY2VudGFnZSkuXG4gICAqL1xuICBwdWJsaWMgZ2V0QW5zd2Vyc0RhdGEoKTogSUFuc3dlcnNEYXRhIHtcbiAgICBsZXQgc2VyaWVzTGFiZWxzID0gdGhpcy5nZXRTZXJpZXNMYWJlbHMoKTtcbiAgICBsZXQgZGF0YXNldHMgPSB0aGlzLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBsZXQgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBsZXQgY29sb3JzID0gdGhpcy5nZXRDb2xvcnMoKTtcbiAgICB2YXIgdGV4dHMgPSB0aGlzLnNob3dQZXJjZW50YWdlcyA/IHRoaXMuZ2V0UGVyY2VudGFnZXMoKSA6IGRhdGFzZXRzO1xuXG4gICAgaWYgKHRoaXMudHJhbnNwb3NlRGF0YSkge1xuICAgICAgZGF0YXNldHMgPSB0aGlzLnRyYW5zcG9zZShkYXRhc2V0cyk7XG4gICAgICB0ZXh0cyA9IHRoaXMudHJhbnNwb3NlKHRleHRzKTtcbiAgICAgIGNvbnN0IHRlbXAgPSBzZXJpZXNMYWJlbHM7XG4gICAgICBzZXJpZXNMYWJlbHMgPSBsYWJlbHM7XG4gICAgICBsYWJlbHMgPSB0ZW1wO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFuc3dlcnNPcmRlciA9PSBcImFzY1wiIHx8IHRoaXMuYW5zd2Vyc09yZGVyID09IFwiZGVzY1wiKSB7XG4gICAgICB2YXIgemlwcGVkQXJyYXkgPSB0aGlzLnNob3dQZXJjZW50YWdlc1xuICAgICAgICA/IERhdGFIZWxwZXIuemlwQXJyYXlzKGxhYmVscywgY29sb3JzLCB0ZXh0c1swXSlcbiAgICAgICAgOiBEYXRhSGVscGVyLnppcEFycmF5cyhsYWJlbHMsIGNvbG9ycyk7XG4gICAgICBsZXQgZGljdCA9IERhdGFIZWxwZXIuc29ydERpY3Rpb25hcnkoXG4gICAgICAgIHppcHBlZEFycmF5LFxuICAgICAgICBkYXRhc2V0c1swXSxcbiAgICAgICAgdGhpcy5hbnN3ZXJzT3JkZXIgPT0gXCJkZXNjXCJcbiAgICAgICk7XG4gICAgICBsZXQgdW56aXBwZWRBcnJheSA9IERhdGFIZWxwZXIudW56aXBBcnJheXMoZGljdC5rZXlzKTtcbiAgICAgIGxhYmVscyA9IHVuemlwcGVkQXJyYXlbMF07XG4gICAgICBjb2xvcnMgPSB1bnppcHBlZEFycmF5WzFdO1xuICAgICAgaWYgKHRoaXMuc2hvd1BlcmNlbnRhZ2VzKSB0ZXh0c1swXSA9IHVuemlwcGVkQXJyYXlbMl07XG4gICAgICBkYXRhc2V0c1swXSA9IGRpY3QudmFsdWVzO1xuICAgIH1cblxuICAgIGxldCBhbnN3ZXJzRGF0YSA9IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfTtcbiAgICBhbnN3ZXJzRGF0YSA9IHRoaXMuYW5zd2Vyc0RhdGFSZWFkeShhbnN3ZXJzRGF0YSk7XG4gICAgdGhpcy5vbkFuc3dlcnNEYXRhUmVhZHkuZmlyZSh0aGlzLCBhbnN3ZXJzRGF0YSk7XG5cbiAgICByZXR1cm4gYW5zd2Vyc0RhdGE7XG4gIH1cbiAgcHJvdGVjdGVkIHRyYW5zcG9zZShkYXRhOiBBcnJheTxBcnJheTxudW1iZXI+Pik6IEFycmF5PEFycmF5PG51bWJlcj4+IHtcbiAgICBjb25zdCBkaW0yID0gZGF0YVswXS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KGRpbTIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltMjsgKytpKVxuICAgICAgcmVzdWx0W2ldID0gbmV3IEFycmF5PG51bWJlcj4oZGF0YS5sZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaW0yOyArK2opIHtcbiAgICAgICAgcmVzdWx0W2pdW2ldID0gZGF0YVtpXVtqXTtcbiAgICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3N0YXRlUHJvcGVydGllcyA9IFtcImNoYXJ0VHlwZVwiLCBcImFuc3dlcnNPcmRlclwiLCBcImhpZGVFbXB0eUFuc3dlcnNcIiwgXCJ0b3BOXCJdO1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogYW55IHtcbiAgICBsZXQgc3RhdGU6IGFueSA9IHt9O1xuICAgIFNlbGVjdEJhc2UuX3N0YXRlUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG4gICAgICBzdGF0ZVtwcm9wZXJ0eU5hbWVdID0gKDxhbnk+dGhpcylbcHJvcGVydHlOYW1lXTtcbiAgICB9KTtcbiAgICBpZighIXRoaXMuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICBzdGF0ZS5maWx0ZXIgPSB0aGlzLnNlbGVjdGVkSXRlbS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogYW55KTogdm9pZCB7XG4gICAgU2VsZWN0QmFzZS5fc3RhdGVQcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHlOYW1lID0+IHtcbiAgICAgIGlmIChzdGF0ZVtwcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHlOYW1lXSA9IHN0YXRlW3Byb3BlcnR5TmFtZV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKCh0aGlzLnF1ZXN0aW9uIGFzIFF1ZXN0aW9uU2VsZWN0QmFzZSkudmlzaWJsZUNob2ljZXMsIHN0YXRlLmZpbHRlcik7XG4gICAgdGhpcy5zZXRTZWxlY3Rpb24oc2VsZWN0ZWRJdGVtID8/IHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XHJcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcclxuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XHJcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi90ZXh0LnNjc3NcIik7XHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dFRhYmxlQWRhcHRlciB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogVGV4dCkge31cclxuXHJcbiAgcHVibGljIGNyZWF0ZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBjb25zdCB7IGNvbHVtbnNDb3VudCwgZGF0YSB9ID0gdGhpcy5tb2RlbC5nZXRDYWxjdWxhdGVkVmFsdWVzKCk7XHJcbiAgICBjb25zdCBlbXB0eVRleHROb2RlID0gPEhUTUxFbGVtZW50PkRvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIFwiXCIsIHtcclxuICAgICAgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9SZXN1bHRzXCIpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbXB0eVRleHROb2RlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhYmxlTm9kZSA9IDxIVE1MVGFibGVFbGVtZW50PihcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIFwic2EtdGV4dC10YWJsZVwiKVxyXG4gICAgKTtcclxuXHJcbiAgICB0YWJsZU5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3I7XHJcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGVOb2RlKTtcclxuXHJcbiAgICBkYXRhLmZvckVhY2goKHJvd0RhdGEpID0+IHtcclxuICAgICAgdmFyIHJvdyA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zQ291bnQ7IGkrKykge1xyXG4gICAgICAgIHZhciB0ZCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLXRleHQtdGFibGVfX2NlbGxcIiwge1xyXG4gICAgICAgICAgdGV4dENvbnRlbnQ6IHJvd0RhdGFbaV0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKHRkKTtcclxuICAgICAgfVxyXG4gICAgICB0YWJsZU5vZGUuYXBwZW5kQ2hpbGQocm93KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBcInNhLXRleHQtdGFibGVfX2NvbnRhaW5lclwiO1xyXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlTm9kZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xyXG4gICAgbm9kZS5pbm5lckhUTUwgPSBcIlwiO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRleHQgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XHJcbiAgcHJpdmF0ZSBfdGV4dFRhYmxlQWRhcHRlcjogVGV4dFRhYmxlQWRhcHRlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXHJcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxyXG4gICAgb3B0aW9ucz86IE9iamVjdCxcclxuICAgIG5hbWU/OiBzdHJpbmdcclxuICApIHtcclxuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwidGV4dFwiKTtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIgPSBuZXcgVGV4dFRhYmxlQWRhcHRlcih0aGlzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDYWxjdWxhdGVkVmFsdWVzKCk6IGFueSB7XHJcbiAgICBsZXQgcmVzdWx0OiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xyXG4gICAgbGV0IGNvbHVtbnNDb3VudCA9IDA7XHJcblxyXG4gICAgdGhpcy5kYXRhLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICBjb25zdCByb3dWYWx1ZTogYW55ID0gcm93W3RoaXMucXVlc3Rpb24ubmFtZV07XHJcbiAgICAgIGxldCBkYXRhU3RyaW5nczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICBpZiAoISFyb3dWYWx1ZSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd1ZhbHVlKSkge1xyXG4gICAgICAgICAgZGF0YVN0cmluZ3MgPSBkYXRhU3RyaW5ncy5jb25jYXQocm93VmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJvd1ZhbHVlKS5mb3JFYWNoKChrZXkpID0+XHJcbiAgICAgICAgICAgICAgZGF0YVN0cmluZ3MucHVzaChyb3dWYWx1ZVtrZXldKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVN0cmluZ3MucHVzaChyb3dWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5wdXNoKGRhdGFTdHJpbmdzKTtcclxuICAgICAgICBpZiAoZGF0YVN0cmluZ3MubGVuZ3RoID4gY29sdW1uc0NvdW50KSB7XHJcbiAgICAgICAgICBjb2x1bW5zQ291bnQgPSBkYXRhU3RyaW5ncy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBjb2x1bW5zQ291bnQsIGRhdGE6IHJlc3VsdCB9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIuZGVzdHJveShjb250YWluZXIpO1xyXG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIuY3JlYXRlKGNvbnRhaW5lcik7XHJcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgdGhpcy5fdGV4dFRhYmxlQWRhcHRlci5kZXN0cm95KHRoaXMuY29udGVudENvbnRhaW5lcik7XHJcbiAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgfVxyXG59XHJcblxyXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJ0ZXh0XCIsIFRleHQpO1xyXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJjb21tZW50XCIsIFRleHQpO1xyXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJtdWx0aXBsZXRleHRcIiwgVGV4dCk7XHJcbiIsImV4cG9ydCB2YXIgX19hc3NpZ24gPVxuICAoPGFueT5PYmplY3QpW1wiYXNzaWduXCJdIHx8XG4gIGZ1bmN0aW9uKHRhcmdldDogYW55KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIgcCBpbiBzKVxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0YXJnZXRbcF0gPSBzW3BdO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKHRoaXNDbGFzczogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICBmb3IgKHZhciBwIGluIGJhc2VDbGFzcylcbiAgICBpZiAoYmFzZUNsYXNzLmhhc093blByb3BlcnR5KHApKSB0aGlzQ2xhc3NbcF0gPSBiYXNlQ2xhc3NbcF07XG4gIGZ1bmN0aW9uIF9fKCkge1xuICAgIHRoaXMuY29uc3RydWN0b3IgPSB0aGlzQ2xhc3M7XG4gIH1cbiAgdGhpc0NsYXNzLnByb3RvdHlwZSA9XG4gICAgYmFzZUNsYXNzID09PSBudWxsXG4gICAgICA/IE9iamVjdC5jcmVhdGUoYmFzZUNsYXNzKVxuICAgICAgOiAoKF9fLnByb3RvdHlwZSA9IGJhc2VDbGFzcy5wcm90b3R5cGUpLCBuZXcgKDxhbnk+X18pKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fcmVzdCA9IGZ1bmN0aW9uKHNvdXJjZTogYW55LCBlOiBhbnkpIHtcbiAgdmFyIHJlc3VsdDogYW55ID0ge307XG4gIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBzb3VyY2UpXG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwgcHJvcGVydHlOYW1lKSAmJlxuICAgICAgZS5pbmRleE9mKHByb3BlcnR5TmFtZSkgPCAwXG4gICAgKVxuICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBzb3VyY2VbcHJvcGVydHlOYW1lXTtcbiAgaWYgKFxuICAgIHNvdXJjZSAhPSBudWxsICYmXG4gICAgdHlwZW9mICg8YW55Pk9iamVjdClbXCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcIl0gPT09IFwiZnVuY3Rpb25cIlxuICApXG4gICAgZm9yIChcbiAgICAgIHZhciBpID0gMCxcbiAgICAgICAgcHJvcGVydHlTeW1ib2xzID0gKDxhbnk+T2JqZWN0KVtcImdldE93blByb3BlcnR5U3ltYm9sc1wiXShzb3VyY2UpO1xuICAgICAgaSA8IHByb3BlcnR5U3ltYm9scy5sZW5ndGg7XG4gICAgICBpKytcbiAgICApXG4gICAgICBpZiAoZS5pbmRleE9mKHByb3BlcnR5U3ltYm9sc1tpXSkgPCAwKVxuICAgICAgICByZXN1bHRbcHJvcGVydHlTeW1ib2xzW2ldXSA9IHNvdXJjZVtwcm9wZXJ0eVN5bWJvbHNbaV1dO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZGVjbGFyZSB2YXIgUmVmbGVjdDogYW55O1xuXG5leHBvcnQgdmFyIF9fZGVjb3JhdGUgPSBmdW5jdGlvbihcbiAgZGVjb3JhdG9yczogYW55LFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBhbnksXG4gIGRlc2M6IGFueVxuKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICByID1cbiAgICAgIGMgPCAzXG4gICAgICAgID8gdGFyZ2V0XG4gICAgICAgIDogZGVzYyA9PT0gbnVsbFxuICAgICAgICAgID8gKGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSlcbiAgICAgICAgICA6IGRlc2MsXG4gICAgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICBpZiAoKGQgPSBkZWNvcmF0b3JzW2ldKSlcbiAgICAgICAgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59O1xuIiwiZXhwb3J0IGNsYXNzIERvY3VtZW50SGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVNlbGVjdG9yKFxyXG4gICAgb3B0aW9uczogQXJyYXk8eyB2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfT4sXHJcbiAgICBpc1NlbGVjdGVkOiAob3B0aW9uOiB7IHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZyB9KSA9PiBib29sZWFuLFxyXG4gICAgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgY29uc3Qgc2VsZWN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICBzZWxlY3RXcmFwcGVyLmNsYXNzTmFtZSA9IFwic2EtcXVlc3Rpb25fX3NlbGVjdC13cmFwcGVyXCI7XHJcbiAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xyXG4gICAgc2VsZWN0LmNsYXNzTmFtZSA9IFwic2EtcXVlc3Rpb25fX3NlbGVjdFwiO1xyXG4gICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcclxuICAgICAgbGV0IG9wdGlvbkVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIsIFwiXCIsIHtcclxuICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxyXG4gICAgICAgIHRleHQ6IG9wdGlvbi50ZXh0LFxyXG4gICAgICAgIHNlbGVjdGVkOiBpc1NlbGVjdGVkKG9wdGlvbiksXHJcbiAgICAgIH0pO1xyXG4gICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7XHJcbiAgICB9KTtcclxuICAgIHNlbGVjdC5vbmNoYW5nZSA9IGhhbmRsZXI7XHJcbiAgICBzZWxlY3RXcmFwcGVyLmFwcGVuZENoaWxkKHNlbGVjdCk7XHJcbiAgICByZXR1cm4gc2VsZWN0V3JhcHBlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlQnV0dG9uKFxyXG4gICAgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCxcclxuICAgIHRleHQgPSBcIlwiLFxyXG4gICAgY2xhc3NOYW1lID0gXCJzYS10b29sYmFyX19idXR0b25cIlxyXG4gICkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgY2xhc3NOYW1lLCB7XHJcbiAgICAgIGlubmVyVGV4dDogdGV4dCxcclxuICAgICAgb25jbGljazogaGFuZGxlcixcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGJ1dHRvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlRWxlbWVudChcclxuICAgIHRhZ05hbWU6IHN0cmluZyxcclxuICAgIGNsYXNzTmFtZTogc3RyaW5nID0gXCJcIixcclxuICAgIGF0dHJzPzogYW55XHJcbiAgKTogSFRNTEVsZW1lbnQge1xyXG4gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcclxuICAgIGVsLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcclxuICAgIGlmICghIWF0dHJzKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAoPGFueT5lbClba2V5XSA9IGF0dHJzW2tleV07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTdmdFbGVtZW50KHBhdGg6IHN0cmluZyk6IFNWR1NWR0VsZW1lbnQge1xyXG4gICAgY29uc3Qgc3ZnRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcclxuICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxyXG4gICAgICBcInN2Z1wiXHJcbiAgICApO1xyXG4gICAgY29uc3QgdXNlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcclxuICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxyXG4gICAgICBcInVzZVwiXHJcbiAgICApO1xyXG4gICAgdXNlRWxlbS5zZXRBdHRyaWJ1dGVOUyhcclxuICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXHJcbiAgICAgIFwiaHJlZlwiLFxyXG4gICAgICBcIiNzYS1zdmctXCIgKyBwYXRoXHJcbiAgICApO1xyXG4gICAgc3ZnRWxlbS5hcHBlbmRDaGlsZCh1c2VFbGVtKTtcclxuICAgIHJldHVybiBzdmdFbGVtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTdmdCdXR0b24ocGF0aDogc3RyaW5nKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xyXG4gICAgY29uc3QgYnRuID0gPEhUTUxCdXR0b25FbGVtZW50PihcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBcInNhLXRhYmxlX19zdmctYnV0dG9uXCIpXHJcbiAgICApO1xyXG4gICAgYnRuLmFwcGVuZENoaWxkKERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQocGF0aCkpO1xyXG4gICAgcmV0dXJuIGJ0bjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnVG9nZ2xlQnV0dG9uKFxyXG4gICAgc3ZnUGF0aDE6IHN0cmluZyxcclxuICAgIHN2UHBhdGgyOiBzdHJpbmcsXHJcbiAgICB0ZXh0MTogc3RyaW5nLFxyXG4gICAgdGV4dDI6IHN0cmluZyxcclxuICAgIGhhbmRsZXIxOiAoZTogYW55KSA9PiBhbnksXHJcbiAgICBoYW5kbGVyMjogKGU6IGFueSkgPT4gYW55LFxyXG4gICAgc3RhdGUgPSBcImZpcnN0XCIsXHJcbiAgICBjbGFzc05hbWUgPSBcInNhLXRvb2xiYXJfX2J1dHRvbiBzYS10b29sYmFyX19zdmctYnV0dG9uXCJcclxuICApOiBIVE1MRWxlbWVudCB7XHJcbiAgICBjb25zdCBzdmcxID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU3ZnRWxlbWVudChzdmdQYXRoMSk7XHJcbiAgICBjb25zdCBzdmcyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU3ZnRWxlbWVudChzdlBwYXRoMik7XHJcbiAgICBjb25zdCBidXR0b24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIGNsYXNzTmFtZSk7XHJcblxyXG4gICAgY29uc3QgdG9nZ2xlID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoc3RhdGUgPT09IFwiZmlyc3RcIikge1xyXG4gICAgICAgIHN0YXRlID0gXCJzZWNvbmRcIjtcclxuICAgICAgICBidXR0b24udGl0bGUgPSB0ZXh0MjtcclxuICAgICAgICBidXR0b24ucmVtb3ZlQ2hpbGQoc3ZnMSk7XHJcbiAgICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHN2ZzIpO1xyXG4gICAgICAgIGhhbmRsZXIyKGUpO1xyXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBcInNlY29uZFwiKSB7XHJcbiAgICAgICAgc3RhdGUgPSBcImZpcnN0XCI7XHJcbiAgICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDE7XHJcbiAgICAgICAgYnV0dG9uLnJlbW92ZUNoaWxkKHN2ZzIpO1xyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcxKTtcclxuICAgICAgICBoYW5kbGVyMShlKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IFwiZmlyc3RcIikge1xyXG4gICAgICBidXR0b24udGl0bGUgPSB0ZXh0MTtcclxuICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHN2ZzEpO1xyXG4gICAgfSBlbHNlIGlmICgoc3RhdGUgPSBcInNlY29uZFwiKSkge1xyXG4gICAgICBidXR0b24udGl0bGUgPSB0ZXh0MjtcclxuICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHN2ZzIpO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1dHRvbi5vbmNsaWNrID0gdG9nZ2xlO1xyXG5cclxuICAgIHJldHVybiBidXR0b247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUlucHV0KFxyXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXHJcbiAgICBwbGFjZWhvbGRlciA9IFwiXCIsXHJcbiAgICBkZWZhdWx0VmFsdWUgPSBcIlwiXHJcbiAgKTogSFRNTElucHV0RWxlbWVudCB7XHJcbiAgICB2YXIgZWwgPSA8SFRNTElucHV0RWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxyXG4gICAgICBcImlucHV0XCIsXHJcbiAgICAgIGNsYXNzTmFtZSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlcixcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiBlbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgb3B0aW9ucyA9IHtcclxuICBydW5uaW5nSW5Ccm93c2VyOiB0eXBlb2Ygd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIixcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhbGxvd0RvbVJlbmRlcmluZygpIHtcclxuICByZXR1cm4gb3B0aW9ucy5ydW5uaW5nSW5Ccm93c2VyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tbWVyY2lhbExpY2Vuc2VMaW5rKCkge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1jb21tZXJjaWFsXCIpO1xyXG4gIGNvbnN0IGxpbmsgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiYVwiLCBcInNhLWNvbW1lcmNpYWxfX3RleHRcIiwge1xyXG4gICAgaHJlZjogXCJodHRwczovL3d3dy5zdXJ2ZXlqcy5pby9CdXlcIixcclxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcclxuICB9KTtcclxuICBjb25zdCBjb250YWluZXJTcGFuID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgXCJcIik7XHJcbiAgY29uc3QgaWNvbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQoXCJub25jb21tZXJjaWFsXCIpO1xyXG4gIGNvbnN0IHRleHRTcGFuID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcclxuICAgIFwic3BhblwiLFxyXG4gICAgXCJzYS1jb21tZXJjaWFsX19wcm9kdWN0XCIsXHJcbiAgICB7XHJcbiAgICAgIGlubmVyVGV4dDogXCJQbGVhc2UgcHVyY2hhc2UgYSBTdXJ2ZXlKUyBBbmFseXRpY3MgZGV2ZWxvcGVyIGxpY2Vuc2UgdG8gdXNlIGl0IGluIHlvdXIgYXBwLlwiLFxyXG4gICAgfVxyXG4gICk7XHJcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmspLmFwcGVuZENoaWxkKGNvbnRhaW5lclNwYW4pO1xyXG4gIGNvbnRhaW5lclNwYW4uYXBwZW5kQ2hpbGQoaWNvbik7XHJcbiAgY29udGFpbmVyU3Bhbi5hcHBlbmRDaGlsZCh0ZXh0U3Bhbik7XHJcbiAgcmV0dXJuIGNvbnRhaW5lcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERhdGFIZWxwZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgemlwQXJyYXlzKC4uLmFycmF5czogYW55W10pOiBhbnlbXVtdIHtcclxuICAgIGxldCB6aXBBcnJheTogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlzWzBdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHppcEFycmF5W2ldID0gW107XHJcbiAgICAgIGFycmF5cy5mb3JFYWNoKChhcnIpID0+IHtcclxuICAgICAgICB6aXBBcnJheVtpXS5wdXNoKGFycltpXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHppcEFycmF5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB1bnppcEFycmF5cyh6aXBBcnJheTogYW55W11bXSk6IGFueVtdW10ge1xyXG4gICAgbGV0IGFycmF5czogYW55W11bXSA9IFtdO1xyXG4gICAgemlwQXJyYXkuZm9yRWFjaCgodmFsdWUsIGkpID0+IHtcclxuICAgICAgdmFsdWUuZm9yRWFjaCgodmFsLCBqKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhcnJheXNbal0pIGFycmF5c1tqXSA9IFtdO1xyXG4gICAgICAgIGFycmF5c1tqXVtpXSA9IHZhbDtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhcnJheXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgc29ydERpY3Rpb25hcnkoXHJcbiAgICBrZXlzOiBhbnlbXSxcclxuICAgIHZhbHVlczogYW55W10sXHJcbiAgICBkZXNjOiBib29sZWFuXHJcbiAgKTogeyBrZXlzOiBhbnlbXSwgdmFsdWVzOiBhbnlbXSB9IHtcclxuICAgIGxldCBkaWN0aW9uYXJ5ID0gdGhpcy56aXBBcnJheXMoa2V5cywgdmFsdWVzKTtcclxuICAgIGxldCBjb21wYXJhdG9yID0gKGE6IGFueVtdLCBiOiBhbnlbXSwgYXNjOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gYVsxXSA8IGJbMV0gPyAxIDogYVsxXSA9PSBiWzFdID8gMCA6IC0xO1xyXG4gICAgICByZXR1cm4gYXNjID8gcmVzdWx0IDogcmVzdWx0ICogLTE7XHJcbiAgICB9O1xyXG4gICAgZGljdGlvbmFyeS5zb3J0KChhOiBhbnlbXSwgYjogYW55W10pID0+IHtcclxuICAgICAgcmV0dXJuIGRlc2MgPyBjb21wYXJhdG9yKGEsIGIsIGZhbHNlKSA6IGNvbXBhcmF0b3IoYSwgYik7XHJcbiAgICB9KTtcclxuICAgIGxldCBrZXlzQW5kVmFsdWVzID0gdGhpcy51bnppcEFycmF5cyhkaWN0aW9uYXJ5KTtcclxuICAgIHJldHVybiB7IGtleXM6IGtleXNBbmRWYWx1ZXNbMF0sIHZhbHVlczoga2V5c0FuZFZhbHVlc1sxXSB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB0b1BlcmNlbnRhZ2UodmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuICh2YWx1ZSAvIG1heFZhbHVlKSAqIDEwMDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMaW5rc0NvbnRhaW5lcihcclxuICBsaW5rczogQXJyYXk8eyBuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IGFueSB9PlxyXG4pOiBIVE1MRWxlbWVudCB7XHJcbiAgY29uc3QgbGlua3NDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gIGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcclxuICAgIGxpbmtzQ29udGFpbmVyLmFwcGVuZENoaWxkKFxyXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiYVwiLCBcIlwiLCB7XHJcbiAgICAgICAgaW5uZXJUZXh0OiBsaW5rLm5hbWUsXHJcbiAgICAgICAgZG93bmxvYWQ6IGxpbmsubmFtZSxcclxuICAgICAgICBocmVmOiBsaW5rLmNvbnRlbnQsXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG4gIHJldHVybiBsaW5rc0NvbnRhaW5lcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUltYWdlc0NvbnRhaW5lcihcclxuICBsaW5rczogQXJyYXk8eyBuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IGFueSB9PlxyXG4pOiBIVE1MRWxlbWVudCB7XHJcbiAgY29uc3QgbGlua3NDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gIGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcclxuICAgIGxpbmtzQ29udGFpbmVyLmFwcGVuZENoaWxkKFxyXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIFwiXCIsIHtcclxuICAgICAgICBhbHQ6IGxpbmsubmFtZSxcclxuICAgICAgICBzcmM6IGxpbmsuY29udGVudCxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGxpbmtzQ29udGFpbmVyO1xyXG59XHJcbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5cbmRlY2xhcmUgdHlwZSBWaXN1YWxpemVyQ29uc3RydWN0b3IgPSBuZXcgKFxuICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gIG9wdGlvbnM/OiBPYmplY3RcbikgPT4gYW55O1xuXG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdXNlZCB0byByZWdpc3RlciBhbmQgdW5yZWdpc3RlciB2aXN1YWxpemVycyBmb3IgaW5kaXZpZHVhbCBxdWVzdGlvbiB0eXBlcy5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy92aXN1YWxpemUtYW5zd2Vycy1mcm9tLXRleHQtZW50cnktZmllbGRzLXdpdGgtY2hhcnRzLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFZpc3VhbGl6YXRpb25NYW5hZ2VyIHtcbiAgc3RhdGljIGFsdGVybmF0aXZlc1Zpc3VhbGl6ZXI6IGFueSA9IHVuZGVmaW5lZDtcbiAgc3RhdGljIHZpenVhbGl6ZXJzOiB7IFtpbmRleDogc3RyaW5nXTogQXJyYXk8eyBjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3IsIGluZGV4OiBudW1iZXIgfT4gfSA9IHt9O1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmlzdWFsaXplciBmb3IgYSBzcGVjaWZpZWQgcXVlc3Rpb24gdHlwZS5cbiAgICpcbiAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZXhhbXBsZXMvdmlzdWFsaXplLWFuc3dlcnMtZnJvbS10ZXh0LWVudHJ5LWZpZWxkcy13aXRoLWNoYXJ0cy8gKGxpbmtTdHlsZSkpXG4gICAqIEBwYXJhbSBxdWVzdGlvblR5cGUgQSBxdWVzdGlvbiBbdHlwZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI2dldFR5cGUpLlxuICAgKiBAcGFyYW0gY29uc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXN1YWxpemVyIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0gaW5kZXggQSB6ZXJvLWJhc2VkIGluZGV4IHRoYXQgc3BlY2lmaWVzIHRoZSB2aXN1YWxpemVyJ3MgcG9zaXRpb24gaW4gdGhlIHZpc3VhbGl6ZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBxdWVzdGlvbiB0eXBlLiBQYXNzIGAwYCB0byBpbnNlcnQgdGhlIHZpc3VhbGl6ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBhbmQgdXNlIGl0IGJ5IGRlZmF1bHQuIElmIGBpbmRleGAgaXMgbm90IHNwZWNpZmllZCwgdGhlIHZpc3VhbGl6ZXIgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJWaXN1YWxpemVyKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIGNvbnN0cnVjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3IsXG4gICAgaW5kZXggPSBOdW1iZXIuTUFYX1ZBTFVFXG4gICkge1xuICAgIGxldCB2aXN1YWxpemVycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYgKCF2aXN1YWxpemVycykge1xuICAgICAgdmlzdWFsaXplcnMgPSBbXTtcbiAgICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3F1ZXN0aW9uVHlwZV0gPSB2aXN1YWxpemVycztcbiAgICB9XG4gICAgdmlzdWFsaXplcnMucHVzaCh7IGN0b3I6IGNvbnN0cnVjdG9yLCBpbmRleCB9KTtcbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2aXN1YWxpemVyIGZvciBhIHNwZWNpZmllZCBxdWVzdGlvbiB0eXBlLlxuICAgKlxuICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy92aXN1YWxpemUtYW5zd2Vycy1mcm9tLXRleHQtZW50cnktZmllbGRzLXdpdGgtY2hhcnRzLyAobGlua1N0eWxlKSlcbiAgICogQHBhcmFtIHF1ZXN0aW9uVHlwZSBBIHF1ZXN0aW9uIFt0eXBlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24jZ2V0VHlwZSkuXG4gICAqIEBwYXJhbSBjb25zdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZpc3VhbGl6ZXIgY29uc3RydWN0b3IgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclZpc3VhbGl6ZXIocXVlc3Rpb25UeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbnN0cnVjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICBsZXQgcXVlc3Rpb25UeXBlcyA9IFtxdWVzdGlvblR5cGVdO1xuICAgIGlmKCFxdWVzdGlvblR5cGUpIHtcbiAgICAgIHF1ZXN0aW9uVHlwZXMgPSBPYmplY3Qua2V5cyhWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVycyk7XG4gICAgfVxuICAgIHF1ZXN0aW9uVHlwZXMuZm9yRWFjaChxVHlwZSA9PiB7XG4gICAgICBpZihjb25zdHJ1Y3Rvcikge1xuICAgICAgICBsZXQgdmlzdWFsaXplcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1txVHlwZV07XG4gICAgICAgIGlmICghIXZpc3VhbGl6ZXJzKSB7XG4gICAgICAgICAgY29uc3QgdkRlc2NyID0gdmlzdWFsaXplcnMuZmlsdGVyKHYgPT4gdi5jdG9yID09PSBjb25zdHJ1Y3RvcilbMF07XG4gICAgICAgICAgaWYoISF2RGVzY3IpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHZpc3VhbGl6ZXJzLmluZGV4T2YodkRlc2NyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgdmlzdWFsaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3FUeXBlXSA9IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gUGFzcyBgdW5kZWZpbmVkYCB0byB0aGUgW2B1bnJlZ2lzdGVyVmlzdWFsaXplcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ubWFuYWdlciN1bnJlZ2lzdGVyVmlzdWFsaXplcikgbWV0aG9kIGluc3RlYWQuXG4gICAqIEBwYXJhbSBjb25zdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZpc3VhbGl6ZXIgY29uc3RydWN0b3IgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclZpc3VhbGl6ZXJGb3JBbGwoY29uc3RydWN0b3I6IFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnVucmVnaXN0ZXJWaXN1YWxpemVyKHVuZGVmaW5lZCwgY29uc3RydWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB2aXN1YWxpemVyIGNvbnN0cnVjdG9ycyBmb3IgYSBzcGVjaWZpZWQgcXVlc3Rpb24gdHlwZS5cbiAgICogQHBhcmFtIHF1ZXN0aW9uVHlwZSBBIHF1ZXN0aW9uIFt0eXBlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24jZ2V0VHlwZSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFZpc3VhbGl6ZXJzQnlUeXBlKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nXG4gICk6IFZpc3VhbGl6ZXJDb25zdHJ1Y3RvcltdIHtcbiAgICBsZXQgdkRlc2NycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYgKCF2RGVzY3JzKSB7XG4gICAgICBpZihWaXN1YWxpemVyQmFzZS5zdXBwcmVzc1Zpc3VhbGl6ZXJTdHViUmVuZGVyaW5nKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbVmlzdWFsaXplckJhc2VdO1xuICAgIH1cbiAgICB2RGVzY3JzID0gW10uY29uY2F0KHZEZXNjcnMpO1xuICAgIHZEZXNjcnMuc29ydCgodjEsIHYyKSA9PiB2MS5pbmRleCAtIHYyLmluZGV4KTtcbiAgICByZXR1cm4gdkRlc2Nycy5tYXAodiA9PiB2LmN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29uc3RydWN0b3IgZm9yIGFuIGFsdGVybmF0aXZlIHZpc3VhbGl6ZXIgc2VsZWN0b3IuXG4gICAqIEBzZWUgcmVnaXN0ZXJBbHRWaXN1YWxpemVyU2VsZWN0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QWx0VmlzdWFsaXplclNlbGVjdG9yKCkge1xuICAgIHJldHVybiBWaXN1YWxpemF0aW9uTWFuYWdlci5hbHRlcm5hdGl2ZXNWaXN1YWxpemVyIHx8IFZpc3VhbGl6ZXJCYXNlO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gYWx0ZXJuYXRpdmUgdmlzdWFsaXplciBzZWxlY3Rvci5cbiAgICogQHBhcmFtIGNvbnN0cnVjdG9yIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY29uc3RydWN0b3IgZm9yIGFuIGFsdGVybmF0aXZlIHZpc3VhbGl6ZXIgc2VsZWN0b3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyQWx0VmlzdWFsaXplclNlbGVjdG9yKGNvbnN0cnVjdG9yOiBhbnkpIHtcbiAgICBWaXN1YWxpemF0aW9uTWFuYWdlci5hbHRlcm5hdGl2ZXNWaXN1YWxpemVyID0gY29uc3RydWN0b3I7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCxcbiAgTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIEl0ZW1WYWx1ZSxcbiAgSGVscGVycyxcbiAgUXVlc3Rpb25TZWxlY3RCYXNlLFxufSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbCB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd24gZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByb3RlY3RlZCBfbWF0cml4RHJvcGRvd25WaXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwibWF0cml4RHJvcGRvd25cIik7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLmRpc2FibGVMb2NhbGVTd2l0Y2ggPSB0cnVlO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLmFsbG93RHluYW1pY0xheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNWYWx1ZXMgPSBxdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+IHJvdy52YWx1ZSk7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLnNlcmllc0xhYmVscyA9IHF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gcm93LnRleHQpO1xuXG4gICAgY29uc3QgaW5uZXJRdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9ucygpO1xuICAgIGNvbnN0IGNhbkdyb3VwQ29sdW1ucyA9IHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNWYWx1ZXMubGVuZ3RoID09IDEgJiYgaW5uZXJRdWVzdGlvbnMuZXZlcnkoaW5uZXJRdWVzdGlvbiA9PiBIZWxwZXJzLmlzQXJyYXlzRXF1YWwoaW5uZXJRdWVzdGlvbi5jaG9pY2VzLCAoPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uKS5jaG9pY2VzKSk7XG4gICAgaWYgKGNhbkdyb3VwQ29sdW1ucykge1xuICAgICAgdmFyIGNyZWF0b3JzID0gVmlzdWFsaXphdGlvbk1hbmFnZXIuZ2V0VmlzdWFsaXplcnNCeVR5cGUoXCJtYXRyaXhkcm9wZG93bi1ncm91cGVkXCIpO1xuICAgICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyID0gbmV3IGNyZWF0b3JzWzBdKHRoaXMucXVlc3Rpb24sIFtdLCB0aGlzLl9jaGlsZE9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIgPSBuZXcgVmlzdWFsaXphdGlvblBhbmVsKGlubmVyUXVlc3Rpb25zLCBbXSwgdGhpcy5fY2hpbGRPcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2spO1xuICAgIHRoaXMudXBkYXRlRGF0YShkYXRhKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRMb2NhbGUobmV3TG9jYWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuc2VyaWVzTGFiZWxzID0gdGhpcy5xdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+IHJvdy50ZXh0KTtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIubG9jYWxlID0gbmV3TG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplcjtcbiAgfVxuXG4gIHByaXZhdGUgb25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlRHJvcGRvd25WaXN1YWxpemVyRGF0YSgpIHtcbiAgICBsZXQgcGFuZWxEYXRhOiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGRhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgcmF3RGF0YUl0ZW0gPSBkYXRhSXRlbVt0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICAgICAgaWYgKCEhcmF3RGF0YUl0ZW0pIHtcbiAgICAgICAgT2JqZWN0LmtleXMocmF3RGF0YUl0ZW0pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIHZhciBuZXN0ZWREYXRhSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIHJhd0RhdGFJdGVtW2tleV0pO1xuICAgICAgICAgIG5lc3RlZERhdGFJdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldID0ga2V5O1xuICAgICAgICAgIHBhbmVsRGF0YS5wdXNoKG5lc3RlZERhdGFJdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLnVwZGF0ZURhdGEocGFuZWxEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgdGhpcy51cGRhdGVEcm9wZG93blZpc3VhbGl6ZXJEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURyb3Bkb3duVmlzdWFsaXplckRhdGEoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKSB7XG4gICAgY29uc3QgbWF0cml4ZHJvcGRvd246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICByZXR1cm4gbWF0cml4ZHJvcGRvd24uY29sdW1ucy5tYXAoXG4gICAgICAoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBjZWxsUXVlc3Rpb246IGFueSA9IGNvbHVtbi50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjZWxsUXVlc3Rpb24uY2hvaWNlcykgJiYgY2VsbFF1ZXN0aW9uLmNob2ljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY2VsbFF1ZXN0aW9uLmNob2ljZXMgPSBtYXRyaXhkcm9wZG93bi5jaG9pY2VzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxsUXVlc3Rpb247XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIuY2xlYXIoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLnJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKHRoaXMub25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2spO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcbiAgXCJtYXRyaXhkcm9wZG93blwiLFxuICBWaXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd25cbik7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWxEeW5hbWljIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvblBhbmVsRHluYW1pY1wiO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvbk1hdHJpeER5bmFtaWMgZXh0ZW5kcyBWaXN1YWxpemF0aW9uUGFuZWxEeW5hbWljIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdFxuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwibWF0cml4RHluYW1pY1wiO1xuICB9XG5cbiAgZ2V0UXVlc3Rpb25zKCkge1xuICAgIGNvbnN0IG1hdHJpeGR5bmFtaWM6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IG1hdHJpeGR5bmFtaWMudmlzaWJsZVJvd3M7XG5cbiAgICBpZiAodmlzaWJsZVJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gdmlzaWJsZVJvd3NbMF0uY2VsbHMubWFwKGMgPT4gYy5xdWVzdGlvbik7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFxuICBcIm1hdHJpeGR5bmFtaWNcIixcbiAgVmlzdWFsaXphdGlvbk1hdHJpeER5bmFtaWNcbik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBFdmVudCwgUXVlc3Rpb24sIFN1cnZleU1vZGVsLCBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCAqIGFzIFN1cnZleUNvcmUgZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlLCBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciB9IGZyb20gXCIuL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciwgY3JlYXRlQ29tbWVyY2lhbExpY2Vuc2VMaW5rIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IElWaXN1YWxpemVyUGFuZWxFbGVtZW50LCBJU3RhdGUsIElQZXJtaXNzaW9uIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBGaWx0ZXJJbmZvIH0gZnJvbSBcIi4vZmlsdGVySW5mb1wiO1xuaW1wb3J0IHsgTGF5b3V0RW5naW5lLCBNdXVyaUxheW91dEVuZ2luZSB9IGZyb20gXCIuL2xheW91dEVuZ2luZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5cbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi92aXN1YWxpemF0aW9uUGFuZWwuc2Nzc1wiKTtcblxuY29uc3QgcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lID0gXCJzYS1xdWVzdGlvblwiO1xuY29uc3QgcXVlc3Rpb25MYXlvdXRlZEVsZW1lbnRDbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uLWxheW91dGVkXCI7XG5cbmlmICghIWRvY3VtZW50KSB7XG4gIGNvbnN0IHN2Z1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9zdmdidW5kbGUuaHRtbFwiKTtcbiAgY29uc3QgdGVtcGxhdGVIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB0ZW1wbGF0ZUhvbGRlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIHRlbXBsYXRlSG9sZGVyLmlubmVySFRNTCA9IHN2Z1RlbXBsYXRlO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRlbXBsYXRlSG9sZGVyKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50XG4gIGV4dGVuZHMgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQge1xuICByZW5kZXJlZEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBWaXN1YWxpemF0aW9uIFBhbmVsIGNvbmZpZ3VyYXRpb24uIFBhc3MgaXQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpIGNvbnN0cnVjdG9yOlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWwgfSBmcm9tIFwic3VydmV5LWFuYWx5dGljc1wiO1xuICpcbiAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChcbiAqICAgc3VydmV5UXVlc3Rpb25zLFxuICogICBzdXJ2ZXlSZXN1bHRzLFxuICogICB2aXpQYW5lbE9wdGlvbnNcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucyB7XG4gIC8vIEFuIG9iamVjdCBuYW1lZCBhZnRlciBhIHF1ZXN0aW9uIHRoYXQgaXQgY29uZmlndXJlcy5cbiAgLy8gcXVlc3Rpb25OYW1lOiB7XG4gIC8vICAgaW50ZXJ2YWxzOiBbXVxuICAvLyB9LFxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGxhYmVsIGNoYXJhY3RlcnMgYWZ0ZXIgd2hpY2ggdHJ1bmNhdGlvbiBzdGFydHMuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIC0xIHRvIGRpc2FibGUgdHJ1bmNhdGlvbi5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogMjdcbiAgICovXG4gIGxhYmVsVHJ1bmNhdGVMZW5ndGg/OiBudW1iZXI7XG5cbiAgYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZT86IGJvb2xlYW47XG5cbiAgc2VyaWVzVmFsdWVzPzogc3RyaW5nW107XG4gIHNlcmllc0xhYmVscz86IHN0cmluZ1tdO1xuICB1c2VWYWx1ZXNBc0xhYmVscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhc3MgYSBzdXJ2ZXkgaW5zdGFuY2UgdG8gdXNlIHN1cnZleSBsb2NhbGVzIGluIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKi9cbiAgc3VydmV5PzogU3VydmV5TW9kZWw7XG4gIC8qKlxuICAgKiBBIGNvbW1vbiBkYXRhIHByb3ZpZGVyIGZvciBhbGwgdmlzdWFsaXplcnMuXG4gICAqL1xuICBkYXRhUHJvdmlkZXI/OiBEYXRhUHJvdmlkZXI7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXR5IG9mIGluZGl2aWR1YWwgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBIaWRlIGJ1dHRvbiB0byBlYWNoIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93SGlkZVF1ZXN0aW9ucz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcnJhbmdlIGNoYXJ0cyBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzcGFjZSBhbmQgYWxsb3cgdXNlcnMgdG8gcmVvcmRlciB0aGVtIHZpYSBkcmFnIGFuZCBkcm9wLlxuICAgKlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGRpc2FibGVkLCBjaGFydHMgYXJlIGRpc3BsYXllZCBvbmUgdW5kZXIgYW5vdGhlciwgYW5kIHVzZXJzIGNhbm5vdCBkcmFnIGFuZCBkcm9wIHRoZW0uIElmIHlvdSB3YW50IHRvIGRpc2FibGUgb25seSBkcmFnIGFuZCBkcm9wLCBzZXQgdGhlIFtgYWxsb3dEcmFnRHJvcGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGB0cnVlYFxuICAgKlxuICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy9jdXN0b20tbGF5b3V0LyAobGlua1N0eWxlKSlcbiAgICogQHNlZSBsYXlvdXRFbmdpbmVcbiAgICovXG4gIGFsbG93RHluYW1pY0xheW91dD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB1c2VycyBjYW4gZHJhZyBhbmQgZHJvcCBjaGFydHMuIEFwcGxpZXMgb25seSBpZiBbYGFsbG93RHluYW1pY0xheW91dGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIGlzIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqIEBzZWUgbGF5b3V0RW5naW5lXG4gICAqL1xuICBhbGxvd0RyYWdEcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgbGF5b3V0IGVuZ2luZSB1c2VkIHRvIGFycmFuZ2UgY2hhcnRzIG9uIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGludGVncmF0ZSBhIHRoaXJkLXBhcnR5IGxheW91dCBlbmdpbmUgd2l0aCBTdXJ2ZXlKUyBEYXNoYm9hcmQuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dEeW5hbWljTGF5b3V0XG4gICAqL1xuICBsYXlvdXRFbmdpbmU/OiBMYXlvdXRFbmdpbmU7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc3dpdGNoIGJldHdlZW4gYWJzb2x1dGUgYW5kIHBlcmNlbnRhZ2UgdmFsdWVzIGluIGJhciBjaGFydHMuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgYWRkcyBhIFNob3cgUGVyY2VudGFnZXMgYnV0dG9uIHRvIGVhY2ggYmFyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgc2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgc2hvd09ubHlQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIGFsbG93U2hvd1BlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGJhciBjaGFydHMgZGlzcGxheSBwZXJjZW50YWdlcyBpbiBhZGRpdGlvbiB0byBhYnNvbHV0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dTaG93UGVyY2VudGFnZXNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqIEBzZWUgcGVyY2VudGFnZVByZWNpc2lvblxuICAgKi9cbiAgc2hvd1BlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGJhciBjaGFydHMgZGlzcGxheSBvbmx5IHBlcmNlbnRhZ2VzLCB3aXRob3V0IGFic29sdXRlIHZhbHVlcy5cbiAgICpcbiAgICogQXBwbGllcyBvbmx5IGlmIHRoZSBgYWxsb3dTaG93UGVyY2VudGFnZXNgIG9yIGBzaG93UGVyY2VudGFnZXNgIHByb3BlcnR5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICpcbiAgICogQHNlZSBhbGxvd1Nob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHNob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIHNob3dPbmx5UGVyY2VudGFnZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHBlcmNlbnRhZ2UgcHJlY2lzaW9uLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiAwXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqL1xuICBwZXJjZW50YWdlUHJlY2lzaW9uPzogbnVtYmVyO1xuICBoYXZlQ29tbWVyY2lhbExpY2Vuc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNvcnQgYW5zd2VycyBieSBhbnN3ZXIgY291bnQuIEFwcGxpZXMgb25seSB0byBiYXIgYW5kIHNjYXR0ZXIgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTb3J0aW5nIGRyb3Bkb3duIHRvIGVhY2ggYmFyIGFuZCBzY2F0dGVyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICpcbiAgICogQHNlZSBhbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdG8gc29ydCBhbnN3ZXJzIGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczpcbiAgICpcbiAgICogLSBgXCJkZWZhdWx0XCJgIChkZWZhdWx0KSAtIERvIG5vdCBzb3J0IGFuc3dlcnMuXG4gICAqIC0gYFwiYXNjXCJgIC0gU29ydCBhbnN3ZXJzIGJ5IGFzY2VuZGluZyBhbnN3ZXIgY291bnQuXG4gICAqIC0gYFwiZGVzY1wiYCAtIFNvcnQgYW5zd2VycyBieSBkZXNjZW5kaW5nIGFuc3dlciBjb3VudC5cbiAgICpcbiAgICogVXNlcnMgY2FuIGNoYW5nZSB0aGlzIHByb3BlcnR5IHZhbHVlIGlmIHlvdSBlbmFibGUgdGhlIGBhbGxvd0NoYW5nZUFuc3dlcnNPcmRlcmAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFuc3dlcnNPcmRlcj86IFwiZGVmYXVsdFwiIHwgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIGhpZGUgYW5zd2VycyB3aXRoIHplcm8gY291bnQgaW4gYmFyIGFuZCBzY2F0dGVyIGNoYXJ0cy5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBhZGRzIGEgSGlkZSBFbXB0eSBBbnN3ZXJzIGJ1dHRvbiB0byBlYWNoIGJhciBhbmQgc2NhdHRlciBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEhpZGVzIGFuc3dlcnMgd2l0aCB6ZXJvIGNvdW50IGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiBAc2VlIGFsbG93SGlkZUVtcHR5QW5zd2Vyc1xuICAgKi9cbiAgaGlkZUVtcHR5QW5zd2Vycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IHdoZXRoZXIgdG8gc2hvdyB0b3AgNSwgMTAsIG9yIDIwIGFuc3dlcnMgYnkgYW5zd2VyIGNvdW50LlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUb3AgTiBBbnN3ZXJzIGRyb3Bkb3duIHRvIGVhY2ggY2hhcnQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VG9wTkFuc3dlcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNob3cgdGhlIG51bWJlciBvZiByZXNwb25kZW50cyB3aG8gZGlkIG5vdCBhbnN3ZXIgYSBwYXJ0aWN1bGFyIHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTaG93IE1pc3NpbmcgQW5zd2VycyBidXR0b24gdG8gZWFjaCBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dTaG93TWlzc2luZ0Fuc3dlcnM/OiBib29sZWFuO1xuXG4gIGFsbG93RXhwZXJpbWVudGFsRmVhdHVyZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVmYXVsdCBjaGFydCB0eXBlLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBxdWVzdGlvbiB0eXBlIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqIC0gQm9vbGVhbjogYFwiYmFyXCJgIHwgYFwicGllXCJgIHwgYFwiZG91Z2hudXRcImBcbiAgICogLSBEYXRlLCBOdW1iZXI6IGBcImJhclwiYCB8IGBcInNjYXR0ZXJcImBcbiAgICogLSBNYXRyaXg6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic3RhY2tlZGJhclwiYFxuICAgKiAtIFJhdGluZzogYFwiYmFyXCJgIHwgYFwic2NhdHRlclwiYCB8IGBcImdhdWdlXCJgIHwgYFwiYnVsbGV0XCJgXG4gICAqIC0gUmFkaW9ncm91cCwgQ2hlY2tib3gsIERyb3Bkb3duLCBJbWFnZSBQaWNrZXI6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic2NhdHRlclwiYFxuICAgKlxuICAgKiBUbyBzZXQgYSB0eXBlIGZvciBhbiBpbmRpdmlkdWFsIGNoYXJ0LCBhY2Nlc3MgdGhpcyBjaGFydCBpbiB0aGUgYHZpc3VhbGl6ZXJzYCBhcnJheSBhbmQgc2V0IGl0cyBgY2hhcnRUeXBlYCBwcm9wZXJ0eSB0byBvbmUgb2YgdGhlIHZhbHVlcyBkZXNjcmliZWQgYWJvdmU6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFN1cnZleUFuYWx5dGljcy5WaXN1YWxpemF0aW9uUGFuZWwoIC4uLiApO1xuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5jaGFydFR5cGUgPSBcInN0YWNrZWRiYXJcIjtcbiAgICogYGBgXG4gICAqXG4gICAqL1xuICBkZWZhdWx0Q2hhcnRUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHRyYW5zcG9zZSBhIHZpc3VhbGl6ZWQgbWF0cml4IHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUcmFuc3Bvc2UgYnV0dG9uIHRvIGNoYXJ0cyB0aGF0IHZpc3VhbGl6ZSBtYXRyaXhlcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIFZhbHVlcywgbWF0cml4IHJvd3MgZ28gdG8gY2hhcnQgYXJndW1lbnRzIGFuZCBtYXRyaXggY29sdW1ucyBmb3JtIGNoYXJ0IHNlcmllcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIENvbHVtbnMsIG1hdHJpeCByb3dzIGZvcm0gY2hhcnQgc2VyaWVzIGFuZCBtYXRyaXggY29sdW1ucyBnbyB0byBjaGFydCBhcmd1bWVudHMuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VHJhbnNwb3NlRGF0YT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY3Jvc3MtZmlsdGVyIGNoYXJ0cy4gVGhlIGZpbHRlciBhcHBsaWVzIHdoZW4gdXNlcnMgc2VsZWN0IGEgc2VyaWVzIHBvaW50LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93U2VsZWN0aW9uPzogYm9vbGVhbjtcblxuICByZW5kZXJDb250ZW50PzogRnVuY3Rpb247XG4gIGRlc3Ryb3lDb250ZW50PzogRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgSFRNTCB0YWdzIGZyb20gc3VydmV5IGVsZW1lbnQgdGl0bGVzLlxuICAgKlxuICAgKiBTdXJ2ZXkgZWxlbWVudCB0aXRsZXMgY2FuIGNvbnRhaW4gSFRNTCBtYXJrdXAgYW5kIGFyZSBzcGVjaWZpZWQgYnkgdXNlcnMuIEFuIGF0dGFja2VyIGNhbiBpbmplY3QgbWFsaWNpb3VzIGNvZGUgaW50byB0aGUgdGl0bGVzLiBUbyBndWFyZCBhZ2FpbnN0IGl0LCBrZWVwIHRoaXMgcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqL1xuICBzdHJpcEh0bWxGcm9tVGl0bGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCB2aXN1YWxpemVzIHN1cnZleSByZXN1bHRzIGFuZCBhbGxvd3MgdXNlcnMgdG8gYW5hbHl6ZSB0aGVtLlxuICpcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnM6XG4gKlxuICogLSBgcXVlc3Rpb25zYDogQXJyYXlcXDxbYFF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uKVxcPlxcXG4gKiBTdXJ2ZXkgcXVlc3Rpb25zIHRvIHZpc3VhbGl6ZS4gQ2FsbCBgU3VydmV5TW9kZWxgJ3MgW2BnZXRBbGxRdWVzdGlvbnMoKWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXktZGF0YS1tb2RlbCNnZXRRdWVzdGlvbkJ5TmFtZSkgbWV0aG9kIHRvIGFjY2VzcyBhbGwgc3VydmV5IHF1ZXN0aW9ucyBhbmQgcGFzcyBpdHMgcmVzdWx0IGFzIHRoZSBgcXVlc3Rpb25zYCBwYXJhbWV0ZXIuXG4gKiAtIGBkYXRhYDogYEFycmF5PGFueT5gXFxcbiAqIFN1cnZleSByZXN1bHRzLlxuICogLSBgdml6UGFuZWxPcHRpb25zYDogW2BJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucylcXFxuICogVmlzdWFsaXphdGlvbiBQYW5lbCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2V4YW1wbGVzL2ludGVyYWN0aXZlLXN1cnZleS1kYXRhLWRhc2hib2FyZC8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uUGFuZWwgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB2aXN1YWxpemVyczogQXJyYXk8VmlzdWFsaXplckJhc2U+ID0gW107XG4gIHByaXZhdGUgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVuZGVyZWRRdWVzdGlvbnNDb3VudDogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uczogQXJyYXk8YW55PixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zID0ge30sXG4gICAgcHJpdmF0ZSBfZWxlbWVudHM6IEFycmF5PElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQ+ID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKG51bGwsIGRhdGEsIG9wdGlvbnMsIFwicGFuZWxcIik7XG5cbiAgICBjb25zdCBmID0gKDxhbnk+U3VydmV5Q29yZSkuaGFzTGljZW5zZTtcbiAgICB0aGlzLmhhdmVDb21tZXJjaWFsTGljZW5zZSA9ICghIWYgJiYgZig0KSkgfHxcbiAgICAgIFZpc3VhbGl6YXRpb25QYW5lbC5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgfHxcbiAgICAgICh0eXBlb2Ygb3B0aW9ucy5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLmhhdmVDb21tZXJjaWFsTGljZW5zZVxuICAgICAgICA6IGZhbHNlKTtcblxuICAgIHRoaXMuX2xheW91dEVuZ2luZSA9XG4gICAgICBvcHRpb25zLmxheW91dEVuZ2luZSB8fFxuICAgICAgbmV3IE11dXJpTGF5b3V0RW5naW5lKFxuICAgICAgICB0aGlzLmFsbG93RHluYW1pY0xheW91dCxcbiAgICAgICAgXCIuXCIgKyBxdWVzdGlvbkxheW91dGVkRWxlbWVudENsYXNzTmFtZSxcbiAgICAgICAgdGhpcy5hbGxvd0RyYWdEcm9wXG4gICAgICApO1xuICAgIHRoaXMuX2xheW91dEVuZ2luZS5vbk1vdmVDYWxsYmFjayA9IChvcmRlcjogQXJyYXk8c3RyaW5nPikgPT5cbiAgICAgIHRoaXMucmVvcmRlclZpc2libGVFbGVtZW50cyhvcmRlcik7XG5cbiAgICB0aGlzLnNob3dUb29sYmFyID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnN1cnZleSkge1xuICAgICAgbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSB0aGlzLm9wdGlvbnMuc3VydmV5LmxvY2FsZTtcbiAgICB9XG5cbiAgICBpZiAoX2VsZW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnRzID0gdGhpcy5idWlsZEVsZW1lbnRzKHF1ZXN0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZFZpc3VhbGl6ZXJzKHF1ZXN0aW9ucyk7XG5cbiAgICBpZiAoIXRoaXMuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjb21tZXJjaWFsTGljZW5zZVwiLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVDb21tZXJjaWFsTGljZW5zZUxpbmsoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcInJlc2V0RmlsdGVyXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIFNlbGVjdEJhc2UgfHwgdmlzdWFsaXplciBpbnN0YW5jZW9mIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyKSB7XG4gICAgICAgICAgICB2aXN1YWxpemVyLnNldFNlbGVjdGlvbih1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVzZXRGaWx0ZXJcIikpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiYWRkRWxlbWVudFwiLCAodG9vbGJhcjogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmFsbG93SGlkZVF1ZXN0aW9ucykge1xuICAgICAgICBsZXQgYWRkRWxlbWVudFNlbGVjdG9yOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYWRkRWxlbWVudFNlbGVjdG9yVXBkYXRlciA9IChcbiAgICAgICAgICBwYW5lbDogVmlzdWFsaXphdGlvblBhbmVsLFxuICAgICAgICAgIG9wdGlvbnM6IGFueVxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBoaWRkZW5FbGVtZW50cyA9IHRoaXMuaGlkZGVuRWxlbWVudHM7XG4gICAgICAgICAgaWYgKGhpZGRlbkVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIDxhbnk+e1xuICAgICAgICAgICAgICAgICAgbmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRFbGVtZW50XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuY29uY2F0KGhpZGRlbkVsZW1lbnRzKVxuICAgICAgICAgICAgICAgIC5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGVsZW1lbnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IGZhbHNlLFxuICAgICAgICAgICAgICAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RWxlbWVudChlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAoYWRkRWxlbWVudFNlbGVjdG9yICYmXG4gICAgICAgICAgICAgIHRvb2xiYXIucmVwbGFjZUNoaWxkKHNlbGVjdFdyYXBwZXIsIGFkZEVsZW1lbnRTZWxlY3RvcikpIHx8XG4gICAgICAgICAgICAgIHRvb2xiYXIuYXBwZW5kQ2hpbGQoc2VsZWN0V3JhcHBlcik7XG4gICAgICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3IgPSBzZWxlY3RXcmFwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3IgJiYgdG9vbGJhci5yZW1vdmVDaGlsZChhZGRFbGVtZW50U2VsZWN0b3IpO1xuICAgICAgICAgICAgYWRkRWxlbWVudFNlbGVjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYWRkRWxlbWVudFNlbGVjdG9yVXBkYXRlcih0aGlzLCB7fSk7XG4gICAgICAgIHRoaXMub25WaXNpYmxlRWxlbWVudHNDaGFuZ2VkLmFkZChhZGRFbGVtZW50U2VsZWN0b3JVcGRhdGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsZVN3aXRjaCAmJiB0aGlzLmxvY2FsZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbG9jYWxlQ2hvaWNlcyA9IHRoaXMubG9jYWxlcy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogZWxlbWVudCxcbiAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbZWxlbWVudF0gfHwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhlbGVtZW50KSB8fCBlbGVtZW50XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIC8vIGxvY2FsZUNob2ljZXMudW5zaGlmdCh7XG4gICAgICAvLyAgIHZhbHVlOiBcIlwiLFxuICAgICAgLy8gICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhbmdlTG9jYWxlXCIpLFxuICAgICAgLy8gfSk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VMb2NhbGVcIiwgKCkgPT4ge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IobG9jYWxlQ2hvaWNlcyxcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+ICEhb3B0aW9uLnZhbHVlICYmICh0aGlzLmxvY2FsZSB8fCBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZSkgPT09IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB2YXIgbmV3TG9jYWxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVvcmRlclZpc2libGVFbGVtZW50cyhvcmRlcjogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXdFbGVtZW50cyA9IFtdO1xuICAgIG9yZGVyLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICBuZXdFbGVtZW50cy5wdXNoKHRoaXMuX2VsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5uYW1lID09PSBuYW1lKVswXSk7XG4gICAgfSk7XG4gICAgdGhpcy5fZWxlbWVudHMgPSBuZXdFbGVtZW50cztcbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQodW5kZWZpbmVkLCBcIlJFT1JERVJFRFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgb25BZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2sgPSAoXG4gICAgc2VuZGVyOiBWaXN1YWxpemVyQmFzZSxcbiAgICBvcHRpb25zOiBhbnlcbiAgKSA9PiB7XG4gICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uc0NvdW50Kys7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRRdWVzdGlvbnNDb3VudCA9PSB0aGlzLnF1ZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbnNDb3VudCA9IDA7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgb25TdGF0ZUNoYW5nZWRDYWxsYmFjayA9IChcbiAgICBzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLFxuICAgIG9wdGlvbnM6IGFueVxuICApID0+IHtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChzZW5kZXIucXVlc3Rpb24/Lm5hbWUsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIGEgdXNlciBzZWxlY3RzIGEgZGlmZmVyZW50IHZpc3VhbGl6ZXIgdHlwZSBmcm9tIHRoZSBUeXBlIGRyb3AtZG93biBtZW51LlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXJgXFxcbiAgICogQW4gb2JqZWN0IHRoYXQgY29udHJvbHMgYWx0ZW5hdGl2ZSB2aXN1YWxpemVycy5cbiAgICpcbiAgICogLSBgb3B0aW9ucy52aXN1YWxpemVyYDogYFZpc3VhbGl6ZXJCYXNlYFxcXG4gICAqIEFuIGFwcGxpZWQgdmlzdWFsaXplci5cbiAgICoqL1xuICBwdWJsaWMgb25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciwgYW55PigpO1xuXG4gIHByaXZhdGUgb25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkQ2FsbGJhY2sgPSAoXG4gICAgc2VuZGVyOiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlcixcbiAgICBvcHRpb25zOiB7IHZpc3VhbGl6ZXI6IFZpc3VhbGl6ZXJCYXNlIH1cbiAgKSA9PiB7XG4gICAgdGhpcy5vbkFsdGVybmF0aXZlVmlzdWFsaXplckNoYW5nZWQuZmlyZShzZW5kZXIsIG9wdGlvbnMpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBzaG93RWxlbWVudENvcmUoZWxlbWVudDogSVZpc3VhbGl6ZXJQYW5lbFJlbmRlcmVkRWxlbWVudCwgZWxlbWVudEluZGV4ID0gLTEpOiB2b2lkIHtcbiAgICBlbGVtZW50LmlzVmlzaWJsZSA9IHRydWU7XG4gICAgY29uc3QgcXVlc3Rpb25FbGVtZW50ID0gdGhpcy5yZW5kZXJQYW5lbEVsZW1lbnQoXG4gICAgICBlbGVtZW50LFxuICAgICAgdGhpcy5jb250ZW50Q29udGFpbmVyXG4gICAgKTtcbiAgICBsZXQgb3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICBpZihlbGVtZW50SW5kZXggPj0gMCkge1xuICAgICAgb3B0aW9ucyA9IHsgaW5kZXg6IGVsZW1lbnRJbmRleCB9O1xuICAgIH1cbiAgICB0aGlzLmxheW91dEVuZ2luZS5hZGQoW3F1ZXN0aW9uRWxlbWVudF0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNob3dFbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KGVsZW1lbnROYW1lKTtcbiAgICBjb25zdCBlbGVtZW50SW5kZXggPSB0aGlzLl9lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIHRoaXMuc2hvd0VsZW1lbnRDb3JlKGVsZW1lbnQsIGVsZW1lbnRJbmRleCk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKGVsZW1lbnQsIFwiQURERURcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGlkZUVsZW1lbnRDb3JlKGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIGlmICghIWVsZW1lbnQucmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLmxheW91dEVuZ2luZS5yZW1vdmUoW2VsZW1lbnQucmVuZGVyZWRFbGVtZW50XSk7XG4gICAgICB0aGlzLmNvbnRlbnRDb250YWluZXIucmVtb3ZlQ2hpbGQoZWxlbWVudC5yZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgZWxlbWVudC5yZW5kZXJlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhpZGVFbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KGVsZW1lbnROYW1lKTtcbiAgICB0aGlzLmhpZGVFbGVtZW50Q29yZShlbGVtZW50KTtcbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQoZWxlbWVudCwgXCJSRU1PVkVEXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIGFsbCBwYW5lbCBlbGVtZW50cy4gVXNlcnMgY2FuIHNlbGVjdCB0aGUgZWxlbWVudHMgdGhleSB3YW50IHRvIHNob3cgZnJvbSBhIGRyb3AtZG93biBtZW51LlxuICAgKiBAc2VlIHNob3dBbGxFbGVtZW50c1xuICAgKiBAc2VlIGFsbG93SGlkZVF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIGhpZGVBbGxFbGVtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBhZmZlY3RlZEVsZW1lbnRzID0gW107XG4gICAgdGhpcy5fZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmKGVsZW1lbnQuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuaGlkZUVsZW1lbnRDb3JlKGVsZW1lbnQpO1xuICAgICAgICBhZmZlY3RlZEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKHVuZGVmaW5lZCwgXCJSRU1PVkVEQUxMXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGFsbCBwYW5lbCBlbGVtZW50cyBpZiB0aGV5IGFyZSBoaWRkZW4gdG8gYSBkcm9wLWRvd24gbWVudS5cbiAgICogQHNlZSBoaWRlQWxsRWxlbWVudHNcbiAgICogQHNlZSBhbGxvd0hpZGVRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzaG93QWxsRWxlbWVudHMoKSB7XG4gICAgY29uc3QgYWZmZWN0ZWRFbGVtZW50cyA9IFtdO1xuICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZighZWxlbWVudC5pc1Zpc2libGUpIHtcbiAgICAgICAgdGhpcy5zaG93RWxlbWVudENvcmUoZWxlbWVudCk7XG4gICAgICAgIGFmZmVjdGVkRWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQodW5kZWZpbmVkLCBcIkFEREVEREFMTFwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYWtlRWxlbWVudFByaXZhdGUoZWxlbWVudDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmlzUHVibGljID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJpc1B1YmxpY1wiLCBmYWxzZSk7XG4gICAgdGhpcy5vblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrICYmXG4gICAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFrZUVsZW1lbnRQdWJsaWMoZWxlbWVudDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmlzUHVibGljID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImlzUHVibGljXCIsIHRydWUpO1xuICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayAmJlxuICAgICAgdGhpcy5vblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vdmVWaXNpYmxlRWxlbWVudChcbiAgICBmcm9tVmlzaWJsZUluZGV4OiBudW1iZXIsXG4gICAgdG9WaXNpYmxlSW5kZXg6IG51bWJlclxuICApIHtcbiAgICBsZXQgZnJvbUluZGV4LCB0b0luZGV4O1xuXG4gICAgbGV0IGZyb21WaXNpYmxlSW5kZXhFbGVtZW50ID0gdGhpcy52aXNpYmxlRWxlbWVudHNbZnJvbVZpc2libGVJbmRleF07XG4gICAgbGV0IHRvVmlzaWJsZUluZGV4RWxlbWVudCA9IHRoaXMudmlzaWJsZUVsZW1lbnRzW3RvVmlzaWJsZUluZGV4XTtcblxuICAgIGZyb21JbmRleCA9IHRoaXMuX2VsZW1lbnRzLmluZGV4T2YoZnJvbVZpc2libGVJbmRleEVsZW1lbnQpO1xuICAgIHRvSW5kZXggPSB0aGlzLl9lbGVtZW50cy5pbmRleE9mKHRvVmlzaWJsZUluZGV4RWxlbWVudCk7XG5cbiAgICB0aGlzLm1vdmVFbGVtZW50KGZyb21JbmRleCwgdG9JbmRleCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW92ZUVsZW1lbnQoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuX2VsZW1lbnRzLnNwbGljZShmcm9tSW5kZXgsIDEpO1xuICAgIHRoaXMuX2VsZW1lbnRzLnNwbGljZSh0b0luZGV4LCAwLCBlbGVtZW50c1swXSk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKGVsZW1lbnRzWzBdLCBcIk1PVkVEXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3I6IHN0cmluZykge1xuICAgIHN1cGVyLnNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3IpO1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCh2aXN1YWxpemVyID0+IHZpc3VhbGl6ZXIuYmFja2dyb3VuZENvbG9yID0gY29sb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZpc3VhbGl6ZXJzKHF1ZXN0aW9uczogQXJyYXk8UXVlc3Rpb24+KSB7XG4gICAgcXVlc3Rpb25zLmZvckVhY2goKHF1ZXN0aW9uKSA9PiB7XG4gICAgICBjb25zdCB2aXN1YWxpemVyID0gdGhpcy5jcmVhdGVWaXN1YWxpemVyKHF1ZXN0aW9uKTtcbiAgICAgIGlmKCF2aXN1YWxpemVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYWxsb3dIaWRlUXVlc3Rpb25zKSB7XG4gICAgICAgIHZpc3VhbGl6ZXIucmVnaXN0ZXJUb29sYmFySXRlbShcInJlbW92ZVF1ZXN0aW9uXCIsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oaWRlRWxlbWVudChxdWVzdGlvbi5uYW1lKSwgMCk7XG4gICAgICAgICAgfSwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVCdXR0b25cIikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZSkge1xuICAgICAgICB2aXN1YWxpemVyLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJtYWtlUHJpdmF0ZVB1YmxpY1wiLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChxdWVzdGlvbi5uYW1lKTtcblxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gZWxlbWVudC5pc1B1YmxpYyA/IFwiZmlyc3RcIiA6IFwic2Vjb25kXCI7XG5cbiAgICAgICAgICBjb25zdCBwYXRoTWFrZVByaXZhdGVTdmcgPSBcIm1ha2Vwcml2YXRlXCI7XG4gICAgICAgICAgY29uc3QgcGF0aE1ha2VQdWJsaWNTdmcgPSBcIm1ha2VwdWJsaWNcIjtcbiAgICAgICAgICBjb25zdCBtYWtlUHJpdmF0ZVRpdGxlID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1ha2VQcml2YXRlQnV0dG9uXCIpO1xuICAgICAgICAgIGNvbnN0IG1ha2VQdWJsaWNUaXRsZSA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYWtlUHVibGljQnV0dG9uXCIpO1xuICAgICAgICAgIGNvbnN0IGRvUHJpdmF0ZSA9IChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5tYWtlRWxlbWVudFByaXZhdGUoZWxlbWVudCksIDApO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZG9QdWJsaWMgPSAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubWFrZUVsZW1lbnRQdWJsaWMoZWxlbWVudCksIDApO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU3ZnVG9nZ2xlQnV0dG9uKFxuICAgICAgICAgICAgcGF0aE1ha2VQdWJsaWNTdmcsXG4gICAgICAgICAgICBwYXRoTWFrZVByaXZhdGVTdmcsXG4gICAgICAgICAgICBtYWtlUHJpdmF0ZVRpdGxlLFxuICAgICAgICAgICAgbWFrZVB1YmxpY1RpdGxlLFxuICAgICAgICAgICAgZG9QdWJsaWMsXG4gICAgICAgICAgICBkb1ByaXZhdGUsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodmlzdWFsaXplci5zdXBwb3J0U2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uID0gPElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbj4oXG4gICAgICAgICAgKDxhbnk+dmlzdWFsaXplcilcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGZpbHRlckluZm8gPSBuZXcgRmlsdGVySW5mbyh2aXN1YWxpemVyV2l0aFNlbGVjdGlvbik7XG5cbiAgICAgICAgdmlzdWFsaXplci5yZWdpc3RlclRvb2xiYXJJdGVtKFwicXVlc3Rpb25GaWx0ZXJJbmZvXCIsICgpID0+IHtcbiAgICAgICAgICBmaWx0ZXJJbmZvLnVwZGF0ZSh2aXN1YWxpemVyV2l0aFNlbGVjdGlvbi5zZWxlY3Rpb24pO1xuICAgICAgICAgIHJldHVybiBmaWx0ZXJJbmZvLmh0bWxFbGVtZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICB2aXN1YWxpemVyV2l0aFNlbGVjdGlvbi5vbkRhdGFJdGVtU2VsZWN0ZWQgPSAoXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZTogYW55LFxuICAgICAgICAgIHNlbGVjdGVkVGV4dDogc3RyaW5nXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGZpbHRlckluZm8udXBkYXRlKHsgdmFsdWU6IHNlbGVjdGVkVmFsdWUsIHRleHQ6IHNlbGVjdGVkVGV4dCB9KTtcbiAgICAgICAgICB0aGlzLnNldEZpbHRlcihxdWVzdGlvbi5uYW1lLCBzZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmlzdWFsaXplci5vblVwZGF0ZSA9ICgpID0+IHRoaXMubGF5b3V0KCk7XG4gICAgICB2aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5vblN0YXRlQ2hhbmdlZC5hZGQodGhpcy5vblN0YXRlQ2hhbmdlZENhbGxiYWNrKTtcblxuICAgICAgaWYgKHZpc3VhbGl6ZXIgaW5zdGFuY2VvZiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlcikge1xuICAgICAgICB2aXN1YWxpemVyLm9uVmlzdWFsaXplckNoYW5nZWQuYWRkKHRoaXMub25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpc3VhbGl6ZXJzLnB1c2godmlzdWFsaXplcik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaXN1YWxpemVycygpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIFNlbGVjdEJhc2UpIHtcbiAgICAgICAgdmlzdWFsaXplci5vbkRhdGFJdGVtU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyKSB7XG4gICAgICAgIHZpc3VhbGl6ZXIub25WaXN1YWxpemVyQ2hhbmdlZC5yZW1vdmUodGhpcy5vbkFsdGVybmF0aXZlVmlzdWFsaXplckNoYW5nZWRDYWxsYmFjayk7XG4gICAgICB9XG4gICAgICB2aXN1YWxpemVyLm9uU3RhdGVDaGFuZ2VkLnJlbW92ZSh0aGlzLm9uU3RhdGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrKTtcbiAgICAgIHZpc3VhbGl6ZXIuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIHRoaXMudmlzdWFsaXplcnMgPSBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRMb2NhbGUobmV3TG9jYWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICAodGhpcy5xdWVzdGlvbnMgfHwgW10pLmZvckVhY2goKHF1ZXN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHF1ZXN0aW9uLm5hbWUpO1xuICAgICAgaWYgKCEhZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmRpc3BsYXlOYW1lID0gdGhpcy5wcm9jZXNzVGV4dChxdWVzdGlvbi50aXRsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKHYgPT4ge1xuICAgICAgdi5vcHRpb25zLnNlcmllc0xhYmVscyA9IHRoaXMub3B0aW9ucy5zZXJpZXNMYWJlbHM7XG4gICAgICB2LmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvY2FsZVwiLCBuZXdMb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFtgYWxsb3dEeW5hbWljTGF5b3V0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zI2FsbG93RHluYW1pY0xheW91dCkgcHJvcGVydHkgdmFsdWUgb2YgdGhlIFtgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dEeW5hbWljTGF5b3V0KCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0R5bmFtaWNMYXlvdXQgPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFtgYWxsb3dEcmFnRHJvcGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0RyYWdEcm9wKSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgW2BJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucykgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0RyYWdEcm9wKCkge1xuICAgIGlmKFN1cnZleUNvcmUuSXNUb3VjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93RHJhZ0Ryb3AgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93RHJhZ0Ryb3AgPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFtgYWxsb3dIaWRlUXVlc3Rpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zI2FsbG93SGlkZVF1ZXN0aW9ucykgcHJvcGVydHkgdmFsdWUgb2YgdGhlIFtgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dIaWRlUXVlc3Rpb25zKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dIaWRlUXVlc3Rpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0hpZGVRdWVzdGlvbnMgPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBhbGxvd01ha2VRdWVzdGlvbnNQcml2YXRlKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2xheW91dEVuZ2luZTogTGF5b3V0RW5naW5lO1xuICAvKipcbiAgICogUmV0dXJucyBhIFtgTGF5b3V0RW5naW5lYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2xheW91dGVuZ2luZSkgaW5zdGFuY2UgdXNlZCB0byBhcnJhbmdlIHZpc3VhbGl6YXRpb24gaXRlbXMgb24gYFZpc3VhbGl6YXRpb25QYW5lbGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxheW91dEVuZ2luZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5b3V0RW5naW5lO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRWxlbWVudHMocXVlc3Rpb25zOiBhbnlbXSk6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50W10ge1xuICAgIHJldHVybiAocXVlc3Rpb25zIHx8IFtdKS5tYXAoKHF1ZXN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogdGhpcy5wcm9jZXNzVGV4dChxdWVzdGlvbi50aXRsZSksXG4gICAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgaXNQdWJsaWM6IHRydWUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgW2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudCkgb2JqZWN0cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHZpc3VhbGl6YXRpb24gaXRlbXMuXG4gICAqIEBwYXJhbSBxdWVzdGlvbk5hbWVzIFF1ZXN0aW9uIFtuYW1lc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI25hbWUpLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciB0byBnZXQgYW4gYXJyYXkgb2YgYWxsIHZpc3VhbGl6YXRpb24gaXRlbXMuXG4gICAqIEBzZWUgdmlzaWJsZUVsZW1lbnRzXG4gICAqIEBzZWUgaGlkZGVuRWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50cyhxdWVzdGlvbk5hbWVzPzogQXJyYXk8c3RyaW5nPik6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50W10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICh0aGlzLl9lbGVtZW50cyB8fCBbXSkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYoIXF1ZXN0aW9uTmFtZXMgfHwgcXVlc3Rpb25OYW1lcy5pbmRleE9mKGVsZW1lbnQubmFtZSkgIT09IC0xKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgZGlzcGxheU5hbWU6IGVsZW1lbnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgaXNWaXNpYmxlOiBlbGVtZW50LmlzVmlzaWJsZSxcbiAgICAgICAgICBpc1B1YmxpYzogZWxlbWVudC5pc1B1YmxpYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpIG9iamVjdHMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50bHkgdmlzaWJsZSB2aXN1YWxpemF0aW9uIGl0ZW1zLlxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCB0byBkaXNhbGxvdyB1c2VycyB0byBoaWRlIHZpc3VhbGl6YXRpb24gaXRlbXMsIHNldCB0aGUgW2BhbGxvd0hpZGVRdWVzdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dIaWRlUXVlc3Rpb25zKSBwcm9wZXJ0eSB0byBgZmFsc2VgLlxuICAgKiBAc2VlIGhpZGRlbkVsZW1lbnRzXG4gICAqIEBzZWUgZ2V0RWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoKGVsOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkgPT4gZWwuaXNWaXNpYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpIG9iamVjdHMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50bHkgaGlkZGVuIHZpc3VhbGl6YXRpb24gaXRlbXMuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIGRpc2FsbG93IHVzZXJzIHRvIGhpZGUgdmlzdWFsaXphdGlvbiBpdGVtcywgc2V0IHRoZSBbYGFsbG93SGlkZVF1ZXN0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0hpZGVRdWVzdGlvbnMpIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqIEBzZWUgdmlzaWJsZUVsZW1lbnRzXG4gICAqIEBzZWUgZ2V0RWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZGVuRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcihcbiAgICAgIChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+ICFlbC5pc1Zpc2libGVcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBwdWJsaWNFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+IGVsLmlzUHVibGljKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJpdmF0ZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoKGVsOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkgPT4gIWVsLmlzUHVibGljKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbG9jYWxlcygpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnN1cnZleSkgcmV0dXJuIHRoaXMub3B0aW9ucy5zdXJ2ZXkuZ2V0VXNlZExvY2FsZXMoKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHZpc3VhbGl6YXRpb24gaXRlbSB3aXRoIGEgc3BlY2lmaWVkIHF1ZXN0aW9uIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gW25hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNuYW1lKS5cbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50KHF1ZXN0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcigoZWwpID0+IGVsLm5hbWUgPT09IHF1ZXN0aW9uTmFtZSlbMF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFt2aXN1YWxpemVyXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXplcmJhc2UpIHRoYXQgdmlzdWFsaXplcyBhIHNwZWNpZmllZCBzdXJ2ZXkgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSBxdWVzdGlvbk5hbWUgQSBxdWVzdGlvbiBbbmFtZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI25hbWUpLlxuICAgKi9cbiAgcHVibGljIGdldFZpc3VhbGl6ZXIocXVlc3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy52aXN1YWxpemVycy5maWx0ZXIoKHYpID0+IHYucXVlc3Rpb24ubmFtZSA9PT0gcXVlc3Rpb25OYW1lKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gVXNlIFtgb25FbGVtZW50U2hvd25gXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsI29uRWxlbWVudFNob3duKSwgW2BvbkVsZW1lbnRIaWRkZW5gXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsI29uRWxlbWVudEhpZGRlbiksIG9yIFtgb25FbGVtZW50TW92ZWRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsI29uRWxlbWVudE1vdmVkKSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIG9uVmlzaWJsZUVsZW1lbnRzQ2hhbmdlZCA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemF0aW9uUGFuZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBWaXN1YWxpemF0aW9uUGFuZWwsXG4gICAgYW55XG4gID4oKTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiB1c2VycyBbc2hvdyBhIHZpc3VhbGl6YXRpb24gaXRlbV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zI2FsbG93SGlkZVF1ZXN0aW9ucykuXG4gICAqXG4gICAqIFBhcmFtZXRlcnM6XG4gICAqXG4gICAqIC0gYHNlbmRlcmA6IFtgVmlzdWFsaXphdGlvblBhbmVsYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbClcXFxuICAgKiBBIGBWaXN1YWxpemF0aW9uUGFuZWxgIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5lbGVtZW50c2A6IEFycmF5XFw8W2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudClcXD5cXFxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhbGwgdmlzdWFsaXphdGlvbiBpdGVtcyByZW5kZXJlZCBieSB0aGlzIGBWaXN1YWxpemF0aW9uUGFuZWxgLlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmVsZW1lbnRgOiBbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KVxcXG4gICAqIEEgdmlzdWFsaXphdGlvbiBpdGVtIHRoYXQgaGFzIGJlZW4gc2hvd24uXG4gICAqL1xuICBwdWJsaWMgb25FbGVtZW50U2hvd24gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXphdGlvblBhbmVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXphdGlvblBhbmVsLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gdXNlcnMgW2hpZGUgYSB2aXN1YWxpemF0aW9uIGl0ZW1dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0hpZGVRdWVzdGlvbnMpLlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpXFxcbiAgICogQSBgVmlzdWFsaXphdGlvblBhbmVsYCB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudHNgOiBBcnJheVxcPFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFw+XFxcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgYWxsIHZpc3VhbGl6YXRpb24gaXRlbXMgcmVuZGVyZWQgYnkgdGhpcyBgVmlzdWFsaXphdGlvblBhbmVsYC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5lbGVtZW50YDogW2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudClcXFxuICAgKiBBIHZpc3VhbGl6YXRpb24gaXRlbSB0aGF0IGhhcyBiZWVuIGhpZGRlbi5cbiAgICovXG4gIHB1YmxpYyBvbkVsZW1lbnRIaWRkZW4gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXphdGlvblBhbmVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXphdGlvblBhbmVsLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gdXNlcnMgW21vdmUgYSB2aXN1YWxpemF0aW9uIGl0ZW1dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpLlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpXFxcbiAgICogQSBgVmlzdWFsaXphdGlvblBhbmVsYCB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudHNgOiBBcnJheVxcPFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFw+XFxcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgYWxsIHZpc3VhbGl6YXRpb24gaXRlbXMgcmVuZGVyZWQgYnkgdGhpcyBgVmlzdWFsaXphdGlvblBhbmVsYC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5lbGVtZW50YDogW2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudClcXFxuICAgKiBBIHZpc3VhbGl6YXRpb24gaXRlbSB0aGF0IGhhcyBiZWVuIG1vdmVkLlxuICAgKi9cbiAgcHVibGljIG9uRWxlbWVudE1vdmVkID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIHByb3RlY3RlZCB2aXNpYmxlRWxlbWVudHNDaGFuZ2VkKFxuICAgIGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50LFxuICAgIHJlYXNvbjogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmIChyZWFzb24gPT09IFwiU0hPV05cIiAmJiAhdGhpcy5vbkVsZW1lbnRTaG93bi5pc0VtcHR5KSB7XG4gICAgICB0aGlzLm9uRWxlbWVudFNob3duLmZpcmUodGhpcywge1xuICAgICAgICBlbGVtZW50czogdGhpcy5fZWxlbWVudHMsXG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocmVhc29uID09PSBcIlJFTU9WRURcIiAmJiAhdGhpcy5vbkVsZW1lbnRIaWRkZW4uaXNFbXB0eSkge1xuICAgICAgdGhpcy5vbkVsZW1lbnRIaWRkZW4uZmlyZSh0aGlzLCB7XG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLl9lbGVtZW50cyxcbiAgICAgICAgZWxlbWVudDogZWxlbWVudFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChyZWFzb24gPT09IFwiTU9WRURcIiAmJiAhdGhpcy5vbkVsZW1lbnRNb3ZlZC5pc0VtcHR5KSB7XG4gICAgICB0aGlzLm9uRWxlbWVudE1vdmVkLmZpcmUodGhpcywge1xuICAgICAgICBlbGVtZW50czogdGhpcy5fZWxlbWVudHMsXG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5vblZpc2libGVFbGVtZW50c0NoYW5nZWQuaXNFbXB0eSkge1xuICAgICAgdGhpcy5vblZpc2libGVFbGVtZW50c0NoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLl9lbGVtZW50cyxcbiAgICAgICAgY2hhbmdlZDogZWxlbWVudCxcbiAgICAgICAgcmVhc29uOiByZWFzb24sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJ2aXNpYmxlRWxlbWVudHNcIiwgcmVhc29uKTtcbiAgICB0aGlzLmxheW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2s6IGFueTtcblxuICBwcm90ZWN0ZWQgcmVuZGVyUGFuZWxFbGVtZW50KFxuICAgIGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQsXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuICApIHtcbiAgICBjb25zdCB2aXN1YWxpemVyID0gdGhpcy5nZXRWaXN1YWxpemVyKGVsZW1lbnQubmFtZSk7XG4gICAgaWYoIXZpc3VhbGl6ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVzdGlvbkVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHF1ZXN0aW9uRWxlbWVudC5kYXRhc2V0LnF1ZXN0aW9uID0gZWxlbWVudC5uYW1lO1xuXG4gICAgISFjb250YWluZXIgJiYgY29udGFpbmVyLmFwcGVuZENoaWxkKHF1ZXN0aW9uRWxlbWVudCk7XG5cbiAgICBjb25zdCBxdWVzdGlvbkNvbnRlbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnN0IHRpdGxlRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJoM1wiKTtcbiAgICBjb25zdCB2aXp1YWxpemVyRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0ID0gZWxlbWVudC5kaXNwbGF5TmFtZTtcblxuICAgIHF1ZXN0aW9uRWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLmFsbG93RHluYW1pY0xheW91dFxuICAgICAgPyBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWUgKyBcIiBcIiArIHF1ZXN0aW9uTGF5b3V0ZWRFbGVtZW50Q2xhc3NOYW1lXG4gICAgICA6IHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZTtcbiAgICB0aXRsZUVsZW1lbnQuY2xhc3NOYW1lID0gcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICsgXCJfX3RpdGxlXCI7XG4gICAgaWYgKHRoaXMuYWxsb3dEeW5hbWljTGF5b3V0ICYmIHRoaXMuYWxsb3dEcmFnRHJvcCkge1xuICAgICAgdGl0bGVFbGVtZW50LmNsYXNzTmFtZSA9XG4gICAgICAgIHRpdGxlRWxlbWVudC5jbGFzc05hbWUgK1xuICAgICAgICBcIiBcIiArXG4gICAgICAgIHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZSArXG4gICAgICAgIFwiX190aXRsZS0tZHJhZ2dhYmxlXCI7XG4gICAgfVxuICAgIHF1ZXN0aW9uQ29udGVudC5jbGFzc05hbWUgPSBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWUgKyBcIl9fY29udGVudFwiO1xuICAgIHF1ZXN0aW9uQ29udGVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcblxuICAgIHF1ZXN0aW9uQ29udGVudC5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xuICAgIHF1ZXN0aW9uQ29udGVudC5hcHBlbmRDaGlsZCh2aXp1YWxpemVyRWxlbWVudCk7XG4gICAgcXVlc3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKHF1ZXN0aW9uQ29udGVudCk7XG5cbiAgICB2aXN1YWxpemVyLnJlbmRlcih2aXp1YWxpemVyRWxlbWVudCk7XG5cbiAgICBlbGVtZW50LnJlbmRlcmVkRWxlbWVudCA9IHF1ZXN0aW9uRWxlbWVudDtcbiAgICByZXR1cm4gcXVlc3Rpb25FbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlclRvb2xiYXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgKz0gXCIgc2EtcGFuZWxfX2hlYWRlclwiO1xuICAgIHN1cGVyLnJlbmRlclRvb2xiYXIoY29udGFpbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuY2xhc3NOYW1lICs9IFwiIHNhLXBhbmVsX19jb250ZW50IHNhLWdyaWRcIjtcblxuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGxldCBxdWVzdGlvbkVsZW1lbnQgPSB0aGlzLnJlbmRlclBhbmVsRWxlbWVudChlbGVtZW50LCBjb250YWluZXIpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5sYXlvdXRFbmdpbmUuc3RhcnQoY29udGFpbmVyKTtcbiAgICAvLyAhIXdpbmRvdyAmJiB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgVUlFdmVudChcInJlc2l6ZVwiKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMubGF5b3V0RW5naW5lLnN0b3AoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhd3MgdGhlIGBWaXN1YWxpemF0aW9uUGFuZWxgIGFuZCBhbGwgaXRzIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpIHtcbiAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveVRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVyVG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgIH1cbiAgICBzdXBlci5yZWZyZXNoKCk7XG4gIH1cblxuICBwdWJsaWMgbGF5b3V0KCkge1xuICAgIHRoaXMubGF5b3V0RW5naW5lLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgdmlzdWFsaXplZCBkYXRhIGJhc2VkIG9uIGEgc3BlY2lmaWVkIHF1ZXN0aW9uIG5hbWUgYW5kIHZhbHVlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgY2xpY2tzIGEgY2hhcnQgcG9pbnQuXG4gICAqIEBwYXJhbSBxdWVzdGlvbk5hbWUgQSBxdWVzdGlvbiBbbmFtZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI25hbWUpLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRWYWx1ZVxuICAgKiBAc2VlIElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zLmFsbG93U2VsZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgc2V0RmlsdGVyKHF1ZXN0aW9uTmFtZTogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmRhdGFQcm92aWRlci5zZXRGaWx0ZXIocXVlc3Rpb25OYW1lLCBzZWxlY3RlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBJU3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgZWxlbWVudHM6IFtdLmNvbmNhdCh0aGlzLl9lbGVtZW50cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgIGNvbnN0IHZpc3VhbGl6ZXIgPSB0aGlzLmdldFZpc3VhbGl6ZXIoZWxlbWVudC5uYW1lKTtcbiAgICAgICAgY29uc3QgZWxlbWVudFN0YXRlID0geyAuLi5lbGVtZW50LCAuLi52aXN1YWxpemVyPy5nZXRTdGF0ZSgpIH07XG4gICAgICAgIGlmIChlbGVtZW50U3RhdGUucmVuZGVyZWRFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWxldGUgZWxlbWVudFN0YXRlLnJlbmRlcmVkRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFN0YXRlO1xuICAgICAgfSkpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0YXRlIG9mIGBWaXN1YWxpemF0aW9uUGFuZWxgLiBJbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlzdWFsaXplZCBlbGVtZW50cyBhbmQgY3VycmVudCBsb2NhbGUuXG4gICAqIEBzZWUgb25TdGF0ZUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogSVN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdGUobmV3U3RhdGU6IElTdGF0ZSkge1xuICAgIGlmICghbmV3U3RhdGUpIHJldHVybjtcbiAgICB0aGlzLl9zZXR0aW5nU3RhdGUgPSB0cnVlO1xuICAgIHRyeSB7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld1N0YXRlLmVsZW1lbnRzKSkge1xuICAgICAgICBjb25zdCBxdWVzdGlvbk5hbWVzID0gdGhpcy5xdWVzdGlvbnMubWFwKHEgPT4gcS5uYW1lKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQobmV3U3RhdGUuZWxlbWVudHMuZmlsdGVyKGUgPT4gKHF1ZXN0aW9uTmFtZXMuaW5kZXhPZihlLm5hbWUpICE9PSAtMSkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBuZXdTdGF0ZS5sb2NhbGUgIT09IFwidW5kZWZpbmVkXCIpIHRoaXMuc2V0TG9jYWxlKG5ld1N0YXRlLmxvY2FsZSk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudFN0YXRlID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuZ2V0VmlzdWFsaXplcihlbGVtZW50U3RhdGUubmFtZSk7XG4gICAgICAgIGlmICh2aXN1YWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2aXN1YWxpemVyLnNldFN0YXRlKGVsZW1lbnRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3NldHRpbmdTdGF0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnMoKTogSVBlcm1pc3Npb25bXSB7XG4gICAgcmV0dXJuIDxhbnk+dGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgIGlzUHVibGljOiBlbGVtZW50LmlzUHVibGljLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBJUGVybWlzc2lvbltdKSB7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnRzID0gdGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICBwZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uLm5hbWUgPT09IGVsZW1lbnQubmFtZSlcbiAgICAgICAgICBlbGVtZW50LmlzUHVibGljID0gcGVybWlzc2lvbi5pc1B1YmxpYztcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyAuLi5lbGVtZW50IH07XG4gICAgfSk7XG4gICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQodXBkYXRlZEVsZW1lbnRzKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuZGVzdHJveVZpc3VhbGl6ZXJzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbCB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsIElRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvblBhbmVsRHluYW1pYyBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHJvdGVjdGVkIF9wYW5lbFZpc3VhbGl6ZXI6IFZpc3VhbGl6YXRpb25QYW5lbCA9IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInBhbmVsRHluYW1pY1wiKTtcbiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID0gZmFsc2U7XG4gICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChcbiAgICAgIHRoaXMuZ2V0UXVlc3Rpb25zKCksXG4gICAgICBbXSxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrKTtcbiAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgb25BZnRlclJlbmRlclBhbmVsQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJwYW5lbER5bmFtaWNcIjtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFuZWxWaXN1YWxpemVyRGF0YSgpIHtcbiAgICBsZXQgcGFuZWxEYXRhOiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGRhdGFJdGVtKSA9PiB7XG4gICAgICBpZiAoZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhbmVsRGF0YSA9IHBhbmVsRGF0YS5jb25jYXQoZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLnVwZGF0ZURhdGEocGFuZWxEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgdGhpcy51cGRhdGVQYW5lbFZpc3VhbGl6ZXJEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVBhbmVsVmlzdWFsaXplckRhdGEoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKTogSVF1ZXN0aW9uW10ge1xuICAgIGNvbnN0IHBhbmVsZHluYW1pYzogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICByZXR1cm4gcGFuZWxkeW5hbWljLnRlbXBsYXRlLnF1ZXN0aW9ucztcbiAgfVxuXG4gIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIuY2xlYXIoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLnJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXG4gIFwicGFuZWxkeW5hbWljXCIsXG4gIFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWNcbik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25Db21tZW50TW9kZWwsIHNldHRpbmdzIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJRGF0YUluZm8sIERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckZhY3RvcnkgfSBmcm9tIFwiLi92aXN1YWxpemVyRmFjdG9yeVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxudmFyIHN0eWxlcyA9IHJlcXVpcmUoXCIuL3Zpc3VhbGl6ZXJCYXNlLnNjc3NcIik7XG5cbi8qKlxuICogQSBiYXNlIG9iamVjdCBmb3IgYWxsIHZpc3VhbGl6ZXJzLiBVc2UgaXQgdG8gaW1wbGVtZW50IGEgY3VzdG9tIHZpc3VhbGl6ZXIuXG4gKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVyczpcbiAqXG4gKiAtIGBxdWVzdGlvbmA6IFtgUXVlc3Rpb25gXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24pXFxcbiAqIEEgc3VydmV5IHF1ZXN0aW9uIHRvIHZpc3VhbGl6ZS5cbiAqIC0gYGRhdGFgOiBgQXJyYXk8YW55PmBcXFxuICogU3VydmV5IHJlc3VsdHMuXG4gKiAtIGBvcHRpb25zYFxcXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAtIGBkYXRhUHJvdmlkZXJgOiBgRGF0YVByb3ZpZGVyYFxcXG4gKiAgICBBIGRhdGEgcHJvdmlkZXIgZm9yIHRoaXMgdmlzdWFsaXplci5cbiAqICAgIC0gYHJlbmRlckNvbnRlbnRgOiBgKGNvbnRlbnRDb250YWluZXI6IEhUTUxFbGVtZW50LCB2aXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSkgPT4gdm9pZGBcXFxuICogICAgQSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIHZpc3VhbGl6ZXIncyBIVE1MIG1hcmt1cC4gQXBwZW5kIHRoZSBtYXJrdXAgdG8gYGNvbnRlbnRDb250YWluZXJgLlxuICogICAgLSBgc3VydmV5YDogW2BTdXJ2ZXlNb2RlbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXktZGF0YS1tb2RlbClcXFxuICogICAgUGFzcyBhIGBTdXJ2ZXlNb2RlbGAgaW5zdGFuY2UgaWYgeW91IHdhbnQgdG8gdXNlIGxvY2FsZXMgZnJvbSB0aGUgc3VydmV5IEpTT04gc2NoZW1hLlxuICogICAgLSBgc2VyaWVzVmFsdWVzYDogYEFycmF5PHN0cmluZz5gXFxcbiAqICAgIFNlcmllcyB2YWx1ZXMgdXNlZCB0byBncm91cCBkYXRhLlxuICogICAgLSBgc2VyaWVzTGFiZWxzYDogYEFycmF5PHN0cmluZz5gXFxcbiAqICAgIFNlcmllcyBsYWJlbHMgdG8gZGlzcGxheS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0LCBgc2VyaWVzVmFsdWVzYCBhcmUgdXNlZCBhcyBsYWJlbHMuXG4gKiAtIGB0eXBlYDogYHN0cmluZ2BcXFxuICogKihPcHRpb25hbCkqIFRoZSB2aXN1YWxpemVyJ3MgdHlwZS5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy9ob3ctdG8tcGxvdC1zdXJ2ZXktZGF0YS1pbi1jdXN0b20tYmFyLWNoYXJ0LyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFZpc3VhbGl6ZXJCYXNlIGltcGxlbWVudHMgSURhdGFJbmZvIHtcbiAgcHVibGljIHN0YXRpYyBzdXBwcmVzc1Zpc3VhbGl6ZXJTdHViUmVuZGVyaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfc2hvd1Rvb2xiYXIgPSB0cnVlO1xuICBwcml2YXRlIF9mb290ZXJWaXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZGF0YVByb3ZpZGVyOiBEYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBsYWJlbFRydW5jYXRlTGVuZ3RoOiBudW1iZXIgPSAyNztcbiAgcHJvdGVjdGVkIHJlbmRlclJlc3VsdDogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCB0b29sYmFyQ29udGFpbmVyOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGhlYWRlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBjb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGZvb3RlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfc3VwcG9ydFNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBwdWJsaWMgc3RhdGljIG90aGVyQ29tbWVudFF1ZXN0aW9uVHlwZSA9IFwiY29tbWVudFwiOyAvLyBUT0RPOiBtYWtlIGl0IGNvbmZpZ3VyZWFibGUgLSBhbGxvdyBjaG9vc2Ugd2hhdCBraW5kIG9mIHF1ZXN0aW9uL3Zpc3VhbGl6ZXIgd2lsbCBiZSB1c2VkIGZvciBjb21tZW50cy9vdGhlcnNcbiAgcHVibGljIHN0YXRpYyBvdGhlckNvbW1lbnRDb2xsYXBzZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCBhZnRlciB0aGUgdmlzdWFsaXplcidzIGNvbnRlbnQgaXMgcmVuZGVyZWQuXG4gICAqXG4gICAqIFBhcmFtZXRlcnM6XG4gICAqXG4gICAqIC0gYHNlbmRlcmA6IGBWaXN1YWxpemVyQmFzZWBcXFxuICAgKiBBIGBWaXN1YWxpemVyQmFzZWAgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmh0bWxFbGVtZW50YDogYEhUTUxFbGVtZW50YFxcXG4gICAqIEEgcGFnZSBlbGVtZW50IHdpdGggdGhlIHZpc3VhbGl6ZXIncyBjb250ZW50LlxuICAgKiBAc2VlIHJlbmRlclxuICAgKiBAc2VlIHJlZnJlc2hcbiAgICoqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlcjogRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXplckJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFZpc3VhbGl6ZXJCYXNlLFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXplckJhc2UsIGFueT4oKTtcblxuICBwcm90ZWN0ZWQgYWZ0ZXJSZW5kZXIoY29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLm9uQWZ0ZXJSZW5kZXIuZmlyZSh0aGlzLCB7IGh0bWxFbGVtZW50OiBjb250ZW50Q29udGFpbmVyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIGFmdGVyIGEgbmV3IGxvY2FsZSBpcyBzZXQuXG4gICAqXG4gICAqIFBhcmFtZXRlcnM6XG4gICAqXG4gICAqIC0gYHNlbmRlcmA6IGBWaXN1YWxpemVyQmFzZWBcXFxuICAgKiBBIGBWaXN1YWxpemVyQmFzZWAgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmxvY2FsZWA6IGBzdHJpbmdgXFxcbiAgICogVGhlIGluZGVudGlmaWVyIG9mIGEgbmV3IGxvY2FsZSAoZm9yIGV4YW1wbGUsIFwiZW5cIikuXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgb25Mb2NhbGVDaGFuZ2VkID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiB7IGxvY2FsZTogc3RyaW5nIH0pID0+IGFueSxcbiAgICBWaXN1YWxpemVyQmFzZSxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8vIHB1YmxpYyBvblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudDxcbiAgLy8gICAoc2VuZGVyOiBWaXN1YWxpemF0aW9uUGFuZWwsIHN0YXRlOiBJU3RhdGUpID0+IGFueSxcbiAgLy8gICBWaXN1YWxpemF0aW9uUGFuZWwsXG4gIC8vICAgYW55XG4gIC8vID4oKTtcbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gdGhlIHZpc3VhbGl6ZXIncyBzdGF0ZSBoYXMgY2hhbmdlZC5cbiAgICpcbiAgICogVGhlIHN0YXRlIGluY2x1ZGVzIHNlbGVjdGVkIGNoYXJ0IHR5cGVzLCBjaGFydCBsYXlvdXQsIHNvcnRpbmcsIGZpbHRlcmluZywgYW5kIG90aGVyIGN1c3RvbWl6YXRpb25zIHRoYXQgYSB1c2VyIGhhcyBtYWRlIHdoaWxlIHVzaW5nIHRoZSBkYXNoYm9hcmQuIEhhbmRsZSB0aGUgYG9uU3RhdGVDaGFuZ2VkYCBldmVudCB0byBzYXZlIHRoZXNlIGN1c3RvbWl6YXRpb25zLCBmb3IgZXhhbXBsZSwgaW4gYGxvY2FsU3RvcmFnZWAgYW5kIHJlc3RvcmUgdGhlbSB3aGVuIHRoZSB1c2VyIHJlbG9hZHMgdGhlIHBhZ2UuXG4gICAqXG4gICAqIFBhcmFtZXRlcnM6XG4gICAqXG4gICAqIC0gYHNlbmRlcmA6IGBWaXN1YWxpemVyQmFzZWBcXFxuICAgKiBBIGBWaXN1YWxpemVyQmFzZWAgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBzdGF0ZWA6IGBhbnlgXFxcbiAgICogQSBuZXcgc3RhdGUgb2YgdGhlIHZpc3VhbGl6ZXIuIEluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aXN1YWxpemVkIGVsZW1lbnRzIGFuZCBjdXJyZW50IGxvY2FsZS5cbiAgICpcbiAgICogW1ZpZXcgRGVtb10oL2Rhc2hib2FyZC9leGFtcGxlcy9zYXZlLWRhc2hib2FyZC1zdGF0ZS10by1sb2NhbC1zdG9yYWdlLyAobGlua1N0eWxlKSlcbiAgICogQHNlZSBnZXRTdGF0ZVxuICAgKiBAc2VlIHNldFN0YXRlXG4gICAqL1xuICBwdWJsaWMgb25TdGF0ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBWaXN1YWxpemVyQmFzZSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6ZXJCYXNlLCBhbnk+KCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZih0aGlzLl9zZXR0aW5nU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZC5maXJlKHRoaXMsIHRoaXMuZ2V0U3RhdGUoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9vbGJhckl0ZW1DcmVhdG9yczogeyBbbmFtZTogc3RyaW5nXTogKHRvb2xiYXI/OiBIVE1MRGl2RWxlbWVudCkgPT4gSFRNTEVsZW1lbnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBwdWJsaWMgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgcHJpdmF0ZSBfdHlwZT86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBvcHRpb25zLmRhdGFQcm92aWRlciB8fCBuZXcgRGF0YVByb3ZpZGVyKGRhdGEpO1xuICAgIHRoaXMuX2RhdGFQcm92aWRlci5vbkRhdGFDaGFuZ2VkLmFkZCgoKSA9PiB0aGlzLm9uRGF0YUNoYW5nZWQoKSk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubGFiZWxUcnVuY2F0ZUxlbmd0aCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5sYWJlbFRydW5jYXRlTGVuZ3RoID0gb3B0aW9ucy5sYWJlbFRydW5jYXRlTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb25PcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdGhpcy5xdWVzdGlvbi5uYW1lXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgYSB2aXN1YWxpemVkIHF1ZXN0aW9uLlxuICAgKi9cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmFsdWVOYW1lIHx8IHRoaXMucXVlc3Rpb24ubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdmlzdWFsaXplciBkaXNwbGF5cyBhIGhlYWRlci4gVGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgd2hlbiBhIHZpc3VhbGl6ZWQgcXVlc3Rpb24gaGFzIGEgY29ycmVjdCBhbnN3ZXIuXG4gICAqIEBzZWUgaGFzRm9vdGVyXG4gICAqL1xuICBnZXQgaGFzSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMuc2hvd0NvcnJlY3RBbnN3ZXJzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb24gJiYgISF0aGlzLnF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpc3VhbGl6ZXIgZGlzcGxheXMgYSBmb290ZXIuIFRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHdoZW4gYSB2aXN1YWxpemVkIHF1ZXN0aW9uIGhhcyBhIGNvbW1lbnQuXG4gICAqIEBzZWUgaGFzSGVhZGVyXG4gICAqL1xuICBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMucXVlc3Rpb24gJiYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCB8fCB0aGlzLnF1ZXN0aW9uLmhhc090aGVyKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVmlzdWFsaXplcjxUID0gVmlzdWFsaXplckJhc2U+KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFQge1xuICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5kYXRhUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcjtcbiAgICB9XG4gICAgcmV0dXJuIFZpc3VhbGl6ZXJGYWN0b3J5LmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24sIHRoaXMuZGF0YSwgb3B0aW9ucykgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgZm9vdGVyIHZpc3VhbGl6ZXIuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGZvb3RlciBpcyBhYnNlbnQuXG4gICAqIEBzZWUgaGFzRm9vdGVyXG4gICAqL1xuICBnZXQgZm9vdGVyVmlzdWFsaXplcigpIHtcbiAgICBpZiAoIXRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uLm5hbWUgKyAoc2V0dGluZ3MgfHwge30pLmNvbW1lbnRQcmVmaXhcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi50aXRsZSA9IHRoaXMucHJvY2Vzc1RleHQodGhpcy5xdWVzdGlvbi50aXRsZSk7XG5cbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIgPSB0aGlzLmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24pO1xuICAgICAgaWYoISF0aGlzLl9mb290ZXJWaXN1YWxpemVyKSB7XG4gICAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIub25VcGRhdGUgPSAoKSA9PiB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb290ZXJWaXN1YWxpemVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHVzZXJzIGNhbiBzZWxlY3Qgc2VyaWVzIHBvaW50cyB0byBjcm9zcy1maWx0ZXIgY2hhcnRzLiBUbyBhbGxvdyBvciBkaXNhbGxvdyBzZWxlY3Rpb24sIHNldCB0aGUgW2BhbGxvd1NlbGVjdGlvbmBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd1NlbGVjdGlvbikgcHJvcGVydHkgb2YgdGhlIGBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9uc2Agb2JqZWN0IGluIHRoZSBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHVibGljIGdldCBzdXBwb3J0U2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5vcHRpb25zLmFsbG93U2VsZWN0aW9uID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zLmFsbG93U2VsZWN0aW9uKSAmJlxuICAgICAgdGhpcy5fc3VwcG9ydFNlbGVjdGlvblxuICAgICk7XG4gIH1cblxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZXJpZXNWYWx1ZXMgfHwgW107XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZXJpZXNMYWJlbHMgfHwgdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxuXG4gIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhIHRvb2xiYXIgaXRlbSBmb3IgdGhpcyB2aXN1YWxpemVyLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRvIGFkZCBhIGN1c3RvbSBidXR0b24gYW5kIGRyb3AtZG93biBtZW51IHRvIHRoZSB0b29sYmFyOlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBpbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWwsIERvY3VtZW50SGVscGVyIH0gZnJvbSBcInN1cnZleS1hbmFseXRpY3NcIjtcbiAgICpcbiAgICogY29uc3Qgdml6UGFuZWwgPSBuZXcgVmlzdWFsaXphdGlvblBhbmVsKCAuLi4gKTtcbiAgICpcbiAgICogLy8gQWRkIGEgY3VzdG9tIGJ1dHRvbiB0byB0aGUgdG9vbGJhclxuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5yZWdpc3RlclRvb2xiYXJJdGVtKFwibXktdG9vbGJhci1idXR0b25cIiwgKCkgPT4ge1xuICAgKiAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oXG4gICAqICAgICAvLyBBIGJ1dHRvbiBjbGljayBldmVudCBoYW5kbGVyXG4gICAqICAgICAoKSA9PiB7XG4gICAqICAgICAgIGFsZXJ0KFwiQ3VzdG9tIHRvb2xiYXIgYnV0dG9uIGlzIGNsaWNrZWRcIik7XG4gICAqICAgICB9LFxuICAgKiAgICAgLy8gQnV0dG9uIGNhcHRpb25cbiAgICogICAgIFwiQnV0dG9uXCJcbiAgICogICApO1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gQWRkIGEgY3VzdG9tIGRyb3AtZG93biBtZW51IHRvIHRoZSB0b29sYmFyXG4gICAqIHZpelBhbmVsLnZpc3VhbGl6ZXJzWzBdLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJteS10b29sYmFyLWRyb3Bkb3duXCIsICgpID0+IHtcbiAgICogICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAqICAgICAvLyBNZW51IGl0ZW1zXG4gICAqICAgICBbXG4gICAqICAgICAgIHsgdmFsdWU6IDEsIHRleHQ6IFwiT25lXCIgfSxcbiAgICogICAgICAgeyB2YWx1ZTogMiwgdGV4dDogXCJUd29cIiB9LFxuICAgKiAgICAgICB7IHZhbHVlOiAzLCB0ZXh0OiBcIlRocmVlXCIgfVxuICAgKiAgICAgXSxcbiAgICogICAgIC8vIEEgZnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgaW5pdGlhbCBzZWxlY3Rpb25cbiAgICogICAgIChvcHRpb24pID0+IGZhbHNlLFxuICAgKiAgICAgLy8gQW4gZXZlbnQgaGFuZGxlciB0aGF0IGlzIGV4ZWN1dGVkIHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWRcbiAgICogICAgIChlKSA9PiB7XG4gICAqICAgICAgIGFsZXJ0KGUudGFyZ2V0LnZhbHVlKTtcbiAgICogICAgIH1cbiAgICogICApO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqIEBwYXJhbSBuYW1lIEEgY3VzdG9tIG5hbWUgZm9yIHRoZSB0b29sYmFyIGl0ZW0uXG4gICAqIEBwYXJhbSBjcmVhdG9yIEEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSB0b29sYmFyIGFuZCBzaG91bGQgcmV0dXJuIGFuIGBIVE1MRWxlbWVudGAgd2l0aCB0aGUgdG9vbGJhciBpdGVtLlxuICAgKiBAc2VlIHVucmVnaXN0ZXJUb29sYmFySXRlbVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVG9vbGJhckl0ZW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWF0b3I6ICh0b29sYmFyPzogSFRNTERpdkVsZW1lbnQpID0+IEhUTUxFbGVtZW50XG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9vbGJhckl0ZW1DcmVhdG9yc1tuYW1lXSA9IGNyZWF0b3I7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVW5yZWdpc3RlcnMgYSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhIHRvb2xiYXIgaXRlbS4gQWxsb3dzIHlvdSB0byByZW1vdmUgYSB0b29sYmFyIGl0ZW0uXG4gICAqIEBwYXJhbSBuYW1lIEEgdG9vbGJhciBpdGVtIG5hbWUuXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gcHJldmlvdXNseSB1c2VkIHRvIFtyZWdpc3Rlcl0oI3JlZ2lzdGVyVG9vbGJhckl0ZW0pIHRoZSByZW1vdmVkIHRvb2xiYXIgaXRlbS5cbiAgICogQHNlZSByZWdpc3RlclRvb2xiYXJJdGVtXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRvb2xiYXJJdGVtKFxuICAgIG5hbWU6IHN0cmluZ1xuICApOiAodG9vbGJhcj86IEhUTUxEaXZFbGVtZW50KSA9PiBIVE1MRWxlbWVudCB7XG4gICAgaWYodGhpcy50b29sYmFySXRlbUNyZWF0b3JzW25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNyZWF0b3IgPSB0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnNbbmFtZV07XG4gICAgICBkZWxldGUgdGhpcy50b29sYmFySXRlbUNyZWF0b3JzW25hbWVdO1xuICAgICAgcmV0dXJuIGNyZWF0b3I7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmlzdWFsaXplcidzIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGUgfHwgXCJ2aXN1YWxpemVyXCI7XG4gIH1cblxuICAvKipcbiAgICogT2Jzb2xldGUuIFVzZSBbYHN1cnZleURhdGFgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsI3N1cnZleURhdGEpIGluc3RlYWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVByb3ZpZGVyLmZpbHRlcmVkRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN1cnZleSByZXN1bHRzIHVzZWQgdG8gY2FsY3VsYXRlIHZhbHVlcyBmb3IgdmlzdWFsaXphdGlvbi4gSWYgYSB1c2VyIGFwcGxpZXMgYSBmaWx0ZXIsIHRoZSBhcnJheSBpcyBhbHNvIGZpbHRlcmVkLlxuICAgKlxuICAgKiBUbyBnZXQgYW4gYXJyYXkgb2YgY2FsY3VsYXRlZCBhbmQgdmlzdWFsaXplZCB2YWx1ZXMsIGNhbGwgdGhlIFtgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6ZXJiYXNlI2dldENhbGN1bGF0ZWRWYWx1ZXMpIG1ldGhvZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc3VydmV5RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIuZmlsdGVyZWREYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBkYXRhUHJvdmlkZXIoKTogRGF0YVByb3ZpZGVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdmlzdWFsaXplZCBkYXRhLlxuICAgKiBAcGFyYW0gZGF0YSBBIGRhdGEgYXJyYXkgd2l0aCBzdXJ2ZXkgcmVzdWx0cyB0byBiZSB2aXN1YWxpemVkLlxuICAgKi9cbiAgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICB0aGlzLmRhdGFQcm92aWRlci5kYXRhID0gZGF0YTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICB0aGlzLmZvb3RlclZpc3VhbGl6ZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBvblVwZGF0ZTogKCkgPT4gdm9pZDtcblxuICBpbnZva2VPblVwZGF0ZSgpIHtcbiAgICB0aGlzLm9uVXBkYXRlICYmIHRoaXMub25VcGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSB2aXN1YWxpemVyIGFuZCBhbGwgaXRzIGVsZW1lbnRzIGZyb20gdGhlIERPTS5cbiAgICogQHNlZSBjbGVhclxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAoISF0aGlzLnJlbmRlclJlc3VsdCkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy50b29sYmFyQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNvbnRlbnRDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZvb3RlckNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucmVuZGVyUmVzdWx0LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICB0aGlzLnJlbmRlclJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5fZm9vdGVyVmlzdWFsaXplcikge1xuICAgICAgdGhpcy5fZm9vdGVyVmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyLm9uVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZm9vdGVyVmlzdWFsaXplciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1wdGllcyB0aGUgdG9vbGJhciwgaGVhZGVyLCBmb290ZXIsIGFuZCBjb250ZW50IGNvbnRhaW5lcnMuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIGVtcHR5IGFuZCBkZWxldGUgdGhlIHZpc3VhbGl6ZXIgYW5kIGFsbCBpdHMgZWxlbWVudHMgZnJvbSB0aGUgRE9NLCBjYWxsIHRoZSBbYGRlc3Ryb3koKWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemVyYmFzZSNkZXN0cm95KSBtZXRob2QgaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveVRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5oZWFkZXJDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveUhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgfVxuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmZvb3RlckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Rm9vdGVyKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVG9vbGJhckl0ZW1zKHRvb2xiYXI6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgT2JqZWN0LmtleXModGhpcy50b29sYmFySXRlbUNyZWF0b3JzIHx8IHt9KS5mb3JFYWNoKCh0b29sYmFySXRlbU5hbWUpID0+IHtcbiAgICAgIGxldCB0b29sYmFySXRlbSA9IHRoaXMudG9vbGJhckl0ZW1DcmVhdG9yc1t0b29sYmFySXRlbU5hbWVdKHRvb2xiYXIpO1xuICAgICAgaWYgKCEhdG9vbGJhckl0ZW0pIHtcbiAgICAgICAgdG9vbGJhci5hcHBlbmRDaGlsZCh0b29sYmFySXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdEFuc3dlclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uID8gdGhpcy5xdWVzdGlvbi5jb3JyZWN0QW5zd2VyIDogXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95VG9vbGJhcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyVG9vbGJhcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuc2hvd1Rvb2xiYXIpIHtcbiAgICAgIGNvbnN0IHRvb2xiYXIgPSA8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtdG9vbGJhclwiKVxuICAgICAgKTtcbiAgICAgIHRoaXMuY3JlYXRlVG9vbGJhckl0ZW1zKHRvb2xiYXIpO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvb2xiYXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95SGVhZGVyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISF0aGlzLm9wdGlvbnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0cm95SGVhZGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0cm95SGVhZGVyKGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdHJveUNvbnRlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJIZWFkZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnJlbmRlckhlYWRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMucmVuZGVySGVhZGVyKGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvcnJlY3RBbnN3ZXJFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgXCJzYS12aXN1YWxpemVyX19jb3JyZWN0LWFuc3dlclwiXG4gICAgICApO1xuICAgICAgY29ycmVjdEFuc3dlckVsZW1lbnQuaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvcnJlY3RBbnN3ZXJcIikgKyB0aGlzLmdldENvcnJlY3RBbnN3ZXJUZXh0KCk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29ycmVjdEFuc3dlckVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISF0aGlzLm9wdGlvbnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5yZW5kZXJDb250ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5yZW5kZXJDb250ZW50KGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9WaXN1YWxpemVyRm9yUXVlc3Rpb25cIik7XG4gICAgfVxuICAgIHRoaXMuYWZ0ZXJSZW5kZXIoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Rm9vdGVyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJGb290ZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGlmICh0aGlzLmhhc0Zvb3Rlcikge1xuICAgICAgY29uc3QgZm9vdGVyVGl0bGVFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJoNFwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2Zvb3Rlci10aXRsZVwiLFxuICAgICAgICB7IGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVyQ29tbWVudFRpdGxlXCIpIH1cbiAgICAgICk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZm9vdGVyVGl0bGVFbGVtZW50KTtcblxuICAgICAgY29uc3QgZm9vdGVyQ29udGVudEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2Zvb3Rlci1jb250ZW50XCJcbiAgICAgICk7XG4gICAgICBmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gVmlzdWFsaXplckJhc2Uub3RoZXJDb21tZW50Q29sbGFwc2VkXG4gICAgICAgID8gXCJub25lXCJcbiAgICAgICAgOiBcImJsb2NrXCI7XG5cbiAgICAgIGNvbnN0IHZpc2liaWxpdHlCdXR0b24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICBpZiAoZm9vdGVyQ29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICBmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgIHZpc2liaWxpdHlCdXR0b24uaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVCdXR0b25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9vdGVyQ29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgIHZpc2liaWxpdHlCdXR0b24uaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcbiAgICAgICAgICAgIFZpc3VhbGl6ZXJCYXNlLm90aGVyQ29tbWVudENvbGxhcHNlZCA/IFwic2hvd0J1dHRvblwiIDogXCJoaWRlQnV0dG9uXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9vdGVyVmlzdWFsaXplci5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dCdXR0b25cIikgLyosIFwic2EtdG9vbGJhcl9fYnV0dG9uLS1yaWdodFwiKi8pO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHZpc2liaWxpdHlCdXR0b24pO1xuXG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZm9vdGVyQ29udGVudEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLmZvb3RlclZpc3VhbGl6ZXIucmVuZGVyKGZvb3RlckNvbnRlbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgdmlzdWFsaXplciBpbiBhIHNwZWNpZmllZCBjb250YWluZXIuXG4gICAqIEBwYXJhbSB0YXJnZXRFbGVtZW50IEFuIGBIVE1MRWxlbWVudGAgb3IgYW4gYGlkYCBvZiBhIHBhZ2UgZWxlbWVudCBpbiB3aGljaCB5b3Ugd2FudCB0byByZW5kZXIgdGhlIHZpc3VhbGl6ZXIuXG4gICAqL1xuICByZW5kZXIodGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldEVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRhcmdldEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXRFbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJSZXN1bHQgPSB0YXJnZXRFbGVtZW50O1xuXG4gICAgdGhpcy50b29sYmFyQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgIFwiZGl2XCIsXG4gICAgICBcInNhLXZpc3VhbGl6ZXJfX3Rvb2xiYXJcIlxuICAgICk7XG4gICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgIHRoaXMucmVuZGVyVG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuXG4gICAgaWYgKHRoaXMuaGFzSGVhZGVyKSB7XG4gICAgICB0aGlzLmhlYWRlckNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIFwic2EtdmlzdWFsaXplcl9faGVhZGVyXCJcbiAgICAgICk7XG4gICAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVySGVhZGVyKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRlbnRDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJkaXZcIixcbiAgICAgIFwic2EtdmlzdWFsaXplcl9fY29udGVudFwiXG4gICAgKTtcbiAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG5cbiAgICB0aGlzLmZvb3RlckNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImRpdlwiLFxuICAgICAgXCJzYS12aXN1YWxpemVyX19mb290ZXJcIlxuICAgICk7XG4gICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgdGhpcy5yZW5kZXJGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXJlbmRlcnMgdGhlIHZpc3VhbGl6ZXIgYW5kIGl0cyBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goKSB7XG4gICAgaWYgKCEhdGhpcy5oZWFkZXJDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lIZWFkZXIodGhpcy5oZWFkZXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlckhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgICB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5mb290ZXJDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlckZvb3Rlcih0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaXBIdG1sRnJvbVRpdGxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGxldCBvcmlnaW5hbFRleHQgPSB0ZXh0IHx8IFwiXCI7XG4gICAgICBsZXQgcHJvY2Vzc2VkVGV4dCA9IG9yaWdpbmFsVGV4dC5yZXBsYWNlKC8oPChbXj5dKyk+KS9naSwgXCJcIik7XG4gICAgICByZXR1cm4gcHJvY2Vzc2VkVGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBnZXRSYW5kb21Db2xvcigpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldENvbG9ycygpO1xuICAgIHJldHVybiBjb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29sb3JzLmxlbmd0aCldO1xuICB9XG5cbiAgcHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yID0gXCIjZjdmN2Y3XCI7XG5cbiAgZ2V0IGJhY2tncm91bmRDb2xvcigpIHsgcmV0dXJuIHRoaXMuZ2V0QmFja2dyb3VuZENvbG9yQ29yZSgpOyB9XG4gIHNldCBiYWNrZ3JvdW5kQ29sb3IodmFsdWUpIHsgdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKHZhbHVlKTsgfVxuXG4gIHByb3RlY3RlZCBnZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3I7XG4gIH1cbiAgcHJvdGVjdGVkIHNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3I6IHN0cmluZykge1xuICAgIHRoaXMuX2JhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgIGlmICh0aGlzLmZvb3RlclZpc3VhbGl6ZXIpIHRoaXMuZm9vdGVyVmlzdWFsaXplci5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgfVxuXG4gIHN0YXRpYyBjdXN0b21Db2xvcnM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgc3RhdGljIGNvbG9ycyA9IFtcbiAgICBcIiM4NmUxZmJcIixcbiAgICBcIiMzOTk5ZmJcIixcbiAgICBcIiNmZjY3NzFcIixcbiAgICBcIiMxZWI0OTZcIixcbiAgICBcIiNmZmMxNTJcIixcbiAgICBcIiNhYmExZmZcIixcbiAgICBcIiM3ZDhkYTVcIixcbiAgICBcIiM0ZWM0NmNcIixcbiAgICBcIiNjZjM3YTZcIixcbiAgICBcIiM0ZTYxOThcIixcbiAgXTtcblxuICBnZXRDb2xvcnMoY291bnQgPSAxMCkge1xuICAgIGNvbnN0IGNvbG9ycyA9XG4gICAgICBBcnJheS5pc0FycmF5KFZpc3VhbGl6ZXJCYXNlLmN1c3RvbUNvbG9ycykgJiZcbiAgICAgICAgVmlzdWFsaXplckJhc2UuY3VzdG9tQ29sb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBWaXN1YWxpemVyQmFzZS5jdXN0b21Db2xvcnNcbiAgICAgICAgOiBWaXN1YWxpemVyQmFzZS5jb2xvcnM7XG5cbiAgICBsZXQgbWFueUNvbG9yczogYW55ID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHtcbiAgICAgIG1hbnlDb2xvcnMgPSBtYW55Q29sb3JzLmNvbmNhdChjb2xvcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBtYW55Q29sb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgdmlzdWFsaXplcidzIHRvb2xiYXIuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGB0cnVlYFxuICAgKi9cbiAgZ2V0IHNob3dUb29sYmFyKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93VG9vbGJhcjtcbiAgfVxuICBzZXQgc2hvd1Rvb2xiYXIobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAobmV3VmFsdWUgIT0gdGhpcy5fc2hvd1Rvb2xiYXIpIHtcbiAgICAgIHRoaXMuX3Nob3dUb29sYmFyID0gbmV3VmFsdWU7XG4gICAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95VG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlclRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT2Jzb2xldGUuIFVzZSBbYGdldENhbGN1bGF0ZWRWYWx1ZXMoKWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwjZ2V0Q2FsY3VsYXRlZFZhbHVlcykgaW5zdGVhZC5cbiAgICovXG4gIGdldERhdGEoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDYWxjdWxhdGVkVmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjYWxjdWxhdGVkIGFuZCB2aXN1YWxpemVkIHZhbHVlcy4gSWYgYSB1c2VyIGFwcGxpZXMgYSBmaWx0ZXIsIHRoZSBhcnJheSBpcyBhbHNvIGZpbHRlcmVkLlxuICAgKlxuICAgKiBUbyBnZXQgYW4gYXJyYXkgb2Ygc291cmNlIHN1cnZleSByZXN1bHRzLCB1c2UgdGhlIFtgc3VydmV5RGF0YWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemVyYmFzZSNzdXJ2ZXlEYXRhKSBwcm9wZXJ0eS5cbiAgICovXG4gIGdldENhbGN1bGF0ZWRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIuZ2V0RGF0YSh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc2V0dGluZ1N0YXRlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIGEgY3VycmVudCB2aXN1YWxpemVyIHN0YXRlLiBUaGUgcHJvcGVydGllcyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIGluZGl2aWR1YWwgdmlzdWFsaXplci5cbiAgICpcbiAgICogPiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gaW4gY2xhc3NlcyBkZXNjZW5kYW50IGZyb20gYFZpc3VhbGl6ZXJCYXNlYC5cbiAgICogQHNlZSBzZXRTdGF0ZVxuICAgKiBAc2VlIG9uU3RhdGVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogYW55IHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZpc3VhbGl6ZXIncyBzdGF0ZS5cbiAgICpcbiAgICogPiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gaW4gY2xhc3NlcyBkZXNjZW5kYW50IGZyb20gYFZpc3VhbGl6ZXJCYXNlYC5cbiAgICogQHNlZSBnZXRTdGF0ZVxuICAgKiBAc2VlIG9uU3RhdGVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IGFueSk6IHZvaWQge1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgY3VycmVudCBsb2NhbGUuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIGluaGVyaXQgdGhlIGxvY2FsZSBmcm9tIGEgdmlzdWFsaXplZCBzdXJ2ZXksIGFzc2lnbiBhIFtgU3VydmV5TW9kZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5LWRhdGEtbW9kZWwpIGluc3RhbmNlIHRvIHRoZSBbYHN1cnZleWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNzdXJ2ZXkpIHByb3BlcnR5IG9mIHRoZSBgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgIG9iamVjdCBpbiB0aGUgW2BWaXN1YWxpemF0aW9uUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsKSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogSWYgdGhlIHN1cnZleSBpcyBbdHJhbnNsYXRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgbGFuZ3VhZ2VdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2V4YW1wbGVzL3N1cnZleS1sb2NhbGl6YXRpb24vKSwgdGhlIHRvb2xiYXIgZGlzcGxheXMgYSBsYW5ndWFnZSBzZWxlY3Rpb24gZHJvcC1kb3duIG1lbnUuXG4gICAqIEBzZWUgb25Mb2NhbGVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvY2FsZSgpIHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5vcHRpb25zLnN1cnZleTtcbiAgICBpZiAoISFzdXJ2ZXkpIHtcbiAgICAgIHJldHVybiBzdXJ2ZXkubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGxvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgdGhpcy5vbkxvY2FsZUNoYW5nZWQuZmlyZSh0aGlzLCB7IGxvY2FsZTogbmV3TG9jYWxlIH0pO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIGxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gbmV3TG9jYWxlO1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLm9wdGlvbnMuc3VydmV5O1xuICAgIGlmICghIXN1cnZleSAmJiBzdXJ2ZXkubG9jYWxlICE9PSBuZXdMb2NhbGUpIHtcbiAgICAgIHN1cnZleS5sb2NhbGUgPSBuZXdMb2NhbGU7XG4gICAgfVxuICB9XG5cbn1cbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjcmVhdGUgaW5kaXZpZHVhbCB2aXN1YWxpemVycyB3aXRob3V0IGNyZWF0aW5nIGEgW3Zpc3VhbGl6YXRpb24gcGFuZWxdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpLlxuICovXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplckZhY3Rvcnkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHZpc3VhbGl6ZXIgZm9yIGEgc2luZ2xlIHF1ZXN0aW9uLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBpbXBvcnQgeyBWaXN1YWxpemVyRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktYW5hbHl0aWNzXCI7XG4gICAqXG4gICAqIGNvbnN0IHZpc3VhbGl6ZXIgPSBuZXcgVmlzdWFsaXplckZhY3RvcnkuY3JlYXRlVmlzdWFsaXplcihcbiAgICogICBxdWVzdGlvbixcbiAgICogICBkYXRhLFxuICAgKiAgIG9wdGlvbnNcbiAgICogKTtcbiAgICpcbiAgICogdmlzdWFsaXplci5yZW5kZXIoXCJjb250YWluZXJJZFwiKVxuICAgKiBgYGBcbiAgICpcbiAgICogSWYgYSBxdWVzdGlvbiBoYXMgbW9yZSB0aGFuIG9uZSBbcmVnaXN0ZXJlZF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25tYW5hZ2VyI3JlZ2lzdGVyVmlzdWFsaXplcikgdmlzdWFsaXplciwgdXNlcnMgY2FuIHN3aXRjaCBiZXR3ZWVuIHRoZW0gdXNpbmcgYSBkcm9wLWRvd24gbWVudS5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIEEgcXVlc3Rpb24gZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIHZpc3VhbGl6ZXIuXG4gICAqIEBwYXJhbSBkYXRhIEEgZGF0YSBhcnJheSB3aXRoIHN1cnZleSByZXN1bHRzIHRvIGJlIHZpc3VhbGl6ZWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCB3aXRoIGFueSBjdXN0b20gcHJvcGVydGllcyB5b3UgbmVlZCB3aXRoaW4gdGhlIHZpc3VhbGl6ZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVZpc3VhbGl6ZXIoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfVxuICApOiBWaXN1YWxpemVyQmFzZSB7XG4gICAgbGV0IHR5cGU7XG5cbiAgICBpZiAocXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcInRleHRcIiAmJiAoPGFueT5xdWVzdGlvbikuaW5wdXRUeXBlKSB7XG4gICAgICB0eXBlID0gKDxhbnk+cXVlc3Rpb24pLmlucHV0VHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRvcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci5nZXRWaXN1YWxpemVyc0J5VHlwZSh0eXBlKTtcbiAgICB2YXIgdmlzdWFsaXplcnMgPSBjcmVhdG9ycy5tYXAoXG4gICAgICAoY3JlYXRvcikgPT4gbmV3IGNyZWF0b3IocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMpXG4gICAgKTtcbiAgICBpZiAodmlzdWFsaXplcnMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgYWx0ZXJuYXRpdmVzVmlzdWFsaXplckNvbnN0cnVjdG9yID0gVmlzdWFsaXphdGlvbk1hbmFnZXIuZ2V0QWx0VmlzdWFsaXplclNlbGVjdG9yKCk7XG4gICAgICBsZXQgdmlzdWFsaXplciA9IG5ldyBhbHRlcm5hdGl2ZXNWaXN1YWxpemVyQ29uc3RydWN0b3IoXG4gICAgICAgIHZpc3VhbGl6ZXJzLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgZGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHJldHVybiB2aXN1YWxpemVyO1xuICAgIH1cbiAgICByZXR1cm4gdmlzdWFsaXplcnNbMF07XG4gIH1cbn1cbiIsImV4cG9ydCB2YXIgc3RvcFdvcmRzID0gW1xuICBcImRlXCIsXG4gIFwiZW5cIixcbiAgXCJ2YW5cIixcbiAgXCJpa1wiLFxuICBcInRlXCIsXG4gIFwiZGF0XCIsXG4gIFwiZGllXCIsXG4gIFwiaW5cIixcbiAgXCJlZW5cIixcbiAgXCJoaWpcIixcbiAgXCJoZXRcIixcbiAgXCJuaWV0XCIsXG4gIFwiemlqblwiLFxuICBcImlzXCIsXG4gIFwid2FzXCIsXG4gIFwib3BcIixcbiAgXCJhYW5cIixcbiAgXCJtZXRcIixcbiAgXCJhbHNcIixcbiAgXCJ2b29yXCIsXG4gIFwiaGFkXCIsXG4gIFwiZXJcIixcbiAgXCJtYWFyXCIsXG4gIFwib21cIixcbiAgXCJoZW1cIixcbiAgXCJkYW5cIixcbiAgXCJ6b3VcIixcbiAgXCJvZlwiLFxuICBcIndhdFwiLFxuICBcIm1pam5cIixcbiAgXCJtZW5cIixcbiAgXCJkaXRcIixcbiAgXCJ6b1wiLFxuICBcImRvb3JcIixcbiAgXCJvdmVyXCIsXG4gIFwiemVcIixcbiAgXCJ6aWNoXCIsXG4gIFwiYmlqXCIsXG4gIFwib29rXCIsXG4gIFwidG90XCIsXG4gIFwiamVcIixcbiAgXCJtaWpcIixcbiAgXCJ1aXRcIixcbiAgXCJkZXJcIixcbiAgXCJkYWFyXCIsXG4gIFwiaGFhclwiLFxuICBcIm5hYXJcIixcbiAgXCJoZWJcIixcbiAgXCJob2VcIixcbiAgXCJoZWVmdFwiLFxuICBcImhlYmJlblwiLFxuICBcImRlemVcIixcbiAgXCJ1XCIsXG4gIFwid2FudFwiLFxuICBcIm5vZ1wiLFxuICBcInphbFwiLFxuICBcIm1lXCIsXG4gIFwiemlqXCIsXG4gIFwibnVcIixcbiAgXCJnZVwiLFxuICBcImdlZW5cIixcbiAgXCJvbWRhdFwiLFxuICBcImlldHNcIixcbiAgXCJ3b3JkZW5cIixcbiAgXCJ0b2NoXCIsXG4gIFwiYWxcIixcbiAgXCJ3YXJlblwiLFxuICBcInZlZWxcIixcbiAgXCJtZWVyXCIsXG4gIFwiZG9lblwiLFxuICBcInRvZW5cIixcbiAgXCJtb2V0XCIsXG4gIFwiYmVuXCIsXG4gIFwiem9uZGVyXCIsXG4gIFwia2FuXCIsXG4gIFwiaHVuXCIsXG4gIFwiZHVzXCIsXG4gIFwiYWxsZXNcIixcbiAgXCJvbmRlclwiLFxuICBcImphXCIsXG4gIFwiZWVuc1wiLFxuICBcImhpZXJcIixcbiAgXCJ3aWVcIixcbiAgXCJ3ZXJkXCIsXG4gIFwiYWx0aWpkXCIsXG4gIFwiZG9jaFwiLFxuICBcIndvcmR0XCIsXG4gIFwid2V6ZW5cIixcbiAgXCJrdW5uZW5cIixcbiAgXCJvbnNcIixcbiAgXCJ6ZWxmXCIsXG4gIFwidGVnZW5cIixcbiAgXCJuYVwiLFxuICBcInJlZWRzXCIsXG4gIFwid2lsXCIsXG4gIFwia29uXCIsXG4gIFwibmlldHNcIixcbiAgXCJ1d1wiLFxuICBcImllbWFuZFwiLFxuICBcImdld2Vlc3RcIixcbiAgXCJhbmRlcmVcIlxuXTtcbiIsImV4cG9ydCB2YXIgc3RvcFdvcmRzID0gW1xuICBcIi4uLlwiLFxuICBcImFcIixcbiAgXCJhYm91dFwiLFxuICBcImFib3ZlXCIsXG4gIFwiYWNyb3NzXCIsXG4gIFwiYWZ0ZXJcIixcbiAgXCJhZ2FpblwiLFxuICBcImFnYWluc3RcIixcbiAgXCJhbGxcIixcbiAgXCJhbG1vc3RcIixcbiAgXCJhbG9uZVwiLFxuICBcImFsb25nXCIsXG4gIFwiYWxyZWFkeVwiLFxuICBcImFsc29cIixcbiAgXCJhbHRob3VnaFwiLFxuICBcImFsd2F5c1wiLFxuICBcImFtb25nXCIsXG4gIFwiYW5cIixcbiAgXCJhbmRcIixcbiAgXCJhbm90aGVyXCIsXG4gIFwiYW55XCIsXG4gIFwiYW55Ym9keVwiLFxuICBcImFueW9uZVwiLFxuICBcImFueXRoaW5nXCIsXG4gIFwiYW55d2hlcmVcIixcbiAgXCJhcmVcIixcbiAgXCJhcmVhXCIsXG4gIFwiYXJlYXNcIixcbiAgXCJhcm91bmRcIixcbiAgXCJhc1wiLFxuICBcImFza1wiLFxuICBcImFza2VkXCIsXG4gIFwiYXNraW5nXCIsXG4gIFwiYXNrc1wiLFxuICBcImF0XCIsXG4gIFwiYXdheVwiLFxuICBcImJcIixcbiAgXCJiYWNrXCIsXG4gIFwiYmFja2VkXCIsXG4gIFwiYmFja2luZ1wiLFxuICBcImJhY2tzXCIsXG4gIFwiYmVcIixcbiAgXCJiZWNhbWVcIixcbiAgXCJiZWNhdXNlXCIsXG4gIFwiYmVjb21lXCIsXG4gIFwiYmVjb21lc1wiLFxuICBcImJlZW5cIixcbiAgXCJiZWZvcmVcIixcbiAgXCJiZWdhblwiLFxuICBcImJlaGluZFwiLFxuICBcImJlaW5nXCIsXG4gIFwiYmVpbmdzXCIsXG4gIFwiYmVzdFwiLFxuICBcImJldHRlclwiLFxuICBcImJldHdlZW5cIixcbiAgXCJiaWdcIixcbiAgXCJib3RoXCIsXG4gIFwiYnV0XCIsXG4gIFwiYnlcIixcbiAgXCJjXCIsXG4gIFwiY2FtZVwiLFxuICBcImNhblwiLFxuICBcImNhbm5vdFwiLFxuICBcImNhc2VcIixcbiAgXCJjYXNlc1wiLFxuICBcImNlcnRhaW5cIixcbiAgXCJjZXJ0YWlubHlcIixcbiAgXCJjbGVhclwiLFxuICBcImNsZWFybHlcIixcbiAgXCJjb21lXCIsXG4gIFwiY291bGRcIixcbiAgXCJkXCIsXG4gIFwiZGlkXCIsXG4gIFwiZGlmZmVyXCIsXG4gIFwiZGlmZmVyZW50XCIsXG4gIFwiZGlmZmVyZW50bHlcIixcbiAgXCJkb1wiLFxuICBcImRvZXNcIixcbiAgXCJkb25lXCIsXG4gIFwiZG93blwiLFxuICBcImRvd25cIixcbiAgXCJkb3duZWRcIixcbiAgXCJkb3duaW5nXCIsXG4gIFwiZG93bnNcIixcbiAgXCJkdXJpbmdcIixcbiAgXCJlXCIsXG4gIFwiZWFjaFwiLFxuICBcImVhcmx5XCIsXG4gIFwiZWl0aGVyXCIsXG4gIFwiZW5kXCIsXG4gIFwiZW5kZWRcIixcbiAgXCJlbmRpbmdcIixcbiAgXCJlbmRzXCIsXG4gIFwiZW5vdWdoXCIsXG4gIFwiZXZlblwiLFxuICBcImV2ZW5seVwiLFxuICBcImV2ZXJcIixcbiAgXCJldmVyeVwiLFxuICBcImV2ZXJ5Ym9keVwiLFxuICBcImV2ZXJ5b25lXCIsXG4gIFwiZXZlcnl0aGluZ1wiLFxuICBcImV2ZXJ5d2hlcmVcIixcbiAgXCJmXCIsXG4gIFwiZmFjZVwiLFxuICBcImZhY2VzXCIsXG4gIFwiZmFjdFwiLFxuICBcImZhY3RzXCIsXG4gIFwiZmFyXCIsXG4gIFwiZmVsdFwiLFxuICBcImZld1wiLFxuICBcImZpbmRcIixcbiAgXCJmaW5kc1wiLFxuICBcImZpcnN0XCIsXG4gIFwiZm9yXCIsXG4gIFwiZm91clwiLFxuICBcImZyb21cIixcbiAgXCJmdWxsXCIsXG4gIFwiZnVsbHlcIixcbiAgXCJmdXJ0aGVyXCIsXG4gIFwiZnVydGhlcmVkXCIsXG4gIFwiZnVydGhlcmluZ1wiLFxuICBcImZ1cnRoZXJzXCIsXG4gIFwiZ1wiLFxuICBcImdhdmVcIixcbiAgXCJnZW5lcmFsXCIsXG4gIFwiZ2VuZXJhbGx5XCIsXG4gIFwiZ2V0XCIsXG4gIFwiZ2V0c1wiLFxuICBcImdpdmVcIixcbiAgXCJnaXZlblwiLFxuICBcImdpdmVzXCIsXG4gIFwiZ29cIixcbiAgXCJnb2luZ1wiLFxuICBcImdvb2RcIixcbiAgXCJnb29kc1wiLFxuICBcImdvdFwiLFxuICBcImdyZWF0XCIsXG4gIFwiZ3JlYXRlclwiLFxuICBcImdyZWF0ZXN0XCIsXG4gIFwiZ3JvdXBcIixcbiAgXCJncm91cGVkXCIsXG4gIFwiZ3JvdXBpbmdcIixcbiAgXCJncm91cHNcIixcbiAgXCJoXCIsXG4gIFwiaGFkXCIsXG4gIFwiaGFzXCIsXG4gIFwiaGF2ZVwiLFxuICBcImhhdmluZ1wiLFxuICBcImhlXCIsXG4gIFwiaGVyXCIsXG4gIFwiaGVyZVwiLFxuICBcImhlcnNlbGZcIixcbiAgXCJoaWdoXCIsXG4gIFwiaGlnaFwiLFxuICBcImhpZ2hcIixcbiAgXCJoaWdoZXJcIixcbiAgXCJoaWdoZXN0XCIsXG4gIFwiaGltXCIsXG4gIFwiaGltc2VsZlwiLFxuICBcImhpc1wiLFxuICBcImhvd1wiLFxuICBcImhvd2V2ZXJcIixcbiAgXCJpXCIsXG4gIFwiaWZcIixcbiAgXCJpbXBvcnRhbnRcIixcbiAgXCJpblwiLFxuICBcImludGVyZXN0XCIsXG4gIFwiaW50ZXJlc3RlZFwiLFxuICBcImludGVyZXN0aW5nXCIsXG4gIFwiaW50ZXJlc3RzXCIsXG4gIFwiaW50b1wiLFxuICBcImlzXCIsXG4gIFwiaXRcIixcbiAgXCJpdHNcIixcbiAgXCJpdHNlbGZcIixcbiAgXCJqXCIsXG4gIFwianVzdFwiLFxuICBcImtcIixcbiAgXCJrZWVwXCIsXG4gIFwia2VlcHNcIixcbiAgXCJraW5kXCIsXG4gIFwia25ld1wiLFxuICBcImtub3dcIixcbiAgXCJrbm93blwiLFxuICBcImtub3dzXCIsXG4gIFwibFwiLFxuICBcImxhcmdlXCIsXG4gIFwibGFyZ2VseVwiLFxuICBcImxhc3RcIixcbiAgXCJsYXRlclwiLFxuICBcImxhdGVzdFwiLFxuICBcImxlYXN0XCIsXG4gIFwibGVzc1wiLFxuICBcImxldFwiLFxuICBcImxldHNcIixcbiAgXCJsaWtlXCIsXG4gIFwibGlrZWx5XCIsXG4gIFwibG9uZ1wiLFxuICBcImxvbmdlclwiLFxuICBcImxvbmdlc3RcIixcbiAgXCJtXCIsXG4gIFwibWFkZVwiLFxuICBcIm1ha2VcIixcbiAgXCJtYWtpbmdcIixcbiAgXCJtYW5cIixcbiAgXCJtYW55XCIsXG4gIFwibWF5XCIsXG4gIFwibWVcIixcbiAgXCJtZW1iZXJcIixcbiAgXCJtZW1iZXJzXCIsXG4gIFwibWVuXCIsXG4gIFwibWlnaHRcIixcbiAgXCJtb3JlXCIsXG4gIFwibW9zdFwiLFxuICBcIm1vc3RseVwiLFxuICBcIm1yXCIsXG4gIFwibXJzXCIsXG4gIFwibXVjaFwiLFxuICBcIm11c3RcIixcbiAgXCJteVwiLFxuICBcIm15c2VsZlwiLFxuICBcIm5cIixcbiAgXCJuZWNlc3NhcnlcIixcbiAgXCJuZWVkXCIsXG4gIFwibmVlZGVkXCIsXG4gIFwibmVlZGluZ1wiLFxuICBcIm5lZWRzXCIsXG4gIFwibmV2ZXJcIixcbiAgXCJuZXdcIixcbiAgXCJuZXdcIixcbiAgXCJuZXdlclwiLFxuICBcIm5ld2VzdFwiLFxuICBcIm5leHRcIixcbiAgXCJub1wiLFxuICBcIm5vYm9keVwiLFxuICBcIm5vblwiLFxuICBcIm5vb25lXCIsXG4gIFwibm90XCIsXG4gIFwibm90aGluZ1wiLFxuICBcIm5vd1wiLFxuICBcIm5vd2hlcmVcIixcbiAgXCJudW1iZXJcIixcbiAgXCJudW1iZXJzXCIsXG4gIFwib1wiLFxuICBcIm9mXCIsXG4gIFwib2ZmXCIsXG4gIFwib2Z0ZW5cIixcbiAgXCJvbGRcIixcbiAgXCJvbGRlclwiLFxuICBcIm9sZGVzdFwiLFxuICBcIm9uXCIsXG4gIFwib25jZVwiLFxuICBcIm9uZVwiLFxuICBcIm9ubHlcIixcbiAgXCJvcGVuXCIsXG4gIFwib3BlbmVkXCIsXG4gIFwib3BlbmluZ1wiLFxuICBcIm9wZW5zXCIsXG4gIFwib3JcIixcbiAgXCJvcmRlclwiLFxuICBcIm9yZGVyZWRcIixcbiAgXCJvcmRlcmluZ1wiLFxuICBcIm9yZGVyc1wiLFxuICBcIm90aGVyXCIsXG4gIFwib3RoZXJzXCIsXG4gIFwib3VyXCIsXG4gIFwib3V0XCIsXG4gIFwib3ZlclwiLFxuICBcInBcIixcbiAgXCJwYXJ0XCIsXG4gIFwicGFydGVkXCIsXG4gIFwicGFydGluZ1wiLFxuICBcInBhcnRzXCIsXG4gIFwicGVyXCIsXG4gIFwicGVyaGFwc1wiLFxuICBcInBsYWNlXCIsXG4gIFwicGxhY2VzXCIsXG4gIFwicG9pbnRcIixcbiAgXCJwb2ludGVkXCIsXG4gIFwicG9pbnRpbmdcIixcbiAgXCJwb2ludHNcIixcbiAgXCJwb3NzaWJsZVwiLFxuICBcInByZXNlbnRcIixcbiAgXCJwcmVzZW50ZWRcIixcbiAgXCJwcmVzZW50aW5nXCIsXG4gIFwicHJlc2VudHNcIixcbiAgXCJwcm9ibGVtXCIsXG4gIFwicHJvYmxlbXNcIixcbiAgXCJwdXRcIixcbiAgXCJwdXRzXCIsXG4gIFwicVwiLFxuICBcInF1aXRlXCIsXG4gIFwiclwiLFxuICBcInJhdGhlclwiLFxuICBcInJlYWxseVwiLFxuICBcInJpZ2h0XCIsXG4gIFwicmlnaHRcIixcbiAgXCJyb29tXCIsXG4gIFwicm9vbXNcIixcbiAgXCJzXCIsXG4gIFwic2FpZFwiLFxuICBcInNhbWVcIixcbiAgXCJzYXdcIixcbiAgXCJzYXlcIixcbiAgXCJzYXlzXCIsXG4gIFwic2Vjb25kXCIsXG4gIFwic2Vjb25kc1wiLFxuICBcInNlZVwiLFxuICBcInNlZW1cIixcbiAgXCJzZWVtZWRcIixcbiAgXCJzZWVtaW5nXCIsXG4gIFwic2VlbXNcIixcbiAgXCJzZWVzXCIsXG4gIFwic2V2ZXJhbFwiLFxuICBcInNoYWxsXCIsXG4gIFwic2hlXCIsXG4gIFwic2hvdWxkXCIsXG4gIFwic2hvd1wiLFxuICBcInNob3dlZFwiLFxuICBcInNob3dpbmdcIixcbiAgXCJzaG93c1wiLFxuICBcInNpZGVcIixcbiAgXCJzaWRlc1wiLFxuICBcInNpbmNlXCIsXG4gIFwic21hbGxcIixcbiAgXCJzbWFsbGVyXCIsXG4gIFwic21hbGxlc3RcIixcbiAgXCJzb1wiLFxuICBcInNvbWVcIixcbiAgXCJzb21lYm9keVwiLFxuICBcInNvbWVvbmVcIixcbiAgXCJzb21ldGhpbmdcIixcbiAgXCJzb21ld2hlcmVcIixcbiAgXCJzdGF0ZVwiLFxuICBcInN0YXRlc1wiLFxuICBcInN0aWxsXCIsXG4gIFwic3RpbGxcIixcbiAgXCJzdWNoXCIsXG4gIFwic3VyZVwiLFxuICBcInRcIixcbiAgXCJ0YWtlXCIsXG4gIFwidGFrZW5cIixcbiAgXCJ0aGFuXCIsXG4gIFwidGhhdFwiLFxuICBcInRoZVwiLFxuICBcInRoZWlyXCIsXG4gIFwidGhlbVwiLFxuICBcInRoZW5cIixcbiAgXCJ0aGVyZVwiLFxuICBcInRoZXJlZm9yZVwiLFxuICBcInRoZXNlXCIsXG4gIFwidGhleVwiLFxuICBcInRoaW5nXCIsXG4gIFwidGhpbmdzXCIsXG4gIFwidGhpbmtcIixcbiAgXCJ0aGlua3NcIixcbiAgXCJ0aGlzXCIsXG4gIFwidGhvc2VcIixcbiAgXCJ0aG91Z2hcIixcbiAgXCJ0aG91Z2h0XCIsXG4gIFwidGhvdWdodHNcIixcbiAgXCJ0aHJlZVwiLFxuICBcInRocm91Z2hcIixcbiAgXCJ0aHVzXCIsXG4gIFwidG9cIixcbiAgXCJ0b2RheVwiLFxuICBcInRvZ2V0aGVyXCIsXG4gIFwidG9vXCIsXG4gIFwidG9va1wiLFxuICBcInRvd2FyZFwiLFxuICBcInR1cm5cIixcbiAgXCJ0dXJuZWRcIixcbiAgXCJ0dXJuaW5nXCIsXG4gIFwidHVybnNcIixcbiAgXCJ0d29cIixcbiAgXCJ1XCIsXG4gIFwidW5kZXJcIixcbiAgXCJ1bnRpbFwiLFxuICBcInVwXCIsXG4gIFwidXBvblwiLFxuICBcInVzXCIsXG4gIFwidXNlXCIsXG4gIFwidXNlZFwiLFxuICBcInVzZXNcIixcbiAgXCJ2XCIsXG4gIFwidmVyeVwiLFxuICBcIndcIixcbiAgXCJ3YW50XCIsXG4gIFwid2FudGVkXCIsXG4gIFwid2FudGluZ1wiLFxuICBcIndhbnRzXCIsXG4gIFwid2FzXCIsXG4gIFwid2F5XCIsXG4gIFwid2F5c1wiLFxuICBcIndlXCIsXG4gIFwid2VsbFwiLFxuICBcIndlbGxzXCIsXG4gIFwid2VudFwiLFxuICBcIndlcmVcIixcbiAgXCJ3aGF0XCIsXG4gIFwid2hlblwiLFxuICBcIndoZXJlXCIsXG4gIFwid2hldGhlclwiLFxuICBcIndoaWNoXCIsXG4gIFwid2hpbGVcIixcbiAgXCJ3aG9cIixcbiAgXCJ3aG9sZVwiLFxuICBcIndob3NlXCIsXG4gIFwid2h5XCIsXG4gIFwid2lsbFwiLFxuICBcIndpdGhcIixcbiAgXCJ3aXRoaW5cIixcbiAgXCJ3aXRob3V0XCIsXG4gIFwid29ya1wiLFxuICBcIndvcmtlZFwiLFxuICBcIndvcmtpbmdcIixcbiAgXCJ3b3Jrc1wiLFxuICBcIndvdWxkXCIsXG4gIFwieFwiLFxuICBcInlcIixcbiAgXCJ5ZWFyXCIsXG4gIFwieWVhcnNcIixcbiAgXCJ5ZXRcIixcbiAgXCJ5b3VcIixcbiAgXCJ5b3VuZ1wiLFxuICBcInlvdW5nZXJcIixcbiAgXCJ5b3VuZ2VzdFwiLFxuICBcInlvdXJcIixcbiAgXCJ5b3Vyc1wiLFxuICBcInpcIlxuXTtcbiIsImltcG9ydCB7IHN0b3BXb3JkcyB9IGZyb20gXCIuL2VuZ2xpc2hcIjtcbmltcG9ydCB7IHN0b3BXb3JkcyBhcyBub1N0b3BXb3JkcyB9IGZyb20gXCIuL25vcndlZ2lhblwiO1xuaW1wb3J0IHsgc3RvcFdvcmRzIGFzIG5sU3RvcFdvcmRzIH0gZnJvbSBcIi4vZHV0Y2hcIjtcbmltcG9ydCB7IHN0b3BXb3JkcyBhcyBlc1N0b3BXb3JkcyB9IGZyb20gXCIuL3NwYW5pc2hcIjtcblxudmFyIHN0b3BXb3Jkc0RpY3Rpb25hcnk6IHsgW2luZGV4OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+IH0gPSB7fTtcbnN0b3BXb3Jkc0RpY3Rpb25hcnlbXCJlblwiXSA9IHN0b3BXb3JkcztcbnN0b3BXb3Jkc0RpY3Rpb25hcnlbXCJub1wiXSA9IG5vU3RvcFdvcmRzO1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcIm5sXCJdID0gbmxTdG9wV29yZHM7XG5zdG9wV29yZHNEaWN0aW9uYXJ5W1wiZXNcIl0gPSBlc1N0b3BXb3JkcztcblxuZXhwb3J0IHZhciB0ZXh0SGVscGVyID0ge1xuICBnZXRTdG9wV29yZHM6IChsb2NhbGU6IHN0cmluZyA9IFwiXCIpID0+IHtcbiAgICByZXR1cm4gc3RvcFdvcmRzRGljdGlvbmFyeVtsb2NhbGUgfHwgXCJlblwiXSB8fCBbXTtcbiAgfSxcbn07XG4iLCJleHBvcnQgdmFyIHN0b3BXb3JkcyA9IFtcbiAgXCIuLi5cIixcbiAgXCJhbGxlXCIsXG4gIFwiYW5kcmVcIixcbiAgXCJhcmJlaWRcIixcbiAgXCJhdFwiLFxuICBcImF2XCIsXG4gIFwiYmFyZVwiLFxuICBcImJlZ2dlXCIsXG4gIFwiYmxlXCIsXG4gIFwiYmxlaVwiLFxuICBcImJsaVwiLFxuICBcImJsaXJcIixcbiAgXCJibGl0dFwiLFxuICBcImJvcnRcIixcbiAgXCJicnVrZVwiLFxuICBcImLDpWRlXCIsXG4gIFwiYsOlZVwiLFxuICBcImRhXCIsXG4gIFwiZGVcIixcbiAgXCJkZWdcIixcbiAgXCJkZWlcIixcbiAgXCJkZWltXCIsXG4gIFwiZGVpcmFcIixcbiAgXCJkZWlyZXNcIixcbiAgXCJkZW1cIixcbiAgXCJkZW5cIixcbiAgXCJkZW5uZVwiLFxuICBcImRlclwiLFxuICBcImRlcmVcIixcbiAgXCJkZXJlc1wiLFxuICBcImRldFwiLFxuICBcImRldHRlXCIsXG4gIFwiZGlcIixcbiAgXCJkaW5cIixcbiAgXCJkaXNzZVwiLFxuICBcImRpdHRcIixcbiAgXCJkdVwiLFxuICBcImR5a2tcIixcbiAgXCJkeWtrYXJcIixcbiAgXCJkw6VcIixcbiAgXCJlZ1wiLFxuICBcImVpblwiLFxuICBcImVpdFwiLFxuICBcImVpdHRcIixcbiAgXCJlbGxlclwiLFxuICBcImVsbGVzXCIsXG4gIFwiZW5cIixcbiAgXCJlbmVcIixcbiAgXCJlbmVzdGVcIixcbiAgXCJlbmh2ZXJcIixcbiAgXCJlbm5cIixcbiAgXCJlclwiLFxuICBcImV0XCIsXG4gIFwiZXR0XCIsXG4gIFwiZXR0ZXJcIixcbiAgXCJmb2xrXCIsXG4gIFwiZm9yXCIsXG4gIFwiZm9yZGlcIixcbiAgXCJmb3Jzw7hrZVwiLFxuICBcImZyYVwiLFxuICBcImbDpVwiLFxuICBcImbDuHJcIixcbiAgXCJmw7hyXCIsXG4gIFwiZsO4cnN0XCIsXG4gIFwiZ2pvcmRlXCIsXG4gIFwiZ2rDuHJlXCIsXG4gIFwiZ29kXCIsXG4gIFwiZ8OlXCIsXG4gIFwiaGFcIixcbiAgXCJoYWRkZVwiLFxuICBcImhhblwiLFxuICBcImhhbnNcIixcbiAgXCJoYXJcIixcbiAgXCJoZW5uYXJcIixcbiAgXCJoZW5uZVwiLFxuICBcImhlbm5lc1wiLFxuICBcImhlclwiLFxuICBcImhqw6VcIixcbiAgXCJob1wiLFxuICBcImhvZVwiLFxuICBcImhvbm9tXCIsXG4gIFwiaG9zc1wiLFxuICBcImhvc3NlblwiLFxuICBcImh1blwiLFxuICBcImh2YVwiLFxuICBcImh2ZW1cIixcbiAgXCJodmVyXCIsXG4gIFwiaHZpbGtlXCIsXG4gIFwiaHZpbGtlblwiLFxuICBcImh2aXNcIixcbiAgXCJodm9yXCIsXG4gIFwiaHZvcmRhblwiLFxuICBcImh2b3Jmb3JcIixcbiAgXCJpXCIsXG4gIFwiaWtrZVwiLFxuICBcImlra2plXCIsXG4gIFwiaW5nZW5cIixcbiAgXCJpbmdpXCIsXG4gIFwiaW5ramVcIixcbiAgXCJpbm5cIixcbiAgXCJpbm5lblwiLFxuICBcImlubmlcIixcbiAgXCJqYVwiLFxuICBcImplZ1wiLFxuICBcImthblwiLFxuICBcImtvbVwiLFxuICBcImtvcmxlaXNcIixcbiAgXCJrb3Jzb1wiLFxuICBcImt1blwiLFxuICBcImt1bm5lXCIsXG4gIFwia3ZhXCIsXG4gIFwia3ZhclwiLFxuICBcImt2YXJoZWxzdFwiLFxuICBcImt2ZW5cIixcbiAgXCJrdmlcIixcbiAgXCJrdmlmb3JcIixcbiAgXCJsYWdlXCIsXG4gIFwibGFuZ1wiLFxuICBcImxpa1wiLFxuICBcImxpa2VcIixcbiAgXCJtYWt0XCIsXG4gIFwibWFuXCIsXG4gIFwibWFuZ2VcIixcbiAgXCJtZVwiLFxuICBcIm1lZFwiLFxuICBcIm1lZGFuXCIsXG4gIFwibWVnXCIsXG4gIFwibWVnZXRcIixcbiAgXCJtZWxsb21cIixcbiAgXCJtZW5cIixcbiAgXCJtZW5zXCIsXG4gIFwibWVyXCIsXG4gIFwibWVzdFwiLFxuICBcIm1pXCIsXG4gIFwibWluXCIsXG4gIFwibWluZVwiLFxuICBcIm1pdHRcIixcbiAgXCJtb3RcIixcbiAgXCJteWVcIixcbiAgXCJteWtqZVwiLFxuICBcIm3DpVwiLFxuICBcIm3DpXRlXCIsXG4gIFwibmF2blwiLFxuICBcIm5lZFwiLFxuICBcIm5laVwiLFxuICBcIm5vXCIsXG4gIFwibm9lXCIsXG4gIFwibm9lblwiLFxuICBcIm5va2FcIixcbiAgXCJub2tvXCIsXG4gIFwibm9rb25cIixcbiAgXCJub2tvclwiLFxuICBcIm5va3JlXCIsXG4gIFwibnlcIixcbiAgXCJuw6VcIixcbiAgXCJuw6VyXCIsXG4gIFwib2dcIixcbiAgXCJvZ3PDpVwiLFxuICBcIm9tXCIsXG4gIFwib3BwXCIsXG4gIFwib3NzXCIsXG4gIFwib3ZlclwiLFxuICBcInBhcnRcIixcbiAgXCJwdW5rdFwiLFxuICBcInDDpVwiLFxuICBcInNhbW1lXCIsXG4gIFwic2VnXCIsXG4gIFwic2VsdlwiLFxuICBcInNpXCIsXG4gIFwic2lhXCIsXG4gIFwic2lkYW5cIixcbiAgXCJzaWRlblwiLFxuICBcInNpblwiLFxuICBcInNpbmVcIixcbiAgXCJzaXN0XCIsXG4gIFwic2l0dFwiLFxuICBcInNqw7hsXCIsXG4gIFwic2thbFwiLFxuICBcInNrdWxsZVwiLFxuICBcInNsaWtcIixcbiAgXCJzbHV0dFwiLFxuICBcInNvXCIsXG4gIFwic29tXCIsXG4gIFwic29tbWVcIixcbiAgXCJzb210XCIsXG4gIFwic3RhcnRcIixcbiAgXCJzdGlsbGVcIixcbiAgXCJzw6VcIixcbiAgXCJzw6VublwiLFxuICBcInRpZFwiLFxuICBcInRpbFwiLFxuICBcInRpbGJha2VcIixcbiAgXCJ0aWxzdGFuZFwiLFxuICBcInVtXCIsXG4gIFwidW5kZXJcIixcbiAgXCJ1cHBcIixcbiAgXCJ1dFwiLFxuICBcInV0ZW5cIixcbiAgXCJ2YXJcIixcbiAgXCJ2YXJ0XCIsXG4gIFwidmFydGVcIixcbiAgXCJ2ZWRcIixcbiAgXCJ2ZXJkaVwiLFxuICBcInZlcmVcIixcbiAgXCJ2ZXJ0ZVwiLFxuICBcInZpXCIsXG4gIFwidmlsXCIsXG4gIFwidmlsbGVcIixcbiAgXCJ2aXRlXCIsXG4gIFwidm9yZVwiLFxuICBcInZvcnNcIixcbiAgXCJ2b3J0XCIsXG4gIFwidsOlclwiLFxuICBcInbDpnJlXCIsXG4gIFwidsOmcnRcIixcbiAgXCJ2w7hyZVwiLFxuICBcInbDuHJ0XCIsXG4gIFwiw6ZcIixcbiAgXCLDpVwiXG5dO1xuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiLi4uXCIsXG4gIFwiYVwiLFxuICBcImFjdHVhbG1lbnRlXCIsXG4gIFwiYWRlbGFudGVcIixcbiAgXCJhZGVtw6FzXCIsXG4gIFwiYWZpcm3Ds1wiLFxuICBcImFncmVnw7NcIixcbiAgXCJhaG9yYVwiLFxuICBcImFow61cIixcbiAgXCJhbFwiLFxuICBcImFsZ29cIixcbiAgXCJhbGd1bmFcIixcbiAgXCJhbGd1bmFzXCIsXG4gIFwiYWxndW5vXCIsXG4gIFwiYWxndW5vc1wiLFxuICBcImFsZ8O6blwiLFxuICBcImFscmVkZWRvclwiLFxuICBcImFtYm9zXCIsXG4gIFwiYW1wbGVhbW9zXCIsXG4gIFwiYW50ZVwiLFxuICBcImFudGVyaW9yXCIsXG4gIFwiYW50ZXNcIixcbiAgXCJhcGVuYXNcIixcbiAgXCJhcHJveGltYWRhbWVudGVcIixcbiAgXCJhcXVlbFwiLFxuICBcImFxdWVsbGFzXCIsXG4gIFwiYXF1ZWxsb3NcIixcbiAgXCJhcXVpXCIsXG4gIFwiYXF1w61cIixcbiAgXCJhcnJpYmFcIixcbiAgXCJhc2VndXLDs1wiLFxuICBcImFzw61cIixcbiAgXCJhdHJhc1wiLFxuICBcImF1bnF1ZVwiLFxuICBcImF5ZXJcIixcbiAgXCJhw7FhZGnDs1wiLFxuICBcImHDum5cIixcbiAgXCJiYWpvXCIsXG4gIFwiYmFzdGFudGVcIixcbiAgXCJiaWVuXCIsXG4gIFwiYnVlblwiLFxuICBcImJ1ZW5hXCIsXG4gIFwiYnVlbmFzXCIsXG4gIFwiYnVlbm9cIixcbiAgXCJidWVub3NcIixcbiAgXCJjYWRhXCIsXG4gIFwiY2FzaVwiLFxuICBcImNlcmNhXCIsXG4gIFwiY2llcnRhXCIsXG4gIFwiY2llcnRhc1wiLFxuICBcImNpZXJ0b1wiLFxuICBcImNpZXJ0b3NcIixcbiAgXCJjaW5jb1wiLFxuICBcImNvbWVudMOzXCIsXG4gIFwiY29tb1wiLFxuICBcImNvblwiLFxuICBcImNvbm9jZXJcIixcbiAgXCJjb25zZWd1aW1vc1wiLFxuICBcImNvbnNlZ3VpclwiLFxuICBcImNvbnNpZGVyYVwiLFxuICBcImNvbnNpZGVyw7NcIixcbiAgXCJjb25zaWdvXCIsXG4gIFwiY29uc2lndWVcIixcbiAgXCJjb25zaWd1ZW5cIixcbiAgXCJjb25zaWd1ZXNcIixcbiAgXCJjb250cmFcIixcbiAgXCJjb3Nhc1wiLFxuICBcImNyZW9cIixcbiAgXCJjdWFsXCIsXG4gIFwiY3VhbGVzXCIsXG4gIFwiY3VhbHF1aWVyXCIsXG4gIFwiY3VhbmRvXCIsXG4gIFwiY3VhbnRvXCIsXG4gIFwiY3VhdHJvXCIsXG4gIFwiY3VlbnRhXCIsXG4gIFwiY8OzbW9cIixcbiAgXCJkYVwiLFxuICBcImRhZG9cIixcbiAgXCJkYW5cIixcbiAgXCJkYXJcIixcbiAgXCJkZVwiLFxuICBcImRlYmVcIixcbiAgXCJkZWJlblwiLFxuICBcImRlYmlkb1wiLFxuICBcImRlY2lyXCIsXG4gIFwiZGVqw7NcIixcbiAgXCJkZWxcIixcbiAgXCJkZW3DoXNcIixcbiAgXCJkZW50cm9cIixcbiAgXCJkZXNkZVwiLFxuICBcImRlc3B1w6lzXCIsXG4gIFwiZGljZVwiLFxuICBcImRpY2VuXCIsXG4gIFwiZGljaG9cIixcbiAgXCJkaWVyb25cIixcbiAgXCJkaWZlcmVudGVcIixcbiAgXCJkaWZlcmVudGVzXCIsXG4gIFwiZGlqZXJvblwiLFxuICBcImRpam9cIixcbiAgXCJkaW9cIixcbiAgXCJkb25kZVwiLFxuICBcImRvc1wiLFxuICBcImR1cmFudGVcIixcbiAgXCJlXCIsXG4gIFwiZWplbXBsb1wiLFxuICBcImVsXCIsXG4gIFwiZWxsYVwiLFxuICBcImVsbGFzXCIsXG4gIFwiZWxsb1wiLFxuICBcImVsbG9zXCIsXG4gIFwiZW1iYXJnb1wiLFxuICBcImVtcGxlYWlzXCIsXG4gIFwiZW1wbGVhblwiLFxuICBcImVtcGxlYXJcIixcbiAgXCJlbXBsZWFzXCIsXG4gIFwiZW1wbGVvXCIsXG4gIFwiZW5cIixcbiAgXCJlbmNpbWFcIixcbiAgXCJlbmN1ZW50cmFcIixcbiAgXCJlbnRvbmNlc1wiLFxuICBcImVudHJlXCIsXG4gIFwiZXJhXCIsXG4gIFwiZXJhaXNcIixcbiAgXCJlcmFtb3NcIixcbiAgXCJlcmFuXCIsXG4gIFwiZXJhc1wiLFxuICBcImVyZXNcIixcbiAgXCJlc1wiLFxuICBcImVzYVwiLFxuICBcImVzYXNcIixcbiAgXCJlc2VcIixcbiAgXCJlc29cIixcbiAgXCJlc29zXCIsXG4gIFwiZXN0YVwiLFxuICBcImVzdGFiYVwiLFxuICBcImVzdGFiYWlzXCIsXG4gIFwiZXN0YWJhblwiLFxuICBcImVzdGFiYXNcIixcbiAgXCJlc3RhZFwiLFxuICBcImVzdGFkYVwiLFxuICBcImVzdGFkYXNcIixcbiAgXCJlc3RhZG9cIixcbiAgXCJlc3RhZG9zXCIsXG4gIFwiZXN0YWlzXCIsXG4gIFwiZXN0YW1vc1wiLFxuICBcImVzdGFuXCIsXG4gIFwiZXN0YW5kb1wiLFxuICBcImVzdGFyXCIsXG4gIFwiZXN0YXJlbW9zXCIsXG4gIFwiZXN0YXLDoVwiLFxuICBcImVzdGFyw6FuXCIsXG4gIFwiZXN0YXLDoXNcIixcbiAgXCJlc3RhcsOpXCIsXG4gIFwiZXN0YXLDqWlzXCIsXG4gIFwiZXN0YXLDrWFcIixcbiAgXCJlc3RhcsOtYWlzXCIsXG4gIFwiZXN0YXLDrWFtb3NcIixcbiAgXCJlc3RhcsOtYW5cIixcbiAgXCJlc3RhcsOtYXNcIixcbiAgXCJlc3Rhc1wiLFxuICBcImVzdGVcIixcbiAgXCJlc3RlbW9zXCIsXG4gIFwiZXN0b1wiLFxuICBcImVzdG9zXCIsXG4gIFwiZXN0b3lcIixcbiAgXCJlc3R1dmVcIixcbiAgXCJlc3R1dmllcmFcIixcbiAgXCJlc3R1dmllcmFpc1wiLFxuICBcImVzdHV2aWVyYW5cIixcbiAgXCJlc3R1dmllcmFzXCIsXG4gIFwiZXN0dXZpZXJvblwiLFxuICBcImVzdHV2aWVzZVwiLFxuICBcImVzdHV2aWVzZWlzXCIsXG4gIFwiZXN0dXZpZXNlblwiLFxuICBcImVzdHV2aWVzZXNcIixcbiAgXCJlc3R1dmltb3NcIixcbiAgXCJlc3R1dmlzdGVcIixcbiAgXCJlc3R1dmlzdGVpc1wiLFxuICBcImVzdHV2acOpcmFtb3NcIixcbiAgXCJlc3R1dmnDqXNlbW9zXCIsXG4gIFwiZXN0dXZvXCIsXG4gIFwiZXN0w6FcIixcbiAgXCJlc3TDoWJhbW9zXCIsXG4gIFwiZXN0w6Fpc1wiLFxuICBcImVzdMOhblwiLFxuICBcImVzdMOhc1wiLFxuICBcImVzdMOpXCIsXG4gIFwiZXN0w6lpc1wiLFxuICBcImVzdMOpblwiLFxuICBcImVzdMOpc1wiLFxuICBcImV4XCIsXG4gIFwiZXhpc3RlXCIsXG4gIFwiZXhpc3RlblwiLFxuICBcImV4cGxpY8OzXCIsXG4gIFwiZXhwcmVzw7NcIixcbiAgXCJmaW5cIixcbiAgXCJmdWVcIixcbiAgXCJmdWVyYVwiLFxuICBcImZ1ZXJhaXNcIixcbiAgXCJmdWVyYW5cIixcbiAgXCJmdWVyYXNcIixcbiAgXCJmdWVyb25cIixcbiAgXCJmdWVzZVwiLFxuICBcImZ1ZXNlaXNcIixcbiAgXCJmdWVzZW5cIixcbiAgXCJmdWVzZXNcIixcbiAgXCJmdWlcIixcbiAgXCJmdWltb3NcIixcbiAgXCJmdWlzdGVcIixcbiAgXCJmdWlzdGVpc1wiLFxuICBcImZ1w6lyYW1vc1wiLFxuICBcImZ1w6lzZW1vc1wiLFxuICBcImdyYW5cIixcbiAgXCJncmFuZGVzXCIsXG4gIFwiZ3Vlbm9cIixcbiAgXCJoYVwiLFxuICBcImhhYmVyXCIsXG4gIFwiaGFiaWRhXCIsXG4gIFwiaGFiaWRhc1wiLFxuICBcImhhYmlkb1wiLFxuICBcImhhYmlkb3NcIixcbiAgXCJoYWJpZW5kb1wiLFxuICBcImhhYnJlbW9zXCIsXG4gIFwiaGFicsOhXCIsXG4gIFwiaGFicsOhblwiLFxuICBcImhhYnLDoXNcIixcbiAgXCJoYWJyw6lcIixcbiAgXCJoYWJyw6lpc1wiLFxuICBcImhhYnLDrWFcIixcbiAgXCJoYWJyw61haXNcIixcbiAgXCJoYWJyw61hbW9zXCIsXG4gIFwiaGFicsOtYW5cIixcbiAgXCJoYWJyw61hc1wiLFxuICBcImhhYsOpaXNcIixcbiAgXCJoYWLDrWFcIixcbiAgXCJoYWLDrWFpc1wiLFxuICBcImhhYsOtYW1vc1wiLFxuICBcImhhYsOtYW5cIixcbiAgXCJoYWLDrWFzXCIsXG4gIFwiaGFjZVwiLFxuICBcImhhY2Vpc1wiLFxuICBcImhhY2Vtb3NcIixcbiAgXCJoYWNlblwiLFxuICBcImhhY2VyXCIsXG4gIFwiaGFjZXJsb1wiLFxuICBcImhhY2VzXCIsXG4gIFwiaGFjaWFcIixcbiAgXCJoYWNpZW5kb1wiLFxuICBcImhhZ29cIixcbiAgXCJoYW5cIixcbiAgXCJoYXNcIixcbiAgXCJoYXN0YVwiLFxuICBcImhheVwiLFxuICBcImhheWFcIixcbiAgXCJoYXlhbW9zXCIsXG4gIFwiaGF5YW5cIixcbiAgXCJoYXlhc1wiLFxuICBcImhhecOhaXNcIixcbiAgXCJoZVwiLFxuICBcImhlY2hvXCIsXG4gIFwiaGVtb3NcIixcbiAgXCJoaWNpZXJvblwiLFxuICBcImhpem9cIixcbiAgXCJob3lcIixcbiAgXCJodWJlXCIsXG4gIFwiaHViaWVyYVwiLFxuICBcImh1YmllcmFpc1wiLFxuICBcImh1YmllcmFuXCIsXG4gIFwiaHViaWVyYXNcIixcbiAgXCJodWJpZXJvblwiLFxuICBcImh1Ymllc2VcIixcbiAgXCJodWJpZXNlaXNcIixcbiAgXCJodWJpZXNlblwiLFxuICBcImh1Ymllc2VzXCIsXG4gIFwiaHViaW1vc1wiLFxuICBcImh1YmlzdGVcIixcbiAgXCJodWJpc3RlaXNcIixcbiAgXCJodWJpw6lyYW1vc1wiLFxuICBcImh1YmnDqXNlbW9zXCIsXG4gIFwiaHVib1wiLFxuICBcImlndWFsXCIsXG4gIFwiaW5jbHVzb1wiLFxuICBcImluZGljw7NcIixcbiAgXCJpbmZvcm3Ds1wiLFxuICBcImludGVudGFcIixcbiAgXCJpbnRlbnRhaXNcIixcbiAgXCJpbnRlbnRhbW9zXCIsXG4gIFwiaW50ZW50YW5cIixcbiAgXCJpbnRlbnRhclwiLFxuICBcImludGVudGFzXCIsXG4gIFwiaW50ZW50b1wiLFxuICBcImlyXCIsXG4gIFwianVudG9cIixcbiAgXCJsYVwiLFxuICBcImxhZG9cIixcbiAgXCJsYXJnb1wiLFxuICBcImxhc1wiLFxuICBcImxlXCIsXG4gIFwibGVzXCIsXG4gIFwibGxlZ8OzXCIsXG4gIFwibGxldmFcIixcbiAgXCJsbGV2YXJcIixcbiAgXCJsb1wiLFxuICBcImxvc1wiLFxuICBcImx1ZWdvXCIsXG4gIFwibHVnYXJcIixcbiAgXCJtYW5lcmFcIixcbiAgXCJtYW5pZmVzdMOzXCIsXG4gIFwibWF5b3JcIixcbiAgXCJtZVwiLFxuICBcIm1lZGlhbnRlXCIsXG4gIFwibWVqb3JcIixcbiAgXCJtZW5jaW9uw7NcIixcbiAgXCJtZW5vc1wiLFxuICBcIm1pXCIsXG4gIFwibWllbnRyYXNcIixcbiAgXCJtaW9cIixcbiAgXCJtaXNcIixcbiAgXCJtaXNtYVwiLFxuICBcIm1pc21hc1wiLFxuICBcIm1pc21vXCIsXG4gIFwibWlzbW9zXCIsXG4gIFwibW9kb1wiLFxuICBcIm1vbWVudG9cIixcbiAgXCJtdWNoYVwiLFxuICBcIm11Y2hhc1wiLFxuICBcIm11Y2hvXCIsXG4gIFwibXVjaG9zXCIsXG4gIFwibXV5XCIsXG4gIFwibcOhc1wiLFxuICBcIm3DrVwiLFxuICBcIm3DrWFcIixcbiAgXCJtw61hc1wiLFxuICBcIm3DrW9cIixcbiAgXCJtw61vc1wiLFxuICBcIm5hZGFcIixcbiAgXCJuYWRpZVwiLFxuICBcIm5pXCIsXG4gIFwibmluZ3VuYVwiLFxuICBcIm5pbmd1bmFzXCIsXG4gIFwibmluZ3Vub1wiLFxuICBcIm5pbmd1bm9zXCIsXG4gIFwibmluZ8O6blwiLFxuICBcIm5vXCIsXG4gIFwibm9zXCIsXG4gIFwibm9zb3RyYXNcIixcbiAgXCJub3NvdHJvc1wiLFxuICBcIm51ZXN0cmFcIixcbiAgXCJudWVzdHJhc1wiLFxuICBcIm51ZXN0cm9cIixcbiAgXCJudWVzdHJvc1wiLFxuICBcIm51ZXZhXCIsXG4gIFwibnVldmFzXCIsXG4gIFwibnVldm9cIixcbiAgXCJudWV2b3NcIixcbiAgXCJudW5jYVwiLFxuICBcIm9cIixcbiAgXCJvY2hvXCIsXG4gIFwib3NcIixcbiAgXCJvdHJhXCIsXG4gIFwib3RyYXNcIixcbiAgXCJvdHJvXCIsXG4gIFwib3Ryb3NcIixcbiAgXCJwYXJhXCIsXG4gIFwicGFyZWNlXCIsXG4gIFwicGFydGVcIixcbiAgXCJwYXJ0aXJcIixcbiAgXCJwYXNhZGFcIixcbiAgXCJwYXNhZG9cIixcbiAgXCJwZXJvXCIsXG4gIFwicGVzYXJcIixcbiAgXCJwb2NhXCIsXG4gIFwicG9jYXNcIixcbiAgXCJwb2NvXCIsXG4gIFwicG9jb3NcIixcbiAgXCJwb2RlaXNcIixcbiAgXCJwb2RlbW9zXCIsXG4gIFwicG9kZXJcIixcbiAgXCJwb2RyaWFcIixcbiAgXCJwb2RyaWFpc1wiLFxuICBcInBvZHJpYW1vc1wiLFxuICBcInBvZHJpYW5cIixcbiAgXCJwb2RyaWFzXCIsXG4gIFwicG9kcsOhXCIsXG4gIFwicG9kcsOhblwiLFxuICBcInBvZHLDrWFcIixcbiAgXCJwb2Ryw61hblwiLFxuICBcInBvbmVyXCIsXG4gIFwicG9yXCIsXG4gIFwicG9yIHF1w6lcIixcbiAgXCJwb3JxdWVcIixcbiAgXCJwb3NpYmxlXCIsXG4gIFwicHJpbWVyXCIsXG4gIFwicHJpbWVyYVwiLFxuICBcInByaW1lcm9cIixcbiAgXCJwcmltZXJvc1wiLFxuICBcInByaW5jaXBhbG1lbnRlXCIsXG4gIFwicHJvcGlhXCIsXG4gIFwicHJvcGlhc1wiLFxuICBcInByb3Bpb1wiLFxuICBcInByb3Bpb3NcIixcbiAgXCJwcsOzeGltb1wiLFxuICBcInByw7N4aW1vc1wiLFxuICBcInB1ZG9cIixcbiAgXCJwdWVkYVwiLFxuICBcInB1ZWRlXCIsXG4gIFwicHVlZGVuXCIsXG4gIFwicHVlZG9cIixcbiAgXCJwdWVzXCIsXG4gIFwicXVlXCIsXG4gIFwicXVlZMOzXCIsXG4gIFwicXVlcmVtb3NcIixcbiAgXCJxdWllblwiLFxuICBcInF1aWVuZXNcIixcbiAgXCJxdWllcmVcIixcbiAgXCJxdWnDqW5cIixcbiAgXCJxdcOpXCIsXG4gIFwicmVhbGl6YWRvXCIsXG4gIFwicmVhbGl6YXJcIixcbiAgXCJyZWFsaXrDs1wiLFxuICBcInJlc3BlY3RvXCIsXG4gIFwic2FiZVwiLFxuICBcInNhYmVpc1wiLFxuICBcInNhYmVtb3NcIixcbiAgXCJzYWJlblwiLFxuICBcInNhYmVyXCIsXG4gIFwic2FiZXNcIixcbiAgXCJzZVwiLFxuICBcInNlYVwiLFxuICBcInNlYW1vc1wiLFxuICBcInNlYW5cIixcbiAgXCJzZWFzXCIsXG4gIFwic2VndW5kYVwiLFxuICBcInNlZ3VuZG9cIixcbiAgXCJzZWfDum5cIixcbiAgXCJzZWlzXCIsXG4gIFwic2VyXCIsXG4gIFwic2VyZW1vc1wiLFxuICBcInNlcsOhXCIsXG4gIFwic2Vyw6FuXCIsXG4gIFwic2Vyw6FzXCIsXG4gIFwic2Vyw6lcIixcbiAgXCJzZXLDqWlzXCIsXG4gIFwic2Vyw61hXCIsXG4gIFwic2Vyw61haXNcIixcbiAgXCJzZXLDrWFtb3NcIixcbiAgXCJzZXLDrWFuXCIsXG4gIFwic2Vyw61hc1wiLFxuICBcInNlw6Fpc1wiLFxuICBcInNlw7FhbMOzXCIsXG4gIFwic2lcIixcbiAgXCJzaWRvXCIsXG4gIFwic2llbXByZVwiLFxuICBcInNpZW5kb1wiLFxuICBcInNpZXRlXCIsXG4gIFwic2lndWVcIixcbiAgXCJzaWd1aWVudGVcIixcbiAgXCJzaW5cIixcbiAgXCJzaW5vXCIsXG4gIFwic29icmVcIixcbiAgXCJzb2lzXCIsXG4gIFwic29sYVwiLFxuICBcInNvbGFtZW50ZVwiLFxuICBcInNvbGFzXCIsXG4gIFwic29sb1wiLFxuICBcInNvbG9zXCIsXG4gIFwic29tb3NcIixcbiAgXCJzb25cIixcbiAgXCJzb3lcIixcbiAgXCJzdVwiLFxuICBcInN1c1wiLFxuICBcInN1eWFcIixcbiAgXCJzdXlhc1wiLFxuICBcInN1eW9cIixcbiAgXCJzdXlvc1wiLFxuICBcInPDrVwiLFxuICBcInPDs2xvXCIsXG4gIFwidGFsXCIsXG4gIFwidGFtYmnDqW5cIixcbiAgXCJ0YW1wb2NvXCIsXG4gIFwidGFuXCIsXG4gIFwidGFudG9cIixcbiAgXCJ0ZVwiLFxuICBcInRlbmRyZW1vc1wiLFxuICBcInRlbmRyw6FcIixcbiAgXCJ0ZW5kcsOhblwiLFxuICBcInRlbmRyw6FzXCIsXG4gIFwidGVuZHLDqVwiLFxuICBcInRlbmRyw6lpc1wiLFxuICBcInRlbmRyw61hXCIsXG4gIFwidGVuZHLDrWFpc1wiLFxuICBcInRlbmRyw61hbW9zXCIsXG4gIFwidGVuZHLDrWFuXCIsXG4gIFwidGVuZHLDrWFzXCIsXG4gIFwidGVuZWRcIixcbiAgXCJ0ZW5laXNcIixcbiAgXCJ0ZW5lbW9zXCIsXG4gIFwidGVuZXJcIixcbiAgXCJ0ZW5nYVwiLFxuICBcInRlbmdhbW9zXCIsXG4gIFwidGVuZ2FuXCIsXG4gIFwidGVuZ2FzXCIsXG4gIFwidGVuZ29cIixcbiAgXCJ0ZW5nw6Fpc1wiLFxuICBcInRlbmlkYVwiLFxuICBcInRlbmlkYXNcIixcbiAgXCJ0ZW5pZG9cIixcbiAgXCJ0ZW5pZG9zXCIsXG4gIFwidGVuaWVuZG9cIixcbiAgXCJ0ZW7DqWlzXCIsXG4gIFwidGVuw61hXCIsXG4gIFwidGVuw61haXNcIixcbiAgXCJ0ZW7DrWFtb3NcIixcbiAgXCJ0ZW7DrWFuXCIsXG4gIFwidGVuw61hc1wiLFxuICBcInRlcmNlcmFcIixcbiAgXCJ0aVwiLFxuICBcInRpZW1wb1wiLFxuICBcInRpZW5lXCIsXG4gIFwidGllbmVuXCIsXG4gIFwidGllbmVzXCIsXG4gIFwidG9kYVwiLFxuICBcInRvZGFzXCIsXG4gIFwidG9kYXbDrWFcIixcbiAgXCJ0b2RvXCIsXG4gIFwidG9kb3NcIixcbiAgXCJ0b3RhbFwiLFxuICBcInRyYWJhamFcIixcbiAgXCJ0cmFiYWphaXNcIixcbiAgXCJ0cmFiYWphbW9zXCIsXG4gIFwidHJhYmFqYW5cIixcbiAgXCJ0cmFiYWphclwiLFxuICBcInRyYWJhamFzXCIsXG4gIFwidHJhYmFqb1wiLFxuICBcInRyYXNcIixcbiAgXCJ0cmF0YVwiLFxuICBcInRyYXbDqXNcIixcbiAgXCJ0cmVzXCIsXG4gIFwidHVcIixcbiAgXCJ0dXNcIixcbiAgXCJ0dXZlXCIsXG4gIFwidHV2aWVyYVwiLFxuICBcInR1dmllcmFpc1wiLFxuICBcInR1dmllcmFuXCIsXG4gIFwidHV2aWVyYXNcIixcbiAgXCJ0dXZpZXJvblwiLFxuICBcInR1dmllc2VcIixcbiAgXCJ0dXZpZXNlaXNcIixcbiAgXCJ0dXZpZXNlblwiLFxuICBcInR1dmllc2VzXCIsXG4gIFwidHV2aW1vc1wiLFxuICBcInR1dmlzdGVcIixcbiAgXCJ0dXZpc3RlaXNcIixcbiAgXCJ0dXZpw6lyYW1vc1wiLFxuICBcInR1dmnDqXNlbW9zXCIsXG4gIFwidHV2b1wiLFxuICBcInR1eWFcIixcbiAgXCJ0dXlhc1wiLFxuICBcInR1eW9cIixcbiAgXCJ0dXlvc1wiLFxuICBcInTDulwiLFxuICBcInVsdGltb1wiLFxuICBcInVuXCIsXG4gIFwidW5hXCIsXG4gIFwidW5hc1wiLFxuICBcInVub1wiLFxuICBcInVub3NcIixcbiAgXCJ1c2FcIixcbiAgXCJ1c2Fpc1wiLFxuICBcInVzYW1vc1wiLFxuICBcInVzYW5cIixcbiAgXCJ1c2FyXCIsXG4gIFwidXNhc1wiLFxuICBcInVzb1wiLFxuICBcInVzdGVkXCIsXG4gIFwidmFcIixcbiAgXCJ2YWlzXCIsXG4gIFwidmFsb3JcIixcbiAgXCJ2YW1vc1wiLFxuICBcInZhblwiLFxuICBcInZhcmlhc1wiLFxuICBcInZhcmlvc1wiLFxuICBcInZheWFcIixcbiAgXCJ2ZWNlc1wiLFxuICBcInZlclwiLFxuICBcInZlcmRhZFwiLFxuICBcInZlcmRhZGVyYVwiLFxuICBcInZlcmRhZGVyb1wiLFxuICBcInZlelwiLFxuICBcInZvc290cmFzXCIsXG4gIFwidm9zb3Ryb3NcIixcbiAgXCJ2b3lcIixcbiAgXCJ2dWVzdHJhXCIsXG4gIFwidnVlc3RyYXNcIixcbiAgXCJ2dWVzdHJvXCIsXG4gIFwidnVlc3Ryb3NcIixcbiAgXCJ5XCIsXG4gIFwieWFcIixcbiAgXCJ5b1wiLFxuICBcIsOpbFwiLFxuICBcIsOpcmFtb3NcIixcbiAgXCLDqXN0YVwiLFxuICBcIsOpc3Rhc1wiLFxuICBcIsOpc3RlXCIsXG4gIFwiw6lzdG9zXCIsXG4gIFwiw7psdGltYVwiLFxuICBcIsO6bHRpbWFzXCIsXG4gIFwiw7psdGltb1wiLFxuICBcIsO6bHRpbW9zXCJcbl07IiwiZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBzcGlyYWxSZXNvbHV0aW9uOiAxLFxuICBzcGlyYWxMaW1pdDogMzYwICogNSxcbiAgbGluZUhlaWdodDogMC44LFxuICB4V29yZFBhZGRpbmc6IDAsXG4gIHlXb3JkUGFkZGluZzogMyxcbiAgd2VpZ2h0RmFjdG9yOiA0MCxcbiAgdG9wTjogNDAsXG4gIG1heEhlaWdodDogMCxcbiAgcGFkZGluZzogMTBcbn07XG5cbmV4cG9ydCBjbGFzcyBXb3JkQ2xvdWRXaWRnZXQge1xuICBwcml2YXRlIF93b3JkczogQXJyYXk8QXJyYXk8YW55Pj4gPSBbXTtcbiAgcHJpdmF0ZSBfcGxhY2VkV29yZHM6IEFycmF5PHtlbGVtZW50OiBIVE1MRGl2RWxlbWVudCwgcmVjdDogRE9NUmVjdCwgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcn0+ID0gW107XG4gIHByaXZhdGUgX21pbldlaWdodCA9IDE7XG4gIHByaXZhdGUgX3dlaWdodEZhY3RvciA9IDE7XG4gIHByaXZhdGUgX3JlbmRlcmVkVGFyZ2V0OiBIVE1MRGl2RWxlbWVudCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9vcHRpb25zID0gZGVmYXVsdE9wdGlvbnMpIHtcbiAgfVxuXG4gIGNvbG9ycyA9IFtcImJsYWNrXCJdO1xuICBnZXQgd29yZHMoKTogQXJyYXk8QXJyYXk8YW55Pj4ge1xuICAgIHJldHVybiB0aGlzLl93b3JkcztcbiAgfVxuICBzZXQgd29yZHModzogQXJyYXk8QXJyYXk8YW55Pj4pIHtcbiAgICB0aGlzLl93b3JkcyA9IFtdLmNvbmNhdCh3IHx8IFtdKTtcbiAgICB0aGlzLl9taW5XZWlnaHQgPSAxO1xuICAgIHRoaXMuX3dlaWdodEZhY3RvciA9IDE7XG4gICAgaWYodGhpcy5fd29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fd29yZHMuc29ydCgoYSwgYikgPT4gLTEgKiAoYVsxXSAtIGJbMV0pKTtcbiAgICAgIHRoaXMuX21pbldlaWdodCA9IHRoaXMuX3dvcmRzW3RoaXMuX3dvcmRzLmxlbmd0aCAtIDFdWzFdO1xuICAgICAgdGhpcy5fd2VpZ2h0RmFjdG9yID0gKHRoaXMuX3dvcmRzWzBdWzFdIC0gdGhpcy5fbWluV2VpZ2h0ICsgMSkgLyB0aGlzLl9vcHRpb25zLndlaWdodEZhY3RvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdvcmRFbGVtZW50KHRleHQ6IHN0cmluZywgd2VpZ2h0OiBudW1iZXIsIGNvbG9yOiBudW1iZXIpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICBlbGVtZW50LnN0eWxlLmZvbnRTaXplID0gKHdlaWdodCAtIHRoaXMuX21pbldlaWdodCArIDEpIC8gdGhpcy5fd2VpZ2h0RmFjdG9yICsgXCJweFwiO1xuICAgIGVsZW1lbnQuc3R5bGUubGluZUhlaWdodCA9IHRoaXMuX29wdGlvbnMubGluZUhlaWdodCArIFwiZW1cIjtcbiAgICBpZih0aGlzLmNvbG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmNvbG9yID0gdGhpcy5jb2xvcnNbY29sb3IgJSB0aGlzLmNvbG9ycy5sZW5ndGhdO1xuICAgIH1cbiAgICBlbGVtZW50LnRpdGxlID0gdGV4dCArIFwiIChcIiArIHdlaWdodCArIFwiKVwiO1xuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHByaXZhdGUgaXNJbnRlcnNlY3RXaXRoUGxhY2VkKGN1cnJlbnRXb3JkUmVjdDogRE9NUmVjdCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9wbGFjZWRXb3Jkcy5sZW5ndGg7IGkrPTEpIHtcbiAgICAgIHZhciBleGlzdGluZ1dvcmRSZWN0ID0gdGhpcy5fcGxhY2VkV29yZHNbaV0ucmVjdDtcbiAgICAgIGlmKCEoY3VycmVudFdvcmRSZWN0LnJpZ2h0ICsgdGhpcy5fb3B0aW9ucy54V29yZFBhZGRpbmcgPCBleGlzdGluZ1dvcmRSZWN0LmxlZnQgLSB0aGlzLl9vcHRpb25zLnhXb3JkUGFkZGluZyB8fFxuICAgICAgICAgICBjdXJyZW50V29yZFJlY3QubGVmdCAtIHRoaXMuX29wdGlvbnMueFdvcmRQYWRkaW5nID4gZXhpc3RpbmdXb3JkUmVjdC5yaWdodCArIHRoaXMuX29wdGlvbnMueFdvcmRQYWRkaW5nIHx8XG4gICAgICAgICAgIGN1cnJlbnRXb3JkUmVjdC5ib3R0b20gKyB0aGlzLl9vcHRpb25zLnlXb3JkUGFkZGluZyA8IGV4aXN0aW5nV29yZFJlY3QudG9wIC0gdGhpcy5fb3B0aW9ucy55V29yZFBhZGRpbmcgfHxcbiAgICAgICAgICAgY3VycmVudFdvcmRSZWN0LnRvcCAtIHRoaXMuX29wdGlvbnMueVdvcmRQYWRkaW5nID4gZXhpc3RpbmdXb3JkUmVjdC5ib3R0b20gKyB0aGlzLl9vcHRpb25zLnlXb3JkUGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGFycmFuZ2VXb3JkcyhjbG91ZEVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50LCBzdGFydFBvaW50KSB7XG4gICAgY29uc3QgY3VycmVudFBvaW50ID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICAgIGxldCB5TWluID0gY3VycmVudFBvaW50Lnk7XG4gICAgbGV0IHlNYXggPSBjdXJyZW50UG9pbnQueTtcbiAgICBjb25zdCBkaXNwbGF5V29yZHNDb3VudCA9IE1hdGgubWluKHRoaXMuX29wdGlvbnMudG9wTiwgdGhpcy53b3Jkcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGxheVdvcmRzQ291bnQ7IGkgKz0gMSkge1xuICAgICAgdmFyIHdvcmRFbGVtZW50ID0gdGhpcy5jcmVhdGVXb3JkRWxlbWVudCh0aGlzLndvcmRzW2ldWzBdLCB0aGlzLndvcmRzW2ldWzFdLCBpKTtcbiAgICAgIGNsb3VkRWxlbWVudC5hcHBlbmRDaGlsZCh3b3JkRWxlbWVudCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuX29wdGlvbnMuc3BpcmFsTGltaXQ7IGorKykge1xuICAgICAgICBjb25zdCBhbmdsZSA9IHRoaXMuX29wdGlvbnMuc3BpcmFsUmVzb2x1dGlvbiAqIGo7XG4gICAgICAgIGN1cnJlbnRQb2ludC54ID0gKDEgKyBhbmdsZSkgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIGN1cnJlbnRQb2ludC55ID0gKDEgKyBhbmdsZSkgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGFydFBvaW50LnggKyBjdXJyZW50UG9pbnQueCAtIHdvcmRFbGVtZW50Lm9mZnNldFdpZHRoLzI7XG4gICAgICAgIGNvbnN0IHRvcCA9IHN0YXJ0UG9pbnQueSArIGN1cnJlbnRQb2ludC55IC0gd29yZEVsZW1lbnQub2Zmc2V0SGVpZ2h0LzI7XG4gICAgICAgIHdvcmRFbGVtZW50LnN0eWxlLmxlZnQgPSBsZWZ0ICsgXCJweFwiO1xuICAgICAgICB3b3JkRWxlbWVudC5zdHlsZS50b3AgPSB0b3AgKyBcInB4XCI7XG4gICAgICAgIGNvbnN0IHdvcmRSZWN0ID0gd29yZEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghdGhpcy5pc0ludGVyc2VjdFdpdGhQbGFjZWQod29yZFJlY3QpKSB7XG4gICAgICAgICAgdGhpcy5fcGxhY2VkV29yZHMucHVzaCh7XG4gICAgICAgICAgICBlbGVtZW50OiB3b3JkRWxlbWVudCxcbiAgICAgICAgICAgIHJlY3Q6IHdvcmRSZWN0LFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHRvcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih5TWluID4gY3VycmVudFBvaW50LnkpIHtcbiAgICAgICAgeU1pbiA9IGN1cnJlbnRQb2ludC55O1xuICAgICAgfVxuICAgICAgaWYoeU1heCA8IGN1cnJlbnRQb2ludC55KSB7XG4gICAgICAgIHlNYXggPSBjdXJyZW50UG9pbnQueTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt5TWluLCB5TWF4XTtcbiAgfVxuICBwdWJsaWMgcmVuZGVyKHRhcmdldDogSFRNTERpdkVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlZFRhcmdldCA9IHRhcmdldDtcbiAgICB2YXIgY2xvdWRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjbG91ZEVsZW1lbnQuY2xhc3NOYW1lID0gXCJzYS12aXN1YWxpemVyLXdvcmRjbG91ZFwiO1xuICAgIGNsb3VkRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoY2xvdWRFbGVtZW50KTtcblxuICAgIGlmKHRoaXMuX29wdGlvbnMubWF4SGVpZ2h0ID4gMCkge1xuICAgICAgY2xvdWRFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuX29wdGlvbnMubWF4SGVpZ2h0ICsgXCJweFwiO1xuICAgICAgY2xvdWRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJhdXRvXCI7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSB7XG4gICAgICB4OiBjbG91ZEVsZW1lbnQub2Zmc2V0V2lkdGggLyAyLFxuICAgICAgeTogY2xvdWRFbGVtZW50Lm9mZnNldEhlaWdodCAvIDJcbiAgICB9O1xuICAgIGNvbnN0IFt5TWluLCB5TWF4XSA9IHRoaXMuYXJyYW5nZVdvcmRzKGNsb3VkRWxlbWVudCwgc3RhcnRQb2ludCk7XG4gICAgaWYodGhpcy5fb3B0aW9ucy5tYXhIZWlnaHQgPT0gMCkge1xuICAgICAgY2xvdWRFbGVtZW50LnN0eWxlLmhlaWdodCA9IHlNYXggLSB5TWluICsgdGhpcy5fb3B0aW9ucy5wYWRkaW5nICogMiArIFwicHhcIjtcbiAgICB9XG4gICAgdGhpcy5fcGxhY2VkV29yZHMuZm9yRWFjaCh3b3JkSW5mbyA9PiB7XG4gICAgICB3b3JkSW5mby5lbGVtZW50LnN0eWxlLnRvcCA9IHdvcmRJbmZvLnRvcCAtIHlNaW4gKyB0aGlzLl9vcHRpb25zLnBhZGRpbmcgKyBcInB4XCI7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYoISF0aGlzLl9yZW5kZXJlZFRhcmdldCkge1xuICAgICAgdGhpcy5fcmVuZGVyZWRUYXJnZXQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHRoaXMuX3JlbmRlcmVkVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IHRleHRIZWxwZXIgfSBmcm9tIFwiLi9zdG9wd29yZHMvaW5kZXhcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuLy8gaW1wb3J0IFdvcmRDbG91ZExpYiBmcm9tIFwid29yZGNsb3VkXCI7XG5pbXBvcnQgeyBXb3JkQ2xvdWRXaWRnZXQsIGRlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vd2lkZ2V0XCI7XG5cbmV4cG9ydCBjbGFzcyBXb3JkQ2xvdWRBZGFwdGVyIHtcbiAgcHJpdmF0ZSBfd29yZGNsb3VkOiBhbnk7XG5cbiAgcHVibGljIHN0YXRpYyBkcmF3T3V0T2ZCb3VuZCA9IGZhbHNlO1xuICBwdWJsaWMgc3RhdGljIHNocmlua1RvRml0ID0gdHJ1ZTtcbiAgcHVibGljIHN0YXRpYyBhYm9ydFRocmVzaG9sZDogYW55ID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgc3RhdGljIHdlaWdodEZhY3RvciA9IDIwO1xuXG4gIHB1YmxpYyBzdGF0aWMgb25Xb3JkY2xvdWRDcmVhdGluZyA9IG5ldyBFdmVudDxcbiAgICAgIChzZW5kZXI6IFdvcmRDbG91ZCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgICBXb3JkQ2xvdWQsXG4gICAgICBhbnlcbiAgICA+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogV29yZENsb3VkKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29yZGNsb3VkKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRjbG91ZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV29yZENsb3VkMihub2RlOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLm1vZGVsLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLm1vZGVsLmdldENvbG9ycygpO1xuICAgIGNvbnN0IGNhbnZhc05vZGUgPSA8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiLCBcIlwiKVxuICAgICk7XG4gICAgY29uc3QgZW1wdHlUZXh0Tm9kZSA9IDxIVE1MRWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwicFwiLCBcIlwiLCB7XG4gICAgICBpbm5lclRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Jlc3VsdHNcIiksXG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5hcHBlbmRDaGlsZChjYW52YXNOb2RlKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGxpc3Q6IGRhdGEsXG4gICAgICB3ZWlnaHRGYWN0b3I6IFdvcmRDbG91ZEFkYXB0ZXIud2VpZ2h0RmFjdG9yLFxuICAgICAgYWJvcnRUaHJlc2hvbGQ6IFdvcmRDbG91ZEFkYXB0ZXIuYWJvcnRUaHJlc2hvbGQsXG4gICAgICBkcmF3T3V0T2ZCb3VuZDogV29yZENsb3VkQWRhcHRlci5kcmF3T3V0T2ZCb3VuZCxcbiAgICAgIHNocmlua1RvRml0OiBXb3JkQ2xvdWRBZGFwdGVyLnNocmlua1RvRml0LFxuICAgICAgZm9udEZhbWlseTogXCJTZWdvZSBVSSBCb2xkLCBzYW5zLXNlcmlmXCIsXG4gICAgICBjb2xvcjogKHdvcmQ6IHN0cmluZywgd2VpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0UmFuZG9tQ29sb3IoKTtcbiAgICAgIH0sXG4gICAgICByb3RhdGVSYXRpbzogMC41LFxuICAgICAgcm90YXRpb25TdGVwczogMixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBjbGljazogZnVuY3Rpb24gKGl0ZW06IGFueSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZyhpdGVtWzBdICsgXCI6IFwiICsgaXRlbVsxXSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY2FudmFzOiBjYW52YXNOb2RlLFxuICAgICAgY29uZmlnXG4gICAgfTtcbiAgICBXb3JkQ2xvdWRBZGFwdGVyLm9uV29yZGNsb3VkQ3JlYXRpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICAvLyB0aGlzLl93b3JkY2xvdWQgPSBXb3JkQ2xvdWRMaWIob3B0aW9ucy5jYW52YXMsIG9wdGlvbnMuY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRjbG91ZDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLm1vZGVsLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLm1vZGVsLmdldENvbG9ycygpO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBlbXB0eVRleHROb2RlID0gPEhUTUxFbGVtZW50PkRvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIFwiXCIsIHtcbiAgICAgICAgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9SZXN1bHRzXCIpLFxuICAgICAgfSk7XG4gICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGVtcHR5VGV4dE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmYXVsdE9wdGlvbnMpKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY29uZmlnXG4gICAgfTtcbiAgICBXb3JkQ2xvdWRBZGFwdGVyLm9uV29yZGNsb3VkQ3JlYXRpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICB0aGlzLl93b3JkY2xvdWQgPSBuZXcgV29yZENsb3VkV2lkZ2V0KGNvbmZpZyk7XG4gICAgdGhpcy5fd29yZGNsb3VkLmNvbG9ycyA9IHRoaXMubW9kZWwuZ2V0Q29sb3JzKCk7XG4gICAgdGhpcy5fd29yZGNsb3VkLndvcmRzID0gZGF0YTtcbiAgICB0aGlzLl93b3JkY2xvdWQucmVuZGVyKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLl93b3JkY2xvdWQ7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmKHRoaXMuX3dvcmRjbG91ZCAmJiB0eXBlb2YgdGhpcy5fd29yZGNsb3VkLmRpc3Bvc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5fd29yZGNsb3VkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fd29yZGNsb3VkID0gdW5kZWZpbmVkO1xuICB9XG59XG5leHBvcnQgY2xhc3MgV29yZENsb3VkIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwcml2YXRlIF93b3JkY2xvdWRBZGFwdGVyOiBXb3JkQ2xvdWRBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcIndvcmRjbG91ZFwiKTtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyID0gbmV3IFdvcmRDbG91ZEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpOiBhbnkge1xuICAgIGxldCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICAgIGxldCBzdG9wV29yZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbG9jYWxlID0gbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gICAgaWYgKGxvY2FsZSkge1xuICAgICAgc3RvcFdvcmRzID0gdGV4dEhlbHBlci5nZXRTdG9wV29yZHMobG9jYWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcFdvcmRzID0gdGV4dEhlbHBlci5nZXRTdG9wV29yZHMoKTtcbiAgICB9XG4gICAgY29uc3QgY2xlYXJXb3JkUmVnZXhwID0gbmV3IFJlZ0V4cChcIlsuLFxcLyMhJCVcXF5cXCo7Ont9PVxcLV9gfigpXVwiLCBcImdcIik7XG5cbiAgICBjb25zdCBzdG9wVGhlV29yZCA9ICh3b3JkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChzdG9wV29yZHMuaW5kZXhPZih3b3JkKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29yZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc1N0cmluZyA9IChyb3c6IHN0cmluZykgPT4ge1xuICAgICAgcm93ID0gXCJcIiArIHJvdztcbiAgICAgIC8vIGlmIChyb3cubGVuZ3RoID4gMTUpIHJvdyA9IHJvdy5zdWJzdHJpbmcoMCwgMTQpICsgXCIuLi5cIjtcblxuICAgICAgaWYgKCEhcm93KSB7XG4gICAgICAgIHJvdy5zcGxpdChcIiBcIikuZm9yRWFjaCgod29yZCkgPT4ge1xuICAgICAgICAgIGxldCBjbGVhcmVkV29yZCA9ICh3b3JkIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShjbGVhcldvcmRSZWdleHAsIFwiXCIpO1xuICAgICAgICAgIGNsZWFyZWRXb3JkID0gc3RvcFRoZVdvcmQoY2xlYXJlZFdvcmQpO1xuICAgICAgICAgIGlmICghIWNsZWFyZWRXb3JkKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdFtjbGVhcmVkV29yZF0pIHtcbiAgICAgICAgICAgICAgcmVzdWx0W2NsZWFyZWRXb3JkXSA9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHRbY2xlYXJlZFdvcmRdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1t0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICAgICAgaWYgKCEhcm93VmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUuZm9yRWFjaChwcm9jZXNzU3RyaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb3dWYWx1ZSkuZm9yRWFjaCgoa2V5KSA9PlxuICAgICAgICAgICAgICBwcm9jZXNzU3RyaW5nKHJvd1ZhbHVlW2tleV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzU3RyaW5nKHJvd1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHQpLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4gW2tleSwgcmVzdWx0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyLmRlc3Ryb3koY29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZEFkYXB0ZXIuY3JlYXRlKGNvbnRhaW5lcik7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyLmRlc3Ryb3kodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwidGV4dFwiLCBXb3JkQ2xvdWQpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY29tbWVudFwiLCBXb3JkQ2xvdWQpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibXVsdGlwbGV0ZXh0XCIsIFdvcmRDbG91ZCk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcGxvdGx5X2pzX2Rpc3RfbWluX187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3N1cnZleV9jb3JlX187Il0sInNvdXJjZVJvb3QiOiIifQ==
15647
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bcGMtbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1twYy1uYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc3ZnYnVuZGxlLmh0bWwiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vbm9kZV9tb2R1bGVzL211dXJpL2Rpc3QvbXV1cmkuanMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZhcnNpLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vaXRhbGlhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9qYXBhbmVzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vcG9ydHVndWVzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3NwYW5pc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Nob2ljZXMtdGFibGUuc2Nzcz9hNjhlIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9jaG9pY2VzLXRhYmxlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9kYXRhUHJvdmlkZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2VudHJpZXMvc3VtbWFyeS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvZmlsdGVySW5mby50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvaGlzdG9ncmFtLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9sYXlvdXRFbmdpbmUudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2xvY2FsaXphdGlvbk1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL21hdHJpeC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvbWF0cml4RHJvcGRvd25Hcm91cGVkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9ucHMuc2Nzcz8xZjIyIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9ucHMudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL251bWJlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9oaXN0b2dyYW0udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9pbmRleC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L21hdHJpeC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L21hdHJpeGRyb3Bkb3duLWdyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9yYW5raW5nLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvcmF0aW5nLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvc2VsZWN0QmFzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3NldHVwLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9zZWxlY3RCYXNlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy90ZXh0LnNjc3M/MmM0ZSIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdGV4dC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdXRpbHMvaGVscGVycy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdXRpbHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25NYW5hZ2VyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25NYXRyaXhEeW5hbWljLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWwuc2Nzcz8zYzgyIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWwudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25QYW5lbER5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJCYXNlLnNjc3M/YWZiZCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXplckJhc2UudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2R1dGNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2VuZ2xpc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC9zdG9wd29yZHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC9zdG9wd29yZHMvbm9yd2VnaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL3NwYW5pc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC93aWRnZXQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC93b3JkY2xvdWQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdL2V4dGVybmFsIHtcInJvb3RcIjpcIlBsb3RseVwiLFwiY29tbW9uanMyXCI6XCJwbG90bHkuanMtZGlzdC1taW5cIixcImNvbW1vbmpzXCI6XCJwbG90bHkuanMtZGlzdC1taW5cIixcImFtZFwiOlwicGxvdGx5LmpzLWRpc3QtbWluXCJ9Iiwid2VicGFjazovL1twYy1uYW1lXS9leHRlcm5hbCB7XCJyb290XCI6XCJTdXJ2ZXlcIixcImNvbW1vbmpzMlwiOlwic3VydmV5LWNvcmVcIixcImNvbW1vbmpzXCI6XCJzdXJ2ZXktY29yZVwiLFwiYW1kXCI6XCJzdXJ2ZXktY29yZVwifSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO1FDVkE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaUNBQWlDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEscUNBQXFDO0FBQ2xELGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0IseURBQXlEO0FBQ3hGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHlEQUF5RDtBQUNuRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsS0FBSztBQUNsQixhQUFhLEtBQUs7QUFDbEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsS0FBSztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxFQUFFO0FBQ2YsYUFBYSxFQUFFO0FBQ2YsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQixhQUFhLG9CQUFvQjtBQUNqQyxhQUFhLFlBQVk7QUFDekIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isd0RBQXdEO0FBQ3ZGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdEQUF3RDtBQUMvRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3REFBd0Q7QUFDeEY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsYUFBYSxPQUFPO0FBQ3BCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEIsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FB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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLG1CQUFtQjtBQUNoQyxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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Q04sTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsSUFBSTtJQUNKLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxJQUFJO0lBQ0osTUFBTTtJQUNOLE1BQU07SUFDTixJQUFJO0lBQ0osTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsTUFBTTtJQUNOLEdBQUc7SUFDSCxNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixJQUFJO0lBQ0osT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLFFBQVE7SUFDUixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFPO0lBQ1AsT0FBTztJQUNQLElBQUk7SUFDSixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxJQUFJO0lBQ0osT0FBTztJQUNQLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7Q0FDVCxDQUFDOzs7Ozs7Ozs7Ozs7O0FDdEdGO0FBQUE7QUFBTyxJQUFJLFNBQVMsR0FBRztJQUNyQixLQUFLO0lBQ0wsR0FBRztJQUNILE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULEtBQUs7SUFDTCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFVBQVU7SUFDVixRQUFRO0lBQ1IsT0FBTztJQUNQLElBQUk7SUFDSixLQUFLO0lBQ0wsU0FBUztJQUNULEtBQUs7SUFDTCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLFFBQVE7SUFDUixNQUFNO0lBQ04sSUFBSTtJQUNKLE1BQU07SUFDTixHQUFHO0lBQ0gsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLElBQUk7SUFDSixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsSUFBSTtJQUNKLEdBQUc7SUFDSCxNQUFNO0lBQ04sS0FBSztJQUNMLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sT0FBTztJQUNQLEdBQUc7SUFDSCxLQUFLO0lBQ0wsUUFBUTtJQUNSLFdBQVc7SUFDWCxhQUFhO0lBQ2IsSUFBSTtJQUNKLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsR0FBRztJQUNILE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLEtBQUs7SUFDTCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsWUFBWTtJQUNaLFlBQVk7SUFDWixHQUFHO0lBQ0gsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxZQUFZO0lBQ1osVUFBVTtJQUNWLEdBQUc7SUFDSCxNQUFNO0lBQ04sU0FBUztJQUNULFdBQVc7SUFDWCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLElBQUk7SUFDSixPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLEdBQUc7SUFDSCxLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsS0FBSztJQUNMLFNBQVM7SUFDVCxLQUFLO0lBQ0wsS0FBSztJQUNMLFNBQVM7SUFDVCxHQUFHO0lBQ0gsSUFBSTtJQUNKLFdBQVc7SUFDWCxJQUFJO0lBQ0osVUFBVTtJQUNWLFlBQVk7SUFDWixhQUFhO0lBQ2IsV0FBVztJQUNYLE1BQU07SUFDTixJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxRQUFRO0lBQ1IsR0FBRztJQUNILE1BQU07SUFDTixHQUFHO0lBQ0gsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLEdBQUc7SUFDSCxPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULEdBQUc7SUFDSCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxJQUFJO0lBQ0osUUFBUTtJQUNSLFNBQVM7SUFDVCxLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLElBQUk7SUFDSixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixJQUFJO0lBQ0osUUFBUTtJQUNSLEdBQUc7SUFDSCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsTUFBTTtJQUNOLElBQUk7SUFDSixRQUFRO0lBQ1IsS0FBSztJQUNMLE9BQU87SUFDUCxLQUFLO0lBQ0wsU0FBUztJQUNULEtBQUs7SUFDTCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxHQUFHO0lBQ0gsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxJQUFJO0lBQ0osT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sR0FBRztJQUNILE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxLQUFLO0lBQ0wsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFlBQVk7SUFDWixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixLQUFLO0lBQ0wsTUFBTTtJQUNOLEdBQUc7SUFDSCxPQUFPO0lBQ1AsR0FBRztJQUNILFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLEdBQUc7SUFDSCxNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsS0FBSztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxLQUFLO0lBQ0wsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixJQUFJO0lBQ0osTUFBTTtJQUNOLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixHQUFHO0lBQ0gsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sSUFBSTtJQUNKLE9BQU87SUFDUCxVQUFVO0lBQ1YsS0FBSztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLEtBQUs7SUFDTCxHQUFHO0lBQ0gsT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixHQUFHO0lBQ0gsTUFBTTtJQUNOLEdBQUc7SUFDSCxNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sSUFBSTtJQUNKLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsR0FBRztJQUNILEdBQUc7SUFDSCxNQUFNO0lBQ04sT0FBTztJQUNQLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLE9BQU87SUFDUCxHQUFHO0NBQ0osQ0FBQzs7Ozs7Ozs7Ozs7OztBQy9hRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBc0M7QUFDaUI7QUFDSjtBQUNFO0FBRXJELElBQUksbUJBQW1CLEdBQXVDLEVBQUUsQ0FBQztBQUNqRSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxrREFBUyxDQUFDO0FBQ3RDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLG9EQUFXLENBQUM7QUFDeEMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsZ0RBQVcsQ0FBQztBQUN4QyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxrREFBVyxDQUFDO0FBRWpDLElBQUksVUFBVSxHQUFHO0lBQ3RCLFlBQVksRUFBRSxVQUFDLE1BQW1CO1FBQW5CLG9DQUFtQjtRQUNoQyxPQUFPLG1CQUFtQixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkQsQ0FBQztDQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNmRjtBQUFBO0FBQU8sSUFBSSxTQUFTLEdBQUc7SUFDckIsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLElBQUk7SUFDSixJQUFJO0lBQ0osTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLEtBQUs7SUFDTCxJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsS0FBSztJQUNMLE9BQU87SUFDUCxJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxNQUFNO0lBQ04sSUFBSTtJQUNKLE1BQU07SUFDTixRQUFRO0lBQ1IsSUFBSTtJQUNKLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLElBQUk7SUFDSixLQUFLO0lBQ0wsUUFBUTtJQUNSLFFBQVE7SUFDUixLQUFLO0lBQ0wsSUFBSTtJQUNKLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsR0FBRztJQUNILE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsS0FBSztJQUNMLE9BQU87SUFDUCxNQUFNO0lBQ04sSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLFNBQVM7SUFDVCxPQUFPO0lBQ1AsS0FBSztJQUNMLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLFdBQVc7SUFDWCxNQUFNO0lBQ04sS0FBSztJQUNMLFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxJQUFJO0lBQ0osTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07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LENBQUM7UUFDdEQsaUJBQU0sT0FBTyxXQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxDQXZGOEIsOERBQWMsR0F1RjVDOztBQUVELDBFQUFvQixDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMzRCwwRUFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDOUQsMEVBQW9CLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7QUNwTW5FLGdFOzs7Ozs7Ozs7OztBQ0FBLHlEIiwiZmlsZSI6InN1cnZleS5hbmFseXRpY3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJwbG90bHkuanMtZGlzdC1taW5cIiksIHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleUFuYWx5dGljc1wiLCBbXCJwbG90bHkuanMtZGlzdC1taW5cIiwgXCJzdXJ2ZXktY29yZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTdXJ2ZXlBbmFseXRpY3NcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJwbG90bHkuanMtZGlzdC1taW5cIiksIHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5QW5hbHl0aWNzXCJdID0gZmFjdG9yeShyb290W1wiUGxvdGx5XCJdLCByb290W1wiU3VydmV5XCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcGxvdGx5X2pzX2Rpc3RfbWluX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfc3VydmV5X2NvcmVfXykge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2VudHJpZXMvc3VtbWFyeS50c1wiKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHN0eWxlPVxcXCJkaXNwbGF5Om5vbmU7XFxcIj48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1kZXRhaWxcXFwiPjxjaXJjbGUgY3g9XFxcIjEuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCI3LjVcXFwiIGN5PVxcXCI4LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjeD1cXFwiMTMuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1kcmFnXFxcIj48cGF0aCBkPVxcXCJNMTMgNWwtMSAxIDEgMUg5VjNsMSAxIDEtMS0zLTMtMyAzIDEgMSAxLTF2NEgzbDEtMS0xLTEtMyAzIDMgMyAxLTEtMS0xaDR2NGwtMS0xLTEgMSAzIDMgMy0zLTEtMS0xIDFWOWg0bC0xIDEgMSAxIDMtM3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1oaWRlXFxcIj48cGF0aCBkPVxcXCJNMTIuNzkgNC4yTDE2IDFsLTEtMS0zLjMyIDMuMzJDMTAuNTcgMi41NSA5LjMyIDIgOCAyIDMuNjMgMiAwIDcuOTcgMCA3Ljk3czEuMjcgMi4xIDMuMjEgMy44MmwtMy4yMyAzLjIzLjk4Ljk4IDMuMzUtMy4zNEM1LjQxIDEzLjQ0IDYuNjcgMTQgOCAxNGM0LjM3IDAgOC02IDgtNnMtMS4yNy0yLjA5LTMuMjEtMy44ek0yIDcuOTdjMS4wNy0xLjQ3IDMuNjEtNCA2LTQgLjggMCAxLjYuMjcgMi4zNS42OGwtLjc4Ljc4Yy0uNDYtLjI5LS45OS0uNDYtMS41Ny0uNDYtMS42NiAwLTMgMS4zNC0zIDMgMCAuNTguMTcgMS4xMS40NiAxLjU3bC0uOTcuOTdBMTMuMzggMTMuMzggMCAwIDEgMiA3Ljk3em02IDRjLS44IDAtMS41OS0uMjctMi4zMy0uNjdsLjc4LS43N2MuNDUuMjcuOTguNDQgMS41NS40NCAxLjY2IDAgMy0xLjM0IDMtMyAwLS41Ny0uMTctMS4wOS0uNDQtMS41NWwuOTgtLjk4YzEuMTEuODcgMi4wMSAxLjkxIDIuNDYgMi41Mi0xLjA3IDEuNDgtMy42MSA0LjAxLTYgNC4wMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tYWtlcHJpdmF0ZVxcXCI+PGNpcmNsZSBjeD1cXFwiOFxcXCIgY3k9XFxcIjRcXFwiIHI9XFxcIjNcXFwiPjwvY2lyY2xlPjxwYXRoIGQ9XFxcIk04IDhjLTMuMzEgMC02IDIuNzMtNiA0LjY3UzUuMjcgMTUgOCAxNXM2LS40IDYtMi4zM1MxMS4zMSA4IDggOHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tYWtlcHVibGljXFxcIj48Y2lyY2xlIGN4PVxcXCI2XFxcIiBjeT1cXFwiNVxcXCIgcj1cXFwiM1xcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTEwIDVjMCAuMzQtLjA2LjY3LS4xNC45OS4wNSAwIC4wOS4wMS4xNC4wMSAxLjY2IDAgMy0xLjM0IDMtM3MtMS4zNC0zLTMtM0M4Ljk3IDAgOC4wNy41MiA3LjUzIDEuMyA4Ljk4IDEuOTEgMTAgMy4zMyAxMCA1ek02IDljLTMuMzEgMC02IDIuNzMtNiA0LjY3UzMuMjcgMTYgNiAxNnM2LS40IDYtMi4zM1M5LjMxIDkgNiA5ek0xMCA3Yy0uMTkgMC0uMzguMDEtLjU3LjAzYTQuMTQgNC4xNCAwIDAgMS0xLjM3IDEuMzljMyAuODMgNS4yMyAzLjMxIDUuNDIgNS4yOCAxLjQ0LS4zMSAyLjUyLS45MiAyLjUyLTIuMDNDMTYgOS43NCAxMy4zMSA3IDEwIDd6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJzYS1zdmctbW92ZXRvZGV0YWlsc1xcXCI+PGNpcmNsZSBjeD1cXFwiMS41XFxcIiBjeT1cXFwiMTQuNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCI3LjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjEzLjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxwYXRoIGQ9XFxcIk0xMiAxaDN2OWgtM3pNMi4wMiA3LjAyTDEgNiAwIDdsMyAzIDMtMy0xLTEtLjk0Ljk0QzQuMzMgNC43MyA2LjIxIDMgOC41IDNjLjE3IDAgLjMzLjAzLjUuMDVWMS4wM0M4LjgzIDEuMDEgOC42NyAxIDguNSAxIDUuMDggMSAyLjI3IDMuNjYgMi4wMiA3LjAyelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW5vbmNvbW1lcmNpYWxcXFwiPjxwYXRoIGQ9XFxcIk04IDBMMCAxNWgxNkw4IDB6bTEgMTNIN3YtMmgydjJ6bS0yLTNWNWgydjVIN3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1zb3J0aW5nXFxcIj48cGF0aCBkPVxcXCJNOCAzbDIgMiAxLTEtMy0zLTMgMyAxIDF6TTggMTNsLTItMi0xIDEgMyAzIDMtMy0xLTF6XFxcIj48L3BhdGg+PC9zeW1ib2w+PC9zdmc+XCI7IiwiLyoqXG4qIE11dXJpIHYwLjguMFxuKiBodHRwczovL2dpdGh1Yi5jb20vaGFsdHUvbXV1cmlcbiogQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEhhbHR1IE95XG4qIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuKiBodHRwczovL2dpdGh1Yi5jb20vaGFsdHUvbXV1cmkvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxuKiBAbGljZW5zZSBNSVRcbipcbiogTXV1cmkgUGFja2VyXG4qIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBOaWtsYXMgUsOkbcO2IDxpbnJhbW9AZ21haWwuY29tPlxuKiBAbGljZW5zZSBNSVRcbipcbiogTXV1cmkgVGlja2VyIC8gTXV1cmkgRW1pdHRlciAvIE11dXJpIFF1ZXVlXG4qIENvcHlyaWdodCAoYykgMjAxOC1wcmVzZW50LCBOaWtsYXMgUsOkbcO2IDxpbnJhbW9AZ21haWwuY29tPlxuKiBAbGljZW5zZSBNSVRcbiovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuTXV1cmkgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbmFtZXNwYWNlID0gJ011dXJpJztcbiAgdmFyIGdyaWRJbnN0YW5jZXMgPSB7fTtcblxuICB2YXIgYWN0aW9uU3dhcCA9ICdzd2FwJztcbiAgdmFyIGFjdGlvbk1vdmUgPSAnbW92ZSc7XG5cbiAgdmFyIGV2ZW50U3luY2hyb25pemUgPSAnc3luY2hyb25pemUnO1xuICB2YXIgZXZlbnRMYXlvdXRTdGFydCA9ICdsYXlvdXRTdGFydCc7XG4gIHZhciBldmVudExheW91dEVuZCA9ICdsYXlvdXRFbmQnO1xuICB2YXIgZXZlbnRBZGQgPSAnYWRkJztcbiAgdmFyIGV2ZW50UmVtb3ZlID0gJ3JlbW92ZSc7XG4gIHZhciBldmVudFNob3dTdGFydCA9ICdzaG93U3RhcnQnO1xuICB2YXIgZXZlbnRTaG93RW5kID0gJ3Nob3dFbmQnO1xuICB2YXIgZXZlbnRIaWRlU3RhcnQgPSAnaGlkZVN0YXJ0JztcbiAgdmFyIGV2ZW50SGlkZUVuZCA9ICdoaWRlRW5kJztcbiAgdmFyIGV2ZW50RmlsdGVyID0gJ2ZpbHRlcic7XG4gIHZhciBldmVudFNvcnQgPSAnc29ydCc7XG4gIHZhciBldmVudE1vdmUgPSAnbW92ZSc7XG4gIHZhciBldmVudFNlbmQgPSAnc2VuZCc7XG4gIHZhciBldmVudEJlZm9yZVNlbmQgPSAnYmVmb3JlU2VuZCc7XG4gIHZhciBldmVudFJlY2VpdmUgPSAncmVjZWl2ZSc7XG4gIHZhciBldmVudEJlZm9yZVJlY2VpdmUgPSAnYmVmb3JlUmVjZWl2ZSc7XG4gIHZhciBldmVudERyYWdJbml0ID0gJ2RyYWdJbml0JztcbiAgdmFyIGV2ZW50RHJhZ1N0YXJ0ID0gJ2RyYWdTdGFydCc7XG4gIHZhciBldmVudERyYWdNb3ZlID0gJ2RyYWdNb3ZlJztcbiAgdmFyIGV2ZW50RHJhZ1Njcm9sbCA9ICdkcmFnU2Nyb2xsJztcbiAgdmFyIGV2ZW50RHJhZ0VuZCA9ICdkcmFnRW5kJztcbiAgdmFyIGV2ZW50RHJhZ1JlbGVhc2VTdGFydCA9ICdkcmFnUmVsZWFzZVN0YXJ0JztcbiAgdmFyIGV2ZW50RHJhZ1JlbGVhc2VFbmQgPSAnZHJhZ1JlbGVhc2VFbmQnO1xuICB2YXIgZXZlbnREZXN0cm95ID0gJ2Rlc3Ryb3knO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVyIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICovXG4gIGZ1bmN0aW9uIEVtaXR0ZXIoKSB7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBsaXN0ZW5lcnMgcXVldWUgYW5kIGNyZWF0ZSBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycykgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XSA9IFtdO1xuXG4gICAgLy8gQWRkIHRoZSBsaXN0ZW5lciB0byB0aGUgcXVldWUuXG4gICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBhbGwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2xpc3RlbmVyXVxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBHZXQgbGlzdGVuZXJzIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgbm9uZSBpcyBmb3VuZC5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBJZiBubyBzcGVjaWZpYyBsaXN0ZW5lciBpcyBwcm92aWRlZCByZW1vdmUgYWxsIGxpc3RlbmVycy5cbiAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgbWF0Y2hpbmcgbGlzdGVuZXJzLlxuICAgIHZhciBpID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAobGlzdGVuZXIgPT09IGxpc3RlbmVyc1tpXSkgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRW1pdCBhbGwgbGlzdGVuZXJzIGluIGEgc3BlY2lmaWVkIGV2ZW50IHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRW1pdHRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7Kn0gW2FyZzFdXG4gICAqIEBwYXJhbSB7Kn0gW2FyZzJdXG4gICAqIEBwYXJhbSB7Kn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBldmVudCBsaXN0ZW5lcnMgYW5kIHF1aXQgZWFybHkgaWYgdGhlcmUncyBubyBsaXN0ZW5lcnMuXG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHFMZW5ndGggPSBxdWV1ZS5sZW5ndGg7XG4gICAgdmFyIGFMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB2YXIgaTtcblxuICAgIC8vIEFkZCB0aGUgY3VycmVudCBsaXN0ZW5lcnMgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGJlZm9yZSB3ZSBwcm9jZXNzIHRoZW0uXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ3VhcmFudGVlIHRoYXQgYWxsIG9mIHRoZSBsaXN0ZW5lcnMgYXJlIGNhbGxlZCBpblxuICAgIC8vIGNvcnJlY3Qgb3JkZXIgZXZlbiBpZiBuZXcgZXZlbnQgbGlzdGVuZXJzIGFyZSByZW1vdmVkL2FkZGVkIGR1cmluZ1xuICAgIC8vIHByb2Nlc3NpbmcgYW5kL29yIGV2ZW50cyBhcmUgZW1pdHRlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gSW5jcmVtZW50IHF1ZXVlIGNvdW50ZXIuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc2NlbmFyaW9zIHdoZXJlIGVtaXQgaXNcbiAgICAvLyB0cmlnZ2VyZWQgd2hpbGUgdGhlIHF1ZXVlIGlzIGFscmVhZHkgcHJvY2Vzc2luZy4gV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mXG4gICAgLy8gaG93IG1hbnkgXCJxdWV1ZSBwcm9jZXNzb3JzXCIgdGhlcmUgYXJlIGFjdGl2ZSBzbyB0aGF0IHdlIGNhbiBzYWZlbHkgcmVzZXRcbiAgICAvLyB0aGUgcXVldWUgaW4gdGhlIGVuZCB3aGVuIHRoZSBsYXN0IHF1ZXVlIHByb2Nlc3NvciBpcyBmaW5pc2hlZC5cbiAgICArK3RoaXMuX2NvdW50ZXI7XG5cbiAgICAvLyBQcm9jZXNzIHRoZSBxdWV1ZSAodGhlIHNwZWNpZmljIHBhcnQgb2YgaXQgZm9yIHRoaXMgZW1pdCkuXG4gICAgZm9yIChpID0gcUxlbmd0aCwgcUxlbmd0aCA9IHF1ZXVlLmxlbmd0aDsgaSA8IHFMZW5ndGg7IGkrKykge1xuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICBhTGVuZ3RoID09PSAwID8gcXVldWVbaV0oKSA6XG4gICAgICBhTGVuZ3RoID09PSAxID8gcXVldWVbaV0oYXJnMSkgOlxuICAgICAgYUxlbmd0aCA9PT0gMiA/IHF1ZXVlW2ldKGFyZzEsIGFyZzIpIDpcbiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZVtpXShhcmcxLCBhcmcyLCBhcmczKTtcblxuICAgICAgLy8gU3RvcCBwcm9jZXNzaW5nIGlmIHRoZSBlbWl0dGVyIGlzIGRlc3Ryb3llZC5cbiAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRGVjcmVtZW50IHF1ZXVlIHByb2Nlc3MgY291bnRlci5cbiAgICAtLXRoaXMuX2NvdW50ZXI7XG5cbiAgICAvLyBSZXNldCB0aGUgcXVldWUgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcXVldWUgcHJvY2Vzc2VzIHJ1bm5pbmcuXG4gICAgaWYgKCF0aGlzLl9jb3VudGVyKSBxdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgZW1pdHRlciBpbnN0YW5jZS4gQmFzaWNhbGx5IGp1c3QgcmVtb3ZlcyBhbGwgYm91bmQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICB2YXIgZXZlbnQ7XG5cbiAgICAvLyBGbGFnIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAvLyBSZXNldCBxdWV1ZSAoaWYgcXVldWUgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgdGhpcyB3aWxsIGFsc28gc3RvcCB0aGF0KS5cbiAgICB0aGlzLl9xdWV1ZS5sZW5ndGggPSB0aGlzLl9jb3VudGVyID0gMDtcblxuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgIGZvciAoZXZlbnQgaW4gZXZlbnRzKSB7XG4gICAgICBpZiAoZXZlbnRzW2V2ZW50XSkge1xuICAgICAgICBldmVudHNbZXZlbnRdLmxlbmd0aCA9IDA7XG4gICAgICAgIGV2ZW50c1tldmVudF0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gU2V0IHVwIHRoZSBkZWZhdWx0IGV4cG9ydCB2YWx1ZXMuXG4gIHZhciB0cmFuc2Zvcm1TdHlsZSA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgdHJhbnNmb3JtUHJvcCA9ICd0cmFuc2Zvcm0nO1xuXG4gIC8vIEZpbmQgdGhlIHN1cHBvcnRlZCB0cmFuc2Zvcm0gcHJvcCBhbmQgc3R5bGUgbmFtZXMuXG4gIHZhciBkb2NFbGVtU3R5bGUgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuICB2YXIgc3R5bGUgPSAndHJhbnNmb3JtJztcbiAgdmFyIHN0eWxlQ2FwID0gJ1RyYW5zZm9ybSc7XG4gIHZhciBmb3VuZCA9IGZhbHNlO1xuICBbJycsICdXZWJraXQnLCAnTW96JywgJ08nLCAnbXMnXS5mb3JFYWNoKGZ1bmN0aW9uKHByZWZpeCkge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIHZhciBwcm9wTmFtZSA9IHByZWZpeCA/IHByZWZpeCArIHN0eWxlQ2FwIDogc3R5bGU7XG4gICAgaWYgKGRvY0VsZW1TdHlsZVtwcm9wTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gcHJlZml4LnRvTG93ZXJDYXNlKCk7XG4gICAgICB0cmFuc2Zvcm1TdHlsZSA9IHByZWZpeCA/ICctJyArIHByZWZpeCArICctJyArIHN0eWxlIDogc3R5bGU7XG4gICAgICB0cmFuc2Zvcm1Qcm9wID0gcHJvcE5hbWU7XG4gICAgICBmb3VuZCA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICB2YXIgc3R5bGVzQ2FjaGUgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBXZWFrTWFwKCkgOiBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhbiBlbGVtZW50J3Mgc3R5bGUgcHJvcGVydHkgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZShlbGVtZW50LCBzdHlsZSkge1xuICAgIHZhciBzdHlsZXMgPSBzdHlsZXNDYWNoZSAmJiBzdHlsZXNDYWNoZS5nZXQoZWxlbWVudCk7XG4gICAgaWYgKCFzdHlsZXMpIHtcbiAgICAgIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICAgICAgaWYgKHN0eWxlc0NhY2hlKSBzdHlsZXNDYWNoZS5zZXQoZWxlbWVudCwgc3R5bGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlID09PSAndHJhbnNmb3JtJyA/IHRyYW5zZm9ybVN0eWxlIDogc3R5bGUpO1xuICB9XG5cbiAgdmFyIHN0eWxlTmFtZVJlZ0V4ID0gLyhbQS1aXSkvZztcblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBhIGNhbWVsIGNhc2Ugc3R5bGUgcHJvcGVydHkgdG8ga2ViYWIgY2FzZSBzdHlsZSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3R5bGVOYW1lKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShzdHlsZU5hbWVSZWdFeCwgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICB2YXIgc3RyRnVuY3Rpb24gPSAnZnVuY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gc3RyRnVuY3Rpb247XG4gIH1cblxuICB2YXIgdHJhbnNmb3JtU3R5bGUkMSA9ICd0cmFuc2Zvcm0nO1xuXG4gIC8qKlxuICAgKiBTZXQgaW5saW5lIHN0eWxlcyB0byBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZXNcbiAgICovXG4gIGZ1bmN0aW9uIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHN0eWxlcykge1xuICAgICAgZWxlbWVudC5zdHlsZVtwcm9wID09PSB0cmFuc2Zvcm1TdHlsZSQxID8gdHJhbnNmb3JtUHJvcCA6IHByb3BdID0gc3R5bGVzW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVtIGFuaW1hdGlvbiBoYW5kbGVyIHBvd2VyZWQgYnkgV2ViIEFuaW1hdGlvbnMgQVBJLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbUFuaW1hdGUoZWxlbWVudCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2FuaW1hdGlvbiA9IG51bGw7XG4gICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX3Byb3BzID0gW107XG4gICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgdGhpcy5fa2V5ZnJhbWVzID0gW107XG4gICAgdGhpcy5fb3B0aW9ucyA9IHt9O1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fb25GaW5pc2ggPSB0aGlzLl9vbkZpbmlzaC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGluc3RhbmNlJ3MgYW5pbWF0aW9uLiBBdXRvbWF0aWNhbGx5IHN0b3BzIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzXG4gICAqIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNGcm9tXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1RvXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmVhc2luZz0nZWFzZSddXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ocHJvcHNGcm9tLCBwcm9wc1RvLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0aW9uO1xuICAgIHZhciBjdXJyZW50UHJvcHMgPSB0aGlzLl9wcm9wcztcbiAgICB2YXIgY3VycmVudFZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgY2FuY2VsQW5pbWF0aW9uID0gZmFsc2U7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGFuaW1hdGlvbiBydW5uaW5nLCBsZXQncyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZVxuICAgIC8vIGNhbmNlbGxlZCBvciBpZiBpdCBjYW4gY29udGludWUgcnVubmluZy5cbiAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICB2YXIgcHJvcENvdW50ID0gMDtcbiAgICAgIHZhciBwcm9wSW5kZXg7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgYW5pbWF0aW9uIHRhcmdldCBwcm9wcyBhbmQgdmFsdWVzIG1hdGNoIHdpdGggdGhlXG4gICAgICAvLyBjdXJyZW50IHByb3BzIGFuZCB2YWx1ZXMuXG4gICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wc1RvKSB7XG4gICAgICAgICsrcHJvcENvdW50O1xuICAgICAgICBwcm9wSW5kZXggPSBjdXJyZW50UHJvcHMuaW5kZXhPZihwcm9wTmFtZSk7XG4gICAgICAgIGlmIChwcm9wSW5kZXggPT09IC0xIHx8IHByb3BzVG9bcHJvcE5hbWVdICE9PSBjdXJyZW50VmFsdWVzW3Byb3BJbmRleF0pIHtcbiAgICAgICAgICBjYW5jZWxBbmltYXRpb24gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgcHJvcHMgY291bnQgbWF0Y2hlcyBjdXJyZW50IHByb3BzIGNvdW50LiBUaGlzIGlzXG4gICAgICAvLyBuZWVkZWQgZm9yIHRoZSBlZGdlIGNhc2Ugc2NlbmFyaW8gd2hlcmUgdGFyZ2V0IHByb3BzIGNvbnRhaW4gdGhlIHNhbWVcbiAgICAgIC8vIHN0eWxlcyBhcyBjdXJyZW50IHByb3BzLCBidXQgdGhlIGN1cnJlbnQgcHJvcHMgaGF2ZSBzb21lIGFkZGl0aW9uYWxcbiAgICAgIC8vIHByb3BzLlxuICAgICAgaWYgKCFjYW5jZWxBbmltYXRpb24gJiYgcHJvcENvdW50ICE9PSBjdXJyZW50UHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIGFuaW1hdGlvbiAoaWYgcmVxdWlyZWQpLlxuICAgIGlmIChjYW5jZWxBbmltYXRpb24pIGFuaW1hdGlvbi5jYW5jZWwoKTtcblxuICAgIC8vIFN0b3JlIGFuaW1hdGlvbiBjYWxsYmFjay5cbiAgICB0aGlzLl9jYWxsYmFjayA9IGlzRnVuY3Rpb24ob3B0cy5vbkZpbmlzaCkgPyBvcHRzLm9uRmluaXNoIDogbnVsbDtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBydW5uaW5nIGFuaW1hdGlvbiB0aGF0IGRvZXMgbm90IG5lZWQgdG8gYmUgY2FuY2VsbGVkLCBsZXQnc1xuICAgIC8vIGNhbGwgaXQgYSBkYXkgaGVyZSBhbmQgbGV0IGl0IHJ1bi5cbiAgICBpZiAoYW5pbWF0aW9uICYmICFjYW5jZWxBbmltYXRpb24pIHJldHVybjtcblxuICAgIC8vIFN0b3JlIHRhcmdldCBwcm9wcyBhbmQgdmFsdWVzIHRvIGluc3RhbmNlLlxuICAgIGN1cnJlbnRQcm9wcy5sZW5ndGggPSBjdXJyZW50VmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBwcm9wc1RvKSB7XG4gICAgICBjdXJyZW50UHJvcHMucHVzaChwcm9wTmFtZSk7XG4gICAgICBjdXJyZW50VmFsdWVzLnB1c2gocHJvcHNUb1twcm9wTmFtZV0pO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBrZXlmcmFtZXMuXG4gICAgdmFyIGFuaW1LZXlmcmFtZXMgPSB0aGlzLl9rZXlmcmFtZXM7XG4gICAgYW5pbUtleWZyYW1lc1swXSA9IHByb3BzRnJvbTtcbiAgICBhbmltS2V5ZnJhbWVzWzFdID0gcHJvcHNUbztcblxuICAgIC8vIFNldCB1cCBvcHRpb25zLlxuICAgIHZhciBhbmltT3B0aW9ucyA9IHRoaXMuX29wdGlvbnM7XG4gICAgYW5pbU9wdGlvbnMuZHVyYXRpb24gPSBvcHRzLmR1cmF0aW9uIHx8IDMwMDtcbiAgICBhbmltT3B0aW9ucy5lYXNpbmcgPSBvcHRzLmVhc2luZyB8fCAnZWFzZSc7XG5cbiAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIGFuaW1hdGlvbiA9IGVsZW1lbnQuYW5pbWF0ZShhbmltS2V5ZnJhbWVzLCBhbmltT3B0aW9ucyk7XG4gICAgYW5pbWF0aW9uLm9uZmluaXNoID0gdGhpcy5fb25GaW5pc2g7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gYW5pbWF0aW9uO1xuXG4gICAgLy8gU2V0IHRoZSBlbmQgc3R5bGVzLiBUaGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgZWxlbWVudCBzdGF5cyBhdCB0aGUgZW5kXG4gICAgLy8gdmFsdWVzIGFmdGVyIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC5cbiAgICBzZXRTdHlsZXMoZWxlbWVudCwgcHJvcHNUbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3AgaW5zdGFuY2UncyBjdXJyZW50IGFuaW1hdGlvbiBpZiBydW5uaW5nLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtQW5pbWF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtzdHlsZXNdXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKHN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5fYW5pbWF0aW9uKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX3Byb3BzO1xuICAgIHZhciBjdXJyZW50VmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgIHZhciBwcm9wTmFtZTtcbiAgICB2YXIgcHJvcFZhbHVlO1xuICAgIHZhciBpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIChpZiBub3QgcHJvdmlkZWQpIGFuZCBzZXQgc3R5bGVzLlxuICAgIGlmICghc3R5bGVzKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY3VycmVudFByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb3BOYW1lID0gY3VycmVudFByb3BzW2ldO1xuICAgICAgICBwcm9wVmFsdWUgPSBnZXRTdHlsZShlbGVtZW50LCBnZXRTdHlsZU5hbWUocHJvcE5hbWUpKTtcbiAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wTmFtZSA9PT0gJ3RyYW5zZm9ybScgPyB0cmFuc2Zvcm1Qcm9wIDogcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKTtcbiAgICB9XG5cbiAgICAvLyAgQ2FuY2VsIGFuaW1hdGlvbi5cbiAgICB0aGlzLl9hbmltYXRpb24uY2FuY2VsKCk7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuXG4gICAgLy8gUmVzZXQgY3VycmVudCBwcm9wcyBhbmQgdmFsdWVzLlxuICAgIGN1cnJlbnRQcm9wcy5sZW5ndGggPSBjdXJyZW50VmFsdWVzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBpdGVtIGlzIGJlaW5nIGFuaW1hdGVkIGN1cnJlbnRseS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuaXNBbmltYXRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9hbmltYXRpb247XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLnN0b3AoKTtcbiAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5fb3B0aW9ucyA9IHRoaXMuX2tleWZyYW1lcyA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFuaW1hdGlvbiBlbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYWxsYmFjayA9IHRoaXMuX2NhbGxiYWNrO1xuICAgIHRoaXMuX2FuaW1hdGlvbiA9IHRoaXMuX2NhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9wcm9wcy5sZW5ndGggPSB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICB9O1xuXG4gIHZhciB2ZW5kb3JQcmVmaXhlcyA9IFsnJywgJ3dlYmtpdCcsICdtb3onLCAnbXMnLCAnbycsICdXZWJraXQnLCAnTW96JywgJ01TJywgJ08nXTtcblxuICAvKipcbiAgICogR2V0IHByZWZpeGVkIENTUyBwcm9wZXJ0eSBuYW1lIHdoZW4gZ2l2ZW4gYSBub24tcHJlZml4ZWQgQ1NTIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtU3R5bGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lXG4gICAqIEByZXR1cm5zIHshU3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UHJlZml4ZWRQcm9wTmFtZShlbGVtU3R5bGUsIHByb3BOYW1lKSB7XG4gICAgdmFyIGNhbWVsUHJvcE5hbWUgPSBwcm9wTmFtZVswXS50b1VwcGVyQ2FzZSgpICsgcHJvcE5hbWUuc2xpY2UoMSk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBwcmVmaXg7XG4gICAgdmFyIHByZWZpeGVkUHJvcE5hbWU7XG5cbiAgICB3aGlsZSAoaSA8IHZlbmRvclByZWZpeGVzLmxlbmd0aCkge1xuICAgICAgcHJlZml4ID0gdmVuZG9yUHJlZml4ZXNbaV07XG4gICAgICBwcmVmaXhlZFByb3BOYW1lID0gcHJlZml4ID8gcHJlZml4ICsgY2FtZWxQcm9wTmFtZSA6IHByb3BOYW1lO1xuICAgICAgaWYgKHByZWZpeGVkUHJvcE5hbWUgaW4gZWxlbVN0eWxlKSByZXR1cm4gcHJlZml4ZWRQcm9wTmFtZTtcbiAgICAgICsraTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBkdCA9IDEwMDAgLyA2MDtcblxuICB2YXIgcmFmID0gKFxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhkdCk7XG4gICAgICB9LCBkdCk7XG4gICAgfVxuICApLmJpbmQod2luZG93KTtcblxuICAvLyBEZXRlY3Qgc3VwcG9ydCBmb3IgcGFzc2l2ZSBldmVudHM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kI2ZlYXR1cmUtZGV0ZWN0aW9uXG4gIHZhciBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgcGFzc2l2ZU9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaXNQYXNzaXZlRXZlbnRzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmUnLCBudWxsLCBwYXNzaXZlT3B0cyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgcGFzc2l2ZU9wdHMpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIC8vIERyYWdnZXIgZXZlbnRzLlxuICB2YXIgZXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnc3RhcnQnLFxuICAgIG1vdmU6ICdtb3ZlJyxcbiAgICBlbmQ6ICdlbmQnLFxuICAgIGNhbmNlbDogJ2NhbmNlbCdcbiAgfTtcblxuICB2YXIgaGFzVG91Y2hFdmVudHMgPSAhISgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgd2luZG93LlRvdWNoRXZlbnQpO1xuICB2YXIgaGFzUG9pbnRlckV2ZW50cyA9ICEhd2luZG93LlBvaW50ZXJFdmVudDtcbiAgdmFyIGhhc01zUG9pbnRlckV2ZW50cyA9ICEhd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkO1xuICB2YXIgaXNBbmRyb2lkID0gLyhhbmRyb2lkKS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB2YXIgbGlzdGVuZXJPcHRpb25zID0gaXNQYXNzaXZlRXZlbnRzU3VwcG9ydGVkID8geyBwYXNzaXZlOiB0cnVlIH0gOiBmYWxzZTtcblxuICB2YXIgdGFQcm9wID0gJ3RvdWNoQWN0aW9uJztcbiAgdmFyIHRhUHJvcFByZWZpeGVkID0gZ2V0UHJlZml4ZWRQcm9wTmFtZSh3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLCB0YVByb3ApO1xuICB2YXIgdGFEZWZhdWx0VmFsdWUgPSAnYXV0byc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgRHJhZ2dlciBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2Nzc1Byb3BzXVxuICAgKi9cbiAgZnVuY3Rpb24gRHJhZ2dlcihlbGVtZW50LCBjc3NQcm9wcykge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fY3NzUHJvcHMgPSB7fTtcbiAgICB0aGlzLl90b3VjaEFjdGlvbiA9ICcnO1xuICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuX3N0YXJ0WCA9IDA7XG4gICAgdGhpcy5fc3RhcnRZID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFkgPSAwO1xuXG4gICAgdGhpcy5fcHJlU3RhcnRDaGVjayA9IHRoaXMuX3ByZVN0YXJ0Q2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUgPSB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblN0YXJ0ID0gdGhpcy5fb25TdGFydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uTW92ZSA9IHRoaXMuX29uTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQ2FuY2VsID0gdGhpcy5fb25DYW5jZWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkVuZCA9IHRoaXMuX29uRW5kLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBcHBseSBpbml0aWFsIGNzcyBwcm9wcy5cbiAgICB0aGlzLnNldENzc1Byb3BzKGNzc1Byb3BzKTtcblxuICAgIC8vIElmIHRvdWNoIGFjdGlvbiB3YXMgbm90IHByb3ZpZGVkIHdpdGggaW5pdGlhbCBjc3MgcHJvcHMgbGV0J3MgYXNzdW1lIGl0J3NcbiAgICAvLyBhdXRvLlxuICAgIGlmICghdGhpcy5fdG91Y2hBY3Rpb24pIHtcbiAgICAgIHRoaXMuc2V0VG91Y2hBY3Rpb24odGFEZWZhdWx0VmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgbmF0aXZlIGxpbmsvaW1hZ2UgZHJhZ2dpbmcgZm9yIHRoZSBpdGVtIGFuZCBpdCdzIGFuY2VzdG9ycy5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gc3RhcnQgZXZlbnQuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX2V2ZW50cy5zdGFydCwgdGhpcy5fcHJlU3RhcnRDaGVjaywgbGlzdGVuZXJPcHRpb25zKTtcblxuICAgIC8vIElmIHdlIGhhdmUgdG91Y2ggZXZlbnRzLCBidXQgbm8gcG9pbnRlciBldmVudHMgd2UgbmVlZCB0byBhbHNvIGxpc3RlbiBmb3JcbiAgICAvLyBtb3VzZSBldmVudHMgaW4gYWRkaXRpb24gdG8gdG91Y2ggZXZlbnRzIGZvciBkZXZpY2VzIHdoaWNoIHN1cHBvcnQgYm90aFxuICAgIC8vIG1vdXNlIGFuZCB0b3VjaCBpbnRlcmFjdGlvbi5cbiAgICBpZiAoaGFzVG91Y2hFdmVudHMgJiYgIWhhc1BvaW50ZXJFdmVudHMgJiYgIWhhc01zUG9pbnRlckV2ZW50cykge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX21vdXNlRXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgcHJvcGVydGllc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICBEcmFnZ2VyLl9wb2ludGVyRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAncG9pbnRlcmRvd24nLFxuICAgIG1vdmU6ICdwb2ludGVybW92ZScsXG4gICAgY2FuY2VsOiAncG9pbnRlcmNhbmNlbCcsXG4gICAgZW5kOiAncG9pbnRlcnVwJ1xuICB9O1xuXG4gIERyYWdnZXIuX21zUG9pbnRlckV2ZW50cyA9IHtcbiAgICBzdGFydDogJ01TUG9pbnRlckRvd24nLFxuICAgIG1vdmU6ICdNU1BvaW50ZXJNb3ZlJyxcbiAgICBjYW5jZWw6ICdNU1BvaW50ZXJDYW5jZWwnLFxuICAgIGVuZDogJ01TUG9pbnRlclVwJ1xuICB9O1xuXG4gIERyYWdnZXIuX3RvdWNoRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAndG91Y2hzdGFydCcsXG4gICAgbW92ZTogJ3RvdWNobW92ZScsXG4gICAgY2FuY2VsOiAndG91Y2hjYW5jZWwnLFxuICAgIGVuZDogJ3RvdWNoZW5kJ1xuICB9O1xuXG4gIERyYWdnZXIuX21vdXNlRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICBtb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgICBjYW5jZWw6ICcnLFxuICAgIGVuZDogJ21vdXNldXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fZXZlbnRzID0gKGZ1bmN0aW9uKCkge1xuICAgIGlmIChoYXNQb2ludGVyRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fcG9pbnRlckV2ZW50cztcbiAgICBpZiAoaGFzTXNQb2ludGVyRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fbXNQb2ludGVyRXZlbnRzO1xuICAgIGlmIChoYXNUb3VjaEV2ZW50cykgcmV0dXJuIERyYWdnZXIuX3RvdWNoRXZlbnRzO1xuICAgIHJldHVybiBEcmFnZ2VyLl9tb3VzZUV2ZW50cztcbiAgfSkoKTtcblxuICBEcmFnZ2VyLl9lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTtcblxuICBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMgPSBbXTtcblxuICAvKipcbiAgICogUHJvdGVjdGVkIHN0YXRpYyBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCAmJiBlLmNhbmNlbGFibGUgIT09IGZhbHNlKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgRHJhZ2dlci5fYWN0aXZhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGluZGV4ID0gRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpO1xuICAgIGlmIChpbmRleCA+IC0xKSByZXR1cm47XG5cbiAgICBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMubW92ZSwgaW5zdGFuY2UuX29uTW92ZSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMuY2FuY2VsLCBpbnN0YW5jZS5fb25DYW5jZWwpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub24oZXZlbnRzLmVuZCwgaW5zdGFuY2UuX29uRW5kKTtcblxuICAgIGlmIChEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBEcmFnZ2VyLl9iaW5kTGlzdGVuZXJzKCk7XG4gICAgfVxuICB9O1xuXG4gIERyYWdnZXIuX2RlYWN0aXZhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGluZGV4ID0gRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5tb3ZlLCBpbnN0YW5jZS5fb25Nb3ZlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9mZihldmVudHMuY2FuY2VsLCBpbnN0YW5jZS5fb25DYW5jZWwpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5lbmQsIGluc3RhbmNlLl9vbkVuZCk7XG5cbiAgICBpZiAoIURyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgIERyYWdnZXIuX3VuYmluZExpc3RlbmVycygpO1xuICAgIH1cbiAgfTtcblxuICBEcmFnZ2VyLl9iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZSwgRHJhZ2dlci5fb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy5lbmQsIERyYWdnZXIuX29uRW5kLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGV2ZW50cy5jYW5jZWwgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRzLmNhbmNlbCwgRHJhZ2dlci5fb25DYW5jZWwsIGxpc3RlbmVyT3B0aW9ucyk7XG4gIH07XG5cbiAgRHJhZ2dlci5fdW5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZSwgRHJhZ2dlci5fb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5lbmQsIERyYWdnZXIuX29uRW5kLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGV2ZW50cy5jYW5jZWwgJiYgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRzLmNhbmNlbCwgRHJhZ2dlci5fb25DYW5jZWwsIGxpc3RlbmVyT3B0aW9ucyk7XG4gIH07XG5cbiAgRHJhZ2dlci5fZ2V0RXZlbnRQb2ludGVySWQgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIElmIHdlIGhhdmUgcG9pbnRlciBpZCBhdmFpbGFibGUgbGV0J3MgdXNlIGl0LlxuICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlcklkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJJZDtcbiAgICB9XG5cbiAgICAvLyBGb3IgdG91Y2ggZXZlbnRzIGxldCdzIGdldCB0aGUgZmlyc3QgY2hhbmdlZCB0b3VjaCdzIGlkZW50aWZpZXIuXG4gICAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7XG4gICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gPyBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbW91c2Uvb3RoZXIgZXZlbnRzIGxldCdzIHByb3ZpZGUgYSBzdGF0aWMgaWQuXG4gICAgcmV0dXJuIDE7XG4gIH07XG5cbiAgRHJhZ2dlci5fZ2V0VG91Y2hCeUlkID0gZnVuY3Rpb24oZXZlbnQsIGlkKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIHBvaW50ZXIgZXZlbnQgcmV0dXJuIHRoZSB3aG9sZSBldmVudCBpZiB0aGVyZSdzIGEgbWF0Y2gsIGFuZFxuICAgIC8vIG51bGwgb3RoZXJ3aXNlLlxuICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlcklkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJJZCA9PT0gaWQgPyBldmVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRvdWNoIGV2ZW50cyBsZXQncyBjaGVjayBpZiB0aGVyZSdzIGEgY2hhbmdlZCB0b3VjaCBvYmplY3QgdGhhdCBtYXRjaGVzXG4gICAgLy8gdGhlIHBvaW50ZXJJZCBpbiB3aGljaCBjYXNlIHJldHVybiB0aGUgdG91Y2ggb2JqZWN0LlxuICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllciA9PT0gaWQpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZvciBtb3VzZS9vdGhlciBldmVudHMgbGV0J3MgYXNzdW1lIHRoZXJlJ3Mgb25seSBvbmUgcG9pbnRlciBhbmQganVzdFxuICAgIC8vIHJldHVybiB0aGUgZXZlbnQuXG4gICAgcmV0dXJuIGV2ZW50O1xuICB9O1xuXG4gIERyYWdnZXIuX29uTW92ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLmVtaXQoZXZlbnRzLm1vdmUsIGUpO1xuICB9O1xuXG4gIERyYWdnZXIuX29uQ2FuY2VsID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMuY2FuY2VsLCBlKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9vbkVuZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLmVtaXQoZXZlbnRzLmVuZCwgZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogUmVzZXQgY3VycmVudCBkcmFnIG9wZXJhdGlvbiAoaWYgYW55KS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3BvaW50ZXJJZCA9IG51bGw7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLl9zdGFydFggPSAwO1xuICAgIHRoaXMuX3N0YXJ0WSA9IDA7XG4gICAgdGhpcy5fY3VycmVudFggPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRZID0gMDtcbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gbnVsbDtcblxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LFxuICAgICAgdGhpcy5fYWJvcnROb25DYW5jZWxhYmxlLFxuICAgICAgbGlzdGVuZXJPcHRpb25zXG4gICAgKTtcblxuICAgIERyYWdnZXIuX2RlYWN0aXZhdGVJbnN0YW5jZSh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgY3VzdG9tIGRyYWdnZXIgZXZlbnQgZnJvbSBhIHJhdyBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqIEByZXR1cm5zIHtEcmFnZ2VyRXZlbnR9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fY3JlYXRlRXZlbnQgPSBmdW5jdGlvbih0eXBlLCBlKSB7XG4gICAgdmFyIHRvdWNoID0gdGhpcy5fZ2V0VHJhY2tlZFRvdWNoKGUpO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBIYW1tZXIuanMgY29tcGF0aWJpbGl0eSBpbnRlcmZhY2UuXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgc3JjRXZlbnQ6IGUsXG4gICAgICBkaXN0YW5jZTogdGhpcy5nZXREaXN0YW5jZSgpLFxuICAgICAgZGVsdGFYOiB0aGlzLmdldERlbHRhWCgpLFxuICAgICAgZGVsdGFZOiB0aGlzLmdldERlbHRhWSgpLFxuICAgICAgZGVsdGFUaW1lOiB0eXBlID09PSBldmVudHMuc3RhcnQgPyAwIDogdGhpcy5nZXREZWx0YVRpbWUoKSxcbiAgICAgIGlzRmlyc3Q6IHR5cGUgPT09IGV2ZW50cy5zdGFydCxcbiAgICAgIGlzRmluYWw6IHR5cGUgPT09IGV2ZW50cy5lbmQgfHwgdHlwZSA9PT0gZXZlbnRzLmNhbmNlbCxcbiAgICAgIC8vIFBhcnRpYWwgVG91Y2ggQVBJIGludGVyZmFjZS5cbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuX3BvaW50ZXJJZCxcbiAgICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgICBzY3JlZW5ZOiB0b3VjaC5zY3JlZW5ZLFxuICAgICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgICBwYWdlWDogdG91Y2gucGFnZVgsXG4gICAgICBwYWdlWTogdG91Y2gucGFnZVksXG4gICAgICB0YXJnZXQ6IHRvdWNoLnRhcmdldFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgYSByYXcgZXZlbnQgYXMgZHJhZ2dlciBldmVudCBpbnRlcm5hbGx5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9lbWl0ID0gZnVuY3Rpb24odHlwZSwgZSkge1xuICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCh0eXBlLCB0aGlzLl9jcmVhdGVFdmVudCh0eXBlLCBlKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwcm92aWRlZCBldmVudCBpcyBhIFBvaW50ZXJFdmVudCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBpdCBpZiBpdCBoYXNcbiAgICogdGhlIHNhbWUgcG9pbnRlcklkIGFzIHRoZSBpbnN0YW5jZS4gSWYgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIGEgVG91Y2hFdmVudFxuICAgKiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBsb29rIGZvciBhIFRvdWNoIGluc3RhbmNlIGluIHRoZSBjaGFuZ2VkVG91Y2hlcyB0aGF0XG4gICAqIGhhcyBhbiBpZGVudGlmaWVyIG1hdGNoaW5nIHRoaXMgaW5zdGFuY2UncyBwb2ludGVySWQuIElmIHRoZSBwcm92aWRlZCBldmVudFxuICAgKiBpcyBhIE1vdXNlRXZlbnQgKG9yIGp1c3QgYW55IG90aGVyIGV2ZW50IHRoYW4gUG9pbnRlckV2ZW50IG9yIFRvdWNoRXZlbnQpXG4gICAqIGl0IHdpbGwgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX1cbiAgICogQHJldHVybnMgez8oVG91Y2h8UG9pbnRlckV2ZW50fE1vdXNlRXZlbnQpfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2dldFRyYWNrZWRUb3VjaCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAodGhpcy5fcG9pbnRlcklkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIERyYWdnZXIuX2dldFRvdWNoQnlJZChlLCB0aGlzLl9wb2ludGVySWQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQSBwcmUtaGFuZGxlciBmb3Igc3RhcnQgZXZlbnQgdGhhdCBjaGVja3MgaWYgd2UgY2FuIHN0YXJ0IGRyYWdnaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9wcmVTdGFydENoZWNrID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgLy8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIG5vdCBiZWluZyBkcmFnZ2VkIGN1cnJlbnRseS5cbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKCkpIHJldHVybjtcblxuICAgIC8vIFNwZWNpYWwgY2FuY2VsYWJsZSBjaGVjayBmb3IgQW5kcm9pZCB0byBwcmV2ZW50IGRyYWcgcHJvY2VkdXJlIGZyb21cbiAgICAvLyBzdGFydGluZyBpZiBuYXRpdmUgc2Nyb2xsaW5nIGlzIGluIHByb2dyZXNzLiBQYXJ0IDEuXG4gICAgaWYgKGlzQW5kcm9pZCAmJiBlLmNhbmNlbGFibGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAvLyBNYWtlIHN1cmUgbGVmdCBidXR0b24gaXMgcHJlc3NlZCBvbiBtb3VzZS5cbiAgICBpZiAoZS5idXR0b24pIHJldHVybjtcblxuICAgIC8vIEdldCAoYW5kIHNldCkgcG9pbnRlciBpZC5cbiAgICB0aGlzLl9wb2ludGVySWQgPSBEcmFnZ2VyLl9nZXRFdmVudFBvaW50ZXJJZChlKTtcbiAgICBpZiAodGhpcy5fcG9pbnRlcklkID09PSBudWxsKSByZXR1cm47XG5cbiAgICAvLyBTdG9yZSB0aGUgc3RhcnQgZXZlbnQgYW5kIHRyaWdnZXIgc3RhcnQgKGFzeW5jIG9yIHN5bmMpLiBQb2ludGVyIGV2ZW50c1xuICAgIC8vIGFyZSBlbWl0dGVkIGJlZm9yZSB0b3VjaCBldmVudHMgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgYm90aCBvZiB0aGVtLiBBbmRcbiAgICAvLyBpZiB5b3UgdHJ5IHRvIG1vdmUgYW4gZWxlbWVudCBiZWZvcmUgYHRvdWNoc3RhcnRgIGlzIGVtaXR0ZWQgdGhlIHBvaW50ZXJcbiAgICAvLyBldmVudHMgZm9yIHRoYXQgZWxlbWVudCB3aWxsIGJlIGNhbmNlbGVkLiBUaGUgZml4IGlzIHRvIGRlbGF5IHRoZSBlbWl0dGVkXG4gICAgLy8gcG9pbnRlciBldmVudHMgaW4gc3VjaCBhIHNjZW5hcmlvIGJ5IG9uZSBmcmFtZSBzbyB0aGF0IGB0b3VjaHN0YXJ0YCBoYXNcbiAgICAvLyB0aW1lIHRvIGJlIGVtaXR0ZWQgYmVmb3JlIHRoZSBlbGVtZW50IGlzIChwb3RlbnRpYWxseSkgbW92ZWQuXG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IGU7XG4gICAgaWYgKGhhc1RvdWNoRXZlbnRzICYmIChoYXNQb2ludGVyRXZlbnRzIHx8IGhhc01zUG9pbnRlckV2ZW50cykpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FuY2VsYWJsZSBjaGVjayBmb3IgQW5kcm9pZCB0byBwcmV2ZW50IGRyYWcgcHJvY2VkdXJlIGZyb21cbiAgICAgIC8vIHN0YXJ0aW5nIGlmIG5hdGl2ZSBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MuIFBhcnQgMi5cbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LFxuICAgICAgICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSxcbiAgICAgICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJhZih0aGlzLl9vblN0YXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25TdGFydCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWJvcnQgc3RhcnQgZXZlbnQgaWYgaXQgdHVybnMgb3V0IHRvIGJlIG5vbi1jYW5jZWxhYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9hYm9ydE5vbkNhbmNlbGFibGUgPSBmdW5jdGlvbihlKSB7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUsXG4gICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuX3N0YXJ0RXZlbnQgJiYgZS5jYW5jZWxhYmxlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgdGhlIGRyYWcgcHJvY2VkdXJlIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9vblN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGUgPSB0aGlzLl9zdGFydEV2ZW50O1xuICAgIGlmICghZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG5cbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgaWYgKCF0b3VjaCkgcmV0dXJuO1xuXG4gICAgLy8gU2V0IHVwIGluaXQgZGF0YSBhbmQgZW1pdCBzdGFydCBldmVudC5cbiAgICB0aGlzLl9zdGFydFggPSB0aGlzLl9jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy5fc3RhcnRZID0gdGhpcy5fY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZW1pdChldmVudHMuc3RhcnQsIGUpO1xuICAgIERyYWdnZXIuX2FjdGl2YXRlSW5zdGFuY2UodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIG1vdmUgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uTW92ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgaWYgKCF0b3VjaCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHRoaXMuX2N1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5tb3ZlLCBlKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbW92ZSBjYW5jZWwgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uQ2FuY2VsID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICghdGhpcy5fZ2V0VHJhY2tlZFRvdWNoKGUpKSByZXR1cm47XG5cbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5jYW5jZWwsIGUpO1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGVuZCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25FbmQgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRUcmFja2VkVG91Y2goZSkpIHJldHVybjtcblxuICAgIHRoaXMuX2VtaXQoZXZlbnRzLmVuZCwgZSk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYmVpbmcgZHJhZ2dlZCBhdCB0aGUgbW9tZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmlzRHJhZ2dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRlcklkICE9PSBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgZWxlbWVudCdzIHRvdWNoLWFjdGlvbiBDU1MgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuc2V0VG91Y2hBY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIC8vIFN0b3JlIHVubW9kaWZpZWQgdG91Y2ggYWN0aW9uIHZhbHVlICh3ZSB0cnVzdCB1c2VyIGlucHV0IGhlcmUpLlxuICAgIHRoaXMuX3RvdWNoQWN0aW9uID0gdmFsdWU7XG5cbiAgICAvLyBTZXQgdG91Y2gtYWN0aW9uIHN0eWxlLlxuICAgIGlmICh0YVByb3BQcmVmaXhlZCkge1xuICAgICAgdGhpcy5fY3NzUHJvcHNbdGFQcm9wUHJlZml4ZWRdID0gJyc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3RhUHJvcFByZWZpeGVkXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgYW4gdW5zdXBwb3J0ZWQgdG91Y2gtYWN0aW9uIHZhbHVlIGxldCdzIGFkZCBhIHNwZWNpYWwgbGlzdGVuZXJcbiAgICAvLyB0aGF0IHByZXZlbnRzIGRlZmF1bHQgYWN0aW9uIG9uIHRvdWNoIHN0YXJ0IGV2ZW50LiBBIGRpcnR5IGhhY2ssIGJ1dCBiZXN0XG4gICAgLy8gd2UgY2FuIGRvIGZvciBub3cuIFRoZSBvdGhlciBvcHRpb25zIHdvdWxkIGJlIHRvIHNvbWVob3cgcG9seWZpbGwgdGhlXG4gICAgLy8gdW5zdXBwb3J0ZWQgdG91Y2ggYWN0aW9uIGJlaGF2aW9yIHdpdGggY3VzdG9tIGhldXJpc3RpY3Mgd2hpY2ggc291bmRzIGxpa2VcbiAgICAvLyBhIGNhbiBvZiB3b3Jtcy5cbiAgICBpZiAoaGFzVG91Y2hFdmVudHMpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCwgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50LnN0eWxlW3RhUHJvcFByZWZpeGVkXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGVsZW1lbnQncyBDU1MgcHJvcGVydGllcy4gQWNjZXB0cyBhbiBvYmplY3Qgd2l0aCBjYW1lbCBjYXNlZCBzdHlsZVxuICAgKiBwcm9wcyB3aXRoIHZhbHVlIHBhaXJzIGFzIGl0J3MgZmlyc3QgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbbmV3UHJvcHNdXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5zZXRDc3NQcm9wcyA9IGZ1bmN0aW9uKG5ld1Byb3BzKSB7XG4gICAgaWYgKCFuZXdQcm9wcykgcmV0dXJuO1xuXG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX2Nzc1Byb3BzO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgcHJvcDtcbiAgICB2YXIgcHJlZml4ZWRQcm9wO1xuXG4gICAgLy8gUmVzZXQgY3VycmVudCBwcm9wcy5cbiAgICBmb3IgKHByb3AgaW4gY3VycmVudFByb3BzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gY3VycmVudFByb3BzW3Byb3BdO1xuICAgICAgZGVsZXRlIGN1cnJlbnRQcm9wc1twcm9wXTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbmV3IHByb3BzLlxuICAgIGZvciAocHJvcCBpbiBuZXdQcm9wcykge1xuICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWx1ZSBmb3IgdGhlIHByb3AuXG4gICAgICBpZiAoIW5ld1Byb3BzW3Byb3BdKSBjb250aW51ZTtcblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdG91Y2gtYWN0aW9uLlxuICAgICAgaWYgKHByb3AgPT09IHRhUHJvcCkge1xuICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5ld1Byb3BzW3Byb3BdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBwcmVmaXhlZCBwcm9wIGFuZCBza2lwIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgICAgcHJlZml4ZWRQcm9wID0gZ2V0UHJlZml4ZWRQcm9wTmFtZShlbGVtZW50LnN0eWxlLCBwcm9wKTtcbiAgICAgIGlmICghcHJlZml4ZWRQcm9wKSBjb250aW51ZTtcblxuICAgICAgLy8gU3RvcmUgdGhlIHByb3AgYW5kIGFkZCB0aGUgc3R5bGUuXG4gICAgICBjdXJyZW50UHJvcHNbcHJlZml4ZWRQcm9wXSA9ICcnO1xuICAgICAgZWxlbWVudC5zdHlsZVtwcmVmaXhlZFByb3BdID0gbmV3UHJvcHNbcHJvcF07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbXVjaCB0aGUgcG9pbnRlciBoYXMgbW92ZWQgb24geC1heGlzIGZyb20gc3RhcnQgcG9zaXRpb24sIGluIHBpeGVscy5cbiAgICogUG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIG1vdmVtZW50IGZyb20gbGVmdCB0byByaWdodC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhWCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50WCAtIHRoaXMuX3N0YXJ0WDtcbiAgfTtcblxuICAvKipcbiAgICogSG93IG11Y2ggdGhlIHBvaW50ZXIgaGFzIG1vdmVkIG9uIHktYXhpcyBmcm9tIHN0YXJ0IHBvc2l0aW9uLCBpbiBwaXhlbHMuXG4gICAqIFBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyBtb3ZlbWVudCBmcm9tIHRvcCB0byBib3R0b20uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5nZXREZWx0YVkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFkgLSB0aGlzLl9zdGFydFk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBmYXIgKGluIHBpeGVscykgaGFzIHBvaW50ZXIgbW92ZWQgZnJvbSBzdGFydCBwb3NpdGlvbi5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERpc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHggPSB0aGlzLmdldERlbHRhWCgpO1xuICAgIHZhciB5ID0gdGhpcy5nZXREZWx0YVkoKTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyBoYXMgcG9pbnRlciBiZWVuIGRyYWdnZWQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5nZXREZWx0YVRpbWUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRUaW1lID8gRGF0ZS5ub3coKSAtIHRoaXMuX3N0YXJ0VGltZSA6IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJpbmQgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICogICAtICdzdGFydCcsICdtb3ZlJywgJ2NhbmNlbCcgb3IgJ2VuZCcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICogICAtICdzdGFydCcsICdtb3ZlJywgJ2NhbmNlbCcgb3IgJ2VuZCcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbihldmVudHMsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vZmYoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCB1bmJpbmQgYWxsIGRyYWcgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBldmVudHMgPSBEcmFnZ2VyLl9ldmVudHM7XG5cbiAgICAvLyBSZXNldCBkYXRhIGFuZCBkZWFjdGl2YXRlIHRoZSBpbnN0YW5jZS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gRGVzdHJveSBlbWl0dGVyLlxuICAgIHRoaXMuX2VtaXR0ZXIuZGVzdHJveSgpO1xuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGhhbmRsZXJzLlxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKERyYWdnZXIuX21vdXNlRXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAvLyBSZXNldCBzdHlsZXMuXG4gICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLl9jc3NQcm9wcykge1xuICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHRoaXMuX2Nzc1Byb3BzW3Byb3BdO1xuICAgICAgZGVsZXRlIHRoaXMuX2Nzc1Byb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGRhdGEuXG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBNYXJrIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgdGlja2VyIHN5c3RlbSBmb3IgaGFuZGxpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMgaW4gYW4gZWZmaWNpZW50IHdheS5cbiAgICogQ29udGFpbnMgYSByZWFkIHF1ZXVlIGFuZCBhIHdyaXRlIHF1ZXVlIHRoYXQgYXJlIHByb2Nlc3NlZCBvbiB0aGUgbmV4dFxuICAgKiBhbmltYXRpb24gZnJhbWUgd2hlbiBuZWVkZWQuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gVGlja2VyKCkge1xuICAgIHRoaXMuX25leHRTdGVwID0gbnVsbDtcblxuICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgdGhpcy5fcmVhZHMgPSB7fTtcbiAgICB0aGlzLl93cml0ZXMgPSB7fTtcblxuICAgIHRoaXMuX2JhdGNoID0gW107XG4gICAgdGhpcy5fYmF0Y2hSZWFkcyA9IHt9O1xuICAgIHRoaXMuX2JhdGNoV3JpdGVzID0ge307XG5cbiAgICB0aGlzLl9zdGVwID0gdGhpcy5fc3RlcC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgVGlja2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihpZCwgcmVhZE9wZXJhdGlvbiwgd3JpdGVPcGVyYXRpb24sIGlzUHJpb3JpdGl6ZWQpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgYW4gaXRlbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcXVldWVzIHdpdGggdGhlIHNhbWUgaWRcbiAgICAvLyBhbmQgaWYgc28gLT4gcmVtb3ZlIGl0LlxuICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLl9xdWV1ZS5pbmRleE9mKGlkKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID4gLTEpIHRoaXMuX3F1ZXVlW2N1cnJlbnRJbmRleF0gPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBBZGQgZW50cnkuXG4gICAgaXNQcmlvcml0aXplZCA/IHRoaXMuX3F1ZXVlLnVuc2hpZnQoaWQpIDogdGhpcy5fcXVldWUucHVzaChpZCk7XG4gICAgdGhpcy5fcmVhZHNbaWRdID0gcmVhZE9wZXJhdGlvbjtcbiAgICB0aGlzLl93cml0ZXNbaWRdID0gd3JpdGVPcGVyYXRpb247XG5cbiAgICAvLyBGaW5hbGx5LCBsZXQncyBraWNrLXN0YXJ0IHRoZSBuZXh0IHRpY2sgaWYgaXQgaXMgbm90IHJ1bm5pbmcgeWV0LlxuICAgIGlmICghdGhpcy5fbmV4dFN0ZXApIHRoaXMuX25leHRTdGVwID0gcmFmKHRoaXMuX3N0ZXApO1xuICB9O1xuXG4gIFRpY2tlci5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24oaWQpIHtcbiAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5fcXVldWUuaW5kZXhPZihpZCk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9xdWV1ZVtjdXJyZW50SW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHRoaXMuX3JlYWRzW2lkXTtcbiAgICAgIGRlbGV0ZSB0aGlzLl93cml0ZXNbaWRdO1xuICAgIH1cbiAgfTtcblxuICBUaWNrZXIucHJvdG90eXBlLl9zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHJlYWRzID0gdGhpcy5fcmVhZHM7XG4gICAgdmFyIHdyaXRlcyA9IHRoaXMuX3dyaXRlcztcbiAgICB2YXIgYmF0Y2ggPSB0aGlzLl9iYXRjaDtcbiAgICB2YXIgYmF0Y2hSZWFkcyA9IHRoaXMuX2JhdGNoUmVhZHM7XG4gICAgdmFyIGJhdGNoV3JpdGVzID0gdGhpcy5fYmF0Y2hXcml0ZXM7XG4gICAgdmFyIGxlbmd0aCA9IHF1ZXVlLmxlbmd0aDtcbiAgICB2YXIgaWQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZXNldCB0aWNrZXIuXG4gICAgdGhpcy5fbmV4dFN0ZXAgPSBudWxsO1xuXG4gICAgLy8gU2V0dXAgcXVldWVzIGFuZCBjYWxsYmFjayBwbGFjZWhvbGRlcnMuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZCA9IHF1ZXVlW2ldO1xuICAgICAgaWYgKCFpZCkgY29udGludWU7XG5cbiAgICAgIGJhdGNoLnB1c2goaWQpO1xuXG4gICAgICBiYXRjaFJlYWRzW2lkXSA9IHJlYWRzW2lkXTtcbiAgICAgIGRlbGV0ZSByZWFkc1tpZF07XG5cbiAgICAgIGJhdGNoV3JpdGVzW2lkXSA9IHdyaXRlc1tpZF07XG4gICAgICBkZWxldGUgd3JpdGVzW2lkXTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBxdWV1ZS5cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgLy8gUHJvY2VzcyByZWFkIGNhbGxiYWNrcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlkID0gYmF0Y2hbaV07XG4gICAgICBpZiAoYmF0Y2hSZWFkc1tpZF0pIHtcbiAgICAgICAgYmF0Y2hSZWFkc1tpZF0oKTtcbiAgICAgICAgZGVsZXRlIGJhdGNoUmVhZHNbaWRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgd3JpdGUgY2FsbGJhY2tzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWQgPSBiYXRjaFtpXTtcbiAgICAgIGlmIChiYXRjaFdyaXRlc1tpZF0pIHtcbiAgICAgICAgYmF0Y2hXcml0ZXNbaWRdKCk7XG4gICAgICAgIGRlbGV0ZSBiYXRjaFdyaXRlc1tpZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgYmF0Y2guXG4gICAgYmF0Y2gubGVuZ3RoID0gMDtcblxuICAgIC8vIFJlc3RhcnQgdGhlIHRpY2tlciBpZiBuZWVkZWQuXG4gICAgaWYgKCF0aGlzLl9uZXh0U3RlcCAmJiBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX25leHRTdGVwID0gcmFmKHRoaXMuX3N0ZXApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdGlja2VyID0gbmV3IFRpY2tlcigpO1xuXG4gIHZhciBsYXlvdXRUaWNrID0gJ2xheW91dCc7XG4gIHZhciB2aXNpYmlsaXR5VGljayA9ICd2aXNpYmlsaXR5JztcbiAgdmFyIG1vdmVUaWNrID0gJ21vdmUnO1xuICB2YXIgc2Nyb2xsVGljayA9ICdzY3JvbGwnO1xuICB2YXIgcGxhY2Vob2xkZXJUaWNrID0gJ3BsYWNlaG9sZGVyJztcblxuICBmdW5jdGlvbiBhZGRMYXlvdXRUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgbGF5b3V0VGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbExheW91dFRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgbGF5b3V0VGljayk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRWaXNpYmlsaXR5VGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHZpc2liaWxpdHlUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsVmlzaWJpbGl0eVRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgdmlzaWJpbGl0eVRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkTW92ZVRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBtb3ZlVGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbE1vdmVUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIG1vdmVUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFNjcm9sbFRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBzY3JvbGxUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2ssIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsU2Nyb2xsVGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBzY3JvbGxUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFBsYWNlaG9sZGVyVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHBsYWNlaG9sZGVyVGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBwbGFjZWhvbGRlclRpY2spO1xuICB9XG5cbiAgdmFyIEVsUHJvdG8gPSB3aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7XG4gIHZhciBtYXRjaGVzRm4gPVxuICAgIEVsUHJvdG8ubWF0Y2hlcyB8fFxuICAgIEVsUHJvdG8ubWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgRWxQcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLm9NYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbGVtZW50IG1hdGNoZXMgYSBDU1Mgc2VsZWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZWxlbWVudE1hdGNoZXMoZWwsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNGbi5jYWxsKGVsLCBzZWxlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGNsYXNzIHRvIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFlbGVtZW50TWF0Y2hlcyhlbGVtZW50LCAnLicgKyBjbGFzc05hbWUpKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdGVtcEFycmF5ID0gW107XG4gIHZhciBudW1iZXJUeXBlID0gJ251bWJlcic7XG5cbiAgLyoqXG4gICAqIEluc2VydCBhbiBpdGVtIG9yIGFuIGFycmF5IG9mIGl0ZW1zIHRvIGFycmF5IHRvIGEgc3BlY2lmaWVkIGluZGV4LiBNdXRhdGVzXG4gICAqIHRoZSBhcnJheS4gVGhlIGluZGV4IGNhbiBiZSBuZWdhdGl2ZSBpbiB3aGljaCBjYXNlIHRoZSBpdGVtcyB3aWxsIGJlIGFkZGVkXG4gICAqIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcGFyYW0geyp9IGl0ZW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaW5kZXg9LTFdXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluc2VydChhcnJheSwgaXRlbXMsIGluZGV4KSB7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0eXBlb2YgaW5kZXggPT09IG51bWJlclR5cGUgPyBpbmRleCA6IC0xO1xuICAgIGlmIChzdGFydEluZGV4IDwgMCkgc3RhcnRJbmRleCA9IGFycmF5Lmxlbmd0aCAtIHN0YXJ0SW5kZXggKyAxO1xuXG4gICAgYXJyYXkuc3BsaWNlLmFwcGx5KGFycmF5LCB0ZW1wQXJyYXkuY29uY2F0KHN0YXJ0SW5kZXgsIDAsIGl0ZW1zKSk7XG4gICAgdGVtcEFycmF5Lmxlbmd0aCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGFycmF5IGluZGV4LiBCYXNpY2FsbHkgdGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlIHByb3ZpZGVkXG4gICAqIGFycmF5IGluZGV4IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgYWxzbyB0cmFuc2Zvcm1zXG4gICAqIG5lZ2F0aXZlIGluZGV4IHRvIHRoZSBtYXRjaGluZyBwb3NpdGl2ZSBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNNaWdyYXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGluZGV4LCBpc01pZ3JhdGlvbikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgdmFyIG1heEluZGV4ID0gTWF0aC5tYXgoMCwgaXNNaWdyYXRpb24gPyBsZW5ndGggOiBsZW5ndGggLSAxKTtcbiAgICByZXR1cm4gaW5kZXggPiBtYXhJbmRleCA/IG1heEluZGV4IDogaW5kZXggPCAwID8gTWF0aC5tYXgobWF4SW5kZXggKyBpbmRleCArIDEsIDApIDogaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhcnJheSBpdGVtIHRvIGFub3RoZXIgaW5kZXguXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXhcbiAgICogICAtIEluZGV4IChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkgb2YgdGhlIGl0ZW0gdGhhdCB3aWxsIGJlIG1vdmVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gdG9JbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgbW92ZWQgdG8uXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1vdmUoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaGFzIHR3byBvciBtb3JlIGl0ZW1zLlxuICAgIGlmIChhcnJheS5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIGluZGljZXMuXG4gICAgdmFyIGZyb20gPSBub3JtYWxpemVBcnJheUluZGV4KGFycmF5LCBmcm9tSW5kZXgpO1xuICAgIHZhciB0byA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIHRvSW5kZXgpO1xuXG4gICAgLy8gQWRkIHRhcmdldCBpdGVtIHRvIHRoZSBuZXcgcG9zaXRpb24uXG4gICAgaWYgKGZyb20gIT09IHRvKSB7XG4gICAgICBhcnJheS5zcGxpY2UodG8sIDAsIGFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgYXJyYXkgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgaXRlbSB0aGF0IHdpbGwgYmUgc3dhcHBlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdpdGhJbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgb3RoZXIgaXRlbSB0aGF0IHdpbGwgYmUgc3dhcHBlZC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5U3dhcChhcnJheSwgaW5kZXgsIHdpdGhJbmRleCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaGFzIHR3byBvciBtb3JlIGl0ZW1zLlxuICAgIGlmIChhcnJheS5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIGluZGljZXMuXG4gICAgdmFyIGluZGV4QSA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGluZGV4KTtcbiAgICB2YXIgaW5kZXhCID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgd2l0aEluZGV4KTtcbiAgICB2YXIgdGVtcDtcblxuICAgIC8vIFN3YXAgdGhlIGl0ZW1zLlxuICAgIGlmIChpbmRleEEgIT09IGluZGV4Qikge1xuICAgICAgdGVtcCA9IGFycmF5W2luZGV4QV07XG4gICAgICBhcnJheVtpbmRleEFdID0gYXJyYXlbaW5kZXhCXTtcbiAgICAgIGFycmF5W2luZGV4Ql0gPSB0ZW1wO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhY3Rpb25DYW5jZWwgPSAnY2FuY2VsJztcbiAgdmFyIGFjdGlvbkZpbmlzaCA9ICdmaW5pc2gnO1xuICB2YXIgZGVib3VuY2VUaWNrID0gJ2RlYm91bmNlJztcbiAgdmFyIGRlYm91bmNlSWQgPSAwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gICAqIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAgICogTiBtaWxsaXNlY29uZHMuIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBhY2NlcHRzIG9uZSBhcmd1bWVudCB3aGljaCwgd2hlblxuICAgKiBiZWluZyBcImZpbmlzaFwiLCBjYWxscyB0aGUgZGVib3VuY2UgZnVuY3Rpb24gaW1tZWRpYXRlbHkgaWYgaXQgaXMgY3VycmVudGx5XG4gICAqIHdhaXRpbmcgdG8gYmUgY2FsbGVkLCBhbmQgd2hlbiBiZWluZyBcImNhbmNlbFwiIGNhbmNlbHMgdGhlIGN1cnJlbnRseSBxdWV1ZWRcbiAgICogZnVuY3Rpb24gY2FsbC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdhaXRcbiAgICogQHJldHVybnMge0Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIHdhaXQpIHtcbiAgICB2YXIgdGltZW91dDtcbiAgICB2YXIgdGlja2VySWQgPSArK2RlYm91bmNlSWQgKyBkZWJvdW5jZVRpY2s7XG5cbiAgICBpZiAod2FpdCA+IDApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgICAgaWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHRpY2tlci5jYW5jZWwodGlja2VySWQpO1xuICAgICAgICAgIGlmIChhY3Rpb24gPT09IGFjdGlvbkZpbmlzaCkgZm4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3Rpb24gIT09IGFjdGlvbkNhbmNlbCAmJiBhY3Rpb24gIT09IGFjdGlvbkZpbmlzaCkge1xuICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aWNrZXIuYWRkKHRpY2tlcklkLCBmbiwgbnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgfSwgd2FpdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgaWYgKGFjdGlvbiAhPT0gYWN0aW9uQ2FuY2VsKSBmbigpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGVsZW1lbnQgaXMgdHJhbnNmb3JtZWQsIGZhbHNlIGlmIG5vdC4gSW4gcHJhY3RpY2UgdGhlXG4gICAqIGVsZW1lbnQncyBkaXNwbGF5IHZhbHVlIG11c3QgYmUgYW55dGhpbmcgZWxzZSB0aGFuIFwibm9uZVwiIG9yIFwiaW5saW5lXCIgYXNcbiAgICogd2VsbCBhcyBoYXZlIGEgdmFsaWQgdHJhbnNmb3JtIHZhbHVlIGFwcGxpZWQgaW4gb3JkZXIgdG8gYmUgY291bnRlZCBhcyBhXG4gICAqIHRyYW5zZm9ybWVkIGVsZW1lbnQuXG4gICAqXG4gICAqIEJvcnJvd2VkIGZyb20gTWV6ciAodjAuNi4xKTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3JhbW8vbWV6ci9ibG9iLzAuNi4xL21lenIuanMjTDY2MVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNUcmFuc2Zvcm1lZChlbGVtZW50KSB7XG4gICAgdmFyIHRyYW5zZm9ybSA9IGdldFN0eWxlKGVsZW1lbnQsICd0cmFuc2Zvcm0nKTtcbiAgICBpZiAoIXRyYW5zZm9ybSB8fCB0cmFuc2Zvcm0gPT09ICdub25lJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGRpc3BsYXkgPSBnZXRTdHlsZShlbGVtZW50LCAnZGlzcGxheScpO1xuICAgIGlmIChkaXNwbGF5ID09PSAnaW5saW5lJyB8fCBkaXNwbGF5ID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYWJzb2x1dGUgcG9zaXRpb25lZCBlbGVtZW50J3MgY29udGFpbmluZyBibG9jaywgd2hpY2ggaXNcbiAgICogY29uc2lkZXJlZCB0byBiZSB0aGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgdGhlIHRhcmdldCBlbGVtZW50J3NcbiAgICogcG9zaXRpb25pbmcgaXMgcmVsYXRpdmUgdG8uIERpc2NsYWltZXI6IHRoaXMgb25seSB3b3JrcyBhcyBpbnRlbmRlZCBmb3JcbiAgICogYWJzb2x1dGUgcG9zaXRpb25lZCBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbmNsdWRlU2VsZj1mYWxzZV1cbiAgICogICAtIFdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSB0aGUgY29udGFpbmluZyBibG9jayBjaGVja2luZyBpcyBzdGFydGVkIGZyb21cbiAgICogICAgIHRoZSBwcm92aWRlZCBlbGVtZW50LiBPdGhlcndpc2UgdGhlIGNoZWNraW5nIGlzIHN0YXJ0ZWQgZnJvbSB0aGVcbiAgICogICAgIHByb3ZpZGVkIGVsZW1lbnQncyBwYXJlbnQgZWxlbWVudC5cbiAgICogQHJldHVybnMgeyhEb2N1bWVudHxFbGVtZW50KX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50LCBpbmNsdWRlU2VsZikge1xuICAgIC8vIEFzIGxvbmcgYXMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgYW4gZWxlbWVudCwgc3RhdGljIGFuZCBub3RcbiAgICAvLyB0cmFuc2Zvcm1lZCwgdHJ5IHRvIGdldCB0aGUgZWxlbWVudCdzIHBhcmVudCBlbGVtZW50IGFuZCBmYWxsYmFjayB0b1xuICAgIC8vIGRvY3VtZW50LiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzcmFtby9tZXpyL2Jsb2IvMC42LjEvbWV6ci5qcyNMMzM5XG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuICAgIHZhciByZXQgPSAoaW5jbHVkZVNlbGYgPyBlbGVtZW50IDogZWxlbWVudC5wYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudDtcbiAgICB3aGlsZSAocmV0ICYmIHJldCAhPT0gZG9jdW1lbnQgJiYgZ2V0U3R5bGUocmV0LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycgJiYgIWlzVHJhbnNmb3JtZWQocmV0KSkge1xuICAgICAgcmV0ID0gcmV0LnBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYW4gZWxlbWVudCdzIHN0eWxlIHByb3BlcnR5IHRyYW5zZm9ybWVkIGludG9cbiAgICogYSBmbG9hdCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZUFzRmxvYXQoZWwsIHN0eWxlKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZ2V0U3R5bGUoZWwsIHN0eWxlKSkgfHwgMDtcbiAgfVxuXG4gIHZhciBvZmZzZXRBID0ge307XG4gIHZhciBvZmZzZXRCID0ge307XG4gIHZhciBvZmZzZXREaWZmID0ge307XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQncyBkb2N1bWVudCBvZmZzZXQsIHdoaWNoIGluIHByYWN0aWNlIG1lYW5zIHRoZSB2ZXJ0aWNhbFxuICAgKiBhbmQgaG9yaXpvbnRhbCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBlbGVtZW50J3Mgbm9ydGh3ZXN0IGNvcm5lciBhbmQgdGhlXG4gICAqIGRvY3VtZW50J3Mgbm9ydGh3ZXN0IGNvcm5lci4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgdGhlIHNhbWVcbiAgICogb2JqZWN0IHNvIGJlIHN1cmUgdG8gcmVhZCB0aGUgZGF0YSBmcm9tIGl0IGluc3RlYWQgdXNpbmcgaXQgYXMgYSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7KERvY3VtZW50fEVsZW1lbnR8V2luZG93KX0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29mZnNldERhdGFdXG4gICAqICAgLSBPcHRpb25hbCBkYXRhIG9iamVjdCB3aGVyZSB0aGUgb2Zmc2V0IGRhdGEgd2lsbCBiZSBpbnNlcnRlZCB0by4gSWYgbm90XG4gICAqICAgICBwcm92aWRlZCBhIG5ldyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUgcmV0dXJuIGRhdGEuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRPZmZzZXQoZWxlbWVudCwgb2Zmc2V0RGF0YSkge1xuICAgIHZhciByZXQgPSBvZmZzZXREYXRhIHx8IHt9O1xuICAgIHZhciByZWN0O1xuXG4gICAgLy8gU2V0IHVwIHJldHVybiBkYXRhLlxuICAgIHJldC5sZWZ0ID0gMDtcbiAgICByZXQudG9wID0gMDtcblxuICAgIC8vIERvY3VtZW50J3Mgb2Zmc2V0cyBhcmUgYWx3YXlzIDAuXG4gICAgaWYgKGVsZW1lbnQgPT09IGRvY3VtZW50KSByZXR1cm4gcmV0O1xuXG4gICAgLy8gQWRkIHZpZXdwb3J0IHNjcm9sbCBsZWZ0L3RvcCB0byB0aGUgcmVzcGVjdGl2ZSBvZmZzZXRzLlxuICAgIHJldC5sZWZ0ID0gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IDA7XG4gICAgcmV0LnRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCAwO1xuXG4gICAgLy8gV2luZG93J3Mgb2Zmc2V0cyBhcmUgdGhlIHZpZXdwb3J0IHNjcm9sbCBsZWZ0L3RvcCB2YWx1ZXMuXG4gICAgaWYgKGVsZW1lbnQuc2VsZiA9PT0gd2luZG93LnNlbGYpIHJldHVybiByZXQ7XG5cbiAgICAvLyBBZGQgZWxlbWVudCdzIGNsaWVudCByZWN0cyB0byB0aGUgb2Zmc2V0cy5cbiAgICByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXQubGVmdCArPSByZWN0LmxlZnQ7XG4gICAgcmV0LnRvcCArPSByZWN0LnRvcDtcblxuICAgIC8vIEV4Y2x1ZGUgZWxlbWVudCdzIGJvcmRlcnMgZnJvbSB0aGUgb2Zmc2V0LlxuICAgIHJldC5sZWZ0ICs9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICByZXQudG9wICs9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLXRvcC13aWR0aCcpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIG9mZnNldCBkaWZmZXJlbmNlIHR3byBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbUFcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbUJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbY29tcGFyZUNvbnRhaW5pbmdCbG9ja3M9ZmFsc2VdXG4gICAqICAgLSBXaGVuIHRoaXMgaXMgc2V0IHRvIHRydWUgdGhlIGNvbnRhaW5pbmcgYmxvY2tzIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50c1xuICAgKiAgICAgd2lsbCBiZSB1c2VkIGZvciBjYWxjdWxhdGluZyB0aGUgZGlmZmVyZW5jZS4gT3RoZXJ3aXNlIHRoZSBwcm92aWRlZFxuICAgKiAgICAgZWxlbWVudHMgd2lsbCBiZSBjb21wYXJlZCBkaXJlY3RseS5cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldE9mZnNldERpZmYoZWxlbUEsIGVsZW1CLCBjb21wYXJlQ29udGFpbmluZ0Jsb2Nrcykge1xuICAgIG9mZnNldERpZmYubGVmdCA9IDA7XG4gICAgb2Zmc2V0RGlmZi50b3AgPSAwO1xuXG4gICAgLy8gSWYgZWxlbWVudHMgYXJlIHNhbWUgbGV0J3MgcmV0dXJuIGVhcmx5LlxuICAgIGlmIChlbGVtQSA9PT0gZWxlbUIpIHJldHVybiBvZmZzZXREaWZmO1xuXG4gICAgLy8gQ29tcGFyZSBjb250YWluaW5nIGJsb2NrcyBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKGNvbXBhcmVDb250YWluaW5nQmxvY2tzKSB7XG4gICAgICBlbGVtQSA9IGdldENvbnRhaW5pbmdCbG9jayhlbGVtQSwgdHJ1ZSk7XG4gICAgICBlbGVtQiA9IGdldENvbnRhaW5pbmdCbG9jayhlbGVtQiwgdHJ1ZSk7XG5cbiAgICAgIC8vIElmIGNvbnRhaW5pbmcgYmxvY2tzIGFyZSBpZGVudGljYWwsIGxldCdzIHJldHVybiBlYXJseS5cbiAgICAgIGlmIChlbGVtQSA9PT0gZWxlbUIpIHJldHVybiBvZmZzZXREaWZmO1xuICAgIH1cblxuICAgIC8vIEZpbmFsbHksIGxldCdzIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGRpZmYuXG4gICAgZ2V0T2Zmc2V0KGVsZW1BLCBvZmZzZXRBKTtcbiAgICBnZXRPZmZzZXQoZWxlbUIsIG9mZnNldEIpO1xuICAgIG9mZnNldERpZmYubGVmdCA9IG9mZnNldEIubGVmdCAtIG9mZnNldEEubGVmdDtcbiAgICBvZmZzZXREaWZmLnRvcCA9IG9mZnNldEIudG9wIC0gb2Zmc2V0QS50b3A7XG5cbiAgICByZXR1cm4gb2Zmc2V0RGlmZjtcbiAgfVxuXG4gIHZhciBzdHlsZU92ZXJmbG93ID0gJ292ZXJmbG93JztcbiAgdmFyIHN0eWxlT3ZlcmZsb3dYID0gJ292ZXJmbG93LXgnO1xuICB2YXIgc3R5bGVPdmVyZmxvd1kgPSAnb3ZlcmZsb3cteSc7XG4gIHZhciBvdmVyZmxvd0F1dG8gPSAnYXV0byc7XG4gIHZhciBvdmVyZmxvd1Njcm9sbCA9ICdzY3JvbGwnO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHNjcm9sbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGFibGUoZWxlbWVudCkge1xuICAgIHZhciBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3cpO1xuICAgIGlmIChvdmVyZmxvdyA9PT0gb3ZlcmZsb3dBdXRvIHx8IG92ZXJmbG93ID09PSBvdmVyZmxvd1Njcm9sbCkgcmV0dXJuIHRydWU7XG5cbiAgICBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3dYKTtcbiAgICBpZiAob3ZlcmZsb3cgPT09IG92ZXJmbG93QXV0byB8fCBvdmVyZmxvdyA9PT0gb3ZlcmZsb3dTY3JvbGwpIHJldHVybiB0cnVlO1xuXG4gICAgb3ZlcmZsb3cgPSBnZXRTdHlsZShlbGVtZW50LCBzdHlsZU92ZXJmbG93WSk7XG4gICAgaWYgKG92ZXJmbG93ID09PSBvdmVyZmxvd0F1dG8gfHwgb3ZlcmZsb3cgPT09IG92ZXJmbG93U2Nyb2xsKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0IGVsZW1lbnQncyBhbmNlc3RvcnMgdGhhdCBhcmUgcG90ZW50aWFsbHkgc2Nyb2xsYWJsZSBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbmNsdWRlU2VsZj1mYWxzZV1cbiAgICogQHBhcmFtIHtBcnJheX0gW2RhdGFdXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFNjcm9sbGFibGVBbmNlc3RvcnMoZWxlbWVudCwgaW5jbHVkZVNlbGYsIGRhdGEpIHtcbiAgICB2YXIgcmV0ID0gZGF0YSB8fCBbXTtcbiAgICB2YXIgcGFyZW50ID0gaW5jbHVkZVNlbGYgPyBlbGVtZW50IDogZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgLy8gRmluZCBzY3JvbGwgcGFyZW50cy5cbiAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgIC8vIElmIGVsZW1lbnQgaXMgaW5zaWRlIFNoYWRvd0RPTSBsZXQncyBnZXQgaXQncyBob3N0IG5vZGUgZnJvbSB0aGUgcmVhbFxuICAgICAgLy8gRE9NIGFuZCBjb250aW51ZSBsb29waW5nLlxuICAgICAgaWYgKHBhcmVudC5nZXRSb290Tm9kZSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRSb290Tm9kZSgpLmhvc3Q7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBlbGVtZW50IGlzIHNjcm9sbGFibGUgbGV0J3MgYWRkIGl0IHRvIHRoZSBzY3JvbGxhYmxlIGxpc3QuXG4gICAgICBpZiAoaXNTY3JvbGxhYmxlKHBhcmVudCkpIHtcbiAgICAgICAgcmV0LnB1c2gocGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGFkZCB3aW5kb3cgdG8gdGhlIHJlc3VsdHMuXG4gICAgcmV0LnB1c2god2luZG93KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICB2YXIgdHJhbnNsYXRlVmFsdWUgPSB7fTtcbiAgdmFyIHRyYW5zZm9ybVN0eWxlJDIgPSAndHJhbnNmb3JtJztcbiAgdmFyIHRyYW5zZm9ybU5vbmUgPSAnbm9uZSc7XG4gIHZhciByeE1hdDNkID0gL15tYXRyaXgzZC87XG4gIHZhciByeE1hdFR4ID0gLyhbXixdKiwpezR9LztcbiAgdmFyIHJ4TWF0M2RUeCA9IC8oW14sXSosKXsxMn0vO1xuICB2YXIgcnhOZXh0SXRlbSA9IC9bXixdKiwvO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50J3MgY29tcHV0ZWQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZXMgYXMgYSBmbG9hdHMuXG4gICAqIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgYWx3YXlzIHRoZSBzYW1lIG9iamVjdCBhbmQgdXBkYXRlZCBldmVyeSB0aW1lIHRoaXNcbiAgICogZnVuY3Rpb24gaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGUoZWxlbWVudCkge1xuICAgIHRyYW5zbGF0ZVZhbHVlLnggPSAwO1xuICAgIHRyYW5zbGF0ZVZhbHVlLnkgPSAwO1xuXG4gICAgdmFyIHRyYW5zZm9ybSA9IGdldFN0eWxlKGVsZW1lbnQsIHRyYW5zZm9ybVN0eWxlJDIpO1xuICAgIGlmICghdHJhbnNmb3JtIHx8IHRyYW5zZm9ybSA9PT0gdHJhbnNmb3JtTm9uZSkge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZVZhbHVlO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBzdHlsZSBjYW4gYmUgaW4gZWl0aGVyIG1hdHJpeDNkKC4uLikgb3IgbWF0cml4KC4uLikuXG4gICAgdmFyIGlzTWF0M2QgPSByeE1hdDNkLnRlc3QodHJhbnNmb3JtKTtcbiAgICB2YXIgdFggPSB0cmFuc2Zvcm0ucmVwbGFjZShpc01hdDNkID8gcnhNYXQzZFR4IDogcnhNYXRUeCwgJycpO1xuICAgIHZhciB0WSA9IHRYLnJlcGxhY2UocnhOZXh0SXRlbSwgJycpO1xuXG4gICAgdHJhbnNsYXRlVmFsdWUueCA9IHBhcnNlRmxvYXQodFgpIHx8IDA7XG4gICAgdHJhbnNsYXRlVmFsdWUueSA9IHBhcnNlRmxvYXQodFkpIHx8IDA7XG5cbiAgICByZXR1cm4gdHJhbnNsYXRlVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHRyYW5zbGF0ZVggYW5kIHRyYW5zbGF0ZVkgdmFsdWUgaW50byBDU1MgdHJhbnNmb3JtIHN0eWxlXG4gICAqIHByb3BlcnR5J3MgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGVTdHJpbmcoeCwgeSkge1xuICAgIHJldHVybiAndHJhbnNsYXRlWCgnICsgeCArICdweCkgdHJhbnNsYXRlWSgnICsgeSArICdweCknO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBjbGFzcyBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsZW1lbnRNYXRjaGVzKGVsZW1lbnQsICcuJyArIGNsYXNzTmFtZSkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSAoJyAnICsgZWxlbWVudC5jbGFzc05hbWUgKyAnICcpXG4gICAgICAgICAgLnJlcGxhY2UoJyAnICsgY2xhc3NOYW1lICsgJyAnLCAnICcpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEcmFnIHN0YXJ0IHByZWRpY2F0ZSBzdGF0ZXMuXG4gIHZhciBzdGFydFByZWRpY2F0ZUluYWN0aXZlID0gMDtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUGVuZGluZyA9IDE7XG4gIHZhciBzdGFydFByZWRpY2F0ZVJlc29sdmVkID0gMjtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUmVqZWN0ZWQgPSAzO1xuXG4gIC8qKlxuICAgKiBCaW5kIHRvdWNoIGludGVyYWN0aW9uIHRvIGFuIGl0ZW0uXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1EcmFnKGl0ZW0pIHtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2dyaWRJZCA9IGdyaWQuX2lkO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0YXJ0IHByZWRpY2F0ZSBkYXRhLlxuICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlID0gaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU3RhcnRQcmVkaWNhdGUpXG4gICAgICA/IHNldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZVxuICAgICAgOiBJdGVtRHJhZy5kZWZhdWx0U3RhcnRQcmVkaWNhdGU7XG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlSW5hY3RpdmU7XG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVSZXN1bHQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBEYXRhIGZvciBkcmFnIHNvcnQgcHJlZGljYXRlIGhldXJpc3RpY3MuXG4gICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5faFgxID0gMDtcbiAgICB0aGlzLl9oWDIgPSAwO1xuICAgIHRoaXMuX2hZMSA9IDA7XG4gICAgdGhpcy5faFkyID0gMDtcblxuICAgIC8vIFNldHVwIGl0ZW0ncyBpbml0aWFsIGRyYWcgZGF0YS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gQmluZCB0aGUgbWV0aG9kcyB0aGF0IG5lZWRzIGJpbmRpbmcuXG4gICAgdGhpcy5fcHJlU3RhcnRDaGVjayA9IHRoaXMuX3ByZVN0YXJ0Q2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9wcmVFbmRDaGVjayA9IHRoaXMuX3ByZUVuZENoZWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25TY3JvbGwgPSB0aGlzLl9vblNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZXBhcmVNb3ZlID0gdGhpcy5fcHJlcGFyZU1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9hcHBseU1vdmUgPSB0aGlzLl9hcHBseU1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9wcmVwYXJlU2Nyb2xsID0gdGhpcy5fcHJlcGFyZVNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2FwcGx5U2Nyb2xsID0gdGhpcy5fYXBwbHlTY3JvbGwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jaGVja092ZXJsYXAgPSB0aGlzLl9jaGVja092ZXJsYXAuYmluZCh0aGlzKTtcblxuICAgIC8vIENyZWF0ZSBkZWJvdW5jZSBvdmVybGFwIGNoZWNrZXIgZnVuY3Rpb24uXG4gICAgdmFyIHNvcnRJbnRlcnZhbCA9IHNldHRpbmdzLmRyYWdTb3J0SGV1cmlzdGljcy5zb3J0SW50ZXJ2YWw7XG4gICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UgPSBkZWJvdW5jZSh0aGlzLl9jaGVja092ZXJsYXAsIHNvcnRJbnRlcnZhbCk7XG5cbiAgICAvLyBJbml0IGRyYWdnZXIuXG4gICAgdGhpcy5fZHJhZ2dlciA9IG5ldyBEcmFnZ2VyKGVsZW1lbnQsIHNldHRpbmdzLmRyYWdDc3NQcm9wcyk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignc3RhcnQnLCB0aGlzLl9wcmVTdGFydENoZWNrKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdtb3ZlJywgdGhpcy5fcHJlU3RhcnRDaGVjayk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignY2FuY2VsJywgdGhpcy5fcHJlRW5kQ2hlY2spO1xuICAgIHRoaXMuX2RyYWdnZXIub24oJ2VuZCcsIHRoaXMuX3ByZUVuZENoZWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgc3RhdGljIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRyYWcgc3RhcnQgcHJlZGljYXRlIGhhbmRsZXIgdGhhdCBoYW5kbGVzIGFuY2hvciBlbGVtZW50c1xuICAgKiBncmFjZWZ1bGx5LiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gZGVmaW5lcyBpZiB0aGUgZHJhZyBpc1xuICAgKiBzdGFydGVkLCByZWplY3RlZCBvciBwZW5kaW5nLiBXaGVuIHRydWUgaXMgcmV0dXJuZWQgdGhlIGRyYWdnaW5nIGlzIHN0YXJ0ZWRcbiAgICogYW5kIHdoZW4gZmFsc2UgaXMgcmV0dXJuZWQgdGhlIGRyYWdnaW5nIGlzIHJlamVjdGVkLiBJZiBub3RoaW5nIGlzIHJldHVybmVkXG4gICAqIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gb24gdGhlIG5leHQgZHJhZyBtb3ZlbWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgLSBBbiBvcHRpb25hbCBvcHRpb25zIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBwYXNzIHRoZSBwcmVkaWNhdGVcbiAgICogICAgIGl0J3Mgb3B0aW9ucyBtYW51YWxseS4gQnkgZGVmYXVsdCB0aGUgcHJlZGljYXRlIHJldHJpZXZlcyB0aGUgb3B0aW9uc1xuICAgKiAgICAgZnJvbSB0aGUgZ3JpZCdzIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW1EcmFnLmRlZmF1bHRTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGl0ZW0sIGV2ZW50LCBvcHRpb25zKSB7XG4gICAgdmFyIGRyYWcgPSBpdGVtLl9kcmFnO1xuICAgIHZhciBwcmVkaWNhdGUgPSBkcmFnLl9zdGFydFByZWRpY2F0ZURhdGEgfHwgZHJhZy5fc2V0dXBTdGFydFByZWRpY2F0ZShvcHRpb25zKTtcblxuICAgIC8vIEZpbmFsIGV2ZW50IGxvZ2ljLiBBdCB0aGlzIHN0YWdlIHJldHVybiB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIgYW55bW9yZSxcbiAgICAvLyB0aGUgcHJlZGljYXRlIGlzIGVpdGhlciByZXNvbHZlZCBvciBpdCdzIG5vdCBhbmQgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgLy8gYWJvdXQgaXQuIEhlcmUgd2UganVzdCByZXNldCBkYXRhIGFuZCBpZiB0aGUgaXRlbSBlbGVtZW50IGlzIGEgbGlua1xuICAgIC8vIHdlIGZvbGxvdyBpdCAoaWYgdGhlcmUgaGFzIG9ubHkgYmVlbiBzbGlnaHQgbW92ZW1lbnQpLlxuICAgIGlmIChldmVudC5pc0ZpbmFsKSB7XG4gICAgICBkcmFnLl9maW5pc2hTdGFydFByZWRpY2F0ZShldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCBhbmQgc3RvcmUgdGhlIGhhbmRsZSBlbGVtZW50IHNvIHdlIGNhbiBjaGVjayBsYXRlciBvbiBpZiB0aGVcbiAgICAvLyBjdXJzb3IgaXMgd2l0aGluIHRoZSBoYW5kbGUuIElmIHdlIGhhdmUgYSBoYW5kbGUgc2VsZWN0b3IgbGV0J3MgZmluZFxuICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuIE90aGVyd2lzZSBsZXQncyB1c2UgdGhlIGl0ZW0gZWxlbWVudCBhcyB0aGVcbiAgICAvLyBoYW5kbGUuXG4gICAgaWYgKCFwcmVkaWNhdGUuaGFuZGxlRWxlbWVudCkge1xuICAgICAgcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQgPSBkcmFnLl9nZXRTdGFydFByZWRpY2F0ZUhhbmRsZShldmVudCk7XG4gICAgICBpZiAoIXByZWRpY2F0ZS5oYW5kbGVFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgZGVsYXkgaXMgZGVmaW5lZCBsZXQncyBrZWVwIHRyYWNrIG9mIHRoZSBsYXRlc3QgZXZlbnQgYW5kIGluaXRpYXRlXG4gICAgLy8gZGVsYXkgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgeWV0LlxuICAgIGlmIChwcmVkaWNhdGUuZGVsYXkpIHtcbiAgICAgIHByZWRpY2F0ZS5ldmVudCA9IGV2ZW50O1xuICAgICAgaWYgKCFwcmVkaWNhdGUuZGVsYXlUaW1lcikge1xuICAgICAgICBwcmVkaWNhdGUuZGVsYXlUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHByZWRpY2F0ZS5kZWxheSA9IDA7XG4gICAgICAgICAgaWYgKGRyYWcuX3Jlc29sdmVTdGFydFByZWRpY2F0ZShwcmVkaWNhdGUuZXZlbnQpKSB7XG4gICAgICAgICAgICBkcmFnLl9mb3JjZVJlc29sdmVTdGFydFByZWRpY2F0ZShwcmVkaWNhdGUuZXZlbnQpO1xuICAgICAgICAgICAgZHJhZy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgcHJlZGljYXRlLmRlbGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZHJhZy5fcmVzb2x2ZVN0YXJ0UHJlZGljYXRlKGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRGVmYXVsdCBkcmFnIHNvcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGhyZXNob2xkPTUwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYWN0aW9uPSdtb3ZlJ11cbiAgICogQHJldHVybnMgeyhCb29sZWFufERyYWdTb3J0Q29tbWFuZCl9XG4gICAqICAgLSBSZXR1cm5zIGZhbHNlIGlmIG5vIHZhbGlkIGluZGV4IHdhcyBmb3VuZC4gT3RoZXJ3aXNlIHJldHVybnMgZHJhZyBzb3J0XG4gICAqICAgICBjb21tYW5kLlxuICAgKi9cbiAgSXRlbURyYWcuZGVmYXVsdFNvcnRQcmVkaWNhdGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1SZWN0ID0ge307XG4gICAgdmFyIHRhcmdldFJlY3QgPSB7fTtcbiAgICB2YXIgcmV0dXJuRGF0YSA9IHt9O1xuICAgIHZhciByb290R3JpZEFycmF5ID0gW107XG5cbiAgICBmdW5jdGlvbiBnZXRUYXJnZXRHcmlkKGl0ZW0sIHJvb3RHcmlkLCB0aHJlc2hvbGQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsO1xuICAgICAgdmFyIGRyYWdTb3J0ID0gcm9vdEdyaWQuX3NldHRpbmdzLmRyYWdTb3J0O1xuICAgICAgdmFyIGJlc3RTY29yZSA9IC0xO1xuICAgICAgdmFyIGdyaWRTY29yZTtcbiAgICAgIHZhciBncmlkcztcbiAgICAgIHZhciBncmlkO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIEdldCBwb3RlbnRpYWwgdGFyZ2V0IGdyaWRzLlxuICAgICAgaWYgKGRyYWdTb3J0ID09PSB0cnVlKSB7XG4gICAgICAgIHJvb3RHcmlkQXJyYXlbMF0gPSByb290R3JpZDtcbiAgICAgICAgZ3JpZHMgPSByb290R3JpZEFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JpZHMgPSBkcmFnU29ydC5jYWxsKHJvb3RHcmlkLCBpdGVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyBncmlkcy5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShncmlkcykpIHJldHVybiB0YXJnZXQ7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZ3JpZHMgYW5kIGdldCB0aGUgYmVzdCBtYXRjaC5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBncmlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBncmlkID0gZ3JpZHNbaV07XG5cbiAgICAgICAgLy8gRmlsdGVyIG91dCBhbGwgZGVzdHJveWVkIGdyaWRzLlxuICAgICAgICBpZiAoZ3JpZC5faXNEZXN0cm95ZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBncmlkJ3Mgb2Zmc2V0cyBhbmQgZGltZW5zaW9ucyBzaW5jZSB0aGV5IG1pZ2h0XG4gICAgICAgIC8vIGhhdmUgY2hhbmdlZCAoZS5nIGR1cmluZyBzY3JvbGxpbmcpLlxuICAgICAgICBncmlkLl91cGRhdGVCb3VuZGluZ1JlY3QoKTtcblxuICAgICAgICAvLyBDaGVjayBob3cgbXVjaCBkcmFnZ2VkIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAgICB0YXJnZXRSZWN0LndpZHRoID0gZ3JpZC5fd2lkdGg7XG4gICAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gZ3JpZC5faGVpZ2h0O1xuICAgICAgICB0YXJnZXRSZWN0LmxlZnQgPSBncmlkLl9sZWZ0O1xuICAgICAgICB0YXJnZXRSZWN0LnRvcCA9IGdyaWQuX3RvcDtcbiAgICAgICAgZ3JpZFNjb3JlID0gZ2V0UmVjdE92ZXJsYXBTY29yZShpdGVtUmVjdCwgdGFyZ2V0UmVjdCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBncmlkIGlzIHRoZSBiZXN0IG1hdGNoIHNvIGZhci5cbiAgICAgICAgaWYgKGdyaWRTY29yZSA+IHRocmVzaG9sZCAmJiBncmlkU2NvcmUgPiBiZXN0U2NvcmUpIHtcbiAgICAgICAgICBiZXN0U2NvcmUgPSBncmlkU2NvcmU7XG4gICAgICAgICAgdGFyZ2V0ID0gZ3JpZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBbHdheXMgcmVzZXQgcm9vdCBncmlkIGFycmF5LlxuICAgICAgcm9vdEdyaWRBcnJheS5sZW5ndGggPSAwO1xuXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihpdGVtLCBvcHRpb25zKSB7XG4gICAgICB2YXIgZHJhZyA9IGl0ZW0uX2RyYWc7XG4gICAgICB2YXIgcm9vdEdyaWQgPSBkcmFnLl9nZXRHcmlkKCk7XG5cbiAgICAgIC8vIEdldCBkcmFnIHNvcnQgcHJlZGljYXRlIHNldHRpbmdzLlxuICAgICAgdmFyIHNvcnRUaHJlc2hvbGQgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnRocmVzaG9sZCA9PT0gJ251bWJlcicgPyBvcHRpb25zLnRocmVzaG9sZCA6IDUwO1xuICAgICAgdmFyIHNvcnRBY3Rpb24gPSBvcHRpb25zICYmIG9wdGlvbnMuYWN0aW9uID09PSBhY3Rpb25Td2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG5cbiAgICAgIC8vIFBvcHVsYXRlIGl0ZW0gcmVjdCBkYXRhLlxuICAgICAgaXRlbVJlY3Qud2lkdGggPSBpdGVtLl93aWR0aDtcbiAgICAgIGl0ZW1SZWN0LmhlaWdodCA9IGl0ZW0uX2hlaWdodDtcbiAgICAgIGl0ZW1SZWN0LmxlZnQgPSBkcmFnLl9lbGVtZW50Q2xpZW50WDtcbiAgICAgIGl0ZW1SZWN0LnRvcCA9IGRyYWcuX2VsZW1lbnRDbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIHRhcmdldCBncmlkLlxuICAgICAgdmFyIGdyaWQgPSBnZXRUYXJnZXRHcmlkKGl0ZW0sIHJvb3RHcmlkLCBzb3J0VGhyZXNob2xkKTtcblxuICAgICAgLy8gUmV0dXJuIGVhcmx5IGlmIHdlIGZvdW5kIG5vIGdyaWQgY29udGFpbmVyIGVsZW1lbnQgdGhhdCBvdmVybGFwcyB0aGVcbiAgICAgIC8vIGRyYWdnZWQgaXRlbSBlbm91Z2guXG4gICAgICBpZiAoIWdyaWQpIHJldHVybiBmYWxzZTtcblxuICAgICAgdmFyIGdyaWRPZmZzZXRMZWZ0ID0gMDtcbiAgICAgIHZhciBncmlkT2Zmc2V0VG9wID0gMDtcbiAgICAgIHZhciBtYXRjaFNjb3JlID0gLTE7XG4gICAgICB2YXIgbWF0Y2hJbmRleDtcbiAgICAgIHZhciBoYXNWYWxpZFRhcmdldHM7XG4gICAgICB2YXIgdGFyZ2V0O1xuICAgICAgdmFyIHNjb3JlO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIElmIGl0ZW0gaXMgbW92ZWQgd2l0aGluIGl0J3Mgb3JpZ2luYXRpbmcgZ3JpZCBhZGp1c3QgaXRlbSdzIGxlZnQgYW5kXG4gICAgICAvLyB0b3AgcHJvcHMuIE90aGVyd2lzZSBpZiBpdGVtIGlzIG1vdmVkIHRvL3dpdGhpbiBhbm90aGVyIGdyaWQgZ2V0IHRoZVxuICAgICAgLy8gY29udGFpbmVyIGVsZW1lbnQncyBvZmZzZXQgKGZyb20gdGhlIGVsZW1lbnQncyBjb250ZW50IGVkZ2UpLlxuICAgICAgaWYgKGdyaWQgPT09IHJvb3RHcmlkKSB7XG4gICAgICAgIGl0ZW1SZWN0LmxlZnQgPSBkcmFnLl9ncmlkWCArIGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgICAgIGl0ZW1SZWN0LnRvcCA9IGRyYWcuX2dyaWRZICsgaXRlbS5fbWFyZ2luVG9wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JpZC5fdXBkYXRlQm9yZGVycygxLCAwLCAxLCAwKTtcbiAgICAgICAgZ3JpZE9mZnNldExlZnQgPSBncmlkLl9sZWZ0ICsgZ3JpZC5fYm9yZGVyTGVmdDtcbiAgICAgICAgZ3JpZE9mZnNldFRvcCA9IGdyaWQuX3RvcCArIGdyaWQuX2JvcmRlclRvcDtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB0YXJnZXQgZ3JpZCBpdGVtcyBhbmQgdHJ5IHRvIGZpbmQgdGhlIGJlc3QgbWF0Y2guXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JpZC5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGFyZ2V0ID0gZ3JpZC5faXRlbXNbaV07XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBpdGVtIGlzIG5vdCBhY3RpdmUgb3IgdGhlIHRhcmdldCBpdGVtIGlzIHRoZSBkcmFnZ2VkXG4gICAgICAgIC8vIGl0ZW0gbGV0J3Mgc2tpcCB0byB0aGUgbmV4dCBpdGVtLlxuICAgICAgICBpZiAoIXRhcmdldC5faXNBY3RpdmUgfHwgdGFyZ2V0ID09PSBpdGVtKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHRoZSBncmlkIGFzIGhhdmluZyB2YWxpZCB0YXJnZXQgaXRlbXMuXG4gICAgICAgIGhhc1ZhbGlkVGFyZ2V0cyA9IHRydWU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0YXJnZXQncyBvdmVybGFwIHNjb3JlIHdpdGggdGhlIGRyYWdnZWQgaXRlbS5cbiAgICAgICAgdGFyZ2V0UmVjdC53aWR0aCA9IHRhcmdldC5fd2lkdGg7XG4gICAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gdGFyZ2V0Ll9oZWlnaHQ7XG4gICAgICAgIHRhcmdldFJlY3QubGVmdCA9IHRhcmdldC5fbGVmdCArIHRhcmdldC5fbWFyZ2luTGVmdCArIGdyaWRPZmZzZXRMZWZ0O1xuICAgICAgICB0YXJnZXRSZWN0LnRvcCA9IHRhcmdldC5fdG9wICsgdGFyZ2V0Ll9tYXJnaW5Ub3AgKyBncmlkT2Zmc2V0VG9wO1xuICAgICAgICBzY29yZSA9IGdldFJlY3RPdmVybGFwU2NvcmUoaXRlbVJlY3QsIHRhcmdldFJlY3QpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBiZXN0IG1hdGNoIGluZGV4IGFuZCBzY29yZSBpZiB0aGUgdGFyZ2V0J3Mgb3ZlcmxhcCBzY29yZSB3aXRoXG4gICAgICAgIC8vIHRoZSBkcmFnZ2VkIGl0ZW0gaXMgaGlnaGVyIHRoYW4gdGhlIGN1cnJlbnQgYmVzdCBtYXRjaCBzY29yZS5cbiAgICAgICAgaWYgKHNjb3JlID4gbWF0Y2hTY29yZSkge1xuICAgICAgICAgIG1hdGNoSW5kZXggPSBpO1xuICAgICAgICAgIG1hdGNoU2NvcmUgPSBzY29yZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyB2YWxpZCBtYXRjaCBhbmQgdGhlIGl0ZW0gaXMgYmVpbmcgbW92ZWQgaW50byBhbm90aGVyXG4gICAgICAvLyBncmlkLlxuICAgICAgaWYgKG1hdGNoU2NvcmUgPCBzb3J0VGhyZXNob2xkICYmIGl0ZW0uZ2V0R3JpZCgpICE9PSBncmlkKSB7XG4gICAgICAgIG1hdGNoSW5kZXggPSBoYXNWYWxpZFRhcmdldHMgPyAtMSA6IDA7XG4gICAgICAgIG1hdGNoU2NvcmUgPSBJbmZpbml0eTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJlc3QgbWF0Y2ggb3ZlcmxhcHMgZW5vdWdoIHRvIGp1c3RpZnkgYSBwbGFjZW1lbnQgc3dpdGNoLlxuICAgICAgaWYgKG1hdGNoU2NvcmUgPj0gc29ydFRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm5EYXRhLmdyaWQgPSBncmlkO1xuICAgICAgICByZXR1cm5EYXRhLmluZGV4ID0gbWF0Y2hJbmRleDtcbiAgICAgICAgcmV0dXJuRGF0YS5hY3Rpb24gPSBzb3J0QWN0aW9uO1xuICAgICAgICByZXR1cm4gcmV0dXJuRGF0YTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFib3J0IGRyYWdnaW5nIGFuZCByZXNldCBkcmFnIGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbURyYWd9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG5cbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGJlaW5nIGRyb3BwZWQgaW50byBhbm90aGVyIGdyaWQsIGZpbmlzaCBpdCB1cCBhbmQgcmV0dXJuXG4gICAgLy8gaW1tZWRpYXRlbHkuXG4gICAgaWYgKHRoaXMuX2lzTWlncmF0aW5nKSB7XG4gICAgICB0aGlzLl9maW5pc2hNaWdyYXRpb24oKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIENhbmNlbCBxdWV1ZWQgbW92ZSBhbmQgc2Nyb2xsIHRpY2tzLlxuICAgIGNhbmNlbE1vdmVUaWNrKGl0ZW0uX2lkKTtcbiAgICBjYW5jZWxTY3JvbGxUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFJlbW92ZSBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIHRoaXMuX3VuYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gQ2FuY2VsIG92ZXJsYXAgY2hlY2suXG4gICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoJ2NhbmNlbCcpO1xuXG4gICAgLy8gQXBwZW5kIGl0ZW0gZWxlbWVudCB0byB0aGUgY29udGFpbmVyIGlmIGl0J3Mgbm90IGl0J3MgY2hpbGQuIEFsc28gbWFrZVxuICAgIC8vIHN1cmUgdGhlIHRyYW5zbGF0ZSB2YWx1ZXMgYXJlIGFkanVzdGVkIHRvIGFjY291bnQgZm9yIHRoZSBET00gc2hpZnQuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gZ3JpZC5fZWxlbWVudCkge1xuICAgICAgZ3JpZC5fZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIGVsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fZ3JpZFgsIHRoaXMuX2dyaWRZKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZHJhZ2dpbmcgY2xhc3MuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgZ3JpZC5fc2V0dGluZ3MuaXRlbURyYWdnaW5nQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgZHJhZyBkYXRhLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtRHJhZ31cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AoKTtcbiAgICB0aGlzLl9kcmFnZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogR2V0IEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHJldHVybnMgez9HcmlkfVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9nZXRHcmlkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGdyaWRJbnN0YW5jZXNbdGhpcy5fZ3JpZElkXSB8fCBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXR1cC9yZXNldCBkcmFnIGRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBJcyBpdGVtIGJlaW5nIGRyYWdnZWQ/XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRoZSBkcmFnZ2VkIGl0ZW0ncyBjb250YWluZXIgZWxlbWVudC5cbiAgICB0aGlzLl9jb250YWluZXIgPSBudWxsO1xuXG4gICAgLy8gVGhlIGRyYWdnZWQgaXRlbSdzIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgdGhpcy5fY29udGFpbmluZ0Jsb2NrID0gbnVsbDtcblxuICAgIC8vIERyYWcvc2Nyb2xsIGV2ZW50IGRhdGEuXG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLl9zY3JvbGxFdmVudCA9IG51bGw7XG5cbiAgICAvLyBBbGwgdGhlIGVsZW1lbnRzIHdoaWNoIG5lZWQgdG8gYmUgbGlzdGVuZWQgZm9yIHNjcm9sbCBldmVudHMgZHVyaW5nXG4gICAgLy8gZHJhZ2dpbmcuXG4gICAgdGhpcy5fc2Nyb2xsZXJzID0gW107XG5cbiAgICAvLyBUaGUgY3VycmVudCB0cmFuc2xhdGVYL3RyYW5zbGF0ZVkgcG9zaXRpb24uXG4gICAgdGhpcy5fbGVmdCA9IDA7XG4gICAgdGhpcy5fdG9wID0gMDtcblxuICAgIC8vIERyYWdnZWQgZWxlbWVudCdzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBncmlkLlxuICAgIHRoaXMuX2dyaWRYID0gMDtcbiAgICB0aGlzLl9ncmlkWSA9IDA7XG5cbiAgICAvLyBEcmFnZ2VkIGVsZW1lbnQncyBjdXJyZW50IG9mZnNldCBmcm9tIHdpbmRvdydzIG5vcnRod2VzdCBjb3JuZXIuIERvZXNcbiAgICAvLyBub3QgYWNjb3VudCBmb3IgZWxlbWVudCdzIG1hcmdpbnMuXG4gICAgdGhpcy5fZWxlbWVudENsaWVudFggPSAwO1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZID0gMDtcblxuICAgIC8vIE9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRyYWdnZWQgZWxlbWVudCdzIHRlbXBvcmFyeSBkcmFnXG4gICAgLy8gY29udGFpbmVyIGFuZCBpdCdzIG9yaWdpbmFsIGNvbnRhaW5lci5cbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCaW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIHRvIGFsbCBzY3JvbGxhYmxlIGFuY2VzdG9yIGVsZW1lbnRzIG9mIHRoZVxuICAgKiBkcmFnZ2VkIGVsZW1lbnQgYW5kIHRoZSBkcmFnIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2JpbmRTY3JvbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IHRoaXMuX2dldEdyaWQoKS5fZWxlbWVudDtcbiAgICB2YXIgZHJhZ0NvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcjtcbiAgICB2YXIgc2Nyb2xsZXJzID0gdGhpcy5fc2Nyb2xsZXJzO1xuICAgIHZhciBncmlkU2Nyb2xsZXJzO1xuICAgIHZhciBpO1xuXG4gICAgLy8gR2V0IGRyYWdnZWQgZWxlbWVudCdzIHNjcm9sbGluZyBwYXJlbnRzLlxuICAgIHNjcm9sbGVycy5sZW5ndGggPSAwO1xuICAgIGdldFNjcm9sbGFibGVBbmNlc3RvcnModGhpcy5faXRlbS5fZWxlbWVudCwgZmFsc2UsIHNjcm9sbGVycyk7XG5cbiAgICAvLyBJZiBkcmFnIGNvbnRhaW5lciBpcyBkZWZpbmVkIGFuZCBpdCdzIG5vdCB0aGUgc2FtZSBlbGVtZW50IGFzIGdyaWRcbiAgICAvLyBjb250YWluZXIgdGhlbiB3ZSBuZWVkIHRvIGFkZCB0aGUgZ3JpZCBjb250YWluZXIgYW5kIGl0J3Mgc2Nyb2xsIHBhcmVudHNcbiAgICAvLyB0byB0aGUgZWxlbWVudHMgd2hpY2ggYXJlIGdvaW5nIHRvIGJlIGxpc3RlbmVyIGZvciBzY3JvbGwgZXZlbnRzLlxuICAgIGlmIChkcmFnQ29udGFpbmVyICE9PSBncmlkQ29udGFpbmVyKSB7XG4gICAgICBncmlkU2Nyb2xsZXJzID0gW107XG4gICAgICBnZXRTY3JvbGxhYmxlQW5jZXN0b3JzKGdyaWRDb250YWluZXIsIHRydWUsIGdyaWRTY3JvbGxlcnMpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyaWRTY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNjcm9sbGVycy5pbmRleE9mKGdyaWRTY3JvbGxlcnNbaV0pIDwgMCkge1xuICAgICAgICAgIHNjcm9sbGVycy5wdXNoKGdyaWRTY3JvbGxlcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmluZCBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBzY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjcm9sbGVyc1tpXS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9vblNjcm9sbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgY3VycmVudGx5IGJvdW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIGZyb20gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3JcbiAgICogZWxlbWVudHMgb2YgdGhlIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fdW5iaW5kU2Nyb2xsTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjcm9sbGVycyA9IHRoaXMuX3Njcm9sbGVycztcbiAgICB2YXIgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjcm9sbGVyc1tpXS5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9vblNjcm9sbCk7XG4gICAgfVxuXG4gICAgc2Nyb2xsZXJzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIGRlZmF1bHQgc3RhcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fc2V0dXBTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgY29uZmlnID0gb3B0aW9ucyB8fCB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZSB8fCAwO1xuICAgIHJldHVybiAodGhpcy5fc3RhcnRQcmVkaWNhdGVEYXRhID0ge1xuICAgICAgZGlzdGFuY2U6IE1hdGguYWJzKGNvbmZpZy5kaXN0YW5jZSkgfHwgMCxcbiAgICAgIGRlbGF5OiBNYXRoLm1heChjb25maWcuZGVsYXksIDApIHx8IDAsXG4gICAgICBoYW5kbGU6IHR5cGVvZiBjb25maWcuaGFuZGxlID09PSAnc3RyaW5nJyA/IGNvbmZpZy5oYW5kbGUgOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXR1cCBkZWZhdWx0IHN0YXJ0IHByZWRpY2F0ZSBoYW5kbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHs/SFRNTEVsZW1lbnR9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2dldFN0YXJ0UHJlZGljYXRlSGFuZGxlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgcHJlZGljYXRlID0gdGhpcy5fc3RhcnRQcmVkaWNhdGVEYXRhO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5faXRlbS5fZWxlbWVudDtcbiAgICB2YXIgaGFuZGxlRWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBObyBoYW5kbGUsIG5vIGhhc3NsZSAtPiBsZXQncyB1c2UgdGhlIGl0ZW0gZWxlbWVudCBhcyB0aGUgaGFuZGxlLlxuICAgIGlmICghcHJlZGljYXRlLmhhbmRsZSkgcmV0dXJuIGhhbmRsZUVsZW1lbnQ7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHNwZWNpZmljIHByZWRpY2F0ZSBoYW5kbGUgZGVmaW5lZCwgbGV0J3MgdHJ5IHRvIGdldCBpdC5cbiAgICBoYW5kbGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIHdoaWxlIChoYW5kbGVFbGVtZW50ICYmICFlbGVtZW50TWF0Y2hlcyhoYW5kbGVFbGVtZW50LCBwcmVkaWNhdGUuaGFuZGxlKSkge1xuICAgICAgaGFuZGxlRWxlbWVudCA9IGhhbmRsZUVsZW1lbnQgIT09IGVsZW1lbnQgPyBoYW5kbGVFbGVtZW50LnBhcmVudEVsZW1lbnQgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlRWxlbWVudCB8fCBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgY3VycmVudGx5IGJvdW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIGZyb20gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3JcbiAgICogZWxlbWVudHMgb2YgdGhlIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNvbHZlU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG5cbiAgICAvLyBJZiB0aGUgbW92ZWQgZGlzdGFuY2UgaXMgc21hbGxlciB0aGFuIHRoZSB0aHJlc2hvbGQgZGlzdGFuY2Ugb3IgdGhlcmUgaXNcbiAgICAvLyBzb21lIGRlbGF5IGxlZnQsIGlnbm9yZSB0aGlzIHByZWRpY2F0ZSBjeWNsZS5cbiAgICBpZiAoZXZlbnQuZGlzdGFuY2UgPCBwcmVkaWNhdGUuZGlzdGFuY2UgfHwgcHJlZGljYXRlLmRlbGF5KSByZXR1cm47XG5cbiAgICAvLyBHZXQgaGFuZGxlIHJlY3QgZGF0YS5cbiAgICB2YXIgaGFuZGxlUmVjdCA9IHByZWRpY2F0ZS5oYW5kbGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBoYW5kbGVMZWZ0ID0gaGFuZGxlUmVjdC5sZWZ0ICsgKHdpbmRvdy5wYWdlWE9mZnNldCB8fCAwKTtcbiAgICB2YXIgaGFuZGxlVG9wID0gaGFuZGxlUmVjdC50b3AgKyAod2luZG93LnBhZ2VZT2Zmc2V0IHx8IDApO1xuICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZVJlY3Qud2lkdGg7XG4gICAgdmFyIGhhbmRsZUhlaWdodCA9IGhhbmRsZVJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gUmVzZXQgcHJlZGljYXRlIGRhdGEuXG4gICAgdGhpcy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnNvciBpcyBzdGlsbCB3aXRoaW4gdGhlIGhhbmRsZSBsZXQncyBzdGFydCB0aGUgZHJhZy5cbiAgICByZXR1cm4gKFxuICAgICAgaGFuZGxlV2lkdGggJiZcbiAgICAgIGhhbmRsZUhlaWdodCAmJlxuICAgICAgZXZlbnQucGFnZVggPj0gaGFuZGxlTGVmdCAmJlxuICAgICAgZXZlbnQucGFnZVggPCBoYW5kbGVMZWZ0ICsgaGFuZGxlV2lkdGggJiZcbiAgICAgIGV2ZW50LnBhZ2VZID49IGhhbmRsZVRvcCAmJlxuICAgICAgZXZlbnQucGFnZVkgPCBoYW5kbGVUb3AgKyBoYW5kbGVIZWlnaHRcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JjZWZ1bGx5IHJlc29sdmUgZHJhZyBzdGFydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2ZvcmNlUmVzb2x2ZVN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2lzRGVzdHJveWVkICYmIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUGVuZGluZykge1xuICAgICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQ7XG4gICAgICB0aGlzLl9vblN0YXJ0KGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmFsaXplIHN0YXJ0IHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZmluaXNoU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5faXRlbS5fZWxlbWVudDtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGljayAodmVyeSBzdWJqZWN0aXZlIGhldXJpc3RpY3MpLlxuICAgIHZhciBpc0NsaWNrID0gTWF0aC5hYnMoZXZlbnQuZGVsdGFYKSA8IDIgJiYgTWF0aC5hYnMoZXZlbnQuZGVsdGFZKSA8IDIgJiYgZXZlbnQuZGVsdGFUaW1lIDwgMjAwO1xuXG4gICAgLy8gUmVzZXQgcHJlZGljYXRlLlxuICAgIHRoaXMuX3Jlc2V0U3RhcnRQcmVkaWNhdGUoKTtcblxuICAgIC8vIElmIHRoZSBnZXN0dXJlIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBjbGljayBsZXQncyB0cnkgdG8gb3BlbiB0aGUgZWxlbWVudCdzXG4gICAgLy8gaHJlZiB1cmwgKGlmIGl0IGlzIGFuIGFuY2hvciBlbGVtZW50KS5cbiAgICBpZiAoaXNDbGljaykgb3BlbkFuY2hvckhyZWYoZWxlbWVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IGRyYWcgc29ydCBoZXVyaXN0aWNzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldEhldXJpc3RpY3MgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgIHRoaXMuX2hYMSA9IHRoaXMuX2hYMiA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5faFkxID0gdGhpcy5faFkyID0gZXZlbnQuY2xpZW50WTtcbiAgfTtcblxuICAvKipcbiAgICogUnVuIGhldXJpc3RpY3MgYW5kIHJldHVybiB0cnVlIGlmIG92ZXJsYXAgY2hlY2sgY2FuIGJlIHBlcmZvcm1lZCwgYW5kIGZhbHNlXG4gICAqIGlmIGl0IGNhbiBub3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9jaGVja0hldXJpc3RpY3MgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1NvcnRIZXVyaXN0aWNzO1xuICAgIHZhciBtaW5EaXN0ID0gc2V0dGluZ3MubWluRHJhZ0Rpc3RhbmNlO1xuXG4gICAgLy8gU2tpcCBoZXVyaXN0aWNzIGlmIG5vdCBuZWVkZWQuXG4gICAgaWYgKG1pbkRpc3QgPD0gMCkge1xuICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdmFyIHkgPSBldmVudC5jbGllbnRZO1xuICAgIHZhciBkaWZmWCA9IHggLSB0aGlzLl9oWDI7XG4gICAgdmFyIGRpZmZZID0geSAtIHRoaXMuX2hZMjtcblxuICAgIC8vIElmIHdlIGNhbid0IGRvIHByb3BlciBib3VuY2UgYmFjayBjaGVjayBtYWtlIHN1cmUgdGhhdCB0aGUgYmxvY2tlZCBpbmRleFxuICAgIC8vIGlzIG5vdCBzZXQuXG4gICAgdmFyIGNhbkNoZWNrQm91bmNlQmFjayA9IG1pbkRpc3QgPiAzICYmIHNldHRpbmdzLm1pbkJvdW5jZUJhY2tBbmdsZSA+IDA7XG4gICAgaWYgKCFjYW5DaGVja0JvdW5jZUJhY2spIHtcbiAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBtaW5EaXN0IHx8IE1hdGguYWJzKGRpZmZZKSA+IG1pbkRpc3QpIHtcbiAgICAgIC8vIFJlc2V0IGJsb2NrZWQgaW5kZXggaWYgYW5nbGUgY2hhbmdlZCBlbm91Z2guIFRoaXMgY2hlY2sgcmVxdWlyZXMgYVxuICAgICAgLy8gbWluaW11bSB2YWx1ZSBvZiAzIGZvciBtaW5EcmFnRGlzdGFuY2UgdG8gZnVuY3Rpb24gcHJvcGVybHkuXG4gICAgICBpZiAoY2FuQ2hlY2tCb3VuY2VCYWNrKSB7XG4gICAgICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIoZGlmZlgsIGRpZmZZKTtcbiAgICAgICAgdmFyIHByZXZBbmdsZSA9IE1hdGguYXRhbjIodGhpcy5faFgyIC0gdGhpcy5faFgxLCB0aGlzLl9oWTIgLSB0aGlzLl9oWTEpO1xuICAgICAgICB2YXIgZGVsdGFBbmdsZSA9IE1hdGguYXRhbjIoTWF0aC5zaW4oYW5nbGUgLSBwcmV2QW5nbGUpLCBNYXRoLmNvcyhhbmdsZSAtIHByZXZBbmdsZSkpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZGVsdGFBbmdsZSkgPiBzZXR0aW5ncy5taW5Cb3VuY2VCYWNrQW5nbGUpIHtcbiAgICAgICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcG9pbnRzLlxuICAgICAgdGhpcy5faFgxID0gdGhpcy5faFgyO1xuICAgICAgdGhpcy5faFkxID0gdGhpcy5faFkyO1xuICAgICAgdGhpcy5faFgyID0geDtcbiAgICAgIHRoaXMuX2hZMiA9IHk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgZm9yIGRlZmF1bHQgZHJhZyBzdGFydCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcmVzZXRTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG4gICAgaWYgKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHByZWRpY2F0ZS5kZWxheVRpbWVyKSB7XG4gICAgICAgIHByZWRpY2F0ZS5kZWxheVRpbWVyID0gd2luZG93LmNsZWFyVGltZW91dChwcmVkaWNhdGUuZGVsYXlUaW1lcik7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGEgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgKGR1cmluZyBkcmFnKSBpZiBhbiBpdGVtIGlzIG92ZXJsYXBwaW5nIG90aGVyIGl0ZW1zIGFuZCBiYXNlZCBvblxuICAgKiB0aGUgY29uZmlndXJhdGlvbiBsYXlvdXQgdGhlIGl0ZW1zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2NoZWNrT3ZlcmxhcCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciByZXN1bHQ7XG4gICAgdmFyIGN1cnJlbnRHcmlkO1xuICAgIHZhciBjdXJyZW50SW5kZXg7XG4gICAgdmFyIHRhcmdldEdyaWQ7XG4gICAgdmFyIHRhcmdldEluZGV4O1xuICAgIHZhciBzb3J0QWN0aW9uO1xuICAgIHZhciBpc01pZ3JhdGlvbjtcblxuICAgIC8vIEdldCBvdmVybGFwIGNoZWNrIHJlc3VsdC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU29ydFByZWRpY2F0ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKGl0ZW0sIHRoaXMuX2RyYWdFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IEl0ZW1EcmFnLmRlZmF1bHRTb3J0UHJlZGljYXRlKGl0ZW0sIHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKTtcbiAgICB9XG5cbiAgICAvLyBMZXQncyBtYWtlIHN1cmUgdGhlIHJlc3VsdCBvYmplY3QgaGFzIGEgdmFsaWQgaW5kZXggYmVmb3JlIGdvaW5nIGZ1cnRoZXIuXG4gICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdC5pbmRleCAhPT0gJ251bWJlcicpIHJldHVybjtcblxuICAgIGN1cnJlbnRHcmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdGFyZ2V0R3JpZCA9IHJlc3VsdC5ncmlkIHx8IGN1cnJlbnRHcmlkO1xuICAgIGlzTWlncmF0aW9uID0gY3VycmVudEdyaWQgIT09IHRhcmdldEdyaWQ7XG4gICAgY3VycmVudEluZGV4ID0gY3VycmVudEdyaWQuX2l0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdGFyZ2V0SW5kZXggPSBub3JtYWxpemVBcnJheUluZGV4KHRhcmdldEdyaWQuX2l0ZW1zLCByZXN1bHQuaW5kZXgsIGlzTWlncmF0aW9uKTtcbiAgICBzb3J0QWN0aW9uID0gcmVzdWx0LmFjdGlvbiA9PT0gYWN0aW9uU3dhcCA/IGFjdGlvblN3YXAgOiBhY3Rpb25Nb3ZlO1xuXG4gICAgLy8gUHJldmVudCBwb3NpdGlvbiBib3VuY2UuXG4gICAgaWYgKCFpc01pZ3JhdGlvbiAmJiB0YXJnZXRJbmRleCA9PT0gdGhpcy5faEJsb2NrZWRJbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIHdhcyBtb3ZlZCB3aXRoaW4gaXQncyBjdXJyZW50IGdyaWQuXG4gICAgaWYgKCFpc01pZ3JhdGlvbikge1xuICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0YXJnZXQgaW5kZXggaXMgbm90IHRoZSBjdXJyZW50IGluZGV4LlxuICAgICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IGN1cnJlbnRJbmRleDtcblxuICAgICAgICAvLyBEbyB0aGUgc29ydC5cbiAgICAgICAgKHNvcnRBY3Rpb24gPT09IGFjdGlvblN3YXAgPyBhcnJheVN3YXAgOiBhcnJheU1vdmUpKFxuICAgICAgICAgIGN1cnJlbnRHcmlkLl9pdGVtcyxcbiAgICAgICAgICBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdGFyZ2V0SW5kZXhcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IG1vdmUgZXZlbnQuXG4gICAgICAgIGlmIChjdXJyZW50R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50TW92ZSkpIHtcbiAgICAgICAgICBjdXJyZW50R3JpZC5fZW1pdChldmVudE1vdmUsIHtcbiAgICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4LFxuICAgICAgICAgICAgYWN0aW9uOiBzb3J0QWN0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMYXlvdXQgdGhlIGdyaWQuXG4gICAgICAgIGN1cnJlbnRHcmlkLmxheW91dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIHdhcyBtb3ZlZCB0byBhbm90aGVyIGdyaWQuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcblxuICAgICAgLy8gRW1pdCBiZWZvcmVTZW5kIGV2ZW50LlxuICAgICAgaWYgKGN1cnJlbnRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVTZW5kKSkge1xuICAgICAgICBjdXJyZW50R3JpZC5fZW1pdChldmVudEJlZm9yZVNlbmQsIHtcbiAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgIGZyb21HcmlkOiBjdXJyZW50R3JpZCxcbiAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgYmVmb3JlUmVjZWl2ZSBldmVudC5cbiAgICAgIGlmICh0YXJnZXRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVSZWNlaXZlKSkge1xuICAgICAgICB0YXJnZXRHcmlkLl9lbWl0KGV2ZW50QmVmb3JlUmVjZWl2ZSwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGl0ZW0ncyBncmlkIGlkIHJlZmVyZW5jZS5cbiAgICAgIGl0ZW0uX2dyaWRJZCA9IHRhcmdldEdyaWQuX2lkO1xuXG4gICAgICAvLyBVcGRhdGUgZHJhZyBpbnN0YW5jZSdzIG1pZ3JhdGluZyBpbmRpY2F0b3IuXG4gICAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGl0ZW0uX2dyaWRJZCAhPT0gdGhpcy5fZ3JpZElkO1xuXG4gICAgICAvLyBNb3ZlIGl0ZW0gaW5zdGFuY2UgZnJvbSBjdXJyZW50IGdyaWQgdG8gdGFyZ2V0IGdyaWQuXG4gICAgICBjdXJyZW50R3JpZC5faXRlbXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgICBhcnJheUluc2VydCh0YXJnZXRHcmlkLl9pdGVtcywgaXRlbSwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgICAvLyBTZXQgc29ydCBkYXRhIGFzIG51bGwsIHdoaWNoIGlzIGFuIGluZGljYXRvciBmb3IgdGhlIGl0ZW0gY29tcGFyaXNvblxuICAgICAgLy8gZnVuY3Rpb24gdGhhdCB0aGUgc29ydCBkYXRhIG9mIHRoaXMgc3BlY2lmaWMgaXRlbSBzaG91bGQgYmUgZmV0Y2hlZFxuICAgICAgLy8gbGF6aWx5LlxuICAgICAgaXRlbS5fc29ydERhdGEgPSBudWxsO1xuXG4gICAgICAvLyBFbWl0IHNlbmQgZXZlbnQuXG4gICAgICBpZiAoY3VycmVudEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFNlbmQpKSB7XG4gICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50U2VuZCwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCByZWNlaXZlIGV2ZW50LlxuICAgICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFJlY2VpdmUpKSB7XG4gICAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRSZWNlaXZlLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMYXlvdXQgYm90aCBncmlkcy5cbiAgICAgIGN1cnJlbnRHcmlkLmxheW91dCgpO1xuICAgICAgdGFyZ2V0R3JpZC5sYXlvdXQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIGl0ZW0gaXMgZHJhZ2dlZCBpbnRvIGFub3RoZXIgZ3JpZCwgZmluaXNoIHRoZSBtaWdyYXRpb24gcHJvY2Vzc1xuICAgKiBncmFjZWZ1bGx5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2ZpbmlzaE1pZ3JhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBpc0FjdGl2ZSA9IGl0ZW0uX2lzQWN0aXZlO1xuICAgIHZhciB0YXJnZXRHcmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHRhcmdldEdyaWRFbGVtZW50ID0gdGFyZ2V0R3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdGFyZ2V0U2V0dGluZ3MgPSB0YXJnZXRHcmlkLl9zZXR0aW5ncztcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0NvbnRhaW5lciB8fCB0YXJnZXRHcmlkRWxlbWVudDtcbiAgICB2YXIgY3VycmVudFNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgY3VycmVudENvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB2YXIgdHJhbnNsYXRlO1xuICAgIHZhciBvZmZzZXREaWZmO1xuXG4gICAgLy8gRGVzdHJveSBjdXJyZW50IGRyYWcuIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIHNldCB0aGUgbWlncmF0aW5nIGZsYWcgdG9cbiAgICAvLyBmYWxzZSBmaXJzdCwgYmVjYXVzZSBvdGhlcndpc2Ugd2UgY3JlYXRlIGFuIGluZmluaXRlIGxvb3AgYmV0d2VlbiB0aGlzXG4gICAgLy8gYW5kIHRoZSBkcmFnLnN0b3AoKSBtZXRob2QuXG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSBjdXJyZW50IGNsYXNzbmFtZXMuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGN1cnJlbnRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gQWRkIG5ldyBjbGFzc25hbWVzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIHRhcmdldFNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgaXNBY3RpdmUgPyB0YXJnZXRTZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzIDogdGFyZ2V0U2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIE1vdmUgdGhlIGl0ZW0gaW5zaWRlIHRoZSB0YXJnZXQgY29udGFpbmVyIGlmIGl0J3MgZGlmZmVyZW50IHRoYW4gdGhlXG4gICAgLy8gY3VycmVudCBjb250YWluZXIuXG4gICAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gY3VycmVudENvbnRhaW5lcikge1xuICAgICAgdGFyZ2V0Q29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYoY3VycmVudENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCB0cnVlKTtcbiAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgIHRyYW5zbGF0ZS54IC09IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRyYW5zbGF0ZS55IC09IG9mZnNldERpZmYudG9wO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBpdGVtJ3MgY2FjaGVkIGRpbWVuc2lvbnMgYW5kIHNvcnQgZGF0YS5cbiAgICBpdGVtLl9yZWZyZXNoRGltZW5zaW9ucygpO1xuICAgIGl0ZW0uX3JlZnJlc2hTb3J0RGF0YSgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBvZmZzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCdzIGRyYWcgY29udGFpbmVyIChpZiBhbnkpXG4gICAgLy8gYW5kIGFjdHVhbCBncmlkIGNvbnRhaW5lciBlbGVtZW50LiBXZSBzYXZlIGl0IGxhdGVyIGZvciB0aGUgcmVsZWFzZVxuICAgIC8vIHByb2Nlc3MuXG4gICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYodGFyZ2V0Q29udGFpbmVyLCB0YXJnZXRHcmlkRWxlbWVudCwgdHJ1ZSk7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlggPSBvZmZzZXREaWZmLmxlZnQ7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcblxuICAgIC8vIFJlY3JlYXRlIGl0ZW0ncyBkcmFnIGhhbmRsZXIuXG4gICAgaXRlbS5fZHJhZyA9IHRhcmdldFNldHRpbmdzLmRyYWdFbmFibGVkID8gbmV3IEl0ZW1EcmFnKGl0ZW0pIDogbnVsbDtcblxuICAgIC8vIEFkanVzdCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gZWxlbWVudCBpZiBpdCB3YXMgbW92ZWQgZnJvbSBhIGNvbnRhaW5lclxuICAgIC8vIHRvIGFub3RoZXIuXG4gICAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gY3VycmVudENvbnRhaW5lcikge1xuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGUueCwgdHJhbnNsYXRlLnkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjaGlsZCBlbGVtZW50J3Mgc3R5bGVzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBzdGF0ZS5cbiAgICBpdGVtLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgc2V0U3R5bGVzKGl0ZW0uX2NoaWxkLCBpc0FjdGl2ZSA/IHRhcmdldFNldHRpbmdzLnZpc2libGVTdHlsZXMgOiB0YXJnZXRTZXR0aW5ncy5oaWRkZW5TdHlsZXMpO1xuXG4gICAgLy8gU3RhcnQgdGhlIHJlbGVhc2UuXG4gICAgcmVsZWFzZS5zdGFydCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIHByZS1zdGFydCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9wcmVTdGFydENoZWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBMZXQncyBhY3RpdmF0ZSBkcmFnIHN0YXJ0IHByZWRpY2F0ZSBzdGF0ZS5cbiAgICBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVJbmFjdGl2ZSkge1xuICAgICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlUGVuZGluZztcbiAgICB9XG5cbiAgICAvLyBJZiBwcmVkaWNhdGUgaXMgcGVuZGluZyB0cnkgdG8gcmVzb2x2ZSBpdC5cbiAgICBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlKHRoaXMuX2l0ZW0sIGV2ZW50KTtcbiAgICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcbiAgICAgICAgdGhpcy5fb25TdGFydChldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZWplY3RlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgaWYgcHJlZGljYXRlIGlzIHJlc29sdmVkIGFuZCBkcmFnIGlzIGFjdGl2ZSwgbW92ZSB0aGUgaXRlbS5cbiAgICBlbHNlIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZVJlc29sdmVkICYmIHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9vbk1vdmUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBwcmUtZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZUVuZENoZWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnQgcHJlZGljYXRlIHdhcyByZXNvbHZlZCBkdXJpbmcgZHJhZy5cbiAgICB2YXIgaXNSZXNvbHZlZCA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQ7XG5cbiAgICAvLyBEbyBmaW5hbCBwcmVkaWNhdGUgY2hlY2sgdG8gYWxsb3cgdXNlciB0byB1bmJpbmQgc3R1ZmYgZm9yIHRoZSBjdXJyZW50XG4gICAgLy8gZHJhZyBwcm9jZWR1cmUgd2l0aGluIHRoZSBwcmVkaWNhdGUgY2FsbGJhY2suIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpc1xuICAgIC8vIGNoZWNrIHdpbGwgaGF2ZSBubyBlZmZlY3QgdG8gdGhlIHN0YXRlIG9mIHRoZSBwcmVkaWNhdGUuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGUodGhpcy5faXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gUmVzZXQgc3RhcnQgcHJlZGljYXRlIHN0YXRlLlxuICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZUluYWN0aXZlO1xuXG4gICAgLy8gSWYgcHJlZGljYXRlIGlzIHJlc29sdmVkIGFuZCBkcmFnZ2luZyBpcyBhY3RpdmUsIGNhbGwgdGhlIGVuZCBoYW5kbGVyLlxuICAgIGlmIChpc1Jlc29sdmVkICYmIHRoaXMuX2lzQWN0aXZlKSB0aGlzLl9vbkVuZChldmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgc3RhcnQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25TdGFydCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlLCBkb24ndCBzdGFydCB0aGUgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHJlbGVhc2UgPSBpdGVtLl9yZWxlYXNlO1xuICAgIHZhciBtaWdyYXRlID0gaXRlbS5fbWlncmF0ZTtcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIGRyYWdDb250YWluZXIgPSBzZXR0aW5ncy5kcmFnQ29udGFpbmVyIHx8IGdyaWRDb250YWluZXI7XG4gICAgdmFyIGNvbnRhaW5pbmdCbG9jayA9IGdldENvbnRhaW5pbmdCbG9jayhkcmFnQ29udGFpbmVyLCB0cnVlKTtcbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgIHZhciBjdXJyZW50TGVmdCA9IHRyYW5zbGF0ZS54O1xuICAgIHZhciBjdXJyZW50VG9wID0gdHJhbnNsYXRlLnk7XG4gICAgdmFyIGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgaGFzRHJhZ0NvbnRhaW5lciA9IGRyYWdDb250YWluZXIgIT09IGdyaWRDb250YWluZXI7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBSZXNldCBoZXVyaXN0aWNzIGRhdGEuXG4gICAgdGhpcy5fcmVzZXRIZXVyaXN0aWNzKGV2ZW50KTtcblxuICAgIC8vIElmIGdyaWQgY29udGFpbmVyIGlzIG5vdCB0aGUgZHJhZyBjb250YWluZXIsIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZVxuICAgIC8vIG9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gZ3JpZCBjb250YWluZXIgYW5kIGRyYWcgY29udGFpbmVyJ3MgY29udGFpbmluZ1xuICAgIC8vIGVsZW1lbnQuXG4gICAgaWYgKGhhc0RyYWdDb250YWluZXIpIHtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKGNvbnRhaW5pbmdCbG9jaywgZ3JpZENvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IHBvc2l0aW9uaW5nIGFuaW1hdGlvbi5cbiAgICBpZiAoaXRlbS5pc1Bvc2l0aW9uaW5nKCkpIHtcbiAgICAgIGl0ZW0uX2xheW91dC5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcoY3VycmVudExlZnQsIGN1cnJlbnRUb3ApIH0pO1xuICAgIH1cblxuICAgIC8vIFN0b3AgY3VycmVudCBtaWdyYXRpb24gYW5pbWF0aW9uLlxuICAgIGlmIChtaWdyYXRlLl9pc0FjdGl2ZSkge1xuICAgICAgY3VycmVudExlZnQgLT0gbWlncmF0ZS5fY29udGFpbmVyRGlmZlg7XG4gICAgICBjdXJyZW50VG9wIC09IG1pZ3JhdGUuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgbWlncmF0ZS5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcoY3VycmVudExlZnQsIGN1cnJlbnRUb3ApIH0pO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgYmVpbmcgcmVsZWFzZWQgcmVzZXQgcmVsZWFzZSBkYXRhLlxuICAgIGlmIChpdGVtLmlzUmVsZWFzaW5nKCkpIHJlbGVhc2UuX3Jlc2V0KCk7XG5cbiAgICAvLyBTZXR1cCBkcmFnIGRhdGEuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2RyYWdFdmVudCA9IGV2ZW50O1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IGRyYWdDb250YWluZXI7XG4gICAgdGhpcy5fY29udGFpbmluZ0Jsb2NrID0gY29udGFpbmluZ0Jsb2NrO1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRYID0gZWxlbWVudFJlY3QubGVmdDtcbiAgICB0aGlzLl9lbGVtZW50Q2xpZW50WSA9IGVsZW1lbnRSZWN0LnRvcDtcbiAgICB0aGlzLl9sZWZ0ID0gdGhpcy5fZ3JpZFggPSBjdXJyZW50TGVmdDtcbiAgICB0aGlzLl90b3AgPSB0aGlzLl9ncmlkWSA9IGN1cnJlbnRUb3A7XG5cbiAgICAvLyBDcmVhdGUgcGxhY2Vob2xkZXIgKGlmIG5lY2Vzc2FyeSkuXG4gICAgaWYgKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5lbmFibGVkKSB7XG4gICAgICBpdGVtLl9kcmFnUGxhY2Vob2xkZXIuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBkcmFnSW5pdCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ0luaXQsIGl0ZW0sIGV2ZW50KTtcblxuICAgIC8vIElmIGEgc3BlY2lmaWMgZHJhZyBjb250YWluZXIgaXMgc2V0IGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICAvLyBncmlkJ3MgY29udGFpbmVyIGVsZW1lbnQgd2UgbmVlZCB0byBjYXN0IHNvbWUgZXh0cmEgc3BlbGxzLlxuICAgIGlmIChoYXNEcmFnQ29udGFpbmVyKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgY29udGFpbmVyIG9mZnNldCBkaWZmcyB0byBkcmFnIGRhdGEuXG4gICAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gb2Zmc2V0RGlmZi50b3A7XG5cbiAgICAgIC8vIElmIHRoZSBkcmFnZ2VkIGVsZW1lbnQgaXMgYSBjaGlsZCBvZiB0aGUgZHJhZyBjb250YWluZXIgYWxsIHdlIG5lZWQgdG9cbiAgICAgIC8vIGRvIGlzIHNldHVwIHRoZSByZWxhdGl2ZSBkcmFnIHBvc2l0aW9uIGRhdGEuXG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlID09PSBkcmFnQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuX2dyaWRYID0gY3VycmVudExlZnQgLSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgICAgdGhpcy5fZ3JpZFkgPSBjdXJyZW50VG9wIC0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGNvcnJlY3QgY29udGFpbmVyLFxuICAgICAgLy8gc2V0dXAgdGhlIGFjdHVhbCBkcmFnIHBvc2l0aW9uIGRhdGEgYW5kIGFkanVzdCB0aGUgZWxlbWVudCdzIHRyYW5zbGF0ZVxuICAgICAgLy8gdmFsdWVzIHRvIGFjY291bnQgZm9yIHRoZSBET00gcG9zaXRpb24gc2hpZnQuXG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGVmdCA9IGN1cnJlbnRMZWZ0ICsgdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgICAgIHRoaXMuX3RvcCA9IGN1cnJlbnRUb3AgKyB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICAgICAgZHJhZ0NvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9sZWZ0LCB0aGlzLl90b3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBkcmFnIGNsYXNzIGFuZCBiaW5kIHNjcm9sbGVycy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtRHJhZ2dpbmdDbGFzcyk7XG4gICAgdGhpcy5fYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gRW1pdCBkcmFnU3RhcnQgZXZlbnQuXG4gICAgZ3JpZC5fZW1pdChldmVudERyYWdTdGFydCwgaXRlbSwgZXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIG1vdmUgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIHJlc2V0IGRyYWcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgYXhpcyA9IHNldHRpbmdzLmRyYWdBeGlzO1xuXG4gICAgLy8gVXBkYXRlIGhvcml6b250YWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3knKSB7XG4gICAgICB2YXIgeERpZmYgPSBldmVudC5jbGllbnRYIC0gdGhpcy5fZHJhZ0V2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLl9sZWZ0ICs9IHhEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFggKz0geERpZmY7XG4gICAgICB0aGlzLl9lbGVtZW50Q2xpZW50WCArPSB4RGlmZjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdmVydGljYWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3gnKSB7XG4gICAgICB2YXIgeURpZmYgPSBldmVudC5jbGllbnRZIC0gdGhpcy5fZHJhZ0V2ZW50LmNsaWVudFk7XG4gICAgICB0aGlzLl90b3AgKz0geURpZmY7XG4gICAgICB0aGlzLl9ncmlkWSArPSB5RGlmZjtcbiAgICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZICs9IHlEaWZmO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBldmVudCBkYXRhLlxuICAgIHRoaXMuX2RyYWdFdmVudCA9IGV2ZW50O1xuXG4gICAgLy8gRG8gbW92ZSBwcmVwYXJlL2FwcGx5IGhhbmRsaW5nIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkTW92ZVRpY2soaXRlbS5faWQsIHRoaXMuX3ByZXBhcmVNb3ZlLCB0aGlzLl9hcHBseU1vdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRyYWdnZWQgaXRlbSBmb3IgbW92aW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZXBhcmVNb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gRG8gbm90aGluZyBpZiBpdGVtIGlzIG5vdCBhY3RpdmUuXG4gICAgaWYgKCF0aGlzLl9pdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gSWYgZHJhZyBzb3J0IGlzIGVuYWJsZWQgLT4gY2hlY2sgb3ZlcmxhcC5cbiAgICBpZiAodGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnU29ydCkge1xuICAgICAgaWYgKHRoaXMuX2NoZWNrSGV1cmlzdGljcyh0aGlzLl9kcmFnRXZlbnQpKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrT3ZlcmxhcERlYm91bmNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBtb3ZlbWVudCB0byBkcmFnZ2VkIGl0ZW0uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fYXBwbHlNb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gRG8gbm90aGluZyBpZiBpdGVtIGlzIG5vdCBhY3RpdmUuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGVsZW1lbnQncyB0cmFuc2xhdGVYL1kgdmFsdWVzLlxuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fbGVmdCwgdGhpcy5fdG9wKTtcblxuICAgIC8vIEVtaXQgZHJhZ01vdmUgZXZlbnQuXG4gICAgdGhpcy5fZ2V0R3JpZCgpLl9lbWl0KGV2ZW50RHJhZ01vdmUsIGl0ZW0sIHRoaXMuX2RyYWdFdmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgc2Nyb2xsIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25TY3JvbGwgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbGFzdCBzY3JvbGwgZXZlbnQuXG4gICAgdGhpcy5fc2Nyb2xsRXZlbnQgPSBldmVudDtcblxuICAgIC8vIERvIHNjcm9sbCBwcmVwYXJlL2FwcGx5IGhhbmRsaW5nIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkU2Nyb2xsVGljayhpdGVtLl9pZCwgdGhpcy5fcHJlcGFyZVNjcm9sbCwgdGhpcy5fYXBwbHlTY3JvbGwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRyYWdnZWQgaXRlbSBmb3Igc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZXBhcmVTY3JvbGwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUgZG8gbm90aGluZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGF4aXMgPSBzZXR0aW5ncy5kcmFnQXhpcztcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBDYWxjdWxhdGUgZWxlbWVudCdzIHJlY3QgYW5kIHgveSBkaWZmLlxuICAgIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgeERpZmYgPSB0aGlzLl9lbGVtZW50Q2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB2YXIgeURpZmYgPSB0aGlzLl9lbGVtZW50Q2xpZW50WSAtIHJlY3QudG9wO1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBkaWZmLlxuICAgIGlmICh0aGlzLl9jb250YWluZXIgIT09IGdyaWRDb250YWluZXIpIHtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKHRoaXMuX2NvbnRhaW5pbmdCbG9jaywgZ3JpZENvbnRhaW5lcik7XG4gICAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gb2Zmc2V0RGlmZi50b3A7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGhvcml6b250YWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3knKSB7XG4gICAgICB0aGlzLl9sZWZ0ICs9IHhEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFggPSB0aGlzLl9sZWZ0IC0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHZlcnRpY2FsIHBvc2l0aW9uIGRhdGEuXG4gICAgaWYgKGF4aXMgIT09ICd4Jykge1xuICAgICAgdGhpcy5fdG9wICs9IHlEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFkgPSB0aGlzLl90b3AgLSB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICB9XG5cbiAgICAvLyBPdmVybGFwIGhhbmRsaW5nLlxuICAgIGlmIChzZXR0aW5ncy5kcmFnU29ydCkgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoKTtcbiAgfTtcblxuICAvKipcbiAgICogQXBwbHkgc2Nyb2xsIHRvIGRyYWdnZWQgaXRlbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9hcHBseVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSBkbyBub3RoaW5nLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIC8vIFVwZGF0ZSBlbGVtZW50J3MgdHJhbnNsYXRlWC9ZIHZhbHVlcy5cbiAgICBpdGVtLl9lbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2xlZnQsIHRoaXMuX3RvcCk7XG5cbiAgICAvLyBFbWl0IGRyYWdTY3JvbGwgZXZlbnQuXG4gICAgdGhpcy5fZ2V0R3JpZCgpLl9lbWl0KGV2ZW50RHJhZ1Njcm9sbCwgaXRlbSwgdGhpcy5fc2Nyb2xsRXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIGVuZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vbkVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIHJlc2V0IGRyYWcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCBtb3ZlIGFuZCBzY3JvbGwgdGlja3MuXG4gICAgY2FuY2VsTW92ZVRpY2soaXRlbS5faWQpO1xuICAgIGNhbmNlbFNjcm9sbFRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gRmluaXNoIGN1cnJlbnRseSBxdWV1ZWQgb3ZlcmxhcCBjaGVjay5cbiAgICBzZXR0aW5ncy5kcmFnU29ydCAmJiB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgnZmluaXNoJyk7XG5cbiAgICAvLyBSZW1vdmUgc2Nyb2xsIGxpc3RlbmVycy5cbiAgICB0aGlzLl91bmJpbmRTY3JvbGxMaXN0ZW5lcnMoKTtcblxuICAgIC8vIFNldHVwIHJlbGVhc2UgZGF0YS5cbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWCA9IHRoaXMuX2NvbnRhaW5lckRpZmZYO1xuICAgIHJlbGVhc2UuX2NvbnRhaW5lckRpZmZZID0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG5cbiAgICAvLyBSZXNldCBkcmFnIGRhdGEuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIC8vIFJlbW92ZSBkcmFnIGNsYXNzIG5hbWUgZnJvbSBlbGVtZW50LlxuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1EcmFnZ2luZ0NsYXNzKTtcblxuICAgIC8vIEVtaXQgZHJhZ0VuZCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ0VuZCwgaXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gRmluaXNoIHVwIHRoZSBtaWdyYXRpb24gcHJvY2VzcyBvciBzdGFydCB0aGUgcmVsZWFzZSBwcm9jZXNzLlxuICAgIHRoaXMuX2lzTWlncmF0aW5nID8gdGhpcy5fZmluaXNoTWlncmF0aW9uKCkgOiByZWxlYXNlLnN0YXJ0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgaGVscGVyc1xuICAgKiAqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBob3cgbWFueSBwZXJjZW50IHRoZSBpbnRlcnNlY3Rpb24gYXJlYSBvZiB0d28gcmVjdGFuZ2xlcyBpcyBmcm9tXG4gICAqIHRoZSBtYXhpbXVtIHBvdGVudGlhbCBpbnRlcnNlY3Rpb24gYXJlYSBiZXR3ZWVuIHRoZSByZWN0YW5nbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKiAgIC0gQSBudW1iZXIgYmV0d2VlbiAwLTEwMC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlY3RPdmVybGFwU2NvcmUoYSwgYikge1xuICAgIC8vIFJldHVybiAwIGltbWVkaWF0ZWx5IGlmIHRoZSByZWN0YW5nbGVzIGRvIG5vdCBvdmVybGFwLlxuICAgIGlmIChcbiAgICAgIGEubGVmdCArIGEud2lkdGggPD0gYi5sZWZ0IHx8XG4gICAgICBiLmxlZnQgKyBiLndpZHRoIDw9IGEubGVmdCB8fFxuICAgICAgYS50b3AgKyBhLmhlaWdodCA8PSBiLnRvcCB8fFxuICAgICAgYi50b3AgKyBiLmhlaWdodCA8PSBhLnRvcFxuICAgICkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBhcmVhJ3Mgd2lkdGgsIGhlaWdodCwgbWF4IGhlaWdodCBhbmQgbWF4IHdpZHRoLlxuICAgIHZhciB3aWR0aCA9IE1hdGgubWluKGEubGVmdCArIGEud2lkdGgsIGIubGVmdCArIGIud2lkdGgpIC0gTWF0aC5tYXgoYS5sZWZ0LCBiLmxlZnQpO1xuICAgIHZhciBoZWlnaHQgPSBNYXRoLm1pbihhLnRvcCArIGEuaGVpZ2h0LCBiLnRvcCArIGIuaGVpZ2h0KSAtIE1hdGgubWF4KGEudG9wLCBiLnRvcCk7XG4gICAgdmFyIG1heFdpZHRoID0gTWF0aC5taW4oYS53aWR0aCwgYi53aWR0aCk7XG4gICAgdmFyIG1heEhlaWdodCA9IE1hdGgubWluKGEuaGVpZ2h0LCBiLmhlaWdodCk7XG5cbiAgICByZXR1cm4gKCh3aWR0aCAqIGhlaWdodCkgLyAobWF4V2lkdGggKiBtYXhIZWlnaHQpKSAqIDEwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIGFuIGFuY2hvciBlbGVtZW50IGFuZCBvcGVuIHRoZSBocmVmIHVybCBpZiBwb3NzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gb3BlbkFuY2hvckhyZWYoZWxlbWVudCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBhbmNob3IgZWxlbWVudC5cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdhJykgcmV0dXJuO1xuXG4gICAgLy8gR2V0IGhyZWYgYW5kIG1ha2Ugc3VyZSBpdCBleGlzdHMuXG4gICAgdmFyIGhyZWYgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIGlmICghaHJlZikgcmV0dXJuO1xuXG4gICAgLy8gRmluYWxseSBsZXQncyBuYXZpZ2F0ZSB0byB0aGUgbGluayBocmVmLlxuICAgIHZhciB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09ICdfc2VsZicpIHtcbiAgICAgIHdpbmRvdy5vcGVuKGhyZWYsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhZyBwbGFjZWhvbGRlci5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbURyYWdQbGFjZWhvbGRlcihpdGVtKSB7XG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5fYW5pbWF0ZSA9IG5ldyBJdGVtQW5pbWF0ZSgpO1xuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2NsYXNzTmFtZSA9ICcnO1xuICAgIHRoaXMuX2RpZE1pZ3JhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSAwO1xuICAgIHRoaXMuX25leHRMZWZ0ID0gMDtcbiAgICB0aGlzLl9uZXh0VG9wID0gMDtcblxuICAgIC8vIEJpbmQgYW5pbWF0aW9uIGhhbmRsZXJzLlxuICAgIHRoaXMuX3NldHVwQW5pbWF0aW9uID0gdGhpcy5fc2V0dXBBbmltYXRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbiA9IHRoaXMuX3N0YXJ0QW5pbWF0aW9uLmJpbmQodGhpcyk7XG5cbiAgICAvLyBCaW5kIGV2ZW50IGhhbmRsZXJzLlxuICAgIHRoaXMuX29uTGF5b3V0U3RhcnQgPSB0aGlzLl9vbkxheW91dFN0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25MYXlvdXRFbmQgPSB0aGlzLl9vbkxheW91dEVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uUmVsZWFzZUVuZCA9IHRoaXMuX29uUmVsZWFzZUVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uTWlncmF0ZSA9IHRoaXMuX29uTWlncmF0ZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogTW92ZSBwbGFjZWhvbGRlciB0byBhIG5ldyBwb3NpdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25MYXlvdXRTdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuXG4gICAgLy8gRmluZCBvdXQgdGhlIGl0ZW0ncyBuZXcgKHVuYXBwbGllZCkgbGVmdCBhbmQgdG9wIHBvc2l0aW9uLlxuICAgIHZhciBpdGVtSW5kZXggPSBncmlkLl9pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciBuZXh0TGVmdCA9IGdyaWQuX2xheW91dC5zbG90c1tpdGVtSW5kZXggKiAyXTtcbiAgICB2YXIgbmV4dFRvcCA9IGdyaWQuX2xheW91dC5zbG90c1tpdGVtSW5kZXggKiAyICsgMV07XG5cbiAgICAvLyBJZiBpdGVtJ3MgcG9zaXRpb24gZGlkIG5vdCBjaGFuZ2UgYW5kIHRoZSBpdGVtIGRpZCBub3QgbWlncmF0ZSB3ZSBjYW5cbiAgICAvLyBzYWZlbHkgc2tpcCBsYXlvdXQuXG4gICAgaWYgKCF0aGlzLl9kaWRNaWdyYXRlICYmIGl0ZW0uX2xlZnQgPT09IG5leHRMZWZ0ICYmIGl0ZW0uX3RvcCA9PT0gbmV4dFRvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNsb3RzIGRhdGEgaXMgY2FsY3VsYXRlZCB3aXRoIGl0ZW0gbWFyZ2lucyBhZGRlZCB0byB0aGVtIHNvIHdlIG5lZWQgdG8gYWRkXG4gICAgLy8gaXRlbSdzIGxlZnQgYW5kIHRvcCBtYXJnaW4gdG8gdGhlIHNsb3QgZGF0YSB0byBnZXQgdGhlIHBsYWNlaG9sZGVyJ3NcbiAgICAvLyBuZXh0IHBvc2l0aW9uLlxuICAgIG5leHRMZWZ0ICs9IGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgbmV4dFRvcCArPSBpdGVtLl9tYXJnaW5Ub3A7XG5cbiAgICAvLyBKdXN0IHNuYXAgdG8gbmV3IHBvc2l0aW9uIHdpdGhvdXQgYW55IGFuaW1hdGlvbnMgaWYgbm8gYW5pbWF0aW9uIGlzXG4gICAgLy8gcmVxdWlyZWQgb3IgaWYgcGxhY2Vob2xkZXIgbW92ZXMgYmV0d2VlbiBncmlkcy5cbiAgICB2YXIgYW5pbUVuYWJsZWQgPSBncmlkLl9zZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuZHVyYXRpb24gPiAwO1xuICAgIGlmICghYW5pbUVuYWJsZWQgfHwgdGhpcy5fZGlkTWlncmF0ZSkge1xuICAgICAgLy8gQ2FuY2VsIHBvdGVudGlhbCAocXVldWVkKSBsYXlvdXQgdGljay5cbiAgICAgIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCk7XG5cbiAgICAgIC8vIFNuYXAgcGxhY2Vob2xkZXIgdG8gY29ycmVjdCBwb3NpdGlvbi5cbiAgICAgIHZhciB0YXJnZXRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKG5leHRMZWZ0LCBuZXh0VG9wKSB9O1xuICAgICAgaWYgKHRoaXMuX2FuaW1hdGUuaXNBbmltYXRpbmcoKSkge1xuICAgICAgICB0aGlzLl9hbmltYXRlLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFN0eWxlcyh0aGlzLl9lbGVtZW50LCB0YXJnZXRTdHlsZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBNb3ZlIHBsYWNlaG9sZGVyIGluc2lkZSBjb3JyZWN0IGNvbnRhaW5lciBhZnRlciBtaWdyYXRpb24uXG4gICAgICBpZiAodGhpcy5fZGlkTWlncmF0ZSkge1xuICAgICAgICBncmlkLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgdGhpcy5fZGlkTWlncmF0ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgdGhlIHBsYWNlaG9sZGVyJ3MgbGF5b3V0IGFuaW1hdGlvbiBpbiB0aGUgbmV4dCB0aWNrLiBXZSBkbyB0aGlzIHRvXG4gICAgLy8gYXZvaWQgbGF5b3V0IHRocmFzaGluZy5cbiAgICB0aGlzLl9uZXh0TGVmdCA9IG5leHRMZWZ0O1xuICAgIHRoaXMuX25leHRUb3AgPSBuZXh0VG9wO1xuICAgIGFkZFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCwgdGhpcy5fc2V0dXBBbmltYXRpb24sIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJlcGFyZSBwbGFjZWhvbGRlciBmb3IgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fc2V0dXBBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZSh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9jdXJyZW50TGVmdCA9IHRyYW5zbGF0ZS54O1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSB0cmFuc2xhdGUueTtcbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG4gICAgdmFyIGN1cnJlbnRMZWZ0ID0gdGhpcy5fY3VycmVudExlZnQ7XG4gICAgdmFyIGN1cnJlbnRUb3AgPSB0aGlzLl9jdXJyZW50VG9wO1xuICAgIHZhciBuZXh0TGVmdCA9IHRoaXMuX25leHRMZWZ0O1xuICAgIHZhciBuZXh0VG9wID0gdGhpcy5fbmV4dFRvcDtcbiAgICB2YXIgdGFyZ2V0U3R5bGVzID0geyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhuZXh0TGVmdCwgbmV4dFRvcCkgfTtcblxuICAgIC8vIElmIHBsYWNlaG9sZGVyIGlzIGFscmVhZHkgaW4gY29ycmVjdCBwb3NpdGlvbiBsZXQncyBqdXN0IHN0b3AgYW5pbWF0aW9uXG4gICAgLy8gYW5kIGJlIGRvbmUgd2l0aCBpdC5cbiAgICBpZiAoY3VycmVudExlZnQgPT09IG5leHRMZWZ0ICYmIGN1cnJlbnRUb3AgPT09IG5leHRUb3ApIHtcbiAgICAgIGlmIChhbmltYXRpb24uaXNBbmltYXRpbmcoKSkgYW5pbWF0aW9uLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgbGV0J3Mgc3RhcnQgdGhlIGFuaW1hdGlvbi5cbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9pdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1BsYWNlaG9sZGVyO1xuICAgIHZhciBjdXJyZW50U3R5bGVzID0geyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfTtcbiAgICBhbmltYXRpb24uc3RhcnQoY3VycmVudFN0eWxlcywgdGFyZ2V0U3R5bGVzLCB7XG4gICAgICBkdXJhdGlvbjogc2V0dGluZ3MuZHVyYXRpb24sXG4gICAgICBlYXNpbmc6IHNldHRpbmdzLmVhc2luZyxcbiAgICAgIG9uRmluaXNoOiB0aGlzLl9vbkxheW91dEVuZFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXlvdXQgZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuX29uTGF5b3V0RW5kID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgZW5kIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBkcmFnUmVsZWFzZUVuZCBldmVudCBpc1xuICAgKiBlbWl0dGVkIGFuZCByZWNlaXZlcyB0aGUgZXZlbnQgZGF0YSBhcyBpdCdzIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25SZWxlYXNlRW5kID0gZnVuY3Rpb24oaXRlbSkge1xuICAgIGlmIChpdGVtLl9pZCA9PT0gdGhpcy5faXRlbS5faWQpIHtcbiAgICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpcyBub3QgYW5pbWF0aW5nIGFueW1vcmUgd2UgY2FuIHNhZmVseSByZXNldCBpdC5cbiAgICAgIGlmICghdGhpcy5fYW5pbWF0ZS5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcGxhY2Vob2xkZXIgaXRlbSBpcyBzdGlsbCBhbmltYXRpbmcgaGVyZSwgbGV0J3Mgd2FpdCBmb3IgaXQgdG9cbiAgICAgIC8vIGZpbmlzaCBpdCdzIGFuaW1hdGlvbi5cbiAgICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogTWlncmF0aW9uIHN0YXJ0IGhhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBiZWZvcmVTZW5kIGV2ZW50IGlzXG4gICAqIGVtaXR0ZWQgYW5kIHJlY2VpdmVzIHRoZSBldmVudCBkYXRhIGFzIGl0J3MgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAcGFyYW0ge0l0ZW19IGRhdGEuaXRlbVxuICAgKiBAcGFyYW0ge0dyaWR9IGRhdGEuZnJvbUdyaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRhdGEuZnJvbUluZGV4XG4gICAqIEBwYXJhbSB7R3JpZH0gZGF0YS50b0dyaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRhdGEudG9JbmRleFxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuX29uTWlncmF0ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIG1hdGNoaW5nIGl0ZW0uXG4gICAgaWYgKGRhdGEuaXRlbSAhPT0gdGhpcy5faXRlbSkgcmV0dXJuO1xuXG4gICAgdmFyIGdyaWQgPSB0aGlzLl9pdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgbmV4dEdyaWQgPSBkYXRhLnRvR3JpZDtcblxuICAgIC8vIFVuYmluZCBsaXN0ZW5lcnMgZnJvbSBjdXJyZW50IGdyaWQuXG4gICAgZ3JpZC5vZmYoZXZlbnREcmFnUmVsZWFzZUVuZCwgdGhpcy5fb25SZWxlYXNlRW5kKTtcbiAgICBncmlkLm9mZihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBncmlkLm9mZihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBCaW5kIGxpc3RlbmVycyB0byB0aGUgbmV4dCBncmlkLlxuICAgIG5leHRHcmlkLm9uKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgbmV4dEdyaWQub24oZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgbmV4dEdyaWQub24oZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gTWFyayB0aGUgaXRlbSBhcyBtaWdyYXRlZC5cbiAgICB0aGlzLl9kaWRNaWdyYXRlID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ3JlYXRlIHBsYWNlaG9sZGVyLiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgb25seSB3cml0ZXMgdG8gRE9NIGFuZCBkb2VzIG5vdFxuICAgKiByZWFkIGFueXRoaW5nIGZyb20gRE9NIHNvIGl0IHNob3VsZCBub3QgY2F1c2UgYW55IGFkZGl0aW9uYWwgbGF5b3V0XG4gICAqIHRocmFzaGluZyB3aGVuIGl0J3MgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRyYWcgc3RhcnQgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHBsYWNlaG9sZGVyIHNldCB1cCB3ZSBjYW4gc2tpcCB0aGUgaW5pdGlhdGlvbiBsb2dpYy5cbiAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG5cbiAgICAvLyBDcmVhdGUgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICB2YXIgZWxlbWVudDtcbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQgPSBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBVcGRhdGUgZWxlbWVudCB0byBhbmltYXRpb24gaW5zdGFuY2UuXG4gICAgYW5pbWF0aW9uLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIEFkZCBwbGFjZWhvbGRlciBjbGFzcyB0byB0aGUgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICB0aGlzLl9jbGFzc05hbWUgPSBzZXR0aW5ncy5pdGVtUGxhY2Vob2xkZXJDbGFzcyB8fCAnJztcbiAgICBpZiAodGhpcy5fY2xhc3NOYW1lKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCB0aGlzLl9jbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8vIFBvc2l0aW9uIHRoZSBwbGFjZWhvbGRlciBpdGVtIGNvcnJlY3RseS5cbiAgICB2YXIgbGVmdCA9IGl0ZW0uX2xlZnQgKyBpdGVtLl9tYXJnaW5MZWZ0O1xuICAgIHZhciB0b3AgPSBpdGVtLl90b3AgKyBpdGVtLl9tYXJnaW5Ub3A7XG4gICAgc2V0U3R5bGVzKGVsZW1lbnQsIHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgd2lkdGg6IGl0ZW0uX3dpZHRoICsgJ3B4JyxcbiAgICAgIGhlaWdodDogaXRlbS5faGVpZ2h0ICsgJ3B4JyxcbiAgICAgIHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKGxlZnQsIHRvcClcbiAgICB9KTtcblxuICAgIC8vIEJpbmQgZXZlbnQgbGlzdGVuZXJzLlxuICAgIGdyaWQub24oZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgZ3JpZC5vbihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub24oZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gb25DcmVhdGUgaG9vay5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGUpKSB7XG4gICAgICBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGUoaXRlbSwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IHRoZSBwbGFjZWhvbGRlciBlbGVtZW50IHRvIHRoZSBncmlkLlxuICAgIGdyaWQuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCBwbGFjZWhvbGRlciBkYXRhLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLl9hbmltYXRlO1xuXG4gICAgLy8gUmVzZXQgZmxhZy5cbiAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG5cbiAgICAvLyBDYW5jZWwgcG90ZW50aWFsIChxdWV1ZWQpIGxheW91dCB0aWNrLlxuICAgIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBSZXNldCBhbmltYXRpb24gaW5zdGFuY2UuXG4gICAgYW5pbWF0aW9uLnN0b3AoKTtcbiAgICBhbmltYXRpb24uX2VsZW1lbnQgPSBudWxsO1xuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGxpc3RlbmVycy5cbiAgICBncmlkLm9mZihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub2ZmKGV2ZW50TGF5b3V0U3RhcnQsIHRoaXMuX29uTGF5b3V0U3RhcnQpO1xuICAgIGdyaWQub2ZmKGV2ZW50QmVmb3JlU2VuZCwgdGhpcy5fb25NaWdyYXRlKTtcblxuICAgIC8vIFJlbW92ZSBwbGFjZWhvbGRlciBjbGFzcyBmcm9tIHRoZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIGlmICh0aGlzLl9jbGFzc05hbWUpIHtcbiAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHRoaXMuX2NsYXNzTmFtZSk7XG4gICAgICB0aGlzLl9jbGFzc05hbWUgPSAnJztcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZWxlbWVudC5cbiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBvblJlbW92ZSBob29rLiBOb3RlIHRoYXQgaGVyZSB3ZSB1c2UgdGhlIGN1cnJlbnQgZ3JpZCdzIG9uUmVtb3ZlIGNhbGxiYWNrXG4gICAgLy8gc28gaWYgdGhlIGl0ZW0gaGFzIG1pZ3JhdGVkIGR1cmluZyBkcmFnIHRoZSBvblJlbW92ZSBtZXRob2Qgd2lsbCBub3QgYmVcbiAgICAvLyB0aGUgb3JpZ2luYXRpbmcgZ3JpZCdzIG1ldGhvZC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmUpKSB7XG4gICAgICBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmUoaXRlbSwgZWxlbWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgcGxhY2Vob2xkZXIncyBkaW1lbnNpb25zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtoZWlnaHR9IGhlaWdodFxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUudXBkYXRlRGltZW5zaW9ucyA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICBzZXRTdHlsZXModGhpcy5fZWxlbWVudCwge1xuICAgICAgICB3aWR0aDogd2lkdGggKyAncHgnLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCArICdweCdcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGxhY2Vob2xkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAodmlzaWJsZSkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9lbGVtZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IHBsYWNlaG9sZGVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLl9hbmltYXRlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pdGVtID0gdGhpcy5fYW5pbWF0ZSA9IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFF1ZXVlIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICovXG4gIGZ1bmN0aW9uIFF1ZXVlKCkge1xuICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBZGQgY2FsbGJhY2sgdG8gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9xdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJvY2VzcyBxdWV1ZSBjYWxsYmFja3MgYW5kIHJlc2V0IHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUXVldWUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Kn0gYXJnMVxuICAgKiBAcGFyYW0geyp9IGFyZzJcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oYXJnMSwgYXJnMikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgbGVuZ3RoID0gcXVldWUubGVuZ3RoO1xuICAgIHZhciBpO1xuXG4gICAgLy8gUXVpdCBlYXJseSBpZiB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgaWYgKCFsZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHNpbmdsZUNhbGxiYWNrID0gbGVuZ3RoID09PSAxO1xuICAgIHZhciBzbmFwc2hvdCA9IHNpbmdsZUNhbGxiYWNrID8gcXVldWVbMF0gOiBxdWV1ZS5zbGljZSgwKTtcblxuICAgIC8vIFJlc2V0IHF1ZXVlLlxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBJZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgY2FsbGJhY2sgbGV0J3MganVzdCBjYWxsIGl0LlxuICAgIGlmIChzaW5nbGVDYWxsYmFjaykge1xuICAgICAgc25hcHNob3QoYXJnMSwgYXJnMik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG11bHRpcGxlIGNhbGxiYWNrcywgbGV0J3MgcHJvY2VzcyB0aGVtLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgc25hcHNob3RbaV0oYXJnMSwgYXJnMik7XG4gICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IFF1ZXVlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogTGF5b3V0IG1hbmFnZXIgZm9yIEl0ZW0gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1MYXlvdXQoaXRlbSkge1xuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0ludGVycnVwdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY3VycmVudFN0eWxlcyA9IHt9O1xuICAgIHRoaXMuX3RhcmdldFN0eWxlcyA9IHt9O1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gMDtcbiAgICB0aGlzLl9jdXJyZW50VG9wID0gMDtcbiAgICB0aGlzLl9vZmZzZXRMZWZ0ID0gMDtcbiAgICB0aGlzLl9vZmZzZXRUb3AgPSAwO1xuICAgIHRoaXMuX3NraXBOZXh0QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fYW5pbWF0ZU9wdGlvbnMgPSB7XG4gICAgICBvbkZpbmlzaDogdGhpcy5fZmluaXNoLmJpbmQodGhpcylcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlID0gbmV3IFF1ZXVlKCk7XG5cbiAgICAvLyBCaW5kIGFuaW1hdGlvbiBoYW5kbGVycyBhbmQgZmluaXNoIG1ldGhvZC5cbiAgICB0aGlzLl9zZXR1cEFuaW1hdGlvbiA9IHRoaXMuX3NldHVwQW5pbWF0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24gPSB0aGlzLl9zdGFydEFuaW1hdGlvbi5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGl0ZW0gbGF5b3V0IGJhc2VkIG9uIGl0J3MgY3VycmVudCBkYXRhLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIGdyaWRTZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgaXNQb3NpdGlvbmluZyA9IHRoaXMuX2lzQWN0aXZlO1xuICAgIHZhciBpc0p1c3RSZWxlYXNlZCA9IHJlbGVhc2UuX2lzQWN0aXZlICYmIHJlbGVhc2UuX2lzUG9zaXRpb25pbmdTdGFydGVkID09PSBmYWxzZTtcbiAgICB2YXIgYW5pbUR1cmF0aW9uID0gaXNKdXN0UmVsZWFzZWRcbiAgICAgID8gZ3JpZFNldHRpbmdzLmRyYWdSZWxlYXNlRHVyYXRpb25cbiAgICAgIDogZ3JpZFNldHRpbmdzLmxheW91dER1cmF0aW9uO1xuICAgIHZhciBhbmltRWFzaW5nID0gaXNKdXN0UmVsZWFzZWQgPyBncmlkU2V0dGluZ3MuZHJhZ1JlbGVhc2VFYXNpbmcgOiBncmlkU2V0dGluZ3MubGF5b3V0RWFzaW5nO1xuICAgIHZhciBhbmltRW5hYmxlZCA9ICFpbnN0YW50ICYmICF0aGlzLl9za2lwTmV4dEFuaW1hdGlvbiAmJiBhbmltRHVyYXRpb24gPiAwO1xuICAgIHZhciBpc0FuaW1hdGluZztcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBwb3NpdGlvbmluZyBwcm9jZXNzIGN1cnJlbnQgbGF5b3V0IGNhbGxiYWNrXG4gICAgLy8gcXVldWUgd2l0aCBpbnRlcnJ1cHRlZCBmbGFnIG9uLlxuICAgIGlmIChpc1Bvc2l0aW9uaW5nKSB0aGlzLl9xdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKTtcblxuICAgIC8vIE1hcmsgcmVsZWFzZSBwb3NpdGlvbmluZyBhcyBzdGFydGVkLlxuICAgIGlmIChpc0p1c3RSZWxlYXNlZCkgcmVsZWFzZS5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgLy8gUHVzaCB0aGUgY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGlmIChpc0Z1bmN0aW9uKG9uRmluaXNoKSkgdGhpcy5fcXVldWUuYWRkKG9uRmluaXNoKTtcblxuICAgIC8vIElmIG5vIGFuaW1hdGlvbnMgYXJlIG5lZWRlZCwgZWFzeSBwZWFzeSFcbiAgICBpZiAoIWFuaW1FbmFibGVkKSB7XG4gICAgICB0aGlzLl91cGRhdGVPZmZzZXRzKCk7XG4gICAgICB0aGlzLl91cGRhdGVUYXJnZXRTdHlsZXMoKTtcbiAgICAgIGlzQW5pbWF0aW5nID0gaXRlbS5fYW5pbWF0ZS5pc0FuaW1hdGluZygpO1xuICAgICAgdGhpcy5zdG9wKGZhbHNlLCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgIWlzQW5pbWF0aW5nICYmIHNldFN0eWxlcyhlbGVtZW50LCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgdGhpcy5fc2tpcE5leHRBbmltYXRpb24gPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzLl9maW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgaXRlbSBhY3RpdmUgYW5kIHN0b3JlIHNvbWUgZGF0YSBmb3IgdGhlIGFuaW1hdGlvbiB0aGF0IGlzIGFib3V0IHRvIGJlXG4gICAgLy8gdHJpZ2dlcmVkLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLl9hbmltYXRlT3B0aW9ucy5lYXNpbmcgPSBhbmltRWFzaW5nO1xuICAgIHRoaXMuX2FuaW1hdGVPcHRpb25zLmR1cmF0aW9uID0gYW5pbUR1cmF0aW9uO1xuICAgIHRoaXMuX2lzSW50ZXJydXB0ZWQgPSBpc1Bvc2l0aW9uaW5nO1xuXG4gICAgLy8gU3RhcnQgdGhlIGl0ZW0ncyBsYXlvdXQgYW5pbWF0aW9uIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkTGF5b3V0VGljayhpdGVtLl9pZCwgdGhpcy5fc2V0dXBBbmltYXRpb24sIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9wIGl0ZW0ncyBwb3NpdGlvbiBhbmltYXRpb24gaWYgaXQgaXMgY3VycmVudGx5IGFuaW1hdGluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcHJvY2Vzc0NhbGxiYWNrUXVldWU9ZmFsc2VdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0U3R5bGVzXVxuICAgKiBAcmV0dXJucyB7SXRlbUxheW91dH1cbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihwcm9jZXNzQ2FsbGJhY2tRdWV1ZSwgdGFyZ2V0U3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBDYW5jZWwgYW5pbWF0aW9uIGluaXQuXG4gICAgY2FuY2VsTGF5b3V0VGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBTdG9wIGFuaW1hdGlvbi5cbiAgICBpdGVtLl9hbmltYXRlLnN0b3AodGFyZ2V0U3R5bGVzKTtcblxuICAgIC8vIFJlbW92ZSBwb3NpdGlvbmluZyBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhpdGVtLl9lbGVtZW50LCBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuaXRlbVBvc2l0aW9uaW5nQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgYWN0aXZlIHN0YXRlLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG5cbiAgICAvLyBQcm9jZXNzIGNhbGxiYWNrIHF1ZXVlIGlmIG5lZWRlZC5cbiAgICBpZiAocHJvY2Vzc0NhbGxiYWNrUXVldWUpIHRoaXMuX3F1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5zdG9wKHRydWUsIHt9KTtcbiAgICB0aGlzLl9xdWV1ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5faXRlbSA9IHRoaXMuX2N1cnJlbnRTdHlsZXMgPSB0aGlzLl90YXJnZXRTdHlsZXMgPSB0aGlzLl9hbmltYXRlT3B0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIGl0ZW0ncyBjdXJyZW50IGxheW91dCBvZmZzZXQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fdXBkYXRlT2Zmc2V0cyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBtaWdyYXRlID0gaXRlbS5fbWlncmF0ZTtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG5cbiAgICB0aGlzLl9vZmZzZXRMZWZ0ID0gcmVsZWFzZS5faXNBY3RpdmVcbiAgICAgID8gcmVsZWFzZS5fY29udGFpbmVyRGlmZlhcbiAgICAgIDogbWlncmF0ZS5faXNBY3RpdmVcbiAgICAgID8gbWlncmF0ZS5fY29udGFpbmVyRGlmZlhcbiAgICAgIDogMDtcblxuICAgIHRoaXMuX29mZnNldFRvcCA9IHJlbGVhc2UuX2lzQWN0aXZlXG4gICAgICA/IHJlbGVhc2UuX2NvbnRhaW5lckRpZmZZXG4gICAgICA6IG1pZ3JhdGUuX2lzQWN0aXZlXG4gICAgICA/IG1pZ3JhdGUuX2NvbnRhaW5lckRpZmZZXG4gICAgICA6IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIGl0ZW0ncyBsYXlvdXQgdGFyZ2V0IHN0eWxlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fdXBkYXRlVGFyZ2V0U3R5bGVzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5fdGFyZ2V0U3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgIHRoaXMuX2l0ZW0uX2xlZnQgKyB0aGlzLl9vZmZzZXRMZWZ0LFxuICAgICAgdGhpcy5faXRlbS5fdG9wICsgdGhpcy5fb2Zmc2V0VG9wXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIGl0ZW0gbGF5b3V0IHByb2NlZHVyZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIC8vIE1hcmsgdGhlIGl0ZW0gYXMgaW5hY3RpdmUgYW5kIHJlbW92ZSBwb3NpdGlvbmluZyBjbGFzc2VzLlxuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gRmluaXNoIHVwIHJlbGVhc2UgYW5kIG1pZ3JhdGlvbi5cbiAgICBpZiAocmVsZWFzZS5faXNBY3RpdmUpIHJlbGVhc2Uuc3RvcCgpO1xuICAgIGlmIChtaWdyYXRlLl9pc0FjdGl2ZSkgbWlncmF0ZS5zdG9wKCk7XG5cbiAgICAvLyBQcm9jZXNzIHRoZSBjYWxsYmFjayBxdWV1ZS5cbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgaXRlbSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgaXRlbSBmb3IgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fc2V0dXBBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKHRoaXMuX2l0ZW0uX2VsZW1lbnQpO1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IHRyYW5zbGF0ZS55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9zdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgc2V0dGluZ3MgPSBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3M7XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgdGhlIG9mZnNldCBkYXRhIGFuZCB0YXJnZXQgc3R5bGVzLlxuICAgIHRoaXMuX3VwZGF0ZU9mZnNldHMoKTtcbiAgICB0aGlzLl91cGRhdGVUYXJnZXRTdHlsZXMoKTtcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGFscmVhZHkgaW4gY29ycmVjdCBwb3NpdGlvbiBsZXQncyBxdWl0IGVhcmx5LlxuICAgIGlmIChcbiAgICAgIGl0ZW0uX2xlZnQgPT09IHRoaXMuX2N1cnJlbnRMZWZ0IC0gdGhpcy5fb2Zmc2V0TGVmdCAmJlxuICAgICAgaXRlbS5fdG9wID09PSB0aGlzLl9jdXJyZW50VG9wIC0gdGhpcy5fb2Zmc2V0VG9wXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5faXNJbnRlcnJ1cHRlZCkgdGhpcy5zdG9wKGZhbHNlLCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldCBpdGVtJ3MgcG9zaXRpb25pbmcgY2xhc3MgaWYgbmVlZGVkLlxuICAgIGlmICghdGhpcy5faXNJbnRlcnJ1cHRlZCkge1xuICAgICAgYWRkQ2xhc3MoaXRlbS5fZWxlbWVudCwgc2V0dGluZ3MuaXRlbVBvc2l0aW9uaW5nQ2xhc3MpO1xuICAgIH1cblxuICAgIC8vIEdldCBjdXJyZW50IHN0eWxlcyBmb3IgYW5pbWF0aW9uLlxuICAgIHRoaXMuX2N1cnJlbnRTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2N1cnJlbnRMZWZ0LCB0aGlzLl9jdXJyZW50VG9wKTtcblxuICAgIC8vIEFuaW1hdGUuXG4gICAgaXRlbS5fYW5pbWF0ZS5zdGFydCh0aGlzLl9jdXJyZW50U3R5bGVzLCB0aGlzLl90YXJnZXRTdHlsZXMsIHRoaXMuX2FuaW1hdGVPcHRpb25zKTtcbiAgfTtcblxuICB2YXIgdGVtcFN0eWxlcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgbWlncmF0ZSBwcm9jZXNzIGhhbmRsZXIgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1NaWdyYXRlKGl0ZW0pIHtcbiAgICAvLyBQcml2YXRlIHByb3BzLlxuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXIgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBtaWdyYXRlIHByb2Nlc3Mgb2YgYW4gaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZH0gdGFyZ2V0R3JpZFxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtjb250YWluZXJdXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKHRhcmdldEdyaWQsIHBvc2l0aW9uLCBjb250YWluZXIpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgaXNWaXNpYmxlID0gaXRlbS5pc1Zpc2libGUoKTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRTZXR0aW5ncyA9IHRhcmdldEdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0R3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0YXJnZXRHcmlkLl9pdGVtcztcbiAgICB2YXIgY3VycmVudEluZGV4ID0gZ3JpZC5faXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gY29udGFpbmVyIHx8IHdpbmRvdy5kb2N1bWVudC5ib2R5O1xuICAgIHZhciB0YXJnZXRJbmRleDtcbiAgICB2YXIgdGFyZ2V0SXRlbTtcbiAgICB2YXIgY3VycmVudENvbnRhaW5lcjtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcbiAgICB2YXIgY29udGFpbmVyRGlmZjtcbiAgICB2YXIgdHJhbnNsYXRlO1xuICAgIHZhciB0cmFuc2xhdGVYO1xuICAgIHZhciB0cmFuc2xhdGVZO1xuXG4gICAgLy8gR2V0IHRhcmdldCBpbmRleC5cbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgdGFyZ2V0SW5kZXggPSBub3JtYWxpemVBcnJheUluZGV4KHRhcmdldEl0ZW1zLCBwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEl0ZW0gPSB0YXJnZXRHcmlkLl9nZXRJdGVtKHBvc2l0aW9uKTtcbiAgICAgIC8qKiBAdG9kbyBDb25zaWRlciB0aHJvd2luZyBhbiBlcnJvciBoZXJlIGluc3RlYWQgb2Ygc2lsZW50bHkgZmFpbGluZy4gKi9cbiAgICAgIGlmICghdGFyZ2V0SXRlbSkgcmV0dXJuIHRoaXM7XG4gICAgICB0YXJnZXRJbmRleCA9IHRhcmdldEl0ZW1zLmluZGV4T2YodGFyZ2V0SXRlbSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZXMgaWYgbmVlZGVkLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSB8fCB0aGlzLl9pc0FjdGl2ZSB8fCBpdGVtLmlzUmVsZWFzaW5nKCkpIHtcbiAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgIHRyYW5zbGF0ZVggPSB0cmFuc2xhdGUueDtcbiAgICAgIHRyYW5zbGF0ZVkgPSB0cmFuc2xhdGUueTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IHBvc2l0aW9uaW5nLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSkge1xuICAgICAgaXRlbS5fbGF5b3V0LnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IG1pZ3JhdGlvbi5cbiAgICBpZiAodGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHRyYW5zbGF0ZVggLT0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgICB0cmFuc2xhdGVZIC09IHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgdGhpcy5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcodHJhbnNsYXRlWCwgdHJhbnNsYXRlWSkgfSk7XG4gICAgfVxuXG4gICAgLy8gQWJvcnQgY3VycmVudCByZWxlYXNlLlxuICAgIGlmIChpdGVtLmlzUmVsZWFzaW5nKCkpIHtcbiAgICAgIHRyYW5zbGF0ZVggLT0gaXRlbS5fcmVsZWFzZS5fY29udGFpbmVyRGlmZlg7XG4gICAgICB0cmFuc2xhdGVZIC09IGl0ZW0uX3JlbGVhc2UuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgaXRlbS5fcmVsZWFzZS5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcodHJhbnNsYXRlWCwgdHJhbnNsYXRlWSkgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IHZpc2liaWxpdHkgYW5pbWF0aW9ucy5cbiAgICBpdGVtLl92aXNpYmlsaXR5Ll9zdG9wQW5pbWF0aW9uKCk7XG5cbiAgICAvLyBEZXN0cm95IGN1cnJlbnQgZHJhZy5cbiAgICBpZiAoaXRlbS5fZHJhZykgaXRlbS5fZHJhZy5kZXN0cm95KCk7XG5cbiAgICAvLyBQcm9jZXNzIGN1cnJlbnQgdmlzaWJpbGl0eSBhbmltYXRpb24gcXVldWUuXG4gICAgaXRlbS5fdmlzaWJpbGl0eS5fcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG5cbiAgICAvLyBFbWl0IGJlZm9yZVNlbmQgZXZlbnQuXG4gICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVNlbmQpKSB7XG4gICAgICBncmlkLl9lbWl0KGV2ZW50QmVmb3JlU2VuZCwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgYmVmb3JlUmVjZWl2ZSBldmVudC5cbiAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50QmVmb3JlUmVjZWl2ZSkpIHtcbiAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRCZWZvcmVSZWNlaXZlLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGN1cnJlbnQgY2xhc3NuYW1lcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBBZGQgbmV3IGNsYXNzbmFtZXMuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgdGFyZ2V0U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc1Zpc2libGUgPyB0YXJnZXRTZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzIDogdGFyZ2V0U2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIE1vdmUgaXRlbSBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgZ3JpZCB0byB0YXJnZXQgZ3JpZC5cbiAgICBncmlkLl9pdGVtcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICBhcnJheUluc2VydCh0YXJnZXRJdGVtcywgaXRlbSwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBncmlkIGlkIHJlZmVyZW5jZS5cbiAgICBpdGVtLl9ncmlkSWQgPSB0YXJnZXRHcmlkLl9pZDtcblxuICAgIC8vIEdldCBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBjdXJyZW50Q29udGFpbmVyID0gZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgLy8gTW92ZSB0aGUgaXRlbSBpbnNpZGUgdGhlIHRhcmdldCBjb250YWluZXIgaWYgaXQncyBkaWZmZXJlbnQgdGhhbiB0aGVcbiAgICAvLyBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICB0YXJnZXRDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIGN1cnJlbnRDb250YWluZXIsIHRydWUpO1xuICAgICAgaWYgKCF0cmFuc2xhdGUpIHtcbiAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICB0cmFuc2xhdGVYID0gdHJhbnNsYXRlLng7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSB0cmFuc2xhdGUueTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcoXG4gICAgICAgIHRyYW5zbGF0ZVggKyBvZmZzZXREaWZmLmxlZnQsXG4gICAgICAgIHRyYW5zbGF0ZVkgKyBvZmZzZXREaWZmLnRvcFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY2hpbGQgZWxlbWVudCdzIHN0eWxlcyB0byByZWZsZWN0IHRoZSBjdXJyZW50IHZpc2liaWxpdHkgc3RhdGUuXG4gICAgaXRlbS5fY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgaXNWaXNpYmxlID8gdGFyZ2V0U2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHRhcmdldFNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG5cbiAgICAvLyBVcGRhdGUgZGlzcGxheSBzdHlsZS5cbiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBpc1Zpc2libGUgPyAnYmxvY2snIDogJ2hpZGRlbic7XG5cbiAgICAvLyBHZXQgb2Zmc2V0IGRpZmYgZm9yIHRoZSBtaWdyYXRpb24gZGF0YS5cbiAgICBjb250YWluZXJEaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIHRhcmdldEVsZW1lbnQsIHRydWUpO1xuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBjYWNoZWQgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIGl0ZW0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgaXRlbS5fcmVmcmVzaFNvcnREYXRhKCk7XG5cbiAgICAvLyBDcmVhdGUgbmV3IGRyYWcgaGFuZGxlci5cbiAgICBpdGVtLl9kcmFnID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0VuYWJsZWQgPyBuZXcgSXRlbURyYWcoaXRlbSkgOiBudWxsO1xuXG4gICAgLy8gU2V0dXAgbWlncmF0aW9uIGRhdGEuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IHRhcmdldENvbnRhaW5lcjtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IGNvbnRhaW5lckRpZmYubGVmdDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IGNvbnRhaW5lckRpZmYudG9wO1xuXG4gICAgLy8gRW1pdCBzZW5kIGV2ZW50LlxuICAgIGlmIChncmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRTZW5kKSkge1xuICAgICAgZ3JpZC5fZW1pdChldmVudFNlbmQsIHtcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgZnJvbUdyaWQ6IGdyaWQsXG4gICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHJlY2VpdmUgZXZlbnQuXG4gICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFJlY2VpdmUpKSB7XG4gICAgICB0YXJnZXRHcmlkLl9lbWl0KGV2ZW50UmVjZWl2ZSwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmQgdGhlIG1pZ3JhdGUgcHJvY2VzcyBvZiBhbiBpdGVtLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhYm9ydCBhblxuICAgKiBvbmdvaW5nIG1pZ3JhdGUgcHJvY2VzcyAoYW5pbWF0aW9uKSBvciBmaW5pc2ggdGhlIG1pZ3JhdGUgcHJvY2Vzcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2Fib3J0PWZhbHNlXVxuICAgKiAgLSBTaG91bGQgdGhlIG1pZ3JhdGlvbiBiZSBhYm9ydGVkP1xuICAgKiBAcGFyYW0ge09iamVjdH0gW2N1cnJlbnRTdHlsZXNdXG4gICAqICAtIE9wdGlvbmFsIGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSBzdHlsZXMuXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oYWJvcnQsIGN1cnJlbnRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgZ3JpZEVsZW1lbnQgPSBncmlkLl9lbGVtZW50O1xuICAgIHZhciB0cmFuc2xhdGU7XG5cbiAgICBpZiAodGhpcy5fY29udGFpbmVyICE9PSBncmlkRWxlbWVudCkge1xuICAgICAgaWYgKCFjdXJyZW50U3R5bGVzKSB7XG4gICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgICAgICB0ZW1wU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgICAgIHRyYW5zbGF0ZS54IC0gdGhpcy5fY29udGFpbmVyRGlmZlgsXG4gICAgICAgICAgICB0cmFuc2xhdGUueSAtIHRoaXMuX2NvbnRhaW5lckRpZmZZXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhpdGVtLl9sZWZ0LCBpdGVtLl90b3ApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSB0ZW1wU3R5bGVzO1xuICAgICAgfVxuICAgICAgZ3JpZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgY3VycmVudFN0eWxlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXIgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSk7XG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciB0ZW1wU3R5bGVzJDEgPSB7fTtcblxuICAvKipcbiAgICogVGhlIHJlbGVhc2UgcHJvY2VzcyBoYW5kbGVyIGNvbnN0cnVjdG9yLiBBbHRob3VnaCB0aGlzIG1pZ2h0IHNlZW0gYXMgcHJvcGVyXG4gICAqIGZpdCBmb3IgdGhlIGRyYWcgcHJvY2VzcyB0aGlzIG5lZWRzIHRvIGJlIHNlcGFyYXRlZCBpbnRvIGl0J3Mgb3duIGxvZ2ljXG4gICAqIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgYSBzY2VuYXJpbyB3aGVyZSBkcmFnIGlzIGRpc2FibGVkLCBidXQgdGhlIHJlbGVhc2VcbiAgICogcHJvY2VzcyBzdGlsbCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCAoZHJhZ2dpbmcgZnJvbSBhIGdyaWQgdG8gYW5vdGhlcikuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1SZWxlYXNlKGl0ZW0pIHtcbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSByZWxlYXNlIHByb2Nlc3Mgb2YgYW4gaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcblxuICAgIC8vIEZsYWcgcmVsZWFzZSBhcyBhY3RpdmUuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuXG4gICAgLy8gQWRkIHJlbGVhc2UgY2xhc3MgbmFtZSB0byB0aGUgcmVsZWFzZWQgZWxlbWVudC5cbiAgICBhZGRDbGFzcyhpdGVtLl9lbGVtZW50LCBncmlkLl9zZXR0aW5ncy5pdGVtUmVsZWFzaW5nQ2xhc3MpO1xuXG4gICAgLy8gRW1pdCBkcmFnUmVsZWFzZVN0YXJ0IGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnUmVsZWFzZVN0YXJ0LCBpdGVtKTtcblxuICAgIC8vIFBvc2l0aW9uIHRoZSByZWxlYXNlZCBpdGVtLlxuICAgIGl0ZW0uX2xheW91dC5zdGFydChmYWxzZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRW5kIHRoZSByZWxlYXNlIHByb2Nlc3Mgb2YgYW4gaXRlbS4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gYWJvcnQgYW5cbiAgICogb25nb2luZyByZWxlYXNlIHByb2Nlc3MgKGFuaW1hdGlvbikgb3IgZmluaXNoIHRoZSByZWxlYXNlIHByb2Nlc3MuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFthYm9ydD1mYWxzZV1cbiAgICogIC0gU2hvdWxkIHRoZSByZWxlYXNlIGJlIGFib3J0ZWQ/IFdoZW4gdHJ1ZSwgdGhlIHJlbGVhc2UgZW5kIGV2ZW50IHdvbid0IGJlXG4gICAqICAgIGVtaXR0ZWQuIFNldCB0byB0cnVlIG9ubHkgd2hlbiB5b3UgbmVlZCB0byBhYm9ydCB0aGUgcmVsZWFzZSBwcm9jZXNzXG4gICAqICAgIHdoaWxlIHRoZSBpdGVtIGlzIGFuaW1hdGluZyB0byBpdCdzIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2N1cnJlbnRTdHlsZXNdXG4gICAqICAtIE9wdGlvbmFsIGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSBzdHlsZXMuXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oYWJvcnQsIGN1cnJlbnRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgY29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdHJhbnNsYXRlO1xuXG4gICAgLy8gUmVzZXQgZGF0YSBhbmQgcmVtb3ZlIHJlbGVhc2luZyBjbGFzcyBuYW1lIGZyb20gdGhlIGVsZW1lbnQuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIC8vIElmIHRoZSByZWxlYXNlZCBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGdyaWQncyBjb250YWluZXIgZWxlbWVudCBwdXQgaXRcbiAgICAvLyBiYWNrIHRoZXJlIGFuZCBhZGp1c3QgcG9zaXRpb24gYWNjb3JkaW5nbHkuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICBpZiAoIWN1cnJlbnRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGFib3J0KSB7XG4gICAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICAgIHRlbXBTdHlsZXMkMS50cmFuc2Zvcm0gPSBnZXRUcmFuc2xhdGVTdHJpbmcoXG4gICAgICAgICAgICB0cmFuc2xhdGUueCAtIHRoaXMuX2NvbnRhaW5lckRpZmZYLFxuICAgICAgICAgICAgdHJhbnNsYXRlLnkgLSB0aGlzLl9jb250YWluZXJEaWZmWVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVtcFN0eWxlcyQxLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhpdGVtLl9sZWZ0LCBpdGVtLl90b3ApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSB0ZW1wU3R5bGVzJDE7XG4gICAgICB9XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgY3VycmVudFN0eWxlcyk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBkcmFnUmVsZWFzZUVuZCBldmVudC5cbiAgICBpZiAoIWFib3J0KSBncmlkLl9lbWl0KGV2ZW50RHJhZ1JlbGVhc2VFbmQsIGl0ZW0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbVJlbGVhc2V9XG4gICAqL1xuICBJdGVtUmVsZWFzZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5zdG9wKHRydWUpO1xuICAgIHRoaXMuX2l0ZW0gPSBudWxsO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXNldCBwdWJsaWMgZGF0YSBhbmQgcmVtb3ZlIHJlbGVhc2luZyBjbGFzcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzUG9zaXRpb25pbmdTdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlggPSAwO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gMDtcbiAgICByZW1vdmVDbGFzcyhpdGVtLl9lbGVtZW50LCBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuaXRlbVJlbGVhc2luZ0NsYXNzKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBwcm92aWRlZCBzdHlsZXMgZGVmaW5pdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDdXJyZW50U3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICAgIHZhciBjdXJyZW50ID0ge307XG4gICAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHtcbiAgICAgIGN1cnJlbnRbcHJvcF0gPSBnZXRTdHlsZShlbGVtZW50LCBnZXRTdHlsZU5hbWUocHJvcCkpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpYmlsaXR5IG1hbmFnZXIgZm9yIEl0ZW0gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1WaXNpYmlsaXR5KGl0ZW0pIHtcbiAgICB2YXIgaXNBY3RpdmUgPSBpdGVtLl9pc0FjdGl2ZTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIHNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFNldCB1cCB2aXNpYmlsaXR5IHN0YXRlcy5cbiAgICB0aGlzLl9pc0hpZGRlbiA9ICFpc0FjdGl2ZTtcbiAgICB0aGlzLl9pc0hpZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuXG4gICAgLy8gQ2FsbGJhY2sgcXVldWUuXG4gICAgdGhpcy5fcXVldWUgPSBuZXcgUXVldWUoKTtcblxuICAgIC8vIEJpbmQgc2hvdy9oaWRlIGZpbmlzaGVycy5cbiAgICB0aGlzLl9maW5pc2hTaG93ID0gdGhpcy5fZmluaXNoU2hvdy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2ZpbmlzaEhpZGUgPSB0aGlzLl9maW5pc2hIaWRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBGb3JjZSBpdGVtIHRvIGJlIGVpdGhlciB2aXNpYmxlIG9yIGhpZGRlbiBvbiBpbml0LlxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGlzQWN0aXZlID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgIC8vIFNldCB2aXNpYmxlL2hpZGRlbiBjbGFzcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc0FjdGl2ZSA/IHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gU2V0IGluaXRpYWwgc3R5bGVzIGZvciB0aGUgY2hpbGQgZWxlbWVudC5cbiAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIGlzQWN0aXZlID8gc2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU2hvdyBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1WaXNpYmlsaXR5fVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24ob25GaW5pc2gpID8gb25GaW5pc2ggOiBudWxsO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBJZiBpdGVtIGlzIHZpc2libGUgY2FsbCB0aGUgY2FsbGJhY2sgYW5kIGJlIGRvbmUgd2l0aCBpdC5cbiAgICBpZiAoIXRoaXMuX2lzU2hvd2luZyAmJiAhdGhpcy5faXNIaWRkZW4pIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGZhbHNlLCBpdGVtKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgc2hvd2luZyBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzaG93biBpbnN0YW50bHksIGxldCdzIGp1c3RcbiAgICAvLyBwdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZSBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICh0aGlzLl9pc1Nob3dpbmcgJiYgIWluc3RhbnQpIHtcbiAgICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgaXRlbSBpcyBoaWRpbmcgb3IgaGlkZGVuIHByb2Nlc3MgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBjYWxsYmFja1xuICAgIC8vIHF1ZXVlIHdpdGggdGhlIGludGVycnVwdGVkIGZsYWcgYWN0aXZlLCB1cGRhdGUgY2xhc3NlcyBhbmQgc2V0IGRpc3BsYXlcbiAgICAvLyB0byBibG9jayBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKCF0aGlzLl9pc1Nob3dpbmcpIHtcbiAgICAgIHF1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgICAgaWYgKCF0aGlzLl9pc0hpZGluZykgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZS5cbiAgICBjYWxsYmFjayAmJiBxdWV1ZS5hZGQoY2FsbGJhY2spO1xuXG4gICAgLy8gVXBkYXRlIHZpc2liaWxpdHkgc3RhdGVzLlxuICAgIGl0ZW0uX2lzQWN0aXZlID0gdGhpcy5faXNTaG93aW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9pc0hpZGluZyA9IHRoaXMuX2lzSGlkZGVuID0gZmFsc2U7XG5cbiAgICAvLyBGaW5hbGx5IGxldCdzIHN0YXJ0IHNob3cgYW5pbWF0aW9uLlxuICAgIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKHRydWUsIGluc3RhbnQsIHRoaXMuX2ZpbmlzaFNob3cpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhpZGUgaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5zdGFudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtJdGVtVmlzaWJpbGl0eX1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oaW5zdGFudCwgb25GaW5pc2gpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgY2FsbGJhY2sgPSBpc0Z1bmN0aW9uKG9uRmluaXNoKSA/IG9uRmluaXNoIDogbnVsbDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBhbHJlYWR5IGhpZGRlbiBjYWxsIHRoZSBjYWxsYmFjayBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICghdGhpcy5faXNIaWRpbmcgJiYgdGhpcy5faXNIaWRkZW4pIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGZhbHNlLCBpdGVtKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgaGlkaW5nIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGhpZGRlbiBpbnN0YW50bHksIGxldCdzIGp1c3RcbiAgICAvLyBwdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZSBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICh0aGlzLl9pc0hpZGluZyAmJiAhaW5zdGFudCkge1xuICAgICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIHNob3dpbmcgb3IgdmlzaWJsZSBwcm9jZXNzIHRoZSBjdXJyZW50IHZpc2liaWxpdHkgY2FsbGJhY2tcbiAgICAvLyBxdWV1ZSB3aXRoIHRoZSBpbnRlcnJ1cHRlZCBmbGFnIGFjdGl2ZSwgdXBkYXRlIGNsYXNzZXMgYW5kIHNldCBkaXNwbGF5XG4gICAgLy8gdG8gYmxvY2sgaWYgbmVjZXNzYXJ5LlxuICAgIGlmICghdGhpcy5faXNIaWRpbmcpIHtcbiAgICAgIHF1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcbiAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG5cbiAgICAvLyBVcGRhdGUgdmlzaWJpbGl0eSBzdGF0ZXMuXG4gICAgdGhpcy5faXNIaWRkZW4gPSB0aGlzLl9pc0hpZGluZyA9IHRydWU7XG4gICAgaXRlbS5faXNBY3RpdmUgPSB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcblxuICAgIC8vIEZpbmFsbHkgbGV0J3Mgc3RhcnQgaGlkZSBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24oZmFsc2UsIGluc3RhbnQsIHRoaXMuX2ZpbmlzaEhpZGUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbVZpc2liaWxpdHl9XG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBTdG9wIHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgIHRoaXMuX3N0b3BBbmltYXRpb24oe30pO1xuXG4gICAgLy8gRmlyZSBhbGwgdW5jb21wbGV0ZWQgY2FsbGJhY2tzIHdpdGggaW50ZXJydXB0ZWQgZmxhZyBhbmQgZGVzdHJveSB0aGUgcXVldWUuXG4gICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSkuZGVzdHJveSgpO1xuXG4gICAgLy8gUmVtb3ZlIHZpc2libGUvaGlkZGVuIGNsYXNzZXMuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIFJlc2V0IHN0YXRlLlxuICAgIHRoaXMuX2l0ZW0gPSBudWxsO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gdGhpcy5faXNTaG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0aGlzLl9pc0hpZGRlbiA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTdGFydCB2aXNpYmlsaXR5IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvVmlzaWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50XVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX3N0YXJ0QW5pbWF0aW9uID0gZnVuY3Rpb24odG9WaXNpYmxlLCBpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgdGFyZ2V0U3R5bGVzID0gdG9WaXNpYmxlID8gc2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHNldHRpbmdzLmhpZGRlblN0eWxlcztcbiAgICB2YXIgZHVyYXRpb24gPSBwYXJzZUludCh0b1Zpc2libGUgPyBzZXR0aW5ncy5zaG93RHVyYXRpb24gOiBzZXR0aW5ncy5oaWRlRHVyYXRpb24pIHx8IDA7XG4gICAgdmFyIGVhc2luZyA9ICh0b1Zpc2libGUgPyBzZXR0aW5ncy5zaG93RWFzaW5nIDogc2V0dGluZ3MuaGlkZUVhc2luZykgfHwgJ2Vhc2UnO1xuICAgIHZhciBpc0luc3RhbnQgPSBpbnN0YW50IHx8IGR1cmF0aW9uIDw9IDA7XG4gICAgdmFyIGN1cnJlbnRTdHlsZXM7XG5cbiAgICAvLyBObyB0YXJnZXQgc3R5bGVzPyBMZXQncyBxdWl0IGVhcmx5LlxuICAgIGlmICghdGFyZ2V0U3R5bGVzKSB7XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbmNlbCBxdWV1ZWQgdmlzaWJpbGl0eSB0aWNrLlxuICAgIGNhbmNlbFZpc2liaWxpdHlUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIElmIHdlIG5lZWQgdG8gYXBwbHkgdGhlIHN0eWxlcyBpbnN0YW50bHkgd2l0aG91dCBhbmltYXRpb24uXG4gICAgaWYgKGlzSW5zdGFudCkge1xuICAgICAgaWYgKGl0ZW0uX2FuaW1hdGVDaGlsZC5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIGl0ZW0uX2FuaW1hdGVDaGlsZC5zdG9wKHRhcmdldFN0eWxlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIHRhcmdldFN0eWxlcyk7XG4gICAgICB9XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24gaW4gdGhlIG5leHQgdGljayAodG8gYXZvaWQgbGF5b3V0IHRocmFzaGluZykuXG4gICAgYWRkVmlzaWJpbGl0eVRpY2soXG4gICAgICBpdGVtLl9pZCxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBjdXJyZW50U3R5bGVzID0gZ2V0Q3VycmVudFN0eWxlcyhpdGVtLl9jaGlsZCwgdGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0YXJ0KGN1cnJlbnRTdHlsZXMsIHRhcmdldFN0eWxlcywge1xuICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IGVhc2luZyxcbiAgICAgICAgICBvbkZpbmlzaDogb25GaW5pc2hcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcCB2aXNpYmlsaXR5IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldFN0eWxlc11cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fc3RvcEFuaW1hdGlvbiA9IGZ1bmN0aW9uKHRhcmdldFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICBjYW5jZWxWaXNpYmlsaXR5VGljayhpdGVtLl9pZCk7XG4gICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIHNob3cgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX2ZpbmlzaFNob3cgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNIaWRkZW4pIHJldHVybjtcbiAgICB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgdGhpcy5faXRlbSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmlzaCBoaWRlIHByb2NlZHVyZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKi9cbiAgdmFyIGZpbmlzaFN0eWxlcyA9IHt9O1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX2ZpbmlzaEhpZGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX2lzSGlkZGVuKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gZmFsc2U7XG4gICAgZmluaXNoU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZygwLCAwKTtcbiAgICBpdGVtLl9sYXlvdXQuc3RvcCh0cnVlLCBmaW5pc2hTdHlsZXMpO1xuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgaXRlbSk7XG4gIH07XG5cbiAgdmFyIGlkID0gMDtcblxuICAvKipcbiAgICogUmV0dXJucyBhIHVuaXF1ZSBudW1lcmljIGlkIChpbmNyZW1lbnRzIGEgYmFzZSB2YWx1ZSBvbiBldmVyeSBjYWxsKS5cbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVVpZCgpIHtcbiAgICByZXR1cm4gKytpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEl0ZW0gaW5zdGFuY2UgZm9yIGEgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7R3JpZH0gZ3JpZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzQWN0aXZlXVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbShncmlkLCBlbGVtZW50LCBpc0FjdGl2ZSkge1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgLy8gQ3JlYXRlIGluc3RhbmNlIGlkLlxuICAgIHRoaXMuX2lkID0gY3JlYXRlVWlkKCk7XG5cbiAgICAvLyBSZWZlcmVuY2UgdG8gY29ubmVjdGVkIEdyaWQgaW5zdGFuY2UncyBpZC5cbiAgICB0aGlzLl9ncmlkSWQgPSBncmlkLl9pZDtcblxuICAgIC8vIERlc3Ryb3llZCBmbGFnLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAvLyBTZXQgdXAgaW5pdGlhbCBwb3NpdGlvbnMuXG4gICAgdGhpcy5fbGVmdCA9IDA7XG4gICAgdGhpcy5fdG9wID0gMDtcblxuICAgIC8vIFRoZSBlbGVtZW50cy5cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9jaGlsZCA9IGVsZW1lbnQuY2hpbGRyZW5bMF07XG5cbiAgICAvLyBJZiB0aGUgcHJvdmlkZWQgaXRlbSBlbGVtZW50IGlzIG5vdCBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgZ3JpZCBjb250YWluZXJcbiAgICAvLyBlbGVtZW50LCBhcHBlbmQgaXQgdG8gdGhlIGdyaWQgY29udGFpbmVyLlxuICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgIT09IGdyaWQuX2VsZW1lbnQpIHtcbiAgICAgIGdyaWQuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGl0ZW0gY2xhc3MuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUNsYXNzKTtcblxuICAgIC8vIElmIGlzQWN0aXZlIGlzIG5vdCBkZWZpbmVkLCBsZXQncyB0cnkgdG8gYXV0by1kZXRlY3QgaXQuXG4gICAgaWYgKHR5cGVvZiBpc0FjdGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBpc0FjdGl2ZSA9IGdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5JykgIT09ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgYWN0aXZlIHN0YXRlIChkZWZpbmVzIGlmIHRoZSBpdGVtIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgbGF5b3V0XG4gICAgLy8gb3Igbm90KS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGlzQWN0aXZlO1xuXG4gICAgLy8gU2V0IGVsZW1lbnQncyBpbml0aWFsIHBvc2l0aW9uIHN0eWxlcy5cbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgZWxlbWVudC5zdHlsZS50b3AgPSAnMCc7XG4gICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZygwLCAwKTtcblxuICAgIC8vIEluaXRpYXRlIGl0ZW0ncyBhbmltYXRpb24gY29udHJvbGxlcnMuXG4gICAgdGhpcy5fYW5pbWF0ZSA9IG5ldyBJdGVtQW5pbWF0ZShlbGVtZW50KTtcbiAgICB0aGlzLl9hbmltYXRlQ2hpbGQgPSBuZXcgSXRlbUFuaW1hdGUodGhpcy5fY2hpbGQpO1xuXG4gICAgLy8gU2V0dXAgdmlzaWJpbGl0eSBoYW5kbGVyLlxuICAgIHRoaXMuX3Zpc2liaWxpdHkgPSBuZXcgSXRlbVZpc2liaWxpdHkodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgbGF5b3V0IGhhbmRsZXIuXG4gICAgdGhpcy5fbGF5b3V0ID0gbmV3IEl0ZW1MYXlvdXQodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgbWlncmF0aW9uIGhhbmRsZXIgZGF0YS5cbiAgICB0aGlzLl9taWdyYXRlID0gbmV3IEl0ZW1NaWdyYXRlKHRoaXMpO1xuXG4gICAgLy8gU2V0IHVwIHJlbGVhc2UgaGFuZGxlci4gTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgaXMgZnVsbHkgbGlua2VkIHRvIGRyYWdnaW5nXG4gICAgLy8gdGhpcyBzdGlsbCBuZWVkcyB0byBiZSBhbHdheXMgaW5zdGFudGlhdGVkIHRvIGhhbmRsZSBtaWdyYXRpb24gc2NlbmFyaW9zXG4gICAgLy8gY29ycmVjdGx5LlxuICAgIHRoaXMuX3JlbGVhc2UgPSBuZXcgSXRlbVJlbGVhc2UodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgZHJhZyBwbGFjZWhvbGRlciBoYW5kbGVyLiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBpcyBmdWxseSBsaW5rZWQgdG9cbiAgICAvLyBkcmFnZ2luZyB0aGlzIHN0aWxsIG5lZWRzIHRvIGJlIGFsd2F5cyBpbnN0YW50aWF0ZWQgdG8gaGFuZGxlIG1pZ3JhdGlvblxuICAgIC8vIHNjZW5hcmlvcyBjb3JyZWN0bHkuXG4gICAgdGhpcy5fZHJhZ1BsYWNlaG9sZGVyID0gbmV3IEl0ZW1EcmFnUGxhY2Vob2xkZXIodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgZHJhZyBoYW5kbGVyLlxuICAgIHRoaXMuX2RyYWcgPSBzZXR0aW5ncy5kcmFnRW5hYmxlZCA/IG5ldyBJdGVtRHJhZyh0aGlzKSA6IG51bGw7XG5cbiAgICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIHRoaXMuX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fcmVmcmVzaFNvcnREYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBncmlkIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRHcmlkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGdyaWRJbnN0YW5jZXNbdGhpcy5fZ3JpZElkXTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIHdpZHRoLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIGhlaWdodC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIG1hcmdpbnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqICAgLSBUaGUgcmV0dXJuZWQgb2JqZWN0IGNvbnRhaW5zIGxlZnQsIHJpZ2h0LCB0b3AgYW5kIGJvdHRvbSBwcm9wZXJ0aWVzXG4gICAqICAgICB3aGljaCBpbmRpY2F0ZSB0aGUgaXRlbSBlbGVtZW50J3MgY2FjaGVkIG1hcmdpbnMuXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRNYXJnaW4gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogdGhpcy5fbWFyZ2luTGVmdCxcbiAgICAgIHJpZ2h0OiB0aGlzLl9tYXJnaW5SaWdodCxcbiAgICAgIHRvcDogdGhpcy5fbWFyZ2luVG9wLFxuICAgICAgYm90dG9tOiB0aGlzLl9tYXJnaW5Cb3R0b21cbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgaW5zdGFuY2UgZWxlbWVudCdzIGNhY2hlZCBwb3NpdGlvbi5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogICAtIFRoZSByZXR1cm5lZCBvYmplY3QgY29udGFpbnMgbGVmdCBhbmQgdG9wIHByb3BlcnRpZXMgd2hpY2ggaW5kaWNhdGUgdGhlXG4gICAqICAgICBpdGVtIGVsZW1lbnQncyBjYWNoZWQgcG9zaXRpb24gaW4gdGhlIGdyaWQuXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiB0aGlzLl9sZWZ0LFxuICAgICAgdG9wOiB0aGlzLl90b3BcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBhY3RpdmU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNBY3RpdmU7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIHZpc2libGU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNWaXNpYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fdmlzaWJpbGl0eSAmJiAhdGhpcy5fdmlzaWJpbGl0eS5faXNIaWRkZW47XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGJlaW5nIGFuaW1hdGVkIHRvIHZpc2libGU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNTaG93aW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3Zpc2liaWxpdHkgJiYgdGhpcy5fdmlzaWJpbGl0eS5faXNTaG93aW5nKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgYW5pbWF0ZWQgdG8gaGlkZGVuP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzSGlkaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3Zpc2liaWxpdHkgJiYgdGhpcy5fdmlzaWJpbGl0eS5faXNIaWRpbmcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBwb3NpdGlvbmluZz9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Bvc2l0aW9uaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2xheW91dCAmJiB0aGlzLl9sYXlvdXQuX2lzQWN0aXZlKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgZHJhZ2dlZD9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc0RyYWdnaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2RyYWcgJiYgdGhpcy5fZHJhZy5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyByZWxlYXNlZD9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1JlbGVhc2luZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhISh0aGlzLl9yZWxlYXNlICYmIHRoaXMuX3JlbGVhc2UuX2lzQWN0aXZlKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gZGVzdHJveWVkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzRGVzdHJveWVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGVzdHJveWVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlIGl0ZW0ncyBkaW1lbnNpb25zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9yZWZyZXNoRGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGRlbikgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBkcmFnUGxhY2Vob2xkZXIgPSB0aGlzLl9kcmFnUGxhY2Vob2xkZXI7XG4gICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgdGhpcy5fd2lkdGggPSByZWN0LndpZHRoO1xuICAgIHRoaXMuX2hlaWdodCA9IHJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIG1hcmdpbnMgKGlnbm9yZSBuZWdhdGl2ZSBtYXJnaW5zKS5cbiAgICB0aGlzLl9tYXJnaW5MZWZ0ID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tbGVmdCcpKTtcbiAgICB0aGlzLl9tYXJnaW5SaWdodCA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLXJpZ2h0JykpO1xuICAgIHRoaXMuX21hcmdpblRvcCA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLXRvcCcpKTtcbiAgICB0aGlzLl9tYXJnaW5Cb3R0b20gPSBNYXRoLm1heCgwLCBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ21hcmdpbi1ib3R0b20nKSk7XG5cbiAgICAvLyBLZWVwIGRyYWcgcGxhY2Vob2xkZXIncyBkaW1lbnNpb25zIHN5bmNlZCB3aXRoIHRoZSBpdGVtJ3MuXG4gICAgaWYgKGRyYWdQbGFjZWhvbGRlcikge1xuICAgICAgZHJhZ1BsYWNlaG9sZGVyLnVwZGF0ZURpbWVuc2lvbnModGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaCBhbmQgc3RvcmUgaXRlbSdzIHNvcnQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5fcmVmcmVzaFNvcnREYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgZGF0YSA9ICh0aGlzLl9zb3J0RGF0YSA9IHt9KTtcbiAgICB2YXIgZ2V0dGVycyA9IHRoaXMuZ2V0R3JpZCgpLl9zZXR0aW5ncy5zb3J0RGF0YTtcbiAgICB2YXIgcHJvcDtcblxuICAgIGZvciAocHJvcCBpbiBnZXR0ZXJzKSB7XG4gICAgICBkYXRhW3Byb3BdID0gZ2V0dGVyc1twcm9wXSh0aGlzLCB0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgaXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbW92ZUVsZW1lbnQ9ZmFsc2VdXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uKHJlbW92ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciBpbmRleCA9IGdyaWQuX2l0ZW1zLmluZGV4T2YodGhpcyk7XG5cbiAgICAvLyBEZXN0cm95IGhhbmRsZXJzLlxuICAgIHRoaXMuX3JlbGVhc2UuZGVzdHJveSgpO1xuICAgIHRoaXMuX21pZ3JhdGUuZGVzdHJveSgpO1xuICAgIHRoaXMuX2xheW91dC5kZXN0cm95KCk7XG4gICAgdGhpcy5fdmlzaWJpbGl0eS5kZXN0cm95KCk7XG4gICAgdGhpcy5fYW5pbWF0ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fYW5pbWF0ZUNoaWxkLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9kcmFnUGxhY2Vob2xkZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RyYWcgJiYgdGhpcy5fZHJhZy5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgYWxsIGlubGluZSBzdHlsZXMuXG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgdGhpcy5fY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgLy8gUmVtb3ZlIGl0ZW0gY2xhc3MuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUNsYXNzKTtcblxuICAgIC8vIFJlbW92ZSBpdGVtIGZyb20gR3JpZCBpbnN0YW5jZSBpZiBpdCBzdGlsbCBleGlzdHMgdGhlcmUuXG4gICAgaW5kZXggPiAtMSAmJiBncmlkLl9pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmVtb3ZlIGVsZW1lbnQgZnJvbSBET00uXG4gICAgcmVtb3ZlRWxlbWVudCAmJiBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBSZXNldCBzdGF0ZS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBsYXlvdXQgYWxnb3JpdGhtIGZvciBNdXVyaS4gQmFzZWQgb24gTUFYUkVDVFMgYXBwcm9hY2hcbiAgICogYXMgZGVzY3JpYmVkIGJ5IEp1a2thIEp5bMOkbmtpIGluIGhpcyBzdXJ2ZXk6IFwiQSBUaG91c2FuZCBXYXlzIHRvIFBhY2sgdGhlXG4gICAqIEJpbiAtIEEgUHJhY3RpY2FsIEFwcHJvYWNoIHRvIFR3by1EaW1lbnNpb25hbCBSZWN0YW5nbGUgQmluIFBhY2tpbmcuXCIuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gUGFja2VyKCkge1xuICAgIHRoaXMuX3Nsb3RzID0gW107XG4gICAgdGhpcy5fc2xvdFNpemVzID0gW107XG4gICAgdGhpcy5fZnJlZVNsb3RzID0gW107XG4gICAgdGhpcy5fbmV3U2xvdHMgPSBbXTtcbiAgICB0aGlzLl9yZWN0SXRlbSA9IHt9O1xuICAgIHRoaXMuX3JlY3RTdG9yZSA9IFtdO1xuICAgIHRoaXMuX3JlY3RJZCA9IDA7XG5cbiAgICAvLyBUaGUgbGF5b3V0IHJldHVybiBkYXRhLCB3aGljaCB3aWxsIGJlIHBvcHVsYXRlZCBpbiBnZXRMYXlvdXQuXG4gICAgdGhpcy5fbGF5b3V0ID0ge1xuICAgICAgc2xvdHM6IG51bGwsXG4gICAgICBzZXRXaWR0aDogZmFsc2UsXG4gICAgICBzZXRIZWlnaHQ6IGZhbHNlLFxuICAgICAgd2lkdGg6IGZhbHNlLFxuICAgICAgaGVpZ2h0OiBmYWxzZVxuICAgIH07XG5cbiAgICAvLyBCaW5kIHNvcnQgaGFuZGxlcnMuXG4gICAgdGhpcy5fc29ydFJlY3RzTGVmdFRvcCA9IHRoaXMuX3NvcnRSZWN0c0xlZnRUb3AuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0ID0gdGhpcy5fc29ydFJlY3RzVG9wTGVmdC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtW119IGl0ZW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEBwYXJhbSB7TnVtYmVyW119IFtzbG90c11cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbGxHYXBzPWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvcml6b250YWw9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxpZ25SaWdodD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGlnbkJvdHRvbT1mYWxzZV1cbiAgICogQHJldHVybnMge0xheW91dERhdGF9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLmdldExheW91dCA9IGZ1bmN0aW9uKGl0ZW1zLCB3aWR0aCwgaGVpZ2h0LCBzbG90cywgb3B0aW9ucykge1xuICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgdmFyIGZpbGxHYXBzID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmZpbGxHYXBzKTtcbiAgICB2YXIgaXNIb3Jpem9udGFsID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmhvcml6b250YWwpO1xuICAgIHZhciBhbGlnblJpZ2h0ID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmFsaWduUmlnaHQpO1xuICAgIHZhciBhbGlnbkJvdHRvbSA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGlnbkJvdHRvbSk7XG4gICAgdmFyIHJvdW5kaW5nID0gISEob3B0aW9ucyAmJiBvcHRpb25zLnJvdW5kaW5nKTtcbiAgICB2YXIgc2xvdFNpemVzID0gdGhpcy5fc2xvdFNpemVzO1xuICAgIHZhciBpO1xuXG4gICAgLy8gUmVzZXQgbGF5b3V0IGRhdGEuXG4gICAgbGF5b3V0LnNsb3RzID0gc2xvdHMgPyBzbG90cyA6IHRoaXMuX3Nsb3RzO1xuICAgIGxheW91dC53aWR0aCA9IGlzSG9yaXpvbnRhbCA/IDAgOiByb3VuZGluZyA/IE1hdGgucm91bmQod2lkdGgpIDogd2lkdGg7XG4gICAgbGF5b3V0LmhlaWdodCA9ICFpc0hvcml6b250YWwgPyAwIDogcm91bmRpbmcgPyBNYXRoLnJvdW5kKGhlaWdodCkgOiBoZWlnaHQ7XG4gICAgbGF5b3V0LnNldFdpZHRoID0gaXNIb3Jpem9udGFsO1xuICAgIGxheW91dC5zZXRIZWlnaHQgPSAhaXNIb3Jpem9udGFsO1xuXG4gICAgLy8gTWFrZSBzdXJlIHNsb3RzIGFuZCBzbG90IHNpemUgYXJyYXlzIGFyZSByZXNldC5cbiAgICBsYXlvdXQuc2xvdHMubGVuZ3RoID0gMDtcbiAgICBzbG90U2l6ZXMubGVuZ3RoID0gMDtcblxuICAgIC8vIE5vIG5lZWQgdG8gZ28gZnVydGhlciBpZiBpdGVtcyBkbyBub3QgZXhpc3QuXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBsYXlvdXQ7XG5cbiAgICAvLyBGaW5kIHNsb3RzIGZvciBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2FkZFNsb3QoaXRlbXNbaV0sIGlzSG9yaXpvbnRhbCwgZmlsbEdhcHMsIHJvdW5kaW5nLCBhbGlnblJpZ2h0IHx8IGFsaWduQm90dG9tKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHNldCB0byByaWdodCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgcmVzdWx0cy5cbiAgICBpZiAoYWxpZ25SaWdodCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxheW91dC5zbG90cy5sZW5ndGg7IGkgPSBpICsgMikge1xuICAgICAgICBsYXlvdXQuc2xvdHNbaV0gPSBsYXlvdXQud2lkdGggLSAobGF5b3V0LnNsb3RzW2ldICsgc2xvdFNpemVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHNldCB0byBib3R0b20gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHJlc3VsdHMuXG4gICAgaWYgKGFsaWduQm90dG9tKSB7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgbGF5b3V0LnNsb3RzLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgIGxheW91dC5zbG90c1tpXSA9IGxheW91dC5oZWlnaHQgLSAobGF5b3V0LnNsb3RzW2ldICsgc2xvdFNpemVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXNldCBzbG90cyBhcnJheXMgYW5kIHJlY3QgaWQuXG4gICAgc2xvdFNpemVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fZnJlZVNsb3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fbmV3U2xvdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9yZWN0SWQgPSAwO1xuXG4gICAgcmV0dXJuIGxheW91dDtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHBvc2l0aW9uIGZvciB0aGUgbGF5b3V0IGl0ZW0uIFJldHVybnMgdGhlIGxlZnQgYW5kIHRvcCBwb3NpdGlvblxuICAgKiBvZiB0aGUgaXRlbSBpbiBwaXhlbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzSG9yaXpvbnRhbFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbGxHYXBzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcm91bmRpbmdcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fYWRkU2xvdCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgZXBzID0gMC4wMDE7XG4gICAgdmFyIGl0ZW1TbG90ID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0sIGlzSG9yaXpvbnRhbCwgZmlsbEdhcHMsIHJvdW5kaW5nLCB0cmFja1NpemUpIHtcbiAgICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgICB2YXIgZnJlZVNsb3RzID0gdGhpcy5fZnJlZVNsb3RzO1xuICAgICAgdmFyIG5ld1Nsb3RzID0gdGhpcy5fbmV3U2xvdHM7XG4gICAgICB2YXIgcmVjdDtcbiAgICAgIHZhciByZWN0SWQ7XG4gICAgICB2YXIgcG90ZW50aWFsU2xvdHM7XG4gICAgICB2YXIgaWdub3JlQ3VycmVudFNsb3RzO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgaWk7XG5cbiAgICAgIC8vIFJlc2V0IG5ldyBzbG90cy5cbiAgICAgIG5ld1Nsb3RzLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIFNldCBpdGVtIHNsb3QgaW5pdGlhbCBkYXRhLlxuICAgICAgaXRlbVNsb3QubGVmdCA9IG51bGw7XG4gICAgICBpdGVtU2xvdC50b3AgPSBudWxsO1xuICAgICAgaXRlbVNsb3Qud2lkdGggPSBpdGVtLl93aWR0aCArIGl0ZW0uX21hcmdpbkxlZnQgKyBpdGVtLl9tYXJnaW5SaWdodDtcbiAgICAgIGl0ZW1TbG90LmhlaWdodCA9IGl0ZW0uX2hlaWdodCArIGl0ZW0uX21hcmdpblRvcCArIGl0ZW0uX21hcmdpbkJvdHRvbTtcblxuICAgICAgLy8gUm91bmQgaXRlbSBzbG90IHdpZHRoIGFuZCBoZWlnaHQgaWYgbmVlZGVkLlxuICAgICAgaWYgKHJvdW5kaW5nKSB7XG4gICAgICAgIGl0ZW1TbG90LndpZHRoID0gTWF0aC5yb3VuZChpdGVtU2xvdC53aWR0aCk7XG4gICAgICAgIGl0ZW1TbG90LmhlaWdodCA9IE1hdGgucm91bmQoaXRlbVNsb3QuaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBzbG90IGZvciB0aGUgaXRlbS5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVjdElkID0gZnJlZVNsb3RzW2ldO1xuICAgICAgICBpZiAoIXJlY3RJZCkgY29udGludWU7XG4gICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgIGlmIChpdGVtU2xvdC53aWR0aCA8PSByZWN0LndpZHRoICsgZXBzICYmIGl0ZW1TbG90LmhlaWdodCA8PSByZWN0LmhlaWdodCArIGVwcykge1xuICAgICAgICAgIGl0ZW1TbG90LmxlZnQgPSByZWN0LmxlZnQ7XG4gICAgICAgICAgaXRlbVNsb3QudG9wID0gcmVjdC50b3A7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gc2xvdCB3YXMgZm91bmQgZm9yIHRoZSBpdGVtLlxuICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gUG9zaXRpb24gdGhlIGl0ZW0gaW4gdG8gdGhlIGJvdHRvbSBsZWZ0ICh2ZXJ0aWNhbCBtb2RlKSBvciB0b3AgcmlnaHRcbiAgICAgICAgLy8gKGhvcml6b250YWwgbW9kZSkgb2YgdGhlIGdyaWQuXG4gICAgICAgIGl0ZW1TbG90LmxlZnQgPSAhaXNIb3Jpem9udGFsID8gMCA6IGxheW91dC53aWR0aDtcbiAgICAgICAgaXRlbVNsb3QudG9wID0gIWlzSG9yaXpvbnRhbCA/IGxheW91dC5oZWlnaHQgOiAwO1xuXG4gICAgICAgIC8vIElmIGdhcHMgZG9uJ3QgbmVlZCBmaWxsaW5nIGRvIG5vdCBhZGQgYW55IGN1cnJlbnQgc2xvdHMgdG8gdGhlIG5ld1xuICAgICAgICAvLyBzbG90cyBhcnJheS5cbiAgICAgICAgaWYgKCFmaWxsR2Fwcykge1xuICAgICAgICAgIGlnbm9yZUN1cnJlbnRTbG90cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSW4gdmVydGljYWwgbW9kZSwgaWYgdGhlIGl0ZW0ncyBib3R0b20gb3ZlcmxhcHMgdGhlIGdyaWQncyBib3R0b20uXG4gICAgICBpZiAoIWlzSG9yaXpvbnRhbCAmJiBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQgPiBsYXlvdXQuaGVpZ2h0KSB7XG4gICAgICAgIC8vIElmIGl0ZW0gaXMgbm90IGFsaWduZWQgdG8gdGhlIGxlZnQgZWRnZSwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC5sZWZ0ID4gMCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2godGhpcy5fYWRkUmVjdCgwLCBsYXlvdXQuaGVpZ2h0LCBpdGVtU2xvdC5sZWZ0LCBJbmZpbml0eSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgcmlnaHQgZWRnZSwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGggPCBsYXlvdXQud2lkdGgpIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgICAgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoLFxuICAgICAgICAgICAgICBsYXlvdXQuaGVpZ2h0LFxuICAgICAgICAgICAgICBsYXlvdXQud2lkdGggLSBpdGVtU2xvdC5sZWZ0IC0gaXRlbVNsb3Qud2lkdGgsXG4gICAgICAgICAgICAgIEluZmluaXR5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBncmlkIGhlaWdodC5cbiAgICAgICAgbGF5b3V0LmhlaWdodCA9IGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodDtcbiAgICAgIH1cblxuICAgICAgLy8gSW4gaG9yaXpvbnRhbCBtb2RlLCBpZiB0aGUgaXRlbSdzIHJpZ2h0IG92ZXJsYXBzIHRoZSBncmlkJ3MgcmlnaHQgZWRnZS5cbiAgICAgIGlmIChpc0hvcml6b250YWwgJiYgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoID4gbGF5b3V0LndpZHRoKSB7XG4gICAgICAgIC8vIElmIGl0ZW0gaXMgbm90IGFsaWduZWQgdG8gdGhlIHRvcCwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC50b3AgPiAwKSB7XG4gICAgICAgICAgbmV3U2xvdHMucHVzaCh0aGlzLl9hZGRSZWN0KGxheW91dC53aWR0aCwgMCwgSW5maW5pdHksIGl0ZW1TbG90LnRvcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgYm90dG9tLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCA8IGxheW91dC5oZWlnaHQpIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgICAgbGF5b3V0LndpZHRoLFxuICAgICAgICAgICAgICBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQsXG4gICAgICAgICAgICAgIEluZmluaXR5LFxuICAgICAgICAgICAgICBsYXlvdXQuaGVpZ2h0IC0gaXRlbVNsb3QudG9wIC0gaXRlbVNsb3QuaGVpZ2h0XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBncmlkIHdpZHRoLlxuICAgICAgICBsYXlvdXQud2lkdGggPSBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFuIHVwIHRoZSBjdXJyZW50IHNsb3RzIG1ha2luZyBzdXJlIHRoZXJlIGFyZSBubyBvbGQgc2xvdHMgdGhhdFxuICAgICAgLy8gb3ZlcmxhcCB3aXRoIHRoZSBpdGVtLiBJZiBhbiBvbGQgc2xvdCBvdmVybGFwcyB3aXRoIHRoZSBpdGVtLCBzcGxpdCBpdFxuICAgICAgLy8gaW50byBzbWFsbGVyIHNsb3RzIGlmIG5lY2Vzc2FyeS5cbiAgICAgIGZvciAoaSA9IGZpbGxHYXBzID8gMCA6IGlnbm9yZUN1cnJlbnRTbG90cyA/IGZyZWVTbG90cy5sZW5ndGggOiBpOyBpIDwgZnJlZVNsb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlY3RJZCA9IGZyZWVTbG90c1tpXTtcbiAgICAgICAgaWYgKCFyZWN0SWQpIGNvbnRpbnVlO1xuICAgICAgICByZWN0ID0gdGhpcy5fZ2V0UmVjdChyZWN0SWQpO1xuICAgICAgICBwb3RlbnRpYWxTbG90cyA9IHRoaXMuX3NwbGl0UmVjdChyZWN0LCBpdGVtU2xvdCk7XG4gICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHBvdGVudGlhbFNsb3RzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgIHJlY3RJZCA9IHBvdGVudGlhbFNsb3RzW2lpXTtcbiAgICAgICAgICByZWN0ID0gdGhpcy5fZ2V0UmVjdChyZWN0SWQpO1xuICAgICAgICAgIC8vIExldCdzIG1ha2Ugc3VyZSBoZXJlIHRoYXQgd2UgaGF2ZSBhIGJpZyBlbm91Z2ggc2xvdFxuICAgICAgICAgIC8vICh3aWR0aC9oZWlnaHQgPiAwLjQ5cHgpIGFuZCBhbHNvIGxldCdzIG1ha2Ugc3VyZSB0aGF0IHRoZSBzbG90IGlzXG4gICAgICAgICAgLy8gd2l0aGluIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBncmlkLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlY3Qud2lkdGggPiAwLjQ5ICYmXG4gICAgICAgICAgICByZWN0LmhlaWdodCA+IDAuNDkgJiZcbiAgICAgICAgICAgICgoIWlzSG9yaXpvbnRhbCAmJiByZWN0LnRvcCA8IGxheW91dC5oZWlnaHQpIHx8XG4gICAgICAgICAgICAgIChpc0hvcml6b250YWwgJiYgcmVjdC5sZWZ0IDwgbGF5b3V0LndpZHRoKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG5ld1Nsb3RzLnB1c2gocmVjdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgbmV3IHNsb3RzLlxuICAgICAgaWYgKG5ld1Nsb3RzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9wdXJnZVJlY3RzKG5ld1Nsb3RzKS5zb3J0KFxuICAgICAgICAgIGlzSG9yaXpvbnRhbCA/IHRoaXMuX3NvcnRSZWN0c0xlZnRUb3AgOiB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBsYXlvdXQgd2lkdGgvaGVpZ2h0LlxuICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICBsYXlvdXQud2lkdGggPSBNYXRoLm1heChsYXlvdXQud2lkdGgsIGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXlvdXQuaGVpZ2h0ID0gTWF0aC5tYXgobGF5b3V0LmhlaWdodCwgaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGl0ZW0gc2xvdCBkYXRhIHRvIGxheW91dCBzbG90cyAoYW5kIHN0b3JlIHRoZSBzbG90IHNpemUgZm9yIGxhdGVyXG4gICAgICAvLyB1c2FnZSB0b28gaWYgbmVjZXNzYXJ5KS5cbiAgICAgIGxheW91dC5zbG90cy5wdXNoKGl0ZW1TbG90LmxlZnQsIGl0ZW1TbG90LnRvcCk7XG4gICAgICBpZiAodHJhY2tTaXplKSB0aGlzLl9zbG90U2l6ZXMucHVzaChpdGVtU2xvdC53aWR0aCwgaXRlbVNsb3QuaGVpZ2h0KTtcblxuICAgICAgLy8gRnJlZS9uZXcgc2xvdHMgc3dpdGNoZXJvbyFcbiAgICAgIHRoaXMuX2ZyZWVTbG90cyA9IG5ld1Nsb3RzO1xuICAgICAgdGhpcy5fbmV3U2xvdHMgPSBmcmVlU2xvdHM7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogQWRkIGEgbmV3IHJlY3RhbmdsZSB0byB0aGUgcmVjdGFuZ2xlIHN0b3JlLiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgbmV3XG4gICAqIHJlY3RhbmdsZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlZnRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRvcFxuICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICAgKiBAcmV0dXJucyB7UmVjdElkfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fYWRkUmVjdCA9IGZ1bmN0aW9uKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkge1xuICAgIHZhciByZWN0SWQgPSArK3RoaXMuX3JlY3RJZDtcbiAgICB2YXIgcmVjdFN0b3JlID0gdGhpcy5fcmVjdFN0b3JlO1xuXG4gICAgcmVjdFN0b3JlW3JlY3RJZF0gPSBsZWZ0IHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IHRvcCB8fCAwO1xuICAgIHJlY3RTdG9yZVsrK3RoaXMuX3JlY3RJZF0gPSB3aWR0aCB8fCAwO1xuICAgIHJlY3RTdG9yZVsrK3RoaXMuX3JlY3RJZF0gPSBoZWlnaHQgfHwgMDtcblxuICAgIHJldHVybiByZWN0SWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCByZWN0YW5nbGUgZGF0YSBmcm9tIHRoZSByZWN0YW5nbGUgc3RvcmUgYnkgaWQuIE9wdGlvbmFsbHkgeW91IGNhblxuICAgKiBwcm92aWRlIGEgdGFyZ2V0IG9iamVjdCB3aGVyZSB0aGUgcmVjdGFuZ2xlIGRhdGEgd2lsbCBiZSB3cml0dGVuIGluLiBCeVxuICAgKiBkZWZhdWx0IGFuIGludGVybmFsIG9iamVjdCBpcyByZXVzZWQgYXMgYSB0YXJnZXQgb2JqZWN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gaWRcbiAgICogQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9nZXRSZWN0ID0gZnVuY3Rpb24oaWQsIHRhcmdldCkge1xuICAgIHZhciByZWN0SXRlbSA9IHRhcmdldCA/IHRhcmdldCA6IHRoaXMuX3JlY3RJdGVtO1xuICAgIHZhciByZWN0U3RvcmUgPSB0aGlzLl9yZWN0U3RvcmU7XG5cbiAgICByZWN0SXRlbS5sZWZ0ID0gcmVjdFN0b3JlW2lkXSB8fCAwO1xuICAgIHJlY3RJdGVtLnRvcCA9IHJlY3RTdG9yZVsrK2lkXSB8fCAwO1xuICAgIHJlY3RJdGVtLndpZHRoID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0uaGVpZ2h0ID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG5cbiAgICByZXR1cm4gcmVjdEl0ZW07XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1bmNoIGEgaG9sZSBpbnRvIGEgcmVjdGFuZ2xlIGFuZCBzcGxpdCB0aGUgcmVtYWluaW5nIGFyZWEgaW50byBzbWFsbGVyXG4gICAqIHJlY3RhbmdsZXMgKDQgYXQgbWF4KS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0YW5nbGV9IHJlY3RcbiAgICogQHBhcmFtIHtSZWN0YW5nbGV9IGhvbGVcbiAgICogQHJldHVybnMge1JlY3RJZFtdfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fc3BsaXRSZWN0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHJlY3QsIGhvbGUpIHtcbiAgICAgIC8vIFJlc2V0IG9sZCByZXN1bHRzLlxuICAgICAgcmVzdWx0cy5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBJZiB0aGUgcmVjdCBkb2VzIG5vdCBvdmVybGFwIHdpdGggdGhlIGhvbGUgYWRkIHJlY3QgdG8gdGhlIHJldHVybiBkYXRhXG4gICAgICAvLyBhcyBpcy5cbiAgICAgIGlmICghdGhpcy5fZG9SZWN0c092ZXJsYXAocmVjdCwgaG9sZSkpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZnQgc3BsaXQuXG4gICAgICBpZiAocmVjdC5sZWZ0IDwgaG9sZS5sZWZ0KSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLl9hZGRSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIGhvbGUubGVmdCAtIHJlY3QubGVmdCwgcmVjdC5oZWlnaHQpKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmlnaHQgc3BsaXQuXG4gICAgICBpZiAocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCA+IGhvbGUubGVmdCArIGhvbGUud2lkdGgpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKFxuICAgICAgICAgIHRoaXMuX2FkZFJlY3QoXG4gICAgICAgICAgICBob2xlLmxlZnQgKyBob2xlLndpZHRoLFxuICAgICAgICAgICAgcmVjdC50b3AsXG4gICAgICAgICAgICByZWN0LmxlZnQgKyByZWN0LndpZHRoIC0gKGhvbGUubGVmdCArIGhvbGUud2lkdGgpLFxuICAgICAgICAgICAgcmVjdC5oZWlnaHRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRvcCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LnRvcCA8IGhvbGUudG9wKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLl9hZGRSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIGhvbGUudG9wIC0gcmVjdC50b3ApKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90dG9tIHNwbGl0LlxuICAgICAgaWYgKHJlY3QudG9wICsgcmVjdC5oZWlnaHQgPiBob2xlLnRvcCArIGhvbGUuaGVpZ2h0KSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChcbiAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgcmVjdC5sZWZ0LFxuICAgICAgICAgICAgaG9sZS50b3AgKyBob2xlLmhlaWdodCxcbiAgICAgICAgICAgIHJlY3Qud2lkdGgsXG4gICAgICAgICAgICByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC0gKGhvbGUudG9wICsgaG9sZS5oZWlnaHQpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdGFuZ2xlcyBvdmVybGFwLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2RvUmVjdHNPdmVybGFwID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiAhKFxuICAgICAgYS5sZWZ0ICsgYS53aWR0aCA8PSBiLmxlZnQgfHxcbiAgICAgIGIubGVmdCArIGIud2lkdGggPD0gYS5sZWZ0IHx8XG4gICAgICBhLnRvcCArIGEuaGVpZ2h0IDw9IGIudG9wIHx8XG4gICAgICBiLnRvcCArIGIuaGVpZ2h0IDw9IGEudG9wXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSByZWN0YW5nbGUgaXMgZnVsbHkgd2l0aGluIGFub3RoZXIgcmVjdGFuZ2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2lzUmVjdFdpdGhpblJlY3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEubGVmdCA+PSBiLmxlZnQgJiZcbiAgICAgIGEudG9wID49IGIudG9wICYmXG4gICAgICBhLmxlZnQgKyBhLndpZHRoIDw9IGIubGVmdCArIGIud2lkdGggJiZcbiAgICAgIGEudG9wICsgYS5oZWlnaHQgPD0gYi50b3AgKyBiLmhlaWdodFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvb3BzIHRocm91Z2ggYW4gYXJyYXkgb2YgcmVjdGFuZ2xlIGlkcyBhbmQgcmVzZXRzIGFsbCB0aGF0IGFyZSBmdWxseVxuICAgKiB3aXRoaW4gYW5vdGhlciByZWN0YW5nbGUgaW4gdGhlIGFycmF5LiBSZXNldHRpbmcgaW4gdGhpcyBjYXNlIG1lYW5zIHRoYXRcbiAgICogdGhlIHJlY3RhbmdsZSBpZCB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIHplcm8uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkW119IHJlY3RJZHNcbiAgICogQHJldHVybnMge1JlY3RJZFtdfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fcHVyZ2VSZWN0cyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVjdEEgPSB7fTtcbiAgICB2YXIgcmVjdEIgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVjdElkcykge1xuICAgICAgdmFyIGkgPSByZWN0SWRzLmxlbmd0aDtcbiAgICAgIHZhciBpaTtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpaSA9IHJlY3RJZHMubGVuZ3RoO1xuICAgICAgICBpZiAoIXJlY3RJZHNbaV0pIGNvbnRpbnVlO1xuICAgICAgICB0aGlzLl9nZXRSZWN0KHJlY3RJZHNbaV0sIHJlY3RBKTtcbiAgICAgICAgd2hpbGUgKGlpLS0pIHtcbiAgICAgICAgICBpZiAoIXJlY3RJZHNbaWldIHx8IGkgPT09IGlpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAodGhpcy5faXNSZWN0V2l0aGluUmVjdChyZWN0QSwgdGhpcy5fZ2V0UmVjdChyZWN0SWRzW2lpXSwgcmVjdEIpKSkge1xuICAgICAgICAgICAgcmVjdElkc1tpXSA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY3RJZHM7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogU29ydCByZWN0YW5nbGVzIHdpdGggdG9wLWxlZnQgZ3Jhdml0eS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0SWR9IGFJZFxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYklkXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9zb3J0UmVjdHNUb3BMZWZ0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWN0QSA9IHt9O1xuICAgIHZhciByZWN0QiA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbihhSWQsIGJJZCkge1xuICAgICAgdGhpcy5fZ2V0UmVjdChhSWQsIHJlY3RBKTtcbiAgICAgIHRoaXMuX2dldFJlY3QoYklkLCByZWN0Qik7XG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIHJldHVybiByZWN0QS50b3AgPCByZWN0Qi50b3AgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wID4gcmVjdEIudG9wID8gMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA8IHJlY3RCLmxlZnQgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA+IHJlY3RCLmxlZnQgPyAxIDogMDtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBTb3J0IHJlY3RhbmdsZXMgd2l0aCBsZWZ0LXRvcCBncmF2aXR5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYUlkXG4gICAqIEBwYXJhbSB7UmVjdElkfSBiSWRcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX3NvcnRSZWN0c0xlZnRUb3AgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlY3RBID0ge307XG4gICAgdmFyIHJlY3RCID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFJZCwgYklkKSB7XG4gICAgICB0aGlzLl9nZXRSZWN0KGFJZCwgcmVjdEEpO1xuICAgICAgdGhpcy5fZ2V0UmVjdChiSWQsIHJlY3RCKTtcbiAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgcmV0dXJuIHJlY3RBLmxlZnQgPCByZWN0Qi5sZWZ0ID8gLTEgOlxuICAgICAgICAgICAgIHJlY3RBLmxlZnQgPiByZWN0Qi5sZWZ0ID8gMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wIDwgcmVjdEIudG9wID8gLTEgOlxuICAgICAgICAgICAgIHJlY3RBLnRvcCA+IHJlY3RCLnRvcCA/IDEgOiAwO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgdmFyIGh0bWxDb2xsZWN0aW9uVHlwZSA9ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSc7XG4gIHZhciBub2RlTGlzdFR5cGUgPSAnW29iamVjdCBOb2RlTGlzdF0nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9kZSBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNOb2RlTGlzdCh2YWwpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpO1xuICAgIHJldHVybiB0eXBlID09PSBodG1sQ29sbGVjdGlvblR5cGUgfHwgdHlwZSA9PT0gbm9kZUxpc3RUeXBlO1xuICB9XG5cbiAgdmFyIG9iamVjdFR5cGUgPSAnb2JqZWN0JztcbiAgdmFyIG9iamVjdFRvU3RyaW5nVHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09IG9iamVjdFR5cGUgJiYgdG9TdHJpbmcuY2FsbCh2YWwpID09PSBvYmplY3RUb1N0cmluZ1R5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhbiBhcnJheSBvciBjbG9uZXMgYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGlzTm9kZUxpc3QodGFyZ2V0KSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRhcmdldCkgOiBBcnJheS5wcm90b3R5cGUuY29uY2F0KHRhcmdldCk7XG4gIH1cblxuICB2YXIgcGFja2VyID0gbmV3IFBhY2tlcigpO1xuICB2YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbiAgdmFyIG51bWJlclR5cGUkMSA9ICdudW1iZXInO1xuICB2YXIgc3RyaW5nVHlwZSA9ICdzdHJpbmcnO1xuICB2YXIgaW5zdGFudExheW91dCA9ICdpbnN0YW50JztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8U3RyaW5nKX0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7PyhIVE1MRWxlbWVudFtdfE5vZGVMaXN0fFN0cmluZyl9IFtvcHRpb25zLml0ZW1zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2hvd0R1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNob3dFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy52aXNpYmxlU3R5bGVzXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGlkZUR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmhpZGVFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5oaWRkZW5TdHlsZXNdXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufE9iamVjdCl9IFtvcHRpb25zLmxheW91dF1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuZmlsbEdhcHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0Lmhvcml6b250YWw9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LmFsaWduUmlnaHQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LmFsaWduQm90dG9tPWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dC5yb3VuZGluZz10cnVlXVxuICAgKiBAcGFyYW0geyhCb29sZWFufE51bWJlcil9IFtvcHRpb25zLmxheW91dE9uUmVzaXplPTEwMF1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXRPbkluaXQ9dHJ1ZV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmxheW91dER1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmxheW91dEVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9ucy5zb3J0RGF0YT1udWxsXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRyYWdFbmFibGVkPWZhbHNlXVxuICAgKiBAcGFyYW0gez9IdG1sRWxlbWVudH0gW29wdGlvbnMuZHJhZ0NvbnRhaW5lcj1udWxsXVxuICAgKiBAcGFyYW0gez9GdW5jdGlvbn0gW29wdGlvbnMuZHJhZ1N0YXJ0UHJlZGljYXRlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1N0YXJ0UHJlZGljYXRlLmRpc3RhbmNlPTBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuZGVsYXk9MF1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxTdHJpbmcpfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuaGFuZGxlPWZhbHNlXVxuICAgKiBAcGFyYW0gez9TdHJpbmd9IFtvcHRpb25zLmRyYWdBeGlzXVxuICAgKiBAcGFyYW0geyhCb29sZWFufEZ1bmN0aW9uKX0gW29wdGlvbnMuZHJhZ1NvcnQ9dHJ1ZV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljc11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljcy5zb3J0SW50ZXJ2YWw9MTAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLm1pbkRyYWdEaXN0YW5jZT0xMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljcy5taW5Cb3VuY2VCYWNrQW5nbGU9MV1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gW29wdGlvbnMuZHJhZ1NvcnRQcmVkaWNhdGVdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZS50aHJlc2hvbGQ9NTBdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZS5hY3Rpb249XCJtb3ZlXCJdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnUmVsZWFzZUR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdSZWxlYXNlRWFzaW5nPVwiZWFzZVwiXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ0Nzc1Byb3BzXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5lbmFibGVkPWZhbHNlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5lYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudD1udWxsXVxuICAgKiBAcGFyYW0gez9GdW5jdGlvbn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLm9uQ3JlYXRlPW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmU9bnVsbF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnRhaW5lckNsYXNzPVwibXV1cmlcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1DbGFzcz1cIm11dXJpLWl0ZW1cIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1WaXNpYmxlQ2xhc3M9XCJtdXVyaS1pdGVtLXZpc2libGVcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1IaWRkZW5DbGFzcz1cIm11dXJpLWl0ZW0taGlkZGVuXCJdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pdGVtUG9zaXRpb25pbmdDbGFzcz1cIm11dXJpLWl0ZW0tcG9zaXRpb25pbmdcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1EcmFnZ2luZ0NsYXNzPVwibXV1cmktaXRlbS1kcmFnZ2luZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVJlbGVhc2luZ0NsYXNzPVwibXV1cmktaXRlbS1yZWxlYXNpbmdcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1QbGFjZWhvbGRlckNsYXNzPVwibXV1cmktaXRlbS1wbGFjZWhvbGRlclwiXVxuICAgKi9cblxuICBmdW5jdGlvbiBHcmlkKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXM7XG4gICAgdmFyIHNldHRpbmdzO1xuICAgIHZhciBpdGVtcztcbiAgICB2YXIgbGF5b3V0T25SZXNpemU7XG5cbiAgICAvLyBBbGxvdyBwYXNzaW5nIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nLiBTdG9yZSBlbGVtZW50IGZvciBpbnN0YW5jZS5cbiAgICBlbGVtZW50ID0gdGhpcy5fZWxlbWVudCA9XG4gICAgICB0eXBlb2YgZWxlbWVudCA9PT0gc3RyaW5nVHlwZSA/IHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpIDogZWxlbWVudDtcblxuICAgIC8vIFRocm93IGFuIGVycm9yIGlmIHRoZSBjb250YWluZXIgZWxlbWVudCBpcyBub3QgYm9keSBlbGVtZW50IG9yIGRvZXMgbm90XG4gICAgLy8gZXhpc3Qgd2l0aGluIHRoZSBib2R5IGVsZW1lbnQuXG4gICAgdmFyIGlzRWxlbWVudEluRG9tID0gZWxlbWVudC5nZXRSb290Tm9kZVxuICAgICAgPyBlbGVtZW50LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IHRydWUgfSkgPT09IGRvY3VtZW50XG4gICAgICA6IHdpbmRvdy5kb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsZW1lbnQpO1xuICAgIGlmICghaXNFbGVtZW50SW5Eb20gfHwgZWxlbWVudCA9PT0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250YWluZXIgZWxlbWVudCBtdXN0IGJlIGFuIGV4aXN0aW5nIERPTSBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGluc3RhbmNlIHNldHRpbmdzIGJ5IG1lcmdpbmcgdGhlIG9wdGlvbnMgd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gICAgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncyA9IG1lcmdlU2V0dGluZ3MoR3JpZC5kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAvLyBTYW5pdGl6ZSBkcmFnU29ydCBzZXR0aW5nLlxuICAgIGlmICghaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU29ydCkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdTb3J0ID0gISFzZXR0aW5ncy5kcmFnU29ydDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2UgaWQgYW5kIHN0b3JlIGl0IHRvIHRoZSBncmlkIGluc3RhbmNlcyBjb2xsZWN0aW9uLlxuICAgIHRoaXMuX2lkID0gY3JlYXRlVWlkKCk7XG4gICAgZ3JpZEluc3RhbmNlc1t0aGlzLl9pZF0gPSBpbnN0O1xuXG4gICAgLy8gRGVzdHJveWVkIGZsYWcuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRoZSBsYXlvdXQgb2JqZWN0IChtdXRhdGVkIG9uIGV2ZXJ5IGxheW91dCkuXG4gICAgdGhpcy5fbGF5b3V0ID0ge1xuICAgICAgaWQ6IDAsXG4gICAgICBpdGVtczogW10sXG4gICAgICBzbG90czogW10sXG4gICAgICBzZXRXaWR0aDogZmFsc2UsXG4gICAgICBzZXRIZWlnaHQ6IGZhbHNlLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIHByaXZhdGUgRW1pdHRlciBpbnN0YW5jZS5cbiAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTtcblxuICAgIC8vIEFkZCBjb250YWluZXIgZWxlbWVudCdzIGNsYXNzIG5hbWUuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY29udGFpbmVyQ2xhc3MpO1xuXG4gICAgLy8gQ3JlYXRlIGluaXRpYWwgaXRlbXMuXG4gICAgdGhpcy5faXRlbXMgPSBbXTtcbiAgICBpdGVtcyA9IHNldHRpbmdzLml0ZW1zO1xuICAgIGlmICh0eXBlb2YgaXRlbXMgPT09IHN0cmluZ1R5cGUpIHtcbiAgICAgIHRvQXJyYXkoZWxlbWVudC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihpdGVtRWxlbWVudCkge1xuICAgICAgICBpZiAoaXRlbXMgPT09ICcqJyB8fCBlbGVtZW50TWF0Y2hlcyhpdGVtRWxlbWVudCwgaXRlbXMpKSB7XG4gICAgICAgICAgaW5zdC5faXRlbXMucHVzaChuZXcgSXRlbShpbnN0LCBpdGVtRWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpIHx8IGlzTm9kZUxpc3QoaXRlbXMpKSB7XG4gICAgICB0aGlzLl9pdGVtcyA9IHRvQXJyYXkoaXRlbXMpLm1hcChmdW5jdGlvbihpdGVtRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEl0ZW0oaW5zdCwgaXRlbUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbGF5b3V0T25SZXNpemUgb3B0aW9uIGlzIGEgdmFsaWQgbnVtYmVyIHNhbml0aXplIGl0IGFuZCBiaW5kIHRoZSByZXNpemVcbiAgICAvLyBoYW5kbGVyLlxuICAgIGxheW91dE9uUmVzaXplID0gc2V0dGluZ3MubGF5b3V0T25SZXNpemU7XG4gICAgaWYgKHR5cGVvZiBsYXlvdXRPblJlc2l6ZSAhPT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICBsYXlvdXRPblJlc2l6ZSA9IGxheW91dE9uUmVzaXplID09PSB0cnVlID8gMCA6IC0xO1xuICAgIH1cbiAgICBpZiAobGF5b3V0T25SZXNpemUgPj0gMCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdyZXNpemUnLFxuICAgICAgICAoaW5zdC5fcmVzaXplSGFuZGxlciA9IGRlYm91bmNlKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGluc3QucmVmcmVzaEl0ZW1zKCkubGF5b3V0KCk7XG4gICAgICAgIH0sIGxheW91dE9uUmVzaXplKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTGF5b3V0IG9uIGluaXQgaWYgbmVjZXNzYXJ5LlxuICAgIGlmIChzZXR0aW5ncy5sYXlvdXRPbkluaXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvcGVydGllc1xuICAgKiAqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQHNlZSBJdGVtXG4gICAqL1xuICBHcmlkLkl0ZW0gPSBJdGVtO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1MYXlvdXRcbiAgICovXG4gIEdyaWQuSXRlbUxheW91dCA9IEl0ZW1MYXlvdXQ7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbVZpc2liaWxpdHlcbiAgICovXG4gIEdyaWQuSXRlbVZpc2liaWxpdHkgPSBJdGVtVmlzaWJpbGl0eTtcblxuICAvKipcbiAgICogQHNlZSBJdGVtTWlncmF0ZVxuICAgKi9cbiAgR3JpZC5JdGVtTWlncmF0ZSA9IEl0ZW1NaWdyYXRlO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1BbmltYXRlXG4gICAqL1xuICBHcmlkLkl0ZW1BbmltYXRlID0gSXRlbUFuaW1hdGU7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbURyYWdcbiAgICovXG4gIEdyaWQuSXRlbURyYWcgPSBJdGVtRHJhZztcblxuICAvKipcbiAgICogQHNlZSBJdGVtUmVsZWFzZVxuICAgKi9cbiAgR3JpZC5JdGVtUmVsZWFzZSA9IEl0ZW1SZWxlYXNlO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1EcmFnUGxhY2Vob2xkZXJcbiAgICovXG4gIEdyaWQuSXRlbURyYWdQbGFjZWhvbGRlciA9IEl0ZW1EcmFnUGxhY2Vob2xkZXI7XG5cbiAgLyoqXG4gICAqIEBzZWUgRW1pdHRlclxuICAgKi9cbiAgR3JpZC5FbWl0dGVyID0gRW1pdHRlcjtcblxuICAvKipcbiAgICogQHNlZSBEcmFnZ2VyXG4gICAqL1xuICBHcmlkLkRyYWdnZXIgPSBEcmFnZ2VyO1xuXG4gIC8qKlxuICAgKiBAc2VlIFBhY2tlclxuICAgKi9cbiAgR3JpZC5QYWNrZXIgPSBQYWNrZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgb3B0aW9ucyBmb3IgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZFxuICAgKi9cbiAgR3JpZC5kZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAvLyBJdGVtIGVsZW1lbnRzXG4gICAgaXRlbXM6ICcqJyxcblxuICAgIC8vIERlZmF1bHQgc2hvdyBhbmltYXRpb25cbiAgICBzaG93RHVyYXRpb246IDMwMCxcbiAgICBzaG93RWFzaW5nOiAnZWFzZScsXG5cbiAgICAvLyBEZWZhdWx0IGhpZGUgYW5pbWF0aW9uXG4gICAgaGlkZUR1cmF0aW9uOiAzMDAsXG4gICAgaGlkZUVhc2luZzogJ2Vhc2UnLFxuXG4gICAgLy8gSXRlbSdzIHZpc2libGUvaGlkZGVuIHN0YXRlIHN0eWxlc1xuICAgIHZpc2libGVTdHlsZXM6IHtcbiAgICAgIG9wYWNpdHk6ICcxJyxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICAgIH0sXG4gICAgaGlkZGVuU3R5bGVzOiB7XG4gICAgICBvcGFjaXR5OiAnMCcsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjUpJ1xuICAgIH0sXG5cbiAgICAvLyBMYXlvdXRcbiAgICBsYXlvdXQ6IHtcbiAgICAgIGZpbGxHYXBzOiBmYWxzZSxcbiAgICAgIGhvcml6b250YWw6IGZhbHNlLFxuICAgICAgYWxpZ25SaWdodDogZmFsc2UsXG4gICAgICBhbGlnbkJvdHRvbTogZmFsc2UsXG4gICAgICByb3VuZGluZzogdHJ1ZVxuICAgIH0sXG4gICAgbGF5b3V0T25SZXNpemU6IDEwMCxcbiAgICBsYXlvdXRPbkluaXQ6IHRydWUsXG4gICAgbGF5b3V0RHVyYXRpb246IDMwMCxcbiAgICBsYXlvdXRFYXNpbmc6ICdlYXNlJyxcblxuICAgIC8vIFNvcnRpbmdcbiAgICBzb3J0RGF0YTogbnVsbCxcblxuICAgIC8vIERyYWcgJiBEcm9wXG4gICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxuICAgIGRyYWdDb250YWluZXI6IG51bGwsXG4gICAgZHJhZ1N0YXJ0UHJlZGljYXRlOiB7XG4gICAgICBkaXN0YW5jZTogMCxcbiAgICAgIGRlbGF5OiAwLFxuICAgICAgaGFuZGxlOiBmYWxzZVxuICAgIH0sXG4gICAgZHJhZ0F4aXM6IG51bGwsXG4gICAgZHJhZ1NvcnQ6IHRydWUsXG4gICAgZHJhZ1NvcnRIZXVyaXN0aWNzOiB7XG4gICAgICBzb3J0SW50ZXJ2YWw6IDEwMCxcbiAgICAgIG1pbkRyYWdEaXN0YW5jZTogMTAsXG4gICAgICBtaW5Cb3VuY2VCYWNrQW5nbGU6IDFcbiAgICB9LFxuICAgIGRyYWdTb3J0UHJlZGljYXRlOiB7XG4gICAgICB0aHJlc2hvbGQ6IDUwLFxuICAgICAgYWN0aW9uOiBhY3Rpb25Nb3ZlXG4gICAgfSxcbiAgICBkcmFnUmVsZWFzZUR1cmF0aW9uOiAzMDAsXG4gICAgZHJhZ1JlbGVhc2VFYXNpbmc6ICdlYXNlJyxcbiAgICBkcmFnQ3NzUHJvcHM6IHtcbiAgICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICB1c2VyRHJhZzogJ25vbmUnLFxuICAgICAgdGFwSGlnaGxpZ2h0Q29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJyxcbiAgICAgIHRvdWNoQ2FsbG91dDogJ25vbmUnLFxuICAgICAgY29udGVudFpvb21pbmc6ICdub25lJ1xuICAgIH0sXG4gICAgZHJhZ1BsYWNlaG9sZGVyOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICBlYXNpbmc6ICdlYXNlJyxcbiAgICAgIGNyZWF0ZUVsZW1lbnQ6IG51bGwsXG4gICAgICBvbkNyZWF0ZTogbnVsbCxcbiAgICAgIG9uUmVtb3ZlOiBudWxsXG4gICAgfSxcblxuICAgIC8vIENsYXNzbmFtZXNcbiAgICBjb250YWluZXJDbGFzczogJ211dXJpJyxcbiAgICBpdGVtQ2xhc3M6ICdtdXVyaS1pdGVtJyxcbiAgICBpdGVtVmlzaWJsZUNsYXNzOiAnbXV1cmktaXRlbS1zaG93bicsXG4gICAgaXRlbUhpZGRlbkNsYXNzOiAnbXV1cmktaXRlbS1oaWRkZW4nLFxuICAgIGl0ZW1Qb3NpdGlvbmluZ0NsYXNzOiAnbXV1cmktaXRlbS1wb3NpdGlvbmluZycsXG4gICAgaXRlbURyYWdnaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLWRyYWdnaW5nJyxcbiAgICBpdGVtUmVsZWFzaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLXJlbGVhc2luZycsXG4gICAgaXRlbVBsYWNlaG9sZGVyQ2xhc3M6ICdtdXVyaS1pdGVtLXBsYWNlaG9sZGVyJ1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBCaW5kIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVW5iaW5kIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9mZihldmVudCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgaXRlbXMuIE9wdGlvbmFsbHkgeW91IGNhbiBwcm92aWRlIHNwZWNpZmljIHRhcmdldHMgKGVsZW1lbnRzIGFuZFxuICAgKiBpbmRpY2VzKS4gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBhcnJheSBpcyBub3QgdGhlIHNhbWUgb2JqZWN0IHVzZWQgYnkgdGhlXG4gICAqIGluc3RhbmNlIHNvIG1vZGlmeWluZyBpdCB3aWxsIG5vdCBhZmZlY3QgaW5zdGFuY2UncyBpdGVtcy4gQWxsIGl0ZW1zIHRoYXRcbiAgICogYXJlIG5vdCBmb3VuZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXR1cm5lZCBhcnJheS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IFt0YXJnZXRzXVxuICAgKiBAcmV0dXJucyB7SXRlbVtdfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuZ2V0SXRlbXMgPSBmdW5jdGlvbih0YXJnZXRzKSB7XG4gICAgLy8gUmV0dXJuIGFsbCBpdGVtcyBpbW1lZGlhdGVseSBpZiBubyB0YXJnZXRzIHdlcmUgcHJvdmlkZWQgb3IgaWYgdGhlXG4gICAgLy8gaW5zdGFuY2UgaXMgZGVzdHJveWVkLlxuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAoIXRhcmdldHMgJiYgdGFyZ2V0cyAhPT0gMCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5zbGljZSgwKTtcbiAgICB9XG5cbiAgICB2YXIgcmV0ID0gW107XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdG9BcnJheSh0YXJnZXRzKTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHRhcmdldCBpdGVtcyBhcmUgZGVmaW5lZCByZXR1cm4gZmlsdGVyZWQgcmVzdWx0cy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSB0aGlzLl9nZXRJdGVtKHRhcmdldEl0ZW1zW2ldKTtcbiAgICAgIGl0ZW0gJiYgcmV0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBjYWNoZWQgZGltZW5zaW9ucyBvZiB0aGUgaW5zdGFuY2UncyBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IFtpdGVtc11cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5yZWZyZXNoSXRlbXMgPSBmdW5jdGlvbihpdGVtcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgdGFyZ2V0cyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRhcmdldHNbaV0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc29ydCBkYXRhIG9mIHRoZSBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW2l0ZW1zXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlZnJlc2hTb3J0RGF0YSA9IGZ1bmN0aW9uKGl0ZW1zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0YXJnZXRJdGVtc1tpXS5fcmVmcmVzaFNvcnREYXRhKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplIHRoZSBpdGVtIGVsZW1lbnRzIHRvIG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgaXRlbXMgaW4gdGhlIERPTS5cbiAgICogVGhpcyBjb21lcyBoYW5keSBpZiB5b3UgbmVlZCB0byBrZWVwIHRoZSBET00gc3RydWN0dXJlIG1hdGNoZWQgd2l0aCB0aGVcbiAgICogb3JkZXIgb2YgdGhlIGl0ZW1zLiBOb3RlIHRoYXQgaWYgYW4gaXRlbSdzIGVsZW1lbnQgaXMgbm90IGN1cnJlbnRseSBhIGNoaWxkXG4gICAqIG9mIHRoZSBjb250YWluZXIgZWxlbWVudCAoaWYgaXQgaXMgZHJhZ2dlZCBmb3IgZXhhbXBsZSkgaXQgaXMgaWdub3JlZCBhbmRcbiAgICogbGVmdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuc3luY2hyb25pemUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIGZyYWdtZW50O1xuICAgIHZhciBlbGVtZW50O1xuICAgIHZhciBpO1xuXG4gICAgLy8gQXBwZW5kIGFsbCBlbGVtZW50cyBpbiBvcmRlciB0byB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsZW1lbnQgPSBpdGVtc1tpXS5fZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSA9PT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudCB8fCB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmcmFnbWVudCkgY29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHN5bmNocm9uaXplIGV2ZW50LlxuICAgIHRoaXMuX2VtaXQoZXZlbnRTeW5jaHJvbml6ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCBhcHBseSBpdGVtIHBvc2l0aW9ucy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtMYXlvdXRDYWxsYmFja30gW29uRmluaXNoXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpbnN0ID0gdGhpcztcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX3VwZGF0ZUxheW91dCgpO1xuICAgIHZhciBsYXlvdXRJZCA9IGxheW91dC5pZDtcbiAgICB2YXIgaXRlbXNMZW5ndGggPSBsYXlvdXQuaXRlbXMubGVuZ3RoO1xuICAgIHZhciBjb3VudGVyID0gaXRlbXNMZW5ndGg7XG4gICAgdmFyIGlzQm9yZGVyQm94O1xuICAgIHZhciBpdGVtO1xuICAgIHZhciBpO1xuXG4gICAgLy8gVGhlIGZpbmlzaCBmdW5jdGlvbiwgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBjaGVja2luZyBpZiBhbGwgdGhlIGl0ZW1zXG4gICAgLy8gaGF2ZSBsYWlkIG91dCB5ZXQuIEFmdGVyIGFsbCBpdGVtcyBoYXZlIGZpbmlzaGVkIHRoZWlyIGFuaW1hdGlvbnMgY2FsbFxuICAgIC8vIGNhbGxiYWNrIGFuZCBlbWl0IGxheW91dEVuZCBldmVudC4gT25seSBlbWl0IGxheW91dEVuZCBldmVudCBpZiB0aGVyZVxuICAgIC8vIGhhc24ndCBiZWVuIGEgbmV3IGxheW91dCBjYWxsIGR1cmluZyB0aGlzIGxheW91dC5cbiAgICBmdW5jdGlvbiB0cnlGaW5pc2goKSB7XG4gICAgICBpZiAoLS1jb3VudGVyID4gMCkgcmV0dXJuO1xuXG4gICAgICB2YXIgaGFzTGF5b3V0Q2hhbmdlZCA9IGluc3QuX2xheW91dC5pZCAhPT0gbGF5b3V0SWQ7XG4gICAgICB2YXIgY2FsbGJhY2sgPSBpc0Z1bmN0aW9uKGluc3RhbnQpID8gaW5zdGFudCA6IG9uRmluaXNoO1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgICAgY2FsbGJhY2soaGFzTGF5b3V0Q2hhbmdlZCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFoYXNMYXlvdXRDaGFuZ2VkICYmIGluc3QuX2hhc0xpc3RlbmVycyhldmVudExheW91dEVuZCkpIHtcbiAgICAgICAgaW5zdC5fZW1pdChldmVudExheW91dEVuZCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBncmlkJ3Mgd2lkdGggb3IgaGVpZ2h0IHdhcyBtb2RpZmllZCwgd2UgbmVlZCB0byB1cGRhdGUgaXQncyBjYWNoZWRcbiAgICAvLyBkaW1lbnNpb25zLiBBbHNvIGtlZXAgaW4gbWluZCB0aGF0IGdyaWQncyBjYWNoZWQgd2lkdGgvaGVpZ2h0IHNob3VsZFxuICAgIC8vIGFsd2F5cyBlcXVhbCB0byB3aGF0IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgd291bGQgcmV0dXJuLCBzb1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGFkZCB0aGUgZ3JpZCBlbGVtZW50J3MgYm9yZGVycyB0byB0aGUgZGltZW5zaW9ucyBpZlxuICAgIC8vIGl0J3MgYm94LXNpemluZyBpcyBib3JkZXItYm94LiBOb3RlIHRoYXQgd2Ugc3VwcG9ydCBwcm92aWRpbmcgdGhlXG4gICAgLy8gZGltZW5zaW9ucyBhcyBhIHN0cmluZyBoZXJlIHRvbyBzbyB0aGF0IG9uZSBjYW4gZGVmaW5lIHRoZSB1bml0IG9mIHRoZVxuICAgIC8vIGRpbWVuc2lvbnMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgZG8gdGhlIGJvcmRlci1ib3ggY2hlY2suXG4gICAgaWYgKFxuICAgICAgKGxheW91dC5zZXRIZWlnaHQgJiYgdHlwZW9mIGxheW91dC5oZWlnaHQgPT09IG51bWJlclR5cGUkMSkgfHxcbiAgICAgIChsYXlvdXQuc2V0V2lkdGggJiYgdHlwZW9mIGxheW91dC53aWR0aCA9PT0gbnVtYmVyVHlwZSQxKVxuICAgICkge1xuICAgICAgaXNCb3JkZXJCb3ggPSBnZXRTdHlsZShlbGVtZW50LCAnYm94LXNpemluZycpID09PSAnYm9yZGVyLWJveCc7XG4gICAgfVxuICAgIGlmIChsYXlvdXQuc2V0SGVpZ2h0KSB7XG4gICAgICBpZiAodHlwZW9mIGxheW91dC5oZWlnaHQgPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9XG4gICAgICAgICAgKGlzQm9yZGVyQm94ID8gbGF5b3V0LmhlaWdodCArIHRoaXMuX2JvcmRlclRvcCArIHRoaXMuX2JvcmRlckJvdHRvbSA6IGxheW91dC5oZWlnaHQpICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbGF5b3V0LmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxheW91dC5zZXRXaWR0aCkge1xuICAgICAgaWYgKHR5cGVvZiBsYXlvdXQud2lkdGggPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID1cbiAgICAgICAgICAoaXNCb3JkZXJCb3ggPyBsYXlvdXQud2lkdGggKyB0aGlzLl9ib3JkZXJMZWZ0ICsgdGhpcy5fYm9yZGVyUmlnaHQgOiBsYXlvdXQud2lkdGgpICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBsYXlvdXQud2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1pdCBsYXlvdXRTdGFydCBldmVudC4gTm90ZSB0aGF0IHRoaXMgaXMgaW50ZW50aW9uYWxseSBlbWl0dGVkIGFmdGVyIHRoZVxuICAgIC8vIGNvbnRhaW5lciBlbGVtZW50J3MgZGltZW5zaW9ucyBhcmUgc2V0LCBiZWNhdXNlIG90aGVyd2lzZSB0aGVyZSB3b3VsZCBiZVxuICAgIC8vIG5vIGhvb2sgZm9yIHJlYWN0aW5nIHRvIGNvbnRhaW5lciBkaW1lbnNpb24gY2hhbmdlcy5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50TGF5b3V0U3RhcnQpKSB7XG4gICAgICB0aGlzLl9lbWl0KGV2ZW50TGF5b3V0U3RhcnQsIGxheW91dC5pdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGxldCdzIGZpbmlzaCBxdWlja2x5LlxuICAgIGlmICghaXRlbXNMZW5ndGgpIHtcbiAgICAgIHRyeUZpbmlzaCgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGl0ZW1zIGxldCdzIHBvc2l0aW9uIHRoZW0uXG4gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zTGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBsYXlvdXQuaXRlbXNbaV07XG4gICAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbSdzIHBvc2l0aW9uLlxuICAgICAgaXRlbS5fbGVmdCA9IGxheW91dC5zbG90c1tpICogMl07XG4gICAgICBpdGVtLl90b3AgPSBsYXlvdXQuc2xvdHNbaSAqIDIgKyAxXTtcblxuICAgICAgLy8gTGF5b3V0IGl0ZW0gaWYgaXQgaXMgbm90IGRyYWdnZWQuXG4gICAgICBpdGVtLmlzRHJhZ2dpbmcoKSA/IHRyeUZpbmlzaCgpIDogaXRlbS5fbGF5b3V0LnN0YXJ0KGluc3RhbnQgPT09IHRydWUsIHRyeUZpbmlzaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBuZXcgaXRlbXMgYnkgcHJvdmlkaW5nIHRoZSBlbGVtZW50cyB5b3Ugd2lzaCB0byBhZGQgdG8gdGhlIGluc3RhbmNlIGFuZFxuICAgKiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlIGluZGV4IHdoZXJlIHlvdSB3YW50IHRoZSBpdGVtcyB0byBiZSBpbnNlcnRlZCBpbnRvLlxuICAgKiBBbGwgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFscmVhZHkgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50IHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgY29udGFpbmVyIGVsZW1lbnQuIElmIGFuIGVsZW1lbnQgaGFzIGl0J3MgQ1NTXG4gICAqIGRpc3BsYXkgcHJvcGVydHkgc2V0IHRvIFwibm9uZVwiIGl0IHdpbGwgYmUgbWFya2VkIGFzIGluYWN0aXZlIGR1cmluZyB0aGVcbiAgICogaW5pdGlhdGlvbiBwcm9jZXNzLiBBcyBsb25nIGFzIHRoZSBpdGVtIGlzIGluYWN0aXZlIGl0IHdpbGwgbm90IGJlIHBhcnQgb2ZcbiAgICogdGhlIGxheW91dCwgYnV0IGl0IHdpbGwgcmV0YWluIGl0J3MgaW5kZXguIFlvdSBjYW4gYWN0aXZhdGUgaXRlbXMgYXQgYW55XG4gICAqIHBvaW50IHdpdGggZ3JpZC5zaG93KCkgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbFxuICAgKiBncmlkLmxheW91dCgpIGlmIG9uZSBvciBtb3JlIG9mIHRoZSBhZGRlZCBlbGVtZW50cyBhcmUgdmlzaWJsZS4gSWYgb25seVxuICAgKiBoaWRkZW4gaXRlbXMgYXJlIGFkZGVkIG5vIGxheW91dCB3aWxsIGJlIGNhbGxlZC4gQWxsIHRoZSBuZXcgdmlzaWJsZSBpdGVtc1xuICAgKiBhcmUgcG9zaXRpb25lZCB3aXRob3V0IGFuaW1hdGlvbiBkdXJpbmcgdGhlaXIgZmlyc3QgbGF5b3V0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxIVE1MRWxlbWVudFtdKX0gZWxlbWVudHNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW5kZXg9LTFdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaXNBY3RpdmVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhZWxlbWVudHMpIHJldHVybiBbXTtcblxuICAgIHZhciBuZXdJdGVtcyA9IHRvQXJyYXkoZWxlbWVudHMpO1xuICAgIGlmICghbmV3SXRlbXMubGVuZ3RoKSByZXR1cm4gbmV3SXRlbXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBNYXAgcHJvdmlkZWQgZWxlbWVudHMgaW50byBuZXcgZ3JpZCBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbmV3SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBuZXcgSXRlbSh0aGlzLCBuZXdJdGVtc1tpXSwgb3B0cy5pc0FjdGl2ZSk7XG4gICAgICBuZXdJdGVtc1tpXSA9IGl0ZW07XG5cbiAgICAgIC8vIElmIHRoZSBpdGVtIHRvIGJlIGFkZGVkIGlzIGFjdGl2ZSwgd2UgbmVlZCB0byBkbyBhIGxheW91dC4gQWxzbywgd2VcbiAgICAgIC8vIG5lZWQgdG8gbWFyayB0aGUgaXRlbSB3aXRoIHRoZSBza2lwTmV4dEFuaW1hdGlvbiBmbGFnIHRvIG1ha2UgaXRcbiAgICAgIC8vIHBvc2l0aW9uIGluc3RhbnRseSAod2l0aG91dCBhbmltYXRpb24pIGR1cmluZyB0aGUgbmV4dCBsYXlvdXQuIFdpdGhvdXRcbiAgICAgIC8vIHRoZSBoYWNrIHRoZSBpdGVtIHdvdWxkIGFuaW1hdGUgdG8gaXQncyBuZXcgcG9zaXRpb24gZnJvbSB0aGUgbm9ydGh3ZXN0XG4gICAgICAvLyBjb3JuZXIgb2YgdGhlIGdyaWQsIHdoaWNoIGZlZWxzIGEgYml0IGJ1Z2d5IChpbWhvKS5cbiAgICAgIGlmIChpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7XG4gICAgICAgIGl0ZW0uX2xheW91dC5fc2tpcE5leHRBbmltYXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgbmV3IGl0ZW1zIHRvIHRoZSBpdGVtcyBjb2xsZWN0aW9uIHRvIGNvcnJlY3QgaW5kZXguXG4gICAgYXJyYXlJbnNlcnQoaXRlbXMsIG5ld0l0ZW1zLCBvcHRzLmluZGV4KTtcblxuICAgIC8vIEVtaXQgYWRkIGV2ZW50LlxuICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRBZGQpKSB7XG4gICAgICB0aGlzLl9lbWl0KGV2ZW50QWRkLCBuZXdJdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbGF5b3V0IGlzIG5lZWRlZC5cbiAgICBpZiAobmVlZHNMYXlvdXQgJiYgbGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0l0ZW1zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgaXRlbXMgZnJvbSB0aGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVtb3ZlRWxlbWVudHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihpdGVtcywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGFsbEl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpbmRpY2VzID0gW107XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGluZGl2aWR1YWwgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gdGFyZ2V0SXRlbXNbaV07XG4gICAgICBpbmRpY2VzLnB1c2goYWxsSXRlbXMuaW5kZXhPZihpdGVtKSk7XG4gICAgICBpZiAoaXRlbS5faXNBY3RpdmUpIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgIGl0ZW0uX2Rlc3Ryb3kob3B0cy5yZW1vdmVFbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCByZW1vdmUgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudFJlbW92ZSkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRSZW1vdmUsIHRhcmdldEl0ZW1zLnNsaWNlKDApLCBpbmRpY2VzKTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgIGlmIChuZWVkc0xheW91dCAmJiBsYXlvdXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0SXRlbXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNob3cgaW5zdGFuY2UgaXRlbXMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtTaG93Q2FsbGJhY2t9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihpdGVtcywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5fc2V0SXRlbXNWaXNpYmlsaXR5KGl0ZW1zLCB0cnVlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogSGlkZSBpbnN0YW5jZSBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0hpZGVDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9zZXRJdGVtc1Zpc2liaWxpdHkoaXRlbXMsIGZhbHNlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRmlsdGVyIGl0ZW1zLiBFeHBlY3RzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCwgYSBwcmVkaWNhdGUsIHdoaWNoIHNob3VsZCBiZVxuICAgKiBlaXRoZXIgYSBmdW5jdGlvbiBvciBhIHN0cmluZy4gVGhlIHByZWRpY2F0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCBmb3IgZXZlcnlcbiAgICogaXRlbSBpbiB0aGUgaW5zdGFuY2UuIElmIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZWRpY2F0ZSBpcyB0cnV0aHkgdGhlXG4gICAqIGl0ZW0gaW4gcXVlc3Rpb24gd2lsbCBiZSBzaG93biBhbmQgb3RoZXJ3aXNlIGhpZGRlbi4gVGhlIHByZWRpY2F0ZSBjYWxsYmFja1xuICAgKiByZWNlaXZlcyB0aGUgaXRlbSBpbnN0YW5jZSBhcyBpdCdzIGFyZ3VtZW50LiBJZiB0aGUgcHJlZGljYXRlIGlzIGEgc3RyaW5nXG4gICAqIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzZWxlY3RvciBhbmQgaXQgaXMgY2hlY2tlZCBhZ2FpbnN0IGV2ZXJ5IGl0ZW1cbiAgICogZWxlbWVudCBpbiB0aGUgaW5zdGFuY2Ugd2l0aCB0aGUgbmF0aXZlIGVsZW1lbnQubWF0Y2hlcygpIG1ldGhvZC4gQWxsIHRoZVxuICAgKiBtYXRjaGluZyBpdGVtcyB3aWxsIGJlIHNob3duIGFuZCBvdGhlcnMgaGlkZGVuLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxTdHJpbmcpfSBwcmVkaWNhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7RmlsdGVyQ2FsbGJhY2t9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uKHByZWRpY2F0ZSwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXRlbXMubGVuZ3RoKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtc1RvU2hvdyA9IFtdO1xuICAgIHZhciBpdGVtc1RvSGlkZSA9IFtdO1xuICAgIHZhciBpc1ByZWRpY2F0ZVN0cmluZyA9IHR5cGVvZiBwcmVkaWNhdGUgPT09IHN0cmluZ1R5cGU7XG4gICAgdmFyIGlzUHJlZGljYXRlRm4gPSBpc0Z1bmN0aW9uKHByZWRpY2F0ZSk7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGlzSW5zdGFudCA9IG9wdHMuaW5zdGFudCA9PT0gdHJ1ZTtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIG9uRmluaXNoID0gaXNGdW5jdGlvbihvcHRzLm9uRmluaXNoKSA/IG9wdHMub25GaW5pc2ggOiBudWxsO1xuICAgIHZhciB0cnlGaW5pc2hDb3VudGVyID0gLTE7XG4gICAgdmFyIHRyeUZpbmlzaCA9IG5vb3A7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG9uRmluaXNoIGNhbGxiYWNrLCBsZXQncyBjcmVhdGUgcHJvcGVyIHRyeUZpbmlzaCBjYWxsYmFjay5cbiAgICBpZiAob25GaW5pc2gpIHtcbiAgICAgIHRyeUZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICArK3RyeUZpbmlzaENvdW50ZXIgJiYgb25GaW5pc2goaXRlbXNUb1Nob3cuc2xpY2UoMCksIGl0ZW1zVG9IaWRlLnNsaWNlKDApKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2hpY2ggaXRlbXMgbmVlZCB0byBiZSBzaG93biBhbmQgd2hpY2ggaGlkZGVuLlxuICAgIGlmIChpc1ByZWRpY2F0ZUZuIHx8IGlzUHJlZGljYXRlU3RyaW5nKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlbSA9IHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgICBpZiAoaXNQcmVkaWNhdGVGbiA/IHByZWRpY2F0ZShpdGVtKSA6IGVsZW1lbnRNYXRjaGVzKGl0ZW0uX2VsZW1lbnQsIHByZWRpY2F0ZSkpIHtcbiAgICAgICAgICBpdGVtc1RvU2hvdy5wdXNoKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1zVG9IaWRlLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaG93IGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBzaG93bi5cbiAgICBpZiAoaXRlbXNUb1Nob3cubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3coaXRlbXNUb1Nob3csIHtcbiAgICAgICAgaW5zdGFudDogaXNJbnN0YW50LFxuICAgICAgICBvbkZpbmlzaDogdHJ5RmluaXNoLFxuICAgICAgICBsYXlvdXQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5RmluaXNoKCk7XG4gICAgfVxuXG4gICAgLy8gSGlkZSBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgaGlkZGVuLlxuICAgIGlmIChpdGVtc1RvSGlkZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaGlkZShpdGVtc1RvSGlkZSwge1xuICAgICAgICBpbnN0YW50OiBpc0luc3RhbnQsXG4gICAgICAgIG9uRmluaXNoOiB0cnlGaW5pc2gsXG4gICAgICAgIGxheW91dDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnlGaW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGl0ZW1zIHRvIGZpbHRlci5cbiAgICBpZiAoaXRlbXNUb1Nob3cubGVuZ3RoIHx8IGl0ZW1zVG9IaWRlLmxlbmd0aCkge1xuICAgICAgLy8gRW1pdCBmaWx0ZXIgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50RmlsdGVyKSkge1xuICAgICAgICB0aGlzLl9lbWl0KGV2ZW50RmlsdGVyLCBpdGVtc1RvU2hvdy5zbGljZSgwKSwgaXRlbXNUb0hpZGUuc2xpY2UoMCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNvcnQgaXRlbXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIHNvcnQgdGhlIGl0ZW1zLiBUaGUgZmlyc3QgaXMgc2ltcGx5IGJ5XG4gICAqIHByb3ZpZGluZyBhIGZ1bmN0aW9uIGFzIHRoZSBjb21wYXJlciB3aGljaCB3b3JrcyBpZGVudGljYWxseSB0byBuYXRpdmVcbiAgICogYXJyYXkgc29ydC4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNvcnQgYnkgdGhlIHNvcnQgZGF0YSB5b3UgaGF2ZSBwcm92aWRlZFxuICAgKiBpbiB0aGUgaW5zdGFuY2UncyBvcHRpb25zLiBKdXN0IHByb3ZpZGUgdGhlIHNvcnQgZGF0YSBrZXkocykgYXMgYSBzdHJpbmdcbiAgICogKHNlcGFyYXRlZCBieSBzcGFjZSkgYW5kIHRoZSBpdGVtcyB3aWxsIGJlIHNvcnRlZCBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAgICogc29ydCBkYXRhIGtleXMuIExhc3RseSB5b3UgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8gcHJvdmlkZSBhIHByZXNvcnRlZFxuICAgKiBhcnJheSBvZiBpdGVtcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc3luYyB0aGUgaW50ZXJuYWwgaXRlbXMgYXJyYXkgaW4gdGhlXG4gICAqIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufEl0ZW1bXXxTdHJpbmd8U3RyaW5nW10pfSBjb21wYXJlclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGVzY2VuZGluZz1mYWxzZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zb3J0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3J0Q29tcGFyZXI7XG4gICAgdmFyIGlzRGVzY2VuZGluZztcbiAgICB2YXIgb3JpZ0l0ZW1zO1xuICAgIHZhciBpbmRleE1hcDtcblxuICAgIGZ1bmN0aW9uIHBhcnNlQ3JpdGVyaWEoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuc3BsaXQoJyAnKVxuICAgICAgICAubWFwKGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWwuc3BsaXQoJzonKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SW5kZXhNYXAoaXRlbXMpIHtcbiAgICAgIHZhciByZXQgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0W2l0ZW1zW2ldLl9pZF0gPSBpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wYXJlSW5kaWNlcyhpdGVtQSwgaXRlbUIpIHtcbiAgICAgIHZhciBpbmRleEEgPSBpbmRleE1hcFtpdGVtQS5faWRdO1xuICAgICAgdmFyIGluZGV4QiA9IGluZGV4TWFwW2l0ZW1CLl9pZF07XG4gICAgICByZXR1cm4gaXNEZXNjZW5kaW5nID8gaW5kZXhCIC0gaW5kZXhBIDogaW5kZXhBIC0gaW5kZXhCO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlcihhLCBiKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgIHZhciBjcml0ZXJpYU5hbWU7XG4gICAgICB2YXIgY3JpdGVyaWFPcmRlcjtcbiAgICAgIHZhciB2YWxBO1xuICAgICAgdmFyIHZhbEI7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBzb3J0IGNyaXRlcmlhLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0Q29tcGFyZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBjcml0ZXJpYSBuYW1lLCB3aGljaCBzaG91bGQgbWF0Y2ggYW4gaXRlbSdzIHNvcnQgZGF0YSBrZXkuXG4gICAgICAgIGNyaXRlcmlhTmFtZSA9IHNvcnRDb21wYXJlcltpXVswXTtcbiAgICAgICAgY3JpdGVyaWFPcmRlciA9IHNvcnRDb21wYXJlcltpXVsxXTtcblxuICAgICAgICAvLyBHZXQgaXRlbXMnIGNhY2hlZCBzb3J0IHZhbHVlcyBmb3IgdGhlIGNyaXRlcmlhLiBJZiB0aGUgaXRlbSBoYXMgbm8gc29ydFxuICAgICAgICAvLyBkYXRhIGxldCdzIHVwZGF0ZSB0aGUgaXRlbXMgc29ydCBkYXRhICh0aGlzIGlzIGEgbGF6eSBsb2FkIG1lY2hhbmlzbSkuXG4gICAgICAgIHZhbEEgPSAoYS5fc29ydERhdGEgPyBhIDogYS5fcmVmcmVzaFNvcnREYXRhKCkpLl9zb3J0RGF0YVtjcml0ZXJpYU5hbWVdO1xuICAgICAgICB2YWxCID0gKGIuX3NvcnREYXRhID8gYiA6IGIuX3JlZnJlc2hTb3J0RGF0YSgpKS5fc29ydERhdGFbY3JpdGVyaWFOYW1lXTtcblxuICAgICAgICAvLyBTb3J0IHRoZSBpdGVtcyBpbiBkZXNjZW5kaW5nIG9yZGVyIGlmIGRlZmluZWQgc28gZXhwbGljaXRseS4gT3RoZXJ3aXNlXG4gICAgICAgIC8vIHNvcnQgaXRlbXMgaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICBpZiAoY3JpdGVyaWFPcmRlciA9PT0gJ2Rlc2MnIHx8ICghY3JpdGVyaWFPcmRlciAmJiBpc0Rlc2NlbmRpbmcpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsQiA8IHZhbEEgPyAtMSA6IHZhbEIgPiB2YWxBID8gMSA6IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsQSA8IHZhbEIgPyAtMSA6IHZhbEEgPiB2YWxCID8gMSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIC0xIG9yIDEgYXMgdGhlIHJldHVybiB2YWx1ZSwgbGV0J3MgcmV0dXJuIGl0IGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB2YWx1ZXMgYXJlIGVxdWFsIGxldCdzIGNvbXBhcmUgdGhlIGl0ZW0gaW5kaWNlcyB0byBtYWtlIHN1cmUgd2VcbiAgICAgIC8vIGhhdmUgYSBzdGFibGUgc29ydC5cbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIGlmICghaW5kZXhNYXApIGluZGV4TWFwID0gZ2V0SW5kZXhNYXAob3JpZ0l0ZW1zKTtcbiAgICAgICAgcmVzdWx0ID0gY29tcGFyZUluZGljZXMoYSwgYik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1c3RvbUNvbXBhcmVyKGEsIGIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBzb3J0Q29tcGFyZXIoYSwgYik7XG4gICAgICAvLyBJZiBkZXNjZW5kaW5nIGxldCdzIGludmVydCB0aGUgcmVzdWx0IHZhbHVlLlxuICAgICAgaWYgKGlzRGVzY2VuZGluZyAmJiByZXN1bHQpIHJlc3VsdCA9IC1yZXN1bHQ7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVzdWx0IChub3QgemVybykgbGV0J3MgcmV0dXJuIGl0IHJpZ2h0IGF3YXkuXG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgLy8gSWYgcmVzdWx0IGlzIHplcm8gbGV0J3MgY29tcGFyZSB0aGUgaXRlbSBpbmRpY2VzIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGFcbiAgICAgIC8vIHN0YWJsZSBzb3J0LlxuICAgICAgaWYgKCFpbmRleE1hcCkgaW5kZXhNYXAgPSBnZXRJbmRleE1hcChvcmlnSXRlbXMpO1xuICAgICAgcmV0dXJuIGNvbXBhcmVJbmRpY2VzKGEsIGIpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihjb21wYXJlciwgb3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2l0ZW1zLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzO1xuXG4gICAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIFNldHVwIHBhcmVudCBzY29wZSBkYXRhLlxuICAgICAgc29ydENvbXBhcmVyID0gY29tcGFyZXI7XG4gICAgICBpc0Rlc2NlbmRpbmcgPSAhIW9wdHMuZGVzY2VuZGluZztcbiAgICAgIG9yaWdJdGVtcyA9IGl0ZW1zLnNsaWNlKDApO1xuICAgICAgaW5kZXhNYXAgPSBudWxsO1xuXG4gICAgICAvLyBJZiBmdW5jdGlvbiBpcyBwcm92aWRlZCBkbyBhIG5hdGl2ZSBhcnJheSBzb3J0LlxuICAgICAgaWYgKGlzRnVuY3Rpb24oc29ydENvbXBhcmVyKSkge1xuICAgICAgICBpdGVtcy5zb3J0KGN1c3RvbUNvbXBhcmVyKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBpZiB3ZSBnb3QgYSBzdHJpbmcsIGxldCdzIHNvcnQgYnkgdGhlIHNvcnQgZGF0YSBhcyBwcm92aWRlZCBpblxuICAgICAgLy8gdGhlIGluc3RhbmNlJ3Mgb3B0aW9ucy5cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzb3J0Q29tcGFyZXIgPT09IHN0cmluZ1R5cGUpIHtcbiAgICAgICAgc29ydENvbXBhcmVyID0gcGFyc2VDcml0ZXJpYShjb21wYXJlcik7XG4gICAgICAgIGl0ZW1zLnNvcnQoZGVmYXVsdENvbXBhcmVyKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBpZiB3ZSBnb3QgYW4gYXJyYXksIGxldCdzIGFzc3VtZSBpdCdzIGEgcHJlc29ydGVkIGFycmF5IG9mIHRoZVxuICAgICAgLy8gaXRlbXMgYW5kIG9yZGVyIHRoZSBpdGVtcyBiYXNlZCBvbiBpdC5cbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc29ydENvbXBhcmVyKSkge1xuICAgICAgICBpZiAoc29ydENvbXBhcmVyLmxlbmd0aCAhPT0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbJyArIG5hbWVzcGFjZSArICddIHNvcnQgcmVmZXJlbmNlIGl0ZW1zIGRvIG5vdCBtYXRjaCB3aXRoIGdyaWQgaXRlbXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHNvcnRDb21wYXJlci5pbmRleE9mKGl0ZW1zW2ldKSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWycgKyBuYW1lc3BhY2UgKyAnXSBzb3J0IHJlZmVyZW5jZSBpdGVtcyBkbyBub3QgbWF0Y2ggd2l0aCBncmlkIGl0ZW1zLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpdGVtc1tpXSA9IHNvcnRDb21wYXJlcltpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZXNjZW5kaW5nKSBpdGVtcy5yZXZlcnNlKCk7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UgbGV0J3MganVzdCBza2lwIGl0LCBub3RoaW5nIHdlIGNhbiBkbyBoZXJlLlxuICAgICAgZWxzZSB7XG4gICAgICAgIC8qKiBAdG9kbyBNYXliZSB0aHJvdyBhbiBlcnJvciBoZXJlPyAqL1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBzb3J0IGV2ZW50LlxuICAgICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudFNvcnQpKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoZXZlbnRTb3J0LCBpdGVtcy5zbGljZSgwKSwgb3JpZ0l0ZW1zKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbGF5b3V0IGlzIG5lZWRlZC5cbiAgICAgIGlmIChsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBNb3ZlIGl0ZW0gdG8gYW5vdGhlciBpbmRleCBvciBpbiBwbGFjZSBvZiBhbm90aGVyIGl0ZW0uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gaXRlbVxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFjdGlvbj1cIm1vdmVcIl1cbiAgICogICAtIEFjY2VwdHMgZWl0aGVyIFwibW92ZVwiIG9yIFwic3dhcFwiLlxuICAgKiAgIC0gXCJtb3ZlXCIgbW92ZXMgdGhlIGl0ZW0gaW4gcGxhY2Ugb2YgdGhlIG90aGVyIGl0ZW0uXG4gICAqICAgLSBcInN3YXBcIiBzd2FwcyB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW1zLlxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbihpdGVtLCBwb3NpdGlvbiwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pdGVtcy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1zO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXNTd2FwID0gb3B0cy5hY3Rpb24gPT09IGFjdGlvblN3YXA7XG4gICAgdmFyIGFjdGlvbiA9IGlzU3dhcCA/IGFjdGlvblN3YXAgOiBhY3Rpb25Nb3ZlO1xuICAgIHZhciBmcm9tSXRlbSA9IHRoaXMuX2dldEl0ZW0oaXRlbSk7XG4gICAgdmFyIHRvSXRlbSA9IHRoaXMuX2dldEl0ZW0ocG9zaXRpb24pO1xuICAgIHZhciBmcm9tSW5kZXg7XG4gICAgdmFyIHRvSW5kZXg7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGl0ZW1zIGV4aXN0IGFuZCBhcmUgbm90IHRoZSBzYW1lLlxuICAgIGlmIChmcm9tSXRlbSAmJiB0b0l0ZW0gJiYgZnJvbUl0ZW0gIT09IHRvSXRlbSkge1xuICAgICAgLy8gR2V0IHRoZSBpbmRpY2VzIG9mIHRoZSBpdGVtcy5cbiAgICAgIGZyb21JbmRleCA9IGl0ZW1zLmluZGV4T2YoZnJvbUl0ZW0pO1xuICAgICAgdG9JbmRleCA9IGl0ZW1zLmluZGV4T2YodG9JdGVtKTtcblxuICAgICAgLy8gRG8gdGhlIG1vdmUvc3dhcC5cbiAgICAgIGlmIChpc1N3YXApIHtcbiAgICAgICAgYXJyYXlTd2FwKGl0ZW1zLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlNb3ZlKGl0ZW1zLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IG1vdmUgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50TW92ZSkpIHtcbiAgICAgICAgdGhpcy5fZW1pdChldmVudE1vdmUsIHtcbiAgICAgICAgICBpdGVtOiBmcm9tSXRlbSxcbiAgICAgICAgICBmcm9tSW5kZXg6IGZyb21JbmRleCxcbiAgICAgICAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNlbmQgaXRlbSB0byBhbm90aGVyIEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gaXRlbVxuICAgKiBAcGFyYW0ge0dyaWR9IGdyaWRcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBwb3NpdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtvcHRpb25zLmFwcGVuZFRvPWRvY3VtZW50LmJvZHldXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0U2VuZGVyPXRydWVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0UmVjZWl2ZXI9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oaXRlbSwgZ3JpZCwgcG9zaXRpb24sIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgZ3JpZC5faXNEZXN0cm95ZWQgfHwgdGhpcyA9PT0gZ3JpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHRhcmdldCBpdGVtLlxuICAgIGl0ZW0gPSB0aGlzLl9nZXRJdGVtKGl0ZW0pO1xuICAgIGlmICghaXRlbSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgY29udGFpbmVyID0gb3B0cy5hcHBlbmRUbyB8fCB3aW5kb3cuZG9jdW1lbnQuYm9keTtcbiAgICB2YXIgbGF5b3V0U2VuZGVyID0gb3B0cy5sYXlvdXRTZW5kZXIgPyBvcHRzLmxheW91dFNlbmRlciA6IG9wdHMubGF5b3V0U2VuZGVyID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIGxheW91dFJlY2VpdmVyID0gb3B0cy5sYXlvdXRSZWNlaXZlclxuICAgICAgPyBvcHRzLmxheW91dFJlY2VpdmVyXG4gICAgICA6IG9wdHMubGF5b3V0UmVjZWl2ZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIC8vIFN0YXJ0IHRoZSBtaWdyYXRpb24gcHJvY2Vzcy5cbiAgICBpdGVtLl9taWdyYXRlLnN0YXJ0KGdyaWQsIHBvc2l0aW9uLCBjb250YWluZXIpO1xuXG4gICAgLy8gSWYgbWlncmF0aW9uIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGl0ZW0gaXMgYWN0aXZlLCBsZXQncyBsYXlvdXRcbiAgICAvLyB0aGUgZ3JpZHMuXG4gICAgaWYgKGl0ZW0uX21pZ3JhdGUuX2lzQWN0aXZlICYmIGl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICBpZiAobGF5b3V0U2VuZGVyKSB7XG4gICAgICAgIHRoaXMubGF5b3V0KFxuICAgICAgICAgIGxheW91dFNlbmRlciA9PT0gaW5zdGFudExheW91dCxcbiAgICAgICAgICBpc0Z1bmN0aW9uKGxheW91dFNlbmRlcikgPyBsYXlvdXRTZW5kZXIgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXlvdXRSZWNlaXZlcikge1xuICAgICAgICBncmlkLmxheW91dChcbiAgICAgICAgICBsYXlvdXRSZWNlaXZlciA9PT0gaW5zdGFudExheW91dCxcbiAgICAgICAgICBpc0Z1bmN0aW9uKGxheW91dFJlY2VpdmVyKSA/IGxheW91dFJlY2VpdmVyIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyZW1vdmVFbGVtZW50cz1mYWxzZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24ocmVtb3ZlRWxlbWVudHMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXMuc2xpY2UoMCk7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBVbmJpbmQgd2luZG93IHJlc2l6ZSBldmVudCBsaXN0ZW5lci5cbiAgICBpZiAodGhpcy5fcmVzaXplSGFuZGxlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtc1tpXS5fZGVzdHJveShyZW1vdmVFbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBjb250YWluZXIuXG4gICAgcmVtb3ZlQ2xhc3MoY29udGFpbmVyLCB0aGlzLl9zZXR0aW5ncy5jb250YWluZXJDbGFzcyk7XG4gICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcnO1xuXG4gICAgLy8gRW1pdCBkZXN0cm95IGV2ZW50IGFuZCB1bmJpbmQgYWxsIGV2ZW50cy5cbiAgICB0aGlzLl9lbWl0KGV2ZW50RGVzdHJveSk7XG4gICAgdGhpcy5fZW1pdHRlci5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgcmVmZXJlbmNlIGZyb20gdGhlIGdyaWQgaW5zdGFuY2VzIGNvbGxlY3Rpb24uXG4gICAgZ3JpZEluc3RhbmNlc1t0aGlzLl9pZF0gPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBGbGFnIGluc3RhbmNlIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgaW5zdGFuY2UncyBpdGVtIGJ5IGVsZW1lbnQgb3IgYnkgaW5kZXguIFRhcmdldCBjYW4gYWxzbyBiZSBhbiBJdGVtXG4gICAqIGluc3RhbmNlIGluIHdoaWNoIGNhc2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGl0ZW0gaWYgaXQgZXhpc3RzIHdpdGhpblxuICAgKiByZWxhdGVkIEdyaWQgaW5zdGFuY2UuIElmIG5vdGhpbmcgaXMgZm91bmQgd2l0aCB0aGUgcHJvdmlkZWQgdGFyZ2V0LCBudWxsXG4gICAqIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBbdGFyZ2V0XVxuICAgKiBAcmV0dXJucyB7P0l0ZW19XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fZ2V0SXRlbSA9IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgIC8vIElmIG5vIHRhcmdldCBpcyBzcGVjaWZpZWQgb3IgdGhlIGluc3RhbmNlIGlzIGRlc3Ryb3llZCwgcmV0dXJuIG51bGwuXG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICghdGFyZ2V0ICYmIHRhcmdldCAhPT0gMCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIHRhcmdldCBpcyBudW1iZXIgcmV0dXJuIHRoZSBpdGVtIGluIHRoYXQgaW5kZXguIElmIHRoZSBudW1iZXIgaXMgbG93ZXJcbiAgICAvLyB0aGFuIHplcm8gbG9vayBmb3IgdGhlIGl0ZW0gc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBpdGVtcyBhcnJheS4gRm9yXG4gICAgLy8gZXhhbXBsZSAtMSBmb3IgdGhlIGxhc3QgaXRlbSwgLTIgZm9yIHRoZSBzZWNvbmQgbGFzdCBpdGVtLCBldGMuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zW3RhcmdldCA+IC0xID8gdGFyZ2V0IDogdGhpcy5faXRlbXMubGVuZ3RoICsgdGFyZ2V0XSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB0YXJnZXQgaXMgYW4gaW5zdGFuY2Ugb2YgSXRlbSByZXR1cm4gaXQgaWYgaXQgaXMgYXR0YWNoZWQgdG8gdGhpc1xuICAgIC8vIEdyaWQgaW5zdGFuY2UsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSXRlbSkge1xuICAgICAgcmV0dXJuIHRhcmdldC5fZ3JpZElkID09PSB0aGlzLl9pZCA/IHRhcmdldCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSW4gb3RoZXIgY2FzZXMgbGV0J3MgYXNzdW1lIHRoYXQgdGhlIHRhcmdldCBpcyBhbiBlbGVtZW50LCBzbyBsZXQncyB0cnlcbiAgICAvLyB0byBmaW5kIGFuIGl0ZW0gdGhhdCBtYXRjaGVzIHRoZSBlbGVtZW50IGFuZCByZXR1cm4gaXQuIElmIGl0ZW0gaXMgbm90XG4gICAgLy8gZm91bmQgcmV0dXJuIG51bGwuXG4gICAgLyoqIEB0b2RvIFRoaXMgY291bGQgYmUgbWFkZSBhIGxvdCBmYXN0ZXIgYnkgdXNpbmcgTWFwL1dlYWtNYXAgb2YgZWxlbWVudHMuICovXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldLl9lbGVtZW50ID09PSB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgaW5zdGFuY2UncyBsYXlvdXQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtMYXlvdXREYXRhfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3MubGF5b3V0O1xuICAgIHZhciB3aWR0aDtcbiAgICB2YXIgaGVpZ2h0O1xuICAgIHZhciBuZXdMYXlvdXQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBMZXQncyBpbmNyZW1lbnQgbGF5b3V0IGlkLlxuICAgICsrbGF5b3V0LmlkO1xuXG4gICAgLy8gTGV0J3MgdXBkYXRlIGxheW91dCBpdGVtc1xuICAgIGxheW91dC5pdGVtcy5sZW5ndGggPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldLl9pc0FjdGl2ZSkgbGF5b3V0Lml0ZW1zLnB1c2godGhpcy5faXRlbXNbaV0pO1xuICAgIH1cblxuICAgIC8vIExldCdzIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IGNvbnRhaW5lciBkaW1lbnNpb25zLlxuICAgIHRoaXMuX3JlZnJlc2hEaW1lbnNpb25zKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgY29udGFpbmVyIHdpZHRoIGFuZCBoZWlnaHQgKHdpdGhvdXQgYm9yZGVycykuXG4gICAgd2lkdGggPSB0aGlzLl93aWR0aCAtIHRoaXMuX2JvcmRlckxlZnQgLSB0aGlzLl9ib3JkZXJSaWdodDtcbiAgICBoZWlnaHQgPSB0aGlzLl9oZWlnaHQgLSB0aGlzLl9ib3JkZXJUb3AgLSB0aGlzLl9ib3JkZXJCb3R0b207XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IGxheW91dC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncykpIHtcbiAgICAgIG5ld0xheW91dCA9IHNldHRpbmdzKGxheW91dC5pdGVtcywgd2lkdGgsIGhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheW91dCA9IHBhY2tlci5nZXRMYXlvdXQobGF5b3V0Lml0ZW1zLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQuc2xvdHMsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgdGhlIGdyaWQncyBsYXlvdXQuXG4gICAgbGF5b3V0LnNsb3RzID0gbmV3TGF5b3V0LnNsb3RzO1xuICAgIGxheW91dC5zZXRXaWR0aCA9IEJvb2xlYW4obmV3TGF5b3V0LnNldFdpZHRoKTtcbiAgICBsYXlvdXQuc2V0SGVpZ2h0ID0gQm9vbGVhbihuZXdMYXlvdXQuc2V0SGVpZ2h0KTtcbiAgICBsYXlvdXQud2lkdGggPSBuZXdMYXlvdXQud2lkdGg7XG4gICAgbGF5b3V0LmhlaWdodCA9IG5ld0xheW91dC5oZWlnaHQ7XG5cbiAgICByZXR1cm4gbGF5b3V0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbWl0IGEgZ3JpZCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0gey4uLip9IFthcmddXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fZW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuX2VtaXR0ZXIuZW1pdC5hcHBseSh0aGlzLl9lbWl0dGVyLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGV2ZW50cyBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX2hhc0xpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2VtaXR0ZXIuX2V2ZW50c1tldmVudF07XG4gICAgcmV0dXJuICEhKGxpc3RlbmVycyAmJiBsaXN0ZW5lcnMubGVuZ3RoKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGNvbnRhaW5lcidzIHdpZHRoLCBoZWlnaHQgYW5kIG9mZnNldHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUJvdW5kaW5nUmVjdCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5fd2lkdGggPSByZWN0LndpZHRoO1xuICAgIHRoaXMuX2hlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgIHRoaXMuX2xlZnQgPSByZWN0LmxlZnQ7XG4gICAgdGhpcy5fdG9wID0gcmVjdC50b3A7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb250YWluZXIncyBib3JkZXIgc2l6ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxlZnRcbiAgICogQHBhcmFtIHtCb29sZWFufSByaWdodFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvcFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvdHRvbVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUJvcmRlcnMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pIHtcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgaWYgKGxlZnQpIHRoaXMuX2JvcmRlckxlZnQgPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci1sZWZ0LXdpZHRoJyk7XG4gICAgaWYgKHJpZ2h0KSB0aGlzLl9ib3JkZXJSaWdodCA9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLXJpZ2h0LXdpZHRoJyk7XG4gICAgaWYgKHRvcCkgdGhpcy5fYm9yZGVyVG9wID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItdG9wLXdpZHRoJyk7XG4gICAgaWYgKGJvdHRvbSkgdGhpcy5fYm9yZGVyQm90dG9tID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItYm90dG9tLXdpZHRoJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggYWxsIG9mIGNvbnRhaW5lcidzIGludGVybmFsIGRpbWVuc2lvbnMgYW5kIG9mZnNldHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3JlZnJlc2hEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdXBkYXRlQm91bmRpbmdSZWN0KCk7XG4gICAgdGhpcy5fdXBkYXRlQm9yZGVycygxLCAxLCAxLCAxKTtcbiAgfTtcblxuICAvKipcbiAgICogU2hvdyBvciBoaWRlIEdyaWQgaW5zdGFuY2UncyBpdGVtcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvVmlzaWJsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHsoU2hvd0NhbGxiYWNrfEhpZGVDYWxsYmFjayl9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3NldEl0ZW1zVmlzaWJpbGl0eSA9IGZ1bmN0aW9uKGl0ZW1zLCB0b1Zpc2libGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZ3JpZCA9IHRoaXM7XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGlzSW5zdGFudCA9IG9wdHMuaW5zdGFudCA9PT0gdHJ1ZTtcbiAgICB2YXIgY2FsbGJhY2sgPSBvcHRzLm9uRmluaXNoO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY291bnRlciA9IHRhcmdldEl0ZW1zLmxlbmd0aDtcbiAgICB2YXIgc3RhcnRFdmVudCA9IHRvVmlzaWJsZSA/IGV2ZW50U2hvd1N0YXJ0IDogZXZlbnRIaWRlU3RhcnQ7XG4gICAgdmFyIGVuZEV2ZW50ID0gdG9WaXNpYmxlID8gZXZlbnRTaG93RW5kIDogZXZlbnRIaWRlRW5kO1xuICAgIHZhciBtZXRob2QgPSB0b1Zpc2libGUgPyAnc2hvdycgOiAnaGlkZSc7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGNvbXBsZXRlZEl0ZW1zID0gW107XG4gICAgdmFyIGhpZGRlbkl0ZW1zID0gW107XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgY2FsbCB0aGUgY2FsbGJhY2ssIGJ1dCBkb24ndCBlbWl0IGFueSBldmVudHMuXG4gICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIGNhbGxiYWNrKHRhcmdldEl0ZW1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHNob3dTdGFydC9oaWRlU3RhcnQgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhzdGFydEV2ZW50KSkge1xuICAgICAgdGhpcy5fZW1pdChzdGFydEV2ZW50LCB0YXJnZXRJdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gU2hvdy9oaWRlIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHRhcmdldEl0ZW1zW2ldO1xuXG4gICAgICAvLyBJZiBpbmFjdGl2ZSBpdGVtIGlzIHNob3duIG9yIGFjdGl2ZSBpdGVtIGlzIGhpZGRlbiB3ZSBuZWVkIHRvIGRvXG4gICAgICAvLyBsYXlvdXQuXG4gICAgICBpZiAoKHRvVmlzaWJsZSAmJiAhaXRlbS5faXNBY3RpdmUpIHx8ICghdG9WaXNpYmxlICYmIGl0ZW0uX2lzQWN0aXZlKSkge1xuICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGluYWN0aXZlIGl0ZW0gaXMgc2hvd24gd2UgYWxzbyBuZWVkIHRvIGRvIGEgbGl0dGxlIGhhY2sgdG8gbWFrZSB0aGVcbiAgICAgIC8vIGl0ZW0gbm90IGFuaW1hdGUgaXQncyBuZXh0IHBvc2l0aW9uaW5nIChsYXlvdXQpLlxuICAgICAgaWYgKHRvVmlzaWJsZSAmJiAhaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgICAgaXRlbS5fbGF5b3V0Ll9za2lwTmV4dEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgaGlkZGVuIGl0ZW0gaXMgYmVpbmcgc2hvd24gd2UgbmVlZCB0byByZWZyZXNoIHRoZSBpdGVtJ3NcbiAgICAgIC8vIGRpbWVuc2lvbnMuXG4gICAgICBpZiAodG9WaXNpYmxlICYmIGl0ZW0uX3Zpc2liaWxpdHkuX2lzSGlkZGVuKSB7XG4gICAgICAgIGhpZGRlbkl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cvaGlkZSB0aGUgaXRlbS5cbiAgICAgIGl0ZW0uX3Zpc2liaWxpdHlbbWV0aG9kXShpc0luc3RhbnQsIGZ1bmN0aW9uKGludGVycnVwdGVkLCBpdGVtKSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGl0ZW0ncyBhbmltYXRpb24gd2FzIG5vdCBpbnRlcnJ1cHRlZCBhZGQgaXQgdG8gdGhlXG4gICAgICAgIC8vIGNvbXBsZXRlZEl0ZW1zIGFycmF5LlxuICAgICAgICBpZiAoIWludGVycnVwdGVkKSBjb21wbGV0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuXG4gICAgICAgIC8vIElmIGFsbCBpdGVtcyBoYXZlIGZpbmlzaGVkIHRoZWlyIGFuaW1hdGlvbnMgY2FsbCB0aGUgY2FsbGJhY2tcbiAgICAgICAgLy8gYW5kIGVtaXQgc2hvd0VuZC9oaWRlRW5kIGV2ZW50LlxuICAgICAgICBpZiAoLS1jb3VudGVyIDwgMSkge1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgY2FsbGJhY2soY29tcGxldGVkSXRlbXMuc2xpY2UoMCkpO1xuICAgICAgICAgIGlmIChncmlkLl9oYXNMaXN0ZW5lcnMoZW5kRXZlbnQpKSBncmlkLl9lbWl0KGVuZEV2ZW50LCBjb21wbGV0ZWRJdGVtcy5zbGljZSgwKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggaGlkZGVuIGl0ZW1zLlxuICAgIGlmIChoaWRkZW5JdGVtcy5sZW5ndGgpIHRoaXMucmVmcmVzaEl0ZW1zKGhpZGRlbkl0ZW1zKTtcblxuICAgIC8vIExheW91dCBpZiBuZWVkZWQuXG4gICAgaWYgKG5lZWRzTGF5b3V0ICYmIGxheW91dCkge1xuICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBoZWxwZXJzXG4gICAqICoqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogTWVyZ2UgZGVmYXVsdCBzZXR0aW5ncyB3aXRoIHVzZXIgc2V0dGluZ3MuIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgYSBuZXdcbiAgICogb2JqZWN0IHdpdGggbWVyZ2VkIHZhbHVlcy4gVGhlIG1lcmdpbmcgaXMgYSBkZWVwIG1lcmdlIG1lYW5pbmcgdGhhdCBhbGxcbiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgc2V0dGluZ3Mgb2JqZWN0cyB3aWxsIGJlIGFsc28gbWVyZ2VkXG4gICAqIHNvIHRoYXQgbW9kaWZ5aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHNldHRpbmdzIG9iamVjdCB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uXG4gICAqIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0U2V0dGluZ3NcbiAgICogQHBhcmFtIHtPYmplY3R9IFt1c2VyU2V0dGluZ3NdXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBuZXcgb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VTZXR0aW5ncyhkZWZhdWx0U2V0dGluZ3MsIHVzZXJTZXR0aW5ncykge1xuICAgIC8vIENyZWF0ZSBhIGZyZXNoIGNvcHkgb2YgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICB2YXIgcmV0ID0gbWVyZ2VPYmplY3RzKHt9LCBkZWZhdWx0U2V0dGluZ3MpO1xuXG4gICAgLy8gTWVyZ2UgdXNlciBzZXR0aW5ncyB0byBkZWZhdWx0IHNldHRpbmdzLlxuICAgIGlmICh1c2VyU2V0dGluZ3MpIHtcbiAgICAgIHJldCA9IG1lcmdlT2JqZWN0cyhyZXQsIHVzZXJTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHZpc2libGUvaGlkZGVuIHN0eWxlcyBtYW51YWxseSBzbyB0aGF0IHRoZSB3aG9sZSBvYmplY3QgaXNcbiAgICAvLyBvdmVycmlkZGVuIGluc3RlYWQgb2YgdGhlIHByb3BzLlxuICAgIHJldC52aXNpYmxlU3R5bGVzID0gKHVzZXJTZXR0aW5ncyB8fCAwKS52aXNpYmxlU3R5bGVzIHx8IChkZWZhdWx0U2V0dGluZ3MgfHwgMCkudmlzaWJsZVN0eWxlcztcbiAgICByZXQuaGlkZGVuU3R5bGVzID0gKHVzZXJTZXR0aW5ncyB8fCAwKS5oaWRkZW5TdHlsZXMgfHwgKGRlZmF1bHRTZXR0aW5ncyB8fCAwKS5oaWRkZW5TdHlsZXM7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHR3byBvYmplY3RzIHJlY3Vyc2l2ZWx5IChkZWVwIG1lcmdlKS4gVGhlIHNvdXJjZSBvYmplY3QncyBwcm9wZXJ0aWVzXG4gICAqIGFyZSBtZXJnZWQgdG8gdGhlIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICogICAtIFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlXG4gICAqICAgLSBUaGUgc291cmNlIG9iamVjdC5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICB2YXIgbGVuZ3RoID0gc291cmNlS2V5cy5sZW5ndGg7XG4gICAgdmFyIGlzU291cmNlT2JqZWN0O1xuICAgIHZhciBwcm9wTmFtZTtcbiAgICB2YXIgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcHJvcE5hbWUgPSBzb3VyY2VLZXlzW2ldO1xuICAgICAgaXNTb3VyY2VPYmplY3QgPSBpc1BsYWluT2JqZWN0KHNvdXJjZVtwcm9wTmFtZV0pO1xuXG4gICAgICAvLyBJZiB0YXJnZXQgYW5kIHNvdXJjZSB2YWx1ZXMgYXJlIGJvdGggb2JqZWN0cywgbWVyZ2UgdGhlIG9iamVjdHMgYW5kXG4gICAgICAvLyBhc3NpZ24gdGhlIG1lcmdlZCB2YWx1ZSB0byB0aGUgdGFyZ2V0IHByb3BlcnR5LlxuICAgICAgaWYgKGlzUGxhaW5PYmplY3QodGFyZ2V0W3Byb3BOYW1lXSkgJiYgaXNTb3VyY2VPYmplY3QpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IG1lcmdlT2JqZWN0cyhtZXJnZU9iamVjdHMoe30sIHRhcmdldFtwcm9wTmFtZV0pLCBzb3VyY2VbcHJvcE5hbWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHNvdXJjZSdzIHZhbHVlIGlzIG9iamVjdCBhbmQgdGFyZ2V0J3MgaXMgbm90IGxldCdzIGNsb25lIHRoZSBvYmplY3QgYXNcbiAgICAgIC8vIHRoZSB0YXJnZXQncyB2YWx1ZS5cbiAgICAgIGlmIChpc1NvdXJjZU9iamVjdCkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gbWVyZ2VPYmplY3RzKHt9LCBzb3VyY2VbcHJvcE5hbWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHNvdXJjZSdzIHZhbHVlIGlzIGFuIGFycmF5IGxldCdzIGNsb25lIHRoZSBhcnJheSBhcyB0aGUgdGFyZ2V0J3NcbiAgICAgIC8vIHZhbHVlLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IHNvdXJjZVtwcm9wTmFtZV0uc2xpY2UoMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBhbGwgb3RoZXIgY2FzZXMgbGV0J3MganVzdCBkaXJlY3RseSBhc3NpZ24gdGhlIHNvdXJjZSdzIHZhbHVlIGFzIHRoZVxuICAgICAgLy8gdGFyZ2V0J3MgdmFsdWUuXG4gICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgcmV0dXJuIEdyaWQ7XG5cbn0pKTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBJdGVtVmFsdWUgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlclxuICBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlXG4gIGltcGxlbWVudHMgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIHtcblxuICBwcml2YXRlIHZpc3VhbGl6ZXJTZWxlY3RvcjogSFRNTERpdkVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXN1YWxpemVyU2VsZWN0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy52aXN1YWxpemVyU2VsZWN0b3IpIHtcbiAgICAgIHRoaXMudmlzdWFsaXplclNlbGVjdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICBcInNlbGVjdFwiXG4gICAgICApWzBdLnZhbHVlID0gdGhpcy52aXN1YWxpemVyLnR5cGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aXN1YWxpemVyczogQXJyYXk8VmlzdWFsaXplckJhc2U+LFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3RcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMpO1xuICAgIGlmICghdmlzdWFsaXplcnMgfHwgdmlzdWFsaXplcnMubGVuZ3RoIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlZpc3VhbGl6ZXJBcnJheVdyYXBwZXIgd29ya3Mgd2l0aCB2aXN1YWxpemVycyBjb2xsZWN0aW9uIG9ubHkuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5vblVwZGF0ZSA9ICgpID0+IHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIGlmICh2aXN1YWxpemVyLnN1cHBvcnRTZWxlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fc3VwcG9ydFNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIHRoaXMudmlzdWFsaXplcnNXaXRoU2VsZWN0aW9uLnB1c2goXG4gICAgICAgICAgPElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbj4oPGFueT52aXN1YWxpemVyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlVmlzdWFsaXplclwiLCAoKSA9PlxuICAgICAgdGhpcy52aXN1YWxpemVyU2VsZWN0b3IgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgdGhpcy52aXN1YWxpemVycy5tYXAoKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZpc3VhbGl6ZXIudHlwZSxcbiAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ2aXN1YWxpemVyX1wiICsgdmlzdWFsaXplci50eXBlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLnZpc3VhbGl6ZXIudHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAoZTogYW55KSA9PiB0aGlzLnNldFZpc3VhbGl6ZXIoZS50YXJnZXQudmFsdWUpXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMudmlzdWFsaXplciA9IHZpc3VhbGl6ZXJzWzBdO1xuICAgIHRoaXMudmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJWaXN1YWxpemVyUmVuZGVyQ2FsbGJhY2spO1xuICAgIHRoaXMudmlzdWFsaXplci5vblN0YXRlQ2hhbmdlZC5hZGQodGhpcy5vblZpc3VhbGl6ZXJTdGF0ZUNoYW5nZWRDYWxsYmFjayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmlzdWFsaXplckNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHB1YmxpYyBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxpemVycygpIHtcbiAgICByZXR1cm4gdGhpcy52aXN1YWxpemVycztcbiAgfVxuXG4gIHByaXZhdGUgdmlzdWFsaXplcnNXaXRoU2VsZWN0aW9uOiBBcnJheTxJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24+ID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWU7XG4gIHByaXZhdGUgdmlzdWFsaXplcjogVmlzdWFsaXplckJhc2U7XG5cbiAgcHJpdmF0ZSBvbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrID0gKCkgPT4ge1xuICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfTtcbiAgcHJpdmF0ZSBvblZpc3VhbGl6ZXJTdGF0ZUNoYW5nZWRDYWxsYmFjayA9IChzLCBvcHRpb25zKSA9PiB7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJ2aXN1YWxpemVyXCIsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIgY29udGVudCB0eXBlIGhhcyBiZWVuIGNoYW5nZWQuXG4gICAqKi9cbiAgcHVibGljIG9uVmlzdWFsaXplckNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlcixcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciwgb3B0aW9uczogYW55KSA9PiBhbnksIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLCBhbnk+KCk7XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHNlbGVjdHMgdmlzdWFsaXplciB0byBzaG93IGJ5IGl0IG5hbWUuXG4gICpcbiAgKiBwYXJhbWV0ZXJzOlxuICAqIG5hbWUgLSB0aGUgbmFtZSBvZiB2aXN1YWxpemVyIHRvIHNob3csXG4gICogcXVpZXQgLSBzZXQgaXQgdG8gdHJ1ZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byByaXNlIGEgbm90aWZpY2F0aW9uIGV2ZW50XG4gICpcbiAgKiovXG4gIHB1YmxpYyBzZXRWaXN1YWxpemVyKHR5cGU6IHN0cmluZywgcXVpZXQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHZpc3VhbGl6ZXJDYW5kaWRhdGUgPSB0aGlzLnZpc3VhbGl6ZXJzLmZpbHRlcigodikgPT4gdi50eXBlID09PSB0eXBlKVswXTtcbiAgICBpZiAoISF2aXN1YWxpemVyQ2FuZGlkYXRlICYmIHZpc3VhbGl6ZXJDYW5kaWRhdGUgIT09IHRoaXMudmlzdWFsaXplcikge1xuICAgICAgaWYgKCEhdGhpcy52aXN1YWxpemVyKSB7XG4gICAgICAgIHRoaXMudmlzdWFsaXplci5vblN0YXRlQ2hhbmdlZC5yZW1vdmUodGhpcy5vblZpc3VhbGl6ZXJTdGF0ZUNoYW5nZWRDYWxsYmFjayk7XG4gICAgICAgIHRoaXMudmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uQWZ0ZXJWaXN1YWxpemVyUmVuZGVyQ2FsbGJhY2spO1xuICAgICAgICB0aGlzLnZpc3VhbGl6ZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgdGhpcy52aXN1YWxpemVyID0gdmlzdWFsaXplckNhbmRpZGF0ZTtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayk7XG4gICAgICB0aGlzLnZpc3VhbGl6ZXIub25TdGF0ZUNoYW5nZWQuYWRkKHRoaXMub25WaXN1YWxpemVyU3RhdGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgaWYgKCFxdWlldCkge1xuICAgICAgICB0aGlzLm9uVmlzdWFsaXplckNoYW5nZWQuZmlyZSh0aGlzLCB7IHZpc3VhbGl6ZXI6IHRoaXMudmlzdWFsaXplciB9KTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJ2aXN1YWxpemVyXCIsIHR5cGUpO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVWaXN1YWxpemVyU2VsZWN0b3IoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICBzdXBlci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldCBvbkRhdGFJdGVtU2VsZWN0ZWQoXG4gICAgdmFsOiAoc2VsZWN0ZWRWYWx1ZTogYW55LCBzZWxlY3RlZFRleHQ6IHN0cmluZykgPT4gdm9pZFxuICApIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbi5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICB2aXN1YWxpemVyLm9uRGF0YUl0ZW1TZWxlY3RlZCA9IHZhbDtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbi5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICB2aXN1YWxpemVyLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuICg8YW55PnRoaXMudmlzdWFsaXplcikuc2VsZWN0aW9uIHx8IHRoaXMuc2VsZWN0ZWRJdGVtO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMudmlzdWFsaXplckNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLnZpc3VhbGl6ZXIucmVuZGVyKHRoaXMudmlzdWFsaXplckNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcjogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcik7XG4gICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKHZpc3VhbGl6ZXIgPT4gdmlzdWFsaXplci5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgYSBjdXJyZW50IHZpc3VhbGl6ZXIgc3RhdGUuIFRoZSBwcm9wZXJ0aWVzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggaW5kaXZpZHVhbCB2aXN1YWxpemVyLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgc2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBhbnkge1xuICAgIGNvbnN0IGN1cnJlbnRWaXN1YWxpemVyU3RhdGUgPSB0aGlzLnZpc3VhbGl6ZXIuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBzdGF0ZTogYW55ID0ge1xuICAgICAgdmlzdWFsaXplcjogdGhpcy52aXN1YWxpemVyLnR5cGUsXG4gICAgfTtcbiAgICBpZihPYmplY3Qua2V5cyhjdXJyZW50VmlzdWFsaXplclN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0ZS5zdGF0ZSA9IGN1cnJlbnRWaXN1YWxpemVyU3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgdmlzdWFsaXplcidzIHN0YXRlLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgZ2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogYW55KTogdm9pZCB7XG4gICAgaWYoISFzdGF0ZS52aXN1YWxpemVyKSB7XG4gICAgICB0aGlzLnNldFZpc3VhbGl6ZXIoc3RhdGUudmlzdWFsaXplciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmKCEhc3RhdGUuc3RhdGUpIHtcbiAgICAgIHRoaXMudmlzdWFsaXplci5zZXRTdGF0ZShzdGF0ZS5zdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrKTtcbiAgICAgIHZpc3VhbGl6ZXIub25TdGF0ZUNoYW5nZWQucmVtb3ZlKHRoaXMub25WaXN1YWxpemVyU3RhdGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5vblVwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB0aGlzLnZpc3VhbGl6ZXIuZGVzdHJveSgpO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlckFsdFZpc3VhbGl6ZXJTZWxlY3RvcihcbiAgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXJcbik7XG4iLCIvLyBUaGlzIGRpY3Rpb25hcnkgY29udGFpbnMgMSB1bnRyYW5zbGF0ZWQgb3IgaW5oZXJpdGVkIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuLy8gVGhlc2Ugc3RyaW5ncyBhcmUgY29tbWVudGVkIG91dC4gVW5jb21tZW50IGFuZCBlZGl0IHRoZW0gaWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgdHJhbnNsYXRpb25zLlxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBhcmFiaWNTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCLYstix2KfYsSDYp9mE2YXYrNmF2YjYudipXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwi2KrZhSDYp9mE2KrYrdiv2YrYqyDZhdmGINiu2YTYp9mE2YlcIixcbiAgc2VsZWN0QnV0dG9uOiBcItin2K7YqtixXCIsXG4gIGhpZGVDb2x1bW46IFwi2KfYrtmB2KfYoSDYp9mE2LnZhdmI2K9cIixcbiAgc2hvd0NvbHVtbjogXCLYp9i42YfYp9ixXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcItij2KzYudmEINin2YTYudmF2YjYryDYrtin2LVcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCLYo9is2LnZhCDYp9mE2LnZhdmI2K8g2LnYp9mFXCIsXG4gIG1vdmVUb0RldGFpbDogXCLYp9mG2KrZgtmEINil2YTZiSDYp9mE2KrZgdin2LXZitmEXCIsXG4gIHNob3dBc0NvbHVtbjogXCLYpdi42YfYp9ixINmD2LnZhdmI2K9cIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwi2KjYrdirLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwi2K3YsNmBXCIsXG4gIHNob3dMYWJlbDogXCLYp9i42YfYp9ixXCIsXG4gIGVudHJpZXNMYWJlbDogXCLZhdiv2K7ZhNin2KpcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcItis2K/Yp9mI2YRcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwi2YPZhNmF2KfYqlwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCLYp9mE2LHYs9mFINin2YTYqNmK2KfZhtmKXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcItmF2KrZiNiz2LdcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcItis2K/ZiNmEXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCLYsdiz2YUg2KjZitin2YbZilwiLFxuICAvLyB2aXN1YWxpemVyX21hdHJpeDogXCJDaGFydFwiLFxuICBjaGFydFR5cGVfYmFyOiBcIti02LHZiti3XCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIti02LHZiti3INi52YXZiNiv2YpcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwi2LTYsdmK2Lcg2YXZg9iv2LNcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvdWdobnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiUGllXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIlNjYXR0ZXJcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwi2KfYrtmB2KfYoVwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCLYo9is2LnZhCDYrtin2LVcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCLYo9is2LnZhCDYudin2YVcIixcbiAgc2hvd0J1dHRvbjogXCLYp9i42YfYp9ixXCIsXG4gIGZpbHRlcjogXCLYqtix2LTYrVwiLFxuICByZXNldEZpbHRlcjogXCLYpdi52KfYr9ipINiq2LnZitmK2YZcIixcbiAgY2hhbmdlTG9jYWxlOiBcItiq2LrZitmK2LEg2KfZhNmE2LrYqVwiLFxuICBjbGVhckJ1dHRvbjogXCLZhdiz2K1cIixcbiAgYWRkRWxlbWVudDogXCLYp9iu2KrYsSDYs9ik2KfZhNin2Ysg2YTZhNi52LHYtiAuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcItin2YTYqtix2KrZitioINin2YTYp9mB2KrYsdin2LbZilwiLFxuICBhc2NPcmRlcjogXCLYqti12KfYudiv2YlcIixcbiAgZGVzY09yZGVyOiBcItiq2YbYp9iy2YTZiVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcItil2LjZh9in2LEg2KfZhNij2LnZhdiv2Kkg2KfZhNir2KfZhtmI2YrYqVwiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCLYqNmG2YjYryDZiNiq2LnZhNmK2YLYp9iqINij2K7YsdmJXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCLYudix2LYg2KfZhNmG2LPYqCDYp9mE2YXYptmI2YrYqVwiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwi2KXYrtmB2KfYoSDYp9mE2YbYs9ioXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwi2KrZhtiy2YrZhCDYqNi12YrYutipIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcItil2K7Zgdin2KEg2KfZhNil2KzYp9io2KfYqiDYp9mE2YHYp9ix2LrYqVwiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcItil2LjZh9in2LEg2KfZhNil2KzYp9io2KfYqiDYp9mE2YHYp9ix2LrYqVwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcItis2YXZiti5INin2YTYpdis2KfYqNin2KpcIixcbiAgdG9wTlZhbHVlVGV4dDU6IFwi2KPZh9mFIDUg2KXYrNin2KjYp9iqXCIsXG4gIHRvcE5WYWx1ZVRleHQxMDogXCLYo9mB2LbZhCAxMCDYpdis2KfYqNin2KpcIixcbiAgdG9wTlZhbHVlVGV4dDIwOiBcItij2YHYttmEIDIwINil2KzYp9io2KlcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcItil2K7Zgdin2KEg2KfZhNil2KzYp9io2KfYqiDYp9mE2YXZgdmC2YjYr9ipXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCLYudix2LYg2KfZhNil2KzYp9io2KfYqiDYp9mE2YXZgdmC2YjYr9ipXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwi2KPYrNmI2KjYqSDZhdmB2YLZiNiv2KlcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwi2YTZhSDZitiq2YUg2KfZhNi52LHYtiDYqNi52K9cIixcbiAgbm9SZXN1bHRzOiBcItmE2Kcg2YrZiNis2K8g2YbYqtin2KbYrCDZhNmE2LnYsdi2XCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwi2YTZg9mEINin2YTZgtmK2YVcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwi2YTZg9mEINin2YTYo9i52YXYr9ipXCIsXG4gIGFuc3dlcjogXCLYpdis2KhcIixcbiAgY29ycmVjdEFuc3dlcjogXCLYp9mE2KfYrNin2KjYqSDYp9mE2LXYrdmK2K3YqTogXCIsXG4gIHBlcmNlbnQ6IFwi2KfZhNmG2LPYqNmHINin2YTZhdim2YjZitmHXCIsXG4gIHJlc3BvbnNlczogXCLYp9mE2KfYs9iq2KzYp9io2KfYqlwiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImFyXCJdID0gYXJhYmljU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImFyXCJdID0gXCLYp9mE2LnYsdio2YrYqVwiO1xuXG4vLyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgYnkgYSBtYWNoaW5lIHRyYW5zbGF0aW9uIHNlcnZpY2Vcbi8vIFJlbW92ZSB0aG9zZSBzdHJpbmdzIHRoYXQgeW91IGhhdmUgY29ycmVjdGVkIG1hbnVhbGx5XG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dC0xOiBcIkFsbCBhbnN3ZXJzXCIgPT4gXCLYrNmF2YrYuSDYp9mE2KXYrNin2KjYp9iqXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0NTogXCJUb3AgNSBhbnN3ZXJzXCIgPT4gXCLYo9mH2YUgNSDYpdis2KfYqNin2KpcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQxMDogXCJUb3AgMTAgYW5zd2Vyc1wiID0+IFwi2KPZgdi22YQgMTAg2KXYrNin2KjYp9iqXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0MjA6IFwiVG9wIDIwIGFuc3dlcnNcIiA9PiBcItij2YHYttmEIDIwINil2KzYp9io2KlcIiIsIi8vIFRoaXMgZGljdGlvbmFyeSBjb250YWlucyAxIHVudHJhbnNsYXRlZCBvciBpbmhlcml0ZWQgbG9jYWxpemF0aW9uIHN0cmluZ3MuXG4vLyBUaGVzZSBzdHJpbmdzIGFyZSBjb21tZW50ZWQgb3V0LiBVbmNvbW1lbnQgYW5kIGVkaXQgdGhlbSBpZiB5b3Ugd2FudCB0byBhZGQgeW91ciB0cmFuc2xhdGlvbnMuXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGR1dGNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvZXAgZG9vciBtaWpcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEZWdyb2VwZXJlbiBiaWogbWlqXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY3RlZXIgbWlqXCIsXG4gIGhpZGVDb2x1bW46IFwiS29sb20gdmVyYmVyZ2VuXCIsXG4gIHNob3dDb2x1bW46IFwiVG9vbiBrb2xvbVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJLb2xvbSBwcml2w6kgbWFrZW5cIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJNYWFrIGRlIGtvbG9tIG9wZW5iYWFyXCIsXG4gIG1vdmVUb0RldGFpbDogXCJHYSBuYWFyIERldGFpbFwiLFxuICBzaG93QXNDb2x1bW46IFwiV2VlcmdldmVuIGFscyBrb2xvbVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJab2VrZW4uLi5cIixcbiAgcmVtb3ZlUm93czogXCJWZXJ3aWpkZXIgcmlqZW5cIixcbiAgc2hvd0xhYmVsOiBcIlRvbmVuXCIsXG4gIGVudHJpZXNMYWJlbDogXCJpbnplbmRpbmdlblwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGVrc3RlbiBpbiB0YWJlbFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJXb3JkY2xvdWRcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIkdlbWlkZGVsZFwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFmZWxcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIlplZWthYXJ0XCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFyXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIlZlcnRpY2FsZSBiYWxrXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkdlc3RhcGVsZGUgQmFyXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb251dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlRhYXJ0XCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIlZlcnN0cm9vaWVuXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJNZXRlclwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIktvZ2VsXCIsXG4gIGhpZGVCdXR0b246IFwiVmVyYmVyZ2VuXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIk1hYWsgcHJpdmVcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCJPcGVuYmFhciBtYWtlblwiLFxuICBzaG93QnV0dG9uOiBcIlRvbmVuXCIsXG4gIGZpbHRlcjogXCJGaWx0ZXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiRmlsdGVyIHJlc2V0dGVuXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJXaWp6aWcgZGUgbGFuZGluc3RlbGxpbmdcIixcbiAgY2xlYXJCdXR0b246IFwiRG9vcnppY2h0aWdcIixcbiAgYWRkRWxlbWVudDogXCJLaWVzIGVlbiB2cmFhZyBvbSB3ZWVyIHRlIGdldmVuIC4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiU3RhbmRhYXJkdm9sZ29yZGVcIixcbiAgYXNjT3JkZXI6IFwiT3Bsb3BlbmRcIixcbiAgZGVzY09yZGVyOiBcIkFmbG9wZW5kXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiVG9vbiBrbGVpbmUga29sb21tZW5cIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiQW5kZXJlIGl0ZW1zIGVuIG9wbWVya2luZ2VuXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJQZXJjZW50YWdlcyB3ZWVyZ2V2ZW5cIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlZlcmJlcmcgcGVyY2VudGFnZXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJEb3dubG9hZCBwbG90IGFscyBlZW4gcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwiVmVyYmVyZyBsZWdlIGFudHdvb3JkZW5cIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJUb29uIGxlZ2UgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIkFsbGUgYW50d29vcmRlblwiLFxuICB0b3BOVmFsdWVUZXh0NTogXCJUb3AgNSBhbnR3b29yZGVuXCIsXG4gIHRvcE5WYWx1ZVRleHQxMDogXCJUb3AgMTAgYW50d29vcmRlblwiLFxuICB0b3BOVmFsdWVUZXh0MjA6IFwiVG9wIDIwIGFudHdvb3JkZW5cIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIk9udGJyZWtlbmRlIGFudHdvb3JkZW4gdmVyYmVyZ2VuXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJPbnRicmVrZW5kZSBhbnR3b29yZGVuIHdlZXJnZXZlblwiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIk9udGJyZWtlbmRlIGFudHdvb3JkZW5cIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiRGl0IHZyYWFndHlwZSBpcyBub2cgbmlldCBnZXZpc3VhbGlzZWVyZFwiLFxuICBub1Jlc3VsdHM6IFwiRXIgemlqbiBub2cgZ2VlbiByZXN1bHRhdGVuXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwiUGVyIHdhYXJkZW5cIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGVyIEtvbG9tbWVuXCIsXG4gIGFuc3dlcjogXCJBbnR3b29yZGVuXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiR29lZCBhbnR3b29yZDogXCIsXG4gIHBlcmNlbnQ6IFwiUHJvY2VudFwiLFxuICByZXNwb25zZXM6IFwiUmVhY3RpZXNcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5sXCJdID0gZHV0Y2hTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibmxcIl0gPSBcIk5lZGVybGFuZHNcIjtcblxuLy8gVGhlIGZvbGxvd2luZyBzdHJpbmdzIGhhdmUgYmVlbiB0cmFuc2xhdGVkIGJ5IGEgbWFjaGluZSB0cmFuc2xhdGlvbiBzZXJ2aWNlXG4vLyBSZW1vdmUgdGhvc2Ugc3RyaW5ncyB0aGF0IHlvdSBoYXZlIGNvcnJlY3RlZCBtYW51YWxseVxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbVwiID0+IFwiSGlzdG9ncmFtXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX251bWJlcjogXCJBdmVyYWdlXCIgPT4gXCJHZW1pZGRlbGRcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJsZVwiID0+IFwiVGFmZWxcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJDaGFydFwiID0+IFwiWmVla2FhcnRcIlxuLy8gdW5kZWZpbmVkLmNoYXJ0VHlwZV92YmFyOiBcIlZlcnRpY2FsIEJhclwiID0+IFwiVmVydGljYWxlIGJhbGtcIlxuLy8gdW5kZWZpbmVkLmZpbHRlcjogXCJGaWx0ZXJcIiA9PiBcIkZpbHRlclwiXG4vLyB1bmRlZmluZWQuaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIkhpZGUgbWlzc2luZyBhbnN3ZXJzXCIgPT4gXCJPbnRicmVrZW5kZSBhbnR3b29yZGVuIHZlcmJlcmdlblwiXG4vLyB1bmRlZmluZWQuc2hvd01pc3NpbmdBbnN3ZXJzOiBcIlNob3cgbWlzc2luZyBhbnN3ZXJzXCIgPT4gXCJPbnRicmVrZW5kZSBhbnR3b29yZGVuIHdlZXJnZXZlblwiXG4vLyB1bmRlZmluZWQubWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJNaXNzaW5nIGFuc3dlcnNcIiA9PiBcIk9udGJyZWtlbmRlIGFudHdvb3JkZW5cIlxuLy8gdW5kZWZpbmVkLm5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIlRoaXMgcXVlc3Rpb24gdHlwZSBpcyBub3QgdmlzdWFsaXplZCB5ZXRcIiA9PiBcIkRpdCB2cmFhZ3R5cGUgaXMgbm9nIG5pZXQgZ2V2aXN1YWxpc2VlcmRcIlxuLy8gdW5kZWZpbmVkLm5vUmVzdWx0czogXCJUaGVyZSBhcmUgbm8gcmVzdWx0cyB5ZXRcIiA9PiBcIkVyIHppam4gbm9nIGdlZW4gcmVzdWx0YXRlblwiXG4vLyB1bmRlZmluZWQuc2hvd1BlclZhbHVlczogXCJQZXIgVmFsdWVzXCIgPT4gXCJQZXIgd2FhcmRlblwiXG4vLyB1bmRlZmluZWQuc2hvd1BlckNvbHVtbnM6IFwiUGVyIENvbHVtbnNcIiA9PiBcIlBlciBLb2xvbW1lblwiXG4vLyB1bmRlZmluZWQuYW5zd2VyOiBcIkFuc3dlclwiID0+IFwiQW50d29vcmRlblwiXG4vLyB1bmRlZmluZWQuY29ycmVjdEFuc3dlcjogXCJDb3JyZWN0IGFuc3dlcjogXCIgPT4gXCJHb2VkIGFudHdvb3JkOiBcIlxuLy8gdW5kZWZpbmVkLnBlcmNlbnQ6IFwiUGVyY2VudFwiID0+IFwiUHJvY2VudFwiXG4vLyB1bmRlZmluZWQucmVzcG9uc2VzOiBcIlJlc3BvbnNlc1wiID0+IFwiUmVhY3RpZXNcIiIsIi8vIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBpZiB5b3UgY3JlYXRlIGEgY3VzdG9tIGRpY3Rpb25hcnlcbi8vIGltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZW5nbGlzaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb3VwIEJ5IE1lXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiVW5ncm91cCBCeSBNZVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZWN0IE1lXCIsXG4gIGhpZGVDb2x1bW46IFwiSGlkZSBjb2x1bW5cIixcbiAgc2hvd0NvbHVtbjogXCJTaG93IGNvbHVtblwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJNYWtlIGNvbHVtbiBwcml2YXRlXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiTWFrZSBjb2x1bW4gcHVibGljXCIsXG4gIG1vdmVUb0RldGFpbDogXCJNb3ZlIHRvIERldGFpbFwiLFxuICBzaG93QXNDb2x1bW46IFwiU2hvdyBhcyBDb2x1bW5cIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiUmVtb3ZlIHJvd3NcIixcbiAgc2hvd0xhYmVsOiBcIlNob3dcIixcbiAgZW50cmllc0xhYmVsOiBcImVudHJpZXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRzIGluIHRhYmxlXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIldvcmRjbG91ZFwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1cIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiQXZlcmFnZVwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFibGVcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkNoYXJ0XCIsXG4gIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFyXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIlZlcnRpY2FsIEJhclwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJTdGFja2VkIEJhclwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiRG91Z2hudXRcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJQaWVcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiU2NhdHRlclwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR2F1Z2VcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCdWxsZXRcIixcbiAgaGlkZUJ1dHRvbjogXCJIaWRlXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIk1ha2UgcHJpdmF0ZVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIk1ha2UgcHVibGljXCIsXG4gIHNob3dCdXR0b246IFwiU2hvd1wiLFxuICBmaWx0ZXI6IFwiRmlsdGVyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJlc2V0IEZpbHRlclwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiQ2hhbmdlIExvY2FsZVwiLFxuICBjbGVhckJ1dHRvbjogXCJDbGVhclwiLFxuICBhZGRFbGVtZW50OiBcIkNob29zZSBxdWVzdGlvbiB0byBzaG93Li4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJEZWZhdWx0IE9yZGVyXCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGluZ1wiLFxuICBkZXNjT3JkZXI6IFwiRGVzY2VuZGluZ1wiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIlNob3cgbWlub3IgY29sdW1uc1wiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJPdGhlciBpdGVtcyBhbmQgY29tbWVudHNcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIlNob3cgcGVyY2VudGFnZXNcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIkhpZGUgcGVyY2VudGFnZXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJEb3dubG9hZCBwbG90IGFzIGEgUE5HIGZpbGVcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJIaWRlIGVtcHR5IGFuc3dlcnNcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJTaG93IGVtcHR5IGFuc3dlcnNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJBbGwgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiVG9wIDUgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIlRvcCAxMCBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiVG9wIDIwIGFuc3dlcnNcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIkhpZGUgbWlzc2luZyBhbnN3ZXJzXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJTaG93IG1pc3NpbmcgYW5zd2Vyc1wiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIk1pc3NpbmcgYW5zd2Vyc1wiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJUaGlzIHF1ZXN0aW9uIHR5cGUgaXMgbm90IHZpc3VhbGl6ZWQgeWV0XCIsXG4gIG5vUmVzdWx0czogXCJUaGVyZSBhcmUgbm8gcmVzdWx0cyB5ZXRcIixcbiAgc2hvd1BlclZhbHVlczogXCJQZXIgVmFsdWVzXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBlciBDb2x1bW5zXCIsXG4gIGFuc3dlcjogXCJBbnN3ZXJcIixcbiAgY29ycmVjdEFuc3dlcjogXCJDb3JyZWN0IGFuc3dlcjogXCIsXG4gIHBlcmNlbnQ6IFwiUGVyY2VudFwiLFxuICByZXNwb25zZXM6IFwiUmVzcG9uc2VzXCIsXG4gIHZpc3VhbGl6ZXJfbnBzOiBcIk5QUyBTY29yZVwiLFxuICBucHNTY29yZTogXCJOUFMgU2NvcmVcIixcbiAgbnBzUHJvbW90ZXJzOiBcIlByb21vdGVyc1wiLFxuICBucHNQYXNzaXZlczogXCJQYXNzaXZlc1wiLFxuICBucHNEZXRyYWN0b3JzOiBcIkRldHJhY3RvcnNcIixcbn07XG5cbi8vIFVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cgaWYgeW91IGNyZWF0ZSBhIGN1c3RvbSBkaWN0aW9uYXJ5LlxuLy8gUmVwbGFjZSBcImVuXCIgd2l0aCBhIGN1c3RvbSBsb2NhbGUgY29kZSAoZm9yIGV4YW1wbGUsIFwiZnJcIiBvciBcImRlXCIpLFxuLy8gUmVwbGFjZSBgZW5nbGlzaFN0cmluZ3NgIHdpdGggdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIGN1c3RvbSBkaWN0aW9uYXJ5LlxuLy8gbG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuLy8gbG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZW5cIl0gPSBcIkVuZ2xpc2hcIjtcbiIsIi8vIFRoaXMgZGljdGlvbmFyeSBjb250YWlucyAxIHVudHJhbnNsYXRlZCBvciBpbmhlcml0ZWQgbG9jYWxpemF0aW9uIHN0cmluZ3MuXG4vLyBUaGVzZSBzdHJpbmdzIGFyZSBjb21tZW50ZWQgb3V0LiBVbmNvbW1lbnQgYW5kIGVkaXQgdGhlbSBpZiB5b3Ugd2FudCB0byBhZGQgeW91ciB0cmFuc2xhdGlvbnMuXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGZhcnNpU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwi2q/YsdmI2Ycg2KjZhtiv24wg2KjYp1wiLFxuICB1bmdyb3VwQnV0dG9uOiBcItit2LDZgSDar9ix2YjZh1wiLFxuICBzZWxlY3RCdXR0b246IFwi2KfZhtiq2K7Yp9ioXCIsXG4gIGhpZGVDb2x1bW46IFwi2YXYrtmB24wg2qnYsdiv2YYg2LPYqtmI2YZcIixcbiAgc2hvd0NvbHVtbjogXCLZhtmF2KfbjNi0INiz2KrZiNmGXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcItiu2LXZiNi124wg2qnYsdiv2YYg2LPYqtmI2YZcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCLYudmF2YjZhduMINqp2LHYr9mGINiz2KrZiNmGXCIsXG4gIG1vdmVUb0RldGFpbDogXCLYp9mG2KrZgtin2YQg2KjZhyDYrNiy2KbbjNin2KpcIixcbiAgc2hvd0FzQ29sdW1uOiBcItmG2YXYp9uM2LQg2KjZhyDYudmG2YjYp9mGINiz2KrZiNmGXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcItis2LPYqtis2YguLi5cIixcbiAgcmVtb3ZlUm93czogXCLYrdiw2YEg2LPYt9ix2YfYp1wiLFxuICBzaG93TGFiZWw6IFwi2YbZhdin24zYtFwiLFxuICBlbnRyaWVzTGFiZWw6IFwi2YjYsdmI2K/bjFwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwi2YXYqtmI2YYg2K/YsSDYrNiv2YjZhFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCLYp9io2LEg2qnZhNmF2KfYqlwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCLZh9uM2LPYqtmI2q/Ysdin2YVcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwi2YXYqtmI2LPYt1wiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwi2KzYr9mI2YRcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcItmG2YXZiNiv2KfYsVwiLFxuICAvLyB2aXN1YWxpemVyX21hdHJpeDogXCJDaGFydFwiLFxuICBjaGFydFR5cGVfYmFyOiBcItmF24zZhNmHINin24xcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwi2YbZiNin2LEg2LnZhdmI2K/bjFwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCLZhtmI2KfYsSDZvti02KrZh1wiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwi2K/ZiNmG2KfYqlwiLFxuICBjaGFydFR5cGVfcGllOiBcItiv2KfYqNix2Ycg2KfbjChwaWUpXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcItm+2LHYp9qp2YbYr9qv24woU2NhdHRlcilcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIti52YLYsdio2Ycg2KfbjFwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxldFwiLFxuICBoaWRlQnV0dG9uOiBcItmF2K7ZgduMXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcItiu2LXZiNi124wg2qnYsdiv2YZcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCLYudmF2YjZhduMINqp2LHYr9mGXCIsXG4gIHNob3dCdXR0b246IFwi2YbZhdin24zYtFwiLFxuICBmaWx0ZXI6IFwi2YHbjNmE2KrYsVwiLFxuICByZXNldEZpbHRlcjogXCLYqNin2LLZhti02KfZhtuMINmB24zZhNiq2LHZh9inXCIsXG4gIGNoYW5nZUxvY2FsZTogXCLYqti624zbjNixINmF2K3ZhNuMXCIsXG4gIGNsZWFyQnV0dG9uOiBcItm+2KfaqSDaqdix2K/ZhlwiLFxuICBhZGRFbGVtZW50OiBcItin2YbYqtiu2KfYqCDYs9mI2KfZhCDYqNix2KfbjCDZhtmF2KfbjNi0Li4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCLYqtix2KrbjNioINm+24zYtNmB2LHYtlwiLFxuICBhc2NPcmRlcjogXCLYtdi52YjYr9uMXCIsXG4gIGRlc2NPcmRlcjogXCLZhtiy2YjZhNuMXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwi2YbZhdin24zYtCDYs9iq2YjZhtmH2KfbjCDZgdix2LnbjFwiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCLYs9in24zYsSDZhdmI2KfYsdivINmIINmG2LjYsdin2KpcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcItmG2YXYp9uM2LQg2K/Ysdi12K9cIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcItiv2LHYtdiv2YfYp9uMINmF2K7ZgduMXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCLZvtuMINiv24wg2KfZgVwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcItin2qnYs9mEXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDc3ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCLYr9in2YbZhNmI2K8g2LfYsditINio2Ycg2LnZhtmI2KfZhiDbjNqpINmB2KfbjNmEIFBOR1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcItmF2K7ZgduMINqp2LHYr9mGINm+2KfYs9iu2YfYp9uMINiu2KfZhNuMXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwi2YbZhdin24zYtCDZvtin2LPYrtmH2KfbjCDYrtin2YTbjFwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcItmH2YXZhyDZvtin2LPYriDZh9inXCIsXG4gIHRvcE5WYWx1ZVRleHQ1OiBcIjUg2b7Yp9iz2K4g2KjYsdiq2LFcIixcbiAgdG9wTlZhbHVlVGV4dDEwOiBcIjEwINm+2KfYs9iuINio2LHYqtixXCIsXG4gIHRvcE5WYWx1ZVRleHQyMDogXCIyMCDZvtin2LPYriDYqNix2KrYsVwiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwi2YXYrtmB24wg2qnYsdiv2YYg2b7Yp9iz2K7Zh9in24wg2q/Zhdi02K/Zh1wiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwi2YbZhdin24zYtCDZvtin2LPYrtmH2KfbjCDar9mF2LTYr9mHXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwi2b7Yp9iz2K4g2YfYp9uMINqv2YXYtNiv2YdcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwi2KfbjNmGINmG2YjYuSDYs9mI2KfZhCDZh9mG2YjYsiDYqtis2LPZhSDZhti02K/ZhyDYp9iz2KpcIixcbiAgbm9SZXN1bHRzOiBcItmH2YbZiNiyINmG2KrbjNis2Ycg2KfbjCDYrdin2LXZhCDZhti02K/ZhyDYp9iz2KpcIixcbiAgc2hvd1BlclZhbHVlczogXCLYqNmHINin2LLYp9uMINmH2LEg2KfYsdiy2LRcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwi2K/YsSDZh9ixINiz2KrZiNmGXCIsXG4gIGFuc3dlcjogXCLZvtin2LPYrlwiLFxuICBjb3JyZWN0QW5zd2VyOiBcItm+2KfYs9iuINi12K3bjNitOiBcIixcbiAgcGVyY2VudDogXCLYr9ix2LXYr1wiLFxuICByZXNwb25zZXM6IFwi2b7Yp9iz2K5cIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmYVwiXSA9IGZhcnNpU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImZhXCJdID0gXCLZgdin2LHYs9uMXCI7XG5cbi8vIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBoYXZlIGJlZW4gdHJhbnNsYXRlZCBieSBhIG1hY2hpbmUgdHJhbnNsYXRpb24gc2VydmljZVxuLy8gUmVtb3ZlIHRob3NlIHN0cmluZ3MgdGhhdCB5b3UgaGF2ZSBjb3JyZWN0ZWQgbWFudWFsbHlcbi8vIHVuZGVmaW5lZC5tYWtlUHJpdmF0ZUNvbHVtbjogXCJNYWtlIGNvbHVtbiBwcml2YXRlXCIgPT4gXCLYrti12YjYtduMINqp2LHYr9mGINiz2KrZiNmGXCJcbi8vIHVuZGVmaW5lZC5tYWtlUHVibGljQ29sdW1uOiBcIk1ha2UgY29sdW1uIHB1YmxpY1wiID0+IFwi2LnZhdmI2YXbjCDaqdix2K/ZhiDYs9iq2YjZhlwiXG4vLyB1bmRlZmluZWQuZmlsdGVyUGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIgPT4gXCLYrNiz2KrYrNmILi4uXCJcbi8vIHVuZGVmaW5lZC5yZW1vdmVSb3dzOiBcIlJlbW92ZSByb3dzXCIgPT4gXCLYrdiw2YEg2LPYt9ix2YfYp1wiXG4vLyB1bmRlZmluZWQuc2hvd0xhYmVsOiBcIlNob3dcIiA9PiBcItmG2YXYp9uM2LRcIlxuLy8gdW5kZWZpbmVkLmVudHJpZXNMYWJlbDogXCJlbnRyaWVzXCIgPT4gXCLZiNix2YjYr9uMXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1cIiA9PiBcItmH24zYs9iq2Yjar9ix2KfZhVwiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9udW1iZXI6IFwiQXZlcmFnZVwiID0+IFwi2YXYqtmI2LPYt1wiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmxlXCIgPT4gXCLYrNiv2YjZhFwiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkNoYXJ0XCIgPT4gXCLZhtmF2YjYr9in2LFcIlxuLy8gdW5kZWZpbmVkLmNoYXJ0VHlwZV92YmFyOiBcIlZlcnRpY2FsIEJhclwiID0+IFwi2YbZiNin2LEg2LnZhdmI2K/bjFwiXG4vLyB1bmRlZmluZWQuY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiU3RhY2tlZCBCYXJcIiA9PiBcItmG2YjYp9ixINm+2LTYqtmHXCJcbi8vIHVuZGVmaW5lZC5jaGFydFR5cGVfZG91Z2hudXQ6IFwiRG91Z2hudXRcIiA9PiBcItiv2YjZhtin2KpcIlxuLy8gdW5kZWZpbmVkLm1ha2VQcml2YXRlQnV0dG9uOiBcIk1ha2UgcHJpdmF0ZVwiID0+IFwi2K7YtdmI2LXbjCDaqdix2K/ZhlwiXG4vLyB1bmRlZmluZWQubWFrZVB1YmxpY0J1dHRvbjogXCJNYWtlIHB1YmxpY1wiID0+IFwi2LnZhdmI2YXbjCDaqdix2K/ZhlwiXG4vLyB1bmRlZmluZWQuc2hvd0J1dHRvbjogXCJTaG93XCIgPT4gXCLZhtmF2KfbjNi0XCJcbi8vIHVuZGVmaW5lZC5maWx0ZXI6IFwiRmlsdGVyXCIgPT4gXCLZgduM2YTYqtixXCJcbi8vIHVuZGVmaW5lZC5jaGFuZ2VMb2NhbGU6IFwiQ2hhbmdlIExvY2FsZVwiID0+IFwi2KrYutuM24zYsSDZhdit2YTbjFwiXG4vLyB1bmRlZmluZWQuZGVmYXVsdE9yZGVyOiBcIkRlZmF1bHQgT3JkZXJcIiA9PiBcItiq2LHYqtuM2Kgg2b7bjNi02YHYsdi2XCJcbi8vIHVuZGVmaW5lZC5hc2NPcmRlcjogXCJBc2NlbmRpbmdcIiA9PiBcIti12LnZiNiv24xcIlxuLy8gdW5kZWZpbmVkLmRlc2NPcmRlcjogXCJEZXNjZW5kaW5nXCIgPT4gXCLZhtiy2YjZhNuMXCJcbi8vIHVuZGVmaW5lZC5zaG93TWlub3JDb2x1bW5zOiBcIlNob3cgbWlub3IgY29sdW1uc1wiID0+IFwi2YbZhdin24zYtCDYs9iq2YjZhtmH2KfbjCDZgdix2LnbjFwiXG4vLyB1bmRlZmluZWQub3RoZXJDb21tZW50VGl0bGU6IFwiT3RoZXIgaXRlbXMgYW5kIGNvbW1lbnRzXCIgPT4gXCLYs9in24zYsSDZhdmI2KfYsdivINmIINmG2LjYsdin2KpcIlxuLy8gdW5kZWZpbmVkLnNob3dQZXJjZW50YWdlczogXCJTaG93IHBlcmNlbnRhZ2VzXCIgPT4gXCLZhtmF2KfbjNi0INiv2LHYtdivXCJcbi8vIHVuZGVmaW5lZC5oaWRlUGVyY2VudGFnZXM6IFwiSGlkZSBwZXJjZW50YWdlc1wiID0+IFwi2K/Ysdi12K/Zh9in24wg2YXYrtmB24xcIlxuLy8gdW5kZWZpbmVkLnBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIiA9PiBcItm+24wg2K/bjCDYp9mBXCJcbi8vIHVuZGVmaW5lZC54bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIgPT4gXCLYp9qp2LPZhFwiXG4vLyB1bmRlZmluZWQuY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiID0+IFwiQ3N2XCJcbi8vIHVuZGVmaW5lZC5zYXZlRGlhZ3JhbUFzUE5HOiBcIkRvd25sb2FkIHBsb3QgYXMgYSBQTkcgZmlsZVwiID0+IFwi2K/Yp9mG2YTZiNivINi32LHYrSDYqNmHINi52YbZiNin2YYg24zaqSDZgdin24zZhCBQTkdcIlxuLy8gdW5kZWZpbmVkLmhpZGVFbXB0eUFuc3dlcnM6IFwiSGlkZSBlbXB0eSBhbnN3ZXJzXCIgPT4gXCLZhdiu2YHbjCDaqdix2K/ZhiDZvtin2LPYrtmH2KfbjCDYrtin2YTbjFwiXG4vLyB1bmRlZmluZWQuc2hvd0VtcHR5QW5zd2VyczogXCJTaG93IGVtcHR5IGFuc3dlcnNcIiA9PiBcItmG2YXYp9uM2LQg2b7Yp9iz2K7Zh9in24wg2K7Yp9mE24xcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQtMTogXCJBbGwgYW5zd2Vyc1wiID0+IFwi2YfZhdmHINm+2KfYs9iuINmH2KdcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQ1OiBcIlRvcCA1IGFuc3dlcnNcIiA9PiBcIjUg2b7Yp9iz2K4g2KjYsdiq2LFcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQxMDogXCJUb3AgMTAgYW5zd2Vyc1wiID0+IFwiMTAg2b7Yp9iz2K4g2KjYsdiq2LFcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQyMDogXCJUb3AgMjAgYW5zd2Vyc1wiID0+IFwiMjAg2b7Yp9iz2K4g2KjYsdiq2LFcIlxuLy8gdW5kZWZpbmVkLmhpZGVNaXNzaW5nQW5zd2VyczogXCJIaWRlIG1pc3NpbmcgYW5zd2Vyc1wiID0+IFwi2YXYrtmB24wg2qnYsdiv2YYg2b7Yp9iz2K7Zh9in24wg2q/Zhdi02K/Zh1wiXG4vLyB1bmRlZmluZWQuc2hvd01pc3NpbmdBbnN3ZXJzOiBcIlNob3cgbWlzc2luZyBhbnN3ZXJzXCIgPT4gXCLZhtmF2KfbjNi0INm+2KfYs9iu2YfYp9uMINqv2YXYtNiv2YdcIlxuLy8gdW5kZWZpbmVkLm1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiTWlzc2luZyBhbnN3ZXJzXCIgPT4gXCLZvtin2LPYriDZh9in24wg2q/Zhdi02K/Zh1wiXG4vLyB1bmRlZmluZWQubm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiVGhpcyBxdWVzdGlvbiB0eXBlIGlzIG5vdCB2aXN1YWxpemVkIHlldFwiID0+IFwi2KfbjNmGINmG2YjYuSDYs9mI2KfZhCDZh9mG2YjYsiDYqtis2LPZhSDZhti02K/ZhyDYp9iz2KpcIlxuLy8gdW5kZWZpbmVkLm5vUmVzdWx0czogXCJUaGVyZSBhcmUgbm8gcmVzdWx0cyB5ZXRcIiA9PiBcItmH2YbZiNiyINmG2KrbjNis2Ycg2KfbjCDYrdin2LXZhCDZhti02K/ZhyDYp9iz2KpcIlxuLy8gdW5kZWZpbmVkLnNob3dQZXJWYWx1ZXM6IFwiUGVyIFZhbHVlc1wiID0+IFwi2KjZhyDYp9iy2KfbjCDZh9ixINin2LHYsti0XCJcbi8vIHVuZGVmaW5lZC5zaG93UGVyQ29sdW1uczogXCJQZXIgQ29sdW1uc1wiID0+IFwi2K/YsSDZh9ixINiz2KrZiNmGXCJcbi8vIHVuZGVmaW5lZC5hbnN3ZXI6IFwiQW5zd2VyXCIgPT4gXCLZvtin2LPYrlwiXG4vLyB1bmRlZmluZWQuY29ycmVjdEFuc3dlcjogXCJDb3JyZWN0IGFuc3dlcjogXCIgPT4gXCLZvtin2LPYriDYtdit24zYrTogXCJcbi8vIHVuZGVmaW5lZC5wZXJjZW50OiBcIlBlcmNlbnRcIiA9PiBcItiv2LHYtdivXCJcbi8vIHVuZGVmaW5lZC5yZXNwb25zZXM6IFwiUmVzcG9uc2VzXCIgPT4gXCLZvtin2LPYrlwiXG4iLCIvLyBUaGlzIGRpY3Rpb25hcnkgY29udGFpbnMgMSB1bnRyYW5zbGF0ZWQgb3IgaW5oZXJpdGVkIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuLy8gVGhlc2Ugc3RyaW5ncyBhcmUgY29tbWVudGVkIG91dC4gVW5jb21tZW50IGFuZCBlZGl0IHRoZW0gaWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgdHJhbnNsYXRpb25zLlxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBmcmVuY2hTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCJHcm91cGVyXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiRGlzc29jaWVyXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTw6lsZWN0aW9ubmVyXCIsXG4gIGhpZGVDb2x1bW46IFwiTWFzcXVlciBjb2xvbm5lXCIsXG4gIHNob3dDb2x1bW46IFwiQWZmaWNoZXIgY29sb25uZVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJSZW5kcmUgbGEgY29sb25uZSBwcml2w6lcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJSZW5kcmUgbGEgY29sb25uZSBwdWJsaWNcIixcbiAgbW92ZVRvRGV0YWlsOiBcIkTDqXBsYWNlciB2ZXJzIGTDqXRhaWxzXCIsXG4gIHNob3dBc0NvbHVtbjogXCJBZmZpY2hlciBlbiBjb2xvbm5lXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlJlY2hlcmNoZXIuLi5cIixcbiAgcmVtb3ZlUm93czogXCJTdXBwcmltZXIgY29sb25uZVwiLFxuICBzaG93TGFiZWw6IFwiQWZmaWNoZXJcIixcbiAgZW50cmllc0xhYmVsOiBcImVudHLDqWVzXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJUZXh0ZXMgZW4gdGFibGVcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiTnVhZ2VzIGRlIG1vdHNcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtbWVcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiTW95ZW5uZVwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFibGVcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkdyYXBoaXF1ZVwiLFxuICAvLyB2aXN1YWxpemVyX21hdHJpeDogXCJDaGFydFwiLFxuICBjaGFydFR5cGVfYmFyOiBcIkJhcnJlc1wiLFxuICBjaGFydFR5cGVfdmJhcjogXCJCYXJyZSB2ZXJ0aWNhbGVcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiQmFycmVzIGVtcGlsw6llc1wiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiQW5uZWF1XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiU2VjdGV1cnNcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiTnVhZ2VzIGRlIHBvaW50c1wiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR2F1Z2VcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCdWxsZXNcIixcbiAgaGlkZUJ1dHRvbjogXCJNYXNxdWVyXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIlJlbmRyZSBwcml2w6lcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCJSZW5kcmUgcHVibGlxdWVcIixcbiAgc2hvd0J1dHRvbjogXCJBZmZpY2hlclwiLFxuICBmaWx0ZXI6IFwiRmlsdHJlXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJhZnJhaWNoaXIgRmlsdHJlc1wiLFxuICBjaGFuZ2VMb2NhbGU6IFwiQ2hhbmdlciBsZXMgcGFyYW3DqHRyZXMgcsOpZ2lvbmF1eFwiLFxuICBjbGVhckJ1dHRvbjogXCJSYWZyYWljaGlyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiQ2hvaXNpciBsYSBxdWVzdGlvbiDDoCBhZmZpY2hlci4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiRGVmYXV0XCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGFudFwiLFxuICBkZXNjT3JkZXI6IFwiRGVzY2VuZGFudFwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIkFmZmljaGVyIGxlcyBjb2xvbm5lcyBtaW5ldXJlc1wiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBdXRyZSDDqWzDqW1lbnQgZXQgY29tbWVudGFpcmVzXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJBZmZpY2hlciBsZXMgcG91cmNlbnRhZ2VzXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJNYXNxdWVyIGxlcyBwb3VyY2VudGFnZXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsbGVyXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJGaWNoaWVyIENTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIlNhdXZlciBlbiBwbmdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJNYXNxdWVyIGxlcyByw6lwb25zZXMgdmlkZXNcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJBZmZpY2hlciBsZXMgcsOpcG9uc2VzIHZpZGVzXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVG91dGVzIGxlcyByw6lwb25zZXNcIixcbiAgdG9wTlZhbHVlVGV4dDU6IFwiVG9wIDUgZGVzIHLDqXBvbnNlc1wiLFxuICB0b3BOVmFsdWVUZXh0MTA6IFwiVG9wIDEwIGRlcyByw6lwb25zZXNcIixcbiAgdG9wTlZhbHVlVGV4dDIwOiBcIlRvcCAyMCBkZXMgcsOpcG9uc2VzXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCJNYXNxdWVyIGxlcyByw6lwb25zZXMgbWFucXVhbnRlc1wiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiQWZmaWNoZXIgbGVzIHLDqXBvbnNlcyBtYW5xdWFudGVzXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiUsOpcG9uc2VzIG1hbnF1YW50ZXNcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiQ2UgdHlwZSBkZSBxdWVzdGlvbiBuJ2VzdCBwYXMgZW5jb3JlIHZpc3VhbGlzw6lcIixcbiAgbm9SZXN1bHRzOiBcIklsIG4neSBhIHBhcyBlbmNvcmUgZGUgcsOpc3VsdGF0c1wiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBhciB2YWxldXJcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGFyIGNvbG9ubmVcIixcbiAgYW5zd2VyOiBcIlLDqXBvbnNlXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiUsOpcG9uc2UgY29ycmVjdGU6IFwiLFxuICBwZXJjZW50OiBcIlBvdXJjZW50YWdlXCIsXG4gIHJlc3BvbnNlczogXCJSw6lwb25zZXNcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmclwiXSA9IGZyZW5jaFN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmclwiXSA9IFwiRnJhbsOnYWlzXCI7XG5cbi8vIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBoYXZlIGJlZW4gdHJhbnNsYXRlZCBieSBhIG1hY2hpbmUgdHJhbnNsYXRpb24gc2VydmljZVxuLy8gUmVtb3ZlIHRob3NlIHN0cmluZ3MgdGhhdCB5b3UgaGF2ZSBjb3JyZWN0ZWQgbWFudWFsbHlcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1cIiA9PiBcIkhpc3RvZ3JhbW1lXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX251bWJlcjogXCJBdmVyYWdlXCIgPT4gXCJNb3llbm5lXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFibGVcIiA9PiBcIlRhYmxlXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiQ2hhcnRcIiA9PiBcIkdyYXBoaXF1ZVwiXG4vLyB1bmRlZmluZWQuY2hhcnRUeXBlX3ZiYXI6IFwiVmVydGljYWwgQmFyXCIgPT4gXCJCYXJyZSB2ZXJ0aWNhbGVcIlxuLy8gdW5kZWZpbmVkLmNoYW5nZUxvY2FsZTogXCJDaGFuZ2UgTG9jYWxlXCIgPT4gXCJDaGFuZ2VyIGxlcyBwYXJhbcOodHJlcyByw6lnaW9uYXV4XCJcbi8vIHVuZGVmaW5lZC5zaG93UGVyY2VudGFnZXM6IFwiU2hvdyBwZXJjZW50YWdlc1wiID0+IFwiQWZmaWNoZXIgbGVzIHBvdXJjZW50YWdlc1wiXG4vLyB1bmRlZmluZWQuaGlkZVBlcmNlbnRhZ2VzOiBcIkhpZGUgcGVyY2VudGFnZXNcIiA9PiBcIk1hc3F1ZXIgbGVzIHBvdXJjZW50YWdlc1wiXG4vLyB1bmRlZmluZWQucGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiID0+IFwiUERGXCJcbi8vIHVuZGVmaW5lZC54bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIgPT4gXCJFeGNlbGxlclwiXG4vLyB1bmRlZmluZWQuY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiID0+IFwiRmljaGllciBDU1ZcIlxuLy8gdW5kZWZpbmVkLmhpZGVFbXB0eUFuc3dlcnM6IFwiSGlkZSBlbXB0eSBhbnN3ZXJzXCIgPT4gXCJNYXNxdWVyIGxlcyByw6lwb25zZXMgdmlkZXNcIlxuLy8gdW5kZWZpbmVkLnNob3dFbXB0eUFuc3dlcnM6IFwiU2hvdyBlbXB0eSBhbnN3ZXJzXCIgPT4gXCJBZmZpY2hlciBsZXMgcsOpcG9uc2VzIHZpZGVzXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0LTE6IFwiQWxsIGFuc3dlcnNcIiA9PiBcIlRvdXRlcyBsZXMgcsOpcG9uc2VzXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0NTogXCJUb3AgNSBhbnN3ZXJzXCIgPT4gXCJUb3AgNSBkZXMgcsOpcG9uc2VzXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0MTA6IFwiVG9wIDEwIGFuc3dlcnNcIiA9PiBcIlRvcCAxMCBkZXMgcsOpcG9uc2VzXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0MjA6IFwiVG9wIDIwIGFuc3dlcnNcIiA9PiBcIlRvcCAyMCBkZXMgcsOpcG9uc2VzXCJcbi8vIHVuZGVmaW5lZC5oaWRlTWlzc2luZ0Fuc3dlcnM6IFwiSGlkZSBtaXNzaW5nIGFuc3dlcnNcIiA9PiBcIk1hc3F1ZXIgbGVzIHLDqXBvbnNlcyBtYW5xdWFudGVzXCJcbi8vIHVuZGVmaW5lZC5zaG93TWlzc2luZ0Fuc3dlcnM6IFwiU2hvdyBtaXNzaW5nIGFuc3dlcnNcIiA9PiBcIkFmZmljaGVyIGxlcyByw6lwb25zZXMgbWFucXVhbnRlc1wiXG4vLyB1bmRlZmluZWQubWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJNaXNzaW5nIGFuc3dlcnNcIiA9PiBcIlLDqXBvbnNlcyBtYW5xdWFudGVzXCIiLCIvLyBUaGlzIGRpY3Rpb25hcnkgY29udGFpbnMgMSB1bnRyYW5zbGF0ZWQgb3IgaW5oZXJpdGVkIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuLy8gVGhlc2Ugc3RyaW5ncyBhcmUgY29tbWVudGVkIG91dC4gVW5jb21tZW50IGFuZCBlZGl0IHRoZW0gaWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgdHJhbnNsYXRpb25zLlxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBnZXJtYW5TdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCJHcnVwcGllcmVuXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiR3J1cHBpZXJ1bmcgYXVmaGViZW5cIixcbiAgc2VsZWN0QnV0dG9uOiBcIk1pY2ggYXVzd8OkaGxlblwiLFxuICBoaWRlQ29sdW1uOiBcIlNwYWx0ZSBhdXNibGVuZGVuXCIsXG4gIHNob3dDb2x1bW46IFwiU3BhbHRlIGVpbmJsZW5kZW5cIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiU3BhbHRlIHByaXZhdCBtYWNoZW5cIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJTcGFsdGUgdmVyw7ZmZmVudGxpY2hlblwiLFxuICBtb3ZlVG9EZXRhaWw6IFwiaW4gRGV0YWlscyB2ZXJzY2hpZWJlblwiLFxuICBzaG93QXNDb2x1bW46IFwiQWxzIFNwYWx0ZSBhbnplaWdlblwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJTdWNoZS4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlplaWxlbiBlbnRmZXJuZW5cIixcbiAgc2hvd0xhYmVsOiBcImFuemVpZ2VuXCIsXG4gIGVudHJpZXNMYWJlbDogXCJFaW50csOkZ2VcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRlIGluIFRhYmVsbGVuZm9ybVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJXb3JkY2xvdWRcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtbVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJEdXJjaHNjaG5pdHRcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcIkxpc3RlXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJEaWFncmFtbXR5cFwiLFxuICAvLyB2aXN1YWxpemVyX21hdHJpeDogXCJDaGFydFwiLFxuICBjaGFydFR5cGVfYmFyOiBcIkJhbGtlbmRpYWdyYW1tXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIkJhbGtlbmRpYWdyYW1tIHZlcnRpa2FsXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkdlc3RhcGVsdGVzIEJhbGtlbmRpYWdyYW1tXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb251dC1EaWFncmFtbVwiLFxuICBjaGFydFR5cGVfcGllOiBcIktyZWlzZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiUHVua3RlZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIlBlZ2VsZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJBdWZ6w6RobHVuZ3NkaWFncmFtbVwiLFxuICBoaWRlQnV0dG9uOiBcIkF1c2JsZW5kZW5cIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiUHJpdmF0IG1hY2hlblwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIsOWZmZlbnRsaWNoIG1hY2hlblwiLFxuICBzaG93QnV0dG9uOiBcIkFuemVpZ2VuXCIsXG4gIGZpbHRlcjogXCJGaWx0ZXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiRmlsdGVyIHp1csO8Y2tzZXR6ZW5cIixcbiAgY2hhbmdlTG9jYWxlOiBcIkxva2FsaXNpZXJ1bmcgw6RuZGVyblwiLFxuICBjbGVhckJ1dHRvbjogXCJFaW5zdGVsbHVuZ2VuIGzDtnNjaGVuXCIsXG4gIGFkZEVsZW1lbnQ6IFwiV8OkaGxlbiBTaWUgZWluZSBGcmFnZSwgdW0genUgemVpZ2VuLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJTdGFuZGFyZHJlaWhlbmZvbGdlXCIsXG4gIGFzY09yZGVyOiBcIkF1ZnN0ZWlnZW5kXCIsXG4gIGRlc2NPcmRlcjogXCJBYnN0ZWlnZW5kXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiS2xlaW5lcmUgU3BhbHRlbiBhbnplaWdlblwiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBbmRlcmUgUHVua3RlIHVuZCBLb21tZW50YXJlXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJQcm96ZW50c8OkdHplIGFuemVpZ2VuXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJQcm96ZW50c8OkdHplIGF1c2JsZW5kZW5cIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJEaWFncmFtbSBhbHMgcG5nIGhlcnVudGVybGFkZW5cIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJMZWVyZSBBbnR3b3J0ZW4gYXVzYmxlbmRlblwiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIkxlZXJlIEFudHdvcnRlbiBhbnplaWdlblwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIkFsbGUgQW50d29ydGVuXCIsXG4gIHRvcE5WYWx1ZVRleHQ1OiBcIlRvcCA1IEFudHdvcnRlblwiLFxuICB0b3BOVmFsdWVUZXh0MTA6IFwiVG9wIDEwIEFudHdvcnRlblwiLFxuICB0b3BOVmFsdWVUZXh0MjA6IFwiVG9wIDIwIEFudHdvcnRlblwiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiRmVobGVuZGUgQW50d29ydGVuIGF1c2JsZW5kZW5cIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIkZlaGxlbmRlIEFudHdvcnRlbiBhbnplaWdlblwiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIkZlaGxlZGUgQW50d29ydGVuXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIkbDvHIgZGllc2VuIEZyYWdldHlwIGdpYnQgZXMgbm9jaCBrZWluZSBWaXN1YWxpc2llcnVuZy5cIixcbiAgbm9SZXN1bHRzOiBcIkVzIGxpZWdlbiBub2NoIGtlaW5lIEVyZ2Vibmlzc2Ugdm9yXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwiUHJvIFdlcnRcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUHJvIFNwYWx0ZVwiLFxuICBhbnN3ZXI6IFwiQW50d29ydFwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIktvcnJla3RlIEFudHdvcnQ6IFwiLFxuICBwZXJjZW50OiBcIlByb3plbnRcIixcbiAgcmVzcG9uc2VzOiBcIkFudHdvcnRlblwiXG59O1xubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJkZVwiXSA9IGdlcm1hblN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJkZVwiXSA9IFwiRGV1dHNjaFwiO1xuIiwiLy8gVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIDEgdW50cmFuc2xhdGVkIG9yIGluaGVyaXRlZCBsb2NhbGl6YXRpb24gc3RyaW5ncy5cbi8vIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1lbnRlZCBvdXQuIFVuY29tbWVudCBhbmQgZWRpdCB0aGVtIGlmIHlvdSB3YW50IHRvIGFkZCB5b3VyIHRyYW5zbGF0aW9ucy5cbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgaXRhbGlhblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIlJhZ2dydXBwYVwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIkRpdmlkaVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZXppb25hbWlcIixcbiAgaGlkZUNvbHVtbjogXCJOYXNjb25kaSBjb2xvbm5hXCIsXG4gIHNob3dDb2x1bW46IFwiTW9zdHJhIGNvbG9ubmFcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiUmVuZGkgbGEgY29sb25uYSBwcml2YXRhXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiUmVuZGkgbGEgY29sb25uYSBwdWJibGljYVwiLFxuICBtb3ZlVG9EZXRhaWw6IFwiU3Bvc3RhIGluIERldHRhZ2xpb1wiLFxuICBzaG93QXNDb2x1bW46IFwiTW9zdHJhIGNvbWUgQ29sb25uYVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJDZXJjYS4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlJpbXVvdmkgcmlnaGVcIixcbiAgc2hvd0xhYmVsOiBcIk1vc3RyYVwiLFxuICBlbnRyaWVzTGFiZWw6IFwidm9jaVwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiUGFyb2xlIGluIHRhYmVsbGFcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiTnV2b2xhIGRpIHBhcm9sZVwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJJc3RvZ3JhbW1hXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIk1lZGlhXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJlbGxhXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJHcmFmaWNvXCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiR3JhZmljbyBhIGJhcnJlXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIkdyYWZpY28gYSBiYXJyZSB2ZXJ0aWNhbGlcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR3JhZmljbyBhIGJhcnJlIHNvdnJhcHBvc3RlXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJHcmFmaWNvIGEgY2lhbWJlbGxhXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiR3JhZmljbyBhIHRvcnRhXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIkdyYWZpY28gYSBkaXNwZXJzaW9uZVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR3JhZmljbyBHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIlB1bnRvXCIsXG4gIGhpZGVCdXR0b246IFwiTmFzY29uZGlcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiUmVuZGkgcHJpdmF0b1wiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIlJlbmRpIHB1YmJsaWNvXCIsXG4gIHNob3dCdXR0b246IFwiTW9zdHJhXCIsXG4gIGZpbHRlcjogXCJGaWx0cm9cIixcbiAgcmVzZXRGaWx0ZXI6IFwiQ2FuY2VsbGEgZmlsdHJvXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJDYW1iaWEgbGluZ3VhXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkNhbmNlbGxhXCIsXG4gIGFkZEVsZW1lbnQ6IFwiU2NlZ2xpIGxhIGRvbWFuZGEgZGEgbW9zdHJhcmUuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIk9yZGluZSBkaSBEZWZhdWx0XCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGVudGVcIixcbiAgZGVzY09yZGVyOiBcIkRpc2NlbmRlbnRlXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiTW9zdHJhIGNvbG9ubmUgc2Vjb25kYXJpZVwiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBbHRyaSBwdW50aSBlIGNvbW1lbnRpXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJNb3N0cmEgcGVyY2VudHVhbGlcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIk5hc2NvbmRpIHBlcmNlbnR1YWxpXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiU2NhcmljYSBpbCBncmFmaWNvIGluIGZvcm1hdG8gcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwiTmFzY29uZGkgcmlzcG9zdGUgdnVvdGVcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJNb3N0cmEgcmlzcG9zdGUgdnVvdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJUdXR0ZSBsZSByaXNwb3N0ZVwiLFxuICB0b3BOVmFsdWVUZXh0NTogXCJUb3AgNSByaXNwb3N0ZVwiLFxuICB0b3BOVmFsdWVUZXh0MTA6IFwiVG9wIDEwIHJpc3Bvc3RlXCIsXG4gIHRvcE5WYWx1ZVRleHQyMDogXCJUb3AgMjAgcmlzcG9zdGVcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIk5hc2NvbmRpIGxlIHJpc3Bvc3RlIG1hbmNhbnRpXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJNb3N0cmEgbGUgcmlzcG9zdGUgbWFuY2FudGlcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJSaXNwb3N0ZSBtYW5jYW50aVwiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJRdWVzdG8gdGlwbyBkaSBkb21hbmRhIG5vbiDDqCBhbmNvcmEgc3RhdG8gdmlzdWFsaXp6YXRvXCIsXG4gIG5vUmVzdWx0czogXCJOb24gY2kgc29ubyBhbmNvcmEgcmlzdWx0YXRpXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwiUGVyIFZhbG9yaVwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQZXIgQ29sb25uZVwiLFxuICBhbnN3ZXI6IFwiUmlzcG9zdGFcIixcbiAgY29ycmVjdEFuc3dlcjogXCJSaXNwb3N0YSBlc2F0dGE6IFwiLFxuICBwZXJjZW50OiBcIlBlcmNlbnR1YWxlXCIsXG4gIHJlc3BvbnNlczogXCJSaXNwb3N0ZVwiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcIml0XCJdID0gaXRhbGlhblN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJpdFwiXSA9IFwiSXRhbGlhbm9cIjtcblxuLy8gVGhlIGZvbGxvd2luZyBzdHJpbmdzIGhhdmUgYmVlbiB0cmFuc2xhdGVkIGJ5IGEgbWFjaGluZSB0cmFuc2xhdGlvbiBzZXJ2aWNlXG4vLyBSZW1vdmUgdGhvc2Ugc3RyaW5ncyB0aGF0IHlvdSBoYXZlIGNvcnJlY3RlZCBtYW51YWxseVxuLy8gdW5kZWZpbmVkLmNvcnJlY3RBbnN3ZXI6IFwiQ29ycmVjdCBhbnN3ZXI6IFwiID0+IFwiUmlzcG9zdGEgZXNhdHRhOiBcIiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgamFwYW5lc2VTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCLjgrDjg6vjg7zjg5fljJZcIixcbiAgdW5ncm91cEJ1dHRvbjogXCLjgrDjg6vjg7zjg5fop6PpmaRcIixcbiAgc2VsZWN0QnV0dG9uOiBcIumBuOaKnlwiLFxuICBoaWRlQ29sdW1uOiBcIuWIl+OCkumdnuihqOekulwiLFxuICBzaG93Q29sdW1uOiBcIuWIl+OCkuihqOekulwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCLliJfjgpLpnZ7lhazplovjgavjgZnjgotcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCLliJfjgpLlhazplovjgZnjgotcIixcbiAgbW92ZVRvRGV0YWlsOiBcIuips+e0sOOBq+enu+WLlVwiLFxuICBzaG93QXNDb2x1bW46IFwi5YiX44Go44GX44Gm6KGo56S6XCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIuaknOe0oi4uLlwiLFxuICByZW1vdmVSb3dzOiBcIuihjOOCkuWJiumZpFwiLFxuICBzaG93TGFiZWw6IFwi6KGo56S6XCIsXG4gIGVudHJpZXNMYWJlbDogXCLku7ZcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIuODhuOCreOCueODiFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCLjg6/jg7zjg4njgq/jg6njgqbjg4lcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwi44OS44K544OI44Kw44Op44OgXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIuW5s+Wdh1wiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwi44OG44O844OW44OrXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCLjg4Hjg6Pjg7zjg4hcIixcbiAgY2hhcnRUeXBlX2JhcjogXCLmo5LjgrDjg6njg5VcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwi57im5qOS44Kw44Op44OVXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIuepjeOBv+S4iuOBkuajkuOCsOODqeODlVwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwi44OJ44O844OK44OE44OB44Oj44O844OIXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwi5YaG44Kw44Op44OVXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIuaVo+W4g+Wbs1wiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwi44Ky44O844K4XCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwi44OQ44Os44OD44OIXCIsXG4gIGhpZGVCdXR0b246IFwi6Z2e6KGo56S6XCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIumdnuWFrOmWi+OBq+OBmeOCi1wiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIuWFrOmWi+OBmeOCi1wiLFxuICBzaG93QnV0dG9uOiBcIuihqOekulwiLFxuICBmaWx0ZXI6IFwi44OV44Kj44Or44K/44O8XCIsXG4gIHJlc2V0RmlsdGVyOiBcIuODleOCo+ODq+OCv+ODvOOCkuODquOCu+ODg+ODiFwiLFxuICBjaGFuZ2VMb2NhbGU6IFwi6KiA6Kqe44KS5aSJ5pu0XCIsXG4gIGNsZWFyQnV0dG9uOiBcIuOCr+ODquOColwiLFxuICBhZGRFbGVtZW50OiBcIuihqOekuuOBmeOCi+izquWVj+OCkumBuOaKni4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwi44OH44OV44Kp44Or44OI6aCGXCIsXG4gIGFzY09yZGVyOiBcIuaYh+mghlwiLFxuICBkZXNjT3JkZXI6IFwi6ZmN6aCGXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwi44Oe44Kk44OK44O85YiX44KS6KGo56S6XCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIuOBneOBruS7luOBruOCouOCpOODhuODoOOBqOOCs+ODoeODs+ODiFwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwi44OR44O844K744Oz44OG44O844K444KS6KGo56S6XCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCLjg5Hjg7zjgrvjg7Pjg4bjg7zjgrjjgpLpnZ7ooajnpLpcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCLjg5fjg63jg4Pjg4jjgpJQTkfjg5XjgqHjgqTjg6vjgajjgZfjgabkv53lrZhcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCLnqbrjga7lm57nrZTjgpLpnZ7ooajnpLpcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCLnqbrjga7lm57nrZTjgpLooajnpLpcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCLjgZnjgbnjgabjga7lm57nrZRcIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIuS4iuS9jTXjgaTjga7lm57nrZRcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCLkuIrkvY0xMOOBruWbnuetlFwiLFxuICBcInRvcE5WYWx1ZVRleHQyMFwiOiBcIuS4iuS9jTIw44Gu5Zue562UXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCLmrKDmkI3lgKTjgpLpnZ7ooajnpLpcIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIuasoOaQjeWApOOCkuihqOekulwiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIuasoOaQjeWApFwiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCLjgZPjga7os6rllY/jgr/jgqTjg5fjga/jgb7jgaDoppbopprljJbjgZXjgozjgabjgYTjgb7jgZvjgpNcIixcbiAgbm9SZXN1bHRzOiBcIuOBvuOBoOe1kOaenOOBjOOBguOCiuOBvuOBm+OCk1wiLFxuICBzaG93UGVyVmFsdWVzOiBcIuWApOOBlOOBqOOBq+ihqOekulwiLFxuICBzaG93UGVyQ29sdW1uczogXCLliJfjgZTjgajjgavooajnpLpcIixcbiAgYW5zd2VyOiBcIuWbnuetlFwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIuato+inozogXCIsXG4gIHBlcmNlbnQ6IFwi44OR44O844K744Oz44OIXCIsXG4gIHJlc3BvbnNlczogXCLlm57nrZTmlbBcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJqYVwiXSA9IGphcGFuZXNlU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImphXCJdID0gXCJKYXBhbmVzZVwiO1xuIiwiLy8gVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIDEgdW50cmFuc2xhdGVkIG9yIGluaGVyaXRlZCBsb2NhbGl6YXRpb24gc3RyaW5ncy5cbi8vIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1lbnRlZCBvdXQuIFVuY29tbWVudCBhbmQgZWRpdCB0aGVtIGlmIHlvdSB3YW50IHRvIGFkZCB5b3VyIHRyYW5zbGF0aW9ucy5cbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgbm9yd2VnaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3J1cHBlclwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIk9wcGhldiBncnVwcGVyaW5nXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJWZWxnXCIsXG4gIGhpZGVDb2x1bW46IFwiU2tqdWwga29sb25uZVwiLFxuICBzaG93Q29sdW1uOiBcIlZpcyBrb2xvbm5lXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIkdqw7hyIGtvbG9ubmUgcHJpdmF0XCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiR2rDuHIga29sb25uZSBvZmZlbnRsaWdcIixcbiAgbW92ZVRvRGV0YWlsOiBcIkZseXR0IHRpbCBkZXRhbGplcnQgdmlzbmluZ1wiLFxuICBzaG93QXNDb2x1bW46IFwiVmlzIHNvbSBrb2xvbm5lXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlPDuGsuLi5cIixcbiAgcmVtb3ZlUm93czogXCJGamVybiByYWRlclwiLFxuICBzaG93TGFiZWw6IFwiVmlzXCIsXG4gIGVudHJpZXNMYWJlbDogXCJvcHBmw7hyaW5nZXJcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRhYmVsbHZpc25pbmdcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiT3Jkc2t5XCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJHamVubm9tc25pdHRcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcIkJvcmRcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIlNqw7hrYXJ0XCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiU3RvbHBlZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfdmJhcjogXCJWZXJ0aWthbCBzdG9scGVcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiU3RhYmxldCBzdG9scGVkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJIanVsZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfcGllOiBcIlNla3RvcmRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiUHVua3RkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJNw6VsZWRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJLdWxlZGlhZ3JhbVwiLFxuICBoaWRlQnV0dG9uOiBcIlNranVsXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIkdqw7hyIHByaXZhdFwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIkdqw7hyIG9mZmVudGxpZ1wiLFxuICBzaG93QnV0dG9uOiBcIlZpc1wiLFxuICBmaWx0ZXI6IFwiRmlsdGVyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIk51bGxzdGlsbCBmaWx0ZXJcIixcbiAgY2hhbmdlTG9jYWxlOiBcIkJ5dHQgc3Byw6VrXCIsXG4gIGNsZWFyQnV0dG9uOiBcIlTDuG1cIixcbiAgYWRkRWxlbWVudDogXCJWZWxnIHNww7hyc23DpWwuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIlN0YW5kYXJkXCIsXG4gIGFzY09yZGVyOiBcIlN0aWdlbmRlXCIsXG4gIGRlc2NPcmRlcjogXCJTeW5rZW5kZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIlZpcyBtaW5kcmUga29sb25uZXJcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiQW5uZXQgb2cga29tbWVudGFyZXJcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIlZpcyBwcm9zZW50ZXJcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlNranVsIHByb3NlbnRlclwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiT3ZlcmfDpVwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiTGFzdCBuZWQgcGxvdHQgc29tIGVuIFBORy1maWxcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJTa2p1bCB0b21tZSBzdmFyXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiVmlzIHRvbW1lIHN2YXJcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJBbGxlIHN2YXJcIixcbiAgdG9wTlZhbHVlVGV4dDU6IFwiVG9wcCA1IHN2YXJcIixcbiAgdG9wTlZhbHVlVGV4dDEwOiBcIlRvcHAgMTAgc3ZhclwiLFxuICB0b3BOVmFsdWVUZXh0MjA6IFwiVG9wcCAyMCBzdmFyXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCJTa2p1bCBtYW5nbGVuZGUgc3ZhclwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiVmlzIG1hbmdsZW5kZSBzdmFyXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiTWFuZ2xlciBzdmFyXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIkRlbm5lIHNww7hyc23DpWxzdHlwZW4gZXIgaWtrZSB2aXN1YWxpc2VydCBlbm7DpVwiLFxuICBub1Jlc3VsdHM6IFwiRGV0IGVyIGluZ2VuIHJlc3VsdGF0ZXIgZW5uw6VcIixcbiAgc2hvd1BlclZhbHVlczogXCJQZXIgdmVyZGllclwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQZXIga29sb25uZXJcIixcbiAgYW5zd2VyOiBcIlN2YXJlXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiUmlrdGlnIHN2YXI6IFwiLFxuICBwZXJjZW50OiBcIlByb3NlbnRcIixcbiAgcmVzcG9uc2VzOiBcIlN2YXJcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJub1wiXSA9IG5vcndlZ2lhblN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJub1wiXSA9IFwiTm9yc2tcIjtcblxuLy8gVGhlIGZvbGxvd2luZyBzdHJpbmdzIGhhdmUgYmVlbiB0cmFuc2xhdGVkIGJ5IGEgbWFjaGluZSB0cmFuc2xhdGlvbiBzZXJ2aWNlXG4vLyBSZW1vdmUgdGhvc2Ugc3RyaW5ncyB0aGF0IHlvdSBoYXZlIGNvcnJlY3RlZCBtYW51YWxseVxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbVwiID0+IFwiSGlzdG9ncmFtXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX251bWJlcjogXCJBdmVyYWdlXCIgPT4gXCJHamVubm9tc25pdHRcIlxuLy8gdW5kZWZpbmVkLnZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJsZVwiID0+IFwiQm9yZFwiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkNoYXJ0XCIgPT4gXCJTasO4a2FydFwiXG4vLyB1bmRlZmluZWQuY2hhcnRUeXBlX3ZiYXI6IFwiVmVydGljYWwgQmFyXCIgPT4gXCJWZXJ0aWthbCBzdG9scGVcIlxuLy8gdW5kZWZpbmVkLmZpbHRlcjogXCJGaWx0ZXJcIiA9PiBcIkZpbHRlclwiXG4vLyB1bmRlZmluZWQucGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiID0+IFwiUERGXCJcbi8vIHVuZGVmaW5lZC54bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIgPT4gXCJPdmVyZ8OlXCJcbi8vIHVuZGVmaW5lZC5jc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIgPT4gXCJDU1ZcIlxuLy8gdW5kZWZpbmVkLnNhdmVEaWFncmFtQXNQTkc6IFwiRG93bmxvYWQgcGxvdCBhcyBhIFBORyBmaWxlXCIgPT4gXCJMYXN0IG5lZCBwbG90dCBzb20gZW4gUE5HLWZpbFwiXG4vLyB1bmRlZmluZWQuaGlkZUVtcHR5QW5zd2VyczogXCJIaWRlIGVtcHR5IGFuc3dlcnNcIiA9PiBcIlNranVsIHRvbW1lIHN2YXJcIlxuLy8gdW5kZWZpbmVkLnNob3dFbXB0eUFuc3dlcnM6IFwiU2hvdyBlbXB0eSBhbnN3ZXJzXCIgPT4gXCJWaXMgdG9tbWUgc3ZhclwiXG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dC0xOiBcIkFsbCBhbnN3ZXJzXCIgPT4gXCJBbGxlIHN2YXJcIlxuLy8gdW5kZWZpbmVkLnRvcE5WYWx1ZVRleHQ1OiBcIlRvcCA1IGFuc3dlcnNcIiA9PiBcIlRvcHAgNSBzdmFyXCJcbi8vIHVuZGVmaW5lZC50b3BOVmFsdWVUZXh0MTA6IFwiVG9wIDEwIGFuc3dlcnNcIiA9PiBcIlRvcHAgMTAgc3ZhclwiXG4vLyB1bmRlZmluZWQudG9wTlZhbHVlVGV4dDIwOiBcIlRvcCAyMCBhbnN3ZXJzXCIgPT4gXCJUb3BwIDIwIHN2YXJcIlxuLy8gdW5kZWZpbmVkLmhpZGVNaXNzaW5nQW5zd2VyczogXCJIaWRlIG1pc3NpbmcgYW5zd2Vyc1wiID0+IFwiU2tqdWwgbWFuZ2xlbmRlIHN2YXJcIlxuLy8gdW5kZWZpbmVkLnNob3dNaXNzaW5nQW5zd2VyczogXCJTaG93IG1pc3NpbmcgYW5zd2Vyc1wiID0+IFwiVmlzIG1hbmdsZW5kZSBzdmFyXCJcbi8vIHVuZGVmaW5lZC5taXNzaW5nQW5zd2Vyc0xhYmVsOiBcIk1pc3NpbmcgYW5zd2Vyc1wiID0+IFwiTWFuZ2xlciBzdmFyXCJcbi8vIHVuZGVmaW5lZC5ub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJUaGlzIHF1ZXN0aW9uIHR5cGUgaXMgbm90IHZpc3VhbGl6ZWQgeWV0XCIgPT4gXCJEZW5uZSBzcMO4cnNtw6Vsc3R5cGVuIGVyIGlra2UgdmlzdWFsaXNlcnQgZW5uw6VcIlxuLy8gdW5kZWZpbmVkLm5vUmVzdWx0czogXCJUaGVyZSBhcmUgbm8gcmVzdWx0cyB5ZXRcIiA9PiBcIkRldCBlciBpbmdlbiByZXN1bHRhdGVyIGVubsOlXCJcbi8vIHVuZGVmaW5lZC5zaG93UGVyVmFsdWVzOiBcIlBlciBWYWx1ZXNcIiA9PiBcIlBlciB2ZXJkaWVyXCJcbi8vIHVuZGVmaW5lZC5zaG93UGVyQ29sdW1uczogXCJQZXIgQ29sdW1uc1wiID0+IFwiUGVyIGtvbG9ubmVyXCJcbi8vIHVuZGVmaW5lZC5hbnN3ZXI6IFwiQW5zd2VyXCIgPT4gXCJTdmFyZVwiXG4vLyB1bmRlZmluZWQuY29ycmVjdEFuc3dlcjogXCJDb3JyZWN0IGFuc3dlcjogXCIgPT4gXCJSaWt0aWcgc3ZhcjogXCJcbi8vIHVuZGVmaW5lZC5wZXJjZW50OiBcIlBlcmNlbnRcIiA9PiBcIlByb3NlbnRcIlxuLy8gdW5kZWZpbmVkLnJlc3BvbnNlczogXCJSZXNwb25zZXNcIiA9PiBcIlN2YXJcIiIsIi8vIFRoaXMgZGljdGlvbmFyeSBjb250YWlucyAxIHVudHJhbnNsYXRlZCBvciBpbmhlcml0ZWQgbG9jYWxpemF0aW9uIHN0cmluZ3MuXG4vLyBUaGVzZSBzdHJpbmdzIGFyZSBjb21tZW50ZWQgb3V0LiBVbmNvbW1lbnQgYW5kIGVkaXQgdGhlbSBpZiB5b3Ugd2FudCB0byBhZGQgeW91ciB0cmFuc2xhdGlvbnMuXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIHBvcnR1Z3Vlc2VTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCJBZ3J1cGFyIFBvciBNaW1cIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEZXNhZ3J1cGFyIFBvciBNaW1cIixcbiAgc2VsZWN0QnV0dG9uOiBcIlNlbGVjaW9uYXJcIixcbiAgaGlkZUNvbHVtbjogXCJFc2NvbmRlciBjb2x1bmFcIixcbiAgc2hvd0NvbHVtbjogXCJNb3N0cmFyIGNvbHVuYVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJUb3JuYXIgY29sdW5hIHByaXZhZGFcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJUb3JuYXIgY29sdW5hIHDDumJsaWNhXCIsXG4gIG1vdmVUb0RldGFpbDogXCJNb3ZlciBwYXJhIERldGFsaGVzXCIsXG4gIHNob3dBc0NvbHVtbjogXCJNb3N0cmFyIGNvbW8gQ29sdW5hXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlBlc3F1aXNhci4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlJlbW92ZXIgbGluaGFzXCIsXG4gIHNob3dMYWJlbDogXCJNb3N0cmFyXCIsXG4gIGVudHJpZXNMYWJlbDogXCJlbnRyYWRhc1wiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dG9zIGVtIHRhYmVsYVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJOdXZlbSBkZSBwYWxhdnJhc1wiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1hXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIk3DqWRpYVwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFiZWxhXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJHcsOhZmljb1wiLFxuICAvLyB2aXN1YWxpemVyX21hdHJpeDogXCJDaGFydFwiLFxuICBjaGFydFR5cGVfYmFyOiBcIkJhcnJhXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIkJhcnJhIHZlcnRpY2FsXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkJhcnJhIEVtcGlsaGFkYVwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiUm9zY2FcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJUYXJ0ZVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJMYXN0cm9cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkVzY2FsYVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJhbGFcIixcbiAgaGlkZUJ1dHRvbjogXCJFc2NvbmRlclwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJUb3JuYXIgcHJpdmFkb1wiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIlRvcm5hciBww7pibGljb1wiLFxuICBzaG93QnV0dG9uOiBcIk1vc3RyYXJcIixcbiAgZmlsdGVyOiBcIkZpbHRyYXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmVzdGF1cmFyIEZpbHRyb1wiLFxuICBjaGFuZ2VMb2NhbGU6IFwiTXVkYXIgTG9jYWxpemHDp8Ojb1wiLFxuICBjbGVhckJ1dHRvbjogXCJMaW1wYXJcIixcbiAgYWRkRWxlbWVudDogXCJFc2NvbGhlciBxdWVzdMOjbyBwYXJhIG1vc3RyYXIuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIk9yZGVuYcOnw6NvIFBhZHLDo29cIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kZW50ZVwiLFxuICBkZXNjT3JkZXI6IFwiRGVzY2VuZGVudGVcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJNb3N0cmFyIGNvbHVuYXMgbWVub3Jlc1wiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJPdXRyb3MgaXRlbnMgZSBjb21lbnTDoXJpb3NcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIk1vc3RyYXIgcGVyY2VudHVhaXNcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIkVzY29uZGVyIHBlcmNlbnR1YWlzXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiQmFpeGFyIGRpYWdyYW1hIGNvbW8gUE5HXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwiRXNjb25kZXIgcGVyZ3VudGFzIHZhemlhc1wiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIk1vc3RyYXIgcGVyZ3VudGFzIHZhemlhc1wiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIlRvZGFzIGFzIHJlc3Bvc3Rhc1wiLFxuICB0b3BOVmFsdWVUZXh0NTogXCJQcmltZWlyYXMgNSByZXNwb3N0YXNcIixcbiAgdG9wTlZhbHVlVGV4dDEwOiBcIlByaW1laXJhcyAxMCByZXNwb3N0YXNcIixcbiAgdG9wTlZhbHVlVGV4dDIwOiBcIlByaW1laXJhcyAyMCByZXNwb3N0YXNcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIk9jdWx0YXIgcGVyZ3VudGFzIG7Do28gcmVzcG9uZGlkYXNcIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIk1vc3RyYXIgcGVyZ3VudGFzIG7Do28gcmVzcG9uZGlkYXNcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJQZXJndW50YXMgbsOjbyByZXNwb25kaWRhc1wiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJFc3RlIHRpcG8gZGUgcGVyZ3VudGEgYWluZGEgbsOjbyBmb2kgdmlzdWFsaXphZGFcIixcbiAgbm9SZXN1bHRzOiBcIkFpbmRhIG7Do28gcG9zc3VpIHJlc3VsdGFkb3NcIixcbiAgc2hvd1BlclZhbHVlczogXCJQb3IgdmFsb3Jlc1wiLFxuICBzaG93UGVyQ29sdW1uczogXCJQb3IgY29sdW5hc1wiLFxuICBhbnN3ZXI6IFwiUmVzcG9zdGFcIixcbiAgY29ycmVjdEFuc3dlcjogXCJSZXNwb3N0YSBjb3JyZXRhOiBcIixcbiAgcGVyY2VudDogXCJQZXJjZW50YWdlbVwiLFxuICByZXNwb25zZXM6IFwiUmVzcG9zdGFzXCJcbn07XG5cbi8vVW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGUuIFlvdSBzaG91bGQgcmVwbGFjZSBcImVuXCIgYW5kIGVuU3RyaW5ncyB3aXRoIHlvdXIgbG9jYWxlIChcImZyXCIsIFwiZGVcIiBhbmQgc28gb24pIGFuZCB5b3VyIHZhcmlhYmxlLlxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJwdFwiXSA9IHBvcnR1Z3Vlc2VTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicHRcIl0gPSBcIlBvcnR1Z3XDqnNcIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgcnVzc2lhblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcItCh0LPRgNGD0L/Qv9C40YDQvtCy0LDRgtGMXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwi0KDQsNC30LPRgNGD0L/Qv9C40YDQvtCy0LDRgtGMXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCLQktGL0LHRgNCw0YLRjFwiLFxuICBoaWRlQ29sdW1uOiBcItCh0LrRgNGL0YLRjCDRgdGC0L7Qu9Cx0LXRhlwiLFxuICBzaG93Q29sdW1uOiBcItCf0L7QutCw0LfQsNGC0Ywg0YHRgtC+0LvQsdC10YZcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwi0KHQtNC10LvQsNGC0Ywg0YHRgtC+0LvQsdC10YYg0L/RgNC40LLQsNGC0L3Ri9C8XCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwi0KHQtNC10LvQsNGC0Ywg0YHRgtC+0LvQsdC10YYg0L/Rg9Cx0LvQuNGH0L3Ri9C8XCIsXG4gIG1vdmVUb0RldGFpbDogXCLQodC/0YDRj9GC0LDRgtGMINCyINGA0LDRgdC60YDRi9Cy0LDRjtGJ0YPRjtGB0Y8g0YHQtdC60YbQuNGOXCIsXG4gIHNob3dBc0NvbHVtbjogXCLQn9C+0LrQsNC30LDRgtGMINC60LDQuiDRgdGC0L7Qu9Cx0LXRhlwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCLQn9C+0LjRgdC6Li4uXCIsXG4gIHJlbW92ZVJvd3M6IFwi0KPQtNCw0LvQuNGC0Ywg0YHRgtGA0L7QutC4XCIsXG4gIHNob3dMYWJlbDogXCLQn9C+0LrQsNC30LDRgtGMXCIsXG4gIGVudHJpZXNMYWJlbDogXCLQt9Cw0L/QuNGB0LXQuVwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwi0KLQsNCx0LvQuNGG0LBcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwi0J7QsdC70LDQutC+INGC0Y3Qs9C+0LJcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwi0JPQuNGB0YLQvtCz0YDQsNC80LzQsFwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCLQodGA0LXQtNC90LXQtSDQt9C90LDRh9C10L3QuNC1XCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCLQotCw0LHQu9C40YbQsFwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwi0JTQuNCw0LPRgNCw0LzQvNCwXCIsXG4gIHZpc3VhbGl6ZXJfbWF0cml4OiBcItCU0LjQsNCz0YDQsNC80LzQsFwiLFxuICBjaGFydFR5cGVfYmFyOiBcItCh0YLQvtC70LHRh9Cw0YLQsNGPINC00LjQsNCz0YDQsNC80LzQsFwiLFxuICBjaGFydFR5cGVfdmJhcjogXCLQktC10YDRgtC40LrQsNC70YzQvdCw0Y8g0YHRgtC+0LvQsdGH0LDRgtCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcItCh0YLQvtC70LHRh9Cw0YLQsNGPINC00LjQsNCz0YDQsNC80LzQsCDRgSDQvdCw0LrQvtC/0LvQtdC90LjQtdC8XCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCLQmtC+0LvRjNGG0LXQstCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwi0JrRgNGD0LPQvtCy0LDRjyDQtNC40LDQs9GA0LDQvNC80LBcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwi0KLQvtGH0LXRh9C90LDRjyDQtNC40LDQs9GA0LDQvNC80LBcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcItCY0LfQvNC10YDQuNGC0LXQu9GM0L3QsNGPINC00LjQsNCz0YDQsNC80LzQsFwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcItCc0LDRgNC60LjRgNC+0LLQsNC90L3QsNGPINC00LjQsNCz0YDQsNC80LzQsFwiLFxuICBoaWRlQnV0dG9uOiBcItCh0LrRgNGL0YLRjFwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCLQodC00LXQu9Cw0YLRjCDQv9GA0LjQstCw0YLQvdGL0LxcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCLQodC00LXQu9Cw0YLRjCDQv9GD0LHQu9C40YfQvdGL0LxcIixcbiAgc2hvd0J1dHRvbjogXCLQn9C+0LrQsNC30LDRgtGMXCIsXG4gIGZpbHRlcjogXCLQpNC40LvRjNGC0YBcIixcbiAgcmVzZXRGaWx0ZXI6IFwi0J7Rh9C40YHRgtC40YLRjCDRhNC40LvRjNGC0YBcIixcbiAgY2hhbmdlTG9jYWxlOiBcItCh0LzQtdC90LjRgtGMINGP0LfRi9C6XCIsXG4gIGNsZWFyQnV0dG9uOiBcItCe0YfQuNGB0YLQuNGC0YxcIixcbiAgYWRkRWxlbWVudDogXCLQktGL0LHQtdGA0LjRgtC1INCy0L7Qv9GA0L7RgS4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwi0J/QvtGA0Y/QtNC+0Log0L/QviDRg9C80L7Qu9GH0LDQvdC40Y5cIixcbiAgYXNjT3JkZXI6IFwi0KHQvtGA0YLQuNGA0L7QstCw0YLRjCDQv9C+INCy0L7Qt9GA0LDRgdGC0LDQvdC40Y5cIixcbiAgZGVzY09yZGVyOiBcItCh0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0L/QviDRg9Cx0YvQstCw0L3QuNGOXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwi0J/QvtC60LDQt9Cw0YLRjCDQstGC0L7RgNC+0YHRgtC10L/QtdC90L3Ri9C1INGB0YLQvtC70LHRhtGLXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcItCU0YDRg9Cz0L7QtSDQuCDQutC+0LzQvNC10L3RgtCw0YDQuNC4XCIsXG4gIHNob3dQZXJjZW50YWdlczogXCLQn9C+0LrQsNC30LDRgtGMINC/0YDQvtGG0LXQvdGC0YtcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcItCh0LrRgNGL0YLRjCDQv9GA0L7RhtC10L3RgtGLXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwi0KHQutCw0YfQsNGC0Ywg0LTQuNCw0LPRgNCw0LzQvNGDINCyINGE0L7RgNC80LDRgtC1IFBOR1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcItCh0LrRgNGL0YLRjCDQv9GD0YHRgtGL0LUg0L7RgtCy0LXRgtGLXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwi0J/QvtC60LDQt9Cw0YLRjCDQv9GD0YHRgtGL0LUg0L7RgtCy0LXRgtGLXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwi0JLRgdC1INC+0YLQstC10YLRi1wiLFxuICB0b3BOVmFsdWVUZXh0NTogXCLQn9C10YDQstGL0LUgNSDQvtGC0LLQtdGC0L7QslwiLFxuICB0b3BOVmFsdWVUZXh0MTA6IFwi0J/QtdGA0LLRi9C1IDEwINC+0YLQstC10YLQvtCyXCIsXG4gIHRvcE5WYWx1ZVRleHQyMDogXCLQn9C10YDQstGL0LUgMjAg0L7RgtCy0LXRgtC+0LJcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcItCh0LrRgNGL0YLRjCDQvtGC0YHRg9GC0YHRgtCy0YPRjtGJ0LjQtSDQvtGC0LLQtdGC0YtcIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcItCf0L7QutCw0LfQsNGC0Ywg0L7RgtGB0YPRgtGB0YLQstGD0Y7RidC40LUg0L7RgtCy0LXRgtGLXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwi0J7RgtGB0YPRgtGB0YLQstGD0Y7RidC40LUg0L7RgtCy0LXRgtGLXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcItCt0YLQvtGCINGC0LjQvyDQstC+0L/RgNC+0YHQsCDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y9cIixcbiAgbm9SZXN1bHRzOiBcItCg0LXQt9GD0LvRjNGC0LDRgtGLINC+0YLRgdGD0YLRgdGC0LLRg9GO0YJcIixcbiAgc2hvd1BlclZhbHVlczogXCLQn9C+INC30L3QsNGH0LXQvdC40Y/QvFwiLFxuICBzaG93UGVyQ29sdW1uczogXCLQn9C+INGB0YLQvtC70LHRhtCw0LxcIixcbiAgYW5zd2VyOiBcItCe0YLQstC10YJcIixcbiAgY29ycmVjdEFuc3dlcjogXCLQn9GA0LDQstC40LvRjNC90YvQuSDQvtGC0LLQtdGCOiBcIixcbiAgcGVyY2VudDogXCLQv9GA0L7RhtC10L3RgtC+0LJcIixcbiAgcmVzcG9uc2VzOiBcItC+0YLQstC10YLQvtCyXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wicnVcIl0gPSBydXNzaWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInJ1XCJdID0gXCLQoNGD0YHRgdC60LjQuVwiO1xuIiwiLy8gVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIDEgdW50cmFuc2xhdGVkIG9yIGluaGVyaXRlZCBsb2NhbGl6YXRpb24gc3RyaW5ncy5cbi8vIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1lbnRlZCBvdXQuIFVuY29tbWVudCBhbmQgZWRpdCB0aGVtIGlmIHlvdSB3YW50IHRvIGFkZCB5b3VyIHRyYW5zbGF0aW9ucy5cbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgc3BhbmlzaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdydXBvIFBvciBNw61cIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEZXNhZ3J1cGFyIHBvciBtw61cIixcbiAgc2VsZWN0QnV0dG9uOiBcIlNlbGVjY2lvbmFybWVcIixcbiAgaGlkZUNvbHVtbjogXCJPY3VsdGFyIGNvbHVtbmFcIixcbiAgc2hvd0NvbHVtbjogXCJNb3N0cmFyIGNvbHVtbmFcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiSGFjZXIgcXVlIGxhIGNvbHVtbmEgc2VhIHByaXZhZGFcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJIYWNlciBww7pibGljYSBsYSBjb2x1bW5hXCIsXG4gIG1vdmVUb0RldGFpbDogXCJNb3ZlciBhbCBkZXRhbGxlXCIsXG4gIHNob3dBc0NvbHVtbjogXCJNb3N0cmFyIGNvbW8gY29sdW1uYVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJCdXNjYXIgLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiRWxpbWluYXIgZmlsYXNcIixcbiAgc2hvd0xhYmVsOiBcIk1vc3RyYXJcIixcbiAgZW50cmllc0xhYmVsOiBcIkVudHJhZGFzXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJUZXh0b3MgZW4gdGFibGFcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiV29yZGNsb3VkXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbWFcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiUHJvbWVkaW9cIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcIk1lc2FcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkdyw6FmaWNvXCIsXG4gIC8vIHZpc3VhbGl6ZXJfbWF0cml4OiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFyXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIkJhcnJhIHZlcnRpY2FsXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkJhcnJhIGFwaWxhZGFcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvbnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiUGllXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIkRpc3BlcnNpw7NuXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxldFwiLFxuICBoaWRlQnV0dG9uOiBcIk9jdWx0YXJcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiSGFjZXIgcHJpdmFkb1wiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIkhhY2VyIHDDumJsaWNvXCIsXG4gIHNob3dCdXR0b246IFwiTW9zdHJhclwiLFxuICBmaWx0ZXI6IFwiRmlsdHJvXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJlc3RhYmxlY2VyIGZpbHRyb1wiLFxuICBjaGFuZ2VMb2NhbGU6IFwiQ2FtYmlhciBjb25maWd1cmFjacOzbiByZWdpb25hbFwiLFxuICBjbGVhckJ1dHRvbjogXCJCb3JyYXJcIixcbiAgYWRkRWxlbWVudDogXCJFbGlqYSBsYSBwcmVndW50YSBwYXJhIG1vc3RyYXIgLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJPcmRlbiBwcmVkZXRlcm1pbmFkb1wiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRlbnRlXCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kZW50ZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIk1vc3RyYXIgY29sdW1uYXMgc2VjdW5kYXJpYXNcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiT3Ryb3MgZWxlbWVudG9zIHkgY29tZW50YXJpb3NcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIk1vc3RyYXIgcG9yY2VudGFqZXNcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIk9jdWx0YXIgcG9yY2VudGFqZXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJEZXNjYXJnYXIgZWwgZ3LDoWZpY28gY29tbyBwbmdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJPY3VsdGFyIHJlc3B1ZXN0YXMgdmFjw61hc1wiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIk1vc3RyYXIgcmVzcHVlc3RhcyB2YWPDrWFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVG9kYXMgbGFzIHJlc3B1ZXN0YXNcIixcbiAgdG9wTlZhbHVlVGV4dDU6IFwiTGFzIDUgcmVzcHVlc3RhcyBwcmluY2lwYWxlc1wiLFxuICB0b3BOVmFsdWVUZXh0MTA6IFwiTGFzIDEwIHJlc3B1ZXN0YXMgcHJpbmNpcGFsZXNcIixcbiAgdG9wTlZhbHVlVGV4dDIwOiBcIjIwIHJlc3B1ZXN0YXMgcHJpbmNpcGFsZXNcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIk9jdWx0YXIgbGFzIHJlc3B1ZXN0YXMgcXVlIGZhbHRhblwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiTW9zdHJhciBsYXMgcmVzcHVlc3RhcyBxdWUgZmFsdGFuXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiUmVzcHVlc3RhcyBmYWx0YW50ZXNcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiRXN0ZSB0aXBvIGRlIHByZWd1bnRhIGHDum4gbm8gc2UgdmlzdWFsaXphXCIsXG4gIG5vUmVzdWx0czogXCJBw7puIG5vIGhheSByZXN1bHRhZG9zXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwiUG9yIHZhbG9yZXNcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUG9yIGNvbHVtbmFzXCIsXG4gIGFuc3dlcjogXCJSZXNwdWVzdGFcIixcbiAgY29ycmVjdEFuc3dlcjogXCJSZXNwdWVzdGEgY29ycmVjdGE6IFwiLFxuICBwZXJjZW50OiBcIlBvciBjaWVudG9cIixcbiAgcmVzcG9uc2VzOiBcIlJlc3B1ZXN0YXNcIlxufTtcbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZXNcIl0gPSBzcGFuaXNoU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImVzXCJdID0gXCJFc3Bhw7FvbFwiO1xuXG4vLyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgYnkgYSBtYWNoaW5lIHRyYW5zbGF0aW9uIHNlcnZpY2Vcbi8vIFJlbW92ZSB0aG9zZSBzdHJpbmdzIHRoYXQgeW91IGhhdmUgY29ycmVjdGVkIG1hbnVhbGx5XG4vLyB1bmRlZmluZWQuZ3JvdXBCdXR0b246IFwiR3JvdXAgQnkgTWVcIiA9PiBcIkdydXBvIFBvciBNw61cIlxuLy8gdW5kZWZpbmVkLmVudHJpZXNMYWJlbDogXCJlbnRyaWVzXCIgPT4gXCJFbnRyYWRhc1wiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtXCIgPT4gXCJIaXN0b2dyYW1hXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX251bWJlcjogXCJBdmVyYWdlXCIgPT4gXCJQcm9tZWRpb1wiXG4vLyB1bmRlZmluZWQudmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmxlXCIgPT4gXCJNZXNhXCJcbi8vIHVuZGVmaW5lZC52aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiQ2hhcnRcIiA9PiBcIkdyw6FmaWNvXCJcbi8vIHVuZGVmaW5lZC5jaGFydFR5cGVfdmJhcjogXCJWZXJ0aWNhbCBCYXJcIiA9PiBcIkJhcnJhIHZlcnRpY2FsXCJcbi8vIHVuZGVmaW5lZC5oaWRlTWlzc2luZ0Fuc3dlcnM6IFwiSGlkZSBtaXNzaW5nIGFuc3dlcnNcIiA9PiBcIk9jdWx0YXIgbGFzIHJlc3B1ZXN0YXMgcXVlIGZhbHRhblwiXG4vLyB1bmRlZmluZWQuc2hvd01pc3NpbmdBbnN3ZXJzOiBcIlNob3cgbWlzc2luZyBhbnN3ZXJzXCIgPT4gXCJNb3N0cmFyIGxhcyByZXNwdWVzdGFzIHF1ZSBmYWx0YW5cIlxuLy8gdW5kZWZpbmVkLm1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiTWlzc2luZyBhbnN3ZXJzXCIgPT4gXCJSZXNwdWVzdGFzIGZhbHRhbnRlc1wiXG4vLyB1bmRlZmluZWQuc2hvd1BlclZhbHVlczogXCJQZXIgVmFsdWVzXCIgPT4gXCJQb3IgdmFsb3Jlc1wiXG4vLyB1bmRlZmluZWQuc2hvd1BlckNvbHVtbnM6IFwiUGVyIENvbHVtbnNcIiA9PiBcIlBvciBjb2x1bW5hc1wiXG4vLyB1bmRlZmluZWQuYW5zd2VyOiBcIkFuc3dlclwiID0+IFwiUmVzcHVlc3RhXCJcbi8vIHVuZGVmaW5lZC5jb3JyZWN0QW5zd2VyOiBcIkNvcnJlY3QgYW5zd2VyOiBcIiA9PiBcIlJlc3B1ZXN0YSBjb3JyZWN0YTogXCJcbi8vIHVuZGVmaW5lZC5wZXJjZW50OiBcIlBlcmNlbnRcIiA9PiBcIlBvciBjaWVudG9cIlxuLy8gdW5kZWZpbmVkLnJlc3BvbnNlczogXCJSZXNwb25zZXNcIiA9PiBcIlJlc3B1ZXN0YXNcIiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuTW9kZWwgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcImJvb2xlYW5cIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdEFuc3dlclRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb3JyZWN0QW5zd2VyVmFsdWUgPSB0aGlzLmJvb2xlYW5RdWVzdGlvbi5jb3JyZWN0QW5zd2VyO1xuICAgIGlmICh0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZVRydWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZVRydWUgPT09IGNvcnJlY3RBbnN3ZXJWYWx1ZSB8fCAhIWNvcnJlY3RBbnN3ZXJWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZS50ZXh0T3JIdG1sO1xuICAgIH1cbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVGYWxzZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlRmFsc2UgPT09IGNvcnJlY3RBbnN3ZXJWYWx1ZSB8fCAhY29ycmVjdEFuc3dlclZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ib29sZWFuUXVlc3Rpb24ubG9jTGFiZWxGYWxzZS50ZXh0T3JIdG1sO1xuICAgIH1cbiAgICByZXR1cm4gY29ycmVjdEFuc3dlclZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBib29sZWFuUXVlc3Rpb24oKSB7XG4gICAgcmV0dXJuIDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD50aGlzLnF1ZXN0aW9uO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0cnVlQ29sb3IgPSBcIlwiO1xuICBwdWJsaWMgc3RhdGljIGZhbHNlQ29sb3IgPSBcIlwiO1xuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICByZXR1cm4gbmV3IEl0ZW1WYWx1ZSh2YWx1ZXNbbGFiZWxzLmluZGV4T2YoaXRlbVRleHQpXSwgaXRlbVRleHQpO1xuICB9XG5cbiAgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IFtcbiAgICAgIHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlVHJ1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlXG4gICAgICAgIDogdHJ1ZSxcbiAgICAgIHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlRmFsc2UgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlRmFsc2VcbiAgICAgICAgOiBmYWxzZSxcbiAgICBdO1xuICAgIGlmICh0aGlzLnNob3dNaXNzaW5nQW5zd2Vycykge1xuICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgbGFiZWxzID0gW10uY29uY2F0KHRoaXMuZ2V0VmFsdWVzKCkpO1xuICAgIGlmICh0aGlzLmJvb2xlYW5RdWVzdGlvbi5sYWJlbFRydWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGFiZWxzWzBdID0gdGhpcy5ib29sZWFuUXVlc3Rpb24ubG9jTGFiZWxUcnVlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIGlmICh0aGlzLmJvb2xlYW5RdWVzdGlvbi5sYWJlbEZhbHNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxhYmVsc1sxXSA9IHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxvY0xhYmVsRmFsc2UudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICBsYWJlbHNbMl0gPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWlzc2luZ0Fuc3dlcnNMYWJlbFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxufVxuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi9jaG9pY2VzLXRhYmxlLnNjc3NcIik7XG5cbmV4cG9ydCBjbGFzcyBDaG9pY2VzVGFibGVBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogQ2hvaWNlc1RhYmxlKSB7fVxuXG4gIHB1YmxpYyBjcmVhdGUoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGxldCB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxhYmVscyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHRleHRzLFxuICAgICAgc2VyaWVzTGFiZWxzLFxuICAgIH0gPSB0aGlzLm1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMTtcblxuICAgIGNvbnN0IGVtcHR5VGV4dE5vZGUgPSA8SFRNTEVsZW1lbnQ+RG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInBcIiwgXCJcIiwge1xuICAgICAgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9SZXN1bHRzXCIpLFxuICAgIH0pO1xuXG4gICAgaWYgKGRhdGFzZXRzLmxlbmd0aCA9PT0gMCB8fCBkYXRhc2V0c1swXS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbXB0eVRleHROb2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkYXRhc2V0cy5mb3JFYWNoKChkYXRhLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IDxIVE1MVGFibGVFbGVtZW50PihcbiAgICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIFwic2EtY2hvaWNlcy10YWJsZVwiKVxuICAgICAgKTtcblxuICAgICAgdGFibGVOb2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlTm9kZSk7XG5cbiAgICAgIHZhciBoZWFkZXJSb3cgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidHJcIik7XG4gICAgICB2YXIgbGFiZWxDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRoXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbC1oZWFkZXJcIiwge1xuICAgICAgICB0ZXh0Q29udGVudDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFuc3dlclwiKSxcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKGxhYmVsQ2VsbCk7XG4gICAgICB2YXIgc3BhcmtsaW5lQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwtaGVhZGVyXCIsIHtcbiAgICAgICAgdGV4dENvbnRlbnQ6IFwiXCIsXG4gICAgICB9KTtcbiAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChzcGFya2xpbmVDZWxsKTtcbiAgICAgIHZhciBwZXJjZW50Q2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwtaGVhZGVyXCIsIHtcbiAgICAgICAgdGV4dENvbnRlbnQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZXJjZW50XCIpLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQocGVyY2VudENlbGwpO1xuICAgICAgdmFyIHZhbHVlQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwtaGVhZGVyXCIsIHtcbiAgICAgICAgdGV4dENvbnRlbnQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXNwb25zZXNcIiksXG4gICAgICB9KTtcbiAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZCh2YWx1ZUNlbGwpO1xuICAgICAgdGFibGVOb2RlLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7XG5cbiAgICAgIGRhdGEuZm9yRWFjaCgocm93RGF0YSwgaW5kZXgpID0+IHtcbiAgICAgICAgdmFyIHJvdyA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcbiAgICAgICAgdmFyIGxhYmVsQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGxcIiwge1xuICAgICAgICAgIHRleHRDb250ZW50OiBsYWJlbHNbaW5kZXhdLFxuICAgICAgICB9KTtcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGxhYmVsQ2VsbCk7XG4gICAgICAgIHZhciBzcGFya2xpbmVDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbFwiKTtcbiAgICAgICAgdmFyIG91dGVyQmFyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCBcInNhLWNob2ljZXMtc3BhcmtsaW5lXCIpO1xuICAgICAgICB2YXIgaW5uZXJCYXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtY2hvaWNlcy1zcGFya2xpbmUtdmFsdWVcIik7XG4gICAgICAgIGlubmVyQmFyLnN0eWxlLndpZHRoID0gdGV4dHNbaWR4XVtpbmRleF0gKyBcIiVcIjtcbiAgICAgICAgb3V0ZXJCYXIuYXBwZW5kQ2hpbGQoaW5uZXJCYXIpO1xuICAgICAgICBzcGFya2xpbmVDZWxsLmFwcGVuZENoaWxkKG91dGVyQmFyKTtcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKHNwYXJrbGluZUNlbGwpO1xuICAgICAgICB2YXIgcGVyY2VudENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsIHNhLWNob2ljZXMtdGFibGVfX2NlbGwtdmFsdWVcIiwge1xuICAgICAgICAgIHRleHRDb250ZW50OiBcIlwiICsgdGV4dHNbaWR4XVtpbmRleF0gKyBcIiVcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChwZXJjZW50Q2VsbCk7XG4gICAgICAgIHZhciB2YWx1ZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsIHNhLWNob2ljZXMtdGFibGVfX2NlbGwtdmFsdWVcIiwge1xuICAgICAgICAgIHRleHRDb250ZW50OiByb3dEYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKHZhbHVlQ2VsbCk7XG4gICAgICAgIHRhYmxlTm9kZS5hcHBlbmRDaGlsZChyb3cpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBcInNhLWNob2ljZXMtdGFibGVfX2NvbnRhaW5lclwiO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlTm9kZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgIG5vZGUuaW5uZXJIVE1MID0gXCJcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2hvaWNlc1RhYmxlIGV4dGVuZHMgU2VsZWN0QmFzZSB7XG4gIHByaXZhdGUgX2Nob2ljZXNUYWJsZUFkYXB0ZXI6IENob2ljZXNUYWJsZUFkYXB0ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwiY2hvaWNlc1wiKTtcbiAgICB0aGlzLl9jaG9pY2VzVGFibGVBZGFwdGVyID0gbmV3IENob2ljZXNUYWJsZUFkYXB0ZXIodGhpcyk7XG4gICAgdGhpcy5hbnN3ZXJzT3JkZXIgPSBcImFzY1wiO1xuICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VzID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hvaWNlc1RhYmxlQWRhcHRlci5kZXN0cm95KGNvbnRhaW5lcik7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaG9pY2VzVGFibGVBZGFwdGVyLmNyZWF0ZShjb250YWluZXIpO1xuICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fY2hvaWNlc1RhYmxlQWRhcHRlci5kZXN0cm95KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICB9XG59XG5cbi8vIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInJhZGlvZ3JvdXBcIiwgQ2hvaWNlc1RhYmxlKTtcbi8vIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImRyb3Bkb3duXCIsIENob2ljZXNUYWJsZSk7XG4vLyBWaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJjaGVja2JveFwiLCBDaG9pY2VzVGFibGUpO1xuIiwiaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFJbmZvIHtcclxuICBuYW1lOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+O1xyXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+O1xyXG4gIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+O1xyXG4gIGdldFNlcmllc1ZhbHVlcygpOiBBcnJheTxzdHJpbmc+O1xyXG4gIGdldFNlcmllc0xhYmVscygpOiBBcnJheTxzdHJpbmc+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0YVByb3ZpZGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHNlcmllc01hcmtlcktleSA9IFwiX19zYV9zZXJpZXNfbmFtZVwiO1xyXG5cclxuICBwcml2YXRlIF9maWx0ZXJlZERhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT47XHJcbiAgcHJpdmF0ZSBfc3RhdGlzdGljc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gfCBBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj4gfTtcclxuICBwcm90ZWN0ZWQgZmlsdGVyVmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGF0aXN0aWNzQ2FjaGVLZXkoZGF0YUluZm86IElEYXRhSW5mbyk6IHN0cmluZyB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhSW5mby5uYW1lKSkge1xyXG4gICAgICByZXR1cm4gZGF0YUluZm8ubmFtZS5qb2luKFwiLVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhSW5mby5uYW1lO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGF0YTogQXJyYXk8YW55PiA9IFtdLCBwcml2YXRlIF9nZXREYXRhQ29yZTogKGRhdGFJbmZvOiBJRGF0YUluZm8pID0+IG51bWJlcltdW10gPSB1bmRlZmluZWQpIHsgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoZGF0YUluZm8/OiBJRGF0YUluZm8pIHtcclxuICAgIGlmICghIWRhdGFJbmZvKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZXRTdGF0aXN0aWNzQ2FjaGVLZXkoZGF0YUluZm8pO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0aXN0aWNzQ2FjaGVbY2FjaGVLZXldO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlICE9PSB1bmRlZmluZWQgfHxcclxuICAgICAgdGhpcy5fZmlsdGVyZWREYXRhICE9PSB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5yYWlzZURhdGFDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcclxuICB9XHJcbiAgcHVibGljIHNldCBkYXRhKGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIHRoaXMuX2RhdGEgPSBbXS5jb25jYXQoZGF0YSk7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGZpbHRlcmVkRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLl9maWx0ZXJlZERhdGEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsZXQgZmlsdGVyS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyVmFsdWVzKTtcclxuICAgICAgaWYgKGZpbHRlcktleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IHRoaXMuZGF0YS5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiAhT2JqZWN0LmtleXModGhpcy5maWx0ZXJWYWx1ZXMpLnNvbWUoXHJcbiAgICAgICAgICAgIChrZXkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyVmFsdWVzW2tleV07XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWVUeXBlID0gdHlwZW9mIGZpbHRlclZhbHVlO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uVmFsdWUgPSBpdGVtW2tleV07XHJcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocXVlc3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZVR5cGUgIT09IFwib2JqZWN0XCIpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVzdGlvblZhbHVlLmluZGV4T2YoZmlsdGVyVmFsdWUpID09IC0xO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1ZXN0aW9uVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZVR5cGUgIT09IFwib2JqZWN0XCIpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFxdWVzdGlvbkNvbnRhaW5zVmFsdWUocXVlc3Rpb25WYWx1ZSwgZmlsdGVyVmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZSA9IGl0ZW1bRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV07XHJcbiAgICAgICAgICAgICAgaWYgKCEhc2VyaWVzVmFsdWUgJiYgZmlsdGVyVmFsdWVUeXBlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlc3Rpb25WYWx1ZSAhPT0gZmlsdGVyVmFsdWVbc2VyaWVzVmFsdWVdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWVUeXBlID09PSBcIm9iamVjdFwiICYmIGZpbHRlclZhbHVlLnN0YXJ0ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyVmFsdWUuZW5kICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb250aW5pb2l1c1ZhbHVlID0gdHlwZW9mIHF1ZXN0aW9uVmFsdWUgPT09IFwibnVtYmVyXCIgPyBxdWVzdGlvblZhbHVlIDogRGF0ZS5wYXJzZShxdWVzdGlvblZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hTihjb250aW5pb2l1c1ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICBjb250aW5pb2l1c1ZhbHVlID0gcGFyc2VGbG9hdChxdWVzdGlvblZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGNvbnRpbmlvaXVzVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBjb250aW5pb2l1c1ZhbHVlIDwgZmlsdGVyVmFsdWUuc3RhcnQgfHwgY29udGluaW9pdXNWYWx1ZSA+PSBmaWx0ZXJWYWx1ZS5lbmQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtW2tleV0gIT09IHRoaXMuZmlsdGVyVmFsdWVzW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gdGhpcy5kYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyZWREYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBmaWx0ZXIgYnkgcXVlc3Rpb24gbmFtZSBhbmQgdmFsdWUuXHJcbiAgICovXHJcbiAgcHVibGljIHNldEZpbHRlcihxdWVzdGlvbk5hbWU6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogYW55KSB7XHJcbiAgICB2YXIgZmlsdGVyQ2hhbmdlZCA9IHRydWU7XHJcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpbHRlckNoYW5nZWQgPSB0aGlzLmZpbHRlclZhbHVlc1txdWVzdGlvbk5hbWVdICE9PSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLmZpbHRlclZhbHVlc1txdWVzdGlvbk5hbWVdID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbHRlckNoYW5nZWQgPSB0aGlzLmZpbHRlclZhbHVlc1txdWVzdGlvbk5hbWVdICE9PSB1bmRlZmluZWQ7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlclZhbHVlc1txdWVzdGlvbk5hbWVdO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpbHRlckNoYW5nZWQpIHtcclxuICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldERhdGFDb3JlKGRhdGFJbmZvOiBJRGF0YUluZm8pIHtcclxuICAgIGlmICghIXRoaXMuX2dldERhdGFDb3JlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9nZXREYXRhQ29yZShkYXRhSW5mbyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGF0YU5hbWVzID0gQXJyYXkuaXNBcnJheShkYXRhSW5mby5uYW1lKSA/IGRhdGFJbmZvLm5hbWUgOiBbZGF0YUluZm8ubmFtZV07XHJcbiAgICBjb25zdCBzdGF0aXN0aWNzOiBBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj4gPSBbXTtcclxuXHJcbiAgICBjb25zdCB2YWx1ZXMgPSBkYXRhSW5mby5nZXRWYWx1ZXMoKTtcclxuICAgIGNvbnN0IHZhbHVlc0luZGV4OiB7IFtpbmRleDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWw6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICB2YWx1ZXNJbmRleFt2YWxdID0gaW5kZXg7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHByb2Nlc3NNaXNzaW5nQW5zd2VycyA9IHZhbHVlcy5pbmRleE9mKHVuZGVmaW5lZCkgIT09IC0xO1xyXG5cclxuICAgIGNvbnN0IHNlcmllcyA9IGRhdGFJbmZvLmdldFNlcmllc1ZhbHVlcygpO1xyXG4gICAgY29uc3Qgc2VyaWVzSW5kZXg6IHsgW2luZGV4OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgc2VyaWVzLmZvckVhY2goKHZhbDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHNlcmllc0luZGV4W3ZhbF0gPSBpbmRleDtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNlcmllc0xlbmd0aCA9IHNlcmllcy5sZW5ndGggfHwgMTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YU5hbWVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IGRhdGFOYW1lU3RhdGlzdGljcyA9IG5ldyBBcnJheTxBcnJheTxudW1iZXI+PigpO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNlcmllc0xlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgZGF0YU5hbWVTdGF0aXN0aWNzLnB1c2gobmV3IEFycmF5PG51bWJlcj4odmFsdWVzLmxlbmd0aCkuZmlsbCgwKSk7XHJcbiAgICAgIH1cclxuICAgICAgc3RhdGlzdGljcy5wdXNoKGRhdGFOYW1lU3RhdGlzdGljcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZERhdGEuZm9yRWFjaCgocm93OiBhbnkpID0+IHtcclxuICAgICAgZGF0YU5hbWVzLmZvckVhY2goKGRhdGFOYW1lLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvd1ZhbHVlOiBhbnkgPSByb3dbZGF0YU5hbWVdO1xyXG4gICAgICAgIGlmIChyb3dWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IHByb2Nlc3NNaXNzaW5nQW5zd2Vycykge1xyXG4gICAgICAgICAgY29uc3Qgcm93VmFsdWVzID0gQXJyYXkuaXNBcnJheShyb3dWYWx1ZSkgPyByb3dWYWx1ZSA6IFtyb3dWYWx1ZV07XHJcbiAgICAgICAgICBpZiAoc2VyaWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHJvd1tEYXRhUHJvdmlkZXIuc2VyaWVzTWFya2VyS2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgLy8gU2VyaWVzIGFyZSBsYWJlbGxlZCBieSBzZXJpZXNNYXJrZXJLZXkgaW4gcm93IGRhdGFcclxuICAgICAgICAgICAgICBjb25zdCBzZXJpZXNObyA9XHJcbiAgICAgICAgICAgICAgICBzZXJpZXNJbmRleFtyb3dbRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV1dIHx8IDA7XHJcbiAgICAgICAgICAgICAgcm93VmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3RhdGlzdGljc1tpbmRleF1bc2VyaWVzTm9dW3ZhbHVlc0luZGV4W3ZhbF1dKys7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gU2VyaWVzIGFyZSB0aGUga2V5cyBpbiBxdWVzdGlvbiB2YWx1ZSAobWF0cml4IHF1ZXN0aW9uKVxyXG4gICAgICAgICAgICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IHRoZSBkZS1ub3JtYWxpemF0aW9uIGFuZCBjb21iaW5lIHdpdGggdGhlIHByZXZpb3VzIGNhc2VcclxuICAgICAgICAgICAgICByb3dWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJpZXMuZm9yRWFjaCgoc2VyaWVzTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodmFsW3Nlcmllc05hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpZXNObyA9IHNlcmllc0luZGV4W3Nlcmllc05hbWVdIHx8IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljc1tpbmRleF1bc2VyaWVzTm9dW3ZhbHVlc0luZGV4W3ZhbFtzZXJpZXNOYW1lXV1dKys7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBObyBzZXJpZXNcclxuICAgICAgICAgICAgcm93VmFsdWVzLmZvckVhY2goKHZhbCkgPT4gc3RhdGlzdGljc1swXVswXVt2YWx1ZXNJbmRleFt2YWxdXSsrKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0YUluZm8ubmFtZSkgPyBzdGF0aXN0aWNzIDogc3RhdGlzdGljc1swXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgY2FsY3VsYXRlZCBzdGF0aXNjdGljcyBmb3IgdGhlIElEYXRhSW5mbyBvYmplY3QuXHJcbiAgICovXHJcbiAgZ2V0RGF0YShkYXRhSW5mbzogSURhdGFJbmZvKSB7XHJcbiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0U3RhdGlzdGljc0NhY2hlS2V5KGRhdGFJbmZvKTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlID09PSB1bmRlZmluZWQgfHxcclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XSA9PT0gdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XSA9IHRoaXMuZ2V0RGF0YUNvcmUoZGF0YUluZm8pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdLmNvbmNhdCh0aGlzLl9zdGF0aXN0aWNzQ2FjaGVbY2FjaGVLZXldKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpcmVzIHdoZW4gZGF0YSBoYXMgYmVlbiBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50PFxyXG4gICAgKHNlbmRlcjogRGF0YVByb3ZpZGVyLCBvcHRpb25zOiBhbnkpID0+IGFueSxcclxuICAgIERhdGFQcm92aWRlcixcclxuICAgIGFueVxyXG4gID4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJhaXNlRGF0YUNoYW5nZWQoKSB7XHJcbiAgICBpZiAoIXRoaXMub25EYXRhQ2hhbmdlZC5pc0VtcHR5KSB7XHJcbiAgICAgIHRoaXMub25EYXRhQ2hhbmdlZC5maXJlKHRoaXMsIHt9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHF1ZXN0aW9uQ29udGFpbnNWYWx1ZShxdWVzdGlvblZhbHVlOiBhbnksIGZpbHRlclZhbHVlOiBhbnkpIHtcclxuICBjb25zdCBxdWVzdGlvblZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKHF1ZXN0aW9uVmFsdWUpO1xyXG4gIGNvbnN0IGZpbHRlclZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKGZpbHRlclZhbHVlKTtcclxuXHJcbiAgaWYgKGZpbHRlclZhbHVlS2V5cy5sZW5ndGggPiBxdWVzdGlvblZhbHVlS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgZm9yICh2YXIga2V5IG9mIGZpbHRlclZhbHVlS2V5cykge1xyXG4gICAgaWYgKGZpbHRlclZhbHVlW2tleV0gIT0gcXVlc3Rpb25WYWx1ZVtrZXldKSByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuIiwiZXhwb3J0ICogZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuLy9sb2NhbGl6YXRpb25cbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZmFyc2lcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZnJlbmNoXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2dlcm1hblwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ub3J3ZWdpYW5cIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vcG9ydHVndWVzZVwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ydXNzaWFuXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2R1dGNoXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3NwYW5pc2hcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vaXRhbGlhblwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9hcmFiaWNcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vamFwYW5lc2VcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4uL2RhdGFQcm92aWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6ZXJGYWN0b3J5XCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuLi9udW1iZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vbWF0cml4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vYm9vbGVhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2hpc3RvZ3JhbVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6ZXJCYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uUGFuZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uUGFuZWxEeW5hbWljXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hdHJpeER5bmFtaWNcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd25cIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9hbHRlcm5hdGl2ZVZpenVhbGl6ZXJzV3JhcHBlclwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4vcGxvdGx5L2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vd29yZGNsb3VkL3dvcmRjbG91ZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3dvcmRjbG91ZC9zdG9wd29yZHMvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vY2hvaWNlcy10YWJsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL25wc1wiO1xuXG5leHBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlscy9pbmRleFwiO1xuIiwiaW1wb3J0IHsgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xyXG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJJbmZvIHtcclxuICBwcml2YXRlIF9odG1sRWxlbWVudDogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB0ZXh0OiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IodmlzdWFsaXplcjogSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uKSB7XHJcbiAgICB0aGlzLl9odG1sRWxlbWVudCA9IDxIVE1MRGl2RWxlbWVudD4oXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1xdWVzdGlvbl9fZmlsdGVyXCIpXHJcbiAgICApO1xyXG4gICAgdGhpcy50ZXh0ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcclxuICAgICAgXCJzcGFuXCIsXHJcbiAgICAgIFwic2EtcXVlc3Rpb25fX2ZpbHRlci10ZXh0XCJcclxuICAgICk7XHJcbiAgICB0aGlzLl9odG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRleHQpO1xyXG4gICAgY29uc3QgZmlsdGVyQ2xlYXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xyXG4gICAgICB2aXN1YWxpemVyLnNldFNlbGVjdGlvbih1bmRlZmluZWQpO1xyXG4gICAgfSwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNsZWFyQnV0dG9uXCIpKTtcclxuICAgIHRoaXMuX2h0bWxFbGVtZW50LmFwcGVuZENoaWxkKGZpbHRlckNsZWFyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaHRtbEVsZW1lbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faHRtbEVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlKHNlbGVjdGlvbjogeyB2YWx1ZTogYW55LCB0ZXh0OiBzdHJpbmcgfSkge1xyXG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX2h0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1mbGV4XCI7XHJcbiAgICAgIHRoaXMudGV4dC5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZmlsdGVyXCIpICsgXCI6IFtcIiArIHNlbGVjdGlvbi50ZXh0ICsgXCJdXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgIHRoaXMudGV4dC5pbm5lclRleHQgPSBcIlwiO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBEYXRhUHJvdmlkZXIgfSBmcm9tIFwiLi9kYXRhUHJvdmlkZXJcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBIaXN0b2dyYW1Nb2RlbCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBwcm90ZWN0ZWQgdmFsdWVUeXBlOiBcImRhdGVcIiB8IFwibnVtYmVyXCIgPSBcIm51bWJlclwiO1xuICBwcml2YXRlIF9jYWNoZWRWYWx1ZXM6IEFycmF5PHsgb3JpZ2luYWw6IGFueSwgY29udGluaW91czogbnVtYmVyIH0+ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jb250aW5pb3VzRGF0YTogeyBbc2VyaWVzOiBzdHJpbmddOiBBcnJheTxudW1iZXI+IH0gPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NhY2hlZEludGVydmFsczogQXJyYXk8eyBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgbGFiZWw6IHN0cmluZyB9PiA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfaW50ZXJ2YWxQcmVjaXNpb246IG51bWJlciA9IDI7XG4gIHByb3RlY3RlZCBjaGFydFR5cGVzOiBzdHJpbmdbXTtcblxuICBwdWJsaWMgc3RhdGljIEludGVydmFsc0NvdW50ID0gMTA7XG4gIHB1YmxpYyBzdGF0aWMgVXNlSW50ZXJ2YWxzRnJvbSA9IDEwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcImhpc3RvZ3JhbVwiKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsUHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2ludGVydmFsUHJlY2lzaW9uID0gdGhpcy5vcHRpb25zLmludGVydmFsUHJlY2lzaW9uO1xuICAgIH1cbiAgICBjb25zdCBxdWVzdGlvblR5cGUgPSBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgaWYgKHF1ZXN0aW9uVHlwZSA9PT0gXCJ0ZXh0XCIgJiYgKHF1ZXN0aW9uW1wiaW5wdXRUeXBlXCJdID09PSBcImRhdGVcIiB8fCBxdWVzdGlvbltcImlucHV0VHlwZVwiXSA9PT0gXCJkYXRldGltZVwiKSkge1xuICAgICAgdGhpcy52YWx1ZVR5cGUgPSBcImRhdGVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZVR5cGUgPSBcIm51bWJlclwiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXQoKSB7XG4gICAgdGhpcy5fY29udGluaW91c0RhdGEgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2FjaGVkVmFsdWVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NhY2hlZEludGVydmFscyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb250aW5pb3VzVmFsdWUodmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudmFsdWVUeXBlID09PSBcImRhdGVcIikge1xuICAgICAgcmV0dXJuIERhdGUucGFyc2UodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RyaW5nKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnZhbHVlVHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBcIlwiICsgdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHRvUHJlY2lzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCBiYXNlID0gTWF0aC5wb3coMTAsIHRoaXMuX2ludGVydmFsUHJlY2lzaW9uKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChiYXNlICogdmFsdWUpIC8gYmFzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmhhc0N1c3RvbUludGVydmFscyB8fCB0aGlzLmdldENvbnRpbmlvdXNWYWx1ZXMoKS5sZW5ndGggPiBIaXN0b2dyYW1Nb2RlbC5Vc2VJbnRlcnZhbHNGcm9tKSB7XG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMuaW50ZXJ2YWxzLmZpbHRlcihpbnRlcnZhbCA9PiBpbnRlcnZhbC5sYWJlbCA9PT0gaXRlbVRleHQpWzBdO1xuICAgICAgcmV0dXJuIG5ldyBJdGVtVmFsdWUoaW50ZXJ2YWwsIGludGVydmFsICE9PSB1bmRlZmluZWQgPyBpbnRlcnZhbC5sYWJlbCA6IFwiXCIpO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgIGNvbnN0IGxhYmVsSW5kZXggPSBsYWJlbHMuaW5kZXhPZihpdGVtVGV4dCk7XG4gICAgcmV0dXJuIG5ldyBJdGVtVmFsdWUodGhpcy5nZXRWYWx1ZXMoKVtsYWJlbEluZGV4XSwgbGFiZWxzW2xhYmVsSW5kZXhdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHZpc3VhbGl6ZXIgZGF0YS5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgc3VwZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29udGluaW91c1ZhbHVlcygpIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkVmFsdWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgICBpZiAoc2VyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzZXJpZXMucHVzaChcIlwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbnRpbmlvdXNEYXRhID0ge307XG4gICAgICBzZXJpZXMuZm9yRWFjaChzZXJpZXNWYWx1ZSA9PiB0aGlzLl9jb250aW5pb3VzRGF0YVtzZXJpZXNWYWx1ZV0gPSBbXSk7XG4gICAgICBjb25zdCBoYXNoID0ge307XG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaChkYXRhSXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGFuc3dlckRhdGEgPSBkYXRhSXRlbVt0aGlzLm5hbWUgYXMgc3RyaW5nXTtcbiAgICAgICAgaWYgKGFuc3dlckRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNlcmllc1ZhbHVlID0gZGF0YUl0ZW1bRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV0gfHwgXCJcIjtcbiAgICAgICAgICAvLyBUT0RPOiBfY29udGluaW91c0RhdGEgc2hvdWxkIGJlIHNvcnRlZCBpbiBvcmRlciB0byBzcGVlZC11cCBzdGF0aXN0aWNzIGNhbGN1bGF0aW9uIGluIHRoZSBnZXREYXRhIGZ1bmN0aW9uXG4gICAgICAgICAgdGhpcy5fY29udGluaW91c0RhdGFbc2VyaWVzVmFsdWVdLnB1c2godGhpcy5nZXRDb250aW5pb3VzVmFsdWUoYW5zd2VyRGF0YSkpO1xuICAgICAgICAgIGhhc2hbYW5zd2VyRGF0YV0gPSBhbnN3ZXJEYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2NhY2hlZFZhbHVlcyA9IE9iamVjdC5rZXlzKGhhc2gpLm1hcChrZXkgPT4gKHsgb3JpZ2luYWw6IGhhc2hba2V5XSwgY29udGluaW91czogdGhpcy5nZXRDb250aW5pb3VzVmFsdWUoa2V5KSB9KSk7XG4gICAgICB0aGlzLl9jYWNoZWRWYWx1ZXMuc29ydCgoYSwgYikgPT4gYS5jb250aW5pb3VzIC0gYi5jb250aW5pb3VzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFZhbHVlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG5lZWRVc2VSYXRlVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmdldFR5cGUoKSA9PSBcInJhdGluZ1wiICYmIEFycmF5LmlzQXJyYXkodGhpcy5xdWVzdGlvbltcInJhdGVWYWx1ZXNcIl0pICYmIHRoaXMucXVlc3Rpb25bXCJyYXRlVmFsdWVzXCJdLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmludGVydmFscy5tYXAoaW50ZXJ2YWwgPT4gaW50ZXJ2YWwuc3RhcnQpO1xuICB9XG5cbiAgcHVibGljIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnZhbHMubWFwKGludGVydmFsID0+IGludGVydmFsLmxhYmVsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQ3VzdG9tSW50ZXJ2YWxzKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb25PcHRpb25zICYmIEFycmF5LmlzQXJyYXkodGhpcy5xdWVzdGlvbk9wdGlvbnMuaW50ZXJ2YWxzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJ2YWxzKCkge1xuICAgIGlmICh0aGlzLmhhc0N1c3RvbUludGVydmFscykge1xuICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25PcHRpb25zLmludGVydmFscztcbiAgICB9XG5cbiAgICBpZih0aGlzLnF1ZXN0aW9uLmdldFR5cGUoKSA9PSBcInJhdGluZ1wiKSB7XG4gICAgICBpZiAodGhpcy5uZWVkVXNlUmF0ZVZhbHVlcykge1xuICAgICAgICBjb25zdCByYXRlVmFsdWVzID0gdGhpcy5xdWVzdGlvbltcInJhdGVWYWx1ZXNcIl0gYXMgSXRlbVZhbHVlW107XG4gICAgICAgIHJldHVybiByYXRlVmFsdWVzLm1hcCgocmF0ZVZhbHVlLCBpKSA9PiAoe1xuICAgICAgICAgIHN0YXJ0OiByYXRlVmFsdWUudmFsdWUsXG4gICAgICAgICAgZW5kOiBpIDwgcmF0ZVZhbHVlcy5sZW5ndGggLSAxID8gcmF0ZVZhbHVlc1tpICsgMV0udmFsdWUgOiByYXRlVmFsdWUudmFsdWUgKyAxLFxuICAgICAgICAgIGxhYmVsOiByYXRlVmFsdWUudGV4dFxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXRlSW50ZXJ2YWxzID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9ICh0aGlzLnF1ZXN0aW9uW1wicmF0ZU1pblwiXSB8fCAwKTsgaSA8PSAodGhpcy5xdWVzdGlvbltcInJhdGVNYXhcIl0gfHwgKEhpc3RvZ3JhbU1vZGVsLkludGVydmFsc0NvdW50IC0gMSkpOyBpICs9ICh0aGlzLnF1ZXN0aW9uW1wicmF0ZVN0ZXBcIl0gfHwgMSkpIHtcbiAgICAgICAgICByYXRlSW50ZXJ2YWxzLnB1c2goe1xuICAgICAgICAgICAgc3RhcnQ6IGksXG4gICAgICAgICAgICBlbmQ6IGkgKyAxLFxuICAgICAgICAgICAgbGFiZWw6IFwiXCIgKyAoISF0aGlzLnF1ZXN0aW9uW1wicmF0ZU1pblwiXSAmJiAhIXRoaXMucXVlc3Rpb25bXCJyYXRlTWF4XCJdID8gaSA6IChpICsgXCItXCIgKyAoaSsxKSkpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhdGVJbnRlcnZhbHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NhY2hlZEludGVydmFscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgICB0aGlzLl9jYWNoZWRJbnRlcnZhbHMgPSBbXTtcbiAgICAgIGlmIChjb250aW5pb3VzVmFsdWVzLmxlbmd0aCkge1xuICAgICAgICBsZXQgc3RhcnQgPSBjb250aW5pb3VzVmFsdWVzWzBdLmNvbnRpbmlvdXM7XG4gICAgICAgIGNvbnN0IGVuZCA9IGNvbnRpbmlvdXNWYWx1ZXNbY29udGluaW91c1ZhbHVlcy5sZW5ndGggLSAxXS5jb250aW5pb3VzO1xuICAgICAgICBjb25zdCBpbnRlcnZhbHNDb3VudCA9IEhpc3RvZ3JhbU1vZGVsLkludGVydmFsc0NvdW50O1xuICAgICAgICBjb25zdCBkZWx0YSA9IChlbmQgLSBzdGFydCkgLyBpbnRlcnZhbHNDb3VudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcnZhbHNDb3VudDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHN0YXJ0ICsgZGVsdGE7XG4gICAgICAgICAgY29uc3QgaXN0YXJ0ID0gdGhpcy50b1ByZWNpc2lvbihzdGFydCk7XG4gICAgICAgICAgY29uc3QgaW5leHQgPSB0aGlzLnRvUHJlY2lzaW9uKG5leHQpO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEludGVydmFscy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0OiBpc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGkgPCBpbnRlcnZhbHNDb3VudCAtIDEgPyBpbmV4dCA6IGluZXh0ICsgZGVsdGEgLyAxMDAsXG4gICAgICAgICAgICBsYWJlbDogXCJcIiArIHRoaXMuZ2V0U3RyaW5nKGlzdGFydCkgKyBcIi1cIiArIHRoaXMuZ2V0U3RyaW5nKGluZXh0KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN0YXJ0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkSW50ZXJ2YWxzO1xuICB9XG5cbiAgcHVibGljIGdldENhbGN1bGF0ZWRWYWx1ZXMoKTogYW55IHtcbiAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgY29uc3QgaW50ZXJ2YWxzID0gdGhpcy5pbnRlcnZhbHM7XG4gICAgY29uc3Qgc3RhdGlzdGljczogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGlmIChzZXJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZXJpZXMucHVzaChcIlwiKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHN0YXRpc3RpY3MucHVzaChpbnRlcnZhbHMubWFwKGkgPT4gMCkpO1xuICAgICAgdGhpcy5fY29udGluaW91c0RhdGFbc2VyaWVzW2ldXS5mb3JFYWNoKGRhdGFWYWx1ZSA9PiB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW50ZXJ2YWxzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgaWYgKGludGVydmFsc1tqXS5zdGFydCA8PSBkYXRhVmFsdWUgJiYgKGRhdGFWYWx1ZSA8IGludGVydmFsc1tqXS5lbmQgfHwgaiA9PSBpbnRlcnZhbHMubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICAgIHN0YXRpc3RpY3NbaV1bal0rKztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG59XG4iLCJjb25zdCBNdXVyaSA9IHJlcXVpcmUoXCJtdXVyaVwiKTtcclxuXHJcbi8qKlxyXG4gKiBBIGJhc2UgY2xhc3MgdXNlZCB0byBpbXBsZW1lbnQgY3VzdG9tIGxheW91dCBlbmdpbmVzIG9yIGludGVncmF0ZSB0aGlyZC1wYXJ0eSBsYXlvdXQgZW5naW5lcyB3aXRoIFN1cnZleUpTIERhc2hib2FyZC5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBMYXlvdXRFbmdpbmUge1xyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfYWxsb3dlZDogYm9vbGVhbikgeyB9XHJcblxyXG4gIHByb3RlY3RlZCBzdGFydENvcmUoY29udGFpbmVyOiBIVE1MRWxlbWVudCkgeyB9XHJcbiAgcHJvdGVjdGVkIHN0b3BDb3JlKCkgeyB9XHJcbiAgcHJvdGVjdGVkIHVwZGF0ZUNvcmUoKSB7IH1cclxuXHJcbiAgZ2V0IGFsbG93ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgdGhlIGR5bmFtaWMgbGF5b3V0IGluIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGFycmFuZ2UgdmlzdWFsaXphdGlvbiBpdGVtcyBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzcGFjZSBhbmQgYWxsb3cgdXNlcnMgdG8gcmVvcmRlciB0aGVtIHZpYSBkcmFnIGFuZCBkcm9wLlxyXG4gICAqL1xyXG4gIHN0YXJ0KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRDb3JlKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIERpc2FibGVzIHRoZSBkeW5hbWljIGxheW91dC5cclxuICAgKi9cclxuICBzdG9wKCkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHtcclxuICAgICAgdGhpcy5zdG9wQ29yZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBkeW5hbWljIGxheW91dC5cclxuICAgKi9cclxuICB1cGRhdGUoKSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUNvcmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZChlbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+LCBvcHRpb25zPzogYW55KSB7IH1cclxuICByZW1vdmUoZWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50Piwgb3B0aW9ucz86IGFueSkgeyB9XHJcblxyXG4gIG9uTW92ZUNhbGxiYWNrOiAob3JkZXI6IEFycmF5PHN0cmluZz4pID0+IHZvaWQ7XHJcblxyXG4gIGRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN0b3AoKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNdXVyaUxheW91dEVuZ2luZSBleHRlbmRzIExheW91dEVuZ2luZSB7XHJcbiAgcHJpdmF0ZSBfbXV1cmk6IGFueSA9IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9sYXlvdXRpbmdUaW1lcjogYW55ID0gdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihhbGxvd2VkOiBib29sZWFuLCBwcml2YXRlIF9zZWxlY3Rvcjogc3RyaW5nLCBwcml2YXRlIGRyYWdFbmFibGVkID0gdHJ1ZSkge1xyXG4gICAgc3VwZXIoYWxsb3dlZCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3RhcnRDb3JlKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuX211dXJpID0gbmV3IE11dXJpKGNvbnRhaW5lciwge1xyXG4gICAgICBkcmFnU3RhcnRQcmVkaWNhdGU6IHtcclxuICAgICAgICBoYW5kbGU6IFwiLnNhLXF1ZXN0aW9uX190aXRsZS0tZHJhZ2dhYmxlXCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1zOiB0aGlzLl9zZWxlY3RvcixcclxuICAgICAgZHJhZ0VuYWJsZWQ6IHRoaXMuZHJhZ0VuYWJsZWQsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX211dXJpLm9uKFxyXG4gICAgICBcImRyYWdSZWxlYXNlRW5kXCIsXHJcbiAgICAgIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBuZXdPcmRlciA9IGl0ZW0uZ2V0R3JpZCgpLmdldEl0ZW1zKCkubWFwKGdyaWRJdGVtID0+IGdyaWRJdGVtLmdldEVsZW1lbnQoKS5kYXRhc2V0LnF1ZXN0aW9uKTtcclxuICAgICAgICB0aGlzLm9uTW92ZUNhbGxiYWNrICYmIHRoaXMub25Nb3ZlQ2FsbGJhY2sobmV3T3JkZXIpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgc3RvcENvcmUoKSB7XHJcbiAgICB0aGlzLl9tdXVyaS5vZmYoXCJkcmFnUmVsZWFzZUVuZFwiKTtcclxuICAgIHRoaXMuX211dXJpLmRlc3Ryb3koKTtcclxuICAgIHRoaXMuX211dXJpID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgdXBkYXRlQ29yZSgpIHtcclxuICAgIGlmICh0aGlzLl9sYXlvdXRpbmdUaW1lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sYXlvdXRpbmdUaW1lcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9sYXlvdXRpbmdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9sYXlvdXRpbmdUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5fbXV1cmkucmVmcmVzaEl0ZW1zKCk7XHJcbiAgICAgIHRoaXMuX211dXJpLmxheW91dCgpO1xyXG4gICAgfSwgMTApO1xyXG4gIH1cclxuXHJcbiAgYWRkKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB0aGlzLl9tdXVyaS5hZGQoZWxlbWVudHMsIG9wdGlvbnMpO1xyXG4gIH1cclxuICByZW1vdmUoZWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50Piwgb3B0aW9ucz86IGFueSkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHRoaXMuX211dXJpLnJlbW92ZShlbGVtZW50cywgb3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IGVuZ2xpc2hTdHJpbmdzIH0gZnJvbSBcIi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9lbmdsaXNoXCI7XG5cbmV4cG9ydCB2YXIgbG9jYWxpemF0aW9uID0ge1xuICBjdXJyZW50TG9jYWxlVmFsdWU6IFwiXCIsXG4gIGRlZmF1bHRMb2NhbGVWYWx1ZTogXCJlblwiLFxuICBsb2NhbGVzOiA8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pnt9LFxuICBsb2NhbGVOYW1lczogPHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT57fSxcbiAgc3VwcG9ydGVkTG9jYWxlczogPEFycmF5PGFueT4+W10sXG4gIGdldCBjdXJyZW50TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9PT0gdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWVcbiAgICAgID8gXCJcIlxuICAgICAgOiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGN1cnJlbnRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0IGRlZmF1bHRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlO1xuICB9LFxuICBzZXQgZGVmYXVsdExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlID0gdmFsO1xuICB9LFxuICBnZXRTdHJpbmc6IGZ1bmN0aW9uIChzdHJOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbG9jID0gdGhpcy5jdXJyZW50TG9jYWxlXG4gICAgICA/IHRoaXMubG9jYWxlc1t0aGlzLmN1cnJlbnRMb2NhbGVdXG4gICAgICA6IHRoaXMubG9jYWxlc1t0aGlzLmRlZmF1bHRMb2NhbGVdO1xuICAgIGlmICghbG9jIHx8ICFsb2Nbc3RyTmFtZV0pIGxvYyA9IHRoaXMubG9jYWxlc1t0aGlzLmRlZmF1bHRMb2NhbGVdO1xuICAgIHZhciByZXN1bHQgPSBsb2Nbc3RyTmFtZV07XG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmxvY2FsZXNbXCJlblwiXVtzdHJOYW1lXSB8fCBzdHJOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICBnZXRMb2NhbGVzOiBmdW5jdGlvbiAoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHJlcy5wdXNoKFwiXCIpO1xuICAgIGlmICh0aGlzLnN1cHBvcnRlZExvY2FsZXMgJiYgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy5wdXNoKHRoaXMuc3VwcG9ydGVkTG9jYWxlc1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmxvY2FsZXMpIHtcbiAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzLnNvcnQoKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIHN1cnZleVN0cmluZ3MgPSBlbmdsaXNoU3RyaW5ncztcbig8YW55PmxvY2FsaXphdGlvbikubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5sb2NhbGl6YXRpb24pLmxvY2FsZU5hbWVzW1wiZW5cIl0gPSBcIkVuZ2xpc2hcIjtcbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSwgUXVlc3Rpb25NYXRyaXhNb2RlbCwgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IElBbnN3ZXJzRGF0YSwgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJtYXRyaXhcIik7XG4gICAgdGhpcy5nZXRBbnN3ZXJzRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBtYXRyaXhRdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeE1vZGVsIHtcbiAgICByZXR1cm4gPFF1ZXN0aW9uTWF0cml4TW9kZWw+dGhpcy5xdWVzdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PiBcIlwiICsgcm93LnZhbHVlKTtcbiAgfVxuXG4gIGdldFNlcmllc0xhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+XG4gICAgICBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUodGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLCByb3cudmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbjogSXRlbVZhbHVlKSA9PiBjb2x1bW4udGV4dCA9PT0gaXRlbVRleHRcbiAgICApWzBdO1xuICB9XG5cbiAgdmFsdWVzU291cmNlKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnM7XG4gIH1cblxuICBwcml2YXRlIGdldEhhc0Fuc3dlcnNJbkFsbFNlcmllc0FycmF5KFxuICAgIGRhdGFzZXRzOiBBcnJheTxBcnJheTxhbnk+PlxuICApOiBBcnJheTxib29sZWFuPiB7XG4gICAgbGV0IHJlc3VsdDogQXJyYXk8Ym9vbGVhbj4gPSBBcnJheTxib29sZWFuPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXNldHNbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGF0YXNldHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGRhdGFzZXRzW2pdW2ldICE9IDApIHtcbiAgICAgICAgICByZXN1bHRbaV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGdldEhhc0Fuc3dlcnNJblNlcmllcyhkYXRhc2V0OiBBcnJheTxhbnk+KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZGF0YXNldFtpXSAhPSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGlkZUVtcHR5QW5zd2Vyc0luRGF0YShhbnN3ZXJzRGF0YTogSUFuc3dlcnNEYXRhKTogSUFuc3dlcnNEYXRhIHtcbiAgICBjb25zdCByZXN1bHQ6IElBbnN3ZXJzRGF0YSA9IHtcbiAgICAgIGRhdGFzZXRzOiA8QXJyYXk8QXJyYXk8YW55Pj4+W10sXG4gICAgICBsYWJlbHM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgICAgY29sb3JzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICAgIHRleHRzOiA8QXJyYXk8QXJyYXk8YW55Pj4+W10sXG4gICAgICBzZXJpZXNMYWJlbHM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgIH07XG5cbiAgICBjb25zdCBoYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnIgPSB0aGlzLmdldEhhc0Fuc3dlcnNJbkFsbFNlcmllc0FycmF5KFxuICAgICAgYW5zd2Vyc0RhdGEuZGF0YXNldHNcbiAgICApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5zd2Vyc0RhdGEuZGF0YXNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGhhc0Fuc3dlcnNJblNlcmllcyA9IHRoaXMuZ2V0SGFzQW5zd2Vyc0luU2VyaWVzKFxuICAgICAgICBhbnN3ZXJzRGF0YS5kYXRhc2V0c1tpXVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNBbnN3ZXJzSW5TZXJpZXMpIHtcbiAgICAgICAgcmVzdWx0LmxhYmVscy5wdXNoKGFuc3dlcnNEYXRhLmxhYmVsc1tpXSk7XG4gICAgICAgIHJlc3VsdC5jb2xvcnMucHVzaChhbnN3ZXJzRGF0YS5jb2xvcnNbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0cyA9IFtdO1xuICAgICAgY29uc3QgdGV4dHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGhhc0Fuc3dlcnNJbkFsbFNlcmllc0FycltqXSkge1xuICAgICAgICAgIGRhdGFzZXRzLnB1c2goYW5zd2Vyc0RhdGEuZGF0YXNldHNbaV1bal0pO1xuICAgICAgICAgIHRleHRzLnB1c2goYW5zd2Vyc0RhdGEudGV4dHNbaV1bal0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQuZGF0YXNldHMucHVzaChkYXRhc2V0cyk7XG4gICAgICByZXN1bHQudGV4dHMucHVzaCh0ZXh0cyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJbaV0pIHtcbiAgICAgICAgcmVzdWx0LnNlcmllc0xhYmVscy5wdXNoKGFuc3dlcnNEYXRhLnNlcmllc0xhYmVsc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHN1cGVyLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgY29uc3QgcHJlcGFyZWREYXRhOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAoc2VyaWVzTmFtZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdW3ZhbHVlSW5kZXhdXG4gICAgICApO1xuICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZXBhcmVkRGF0YTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSXRlbVZhbHVlLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsIFF1ZXN0aW9uLCBNYXRyaXhEcm9wZG93bkNvbHVtbiwgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IElBbnN3ZXJzRGF0YSwgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duR3JvdXBlZCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJtYXRyaXhEcm9wZG93bkdyb3VwZWRcIik7XG4gICAgdGhpcy5nZXRBbnN3ZXJzRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBtYXRyaXhRdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwge1xuICAgIHJldHVybiA8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXMucXVlc3Rpb247XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLm5hbWUpO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMubWFwKChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24uY29sdW1ucy5tYXAoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pID0+IGNvbHVtbi50aXRsZSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLmZpbHRlcihcbiAgLy8gICAgIChjb2x1bW46IEl0ZW1WYWx1ZSkgPT4gY29sdW1uLnRleHQgPT09IGl0ZW1UZXh0XG4gIC8vICAgKVswXTtcbiAgLy8gfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jaG9pY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYWxjdWxhdGVkVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMubWF0cml4UXVlc3Rpb24ucm93cy5tYXAocm93ID0+IHJvdy52YWx1ZSk7XG5cbiAgICBjb25zdCBzdGF0aXN0aWNzID0gdGhpcy5kYXRhUHJvdmlkZXIuZ2V0RGF0YSh7XG4gICAgICBuYW1lOiBzZXJpZXMsXG4gICAgICBnZXRWYWx1ZXM6ICgpID0+IHZhbHVlcyxcbiAgICAgIGdldExhYmVsczogKCkgPT4gdmFsdWVzLFxuICAgICAgZ2V0U2VyaWVzVmFsdWVzOiAoKSA9PiByb3dzLFxuICAgICAgZ2V0U2VyaWVzTGFiZWxzOiAoKSA9PiByb3dzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJlcGFyZWREYXRhOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAoc2VyaWVzTmFtZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdWzBdW3ZhbHVlSW5kZXhdXG4gICAgICApO1xuICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZXBhcmVkRGF0YTtcbiAgfVxufVxuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0IHsgUXVlc3Rpb24sIEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmltcG9ydCBcIi4vbnBzLnNjc3NcIjtcblxuZXhwb3J0IGNsYXNzIE5wc1ZpenVhbGl6ZXJXaWRnZXQge1xuICBwcml2YXRlIF9yZW5kZXJlZFRhcmdldDogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbW9kZWw6IE5wc1ZpenVhbGl6ZXIsIHByaXZhdGUgX2RhdGE6IHsgZGV0cmFjdG9yczogbnVtYmVyLCBwYXNzaXZlOiBudW1iZXIsIHByb21vdGVyczogbnVtYmVyLCB0b3RhbDogbnVtYmVyIH0pIHtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU2NvcmVQYXJ0KHBhcnRJZDogc3RyaW5nLCB2YWx1ZTogbnVtYmVyLCBwZXJjZW50PzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2NvcmVQYXJ0RWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS12aXN1YWxpemVyLW5wc19fc2NvcmUtcGFydFwiKTtcbiAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtdmlzdWFsaXplci1ucHNfX3Njb3JlLXBhcnQtdGl0bGVcIik7XG4gICAgdGl0bGVFbGVtZW50LmlubmVyVGV4dCA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcocGFydElkKTtcbiAgICBzY29yZVBhcnRFbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlRWxlbWVudCk7XG4gICAgY29uc3QgdmFsdWVzRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS12aXN1YWxpemVyLW5wc19fc2NvcmUtcGFydC12YWx1ZXNcIik7XG4gICAgc2NvcmVQYXJ0RWxlbWVudC5hcHBlbmRDaGlsZCh2YWx1ZXNFbGVtZW50KTtcbiAgICBjb25zdCB2YWx1ZUVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtdmlzdWFsaXplci1ucHNfX3Njb3JlLXBhcnQtdmFsdWVcIik7XG4gICAgdmFsdWVFbGVtZW50LmlubmVyVGV4dCA9IFwiXCIgKyB2YWx1ZTtcbiAgICB2YWx1ZXNFbGVtZW50LmFwcGVuZENoaWxkKHZhbHVlRWxlbWVudCk7XG4gICAgaWYocGVyY2VudCkge1xuICAgICAgY29uc3QgcGVyY2VudEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtdmlzdWFsaXplci1ucHNfX3Njb3JlLXBhcnQtcGVyY2VudFwiKTtcbiAgICAgIHBlcmNlbnRFbGVtZW50LmlubmVyVGV4dCA9IFwiXCIgKyBwZXJjZW50ICsgXCIlXCI7XG4gICAgICB2YWx1ZXNFbGVtZW50LmFwcGVuZENoaWxkKHBlcmNlbnRFbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHNjb3JlUGFydEVsZW1lbnQ7XG4gIH1cbiAgcHVibGljIHJlbmRlcih0YXJnZXQ6IEhUTUxEaXZFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZWRUYXJnZXQgPSB0YXJnZXQ7XG4gICAgdmFyIG5wc0VsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtdmlzdWFsaXplci1ucHNcIik7XG4gICAgbnBzRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlclNjb3JlUGFydChcIm5wc1Njb3JlXCIsICgodGhpcy5fZGF0YS5wcm9tb3RlcnMgLSB0aGlzLl9kYXRhLmRldHJhY3RvcnMpIC8gdGhpcy5fZGF0YS50b3RhbCkgKiAxMDApKTtcbiAgICBucHNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucmVuZGVyU2NvcmVQYXJ0KFwibnBzUHJvbW90ZXJzXCIsIHRoaXMuX2RhdGEucHJvbW90ZXJzLCB0aGlzLl9kYXRhLnByb21vdGVycyAvIHRoaXMuX2RhdGEudG90YWwgKiAxMDApKTtcbiAgICBucHNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucmVuZGVyU2NvcmVQYXJ0KFwibnBzUGFzc2l2ZXNcIiwgdGhpcy5fZGF0YS50b3RhbCAtIHRoaXMuX2RhdGEucHJvbW90ZXJzIC0gdGhpcy5fZGF0YS5kZXRyYWN0b3JzLCAodGhpcy5fZGF0YS50b3RhbCAtIHRoaXMuX2RhdGEucHJvbW90ZXJzIC0gdGhpcy5fZGF0YS5kZXRyYWN0b3JzKSAvIHRoaXMuX2RhdGEudG90YWwgKiAxMDApKTtcbiAgICBucHNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucmVuZGVyU2NvcmVQYXJ0KFwibnBzRGV0cmFjdG9yc1wiLCB0aGlzLl9kYXRhLmRldHJhY3RvcnMsIHRoaXMuX2RhdGEuZGV0cmFjdG9ycyAvIHRoaXMuX2RhdGEudG90YWwgKiAxMDApKTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQobnBzRWxlbWVudCk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYoISF0aGlzLl9yZW5kZXJlZFRhcmdldCkge1xuICAgICAgdGhpcy5fcmVuZGVyZWRUYXJnZXQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHRoaXMuX3JlbmRlcmVkVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTnBzQWRhcHRlciB7XG4gIHByaXZhdGUgX25wc1ZpenVhbGl6ZXI6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBOcHNWaXp1YWxpemVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgbnBzVml6dWFsaXplcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9ucHNWaXp1YWxpemVyO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMubW9kZWwuZ2V0Q2FsY3VsYXRlZFZhbHVlcygpO1xuICAgIHRoaXMuX25wc1ZpenVhbGl6ZXIgPSBuZXcgTnBzVml6dWFsaXplcldpZGdldCh0aGlzLm1vZGVsLCBkYXRhKTtcbiAgICB0aGlzLl9ucHNWaXp1YWxpemVyLnJlbmRlcihlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5fbnBzVml6dWFsaXplcjtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KG5vZGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYodGhpcy5fbnBzVml6dWFsaXplciAmJiB0eXBlb2YgdGhpcy5fbnBzVml6dWFsaXplci5kaXNwb3NlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMuX25wc1ZpenVhbGl6ZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLl9ucHNWaXp1YWxpemVyID0gdW5kZWZpbmVkO1xuICB9XG59XG5leHBvcnQgY2xhc3MgTnBzVml6dWFsaXplciBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHJpdmF0ZSBfbnBzQWRhcHRlcjogTnBzQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJucHNcIik7XG4gICAgdGhpcy5fbnBzQWRhcHRlciA9IG5ldyBOcHNBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGdldENhbGN1bGF0ZWRWYWx1ZXMoKTogYW55IHtcbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgZGV0cmFjdG9yczogMCxcbiAgICAgIHBhc3NpdmU6IDAsXG4gICAgICBwcm9tb3RlcnM6IDAsXG4gICAgICB0b3RhbDogMCxcbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1t0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICAgICAgY29uc3Qgc2NvcmVWYWx1ZSA9IHBhcnNlSW50KHJvd1ZhbHVlKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKHNjb3JlVmFsdWUpKSB7XG4gICAgICAgIGlmKHNjb3JlVmFsdWUgPD0gNikge1xuICAgICAgICAgIHJlc3VsdC5kZXRyYWN0b3JzKys7XG4gICAgICAgIH0gZWxzZSBpZihzY29yZVZhbHVlID49IDkpIHtcbiAgICAgICAgICByZXN1bHQucHJvbW90ZXJzKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnBhc3NpdmUrKztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQudG90YWwrKztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX25wc0FkYXB0ZXIuZGVzdHJveShjb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fbnBzQWRhcHRlci5jcmVhdGUoY29udGFpbmVyKTtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX25wc0FkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vLyBWaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYXRpbmdcIiwgTnBzVml6dWFsaXplcik7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG5leHBvcnQgY2xhc3MgTnVtYmVyTW9kZWwgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByaXZhdGUgX3Jlc3VsdEF2ZXJhZ2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVzdWx0TWluOiBudW1iZXI7XG4gIHByaXZhdGUgX3Jlc3VsdE1heDogbnVtYmVyO1xuXG4gIHB1YmxpYyBzdGF0aWMgc3RlcHNDb3VudCA9IDU7XG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVUZXh0c0NhbGxiYWNrOiAoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBzdGVwc0NvdW50OiBudW1iZXIsXG4gICAgdGV4dHM6IHN0cmluZ1tdXG4gICkgPT4gc3RyaW5nW107XG5cbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IEFycmF5PHN0cmluZz47XG4gIGNoYXJ0VHlwZTogU3RyaW5nO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hvd0FzUGVyY2VudGFnZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJudW1iZXJcIik7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlQ2hhcnRUeXBlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy5jaGFydFR5cGVzLm1hcCgoY2hhcnRUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogY2hhcnRUeXBlLFxuICAgICAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhcnRUeXBlX1wiICsgY2hhcnRUeXBlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLmNoYXJ0VHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcnRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWluID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3VsdE1heCA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFydFR5cGVDaGFuZ2VkKCkge31cblxuICBwcm90ZWN0ZWQgc2V0Q2hhcnRUeXBlKGNoYXJ0VHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGFydFR5cGVzLmluZGV4T2YoY2hhcnRUeXBlKSAhPT0gLTEgJiZcbiAgICAgIHRoaXMuY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuY2hhcnRUeXBlID0gY2hhcnRUeXBlO1xuICAgICAgdGhpcy5vbkNoYXJ0VHlwZUNoYW5nZWQoKTtcbiAgICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXN1bHRNaW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWF4ID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGdlbmVyYXRlVGV4dChtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBsZXQgdGV4dHM6IGFueSA9IFtdO1xuXG4gICAgaWYgKHN0ZXBzQ291bnQgPT09IDUpIHtcbiAgICAgIHRleHRzID0gW1xuICAgICAgICBcInZlcnkgaGlnaCAoXCIgKyBtYXhWYWx1ZSArIFwiKVwiLFxuICAgICAgICBcImhpZ2hcIixcbiAgICAgICAgXCJtZWRpdW1cIixcbiAgICAgICAgXCJsb3dcIixcbiAgICAgICAgXCJ2ZXJ5IGxvdyAoXCIgKyBtaW5WYWx1ZSArIFwiKVwiLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dHMucHVzaChtYXhWYWx1ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzQ291bnQgLSAyOyBpKyspIHtcbiAgICAgICAgdGV4dHMucHVzaChcIlwiKTtcbiAgICAgIH1cbiAgICAgIHRleHRzLnB1c2gobWluVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghIU51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIE51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjayhcbiAgICAgICAgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgbWF4VmFsdWUsXG4gICAgICAgIG1pblZhbHVlLFxuICAgICAgICBzdGVwc0NvdW50LFxuICAgICAgICB0ZXh0c1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dHM7XG4gIH1cblxuICBnZW5lcmF0ZVZhbHVlcyhtYXhWYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICB2YWx1ZXMucHVzaChtYXhWYWx1ZSAvIHN0ZXBzQ291bnQpO1xuICAgIH1cblxuICAgIHZhbHVlcy5wdXNoKG1heFZhbHVlKTtcblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBnZW5lcmF0ZUNvbG9ycyhtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCBwYWxldHRlID0gdGhpcy5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICBjb2xvcnMucHVzaChwYWxldHRlW2ldKTtcbiAgICB9XG5cbiAgICBjb2xvcnMucHVzaChcInJnYmEoMjU1LCAyNTUsIDI1NSwgMClcIik7XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgcHVibGljIGdldENhbGN1bGF0ZWRWYWx1ZXMoKTogYW55IHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9yZXN1bHRNYXggPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5fcmVzdWx0TWluID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIHRoaXMuX3Jlc3VsdE1heCA9IC1OdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IDA7XG4gICAgICBsZXQgYWN0dWFsQW5zd2VyQ291bnQgPSAwO1xuXG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaCgocm93RGF0YSkgPT4ge1xuICAgICAgICBpZihyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uVmFsdWU6IG51bWJlciA9ICtyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICAgICAgYWN0dWFsQW5zd2VyQ291bnQrKztcbiAgICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlICs9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jlc3VsdE1pbiA+IHF1ZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9yZXN1bHRNYXggPCBxdWVzdGlvblZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRNYXggPSBxdWVzdGlvblZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmKGFjdHVhbEFuc3dlckNvdW50ID4gMCkge1xuICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID0gdGhpcy5fcmVzdWx0QXZlcmFnZSAvIGFjdHVhbEFuc3dlckNvdW50O1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IE1hdGguY2VpbCh0aGlzLl9yZXN1bHRBdmVyYWdlICogMTAwKSAvIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLl9yZXN1bHRBdmVyYWdlLCB0aGlzLl9yZXN1bHRNaW4sIHRoaXMuX3Jlc3VsdE1heF07XG4gIH1cbn1cbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi9ib29sZWFuXCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgUGxvdGx5Qm9vbENoYXJ0QWRhcHRlciBleHRlbmRzIFBsb3RseUNoYXJ0QWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsOiBCb29sZWFuUGxvdGx5KSB7XG4gICAgc3VwZXIobW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBib29sQ29sb3JzID0gW1xuICAgICAgQm9vbGVhblBsb3RseS50cnVlQ29sb3IgfHwgY29sb3JzWzBdLFxuICAgICAgQm9vbGVhblBsb3RseS5mYWxzZUNvbG9yIHx8IGNvbG9yc1sxXSxcbiAgICBdO1xuICAgIGlmKHRoaXMubW9kZWwuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICBib29sQ29sb3JzLnB1c2goY29sb3JzWzJdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlOiBhbnkpID0+IHtcbiAgICAgICAgdHJhY2UubWFya2VyLmNvbG9ycyA9IGJvb2xDb2xvcnM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuY2hhcnRUeXBlID09PSBcImJhclwiKSB7XG4gICAgICB0cmFjZXMuZm9yRWFjaCgodHJhY2U6IGFueSkgPT4ge1xuICAgICAgICB0cmFjZS5tYXJrZXIuY29sb3IgPSBib29sQ29sb3JzO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuUGxvdGx5IGV4dGVuZHMgQm9vbGVhbk1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJwaWVcIiwgXCJiYXJcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEJvb2xlYW5QbG90bHkudHlwZXM7XG4gICAgdGhpcy5fY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlCb29sQ2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImJvb2xlYW5cIiwgQm9vbGVhblBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEhpc3RvZ3JhbU1vZGVsIH0gZnJvbSBcIi4uL2hpc3RvZ3JhbVwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEhpc3RvZ3JhbVBsb3RseSBleHRlbmRzIEhpc3RvZ3JhbU1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJ2YmFyXCIsIFwiYmFyXCIsIFwic2NhdHRlclwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEhpc3RvZ3JhbVBsb3RseS50eXBlcztcbiAgICB0aGlzLl9jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gPEhUTUxFbGVtZW50PihcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICApO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGFydE5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5jcmVhdGUoY2hhcnROb2RlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYWxjdWxhdGVkVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdGF0aXN0aWNzID0gc3VwZXIuZ2V0Q2FsY3VsYXRlZFZhbHVlcygpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBpZiAoc2VyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkRGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgICAgKHNlcmllc1ZhbHVlLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bdmFsdWVJbmRleF1cbiAgICAgICAgKTtcbiAgICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcmVwYXJlZERhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlVHlwZSgpOiBcImRhdGVcIiB8IFwibnVtYmVyXCIge1xuICAgIHJldHVybiB0aGlzLnZhbHVlVHlwZTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkYXRlXCIsIEhpc3RvZ3JhbVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJudW1iZXJcIiwgSGlzdG9ncmFtUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInJhdGluZ1wiLCBIaXN0b2dyYW1QbG90bHkpO1xuIiwiZXhwb3J0ICogZnJvbSBcIi4vc2V0dXBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21hdHJpeFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYm9vbGVhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmFua2luZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWF0cml4ZHJvcGRvd24tZ3JvdXBlZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaGlzdG9ncmFtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yYXRpbmdcIjtcbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSwgUXVlc3Rpb25NYXRyaXhNb2RlbCwgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBNYXRyaXggfSBmcm9tIFwiLi4vbWF0cml4XCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgTWF0cml4UGxvdGx5IGV4dGVuZHMgTWF0cml4IHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJiYXJcIiwgXCJzdGFja2VkYmFyXCIsIFwicGllXCIsIFwiZG91Z2hudXRcIl07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBNYXRyaXhQbG90bHkudHlwZXM7XG4gICAgdGhpcy5fY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlDaGFydEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm1hdHJpeFwiLCBNYXRyaXhQbG90bHkpO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgTWF0cml4RHJvcGRvd25Hcm91cGVkIH0gZnJvbSBcIi4uL21hdHJpeERyb3Bkb3duR3JvdXBlZFwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duR3JvdXBlZFBsb3RseSBleHRlbmRzIE1hdHJpeERyb3Bkb3duR3JvdXBlZCB7XG4gIHByaXZhdGUgX2NoYXJ0QWRhcHRlcjogUGxvdGx5Q2hhcnRBZGFwdGVyO1xuICBwdWJsaWMgc3RhdGljIHR5cGVzID0gW1wic3RhY2tlZGJhclwiLCBcImJhclwiLCBcInBpZVwiLCBcImRvdWdobnV0XCJdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IE1hdHJpeERyb3Bkb3duR3JvdXBlZFBsb3RseS50eXBlcztcbiAgICB0aGlzLl9jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibWF0cml4ZHJvcGRvd24tZ3JvdXBlZFwiLCBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkpO1xuIiwiaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2VQbG90bHkgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBSYW5raW5nUGxvdGx5IGV4dGVuZHMgU2VsZWN0QmFzZVBsb3RseSB7XG4gIGdldFF1ZXN0aW9uUmVzdWx0cygpIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5xdWVzdGlvbi5uYW1lO1xuICAgIHJldHVybiB0aGlzLmRhdGEubWFwKChkYXRhSXRlbSkgPT4gZGF0YUl0ZW1bbmFtZV0pO1xuICB9XG5cbiAgZ2V0RW1wdHlEYXRhKCkge1xuICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuICAgIGxldCBkYXRhOiBhbnkgPSBbXTtcblxuICAgIGRhdGEubGVuZ3RoID0gY2hvaWNlcy5sZW5ndGg7XG4gICAgZGF0YS5maWxsKDApO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ2V0UXVlc3Rpb25SZXN1bHRzKCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG5cbiAgICBsZXQgcGxvdGx5RGF0YSA9IHRoaXMuZ2V0RW1wdHlEYXRhKCk7XG5cbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy5hcHBseVJlc3VsdFRvUGxvdGx5RGF0YShyZXN1bHQsIHBsb3RseURhdGEsIGNob2ljZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtwbG90bHlEYXRhXTtcbiAgfVxuXG4gIGFwcGx5UmVzdWx0VG9QbG90bHlEYXRhKHJlc3VsdDogYW55W10sIHBsb3RseURhdGE6IGFueSwgY2hvaWNlczogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQgfHwgIXBsb3RseURhdGEgfHwgIWNob2ljZXMpIHJldHVybjtcblxuICAgIHJlc3VsdC5mb3JFYWNoKChyZXN1bHRWYWx1ZTogYW55LCByZXN1bHRWYWx1ZUluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55W10pID0+IHtcbiAgICAgIGxldCBpbmRleCA9IGNob2ljZXMuaW5kZXhPZihyZXN1bHRWYWx1ZSk7XG4gICAgICBwbG90bHlEYXRhW2luZGV4XSA9XG4gICAgICAgICtwbG90bHlEYXRhW2luZGV4XSArIChyZXN1bHQubGVuZ3RoIC0gcmVzdWx0VmFsdWVJbmRleCk7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFua2luZ1wiLCBSYW5raW5nUGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvblJhdGluZ01vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBOdW1iZXJNb2RlbCB9IGZyb20gXCIuLi9udW1iZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBhbGxvd0RvbVJlbmRlcmluZywgRGF0YUhlbHBlciwgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5pbXBvcnQgUGxvdGx5IGZyb20gXCJwbG90bHkuanMtZGlzdC1taW5cIjtcblxuZXhwb3J0IGNsYXNzIFBsb3RseUdhdWdlQWRhcHRlciB7XG4gIHByaXZhdGUgX2NoYXJ0OiBQcm9taXNlPFBsb3RseS5QbG90bHlIVE1MRWxlbWVudD4gPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogR2F1Z2VQbG90bHkpIHsgfVxuXG4gIHB1YmxpYyBnZXQgY2hhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0O1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZShjaGFydE5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSB0aGlzLm1vZGVsLnF1ZXN0aW9uO1xuICAgIGxldCBbbGV2ZWwsIG1pblZhbHVlLCBtYXhWYWx1ZV0gPSB0aGlzLm1vZGVsLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcblxuICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwicmF0aW5nXCIpIHtcbiAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSAoPFF1ZXN0aW9uUmF0aW5nTW9kZWw+cXVlc3Rpb24pLnZpc2libGVSYXRlVmFsdWVzO1xuICAgICAgbWF4VmFsdWUgPSByYXRlVmFsdWVzW3JhdGVWYWx1ZXMubGVuZ3RoIC0gMV0udmFsdWU7XG4gICAgICBtaW5WYWx1ZSA9IHJhdGVWYWx1ZXNbMF0udmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZW5lcmF0ZUNvbG9ycyhcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBHYXVnZVBsb3RseS5zdGVwc0NvdW50XG4gICAgKTtcblxuICAgIGlmIChHYXVnZVBsb3RseS5zaG93QXNQZXJjZW50YWdlKSB7XG4gICAgICBsZXZlbCA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKGxldmVsLCBtYXhWYWx1ZSk7XG4gICAgICBtaW5WYWx1ZSA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBtYXhWYWx1ZSA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKG1heFZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGRhdGE6IGFueSA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbmRpY2F0b3JcIixcbiAgICAgICAgbW9kZTogXCJnYXVnZStudW1iZXJcIixcbiAgICAgICAgZ2F1Z2U6IHtcbiAgICAgICAgICBheGlzOiB7IHJhbmdlOiBbbWluVmFsdWUsIG1heFZhbHVlXSB9LFxuICAgICAgICAgIHNoYXBlOiB0aGlzLm1vZGVsLmNoYXJ0VHlwZSxcbiAgICAgICAgICBiZ2NvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgYmFyOiB7IGNvbG9yOiBjb2xvcnNbMF0gfSxcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IGxldmVsLFxuICAgICAgICB0ZXh0OiBxdWVzdGlvbi5uYW1lLFxuICAgICAgICBkb21haW46IHsgeDogWzAsIDFdLCB5OiBbMCwgMV0gfSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGNoYXJ0TWFyZ2luID0gdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiYnVsbGV0XCIgPyA2MCA6IDMwO1xuICAgIHZhciBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGhlaWdodDogMjUwLFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIGw6IGNoYXJ0TWFyZ2luLFxuICAgICAgICByOiBjaGFydE1hcmdpbixcbiAgICAgICAgYjogY2hhcnRNYXJnaW4sXG4gICAgICAgIHQ6IGNoYXJ0TWFyZ2luLFxuICAgICAgICBwYWQ6IDVcbiAgICAgIH0sXG4gICAgICBwbG90X2JnY29sb3I6IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGRpc3BsYXlNb2RlQmFyOiB0cnVlLFxuICAgICAgbG9jYWxlOiBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZSxcbiAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICBkaXNwbGF5bG9nbzogZmFsc2UsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsIGFzIGFueSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAoPGFueT5QbG90bHkpLmRvd25sb2FkSW1hZ2UoZ2QsIG9wdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuXG4gICAgfTtcbiAgICBpZiAoR2F1Z2VQbG90bHkuZGlzcGxheU1vZGVCYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLmRpc3BsYXlNb2RlQmFyID0gR2F1Z2VQbG90bHkuZGlzcGxheU1vZGVCYXI7XG4gICAgfVxuXG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgbGF5b3V0OiBsYXlvdXQsXG4gICAgICBjb25maWc6IGNvbmZpZyxcbiAgICB9O1xuICAgIFBsb3RseVNldHVwLm9uUGxvdENyZWF0aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gKDxhbnk+UGxvdGx5KS5uZXdQbG90KFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgb3B0aW9ucy5kYXRhLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdhdWdlUGxvdGx5IGV4dGVuZHMgTnVtYmVyTW9kZWwge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUdhdWdlQWRhcHRlcjtcblxuICBwdWJsaWMgc3RhdGljIGRpc3BsYXlNb2RlQmFyOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJnYXVnZVwiLCBcImJ1bGxldFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEdhdWdlUGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlHYXVnZUFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm51bWJlclwiLCBHYXVnZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYXRpbmdcIiwgR2F1Z2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZXhwcmVzc2lvblwiLCBHYXVnZVBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgSXRlbVZhbHVlLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgYWxsb3dEb21SZW5kZXJpbmcsIERhdGFIZWxwZXIsIERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IFBsb3RseSBmcm9tIFwicGxvdGx5LmpzLWRpc3QtbWluXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBjbGFzcyBQbG90bHlDaGFydEFkYXB0ZXIge1xuICBwcml2YXRlIF9jaGFydDogUHJvbWlzZTxQbG90bHkuUGxvdGx5SFRNTEVsZW1lbnQ+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBtb2RlbDogU2VsZWN0QmFzZSkgeyB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGNoYXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFydDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoY2hhcnROb2RlOiBIVE1MRWxlbWVudCkge1xuICAgIHZhciBwbG90bHlPcHRpb25zID0gUGxvdGx5U2V0dXAuc2V0dXAodGhpcy5tb2RlbC5jaGFydFR5cGUsIHRoaXMubW9kZWwpO1xuXG4gICAgbGV0IGNvbmZpZzogYW55ID0ge1xuICAgICAgZGlzcGxheWxvZ286IGZhbHNlLFxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgIGxvY2FsZTogbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICg8YW55PlBsb3RseSkuZG93bmxvYWRJbWFnZShnZCwgb3B0aW9ucyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBpZiAoU2VsZWN0QmFzZVBsb3RseS5kaXNwbGF5TW9kZUJhciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuZGlzcGxheU1vZGVCYXIgPSBTZWxlY3RCYXNlUGxvdGx5LmRpc3BsYXlNb2RlQmFyO1xuICAgIH1cblxuICAgIHRoaXMucGF0Y2hDb25maWdQYXJhbWV0ZXJzKFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBwbG90bHlPcHRpb25zLmxheW91dCxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG5cbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgIHRyYWNlczogcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBsYXlvdXQ6IHBsb3RseU9wdGlvbnMubGF5b3V0LFxuICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgfTtcbiAgICBQbG90bHlTZXR1cC5vblBsb3RDcmVhdGluZy5maXJlKHRoaXMubW9kZWwsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcGxvdCA9ICg8YW55PlBsb3RseSkubmV3UGxvdChcbiAgICAgIGNoYXJ0Tm9kZSxcbiAgICAgIG9wdGlvbnMudHJhY2VzLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG5cbiAgICAoPGFueT5jaGFydE5vZGUpW1wib25cIl0oXCJwbG90bHlfY2xpY2tcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEucG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGl0ZW1UZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKCFwbG90bHlPcHRpb25zLmhhc1Nlcmllcykge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gQXJyYXkuaXNBcnJheShkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhKVxuICAgICAgICAgICAgPyBkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhWzBdXG4gICAgICAgICAgICA6IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGE7XG4gICAgICAgICAgY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lO1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5TGFiZWwgPSBkYXRhLnBvaW50c1swXS5sYWJlbDtcbiAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZXMgPSB0aGlzLm1vZGVsLmdldFNlcmllc1ZhbHVlcygpO1xuICAgICAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMubW9kZWwuZ2V0U2VyaWVzTGFiZWxzKCk7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHNlcmllc1ZhbHVlc1tzZXJpZXNMYWJlbHMuaW5kZXhPZihwcm9wZXJ0eUxhYmVsKV07XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWUgPSB0aGlzLm1vZGVsLmdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dCk7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBJdGVtVmFsdWUoeyBbcHJvcGVydHlWYWx1ZV06IHNlbGVjdGVkSXRlbS52YWx1ZSB9LCBwcm9wZXJ0eUxhYmVsICsgXCI6IFwiICsgc2VsZWN0ZWRJdGVtLnRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc3QgaXRlbVRleHQgPSBwbG90bHlPcHRpb25zLmhhc1Nlcmllc1xuICAgICAgICAvLyAgID8gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lXG4gICAgICAgIC8vICAgOiBBcnJheS5pc0FycmF5KGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGEpXG4gICAgICAgIC8vICAgICA/IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGFbMF1cbiAgICAgICAgLy8gICAgIDogZGF0YS5wb2ludHNbMF0uY3VzdG9tZGF0YTtcbiAgICAgICAgLy8gY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAvLyB0aGlzLm1vZGVsLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBnZXREcmFnTGF5ZXIgPSAoKSA9PlxuICAgICAgPEhUTUxFbGVtZW50PmNoYXJ0Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibnNld2RyYWdcIilbMF07XG4gICAgKDxhbnk+Y2hhcnROb2RlKVtcIm9uXCJdKFwicGxvdGx5X2hvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCIpO1xuICAgIH0pO1xuICAgICg8YW55PmNoYXJ0Tm9kZSlbXCJvblwiXShcInBsb3RseV91bmhvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJcIik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jaGFydCA9IHBsb3Q7XG4gICAgcmV0dXJuIHBsb3Q7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJhc2VQbG90bHkgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiLCBcInNjYXR0ZXJcIl07XG4gIHB1YmxpYyBzdGF0aWMgZGlzcGxheU1vZGVCYXI6IGFueSA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBbXS5jb25jYXQoU2VsZWN0QmFzZVBsb3RseS50eXBlcyk7XG4gICAgaWYgKHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID4gMCAmJiB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcInN0YWNrZWRiYXJcIikgPT09IC0xKSB7XG4gICAgICB0aGlzLmNoYXJ0VHlwZXMucHVzaChcInN0YWNrZWRiYXJcIik7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuYWxsb3dFeHBlcmltZW50YWxGZWF0dXJlcykge1xuICAgICAgdGhpcy5jaGFydFR5cGVzLnNwbGljZSgxLCAwLCBcInZiYXJcIik7XG4gICAgfVxuICAgIHRoaXMuX2NoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICBpZiAodGhpcy5jaGFydFR5cGVzLmluZGV4T2Yob3B0aW9ucy5kZWZhdWx0Q2hhcnRUeXBlKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2NoYXJ0VHlwZSA9IG9wdGlvbnMuZGVmYXVsdENoYXJ0VHlwZTtcbiAgICB9XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHN1cGVyLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgaWYgKHNlcmllcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsLCB2YWx1ZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAgIChzZXJpZXNWYWx1ZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdW3ZhbHVlSW5kZXhdXG4gICAgICAgICk7XG4gICAgICAgIHByZXBhcmVkRGF0YS5wdXNoKHNlcmllc0RhdGEpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGlzdGljcztcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJjaGVja2JveFwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInJhZGlvZ3JvdXBcIiwgU2VsZWN0QmFzZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkcm9wZG93blwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImltYWdlcGlja2VyXCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwidGFnYm94XCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuIiwiaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi4vdmlzdWFsaXplckJhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQbG90bHlPcHRpb25zIHtcbiAgdHJhY2VzOiBBcnJheTxhbnk+O1xuICBsYXlvdXQ6IGFueTtcbiAgaGFzU2VyaWVzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUGxvdGx5U2V0dXAge1xuICBwdWJsaWMgc3RhdGljIGltYWdlRXhwb3J0Rm9ybWF0ID0gXCJwbmdcIjtcbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gZW5kIHVzZXIgY2xpY2tzIG9uIHRoZSAnc2F2ZSBhcyBpbWFnZScgYnV0dG9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvbkltYWdlU2F2aW5nID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFNlbGVjdEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFNlbGVjdEJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICAvKipcbiAgICogRmlyZXMgYmVmb3JlIHBsb3Qgd2lsbCBiZSBjcmVhdGVkLiBVc2VyIGNhbiBjaGFuZ2UgdHJhY2VzLCBsYXlvdXQgYW5kIGNvbmZpZyBvZiB0aGUgcGxvdC5cbiAgICogT3B0aW9ucyBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczogdHJhY2VzLCBsYXlvdXQgYW5kIGNvbmZpZyBvZiB0aGUgcGxvdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb25QbG90Q3JlYXRpbmcgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXplckJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFZpc3VhbGl6ZXJCYXNlLFxuICAgIGFueVxuICA+KCk7XG5cbiAgc3RhdGljIHNldHVwczogeyBbdHlwZTogc3RyaW5nXTogKG1vZGVsOiBTZWxlY3RCYXNlKSA9PiBQbG90bHlPcHRpb25zIH0gPSB7XG4gICAgYmFyOiBQbG90bHlTZXR1cC5zZXR1cEJhcixcbiAgICB2YmFyOiBQbG90bHlTZXR1cC5zZXR1cFZCYXIsXG4gICAgc3RhY2tlZGJhcjogUGxvdGx5U2V0dXAuc2V0dXBCYXIsXG4gICAgZG91Z2hudXQ6IFBsb3RseVNldHVwLnNldHVwUGllLFxuICAgIHBpZTogUGxvdGx5U2V0dXAuc2V0dXBQaWUsXG4gICAgc2NhdHRlcjogUGxvdGx5U2V0dXAuc2V0dXBTY2F0dGVyLFxuICB9O1xuXG4gIHN0YXRpYyBzZXR1cChjaGFyVHlwZTogc3RyaW5nLCBtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnNldHVwc1tjaGFyVHlwZV0obW9kZWwpO1xuICB9XG5cbiAgc3RhdGljIGdldFRydW5jYXRlZExhYmVsID0gKGxhYmVsOiBzdHJpbmcsIGxhYmVsVHJ1bmNhdGVMZW5ndGg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHRydW5jYXRlU3ltYm9scyA9IFwiLi4uXCI7XG4gICAgY29uc3QgdHJ1bmNhdGVTeW1ib2xzTGVuZ3RoID0gdHJ1bmNhdGVTeW1ib2xzLmxlbmd0aDtcblxuICAgIGlmICghbGFiZWxUcnVuY2F0ZUxlbmd0aCkgcmV0dXJuIGxhYmVsO1xuICAgIGlmIChsYWJlbFRydW5jYXRlTGVuZ3RoID09PSAtMSkgcmV0dXJuIGxhYmVsO1xuICAgIGlmIChsYWJlbC5sZW5ndGggPD0gbGFiZWxUcnVuY2F0ZUxlbmd0aCArIHRydW5jYXRlU3ltYm9sc0xlbmd0aClcbiAgICAgIHJldHVybiBsYWJlbDtcblxuICAgIHJldHVybiBsYWJlbC5zdWJzdHJpbmcoMCwgbGFiZWxUcnVuY2F0ZUxlbmd0aCkgKyB0cnVuY2F0ZVN5bWJvbHM7XG4gIH07XG5cbiAgc3RhdGljIHNldHVwUGllKG1vZGVsOiBTZWxlY3RCYXNlKTogUGxvdGx5T3B0aW9ucyB7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBsZXQgdHJhY2VzOiBhbnkgPSBbXTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMSB8fCBtb2RlbC5xdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwibWF0cml4XCI7XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogbW9kZWwuY2hhcnRUeXBlLFxuICAgICAgeTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgdGV4dDogKGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscykubWFwKChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBQbG90bHlTZXR1cC5nZXRUcnVuY2F0ZWRMYWJlbChcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtb2RlbC5sYWJlbFRydW5jYXRlTGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGhvdmVyaW5mbzogXCJ4K3lcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG5cbiAgICB0cmFjZUNvbmZpZy5ob3ZlcmluZm8gPSBcImxhYmVsK3ZhbHVlK3BlcmNlbnRcIjtcbiAgICB0cmFjZUNvbmZpZy5tYXJrZXIuY29sb3JzID0gY29sb3JzO1xuICAgIHRyYWNlQ29uZmlnLnRleHRwb3NpdGlvbiA9IFwiaW5zaWRlXCI7XG5cbiAgICBpZiAobW9kZWwuY2hhcnRUeXBlID09PSBcImRvdWdobnV0XCIpIHtcbiAgICAgIHRyYWNlQ29uZmlnLnR5cGUgPSBcInBpZVwiO1xuICAgICAgdHJhY2VDb25maWcuaG9sZSA9IDAuNDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1Nlcmllcykge1xuICAgICAgdHJhY2VDb25maWcubWFya2VyLnN5bWJvbCA9IFwiY2lyY2xlXCI7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc2l6ZSA9IDE2O1xuICAgIH1cblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHRyYWNlcy5wdXNoKFxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCB0cmFjZUNvbmZpZywge1xuICAgICAgICAgIHZhbHVlczogZGF0YXNldCxcbiAgICAgICAgICBsYWJlbHM6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IHJhZGl1cyA9IGxhYmVscy5sZW5ndGggPCAxMCA/IGxhYmVscy5sZW5ndGggKiA1MCArIDEwMCA6IDU1MDtcbiAgICBjb25zdCBoZWlnaHQgPSByYWRpdXMgKiBNYXRoLnJvdW5kKHRyYWNlcy5sZW5ndGggLyAyKSArIDI1O1xuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIGw6IDAsXG4gICAgICAgIHQ6IDI1LFxuICAgICAgICBiOiAwLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHBsb3RfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgc2hvd2xlZ2VuZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGlmIChoYXNTZXJpZXMpIHtcbiAgICAgIGxheW91dC5hbm5vdGF0aW9ucyA9IFtdO1xuICAgICAgbGFiZWxzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLnRpdGxlID0geyBwb3NpdGlvbjogXCJib3R0b20gY2VudGVyXCIsIHRleHQ6IGxhYmVsIH07XG4gICAgICB9KTtcbiAgICAgIHRyYWNlcyA9IHRyYWNlcy5maWx0ZXIodCA9PiAhKHQudmFsdWVzLmxlbmd0aCA9PT0gMSAmJiB0LnZhbHVlc1swXSA9PT0gMCkpO1xuICAgICAgdHJhY2VzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLmRvbWFpbiA9IHtcbiAgICAgICAgICBjb2x1bW46IGluZGV4ICUgMixcbiAgICAgICAgICByb3c6IE1hdGguZmxvb3IoaW5kZXggLyAyKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgbGF5b3V0LmdyaWQgPSB7XG4gICAgICAgIHJvd3M6IE1hdGgucm91bmQodHJhY2VzLmxlbmd0aCAvIDIpLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgfTtcbiAgICAgIGxheW91dC5oZWlnaHQgPSByYWRpdXMgKiBNYXRoLnJvdW5kKHRyYWNlcy5sZW5ndGggLyAyKSArIDI1O1xuICAgIH1cbiAgICByZXR1cm4geyB0cmFjZXMsIGxheW91dCwgaGFzU2VyaWVzIH07XG4gIH1cblxuICBzdGF0aWMgc2V0dXBCYXIobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQgbGluZUhlaWdodCA9IDMwO1xuICAgIGxldCB0b3BNYXJnaW4gPSAzMDtcbiAgICBsZXQgYm90dG9tTWFyZ2luID0gMzA7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBjb25zdCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxIHx8IG1vZGVsLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJtYXRyaXhcIjtcbiAgICBjb25zdCB5RnVsbFRleHRzID0gaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzO1xuXG4gICAgY29uc3QgdHJhY2VDb25maWc6IGFueSA9IHtcbiAgICAgIHR5cGU6IG1vZGVsLmNoYXJ0VHlwZSxcbiAgICAgIHk6IHlGdWxsVGV4dHMsXG4gICAgICB0ZXh0OiB5RnVsbFRleHRzLFxuICAgICAgY3VzdG9tZGF0YTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgaG92ZXJpbmZvOiBcInRleHRcIixcbiAgICAgIG9yaWVudGF0aW9uOiBcImhcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgdGV4dHBvc2l0aW9uOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiAwLjUsXG4gICAgICBiYXJnYXA6IDAuNSxcbiAgICAgIG1hcmtlcjogPGFueT57fSxcbiAgICB9O1xuICAgIHRyYWNlQ29uZmlnLm1hcmtlci5jb2xvciA9IGNvbG9ycztcblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHZhciB0cmFjZSA9IE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgIHg6IGRhdGFzZXQsXG4gICAgICAgIHRleHQ6IHRleHRzW2luZGV4XSxcbiAgICAgICAgaG92ZXJ0ZXh0OiB5RnVsbFRleHRzLm1hcCgobGFiZWw6IHN0cmluZywgbGFiZWxJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAke3RleHRzW2luZGV4XVtsYWJlbEluZGV4XX0sICR7bGFiZWx9YDtcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAgIGlmIChtb2RlbC5zaG93UGVyY2VudGFnZXMpIHtcbiAgICAgICAgbGV0IHRleHR0ZW1wbGF0ZSA9IG1vZGVsLnNob3dPbmx5UGVyY2VudGFnZXMgPyBcIiV7dGV4dH0lXCIgOiBcIiV7dmFsdWV9ICgle3RleHR9JSlcIjtcbiAgICAgICAgdHJhY2UudGV4dHBvc2l0aW9uID0gXCJpbnNpZGVcIjtcbiAgICAgICAgdHJhY2UudGV4dHRlbXBsYXRlID0gdGV4dHRlbXBsYXRlO1xuICAgICAgICB0cmFjZS5iYXJnYXAgPSAwLjE7XG4gICAgICB9XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBoZWlnaHQgPSAobGFiZWxzLmxlbmd0aCArIDEpICogbGluZUhlaWdodCArIHRvcE1hcmdpbiArIGJvdHRvbU1hcmdpbjtcblxuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIHQ6IHRvcE1hcmdpbixcbiAgICAgICAgYjogYm90dG9tTWFyZ2luLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHlheGlzOiB7XG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgICB0aWNrbW9kZTogXCJhcnJheVwiLFxuICAgICAgICB0aWNrdmFsczogeUZ1bGxUZXh0cyxcbiAgICAgICAgdGlja3RleHQ6IHlGdWxsVGV4dHMubWFwKChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFBsb3RseVNldHVwLmdldFRydW5jYXRlZExhYmVsKFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICBtb2RlbC5sYWJlbFRydW5jYXRlTGVuZ3RoXG4gICAgICAgICAgKSArIFwiICBcIjtcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgeGF4aXM6IHtcbiAgICAgICAgcmFuZ2Vtb2RlOiBcIm5vbm5lZ2F0aXZlXCIsXG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIC8vIGR0aWNrOiAxXG4gICAgICB9LFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKGhhc1Nlcmllcykge1xuICAgICAgbGF5b3V0LnNob3dsZWdlbmQgPSB0cnVlO1xuICAgICAgaWYgKG1vZGVsLmNoYXJ0VHlwZSA9PSBcInN0YWNrZWRiYXJcIikge1xuICAgICAgICBsYXlvdXQuYmFybW9kZSA9IFwic3RhY2tcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dC5oZWlnaHQgPVxuICAgICAgICAgIChsYWJlbHMubGVuZ3RoICsgMSkgKiBsaW5lSGVpZ2h0ICogc2VyaWVzTGFiZWxzLmxlbmd0aCArXG4gICAgICAgICAgdG9wTWFyZ2luICtcbiAgICAgICAgICBib3R0b21NYXJnaW47XG4gICAgICB9XG5cbiAgICAgIGxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5tYXJrZXIuY29sb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyYWNlc1tpbmRleF0ubmFtZSA9IGxhYmVsO1xuXG4gICAgICAgIGlmIChtb2RlbC5jaGFydFR5cGUgPT09IFwic3RhY2tlZGJhclwiKSB7XG4gICAgICAgICAgdHJhY2VzW2luZGV4XS50eXBlID0gXCJiYXJcIjtcbiAgICAgICAgICB0cmFjZXNbaW5kZXhdLndpZHRoID0gMC41O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyYWNlc1tpbmRleF0ud2lkdGggPVxuICAgICAgICAgICAgKG1vZGVsLnNob3dQZXJjZW50YWdlcyA/IDAuNyA6IDAuNSkgLyB0cmFjZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlLCB0cmFjZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRTdHJpbmcgPSBtb2RlbC5zaG93UGVyY2VudGFnZXMgPyBcIiVcIiA6IFwiXCI7XG4gICAgICAgIHRyYWNlc1t0cmFjZUluZGV4XS5ob3ZlcnRleHQgPSBbXTtcbiAgICAgICAgeUZ1bGxUZXh0cy5mb3JFYWNoKCh5RnVsbFRleHQsIHlGdWxsVGV4dEluZGV4KSA9PiB7XG4gICAgICAgICAgdHJhY2VzW3RyYWNlSW5kZXhdLmhvdmVydGV4dC5wdXNoKGAke3RyYWNlLnlbeUZ1bGxUZXh0SW5kZXhdfSA6ICR7dHJhY2UubmFtZX0sICR7dHJhY2UudGV4dFt5RnVsbFRleHRJbmRleF19JHtwZXJjZW50U3RyaW5nfWApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYWNlcywgbGF5b3V0LCBoYXNTZXJpZXMgfTtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cFZCYXIobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQgdG9wTWFyZ2luID0gMzA7XG4gICAgbGV0IGJvdHRvbU1hcmdpbiA9IDMwO1xuICAgIGxldCB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxhYmVscyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHRleHRzLFxuICAgICAgc2VyaWVzTGFiZWxzLFxuICAgIH0gPSBtb2RlbC5nZXRBbnN3ZXJzRGF0YSgpO1xuXG4gICAgY29uc3QgdHJhY2VzOiBhbnkgPSBbXTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMSB8fCBtb2RlbC5xdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwibWF0cml4XCI7XG5cbiAgICBjb25zdCBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGZvbnQ6IHtcbiAgICAgICAgZmFtaWx5OiBcIlNlZ29lIFVJLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgIHNpemU6IDE0LFxuICAgICAgICB3ZWlnaHQ6IFwibm9ybWFsXCIsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQwNDBcIixcbiAgICAgIH0sXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgdDogdG9wTWFyZ2luLFxuICAgICAgICBiOiBib3R0b21NYXJnaW4sXG4gICAgICAgIHI6IDEwLFxuICAgICAgfSxcbiAgICAgIGNvbG9yd2F5OiBjb2xvcnMsXG4gICAgICBob3Zlcm1vZGU6IFwiY2xvc2VzdFwiLFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHJhY2VDb25maWc6IGFueSA9IHtcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICBob3ZlcmluZm86IFwieCt5XCIsXG4gICAgICBtb2RlOiBcIm1hcmtlcnNcIixcbiAgICAgIHRleHRwb3NpdGlvbjogXCJub25lXCIsXG4gICAgICB3aWR0aDogMC41LFxuICAgICAgYmFyZ2FwOiAwLjUsXG4gICAgICBtYXJrZXI6IDxhbnk+e30sXG4gICAgfTtcbiAgICB0cmFjZUNvbmZpZy5tYXJrZXIuY29sb3IgPSBjb2xvcnM7XG5cbiAgICBkYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBBcnJheTxudW1iZXI+LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICB2YXIgdHJhY2UgPSBPYmplY3QuYXNzaWduKHt9LCB0cmFjZUNvbmZpZywge1xuICAgICAgICB4OiBsYWJlbHMsXG4gICAgICAgIHk6IG1vZGVsLnNob3dQZXJjZW50YWdlcyA/IHRleHRzW2luZGV4XS5tYXAoeSA9PiB5IC8gMTAwKSA6IGRhdGFzZXQsXG4gICAgICAgIHRleHQ6IHRleHRzW2luZGV4XSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG1vZGVsLnNob3dQZXJjZW50YWdlcykge1xuICAgICAgICBsZXQgdGV4dHRlbXBsYXRlID0gbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcyA/IFwiJXt0ZXh0fSVcIiA6IFwiJXt2YWx1ZX0gKCV7dGV4dH0lKVwiO1xuICAgICAgICB0cmFjZS50ZXh0cG9zaXRpb24gPSBcImluc2lkZVwiO1xuICAgICAgICB0cmFjZS50ZXh0dGVtcGxhdGUgPSB0ZXh0dGVtcGxhdGU7XG4gICAgICAgIHRyYWNlLndpZHRoID0gMC45O1xuICAgICAgICB0cmFjZS5iYXJnYXAgPSAwLjE7XG4gICAgICB9XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwuc2hvd1BlcmNlbnRhZ2VzICYmIG1vZGVsLnNob3dPbmx5UGVyY2VudGFnZXMpIHtcbiAgICAgIGxheW91dC55YXhpcyA9IHtcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgdGlja2Zvcm1hdDogXCIuMCVcIixcbiAgICAgICAgcmFuZ2U6IFswLCAxXSxcbiAgICAgICAgdGlja2xlbjogbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcyA/IDI1IDogNSxcbiAgICAgICAgdGlja2NvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZigobW9kZWwgYXMgYW55KS5nZXRWYWx1ZVR5cGUoKSAhPSBcImRhdGVcIikge1xuICAgICAgbGF5b3V0LnhheGlzID0ge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYWNlcywgbGF5b3V0LCBoYXNTZXJpZXMgfTtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cFNjYXR0ZXIobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQgbGluZUhlaWdodCA9IDMwO1xuICAgIGxldCB0b3BNYXJnaW4gPSAzMDtcbiAgICBsZXQgYm90dG9tTWFyZ2luID0gMzA7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG4gICAgY29uc3QgaGFzU2VyaWVzID0gc2VyaWVzTGFiZWxzLmxlbmd0aCA+IDEgfHwgbW9kZWwucXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcIm1hdHJpeFwiO1xuICAgIGNvbnN0IHRyYWNlczogYW55ID0gW107XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICB5OiAoaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzKS5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIFBsb3RseVNldHVwLmdldFRydW5jYXRlZExhYmVsKFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIG1vZGVsLmxhYmVsVHJ1bmNhdGVMZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgY3VzdG9tZGF0YTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgdGV4dDogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgaG92ZXJpbmZvOiBcIngreVwiLFxuICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICB3aWR0aDogMC41LFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG5cbiAgICBpZiAoIWhhc1Nlcmllcykge1xuICAgICAgdHJhY2VDb25maWcubWFya2VyLnN5bWJvbCA9IFwiY2lyY2xlXCI7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc2l6ZSA9IDE2O1xuICAgIH1cblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4pID0+IHtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRyYWNlID0gT2JqZWN0LmFzc2lnbih7fSwgdHJhY2VDb25maWcsIHtcbiAgICAgICAgICB4OiBkYXRhc2V0LFxuICAgICAgICB9KTtcbiAgICAgICAgdHJhY2VzLnB1c2godHJhY2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgaGVpZ2h0ID0gKGxhYmVscy5sZW5ndGggKyAxKSAqIGxpbmVIZWlnaHQgKyB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW47XG5cbiAgICBjb25zdCBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGZvbnQ6IHtcbiAgICAgICAgZmFtaWx5OiBcIlNlZ29lIFVJLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgIHNpemU6IDE0LFxuICAgICAgICB3ZWlnaHQ6IFwibm9ybWFsXCIsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQwNDBcIixcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIG1hcmdpbjoge1xuICAgICAgICB0OiB0b3BNYXJnaW4sXG4gICAgICAgIGI6IGJvdHRvbU1hcmdpbixcbiAgICAgICAgcjogMTAsXG4gICAgICB9LFxuICAgICAgY29sb3J3YXk6IGNvbG9ycyxcbiAgICAgIGhvdmVybW9kZTogXCJjbG9zZXN0XCIsXG4gICAgICB5YXhpczoge1xuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIHRpY2tsZW46IDUsXG4gICAgICAgIHRpY2tjb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgfSxcbiAgICAgIHhheGlzOiB7XG4gICAgICAgIHJhbmdlbW9kZTogXCJub25uZWdhdGl2ZVwiLFxuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHBsb3RfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgc2hvd2xlZ2VuZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGlmIChoYXNTZXJpZXMpIHtcbiAgICAgIGxheW91dC5zaG93bGVnZW5kID0gdHJ1ZTtcbiAgICAgIGxheW91dC5oZWlnaHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5ob3ZlcmluZm8gPSBcIngrbmFtZVwiO1xuICAgICAgICB0cmFjZXNbaW5kZXhdLm1hcmtlci5jb2xvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5uYW1lID0gbGFiZWw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG59IiwiaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uU2VsZWN0QmFzZSwgSXRlbVZhbHVlLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRGF0YUhlbHBlciwgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB7XG4gIHNlbGVjdGlvbjogSXRlbVZhbHVlO1xuICBvbkRhdGFJdGVtU2VsZWN0ZWQ6IChzZWxlY3RlZFZhbHVlOiBhbnksIHNlbGVjdGVkVGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXRTZWxlY3Rpb24oaXRlbTogSXRlbVZhbHVlKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQW5zd2Vyc0RhdGEge1xuICBkYXRhc2V0czogQXJyYXk8QXJyYXk8YW55Pj47XG4gIGxhYmVsczogQXJyYXk8c3RyaW5nPjtcbiAgY29sb3JzOiBBcnJheTxzdHJpbmc+O1xuICB0ZXh0czogQXJyYXk8QXJyYXk8YW55Pj47XG4gIHNlcmllc0xhYmVsczogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSk6IElBbnN3ZXJzRGF0YSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBkYXRhc2V0czogPEFycmF5PGFueT4+W10sXG4gICAgbGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICBjb2xvcnM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgIHRleHRzOiA8QXJyYXk8YW55Pj5bXSxcbiAgICBzZXJpZXNMYWJlbHM6IDxBcnJheTxhbnk+PltdLFxuICB9O1xuICBpZihhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmRhdGFzZXRzLnB1c2goW10pO1xuICAgIHJlc3VsdC50ZXh0cy5wdXNoKFtdKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF1baV0gIT0gMCkge1xuICAgICAgICByZXN1bHQuZGF0YXNldHNbMF0ucHVzaChhbnN3ZXJzRGF0YS5kYXRhc2V0c1swXVtpXSk7XG4gICAgICAgIHJlc3VsdC5sYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5sYWJlbHNbaV0pO1xuICAgICAgICByZXN1bHQuY29sb3JzLnB1c2goYW5zd2Vyc0RhdGEuY29sb3JzW2ldKTtcbiAgICAgICAgcmVzdWx0LnRleHRzWzBdLnB1c2goYW5zd2Vyc0RhdGEudGV4dHNbMF1baV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IHNlcmllc0RhdGFFeGlzdGVuY2UgPSA8QXJyYXk8Ym9vbGVhbj4+W107XG4gIHNlcmllc0RhdGFFeGlzdGVuY2UubGVuZ3RoID0gYW5zd2Vyc0RhdGEuc2VyaWVzTGFiZWxzLmxlbmd0aDtcbiAgY29uc3QgdmFsdWVzRGF0YUV4aXN0ZW5jZSA9IDxBcnJheTxib29sZWFuPj5bXTtcbiAgdmFsdWVzRGF0YUV4aXN0ZW5jZS5sZW5ndGggPSBhbnN3ZXJzRGF0YS5sYWJlbHMubGVuZ3RoO1xuICBmb3IgKHZhciB2YWx1ZUluZGV4ID0gMDsgdmFsdWVJbmRleCA8IGFuc3dlcnNEYXRhLmxhYmVscy5sZW5ndGg7IHZhbHVlSW5kZXgrKykge1xuICAgIGZvciAodmFyIHNlcmllc0luZGV4ID0gMDsgc2VyaWVzSW5kZXggPCBhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMubGVuZ3RoOyBzZXJpZXNJbmRleCsrKSB7XG4gICAgICBpZiAoYW5zd2Vyc0RhdGEuZGF0YXNldHNbdmFsdWVJbmRleF1bc2VyaWVzSW5kZXhdICE9IDApIHtcbiAgICAgICAgc2VyaWVzRGF0YUV4aXN0ZW5jZVtzZXJpZXNJbmRleF0gPSB0cnVlO1xuICAgICAgICB2YWx1ZXNEYXRhRXhpc3RlbmNlW3ZhbHVlSW5kZXhdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgdmFsdWVJbmRleCA9IDA7IHZhbHVlSW5kZXggPCB2YWx1ZXNEYXRhRXhpc3RlbmNlLmxlbmd0aDsgdmFsdWVJbmRleCsrKSB7XG4gICAgaWYgKHZhbHVlc0RhdGFFeGlzdGVuY2VbdmFsdWVJbmRleF0pIHtcbiAgICAgIHJlc3VsdC5sYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5sYWJlbHNbdmFsdWVJbmRleF0pO1xuICAgICAgcmVzdWx0LmNvbG9ycy5wdXNoKGFuc3dlcnNEYXRhLmNvbG9yc1t2YWx1ZUluZGV4XSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIHNlcmllc0luZGV4ID0gMDsgc2VyaWVzSW5kZXggPCBhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMubGVuZ3RoOyBzZXJpZXNJbmRleCsrKSB7XG4gICAgaWYgKHNlcmllc0RhdGFFeGlzdGVuY2Vbc2VyaWVzSW5kZXhdKSB7XG4gICAgICByZXN1bHQuc2VyaWVzTGFiZWxzLnB1c2goYW5zd2Vyc0RhdGEuc2VyaWVzTGFiZWxzW3Nlcmllc0luZGV4XSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIHZhbHVlSW5kZXggPSAwOyB2YWx1ZUluZGV4IDwgYW5zd2Vyc0RhdGEubGFiZWxzLmxlbmd0aDsgdmFsdWVJbmRleCsrKSB7XG4gICAgaWYgKHZhbHVlc0RhdGFFeGlzdGVuY2VbdmFsdWVJbmRleF0pIHtcbiAgICAgIGNvbnN0IGRhdGFzZXQgPSBbXTtcbiAgICAgIGNvbnN0IHRleHRzID0gW107XG4gICAgICBmb3IgKHZhciBzZXJpZXNJbmRleCA9IDA7IHNlcmllc0luZGV4IDwgYW5zd2Vyc0RhdGEuZGF0YXNldHMubGVuZ3RoOyBzZXJpZXNJbmRleCsrKSB7XG4gICAgICAgIGlmIChzZXJpZXNEYXRhRXhpc3RlbmNlW3Nlcmllc0luZGV4XSkge1xuICAgICAgICAgIGRhdGFzZXQucHVzaChhbnN3ZXJzRGF0YS5kYXRhc2V0c1t2YWx1ZUluZGV4XVtzZXJpZXNJbmRleF0pO1xuICAgICAgICAgIHRleHRzLnB1c2goYW5zd2Vyc0RhdGEudGV4dHNbdmFsdWVJbmRleF1bc2VyaWVzSW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LmRhdGFzZXRzLnB1c2goZGF0YXNldCk7XG4gICAgICByZXN1bHQudGV4dHMucHVzaCh0ZXh0cyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RCYXNlXG4gIGV4dGVuZHMgVmlzdWFsaXplckJhc2VcbiAgaW1wbGVtZW50cyBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24ge1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWUgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2hvaWNlc09yZGVyU2VsZWN0b3I6IEhUTUxEaXZFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHNob3dQZXJjZW50YWdlQnRuOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBlbXB0eUFuc3dlcnNCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHRyYW5zcG9zZURhdGFCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHRvcE5TZWxlY3RvcjogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Nob3dQZXJjZW50YWdlczogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zaG93T25seVBlcmNlbnRhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3BlcmNlbnRhZ2VQcmVjaXNpb246IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBfYW5zd2Vyc09yZGVyOiBzdHJpbmcgPSBcImRlZmF1bHRcIjtcbiAgcHJvdGVjdGVkIF9zdXBwb3J0U2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfaGlkZUVtcHR5QW5zd2VycyA9IGZhbHNlO1xuICBwcml2YXRlIF90b3BOID0gLTE7XG4gIHB1YmxpYyBzdGF0aWMgdG9wTlZhbHVlc0RlZmF1bHRzID0gWy0xLCA1LCAxMCwgMjBdO1xuICBwdWJsaWMgdG9wTlZhbHVlcyA9IFtdLmNvbmNhdChTZWxlY3RCYXNlLnRvcE5WYWx1ZXNEZWZhdWx0cyk7XG4gIHByaXZhdGUgX3RyYW5zcG9zZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvd01pc3NpbmdBbnN3ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbWlzc2luZ0Fuc3dlcnNCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBhbnksXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInNlbGVjdEJhc2VcIik7XG4gICAgKDxhbnk+cXVlc3Rpb24pLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhUHJvdmlkZXIucmVzZXQoKTtcbiAgICB9O1xuICAgIHRoaXMuX3Nob3dQZXJjZW50YWdlcyA9IHRoaXMub3B0aW9ucy5zaG93UGVyY2VudGFnZXMgPT09IHRydWU7XG4gICAgdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcyA9IHRoaXMub3B0aW9ucy5zaG93T25seVBlcmNlbnRhZ2VzID09PSB0cnVlO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZXJjZW50YWdlUHJlY2lzaW9uKSB7XG4gICAgICB0aGlzLl9wZXJjZW50YWdlUHJlY2lzaW9uID0gdGhpcy5vcHRpb25zLnBlcmNlbnRhZ2VQcmVjaXNpb247XG4gICAgfVxuXG4gICAgdGhpcy5faGlkZUVtcHR5QW5zd2VycyA9IHRoaXMub3B0aW9ucy5oaWRlRW1wdHlBbnN3ZXJzID09PSB0cnVlO1xuICAgIHRoaXMuX2Fuc3dlcnNPcmRlciA9IHRoaXMub3B0aW9ucy5hbnN3ZXJzT3JkZXIgfHwgXCJkZWZhdWx0XCI7XG4gICAgdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzID0gdGhpcy5pc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpICYmIHRoaXMub3B0aW9ucy5zaG93TWlzc2luZ0Fuc3dlcnMgPT09IHRydWU7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlQ2hhcnRUeXBlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy5jaGFydFR5cGVzLm1hcCgoY2hhcnRUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogY2hhcnRUeXBlLFxuICAgICAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhcnRUeXBlX1wiICsgY2hhcnRUeXBlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLmNoYXJ0VHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcnRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VBbnN3ZXJzT3JkZXJcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0QW5zd2Vyc09yZGVyKCkpIHtcbiAgICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3RvciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImRlZmF1bHRPcmRlclwiKSwgdmFsdWU6IFwiZGVmYXVsdFwiIH0sXG4gICAgICAgICAgICB7IHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhc2NPcmRlclwiKSwgdmFsdWU6IFwiYXNjXCIgfSxcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImRlc2NPcmRlclwiKSwgdmFsdWU6IFwiZGVzY1wiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAob3B0aW9uKSA9PiBmYWxzZSxcbiAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbnN3ZXJzT3JkZXIgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3I7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwic2hvd1BlcmNlbnRhZ2VzXCIsICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vcHRpb25zLmFsbG93U2hvd1BlcmNlbnRhZ2VzICYmXG4gICAgICAgICh0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcImJhclwiKSAhPT0gLTEgfHxcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcInN0YWNrZWRiYXJcIikgIT09IC0xKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VzID0gIXRoaXMuc2hvd1BlcmNlbnRhZ2VzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93UGVyY2VudGFnZUJ0bjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJoaWRlRW1wdHlBbnN3ZXJzXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dIaWRlRW1wdHlBbnN3ZXJzKSB7XG4gICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmhpZGVFbXB0eUFuc3dlcnMgPSAhdGhpcy5faGlkZUVtcHR5QW5zd2VycztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbXB0eUFuc3dlcnNCdG47XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwidG9wTkFuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dUb3BOQW5zd2VycyAmJlxuICAgICAgICB0aGlzLmdldFNlcmllc1ZhbHVlcygpLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudG9wTlNlbGVjdG9yID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy50b3BOVmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ0b3BOVmFsdWVUZXh0XCIgKyB2YWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbikgPT4gZmFsc2UsXG4gICAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9wTiA9IHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlVG9wTlNlbGVjdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50b3BOU2VsZWN0b3I7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwidHJhbnNwb3NlRGF0YVwiLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93VHJhbnNwb3NlRGF0YSkge1xuICAgICAgICB0aGlzLnRyYW5zcG9zZURhdGFCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YSA9ICF0aGlzLnRyYW5zcG9zZURhdGE7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9zZURhdGFCdG47XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwic2hvd01pc3NpbmdBbnN3ZXJzXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCkgJiYgdGhpcy5vcHRpb25zLmFsbG93U2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICAgIHRoaXMubWlzc2luZ0Fuc3dlcnNCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzID0gIXRoaXMuX3Nob3dNaXNzaW5nQW5zd2VycztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlTWlzc2luZ0Fuc3dlcnNCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IHN0cmluZ1tdID0gW107XG4gIHByb3RlY3RlZCBfY2hhcnRUeXBlOiBzdHJpbmcgPSBcImJhclwiO1xuICAvKipcbiAgICogQ2hhcnQgdHlwZSAtIGN1cnJlbnQgY2hhcnQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hhcnRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0VHlwZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNoYXJ0VHlwZShuZXdDaGFydFR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0Q2hhcnRUeXBlKG5ld0NoYXJ0VHlwZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpIHtcbiAgICBpZiAoISF0aGlzLmVtcHR5QW5zd2Vyc0J0bikge1xuICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4uaW5uZXJUZXh0ID0gdGhpcy5faGlkZUVtcHR5QW5zd2Vyc1xuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93RW1wdHlBbnN3ZXJzXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVFbXB0eUFuc3dlcnNcIik7XG4gICAgICBpZiAodGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInNjYXR0ZXJcIikge1xuICAgICAgICB0aGlzLmVtcHR5QW5zd2Vyc0J0bi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKSB7XG4gICAgaWYgKCEhdGhpcy50cmFuc3Bvc2VEYXRhQnRuKSB7XG4gICAgICB0aGlzLnRyYW5zcG9zZURhdGFCdG4uaW5uZXJUZXh0ID0gdGhpcy50cmFuc3Bvc2VEYXRhXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dQZXJDb2x1bW5zXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dQZXJWYWx1ZXNcIik7XG4gICAgICBpZiAodGhpcy5nZXRTZXJpZXNWYWx1ZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVPcmRlclNlbGVjdG9yKCkge1xuICAgIGlmICghIXRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3IpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fFxuICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fFxuICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9PSBcInNjYXR0ZXJcIiB8fFxuICAgICAgICAoKHRoaXMuY2hhcnRUeXBlID09IFwicGllXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJkb3VnaG51dFwiKSAmJlxuICAgICAgICAgIHRoaXMudG9wTiA+IDApXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3Rvci5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtZmxleFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3Rvci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICBcInNlbGVjdFwiXG4gICAgICApWzBdLnZhbHVlID0gdGhpcy5hbnN3ZXJzT3JkZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpIHtcbiAgICBpZiAoISF0aGlzLnNob3dQZXJjZW50YWdlQnRuKSB7XG4gICAgICB0aGlzLnNob3dQZXJjZW50YWdlQnRuLmlubmVyVGV4dCA9IHRoaXMuX3Nob3dQZXJjZW50YWdlc1xuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlUGVyY2VudGFnZXNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd1BlcmNlbnRhZ2VzXCIpO1xuICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlID09IFwiYmFyXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJ2YmFyXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJzdGFja2VkYmFyXCIpIHtcbiAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9wTlNlbGVjdG9yKCkge1xuICAgIGlmICghIXRoaXMudG9wTlNlbGVjdG9yKSB7XG4gICAgICB0aGlzLnRvcE5TZWxlY3Rvci5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNlbGVjdFwiKVswXS52YWx1ZSA9IDxhbnk+KFxuICAgICAgICB0aGlzLl90b3BOXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWlzc2luZ0Fuc3dlcnNCdG4oKSB7XG4gICAgaWYgKCEhdGhpcy5taXNzaW5nQW5zd2Vyc0J0bikge1xuICAgICAgdGhpcy5taXNzaW5nQW5zd2Vyc0J0bi5pbm5lclRleHQgPSB0aGlzLl9zaG93TWlzc2luZ0Fuc3dlcnNcbiAgICAgICAgPyBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaGlkZU1pc3NpbmdBbnN3ZXJzXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dNaXNzaW5nQW5zd2Vyc1wiKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFydFR5cGVDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgIHRoaXMudXBkYXRlU2hvd1BlcmNlbnRhZ2VCdG4oKTtcbiAgICB0aGlzLnVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpO1xuICAgIHRoaXMudXBkYXRlVG9wTlNlbGVjdG9yKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJjaGFydFR5cGVcIiwgdGhpcy5fY2hhcnRUeXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRDaGFydFR5cGUoY2hhcnRUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihjaGFydFR5cGUpICE9PSAtMSAmJlxuICAgICAgdGhpcy5fY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuX2NoYXJ0VHlwZSA9IGNoYXJ0VHlwZTtcbiAgICAgIHRoaXMub25DaGFydFR5cGVDaGFuZ2VkKCk7XG4gICAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29ycmVjdEFuc3dlclZhbHVlID0gc3VwZXIuZ2V0Q29ycmVjdEFuc3dlclRleHQoKTtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNvcnJlY3RBbnN3ZXJWYWx1ZSkgPyBjb3JyZWN0QW5zd2VyVmFsdWUgOiBbY29ycmVjdEFuc3dlclZhbHVlXTtcbiAgICBjb25zdCBzZWxlY3RCYXNlUXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uIGFzIFF1ZXN0aW9uU2VsZWN0QmFzZTtcbiAgICByZXR1cm4gcmVzdWx0VmFsdWVzLm1hcCgodmFsdWU6IGFueSkgPT4gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHNlbGVjdEJhc2VRdWVzdGlvbi5jaG9pY2VzLCB2YWx1ZSkpLmpvaW4oXCIsIFwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbEJhc2UgPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzT3RoZXIgJiYgaXRlbVRleHQgPT0gc2VsQmFzZS5vdGhlclRleHQpIHtcbiAgICAgIHJldHVybiBzZWxCYXNlLm90aGVySXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbEJhc2UuY2hvaWNlcy5maWx0ZXIoXG4gICAgICAgIChjaG9pY2U6IEl0ZW1WYWx1ZSkgPT4gY2hvaWNlLnRleHQgPT09IGl0ZW1UZXh0XG4gICAgICApWzBdO1xuICAgIH1cbiAgfVxuXG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0gIT09IGl0ZW0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLm9uRGF0YUl0ZW1TZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMub25EYXRhSXRlbVNlbGVjdGVkKFxuICAgICAgICAgIGl0ZW0gIT09IHVuZGVmaW5lZCA/IGl0ZW0udmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXRlbSAhPT0gdW5kZWZpbmVkID8gaXRlbS50ZXh0IDogXCJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgY2hhcnQgc2hvdWxkIHNob3cgcGVyY2VudGFnZXMgb25seS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd09ubHlQZXJjZW50YWdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd09ubHlQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93T25seVBlcmNlbnRhZ2VzID0gdmFsO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcInNob3dPbmx5UGVyY2VudGFnZXNcIiwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgY2hhcnQgc2hvdWxkIHNob3cgdmFsdWVzIGFuZCBwZXJjZW50YWdlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BlcmNlbnRhZ2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGVyY2VudGFnZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93UGVyY2VudGFnZXMgPSB2YWw7XG4gICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcInNob3dQZXJjZW50YWdlc1wiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW5kIHNldHMgY2hhcnQgZWxlbWVudHMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFuc3dlcnNPcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5zd2Vyc09yZGVyO1xuICB9XG5cbiAgcHVibGljIHNldCBhbnN3ZXJzT3JkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Fuc3dlcnNPcmRlciA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImFuc3dlcnNPcmRlclwiLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgbmVlZCB0byBoaWRlIGVtcHR5IGNoYXJ0IGVsZW1lbnRzIChlLmcuIGJhcnMgdml0aCB6ZXJvIHZhbHVlKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZUVtcHR5QW5zd2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZUVtcHR5QW5zd2VycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaGlkZUVtcHR5QW5zd2Vycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hpZGVFbXB0eUFuc3dlcnMgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImhpZGVFbXB0eUFuc3dlcnNcIiwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldCB0cmFuc3Bvc2VEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3Bvc2VEYXRhO1xuICB9XG5cbiAgcHVibGljIHNldCB0cmFuc3Bvc2VEYXRhKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdHJhbnNwb3NlRGF0YSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVHJhbnNwb3NlRGF0YUJ0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcInRyYW5zcG9zZURhdGFcIiwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0byBzb21lIHZhbHVlIGlmIG5lZWQgdG8gc2hvdyB0b3AgTiBjaGFydCBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdG9wTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3BOO1xuICB9XG5cbiAgcHVibGljIHNldCB0b3BOKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90b3BOID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgICB0aGlzLnVwZGF0ZU9yZGVyU2VsZWN0b3IoKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJ0b3BOXCIsIHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1N1cHBvcnRBbnN3ZXJzT3JkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLm9wdGlvbnMuYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyKSAmJlxuICAgICAgICAgICAgdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKS5sZW5ndGggPT09IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc2VlIGNoYXJ0IGVsZW1lbnRzIGZvciBtaXNzaW5nIGFuc3dlcnMgKGUuZy4gcmFkaW9ncm91cCBpdGVtcyBuZXZlciBiZWVuIHNlbGVjdGVkIGJ5IHN1cnZleWVlKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd01pc3NpbmdBbnN3ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93TWlzc2luZ0Fuc3dlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dNaXNzaW5nQW5zd2Vycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dNaXNzaW5nQW5zd2VycyA9IHRoaXMuaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKSAmJiB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZU1pc3NpbmdBbnN3ZXJzQnRuKCk7XG4gICAgdGhpcy5kYXRhUHJvdmlkZXIucmVzZXQodGhpcyk7XG4gICAgdGhpcy5yZWZyZXNoQ29udGVudCgpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VkKFwic2hvd01pc3NpbmdBbnNld3JzXCIsIHZhbHVlKTtcbiAgfVxuXG4gIHJlZnJlc2hDb250ZW50KCkge1xuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgfVxuXG4gIG9uRGF0YUl0ZW1TZWxlY3RlZDogKHNlbGVjdGVkVmFsdWU6IGFueSwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgZ2V0IHNob3dWYWx1ZXNJbk9yaWdpbmFsT3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyICE9PSBmYWxzZTtcbiAgfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICBsZXQgcXVlc3Rpb24gPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYoISFxdWVzdGlvbi5jaG9pY2VzRnJvbVF1ZXN0aW9uICYmICEhcXVlc3Rpb24uc3VydmV5KSB7XG4gICAgICBxdWVzdGlvbiA9IDxRdWVzdGlvblNlbGVjdEJhc2U+cXVlc3Rpb24uc3VydmV5LmdldFF1ZXN0aW9uQnlOYW1lKHF1ZXN0aW9uLmNob2ljZXNGcm9tUXVlc3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25bXCJhY3RpdmVDaG9pY2VzXCJdO1xuICB9XG5cbiAgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8YW55PiA9IHRoaXMudmFsdWVzU291cmNlKCkubWFwKFxuICAgICAgKGNob2ljZSkgPT4gY2hvaWNlLnZhbHVlXG4gICAgKTtcblxuICAgIGlmICgoPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uKS5oYXNOb25lKSB7XG4gICAgICB2YWx1ZXMucHVzaCgoPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uKS5ub25lSXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc090aGVyKSB7XG4gICAgICB2YWx1ZXMucHVzaChcIm90aGVyXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIHZhbHVlcy51bnNoaWZ0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dWYWx1ZXNJbk9yaWdpbmFsT3JkZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZXMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZ2V0TGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudXNlVmFsdWVzQXNMYWJlbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlcygpO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbHM6IEFycmF5PHN0cmluZz4gPSB0aGlzLnZhbHVlc1NvdXJjZSgpLm1hcCgoY2hvaWNlKSA9PlxuICAgICAgSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMudmFsdWVzU291cmNlKCksIGNob2ljZS52YWx1ZSlcbiAgICApO1xuICAgIGNvbnN0IHNlbEJhc2UgPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKHNlbEJhc2UuaGFzTm9uZSkge1xuICAgICAgbGFiZWxzLnB1c2goc2VsQmFzZS5ub25lVGV4dCk7XG4gICAgfVxuICAgIGlmIChzZWxCYXNlLmhhc090aGVyKSB7XG4gICAgICBsYWJlbHMucHVzaChzZWxCYXNlLm90aGVyVGV4dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNaXNzaW5nQW5zd2Vycykge1xuICAgICAgbGFiZWxzLnVuc2hpZnQobG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1pc3NpbmdBbnN3ZXJzTGFiZWxcIikpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKSB7XG4gICAgICByZXR1cm4gbGFiZWxzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxuXG4gIGdldFBlcmNlbnRhZ2VzKCk6IEFycmF5PEFycmF5PG51bWJlcj4+IHtcbiAgICB2YXIgZGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSB0aGlzLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICB2YXIgcGVyY2VudGFnZXM6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgdmFyIHBlcmNlbnRhZ2VQcmVjaXNpb24gPSB0aGlzLl9wZXJjZW50YWdlUHJlY2lzaW9uO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoIDwgMikge1xuICAgICAgZGF0YS5mb3JFYWNoKChyZXMsIGluZGV4KSA9PiB7XG4gICAgICAgIHZhciBzdW0gPSByZXMucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKTtcbiAgICAgICAgcGVyY2VudGFnZXNbaW5kZXhdID0gcmVzLm1hcCgodmFsKSA9PiB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gcGVyY2VudGFnZVByZWNpc2lvbiA/ICsodmFsIC8gc3VtKS50b0ZpeGVkKHBlcmNlbnRhZ2VQcmVjaXNpb24pIDogTWF0aC5yb3VuZCgodmFsIC8gc3VtKSAqIDEwMDAwKTtcbiAgICAgICAgICByZXR1cm4gc3VtICYmICh2YWx1ZSAvIDEwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVswXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgc3VtICs9IGRhdGFbal1baV07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBlcmNlbnRhZ2VzW2pdKSkgcGVyY2VudGFnZXNbal0gPSBbXTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBwZXJjZW50YWdlUHJlY2lzaW9uID8gKygoZGF0YVtqXVtpXSAvIHN1bSkgKiAxMDApLnRvRml4ZWQocGVyY2VudGFnZVByZWNpc2lvbikgOiBNYXRoLnJvdW5kKChkYXRhW2pdW2ldIC8gc3VtKSAqIDEwMCk7XG4gICAgICAgICAgcGVyY2VudGFnZXNbal1baV0gPSBzdW0gJiYgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcmNlbnRhZ2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFuc3dlcnNEYXRhUmVhZHkoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSkge1xuICAgIGxldCByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLmhpZGVFbXB0eUFuc3dlcnMpIHtcbiAgICAgIHJlc3VsdCA9IGhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhbnN3ZXJzRGF0YTtcbiAgICB9XG4gICAgaWYgKHRoaXMudG9wTiA+IDApIHtcbiAgICAgIHJlc3VsdC5kYXRhc2V0c1swXSA9IHJlc3VsdC5kYXRhc2V0c1swXS5zbGljZSgtdGhpcy50b3BOKTtcbiAgICAgIHJlc3VsdC5sYWJlbHMgPSByZXN1bHQubGFiZWxzLnNsaWNlKC10aGlzLnRvcE4pO1xuICAgICAgcmVzdWx0LmNvbG9ycyA9IHJlc3VsdC5jb2xvcnMuc2xpY2UoLXRoaXMudG9wTik7XG4gICAgICByZXN1bHQudGV4dHNbMF0gPSByZXN1bHQudGV4dHNbMF0uc2xpY2UoLXRoaXMudG9wTik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbnN3ZXIgZGF0YSBoYXMgYmVlbiBjb21iaW5lZCBiZWZvcmUgdGhleSBwYXNzZWQgdG8gZHJhdyBncmFwaC5cbiAgICogb3B0aW9ucyAtIHRoZSBhbnN3ZXJzIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmc6IGRhdGFzZXRzLCBsYWJlbHMsIGNvbG9ycywgYWRkaXRpb25hbCB0ZXh0cyAocGVyY2VudGFnZSkuXG4gICAqIG9wdGlvbnMgZmllbGRzIGNhbiBiZSBtb2RpZmllZFxuICAgKi9cbiAgcHVibGljIG9uQW5zd2Vyc0RhdGFSZWFkeSA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTZWxlY3RCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBTZWxlY3RCYXNlLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb2JqZWN0IHdpdGggYWxsIGluZm90bWF0aW9uIGZvciBkYXRhIHZpc3VhbGl6YXRpb246IGRhdGFzZXRzLCBsYWJlbHMsIGNvbG9ycywgYWRkaXRpb25hbCB0ZXh0cyAocGVyY2VudGFnZSkuXG4gICAqL1xuICBwdWJsaWMgZ2V0QW5zd2Vyc0RhdGEoKTogSUFuc3dlcnNEYXRhIHtcbiAgICBsZXQgc2VyaWVzTGFiZWxzID0gdGhpcy5nZXRTZXJpZXNMYWJlbHMoKTtcbiAgICBsZXQgZGF0YXNldHMgPSB0aGlzLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBsZXQgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBsZXQgY29sb3JzID0gdGhpcy5nZXRDb2xvcnMoKTtcbiAgICB2YXIgdGV4dHMgPSB0aGlzLnNob3dQZXJjZW50YWdlcyA/IHRoaXMuZ2V0UGVyY2VudGFnZXMoKSA6IGRhdGFzZXRzO1xuXG4gICAgaWYgKHRoaXMudHJhbnNwb3NlRGF0YSkge1xuICAgICAgZGF0YXNldHMgPSB0aGlzLnRyYW5zcG9zZShkYXRhc2V0cyk7XG4gICAgICB0ZXh0cyA9IHRoaXMudHJhbnNwb3NlKHRleHRzKTtcbiAgICAgIGNvbnN0IHRlbXAgPSBzZXJpZXNMYWJlbHM7XG4gICAgICBzZXJpZXNMYWJlbHMgPSBsYWJlbHM7XG4gICAgICBsYWJlbHMgPSB0ZW1wO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFuc3dlcnNPcmRlciA9PSBcImFzY1wiIHx8IHRoaXMuYW5zd2Vyc09yZGVyID09IFwiZGVzY1wiKSB7XG4gICAgICB2YXIgemlwcGVkQXJyYXkgPSB0aGlzLnNob3dQZXJjZW50YWdlc1xuICAgICAgICA/IERhdGFIZWxwZXIuemlwQXJyYXlzKGxhYmVscywgY29sb3JzLCB0ZXh0c1swXSlcbiAgICAgICAgOiBEYXRhSGVscGVyLnppcEFycmF5cyhsYWJlbHMsIGNvbG9ycyk7XG4gICAgICBsZXQgZGljdCA9IERhdGFIZWxwZXIuc29ydERpY3Rpb25hcnkoXG4gICAgICAgIHppcHBlZEFycmF5LFxuICAgICAgICBkYXRhc2V0c1swXSxcbiAgICAgICAgdGhpcy5hbnN3ZXJzT3JkZXIgPT0gXCJkZXNjXCJcbiAgICAgICk7XG4gICAgICBsZXQgdW56aXBwZWRBcnJheSA9IERhdGFIZWxwZXIudW56aXBBcnJheXMoZGljdC5rZXlzKTtcbiAgICAgIGxhYmVscyA9IHVuemlwcGVkQXJyYXlbMF07XG4gICAgICBjb2xvcnMgPSB1bnppcHBlZEFycmF5WzFdO1xuICAgICAgaWYgKHRoaXMuc2hvd1BlcmNlbnRhZ2VzKSB0ZXh0c1swXSA9IHVuemlwcGVkQXJyYXlbMl07XG4gICAgICBkYXRhc2V0c1swXSA9IGRpY3QudmFsdWVzO1xuICAgIH1cblxuICAgIGxldCBhbnN3ZXJzRGF0YSA9IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfTtcbiAgICBhbnN3ZXJzRGF0YSA9IHRoaXMuYW5zd2Vyc0RhdGFSZWFkeShhbnN3ZXJzRGF0YSk7XG4gICAgdGhpcy5vbkFuc3dlcnNEYXRhUmVhZHkuZmlyZSh0aGlzLCBhbnN3ZXJzRGF0YSk7XG5cbiAgICByZXR1cm4gYW5zd2Vyc0RhdGE7XG4gIH1cbiAgcHJvdGVjdGVkIHRyYW5zcG9zZShkYXRhOiBBcnJheTxBcnJheTxudW1iZXI+Pik6IEFycmF5PEFycmF5PG51bWJlcj4+IHtcbiAgICBjb25zdCBkaW0yID0gZGF0YVswXS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KGRpbTIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltMjsgKytpKVxuICAgICAgcmVzdWx0W2ldID0gbmV3IEFycmF5PG51bWJlcj4oZGF0YS5sZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaW0yOyArK2opIHtcbiAgICAgICAgcmVzdWx0W2pdW2ldID0gZGF0YVtpXVtqXTtcbiAgICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3N0YXRlUHJvcGVydGllcyA9IFtcImNoYXJ0VHlwZVwiLCBcImFuc3dlcnNPcmRlclwiLCBcImhpZGVFbXB0eUFuc3dlcnNcIiwgXCJ0b3BOXCJdO1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogYW55IHtcbiAgICBsZXQgc3RhdGU6IGFueSA9IHt9O1xuICAgIFNlbGVjdEJhc2UuX3N0YXRlUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG4gICAgICBzdGF0ZVtwcm9wZXJ0eU5hbWVdID0gKDxhbnk+dGhpcylbcHJvcGVydHlOYW1lXTtcbiAgICB9KTtcbiAgICBpZighIXRoaXMuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICBzdGF0ZS5maWx0ZXIgPSB0aGlzLnNlbGVjdGVkSXRlbS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogYW55KTogdm9pZCB7XG4gICAgU2VsZWN0QmFzZS5fc3RhdGVQcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHlOYW1lID0+IHtcbiAgICAgIGlmIChzdGF0ZVtwcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHlOYW1lXSA9IHN0YXRlW3Byb3BlcnR5TmFtZV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKCh0aGlzLnF1ZXN0aW9uIGFzIFF1ZXN0aW9uU2VsZWN0QmFzZSkudmlzaWJsZUNob2ljZXMsIHN0YXRlLmZpbHRlcik7XG4gICAgdGhpcy5zZXRTZWxlY3Rpb24oc2VsZWN0ZWRJdGVtID8/IHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XHJcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcclxuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XHJcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi90ZXh0LnNjc3NcIik7XHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dFRhYmxlQWRhcHRlciB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogVGV4dCkge31cclxuXHJcbiAgcHVibGljIGNyZWF0ZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBjb25zdCB7IGNvbHVtbnNDb3VudCwgZGF0YSB9ID0gdGhpcy5tb2RlbC5nZXRDYWxjdWxhdGVkVmFsdWVzKCk7XHJcbiAgICBjb25zdCBlbXB0eVRleHROb2RlID0gPEhUTUxFbGVtZW50PkRvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIFwiXCIsIHtcclxuICAgICAgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9SZXN1bHRzXCIpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbXB0eVRleHROb2RlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhYmxlTm9kZSA9IDxIVE1MVGFibGVFbGVtZW50PihcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIFwic2EtdGV4dC10YWJsZVwiKVxyXG4gICAgKTtcclxuXHJcbiAgICB0YWJsZU5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3I7XHJcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGVOb2RlKTtcclxuXHJcbiAgICBkYXRhLmZvckVhY2goKHJvd0RhdGEpID0+IHtcclxuICAgICAgdmFyIHJvdyA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zQ291bnQ7IGkrKykge1xyXG4gICAgICAgIHZhciB0ZCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLXRleHQtdGFibGVfX2NlbGxcIiwge1xyXG4gICAgICAgICAgdGV4dENvbnRlbnQ6IHJvd0RhdGFbaV0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKHRkKTtcclxuICAgICAgfVxyXG4gICAgICB0YWJsZU5vZGUuYXBwZW5kQ2hpbGQocm93KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBcInNhLXRleHQtdGFibGVfX2NvbnRhaW5lclwiO1xyXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlTm9kZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xyXG4gICAgbm9kZS5pbm5lckhUTUwgPSBcIlwiO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRleHQgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XHJcbiAgcHJpdmF0ZSBfdGV4dFRhYmxlQWRhcHRlcjogVGV4dFRhYmxlQWRhcHRlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXHJcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxyXG4gICAgb3B0aW9ucz86IE9iamVjdCxcclxuICAgIG5hbWU/OiBzdHJpbmdcclxuICApIHtcclxuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwidGV4dFwiKTtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIgPSBuZXcgVGV4dFRhYmxlQWRhcHRlcih0aGlzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDYWxjdWxhdGVkVmFsdWVzKCk6IGFueSB7XHJcbiAgICBsZXQgcmVzdWx0OiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xyXG4gICAgbGV0IGNvbHVtbnNDb3VudCA9IDA7XHJcblxyXG4gICAgdGhpcy5kYXRhLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICBjb25zdCByb3dWYWx1ZTogYW55ID0gcm93W3RoaXMucXVlc3Rpb24ubmFtZV07XHJcbiAgICAgIGxldCBkYXRhU3RyaW5nczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICBpZiAoISFyb3dWYWx1ZSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd1ZhbHVlKSkge1xyXG4gICAgICAgICAgZGF0YVN0cmluZ3MgPSBkYXRhU3RyaW5ncy5jb25jYXQocm93VmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJvd1ZhbHVlKS5mb3JFYWNoKChrZXkpID0+XHJcbiAgICAgICAgICAgICAgZGF0YVN0cmluZ3MucHVzaChyb3dWYWx1ZVtrZXldKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVN0cmluZ3MucHVzaChyb3dWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5wdXNoKGRhdGFTdHJpbmdzKTtcclxuICAgICAgICBpZiAoZGF0YVN0cmluZ3MubGVuZ3RoID4gY29sdW1uc0NvdW50KSB7XHJcbiAgICAgICAgICBjb2x1bW5zQ291bnQgPSBkYXRhU3RyaW5ncy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBjb2x1bW5zQ291bnQsIGRhdGE6IHJlc3VsdCB9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIuZGVzdHJveShjb250YWluZXIpO1xyXG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIuY3JlYXRlKGNvbnRhaW5lcik7XHJcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgdGhpcy5fdGV4dFRhYmxlQWRhcHRlci5kZXN0cm95KHRoaXMuY29udGVudENvbnRhaW5lcik7XHJcbiAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgfVxyXG59XHJcblxyXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJ0ZXh0XCIsIFRleHQpO1xyXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJjb21tZW50XCIsIFRleHQpO1xyXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJtdWx0aXBsZXRleHRcIiwgVGV4dCk7XHJcbiIsImV4cG9ydCB2YXIgX19hc3NpZ24gPVxuICAoPGFueT5PYmplY3QpW1wiYXNzaWduXCJdIHx8XG4gIGZ1bmN0aW9uKHRhcmdldDogYW55KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIgcCBpbiBzKVxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0YXJnZXRbcF0gPSBzW3BdO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKHRoaXNDbGFzczogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICBmb3IgKHZhciBwIGluIGJhc2VDbGFzcylcbiAgICBpZiAoYmFzZUNsYXNzLmhhc093blByb3BlcnR5KHApKSB0aGlzQ2xhc3NbcF0gPSBiYXNlQ2xhc3NbcF07XG4gIGZ1bmN0aW9uIF9fKCkge1xuICAgIHRoaXMuY29uc3RydWN0b3IgPSB0aGlzQ2xhc3M7XG4gIH1cbiAgdGhpc0NsYXNzLnByb3RvdHlwZSA9XG4gICAgYmFzZUNsYXNzID09PSBudWxsXG4gICAgICA/IE9iamVjdC5jcmVhdGUoYmFzZUNsYXNzKVxuICAgICAgOiAoKF9fLnByb3RvdHlwZSA9IGJhc2VDbGFzcy5wcm90b3R5cGUpLCBuZXcgKDxhbnk+X18pKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fcmVzdCA9IGZ1bmN0aW9uKHNvdXJjZTogYW55LCBlOiBhbnkpIHtcbiAgdmFyIHJlc3VsdDogYW55ID0ge307XG4gIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBzb3VyY2UpXG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwgcHJvcGVydHlOYW1lKSAmJlxuICAgICAgZS5pbmRleE9mKHByb3BlcnR5TmFtZSkgPCAwXG4gICAgKVxuICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBzb3VyY2VbcHJvcGVydHlOYW1lXTtcbiAgaWYgKFxuICAgIHNvdXJjZSAhPSBudWxsICYmXG4gICAgdHlwZW9mICg8YW55Pk9iamVjdClbXCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcIl0gPT09IFwiZnVuY3Rpb25cIlxuICApXG4gICAgZm9yIChcbiAgICAgIHZhciBpID0gMCxcbiAgICAgICAgcHJvcGVydHlTeW1ib2xzID0gKDxhbnk+T2JqZWN0KVtcImdldE93blByb3BlcnR5U3ltYm9sc1wiXShzb3VyY2UpO1xuICAgICAgaSA8IHByb3BlcnR5U3ltYm9scy5sZW5ndGg7XG4gICAgICBpKytcbiAgICApXG4gICAgICBpZiAoZS5pbmRleE9mKHByb3BlcnR5U3ltYm9sc1tpXSkgPCAwKVxuICAgICAgICByZXN1bHRbcHJvcGVydHlTeW1ib2xzW2ldXSA9IHNvdXJjZVtwcm9wZXJ0eVN5bWJvbHNbaV1dO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZGVjbGFyZSB2YXIgUmVmbGVjdDogYW55O1xuXG5leHBvcnQgdmFyIF9fZGVjb3JhdGUgPSBmdW5jdGlvbihcbiAgZGVjb3JhdG9yczogYW55LFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBhbnksXG4gIGRlc2M6IGFueVxuKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICByID1cbiAgICAgIGMgPCAzXG4gICAgICAgID8gdGFyZ2V0XG4gICAgICAgIDogZGVzYyA9PT0gbnVsbFxuICAgICAgICAgID8gKGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSlcbiAgICAgICAgICA6IGRlc2MsXG4gICAgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICBpZiAoKGQgPSBkZWNvcmF0b3JzW2ldKSlcbiAgICAgICAgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59O1xuIiwiZXhwb3J0IGNsYXNzIERvY3VtZW50SGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVNlbGVjdG9yKFxyXG4gICAgb3B0aW9uczogQXJyYXk8eyB2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfT4sXHJcbiAgICBpc1NlbGVjdGVkOiAob3B0aW9uOiB7IHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZyB9KSA9PiBib29sZWFuLFxyXG4gICAgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgY29uc3Qgc2VsZWN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICBzZWxlY3RXcmFwcGVyLmNsYXNzTmFtZSA9IFwic2EtcXVlc3Rpb25fX3NlbGVjdC13cmFwcGVyXCI7XHJcbiAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xyXG4gICAgc2VsZWN0LmNsYXNzTmFtZSA9IFwic2EtcXVlc3Rpb25fX3NlbGVjdFwiO1xyXG4gICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcclxuICAgICAgbGV0IG9wdGlvbkVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIsIFwiXCIsIHtcclxuICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxyXG4gICAgICAgIHRleHQ6IG9wdGlvbi50ZXh0LFxyXG4gICAgICAgIHNlbGVjdGVkOiBpc1NlbGVjdGVkKG9wdGlvbiksXHJcbiAgICAgIH0pO1xyXG4gICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7XHJcbiAgICB9KTtcclxuICAgIHNlbGVjdC5vbmNoYW5nZSA9IGhhbmRsZXI7XHJcbiAgICBzZWxlY3RXcmFwcGVyLmFwcGVuZENoaWxkKHNlbGVjdCk7XHJcbiAgICByZXR1cm4gc2VsZWN0V3JhcHBlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlQnV0dG9uKFxyXG4gICAgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCxcclxuICAgIHRleHQgPSBcIlwiLFxyXG4gICAgY2xhc3NOYW1lID0gXCJzYS10b29sYmFyX19idXR0b25cIlxyXG4gICkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgY2xhc3NOYW1lLCB7XHJcbiAgICAgIGlubmVyVGV4dDogdGV4dCxcclxuICAgICAgb25jbGljazogaGFuZGxlcixcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGJ1dHRvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlRWxlbWVudChcclxuICAgIHRhZ05hbWU6IHN0cmluZyxcclxuICAgIGNsYXNzTmFtZTogc3RyaW5nID0gXCJcIixcclxuICAgIGF0dHJzPzogYW55XHJcbiAgKTogSFRNTEVsZW1lbnQge1xyXG4gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcclxuICAgIGVsLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcclxuICAgIGlmICghIWF0dHJzKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAoPGFueT5lbClba2V5XSA9IGF0dHJzW2tleV07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTdmdFbGVtZW50KHBhdGg6IHN0cmluZyk6IFNWR1NWR0VsZW1lbnQge1xyXG4gICAgY29uc3Qgc3ZnRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcclxuICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxyXG4gICAgICBcInN2Z1wiXHJcbiAgICApO1xyXG4gICAgY29uc3QgdXNlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcclxuICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxyXG4gICAgICBcInVzZVwiXHJcbiAgICApO1xyXG4gICAgdXNlRWxlbS5zZXRBdHRyaWJ1dGVOUyhcclxuICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXHJcbiAgICAgIFwiaHJlZlwiLFxyXG4gICAgICBcIiNzYS1zdmctXCIgKyBwYXRoXHJcbiAgICApO1xyXG4gICAgc3ZnRWxlbS5hcHBlbmRDaGlsZCh1c2VFbGVtKTtcclxuICAgIHJldHVybiBzdmdFbGVtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTdmdCdXR0b24ocGF0aDogc3RyaW5nKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xyXG4gICAgY29uc3QgYnRuID0gPEhUTUxCdXR0b25FbGVtZW50PihcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBcInNhLXRhYmxlX19zdmctYnV0dG9uXCIpXHJcbiAgICApO1xyXG4gICAgYnRuLmFwcGVuZENoaWxkKERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQocGF0aCkpO1xyXG4gICAgcmV0dXJuIGJ0bjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnVG9nZ2xlQnV0dG9uKFxyXG4gICAgc3ZnUGF0aDE6IHN0cmluZyxcclxuICAgIHN2UHBhdGgyOiBzdHJpbmcsXHJcbiAgICB0ZXh0MTogc3RyaW5nLFxyXG4gICAgdGV4dDI6IHN0cmluZyxcclxuICAgIGhhbmRsZXIxOiAoZTogYW55KSA9PiBhbnksXHJcbiAgICBoYW5kbGVyMjogKGU6IGFueSkgPT4gYW55LFxyXG4gICAgc3RhdGUgPSBcImZpcnN0XCIsXHJcbiAgICBjbGFzc05hbWUgPSBcInNhLXRvb2xiYXJfX2J1dHRvbiBzYS10b29sYmFyX19zdmctYnV0dG9uXCJcclxuICApOiBIVE1MRWxlbWVudCB7XHJcbiAgICBjb25zdCBzdmcxID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU3ZnRWxlbWVudChzdmdQYXRoMSk7XHJcbiAgICBjb25zdCBzdmcyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU3ZnRWxlbWVudChzdlBwYXRoMik7XHJcbiAgICBjb25zdCBidXR0b24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIGNsYXNzTmFtZSk7XHJcblxyXG4gICAgY29uc3QgdG9nZ2xlID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoc3RhdGUgPT09IFwiZmlyc3RcIikge1xyXG4gICAgICAgIHN0YXRlID0gXCJzZWNvbmRcIjtcclxuICAgICAgICBidXR0b24udGl0bGUgPSB0ZXh0MjtcclxuICAgICAgICBidXR0b24ucmVtb3ZlQ2hpbGQoc3ZnMSk7XHJcbiAgICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHN2ZzIpO1xyXG4gICAgICAgIGhhbmRsZXIyKGUpO1xyXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBcInNlY29uZFwiKSB7XHJcbiAgICAgICAgc3RhdGUgPSBcImZpcnN0XCI7XHJcbiAgICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDE7XHJcbiAgICAgICAgYnV0dG9uLnJlbW92ZUNoaWxkKHN2ZzIpO1xyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcxKTtcclxuICAgICAgICBoYW5kbGVyMShlKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IFwiZmlyc3RcIikge1xyXG4gICAgICBidXR0b24udGl0bGUgPSB0ZXh0MTtcclxuICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHN2ZzEpO1xyXG4gICAgfSBlbHNlIGlmICgoc3RhdGUgPSBcInNlY29uZFwiKSkge1xyXG4gICAgICBidXR0b24udGl0bGUgPSB0ZXh0MjtcclxuICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHN2ZzIpO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1dHRvbi5vbmNsaWNrID0gdG9nZ2xlO1xyXG5cclxuICAgIHJldHVybiBidXR0b247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUlucHV0KFxyXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXHJcbiAgICBwbGFjZWhvbGRlciA9IFwiXCIsXHJcbiAgICBkZWZhdWx0VmFsdWUgPSBcIlwiXHJcbiAgKTogSFRNTElucHV0RWxlbWVudCB7XHJcbiAgICB2YXIgZWwgPSA8SFRNTElucHV0RWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxyXG4gICAgICBcImlucHV0XCIsXHJcbiAgICAgIGNsYXNzTmFtZSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlcixcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiBlbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgb3B0aW9ucyA9IHtcclxuICBydW5uaW5nSW5Ccm93c2VyOiB0eXBlb2Ygd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIixcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhbGxvd0RvbVJlbmRlcmluZygpIHtcclxuICByZXR1cm4gb3B0aW9ucy5ydW5uaW5nSW5Ccm93c2VyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tbWVyY2lhbExpY2Vuc2VMaW5rKCkge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1jb21tZXJjaWFsXCIpO1xyXG4gIGNvbnN0IGxpbmsgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiYVwiLCBcInNhLWNvbW1lcmNpYWxfX3RleHRcIiwge1xyXG4gICAgaHJlZjogXCJodHRwczovL3d3dy5zdXJ2ZXlqcy5pby9CdXlcIixcclxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcclxuICB9KTtcclxuICBjb25zdCBjb250YWluZXJTcGFuID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgXCJcIik7XHJcbiAgY29uc3QgaWNvbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQoXCJub25jb21tZXJjaWFsXCIpO1xyXG4gIGNvbnN0IHRleHRTcGFuID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcclxuICAgIFwic3BhblwiLFxyXG4gICAgXCJzYS1jb21tZXJjaWFsX19wcm9kdWN0XCIsXHJcbiAgICB7XHJcbiAgICAgIGlubmVyVGV4dDogXCJQbGVhc2UgcHVyY2hhc2UgYSBTdXJ2ZXlKUyBBbmFseXRpY3MgZGV2ZWxvcGVyIGxpY2Vuc2UgdG8gdXNlIGl0IGluIHlvdXIgYXBwLlwiLFxyXG4gICAgfVxyXG4gICk7XHJcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmspLmFwcGVuZENoaWxkKGNvbnRhaW5lclNwYW4pO1xyXG4gIGNvbnRhaW5lclNwYW4uYXBwZW5kQ2hpbGQoaWNvbik7XHJcbiAgY29udGFpbmVyU3Bhbi5hcHBlbmRDaGlsZCh0ZXh0U3Bhbik7XHJcbiAgcmV0dXJuIGNvbnRhaW5lcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERhdGFIZWxwZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgemlwQXJyYXlzKC4uLmFycmF5czogYW55W10pOiBhbnlbXVtdIHtcclxuICAgIGxldCB6aXBBcnJheTogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlzWzBdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHppcEFycmF5W2ldID0gW107XHJcbiAgICAgIGFycmF5cy5mb3JFYWNoKChhcnIpID0+IHtcclxuICAgICAgICB6aXBBcnJheVtpXS5wdXNoKGFycltpXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHppcEFycmF5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB1bnppcEFycmF5cyh6aXBBcnJheTogYW55W11bXSk6IGFueVtdW10ge1xyXG4gICAgbGV0IGFycmF5czogYW55W11bXSA9IFtdO1xyXG4gICAgemlwQXJyYXkuZm9yRWFjaCgodmFsdWUsIGkpID0+IHtcclxuICAgICAgdmFsdWUuZm9yRWFjaCgodmFsLCBqKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhcnJheXNbal0pIGFycmF5c1tqXSA9IFtdO1xyXG4gICAgICAgIGFycmF5c1tqXVtpXSA9IHZhbDtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhcnJheXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgc29ydERpY3Rpb25hcnkoXHJcbiAgICBrZXlzOiBhbnlbXSxcclxuICAgIHZhbHVlczogYW55W10sXHJcbiAgICBkZXNjOiBib29sZWFuXHJcbiAgKTogeyBrZXlzOiBhbnlbXSwgdmFsdWVzOiBhbnlbXSB9IHtcclxuICAgIGxldCBkaWN0aW9uYXJ5ID0gdGhpcy56aXBBcnJheXMoa2V5cywgdmFsdWVzKTtcclxuICAgIGxldCBjb21wYXJhdG9yID0gKGE6IGFueVtdLCBiOiBhbnlbXSwgYXNjOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gYVsxXSA8IGJbMV0gPyAxIDogYVsxXSA9PSBiWzFdID8gMCA6IC0xO1xyXG4gICAgICByZXR1cm4gYXNjID8gcmVzdWx0IDogcmVzdWx0ICogLTE7XHJcbiAgICB9O1xyXG4gICAgZGljdGlvbmFyeS5zb3J0KChhOiBhbnlbXSwgYjogYW55W10pID0+IHtcclxuICAgICAgcmV0dXJuIGRlc2MgPyBjb21wYXJhdG9yKGEsIGIsIGZhbHNlKSA6IGNvbXBhcmF0b3IoYSwgYik7XHJcbiAgICB9KTtcclxuICAgIGxldCBrZXlzQW5kVmFsdWVzID0gdGhpcy51bnppcEFycmF5cyhkaWN0aW9uYXJ5KTtcclxuICAgIHJldHVybiB7IGtleXM6IGtleXNBbmRWYWx1ZXNbMF0sIHZhbHVlczoga2V5c0FuZFZhbHVlc1sxXSB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB0b1BlcmNlbnRhZ2UodmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuICh2YWx1ZSAvIG1heFZhbHVlKSAqIDEwMDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMaW5rc0NvbnRhaW5lcihcclxuICBsaW5rczogQXJyYXk8eyBuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IGFueSB9PlxyXG4pOiBIVE1MRWxlbWVudCB7XHJcbiAgY29uc3QgbGlua3NDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gIGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcclxuICAgIGxpbmtzQ29udGFpbmVyLmFwcGVuZENoaWxkKFxyXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiYVwiLCBcIlwiLCB7XHJcbiAgICAgICAgaW5uZXJUZXh0OiBsaW5rLm5hbWUsXHJcbiAgICAgICAgZG93bmxvYWQ6IGxpbmsubmFtZSxcclxuICAgICAgICBocmVmOiBsaW5rLmNvbnRlbnQsXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG4gIHJldHVybiBsaW5rc0NvbnRhaW5lcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUltYWdlc0NvbnRhaW5lcihcclxuICBsaW5rczogQXJyYXk8eyBuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IGFueSB9PlxyXG4pOiBIVE1MRWxlbWVudCB7XHJcbiAgY29uc3QgbGlua3NDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gIGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcclxuICAgIGxpbmtzQ29udGFpbmVyLmFwcGVuZENoaWxkKFxyXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIFwiXCIsIHtcclxuICAgICAgICBhbHQ6IGxpbmsubmFtZSxcclxuICAgICAgICBzcmM6IGxpbmsuY29udGVudCxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGxpbmtzQ29udGFpbmVyO1xyXG59XHJcbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5cbmRlY2xhcmUgdHlwZSBWaXN1YWxpemVyQ29uc3RydWN0b3IgPSBuZXcgKFxuICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gIG9wdGlvbnM/OiBPYmplY3RcbikgPT4gYW55O1xuXG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdXNlZCB0byByZWdpc3RlciBhbmQgdW5yZWdpc3RlciB2aXN1YWxpemVycyBmb3IgaW5kaXZpZHVhbCBxdWVzdGlvbiB0eXBlcy5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy92aXN1YWxpemUtYW5zd2Vycy1mcm9tLXRleHQtZW50cnktZmllbGRzLXdpdGgtY2hhcnRzLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFZpc3VhbGl6YXRpb25NYW5hZ2VyIHtcbiAgc3RhdGljIGFsdGVybmF0aXZlc1Zpc3VhbGl6ZXI6IGFueSA9IHVuZGVmaW5lZDtcbiAgc3RhdGljIHZpenVhbGl6ZXJzOiB7IFtpbmRleDogc3RyaW5nXTogQXJyYXk8eyBjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3IsIGluZGV4OiBudW1iZXIgfT4gfSA9IHt9O1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmlzdWFsaXplciBmb3IgYSBzcGVjaWZpZWQgcXVlc3Rpb24gdHlwZS5cbiAgICpcbiAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZXhhbXBsZXMvdmlzdWFsaXplLWFuc3dlcnMtZnJvbS10ZXh0LWVudHJ5LWZpZWxkcy13aXRoLWNoYXJ0cy8gKGxpbmtTdHlsZSkpXG4gICAqIEBwYXJhbSBxdWVzdGlvblR5cGUgQSBxdWVzdGlvbiBbdHlwZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI2dldFR5cGUpLlxuICAgKiBAcGFyYW0gY29uc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXN1YWxpemVyIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0gaW5kZXggQSB6ZXJvLWJhc2VkIGluZGV4IHRoYXQgc3BlY2lmaWVzIHRoZSB2aXN1YWxpemVyJ3MgcG9zaXRpb24gaW4gdGhlIHZpc3VhbGl6ZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBxdWVzdGlvbiB0eXBlLiBQYXNzIGAwYCB0byBpbnNlcnQgdGhlIHZpc3VhbGl6ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBhbmQgdXNlIGl0IGJ5IGRlZmF1bHQuIElmIGBpbmRleGAgaXMgbm90IHNwZWNpZmllZCwgdGhlIHZpc3VhbGl6ZXIgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJWaXN1YWxpemVyKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIGNvbnN0cnVjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3IsXG4gICAgaW5kZXggPSBOdW1iZXIuTUFYX1ZBTFVFXG4gICkge1xuICAgIGxldCB2aXN1YWxpemVycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYgKCF2aXN1YWxpemVycykge1xuICAgICAgdmlzdWFsaXplcnMgPSBbXTtcbiAgICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3F1ZXN0aW9uVHlwZV0gPSB2aXN1YWxpemVycztcbiAgICB9XG4gICAgdmlzdWFsaXplcnMucHVzaCh7IGN0b3I6IGNvbnN0cnVjdG9yLCBpbmRleCB9KTtcbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2aXN1YWxpemVyIGZvciBhIHNwZWNpZmllZCBxdWVzdGlvbiB0eXBlLlxuICAgKlxuICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy92aXN1YWxpemUtYW5zd2Vycy1mcm9tLXRleHQtZW50cnktZmllbGRzLXdpdGgtY2hhcnRzLyAobGlua1N0eWxlKSlcbiAgICogQHBhcmFtIHF1ZXN0aW9uVHlwZSBBIHF1ZXN0aW9uIFt0eXBlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24jZ2V0VHlwZSkuXG4gICAqIEBwYXJhbSBjb25zdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZpc3VhbGl6ZXIgY29uc3RydWN0b3IgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclZpc3VhbGl6ZXIocXVlc3Rpb25UeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbnN0cnVjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICBsZXQgcXVlc3Rpb25UeXBlcyA9IFtxdWVzdGlvblR5cGVdO1xuICAgIGlmKCFxdWVzdGlvblR5cGUpIHtcbiAgICAgIHF1ZXN0aW9uVHlwZXMgPSBPYmplY3Qua2V5cyhWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVycyk7XG4gICAgfVxuICAgIHF1ZXN0aW9uVHlwZXMuZm9yRWFjaChxVHlwZSA9PiB7XG4gICAgICBpZihjb25zdHJ1Y3Rvcikge1xuICAgICAgICBsZXQgdmlzdWFsaXplcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1txVHlwZV07XG4gICAgICAgIGlmICghIXZpc3VhbGl6ZXJzKSB7XG4gICAgICAgICAgY29uc3QgdkRlc2NyID0gdmlzdWFsaXplcnMuZmlsdGVyKHYgPT4gdi5jdG9yID09PSBjb25zdHJ1Y3RvcilbMF07XG4gICAgICAgICAgaWYoISF2RGVzY3IpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHZpc3VhbGl6ZXJzLmluZGV4T2YodkRlc2NyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgdmlzdWFsaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3FUeXBlXSA9IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gUGFzcyBgdW5kZWZpbmVkYCB0byB0aGUgW2B1bnJlZ2lzdGVyVmlzdWFsaXplcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ubWFuYWdlciN1bnJlZ2lzdGVyVmlzdWFsaXplcikgbWV0aG9kIGluc3RlYWQuXG4gICAqIEBwYXJhbSBjb25zdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZpc3VhbGl6ZXIgY29uc3RydWN0b3IgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclZpc3VhbGl6ZXJGb3JBbGwoY29uc3RydWN0b3I6IFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnVucmVnaXN0ZXJWaXN1YWxpemVyKHVuZGVmaW5lZCwgY29uc3RydWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB2aXN1YWxpemVyIGNvbnN0cnVjdG9ycyBmb3IgYSBzcGVjaWZpZWQgcXVlc3Rpb24gdHlwZS5cbiAgICogQHBhcmFtIHF1ZXN0aW9uVHlwZSBBIHF1ZXN0aW9uIFt0eXBlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24jZ2V0VHlwZSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFZpc3VhbGl6ZXJzQnlUeXBlKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nXG4gICk6IFZpc3VhbGl6ZXJDb25zdHJ1Y3RvcltdIHtcbiAgICBsZXQgdkRlc2NycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYgKCF2RGVzY3JzKSB7XG4gICAgICBpZihWaXN1YWxpemVyQmFzZS5zdXBwcmVzc1Zpc3VhbGl6ZXJTdHViUmVuZGVyaW5nKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbVmlzdWFsaXplckJhc2VdO1xuICAgIH1cbiAgICB2RGVzY3JzID0gW10uY29uY2F0KHZEZXNjcnMpO1xuICAgIHZEZXNjcnMuc29ydCgodjEsIHYyKSA9PiB2MS5pbmRleCAtIHYyLmluZGV4KTtcbiAgICByZXR1cm4gdkRlc2Nycy5tYXAodiA9PiB2LmN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29uc3RydWN0b3IgZm9yIGFuIGFsdGVybmF0aXZlIHZpc3VhbGl6ZXIgc2VsZWN0b3IuXG4gICAqIEBzZWUgcmVnaXN0ZXJBbHRWaXN1YWxpemVyU2VsZWN0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QWx0VmlzdWFsaXplclNlbGVjdG9yKCkge1xuICAgIHJldHVybiBWaXN1YWxpemF0aW9uTWFuYWdlci5hbHRlcm5hdGl2ZXNWaXN1YWxpemVyIHx8IFZpc3VhbGl6ZXJCYXNlO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gYWx0ZXJuYXRpdmUgdmlzdWFsaXplciBzZWxlY3Rvci5cbiAgICogQHBhcmFtIGNvbnN0cnVjdG9yIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY29uc3RydWN0b3IgZm9yIGFuIGFsdGVybmF0aXZlIHZpc3VhbGl6ZXIgc2VsZWN0b3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyQWx0VmlzdWFsaXplclNlbGVjdG9yKGNvbnN0cnVjdG9yOiBhbnkpIHtcbiAgICBWaXN1YWxpemF0aW9uTWFuYWdlci5hbHRlcm5hdGl2ZXNWaXN1YWxpemVyID0gY29uc3RydWN0b3I7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCxcbiAgTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIEl0ZW1WYWx1ZSxcbiAgSGVscGVycyxcbiAgUXVlc3Rpb25TZWxlY3RCYXNlLFxufSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbCB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd24gZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByb3RlY3RlZCBfbWF0cml4RHJvcGRvd25WaXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwibWF0cml4RHJvcGRvd25cIik7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLmRpc2FibGVMb2NhbGVTd2l0Y2ggPSB0cnVlO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLmFsbG93RHluYW1pY0xheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNWYWx1ZXMgPSBxdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+IHJvdy52YWx1ZSk7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLnNlcmllc0xhYmVscyA9IHF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gcm93LnRleHQpO1xuXG4gICAgY29uc3QgaW5uZXJRdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9ucygpO1xuICAgIGNvbnN0IGNhbkdyb3VwQ29sdW1ucyA9IHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNWYWx1ZXMubGVuZ3RoID09IDEgJiYgaW5uZXJRdWVzdGlvbnMuZXZlcnkoaW5uZXJRdWVzdGlvbiA9PiBIZWxwZXJzLmlzQXJyYXlzRXF1YWwoaW5uZXJRdWVzdGlvbi5jaG9pY2VzLCAoPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uKS5jaG9pY2VzKSk7XG4gICAgaWYgKGNhbkdyb3VwQ29sdW1ucykge1xuICAgICAgdmFyIGNyZWF0b3JzID0gVmlzdWFsaXphdGlvbk1hbmFnZXIuZ2V0VmlzdWFsaXplcnNCeVR5cGUoXCJtYXRyaXhkcm9wZG93bi1ncm91cGVkXCIpO1xuICAgICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyID0gbmV3IGNyZWF0b3JzWzBdKHRoaXMucXVlc3Rpb24sIFtdLCB0aGlzLl9jaGlsZE9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIgPSBuZXcgVmlzdWFsaXphdGlvblBhbmVsKGlubmVyUXVlc3Rpb25zLCBbXSwgdGhpcy5fY2hpbGRPcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2spO1xuICAgIHRoaXMudXBkYXRlRGF0YShkYXRhKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRMb2NhbGUobmV3TG9jYWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuc2VyaWVzTGFiZWxzID0gdGhpcy5xdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+IHJvdy50ZXh0KTtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIubG9jYWxlID0gbmV3TG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplcjtcbiAgfVxuXG4gIHByaXZhdGUgb25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlRHJvcGRvd25WaXN1YWxpemVyRGF0YSgpIHtcbiAgICBsZXQgcGFuZWxEYXRhOiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGRhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgcmF3RGF0YUl0ZW0gPSBkYXRhSXRlbVt0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICAgICAgaWYgKCEhcmF3RGF0YUl0ZW0pIHtcbiAgICAgICAgT2JqZWN0LmtleXMocmF3RGF0YUl0ZW0pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIHZhciBuZXN0ZWREYXRhSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIHJhd0RhdGFJdGVtW2tleV0pO1xuICAgICAgICAgIG5lc3RlZERhdGFJdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldID0ga2V5O1xuICAgICAgICAgIHBhbmVsRGF0YS5wdXNoKG5lc3RlZERhdGFJdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLnVwZGF0ZURhdGEocGFuZWxEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgdGhpcy51cGRhdGVEcm9wZG93blZpc3VhbGl6ZXJEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURyb3Bkb3duVmlzdWFsaXplckRhdGEoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKSB7XG4gICAgY29uc3QgbWF0cml4ZHJvcGRvd246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICByZXR1cm4gbWF0cml4ZHJvcGRvd24uY29sdW1ucy5tYXAoXG4gICAgICAoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBjZWxsUXVlc3Rpb246IGFueSA9IGNvbHVtbi50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjZWxsUXVlc3Rpb24uY2hvaWNlcykgJiYgY2VsbFF1ZXN0aW9uLmNob2ljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY2VsbFF1ZXN0aW9uLmNob2ljZXMgPSBtYXRyaXhkcm9wZG93bi5jaG9pY2VzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxsUXVlc3Rpb247XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIuY2xlYXIoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLnJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKHRoaXMub25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2spO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcbiAgXCJtYXRyaXhkcm9wZG93blwiLFxuICBWaXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd25cbik7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWxEeW5hbWljIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvblBhbmVsRHluYW1pY1wiO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvbk1hdHJpeER5bmFtaWMgZXh0ZW5kcyBWaXN1YWxpemF0aW9uUGFuZWxEeW5hbWljIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdFxuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwibWF0cml4RHluYW1pY1wiO1xuICB9XG5cbiAgZ2V0UXVlc3Rpb25zKCkge1xuICAgIGNvbnN0IG1hdHJpeGR5bmFtaWM6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IG1hdHJpeGR5bmFtaWMudmlzaWJsZVJvd3M7XG5cbiAgICBpZiAodmlzaWJsZVJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gdmlzaWJsZVJvd3NbMF0uY2VsbHMubWFwKGMgPT4gYy5xdWVzdGlvbik7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFxuICBcIm1hdHJpeGR5bmFtaWNcIixcbiAgVmlzdWFsaXphdGlvbk1hdHJpeER5bmFtaWNcbik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBFdmVudCwgUXVlc3Rpb24sIFN1cnZleU1vZGVsLCBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCAqIGFzIFN1cnZleUNvcmUgZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlLCBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciB9IGZyb20gXCIuL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciwgY3JlYXRlQ29tbWVyY2lhbExpY2Vuc2VMaW5rIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IElWaXN1YWxpemVyUGFuZWxFbGVtZW50LCBJU3RhdGUsIElQZXJtaXNzaW9uIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBGaWx0ZXJJbmZvIH0gZnJvbSBcIi4vZmlsdGVySW5mb1wiO1xuaW1wb3J0IHsgTGF5b3V0RW5naW5lLCBNdXVyaUxheW91dEVuZ2luZSB9IGZyb20gXCIuL2xheW91dEVuZ2luZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5cbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi92aXN1YWxpemF0aW9uUGFuZWwuc2Nzc1wiKTtcblxuY29uc3QgcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lID0gXCJzYS1xdWVzdGlvblwiO1xuY29uc3QgcXVlc3Rpb25MYXlvdXRlZEVsZW1lbnRDbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uLWxheW91dGVkXCI7XG5cbmlmICghIWRvY3VtZW50KSB7XG4gIGNvbnN0IHN2Z1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9zdmdidW5kbGUuaHRtbFwiKTtcbiAgY29uc3QgdGVtcGxhdGVIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB0ZW1wbGF0ZUhvbGRlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIHRlbXBsYXRlSG9sZGVyLmlubmVySFRNTCA9IHN2Z1RlbXBsYXRlO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRlbXBsYXRlSG9sZGVyKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50XG4gIGV4dGVuZHMgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQge1xuICByZW5kZXJlZEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBWaXN1YWxpemF0aW9uIFBhbmVsIGNvbmZpZ3VyYXRpb24uIFBhc3MgaXQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpIGNvbnN0cnVjdG9yOlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWwgfSBmcm9tIFwic3VydmV5LWFuYWx5dGljc1wiO1xuICpcbiAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChcbiAqICAgc3VydmV5UXVlc3Rpb25zLFxuICogICBzdXJ2ZXlSZXN1bHRzLFxuICogICB2aXpQYW5lbE9wdGlvbnNcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucyB7XG4gIC8vIEFuIG9iamVjdCBuYW1lZCBhZnRlciBhIHF1ZXN0aW9uIHRoYXQgaXQgY29uZmlndXJlcy5cbiAgLy8gcXVlc3Rpb25OYW1lOiB7XG4gIC8vICAgaW50ZXJ2YWxzOiBbXVxuICAvLyB9LFxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGxhYmVsIGNoYXJhY3RlcnMgYWZ0ZXIgd2hpY2ggdHJ1bmNhdGlvbiBzdGFydHMuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIC0xIHRvIGRpc2FibGUgdHJ1bmNhdGlvbi5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogMjdcbiAgICovXG4gIGxhYmVsVHJ1bmNhdGVMZW5ndGg/OiBudW1iZXI7XG5cbiAgYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZT86IGJvb2xlYW47XG5cbiAgc2VyaWVzVmFsdWVzPzogc3RyaW5nW107XG4gIHNlcmllc0xhYmVscz86IHN0cmluZ1tdO1xuICB1c2VWYWx1ZXNBc0xhYmVscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhc3MgYSBzdXJ2ZXkgaW5zdGFuY2UgdG8gdXNlIHN1cnZleSBsb2NhbGVzIGluIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKi9cbiAgc3VydmV5PzogU3VydmV5TW9kZWw7XG4gIC8qKlxuICAgKiBBIGNvbW1vbiBkYXRhIHByb3ZpZGVyIGZvciBhbGwgdmlzdWFsaXplcnMuXG4gICAqL1xuICBkYXRhUHJvdmlkZXI/OiBEYXRhUHJvdmlkZXI7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXR5IG9mIGluZGl2aWR1YWwgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBIaWRlIGJ1dHRvbiB0byBlYWNoIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93SGlkZVF1ZXN0aW9ucz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcnJhbmdlIGNoYXJ0cyBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzcGFjZSBhbmQgYWxsb3cgdXNlcnMgdG8gcmVvcmRlciB0aGVtIHZpYSBkcmFnIGFuZCBkcm9wLlxuICAgKlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGRpc2FibGVkLCBjaGFydHMgYXJlIGRpc3BsYXllZCBvbmUgdW5kZXIgYW5vdGhlciwgYW5kIHVzZXJzIGNhbm5vdCBkcmFnIGFuZCBkcm9wIHRoZW0uIElmIHlvdSB3YW50IHRvIGRpc2FibGUgb25seSBkcmFnIGFuZCBkcm9wLCBzZXQgdGhlIFtgYWxsb3dEcmFnRHJvcGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGB0cnVlYFxuICAgKlxuICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy9jdXN0b20tbGF5b3V0LyAobGlua1N0eWxlKSlcbiAgICogQHNlZSBsYXlvdXRFbmdpbmVcbiAgICovXG4gIGFsbG93RHluYW1pY0xheW91dD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB1c2VycyBjYW4gZHJhZyBhbmQgZHJvcCBjaGFydHMuIEFwcGxpZXMgb25seSBpZiBbYGFsbG93RHluYW1pY0xheW91dGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIGlzIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqIEBzZWUgbGF5b3V0RW5naW5lXG4gICAqL1xuICBhbGxvd0RyYWdEcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgbGF5b3V0IGVuZ2luZSB1c2VkIHRvIGFycmFuZ2UgY2hhcnRzIG9uIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGludGVncmF0ZSBhIHRoaXJkLXBhcnR5IGxheW91dCBlbmdpbmUgd2l0aCBTdXJ2ZXlKUyBEYXNoYm9hcmQuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dEeW5hbWljTGF5b3V0XG4gICAqL1xuICBsYXlvdXRFbmdpbmU/OiBMYXlvdXRFbmdpbmU7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc3dpdGNoIGJldHdlZW4gYWJzb2x1dGUgYW5kIHBlcmNlbnRhZ2UgdmFsdWVzIGluIGJhciBjaGFydHMuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgYWRkcyBhIFNob3cgUGVyY2VudGFnZXMgYnV0dG9uIHRvIGVhY2ggYmFyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgc2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgc2hvd09ubHlQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIGFsbG93U2hvd1BlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGJhciBjaGFydHMgZGlzcGxheSBwZXJjZW50YWdlcyBpbiBhZGRpdGlvbiB0byBhYnNvbHV0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dTaG93UGVyY2VudGFnZXNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqIEBzZWUgcGVyY2VudGFnZVByZWNpc2lvblxuICAgKi9cbiAgc2hvd1BlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGJhciBjaGFydHMgZGlzcGxheSBvbmx5IHBlcmNlbnRhZ2VzLCB3aXRob3V0IGFic29sdXRlIHZhbHVlcy5cbiAgICpcbiAgICogQXBwbGllcyBvbmx5IGlmIHRoZSBgYWxsb3dTaG93UGVyY2VudGFnZXNgIG9yIGBzaG93UGVyY2VudGFnZXNgIHByb3BlcnR5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICpcbiAgICogQHNlZSBhbGxvd1Nob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHNob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIHNob3dPbmx5UGVyY2VudGFnZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHBlcmNlbnRhZ2UgcHJlY2lzaW9uLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiAwXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqL1xuICBwZXJjZW50YWdlUHJlY2lzaW9uPzogbnVtYmVyO1xuICBoYXZlQ29tbWVyY2lhbExpY2Vuc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNvcnQgYW5zd2VycyBieSBhbnN3ZXIgY291bnQuIEFwcGxpZXMgb25seSB0byBiYXIgYW5kIHNjYXR0ZXIgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTb3J0aW5nIGRyb3Bkb3duIHRvIGVhY2ggYmFyIGFuZCBzY2F0dGVyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICpcbiAgICogQHNlZSBhbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdG8gc29ydCBhbnN3ZXJzIGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczpcbiAgICpcbiAgICogLSBgXCJkZWZhdWx0XCJgIChkZWZhdWx0KSAtIERvIG5vdCBzb3J0IGFuc3dlcnMuXG4gICAqIC0gYFwiYXNjXCJgIC0gU29ydCBhbnN3ZXJzIGJ5IGFzY2VuZGluZyBhbnN3ZXIgY291bnQuXG4gICAqIC0gYFwiZGVzY1wiYCAtIFNvcnQgYW5zd2VycyBieSBkZXNjZW5kaW5nIGFuc3dlciBjb3VudC5cbiAgICpcbiAgICogVXNlcnMgY2FuIGNoYW5nZSB0aGlzIHByb3BlcnR5IHZhbHVlIGlmIHlvdSBlbmFibGUgdGhlIGBhbGxvd0NoYW5nZUFuc3dlcnNPcmRlcmAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFuc3dlcnNPcmRlcj86IFwiZGVmYXVsdFwiIHwgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIGhpZGUgYW5zd2VycyB3aXRoIHplcm8gY291bnQgaW4gYmFyIGFuZCBzY2F0dGVyIGNoYXJ0cy5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBhZGRzIGEgSGlkZSBFbXB0eSBBbnN3ZXJzIGJ1dHRvbiB0byBlYWNoIGJhciBhbmQgc2NhdHRlciBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEhpZGVzIGFuc3dlcnMgd2l0aCB6ZXJvIGNvdW50IGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiBAc2VlIGFsbG93SGlkZUVtcHR5QW5zd2Vyc1xuICAgKi9cbiAgaGlkZUVtcHR5QW5zd2Vycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IHdoZXRoZXIgdG8gc2hvdyB0b3AgNSwgMTAsIG9yIDIwIGFuc3dlcnMgYnkgYW5zd2VyIGNvdW50LlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUb3AgTiBBbnN3ZXJzIGRyb3Bkb3duIHRvIGVhY2ggY2hhcnQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VG9wTkFuc3dlcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNob3cgdGhlIG51bWJlciBvZiByZXNwb25kZW50cyB3aG8gZGlkIG5vdCBhbnN3ZXIgYSBwYXJ0aWN1bGFyIHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTaG93IE1pc3NpbmcgQW5zd2VycyBidXR0b24gdG8gZWFjaCBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dTaG93TWlzc2luZ0Fuc3dlcnM/OiBib29sZWFuO1xuXG4gIGFsbG93RXhwZXJpbWVudGFsRmVhdHVyZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVmYXVsdCBjaGFydCB0eXBlLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBxdWVzdGlvbiB0eXBlIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqIC0gQm9vbGVhbjogYFwiYmFyXCJgIHwgYFwicGllXCJgIHwgYFwiZG91Z2hudXRcImBcbiAgICogLSBEYXRlLCBOdW1iZXI6IGBcImJhclwiYCB8IGBcInNjYXR0ZXJcImBcbiAgICogLSBNYXRyaXg6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic3RhY2tlZGJhclwiYFxuICAgKiAtIFJhdGluZzogYFwiYmFyXCJgIHwgYFwic2NhdHRlclwiYCB8IGBcImdhdWdlXCJgIHwgYFwiYnVsbGV0XCJgXG4gICAqIC0gUmFkaW9ncm91cCwgQ2hlY2tib3gsIERyb3Bkb3duLCBJbWFnZSBQaWNrZXI6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic2NhdHRlclwiYFxuICAgKlxuICAgKiBUbyBzZXQgYSB0eXBlIGZvciBhbiBpbmRpdmlkdWFsIGNoYXJ0LCBhY2Nlc3MgdGhpcyBjaGFydCBpbiB0aGUgYHZpc3VhbGl6ZXJzYCBhcnJheSBhbmQgc2V0IGl0cyBgY2hhcnRUeXBlYCBwcm9wZXJ0eSB0byBvbmUgb2YgdGhlIHZhbHVlcyBkZXNjcmliZWQgYWJvdmU6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFN1cnZleUFuYWx5dGljcy5WaXN1YWxpemF0aW9uUGFuZWwoIC4uLiApO1xuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5jaGFydFR5cGUgPSBcInN0YWNrZWRiYXJcIjtcbiAgICogYGBgXG4gICAqXG4gICAqL1xuICBkZWZhdWx0Q2hhcnRUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHRyYW5zcG9zZSBhIHZpc3VhbGl6ZWQgbWF0cml4IHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUcmFuc3Bvc2UgYnV0dG9uIHRvIGNoYXJ0cyB0aGF0IHZpc3VhbGl6ZSBtYXRyaXhlcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIFZhbHVlcywgbWF0cml4IHJvd3MgZ28gdG8gY2hhcnQgYXJndW1lbnRzIGFuZCBtYXRyaXggY29sdW1ucyBmb3JtIGNoYXJ0IHNlcmllcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIENvbHVtbnMsIG1hdHJpeCByb3dzIGZvcm0gY2hhcnQgc2VyaWVzIGFuZCBtYXRyaXggY29sdW1ucyBnbyB0byBjaGFydCBhcmd1bWVudHMuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VHJhbnNwb3NlRGF0YT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY3Jvc3MtZmlsdGVyIGNoYXJ0cy4gVGhlIGZpbHRlciBhcHBsaWVzIHdoZW4gdXNlcnMgc2VsZWN0IGEgc2VyaWVzIHBvaW50LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93U2VsZWN0aW9uPzogYm9vbGVhbjtcblxuICByZW5kZXJDb250ZW50PzogRnVuY3Rpb247XG4gIGRlc3Ryb3lDb250ZW50PzogRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgSFRNTCB0YWdzIGZyb20gc3VydmV5IGVsZW1lbnQgdGl0bGVzLlxuICAgKlxuICAgKiBTdXJ2ZXkgZWxlbWVudCB0aXRsZXMgY2FuIGNvbnRhaW4gSFRNTCBtYXJrdXAgYW5kIGFyZSBzcGVjaWZpZWQgYnkgdXNlcnMuIEFuIGF0dGFja2VyIGNhbiBpbmplY3QgbWFsaWNpb3VzIGNvZGUgaW50byB0aGUgdGl0bGVzLiBUbyBndWFyZCBhZ2FpbnN0IGl0LCBrZWVwIHRoaXMgcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqL1xuICBzdHJpcEh0bWxGcm9tVGl0bGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCB2aXN1YWxpemVzIHN1cnZleSByZXN1bHRzIGFuZCBhbGxvd3MgdXNlcnMgdG8gYW5hbHl6ZSB0aGVtLlxuICpcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnM6XG4gKlxuICogLSBgcXVlc3Rpb25zYDogQXJyYXlcXDxbYFF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uKVxcPlxcXG4gKiBTdXJ2ZXkgcXVlc3Rpb25zIHRvIHZpc3VhbGl6ZS4gQ2FsbCBgU3VydmV5TW9kZWxgJ3MgW2BnZXRBbGxRdWVzdGlvbnMoKWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXktZGF0YS1tb2RlbCNnZXRRdWVzdGlvbkJ5TmFtZSkgbWV0aG9kIHRvIGFjY2VzcyBhbGwgc3VydmV5IHF1ZXN0aW9ucyBhbmQgcGFzcyBpdHMgcmVzdWx0IGFzIHRoZSBgcXVlc3Rpb25zYCBwYXJhbWV0ZXIuXG4gKiAtIGBkYXRhYDogYEFycmF5PGFueT5gXFxcbiAqIFN1cnZleSByZXN1bHRzLlxuICogLSBgdml6UGFuZWxPcHRpb25zYDogW2BJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucylcXFxuICogVmlzdWFsaXphdGlvbiBQYW5lbCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2V4YW1wbGVzL2ludGVyYWN0aXZlLXN1cnZleS1kYXRhLWRhc2hib2FyZC8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uUGFuZWwgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB2aXN1YWxpemVyczogQXJyYXk8VmlzdWFsaXplckJhc2U+ID0gW107XG4gIHByaXZhdGUgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVuZGVyZWRRdWVzdGlvbnNDb3VudDogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uczogQXJyYXk8YW55PixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zID0ge30sXG4gICAgcHJpdmF0ZSBfZWxlbWVudHM6IEFycmF5PElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQ+ID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKG51bGwsIGRhdGEsIG9wdGlvbnMsIFwicGFuZWxcIik7XG5cbiAgICBjb25zdCBmID0gKDxhbnk+U3VydmV5Q29yZSkuaGFzTGljZW5zZTtcbiAgICB0aGlzLmhhdmVDb21tZXJjaWFsTGljZW5zZSA9ICghIWYgJiYgZig0KSkgfHxcbiAgICAgIFZpc3VhbGl6YXRpb25QYW5lbC5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgfHxcbiAgICAgICh0eXBlb2Ygb3B0aW9ucy5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLmhhdmVDb21tZXJjaWFsTGljZW5zZVxuICAgICAgICA6IGZhbHNlKTtcblxuICAgIHRoaXMuX2xheW91dEVuZ2luZSA9XG4gICAgICBvcHRpb25zLmxheW91dEVuZ2luZSB8fFxuICAgICAgbmV3IE11dXJpTGF5b3V0RW5naW5lKFxuICAgICAgICB0aGlzLmFsbG93RHluYW1pY0xheW91dCxcbiAgICAgICAgXCIuXCIgKyBxdWVzdGlvbkxheW91dGVkRWxlbWVudENsYXNzTmFtZSxcbiAgICAgICAgdGhpcy5hbGxvd0RyYWdEcm9wXG4gICAgICApO1xuICAgIHRoaXMuX2xheW91dEVuZ2luZS5vbk1vdmVDYWxsYmFjayA9IChvcmRlcjogQXJyYXk8c3RyaW5nPikgPT5cbiAgICAgIHRoaXMucmVvcmRlclZpc2libGVFbGVtZW50cyhvcmRlcik7XG5cbiAgICB0aGlzLnNob3dUb29sYmFyID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnN1cnZleSkge1xuICAgICAgbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSB0aGlzLm9wdGlvbnMuc3VydmV5LmxvY2FsZTtcbiAgICB9XG5cbiAgICBpZiAoX2VsZW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnRzID0gdGhpcy5idWlsZEVsZW1lbnRzKHF1ZXN0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZFZpc3VhbGl6ZXJzKHF1ZXN0aW9ucyk7XG5cbiAgICBpZiAoIXRoaXMuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjb21tZXJjaWFsTGljZW5zZVwiLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVDb21tZXJjaWFsTGljZW5zZUxpbmsoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcInJlc2V0RmlsdGVyXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIFNlbGVjdEJhc2UgfHwgdmlzdWFsaXplciBpbnN0YW5jZW9mIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyKSB7XG4gICAgICAgICAgICB2aXN1YWxpemVyLnNldFNlbGVjdGlvbih1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVzZXRGaWx0ZXJcIikpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiYWRkRWxlbWVudFwiLCAodG9vbGJhcjogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmFsbG93SGlkZVF1ZXN0aW9ucykge1xuICAgICAgICBsZXQgYWRkRWxlbWVudFNlbGVjdG9yOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYWRkRWxlbWVudFNlbGVjdG9yVXBkYXRlciA9IChcbiAgICAgICAgICBwYW5lbDogVmlzdWFsaXphdGlvblBhbmVsLFxuICAgICAgICAgIG9wdGlvbnM6IGFueVxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBoaWRkZW5FbGVtZW50cyA9IHRoaXMuaGlkZGVuRWxlbWVudHM7XG4gICAgICAgICAgaWYgKGhpZGRlbkVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIDxhbnk+e1xuICAgICAgICAgICAgICAgICAgbmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRFbGVtZW50XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuY29uY2F0KGhpZGRlbkVsZW1lbnRzKVxuICAgICAgICAgICAgICAgIC5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGVsZW1lbnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IGZhbHNlLFxuICAgICAgICAgICAgICAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RWxlbWVudChlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAoYWRkRWxlbWVudFNlbGVjdG9yICYmXG4gICAgICAgICAgICAgIHRvb2xiYXIucmVwbGFjZUNoaWxkKHNlbGVjdFdyYXBwZXIsIGFkZEVsZW1lbnRTZWxlY3RvcikpIHx8XG4gICAgICAgICAgICAgIHRvb2xiYXIuYXBwZW5kQ2hpbGQoc2VsZWN0V3JhcHBlcik7XG4gICAgICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3IgPSBzZWxlY3RXcmFwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3IgJiYgdG9vbGJhci5yZW1vdmVDaGlsZChhZGRFbGVtZW50U2VsZWN0b3IpO1xuICAgICAgICAgICAgYWRkRWxlbWVudFNlbGVjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYWRkRWxlbWVudFNlbGVjdG9yVXBkYXRlcih0aGlzLCB7fSk7XG4gICAgICAgIHRoaXMub25WaXNpYmxlRWxlbWVudHNDaGFuZ2VkLmFkZChhZGRFbGVtZW50U2VsZWN0b3JVcGRhdGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsZVN3aXRjaCAmJiB0aGlzLmxvY2FsZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbG9jYWxlQ2hvaWNlcyA9IHRoaXMubG9jYWxlcy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogZWxlbWVudCxcbiAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbZWxlbWVudF0gfHwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhlbGVtZW50KSB8fCBlbGVtZW50XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIC8vIGxvY2FsZUNob2ljZXMudW5zaGlmdCh7XG4gICAgICAvLyAgIHZhbHVlOiBcIlwiLFxuICAgICAgLy8gICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhbmdlTG9jYWxlXCIpLFxuICAgICAgLy8gfSk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VMb2NhbGVcIiwgKCkgPT4ge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IobG9jYWxlQ2hvaWNlcyxcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+ICEhb3B0aW9uLnZhbHVlICYmICh0aGlzLmxvY2FsZSB8fCBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZSkgPT09IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB2YXIgbmV3TG9jYWxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVvcmRlclZpc2libGVFbGVtZW50cyhvcmRlcjogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXdFbGVtZW50cyA9IFtdO1xuICAgIG9yZGVyLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICBuZXdFbGVtZW50cy5wdXNoKHRoaXMuX2VsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5uYW1lID09PSBuYW1lKVswXSk7XG4gICAgfSk7XG4gICAgdGhpcy5fZWxlbWVudHMgPSBuZXdFbGVtZW50cztcbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQodW5kZWZpbmVkLCBcIlJFT1JERVJFRFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgb25BZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2sgPSAoXG4gICAgc2VuZGVyOiBWaXN1YWxpemVyQmFzZSxcbiAgICBvcHRpb25zOiBhbnlcbiAgKSA9PiB7XG4gICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uc0NvdW50Kys7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRRdWVzdGlvbnNDb3VudCA9PSB0aGlzLnF1ZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbnNDb3VudCA9IDA7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgb25TdGF0ZUNoYW5nZWRDYWxsYmFjayA9IChcbiAgICBzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLFxuICAgIG9wdGlvbnM6IGFueVxuICApID0+IHtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChzZW5kZXIucXVlc3Rpb24/Lm5hbWUsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIGEgdXNlciBzZWxlY3RzIGEgZGlmZmVyZW50IHZpc3VhbGl6ZXIgdHlwZSBmcm9tIHRoZSBUeXBlIGRyb3AtZG93biBtZW51LlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXJgXFxcbiAgICogQW4gb2JqZWN0IHRoYXQgY29udHJvbHMgYWx0ZW5hdGl2ZSB2aXN1YWxpemVycy5cbiAgICpcbiAgICogLSBgb3B0aW9ucy52aXN1YWxpemVyYDogYFZpc3VhbGl6ZXJCYXNlYFxcXG4gICAqIEFuIGFwcGxpZWQgdmlzdWFsaXplci5cbiAgICoqL1xuICBwdWJsaWMgb25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciwgYW55PigpO1xuXG4gIHByaXZhdGUgb25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkQ2FsbGJhY2sgPSAoXG4gICAgc2VuZGVyOiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlcixcbiAgICBvcHRpb25zOiB7IHZpc3VhbGl6ZXI6IFZpc3VhbGl6ZXJCYXNlIH1cbiAgKSA9PiB7XG4gICAgdGhpcy5vbkFsdGVybmF0aXZlVmlzdWFsaXplckNoYW5nZWQuZmlyZShzZW5kZXIsIG9wdGlvbnMpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBzaG93RWxlbWVudENvcmUoZWxlbWVudDogSVZpc3VhbGl6ZXJQYW5lbFJlbmRlcmVkRWxlbWVudCwgZWxlbWVudEluZGV4ID0gLTEpOiB2b2lkIHtcbiAgICBlbGVtZW50LmlzVmlzaWJsZSA9IHRydWU7XG4gICAgY29uc3QgcXVlc3Rpb25FbGVtZW50ID0gdGhpcy5yZW5kZXJQYW5lbEVsZW1lbnQoXG4gICAgICBlbGVtZW50LFxuICAgICAgdGhpcy5jb250ZW50Q29udGFpbmVyXG4gICAgKTtcbiAgICBsZXQgb3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICBpZihlbGVtZW50SW5kZXggPj0gMCkge1xuICAgICAgb3B0aW9ucyA9IHsgaW5kZXg6IGVsZW1lbnRJbmRleCB9O1xuICAgIH1cbiAgICB0aGlzLmxheW91dEVuZ2luZS5hZGQoW3F1ZXN0aW9uRWxlbWVudF0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNob3dFbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KGVsZW1lbnROYW1lKTtcbiAgICBjb25zdCBlbGVtZW50SW5kZXggPSB0aGlzLl9lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIHRoaXMuc2hvd0VsZW1lbnRDb3JlKGVsZW1lbnQsIGVsZW1lbnRJbmRleCk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKGVsZW1lbnQsIFwiQURERURcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGlkZUVsZW1lbnRDb3JlKGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIGlmICghIWVsZW1lbnQucmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLmxheW91dEVuZ2luZS5yZW1vdmUoW2VsZW1lbnQucmVuZGVyZWRFbGVtZW50XSk7XG4gICAgICB0aGlzLmNvbnRlbnRDb250YWluZXIucmVtb3ZlQ2hpbGQoZWxlbWVudC5yZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgZWxlbWVudC5yZW5kZXJlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhpZGVFbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KGVsZW1lbnROYW1lKTtcbiAgICB0aGlzLmhpZGVFbGVtZW50Q29yZShlbGVtZW50KTtcbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQoZWxlbWVudCwgXCJSRU1PVkVEXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIGFsbCBwYW5lbCBlbGVtZW50cy4gVXNlcnMgY2FuIHNlbGVjdCB0aGUgZWxlbWVudHMgdGhleSB3YW50IHRvIHNob3cgZnJvbSBhIGRyb3AtZG93biBtZW51LlxuICAgKiBAc2VlIHNob3dBbGxFbGVtZW50c1xuICAgKiBAc2VlIGFsbG93SGlkZVF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIGhpZGVBbGxFbGVtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBhZmZlY3RlZEVsZW1lbnRzID0gW107XG4gICAgdGhpcy5fZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmKGVsZW1lbnQuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuaGlkZUVsZW1lbnRDb3JlKGVsZW1lbnQpO1xuICAgICAgICBhZmZlY3RlZEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKHVuZGVmaW5lZCwgXCJSRU1PVkVEQUxMXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGFsbCBwYW5lbCBlbGVtZW50cyBpZiB0aGV5IGFyZSBoaWRkZW4gdG8gYSBkcm9wLWRvd24gbWVudS5cbiAgICogQHNlZSBoaWRlQWxsRWxlbWVudHNcbiAgICogQHNlZSBhbGxvd0hpZGVRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzaG93QWxsRWxlbWVudHMoKSB7XG4gICAgY29uc3QgYWZmZWN0ZWRFbGVtZW50cyA9IFtdO1xuICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZighZWxlbWVudC5pc1Zpc2libGUpIHtcbiAgICAgICAgdGhpcy5zaG93RWxlbWVudENvcmUoZWxlbWVudCk7XG4gICAgICAgIGFmZmVjdGVkRWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQodW5kZWZpbmVkLCBcIkFEREVEREFMTFwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYWtlRWxlbWVudFByaXZhdGUoZWxlbWVudDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmlzUHVibGljID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJpc1B1YmxpY1wiLCBmYWxzZSk7XG4gICAgdGhpcy5vblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrICYmXG4gICAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFrZUVsZW1lbnRQdWJsaWMoZWxlbWVudDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmlzUHVibGljID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImlzUHVibGljXCIsIHRydWUpO1xuICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayAmJlxuICAgICAgdGhpcy5vblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vdmVWaXNpYmxlRWxlbWVudChcbiAgICBmcm9tVmlzaWJsZUluZGV4OiBudW1iZXIsXG4gICAgdG9WaXNpYmxlSW5kZXg6IG51bWJlclxuICApIHtcbiAgICBsZXQgZnJvbUluZGV4LCB0b0luZGV4O1xuXG4gICAgbGV0IGZyb21WaXNpYmxlSW5kZXhFbGVtZW50ID0gdGhpcy52aXNpYmxlRWxlbWVudHNbZnJvbVZpc2libGVJbmRleF07XG4gICAgbGV0IHRvVmlzaWJsZUluZGV4RWxlbWVudCA9IHRoaXMudmlzaWJsZUVsZW1lbnRzW3RvVmlzaWJsZUluZGV4XTtcblxuICAgIGZyb21JbmRleCA9IHRoaXMuX2VsZW1lbnRzLmluZGV4T2YoZnJvbVZpc2libGVJbmRleEVsZW1lbnQpO1xuICAgIHRvSW5kZXggPSB0aGlzLl9lbGVtZW50cy5pbmRleE9mKHRvVmlzaWJsZUluZGV4RWxlbWVudCk7XG5cbiAgICB0aGlzLm1vdmVFbGVtZW50KGZyb21JbmRleCwgdG9JbmRleCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW92ZUVsZW1lbnQoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuX2VsZW1lbnRzLnNwbGljZShmcm9tSW5kZXgsIDEpO1xuICAgIHRoaXMuX2VsZW1lbnRzLnNwbGljZSh0b0luZGV4LCAwLCBlbGVtZW50c1swXSk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKGVsZW1lbnRzWzBdLCBcIk1PVkVEXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3I6IHN0cmluZykge1xuICAgIHN1cGVyLnNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3IpO1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCh2aXN1YWxpemVyID0+IHZpc3VhbGl6ZXIuYmFja2dyb3VuZENvbG9yID0gY29sb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZpc3VhbGl6ZXJzKHF1ZXN0aW9uczogQXJyYXk8UXVlc3Rpb24+KSB7XG4gICAgcXVlc3Rpb25zLmZvckVhY2goKHF1ZXN0aW9uKSA9PiB7XG4gICAgICBjb25zdCB2aXN1YWxpemVyID0gdGhpcy5jcmVhdGVWaXN1YWxpemVyKHF1ZXN0aW9uKTtcbiAgICAgIGlmKCF2aXN1YWxpemVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYWxsb3dIaWRlUXVlc3Rpb25zKSB7XG4gICAgICAgIHZpc3VhbGl6ZXIucmVnaXN0ZXJUb29sYmFySXRlbShcInJlbW92ZVF1ZXN0aW9uXCIsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oaWRlRWxlbWVudChxdWVzdGlvbi5uYW1lKSwgMCk7XG4gICAgICAgICAgfSwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVCdXR0b25cIikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZSkge1xuICAgICAgICB2aXN1YWxpemVyLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJtYWtlUHJpdmF0ZVB1YmxpY1wiLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChxdWVzdGlvbi5uYW1lKTtcblxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gZWxlbWVudC5pc1B1YmxpYyA/IFwiZmlyc3RcIiA6IFwic2Vjb25kXCI7XG5cbiAgICAgICAgICBjb25zdCBwYXRoTWFrZVByaXZhdGVTdmcgPSBcIm1ha2Vwcml2YXRlXCI7XG4gICAgICAgICAgY29uc3QgcGF0aE1ha2VQdWJsaWNTdmcgPSBcIm1ha2VwdWJsaWNcIjtcbiAgICAgICAgICBjb25zdCBtYWtlUHJpdmF0ZVRpdGxlID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1ha2VQcml2YXRlQnV0dG9uXCIpO1xuICAgICAgICAgIGNvbnN0IG1ha2VQdWJsaWNUaXRsZSA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYWtlUHVibGljQnV0dG9uXCIpO1xuICAgICAgICAgIGNvbnN0IGRvUHJpdmF0ZSA9IChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5tYWtlRWxlbWVudFByaXZhdGUoZWxlbWVudCksIDApO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZG9QdWJsaWMgPSAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubWFrZUVsZW1lbnRQdWJsaWMoZWxlbWVudCksIDApO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU3ZnVG9nZ2xlQnV0dG9uKFxuICAgICAgICAgICAgcGF0aE1ha2VQdWJsaWNTdmcsXG4gICAgICAgICAgICBwYXRoTWFrZVByaXZhdGVTdmcsXG4gICAgICAgICAgICBtYWtlUHJpdmF0ZVRpdGxlLFxuICAgICAgICAgICAgbWFrZVB1YmxpY1RpdGxlLFxuICAgICAgICAgICAgZG9QdWJsaWMsXG4gICAgICAgICAgICBkb1ByaXZhdGUsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodmlzdWFsaXplci5zdXBwb3J0U2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uID0gPElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbj4oXG4gICAgICAgICAgKDxhbnk+dmlzdWFsaXplcilcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGZpbHRlckluZm8gPSBuZXcgRmlsdGVySW5mbyh2aXN1YWxpemVyV2l0aFNlbGVjdGlvbik7XG5cbiAgICAgICAgdmlzdWFsaXplci5yZWdpc3RlclRvb2xiYXJJdGVtKFwicXVlc3Rpb25GaWx0ZXJJbmZvXCIsICgpID0+IHtcbiAgICAgICAgICBmaWx0ZXJJbmZvLnVwZGF0ZSh2aXN1YWxpemVyV2l0aFNlbGVjdGlvbi5zZWxlY3Rpb24pO1xuICAgICAgICAgIHJldHVybiBmaWx0ZXJJbmZvLmh0bWxFbGVtZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICB2aXN1YWxpemVyV2l0aFNlbGVjdGlvbi5vbkRhdGFJdGVtU2VsZWN0ZWQgPSAoXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZTogYW55LFxuICAgICAgICAgIHNlbGVjdGVkVGV4dDogc3RyaW5nXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGZpbHRlckluZm8udXBkYXRlKHsgdmFsdWU6IHNlbGVjdGVkVmFsdWUsIHRleHQ6IHNlbGVjdGVkVGV4dCB9KTtcbiAgICAgICAgICB0aGlzLnNldEZpbHRlcihxdWVzdGlvbi5uYW1lLCBzZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmlzdWFsaXplci5vblVwZGF0ZSA9ICgpID0+IHRoaXMubGF5b3V0KCk7XG4gICAgICB2aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5vblN0YXRlQ2hhbmdlZC5hZGQodGhpcy5vblN0YXRlQ2hhbmdlZENhbGxiYWNrKTtcblxuICAgICAgaWYgKHZpc3VhbGl6ZXIgaW5zdGFuY2VvZiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlcikge1xuICAgICAgICB2aXN1YWxpemVyLm9uVmlzdWFsaXplckNoYW5nZWQuYWRkKHRoaXMub25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpc3VhbGl6ZXJzLnB1c2godmlzdWFsaXplcik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaXN1YWxpemVycygpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIFNlbGVjdEJhc2UpIHtcbiAgICAgICAgdmlzdWFsaXplci5vbkRhdGFJdGVtU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyKSB7XG4gICAgICAgIHZpc3VhbGl6ZXIub25WaXN1YWxpemVyQ2hhbmdlZC5yZW1vdmUodGhpcy5vbkFsdGVybmF0aXZlVmlzdWFsaXplckNoYW5nZWRDYWxsYmFjayk7XG4gICAgICB9XG4gICAgICB2aXN1YWxpemVyLm9uU3RhdGVDaGFuZ2VkLnJlbW92ZSh0aGlzLm9uU3RhdGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrKTtcbiAgICAgIHZpc3VhbGl6ZXIuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIHRoaXMudmlzdWFsaXplcnMgPSBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRMb2NhbGUobmV3TG9jYWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICAodGhpcy5xdWVzdGlvbnMgfHwgW10pLmZvckVhY2goKHF1ZXN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHF1ZXN0aW9uLm5hbWUpO1xuICAgICAgaWYgKCEhZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmRpc3BsYXlOYW1lID0gdGhpcy5wcm9jZXNzVGV4dChxdWVzdGlvbi50aXRsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKHYgPT4ge1xuICAgICAgdi5vcHRpb25zLnNlcmllc0xhYmVscyA9IHRoaXMub3B0aW9ucy5zZXJpZXNMYWJlbHM7XG4gICAgICB2LmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvY2FsZVwiLCBuZXdMb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFtgYWxsb3dEeW5hbWljTGF5b3V0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zI2FsbG93RHluYW1pY0xheW91dCkgcHJvcGVydHkgdmFsdWUgb2YgdGhlIFtgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dEeW5hbWljTGF5b3V0KCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0R5bmFtaWNMYXlvdXQgPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFtgYWxsb3dEcmFnRHJvcGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0RyYWdEcm9wKSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgW2BJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucykgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0RyYWdEcm9wKCkge1xuICAgIGlmKFN1cnZleUNvcmUuSXNUb3VjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93RHJhZ0Ryb3AgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93RHJhZ0Ryb3AgPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFtgYWxsb3dIaWRlUXVlc3Rpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zI2FsbG93SGlkZVF1ZXN0aW9ucykgcHJvcGVydHkgdmFsdWUgb2YgdGhlIFtgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dIaWRlUXVlc3Rpb25zKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dIaWRlUXVlc3Rpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0hpZGVRdWVzdGlvbnMgPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBhbGxvd01ha2VRdWVzdGlvbnNQcml2YXRlKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2xheW91dEVuZ2luZTogTGF5b3V0RW5naW5lO1xuICAvKipcbiAgICogUmV0dXJucyBhIFtgTGF5b3V0RW5naW5lYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2xheW91dGVuZ2luZSkgaW5zdGFuY2UgdXNlZCB0byBhcnJhbmdlIHZpc3VhbGl6YXRpb24gaXRlbXMgb24gYFZpc3VhbGl6YXRpb25QYW5lbGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxheW91dEVuZ2luZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5b3V0RW5naW5lO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRWxlbWVudHMocXVlc3Rpb25zOiBhbnlbXSk6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50W10ge1xuICAgIHJldHVybiAocXVlc3Rpb25zIHx8IFtdKS5tYXAoKHF1ZXN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogdGhpcy5wcm9jZXNzVGV4dChxdWVzdGlvbi50aXRsZSksXG4gICAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgaXNQdWJsaWM6IHRydWUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgW2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudCkgb2JqZWN0cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHZpc3VhbGl6YXRpb24gaXRlbXMuXG4gICAqIEBwYXJhbSBxdWVzdGlvbk5hbWVzIFF1ZXN0aW9uIFtuYW1lc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI25hbWUpLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciB0byBnZXQgYW4gYXJyYXkgb2YgYWxsIHZpc3VhbGl6YXRpb24gaXRlbXMuXG4gICAqIEBzZWUgdmlzaWJsZUVsZW1lbnRzXG4gICAqIEBzZWUgaGlkZGVuRWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50cyhxdWVzdGlvbk5hbWVzPzogQXJyYXk8c3RyaW5nPik6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50W10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICh0aGlzLl9lbGVtZW50cyB8fCBbXSkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYoIXF1ZXN0aW9uTmFtZXMgfHwgcXVlc3Rpb25OYW1lcy5pbmRleE9mKGVsZW1lbnQubmFtZSkgIT09IC0xKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgZGlzcGxheU5hbWU6IGVsZW1lbnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgaXNWaXNpYmxlOiBlbGVtZW50LmlzVmlzaWJsZSxcbiAgICAgICAgICBpc1B1YmxpYzogZWxlbWVudC5pc1B1YmxpYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpIG9iamVjdHMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50bHkgdmlzaWJsZSB2aXN1YWxpemF0aW9uIGl0ZW1zLlxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCB0byBkaXNhbGxvdyB1c2VycyB0byBoaWRlIHZpc3VhbGl6YXRpb24gaXRlbXMsIHNldCB0aGUgW2BhbGxvd0hpZGVRdWVzdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dIaWRlUXVlc3Rpb25zKSBwcm9wZXJ0eSB0byBgZmFsc2VgLlxuICAgKiBAc2VlIGhpZGRlbkVsZW1lbnRzXG4gICAqIEBzZWUgZ2V0RWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoKGVsOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkgPT4gZWwuaXNWaXNpYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpIG9iamVjdHMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50bHkgaGlkZGVuIHZpc3VhbGl6YXRpb24gaXRlbXMuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIGRpc2FsbG93IHVzZXJzIHRvIGhpZGUgdmlzdWFsaXphdGlvbiBpdGVtcywgc2V0IHRoZSBbYGFsbG93SGlkZVF1ZXN0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0hpZGVRdWVzdGlvbnMpIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqIEBzZWUgdmlzaWJsZUVsZW1lbnRzXG4gICAqIEBzZWUgZ2V0RWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZGVuRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcihcbiAgICAgIChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+ICFlbC5pc1Zpc2libGVcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBwdWJsaWNFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+IGVsLmlzUHVibGljKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJpdmF0ZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoKGVsOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkgPT4gIWVsLmlzUHVibGljKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbG9jYWxlcygpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnN1cnZleSkgcmV0dXJuIHRoaXMub3B0aW9ucy5zdXJ2ZXkuZ2V0VXNlZExvY2FsZXMoKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHZpc3VhbGl6YXRpb24gaXRlbSB3aXRoIGEgc3BlY2lmaWVkIHF1ZXN0aW9uIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gW25hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNuYW1lKS5cbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50KHF1ZXN0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcigoZWwpID0+IGVsLm5hbWUgPT09IHF1ZXN0aW9uTmFtZSlbMF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFt2aXN1YWxpemVyXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXplcmJhc2UpIHRoYXQgdmlzdWFsaXplcyBhIHNwZWNpZmllZCBzdXJ2ZXkgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSBxdWVzdGlvbk5hbWUgQSBxdWVzdGlvbiBbbmFtZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI25hbWUpLlxuICAgKi9cbiAgcHVibGljIGdldFZpc3VhbGl6ZXIocXVlc3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy52aXN1YWxpemVycy5maWx0ZXIoKHYpID0+IHYucXVlc3Rpb24ubmFtZSA9PT0gcXVlc3Rpb25OYW1lKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gVXNlIFtgb25FbGVtZW50U2hvd25gXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsI29uRWxlbWVudFNob3duKSwgW2BvbkVsZW1lbnRIaWRkZW5gXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsI29uRWxlbWVudEhpZGRlbiksIG9yIFtgb25FbGVtZW50TW92ZWRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsI29uRWxlbWVudE1vdmVkKSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIG9uVmlzaWJsZUVsZW1lbnRzQ2hhbmdlZCA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemF0aW9uUGFuZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBWaXN1YWxpemF0aW9uUGFuZWwsXG4gICAgYW55XG4gID4oKTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiB1c2VycyBbc2hvdyBhIHZpc3VhbGl6YXRpb24gaXRlbV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zI2FsbG93SGlkZVF1ZXN0aW9ucykuXG4gICAqXG4gICAqIFBhcmFtZXRlcnM6XG4gICAqXG4gICAqIC0gYHNlbmRlcmA6IFtgVmlzdWFsaXphdGlvblBhbmVsYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbClcXFxuICAgKiBBIGBWaXN1YWxpemF0aW9uUGFuZWxgIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5lbGVtZW50c2A6IEFycmF5XFw8W2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudClcXD5cXFxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhbGwgdmlzdWFsaXphdGlvbiBpdGVtcyByZW5kZXJlZCBieSB0aGlzIGBWaXN1YWxpemF0aW9uUGFuZWxgLlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmVsZW1lbnRgOiBbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KVxcXG4gICAqIEEgdmlzdWFsaXphdGlvbiBpdGVtIHRoYXQgaGFzIGJlZW4gc2hvd24uXG4gICAqL1xuICBwdWJsaWMgb25FbGVtZW50U2hvd24gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXphdGlvblBhbmVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXphdGlvblBhbmVsLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gdXNlcnMgW2hpZGUgYSB2aXN1YWxpemF0aW9uIGl0ZW1dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0hpZGVRdWVzdGlvbnMpLlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpXFxcbiAgICogQSBgVmlzdWFsaXphdGlvblBhbmVsYCB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudHNgOiBBcnJheVxcPFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFw+XFxcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgYWxsIHZpc3VhbGl6YXRpb24gaXRlbXMgcmVuZGVyZWQgYnkgdGhpcyBgVmlzdWFsaXphdGlvblBhbmVsYC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5lbGVtZW50YDogW2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudClcXFxuICAgKiBBIHZpc3VhbGl6YXRpb24gaXRlbSB0aGF0IGhhcyBiZWVuIGhpZGRlbi5cbiAgICovXG4gIHB1YmxpYyBvbkVsZW1lbnRIaWRkZW4gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXphdGlvblBhbmVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXphdGlvblBhbmVsLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gdXNlcnMgW21vdmUgYSB2aXN1YWxpemF0aW9uIGl0ZW1dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpLlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpXFxcbiAgICogQSBgVmlzdWFsaXphdGlvblBhbmVsYCB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudHNgOiBBcnJheVxcPFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFw+XFxcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgYWxsIHZpc3VhbGl6YXRpb24gaXRlbXMgcmVuZGVyZWQgYnkgdGhpcyBgVmlzdWFsaXphdGlvblBhbmVsYC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5lbGVtZW50YDogW2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudClcXFxuICAgKiBBIHZpc3VhbGl6YXRpb24gaXRlbSB0aGF0IGhhcyBiZWVuIG1vdmVkLlxuICAgKi9cbiAgcHVibGljIG9uRWxlbWVudE1vdmVkID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIHByb3RlY3RlZCB2aXNpYmxlRWxlbWVudHNDaGFuZ2VkKFxuICAgIGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50LFxuICAgIHJlYXNvbjogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmIChyZWFzb24gPT09IFwiU0hPV05cIiAmJiAhdGhpcy5vbkVsZW1lbnRTaG93bi5pc0VtcHR5KSB7XG4gICAgICB0aGlzLm9uRWxlbWVudFNob3duLmZpcmUodGhpcywge1xuICAgICAgICBlbGVtZW50czogdGhpcy5fZWxlbWVudHMsXG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocmVhc29uID09PSBcIlJFTU9WRURcIiAmJiAhdGhpcy5vbkVsZW1lbnRIaWRkZW4uaXNFbXB0eSkge1xuICAgICAgdGhpcy5vbkVsZW1lbnRIaWRkZW4uZmlyZSh0aGlzLCB7XG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLl9lbGVtZW50cyxcbiAgICAgICAgZWxlbWVudDogZWxlbWVudFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChyZWFzb24gPT09IFwiTU9WRURcIiAmJiAhdGhpcy5vbkVsZW1lbnRNb3ZlZC5pc0VtcHR5KSB7XG4gICAgICB0aGlzLm9uRWxlbWVudE1vdmVkLmZpcmUodGhpcywge1xuICAgICAgICBlbGVtZW50czogdGhpcy5fZWxlbWVudHMsXG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5vblZpc2libGVFbGVtZW50c0NoYW5nZWQuaXNFbXB0eSkge1xuICAgICAgdGhpcy5vblZpc2libGVFbGVtZW50c0NoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLl9lbGVtZW50cyxcbiAgICAgICAgY2hhbmdlZDogZWxlbWVudCxcbiAgICAgICAgcmVhc29uOiByZWFzb24sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJ2aXNpYmxlRWxlbWVudHNcIiwgcmVhc29uKTtcbiAgICB0aGlzLmxheW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2s6IGFueTtcblxuICBwcm90ZWN0ZWQgcmVuZGVyUGFuZWxFbGVtZW50KFxuICAgIGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQsXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuICApIHtcbiAgICBjb25zdCB2aXN1YWxpemVyID0gdGhpcy5nZXRWaXN1YWxpemVyKGVsZW1lbnQubmFtZSk7XG4gICAgaWYoIXZpc3VhbGl6ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVzdGlvbkVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHF1ZXN0aW9uRWxlbWVudC5kYXRhc2V0LnF1ZXN0aW9uID0gZWxlbWVudC5uYW1lO1xuXG4gICAgISFjb250YWluZXIgJiYgY29udGFpbmVyLmFwcGVuZENoaWxkKHF1ZXN0aW9uRWxlbWVudCk7XG5cbiAgICBjb25zdCBxdWVzdGlvbkNvbnRlbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnN0IHRpdGxlRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJoM1wiKTtcbiAgICBjb25zdCB2aXp1YWxpemVyRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0ID0gZWxlbWVudC5kaXNwbGF5TmFtZTtcblxuICAgIHF1ZXN0aW9uRWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLmFsbG93RHluYW1pY0xheW91dFxuICAgICAgPyBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWUgKyBcIiBcIiArIHF1ZXN0aW9uTGF5b3V0ZWRFbGVtZW50Q2xhc3NOYW1lXG4gICAgICA6IHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZTtcbiAgICB0aXRsZUVsZW1lbnQuY2xhc3NOYW1lID0gcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICsgXCJfX3RpdGxlXCI7XG4gICAgaWYgKHRoaXMuYWxsb3dEeW5hbWljTGF5b3V0ICYmIHRoaXMuYWxsb3dEcmFnRHJvcCkge1xuICAgICAgdGl0bGVFbGVtZW50LmNsYXNzTmFtZSA9XG4gICAgICAgIHRpdGxlRWxlbWVudC5jbGFzc05hbWUgK1xuICAgICAgICBcIiBcIiArXG4gICAgICAgIHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZSArXG4gICAgICAgIFwiX190aXRsZS0tZHJhZ2dhYmxlXCI7XG4gICAgfVxuICAgIHF1ZXN0aW9uQ29udGVudC5jbGFzc05hbWUgPSBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWUgKyBcIl9fY29udGVudFwiO1xuICAgIHF1ZXN0aW9uQ29udGVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcblxuICAgIHF1ZXN0aW9uQ29udGVudC5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xuICAgIHF1ZXN0aW9uQ29udGVudC5hcHBlbmRDaGlsZCh2aXp1YWxpemVyRWxlbWVudCk7XG4gICAgcXVlc3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKHF1ZXN0aW9uQ29udGVudCk7XG5cbiAgICB2aXN1YWxpemVyLnJlbmRlcih2aXp1YWxpemVyRWxlbWVudCk7XG5cbiAgICBlbGVtZW50LnJlbmRlcmVkRWxlbWVudCA9IHF1ZXN0aW9uRWxlbWVudDtcbiAgICByZXR1cm4gcXVlc3Rpb25FbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlclRvb2xiYXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgKz0gXCIgc2EtcGFuZWxfX2hlYWRlclwiO1xuICAgIHN1cGVyLnJlbmRlclRvb2xiYXIoY29udGFpbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuY2xhc3NOYW1lICs9IFwiIHNhLXBhbmVsX19jb250ZW50IHNhLWdyaWRcIjtcblxuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGxldCBxdWVzdGlvbkVsZW1lbnQgPSB0aGlzLnJlbmRlclBhbmVsRWxlbWVudChlbGVtZW50LCBjb250YWluZXIpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5sYXlvdXRFbmdpbmUuc3RhcnQoY29udGFpbmVyKTtcbiAgICAvLyAhIXdpbmRvdyAmJiB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgVUlFdmVudChcInJlc2l6ZVwiKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMubGF5b3V0RW5naW5lLnN0b3AoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhd3MgdGhlIGBWaXN1YWxpemF0aW9uUGFuZWxgIGFuZCBhbGwgaXRzIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpIHtcbiAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveVRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVyVG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgIH1cbiAgICBzdXBlci5yZWZyZXNoKCk7XG4gIH1cblxuICBwdWJsaWMgbGF5b3V0KCkge1xuICAgIHRoaXMubGF5b3V0RW5naW5lLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgdmlzdWFsaXplZCBkYXRhIGJhc2VkIG9uIGEgc3BlY2lmaWVkIHF1ZXN0aW9uIG5hbWUgYW5kIHZhbHVlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgY2xpY2tzIGEgY2hhcnQgcG9pbnQuXG4gICAqIEBwYXJhbSBxdWVzdGlvbk5hbWUgQSBxdWVzdGlvbiBbbmFtZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI25hbWUpLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRWYWx1ZVxuICAgKiBAc2VlIElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zLmFsbG93U2VsZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgc2V0RmlsdGVyKHF1ZXN0aW9uTmFtZTogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmRhdGFQcm92aWRlci5zZXRGaWx0ZXIocXVlc3Rpb25OYW1lLCBzZWxlY3RlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBJU3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgZWxlbWVudHM6IFtdLmNvbmNhdCh0aGlzLl9lbGVtZW50cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgIGNvbnN0IHZpc3VhbGl6ZXIgPSB0aGlzLmdldFZpc3VhbGl6ZXIoZWxlbWVudC5uYW1lKTtcbiAgICAgICAgY29uc3QgZWxlbWVudFN0YXRlID0geyAuLi5lbGVtZW50LCAuLi52aXN1YWxpemVyPy5nZXRTdGF0ZSgpIH07XG4gICAgICAgIGlmIChlbGVtZW50U3RhdGUucmVuZGVyZWRFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWxldGUgZWxlbWVudFN0YXRlLnJlbmRlcmVkRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFN0YXRlO1xuICAgICAgfSkpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0YXRlIG9mIGBWaXN1YWxpemF0aW9uUGFuZWxgLiBJbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlzdWFsaXplZCBlbGVtZW50cyBhbmQgY3VycmVudCBsb2NhbGUuXG4gICAqIEBzZWUgb25TdGF0ZUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogSVN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdGUobmV3U3RhdGU6IElTdGF0ZSkge1xuICAgIGlmICghbmV3U3RhdGUpIHJldHVybjtcbiAgICB0aGlzLl9zZXR0aW5nU3RhdGUgPSB0cnVlO1xuICAgIHRyeSB7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld1N0YXRlLmVsZW1lbnRzKSkge1xuICAgICAgICBjb25zdCBxdWVzdGlvbk5hbWVzID0gdGhpcy5xdWVzdGlvbnMubWFwKHEgPT4gcS5uYW1lKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQobmV3U3RhdGUuZWxlbWVudHMuZmlsdGVyKGUgPT4gKHF1ZXN0aW9uTmFtZXMuaW5kZXhPZihlLm5hbWUpICE9PSAtMSkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBuZXdTdGF0ZS5sb2NhbGUgIT09IFwidW5kZWZpbmVkXCIpIHRoaXMuc2V0TG9jYWxlKG5ld1N0YXRlLmxvY2FsZSk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudFN0YXRlID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuZ2V0VmlzdWFsaXplcihlbGVtZW50U3RhdGUubmFtZSk7XG4gICAgICAgIGlmICh2aXN1YWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2aXN1YWxpemVyLnNldFN0YXRlKGVsZW1lbnRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3NldHRpbmdTdGF0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnMoKTogSVBlcm1pc3Npb25bXSB7XG4gICAgcmV0dXJuIDxhbnk+dGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgIGlzUHVibGljOiBlbGVtZW50LmlzUHVibGljLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBJUGVybWlzc2lvbltdKSB7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnRzID0gdGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICBwZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uLm5hbWUgPT09IGVsZW1lbnQubmFtZSlcbiAgICAgICAgICBlbGVtZW50LmlzUHVibGljID0gcGVybWlzc2lvbi5pc1B1YmxpYztcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyAuLi5lbGVtZW50IH07XG4gICAgfSk7XG4gICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQodXBkYXRlZEVsZW1lbnRzKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuZGVzdHJveVZpc3VhbGl6ZXJzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbCB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsIElRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvblBhbmVsRHluYW1pYyBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHJvdGVjdGVkIF9wYW5lbFZpc3VhbGl6ZXI6IFZpc3VhbGl6YXRpb25QYW5lbCA9IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInBhbmVsRHluYW1pY1wiKTtcbiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID0gZmFsc2U7XG4gICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChcbiAgICAgIHRoaXMuZ2V0UXVlc3Rpb25zKCksXG4gICAgICBbXSxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrKTtcbiAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgb25BZnRlclJlbmRlclBhbmVsQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJwYW5lbER5bmFtaWNcIjtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFuZWxWaXN1YWxpemVyRGF0YSgpIHtcbiAgICBsZXQgcGFuZWxEYXRhOiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGRhdGFJdGVtKSA9PiB7XG4gICAgICBpZiAoZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhbmVsRGF0YSA9IHBhbmVsRGF0YS5jb25jYXQoZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLnVwZGF0ZURhdGEocGFuZWxEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgdGhpcy51cGRhdGVQYW5lbFZpc3VhbGl6ZXJEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVBhbmVsVmlzdWFsaXplckRhdGEoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKTogSVF1ZXN0aW9uW10ge1xuICAgIGNvbnN0IHBhbmVsZHluYW1pYzogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICByZXR1cm4gcGFuZWxkeW5hbWljLnRlbXBsYXRlLnF1ZXN0aW9ucztcbiAgfVxuXG4gIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIuY2xlYXIoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLnJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXG4gIFwicGFuZWxkeW5hbWljXCIsXG4gIFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWNcbik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25Db21tZW50TW9kZWwsIHNldHRpbmdzIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJRGF0YUluZm8sIERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckZhY3RvcnkgfSBmcm9tIFwiLi92aXN1YWxpemVyRmFjdG9yeVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxudmFyIHN0eWxlcyA9IHJlcXVpcmUoXCIuL3Zpc3VhbGl6ZXJCYXNlLnNjc3NcIik7XG5cbi8qKlxuICogQSBiYXNlIG9iamVjdCBmb3IgYWxsIHZpc3VhbGl6ZXJzLiBVc2UgaXQgdG8gaW1wbGVtZW50IGEgY3VzdG9tIHZpc3VhbGl6ZXIuXG4gKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVyczpcbiAqXG4gKiAtIGBxdWVzdGlvbmA6IFtgUXVlc3Rpb25gXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24pXFxcbiAqIEEgc3VydmV5IHF1ZXN0aW9uIHRvIHZpc3VhbGl6ZS5cbiAqIC0gYGRhdGFgOiBgQXJyYXk8YW55PmBcXFxuICogU3VydmV5IHJlc3VsdHMuXG4gKiAtIGBvcHRpb25zYFxcXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAtIGBkYXRhUHJvdmlkZXJgOiBgRGF0YVByb3ZpZGVyYFxcXG4gKiAgICBBIGRhdGEgcHJvdmlkZXIgZm9yIHRoaXMgdmlzdWFsaXplci5cbiAqICAgIC0gYHJlbmRlckNvbnRlbnRgOiBgKGNvbnRlbnRDb250YWluZXI6IEhUTUxFbGVtZW50LCB2aXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSkgPT4gdm9pZGBcXFxuICogICAgQSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIHZpc3VhbGl6ZXIncyBIVE1MIG1hcmt1cC4gQXBwZW5kIHRoZSBtYXJrdXAgdG8gYGNvbnRlbnRDb250YWluZXJgLlxuICogICAgLSBgc3VydmV5YDogW2BTdXJ2ZXlNb2RlbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXktZGF0YS1tb2RlbClcXFxuICogICAgUGFzcyBhIGBTdXJ2ZXlNb2RlbGAgaW5zdGFuY2UgaWYgeW91IHdhbnQgdG8gdXNlIGxvY2FsZXMgZnJvbSB0aGUgc3VydmV5IEpTT04gc2NoZW1hLlxuICogICAgLSBgc2VyaWVzVmFsdWVzYDogYEFycmF5PHN0cmluZz5gXFxcbiAqICAgIFNlcmllcyB2YWx1ZXMgdXNlZCB0byBncm91cCBkYXRhLlxuICogICAgLSBgc2VyaWVzTGFiZWxzYDogYEFycmF5PHN0cmluZz5gXFxcbiAqICAgIFNlcmllcyBsYWJlbHMgdG8gZGlzcGxheS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0LCBgc2VyaWVzVmFsdWVzYCBhcmUgdXNlZCBhcyBsYWJlbHMuXG4gKiAtIGB0eXBlYDogYHN0cmluZ2BcXFxuICogKihPcHRpb25hbCkqIFRoZSB2aXN1YWxpemVyJ3MgdHlwZS5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy9ob3ctdG8tcGxvdC1zdXJ2ZXktZGF0YS1pbi1jdXN0b20tYmFyLWNoYXJ0LyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFZpc3VhbGl6ZXJCYXNlIGltcGxlbWVudHMgSURhdGFJbmZvIHtcbiAgcHVibGljIHN0YXRpYyBzdXBwcmVzc1Zpc3VhbGl6ZXJTdHViUmVuZGVyaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfc2hvd1Rvb2xiYXIgPSB0cnVlO1xuICBwcml2YXRlIF9mb290ZXJWaXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZGF0YVByb3ZpZGVyOiBEYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBsYWJlbFRydW5jYXRlTGVuZ3RoOiBudW1iZXIgPSAyNztcbiAgcHJvdGVjdGVkIHJlbmRlclJlc3VsdDogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCB0b29sYmFyQ29udGFpbmVyOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGhlYWRlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBjb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGZvb3RlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfc3VwcG9ydFNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBwdWJsaWMgc3RhdGljIG90aGVyQ29tbWVudFF1ZXN0aW9uVHlwZSA9IFwiY29tbWVudFwiOyAvLyBUT0RPOiBtYWtlIGl0IGNvbmZpZ3VyZWFibGUgLSBhbGxvdyBjaG9vc2Ugd2hhdCBraW5kIG9mIHF1ZXN0aW9uL3Zpc3VhbGl6ZXIgd2lsbCBiZSB1c2VkIGZvciBjb21tZW50cy9vdGhlcnNcbiAgcHVibGljIHN0YXRpYyBvdGhlckNvbW1lbnRDb2xsYXBzZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCBhZnRlciB0aGUgdmlzdWFsaXplcidzIGNvbnRlbnQgaXMgcmVuZGVyZWQuXG4gICAqXG4gICAqIFBhcmFtZXRlcnM6XG4gICAqXG4gICAqIC0gYHNlbmRlcmA6IGBWaXN1YWxpemVyQmFzZWBcXFxuICAgKiBBIGBWaXN1YWxpemVyQmFzZWAgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmh0bWxFbGVtZW50YDogYEhUTUxFbGVtZW50YFxcXG4gICAqIEEgcGFnZSBlbGVtZW50IHdpdGggdGhlIHZpc3VhbGl6ZXIncyBjb250ZW50LlxuICAgKiBAc2VlIHJlbmRlclxuICAgKiBAc2VlIHJlZnJlc2hcbiAgICoqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlcjogRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXplckJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFZpc3VhbGl6ZXJCYXNlLFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXplckJhc2UsIGFueT4oKTtcblxuICBwcm90ZWN0ZWQgYWZ0ZXJSZW5kZXIoY29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLm9uQWZ0ZXJSZW5kZXIuZmlyZSh0aGlzLCB7IGh0bWxFbGVtZW50OiBjb250ZW50Q29udGFpbmVyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIGFmdGVyIGEgbmV3IGxvY2FsZSBpcyBzZXQuXG4gICAqXG4gICAqIFBhcmFtZXRlcnM6XG4gICAqXG4gICAqIC0gYHNlbmRlcmA6IGBWaXN1YWxpemVyQmFzZWBcXFxuICAgKiBBIGBWaXN1YWxpemVyQmFzZWAgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmxvY2FsZWA6IGBzdHJpbmdgXFxcbiAgICogVGhlIGluZGVudGlmaWVyIG9mIGEgbmV3IGxvY2FsZSAoZm9yIGV4YW1wbGUsIFwiZW5cIikuXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgb25Mb2NhbGVDaGFuZ2VkID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiB7IGxvY2FsZTogc3RyaW5nIH0pID0+IGFueSxcbiAgICBWaXN1YWxpemVyQmFzZSxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8vIHB1YmxpYyBvblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudDxcbiAgLy8gICAoc2VuZGVyOiBWaXN1YWxpemF0aW9uUGFuZWwsIHN0YXRlOiBJU3RhdGUpID0+IGFueSxcbiAgLy8gICBWaXN1YWxpemF0aW9uUGFuZWwsXG4gIC8vICAgYW55XG4gIC8vID4oKTtcbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gdGhlIHZpc3VhbGl6ZXIncyBzdGF0ZSBoYXMgY2hhbmdlZC5cbiAgICpcbiAgICogVGhlIHN0YXRlIGluY2x1ZGVzIHNlbGVjdGVkIGNoYXJ0IHR5cGVzLCBjaGFydCBsYXlvdXQsIHNvcnRpbmcsIGZpbHRlcmluZywgYW5kIG90aGVyIGN1c3RvbWl6YXRpb25zIHRoYXQgYSB1c2VyIGhhcyBtYWRlIHdoaWxlIHVzaW5nIHRoZSBkYXNoYm9hcmQuIEhhbmRsZSB0aGUgYG9uU3RhdGVDaGFuZ2VkYCBldmVudCB0byBzYXZlIHRoZXNlIGN1c3RvbWl6YXRpb25zLCBmb3IgZXhhbXBsZSwgaW4gYGxvY2FsU3RvcmFnZWAgYW5kIHJlc3RvcmUgdGhlbSB3aGVuIHRoZSB1c2VyIHJlbG9hZHMgdGhlIHBhZ2UuXG4gICAqXG4gICAqIFBhcmFtZXRlcnM6XG4gICAqXG4gICAqIC0gYHNlbmRlcmA6IGBWaXN1YWxpemVyQmFzZWBcXFxuICAgKiBBIGBWaXN1YWxpemVyQmFzZWAgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBzdGF0ZWA6IGBhbnlgXFxcbiAgICogQSBuZXcgc3RhdGUgb2YgdGhlIHZpc3VhbGl6ZXIuIEluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aXN1YWxpemVkIGVsZW1lbnRzIGFuZCBjdXJyZW50IGxvY2FsZS5cbiAgICpcbiAgICogW1ZpZXcgRGVtb10oL2Rhc2hib2FyZC9leGFtcGxlcy9zYXZlLWRhc2hib2FyZC1zdGF0ZS10by1sb2NhbC1zdG9yYWdlLyAobGlua1N0eWxlKSlcbiAgICogQHNlZSBnZXRTdGF0ZVxuICAgKiBAc2VlIHNldFN0YXRlXG4gICAqL1xuICBwdWJsaWMgb25TdGF0ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBWaXN1YWxpemVyQmFzZSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6ZXJCYXNlLCBhbnk+KCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZih0aGlzLl9zZXR0aW5nU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZC5maXJlKHRoaXMsIHRoaXMuZ2V0U3RhdGUoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9vbGJhckl0ZW1DcmVhdG9yczogeyBbbmFtZTogc3RyaW5nXTogKHRvb2xiYXI/OiBIVE1MRGl2RWxlbWVudCkgPT4gSFRNTEVsZW1lbnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBwdWJsaWMgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgcHJpdmF0ZSBfdHlwZT86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBvcHRpb25zLmRhdGFQcm92aWRlciB8fCBuZXcgRGF0YVByb3ZpZGVyKGRhdGEpO1xuICAgIHRoaXMuX2RhdGFQcm92aWRlci5vbkRhdGFDaGFuZ2VkLmFkZCgoKSA9PiB0aGlzLm9uRGF0YUNoYW5nZWQoKSk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubGFiZWxUcnVuY2F0ZUxlbmd0aCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5sYWJlbFRydW5jYXRlTGVuZ3RoID0gb3B0aW9ucy5sYWJlbFRydW5jYXRlTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb25PcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdGhpcy5xdWVzdGlvbi5uYW1lXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgYSB2aXN1YWxpemVkIHF1ZXN0aW9uLlxuICAgKi9cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmFsdWVOYW1lIHx8IHRoaXMucXVlc3Rpb24ubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdmlzdWFsaXplciBkaXNwbGF5cyBhIGhlYWRlci4gVGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgd2hlbiBhIHZpc3VhbGl6ZWQgcXVlc3Rpb24gaGFzIGEgY29ycmVjdCBhbnN3ZXIuXG4gICAqIEBzZWUgaGFzRm9vdGVyXG4gICAqL1xuICBnZXQgaGFzSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMuc2hvd0NvcnJlY3RBbnN3ZXJzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb24gJiYgISF0aGlzLnF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpc3VhbGl6ZXIgZGlzcGxheXMgYSBmb290ZXIuIFRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHdoZW4gYSB2aXN1YWxpemVkIHF1ZXN0aW9uIGhhcyBhIGNvbW1lbnQuXG4gICAqIEBzZWUgaGFzSGVhZGVyXG4gICAqL1xuICBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMucXVlc3Rpb24gJiYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCB8fCB0aGlzLnF1ZXN0aW9uLmhhc090aGVyKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVmlzdWFsaXplcjxUID0gVmlzdWFsaXplckJhc2U+KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFQge1xuICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5kYXRhUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcjtcbiAgICB9XG4gICAgcmV0dXJuIFZpc3VhbGl6ZXJGYWN0b3J5LmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24sIHRoaXMuZGF0YSwgb3B0aW9ucykgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgZm9vdGVyIHZpc3VhbGl6ZXIuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGZvb3RlciBpcyBhYnNlbnQuXG4gICAqIEBzZWUgaGFzRm9vdGVyXG4gICAqL1xuICBnZXQgZm9vdGVyVmlzdWFsaXplcigpIHtcbiAgICBpZiAoIXRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uLm5hbWUgKyAoc2V0dGluZ3MgfHwge30pLmNvbW1lbnRQcmVmaXhcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi50aXRsZSA9IHRoaXMucHJvY2Vzc1RleHQodGhpcy5xdWVzdGlvbi50aXRsZSk7XG5cbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIgPSB0aGlzLmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24pO1xuICAgICAgaWYoISF0aGlzLl9mb290ZXJWaXN1YWxpemVyKSB7XG4gICAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIub25VcGRhdGUgPSAoKSA9PiB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb290ZXJWaXN1YWxpemVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHVzZXJzIGNhbiBzZWxlY3Qgc2VyaWVzIHBvaW50cyB0byBjcm9zcy1maWx0ZXIgY2hhcnRzLiBUbyBhbGxvdyBvciBkaXNhbGxvdyBzZWxlY3Rpb24sIHNldCB0aGUgW2BhbGxvd1NlbGVjdGlvbmBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd1NlbGVjdGlvbikgcHJvcGVydHkgb2YgdGhlIGBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9uc2Agb2JqZWN0IGluIHRoZSBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHVibGljIGdldCBzdXBwb3J0U2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5vcHRpb25zLmFsbG93U2VsZWN0aW9uID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zLmFsbG93U2VsZWN0aW9uKSAmJlxuICAgICAgdGhpcy5fc3VwcG9ydFNlbGVjdGlvblxuICAgICk7XG4gIH1cblxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZXJpZXNWYWx1ZXMgfHwgW107XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZXJpZXNMYWJlbHMgfHwgdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxuXG4gIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhIHRvb2xiYXIgaXRlbSBmb3IgdGhpcyB2aXN1YWxpemVyLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRvIGFkZCBhIGN1c3RvbSBidXR0b24gYW5kIGRyb3AtZG93biBtZW51IHRvIHRoZSB0b29sYmFyOlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBpbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWwsIERvY3VtZW50SGVscGVyIH0gZnJvbSBcInN1cnZleS1hbmFseXRpY3NcIjtcbiAgICpcbiAgICogY29uc3Qgdml6UGFuZWwgPSBuZXcgVmlzdWFsaXphdGlvblBhbmVsKCAuLi4gKTtcbiAgICpcbiAgICogLy8gQWRkIGEgY3VzdG9tIGJ1dHRvbiB0byB0aGUgdG9vbGJhclxuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5yZWdpc3RlclRvb2xiYXJJdGVtKFwibXktdG9vbGJhci1idXR0b25cIiwgKCkgPT4ge1xuICAgKiAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oXG4gICAqICAgICAvLyBBIGJ1dHRvbiBjbGljayBldmVudCBoYW5kbGVyXG4gICAqICAgICAoKSA9PiB7XG4gICAqICAgICAgIGFsZXJ0KFwiQ3VzdG9tIHRvb2xiYXIgYnV0dG9uIGlzIGNsaWNrZWRcIik7XG4gICAqICAgICB9LFxuICAgKiAgICAgLy8gQnV0dG9uIGNhcHRpb25cbiAgICogICAgIFwiQnV0dG9uXCJcbiAgICogICApO1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gQWRkIGEgY3VzdG9tIGRyb3AtZG93biBtZW51IHRvIHRoZSB0b29sYmFyXG4gICAqIHZpelBhbmVsLnZpc3VhbGl6ZXJzWzBdLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJteS10b29sYmFyLWRyb3Bkb3duXCIsICgpID0+IHtcbiAgICogICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAqICAgICAvLyBNZW51IGl0ZW1zXG4gICAqICAgICBbXG4gICAqICAgICAgIHsgdmFsdWU6IDEsIHRleHQ6IFwiT25lXCIgfSxcbiAgICogICAgICAgeyB2YWx1ZTogMiwgdGV4dDogXCJUd29cIiB9LFxuICAgKiAgICAgICB7IHZhbHVlOiAzLCB0ZXh0OiBcIlRocmVlXCIgfVxuICAgKiAgICAgXSxcbiAgICogICAgIC8vIEEgZnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgaW5pdGlhbCBzZWxlY3Rpb25cbiAgICogICAgIChvcHRpb24pID0+IGZhbHNlLFxuICAgKiAgICAgLy8gQW4gZXZlbnQgaGFuZGxlciB0aGF0IGlzIGV4ZWN1dGVkIHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWRcbiAgICogICAgIChlKSA9PiB7XG4gICAqICAgICAgIGFsZXJ0KGUudGFyZ2V0LnZhbHVlKTtcbiAgICogICAgIH1cbiAgICogICApO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqIEBwYXJhbSBuYW1lIEEgY3VzdG9tIG5hbWUgZm9yIHRoZSB0b29sYmFyIGl0ZW0uXG4gICAqIEBwYXJhbSBjcmVhdG9yIEEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSB0b29sYmFyIGFuZCBzaG91bGQgcmV0dXJuIGFuIGBIVE1MRWxlbWVudGAgd2l0aCB0aGUgdG9vbGJhciBpdGVtLlxuICAgKiBAc2VlIHVucmVnaXN0ZXJUb29sYmFySXRlbVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVG9vbGJhckl0ZW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWF0b3I6ICh0b29sYmFyPzogSFRNTERpdkVsZW1lbnQpID0+IEhUTUxFbGVtZW50XG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9vbGJhckl0ZW1DcmVhdG9yc1tuYW1lXSA9IGNyZWF0b3I7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVW5yZWdpc3RlcnMgYSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhIHRvb2xiYXIgaXRlbS4gQWxsb3dzIHlvdSB0byByZW1vdmUgYSB0b29sYmFyIGl0ZW0uXG4gICAqIEBwYXJhbSBuYW1lIEEgdG9vbGJhciBpdGVtIG5hbWUuXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gcHJldmlvdXNseSB1c2VkIHRvIFtyZWdpc3Rlcl0oI3JlZ2lzdGVyVG9vbGJhckl0ZW0pIHRoZSByZW1vdmVkIHRvb2xiYXIgaXRlbS5cbiAgICogQHNlZSByZWdpc3RlclRvb2xiYXJJdGVtXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRvb2xiYXJJdGVtKFxuICAgIG5hbWU6IHN0cmluZ1xuICApOiAodG9vbGJhcj86IEhUTUxEaXZFbGVtZW50KSA9PiBIVE1MRWxlbWVudCB7XG4gICAgaWYodGhpcy50b29sYmFySXRlbUNyZWF0b3JzW25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNyZWF0b3IgPSB0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnNbbmFtZV07XG4gICAgICBkZWxldGUgdGhpcy50b29sYmFySXRlbUNyZWF0b3JzW25hbWVdO1xuICAgICAgcmV0dXJuIGNyZWF0b3I7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmlzdWFsaXplcidzIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGUgfHwgXCJ2aXN1YWxpemVyXCI7XG4gIH1cblxuICAvKipcbiAgICogT2Jzb2xldGUuIFVzZSBbYHN1cnZleURhdGFgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsI3N1cnZleURhdGEpIGluc3RlYWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVByb3ZpZGVyLmZpbHRlcmVkRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN1cnZleSByZXN1bHRzIHVzZWQgdG8gY2FsY3VsYXRlIHZhbHVlcyBmb3IgdmlzdWFsaXphdGlvbi4gSWYgYSB1c2VyIGFwcGxpZXMgYSBmaWx0ZXIsIHRoZSBhcnJheSBpcyBhbHNvIGZpbHRlcmVkLlxuICAgKlxuICAgKiBUbyBnZXQgYW4gYXJyYXkgb2YgY2FsY3VsYXRlZCBhbmQgdmlzdWFsaXplZCB2YWx1ZXMsIGNhbGwgdGhlIFtgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6ZXJiYXNlI2dldENhbGN1bGF0ZWRWYWx1ZXMpIG1ldGhvZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc3VydmV5RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIuZmlsdGVyZWREYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBkYXRhUHJvdmlkZXIoKTogRGF0YVByb3ZpZGVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdmlzdWFsaXplZCBkYXRhLlxuICAgKiBAcGFyYW0gZGF0YSBBIGRhdGEgYXJyYXkgd2l0aCBzdXJ2ZXkgcmVzdWx0cyB0byBiZSB2aXN1YWxpemVkLlxuICAgKi9cbiAgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICB0aGlzLmRhdGFQcm92aWRlci5kYXRhID0gZGF0YTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICB0aGlzLmZvb3RlclZpc3VhbGl6ZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBvblVwZGF0ZTogKCkgPT4gdm9pZDtcblxuICBpbnZva2VPblVwZGF0ZSgpIHtcbiAgICB0aGlzLm9uVXBkYXRlICYmIHRoaXMub25VcGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSB2aXN1YWxpemVyIGFuZCBhbGwgaXRzIGVsZW1lbnRzIGZyb20gdGhlIERPTS5cbiAgICogQHNlZSBjbGVhclxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAoISF0aGlzLnJlbmRlclJlc3VsdCkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy50b29sYmFyQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNvbnRlbnRDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZvb3RlckNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucmVuZGVyUmVzdWx0LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICB0aGlzLnJlbmRlclJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5fZm9vdGVyVmlzdWFsaXplcikge1xuICAgICAgdGhpcy5fZm9vdGVyVmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyLm9uVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZm9vdGVyVmlzdWFsaXplciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1wdGllcyB0aGUgdG9vbGJhciwgaGVhZGVyLCBmb290ZXIsIGFuZCBjb250ZW50IGNvbnRhaW5lcnMuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIGVtcHR5IGFuZCBkZWxldGUgdGhlIHZpc3VhbGl6ZXIgYW5kIGFsbCBpdHMgZWxlbWVudHMgZnJvbSB0aGUgRE9NLCBjYWxsIHRoZSBbYGRlc3Ryb3koKWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemVyYmFzZSNkZXN0cm95KSBtZXRob2QgaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveVRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5oZWFkZXJDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveUhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgfVxuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmZvb3RlckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Rm9vdGVyKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVG9vbGJhckl0ZW1zKHRvb2xiYXI6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgT2JqZWN0LmtleXModGhpcy50b29sYmFySXRlbUNyZWF0b3JzIHx8IHt9KS5mb3JFYWNoKCh0b29sYmFySXRlbU5hbWUpID0+IHtcbiAgICAgIGxldCB0b29sYmFySXRlbSA9IHRoaXMudG9vbGJhckl0ZW1DcmVhdG9yc1t0b29sYmFySXRlbU5hbWVdKHRvb2xiYXIpO1xuICAgICAgaWYgKCEhdG9vbGJhckl0ZW0pIHtcbiAgICAgICAgdG9vbGJhci5hcHBlbmRDaGlsZCh0b29sYmFySXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdEFuc3dlclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uID8gdGhpcy5xdWVzdGlvbi5jb3JyZWN0QW5zd2VyIDogXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95VG9vbGJhcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyVG9vbGJhcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuc2hvd1Rvb2xiYXIpIHtcbiAgICAgIGNvbnN0IHRvb2xiYXIgPSA8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtdG9vbGJhclwiKVxuICAgICAgKTtcbiAgICAgIHRoaXMuY3JlYXRlVG9vbGJhckl0ZW1zKHRvb2xiYXIpO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvb2xiYXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95SGVhZGVyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISF0aGlzLm9wdGlvbnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0cm95SGVhZGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0cm95SGVhZGVyKGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdHJveUNvbnRlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJIZWFkZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnJlbmRlckhlYWRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMucmVuZGVySGVhZGVyKGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvcnJlY3RBbnN3ZXJFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgXCJzYS12aXN1YWxpemVyX19jb3JyZWN0LWFuc3dlclwiXG4gICAgICApO1xuICAgICAgY29ycmVjdEFuc3dlckVsZW1lbnQuaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvcnJlY3RBbnN3ZXJcIikgKyB0aGlzLmdldENvcnJlY3RBbnN3ZXJUZXh0KCk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29ycmVjdEFuc3dlckVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISF0aGlzLm9wdGlvbnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5yZW5kZXJDb250ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5yZW5kZXJDb250ZW50KGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9WaXN1YWxpemVyRm9yUXVlc3Rpb25cIik7XG4gICAgfVxuICAgIHRoaXMuYWZ0ZXJSZW5kZXIoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Rm9vdGVyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJGb290ZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGlmICh0aGlzLmhhc0Zvb3Rlcikge1xuICAgICAgY29uc3QgZm9vdGVyVGl0bGVFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJoNFwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2Zvb3Rlci10aXRsZVwiLFxuICAgICAgICB7IGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVyQ29tbWVudFRpdGxlXCIpIH1cbiAgICAgICk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZm9vdGVyVGl0bGVFbGVtZW50KTtcblxuICAgICAgY29uc3QgZm9vdGVyQ29udGVudEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2Zvb3Rlci1jb250ZW50XCJcbiAgICAgICk7XG4gICAgICBmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gVmlzdWFsaXplckJhc2Uub3RoZXJDb21tZW50Q29sbGFwc2VkXG4gICAgICAgID8gXCJub25lXCJcbiAgICAgICAgOiBcImJsb2NrXCI7XG5cbiAgICAgIGNvbnN0IHZpc2liaWxpdHlCdXR0b24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICBpZiAoZm9vdGVyQ29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICBmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgIHZpc2liaWxpdHlCdXR0b24uaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVCdXR0b25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9vdGVyQ29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgIHZpc2liaWxpdHlCdXR0b24uaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcbiAgICAgICAgICAgIFZpc3VhbGl6ZXJCYXNlLm90aGVyQ29tbWVudENvbGxhcHNlZCA/IFwic2hvd0J1dHRvblwiIDogXCJoaWRlQnV0dG9uXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9vdGVyVmlzdWFsaXplci5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dCdXR0b25cIikgLyosIFwic2EtdG9vbGJhcl9fYnV0dG9uLS1yaWdodFwiKi8pO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHZpc2liaWxpdHlCdXR0b24pO1xuXG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZm9vdGVyQ29udGVudEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLmZvb3RlclZpc3VhbGl6ZXIucmVuZGVyKGZvb3RlckNvbnRlbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgdmlzdWFsaXplciBpbiBhIHNwZWNpZmllZCBjb250YWluZXIuXG4gICAqIEBwYXJhbSB0YXJnZXRFbGVtZW50IEFuIGBIVE1MRWxlbWVudGAgb3IgYW4gYGlkYCBvZiBhIHBhZ2UgZWxlbWVudCBpbiB3aGljaCB5b3Ugd2FudCB0byByZW5kZXIgdGhlIHZpc3VhbGl6ZXIuXG4gICAqL1xuICByZW5kZXIodGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldEVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRhcmdldEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXRFbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJSZXN1bHQgPSB0YXJnZXRFbGVtZW50O1xuXG4gICAgdGhpcy50b29sYmFyQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgIFwiZGl2XCIsXG4gICAgICBcInNhLXZpc3VhbGl6ZXJfX3Rvb2xiYXJcIlxuICAgICk7XG4gICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgIHRoaXMucmVuZGVyVG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuXG4gICAgaWYgKHRoaXMuaGFzSGVhZGVyKSB7XG4gICAgICB0aGlzLmhlYWRlckNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIFwic2EtdmlzdWFsaXplcl9faGVhZGVyXCJcbiAgICAgICk7XG4gICAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVySGVhZGVyKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRlbnRDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJkaXZcIixcbiAgICAgIFwic2EtdmlzdWFsaXplcl9fY29udGVudFwiXG4gICAgKTtcbiAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG5cbiAgICB0aGlzLmZvb3RlckNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImRpdlwiLFxuICAgICAgXCJzYS12aXN1YWxpemVyX19mb290ZXJcIlxuICAgICk7XG4gICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgdGhpcy5yZW5kZXJGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXJlbmRlcnMgdGhlIHZpc3VhbGl6ZXIgYW5kIGl0cyBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goKSB7XG4gICAgaWYgKCEhdGhpcy5oZWFkZXJDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lIZWFkZXIodGhpcy5oZWFkZXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlckhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgICB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5mb290ZXJDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlckZvb3Rlcih0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaXBIdG1sRnJvbVRpdGxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGxldCBvcmlnaW5hbFRleHQgPSB0ZXh0IHx8IFwiXCI7XG4gICAgICBsZXQgcHJvY2Vzc2VkVGV4dCA9IG9yaWdpbmFsVGV4dC5yZXBsYWNlKC8oPChbXj5dKyk+KS9naSwgXCJcIik7XG4gICAgICByZXR1cm4gcHJvY2Vzc2VkVGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBnZXRSYW5kb21Db2xvcigpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldENvbG9ycygpO1xuICAgIHJldHVybiBjb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29sb3JzLmxlbmd0aCldO1xuICB9XG5cbiAgcHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yID0gXCIjZjdmN2Y3XCI7XG5cbiAgZ2V0IGJhY2tncm91bmRDb2xvcigpIHsgcmV0dXJuIHRoaXMuZ2V0QmFja2dyb3VuZENvbG9yQ29yZSgpOyB9XG4gIHNldCBiYWNrZ3JvdW5kQ29sb3IodmFsdWUpIHsgdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKHZhbHVlKTsgfVxuXG4gIHByb3RlY3RlZCBnZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3I7XG4gIH1cbiAgcHJvdGVjdGVkIHNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3I6IHN0cmluZykge1xuICAgIHRoaXMuX2JhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgIGlmICh0aGlzLmZvb3RlclZpc3VhbGl6ZXIpIHRoaXMuZm9vdGVyVmlzdWFsaXplci5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgfVxuXG4gIHN0YXRpYyBjdXN0b21Db2xvcnM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgc3RhdGljIGNvbG9ycyA9IFtcbiAgICBcIiM4NmUxZmJcIixcbiAgICBcIiMzOTk5ZmJcIixcbiAgICBcIiNmZjY3NzFcIixcbiAgICBcIiMxZWI0OTZcIixcbiAgICBcIiNmZmMxNTJcIixcbiAgICBcIiNhYmExZmZcIixcbiAgICBcIiM3ZDhkYTVcIixcbiAgICBcIiM0ZWM0NmNcIixcbiAgICBcIiNjZjM3YTZcIixcbiAgICBcIiM0ZTYxOThcIixcbiAgXTtcblxuICBnZXRDb2xvcnMoY291bnQgPSAxMCkge1xuICAgIGNvbnN0IGNvbG9ycyA9XG4gICAgICBBcnJheS5pc0FycmF5KFZpc3VhbGl6ZXJCYXNlLmN1c3RvbUNvbG9ycykgJiZcbiAgICAgICAgVmlzdWFsaXplckJhc2UuY3VzdG9tQ29sb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBWaXN1YWxpemVyQmFzZS5jdXN0b21Db2xvcnNcbiAgICAgICAgOiBWaXN1YWxpemVyQmFzZS5jb2xvcnM7XG5cbiAgICBsZXQgbWFueUNvbG9yczogYW55ID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHtcbiAgICAgIG1hbnlDb2xvcnMgPSBtYW55Q29sb3JzLmNvbmNhdChjb2xvcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBtYW55Q29sb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgdmlzdWFsaXplcidzIHRvb2xiYXIuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGB0cnVlYFxuICAgKi9cbiAgZ2V0IHNob3dUb29sYmFyKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93VG9vbGJhcjtcbiAgfVxuICBzZXQgc2hvd1Rvb2xiYXIobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAobmV3VmFsdWUgIT0gdGhpcy5fc2hvd1Rvb2xiYXIpIHtcbiAgICAgIHRoaXMuX3Nob3dUb29sYmFyID0gbmV3VmFsdWU7XG4gICAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95VG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlclRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT2Jzb2xldGUuIFVzZSBbYGdldENhbGN1bGF0ZWRWYWx1ZXMoKWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwjZ2V0Q2FsY3VsYXRlZFZhbHVlcykgaW5zdGVhZC5cbiAgICovXG4gIGdldERhdGEoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDYWxjdWxhdGVkVmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjYWxjdWxhdGVkIGFuZCB2aXN1YWxpemVkIHZhbHVlcy4gSWYgYSB1c2VyIGFwcGxpZXMgYSBmaWx0ZXIsIHRoZSBhcnJheSBpcyBhbHNvIGZpbHRlcmVkLlxuICAgKlxuICAgKiBUbyBnZXQgYW4gYXJyYXkgb2Ygc291cmNlIHN1cnZleSByZXN1bHRzLCB1c2UgdGhlIFtgc3VydmV5RGF0YWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemVyYmFzZSNzdXJ2ZXlEYXRhKSBwcm9wZXJ0eS5cbiAgICovXG4gIGdldENhbGN1bGF0ZWRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIuZ2V0RGF0YSh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc2V0dGluZ1N0YXRlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIGEgY3VycmVudCB2aXN1YWxpemVyIHN0YXRlLiBUaGUgcHJvcGVydGllcyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIGluZGl2aWR1YWwgdmlzdWFsaXplci5cbiAgICpcbiAgICogPiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gaW4gY2xhc3NlcyBkZXNjZW5kYW50IGZyb20gYFZpc3VhbGl6ZXJCYXNlYC5cbiAgICogQHNlZSBzZXRTdGF0ZVxuICAgKiBAc2VlIG9uU3RhdGVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogYW55IHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZpc3VhbGl6ZXIncyBzdGF0ZS5cbiAgICpcbiAgICogPiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gaW4gY2xhc3NlcyBkZXNjZW5kYW50IGZyb20gYFZpc3VhbGl6ZXJCYXNlYC5cbiAgICogQHNlZSBnZXRTdGF0ZVxuICAgKiBAc2VlIG9uU3RhdGVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IGFueSk6IHZvaWQge1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgY3VycmVudCBsb2NhbGUuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIGluaGVyaXQgdGhlIGxvY2FsZSBmcm9tIGEgdmlzdWFsaXplZCBzdXJ2ZXksIGFzc2lnbiBhIFtgU3VydmV5TW9kZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5LWRhdGEtbW9kZWwpIGluc3RhbmNlIHRvIHRoZSBbYHN1cnZleWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNzdXJ2ZXkpIHByb3BlcnR5IG9mIHRoZSBgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgIG9iamVjdCBpbiB0aGUgW2BWaXN1YWxpemF0aW9uUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsKSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogSWYgdGhlIHN1cnZleSBpcyBbdHJhbnNsYXRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgbGFuZ3VhZ2VdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2V4YW1wbGVzL3N1cnZleS1sb2NhbGl6YXRpb24vKSwgdGhlIHRvb2xiYXIgZGlzcGxheXMgYSBsYW5ndWFnZSBzZWxlY3Rpb24gZHJvcC1kb3duIG1lbnUuXG4gICAqIEBzZWUgb25Mb2NhbGVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvY2FsZSgpIHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5vcHRpb25zLnN1cnZleTtcbiAgICBpZiAoISFzdXJ2ZXkpIHtcbiAgICAgIHJldHVybiBzdXJ2ZXkubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGxvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgdGhpcy5vbkxvY2FsZUNoYW5nZWQuZmlyZSh0aGlzLCB7IGxvY2FsZTogbmV3TG9jYWxlIH0pO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIGxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gbmV3TG9jYWxlO1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLm9wdGlvbnMuc3VydmV5O1xuICAgIGlmICghIXN1cnZleSAmJiBzdXJ2ZXkubG9jYWxlICE9PSBuZXdMb2NhbGUpIHtcbiAgICAgIHN1cnZleS5sb2NhbGUgPSBuZXdMb2NhbGU7XG4gICAgfVxuICB9XG5cbn1cbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjcmVhdGUgaW5kaXZpZHVhbCB2aXN1YWxpemVycyB3aXRob3V0IGNyZWF0aW5nIGEgW3Zpc3VhbGl6YXRpb24gcGFuZWxdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpLlxuICovXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplckZhY3Rvcnkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHZpc3VhbGl6ZXIgZm9yIGEgc2luZ2xlIHF1ZXN0aW9uLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBpbXBvcnQgeyBWaXN1YWxpemVyRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktYW5hbHl0aWNzXCI7XG4gICAqXG4gICAqIGNvbnN0IHZpc3VhbGl6ZXIgPSBuZXcgVmlzdWFsaXplckZhY3RvcnkuY3JlYXRlVmlzdWFsaXplcihcbiAgICogICBxdWVzdGlvbixcbiAgICogICBkYXRhLFxuICAgKiAgIG9wdGlvbnNcbiAgICogKTtcbiAgICpcbiAgICogdmlzdWFsaXplci5yZW5kZXIoXCJjb250YWluZXJJZFwiKVxuICAgKiBgYGBcbiAgICpcbiAgICogSWYgYSBxdWVzdGlvbiBoYXMgbW9yZSB0aGFuIG9uZSBbcmVnaXN0ZXJlZF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25tYW5hZ2VyI3JlZ2lzdGVyVmlzdWFsaXplcikgdmlzdWFsaXplciwgdXNlcnMgY2FuIHN3aXRjaCBiZXR3ZWVuIHRoZW0gdXNpbmcgYSBkcm9wLWRvd24gbWVudS5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIEEgcXVlc3Rpb24gZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIHZpc3VhbGl6ZXIuXG4gICAqIEBwYXJhbSBkYXRhIEEgZGF0YSBhcnJheSB3aXRoIHN1cnZleSByZXN1bHRzIHRvIGJlIHZpc3VhbGl6ZWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCB3aXRoIGFueSBjdXN0b20gcHJvcGVydGllcyB5b3UgbmVlZCB3aXRoaW4gdGhlIHZpc3VhbGl6ZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVZpc3VhbGl6ZXIoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfVxuICApOiBWaXN1YWxpemVyQmFzZSB7XG4gICAgbGV0IHR5cGU7XG5cbiAgICBpZiAocXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcInRleHRcIiAmJiAoPGFueT5xdWVzdGlvbikuaW5wdXRUeXBlKSB7XG4gICAgICB0eXBlID0gKDxhbnk+cXVlc3Rpb24pLmlucHV0VHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRvcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci5nZXRWaXN1YWxpemVyc0J5VHlwZSh0eXBlKTtcbiAgICB2YXIgdmlzdWFsaXplcnMgPSBjcmVhdG9ycy5tYXAoXG4gICAgICAoY3JlYXRvcikgPT4gbmV3IGNyZWF0b3IocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMpXG4gICAgKTtcbiAgICBpZiAodmlzdWFsaXplcnMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgYWx0ZXJuYXRpdmVzVmlzdWFsaXplckNvbnN0cnVjdG9yID0gVmlzdWFsaXphdGlvbk1hbmFnZXIuZ2V0QWx0VmlzdWFsaXplclNlbGVjdG9yKCk7XG4gICAgICBsZXQgdmlzdWFsaXplciA9IG5ldyBhbHRlcm5hdGl2ZXNWaXN1YWxpemVyQ29uc3RydWN0b3IoXG4gICAgICAgIHZpc3VhbGl6ZXJzLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgZGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHJldHVybiB2aXN1YWxpemVyO1xuICAgIH1cbiAgICByZXR1cm4gdmlzdWFsaXplcnNbMF07XG4gIH1cbn1cbiIsImV4cG9ydCB2YXIgc3RvcFdvcmRzID0gW1xuICBcImRlXCIsXG4gIFwiZW5cIixcbiAgXCJ2YW5cIixcbiAgXCJpa1wiLFxuICBcInRlXCIsXG4gIFwiZGF0XCIsXG4gIFwiZGllXCIsXG4gIFwiaW5cIixcbiAgXCJlZW5cIixcbiAgXCJoaWpcIixcbiAgXCJoZXRcIixcbiAgXCJuaWV0XCIsXG4gIFwiemlqblwiLFxuICBcImlzXCIsXG4gIFwid2FzXCIsXG4gIFwib3BcIixcbiAgXCJhYW5cIixcbiAgXCJtZXRcIixcbiAgXCJhbHNcIixcbiAgXCJ2b29yXCIsXG4gIFwiaGFkXCIsXG4gIFwiZXJcIixcbiAgXCJtYWFyXCIsXG4gIFwib21cIixcbiAgXCJoZW1cIixcbiAgXCJkYW5cIixcbiAgXCJ6b3VcIixcbiAgXCJvZlwiLFxuICBcIndhdFwiLFxuICBcIm1pam5cIixcbiAgXCJtZW5cIixcbiAgXCJkaXRcIixcbiAgXCJ6b1wiLFxuICBcImRvb3JcIixcbiAgXCJvdmVyXCIsXG4gIFwiemVcIixcbiAgXCJ6aWNoXCIsXG4gIFwiYmlqXCIsXG4gIFwib29rXCIsXG4gIFwidG90XCIsXG4gIFwiamVcIixcbiAgXCJtaWpcIixcbiAgXCJ1aXRcIixcbiAgXCJkZXJcIixcbiAgXCJkYWFyXCIsXG4gIFwiaGFhclwiLFxuICBcIm5hYXJcIixcbiAgXCJoZWJcIixcbiAgXCJob2VcIixcbiAgXCJoZWVmdFwiLFxuICBcImhlYmJlblwiLFxuICBcImRlemVcIixcbiAgXCJ1XCIsXG4gIFwid2FudFwiLFxuICBcIm5vZ1wiLFxuICBcInphbFwiLFxuICBcIm1lXCIsXG4gIFwiemlqXCIsXG4gIFwibnVcIixcbiAgXCJnZVwiLFxuICBcImdlZW5cIixcbiAgXCJvbWRhdFwiLFxuICBcImlldHNcIixcbiAgXCJ3b3JkZW5cIixcbiAgXCJ0b2NoXCIsXG4gIFwiYWxcIixcbiAgXCJ3YXJlblwiLFxuICBcInZlZWxcIixcbiAgXCJtZWVyXCIsXG4gIFwiZG9lblwiLFxuICBcInRvZW5cIixcbiAgXCJtb2V0XCIsXG4gIFwiYmVuXCIsXG4gIFwiem9uZGVyXCIsXG4gIFwia2FuXCIsXG4gIFwiaHVuXCIsXG4gIFwiZHVzXCIsXG4gIFwiYWxsZXNcIixcbiAgXCJvbmRlclwiLFxuICBcImphXCIsXG4gIFwiZWVuc1wiLFxuICBcImhpZXJcIixcbiAgXCJ3aWVcIixcbiAgXCJ3ZXJkXCIsXG4gIFwiYWx0aWpkXCIsXG4gIFwiZG9jaFwiLFxuICBcIndvcmR0XCIsXG4gIFwid2V6ZW5cIixcbiAgXCJrdW5uZW5cIixcbiAgXCJvbnNcIixcbiAgXCJ6ZWxmXCIsXG4gIFwidGVnZW5cIixcbiAgXCJuYVwiLFxuICBcInJlZWRzXCIsXG4gIFwid2lsXCIsXG4gIFwia29uXCIsXG4gIFwibmlldHNcIixcbiAgXCJ1d1wiLFxuICBcImllbWFuZFwiLFxuICBcImdld2Vlc3RcIixcbiAgXCJhbmRlcmVcIlxuXTtcbiIsImV4cG9ydCB2YXIgc3RvcFdvcmRzID0gW1xuICBcIi4uLlwiLFxuICBcImFcIixcbiAgXCJhYm91dFwiLFxuICBcImFib3ZlXCIsXG4gIFwiYWNyb3NzXCIsXG4gIFwiYWZ0ZXJcIixcbiAgXCJhZ2FpblwiLFxuICBcImFnYWluc3RcIixcbiAgXCJhbGxcIixcbiAgXCJhbG1vc3RcIixcbiAgXCJhbG9uZVwiLFxuICBcImFsb25nXCIsXG4gIFwiYWxyZWFkeVwiLFxuICBcImFsc29cIixcbiAgXCJhbHRob3VnaFwiLFxuICBcImFsd2F5c1wiLFxuICBcImFtb25nXCIsXG4gIFwiYW5cIixcbiAgXCJhbmRcIixcbiAgXCJhbm90aGVyXCIsXG4gIFwiYW55XCIsXG4gIFwiYW55Ym9keVwiLFxuICBcImFueW9uZVwiLFxuICBcImFueXRoaW5nXCIsXG4gIFwiYW55d2hlcmVcIixcbiAgXCJhcmVcIixcbiAgXCJhcmVhXCIsXG4gIFwiYXJlYXNcIixcbiAgXCJhcm91bmRcIixcbiAgXCJhc1wiLFxuICBcImFza1wiLFxuICBcImFza2VkXCIsXG4gIFwiYXNraW5nXCIsXG4gIFwiYXNrc1wiLFxuICBcImF0XCIsXG4gIFwiYXdheVwiLFxuICBcImJcIixcbiAgXCJiYWNrXCIsXG4gIFwiYmFja2VkXCIsXG4gIFwiYmFja2luZ1wiLFxuICBcImJhY2tzXCIsXG4gIFwiYmVcIixcbiAgXCJiZWNhbWVcIixcbiAgXCJiZWNhdXNlXCIsXG4gIFwiYmVjb21lXCIsXG4gIFwiYmVjb21lc1wiLFxuICBcImJlZW5cIixcbiAgXCJiZWZvcmVcIixcbiAgXCJiZWdhblwiLFxuICBcImJlaGluZFwiLFxuICBcImJlaW5nXCIsXG4gIFwiYmVpbmdzXCIsXG4gIFwiYmVzdFwiLFxuICBcImJldHRlclwiLFxuICBcImJldHdlZW5cIixcbiAgXCJiaWdcIixcbiAgXCJib3RoXCIsXG4gIFwiYnV0XCIsXG4gIFwiYnlcIixcbiAgXCJjXCIsXG4gIFwiY2FtZVwiLFxuICBcImNhblwiLFxuICBcImNhbm5vdFwiLFxuICBcImNhc2VcIixcbiAgXCJjYXNlc1wiLFxuICBcImNlcnRhaW5cIixcbiAgXCJjZXJ0YWlubHlcIixcbiAgXCJjbGVhclwiLFxuICBcImNsZWFybHlcIixcbiAgXCJjb21lXCIsXG4gIFwiY291bGRcIixcbiAgXCJkXCIsXG4gIFwiZGlkXCIsXG4gIFwiZGlmZmVyXCIsXG4gIFwiZGlmZmVyZW50XCIsXG4gIFwiZGlmZmVyZW50bHlcIixcbiAgXCJkb1wiLFxuICBcImRvZXNcIixcbiAgXCJkb25lXCIsXG4gIFwiZG93blwiLFxuICBcImRvd25cIixcbiAgXCJkb3duZWRcIixcbiAgXCJkb3duaW5nXCIsXG4gIFwiZG93bnNcIixcbiAgXCJkdXJpbmdcIixcbiAgXCJlXCIsXG4gIFwiZWFjaFwiLFxuICBcImVhcmx5XCIsXG4gIFwiZWl0aGVyXCIsXG4gIFwiZW5kXCIsXG4gIFwiZW5kZWRcIixcbiAgXCJlbmRpbmdcIixcbiAgXCJlbmRzXCIsXG4gIFwiZW5vdWdoXCIsXG4gIFwiZXZlblwiLFxuICBcImV2ZW5seVwiLFxuICBcImV2ZXJcIixcbiAgXCJldmVyeVwiLFxuICBcImV2ZXJ5Ym9keVwiLFxuICBcImV2ZXJ5b25lXCIsXG4gIFwiZXZlcnl0aGluZ1wiLFxuICBcImV2ZXJ5d2hlcmVcIixcbiAgXCJmXCIsXG4gIFwiZmFjZVwiLFxuICBcImZhY2VzXCIsXG4gIFwiZmFjdFwiLFxuICBcImZhY3RzXCIsXG4gIFwiZmFyXCIsXG4gIFwiZmVsdFwiLFxuICBcImZld1wiLFxuICBcImZpbmRcIixcbiAgXCJmaW5kc1wiLFxuICBcImZpcnN0XCIsXG4gIFwiZm9yXCIsXG4gIFwiZm91clwiLFxuICBcImZyb21cIixcbiAgXCJmdWxsXCIsXG4gIFwiZnVsbHlcIixcbiAgXCJmdXJ0aGVyXCIsXG4gIFwiZnVydGhlcmVkXCIsXG4gIFwiZnVydGhlcmluZ1wiLFxuICBcImZ1cnRoZXJzXCIsXG4gIFwiZ1wiLFxuICBcImdhdmVcIixcbiAgXCJnZW5lcmFsXCIsXG4gIFwiZ2VuZXJhbGx5XCIsXG4gIFwiZ2V0XCIsXG4gIFwiZ2V0c1wiLFxuICBcImdpdmVcIixcbiAgXCJnaXZlblwiLFxuICBcImdpdmVzXCIsXG4gIFwiZ29cIixcbiAgXCJnb2luZ1wiLFxuICBcImdvb2RcIixcbiAgXCJnb29kc1wiLFxuICBcImdvdFwiLFxuICBcImdyZWF0XCIsXG4gIFwiZ3JlYXRlclwiLFxuICBcImdyZWF0ZXN0XCIsXG4gIFwiZ3JvdXBcIixcbiAgXCJncm91cGVkXCIsXG4gIFwiZ3JvdXBpbmdcIixcbiAgXCJncm91cHNcIixcbiAgXCJoXCIsXG4gIFwiaGFkXCIsXG4gIFwiaGFzXCIsXG4gIFwiaGF2ZVwiLFxuICBcImhhdmluZ1wiLFxuICBcImhlXCIsXG4gIFwiaGVyXCIsXG4gIFwiaGVyZVwiLFxuICBcImhlcnNlbGZcIixcbiAgXCJoaWdoXCIsXG4gIFwiaGlnaFwiLFxuICBcImhpZ2hcIixcbiAgXCJoaWdoZXJcIixcbiAgXCJoaWdoZXN0XCIsXG4gIFwiaGltXCIsXG4gIFwiaGltc2VsZlwiLFxuICBcImhpc1wiLFxuICBcImhvd1wiLFxuICBcImhvd2V2ZXJcIixcbiAgXCJpXCIsXG4gIFwiaWZcIixcbiAgXCJpbXBvcnRhbnRcIixcbiAgXCJpblwiLFxuICBcImludGVyZXN0XCIsXG4gIFwiaW50ZXJlc3RlZFwiLFxuICBcImludGVyZXN0aW5nXCIsXG4gIFwiaW50ZXJlc3RzXCIsXG4gIFwiaW50b1wiLFxuICBcImlzXCIsXG4gIFwiaXRcIixcbiAgXCJpdHNcIixcbiAgXCJpdHNlbGZcIixcbiAgXCJqXCIsXG4gIFwianVzdFwiLFxuICBcImtcIixcbiAgXCJrZWVwXCIsXG4gIFwia2VlcHNcIixcbiAgXCJraW5kXCIsXG4gIFwia25ld1wiLFxuICBcImtub3dcIixcbiAgXCJrbm93blwiLFxuICBcImtub3dzXCIsXG4gIFwibFwiLFxuICBcImxhcmdlXCIsXG4gIFwibGFyZ2VseVwiLFxuICBcImxhc3RcIixcbiAgXCJsYXRlclwiLFxuICBcImxhdGVzdFwiLFxuICBcImxlYXN0XCIsXG4gIFwibGVzc1wiLFxuICBcImxldFwiLFxuICBcImxldHNcIixcbiAgXCJsaWtlXCIsXG4gIFwibGlrZWx5XCIsXG4gIFwibG9uZ1wiLFxuICBcImxvbmdlclwiLFxuICBcImxvbmdlc3RcIixcbiAgXCJtXCIsXG4gIFwibWFkZVwiLFxuICBcIm1ha2VcIixcbiAgXCJtYWtpbmdcIixcbiAgXCJtYW5cIixcbiAgXCJtYW55XCIsXG4gIFwibWF5XCIsXG4gIFwibWVcIixcbiAgXCJtZW1iZXJcIixcbiAgXCJtZW1iZXJzXCIsXG4gIFwibWVuXCIsXG4gIFwibWlnaHRcIixcbiAgXCJtb3JlXCIsXG4gIFwibW9zdFwiLFxuICBcIm1vc3RseVwiLFxuICBcIm1yXCIsXG4gIFwibXJzXCIsXG4gIFwibXVjaFwiLFxuICBcIm11c3RcIixcbiAgXCJteVwiLFxuICBcIm15c2VsZlwiLFxuICBcIm5cIixcbiAgXCJuZWNlc3NhcnlcIixcbiAgXCJuZWVkXCIsXG4gIFwibmVlZGVkXCIsXG4gIFwibmVlZGluZ1wiLFxuICBcIm5lZWRzXCIsXG4gIFwibmV2ZXJcIixcbiAgXCJuZXdcIixcbiAgXCJuZXdcIixcbiAgXCJuZXdlclwiLFxuICBcIm5ld2VzdFwiLFxuICBcIm5leHRcIixcbiAgXCJub1wiLFxuICBcIm5vYm9keVwiLFxuICBcIm5vblwiLFxuICBcIm5vb25lXCIsXG4gIFwibm90XCIsXG4gIFwibm90aGluZ1wiLFxuICBcIm5vd1wiLFxuICBcIm5vd2hlcmVcIixcbiAgXCJudW1iZXJcIixcbiAgXCJudW1iZXJzXCIsXG4gIFwib1wiLFxuICBcIm9mXCIsXG4gIFwib2ZmXCIsXG4gIFwib2Z0ZW5cIixcbiAgXCJvbGRcIixcbiAgXCJvbGRlclwiLFxuICBcIm9sZGVzdFwiLFxuICBcIm9uXCIsXG4gIFwib25jZVwiLFxuICBcIm9uZVwiLFxuICBcIm9ubHlcIixcbiAgXCJvcGVuXCIsXG4gIFwib3BlbmVkXCIsXG4gIFwib3BlbmluZ1wiLFxuICBcIm9wZW5zXCIsXG4gIFwib3JcIixcbiAgXCJvcmRlclwiLFxuICBcIm9yZGVyZWRcIixcbiAgXCJvcmRlcmluZ1wiLFxuICBcIm9yZGVyc1wiLFxuICBcIm90aGVyXCIsXG4gIFwib3RoZXJzXCIsXG4gIFwib3VyXCIsXG4gIFwib3V0XCIsXG4gIFwib3ZlclwiLFxuICBcInBcIixcbiAgXCJwYXJ0XCIsXG4gIFwicGFydGVkXCIsXG4gIFwicGFydGluZ1wiLFxuICBcInBhcnRzXCIsXG4gIFwicGVyXCIsXG4gIFwicGVyaGFwc1wiLFxuICBcInBsYWNlXCIsXG4gIFwicGxhY2VzXCIsXG4gIFwicG9pbnRcIixcbiAgXCJwb2ludGVkXCIsXG4gIFwicG9pbnRpbmdcIixcbiAgXCJwb2ludHNcIixcbiAgXCJwb3NzaWJsZVwiLFxuICBcInByZXNlbnRcIixcbiAgXCJwcmVzZW50ZWRcIixcbiAgXCJwcmVzZW50aW5nXCIsXG4gIFwicHJlc2VudHNcIixcbiAgXCJwcm9ibGVtXCIsXG4gIFwicHJvYmxlbXNcIixcbiAgXCJwdXRcIixcbiAgXCJwdXRzXCIsXG4gIFwicVwiLFxuICBcInF1aXRlXCIsXG4gIFwiclwiLFxuICBcInJhdGhlclwiLFxuICBcInJlYWxseVwiLFxuICBcInJpZ2h0XCIsXG4gIFwicmlnaHRcIixcbiAgXCJyb29tXCIsXG4gIFwicm9vbXNcIixcbiAgXCJzXCIsXG4gIFwic2FpZFwiLFxuICBcInNhbWVcIixcbiAgXCJzYXdcIixcbiAgXCJzYXlcIixcbiAgXCJzYXlzXCIsXG4gIFwic2Vjb25kXCIsXG4gIFwic2Vjb25kc1wiLFxuICBcInNlZVwiLFxuICBcInNlZW1cIixcbiAgXCJzZWVtZWRcIixcbiAgXCJzZWVtaW5nXCIsXG4gIFwic2VlbXNcIixcbiAgXCJzZWVzXCIsXG4gIFwic2V2ZXJhbFwiLFxuICBcInNoYWxsXCIsXG4gIFwic2hlXCIsXG4gIFwic2hvdWxkXCIsXG4gIFwic2hvd1wiLFxuICBcInNob3dlZFwiLFxuICBcInNob3dpbmdcIixcbiAgXCJzaG93c1wiLFxuICBcInNpZGVcIixcbiAgXCJzaWRlc1wiLFxuICBcInNpbmNlXCIsXG4gIFwic21hbGxcIixcbiAgXCJzbWFsbGVyXCIsXG4gIFwic21hbGxlc3RcIixcbiAgXCJzb1wiLFxuICBcInNvbWVcIixcbiAgXCJzb21lYm9keVwiLFxuICBcInNvbWVvbmVcIixcbiAgXCJzb21ldGhpbmdcIixcbiAgXCJzb21ld2hlcmVcIixcbiAgXCJzdGF0ZVwiLFxuICBcInN0YXRlc1wiLFxuICBcInN0aWxsXCIsXG4gIFwic3RpbGxcIixcbiAgXCJzdWNoXCIsXG4gIFwic3VyZVwiLFxuICBcInRcIixcbiAgXCJ0YWtlXCIsXG4gIFwidGFrZW5cIixcbiAgXCJ0aGFuXCIsXG4gIFwidGhhdFwiLFxuICBcInRoZVwiLFxuICBcInRoZWlyXCIsXG4gIFwidGhlbVwiLFxuICBcInRoZW5cIixcbiAgXCJ0aGVyZVwiLFxuICBcInRoZXJlZm9yZVwiLFxuICBcInRoZXNlXCIsXG4gIFwidGhleVwiLFxuICBcInRoaW5nXCIsXG4gIFwidGhpbmdzXCIsXG4gIFwidGhpbmtcIixcbiAgXCJ0aGlua3NcIixcbiAgXCJ0aGlzXCIsXG4gIFwidGhvc2VcIixcbiAgXCJ0aG91Z2hcIixcbiAgXCJ0aG91Z2h0XCIsXG4gIFwidGhvdWdodHNcIixcbiAgXCJ0aHJlZVwiLFxuICBcInRocm91Z2hcIixcbiAgXCJ0aHVzXCIsXG4gIFwidG9cIixcbiAgXCJ0b2RheVwiLFxuICBcInRvZ2V0aGVyXCIsXG4gIFwidG9vXCIsXG4gIFwidG9va1wiLFxuICBcInRvd2FyZFwiLFxuICBcInR1cm5cIixcbiAgXCJ0dXJuZWRcIixcbiAgXCJ0dXJuaW5nXCIsXG4gIFwidHVybnNcIixcbiAgXCJ0d29cIixcbiAgXCJ1XCIsXG4gIFwidW5kZXJcIixcbiAgXCJ1bnRpbFwiLFxuICBcInVwXCIsXG4gIFwidXBvblwiLFxuICBcInVzXCIsXG4gIFwidXNlXCIsXG4gIFwidXNlZFwiLFxuICBcInVzZXNcIixcbiAgXCJ2XCIsXG4gIFwidmVyeVwiLFxuICBcIndcIixcbiAgXCJ3YW50XCIsXG4gIFwid2FudGVkXCIsXG4gIFwid2FudGluZ1wiLFxuICBcIndhbnRzXCIsXG4gIFwid2FzXCIsXG4gIFwid2F5XCIsXG4gIFwid2F5c1wiLFxuICBcIndlXCIsXG4gIFwid2VsbFwiLFxuICBcIndlbGxzXCIsXG4gIFwid2VudFwiLFxuICBcIndlcmVcIixcbiAgXCJ3aGF0XCIsXG4gIFwid2hlblwiLFxuICBcIndoZXJlXCIsXG4gIFwid2hldGhlclwiLFxuICBcIndoaWNoXCIsXG4gIFwid2hpbGVcIixcbiAgXCJ3aG9cIixcbiAgXCJ3aG9sZVwiLFxuICBcIndob3NlXCIsXG4gIFwid2h5XCIsXG4gIFwid2lsbFwiLFxuICBcIndpdGhcIixcbiAgXCJ3aXRoaW5cIixcbiAgXCJ3aXRob3V0XCIsXG4gIFwid29ya1wiLFxuICBcIndvcmtlZFwiLFxuICBcIndvcmtpbmdcIixcbiAgXCJ3b3Jrc1wiLFxuICBcIndvdWxkXCIsXG4gIFwieFwiLFxuICBcInlcIixcbiAgXCJ5ZWFyXCIsXG4gIFwieWVhcnNcIixcbiAgXCJ5ZXRcIixcbiAgXCJ5b3VcIixcbiAgXCJ5b3VuZ1wiLFxuICBcInlvdW5nZXJcIixcbiAgXCJ5b3VuZ2VzdFwiLFxuICBcInlvdXJcIixcbiAgXCJ5b3Vyc1wiLFxuICBcInpcIlxuXTtcbiIsImltcG9ydCB7IHN0b3BXb3JkcyB9IGZyb20gXCIuL2VuZ2xpc2hcIjtcbmltcG9ydCB7IHN0b3BXb3JkcyBhcyBub1N0b3BXb3JkcyB9IGZyb20gXCIuL25vcndlZ2lhblwiO1xuaW1wb3J0IHsgc3RvcFdvcmRzIGFzIG5sU3RvcFdvcmRzIH0gZnJvbSBcIi4vZHV0Y2hcIjtcbmltcG9ydCB7IHN0b3BXb3JkcyBhcyBlc1N0b3BXb3JkcyB9IGZyb20gXCIuL3NwYW5pc2hcIjtcblxudmFyIHN0b3BXb3Jkc0RpY3Rpb25hcnk6IHsgW2luZGV4OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+IH0gPSB7fTtcbnN0b3BXb3Jkc0RpY3Rpb25hcnlbXCJlblwiXSA9IHN0b3BXb3JkcztcbnN0b3BXb3Jkc0RpY3Rpb25hcnlbXCJub1wiXSA9IG5vU3RvcFdvcmRzO1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcIm5sXCJdID0gbmxTdG9wV29yZHM7XG5zdG9wV29yZHNEaWN0aW9uYXJ5W1wiZXNcIl0gPSBlc1N0b3BXb3JkcztcblxuZXhwb3J0IHZhciB0ZXh0SGVscGVyID0ge1xuICBnZXRTdG9wV29yZHM6IChsb2NhbGU6IHN0cmluZyA9IFwiXCIpID0+IHtcbiAgICByZXR1cm4gc3RvcFdvcmRzRGljdGlvbmFyeVtsb2NhbGUgfHwgXCJlblwiXSB8fCBbXTtcbiAgfSxcbn07XG4iLCJleHBvcnQgdmFyIHN0b3BXb3JkcyA9IFtcbiAgXCIuLi5cIixcbiAgXCJhbGxlXCIsXG4gIFwiYW5kcmVcIixcbiAgXCJhcmJlaWRcIixcbiAgXCJhdFwiLFxuICBcImF2XCIsXG4gIFwiYmFyZVwiLFxuICBcImJlZ2dlXCIsXG4gIFwiYmxlXCIsXG4gIFwiYmxlaVwiLFxuICBcImJsaVwiLFxuICBcImJsaXJcIixcbiAgXCJibGl0dFwiLFxuICBcImJvcnRcIixcbiAgXCJicnVrZVwiLFxuICBcImLDpWRlXCIsXG4gIFwiYsOlZVwiLFxuICBcImRhXCIsXG4gIFwiZGVcIixcbiAgXCJkZWdcIixcbiAgXCJkZWlcIixcbiAgXCJkZWltXCIsXG4gIFwiZGVpcmFcIixcbiAgXCJkZWlyZXNcIixcbiAgXCJkZW1cIixcbiAgXCJkZW5cIixcbiAgXCJkZW5uZVwiLFxuICBcImRlclwiLFxuICBcImRlcmVcIixcbiAgXCJkZXJlc1wiLFxuICBcImRldFwiLFxuICBcImRldHRlXCIsXG4gIFwiZGlcIixcbiAgXCJkaW5cIixcbiAgXCJkaXNzZVwiLFxuICBcImRpdHRcIixcbiAgXCJkdVwiLFxuICBcImR5a2tcIixcbiAgXCJkeWtrYXJcIixcbiAgXCJkw6VcIixcbiAgXCJlZ1wiLFxuICBcImVpblwiLFxuICBcImVpdFwiLFxuICBcImVpdHRcIixcbiAgXCJlbGxlclwiLFxuICBcImVsbGVzXCIsXG4gIFwiZW5cIixcbiAgXCJlbmVcIixcbiAgXCJlbmVzdGVcIixcbiAgXCJlbmh2ZXJcIixcbiAgXCJlbm5cIixcbiAgXCJlclwiLFxuICBcImV0XCIsXG4gIFwiZXR0XCIsXG4gIFwiZXR0ZXJcIixcbiAgXCJmb2xrXCIsXG4gIFwiZm9yXCIsXG4gIFwiZm9yZGlcIixcbiAgXCJmb3Jzw7hrZVwiLFxuICBcImZyYVwiLFxuICBcImbDpVwiLFxuICBcImbDuHJcIixcbiAgXCJmw7hyXCIsXG4gIFwiZsO4cnN0XCIsXG4gIFwiZ2pvcmRlXCIsXG4gIFwiZ2rDuHJlXCIsXG4gIFwiZ29kXCIsXG4gIFwiZ8OlXCIsXG4gIFwiaGFcIixcbiAgXCJoYWRkZVwiLFxuICBcImhhblwiLFxuICBcImhhbnNcIixcbiAgXCJoYXJcIixcbiAgXCJoZW5uYXJcIixcbiAgXCJoZW5uZVwiLFxuICBcImhlbm5lc1wiLFxuICBcImhlclwiLFxuICBcImhqw6VcIixcbiAgXCJob1wiLFxuICBcImhvZVwiLFxuICBcImhvbm9tXCIsXG4gIFwiaG9zc1wiLFxuICBcImhvc3NlblwiLFxuICBcImh1blwiLFxuICBcImh2YVwiLFxuICBcImh2ZW1cIixcbiAgXCJodmVyXCIsXG4gIFwiaHZpbGtlXCIsXG4gIFwiaHZpbGtlblwiLFxuICBcImh2aXNcIixcbiAgXCJodm9yXCIsXG4gIFwiaHZvcmRhblwiLFxuICBcImh2b3Jmb3JcIixcbiAgXCJpXCIsXG4gIFwiaWtrZVwiLFxuICBcImlra2plXCIsXG4gIFwiaW5nZW5cIixcbiAgXCJpbmdpXCIsXG4gIFwiaW5ramVcIixcbiAgXCJpbm5cIixcbiAgXCJpbm5lblwiLFxuICBcImlubmlcIixcbiAgXCJqYVwiLFxuICBcImplZ1wiLFxuICBcImthblwiLFxuICBcImtvbVwiLFxuICBcImtvcmxlaXNcIixcbiAgXCJrb3Jzb1wiLFxuICBcImt1blwiLFxuICBcImt1bm5lXCIsXG4gIFwia3ZhXCIsXG4gIFwia3ZhclwiLFxuICBcImt2YXJoZWxzdFwiLFxuICBcImt2ZW5cIixcbiAgXCJrdmlcIixcbiAgXCJrdmlmb3JcIixcbiAgXCJsYWdlXCIsXG4gIFwibGFuZ1wiLFxuICBcImxpa1wiLFxuICBcImxpa2VcIixcbiAgXCJtYWt0XCIsXG4gIFwibWFuXCIsXG4gIFwibWFuZ2VcIixcbiAgXCJtZVwiLFxuICBcIm1lZFwiLFxuICBcIm1lZGFuXCIsXG4gIFwibWVnXCIsXG4gIFwibWVnZXRcIixcbiAgXCJtZWxsb21cIixcbiAgXCJtZW5cIixcbiAgXCJtZW5zXCIsXG4gIFwibWVyXCIsXG4gIFwibWVzdFwiLFxuICBcIm1pXCIsXG4gIFwibWluXCIsXG4gIFwibWluZVwiLFxuICBcIm1pdHRcIixcbiAgXCJtb3RcIixcbiAgXCJteWVcIixcbiAgXCJteWtqZVwiLFxuICBcIm3DpVwiLFxuICBcIm3DpXRlXCIsXG4gIFwibmF2blwiLFxuICBcIm5lZFwiLFxuICBcIm5laVwiLFxuICBcIm5vXCIsXG4gIFwibm9lXCIsXG4gIFwibm9lblwiLFxuICBcIm5va2FcIixcbiAgXCJub2tvXCIsXG4gIFwibm9rb25cIixcbiAgXCJub2tvclwiLFxuICBcIm5va3JlXCIsXG4gIFwibnlcIixcbiAgXCJuw6VcIixcbiAgXCJuw6VyXCIsXG4gIFwib2dcIixcbiAgXCJvZ3PDpVwiLFxuICBcIm9tXCIsXG4gIFwib3BwXCIsXG4gIFwib3NzXCIsXG4gIFwib3ZlclwiLFxuICBcInBhcnRcIixcbiAgXCJwdW5rdFwiLFxuICBcInDDpVwiLFxuICBcInNhbW1lXCIsXG4gIFwic2VnXCIsXG4gIFwic2VsdlwiLFxuICBcInNpXCIsXG4gIFwic2lhXCIsXG4gIFwic2lkYW5cIixcbiAgXCJzaWRlblwiLFxuICBcInNpblwiLFxuICBcInNpbmVcIixcbiAgXCJzaXN0XCIsXG4gIFwic2l0dFwiLFxuICBcInNqw7hsXCIsXG4gIFwic2thbFwiLFxuICBcInNrdWxsZVwiLFxuICBcInNsaWtcIixcbiAgXCJzbHV0dFwiLFxuICBcInNvXCIsXG4gIFwic29tXCIsXG4gIFwic29tbWVcIixcbiAgXCJzb210XCIsXG4gIFwic3RhcnRcIixcbiAgXCJzdGlsbGVcIixcbiAgXCJzw6VcIixcbiAgXCJzw6VublwiLFxuICBcInRpZFwiLFxuICBcInRpbFwiLFxuICBcInRpbGJha2VcIixcbiAgXCJ0aWxzdGFuZFwiLFxuICBcInVtXCIsXG4gIFwidW5kZXJcIixcbiAgXCJ1cHBcIixcbiAgXCJ1dFwiLFxuICBcInV0ZW5cIixcbiAgXCJ2YXJcIixcbiAgXCJ2YXJ0XCIsXG4gIFwidmFydGVcIixcbiAgXCJ2ZWRcIixcbiAgXCJ2ZXJkaVwiLFxuICBcInZlcmVcIixcbiAgXCJ2ZXJ0ZVwiLFxuICBcInZpXCIsXG4gIFwidmlsXCIsXG4gIFwidmlsbGVcIixcbiAgXCJ2aXRlXCIsXG4gIFwidm9yZVwiLFxuICBcInZvcnNcIixcbiAgXCJ2b3J0XCIsXG4gIFwidsOlclwiLFxuICBcInbDpnJlXCIsXG4gIFwidsOmcnRcIixcbiAgXCJ2w7hyZVwiLFxuICBcInbDuHJ0XCIsXG4gIFwiw6ZcIixcbiAgXCLDpVwiXG5dO1xuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiLi4uXCIsXG4gIFwiYVwiLFxuICBcImFjdHVhbG1lbnRlXCIsXG4gIFwiYWRlbGFudGVcIixcbiAgXCJhZGVtw6FzXCIsXG4gIFwiYWZpcm3Ds1wiLFxuICBcImFncmVnw7NcIixcbiAgXCJhaG9yYVwiLFxuICBcImFow61cIixcbiAgXCJhbFwiLFxuICBcImFsZ29cIixcbiAgXCJhbGd1bmFcIixcbiAgXCJhbGd1bmFzXCIsXG4gIFwiYWxndW5vXCIsXG4gIFwiYWxndW5vc1wiLFxuICBcImFsZ8O6blwiLFxuICBcImFscmVkZWRvclwiLFxuICBcImFtYm9zXCIsXG4gIFwiYW1wbGVhbW9zXCIsXG4gIFwiYW50ZVwiLFxuICBcImFudGVyaW9yXCIsXG4gIFwiYW50ZXNcIixcbiAgXCJhcGVuYXNcIixcbiAgXCJhcHJveGltYWRhbWVudGVcIixcbiAgXCJhcXVlbFwiLFxuICBcImFxdWVsbGFzXCIsXG4gIFwiYXF1ZWxsb3NcIixcbiAgXCJhcXVpXCIsXG4gIFwiYXF1w61cIixcbiAgXCJhcnJpYmFcIixcbiAgXCJhc2VndXLDs1wiLFxuICBcImFzw61cIixcbiAgXCJhdHJhc1wiLFxuICBcImF1bnF1ZVwiLFxuICBcImF5ZXJcIixcbiAgXCJhw7FhZGnDs1wiLFxuICBcImHDum5cIixcbiAgXCJiYWpvXCIsXG4gIFwiYmFzdGFudGVcIixcbiAgXCJiaWVuXCIsXG4gIFwiYnVlblwiLFxuICBcImJ1ZW5hXCIsXG4gIFwiYnVlbmFzXCIsXG4gIFwiYnVlbm9cIixcbiAgXCJidWVub3NcIixcbiAgXCJjYWRhXCIsXG4gIFwiY2FzaVwiLFxuICBcImNlcmNhXCIsXG4gIFwiY2llcnRhXCIsXG4gIFwiY2llcnRhc1wiLFxuICBcImNpZXJ0b1wiLFxuICBcImNpZXJ0b3NcIixcbiAgXCJjaW5jb1wiLFxuICBcImNvbWVudMOzXCIsXG4gIFwiY29tb1wiLFxuICBcImNvblwiLFxuICBcImNvbm9jZXJcIixcbiAgXCJjb25zZWd1aW1vc1wiLFxuICBcImNvbnNlZ3VpclwiLFxuICBcImNvbnNpZGVyYVwiLFxuICBcImNvbnNpZGVyw7NcIixcbiAgXCJjb25zaWdvXCIsXG4gIFwiY29uc2lndWVcIixcbiAgXCJjb25zaWd1ZW5cIixcbiAgXCJjb25zaWd1ZXNcIixcbiAgXCJjb250cmFcIixcbiAgXCJjb3Nhc1wiLFxuICBcImNyZW9cIixcbiAgXCJjdWFsXCIsXG4gIFwiY3VhbGVzXCIsXG4gIFwiY3VhbHF1aWVyXCIsXG4gIFwiY3VhbmRvXCIsXG4gIFwiY3VhbnRvXCIsXG4gIFwiY3VhdHJvXCIsXG4gIFwiY3VlbnRhXCIsXG4gIFwiY8OzbW9cIixcbiAgXCJkYVwiLFxuICBcImRhZG9cIixcbiAgXCJkYW5cIixcbiAgXCJkYXJcIixcbiAgXCJkZVwiLFxuICBcImRlYmVcIixcbiAgXCJkZWJlblwiLFxuICBcImRlYmlkb1wiLFxuICBcImRlY2lyXCIsXG4gIFwiZGVqw7NcIixcbiAgXCJkZWxcIixcbiAgXCJkZW3DoXNcIixcbiAgXCJkZW50cm9cIixcbiAgXCJkZXNkZVwiLFxuICBcImRlc3B1w6lzXCIsXG4gIFwiZGljZVwiLFxuICBcImRpY2VuXCIsXG4gIFwiZGljaG9cIixcbiAgXCJkaWVyb25cIixcbiAgXCJkaWZlcmVudGVcIixcbiAgXCJkaWZlcmVudGVzXCIsXG4gIFwiZGlqZXJvblwiLFxuICBcImRpam9cIixcbiAgXCJkaW9cIixcbiAgXCJkb25kZVwiLFxuICBcImRvc1wiLFxuICBcImR1cmFudGVcIixcbiAgXCJlXCIsXG4gIFwiZWplbXBsb1wiLFxuICBcImVsXCIsXG4gIFwiZWxsYVwiLFxuICBcImVsbGFzXCIsXG4gIFwiZWxsb1wiLFxuICBcImVsbG9zXCIsXG4gIFwiZW1iYXJnb1wiLFxuICBcImVtcGxlYWlzXCIsXG4gIFwiZW1wbGVhblwiLFxuICBcImVtcGxlYXJcIixcbiAgXCJlbXBsZWFzXCIsXG4gIFwiZW1wbGVvXCIsXG4gIFwiZW5cIixcbiAgXCJlbmNpbWFcIixcbiAgXCJlbmN1ZW50cmFcIixcbiAgXCJlbnRvbmNlc1wiLFxuICBcImVudHJlXCIsXG4gIFwiZXJhXCIsXG4gIFwiZXJhaXNcIixcbiAgXCJlcmFtb3NcIixcbiAgXCJlcmFuXCIsXG4gIFwiZXJhc1wiLFxuICBcImVyZXNcIixcbiAgXCJlc1wiLFxuICBcImVzYVwiLFxuICBcImVzYXNcIixcbiAgXCJlc2VcIixcbiAgXCJlc29cIixcbiAgXCJlc29zXCIsXG4gIFwiZXN0YVwiLFxuICBcImVzdGFiYVwiLFxuICBcImVzdGFiYWlzXCIsXG4gIFwiZXN0YWJhblwiLFxuICBcImVzdGFiYXNcIixcbiAgXCJlc3RhZFwiLFxuICBcImVzdGFkYVwiLFxuICBcImVzdGFkYXNcIixcbiAgXCJlc3RhZG9cIixcbiAgXCJlc3RhZG9zXCIsXG4gIFwiZXN0YWlzXCIsXG4gIFwiZXN0YW1vc1wiLFxuICBcImVzdGFuXCIsXG4gIFwiZXN0YW5kb1wiLFxuICBcImVzdGFyXCIsXG4gIFwiZXN0YXJlbW9zXCIsXG4gIFwiZXN0YXLDoVwiLFxuICBcImVzdGFyw6FuXCIsXG4gIFwiZXN0YXLDoXNcIixcbiAgXCJlc3RhcsOpXCIsXG4gIFwiZXN0YXLDqWlzXCIsXG4gIFwiZXN0YXLDrWFcIixcbiAgXCJlc3RhcsOtYWlzXCIsXG4gIFwiZXN0YXLDrWFtb3NcIixcbiAgXCJlc3RhcsOtYW5cIixcbiAgXCJlc3RhcsOtYXNcIixcbiAgXCJlc3Rhc1wiLFxuICBcImVzdGVcIixcbiAgXCJlc3RlbW9zXCIsXG4gIFwiZXN0b1wiLFxuICBcImVzdG9zXCIsXG4gIFwiZXN0b3lcIixcbiAgXCJlc3R1dmVcIixcbiAgXCJlc3R1dmllcmFcIixcbiAgXCJlc3R1dmllcmFpc1wiLFxuICBcImVzdHV2aWVyYW5cIixcbiAgXCJlc3R1dmllcmFzXCIsXG4gIFwiZXN0dXZpZXJvblwiLFxuICBcImVzdHV2aWVzZVwiLFxuICBcImVzdHV2aWVzZWlzXCIsXG4gIFwiZXN0dXZpZXNlblwiLFxuICBcImVzdHV2aWVzZXNcIixcbiAgXCJlc3R1dmltb3NcIixcbiAgXCJlc3R1dmlzdGVcIixcbiAgXCJlc3R1dmlzdGVpc1wiLFxuICBcImVzdHV2acOpcmFtb3NcIixcbiAgXCJlc3R1dmnDqXNlbW9zXCIsXG4gIFwiZXN0dXZvXCIsXG4gIFwiZXN0w6FcIixcbiAgXCJlc3TDoWJhbW9zXCIsXG4gIFwiZXN0w6Fpc1wiLFxuICBcImVzdMOhblwiLFxuICBcImVzdMOhc1wiLFxuICBcImVzdMOpXCIsXG4gIFwiZXN0w6lpc1wiLFxuICBcImVzdMOpblwiLFxuICBcImVzdMOpc1wiLFxuICBcImV4XCIsXG4gIFwiZXhpc3RlXCIsXG4gIFwiZXhpc3RlblwiLFxuICBcImV4cGxpY8OzXCIsXG4gIFwiZXhwcmVzw7NcIixcbiAgXCJmaW5cIixcbiAgXCJmdWVcIixcbiAgXCJmdWVyYVwiLFxuICBcImZ1ZXJhaXNcIixcbiAgXCJmdWVyYW5cIixcbiAgXCJmdWVyYXNcIixcbiAgXCJmdWVyb25cIixcbiAgXCJmdWVzZVwiLFxuICBcImZ1ZXNlaXNcIixcbiAgXCJmdWVzZW5cIixcbiAgXCJmdWVzZXNcIixcbiAgXCJmdWlcIixcbiAgXCJmdWltb3NcIixcbiAgXCJmdWlzdGVcIixcbiAgXCJmdWlzdGVpc1wiLFxuICBcImZ1w6lyYW1vc1wiLFxuICBcImZ1w6lzZW1vc1wiLFxuICBcImdyYW5cIixcbiAgXCJncmFuZGVzXCIsXG4gIFwiZ3Vlbm9cIixcbiAgXCJoYVwiLFxuICBcImhhYmVyXCIsXG4gIFwiaGFiaWRhXCIsXG4gIFwiaGFiaWRhc1wiLFxuICBcImhhYmlkb1wiLFxuICBcImhhYmlkb3NcIixcbiAgXCJoYWJpZW5kb1wiLFxuICBcImhhYnJlbW9zXCIsXG4gIFwiaGFicsOhXCIsXG4gIFwiaGFicsOhblwiLFxuICBcImhhYnLDoXNcIixcbiAgXCJoYWJyw6lcIixcbiAgXCJoYWJyw6lpc1wiLFxuICBcImhhYnLDrWFcIixcbiAgXCJoYWJyw61haXNcIixcbiAgXCJoYWJyw61hbW9zXCIsXG4gIFwiaGFicsOtYW5cIixcbiAgXCJoYWJyw61hc1wiLFxuICBcImhhYsOpaXNcIixcbiAgXCJoYWLDrWFcIixcbiAgXCJoYWLDrWFpc1wiLFxuICBcImhhYsOtYW1vc1wiLFxuICBcImhhYsOtYW5cIixcbiAgXCJoYWLDrWFzXCIsXG4gIFwiaGFjZVwiLFxuICBcImhhY2Vpc1wiLFxuICBcImhhY2Vtb3NcIixcbiAgXCJoYWNlblwiLFxuICBcImhhY2VyXCIsXG4gIFwiaGFjZXJsb1wiLFxuICBcImhhY2VzXCIsXG4gIFwiaGFjaWFcIixcbiAgXCJoYWNpZW5kb1wiLFxuICBcImhhZ29cIixcbiAgXCJoYW5cIixcbiAgXCJoYXNcIixcbiAgXCJoYXN0YVwiLFxuICBcImhheVwiLFxuICBcImhheWFcIixcbiAgXCJoYXlhbW9zXCIsXG4gIFwiaGF5YW5cIixcbiAgXCJoYXlhc1wiLFxuICBcImhhecOhaXNcIixcbiAgXCJoZVwiLFxuICBcImhlY2hvXCIsXG4gIFwiaGVtb3NcIixcbiAgXCJoaWNpZXJvblwiLFxuICBcImhpem9cIixcbiAgXCJob3lcIixcbiAgXCJodWJlXCIsXG4gIFwiaHViaWVyYVwiLFxuICBcImh1YmllcmFpc1wiLFxuICBcImh1YmllcmFuXCIsXG4gIFwiaHViaWVyYXNcIixcbiAgXCJodWJpZXJvblwiLFxuICBcImh1Ymllc2VcIixcbiAgXCJodWJpZXNlaXNcIixcbiAgXCJodWJpZXNlblwiLFxuICBcImh1Ymllc2VzXCIsXG4gIFwiaHViaW1vc1wiLFxuICBcImh1YmlzdGVcIixcbiAgXCJodWJpc3RlaXNcIixcbiAgXCJodWJpw6lyYW1vc1wiLFxuICBcImh1YmnDqXNlbW9zXCIsXG4gIFwiaHVib1wiLFxuICBcImlndWFsXCIsXG4gIFwiaW5jbHVzb1wiLFxuICBcImluZGljw7NcIixcbiAgXCJpbmZvcm3Ds1wiLFxuICBcImludGVudGFcIixcbiAgXCJpbnRlbnRhaXNcIixcbiAgXCJpbnRlbnRhbW9zXCIsXG4gIFwiaW50ZW50YW5cIixcbiAgXCJpbnRlbnRhclwiLFxuICBcImludGVudGFzXCIsXG4gIFwiaW50ZW50b1wiLFxuICBcImlyXCIsXG4gIFwianVudG9cIixcbiAgXCJsYVwiLFxuICBcImxhZG9cIixcbiAgXCJsYXJnb1wiLFxuICBcImxhc1wiLFxuICBcImxlXCIsXG4gIFwibGVzXCIsXG4gIFwibGxlZ8OzXCIsXG4gIFwibGxldmFcIixcbiAgXCJsbGV2YXJcIixcbiAgXCJsb1wiLFxuICBcImxvc1wiLFxuICBcImx1ZWdvXCIsXG4gIFwibHVnYXJcIixcbiAgXCJtYW5lcmFcIixcbiAgXCJtYW5pZmVzdMOzXCIsXG4gIFwibWF5b3JcIixcbiAgXCJtZVwiLFxuICBcIm1lZGlhbnRlXCIsXG4gIFwibWVqb3JcIixcbiAgXCJtZW5jaW9uw7NcIixcbiAgXCJtZW5vc1wiLFxuICBcIm1pXCIsXG4gIFwibWllbnRyYXNcIixcbiAgXCJtaW9cIixcbiAgXCJtaXNcIixcbiAgXCJtaXNtYVwiLFxuICBcIm1pc21hc1wiLFxuICBcIm1pc21vXCIsXG4gIFwibWlzbW9zXCIsXG4gIFwibW9kb1wiLFxuICBcIm1vbWVudG9cIixcbiAgXCJtdWNoYVwiLFxuICBcIm11Y2hhc1wiLFxuICBcIm11Y2hvXCIsXG4gIFwibXVjaG9zXCIsXG4gIFwibXV5XCIsXG4gIFwibcOhc1wiLFxuICBcIm3DrVwiLFxuICBcIm3DrWFcIixcbiAgXCJtw61hc1wiLFxuICBcIm3DrW9cIixcbiAgXCJtw61vc1wiLFxuICBcIm5hZGFcIixcbiAgXCJuYWRpZVwiLFxuICBcIm5pXCIsXG4gIFwibmluZ3VuYVwiLFxuICBcIm5pbmd1bmFzXCIsXG4gIFwibmluZ3Vub1wiLFxuICBcIm5pbmd1bm9zXCIsXG4gIFwibmluZ8O6blwiLFxuICBcIm5vXCIsXG4gIFwibm9zXCIsXG4gIFwibm9zb3RyYXNcIixcbiAgXCJub3NvdHJvc1wiLFxuICBcIm51ZXN0cmFcIixcbiAgXCJudWVzdHJhc1wiLFxuICBcIm51ZXN0cm9cIixcbiAgXCJudWVzdHJvc1wiLFxuICBcIm51ZXZhXCIsXG4gIFwibnVldmFzXCIsXG4gIFwibnVldm9cIixcbiAgXCJudWV2b3NcIixcbiAgXCJudW5jYVwiLFxuICBcIm9cIixcbiAgXCJvY2hvXCIsXG4gIFwib3NcIixcbiAgXCJvdHJhXCIsXG4gIFwib3RyYXNcIixcbiAgXCJvdHJvXCIsXG4gIFwib3Ryb3NcIixcbiAgXCJwYXJhXCIsXG4gIFwicGFyZWNlXCIsXG4gIFwicGFydGVcIixcbiAgXCJwYXJ0aXJcIixcbiAgXCJwYXNhZGFcIixcbiAgXCJwYXNhZG9cIixcbiAgXCJwZXJvXCIsXG4gIFwicGVzYXJcIixcbiAgXCJwb2NhXCIsXG4gIFwicG9jYXNcIixcbiAgXCJwb2NvXCIsXG4gIFwicG9jb3NcIixcbiAgXCJwb2RlaXNcIixcbiAgXCJwb2RlbW9zXCIsXG4gIFwicG9kZXJcIixcbiAgXCJwb2RyaWFcIixcbiAgXCJwb2RyaWFpc1wiLFxuICBcInBvZHJpYW1vc1wiLFxuICBcInBvZHJpYW5cIixcbiAgXCJwb2RyaWFzXCIsXG4gIFwicG9kcsOhXCIsXG4gIFwicG9kcsOhblwiLFxuICBcInBvZHLDrWFcIixcbiAgXCJwb2Ryw61hblwiLFxuICBcInBvbmVyXCIsXG4gIFwicG9yXCIsXG4gIFwicG9yIHF1w6lcIixcbiAgXCJwb3JxdWVcIixcbiAgXCJwb3NpYmxlXCIsXG4gIFwicHJpbWVyXCIsXG4gIFwicHJpbWVyYVwiLFxuICBcInByaW1lcm9cIixcbiAgXCJwcmltZXJvc1wiLFxuICBcInByaW5jaXBhbG1lbnRlXCIsXG4gIFwicHJvcGlhXCIsXG4gIFwicHJvcGlhc1wiLFxuICBcInByb3Bpb1wiLFxuICBcInByb3Bpb3NcIixcbiAgXCJwcsOzeGltb1wiLFxuICBcInByw7N4aW1vc1wiLFxuICBcInB1ZG9cIixcbiAgXCJwdWVkYVwiLFxuICBcInB1ZWRlXCIsXG4gIFwicHVlZGVuXCIsXG4gIFwicHVlZG9cIixcbiAgXCJwdWVzXCIsXG4gIFwicXVlXCIsXG4gIFwicXVlZMOzXCIsXG4gIFwicXVlcmVtb3NcIixcbiAgXCJxdWllblwiLFxuICBcInF1aWVuZXNcIixcbiAgXCJxdWllcmVcIixcbiAgXCJxdWnDqW5cIixcbiAgXCJxdcOpXCIsXG4gIFwicmVhbGl6YWRvXCIsXG4gIFwicmVhbGl6YXJcIixcbiAgXCJyZWFsaXrDs1wiLFxuICBcInJlc3BlY3RvXCIsXG4gIFwic2FiZVwiLFxuICBcInNhYmVpc1wiLFxuICBcInNhYmVtb3NcIixcbiAgXCJzYWJlblwiLFxuICBcInNhYmVyXCIsXG4gIFwic2FiZXNcIixcbiAgXCJzZVwiLFxuICBcInNlYVwiLFxuICBcInNlYW1vc1wiLFxuICBcInNlYW5cIixcbiAgXCJzZWFzXCIsXG4gIFwic2VndW5kYVwiLFxuICBcInNlZ3VuZG9cIixcbiAgXCJzZWfDum5cIixcbiAgXCJzZWlzXCIsXG4gIFwic2VyXCIsXG4gIFwic2VyZW1vc1wiLFxuICBcInNlcsOhXCIsXG4gIFwic2Vyw6FuXCIsXG4gIFwic2Vyw6FzXCIsXG4gIFwic2Vyw6lcIixcbiAgXCJzZXLDqWlzXCIsXG4gIFwic2Vyw61hXCIsXG4gIFwic2Vyw61haXNcIixcbiAgXCJzZXLDrWFtb3NcIixcbiAgXCJzZXLDrWFuXCIsXG4gIFwic2Vyw61hc1wiLFxuICBcInNlw6Fpc1wiLFxuICBcInNlw7FhbMOzXCIsXG4gIFwic2lcIixcbiAgXCJzaWRvXCIsXG4gIFwic2llbXByZVwiLFxuICBcInNpZW5kb1wiLFxuICBcInNpZXRlXCIsXG4gIFwic2lndWVcIixcbiAgXCJzaWd1aWVudGVcIixcbiAgXCJzaW5cIixcbiAgXCJzaW5vXCIsXG4gIFwic29icmVcIixcbiAgXCJzb2lzXCIsXG4gIFwic29sYVwiLFxuICBcInNvbGFtZW50ZVwiLFxuICBcInNvbGFzXCIsXG4gIFwic29sb1wiLFxuICBcInNvbG9zXCIsXG4gIFwic29tb3NcIixcbiAgXCJzb25cIixcbiAgXCJzb3lcIixcbiAgXCJzdVwiLFxuICBcInN1c1wiLFxuICBcInN1eWFcIixcbiAgXCJzdXlhc1wiLFxuICBcInN1eW9cIixcbiAgXCJzdXlvc1wiLFxuICBcInPDrVwiLFxuICBcInPDs2xvXCIsXG4gIFwidGFsXCIsXG4gIFwidGFtYmnDqW5cIixcbiAgXCJ0YW1wb2NvXCIsXG4gIFwidGFuXCIsXG4gIFwidGFudG9cIixcbiAgXCJ0ZVwiLFxuICBcInRlbmRyZW1vc1wiLFxuICBcInRlbmRyw6FcIixcbiAgXCJ0ZW5kcsOhblwiLFxuICBcInRlbmRyw6FzXCIsXG4gIFwidGVuZHLDqVwiLFxuICBcInRlbmRyw6lpc1wiLFxuICBcInRlbmRyw61hXCIsXG4gIFwidGVuZHLDrWFpc1wiLFxuICBcInRlbmRyw61hbW9zXCIsXG4gIFwidGVuZHLDrWFuXCIsXG4gIFwidGVuZHLDrWFzXCIsXG4gIFwidGVuZWRcIixcbiAgXCJ0ZW5laXNcIixcbiAgXCJ0ZW5lbW9zXCIsXG4gIFwidGVuZXJcIixcbiAgXCJ0ZW5nYVwiLFxuICBcInRlbmdhbW9zXCIsXG4gIFwidGVuZ2FuXCIsXG4gIFwidGVuZ2FzXCIsXG4gIFwidGVuZ29cIixcbiAgXCJ0ZW5nw6Fpc1wiLFxuICBcInRlbmlkYVwiLFxuICBcInRlbmlkYXNcIixcbiAgXCJ0ZW5pZG9cIixcbiAgXCJ0ZW5pZG9zXCIsXG4gIFwidGVuaWVuZG9cIixcbiAgXCJ0ZW7DqWlzXCIsXG4gIFwidGVuw61hXCIsXG4gIFwidGVuw61haXNcIixcbiAgXCJ0ZW7DrWFtb3NcIixcbiAgXCJ0ZW7DrWFuXCIsXG4gIFwidGVuw61hc1wiLFxuICBcInRlcmNlcmFcIixcbiAgXCJ0aVwiLFxuICBcInRpZW1wb1wiLFxuICBcInRpZW5lXCIsXG4gIFwidGllbmVuXCIsXG4gIFwidGllbmVzXCIsXG4gIFwidG9kYVwiLFxuICBcInRvZGFzXCIsXG4gIFwidG9kYXbDrWFcIixcbiAgXCJ0b2RvXCIsXG4gIFwidG9kb3NcIixcbiAgXCJ0b3RhbFwiLFxuICBcInRyYWJhamFcIixcbiAgXCJ0cmFiYWphaXNcIixcbiAgXCJ0cmFiYWphbW9zXCIsXG4gIFwidHJhYmFqYW5cIixcbiAgXCJ0cmFiYWphclwiLFxuICBcInRyYWJhamFzXCIsXG4gIFwidHJhYmFqb1wiLFxuICBcInRyYXNcIixcbiAgXCJ0cmF0YVwiLFxuICBcInRyYXbDqXNcIixcbiAgXCJ0cmVzXCIsXG4gIFwidHVcIixcbiAgXCJ0dXNcIixcbiAgXCJ0dXZlXCIsXG4gIFwidHV2aWVyYVwiLFxuICBcInR1dmllcmFpc1wiLFxuICBcInR1dmllcmFuXCIsXG4gIFwidHV2aWVyYXNcIixcbiAgXCJ0dXZpZXJvblwiLFxuICBcInR1dmllc2VcIixcbiAgXCJ0dXZpZXNlaXNcIixcbiAgXCJ0dXZpZXNlblwiLFxuICBcInR1dmllc2VzXCIsXG4gIFwidHV2aW1vc1wiLFxuICBcInR1dmlzdGVcIixcbiAgXCJ0dXZpc3RlaXNcIixcbiAgXCJ0dXZpw6lyYW1vc1wiLFxuICBcInR1dmnDqXNlbW9zXCIsXG4gIFwidHV2b1wiLFxuICBcInR1eWFcIixcbiAgXCJ0dXlhc1wiLFxuICBcInR1eW9cIixcbiAgXCJ0dXlvc1wiLFxuICBcInTDulwiLFxuICBcInVsdGltb1wiLFxuICBcInVuXCIsXG4gIFwidW5hXCIsXG4gIFwidW5hc1wiLFxuICBcInVub1wiLFxuICBcInVub3NcIixcbiAgXCJ1c2FcIixcbiAgXCJ1c2Fpc1wiLFxuICBcInVzYW1vc1wiLFxuICBcInVzYW5cIixcbiAgXCJ1c2FyXCIsXG4gIFwidXNhc1wiLFxuICBcInVzb1wiLFxuICBcInVzdGVkXCIsXG4gIFwidmFcIixcbiAgXCJ2YWlzXCIsXG4gIFwidmFsb3JcIixcbiAgXCJ2YW1vc1wiLFxuICBcInZhblwiLFxuICBcInZhcmlhc1wiLFxuICBcInZhcmlvc1wiLFxuICBcInZheWFcIixcbiAgXCJ2ZWNlc1wiLFxuICBcInZlclwiLFxuICBcInZlcmRhZFwiLFxuICBcInZlcmRhZGVyYVwiLFxuICBcInZlcmRhZGVyb1wiLFxuICBcInZlelwiLFxuICBcInZvc290cmFzXCIsXG4gIFwidm9zb3Ryb3NcIixcbiAgXCJ2b3lcIixcbiAgXCJ2dWVzdHJhXCIsXG4gIFwidnVlc3RyYXNcIixcbiAgXCJ2dWVzdHJvXCIsXG4gIFwidnVlc3Ryb3NcIixcbiAgXCJ5XCIsXG4gIFwieWFcIixcbiAgXCJ5b1wiLFxuICBcIsOpbFwiLFxuICBcIsOpcmFtb3NcIixcbiAgXCLDqXN0YVwiLFxuICBcIsOpc3Rhc1wiLFxuICBcIsOpc3RlXCIsXG4gIFwiw6lzdG9zXCIsXG4gIFwiw7psdGltYVwiLFxuICBcIsO6bHRpbWFzXCIsXG4gIFwiw7psdGltb1wiLFxuICBcIsO6bHRpbW9zXCJcbl07IiwiZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBzcGlyYWxSZXNvbHV0aW9uOiAxLFxuICBzcGlyYWxMaW1pdDogMzYwICogNSxcbiAgbGluZUhlaWdodDogMC44LFxuICB4V29yZFBhZGRpbmc6IDAsXG4gIHlXb3JkUGFkZGluZzogMyxcbiAgd2VpZ2h0RmFjdG9yOiA0MCxcbiAgdG9wTjogNDAsXG4gIG1heEhlaWdodDogMCxcbiAgcGFkZGluZzogMTBcbn07XG5cbmV4cG9ydCBjbGFzcyBXb3JkQ2xvdWRXaWRnZXQge1xuICBwcml2YXRlIF93b3JkczogQXJyYXk8QXJyYXk8YW55Pj4gPSBbXTtcbiAgcHJpdmF0ZSBfcGxhY2VkV29yZHM6IEFycmF5PHtlbGVtZW50OiBIVE1MRGl2RWxlbWVudCwgcmVjdDogRE9NUmVjdCwgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcn0+ID0gW107XG4gIHByaXZhdGUgX21pbldlaWdodCA9IDE7XG4gIHByaXZhdGUgX3dlaWdodEZhY3RvciA9IDE7XG4gIHByaXZhdGUgX3JlbmRlcmVkVGFyZ2V0OiBIVE1MRGl2RWxlbWVudCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9vcHRpb25zID0gZGVmYXVsdE9wdGlvbnMpIHtcbiAgfVxuXG4gIGNvbG9ycyA9IFtcImJsYWNrXCJdO1xuICBnZXQgd29yZHMoKTogQXJyYXk8QXJyYXk8YW55Pj4ge1xuICAgIHJldHVybiB0aGlzLl93b3JkcztcbiAgfVxuICBzZXQgd29yZHModzogQXJyYXk8QXJyYXk8YW55Pj4pIHtcbiAgICB0aGlzLl93b3JkcyA9IFtdLmNvbmNhdCh3IHx8IFtdKTtcbiAgICB0aGlzLl9taW5XZWlnaHQgPSAxO1xuICAgIHRoaXMuX3dlaWdodEZhY3RvciA9IDE7XG4gICAgaWYodGhpcy5fd29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fd29yZHMuc29ydCgoYSwgYikgPT4gLTEgKiAoYVsxXSAtIGJbMV0pKTtcbiAgICAgIHRoaXMuX21pbldlaWdodCA9IHRoaXMuX3dvcmRzW3RoaXMuX3dvcmRzLmxlbmd0aCAtIDFdWzFdO1xuICAgICAgdGhpcy5fd2VpZ2h0RmFjdG9yID0gKHRoaXMuX3dvcmRzWzBdWzFdIC0gdGhpcy5fbWluV2VpZ2h0ICsgMSkgLyB0aGlzLl9vcHRpb25zLndlaWdodEZhY3RvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdvcmRFbGVtZW50KHRleHQ6IHN0cmluZywgd2VpZ2h0OiBudW1iZXIsIGNvbG9yOiBudW1iZXIpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICBlbGVtZW50LnN0eWxlLmZvbnRTaXplID0gKHdlaWdodCAtIHRoaXMuX21pbldlaWdodCArIDEpIC8gdGhpcy5fd2VpZ2h0RmFjdG9yICsgXCJweFwiO1xuICAgIGVsZW1lbnQuc3R5bGUubGluZUhlaWdodCA9IHRoaXMuX29wdGlvbnMubGluZUhlaWdodCArIFwiZW1cIjtcbiAgICBpZih0aGlzLmNvbG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmNvbG9yID0gdGhpcy5jb2xvcnNbY29sb3IgJSB0aGlzLmNvbG9ycy5sZW5ndGhdO1xuICAgIH1cbiAgICBlbGVtZW50LnRpdGxlID0gdGV4dCArIFwiIChcIiArIHdlaWdodCArIFwiKVwiO1xuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHByaXZhdGUgaXNJbnRlcnNlY3RXaXRoUGxhY2VkKGN1cnJlbnRXb3JkUmVjdDogRE9NUmVjdCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9wbGFjZWRXb3Jkcy5sZW5ndGg7IGkrPTEpIHtcbiAgICAgIHZhciBleGlzdGluZ1dvcmRSZWN0ID0gdGhpcy5fcGxhY2VkV29yZHNbaV0ucmVjdDtcbiAgICAgIGlmKCEoY3VycmVudFdvcmRSZWN0LnJpZ2h0ICsgdGhpcy5fb3B0aW9ucy54V29yZFBhZGRpbmcgPCBleGlzdGluZ1dvcmRSZWN0LmxlZnQgLSB0aGlzLl9vcHRpb25zLnhXb3JkUGFkZGluZyB8fFxuICAgICAgICAgICBjdXJyZW50V29yZFJlY3QubGVmdCAtIHRoaXMuX29wdGlvbnMueFdvcmRQYWRkaW5nID4gZXhpc3RpbmdXb3JkUmVjdC5yaWdodCArIHRoaXMuX29wdGlvbnMueFdvcmRQYWRkaW5nIHx8XG4gICAgICAgICAgIGN1cnJlbnRXb3JkUmVjdC5ib3R0b20gKyB0aGlzLl9vcHRpb25zLnlXb3JkUGFkZGluZyA8IGV4aXN0aW5nV29yZFJlY3QudG9wIC0gdGhpcy5fb3B0aW9ucy55V29yZFBhZGRpbmcgfHxcbiAgICAgICAgICAgY3VycmVudFdvcmRSZWN0LnRvcCAtIHRoaXMuX29wdGlvbnMueVdvcmRQYWRkaW5nID4gZXhpc3RpbmdXb3JkUmVjdC5ib3R0b20gKyB0aGlzLl9vcHRpb25zLnlXb3JkUGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGFycmFuZ2VXb3JkcyhjbG91ZEVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50LCBzdGFydFBvaW50KSB7XG4gICAgY29uc3QgY3VycmVudFBvaW50ID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICAgIGxldCB5TWluID0gY3VycmVudFBvaW50Lnk7XG4gICAgbGV0IHlNYXggPSBjdXJyZW50UG9pbnQueTtcbiAgICBjb25zdCBkaXNwbGF5V29yZHNDb3VudCA9IE1hdGgubWluKHRoaXMuX29wdGlvbnMudG9wTiwgdGhpcy53b3Jkcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGxheVdvcmRzQ291bnQ7IGkgKz0gMSkge1xuICAgICAgdmFyIHdvcmRFbGVtZW50ID0gdGhpcy5jcmVhdGVXb3JkRWxlbWVudCh0aGlzLndvcmRzW2ldWzBdLCB0aGlzLndvcmRzW2ldWzFdLCBpKTtcbiAgICAgIGNsb3VkRWxlbWVudC5hcHBlbmRDaGlsZCh3b3JkRWxlbWVudCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuX29wdGlvbnMuc3BpcmFsTGltaXQ7IGorKykge1xuICAgICAgICBjb25zdCBhbmdsZSA9IHRoaXMuX29wdGlvbnMuc3BpcmFsUmVzb2x1dGlvbiAqIGo7XG4gICAgICAgIGN1cnJlbnRQb2ludC54ID0gKDEgKyBhbmdsZSkgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIGN1cnJlbnRQb2ludC55ID0gKDEgKyBhbmdsZSkgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGFydFBvaW50LnggKyBjdXJyZW50UG9pbnQueCAtIHdvcmRFbGVtZW50Lm9mZnNldFdpZHRoLzI7XG4gICAgICAgIGNvbnN0IHRvcCA9IHN0YXJ0UG9pbnQueSArIGN1cnJlbnRQb2ludC55IC0gd29yZEVsZW1lbnQub2Zmc2V0SGVpZ2h0LzI7XG4gICAgICAgIHdvcmRFbGVtZW50LnN0eWxlLmxlZnQgPSBsZWZ0ICsgXCJweFwiO1xuICAgICAgICB3b3JkRWxlbWVudC5zdHlsZS50b3AgPSB0b3AgKyBcInB4XCI7XG4gICAgICAgIGNvbnN0IHdvcmRSZWN0ID0gd29yZEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghdGhpcy5pc0ludGVyc2VjdFdpdGhQbGFjZWQod29yZFJlY3QpKSB7XG4gICAgICAgICAgdGhpcy5fcGxhY2VkV29yZHMucHVzaCh7XG4gICAgICAgICAgICBlbGVtZW50OiB3b3JkRWxlbWVudCxcbiAgICAgICAgICAgIHJlY3Q6IHdvcmRSZWN0LFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHRvcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih5TWluID4gY3VycmVudFBvaW50LnkpIHtcbiAgICAgICAgeU1pbiA9IGN1cnJlbnRQb2ludC55O1xuICAgICAgfVxuICAgICAgaWYoeU1heCA8IGN1cnJlbnRQb2ludC55KSB7XG4gICAgICAgIHlNYXggPSBjdXJyZW50UG9pbnQueTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt5TWluLCB5TWF4XTtcbiAgfVxuICBwdWJsaWMgcmVuZGVyKHRhcmdldDogSFRNTERpdkVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlZFRhcmdldCA9IHRhcmdldDtcbiAgICB2YXIgY2xvdWRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjbG91ZEVsZW1lbnQuY2xhc3NOYW1lID0gXCJzYS12aXN1YWxpemVyLXdvcmRjbG91ZFwiO1xuICAgIGNsb3VkRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoY2xvdWRFbGVtZW50KTtcblxuICAgIGlmKHRoaXMuX29wdGlvbnMubWF4SGVpZ2h0ID4gMCkge1xuICAgICAgY2xvdWRFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuX29wdGlvbnMubWF4SGVpZ2h0ICsgXCJweFwiO1xuICAgICAgY2xvdWRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJhdXRvXCI7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSB7XG4gICAgICB4OiBjbG91ZEVsZW1lbnQub2Zmc2V0V2lkdGggLyAyLFxuICAgICAgeTogY2xvdWRFbGVtZW50Lm9mZnNldEhlaWdodCAvIDJcbiAgICB9O1xuICAgIGNvbnN0IFt5TWluLCB5TWF4XSA9IHRoaXMuYXJyYW5nZVdvcmRzKGNsb3VkRWxlbWVudCwgc3RhcnRQb2ludCk7XG4gICAgaWYodGhpcy5fb3B0aW9ucy5tYXhIZWlnaHQgPT0gMCkge1xuICAgICAgY2xvdWRFbGVtZW50LnN0eWxlLmhlaWdodCA9IHlNYXggLSB5TWluICsgdGhpcy5fb3B0aW9ucy5wYWRkaW5nICogMiArIFwicHhcIjtcbiAgICB9XG4gICAgdGhpcy5fcGxhY2VkV29yZHMuZm9yRWFjaCh3b3JkSW5mbyA9PiB7XG4gICAgICB3b3JkSW5mby5lbGVtZW50LnN0eWxlLnRvcCA9IHdvcmRJbmZvLnRvcCAtIHlNaW4gKyB0aGlzLl9vcHRpb25zLnBhZGRpbmcgKyBcInB4XCI7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYoISF0aGlzLl9yZW5kZXJlZFRhcmdldCkge1xuICAgICAgdGhpcy5fcmVuZGVyZWRUYXJnZXQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHRoaXMuX3JlbmRlcmVkVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IHRleHRIZWxwZXIgfSBmcm9tIFwiLi9zdG9wd29yZHMvaW5kZXhcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuLy8gaW1wb3J0IFdvcmRDbG91ZExpYiBmcm9tIFwid29yZGNsb3VkXCI7XG5pbXBvcnQgeyBXb3JkQ2xvdWRXaWRnZXQsIGRlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vd2lkZ2V0XCI7XG5cbmV4cG9ydCBjbGFzcyBXb3JkQ2xvdWRBZGFwdGVyIHtcbiAgcHJpdmF0ZSBfd29yZGNsb3VkOiBhbnk7XG5cbiAgcHVibGljIHN0YXRpYyBkcmF3T3V0T2ZCb3VuZCA9IGZhbHNlO1xuICBwdWJsaWMgc3RhdGljIHNocmlua1RvRml0ID0gdHJ1ZTtcbiAgcHVibGljIHN0YXRpYyBhYm9ydFRocmVzaG9sZDogYW55ID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgc3RhdGljIHdlaWdodEZhY3RvciA9IDIwO1xuXG4gIHB1YmxpYyBzdGF0aWMgb25Xb3JkY2xvdWRDcmVhdGluZyA9IG5ldyBFdmVudDxcbiAgICAgIChzZW5kZXI6IFdvcmRDbG91ZCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgICBXb3JkQ2xvdWQsXG4gICAgICBhbnlcbiAgICA+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogV29yZENsb3VkKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29yZGNsb3VkKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRjbG91ZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV29yZENsb3VkMihub2RlOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLm1vZGVsLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLm1vZGVsLmdldENvbG9ycygpO1xuICAgIGNvbnN0IGNhbnZhc05vZGUgPSA8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiLCBcIlwiKVxuICAgICk7XG4gICAgY29uc3QgZW1wdHlUZXh0Tm9kZSA9IDxIVE1MRWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwicFwiLCBcIlwiLCB7XG4gICAgICBpbm5lclRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Jlc3VsdHNcIiksXG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5hcHBlbmRDaGlsZChjYW52YXNOb2RlKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGxpc3Q6IGRhdGEsXG4gICAgICB3ZWlnaHRGYWN0b3I6IFdvcmRDbG91ZEFkYXB0ZXIud2VpZ2h0RmFjdG9yLFxuICAgICAgYWJvcnRUaHJlc2hvbGQ6IFdvcmRDbG91ZEFkYXB0ZXIuYWJvcnRUaHJlc2hvbGQsXG4gICAgICBkcmF3T3V0T2ZCb3VuZDogV29yZENsb3VkQWRhcHRlci5kcmF3T3V0T2ZCb3VuZCxcbiAgICAgIHNocmlua1RvRml0OiBXb3JkQ2xvdWRBZGFwdGVyLnNocmlua1RvRml0LFxuICAgICAgZm9udEZhbWlseTogXCJTZWdvZSBVSSBCb2xkLCBzYW5zLXNlcmlmXCIsXG4gICAgICBjb2xvcjogKHdvcmQ6IHN0cmluZywgd2VpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0UmFuZG9tQ29sb3IoKTtcbiAgICAgIH0sXG4gICAgICByb3RhdGVSYXRpbzogMC41LFxuICAgICAgcm90YXRpb25TdGVwczogMixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBjbGljazogZnVuY3Rpb24gKGl0ZW06IGFueSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZyhpdGVtWzBdICsgXCI6IFwiICsgaXRlbVsxXSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY2FudmFzOiBjYW52YXNOb2RlLFxuICAgICAgY29uZmlnXG4gICAgfTtcbiAgICBXb3JkQ2xvdWRBZGFwdGVyLm9uV29yZGNsb3VkQ3JlYXRpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICAvLyB0aGlzLl93b3JkY2xvdWQgPSBXb3JkQ2xvdWRMaWIob3B0aW9ucy5jYW52YXMsIG9wdGlvbnMuY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRjbG91ZDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLm1vZGVsLmdldENhbGN1bGF0ZWRWYWx1ZXMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLm1vZGVsLmdldENvbG9ycygpO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBlbXB0eVRleHROb2RlID0gPEhUTUxFbGVtZW50PkRvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIFwiXCIsIHtcbiAgICAgICAgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9SZXN1bHRzXCIpLFxuICAgICAgfSk7XG4gICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGVtcHR5VGV4dE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmYXVsdE9wdGlvbnMpKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY29uZmlnXG4gICAgfTtcbiAgICBXb3JkQ2xvdWRBZGFwdGVyLm9uV29yZGNsb3VkQ3JlYXRpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICB0aGlzLl93b3JkY2xvdWQgPSBuZXcgV29yZENsb3VkV2lkZ2V0KGNvbmZpZyk7XG4gICAgdGhpcy5fd29yZGNsb3VkLmNvbG9ycyA9IHRoaXMubW9kZWwuZ2V0Q29sb3JzKCk7XG4gICAgdGhpcy5fd29yZGNsb3VkLndvcmRzID0gZGF0YTtcbiAgICB0aGlzLl93b3JkY2xvdWQucmVuZGVyKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLl93b3JkY2xvdWQ7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmKHRoaXMuX3dvcmRjbG91ZCAmJiB0eXBlb2YgdGhpcy5fd29yZGNsb3VkLmRpc3Bvc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5fd29yZGNsb3VkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fd29yZGNsb3VkID0gdW5kZWZpbmVkO1xuICB9XG59XG5leHBvcnQgY2xhc3MgV29yZENsb3VkIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwcml2YXRlIF93b3JkY2xvdWRBZGFwdGVyOiBXb3JkQ2xvdWRBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcIndvcmRjbG91ZFwiKTtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyID0gbmV3IFdvcmRDbG91ZEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpOiBhbnkge1xuICAgIGxldCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICAgIGxldCBzdG9wV29yZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbG9jYWxlID0gbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gICAgaWYgKGxvY2FsZSkge1xuICAgICAgc3RvcFdvcmRzID0gdGV4dEhlbHBlci5nZXRTdG9wV29yZHMobG9jYWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcFdvcmRzID0gdGV4dEhlbHBlci5nZXRTdG9wV29yZHMoKTtcbiAgICB9XG4gICAgY29uc3QgY2xlYXJXb3JkUmVnZXhwID0gbmV3IFJlZ0V4cChcIlsuLFxcLyMhJCVcXF5cXCo7Ont9PVxcLV9gfigpXVwiLCBcImdcIik7XG5cbiAgICBjb25zdCBzdG9wVGhlV29yZCA9ICh3b3JkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChzdG9wV29yZHMuaW5kZXhPZih3b3JkKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29yZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc1N0cmluZyA9IChyb3c6IHN0cmluZykgPT4ge1xuICAgICAgcm93ID0gXCJcIiArIHJvdztcbiAgICAgIC8vIGlmIChyb3cubGVuZ3RoID4gMTUpIHJvdyA9IHJvdy5zdWJzdHJpbmcoMCwgMTQpICsgXCIuLi5cIjtcblxuICAgICAgaWYgKCEhcm93KSB7XG4gICAgICAgIHJvdy5zcGxpdChcIiBcIikuZm9yRWFjaCgod29yZCkgPT4ge1xuICAgICAgICAgIGxldCBjbGVhcmVkV29yZCA9ICh3b3JkIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShjbGVhcldvcmRSZWdleHAsIFwiXCIpO1xuICAgICAgICAgIGNsZWFyZWRXb3JkID0gc3RvcFRoZVdvcmQoY2xlYXJlZFdvcmQpO1xuICAgICAgICAgIGlmICghIWNsZWFyZWRXb3JkKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdFtjbGVhcmVkV29yZF0pIHtcbiAgICAgICAgICAgICAgcmVzdWx0W2NsZWFyZWRXb3JkXSA9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHRbY2xlYXJlZFdvcmRdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1t0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICAgICAgaWYgKCEhcm93VmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUuZm9yRWFjaChwcm9jZXNzU3RyaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb3dWYWx1ZSkuZm9yRWFjaCgoa2V5KSA9PlxuICAgICAgICAgICAgICBwcm9jZXNzU3RyaW5nKHJvd1ZhbHVlW2tleV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzU3RyaW5nKHJvd1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHQpLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4gW2tleSwgcmVzdWx0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyLmRlc3Ryb3koY29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZEFkYXB0ZXIuY3JlYXRlKGNvbnRhaW5lcik7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyLmRlc3Ryb3kodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwidGV4dFwiLCBXb3JkQ2xvdWQpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY29tbWVudFwiLCBXb3JkQ2xvdWQpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibXVsdGlwbGV0ZXh0XCIsIFdvcmRDbG91ZCk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcGxvdGx5X2pzX2Rpc3RfbWluX187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3N1cnZleV9jb3JlX187Il0sInNvdXJjZVJvb3QiOiIifQ==